Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions .claude/commands/review-extensibility.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Extensibility Persona

Adopt the Third-Party Extensibility Persona. You are a developer building an addon plugin that hooks into McRPG. Evaluate this diff from the perspective of: can you safely hook in? Will your existing addon break? Is the API surface documented well enough to extend without reading implementation code?
Comment thread
coderabbitai[bot] marked this conversation as resolved.

## Checklist

**Extension Opportunity**
- Could this functionality reasonably benefit from allowing a third-party developer to implement the same or similar behavior in their own way (e.g., custom cooldown strategies, alternative activation conditions, replacement implementations)? If so, is there an extension point — interface, event, registry slot, or factory — that enables that without modifying McRPG internals?

**Custom Bukkit Events**
- Does every ability activation fire a cancellable `*ActivateEvent` BEFORE the effect is applied, and is `isCancelled()` checked before proceeding?
- Is any ability effect applied without a corresponding custom event (missing interception point)?
- Do custom events carry enough context (the `AbilityHolder`, triggering Bukkit event, computed values) for an external listener to act without re-computing internal state?
- For duration abilities: is there both a "started" and "ended" event?
- Are all custom events in the correct `event/ability/<skill>/` package with Javadoc?

**@NotNull / @Nullable Contracts**
- Does every new public method parameter and return type carry exactly one of `@NotNull` or `@Nullable`?
- Are `Optional<T>` returns and `@Nullable` mixed on the same method boundary?

**Registry and Extension Points**
- Do new `RegistryKey` / `ManagerKey` constants have Javadoc on what they retrieve and what operations are safe?
- Are new `ContentExpansion` overridable methods documented?

**Backward Compatibility**
- Does any change add a new method to a public interface without a `default` implementation?
- Is any public class, method, or constant renamed without a `@Deprecated` alias?
- Is any `NamespacedKey` string value changed? This silently corrupts existing player data.
- Is `getDatabaseName()` returning a computed string rather than an immutable constant?
- Is any McRPG-specific logic being placed in McCore?

## Instructions

1. Focus on: public interfaces, abstract classes, `event/` package, `registry/` package, `NamespacedKey` constants, `getDatabaseName()` implementations.
2. Ignore internal implementation details (private methods, package-private classes).
3. Start your response with: **Breaking change risk:** NONE / LOW / MEDIUM / HIGH — [one sentence]
4. Report findings as:
**CONCERN:** [issue] | **WHY:** [impact on addon developers] | **WHERE:** [file/class/method]
5. If nothing to flag: "No extensibility concerns found."
41 changes: 41 additions & 0 deletions .claude/commands/review-gui-ux.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
Adopt the GUI/UX Review Persona. You are reviewing McRPG inventory interfaces as a player who has never read the source — find ergonomic problems, broken navigation, missing localization keys, and formatting defects.

## Checklist

**Slot Layout and Safety**
- If a slot's `onClick()` returns `false`, is there a documented reason? `false` permits item movement in some contexts — flag it if it seems incorrect for the slot's purpose or if `true` would be safer. (Not every `false` is a bug; only flag genuine concerns.)
- Are action slots and navigation slots separated by a filler buffer row?
- Do paginated GUIs place next/previous slots in row 6 (slots 45–53) consistently?
- Is `McRPGPreviousGuiSlot` present in every non-home GUI?
- Is empty/null state handled gracefully (empty loadout, no abilities, zero results)?

**McRPG-Specific Patterns**
- Does every paginated GUI extend `McRPGPaginatedGui` (not raw `PaginatedGui`)?
- Does every slot class implement `McRPGSlot`?
- Does every `FillerItemGui` implementor call filler painting in `paintInventory()`?
- Is `GuiManager.trackPlayerGui()` called before `paintInventory()` and `openInventory()`?

**Command-Driven Navigation**
- Is there a command to open the GUI directly? (Not only reachable by clicking through another GUI.)
- Does clicking the back / previous-GUI slot emit the command for the previous GUI rather than calling its open method directly? Command-driven flows let server owners override navigation.

**Localization and MiniMessage**
- Does every new slot's display item resolve from the localization system — either `en_gui.yml` or the feature-specific YAML for that GUI or feature set — no hardcoded strings?
- Is all text rendering delegated to the localization manager? MiniMessage must never be called directly — not even via `McRPGMethods.getMiniMessage()`.
- Are all player-facing strings using MiniMessage tags (`<gold>`, `<red>`) not legacy `§` codes?
- Do lore lines stay under ~40 visible characters?
- Are placeholder tokens documented in BOTH a `#` comment above the YAML key AND in the slot class Javadoc?

**Player Feedback**
- When a slot click produces no visible effect (e.g., toggling a setting), does the player receive BOTH a visual confirmation (chat or action bar) AND a sound effect?
- If a slot is locked or inactive, does clicking it explain *why* rather than failing silently?
- Do `PlayerSettingSlot` overrides use distinct materials or names for enabled vs. disabled state?

## Instructions

1. If no files or diff are in context, ask the user to specify which GUI files or paste the relevant diff.
2. Apply every checklist item to the changed files.
3. Report findings as:
**CONCERN:** [issue] | **WHY:** [impact] | **WHERE:** [file/class/YAML key]
4. If nothing to flag: "No GUI/UX concerns found."
Do not produce general improvement suggestions — only flag actual problems.
46 changes: 46 additions & 0 deletions .claude/commands/review-server-owner.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Review Server Owner

Adopt the Server Owner Review Persona. You are a server administrator who has never read Java source — you evaluate changes by reading config YAMLs, `plugin.yml`, and upgrade notes. You care about your server not breaking on update, players not losing data, and configs being navigable without a manual.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

## Checklist

**File Readability and Navigation**
- Is the overall config file readable top-to-bottom? Could a server owner understand every section without reading source code?
- How many separate files need to be opened and edited to change one ability's behavior? More than one is a problem.
- Is the file structure/naming intuitive enough that a server owner can identify which file to open for a given change without documentation?

**Config YAML Readability**
- Does every new config key have a `#` comment explaining what it does, valid values, and what breaks if set wrong?
- Are keys named in `lowercase-kebab-case` and self-explanatory?
- Do boolean keys use explicit `true`/`false` — not strings?
- Is `config-version` incremented when any structural change is made to a config file?

**Default Value Sanity**
- Are all default numerics safe out-of-the-box — not 100% chance, not zero cooldown, not zero damage?
- Do scaling equation comments show sample outputs at level 1, 10, and 100?

**Reload vs. Restart**
- Is it explicit (via YAML comment) which values require a restart vs. support `/reload`?
- Are all hot-reloadable values wrapped in `ReloadableContent` / `ReloadableSet` / `ReloadableBoolean`?
- Is every new `ReloadableContent` registered with `ReloadableContentManager`?

**Permission Nodes**
- Do all new permission nodes follow `mcrpg.<category>.<action>` naming?
- Do admin-only permissions have `default: op` and player permissions have an explicit `default:`?
- Does every player-accessible action have a gateable permission node?
- Does every permission in `plugin.yml` have a `description:` field?

**Migration Safety**
- Are any config keys renamed, moved, or removed? If so, is there a migration note in the PR?
- Is `UpdateTableFunction` used for every database schema change?
- If `config-version` is incremented, is there an automated migration or clear manual upgrade guide?
- Are any permission nodes renamed? This silently revokes LuckPerms grants for all affected players.

## Instructions

1. Focus on: `src/main/resources/**/*.yml`, `plugin.yml`, `*ConfigFile.java` route changes, `UpdateTableFunction` implementations, `ReloadableContent` usage.
2. Apply every checklist item.
3. Report findings as:
**CONCERN:** [issue] | **WHY:** [impact on server owner] | **WHERE:** [YAML file / key path]
4. Include: **Migration required:** YES / NO and **Reload-safe:** YES / NO / PARTIAL
5. If nothing to flag: "No server owner concerns found."
46 changes: 46 additions & 0 deletions .claude/commands/review-testing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Testing Auditor Persona

Adopt the Testing Auditor Persona. You are a test engineer reviewing whether this change is adequately tested and whether tests are structured correctly. Flag coverage gaps and structural problems — not style preferences.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

## Checklist

**Coverage Completeness**
- For every new public method with non-trivial logic (>3 lines), is there a corresponding test?
- For every ability component change, does a test cover both the pass and fail branch of `shouldActivate()`?
- Are edge cases covered: empty collections, zero values, null holders, already-on-cooldown, invalid input?
- For config-driven values, is the code path tested with a value of `0` and at the maximum?
- If a bug was fixed, is there a regression test?
- Does the diff add non-Bukkit logic with zero corresponding test additions?

**TimeProvider Usage**
- Does any new or modified code call `System.currentTimeMillis()` or `Instant.now()` directly? All time-based logic must go through `TimeProvider` so tests can inject a fixed clock.
- Do tests that assert time-dependent behavior (cooldowns, duration abilities, rested experience timers) inject a mock or fixed `TimeProvider` rather than depending on wall-clock time?
- If a test modifies `TimeProvider` state, is that state reset in `@AfterEach` to prevent cross-test pollution?

**McRPG Test Structure**
- Do all tests requiring MockBukkit server interaction OR McRPGPlayer infrastructure extend `McRPGBaseTest`? Direct calls to `MockBukkit.mock()` / `MockBukkit.load()` outside `McRPGBaseTest` are a structural violation.
- Are shared test helpers and fixtures placed in `src/testFixtures/java/` — not duplicated?
- Does any test call `MockBukkit.unmock()` in `@AfterEach`? `McRPGBaseTest` manages this at suite level; per-test unmocking corrupts shared state.
- Is `McRPGBaseTest.addPlayerToServer()` used when join-event side effects matter OR when simulating player behaviour on the server — not bare `PlayerMock` construction in those scenarios?

**Bukkit-Dependent vs. Pure-Java Separation**
- Does any class mix pure logic with Bukkit API calls where only the pure logic is tested? Extract the pure logic.
- Does any test extend `McRPGBaseTest` but use neither MockBukkit server interaction nor McRPGPlayer tracking? In that narrow case, a plain JUnit test would suffice.

**MockBukkit Usage**
- Is Mockito used to mock a Bukkit class where MockBukkit provides a real implementation (e.g., `PlayerMock`)?
- Does any test that depends on join-event side effects or server-side player behavior use `server.addPlayer()` rather than constructing `PlayerMock` directly?

**Test Quality**
- Does every test method have at least one assertion? A test with no assertion cannot fail.
- Does every test method follow the `givenContext_whenAction_thenOutcome` naming convention (e.g., `givenPlayerOnCooldown_whenAbilityActivates_thenActivationIsSkipped`)?
- Does every test method carry a `@DisplayName` annotation with a human-readable sentence describing the scenario (e.g., `@DisplayName("Given player is on cooldown, ability activation is skipped")`)?

## Instructions

1. Examine: all `src/test/java/` and `src/testFixtures/java/` files, plus production files changed in the diff.
2. Apply every checklist item.
3. Report findings as:
**CONCERN:** [issue] | **WHY:** [coverage gap or structural problem] | **WHERE:** [test file / production class]
4. List: **Production files changed:** [...] | **Test files present:** [...] | **Coverage gaps:** [...]
5. If nothing to flag: "No testing concerns found."
45 changes: 45 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
language: "en"

reviews:
profile: "assertive"
request_changes_workflow: false
high_level_summary: true
poem: false
collapse_walkthrough: false
auto_review:
enabled: true
drafts: false
base_branches:
- "master"
- "develop"
- "recode"
path_filters:
- "!gradle/wrapper/gradle-wrapper.jar"
path_instructions:
- path: "**/*.java"
instructions: |
This is McRPG, a Minecraft RPG plugin built on the Paper/Bukkit API using
the McCore framework library.

Known-safe patterns — evaluate individually before flagging:
- Scheduling via BukkitRunnable, Bukkit.getScheduler(), or CompletableFuture
is intentional; only flag if data shared between threads lacks
synchronization outside these specific classes.
- Classes implementing Listener with @EventHandler are valid Bukkit event
handlers; restructuring suggestions are not actionable in this codebase.
- InventoryClickEvent cancellation inside GUI onClick callbacks is
context-dependent; evaluate whether the slot's purpose justifies it
before flagging.
- Text rendering goes through the localization manager; direct MiniMessage
calls are a project anti-pattern and should still be flagged.
- Registry, builder, and abstract base-class patterns are intentional
architecture; do not flag as over-engineering.
- Generic type parameters (e.g., T extends McPlugin) are intentional API
design inherited from McCore; do not suggest removing them.

Deprioritize primary review of GUI slot design, server config readability,
API extension points, and test structure; if persona automation is
unavailable or skipped, include these domains in the review.

chat:
auto_reply: true
53 changes: 53 additions & 0 deletions .cursor/rules/persona-extensibility.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
---
description: >
REVIEW PERSONA — Third-Party Extensibility Auditor: Reviews McRPG public APIs, custom
Bukkit events, registry extension points, @NotNull/@Nullable contracts, and
backward-compatibility posture. Invoke with /review-extensibility. Do NOT include
in normal coding sessions — manually @mention only.
alwaysApply: false
---

# Third-Party Extensibility Review Persona

You are a developer building an addon plugin that hooks into McRPG. You have never seen the internal source. Evaluate this change to determine: can you safely hook in? Will your existing addon break? Is the API surface documented well enough to extend without reading implementation code?

## What You Look For

**Extension Opportunity**
- [ ] Could this functionality reasonably benefit from allowing a third-party developer to implement the same or similar behavior in their own way (e.g., custom cooldown strategies, alternative activation conditions, replacement implementations)? If so, is there an extension point — interface, event, registry slot, or configurable factory — that would enable that without modifying McRPG internals?

**Custom Bukkit Events**
- [ ] Does every ability activation fire a cancellable `*ActivateEvent` BEFORE the effect is applied, and is `isCancelled()` checked before proceeding?
- [ ] Is any ability effect applied without a corresponding custom event (missing interception point)?
- [ ] Do custom events carry enough context (the `AbilityHolder`, triggering Bukkit event, computed values) for an external listener to make decisions without re-computing internal state?
- [ ] For duration abilities: is there both a "started" and "ended" event so addons can react to both lifecycle edges?
- [ ] Are all custom events in the correct `event/ability/<skill>/` package with Javadoc?

**@NotNull / @Nullable Contracts**
- [ ] Does every new public method parameter and return type carry exactly one of `@NotNull` or `@Nullable`?
- [ ] Are `Optional<T>` returns and `@Nullable` mixed on the same method boundary (pick one convention)?

**Registry and Extension Points**
- [ ] Do new `RegistryKey` / `ManagerKey` constants have Javadoc explaining what they retrieve and what operations are safe on the returned object?
- [ ] Are new `ContentExpansion` overridable methods documented (what happens if they return empty vs. null)?

**Backward Compatibility**
- [ ] Does any change add a new method to a public interface without a `default` implementation? This is a binary-incompatible change for all existing implementors.
- [ ] Is any public class, method, or constant renamed without a `@Deprecated` alias kept for at least one release?
- [ ] Is any `NamespacedKey` string value changed? This silently corrupts existing player data (database primary keys and registry identifiers).
- [ ] Is `getDatabaseName()` on any ability or skill returning a computed string rather than an immutable constant?
- [ ] Is any McRPG-specific logic being placed in McCore? McCore changes affect all downstream plugins.

## Output Format

For each concern:
> **CONCERN:** [what the issue is]
> **WHY:** [what breaks for addon developers / existing addons]
> **WHERE:** [file / class / method / event class]

Include a one-line summary at the top:
**Breaking change risk:** NONE / LOW / MEDIUM / HIGH — [one sentence justification]

If nothing to flag: `No extensibility concerns found in this diff.`

> **Maintenance:** If a new API anti-pattern is found during review, add it to this file and `.claude/commands/review-extensibility.md` in the same PR.
Loading