Skip to content

🤖 feat: tab-completion testing and clickable-chat helpers (LK-13, protocol v11)#102

Merged
PimvanderLoos merged 9 commits into
masterfrom
feat/s7-tab-complete
Jul 16, 2026
Merged

🤖 feat: tab-completion testing and clickable-chat helpers (LK-13, protocol v11)#102
PimvanderLoos merged 9 commits into
masterfrom
feat/s7-tab-complete

Conversation

@PimvanderLoos

@PimvanderLoos PimvanderLoos commented Jul 16, 2026

Copy link
Copy Markdown
Owner

Why

  • Tests need to assert command tab-completions (including permission filtering) and to exercise clickable chat components the way a real player would — the top-priority S7 items for AnimatedArchitecture's creator flows.

How

  • New TAB_COMPLETE_PLAYER command (protocol v11): agent-side completions via a cached reflective getCommandMap lookup (works on both distros from spigot-api), leading-/ normalized, null→empty; exposed as player.tabComplete(commandLine).
  • Chat-click helpers, framework-only: ChatComponentSnapshot.clickRunCommand()/clickSuggestedCommand() mine the modern click_event wire key (whole-tree, action-exact), and player.clickChatComponent(snapshot) executes the mined command — semantically what a real client click does.
  • Two bug fixes: hasClickableChatText matched only the pre-1.21.5 clickEvent key (could never match modern output); and chat-component capture was entirely dead on Spigot — the accessor-safety heuristic rejected Spigot's obfuscated record accessors, so component capture now keys on the return type (deliberately only the type suffix: a whole-package match would nondeterministically capture chat decorations instead of the message).

Tests

  • mvn --batch-mode -Perrorprone clean verify checkstyle:checkstyle pmd:check → BUILD SUCCESS (full reactor; new LightkeeperTabCompleteIT (3) and LightkeeperChatClickIT (1, end-to-end tellraw→capture→extract→click→executed) green on both Paper and Spigot lanes).
  • Unit tests: protocol round-trip/validation/defensive-copy, reflective CommandMap paths (incl. failure modes), click extraction against modern + legacy JSON fixtures, obfuscated-accessor capture.
  • Pre-PR deep review applied: the over-broad chat-package accessor disjunct was dropped (latent wrong-component capture on multi-field chat packets).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Added exact command tab-completion, including permission-aware suggestions and argument completion after trailing spaces.
    • Added support for inspecting clickable chat messages and extracting run or suggested commands.
    • Added the ability to execute commands from captured clickable chat components.
  • Bug Fixes
    • Improved recognition of clickable chat components across current and legacy formats.
    • Improved component extraction for obfuscated server data.
  • Documentation
    • Updated feature documentation for tab completion and clickable chat assertions.

PimvanderLoos and others added 8 commits July 16, 2026 08:43
First layer of the S7 tab-completion slice: the wire contract. Adds the
TabCompletePlayer namespace (Command carrying the player UUID and raw
command-line buffer; Response carrying the ordered completions with a
defensive copy and null-to-empty normalization), registers it in the
IAgentCommand @JsonSubTypes/permits and IAgentResponse permits, and bumps
RuntimeProtocol.VERSION 10 -> 11 so framework and agent stay in lockstep.

Unlike ExecutePlayerCommand, the command line is deliberately not stripped
or rejected when blank: a trailing space selects argument completion, so
the buffer is load-bearing and preserved verbatim.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
Second layer: the in-server handler for TAB_COMPLETE_PLAYER. Resolves the
synthetic player from the store like its siblings, strips at most one
leading slash (mirroring handleExecutePlayerCommand, since the command map
matches names without a slash and its args branch does a raw lookup), and
calls CommandMap#tabComplete on the main thread, mapping a null result to
an empty list.

getCommandMap() is not on the org.bukkit.Server interface on either distro
(Spigot returns a versioned SimpleCommandMap, Paper an unversioned
CommandMap), so it is reached through one cached reflective lookup off the
live server; the CommandMap it returns is plain spigot-api, so no
per-version NMS module is needed. A missing/renamed accessor fails loudly.
Wires the exhaustive dispatcher switch arm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
Third layer: the test-facing API. Wires tabComplete through the established
gateway pattern (IFrameworkGatewayView -> UdsAgentClient ->
DefaultLightkeeperFramework) and exposes PlayerHandle.tabComplete(String):
the buffer is validated non-blank but never trimmed, so a trailing space
still selects argument completion, and a leading slash is accepted.

Adds the chat-click convenience with no new protocol command: on
ChatComponentSnapshot, clickRunCommand()/clickSuggestedCommand() parse the
component tree (Jackson, already a framework dependency) for a click_event
of the requested action (findValues walks 'extra' children; per-action
matching so run never returns a suggest payload; malformed JSON degrades to
empty). On PlayerHandle, clickChatComponent(...) extracts the run_command
and reuses executeCommand, throwing when there is no run_command click.
Parsing keys on the modern snake_case click_event, never the stale
clickEvent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
Chat-component capture was silently dead on Spigot: the outbound
ClientboundSystemChatPacket exposes its component through the remapped
record accessor `IChatBaseComponent b()`, whose single-letter name matched
none of isSafeComponentAccessor's name heuristics (get/is/component/message/
content/title), so the walker never followed it. Paper exposes the same
field as content() and worked. The bot therefore captured the message text
but not the component JSON, leaving the entire chat-click feature (and
hasClickableChatText) non-functional on Spigot.

Key the accessor decision on the return type first: any zero-arg accessor
returning a net.minecraft.network.chat.* / *Component type is followed
regardless of its name, so components are captured identically on Spigot
and Paper. The name heuristic is retained only for container
(Optional/Collection/array) return types.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
hasClickableChatText keyed on the pre-1.21.5 camelCase "clickEvent" field,
but the native component codec renamed it to snake_case "click_event"
around 1.21.5. On 1.21.11 the real wire JSON never contains "clickEvent",
so the assertion silently never matched a real click-event component. Accept
both spellings (click_event first, clickEvent for pre-1.21.5 payload compat)
so the assertion works across component-codec versions.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
…in support

End-to-end coverage on both distros. The test plugin gains /lktestclick,
which emits a clickable run_command component via vanilla /tellraw (this
Minecraft version's spigot-api ships no component builder, and /tellraw is
parsed by the same native codec that serializes click_event), plus a
permission-gated no-op /lktestperm command that the tab-complete filtering
test needs (lktestgui has no command-level permission, so it could not
exercise it).

LightkeeperTabCompleteIT asserts a permissionless plugin command is
suggested, an unknown command returns empty, and command names are
permission-filtered before/after a runtime grant. LightkeeperChatClickIT
runs the full capture -> extract -> click -> observe-side-effect flow and
locks in that captured JSON uses click_event, not clickEvent. Both are green
on Paper and Spigot.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
Add the command tab-completion and clickable-chat-component capabilities to
the Key Features and Core Features sections, describing the permission
filtering, leading-slash/trailing-space handling, and the capture ->
extract -> click helper flow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
Goal: fold the Opus review round into the S7 slice. Drops the redundant
whole-chat-package disjunct from the component-accessor predicate — the
type-suffix match alone covers both distros' real accessors, while the
package match would nondeterministically follow MessageSignature/
ChatType.Bound/FilterMask accessors on multi-field chat packets and
capture a decoration instead of the message (plus WARNING spam). The
widened type-driven capture semantics are documented in place, and the
TabCompletePlayer wire javadoc now states that the framework's public
API rejects blank input before it reaches the command.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
@PimvanderLoos

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@PimvanderLoos
PimvanderLoos requested a review from Copilot July 16, 2026 07:47
@PimvanderLoos

Copy link
Copy Markdown
Owner Author

@codex review

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 6c34ec6c-e702-4dfa-a8cc-fce69c09c7ca

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Added end-to-end player tab completion through the protocol, framework, and Spigot agent, alongside clickable chat command extraction and dispatch. Updated component detection, protocol versioning, integration fixtures, tests, and README documentation.

Changes

Player interaction features

Layer / File(s) Summary
Tab-completion protocol contract
lightkeeper-protocol/..., lightkeeper-runtime-core/...
Adds TabCompletePlayer command and response records with validation, immutable completions, JSON support, and protocol version 11.
Framework tab-completion API
lightkeeper-framework-junit/...
Exposes PlayerHandle.tabComplete(...), validates command buffers, preserves trailing spaces, and delegates requests through the UDS client.
Spigot tab-completion execution
lightkeeper-agent-spigot/...
Dispatches tab-completion requests through the server command map, strips one leading slash, preserves ordering, and handles null results as empty lists.
Clickable chat extraction and dispatch
lightkeeper-framework-junit/..., lightkeeper-nms-parent/...
Extracts nested run_command and suggest_command actions, dispatches run commands, recognizes both click-event field formats, and updates component accessor safety.
Interaction fixtures and integration validation
lightkeeper-spigot-test-plugin/..., lightkeeper-integration-tests/..., README.md
Adds clickable-chat and permission-gated completion fixtures, integration coverage, and documentation for the new APIs.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PlayerHandle
  participant Framework
  participant UdsAgentClient
  participant SpigotAgent
  participant CommandMap
  PlayerHandle->>Framework: tabComplete(commandLine)
  Framework->>UdsAgentClient: send TabCompletePlayer.Command
  UdsAgentClient->>SpigotAgent: TAB_COMPLETE_PLAYER request
  SpigotAgent->>CommandMap: tabComplete(synthetic player, normalized line)
  CommandMap-->>SpigotAgent: completion suggestions
  SpigotAgent-->>PlayerHandle: completion response
Loading

Possibly related PRs

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.06% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately captures the main changes: tab-completion support/testing, clickable-chat helpers, and protocol v11.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds new end-to-end testing capabilities to LightKeeper for (1) command tab-completion in a real server/permission context and (2) capturing, extracting, and programmatically “clicking” modern clickable-chat components, alongside a protocol bump to v11 to support the new agent command.

Changes:

  • Introduce protocol v11 TAB_COMPLETE_PLAYER and expose it as PlayerHandle.tabComplete(commandLine) with agent-side CommandMap#tabComplete backed completions.
  • Add framework-only clickable chat helpers: ChatComponentSnapshot.clickRunCommand() / clickSuggestedCommand() plus PlayerHandle.clickChatComponent(...), and update assertions to recognize modern click_event.
  • Fix Spigot chat-component capture by following obfuscated record accessors based on component return type; add unit + integration coverage for both features.

Reviewed changes

Copilot reviewed 28 out of 28 changed files in this pull request and generated no comments.

Show a summary per file
File Description
README.md Documents new tab-completion and chat-click testing helpers.
lightkeeper-spigot-test-plugin/src/main/java/nl/pim16aap2/lightkeeper/spigot/testplugin/LkTestClickCommandExecutor.java Adds /lktestclick command emitting a run_command clickable chat component for integration tests.
lightkeeper-spigot-test-plugin/src/test/java/nl/pim16aap2/lightkeeper/spigot/testplugin/LkTestClickCommandExecutorTest.java Unit tests the generated /tellraw payload and click_event wire format.
lightkeeper-spigot-test-plugin/src/main/resources/plugin.yml Registers new test commands and permission node used by tab-completion tests.
lightkeeper-spigot-test-plugin/src/main/java/nl/pim16aap2/lightkeeper/spigot/testplugin/LightkeeperSpigotTestPlugin.java Wires the new /lktestclick command executor at plugin startup.
lightkeeper-runtime-core/src/main/java/nl/pim16aap2/lightkeeper/runtime/RuntimeProtocol.java Bumps runtime protocol version from 10 → 11.
lightkeeper-protocol/src/main/java/nl/pim16aap2/lightkeeper/protocol/TabCompletePlayer.java Adds typed command/response records for tab-completion, with defensive-copy semantics.
lightkeeper-protocol/src/test/java/nl/pim16aap2/lightkeeper/protocol/TabCompletePlayerTest.java Validates serialization and input/defensive-copy behavior for the new protocol types.
lightkeeper-protocol/src/main/java/nl/pim16aap2/lightkeeper/protocol/IAgentCommand.java Registers TAB_COMPLETE_PLAYER for polymorphic command decoding and sealing.
lightkeeper-protocol/src/main/java/nl/pim16aap2/lightkeeper/protocol/IAgentResponse.java Adds TabCompletePlayer.Response to the sealed response set.
lightkeeper-agent-spigot/src/main/java/nl/pim16aap2/lightkeeper/agent/spigot/AgentRequestDispatcher.java Routes the new command to player actions.
lightkeeper-agent-spigot/src/main/java/nl/pim16aap2/lightkeeper/agent/spigot/AgentPlayerActions.java Implements TAB_COMPLETE_PLAYER via cached reflective getCommandMap + CommandMap#tabComplete.
lightkeeper-agent-spigot/src/test/java/nl/pim16aap2/lightkeeper/agent/spigot/AgentPlayerActionsTest.java Unit tests slash-stripping, null→empty normalization, trailing-space preservation, and unknown-player behavior.
lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/PlayerHandle.java Exposes tabComplete(...) and clickChatComponent(...) to test authors.
lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/ChatComponentSnapshot.java Adds click extraction helpers walking the component JSON tree for modern click_event.
lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/assertions/PlayerHandleAssert.java Updates clickable-chat assertion to recognize both click_event and legacy clickEvent.
lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/internal/UdsAgentClient.java Adds client call to send TAB_COMPLETE_PLAYER and return completions.
lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/internal/DefaultLightkeeperFramework.java Adds framework gateway entrypoint with blank-buffer rejection and pass-through semantics.
lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/IFrameworkGatewayView.java Extends gateway interface with tab-completion API.
lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/PlayerHandleTest.java Unit tests delegation for tabComplete(...) and clickChatComponent(...).
lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/ChatComponentSnapshotTest.java Tests click extraction behavior for root/nested click events and malformed JSON.
lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/assertions/HandleAssertionsTest.java Verifies assertions match modern snake_case click events.
lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/internal/UdsAgentClientTest.java Tests request formatting and trailing-space preservation on the wire.
lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/internal/DefaultLightkeeperFrameworkGatewayTest.java Tests gateway delegation + validation for tab completion buffers.
lightkeeper-integration-tests/src/test/java/nl/pim16aap2/lightkeeper/maven/test/LightkeeperTabCompleteIT.java End-to-end coverage for permission-filtered completions and unknown-command behavior.
lightkeeper-integration-tests/src/test/java/nl/pim16aap2/lightkeeper/maven/test/LightkeeperChatClickIT.java End-to-end tellraw→capture→extract→click→command-executed validation.
lightkeeper-nms-parent/lightkeeper-nms-v1_21_R7/src/main/java/nl/pim16aap2/lightkeeper/nms/v121r7/BotPlayerNmsAdapterV1_21_R7.java Fixes component capture to follow obfuscated record accessors via component return type suffix.
lightkeeper-nms-parent/lightkeeper-nms-v1_21_R7/src/test/java/nl/pim16aap2/lightkeeper/nms/v121r7/BotPlayerNmsAdapterV1_21_R7Test.java Adds regression test proving obfuscated record accessor component capture works.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Can't wait for the next one!

Reviewed commit: b828fe2048

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/ChatComponentSnapshot.java`:
- Around line 79-84: Update ChatComponentSnapshot.findClickCommand to inspect
both click_event and legacy clickEvent nodes, accepting command or legacy value
payload fields while preserving action matching and empty results when no
command exists. Update ChatComponentSnapshot JavaDoc to document support for
both field variants, and revise ChatComponentSnapshotTest to expect successful
extraction from legacy payloads at the specified test location.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2e313533-7ffa-4d97-a1df-e0b25308eb0e

📥 Commits

Reviewing files that changed from the base of the PR and between 87ef9fb and b828fe2.

📒 Files selected for processing (28)
  • README.md
  • lightkeeper-agent-spigot/src/main/java/nl/pim16aap2/lightkeeper/agent/spigot/AgentPlayerActions.java
  • lightkeeper-agent-spigot/src/main/java/nl/pim16aap2/lightkeeper/agent/spigot/AgentRequestDispatcher.java
  • lightkeeper-agent-spigot/src/test/java/nl/pim16aap2/lightkeeper/agent/spigot/AgentPlayerActionsTest.java
  • lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/ChatComponentSnapshot.java
  • lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/IFrameworkGatewayView.java
  • lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/PlayerHandle.java
  • lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/assertions/PlayerHandleAssert.java
  • lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/internal/DefaultLightkeeperFramework.java
  • lightkeeper-framework-junit/src/main/java/nl/pim16aap2/lightkeeper/framework/internal/UdsAgentClient.java
  • lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/ChatComponentSnapshotTest.java
  • lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/PlayerHandleTest.java
  • lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/assertions/HandleAssertionsTest.java
  • lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/internal/DefaultLightkeeperFrameworkGatewayTest.java
  • lightkeeper-framework-junit/src/test/java/nl/pim16aap2/lightkeeper/framework/internal/UdsAgentClientTest.java
  • lightkeeper-integration-tests/src/test/java/nl/pim16aap2/lightkeeper/maven/test/LightkeeperChatClickIT.java
  • lightkeeper-integration-tests/src/test/java/nl/pim16aap2/lightkeeper/maven/test/LightkeeperTabCompleteIT.java
  • lightkeeper-nms-parent/lightkeeper-nms-v1_21_R7/src/main/java/nl/pim16aap2/lightkeeper/nms/v121r7/BotPlayerNmsAdapterV1_21_R7.java
  • lightkeeper-nms-parent/lightkeeper-nms-v1_21_R7/src/test/java/nl/pim16aap2/lightkeeper/nms/v121r7/BotPlayerNmsAdapterV1_21_R7Test.java
  • lightkeeper-protocol/src/main/java/nl/pim16aap2/lightkeeper/protocol/IAgentCommand.java
  • lightkeeper-protocol/src/main/java/nl/pim16aap2/lightkeeper/protocol/IAgentResponse.java
  • lightkeeper-protocol/src/main/java/nl/pim16aap2/lightkeeper/protocol/TabCompletePlayer.java
  • lightkeeper-protocol/src/test/java/nl/pim16aap2/lightkeeper/protocol/TabCompletePlayerTest.java
  • lightkeeper-runtime-core/src/main/java/nl/pim16aap2/lightkeeper/runtime/RuntimeProtocol.java
  • lightkeeper-spigot-test-plugin/src/main/java/nl/pim16aap2/lightkeeper/spigot/testplugin/LightkeeperSpigotTestPlugin.java
  • lightkeeper-spigot-test-plugin/src/main/java/nl/pim16aap2/lightkeeper/spigot/testplugin/LkTestClickCommandExecutor.java
  • lightkeeper-spigot-test-plugin/src/main/resources/plugin.yml
  • lightkeeper-spigot-test-plugin/src/test/java/nl/pim16aap2/lightkeeper/spigot/testplugin/LkTestClickCommandExecutorTest.java

@codecov

codecov Bot commented Jul 16, 2026

Copy link
Copy Markdown

PimvanderLoos added a commit that referenced this pull request Jul 16, 2026
Goal: address CodeRabbit's bot-round finding on PR #102 — extraction
rejected the legacy clickEvent/value spelling while hasClickableChatText
accepted it, so clickChatComponent would throw on the very payloads the
assertion matches. findClickCommand now mines both key spellings
(command first, then value) in preference order, with the legacy test
flipped to assert successful extraction.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
Goal: address CodeRabbit's bot-round finding on PR #102 — extraction
rejected the legacy clickEvent/value spelling while hasClickableChatText
accepted it, so clickChatComponent would throw on the very payloads the
assertion matches. findClickCommand now mines both key spellings
(command first, then value) in preference order, with the legacy test
flipped to assert successful extraction.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P15FjGQzyNmX9T6Qmyq8Dn
@PimvanderLoos
PimvanderLoos force-pushed the feat/s7-tab-complete branch from 2eaf63b to 6e04d33 Compare July 16, 2026 08:19
@PimvanderLoos
PimvanderLoos merged commit 75ec277 into master Jul 16, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants