summer-engine 2.3.0 → 2.5.0

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 (176) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +20 -5
  3. package/.codex-plugin/plugin.json +15 -5
  4. package/.cursor-plugin/plugin.json +15 -5
  5. package/.factory-plugin/plugin.json +2 -2
  6. package/.opencode/INSTALL.md +1 -1
  7. package/CHANGELOG.md +27 -6
  8. package/CLAUDE.md +2 -2
  9. package/GEMINI.md +2 -3
  10. package/README.md +51 -30
  11. package/_persona/summer/SKILL.md +5 -6
  12. package/commands/gameskill.md +103 -0
  13. package/dist/bin/summer.js +12 -4
  14. package/dist/commands/create.js +2 -0
  15. package/dist/commands/doctor.js +71 -1
  16. package/dist/commands/install.d.ts +17 -0
  17. package/dist/commands/install.js +63 -4
  18. package/dist/commands/memory.d.ts +14 -0
  19. package/dist/commands/memory.js +196 -0
  20. package/dist/commands/setup.js +8 -2
  21. package/dist/commands/skills.js +90 -6
  22. package/dist/commands/status.js +3 -0
  23. package/dist/lib/agent-config.d.ts +2 -2
  24. package/dist/lib/agent-config.js +134 -7
  25. package/dist/lib/api-client.d.ts +13 -0
  26. package/dist/lib/api-client.js +63 -26
  27. package/dist/lib/async-op-lifecycle.d.ts +60 -0
  28. package/dist/lib/async-op-lifecycle.js +83 -0
  29. package/dist/lib/project-memory.d.ts +33 -0
  30. package/dist/lib/project-memory.js +220 -0
  31. package/dist/lib/skills-registry.d.ts +134 -61
  32. package/dist/lib/skills-registry.js +102 -4
  33. package/dist/lib/version-check.d.ts +106 -0
  34. package/dist/lib/version-check.js +338 -0
  35. package/dist/mcp/server.d.ts +2 -0
  36. package/dist/mcp/server.js +81 -0
  37. package/dist/mcp/tools/debug-tools.js +32 -2
  38. package/dist/mcp/tools/project-tools.js +18 -6
  39. package/dist/mcp/tools/with-engine.d.ts +14 -0
  40. package/dist/mcp/tools/with-engine.js +52 -7
  41. package/gemini-extension.json +2 -2
  42. package/hooks/pre-commit-doctor.sh +0 -0
  43. package/hooks/run-hook.cmd +0 -0
  44. package/hooks/session-start.sh +0 -0
  45. package/package.json +6 -4
  46. package/skills/2d-assets/character-portrait/SKILL.md +1 -1
  47. package/skills/2d-assets/concept-art/SKILL.md +1 -1
  48. package/skills/2d-assets/create-asset-sheet/SKILL.md +163 -0
  49. package/skills/2d-assets/instantiate-asset-pack/SKILL.md +245 -0
  50. package/skills/2d-assets/pixel-art/SKILL.md +1 -1
  51. package/skills/2d-assets/skybox-panorama/SKILL.md +1 -1
  52. package/skills/2d-assets/sprite-sheet/SKILL.md +1 -1
  53. package/skills/2d-assets/tileable-texture/SKILL.md +1 -1
  54. package/skills/2d-assets/ui-graphics/SKILL.md +1 -1
  55. package/skills/2d-assets/use-widget-asset/SKILL.md +217 -0
  56. package/skills/3d-assets/character-model/SKILL.md +1 -1
  57. package/skills/3d-assets/organic-model/SKILL.md +1 -1
  58. package/skills/3d-assets/prop-model/SKILL.md +1 -1
  59. package/skills/3d-assets/vehicle-model/SKILL.md +1 -1
  60. package/skills/README.md +37 -30
  61. package/skills/ai-and-npcs/design-npc/SKILL.md +6 -6
  62. package/skills/animation/animation-tree/SKILL.md +2 -2
  63. package/skills/animation/facial-and-lipsync/SKILL.md +1 -1
  64. package/skills/animation/generate-motion/SKILL.md +1 -1
  65. package/skills/animation/procedural-animation/SKILL.md +2 -2
  66. package/skills/audio/adaptive-music/SKILL.md +1 -1
  67. package/skills/audio/audio-direction/SKILL.md +5 -5
  68. package/skills/audio/sound-effect/SKILL.md +2 -2
  69. package/skills/audio/voice-line/SKILL.md +25 -3
  70. package/skills/character-controllers/fps-controller/SKILL.md +5 -5
  71. package/skills/debugging/debug/SKILL.md +39 -1
  72. package/skills/deployment/export-and-ship/SKILL.md +4 -4
  73. package/skills/gameplay-mechanics/auto-fire-targeting/SKILL.md +170 -0
  74. package/skills/gameplay-mechanics/design-mechanic/SKILL.md +8 -8
  75. package/skills/level-design/design-level/SKILL.md +5 -5
  76. package/skills/level-design/scene-to-level/SKILL.md +125 -0
  77. package/skills/multiplayer-and-networking/host-authoritative-state/SKILL.md +4 -4
  78. package/skills/multiplayer-and-networking/peer-to-peer-multiplayer/SKILL.md +4 -4
  79. package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +7 -7
  80. package/skills/performance/tune-performance/SKILL.md +5 -5
  81. package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -1
  82. package/skills/rendering-and-lighting/art-direction/SKILL.md +5 -5
  83. package/skills/scene-and-project/brainstorm-game/SKILL.md +4 -4
  84. package/skills/scene-and-project/play/SKILL.md +1 -1
  85. package/skills/scene-and-project/scene-composition/SKILL.md +30 -1
  86. package/skills/scripting-patterns/gdscript-patterns/SKILL.md +53 -0
  87. package/skills/ui-and-ux/ui-basics/SKILL.md +1 -1
  88. package/skills/video/animated-loop/SKILL.md +1 -1
  89. package/skills/video/cinematic-cutscene/SKILL.md +1 -1
  90. package/skills/video/trailer-shot/SKILL.md +1 -1
  91. package/skills/visual-effects/game-feel/SKILL.md +6 -6
  92. package/skills/workflow/brainstorming/SKILL.md +164 -0
  93. package/skills/workflow/brainstorming/scripts/frame-template.html +214 -0
  94. package/skills/workflow/brainstorming/scripts/helper.js +88 -0
  95. package/skills/workflow/brainstorming/scripts/server.cjs +354 -0
  96. package/skills/workflow/brainstorming/scripts/start-server.sh +148 -0
  97. package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -0
  98. package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -0
  99. package/skills/workflow/brainstorming/visual-companion.md +287 -0
  100. package/skills/workflow/debugging-game-feel/SKILL.md +174 -0
  101. package/skills/workflow/diagnosing-perf-regressions/SKILL.md +190 -0
  102. package/skills/workflow/dispatching-parallel-agents/SKILL.md +182 -0
  103. package/skills/workflow/gameskill/SKILL.md +111 -0
  104. package/skills/workflow/investigating-bugs/CREATION-LOG.md +119 -0
  105. package/skills/workflow/investigating-bugs/SKILL.md +296 -0
  106. package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +158 -0
  107. package/skills/workflow/investigating-bugs/condition-based-waiting.md +115 -0
  108. package/skills/workflow/investigating-bugs/defense-in-depth.md +122 -0
  109. package/skills/workflow/investigating-bugs/find-polluter.sh +63 -0
  110. package/skills/workflow/investigating-bugs/root-cause-tracing.md +169 -0
  111. package/skills/workflow/investigating-bugs/test-academic.md +14 -0
  112. package/skills/workflow/investigating-bugs/test-pressure-1.md +58 -0
  113. package/skills/workflow/investigating-bugs/test-pressure-2.md +68 -0
  114. package/skills/workflow/investigating-bugs/test-pressure-3.md +69 -0
  115. package/skills/workflow/playtesting-a-feature/SKILL.md +173 -0
  116. package/skills/{_meta → workflow}/skill-create/SKILL.md +32 -22
  117. package/skills/{_meta → workflow}/skill-improve/SKILL.md +9 -10
  118. package/skills/{_meta → workflow}/skill-test/SKILL.md +12 -12
  119. package/skills/{_meta → workflow}/using-summer/SKILL.md +5 -2
  120. package/skills/workflow/verification-before-completion/SKILL.md +139 -0
  121. package/skills/workflow/writing-plans/SKILL.md +152 -0
  122. package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -0
  123. package/skills/workflow/writing-skills/SKILL.md +655 -0
  124. package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -0
  125. package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  126. package/skills/workflow/writing-skills/graphviz-conventions.dot +172 -0
  127. package/skills/workflow/writing-skills/persuasion-principles.md +187 -0
  128. package/skills/workflow/writing-skills/render-graphs.js +168 -0
  129. package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -0
  130. package/dist/commands/assets.d.ts +0 -2
  131. package/dist/commands/assets.js +0 -189
  132. package/dist/commands/debug.d.ts +0 -2
  133. package/dist/commands/debug.js +0 -127
  134. package/dist/commands/doctor.test.d.ts +0 -1
  135. package/dist/commands/doctor.test.js +0 -29
  136. package/dist/commands/project.d.ts +0 -2
  137. package/dist/commands/project.js +0 -170
  138. package/dist/commands/scene.d.ts +0 -2
  139. package/dist/commands/scene.js +0 -290
  140. package/dist/lib/agent-config.test.d.ts +0 -1
  141. package/dist/lib/agent-config.test.js +0 -80
  142. package/dist/lib/format.test.d.ts +0 -1
  143. package/dist/lib/format.test.js +0 -36
  144. package/dist/lib/plugin-manifests.test.d.ts +0 -1
  145. package/dist/lib/plugin-manifests.test.js +0 -134
  146. package/dist/lib/with-engine.d.ts +0 -14
  147. package/dist/lib/with-engine.js +0 -109
  148. package/skills/_shared/collaborative-protocol.md +0 -50
  149. package/skills/_shared/gd-style.md +0 -121
  150. package/skills/_shared/godot-version.md +0 -32
  151. package/skills/_shared/mcp-tools-reference.md +0 -133
  152. package/skills/_shared/summer-folder.md +0 -44
  153. package/skills/_shared/template-registry.md +0 -40
  154. package/skills/_tests/runner.md +0 -90
  155. package/skills/_tests/specs/3d-lighting.md +0 -19
  156. package/skills/_tests/specs/art-direction.md +0 -115
  157. package/skills/_tests/specs/asset-strategy.md +0 -19
  158. package/skills/_tests/specs/audio-direction.md +0 -123
  159. package/skills/_tests/specs/brainstorm-game.md +0 -99
  160. package/skills/_tests/specs/debug.md +0 -94
  161. package/skills/_tests/specs/design-level.md +0 -113
  162. package/skills/_tests/specs/design-mechanic.md +0 -112
  163. package/skills/_tests/specs/design-npc.md +0 -143
  164. package/skills/_tests/specs/export-and-ship.md +0 -114
  165. package/skills/_tests/specs/fps-controller.md +0 -113
  166. package/skills/_tests/specs/gdscript-patterns.md +0 -19
  167. package/skills/_tests/specs/host-authoritative-state.md +0 -104
  168. package/skills/_tests/specs/make-game.md +0 -19
  169. package/skills/_tests/specs/peer-to-peer-multiplayer.md +0 -99
  170. package/skills/_tests/specs/play.md +0 -88
  171. package/skills/_tests/specs/scene-composition.md +0 -19
  172. package/skills/_tests/specs/setup-multiplayer.md +0 -106
  173. package/skills/_tests/specs/tune-performance.md +0 -104
  174. package/skills/_tests/specs/ui-basics.md +0 -19
  175. package/skills/_tests/specs/vfx.md +0 -116
  176. package/skills/catalog.yaml +0 -991
@@ -190,7 +190,7 @@ summer_set_prop(path="./World/Enemies/Enemy/Sight", key="enabled", value="true")
190
190
  summer_set_prop(path="./World/Enemies/Enemy/Sight", key="target_position", value="Vector3(0, 0, -12)")
191
191
  ```
192
192
 
193
- Save the Vision sphere as standalone `.tres` (do NOT inline sub_resource — see `_shared/mcp-tools-reference.md` § "Trap"):
193
+ Save the Vision sphere as standalone `.tres` (do NOT inline sub_resource — see `references/mcp-tools-reference.md` § "Trap"):
194
194
 
195
195
  ```
196
196
  summer_set_prop(path="./World/Enemies/Enemy/Vision/VisionShape", key="shape", value="res://shapes/vision_sphere.tres")
@@ -460,7 +460,7 @@ If the enemy doesn't aggro, common causes:
460
460
 
461
461
  ## Collaborative protocol
462
462
 
463
- This skill writes scenes and scripts. Always ask before each step. Group related writes into one ask. See `_shared/collaborative-protocol.md`.
463
+ This skill writes scenes and scripts. Always ask before each step. Group related writes into one ask. See `references/collaborative-protocol.md`.
464
464
 
465
465
  ## Want a working starter?
466
466
 
@@ -471,10 +471,10 @@ For a fully-rigged enemy with anim controller + loot drop:
471
471
 
472
472
  ## See also
473
473
 
474
- - `_shared/mcp-tools-reference.md` — full MCP tool list
475
- - `_shared/godot-version.md` — Godot 4.5 API notes
476
- - `_shared/collaborative-protocol.md` — "May I write" pattern
477
- - `_shared/gd-style.md` — typed GDScript conventions
474
+ - `references/mcp-tools-reference.md` — full MCP tool list
475
+ - `references/godot-version.md` — Godot 4.5 API notes
476
+ - `references/collaborative-protocol.md` — "May I write" pattern
477
+ - `references/gd-style.md` — typed GDScript conventions
478
478
  - `ai-and-npcs/state-machine-npc/SKILL.md` — FSM pattern deep dive
479
479
  - `ai-and-npcs/behavior-trees/SKILL.md` — when complexity demands a BT
480
480
  - `ai-and-npcs/perception-sight-and-hearing/SKILL.md` — sensor patterns
@@ -256,5 +256,5 @@ Open the scene in Godot 4.5 editor, add `AnimationTree` node, set `Anim Player`
256
256
 
257
257
  - `summer:animation/generate-motion` — produce the clips this tree references.
258
258
  - `summer:animation/retarget` — share one tree across many characters.
259
- - `_shared/gd-style.md` — typed GDScript conventions in the controller snippets.
260
- - `_shared/mcp-tools-reference.md` — `summer_connect_signal` and `summer_set_resource_property` rules.
259
+ - `references/gd-style.md` — typed GDScript conventions in the controller snippets.
260
+ - `references/mcp-tools-reference.md` — `summer_connect_signal` and `summer_set_resource_property` rules.
@@ -278,5 +278,5 @@ For projects that can't use any cloud or third-party tool, Godot 4.5's `AudioStr
278
278
  - `summer:audio/generate-voice` — TTS upstream of this skill.
279
279
  - `summer:animation/animation-tree` — wire the lipsync OneShot into the character's tree.
280
280
  - `summer:animation/procedural-animation` — eye blinks, saccades, head idle.
281
- - `_shared/mcp-tools-reference.md` — `summer_generate_audio` schema (TTS).
281
+ - `references/mcp-tools-reference.md` — `summer_generate_audio` schema (TTS).
282
282
  - Rhubarb Lip Sync — https://github.com/DanielSWolf/rhubarb-lip-sync (external tool; phoneme extraction).
@@ -123,7 +123,7 @@ The user can upload to Meshy directly at meshy.ai, generate via the dashboard, d
123
123
 
124
124
  ## See also
125
125
 
126
- - `_shared/mcp-tools-reference.md` — `summer_generate_motion` parameter schema, error codes.
126
+ - `references/mcp-tools-reference.md` — `summer_generate_motion` parameter schema, error codes.
127
127
  - `summer:asset-pipeline/asset-strategy` — how to get a Meshy-rigged character in the first place.
128
128
  - `summer:animation/animation-tree` — wire the generated clips into a state machine.
129
129
  - `summer:animation/retarget` — re-use one library across many characters without regenerating.
@@ -229,6 +229,6 @@ Add modifiers in the Godot editor under Skeleton3D, set bone names from the insp
229
229
 
230
230
  ## See also
231
231
 
232
- - `_shared/gd-style.md` — typed GDScript conventions in the snippets.
233
- - `_shared/mcp-tools-reference.md` — `summer_set_prop` enum-int conventions for axis settings.
232
+ - `references/gd-style.md` — typed GDScript conventions in the snippets.
233
+ - `references/mcp-tools-reference.md` — `summer_set_prop` enum-int conventions for axis settings.
234
234
  - Godot 4.5 docs: `SkeletonModifier3D`, `LookAtModifier3D`, `SkeletonIK3D`, `PhysicalBoneSimulator3D`.
@@ -323,4 +323,4 @@ Print the bus layout, the node tree, and the GDScript. User constructs in the Go
323
323
  - `audio/audio-direction` — defines the dynamic music plan and bus layout
324
324
  - `audio/music-track` — generates the stems
325
325
  - `audio/voice-line` — the voice bus that triggers ducking
326
- - `_shared/godot-version.md` — Godot 4.5 AudioServer and Tween API
326
+ - `references/godot-version.md` — Godot 4.5 AudioServer and Tween API
@@ -235,11 +235,11 @@ End with:
235
235
  | Pure sine "ding" for pickup | Reads as cheap mobile game. Use a major-third interval with character. |
236
236
  | Same footstep sample for all surfaces | Material-aware footsteps are 80% of the perceived audio quality. |
237
237
  | No master ceiling / true peak | Audio clips on console builds without `-1 dBTP` ceiling. Always set it. |
238
- | Calling SetResourceProperty on inline sub_resources | Silent fail. See `_shared/mcp-tools-reference.md` § Trap. |
238
+ | Calling SetResourceProperty on inline sub_resources | Silent fail. See `references/mcp-tools-reference.md` § Trap. |
239
239
 
240
240
  ## Collaborative protocol
241
241
 
242
- This skill writes one bible (`.summer/audio-bible.md`), creates a bus layout (`audio/default_bus_layout.tres`), modifies `project.godot`, and may generate audio (metered). Always ask before writing or generating. See `_shared/collaborative-protocol.md`.
242
+ This skill writes one bible (`.summer/audio-bible.md`), creates a bus layout (`audio/default_bus_layout.tres`), modifies `project.godot`, and may generate audio (metered). Always ask before writing or generating. See `references/collaborative-protocol.md`.
243
243
 
244
244
  ## Want a working starter?
245
245
 
@@ -247,9 +247,9 @@ No template — this is a workflow that produces the bible the rest of the proje
247
247
 
248
248
  ## See also
249
249
 
250
- - `_shared/collaborative-protocol.md`
251
- - `_shared/godot-version.md` — Godot 4.5 audio API notes
252
- - `_shared/mcp-tools-reference.md`
250
+ - `references/collaborative-protocol.md`
251
+ - `references/godot-version.md` — Godot 4.5 audio API notes
252
+ - `references/mcp-tools-reference.md`
253
253
  - `scene-and-project/brainstorm-game/SKILL.md` — produces the brief that anchors the bible
254
254
  - `rendering-and-lighting/art-direction/SKILL.md` — the visual counterpart; audio must rhyme with it
255
255
  - `audio/audio-bus-setup/SKILL.md` (NEXT) — implements the bus layout in detail
@@ -233,5 +233,5 @@ After the SFX is wired:
233
233
  - `audio/ambient-bed` — long looping textures
234
234
  - `audio/music-track` — music
235
235
  - `audio/voice-line` — TTS
236
- - `_shared/mcp-tools-reference.md`
237
- - `_shared/godot-version.md` — Godot 4.5 audio nodes
236
+ - `references/mcp-tools-reference.md`
237
+ - `references/godot-version.md` — Godot 4.5 audio nodes
@@ -6,7 +6,7 @@ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: audio
7
7
  user-invocable: true
8
8
  allowed-tools: Read Grep Glob Write Edit summer_generate_voice summer_generate_audio summer_list_models summer_search_assets summer_import_from_url summer_add_node summer_set_prop summer_inspect_node
9
- paths: ["audio/voice/**", "scripts/**", "**/*.tscn"]
9
+ paths: [".summer/**", "audio/voice/**", "scripts/**", "**/*.tscn"]
10
10
  ---
11
11
 
12
12
  # /voice-line — Generate TTS Voice for NPCs, Narrator, Dialogue
@@ -33,8 +33,11 @@ Then it generates one line (or a multi-turn dialogue) with the right stability /
33
33
 
34
34
  ```
35
35
  Read .summer/audio-bible.md
36
+ Read .summer/memory/casting/voices.md # preferred cast memory, if present
37
+ Read .summer/voice-cast.md # legacy cast memory, if present
36
38
  Read .summer/characters.md # if present
37
39
  Glob .summer/characters/*.md
40
+ Glob .summer/memory/characters/*.md
38
41
  ```
39
42
 
40
43
  If a character bible exists, the voice should match the character's age / gender / regional origin / energy. If it doesn't, ask:
@@ -83,9 +86,23 @@ After the pick:
83
86
 
84
87
  > Locked voice: `Hodge` (id `21m00Tcm4TlvDq8ikWAM`). I'll use this for all `<character>` lines unless you say otherwise.
85
88
 
86
- Save it in `.summer/voice-cast.md`:
89
+ Ask before writing:
90
+
91
+ > May I update `.summer/memory/casting/voices.md` with this locked voice assignment?
92
+
93
+ Save it in `.summer/memory/casting/voices.md`:
87
94
 
88
95
  ```markdown
96
+ ---
97
+ id: casting.voice.main-cast
98
+ type: casting
99
+ status: active
100
+ priority: locked
101
+ stable: true
102
+ providers:
103
+ - elevenlabs
104
+ ---
105
+
89
106
  # Voice Cast
90
107
 
91
108
  | Character | Voice name | Voice id | Notes |
@@ -96,6 +113,8 @@ Save it in `.summer/voice-cast.md`:
96
113
 
97
114
  This is the cast bible. Every future voice line uses these ids — consistency is the point.
98
115
 
116
+ If legacy `.summer/voice-cast.md` already exists, read it first and either keep using it for this project or ask to migrate it into `.summer/memory/casting/voices.md`. Do not maintain two conflicting cast files.
117
+
99
118
  ### 5. Tune stability / similarity / style / speed for delivery
100
119
 
101
120
  ElevenLabs voice options:
@@ -199,7 +218,9 @@ The bible's mix rule says voice ducks music: when this player starts, fade the m
199
218
 
200
219
  ### 10. Save to the cast bible
201
220
 
202
- After generation, append to `.summer/voice-cast.md` so future skills find existing lines and don't regenerate. Include line text + filename + voice id.
221
+ After generation, append to `.summer/memory/casting/voices.md` so future skills find existing lines and don't regenerate. Include line text + filename + voice id.
222
+
223
+ If the assignment is marked `priority: locked`, do not replace the voice id automatically. If a scene, script, import config, or user prompt conflicts with the locked memory, stop and ask whether to update memory or fix the implementation.
203
224
 
204
225
  ## Reference card — voice-pick by archetype
205
226
 
@@ -220,6 +241,7 @@ Narrator intimate: warmer mid pitch, lower stability for breath
220
241
 
221
242
  - **Picking a voice without auditioning samples.** The user must hear it.
222
243
  - **Reusing a voice id across two characters.** Players notice instantly. Lock the cast.
244
+ - **Changing a locked voice without approval.** A cast voice is project memory, not a throwaway generation option.
223
245
  - **Stage directions in the text.** `(angrily) Get out!` is read literally as "angrily get out". Use stability/style.
224
246
  - **One long blob for a multi-turn scene.** Use `text_to_dialogue` so pacing is dialogue-aware.
225
247
  - **Voice on `Master` bus.** Must be on `Voice` bus so it can duck music per the bible.
@@ -48,7 +48,7 @@ summer_set_resource_property(nodePath="./World/Player/Collision", resourceProper
48
48
  summer_set_resource_property(nodePath="./World/Player/Collision", resourceProperty="shape", subProperty="height", value="1.8")
49
49
  ```
50
50
 
51
- `summer_set_prop` with a class-name string creates a standalone sub-resource. NEVER call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. See `_shared/mcp-tools-reference.md`.
51
+ `summer_set_prop` with a class-name string creates a standalone sub-resource. NEVER call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. See `references/mcp-tools-reference.md`.
52
52
 
53
53
  ### 4. Add the Head pivot + Camera
54
54
 
@@ -328,14 +328,14 @@ Then patch `project.godot` with the InputMap actions (`input/move_forward = { ..
328
328
 
329
329
  ## Collaborative Protocol
330
330
 
331
- This skill writes scene nodes, an InputMap, and a `.gd` script. Always ask before applying. Group writes per phase: "May I add the Player + Collision + Head + Camera, bind WASD/jump/sprint, and attach `player_controller.gd`?" See `../../_shared/collaborative-protocol.md`.
331
+ This skill writes scene nodes, an InputMap, and a `.gd` script. Always ask before applying. Group writes per phase: "May I add the Player + Collision + Head + Camera, bind WASD/jump/sprint, and attach `player_controller.gd`?" See `../../references/collaborative-protocol.md`.
332
332
 
333
333
  If the user asks for a "third-person FPS", flag the contradiction: FPS = first-person. Either clarify, or hand off to the `tps-controller` skill when it ships.
334
334
 
335
335
  ## See Also
336
336
 
337
- - `_shared/gd-style.md` — typed GDScript conventions used in the skeleton.
338
- - `_shared/mcp-tools-reference.md` — `summer_set_resource_property` rules + the inline-sub-resource silent-fail trap.
339
- - `_shared/collaborative-protocol.md` — when to ask before writing.
337
+ - `references/gd-style.md` — typed GDScript conventions used in the skeleton.
338
+ - `references/mcp-tools-reference.md` — `summer_set_resource_property` rules + the inline-sub-resource silent-fail trap.
339
+ - `references/collaborative-protocol.md` — when to ask before writing.
340
340
  - `scripting-patterns/state-machine-patterns/SKILL.md` — once movement grows past this skeleton (slide, grapple, hover), refactor into a state machine instead of stuffing more branches into `_physics_process`.
341
341
  - `physics/character-body-tuning/SKILL.md` (when shipped) — slope handling, step-up, floor-snap.
@@ -111,7 +111,7 @@ Surface the proposed fix in plain language and ask permission. Two patterns:
111
111
 
112
112
  - For GDScript edits: `Read` the 20–40 lines around the error, `Edit` the exact change. Don't read the whole file. Don't reformat. Don't rename other things.
113
113
  - For scene edits: use the appropriate `summer_*` tool (`summer_add_node`, `summer_set_prop`, `summer_replace_node`). Group multi-step changes in `summer_batch` for one undo step.
114
- - **Trap to avoid:** never call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. If the property is on a nested resource, first call `summer_set_prop` with the resource class name to instantiate a standalone resource, then drill in. See `_shared/mcp-tools-reference.md`.
114
+ - **Trap to avoid:** never call `summer_set_resource_property` against an inline `sub_resource` — the value is silently dropped. If the property is on a nested resource, first call `summer_set_prop` with the resource class name to instantiate a standalone resource, then drill in. See `references/mcp-tools-reference.md`.
115
115
 
116
116
  ### 6. Verify — re-run the diagnostic that found it
117
117
 
@@ -155,3 +155,41 @@ A debug session is done when:
155
155
  3. No new errors or warnings have been introduced.
156
156
 
157
157
  Tell the user one short sentence: "Fixed `<file>:<line>` — `<change>`. Diagnostic clean." Then stop.
158
+
159
+ ## What the MCP debug tools CAN and CAN'T see (read this before claiming "clean")
160
+
161
+ The `summer_*` tools are powerful for static + boot-time issues but **can't substitute for play-testing**. Knowing the gaps prevents false-clean reports.
162
+
163
+ ### What the MCP CAN see
164
+
165
+ - **Script parse errors** (`summer_get_script_errors`) — full text + file:line. Reliable.
166
+ - **Editor console output** (`summer_get_console`) — `print` statements, editor-side warnings, std startup messages. Full text.
167
+ - **Runtime debugger error count + full text** (`summer_get_debugger_errors`) — returns `errors_data` with `error`, `error_descr`, `callstack`, `file`, `function`, `line`. Reliable for errors.
168
+ - **Diagnostics summary** (`summer_get_diagnostics`) — counts of console errors, debugger errors, debugger warnings, script errors. Tells you where to drill.
169
+ - **Scene tree + node properties** (`summer_get_scene_tree`, `summer_inspect_node`) — only the **edited** scene, not the running game's live tree.
170
+ - **Whether the game is running** (`summer_is_running`) — and on which scene.
171
+
172
+ ### What the MCP CAN'T see (right now)
173
+
174
+ - **Debugger warning text.** `summer_get_debugger_errors` returns a `warnings: <count>` integer but no `warnings_data` array. You see "the game has 66 warnings" but you can't read them through MCP. **Tell the user: "I see N warnings exist but the MCP doesn't expose their text — paste the Debugger panel if any feel relevant."**
175
+ - **Live runtime scene tree.** `summer_get_scene_tree` returns the editor's edited scene, not what's currently instantiated in the running game. When debugging runtime state, you can't introspect the live nodes.
176
+ - **Keyboard / mouse / controller input simulation.** No tool sends key presses or mouse motion. So bugs that only fire from gameplay (player movement, weapon firing, level transitions, button clicks) require the user to play.
177
+ - **Screenshot / visual diff.** No tool captures the rendered viewport. Visual regressions ("the floor looks wrong", "the camera clips through terrain") require user eyes.
178
+ - **Frame-by-frame physics state.** No tool steps the simulation or watches for transient errors over time.
179
+
180
+ ### The "static-only is not testing" rule
181
+
182
+ A clean `summer_get_diagnostics` after `summer_play` only proves: **the game booted without parse errors or @implicit_ready null-derefs.** It does NOT prove gameplay works. Auto-fire weapons, level transitions, spell casting, boss attacks, UI interactions all happen *after* boot and won't surface in the diagnostics until they fire.
183
+
184
+ When you've made code changes and want to declare them "verified":
185
+
186
+ 1. **Required**: `summer_get_script_errors` clean on every modified file.
187
+ 2. **Required**: `summer_play` boot returns 0 errors (use the scene most likely to exercise the change).
188
+ 3. **Recommended**: ask the user to play through the specific scenario the change touches, then re-run `summer_get_diagnostics`.
189
+ 4. **Never claim "verified" from static analysis alone.** Say "compiles and boots clean — needs play-test to confirm <specific behavior>."
190
+
191
+ ### The cost of skipping it
192
+
193
+ A typical cautionary scenario: many parallel agents write thousands of lines of game code in one batch with verification static-only. The build is "diagnostic-clean" yet the running game has telegraph meshes that render the wrong axis, parse-valid scripts that crash on first autoload because of a guard pattern that doesn't compile, projectile tracers sized so they read as straight lines instead of projectiles, transform-leaked colliders from a copied scene, and `@onready` paths that throw on every boot when the script is loaded into a sibling scene that lacks one of the referenced children. None of these surface in `summer_get_diagnostics` until the user actually plays.
194
+
195
+ Static analysis is necessary but never sufficient.
@@ -280,7 +280,7 @@ Use this as a one-shot grep before any export:
280
280
 
281
281
  ## Collaborative protocol
282
282
 
283
- This skill produces release artifacts. Always ask before each build is invoked. Group platforms — "I'm about to build Windows + Mac + Linux release configs into `build/`. OK?". See `_shared/collaborative-protocol.md`.
283
+ This skill produces release artifacts. Always ask before each build is invoked. Group platforms — "I'm about to build Windows + Mac + Linux release configs into `build/`. OK?". See `references/collaborative-protocol.md`.
284
284
 
285
285
  ## Want a working starter?
286
286
 
@@ -288,9 +288,9 @@ No template — this is a workflow. Each project's export config and store asset
288
288
 
289
289
  ## See also
290
290
 
291
- - `_shared/mcp-tools-reference.md` — full MCP tool list
292
- - `_shared/godot-version.md` — Godot 4.5 export-template versioning
293
- - `_shared/collaborative-protocol.md` — "May I write" pattern
291
+ - `references/mcp-tools-reference.md` — full MCP tool list
292
+ - `references/godot-version.md` — Godot 4.5 export-template versioning
293
+ - `references/collaborative-protocol.md` — "May I write" pattern
294
294
  - `deployment/export-presets/SKILL.md` — preset config deep dive
295
295
  - `deployment/web-html5-export/SKILL.md` — HTML5-specific traps
296
296
  - `deployment/steam-uploader/SKILL.md` — `steamcmd` + GodotSteam (when shipped)
@@ -0,0 +1,170 @@
1
+ ---
2
+ name: auto-fire-targeting
3
+ description: Use when designing or fixing the targeting system for an auto-fire weapon (survivors-genre, top-down ARPG, tower-defense). Covers the pending-damage pattern that prevents over-commit when bullet flight time is longer than fire rate. Trigger on "auto-fire", "auto-aim", "weapon targeting", "targeting", "wasted bullets", "overkill", "damage prediction", "survivors weapon".
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: gameplay-mechanics
7
+ allowed-tools: Read Edit Grep
8
+ paths: ["**/*.gd"]
9
+ ---
10
+
11
+ # Auto-Fire Weapon Targeting — pending-damage pattern
12
+
13
+ A survivors-genre auto-fire weapon picks a target each fire frame. Naive nearest-enemy targeting wastes bullets when fire rate exceeds bullet flight time. This skill encodes the pending-damage pattern that fixes it.
14
+
15
+ ## The problem
16
+
17
+ Auto-fire weapon. Bullet speed 22 m/s. Target 10m away. Bullet takes ~0.45s to arrive. With high attack speed the player fires several bullets per second. By the time the first bullet arrives and kills the target, several more bullets are already in flight toward where the target was. They miss into empty space. The player sees bullets "fan out in a cone past the dead enemy" while other enemies stand around untouched.
18
+
19
+ This is not a re-targeting bug. The weapon's `_fire()` correctly re-runs `find_nearest_enemy()` each shot. The issue is that the target is alive at fire-time and dead at arrival-time. All shots fired in that window aim at it because none of them know about the kill in flight.
20
+
21
+ ## The fix — pending damage commitment
22
+
23
+ Each enemy carries a counter of damage that is in flight toward it. Targeting de-prefers (but does not exclude) enemies whose pending damage already exceeds their current HP.
24
+
25
+ ### 1. Add the counter to the enemy base class
26
+
27
+ ```gdscript
28
+ # enemy_base_3d.gd
29
+
30
+ var pending_damage: float = 0.0
31
+
32
+
33
+ func commit_pending(amount: float) -> void:
34
+ pending_damage += amount
35
+
36
+
37
+ func release_pending(amount: float) -> void:
38
+ pending_damage = maxf(0.0, pending_damage - amount)
39
+
40
+
41
+ ## True if enough damage is already in flight to kill this enemy.
42
+ func is_saturated() -> bool:
43
+ return pending_damage >= health
44
+ ```
45
+
46
+ ### 2. Update the targeting helper
47
+
48
+ The selector keeps the saturated set as a fallback. If every enemy is saturated, the player must still be able to fire on someone — fall through to a normal nearest pick across saturated enemies. Otherwise prefer non-saturated.
49
+
50
+ ```gdscript
51
+ # targeting.gd
52
+
53
+ static func pick(origin: Vector3, mode: int, max_range: float, ...) -> Node3D:
54
+ var enemies: Array = GameManager.get_enemies()
55
+ var best: Node3D = null
56
+ var best_score: float = -INF
57
+ var fallback: Node3D = null
58
+ var fallback_score: float = -INF
59
+ for enemy in enemies:
60
+ # ... existing range + LoS filters ...
61
+ var score := _score(enemy, d_sq, mode)
62
+ var saturated: bool = "is_saturated" in enemy and enemy.is_saturated()
63
+ if saturated:
64
+ if score > fallback_score:
65
+ fallback_score = score
66
+ fallback = enemy
67
+ else:
68
+ if score > best_score:
69
+ best_score = score
70
+ best = enemy
71
+ if best != null:
72
+ return best
73
+ return fallback # everyone is saturated; fire on the next-best anyway
74
+ ```
75
+
76
+ ### 3. Commit at fire time
77
+
78
+ ```gdscript
79
+ # projectile_weapon.gd
80
+
81
+ func _spawn_projectile(dir: Vector3, target: Node3D) -> void:
82
+ var dmg: float = base_damage * GameManager.player_damage_mult
83
+ # Commit expected damage. No crit factor — we don't gamble on RNG. If crit
84
+ # over-kills the target, the next-frame release refunds the difference.
85
+ var commit_amount: float = dmg
86
+ if target != null and target.has_method("commit_pending"):
87
+ target.commit_pending(commit_amount)
88
+ var proj: Node3D = _projectile_scene.instantiate()
89
+ # ... add_child, position, etc ...
90
+ proj.setup(dir * PROJECTILE_SPEED, dmg, ..., target, commit_amount)
91
+ ```
92
+
93
+ ### 4. Release at bullet death (catch-all)
94
+
95
+ The bullet must release the commitment exactly once when it leaves the tree, regardless of how. Hit, pierce-out, range-expire, or any other free path. Use `tree_exiting` so the release is guaranteed without each free-site having to remember.
96
+
97
+ ```gdscript
98
+ # bullet.gd
99
+
100
+ var _committed_target: Node = null
101
+ var _committed_amount: float = 0.0
102
+ var _committed_released: bool = false
103
+
104
+
105
+ func setup(..., commit_target: Node = null, commit_amount: float = 0.0) -> void:
106
+ # ... other setup ...
107
+ _committed_target = commit_target
108
+ _committed_amount = commit_amount
109
+
110
+
111
+ func _ready() -> void:
112
+ # ... other wiring ...
113
+ tree_exiting.connect(_release_committed)
114
+
115
+
116
+ ## Idempotent so multiple call paths can't double-release.
117
+ func _release_committed() -> void:
118
+ if _committed_released:
119
+ return
120
+ _committed_released = true
121
+ if _committed_amount <= 0.0:
122
+ return
123
+ if _committed_target != null and is_instance_valid(_committed_target) \
124
+ and _committed_target.has_method("release_pending"):
125
+ _committed_target.release_pending(_committed_amount)
126
+ ```
127
+
128
+ ## Bonus — spread fan across multiple enemies
129
+
130
+ When the weapon fires N projectiles per shot (extra-projectiles upgrade, multishot), pick a fresh target per projectile instead of fanning all N at the primary target. Combined with the saturation filter this drains follow-on shots toward fresh enemies.
131
+
132
+ ```gdscript
133
+ # projectile_weapon.gd, multishot path
134
+
135
+ for i in total_projectiles:
136
+ var per_shot_target := Targeting.pick(global_position, mode, range)
137
+ if per_shot_target == null:
138
+ per_shot_target = primary_target # fall back if nothing else in range
139
+ _spawn_projectile(dir.rotated(Vector3.UP, fan_angle), per_shot_target)
140
+ ```
141
+
142
+ ## Bonus — bump projectile speed
143
+
144
+ The over-commit window is `attack_speed * bullet_travel_time`. Faster bullets shrink it for free. 22 m/s up to 35 m/s halves the window without affecting balance much. Cheap fix to bundle with the pattern.
145
+
146
+ ## What this does NOT solve
147
+
148
+ - **Pierce > 1 weapons.** The committed amount is reserved on the first target only. Subsequent pierces are bonus damage to whoever happens to be in line. That is fine — pierce already feels random by design.
149
+ - **AOE / nova / orbital weapons.** They hit everyone in radius regardless of "target," so single-target pending-damage doesn't apply. Skip them.
150
+ - **Slow-but-massive weapons.** A single shot that one-shots multiple enemies in sequence (rocket launcher, railgun) doesn't benefit much. The window where the over-commit happens is too short to matter.
151
+
152
+ ## Why this beats alternatives
153
+
154
+ | Alternative | Why we didn't pick it |
155
+ |---|---|
156
+ | In-flight bullet retargeting (each bullet seeks the nearest live enemy mid-flight) | Per-bullet logic is expensive and the homing visual reads as a different weapon archetype. Pending-damage is fire-and-forget. |
157
+ | Predict the kill (fire only enough bullets to kill) | Requires knowing exact damage including crit and item modifiers. Edge cases multiply. |
158
+ | Just bump bullet speed | Helps but doesn't eliminate the issue at very high attack-speed builds. |
159
+ | Shoot-through-enemies (everyone gets free pierce) | Changes weapon identity. AOE bleed. |
160
+
161
+ Pending-damage is local to the targeting query, requires no per-bullet ticking, and keeps each weapon archetype's identity intact.
162
+
163
+ ## Verification
164
+
165
+ Test scenario: spawn a single weak enemy directly in front of the player at point-blank range. Equip the auto-fire weapon and the highest-attack-speed item. Watch the bullet fan when the enemy dies.
166
+
167
+ Before: 5-15 bullets continue past the corpse over the next ~0.5s.
168
+ After: 1-2 bullets continue (the ones that were already past the half-flight point), the rest of the fire pool redirects to whatever target Targeting picks next, or stops if there's none in range.
169
+
170
+ Use `summer_get_diagnostics` to confirm no new errors. Use `summer_inspect_node` on a sample enemy mid-fight to confirm `pending_damage` is being incremented and decremented as expected.
@@ -148,7 +148,7 @@ lifetime = 0.4
148
148
 
149
149
  ### 7. Write the GDScript stub
150
150
 
151
- Stub only — implementation is the next session. Use `_shared/gd-style.md` conventions. For double-jump:
151
+ Stub only — implementation is the next session. Use `references/gd-style.md` conventions. For double-jump:
152
152
 
153
153
  ```gdscript
154
154
  class_name PlayerController
@@ -236,12 +236,12 @@ Ask:
236
236
  | Hand-wave depth | "Players will use it strategically" is not depth. Name the choice the player makes. |
237
237
  | Tunables hard-coded as `const` | Use `@export` so designers tune in the inspector. |
238
238
  | Adding the mechanic without the FX/audio nodes | Without nodes for feedback, the mechanic ships feeling cheap. Scaffold the nodes alongside the script. |
239
- | Setting `position` for movement instead of `velocity` | Physics objects use `velocity` in `_physics_process`. See `_shared/gd-style.md`. |
240
- | Calling SetResourceProperty on inline sub_resources | Silent fail. See `_shared/mcp-tools-reference.md` § Trap. |
239
+ | Setting `position` for movement instead of `velocity` | Physics objects use `velocity` in `_physics_process`. See `references/gd-style.md`. |
240
+ | Calling SetResourceProperty on inline sub_resources | Silent fail. See `references/mcp-tools-reference.md` § Trap. |
241
241
 
242
242
  ## Collaborative protocol
243
243
 
244
- This skill writes scene nodes and one or more files (`.gd`, `.summer/mechanics/<name>.md`). Group writes into one ask per phase. See `_shared/collaborative-protocol.md`.
244
+ This skill writes scene nodes and one or more files (`.gd`, `.summer/mechanics/<name>.md`). Group writes into one ask per phase. See `references/collaborative-protocol.md`.
245
245
 
246
246
  ## Want a working starter?
247
247
 
@@ -254,10 +254,10 @@ This skill is a workflow that designs and scaffolds — the templates are runnab
254
254
 
255
255
  ## See also
256
256
 
257
- - `_shared/collaborative-protocol.md`
258
- - `_shared/mcp-tools-reference.md`
259
- - `_shared/gd-style.md` — GDScript conventions
260
- - `_shared/godot-version.md` — Godot 4.5 API notes
257
+ - `references/collaborative-protocol.md`
258
+ - `references/mcp-tools-reference.md`
259
+ - `references/gd-style.md` — GDScript conventions
260
+ - `references/godot-version.md` — Godot 4.5 API notes
261
261
  - `scene-and-project/brainstorm-game/SKILL.md` — produces `.summer/GameSoul.md` this skill reads
262
262
  - `level-design/design-level/SKILL.md` — design the levels that exercise the mechanic
263
263
  - `character-controllers/fps-controller/SKILL.md` — FPS movement scaffolding
@@ -239,11 +239,11 @@ End with:
239
239
  | Reward gating too generous | Free heals before the peak deflate the peak. Gate them after the test. |
240
240
  | Blending level types | Stealth + puzzle + boss in one level = three half-baked levels. Pick one. |
241
241
  | Building geometry before the skeleton | Skeleton-first lets you iterate on layout cheaply. Geometry comes after the design is locked. |
242
- | Calling SetResourceProperty on inline sub_resources | Silent fail. See `_shared/mcp-tools-reference.md` § Trap. |
242
+ | Calling SetResourceProperty on inline sub_resources | Silent fail. See `references/mcp-tools-reference.md` § Trap. |
243
243
 
244
244
  ## Collaborative protocol
245
245
 
246
- This skill creates a new scene file (`.tscn`) and a design doc (`.md`). Group writes per phase. Always ask before `summer_create_scene`. See `_shared/collaborative-protocol.md`.
246
+ This skill creates a new scene file (`.tscn`) and a design doc (`.md`). Group writes per phase. Always ask before `summer_create_scene`. See `references/collaborative-protocol.md`.
247
247
 
248
248
  ## Want a working starter?
249
249
 
@@ -256,9 +256,9 @@ The skeleton this skill produces is meant to be filled in via `/summer:design-me
256
256
 
257
257
  ## See also
258
258
 
259
- - `_shared/collaborative-protocol.md`
260
- - `_shared/mcp-tools-reference.md`
261
- - `_shared/godot-version.md` — Godot 4.5 API notes
259
+ - `references/collaborative-protocol.md`
260
+ - `references/mcp-tools-reference.md`
261
+ - `references/godot-version.md` — Godot 4.5 API notes
262
262
  - `scene-and-project/brainstorm-game/SKILL.md` — produces `.summer/GameSoul.md`
263
263
  - `gameplay-mechanics/design-mechanic/SKILL.md` — designs the verbs the level exercises
264
264
  - `ai-and-npcs/design-npc/SKILL.md` — designs the enemies the encounters reference