AI Prompts and Skills
Essentials. Day-to-day work runs through a small set of /commands you invoke in Claude Code. They are thin composers over reusable fragments (.claude/fragments/, the primitives) and auto-firing skills (.claude/skills/, the atomic operations). The canonical source lives in the le-workspace root and is synced (tracked) into every repo, so any clone is self-sufficient โ edit only the le-workspace canonical copy then run sync-tooling.sh; never hand-edit an AUTO-SYNCED file inside a child.
| Command | Use it when |
|---|---|
/dev-issue <id> | work one GitLab issue end-to-end โ the default entry point |
/design | shape a medium/large topic into an ordered issue set before any code |
/deliver | implement a validated issue series autonomously (local commits, no push) |
/finalize-series | pre-push gate: neutral review of the series across repos โ push โ To release |
/release | tag & publish a multi-repo release |
/review | neutral code review of the current branch (reports only) |
/fix-mr-comments | apply MR reviewer feedback |
/epic | big topic: chain design โ deliver โ finalize-series โ create-test-issue |
Mental model: design โ (dev-issue โ deliver) โ finalize-series โ release. A code review is always a mandatory neutral subagent; an autonomous fix-loop is capped at 5 rounds then stops and waits; per-stack build/version rules live in the _stack-dispatch fragment. The full picture is in the Workflow map below; the precise per-item reference is further down. Supported assistant today: Claude Code (to wire another, see Re-adding another AI provider).
๐ก Prerequisite (Claude Code): Commands and skills under
.claude/are auto-discovered. The repository's CLAUDE.md is the entry guide for Claude Code agents and points to AGENTS.md โ the canonical project rule source for all AI assistants.
Workflow mapโ
Current architecture (implemented in #733)โ
This is the implemented command/skill architecture, validated against an AI-engineering critique and a behaviour-coverage audit of the prior prompts:
- One read-only primitive
panel-report(context, roles, output-schema)over a sharedrole-panelpass (fan-out role subagents โ synthesize).ANALYZEandREVIEWare named presets of it, not separate primitives.ANALYZE: author context, scopetopicโissue-setorissueโimpl-plan, human-gated.REVIEW(scope: branch|commit|series): neutral non-author context, outputs findings; theseriesscope is incremental (integration + conformity, not a re-review of per-commit diffs already cleared). APPLY-CHANGE(code โ build) is split out ofIMPLEMENT-ONE(version โ APPLY-CHANGE โ CHANGELOG โ naming โ commit). Fix loops callAPPLY-CHANGEonly โ never the fullIMPLEMENT-ONE(which would re-bump the version and duplicate the CHANGELOG entry).completion-policyis a shared primitive (one fragment): thelocal / beta-move-now / beta-waitรseries / solorules deciding commit/push/To-release timing โ used bydev-issue,deliverandfinalize-series(epicvia deliver/finalize). On a branch/MR, To-release and the beta deploy tie to the merge to main, not the branch push.- Bounded feedback loops:
REVIEW โ Must Fix โ APPLY-CHANGE (flush) โ REVIEW, capped at 5 โ on the cap, no progress, or a new Must-Fix the loop stops and waits for the human. In standalone/dev-issuethe review autonomy is an up-front option (report-only vs autonomous fix-loop); deliver/epic/finalize-series run it autonomously by contract. Review neutrality is mechanical: the reviewer is a mandatory separate subagent that did not author the work (the fragment text, the diff, and the_stack-dispatchtable are passed into its prompt) โ never an inline self-review. - Three layers: Judgment (the primitives) / Atomic operations (skills โ some deterministic, some judgment, tagged) / Enforcement, which is two kinds: true git hooks (
commit-msg; the le-workspace pre-commit cross-repo guard) and local/CI guards that are not hooks (theprepare-docsdocs-build exclude;syncauto-prune +--checkorphan scan; the orphan-staging / flush self-checks). Thevalidate-branch-and-commit-namingskill mirrorscommit-msgas an explanatory pre-check (it is a skill, not a hook). Human validation gates are control-flow in the commands, not enforcement. - Implementable form โ build-time inlining (the key decision): each primitive is a canonical prompt fragment under
.claude/fragments/, edited once. The Claude Code runtime does not transclude linked files, so to keep correctness from depending on the agent voluntarily opening 2โ3 levels of links,sync-tooling.shinlines each command's full transitive fragment closure into the command at sync time. The shipped command (in every child's.claude/commands/) is therefore self-contained โ one file, no runtime dereference. Fragments are a build input, not a shipped file type (an older sync's fragment-as-file is pruned).prepare-docs.mjsneeds no change โ the whole.claude/dir is excluded from the docs build. - Renames:
/design-loopโ/design,/ship-reviewโ/finalize-series,/create-releaseโ/release.condense-changeloglives only in/release(the per-commit fragments stay until the tag freezes the version).
Architecture โ three layers:
Pipeline โ commands compose the primitives (with feedback loops):
Behaviours to carry into the prompt fragments (must not lose in the rewrite). The diagram is a map, not the full spec โ these stay in the command/fragment prose: ANALYZE depth calibration (trivial / single-feature / umbrella) + the LE-specific UX analysis (
Item.javaitem tables, the manual Mineskin/NovaSkin HEAD-texture step) + the step-breakdown dependency graph; the full REVIEW checklist (architecture ยท exceptions ยท logging ยท events ยท database ยท CHANGELOG audit ยท version-bump-segment-matches-Conventional-type ยท orphan.translation-staging.json); the[NEEDS CLARIFICATION: โฆ]inline-assumption convention; the multi-repo discipline (dependency order โ producer of a shared contract before its consumer โ and keeping that contract coherent via the relevant domain skill, not a version pin); the Stack-dispatch table as the substrate ofIMPLEMENT-ONE/REVIEW(translations LE-only, Python no-SNAPSHOT/no per-version tag, Go web build, wiki no build); and the/releasejoint sub-steps (pollpublish-to-artifactorybefore the LEPSU pom-pin + tag, stop on pipeline failure, theDEPLOY_DOCStrigger condition).
MCP serversโ
Beyond commands and skills, the AI assistants rely on two MCP servers, declared in .mcp.json and enabled per project:
gitlabโ read/write access to GitLab issues and merge requests; backs every issue/MR skill below. Token via theGITLAB_PERSONAL_ACCESS_TOKENenv var (see Setup Development Environment).context7โ fetches up-to-date library/API documentation (Bukkit/Spigot/Paper here, and the libraries of the companionle-agent/le-mcp/le-play-server-utilsrepos). Query it to confirm current API signatures instead of relying on the model's training memory. Remote HTTP server, no token required.
How to invoke a commandโ
In Claude Code, type /<command-name> [<parameters>] in the chat input. Example: /dev-issue 123 to start working on issue #123. Claude Code reads the canonical .claude/commands/<name>.md file directly.
How skills triggerโ
Skills don't need explicit invocation โ the assistant reads each skill's frontmatter description field and fires the matching skill when your request aligns with it. You can also reference a skill by name in your request to force its use (e.g. "use bump-version").
Parallel agents and git worktreesโ
When you want several AI agents to work in parallel on different issues, run each in its own git worktree so they don't fight over the same working tree. This is the only reason to reach for a worktree โ for ordinary sequential work, staying on main or a normal branch is simpler.
- When to use: parallel or background agents on different branches. Not for the common one-issue-at-a-time flow.
- How: in an interactive Claude Code session, prefer the native
EnterWorktree/ExitWorktreetools, or passisolation: "worktree"to theAgent/Workflowtools for truly concurrent background agents. The explicit git form is:git switch main ; git pullgit worktree add .claude/worktrees/<type>-<issue>-<kebab> -b <type>/<issue>-<short-kebab-desc># โฆ work inside that directory โฆgit worktree remove .claude/worktrees/<type>-<issue>-<kebab>.claude/worktrees/is already gitignored, and the branch name is identical to a normal branch โ naming rules apply unchanged. - From the workspace root: in the multi-repo
le-workspacelayout, route first (theroute-issueskill) to find the child the work belongs in, then create the worktree inside that child โ a worktree is per-clone, so it lives under the resolved child's.claude/worktrees/, not the workspace root. - Config & hooks carry over: a worktree shares its clone's git config (it reads the same
.git/config), socore.hooksPathandhooks.requireIssueRefapply and the commit-hygiene hooks run there automatically โ nothing to re-enable. The only thing that does not follow is the gitignored.claude/settings.local.json(it isn't tracked); that is expected and usually fine. - Caveat: no in-game local testing from a worktree โ the
run/Paper servers and the.run/*.xmlIntelliJ configs live in the main clone. Build and compile work fine from a worktree; for in-game testing use the main clone or the beta-test server.
No extra library or MCP is needed โ git worktrees are built into git and supported natively by Claude Code.
Commands Referenceโ
Commands are thin composers over the fragments (the reusable primitives) plus the skills. The per-command summaries below name which fragment each step delegates to.
Dev Issueโ
File: .claude/commands/dev-issue.md
Use when: Starting work on a single GitLab issue (bug fix or feature), end-to-end.
What it does:
- Route (
route-issue) to the right repo, then fetch (fetch-gitlab-issue). - Up-front questions (once): the test mode (local vs beta) + completion timing (if beta); the review autonomy (report-only vs autonomous fix-loop); the mandatory
mainvs branch vs worktree choice (with an uncommitted-changes guard); the Conventional commit type. - Analyze โ the ANALYZE preset of
_panel-report(dev profile, sections 4.1โ4.6 with the depth calibration), then a plan-validation gate: no code is written without an explicit go ([NEEDS CLARIFICATION: โฆ]for unconfirmed assumptions). - Record & implement โ flips
Status: In Progress+ records the plan as a comment (one combined OK), then IMPLEMENT-ONE (version bump if published, code + build, flush translations, CHANGELOG, wiki, naming, local commit). A fast path trims the analysis for trivial fixes but keeps version / translations / naming / commit. - Review โ the REVIEW preset (scope = branch) in a fresh neutral subagent; report-only or bounded auto-fix per the up-front choice.
- Complete โ
_completion-policy: local test wait / beta / series timing โ push +Status: To release(the issue is closed later, at release time, by Release).
โ ๏ธ Requires the issue id as input. It will stop and ask for it if not provided.
Reviewโ
File: .claude/commands/review.md
Use when: Reviewing code changes on the current branch before creating or merging a Merge Request.
What it does:
- Fetches issue details via
fetch-gitlab-issue. - Identifies all changed files compared to
main. - Checks branch and commit naming via
validate-branch-and-commit-naming(Conventional format + no GitLab auto-close keywords). - Verifies the version increment via
check-version-publishedand that the bump segment matches the Conventional type chosen for the branch. - Validates the
CHANGELOG.mdentry format and content. - Reviews the code against the full project checklist: architecture layers, exceptions, player messages, logging, events, database, documentation, quality. If you also authored the changes, it runs the critique in a fresh subagent that did not write them (no self-approval bias).
- Verifies no orphan
.translation-staging.jsonremains at the project root. - Runs the build.
- Produces a structured review report (
โ Good,โ ๏ธ Suggestions,โ Must Fix,โ Questions).
โ ๏ธ Requires the issue id as input.
Fix MR Commentsโ
File: .claude/commands/fix-mr-comments.md
Use when: Applying changes requested by reviewers after a Merge Request review on GitLab.
What it does โ this is REVIEW(human findings) โ APPLY-CHANGE, looped:
- Invokes
fetch-mr-commentsto retrieve all MR comments from GitLab (via the GitLab MCP server) and produce.github/tmp/mr-comments.md. - For each unresolved comment: analyzes the request, proposes a plan, applies the fix via
_apply-change(code + build), runninganalyze-server-logโdiagnose-log-levelfirst for runtime-behaviour comments, and updating CHANGELOG/wiki if a comment warrants it. - Flushes staged translations, then produces a summary (+ naming validation for new commits).
โ ๏ธ Requires the GitLab MCP server (token via the
GITLAB_PERSONAL_ACCESS_TOKENenv var). See Setup Development Environment โ GitLab personal access token.
Releaseโ
File: .claude/commands/release.md (was create-release)
Use when: Publishing a release across the workspace (LasersEnigma, LE Play Server Utils, le-room-organizer, le-agent, le-mcp, wiki).
What it does:
- Inventories the six workspace clones โ presence (an absent clone is reported, never silently skipped), uncommitted changes, unpushed commits, version vs existing tags, CHANGELOG top section โ and presents one recap table.
- Decides the release set: LE tag, LEPSU tag, le-room-organizer tag, le-agent / le-mcp pushes (
mainauto-deploys), wiki push โ including the docs special case (trigger aDEPLOY_DOCS=truepipeline onlasersenigmawhen wiki commits would otherwise not be republished). - Asks whether breaking changes require updates to LEPSU (in-workspace) or Skytale Map Editor (manual โ SME and particleanimlib stay out of the automated scope).
- Condenses the CHANGELOG of every repo in the release set (
condense-changeloglives here only), presents the recap, waits for explicit user validation, then executes the tags/pushes itself in the proven joint order (LE tag โ pollpublish-to-artifactoryโ LEPSUupdate LEpin โ LEPSU tag โ โฆ), stopping on any pipeline failure, monitoring by polling the GitLab MCP in the foreground (no raw REST calls). - Post-release, performed by the agent: closes the released issues via the GitLab MCP (list validated by the user first,
Status:label removed on close โ see Issue management) and checks the deployed servers with the read-onlycheck-server-statusskill. Reminds the remaining manual steps (Discord changelog, SpigotMC update).
โ ๏ธ Never tags or pushes before the explicit user validation of the release recap; once validated, it executes the actions itself instead of handing the commands back.
โ ๏ธ Only project maintainers can create tags. See Development Process โ Tag Creation.
Designโ
File: .claude/commands/design.md (was design-loop)
Use when: Shaping a medium or large topic before implementation. Skip for trivial one-file changes (use Dev Issue directly).
What it does โ composes the ANALYZE preset (design profile):
- Understands the ground truth first โ reads the relevant code, wiki page(s) and related issues, fanning out read-only
Exploresubagents for a broad sweep. - Analyses the topic through three distinct lenses โ functional analyst, technical architect, lead dev (three bounded parallel subagents for a large topic, inline for a medium one).
- Synthesises them into one focused response โ open questions, problems/risks, a recommended direction (pick one), and the few real alternatives โ not three raw dumps; unconfirmed assumptions surfaced as
[NEEDS CLARIFICATION: โฆ]. - Loops until no open point remains.
- Gates on explicit validation (and only that โ no bundled new scope).
- Decomposes the work into an ordered issue set via
create-issue, then hands off to Deliver / Epic.
Deliverโ
File: .claude/commands/deliver.md
Use when: Implementing a validated issue series autonomously (typically after Design).
What it does:
- Asks the main-vs-branch-vs-worktree question + test mode once for the whole series.
- For each issue in dependency order, runs IMPLEMENT-ONE without the human gates (design already validated): Status โ In Progress, version check/bump, code+build, stage/flush translations, one CHANGELOG entry per issue, wiki, naming, local commit (no push).
- Runs the REVIEW preset (scope = commit) in a bounded auto-fix loop (
_apply-changeโ re-REVIEW) before the next commit. - Stops only on a genuine blocker (ambiguous decision, spec contradiction, unfixable build, destructive/outward action).
- Hands off to Finalize Series for the global review + push.
Finalize Seriesโ
File: .claude/commands/finalize-series.md (was ship-review)
Use when: Before pushing a series of local commits across one or more repos (wiki included).
What it does โ composes the REVIEW preset (scope = series):
- Inventories the unpushed commits across every clone this work touched โ only those; unpushed commits in a clone you didn't change belong to a concurrent agent and are left alone.
- Runs a global REVIEW(series, incremental) of the unpushed series across repos (fresh neutral subagents per repo or dimension), wiki doc accuracy included โ integration + cross-issue concerns, not a re-review of per-commit diffs already cleared in deliver.
- For a big multi-issue topic, runs a functional-conformity check mapping each requirement โ CONFORMS / PARTIAL / MISSING / DEVIATES.
- Reports blockers / non-blocking, fixes low-impact findings (bounded
_apply-change), then on explicit validation pushes each clone separately. (Nocondense-changeloghere โ that runs at Release only.) - Moves each issue's
Status: In ProgressโStatus: To release(beta-wait aware) viaedit-issueโ never closes (that is Release at tag time).
Epicโ
File: .claude/commands/epic.md
Use when: A big multi-issue topic, to chain the whole pipeline. Not for small topics โ use Dev Issue.
What it does: a thin orchestrator chaining, with the human gates between phases:
- Design โ three-lens design โ explicit-validation gate โ issue set. (Skipped if an existing ordered issue-id list is given โ epic-from-issue-ids.)
- Deliver โ autonomous implementation, per-commit review, local commits.
- Finalize Series โ global review + conformity โ validated push โ issues to
To release. create-test-issueโ the final manual in-game test checklist.
Releasing (tags) stays separate โ run Release when ready. Scales down: skip phases that don't fit. The expensive phases use a few bounded subagents, not the heavy Workflow fan-out (reserved for an explicit "ultracode" request).
Fragments Referenceโ
Reusable prompt primitives under .claude/fragments/, edited once canonically and inlined into the
referencing commands at sync time (a build input โ not invoked directly and not shipped as
standalone files into children; the shipped commands are self-contained). The canonical fragments live in
le-workspace.
_role-panelโ
One multi-role subagent pass: fan-out the given roles โ synthesize into one structured result. The
shared mechanism under _panel-report. Read-only; looping/mutation belong to the caller.
_panel-reportโ
The read-only panel-report(context, roles, output-schema) built on _role-panel. Two presets:
ANALYZE (author context, human-gated โ profile design: three kept-separate lenses โ Open
questions / Problems / Suggestions-pick-one / Alternatives โ validation gate; profile dev: sections
4.1โ4.6 incl. UX Item.java/HEAD textures and the 4.6 dependency graph; the [NEEDS CLARIFICATION: โฆ]
convention; depth calibration) and REVIEW (neutral non-author context โ scope branch/commit/
series, series incremental; the full checklist โ architecture, code conventions, exceptions,
logging, events, database, documentation + sibling-push, security, quality, naming/version/CHANGELOG
audits, orphan staging โ plus the โ
Good / โ ๏ธ Suggestions / โ Must Fix / โ Questions template).
REVIEW neutrality is mandatory (a separate non-author subagent, fragment text + diff passed in); the
autonomous fix-loop is capped at 5 then stops and waits for the human.
_stack-dispatchโ
The per-stack mapping (LE / LEPSU / Python / Go / wiki) for build, version file + bump, CHANGELOG and
translations, plus the multi-repo rules (pointing at the workspace AGENTS.md Multi-repo issue
section). Read by _implement-one, _apply-change, _panel-report and the commands โ kept as its own
fragment so it isn't trapped inside a command (no layer inversion, no anchor-breaks-on-rename).
_apply-changeโ
The smallest mutation unit: code โ build (translations staged for LE). The unit a review fix-loop re-runs โ deliberately no version bump / CHANGELOG / commit (those would duplicate per fix).
_implement-oneโ
Implement one issue to a local commit: StatusโIn Progress โ version (bump if published) โ _apply-change
โ flush translations โ CHANGELOG โ wiki (+_sidebar.md) โ naming โ commit. Stack-dispatch aware; never
pushes (the caller's _completion-policy does).
_completion-policyโ
Decides commit/push/status timing from the test mode (local / beta-move-now / beta-wait) and series vs
solo: series โ commit local, no push (batched at finalize-series); solo local โ wait for the manual test
(on failure โ analyze-server-log โ diagnose-log-level) then push + To release; etc. On a branch/MR,
To-release and the beta deploy tie to the merge to main.
Skills Referenceโ
22 atomic skills under .claude/skills/. Each fires automatically when the assistant's task matches its description. Several prompts above invoke these skills internally; you can also use any of them standalone.
Shared vs repo-local. Most skills are shared (canonical in
le-workspace, synced into every repo) โ includingadd-changelog-entryandcondense-changelog, which are stack-agnostic. The version skillscheck-version-published/bump-versionare repo-local (the version source differs per stack:gradle.propertieshere,pom.xmlin LEPSU,VERSIONin le-room-organizer; the Python repos have no per-version tag). Two domain skills are repo-local too:lepsu-add-flyway-migration(LEPSU) andgro-csv-roundtrip-check(le-room-organizer). The count above is the LE set.
fetch-gitlab-issueโ
Pulls a GitLab issue (title, description, labels and discussion comments) via the GitLab MCP server (get_issue + list_issue_discussions). Returns a fix/feature verdict from the Type: label or inferred from the issue body/comments. Warns when the issue contains Scope: labels outside Scope: Lasers-Enigma plugin. Comments are now retrieved directly โ no need to ask the user to paste them.
Used by: dev-issue, review, edit-issue (to build a before/after diff).
route-issueโ
Maps a GitLab issue to the workspace repo(s) the work belongs in. All issues live on lasersenigma/lasersenigma, but many concern another repo, span several, or are non-dev โ this reads the issue's Scope: labels + body against a Scopeโrepo table and returns the affected clone(s) + the cwd to launch in, flagging non-dev (game/level design, Discord, website, video, recruitment) and external (SME, NESB) work that has no workspace clone. Read-only.
Used by: dev-issue (step 0), deliver, triage.
create-issueโ
Creates a new GitLab issue on lasersenigma/lasersenigma from a conversation. The skill collects title / description / labels, shows the composed issue to the user and waits for explicit validation, then calls the GitLab MCP create_issue tool. The returned issue carries its IID and web_url directly (no intermediate file). Suggests labels from the standard project taxonomy (Type:, Scope:, Priority:) and warns when no Type: label is set โ the fix/feature verdict drives downstream dev-issue / bump-version / add-changelog-entry decisions.
โ ๏ธ Requires the GitLab MCP server with a token of scope
api(read+write โread_apiis not enough to create). See Setup Development Environment โ GitLab personal access token.โ ๏ธ Creating an issue is irreversible โ the skill never creates without explicit user validation of the composed content.
create-test-issueโ
Creates a GitLab issue whose body is a short manual in-game test checklist (markdown checkboxes) for a just-shipped topic, on lasersenigma/lasersenigma via the MCP create_issue tool. One checkbox = one action + its expected result; observable behaviour only; grouped by issue/feature. Filed at the end of a medium/large topic (the final step of Epic) so the user can validate each test on the beta server. Pairs with create-issue for the mechanics and the explicit-validation step.
โ ๏ธ Requires the GitLab MCP server with a token of scope
api.
edit-issueโ
Edits an existing GitLab issue (title, description, labels, state close/reopen) from a conversation. Reads the current state via the MCP get_issue tool, shows a clear before/after diff and waits for explicit validation, then calls the MCP update_issue tool. Labels are a full replacement (the API takes the complete label set, not add/remove) โ the skill starts from the current labels and sends the merged result, respecting cardinality. Description edits are full replacements too โ the skill rebuilds the full description when the user asks for a partial change.
โ ๏ธ Requires the GitLab MCP server with a token of scope
api.โ ๏ธ Use this skill (with
state_event: close) to close an issue programmatically. Never use a GitLab auto-close keyword (Close #N,Fixes #N, โฆ) in a commit message โ forbidden by project convention (seevalidate-branch-and-commit-naming).
comment-issueโ
Posts a comment (note) on an existing GitLab issue via the MCP create_issue_note tool, after showing the composed comment and waiting for explicit validation. This is the project's sanctioned way to add an automated comment โ e.g. the validated plan recorded by dev-issue. For label / title / description / state changes, use edit-issue instead.
Used by: dev-issue.
โ ๏ธ Requires the GitLab MCP server with a token of scope
api(posting a note is a write).
triageโ
Triages the open issues of the project against the Issue management cardinality rules (exactly one Type: / Status: / Prio:, at least one Scope:). Lists issues via the MCP list_issues tool (scope="all"), flags missing/duplicate labels and parasite labels outside the canonical list, reports them, then proposes and applies re-labels via edit-issue โ per-issue explicit validation, never a batch write. Cannot detect non-Issue work items (Task/Epic) โ points to the relevant Detection view instead.
Also runs a git-log cross-check for Status-label drift: it parses the (#NNN) references from the commit subjects on main and flags (a) issues referenced by a commit on main but still Status: In Progress โ proposes Status: To release; (b) issues referenced only by commits contained in a published tag but still open โ proposes close + Status-label removal. Best-effort: commits missing their issue reference escape the check.
โ ๏ธ Scope
read_apiis enough to report; scopeapiis required to apply fixes.
fetch-mr-commentsโ
Fetches the review discussion of the open Merge Request associated with the current branch via the GitLab MCP server (list_merge_requests to find the open MR, mr_discussions to read its notes), then writes the report to .github/tmp/mr-comments.md (MR metadata + per-comment author / file / line / resolved status). Keeps unresolved comments by default; can include resolved ones on request. Refuses to proceed on SHA mismatch (local HEAD โ MR head) so the comments stay aligned with the diff. Read-only on GitLab side.
โ ๏ธ Requires the GitLab MCP server. Scope
read_apiis enough for this skill (scopeapiis also fine and is required bycreate-issue/edit-issue).
Used by: fix-mr-comments.
check-version-publishedโ
Compares gradle.properties (sans -SNAPSHOT) to git tags. Reports whether the current version is already published โ in which case a bump is required and a new CHANGELOG.md section must be opened โ or still in-progress, in which case CHANGELOG entries go inside the existing section.
Used by: dev-issue, review, bump-version.
bump-versionโ
Increments X/Y/Z in gradle.properties based on the Conventional type chosen for the branch: feat โ Y, fix/refactor/perf/chore/docs/ci/build/test โ Z, <type>! (breaking) โ X. Always keeps -SNAPSHOT.
Used by: dev-issue.
add-changelog-entryโ
Adds a single user-facing line to CHANGELOG.md in the right subsection (## Features for feat, ## Fixes for fix, ## Technical changes for perf/refactor with observable effect). Refuses to edit any published version's entries (frozen). Format: - [#<id>](url): <description>.
Used by: dev-issue.
condense-changelogโ
Condenses the in-progress (untagged) CHANGELOG section so a shipped version reads as one story instead of a per-commit log: merges fragments of the same issue, factors two issues describing the same feature into a single bullet (citing both links), collapses an internal/tooling block into one "No in-game effect" line, and rewrites for concision โ never touching a frozen (tagged) section. Same user-facing tone and section rules as add-changelog-entry. Especially relevant before a tag.
Used by: release (condensing now lives at release only โ see the workflow map).
add-translation-codeโ
Adds a brand-new translation code into every <domain>.<lang>.json file (25 languages). No forceUpdatePluginVersion โ fresh keys are written on first plugin load. Edit tool only โ never Write / sed / script (would corrupt UTF-8 BOM in non-Latin scripts). Best for 1โ2 ad-hoc codes with no other translation work in flight; for โฅ 3 codes mid-feature, prefer stage-translation.
modify-translation-valueโ
Changes the value of a translation code already shipped in a prior release, bundling the new wording and the mandatory forceUpdatePluginVersion marker in the same Edit per language file. Without it, admins already running the plugin keep their stored value and your edit has no effect on live servers. Best for 1โ2 ad-hoc rewordings; for โฅ 3 modifications mid-feature, prefer stage-translation.
stage-translationโ
Buffers a translation (add or modify) into .translation-staging.json at the project root (gitignored) mid-feature, with a mandatory context field explaining when the code fires and what each {N} semantically represents โ so non-English translations don't drift into wrong literals. The actual write to the 25 language files happens later via flush-translation-staging.
โ ๏ธ Orphan check at session start: if
.translation-staging.jsonexists from a previous session, this skill stops and asks whether to flush it or discard it. A stale staging file from a previous session must never be silently merged with new work.
flush-translation-stagingโ
Reads .translation-staging.json, writes every buffered entry into all 25 language files of each affected domain in one batched pass โ one Edit per file containing every staged entry for that file (e.g. 8 staged codes ร 25 languages = 25 Edits, not 200). Applies forceUpdatePluginVersion automatically for modify entries. Deletes the staging file on success. Run at end-of-task, before build/commit.
Used by: dev-issue.
validate-branch-and-commit-namingโ
Verifies the branch name matches <type>/<id>-<kebab-desc> and the commit subject matches <type>(<scope>)?!?: <description> (#<id>), both Conventional Commits format. Also blocks any commit message containing a GitLab auto-close keyword (Close/Closes/Fix/Fixes/Resolve/Resolves/Implement/Implements + variants followed by #X) โ issues close manually at release time, never on merge.
Used by: dev-issue, review.
analyze-server-logโ
Read-only investigation of a Paper server log. Auto-picks the right log file (run/*/logs/latest.log โ when several servers exist, the most recently modified one wins) and surfaces the relative path so you can redirect cheaply; a caller (you, or check-server-status with a downloaded remote log) can also hand it an explicit log file path, which skips the discovery. Sizes the file first (wc -l + ripgrep counts), checks the startup verdict (Done (โฆ)! marker and plugin enable), then runs a broad ERROR/WARN/Exception scan with line numbers and windowed Read calls to capture multi-line stack traces without loading the whole file. When you give a structural hint ("at startup", "the last 5 seconds before stop", "around 21:08", "just before the server stopped"), the skill translates it into a [start, end] line window and restricts the scan to it. Does not infer grep patterns from feature names (portal, race, cubeโฆ) โ that requires reading the plugin source code, which is the caller's responsibility; the skill will ask for an explicit grep string (logger name, FQN, or log-line fragment) instead. Produces a tight structured report ending with a numbered Suggested actions list with concrete fix proposals (class, method, file:line, config key) โ never applies any of them. If the investigation concludes that missing FINE/FINEST traces are blocking diagnosis, the report ends with a delegation hint to invoke diagnose-log-level. Use whenever you want to debug a recent run without browsing thousands of log lines by hand.
analyze-python-logโ
Read-only investigation of a Python service loguru log (le-agent / le-mcp) โ the loguru-format counterpart to analyze-server-log (which is Paper-only and would misread these). Parses text or JSON logs/latest.log, gives a startup verdict, and surfaces the service-specific failure modes โ le-agent: Gemini quota, MCP timeout, auth-blacklist; le-mcp: stdout-corruption-under-stdio, wiki-refresh failure, ToolError. Read-only; ends with concrete suggested actions.
Used by: check-server-status (routes le-mcp/le-agent logs here).
diagnose-log-levelโ
LE-local skill (lives in lasersenigma/.claude/skills/, not in the shared manifest) โ references to it in synced commands/fragments sit behind LE-only "runtime issue on a local Paper server" paths. Find out why FINE/FINEST traces from eu.lasersenigma are missing from a server log, then fix the cause interactively. Picks the same server analyze-server-log would (most recently modified run/*/logs/latest.log) unless you name one explicitly. Walks three probable causes in decreasing order of likelihood โ (1) debug_level: in plugins/LasersEnigma/config.yml not set to FINEST, (2) <Logger name="eu.lasersenigma" level="..."> in log4j2.xml not set to TRACE (log4j filters out FINEST/FINER before the appender), (3) -Dlog4j.configurationFile=log4j2.xml missing from the IntelliJ run config in .run/<server>.run.xml. For each confirmed cause, it surfaces the proposed fix and asks for explicit confirmation before any edit โ one question per cause, so you can accept one and refuse another. Prefers re-running ./gradlew configureLog4j over hand-editing the generated log4j2.xml (which would be overwritten on the next setup). Warns when the fix targets .run/*.run.xml since that file is committed and the change propagates to other contributors. If all three sources are correct, the skill stops and tells you the trace is genuinely not emitted by the plugin code โ investigation moves to the source, not the config.
โ ๏ธ Not for debugging exceptions with a full stack trace โ finest traces add nothing. Stay in
analyze-server-login that case.
check-server-statusโ
Strictly read-only check of the deployed servers โ play, beta, le-mcp, le-agent โ through the Pterodactyl client API. Fetches the Pterodactyl credentials from the GitLab CI/CD variables of the project matching the target (the servers live on different panels: lasersenigma holds PLAY_MC_SERVER_PTERO_* / BETA_MC_SERVER_PTERO_*; le-mcp and le-agent hold their own SERVER_PTERO_*) via the GitLab MCP get_project_variable tool, queries the server state (running/offline, resources, uptime), downloads the log via the Pterodactyl files API into a temp file (never SFTP, never the websocket console), and delegates the parsing to the matching analyzer โ the Paper servers (play/beta) go to analyze-server-log, the Python services (le-mcp/le-agent) to analyze-python-log, whose loguru format the Paper analyzer would misread โ shared logic, no duplication. Never performs any Pterodactyl write action (no start/stop/restart/send-command), even when the server is down โ an explicit user counter-order plus explicit validation is required for any exception.
Used by: release (post-release verification).
โ ๏ธ Requires the GitLab MCP server with the
variablestoolset enabled (GITLAB_TOOLSETSโ committed in.mcp.json; see Setup Development Environment).
run-maintenance-pipelineโ
Launches a lasersenigma maintenance/ops pipeline on main by setting a single CI variable, via the GitLab MCP create_pipeline tool. Maps the user's intent to the right variable: publish / republish the docs site โ DEPLOY_DOCS=true (runs build-and-deploy-docs); refresh the beta server / regenerate the server pack โ GENERATE_SERVER_PACK=true (runs generate-server-pack, which stops, wipes and redeploys the beta mirror, ~2h). Verifies the expected job was actually created (not skipped) and watches it to completion. COMPRESS_WIKI is not covered โ its job is still web-only and cannot be API-triggered. See CI/CD for the underlying jobs.
โ ๏ธ Both are outward-facing deployments and
GENERATE_SERVER_PACKis destructive on the beta server โ the skill always confirms with the user before triggering.โ ๏ธ Requires the GitLab MCP server with a token of scope
api(creating a pipeline is a write).
Re-adding another AI providerโ
The commands and skills are plain markdown โ provider-agnostic by design. Claude Code is the only assistant wired up today (it auto-discovers everything under .claude/), but another provider can be layered on without touching the canonical tooling:
- Rules โ point the provider at the repo's
AGENTS.md(the canonical rule source). Most tools accept a thin entry file that redirects to it (e.g. a one-line pointer likeCLAUDE.md's@AGENTS.md). - Workflows โ if the provider doesn't read
.claude/commands/natively, add thin redirect prompts in its own convention, each opening the matching.claude/commands/<name>.md(the canonical workflow). Keep those redirects in the provider's directory, not in.claude/. - MCP servers โ replicate
.mcp.json(thegitlab+context7servers, includingGITLAB_TOOLSETS) into the provider's MCP config format.
A previous GitHub Copilot integration (
.github/copilot-instructions.md+.github/prompts/*.prompt.md+.vscode/mcp.json) was removed once it fell out of use; the pattern above is what it took, should it be reinstated.