summer-engine 1.3.0 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +7 -2
  3. package/dist/bin/summer.js +24 -1
  4. package/dist/commands/doctor.js +44 -20
  5. package/dist/commands/setup.js +77 -6
  6. package/dist/commands/skills.js +5 -3
  7. package/dist/lib/format.d.ts +23 -0
  8. package/dist/lib/format.js +60 -0
  9. package/dist/lib/format.test.d.ts +1 -0
  10. package/dist/lib/format.test.js +36 -0
  11. package/dist/lib/skills-registry.d.ts +16 -0
  12. package/dist/lib/skills-registry.js +35 -0
  13. package/package.json +5 -3
  14. package/skills/_meta/skill-test/SKILL.md +1 -1
  15. package/skills/_shared/summer-folder.md +44 -0
  16. package/skills/_tests/specs/art-direction.md +115 -0
  17. package/skills/_tests/specs/audio-direction.md +123 -0
  18. package/skills/_tests/specs/brainstorm-game.md +99 -0
  19. package/skills/_tests/specs/debug.md +94 -0
  20. package/skills/_tests/specs/design-level.md +113 -0
  21. package/skills/_tests/specs/design-mechanic.md +112 -0
  22. package/skills/_tests/specs/design-npc.md +112 -0
  23. package/skills/_tests/specs/export-and-ship.md +114 -0
  24. package/skills/_tests/specs/fps-controller.md +5 -5
  25. package/skills/_tests/specs/play.md +88 -0
  26. package/skills/_tests/specs/setup-multiplayer.md +106 -0
  27. package/skills/_tests/specs/tune-performance.md +104 -0
  28. package/skills/_tests/specs/vfx.md +98 -0
  29. package/skills/ai-and-npcs/design-npc/SKILL.md +343 -0
  30. package/skills/asset-pipeline/asset-strategy/SKILL.md +1 -0
  31. package/skills/audio/audio-direction/SKILL.md +258 -0
  32. package/skills/catalog.yaml +13 -3
  33. package/skills/character-controllers/fps-controller/SKILL.md +1 -0
  34. package/skills/debugging/debug/SKILL.md +137 -0
  35. package/skills/deployment/export-and-ship/SKILL.md +300 -0
  36. package/skills/gameplay-mechanics/design-mechanic/SKILL.md +265 -0
  37. package/skills/level-design/design-level/SKILL.md +266 -0
  38. package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +328 -0
  39. package/skills/performance/tune-performance/SKILL.md +219 -0
  40. package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -0
  41. package/skills/rendering-and-lighting/art-direction/SKILL.md +284 -0
  42. package/skills/scene-and-project/brainstorm-game/SKILL.md +210 -0
  43. package/skills/scene-and-project/make-game/SKILL.md +1 -0
  44. package/skills/scene-and-project/play/SKILL.md +108 -0
  45. package/skills/scene-and-project/scene-composition/SKILL.md +1 -0
  46. package/skills/scripting-patterns/gdscript-patterns/SKILL.md +1 -0
  47. package/skills/ui-and-ux/ui-basics/SKILL.md +1 -0
  48. package/skills/visual-effects/vfx/SKILL.md +280 -0
@@ -0,0 +1,44 @@
1
+ # `.summer/` Folder Convention
2
+
3
+ > The canonical layout for project-scoped Summer state. Read this if you're authoring a skill that writes durable design output (briefs, art bible, level docs).
4
+
5
+ ## Files at the root of `.summer/`
6
+
7
+ - `GameSoul.md` — the project brief. Created by `/summer:brainstorm-game`. Contains: name, one-sentence pitch, core loop, 3 mechanics max, art direction summary, scope. Updated whenever the game's high-level direction changes.
8
+ - `art-bible.md` — visual style reference. Created by `/summer:art-direction`. Contains: palette (6–15 hex codes), mood adjectives, lighting plan, post-processing notes, do/don't list, references.
9
+ - `audio-bible.md` — sonic identity. Created by `/summer:audio-direction`. Contains: music style + tempo range, SFX vocabulary (8 classes), dynamic music FSM, bus layout reference.
10
+
11
+ ## Subdirectories
12
+
13
+ - `mechanics/<mechanic-name>.md` — one file per designed mechanic (e.g., `double-jump.md`, `parry.md`). Created by `/summer:design-mechanic`. Contains: input → response → feedback → failure modes → tunable parameters.
14
+ - `levels/<level-name>.md` — one file per designed level. Created by `/summer:design-level`. Contains: teaching goal, pacing curve (5 beats), encounters, secrets, reward gating.
15
+ - `npcs/<npc-name>.md` — one file per designed NPC. Created by `/summer:design-npc`. Contains: archetype, perception model, decision tree, escalation, defeat sequence.
16
+
17
+ ## Conventions
18
+
19
+ - All filenames are lowercase, hyphens not underscores.
20
+ - Skills MUST ask "May I write/update `.summer/<file>`?" before any write to this folder.
21
+ - Skills MAY read existing files in `.summer/` without permission to ground their output in prior decisions.
22
+ - The folder lives in the project root (sibling to `project.godot`).
23
+ - Add `.summer/` to `.gitignore` if the user prefers it private; default is to commit it (game design lives with the game).
24
+
25
+ ## Skills that write here
26
+
27
+ | Skill | Writes |
28
+ |---|---|
29
+ | `/summer:brainstorm-game` | `.summer/GameSoul.md` |
30
+ | `/summer:art-direction` | `.summer/art-bible.md` |
31
+ | `/summer:audio-direction` | `.summer/audio-bible.md` |
32
+ | `/summer:design-mechanic` | `.summer/mechanics/<name>.md` |
33
+ | `/summer:design-level` | `.summer/levels/<name>.md` |
34
+ | `/summer:design-npc` | `.summer/npcs/<name>.md` |
35
+ | `/summer:debug` | does NOT write here |
36
+ | `/summer:play` | does NOT write here |
37
+ | `/summer:vfx` | does NOT write here (VFX edits scenes/scripts) |
38
+ | `/summer:tune-performance` | optionally writes `.summer/perf-notes.md` if user requests |
39
+ | `/summer:setup-multiplayer` | optionally writes `.summer/multiplayer-architecture.md` |
40
+ | `/summer:export-and-ship` | does NOT write here (writes export configs in `project.godot`) |
41
+
42
+ ## Linter check (future)
43
+
44
+ Once `_meta/skill-test` gains an executable mode, it should validate that any skill writing to `.summer/` is documented in the table above.
@@ -0,0 +1,115 @@
1
+ # Skill Spec: /art-direction
2
+
3
+ ## Fixture
4
+
5
+ - Godot 4.5 / Summer Engine project, main scene with `World/WorldEnvironment` and `World/Sun` (DirectionalLight3D) present.
6
+ - `.summer/GameSoul.md` exists; brief: "Cozy farming sim, vertical slice scope."
7
+ - No `.summer/art-bible.md` yet.
8
+ - Summer MCP available.
9
+
10
+ ## Case 1: Happy Path — define art direction for cozy farming sim
11
+
12
+ **Input:** "Help me define the art direction. References: Stardew Valley and Sable."
13
+
14
+ **Expected MCP tool sequence (in order):**
15
+
16
+ 1. `Read .summer/GameSoul.md` — anchor
17
+ 2. (Skill notes: brief says "cozy", which forbids harsh contrast / saturated reds)
18
+ 3. (Skill walks: technique pick → palette (6-15 hex codes) → mood adjectives → lighting plan → post-processing rules → do/don't list)
19
+ 4. (Skill shows the bible inline)
20
+ 5. (Skill asks: "May I update `project.godot`'s default clear color to the palette primary, and enable MSAA 2x?")
21
+ 6. `summer_project_setting(key="rendering/environment/defaults/default_clear_color", value="Color(...)")`
22
+ 7. `summer_project_setting(key="rendering/anti_aliasing/quality/msaa_3d", value="2")`
23
+ 8. (Skill asks: "May I dial in the WorldEnvironment + Sun to the lighting plan?")
24
+ 9. `summer_inspect_node(path="./World/WorldEnvironment")`
25
+ 10. `summer_set_prop(...)` — adjustments + tonemap per the plan
26
+ 11. `summer_set_prop(path="./World/Sun", key="light_color", value="Color(...)")`
27
+ 12. (Skill asks: "May I create `.summer/art-bible.md` with this bible?")
28
+ 13. `Write .summer/art-bible.md`
29
+
30
+ **Assertions:**
31
+
32
+ - [ ] Skill reads `.summer/GameSoul.md` to anchor.
33
+ - [ ] Skill enforces 2+ references — does not proceed with single reference.
34
+ - [ ] Skill picks ONE rendering technique (does not allow blending without naming the conflict).
35
+ - [ ] Palette has 6-15 hex codes; uses off-white (e.g., #f4ecdf) and off-black (e.g., #1f1a16) — flags pure #ffffff or #000000 if user pitches them.
36
+ - [ ] Mood adjectives are concrete (e.g., "soft, hand-warmed, golden-hour"), not vague ("cool, atmospheric").
37
+ - [ ] Lighting plan names DirectionalLight3D color, energy, angle; sky colors; ambient; never-rules.
38
+ - [ ] Post-processing has explicit ON/OFF/value calls per item (Glow, SDFGI, SSAO, SSR, Tonemap, Vignette, Chromatic aberration, Film grain) — NOT a list of options.
39
+ - [ ] DO and DON'T lists each have at least 5 specific, enforceable rules.
40
+ - [ ] DON'T list explicitly forbids chromatic aberration, motion blur, lens flare unless mood justifies them.
41
+ - [ ] Skill asks "May I ..." before any `summer_project_setting` or `summer_set_prop` call.
42
+ - [ ] Skill writes `.summer/art-bible.md` only after asking.
43
+ - [ ] Skill never calls `summer_set_resource_property` on an inline sub_resource (silent-fail trap).
44
+ - [ ] Skill ends with routing to `/summer:audio-direction` or similar.
45
+
46
+ ## Case 2: Failure Path — mixed-technique pitch
47
+
48
+ **Fixture:** Same as Case 1.
49
+
50
+ **Input:** "I want PBR realistic characters in a toon-shaded world."
51
+
52
+ **Expected behavior:**
53
+
54
+ - Skill identifies the conflict explicitly: "Toon characters in a PBR world fight. The lighting that makes PBR read realistic crushes toon shading; the flat shading that makes toon read clean strips PBR's value."
55
+ - Skill offers a hierarchy: "(a) PBR with toon outlines (one technique), (b) full-toon with PBR-feeling fabric (one technique), (c) accept the conflict and pick which side wins on which assets."
56
+ - Skill does NOT silently pick or design two parallel pipelines.
57
+
58
+ **Assertions:**
59
+
60
+ - [ ] Skill names the technique conflict out loud.
61
+ - [ ] Skill explains *why* the techniques fight (lighting interaction).
62
+ - [ ] Skill forces the user to pick one primary technique.
63
+ - [ ] No bible written until the technique is locked.
64
+
65
+ ## Case 3: Edge Case — user pitches pure white + pure black palette
66
+
67
+ **Fixture:** Same as Case 1.
68
+
69
+ **Input:** "Black-and-white only, super high contrast. Like Limbo."
70
+
71
+ **Expected behavior:**
72
+
73
+ - Skill recognizes the intent (high-contrast monochrome) but flags pure values: "Limbo isn't actually pure black — it's #0a0a0a to #f0f0f0 with subtle warm tint. Pure #000 + #fff makes UI text vibrate and reads as unintentional."
74
+ - Skill offers a near-monochrome palette: e.g., #0a0a0a, #2a2a2a, #6e6e6e, #c0c0c0, #f0f0f0 with one accent color (often warm) reserved for a single mechanic-tied use.
75
+ - Skill writes the bible with off-pure values and documents the single-accent rule in the DO list.
76
+
77
+ **Assertions:**
78
+
79
+ - [ ] Skill flags pure #000 / #fff as a red flag and corrects to off-pure values.
80
+ - [ ] Bible includes at least one accent color reserved for mechanic-tied use.
81
+ - [ ] Skill explains *why* (UI vibration, "looks unintentional") not just "use these values".
82
+
83
+ ## Case 4: No Summer MCP — file-edit fallback
84
+
85
+ **Fixture:** Same as Case 1, but Summer MCP is unavailable.
86
+
87
+ **Input:** "Define the art direction for my farming sim."
88
+
89
+ **Expected behavior:**
90
+
91
+ - Skill detects no MCP.
92
+ - Walks the design beats normally.
93
+ - Instead of `summer_project_setting`, prints the `project.godot` snippet for the user to paste:
94
+
95
+ ```
96
+ [rendering]
97
+ environment/defaults/default_clear_color=Color(0.227, 0.290, 0.227, 1)
98
+ anti_aliasing/quality/msaa_3d=2
99
+ ```
100
+
101
+ - Instead of `summer_set_prop` on WorldEnvironment, prints the `.tscn` snippet for the user to paste into the main scene.
102
+ - Still writes `.summer/art-bible.md` via host `Write`.
103
+ - Asks "May I write ..." before each file write.
104
+
105
+ **Assertions:**
106
+
107
+ - [ ] Skill identifies that MCP is unavailable; does not blindly call `summer_*`.
108
+ - [ ] Generated `project.godot` snippet uses correct INI section format.
109
+ - [ ] Generated `.tscn` snippet for WorldEnvironment is parseable Godot 4.
110
+ - [ ] Skill still writes `.summer/art-bible.md`.
111
+ - [ ] Skill still asks "May I write ..." before each write.
112
+
113
+ ---
114
+
115
+ This spec runs via `/skill-test art-direction spec` (see `_meta/skill-test/SKILL.md`).
@@ -0,0 +1,123 @@
1
+ # Skill Spec: /audio-direction
2
+
3
+ ## Fixture
4
+
5
+ - Godot 4.5 / Summer Engine project, default audio bus layout (Master only).
6
+ - `.summer/GameSoul.md` exists; brief: "Cozy farming sim, vertical slice scope."
7
+ - `.summer/art-bible.md` exists; mood: "soft, hand-warmed, golden-hour, painterly".
8
+ - No `.summer/audio-bible.md` yet.
9
+ - No `audio/` folder yet.
10
+ - Summer MCP available.
11
+
12
+ ## Case 1: Happy Path — define audio direction for cozy farming sim
13
+
14
+ **Input:** "Define the audio direction. References: Stardew Valley OST, Studio Ghibli scores, and Outer Wilds. Acoustic, organic SFX."
15
+
16
+ **Expected MCP tool sequence (in order):**
17
+
18
+ 1. `Read .summer/GameSoul.md` — anchor to brief
19
+ 2. `Read .summer/art-bible.md` — anchor to visual mood
20
+ 3. (Skill notes the rhyme: "soft, hand-warmed, golden-hour" + acoustic references = acoustic / folk style as primary)
21
+ 4. (Skill walks: music style → tempo + key → SFX vocabulary (8 classes) → dynamic music plan with state machine → spatial + mix rules)
22
+ 5. (Skill shows the bible inline)
23
+ 6. (Skill asks: "May I create `audio/default_bus_layout.tres` with these buses: Master / Music / SFX / UI / Voice / Ambient / Reverb_Small / Reverb_Large / Reverb_Outdoor?")
24
+ 7. `Write audio/default_bus_layout.tres`
25
+ 8. `summer_project_setting(key="audio/buses/default_bus_layout", value="res://audio/default_bus_layout.tres")`
26
+ 9. (Skill asks: "May I create `.summer/audio-bible.md` with this bible?")
27
+ 10. `Write .summer/audio-bible.md`
28
+ 11. (Skill optionally asks: "May I generate first-pass SFX seeds for UI, pickup, damage?")
29
+ 12. (On yes) `summer_generate_audio(prompt="soft woody UI click, 80ms, no reverb", duration=0.1)` etc.
30
+
31
+ **Assertions:**
32
+
33
+ - [ ] Skill reads BOTH `.summer/GameSoul.md` AND `.summer/art-bible.md` to anchor.
34
+ - [ ] Skill enforces 3+ references — does not proceed with one or two.
35
+ - [ ] Skill picks ONE primary music style; if user pitches multiple, names the conflict.
36
+ - [ ] Music section has explicit tempo range (BPM), key center, time signature — not "varies".
37
+ - [ ] SFX vocabulary has 8 classes, each with character + examples + a DON'T rule.
38
+ - [ ] DON'T rules include things like "no pure sine ding for pickup" and "no same footstep for all surfaces".
39
+ - [ ] Dynamic music plan picks ONE model (layered / vertical / horizontal / procedural) — not a list.
40
+ - [ ] Dynamic music plan defines a state machine with named states + transitions + crossfade times.
41
+ - [ ] Spatial + mix section has concrete dB values, attenuation curve, max distance, master ceiling -1 dBTP.
42
+ - [ ] Mix defaults to SFX 0 dB / Music -8 dB / UI -3 dB (SFX loudest).
43
+ - [ ] Bus layout has at least Music, SFX, UI, Voice, Ambient + 1+ Reverb send buses.
44
+ - [ ] Skill asks "May I ..." before any `Write`, `summer_project_setting`, or `summer_generate_audio` call.
45
+ - [ ] Skill writes `.summer/audio-bible.md` only after asking.
46
+ - [ ] Skill never calls `summer_set_resource_property` on an inline sub_resource (silent-fail trap).
47
+ - [ ] Skill ends with routing to `/summer:design-mechanic` or implementation skill.
48
+
49
+ ## Case 2: Failure Path — references contradict the brief
50
+
51
+ **Fixture:** Same as Case 1, but brief says "horror walking sim".
52
+
53
+ **Input:** "References: Mario 64 OST, A Hat in Time, Banjo-Kazooie. Bouncy chiptune."
54
+
55
+ **Expected behavior:**
56
+
57
+ - Skill identifies the conflict: "Brief says horror; references are bright N64 platformer scores. Those want opposite shapes — horror wants ambient drone or industrial; bouncy chiptune undercuts dread."
58
+ - Skill asks the user to resolve: "(a) keep horror brief, change references to ambient/industrial, (b) keep bouncy references, change brief away from horror, or (c) intentional juxtaposition (rare; works in 1 in 50 games — Undertale, Buckshot Roulette)."
59
+ - Skill does NOT silently pick or design a "horror chiptune" hybrid without flagging the friction.
60
+
61
+ **Assertions:**
62
+
63
+ - [ ] Skill names the brief vs. references conflict explicitly.
64
+ - [ ] Skill explains *why* the shapes oppose.
65
+ - [ ] Skill offers (c) intentional juxtaposition as a valid but rare path.
66
+ - [ ] No bible written until the user resolves.
67
+
68
+ ## Case 3: Edge Case — user wants no music
69
+
70
+ **Fixture:** Same as Case 1.
71
+
72
+ **Input:** "Reference: Inside, Limbo. No music — just diegetic sound and ambience."
73
+
74
+ **Expected behavior:**
75
+
76
+ - Skill accepts "no music" as a valid direction (those references genuinely use it).
77
+ - Skill replaces the dynamic music plan section with a "Diegetic-only ambience plan":
78
+ - Named ambience layers (room tone / wind / distant water / heart-rate-tied sub-bass when tense)
79
+ - Rules for when sub-bass enters (proximity to threat) and exits
80
+ - SFX still gets all 8 vocabulary classes (with extra weight on the "Ambient layer" class)
81
+ - Skill keeps the bus layout but removes the Music bus or marks it "reserved (unused in v1)".
82
+ - Skill notes the trade-off: "Diegetic-only is harder to make feel paced — every level needs an ambient arc that does what music would normally do."
83
+
84
+ **Assertions:**
85
+
86
+ - [ ] Skill does NOT force a music style on a no-music game.
87
+ - [ ] Bible has a Diegetic / ambience plan section instead of (or supplementing) Dynamic music plan.
88
+ - [ ] Bus layout reflects the choice (no Music bus or marked reserved).
89
+ - [ ] Skill flags the trade-off: pacing is now ambience's job.
90
+
91
+ ## Case 4: No Summer MCP — file-edit fallback
92
+
93
+ **Fixture:** Same as Case 1, but Summer MCP is unavailable.
94
+
95
+ **Input:** "Define the audio direction for my cozy farming sim."
96
+
97
+ **Expected behavior:**
98
+
99
+ - Skill detects no MCP.
100
+ - Walks the design beats normally.
101
+ - Instead of `summer_project_setting`, prints the `project.godot` snippet for the user to paste:
102
+
103
+ ```
104
+ [audio]
105
+ buses/default_bus_layout="res://audio/default_bus_layout.tres"
106
+ ```
107
+
108
+ - Generates `audio/default_bus_layout.tres` content as plain text for the user to save (Godot's `.tres` resource format with bus entries).
109
+ - Writes `.summer/audio-bible.md` via host `Write`.
110
+ - Does NOT call `summer_generate_audio` — instead suggests external SFX library searches or asks the user to handle generation later.
111
+ - Asks "May I write ..." before each file write.
112
+
113
+ **Assertions:**
114
+
115
+ - [ ] Skill identifies that MCP is unavailable; does not blindly call `summer_*`.
116
+ - [ ] Generated `project.godot` snippet uses correct INI section format.
117
+ - [ ] Generated `default_bus_layout.tres` is valid Godot 4 resource format.
118
+ - [ ] Skill still writes `.summer/audio-bible.md`.
119
+ - [ ] Skill does not attempt audio generation when generation tools are unavailable.
120
+
121
+ ---
122
+
123
+ This spec runs via `/skill-test audio-direction spec` (see `_meta/skill-test/SKILL.md`).
@@ -0,0 +1,99 @@
1
+ # Skill Spec: /brainstorm-game
2
+
3
+ ## Fixture
4
+
5
+ - Empty Godot 4.5 / Summer Engine project, `project.godot` exists, no `.summer/` folder yet.
6
+ - Summer MCP available.
7
+ - Host file tools available (Read, Write, Edit).
8
+
9
+ ## Case 1: Happy Path — fresh idea, full brainstorm
10
+
11
+ **Input:** "I want to make a game but I don't know what."
12
+
13
+ **Expected behavior:**
14
+
15
+ 1. Skill asks the one opening question: "One sentence — what kind of game do you want to make?"
16
+ 2. (Simulated user reply: "Something like Hades, but cozy.")
17
+ 3. Skill recognizes Action-Combat anchor + cozy modifier, picks Action-Combat branch, but flags the tension: "Hades is tense, cozy is calm — let's pin which side wins."
18
+ 4. Skill walks: core loop candidate → user refinement → three mechanics (push back if user lists more) → one-phrase art direction → scope (recommend vertical slice).
19
+ 5. Skill drafts the 1-page brief inline, shows it to the user.
20
+ 6. Skill asks: "May I create `.summer/GameSoul.md` with this brief?"
21
+ 7. On yes, calls `Write .summer/GameSoul.md`.
22
+ 8. Skill ends with the routing question pointing to `/summer:design-mechanic` or similar.
23
+
24
+ **Assertions:**
25
+
26
+ - [ ] Skill asks ONLY the opening question first, no menu of options.
27
+ - [ ] Skill picks ONE branch, not multiple; doesn't ask 6 questions in parallel.
28
+ - [ ] Skill enforces the three-mechanic limit (pushes back if user lists more).
29
+ - [ ] Brief includes all 8 fields: Pitch, Core loop, Three mechanics, Art direction, Scope, Win condition, "One thing this is NOT", Inspirations, Parked for later.
30
+ - [ ] Skill asks "May I create `.summer/GameSoul.md`?" before writing.
31
+ - [ ] Brief is shown inline before being written so the user can react.
32
+ - [ ] Skill ends with a routing question to a next `/summer:` step.
33
+ - [ ] Skill defaults to "vertical slice" scope when the user is unsure.
34
+
35
+ ## Case 2: Failure Path — `.summer/GameSoul.md` already exists
36
+
37
+ **Fixture:** Same as Case 1, except `.summer/GameSoul.md` already exists with a previous game's brief.
38
+
39
+ **Input:** "I want to brainstorm a new game."
40
+
41
+ **Expected behavior:**
42
+
43
+ - Skill reads the existing `.summer/GameSoul.md` first via `Read`.
44
+ - Skill walks the brainstorm normally.
45
+ - Before writing, skill detects the file exists and asks: "`.summer/GameSoul.md` already exists. May I overwrite it, or merge into a 'Revision 2' section below the existing brief?"
46
+ - Does NOT silently overwrite.
47
+
48
+ **Assertions:**
49
+
50
+ - [ ] Skill reads existing `.summer/GameSoul.md` before drafting the new brief.
51
+ - [ ] Skill shows the user what would change before writing.
52
+ - [ ] Skill explicitly offers overwrite vs. merge — does not default-pick.
53
+ - [ ] No `Write` call happens until the user answers.
54
+
55
+ ## Case 3: Edge Case — user pitches a multiplayer 4-player co-op horror RPG with crafting
56
+
57
+ **Fixture:** Same as Case 1.
58
+
59
+ **Input:** "I want a 4-player online co-op horror RPG with crafting, base-building, dialogue trees, and procedural worlds, kind of like Valheim meets Phasmophobia meets Disco Elysium."
60
+
61
+ **Expected behavior:**
62
+
63
+ - Skill catches the multiplayer flag (4-player co-op = scope explosion) and surfaces it explicitly: "Multiplayer is its own scope category — it roughly 3x's everything. Confirm: is multiplayer non-negotiable, or could a great single-player version land first and multiplayer come later?"
64
+ - Skill enforces the three-mechanic constraint hard. Names which mechanics from the user's pitch are content vs. mechanics, e.g.: "crafting + base-building are systems, not mechanics; dialogue is a mechanic if choices change outcomes."
65
+ - Skill states a sanity-check concern: "Procedural worlds + horror + RPG depth + multiplayer at vertical-slice scope is unrealistic. Suggest scoping to one of those four pillars."
66
+ - Skill does NOT just write the brief with all five things in it.
67
+ - Skill asks the user to pick the cut.
68
+
69
+ **Assertions:**
70
+
71
+ - [ ] Skill flags multiplayer explicitly and asks about negotiability before continuing.
72
+ - [ ] Skill distinguishes "system/feature" from "mechanic" out loud.
73
+ - [ ] Skill names a scope concern instead of writing the brief verbatim from the pitch.
74
+ - [ ] Skill never writes a brief with more than three mechanics.
75
+ - [ ] Skill offers a clear cut, not a vague "scope down" platitude.
76
+
77
+ ## Case 4: No Summer MCP / no host file write — fallback path
78
+
79
+ **Fixture:** Same as Case 1, except the host has no file-write tool (read-only agent in a constrained environment).
80
+
81
+ **Input:** "Help me brainstorm a game."
82
+
83
+ **Expected behavior:**
84
+
85
+ - Skill detects no write tool is available.
86
+ - Walks the brainstorm normally.
87
+ - Instead of asking "May I create `.summer/GameSoul.md`?", prints the full brief to the user with explicit save instruction: "Save this as `.summer/GameSoul.md` in your project root. Every Summer skill reads it."
88
+ - Still ends with the routing question.
89
+
90
+ **Assertions:**
91
+
92
+ - [ ] Skill does NOT call a file-write tool that doesn't exist.
93
+ - [ ] Skill prints the brief inline as a self-contained block.
94
+ - [ ] Skill includes the explicit save instruction with the canonical path.
95
+ - [ ] Skill still asks the user the brainstorm questions and the routing question.
96
+
97
+ ---
98
+
99
+ This spec runs via `/skill-test brainstorm-game spec` (see `_meta/skill-test/SKILL.md`).
@@ -0,0 +1,94 @@
1
+ # Skill Spec: /debug
2
+
3
+ ## Fixture
4
+
5
+ - A Godot/Summer project with one or more reproducible bugs.
6
+ - Summer Engine running, MCP available.
7
+ - Host file tools available (Read, Edit, Write).
8
+
9
+ ## Case 1: Happy Path — runtime error with clear stack trace
10
+
11
+ **Fixture:** `scripts/player.gd` has `velocity.y -= GRAVTY * delta` (typo: GRAVTY instead of GRAVITY). Player crashes on `_physics_process` first frame.
12
+
13
+ **Input:** "Debug my game. The player crashes the moment I press play."
14
+
15
+ **Expected MCP tool sequence (in order):**
16
+
17
+ 1. (Skill asks the user one clarifying question and waits.)
18
+ 2. `summer_get_script_errors` — finds `Identifier "GRAVTY" not declared` at scripts/player.gd:14
19
+ 3. (Optional: `summer_get_console` to confirm no other errors hiding)
20
+ 4. `Read scripts/player.gd` — read 20–40 lines around line 14
21
+ 5. (Skill states hypothesis: typo, GRAVTY → GRAVITY)
22
+ 6. (Skill asks: "May I edit `scripts/player.gd` to rename GRAVTY → GRAVITY?")
23
+ 7. `Edit scripts/player.gd` — apply fix on user OK
24
+ 8. `summer_get_script_errors` — verify clean
25
+
26
+ **Assertions:**
27
+
28
+ - [ ] Skill asks for the user's description before any tool call.
29
+ - [ ] First diagnostic tool called is `summer_get_script_errors` (cheapest).
30
+ - [ ] Skill does NOT grep the whole codebase before reading the error.
31
+ - [ ] Skill reads only the file + lines indicated by the error, not the whole file.
32
+ - [ ] Skill states a single specific hypothesis before proposing a fix.
33
+ - [ ] Skill asks "May I edit …" before writing.
34
+ - [ ] After the fix, skill re-runs `summer_get_script_errors` to verify.
35
+ - [ ] Skill never calls `summer_set_resource_property` on an inline sub-resource (silent-fail trap).
36
+
37
+ ## Case 2: Failure Path — bug only reproduces at runtime
38
+
39
+ **Fixture:** Game compiles fine but crashes when player picks up a coin: `Invalid call. Nonexistent function 'play' in base 'Nil'.` AudioStreamPlayer node was deleted in editor but pickup script still references it.
40
+
41
+ **Input:** "When I pick up a coin, the game crashes."
42
+
43
+ **Expected behavior:**
44
+
45
+ - Skill calls `summer_get_script_errors` first → clean.
46
+ - Skill realizes it's runtime: `summer_clear_console`, `summer_play`.
47
+ - Skill asks user: "Reproduce the bug now — pick up a coin."
48
+ - After confirmation, calls `summer_get_debugger_errors`.
49
+ - Stack trace points to `coin.gd:32`, function `_on_body_entered`, calling `audio.play()` where `audio` is `null`.
50
+ - Skill calls `summer_inspect_node "./Coin/AudioStreamPlayer"` to confirm the node is missing.
51
+ - Skill proposes: re-add the AudioStreamPlayer (via `summer_add_node`) OR null-check in code.
52
+ - Asks the user which.
53
+
54
+ **Assertions:**
55
+
56
+ - [ ] Skill recognizes that script-errors-clean + crash-on-runtime = runtime-only bug.
57
+ - [ ] Skill explicitly invokes the play→reproduce→read-debugger loop, not just one shot.
58
+ - [ ] Skill verifies the missing-node hypothesis with `summer_inspect_node` BEFORE editing code.
59
+ - [ ] Skill offers BOTH options (fix scene OR fix code) instead of unilaterally picking.
60
+
61
+ ## Case 3: Edge Case — user gives a vague description
62
+
63
+ **Fixture:** Same as Case 1.
64
+
65
+ **Input:** "Something's broken."
66
+
67
+ **Expected behavior:**
68
+
69
+ - Skill asks one focused follow-up: "What's happening, and when?"
70
+ - Does NOT start grepping code or running tools blindly.
71
+
72
+ **Assertions:**
73
+
74
+ - [ ] No tool calls happen until the user gives a concrete symptom.
75
+ - [ ] Skill's follow-up is one short question, not a checklist.
76
+
77
+ ## Case 4: No Summer MCP — fallback path
78
+
79
+ **Fixture:** Same as Case 1, but Summer MCP is unavailable (engine not connected).
80
+
81
+ **Input:** "Debug my game."
82
+
83
+ **Expected behavior:**
84
+
85
+ - Skill detects MCP unavailable.
86
+ - Asks the user to copy-paste from Godot's Output and Debugger panels.
87
+ - Reasons over the pasted text the same way it would over MCP output.
88
+ - Continues with the rest of the workflow (read code, hypothesize, propose fix).
89
+
90
+ **Assertions:**
91
+
92
+ - [ ] Skill does not blindly call `summer_*` tools and fail.
93
+ - [ ] Skill explicitly asks for the panel output instead of guessing.
94
+ - [ ] The rest of the loop (hypothesis → "May I edit?" → verify) still runs.
@@ -0,0 +1,113 @@
1
+ # Skill Spec: /design-level
2
+
3
+ ## Fixture
4
+
5
+ - Godot 4.5 / Summer Engine project, main scene already has a `World/Player` (CharacterBody3D) with FPS controller wired.
6
+ - `.summer/GameSoul.md` exists; brief: "Action-combat game, three mechanics: dash, parry, double-jump. Vertical slice scope."
7
+ - `.summer/mechanics/parry.md` exists.
8
+ - No `levels/` folder yet.
9
+ - Summer MCP available.
10
+
11
+ ## Case 1: Happy Path — design level 1, a combat encounter
12
+
13
+ **Input:** "Design level 1, a 5-minute combat encounter that teaches parry."
14
+
15
+ **Expected MCP tool sequence (in order):**
16
+
17
+ 1. `Read .summer/GameSoul.md` — anchor to the brief
18
+ 2. (Optional: `Read .summer/mechanics/parry.md` — anchor to the mechanic being taught)
19
+ 3. (Skill walks: type → teaching goal → pacing curve (5 beats with intensity numbers) → encounters list → secrets list → reward gating → spaces list)
20
+ 4. (Skill shows the node-tree skeleton inline)
21
+ 5. (Skill asks: "May I create `levels/level_01.tscn` with this skeleton?")
22
+ 6. `summer_create_scene(path="res://levels/level_01.tscn", root_type="Node3D", root_name="World")`
23
+ 7. `summer_add_node(parent="./World", type="Node3D", name="Geometry")` and children
24
+ 8. `summer_add_node(parent="./World", type="Node3D", name="Spawns")` and children
25
+ 9. `summer_add_node(parent="./World", type="Node3D", name="Triggers")` and Area3D children
26
+ 10. `summer_add_node(parent="./World", type="Node3D", name="Pickups")`
27
+ 11. `summer_add_node(parent="./World", type="Node3D", name="Secrets")`
28
+ 12. `summer_add_node(parent="./World", type="Node3D", name="Lighting")` with WorldEnvironment + DirectionalLight3D
29
+ 13. `summer_save_scene`
30
+ 14. (Skill asks: "May I create `.summer/levels/level_01.md` with the design doc?")
31
+ 15. `Write .summer/levels/level_01.md`
32
+ 16. `summer_get_script_errors`
33
+
34
+ **Assertions:**
35
+
36
+ - [ ] Skill reads `.summer/GameSoul.md` to anchor.
37
+ - [ ] Skill reads the relevant `.summer/mechanics/<name>.md` if the level teaches an existing mechanic.
38
+ - [ ] Skill states a concrete teaching goal — not a vague "fun encounter".
39
+ - [ ] Skill draws a 5-beat pacing curve with intensity numbers (Intro / Build / Peak / Release / Hook).
40
+ - [ ] Skill lists 4 encounters with timing + space mapping.
41
+ - [ ] Skill lists 3 secrets with which beat each lives in.
42
+ - [ ] Skill lists reward gating, gates rewards behind tests.
43
+ - [ ] Skill enforces 4-6 distinct spaces (does not produce 12 micro-rooms).
44
+ - [ ] Skill asks "May I create ..." before `summer_create_scene`.
45
+ - [ ] Skeleton is markers + Area3Ds, NOT meshes / enemy scripts (those come later).
46
+ - [ ] Skill writes the design doc to `.summer/levels/<name>.md`.
47
+ - [ ] Skill never calls `summer_set_resource_property` on an inline sub_resource.
48
+ - [ ] Final step is `summer_save_scene` then `summer_get_script_errors`.
49
+
50
+ ## Case 2: Failure Path — user blends three level types
51
+
52
+ **Fixture:** Same as Case 1.
53
+
54
+ **Input:** "Design a stealth level with a puzzle in the middle and a boss at the end."
55
+
56
+ **Expected behavior:**
57
+
58
+ - Skill recognizes blended types: stealth + puzzle + boss.
59
+ - Skill pushes back: "That's three level types. Pick one as the primary; the other two become flavor or get split into sequential levels."
60
+ - Skill names the trade-off: "Stealth + boss in the same level kills both — stealth wants tension that releases at the encounter, boss wants tension that builds *to* the encounter. They're opposite shapes."
61
+ - Skill does NOT silently pick one or design all three at once.
62
+
63
+ **Assertions:**
64
+
65
+ - [ ] Skill identifies the blend explicitly.
66
+ - [ ] Skill explains the design tension between the blended types.
67
+ - [ ] Skill asks the user to pick one primary type before designing.
68
+ - [ ] No `summer_create_scene` call until user picks.
69
+
70
+ ## Case 3: Edge Case — no `.summer/GameSoul.md` exists
71
+
72
+ **Fixture:** Same as Case 1, but `.summer/GameSoul.md` does NOT exist.
73
+
74
+ **Input:** "Design level 1 of my game."
75
+
76
+ **Expected behavior:**
77
+
78
+ - Skill detects no brief exists.
79
+ - Skill suggests: "No `.summer/GameSoul.md` yet — without a brief, this level has no game to serve. Run `/summer:brainstorm-game` first, or give me the core loop + mechanics inline so I can anchor the design."
80
+ - Skill does NOT design a generic level in a vacuum.
81
+
82
+ **Assertions:**
83
+
84
+ - [ ] Skill checks for `.summer/GameSoul.md` early (before designing).
85
+ - [ ] Skill explicitly recommends `/summer:brainstorm-game` if absent.
86
+ - [ ] Skill offers the inline-anchor alternative as a fallback.
87
+ - [ ] No design happens without anchoring information.
88
+
89
+ ## Case 4: No Summer MCP — file-edit fallback
90
+
91
+ **Fixture:** Same as Case 1, but Summer MCP is unavailable.
92
+
93
+ **Input:** "Design level 1 — a 5-minute combat encounter."
94
+
95
+ **Expected behavior:**
96
+
97
+ - Skill detects no MCP.
98
+ - Walks the design beats normally.
99
+ - Instead of `summer_create_scene` + `summer_add_node`, prints the full `.tscn` file contents for the user to save manually at `levels/level_01.tscn`.
100
+ - Generated `.tscn` is syntactically valid Godot 4 scene format with the marker/Area3D skeleton (no meshes).
101
+ - Still writes the design doc to `.summer/levels/level_01.md` via host `Write`.
102
+ - Asks "May I write ..." before each file write.
103
+
104
+ **Assertions:**
105
+
106
+ - [ ] Skill identifies that MCP is unavailable; does not blindly call `summer_*`.
107
+ - [ ] Generated `.tscn` is parseable Godot 4 scene file.
108
+ - [ ] Skeleton in the `.tscn` matches the spaces / spawns / triggers structure from the design doc.
109
+ - [ ] Skill still writes `.summer/levels/<name>.md`.
110
+
111
+ ---
112
+
113
+ This spec runs via `/skill-test design-level spec` (see `_meta/skill-test/SKILL.md`).