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.
- package/CHANGELOG.md +67 -0
- package/README.md +7 -2
- package/dist/bin/summer.js +24 -1
- package/dist/commands/doctor.js +44 -20
- package/dist/commands/setup.js +77 -6
- package/dist/commands/skills.js +5 -3
- package/dist/lib/format.d.ts +23 -0
- package/dist/lib/format.js +60 -0
- package/dist/lib/format.test.d.ts +1 -0
- package/dist/lib/format.test.js +36 -0
- package/dist/lib/skills-registry.d.ts +16 -0
- package/dist/lib/skills-registry.js +35 -0
- package/package.json +5 -3
- package/skills/_meta/skill-test/SKILL.md +1 -1
- package/skills/_shared/summer-folder.md +44 -0
- package/skills/_tests/specs/art-direction.md +115 -0
- package/skills/_tests/specs/audio-direction.md +123 -0
- package/skills/_tests/specs/brainstorm-game.md +99 -0
- package/skills/_tests/specs/debug.md +94 -0
- package/skills/_tests/specs/design-level.md +113 -0
- package/skills/_tests/specs/design-mechanic.md +112 -0
- package/skills/_tests/specs/design-npc.md +112 -0
- package/skills/_tests/specs/export-and-ship.md +114 -0
- package/skills/_tests/specs/fps-controller.md +5 -5
- package/skills/_tests/specs/play.md +88 -0
- package/skills/_tests/specs/setup-multiplayer.md +106 -0
- package/skills/_tests/specs/tune-performance.md +104 -0
- package/skills/_tests/specs/vfx.md +98 -0
- package/skills/ai-and-npcs/design-npc/SKILL.md +343 -0
- package/skills/asset-pipeline/asset-strategy/SKILL.md +1 -0
- package/skills/audio/audio-direction/SKILL.md +258 -0
- package/skills/catalog.yaml +13 -3
- package/skills/character-controllers/fps-controller/SKILL.md +1 -0
- package/skills/debugging/debug/SKILL.md +137 -0
- package/skills/deployment/export-and-ship/SKILL.md +300 -0
- package/skills/gameplay-mechanics/design-mechanic/SKILL.md +265 -0
- package/skills/level-design/design-level/SKILL.md +266 -0
- package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +328 -0
- package/skills/performance/tune-performance/SKILL.md +219 -0
- package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -0
- package/skills/rendering-and-lighting/art-direction/SKILL.md +284 -0
- package/skills/scene-and-project/brainstorm-game/SKILL.md +210 -0
- package/skills/scene-and-project/make-game/SKILL.md +1 -0
- package/skills/scene-and-project/play/SKILL.md +108 -0
- package/skills/scene-and-project/scene-composition/SKILL.md +1 -0
- package/skills/scripting-patterns/gdscript-patterns/SKILL.md +1 -0
- package/skills/ui-and-ux/ui-basics/SKILL.md +1 -0
- package/skills/visual-effects/vfx/SKILL.md +280 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audio-direction
|
|
3
|
+
description: Use when defining the sonic identity — music style, instruments, SFX vocabulary, dynamic music plan. Outputs an audio bible at `.summer/audio-bible.md`. Trigger on "audio direction", "audio bible", "music style", "sound design", "what should it sound like", "dynamic music".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: audio
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_get_project_context summer_get_scene_tree summer_inspect_node summer_add_node summer_project_setting summer_generate_audio
|
|
9
|
+
paths: [".summer/**", "project.godot", "**/*.tscn", "audio/**"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# /audio-direction — Define the Sonic Identity
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
Most indie games sound like a single library used flat. The same generic "swoosh" for menu, jump, pickup, hit. That's not audio direction — that's audio absence. This skill builds an audio bible that names the music style, the SFX vocabulary, the dynamic music plan, and the spatial / mix rules. Writes to `.summer/audio-bible.md` and configures the audio bus layout in the project so the rest of the work has a real foundation.
|
|
17
|
+
|
|
18
|
+
**Core principle:** SFX needs a *vocabulary*, not a *library*. Eight named SFX classes with consistent character beat 80 random library hits.
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
### 1. Open with three references
|
|
23
|
+
|
|
24
|
+
Ask exactly this:
|
|
25
|
+
|
|
26
|
+
> Three reference tracks, games, or films for the music. What instruments matter? And what's the SFX vibe — chunky, clean, synthetic, or organic?
|
|
27
|
+
|
|
28
|
+
Three is the minimum. One or two collapses into a clone. References are the highest-signal input — listen carefully.
|
|
29
|
+
|
|
30
|
+
If they freeze, offer four axes (not titles):
|
|
31
|
+
|
|
32
|
+
> Pick the closest: a) orchestral + cinematic (Hollow Knight, Journey), b) lo-fi electronic + ambient (Disco Elysium, Outer Wilds), c) chiptune / synth (Hyper Light Drifter, Celeste), d) acoustic / folk (Sable, A Short Hike).
|
|
33
|
+
|
|
34
|
+
### 2. Read the brief and art bible if they exist
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
Read .summer/GameSoul.md
|
|
38
|
+
Read .summer/art-bible.md
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Audio must rhyme with the visuals. Quote it back:
|
|
42
|
+
|
|
43
|
+
> Art bible says "soft, hand-warmed, golden-hour, painterly". That rhymes with acoustic / folk / lo-fi over orchestral or aggressive synth. Confirming.
|
|
44
|
+
|
|
45
|
+
If the brief says "horror", that constrains the music style harder than the user's references will. Name the constraint.
|
|
46
|
+
|
|
47
|
+
### 3. Pin the music style
|
|
48
|
+
|
|
49
|
+
Force one primary style. Sub-styles can blend, but a primary is required.
|
|
50
|
+
|
|
51
|
+
| Style | Anchor instruments | Pairs with | Avoid |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| Orchestral cinematic | Strings, brass, choir | Story-led, fantasy | Casual / cozy |
|
|
54
|
+
| Acoustic / folk | Guitar, piano, hand percussion | Cozy, narrative | Action / horror |
|
|
55
|
+
| Lo-fi electronic | Vintage synth pad, tape sat, light beat | Atmospheric, indie | Combat-heavy |
|
|
56
|
+
| Chiptune / synthwave | 8-bit / 16-bit chips, FM synth | Retro, platformer | Realism |
|
|
57
|
+
| Industrial / metal | Distorted bass, percussion-led | Horror, action | Cozy |
|
|
58
|
+
| Ambient drone | Pads, no drums, slow movement | Walking sim, horror | Action |
|
|
59
|
+
| Jazz / fusion | Live instruments, improv | Stylish, narrative | Generic action |
|
|
60
|
+
| Tracker / hyperpop | Glitchy, dense, modern | Esoteric, indie | Mass appeal |
|
|
61
|
+
|
|
62
|
+
Ask:
|
|
63
|
+
|
|
64
|
+
> One primary style. Which?
|
|
65
|
+
|
|
66
|
+
### 4. Define tempo + key range
|
|
67
|
+
|
|
68
|
+
Concrete numbers, not "varies".
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
Tempo range: 80–110 BPM (slow side; combat would push 120+)
|
|
72
|
+
Key center: D minor (warm but melancholic)
|
|
73
|
+
Modulation rule: combat tracks shift to D dorian, calm tracks to D natural minor
|
|
74
|
+
Time signature: 4/4 default; 6/8 for emotional cues
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 5. Build the SFX vocabulary
|
|
78
|
+
|
|
79
|
+
Eight named classes. Each class has a *character*, not a single sound.
|
|
80
|
+
|
|
81
|
+
| Class | Character | Examples in this game | DON'T |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| **UI** | Soft, woody, short (60-100ms) | Menu hover, button click, tab switch | No bell tones, no synth blips |
|
|
84
|
+
| **Pickup positive** | Warm, ascending interval (major third), 200-400ms | Coin, key, heal | No pure sine "ding" |
|
|
85
|
+
| **Pickup neutral** | Brief tactile, no melodic component | Note, breadcrumb, lore item | No ascending pitch (reads as reward) |
|
|
86
|
+
| **Negative / damage** | Punchy low-mid, slight detune | Player hit, enemy hit, fall damage | No long reverb tail |
|
|
87
|
+
| **Movement / footstep** | Material-aware (wood / stone / grass) | Walk, run, jump, land | No same sample for all surfaces |
|
|
88
|
+
| **Attack / action** | Front-loaded transient, short body | Swing, parry, dash | No layered orchestral hit |
|
|
89
|
+
| **Ambient layer** | Continuous, low presence | Wind, room tone, distant waves | No looping melody |
|
|
90
|
+
| **Stinger / event** | Distinctive, rare, melodic | Boss intro, level clear, story beat | No reuse for normal events |
|
|
91
|
+
|
|
92
|
+
Ask:
|
|
93
|
+
|
|
94
|
+
> Eight classes above. Adjust any character / examples / DON'Ts?
|
|
95
|
+
|
|
96
|
+
### 6. Define the dynamic music plan
|
|
97
|
+
|
|
98
|
+
Static music = one track loops forever in a level. Boring. Dynamic music = layers swell with player state. Pick a model.
|
|
99
|
+
|
|
100
|
+
| Model | How it works | Cost | Best for |
|
|
101
|
+
|---|---|---|---|
|
|
102
|
+
| **Layered stems** | One bar / multiple instrument layers; combat adds drum stem, calm removes it | Medium (need stems authored) | Most games |
|
|
103
|
+
| **Vertical re-orchestration** | Same melody, different instrumentation per state | High (composer-led) | Story-led / boss-heavy |
|
|
104
|
+
| **Horizontal sequencing** | Different tracks for different states, crossfade | Low (just author 3-5 full tracks) | Vertical slice scope |
|
|
105
|
+
| **Procedural / generative** | Generate from rules in real-time | High dev cost | Special-case |
|
|
106
|
+
|
|
107
|
+
Pick one. State the state machine:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
States:
|
|
111
|
+
CALM — exploration, low intensity
|
|
112
|
+
TENSION — enemies aware but not engaged
|
|
113
|
+
COMBAT — engaged
|
|
114
|
+
VICTORY — encounter cleared (4-second sting → return to CALM)
|
|
115
|
+
|
|
116
|
+
Transitions:
|
|
117
|
+
CALM → TENSION when an enemy detects the player (2s crossfade)
|
|
118
|
+
TENSION → COMBAT when first damage exchanged (instant drum stem)
|
|
119
|
+
COMBAT → VICTORY when last enemy dies (drum stem cuts, brass swell)
|
|
120
|
+
VICTORY → CALM after 4s
|
|
121
|
+
|
|
122
|
+
Rules:
|
|
123
|
+
No state stays > 90s without variation (loop with bar-1 randomization)
|
|
124
|
+
Volume ducking: dialogue active → music -6dB
|
|
125
|
+
Boss music is its own track; ignores normal state machine
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 7. Define the spatial + mix rules
|
|
129
|
+
|
|
130
|
+
| Rule | Value |
|
|
131
|
+
|---|---|
|
|
132
|
+
| 3D attenuation curve | Inverse-square (default), max distance 25m |
|
|
133
|
+
| Reverb buses | 1 small (interior), 1 large (cave / hall), 1 outdoor |
|
|
134
|
+
| HRTF for player | ON (headphone-friendly directional cues) |
|
|
135
|
+
| Master ceiling | -1 dBTP (true peak, no clipping on consoles) |
|
|
136
|
+
| Music vs SFX vs UI mix | -8 dB / 0 dB / -3 dB (SFX is loudest) |
|
|
137
|
+
| Footstep rolloff | Cuts at 4m for player; cuts at 10m for NPC (player needs them, distant NPCs are noise) |
|
|
138
|
+
| Compression | Light bus compression on master (2:1, slow attack, 100ms release) |
|
|
139
|
+
|
|
140
|
+
### 8. Configure the audio bus layout
|
|
141
|
+
|
|
142
|
+
Real audio in Godot needs a bus layout. Default Godot has Master only — configure the buses now.
|
|
143
|
+
|
|
144
|
+
**Preferred (Summer MCP):** Buses are typically in `default_bus_layout.tres`. Modify project setting:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
summer_project_setting(key="audio/buses/default_bus_layout", value="res://audio/default_bus_layout.tres")
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Ask the user:
|
|
151
|
+
|
|
152
|
+
> May I create `audio/default_bus_layout.tres` with these buses: Master / Music / SFX / UI / Voice / Ambient / Reverb_Small / Reverb_Large / Reverb_Outdoor?
|
|
153
|
+
|
|
154
|
+
On yes, write the `.tres` directly via `Write` (it's plain Godot resource format the host can produce):
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
Write audio/default_bus_layout.tres
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**Fallback (no MCP):** Print the `.tres` for the user to paste, plus the `project.godot` line.
|
|
161
|
+
|
|
162
|
+
### 9. Save the audio bible
|
|
163
|
+
|
|
164
|
+
Always write the bible. Path: `.summer/audio-bible.md`.
|
|
165
|
+
|
|
166
|
+
```markdown
|
|
167
|
+
# Audio Bible — <Game Name>
|
|
168
|
+
|
|
169
|
+
**References:** <3 specific tracks / games / films>
|
|
170
|
+
**Style:** <one of the 8 above>
|
|
171
|
+
**Tempo / key:** 80–110 BPM, D minor, 4/4
|
|
172
|
+
|
|
173
|
+
## SFX Vocabulary
|
|
174
|
+
| Class | Character | Examples | DON'T |
|
|
175
|
+
|---|---|---|---|
|
|
176
|
+
| UI | Soft, woody, 60-100ms | hover, click | bell tones |
|
|
177
|
+
| Pickup positive | Warm major-third, 200-400ms | coin, heal | pure sine |
|
|
178
|
+
| ... | ... | ... | ... |
|
|
179
|
+
|
|
180
|
+
## Dynamic Music Plan
|
|
181
|
+
**Model:** Layered stems
|
|
182
|
+
**States:** CALM / TENSION / COMBAT / VICTORY
|
|
183
|
+
**Transitions:** ...
|
|
184
|
+
**Rules:** ...
|
|
185
|
+
|
|
186
|
+
## Spatial + Mix
|
|
187
|
+
- 3D attenuation: inverse-square, 25m
|
|
188
|
+
- Reverb buses: small / large / outdoor
|
|
189
|
+
- HRTF: ON
|
|
190
|
+
- Master ceiling: -1 dBTP
|
|
191
|
+
- Mix bus: Music -8 dB, SFX 0 dB, UI -3 dB
|
|
192
|
+
- Footstep rolloff: 4m player / 10m NPC
|
|
193
|
+
|
|
194
|
+
## Bus Layout
|
|
195
|
+
Master → Music, SFX (→ Reverb_Small / Large / Outdoor), UI, Voice, Ambient
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Ask:
|
|
199
|
+
|
|
200
|
+
> May I create `.summer/audio-bible.md` with this bible?
|
|
201
|
+
|
|
202
|
+
### 10. Optional — generate first SFX seeds
|
|
203
|
+
|
|
204
|
+
If the user wants to start generating, propose 3-5 SFX seeds aligned with the vocabulary. These are starting points, not finals.
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
summer_generate_audio(prompt="soft woody UI click, 80ms, no reverb, neutral pitch", duration=0.1)
|
|
208
|
+
summer_generate_audio(prompt="warm major-third coin pickup, 300ms, light reverb", duration=0.3)
|
|
209
|
+
summer_generate_audio(prompt="punchy low-mid player damage hit, slight detune, 200ms, no tail", duration=0.2)
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Ask first:
|
|
213
|
+
|
|
214
|
+
> May I generate first-pass SFX seeds for UI, pickup, and damage classes? They're starting points, not finals.
|
|
215
|
+
|
|
216
|
+
### 11. Route to the next step
|
|
217
|
+
|
|
218
|
+
End with:
|
|
219
|
+
|
|
220
|
+
> Bible saved. Next:
|
|
221
|
+
> - `/summer:design-mechanic` to wire SFX cues into specific mechanics.
|
|
222
|
+
> - `/summer:vfx` if you haven't paired audio with visual effect cues yet.
|
|
223
|
+
> - Author or generate the calm music track first; it's the longest-running and sets the room tone.
|
|
224
|
+
|
|
225
|
+
## Common mistakes
|
|
226
|
+
|
|
227
|
+
| Mistake | Fix |
|
|
228
|
+
|---|---|
|
|
229
|
+
| Single reference for music | Three minimum. Listen for the *common* element across them. |
|
|
230
|
+
| "Library" instead of "vocabulary" | A bag of free SFX with no shared character feels random. Eight named classes with character notes. |
|
|
231
|
+
| Same SFX for all events | If pickup-coin and pickup-key sound identical, the player learns nothing from audio. |
|
|
232
|
+
| No dynamic music plan | Static loops bore in 90s. Pick a model (layered / vertical / horizontal / procedural). |
|
|
233
|
+
| Music louder than SFX | Players need SFX for gameplay; music is mood. Default mix is -8 dB music vs 0 dB SFX. |
|
|
234
|
+
| No reverb buses | "Send" architecture (rooms route to a small/large/outdoor reverb bus) is mandatory or your mix sounds dry-then-wet inconsistently. |
|
|
235
|
+
| Pure sine "ding" for pickup | Reads as cheap mobile game. Use a major-third interval with character. |
|
|
236
|
+
| Same footstep sample for all surfaces | Material-aware footsteps are 80% of the perceived audio quality. |
|
|
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. |
|
|
239
|
+
|
|
240
|
+
## Collaborative protocol
|
|
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`.
|
|
243
|
+
|
|
244
|
+
## Want a working starter?
|
|
245
|
+
|
|
246
|
+
No template — this is a workflow that produces the bible the rest of the project obeys. After the bible exists, the bus layout is set up and any subsequent audio work (footstep system, dynamic music) reads from it.
|
|
247
|
+
|
|
248
|
+
## See also
|
|
249
|
+
|
|
250
|
+
- `_shared/collaborative-protocol.md`
|
|
251
|
+
- `_shared/godot-version.md` — Godot 4.5 audio API notes
|
|
252
|
+
- `_shared/mcp-tools-reference.md`
|
|
253
|
+
- `scene-and-project/brainstorm-game/SKILL.md` — produces the brief that anchors the bible
|
|
254
|
+
- `rendering-and-lighting/art-direction/SKILL.md` — the visual counterpart; audio must rhyme with it
|
|
255
|
+
- `audio/audio-bus-setup/SKILL.md` (NEXT) — implements the bus layout in detail
|
|
256
|
+
- `audio/3d-spatial-audio/SKILL.md` (NEXT) — spatial attenuation patterns
|
|
257
|
+
- `audio/footstep-systems/SKILL.md` (NEXT) — material-aware footstep impl
|
|
258
|
+
- `audio/dynamic-music-stingers/SKILL.md` (LATER) — implements the dynamic music plan
|
package/skills/catalog.yaml
CHANGED
|
@@ -138,6 +138,13 @@ skills:
|
|
|
138
138
|
public: true
|
|
139
139
|
recommended: true
|
|
140
140
|
last-tested: 2026-05-05
|
|
141
|
+
- name: play
|
|
142
|
+
category: scene-and-project
|
|
143
|
+
status: HAVE
|
|
144
|
+
public: true
|
|
145
|
+
recommended: true
|
|
146
|
+
user-invocable: true
|
|
147
|
+
last-tested: 2026-05-05
|
|
141
148
|
- name: make-game
|
|
142
149
|
category: scene-and-project
|
|
143
150
|
status: HAVE
|
|
@@ -600,11 +607,14 @@ skills:
|
|
|
600
607
|
public: true
|
|
601
608
|
|
|
602
609
|
# ── debugging ──
|
|
603
|
-
- name:
|
|
610
|
+
- name: debug
|
|
604
611
|
category: debugging
|
|
605
|
-
status:
|
|
612
|
+
status: HAVE
|
|
606
613
|
public: true
|
|
607
|
-
|
|
614
|
+
recommended: true
|
|
615
|
+
user-invocable: true
|
|
616
|
+
last-tested: 2026-05-05
|
|
617
|
+
- name: debugger-basics
|
|
608
618
|
category: debugging
|
|
609
619
|
status: NEXT
|
|
610
620
|
public: true
|
|
@@ -4,6 +4,7 @@ description: First-person character controller with WASD movement, mouse look, j
|
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: character-controllers
|
|
7
|
+
user-invocable: false
|
|
7
8
|
template-id: template-3d-fps
|
|
8
9
|
allowed-tools: Read Grep summer_add_node summer_set_prop summer_set_resource_property summer_input_map_bind summer_save_scene summer_get_script_errors
|
|
9
10
|
paths: ["**/*.gd", "**/*.tscn"]
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: debug
|
|
3
|
+
description: Use when the user reports their game is broken, crashing, behaving unexpectedly, or says "debug", "fix", "something's wrong", or "it's not working". Triages the bug end-to-end via Summer Engine's diagnostic tools (console, debugger errors, script errors), locates the offending code, proposes a fix, and verifies the fix.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: debugging
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Edit summer_get_console summer_get_debugger_errors summer_get_script_errors summer_get_diagnostics summer_clear_console summer_play summer_stop summer_is_running summer_get_scene_tree summer_inspect_node
|
|
9
|
+
paths: ["**/*.gd", "**/*.tscn", "**/*.cs"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# /debug — Triage and Fix a Bug
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
A bug in a Godot/Summer game can hide in three places: scripts (GDScript/C# compile or runtime errors), the engine console (printed messages, warnings), or the scene/resource state (wrong property, missing collider, broken signal connection). This skill walks all three before guessing.
|
|
17
|
+
|
|
18
|
+
**Core principle:** read what the engine actually saw, not what the code looks like it does.
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
### 1. Get the user's description first
|
|
23
|
+
|
|
24
|
+
Ask one short question:
|
|
25
|
+
|
|
26
|
+
> What's happening? Briefly: when does it go wrong, and what do you expect vs. what you see?
|
|
27
|
+
|
|
28
|
+
Wait for the answer before doing anything else. Don't start grepping code yet — the user's words narrow the search 10x.
|
|
29
|
+
|
|
30
|
+
### 2. Read the engine's actual error state
|
|
31
|
+
|
|
32
|
+
Always do this in order. Each tool answers a different question.
|
|
33
|
+
|
|
34
|
+
**Preferred (Summer MCP):**
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
summer_get_script_errors # Compile errors? (cheapest, do first)
|
|
38
|
+
summer_get_console # Print() output, warnings, info
|
|
39
|
+
summer_get_debugger_errors # Runtime errors with stack traces
|
|
40
|
+
summer_get_diagnostics # Aggregated count + summary
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
If the bug is reproducible only at runtime and the engine isn't currently playing:
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
summer_clear_console # Clean slate
|
|
47
|
+
summer_play # Run it
|
|
48
|
+
# (let the user reproduce the bug)
|
|
49
|
+
summer_get_debugger_errors # Now read what blew up
|
|
50
|
+
summer_stop # When done
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Fallback (no MCP — engine isn't connected):**
|
|
54
|
+
|
|
55
|
+
Ask the user to copy-paste the engine's Output panel and Debugger errors. Inspect manually.
|
|
56
|
+
|
|
57
|
+
### 3. Locate the offending code
|
|
58
|
+
|
|
59
|
+
For each error, follow the stack trace to the file + line. Use host file tools:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
Read <file>:<line-near-error>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Read 20–40 lines around the error site. Don't open the whole file unless you need to — context budget matters.
|
|
66
|
+
|
|
67
|
+
If the error mentions a node path (e.g. `./World/Player/Camera`), inspect it:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
summer_inspect_node "./World/Player/Camera"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 4. Form a hypothesis and propose the fix
|
|
74
|
+
|
|
75
|
+
State it in one sentence:
|
|
76
|
+
|
|
77
|
+
> The error happens because <root cause>. The fix is <one-line summary>.
|
|
78
|
+
|
|
79
|
+
Then ask:
|
|
80
|
+
|
|
81
|
+
> May I edit `<file>` to <do exactly this>?
|
|
82
|
+
|
|
83
|
+
Don't guess at multiple fixes at once. Pick one. If wrong, the next iteration is cheap.
|
|
84
|
+
|
|
85
|
+
### 5. Apply the fix
|
|
86
|
+
|
|
87
|
+
On user yes, edit the file with host tools (`Edit`/`Write`). Single focused change.
|
|
88
|
+
|
|
89
|
+
### 6. Verify
|
|
90
|
+
|
|
91
|
+
Re-run the relevant check:
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
summer_get_script_errors # If it was a compile error
|
|
95
|
+
summer_play → summer_get_debugger_errors → summer_stop # If runtime
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Report:
|
|
99
|
+
|
|
100
|
+
> Fixed. <One-line description of what changed.>
|
|
101
|
+
|
|
102
|
+
If still broken: go back to step 4 with the new error state. State explicitly that the first hypothesis was wrong.
|
|
103
|
+
|
|
104
|
+
## Common bug patterns and how to spot them
|
|
105
|
+
|
|
106
|
+
| Symptom | Likely cause | First check |
|
|
107
|
+
|---|---|---|
|
|
108
|
+
| `Invalid set index 'X' (on base: Nil)` | Node path resolved to null | `summer_inspect_node` the path |
|
|
109
|
+
| `Identifier not declared` (script error) | Missing `class_name` or wrong scope | `summer_get_script_errors` |
|
|
110
|
+
| Game runs but sprite doesn't appear | Node added but not visible (transform / parent / layer) | `summer_get_scene_tree` + inspect parent |
|
|
111
|
+
| Signal handler never fires | Connection not made, or connected to wrong instance | `summer_inspect_node` of emitter, check connections |
|
|
112
|
+
| Player falls through floor | CollisionShape3D has no shape, or shape is inline sub_resource | `summer_inspect_resource` on the CollisionShape |
|
|
113
|
+
| Mouse capture stuck | `Input.set_mouse_mode` not paired with release on focus loss | `summer_get_console` for warnings |
|
|
114
|
+
| Game hangs on start | Infinite loop in `_ready()` or `_process()` | `summer_get_debugger_errors` after a forced stop |
|
|
115
|
+
|
|
116
|
+
## Anti-patterns (don't do these)
|
|
117
|
+
|
|
118
|
+
- **Don't** start by reading the user's whole codebase. The error tells you where to look.
|
|
119
|
+
- **Don't** propose a sweeping refactor for a single bug. One file, one change, verify.
|
|
120
|
+
- **Don't** call `summer_set_resource_property` on an inline `sub_resource` — it silently fails. See `_shared/mcp-tools-reference.md` § "Trap".
|
|
121
|
+
- **Don't** call `summer_play` without `summer_clear_console` first if you want clean output to read.
|
|
122
|
+
- **Don't** skip the user's description in step 1. "What were you trying to do" beats "what does the code do" 9/10 times.
|
|
123
|
+
|
|
124
|
+
## Collaborative protocol
|
|
125
|
+
|
|
126
|
+
This skill writes files. Always ask before each edit step. See `_shared/collaborative-protocol.md`.
|
|
127
|
+
|
|
128
|
+
## Want a working starter?
|
|
129
|
+
|
|
130
|
+
No template — this is a workflow, not a project scaffold. It works against any Godot/Summer project that has Summer MCP wired up.
|
|
131
|
+
|
|
132
|
+
## See also
|
|
133
|
+
|
|
134
|
+
- `_shared/mcp-tools-reference.md` — full tool list
|
|
135
|
+
- `_shared/godot-version.md` — engine version + LLM cutoff risks
|
|
136
|
+
- `scripting-patterns/gdscript-patterns/SKILL.md` — what good GDScript looks like
|
|
137
|
+
- `scene-and-project/play/SKILL.md` — running the game
|