Fix release for 1.1.2: the 14 longest skills keep their later phases after a compaction, a question nobody answered is never taken as an answer, settings read the same from a subfolder, the commit check works for a project in a subfolder of a larger repository, every skill opens with a title, and the shipped allow rules no longer approve deleting a branch or writing files without asking. Details in CHANGELOG.md; upgrade steps in UPGRADING.md (v1.1.2 → v1.1.3). Refs #83 Refs #133 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0185en4t76fPn7315q4c3nko
14 KiB
Skill Test Spec: /setup-engine
Skill Summary
/setup-engine pins the project's engine, version and language. It accepts
[engine], [engine] [version], refresh, upgrade [old] [new], or no
argument for guided selection. For Godot it asks which language (GDScript, C#
or Both) before showing the Technology Stack. It then:
- writes the Technology Stack and the
ENGINE-REFERENCE-IMPORTline toCLAUDE.mdafter "May I write these engine settings toCLAUDE.md?" - fills
.claude/docs/technical-preferences.md(the legacy mirror: naming conventions, specialist routing table, input/platform, performance budgets) after the user approves the presented defaults - dual-writes the
engine,specialists,namingandcommandsblocks toproject.yaml— the primary config store — after "May I write theengine,specialists,naming, andcommandsblocks toproject.yaml?" - updates or creates
docs/engine-reference/<engine>/, scaffoldsproject.godotfor Godot (never for Unity or Unreal), and reads everything back withproject-coherence.sh
On a re-run it edits existing project.yaml blocks in place rather than
duplicating them. No director gates apply. The verdict is COMPLETE when the
engine is configured.
Static Assertions (Structural)
Checked against the SKILL.md by /skill-test spec — no fixture needed.
- Has required frontmatter fields:
name,description,argument-hint,user-invocable,allowed-tools - Has ≥2 phase headings
- Contains verdict keyword: COMPLETE
- Contains "May I write" language before writing
CLAUDE.mdand before writing theproject.yamlblocks - Has a next-step handoff (Section 12 prints one tier-matched Next-Steps list, e.g.
/brainstormatminimal)
Director Gate Checks
None. /setup-engine is a technical configuration skill. No director gates apply.
Test Cases
Case 1: Godot 4 + GDScript — Full engine configuration
Fixture:
project.yamlhas noengineblock;technical-preferences.mdholds only placeholders- No
design/gdd/game-concept.mdand nodesign/game-brief.md docs/engine-reference/godot/VERSION.mdalready pins 4.6- No
project.godotat the repo root; the user approves every write
Input: /setup-engine godot 4.6
Expected behavior:
- Full-spec mode: Section 2's guided selection is skipped
- Skill asks the Godot language question (A GDScript / B C# / C Both); user picks GDScript
- Skill shows the Technology Stack and asks "May I write these engine settings to
CLAUDE.md?" - Technical preferences are presented with GDScript naming (snake_case files and
variables) and the A3 routing table:
.gd→ godot-gdscript-specialist,.gdshader→ godot-shader-specialist,.tscn→ godot-specialist - Because Section 2 never ran and no design artifact exists, the skill asks
the project-shape question (2D/3D, web or not) instead of writing
Forward+/Joltfrom the engine name commands.buildexport preset is asked, never defaulted;commands.testis the gdUnit4GdUnitCmdTool.gdcommand- Skill asks "May I write the
engine,specialists,naming, andcommandsblocks toproject.yaml?" - Section 6 reads its coverage table: 4.6 is beyond the Godot row (~4.3), so the knowledge risk is HIGH
- VERSION.md already pins 4.6 → nothing to regenerate; only its
Installed at pin timerow is written, from the Section 3 probe - Skill proposes
project.godotand asks before creating it; verdict COMPLETE
Assertions:
engine.nameis Godot andengine.languageis GDScript inproject.yamlnaming.variablesandnaming.filesaresnake_case- Routing table includes
.gd,.gdshader, and.tscnentries;specialists.codeisgodot-gdscript-specialist - The rendering/physics shape is asked, not inferred from the engine name
- "May I write" is asked before
CLAUDE.mdand beforeproject.yamlare written - Knowledge Risk is HIGH — the Section 6 table's cutoff is May 2025 and its Godot row ~4.3, as in the shipped VERSION.md
- Verdict is COMPLETE
Case 2: Unity + C# — Unity-specific configuration
Fixture:
- Placeholders only in
technical-preferences.md; noengineblock inproject.yaml - The user supplies the version and the build target when asked
Input: /setup-engine unity
Expected behavior:
- Engine-only mode: version looked up and confirmed with the user
- No language question (Unity is C#); CLAUDE.md Language is
C# - Naming: PascalCase classes/methods,
_camelCaseprivate fields - Routing:
.cs→ unity-specialist,.shader/.shadergraph→ unity-shader-specialist,.unity/.prefab→ unity-specialist,.uxml/.uss→ unity-ui-specialist rendering: URP,physics: PhysXwritten directly — no shape questioncommands.buildtarget is asked (no hardcodedStandaloneLinux64);naming.constantscarries the# UNVERIFIEDcomment- No Unity project is scaffolded; the user is told to create it in Unity Hub
Assertions:
- Engine field is set to Unity and Language to C#
- Naming conventions reflect C# conventions
- Routing table includes
.csand.unityentries - No project-shape question is asked for Unity
- No Unity project files are written
- Verdict is COMPLETE
Case 3: Unreal — C++ primary, Blueprint routed to its specialist
Fixture:
- Placeholders only; the user never states that the project is Blueprint-primary
- The session runs on Windows (
uname -sis neitherLinuxnorDarwin), so the Windowscommandsblock applies
Input: /setup-engine unreal 5.7
Expected behavior:
- The primary-language question defaults to C++, so CLAUDE.md Language reads
C++ (primary), Blueprint (gameplay prototyping)— the line follows the answer, and a Blueprint-primary answer would writeBlueprint (primary), C++ where needed project.yamlgetsengine.language: "C++"(Blueprint only when the project is Blueprint-primary)- Routing:
.uassetBP classes → ue-blueprint-specialist;.umap/.uasset→ unreal-specialist;specialists.additionalincludes ue-blueprint-specialist commandsare written as single-quoted scalars under a# TODO: confirm thesecomment;engine.pathis recorded- Performance budgets are asked via
AskUserQuestion(set defaults / leave[TO BE CONFIGURED]), not pre-filled - No
.uprojectis scaffolded; verdict COMPLETE
Assertions:
- Engine field is set to Unreal Engine 5.7 and
engine.languageisC++ - Routing table includes
.uassetand.umapentries - ue-blueprint-specialist is assigned for Blueprint graphs
commandscarry the# TODO: confirm thesecomment- Verdict is COMPLETE
Case 4: Re-run on a Configured Project — blocks edited in place
Fixture:
project.yamlalready hasengine(Godot 4.6),specialists,naming, amodesblock, and acommandsblock missing itssmokekeyproject.godotexists at the repo rootdocs/engine-reference/godot/VERSION.mdpins 4.6
Input: /setup-engine godot 4.6
Expected behavior:
- Skill reads
project.yamlbefore editing it - Each existing block is edited in place;
commands.smokeis added to the partial block; no second copy of any block is appended modesand every other non-engine block are preserved untouched- The existing
project.godotis not overwritten — the skill says so and skips - VERSION.md pins the same version → nothing to regenerate: Engine Version,
Project Pinned and Last Docs Verified are left as they are, and only the
Installed at pin timerow is written with the Section 3 probe result - Verdict COMPLETE
Assertions:
- No block is duplicated in
project.yaml, and the missingcommands.smokekey is added modes(and all other non-engine content) is unchangedproject.godotis not overwritten- For a same-version pin, Engine Version, Project Pinned and Last Docs Verified are untouched and
Installed at pin timeis written - Verdict is COMPLETE
Case 5: Director Gate Check — No gate; setup-engine is a utility skill
Fixture:
- Fresh project with no engine configured
Input: /setup-engine godot
Expected behavior:
- Skill completes full engine configuration
- No director agents are spawned at any point
- No gate IDs appear in output
Assertions:
- No director gate is invoked
- No gate skip messages appear
- Verdict is COMPLETE without any gate check
Case 6: Installed Editor Older Than the Chosen Version — ask, then record
Fixture:
- As Case 1;
docs/engine-reference/godot/VERSION.mdpins 4.6 godot --versionreports4.5.1.stable- The user picks "pin the newer one and upgrade later"
Input: /setup-engine godot 4.6
Expected behavior:
- Section 3 probes the installed editor and finds 4.5.1 — a mismatch
- Skill states both versions and asks, offering three options: pin the installed version, pin the newer one and upgrade later, or pin the newer one deliberately
- The answer is recorded; the skill does not pick for the user
- VERSION.md already pins 4.6, so nothing is regenerated, but its
Installed at pin timerow is written with 4.5.1 - Verdict COMPLETE
Assertions:
- Both versions are stated and all three options are offered
- The skill waits for the user's choice rather than picking silently
Installed at pin timerecords 4.5.1 — the same-version branch does not skip it- Engine Version, Project Pinned and Last Docs Verified are not restamped
Case 7: Godot not on PATH — the probed executable goes into commands.*
Fixture:
- As Case 1, on Windows;
godot --versionfails —godotis not onPATH - The probe finds
C:/Program Files/Godot/Godot_v4.6.1-stable_win64.exe, which reports4.6.1.stable - The user names the export preset
Windows Desktop
Input: /setup-engine godot 4.6
Expected behavior:
- Section 3 reads the version from the executable it found — it does not report "no engine installed"
build,test,runandsmokeeach start with the quoted full path, as single-quoted scalars;buildquotes its preset with double quotes:build: '"C:/Program Files/Godot/Godot_v4.6.1-stable_win64.exe" --headless --export-debug "Windows Desktop"'testkeeps--remote-debug tcp://127.0.0.1:0and the gdUnit4 runner arguments after the pathengine.pathrecords the executable- Verdict COMPLETE
Assertions:
- No
commands.*value names baregodot - Every Godot command value is a single-quoted scalar and none holds both quote types
engine.pathrecords the editor executable- Variant — the probe finds nothing and the user does not know where Godot is: bare
godotis kept under a# TODO: godot is not on PATH herecomment, and the skill says the commands will not run until the path is set
Case 8: A skipped question is not an answer
Fixture:
- Fresh project: no engine configured, no
project.yamlengine block - The engine question comes back skipped: the user closes it, or a headless run returns every question as skipped
Input: /setup-engine
Expected behavior:
- The skill does not choose an engine, language or version itself
- It asks again in plain text, saying what is waiting on the answer, and waits
- Nothing is written to
CLAUDE.md,project.yaml,technical-preferences.mdorVERSION.mdbefore the user answers - In a run where nobody can answer, it stops and reports what is waiting
Assertions:
- No engine, language or version is picked on the user's behalf
- The question is asked again in plain text
- No file is written before an answer arrives
Protocol Compliance
- Presents draft configuration before asking to write
- Asks "May I write" before writing
CLAUDE.mdand theproject.yamlblocks; technical preferences are written only after the user approves the presented defaults - Respects engine argument when provided (skips guided selection)
- Dual-writes
project.yamlandtechnical-preferences.md, then readsproject.yamlback to confirm they agree - On re-run, edits existing
project.yamlblocks in place without duplicating them - Writes the probed editor path into
commands.*— for Unity always, for Godot whenevergodotis not onPATH— never a bare executable that does not resolve - Never defaults the Godot export preset or the Unity build target — asks for it; Unreal's
commandsare best-effort values matched to the machine's OS (-platform=Win64on Windows,Linuxon Linux) under a# TODOcomment; on macOS onlybuildis written, andtest,runandsmokestay TODO lines - Writes the Section 3 probe into VERSION.md's
Installed at pin timerow whatever the outcome, after asking "May I recordInstalled at pin time: …indocs/engine-reference/<engine>/VERSION.md?" - Verdict is COMPLETE after configuration is written
Coverage Notes
- Godot C# and Both follow Case 1 with the A1/A2/A3 variants from
references/godot-language-config.md; not separately tested. - The
refreshandupgradesubcommands (Sections 10–11) are not tested here. - The Unreal Linux and macOS
commandsblocks (chosen byuname -s) are not fixture-tested; Case 3 pins Windows. - Section 6 is a lookup against the skill's own coverage table, asserted in Case 1. The Section 7 reference docs for a version with no reference set yet depend on WebSearch results; not assertion-tested.
- A probe that cannot run reports
installed version NOT DETERMINED— never "no engine installed"; not separately tested. - A Blueprint-primary Unreal answer (
engine.language: "Blueprint") follows Case 3 with the other Language line; not separately tested.