summer-engine 2.2.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +20 -5
- package/.codex-plugin/plugin.json +15 -5
- package/.cursor-plugin/plugin.json +15 -5
- package/.factory-plugin/plugin.json +2 -2
- package/.opencode/INSTALL.md +1 -1
- package/CHANGELOG.md +27 -6
- package/CLAUDE.md +2 -2
- package/GEMINI.md +2 -3
- package/README.md +82 -58
- package/_persona/summer/SKILL.md +5 -6
- package/commands/gameskill.md +103 -0
- package/dist/bin/summer.js +12 -4
- package/dist/commands/create.js +2 -0
- package/dist/commands/doctor.js +71 -1
- package/dist/commands/install.d.ts +17 -0
- package/dist/commands/install.js +63 -4
- package/dist/commands/memory.d.ts +14 -0
- package/dist/commands/memory.js +196 -0
- package/dist/commands/setup.js +12 -2
- package/dist/commands/skills.js +205 -8
- package/dist/commands/status.js +3 -0
- package/dist/lib/agent-config.d.ts +2 -2
- package/dist/lib/agent-config.js +298 -5
- package/dist/lib/api-client.d.ts +13 -0
- package/dist/lib/api-client.js +63 -26
- package/dist/lib/async-op-lifecycle.d.ts +60 -0
- package/dist/lib/async-op-lifecycle.js +83 -0
- package/dist/lib/project-memory.d.ts +33 -0
- package/dist/lib/project-memory.js +220 -0
- package/dist/lib/skills-registry.d.ts +134 -61
- package/dist/lib/skills-registry.js +106 -4
- package/dist/lib/version-check.d.ts +106 -0
- package/dist/lib/version-check.js +338 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +81 -0
- package/dist/mcp/tools/debug-tools.js +32 -2
- package/dist/mcp/tools/project-tools.js +18 -6
- package/dist/mcp/tools/with-engine.d.ts +14 -0
- package/dist/mcp/tools/with-engine.js +52 -7
- package/gemini-extension.json +2 -2
- package/hooks/pre-commit-doctor.sh +0 -0
- package/hooks/run-hook.cmd +0 -0
- package/hooks/session-start.sh +0 -0
- package/package.json +6 -4
- package/skills/2d-assets/character-portrait/SKILL.md +1 -1
- package/skills/2d-assets/concept-art/SKILL.md +1 -1
- package/skills/2d-assets/create-asset-sheet/SKILL.md +163 -0
- package/skills/2d-assets/instantiate-asset-pack/SKILL.md +245 -0
- package/skills/2d-assets/pixel-art/SKILL.md +1 -1
- package/skills/2d-assets/skybox-panorama/SKILL.md +1 -1
- package/skills/2d-assets/sprite-sheet/SKILL.md +1 -1
- package/skills/2d-assets/tileable-texture/SKILL.md +1 -1
- package/skills/2d-assets/ui-graphics/SKILL.md +1 -1
- package/skills/2d-assets/use-widget-asset/SKILL.md +217 -0
- package/skills/3d-assets/character-model/SKILL.md +1 -1
- package/skills/3d-assets/organic-model/SKILL.md +1 -1
- package/skills/3d-assets/prop-model/SKILL.md +1 -1
- package/skills/3d-assets/vehicle-model/SKILL.md +1 -1
- package/skills/README.md +37 -30
- package/skills/ai-and-npcs/design-npc/SKILL.md +6 -6
- package/skills/animation/animation-tree/SKILL.md +2 -2
- package/skills/animation/facial-and-lipsync/SKILL.md +1 -1
- package/skills/animation/generate-motion/SKILL.md +1 -1
- package/skills/animation/procedural-animation/SKILL.md +2 -2
- package/skills/audio/adaptive-music/SKILL.md +1 -1
- package/skills/audio/audio-direction/SKILL.md +5 -5
- package/skills/audio/sound-effect/SKILL.md +2 -2
- package/skills/audio/voice-line/SKILL.md +25 -3
- package/skills/character-controllers/fps-controller/SKILL.md +5 -5
- package/skills/debugging/debug/SKILL.md +39 -1
- package/skills/deployment/export-and-ship/SKILL.md +4 -4
- package/skills/gameplay-mechanics/auto-fire-targeting/SKILL.md +170 -0
- package/skills/gameplay-mechanics/design-mechanic/SKILL.md +8 -8
- package/skills/level-design/design-level/SKILL.md +5 -5
- package/skills/level-design/scene-to-level/SKILL.md +125 -0
- package/skills/multiplayer-and-networking/host-authoritative-state/SKILL.md +4 -4
- package/skills/multiplayer-and-networking/peer-to-peer-multiplayer/SKILL.md +4 -4
- package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +7 -7
- package/skills/performance/tune-performance/SKILL.md +5 -5
- package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -1
- package/skills/rendering-and-lighting/art-direction/SKILL.md +5 -5
- package/skills/scene-and-project/brainstorm-game/SKILL.md +4 -4
- package/skills/scene-and-project/play/SKILL.md +1 -1
- package/skills/scene-and-project/scene-composition/SKILL.md +30 -1
- package/skills/scripting-patterns/gdscript-patterns/SKILL.md +53 -0
- package/skills/ui-and-ux/ui-basics/SKILL.md +1 -1
- package/skills/video/animated-loop/SKILL.md +1 -1
- package/skills/video/cinematic-cutscene/SKILL.md +1 -1
- package/skills/video/trailer-shot/SKILL.md +1 -1
- package/skills/visual-effects/game-feel/SKILL.md +6 -6
- package/skills/workflow/brainstorming/SKILL.md +164 -0
- package/skills/workflow/brainstorming/scripts/frame-template.html +214 -0
- package/skills/workflow/brainstorming/scripts/helper.js +88 -0
- package/skills/workflow/brainstorming/scripts/server.cjs +354 -0
- package/skills/workflow/brainstorming/scripts/start-server.sh +148 -0
- package/skills/workflow/brainstorming/scripts/stop-server.sh +56 -0
- package/skills/workflow/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/skills/workflow/brainstorming/visual-companion.md +287 -0
- package/skills/workflow/debugging-game-feel/SKILL.md +174 -0
- package/skills/workflow/diagnosing-perf-regressions/SKILL.md +190 -0
- package/skills/workflow/dispatching-parallel-agents/SKILL.md +182 -0
- package/skills/workflow/gameskill/SKILL.md +111 -0
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +119 -0
- package/skills/workflow/investigating-bugs/SKILL.md +296 -0
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +158 -0
- package/skills/workflow/investigating-bugs/condition-based-waiting.md +115 -0
- package/skills/workflow/investigating-bugs/defense-in-depth.md +122 -0
- package/skills/workflow/investigating-bugs/find-polluter.sh +63 -0
- package/skills/workflow/investigating-bugs/root-cause-tracing.md +169 -0
- package/skills/workflow/investigating-bugs/test-academic.md +14 -0
- package/skills/workflow/investigating-bugs/test-pressure-1.md +58 -0
- package/skills/workflow/investigating-bugs/test-pressure-2.md +68 -0
- package/skills/workflow/investigating-bugs/test-pressure-3.md +69 -0
- package/skills/workflow/playtesting-a-feature/SKILL.md +173 -0
- package/skills/{_meta → workflow}/skill-create/SKILL.md +32 -22
- package/skills/{_meta → workflow}/skill-improve/SKILL.md +9 -10
- package/skills/{_meta → workflow}/skill-test/SKILL.md +12 -12
- package/skills/{_meta → workflow}/using-summer/SKILL.md +5 -2
- package/skills/workflow/verification-before-completion/SKILL.md +139 -0
- package/skills/workflow/writing-plans/SKILL.md +152 -0
- package/skills/workflow/writing-plans/plan-document-reviewer-prompt.md +49 -0
- package/skills/workflow/writing-skills/SKILL.md +655 -0
- package/skills/workflow/writing-skills/anthropic-best-practices.md +1150 -0
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/workflow/writing-skills/graphviz-conventions.dot +172 -0
- package/skills/workflow/writing-skills/persuasion-principles.md +187 -0
- package/skills/workflow/writing-skills/render-graphs.js +168 -0
- package/skills/workflow/writing-skills/testing-skills-with-subagents.md +384 -0
- package/dist/commands/assets.d.ts +0 -2
- package/dist/commands/assets.js +0 -189
- package/dist/commands/debug.d.ts +0 -2
- package/dist/commands/debug.js +0 -127
- package/dist/commands/doctor.test.d.ts +0 -1
- package/dist/commands/doctor.test.js +0 -29
- package/dist/commands/project.d.ts +0 -2
- package/dist/commands/project.js +0 -170
- package/dist/commands/scene.d.ts +0 -2
- package/dist/commands/scene.js +0 -290
- package/dist/lib/agent-config.test.d.ts +0 -1
- package/dist/lib/agent-config.test.js +0 -80
- package/dist/lib/format.test.d.ts +0 -1
- package/dist/lib/format.test.js +0 -36
- package/dist/lib/plugin-manifests.test.d.ts +0 -1
- package/dist/lib/plugin-manifests.test.js +0 -134
- package/dist/lib/with-engine.d.ts +0 -14
- package/dist/lib/with-engine.js +0 -109
- package/skills/_shared/collaborative-protocol.md +0 -50
- package/skills/_shared/gd-style.md +0 -121
- package/skills/_shared/godot-version.md +0 -32
- package/skills/_shared/mcp-tools-reference.md +0 -133
- package/skills/_shared/summer-folder.md +0 -44
- package/skills/_shared/template-registry.md +0 -40
- package/skills/_tests/runner.md +0 -90
- package/skills/_tests/specs/3d-lighting.md +0 -19
- package/skills/_tests/specs/art-direction.md +0 -115
- package/skills/_tests/specs/asset-strategy.md +0 -19
- package/skills/_tests/specs/audio-direction.md +0 -123
- package/skills/_tests/specs/brainstorm-game.md +0 -99
- package/skills/_tests/specs/debug.md +0 -94
- package/skills/_tests/specs/design-level.md +0 -113
- package/skills/_tests/specs/design-mechanic.md +0 -112
- package/skills/_tests/specs/design-npc.md +0 -143
- package/skills/_tests/specs/export-and-ship.md +0 -114
- package/skills/_tests/specs/fps-controller.md +0 -113
- package/skills/_tests/specs/gdscript-patterns.md +0 -19
- package/skills/_tests/specs/host-authoritative-state.md +0 -104
- package/skills/_tests/specs/make-game.md +0 -19
- package/skills/_tests/specs/peer-to-peer-multiplayer.md +0 -99
- package/skills/_tests/specs/play.md +0 -88
- package/skills/_tests/specs/scene-composition.md +0 -19
- package/skills/_tests/specs/setup-multiplayer.md +0 -106
- package/skills/_tests/specs/tune-performance.md +0 -104
- package/skills/_tests/specs/ui-basics.md +0 -19
- package/skills/_tests/specs/vfx.md +0 -116
- package/skills/catalog.yaml +0 -991
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: debugging-game-feel
|
|
3
|
+
description: Use when a gameplay feature works correctly but feels wrong — floaty jumps, mushy combat, sluggish camera, weightless impacts. Different from logical bug debugging; the bug is subjective and lives in tuning, timing, and feedback layers.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Debugging Game Feel
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
"Works but feels wrong" is its own debugging discipline. The code is correct. No diagnostic flags it. The unit tests pass. And yet the jump is floaty, the sword has no weight, the camera lags the player, the dash is unsatisfying.
|
|
11
|
+
|
|
12
|
+
**Core principle:** Game-feel bugs are tuning bugs, not logic bugs. Treat them with discipline — isolate one variable, compare to a reference, measure what you can, feel what you can't.
|
|
13
|
+
|
|
14
|
+
This skill is for the diagnostic phase. The polish-and-juice layer (screen shake, hit-stop, particles, sound design) is `summer:visual-effects/game-feel` — go there once you've identified WHICH variable is wrong.
|
|
15
|
+
|
|
16
|
+
## When To Use
|
|
17
|
+
|
|
18
|
+
- The user says: "feels floaty", "feels mushy", "feels off", "feels sluggish", "doesn't feel right", "lacks impact", "lacks weight", "doesn't feel satisfying".
|
|
19
|
+
- The feature passes `summer:playtesting-a-feature` (no errors, golden path runs) but still doesn't feel right.
|
|
20
|
+
- You're tuning movement, combat, camera, or any interaction with frame-level timing.
|
|
21
|
+
|
|
22
|
+
## When NOT To Use
|
|
23
|
+
|
|
24
|
+
- The feature has a **concrete reproducible bug** — go to `summer:investigating-bugs`.
|
|
25
|
+
- The feature **crashes or throws** — go to `summer:debug`.
|
|
26
|
+
- The feature **hasn't been built yet** — design it via `summer:brainstorming` first.
|
|
27
|
+
|
|
28
|
+
## The Iron Law
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
ONE VARIABLE AT A TIME. ALWAYS.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Game-feel debugging is the place where engineers most often violate this rule, because each variable is a small tweak. "Let me bump acceleration AND friction AND max speed all together" produces a result you cannot reason about. You learn nothing. The bug returns.
|
|
35
|
+
|
|
36
|
+
## The Loop
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
Anchor → Isolate → Tweak one variable → Compare → Decide → Repeat
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 1. Anchor: name the reference
|
|
43
|
+
|
|
44
|
+
Before touching any value, decide what "right" feels like. Game feel is subjective; without an anchor, you are debugging air.
|
|
45
|
+
|
|
46
|
+
Two ways to anchor:
|
|
47
|
+
|
|
48
|
+
| Anchor type | When to use | Example |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| **Reference game footage** | The user has a target in mind (Hollow Knight jumps, Dark Souls weight, Hades dashes) | "Match the Hollow Knight jump arc — peak in ~0.25s, fall ~0.35s, terminal velocity around frame 30" |
|
|
51
|
+
| **Internal known-good** | An older build / a sibling feature in the same game already feels right | "The pistol fires snappy. Make the rifle feel as snappy as the pistol minus the recovery frames." |
|
|
52
|
+
|
|
53
|
+
Write the anchor down in one sentence. If the user can't articulate it, ask. "What game does this remind you of when it's working?" is a fast way to extract the reference.
|
|
54
|
+
|
|
55
|
+
### 2. Isolate: name the suspect variable
|
|
56
|
+
|
|
57
|
+
Game-feel bugs almost always live in one of a small set of axes. Pick the most likely one first.
|
|
58
|
+
|
|
59
|
+
| Domain | Common suspect variables |
|
|
60
|
+
|---|---|
|
|
61
|
+
| Jump | gravity, jump velocity, terminal velocity, coyote-time window, jump-buffer window, variable-jump cutoff, apex hang time |
|
|
62
|
+
| Run | acceleration, max speed, friction (ground vs air), deceleration on input release, turn-around speed |
|
|
63
|
+
| Combat hit | hit-stop duration (attacker), hit-stop duration (target), screen shake amplitude + duration, knockback velocity + decay, recovery frames |
|
|
64
|
+
| Camera | follow lag (lerp factor or spring stiffness), lookahead distance, deadzone size, snap-vs-smooth on direction change |
|
|
65
|
+
| Dash | distance, duration, ease curve, cooldown, i-frame window, end-lag |
|
|
66
|
+
| UI feedback | input-to-response frame count, tween duration, easing function, sound onset delay |
|
|
67
|
+
|
|
68
|
+
If you cannot pick one suspect: state the top two, pick the one you think is most likely (say which), tweak it, see if it moved the feel. Do not tweak both.
|
|
69
|
+
|
|
70
|
+
### 3. Tweak one variable
|
|
71
|
+
|
|
72
|
+
- Read the current value via `summer_inspect_node` or open the relevant `.tres` / `.gd` file.
|
|
73
|
+
- Change ONE value. Save.
|
|
74
|
+
- Trigger `summer_play` and walk the feature.
|
|
75
|
+
- Ask: did the feel move toward or away from the anchor?
|
|
76
|
+
|
|
77
|
+
### 4. Compare
|
|
78
|
+
|
|
79
|
+
Two compare modes:
|
|
80
|
+
|
|
81
|
+
**Feel:** subjective. The user (or you, if you have eyes on the screen) reports "warmer" or "colder." This is fine. Most game-feel work is felt, not measured.
|
|
82
|
+
|
|
83
|
+
**Measure:** objective. When the feel is ambiguous, drop down to frame counts.
|
|
84
|
+
|
|
85
|
+
| Question | Measurement |
|
|
86
|
+
|---|---|
|
|
87
|
+
| "Does the jump peak too fast?" | `print` the y-velocity in `_physics_process`, count frames from launch to peak |
|
|
88
|
+
| "Is the camera too laggy?" | `print` `camera.global_position - target.global_position` per frame |
|
|
89
|
+
| "Is the input dead?" | Log input event frame and resulting state-machine transition frame; subtract |
|
|
90
|
+
| "Is the hit-stop too short?" | Log frame at hit + frame at unfreeze |
|
|
91
|
+
|
|
92
|
+
The point of measurement is to ground the conversation in numbers when "feels off" stops being useful. You do not need to measure most tweaks — only the ambiguous ones.
|
|
93
|
+
|
|
94
|
+
### 5. Decide
|
|
95
|
+
|
|
96
|
+
After the tweak:
|
|
97
|
+
|
|
98
|
+
- **Felt closer to the anchor** → commit the change, move to the next suspect variable if the feel still isn't right.
|
|
99
|
+
- **Felt further** → revert the change, pick a different suspect variable.
|
|
100
|
+
- **No change in feel** → revert the change, you tweaked the wrong variable.
|
|
101
|
+
|
|
102
|
+
Never leave a tweak in the codebase that you couldn't tell did anything. It will compound with the next tweak and you will lose the thread.
|
|
103
|
+
|
|
104
|
+
## The Compounding Tweaks Trap
|
|
105
|
+
|
|
106
|
+
The most common failure mode in game-feel work:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
Jump feels floaty.
|
|
110
|
+
Bump gravity from 980 → 1200. Still floaty.
|
|
111
|
+
Bump it to 1500. A bit better.
|
|
112
|
+
Also reduce jump velocity from 500 → 450.
|
|
113
|
+
Also tweak terminal velocity 1500 → 2000.
|
|
114
|
+
Also add a 3-frame coyote window because why not.
|
|
115
|
+
Now it feels... different. But the dash that used to feel great no longer does.
|
|
116
|
+
Try to undo? You don't remember the starting point.
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Antidote:**
|
|
120
|
+
|
|
121
|
+
1. Note the starting values before you begin.
|
|
122
|
+
2. One variable at a time.
|
|
123
|
+
3. After every tweak, ask: anchor closer or farther? If unsure, revert.
|
|
124
|
+
4. Commit small revertible changes — one variable per commit during a feel-tuning session. Easy to bisect.
|
|
125
|
+
|
|
126
|
+
## Feel Principles (Briefly)
|
|
127
|
+
|
|
128
|
+
Game feel rests on three small ideas. Most "feels wrong" bugs trace to one of these being undertuned:
|
|
129
|
+
|
|
130
|
+
| Principle | What it means | What it looks like when broken |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| **Anticipation** | A small wind-up before a big action | Sword swings feel like they "appear" instead of being thrown |
|
|
133
|
+
| **Follow-through** | The action continues past the input | Player snaps to a stop on input release — feels robotic |
|
|
134
|
+
| **Weight** | Visible cost to changing direction or stopping | Player turns on a dime at full speed — feels weightless |
|
|
135
|
+
|
|
136
|
+
These are diagnostic tools, not lecture material. When the user says "feels weightless," your suspect-variable shortlist is: deceleration on input release, friction, turn-around speed, animation cross-fade time.
|
|
137
|
+
|
|
138
|
+
## Red Flags — STOP
|
|
139
|
+
|
|
140
|
+
| Red flag | Reality |
|
|
141
|
+
|---|---|
|
|
142
|
+
| Tweaking 2+ variables in one play session without reverting between | You will lose the signal. |
|
|
143
|
+
| "Let me just feel it out without an anchor" | You will tune in circles. Name the reference. |
|
|
144
|
+
| "The user said floaty so I'm jacking gravity" | "Floaty" can also mean weak air control, slow terminal velocity, or too-long apex hang. Confirm before tweaking. |
|
|
145
|
+
| Skipping the play step ("I'll just bump the number and trust the feel") | Game feel is felt, not predicted. Play every tweak. |
|
|
146
|
+
| Adding "while I'm here" tweaks to unrelated features | Game feel debugging is a focused activity. Stay on the one feature. |
|
|
147
|
+
| Going to `summer:visual-effects/game-feel` before identifying the broken variable | Juice on top of a broken tuning makes the bug louder. Fix tuning first. |
|
|
148
|
+
| Spending >30 minutes on one variable without progress | The anchor is wrong, or the variable is wrong. Step back, re-anchor. |
|
|
149
|
+
|
|
150
|
+
## Rationalization Prevention
|
|
151
|
+
|
|
152
|
+
| Excuse | Reality |
|
|
153
|
+
|---|---|
|
|
154
|
+
| "It's subjective — I'll just iterate fast" | Fast iteration without isolation is thrashing, not iteration. |
|
|
155
|
+
| "I know game feel, I don't need an anchor" | Even pros anchor. Especially pros anchor. |
|
|
156
|
+
| "Two variables are coupled, I have to tune them together" | Then tune one, ship that delta, tune the other separately. |
|
|
157
|
+
| "The user can't articulate the anchor" | "What game does this remind you of when it works?" — one question, anchor obtained. |
|
|
158
|
+
| "Adding juice will hide the bad tuning" | It won't. It amplifies it. |
|
|
159
|
+
|
|
160
|
+
## When To Escalate
|
|
161
|
+
|
|
162
|
+
After diagnosis pins down which variable(s) are wrong, the tuning is done — but the feature may still want polish. Hand off to:
|
|
163
|
+
|
|
164
|
+
- `summer:visual-effects/game-feel` — for the screen-shake, hit-stop, particle, sound layer once tuning is locked.
|
|
165
|
+
- `summer:debug` — if mid-debug you discover an actual error (signal not firing, node freed) hiding under the feel issue.
|
|
166
|
+
|
|
167
|
+
## The Bottom Line
|
|
168
|
+
|
|
169
|
+
Feel bugs are tuning bugs. Tuning is a one-variable-at-a-time discipline. Anchor to a reference. Tweak one number. Play it. Decide. Repeat.
|
|
170
|
+
|
|
171
|
+
**Related skills:**
|
|
172
|
+
- `summer:investigating-bugs` — for logical bugs with concrete repros, not feel.
|
|
173
|
+
- `summer:playtesting-a-feature` — the playtest discipline this skill plugs into.
|
|
174
|
+
- `summer:debug` — when the feel investigation surfaces an actual error.
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: diagnosing-perf-regressions
|
|
3
|
+
description: Use when frame rate, frame time, or load time has gotten worse since a known-good state — "it used to run at 60, now it's at 30." Focused on finding the cause of a regression, not general performance tuning.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Diagnosing Performance Regressions
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
There is a difference between "this game is slow" and "this game got slow." This skill is for the second one.
|
|
11
|
+
|
|
12
|
+
**Core principle:** A regression has a cause. The cause is a specific change. Bisect to find the change, then root-cause from there.
|
|
13
|
+
|
|
14
|
+
This skill is **not** general performance tuning. If the game has always run at 30fps and you want to push it to 60, that is `summer:tune-performance` (the domain skill for budget-driven optimization). This skill is the diagnostic — what broke, where, when.
|
|
15
|
+
|
|
16
|
+
## When To Use
|
|
17
|
+
|
|
18
|
+
- "It used to run at 60fps, now it's at 30."
|
|
19
|
+
- "Load time was 3s yesterday, now it's 15s."
|
|
20
|
+
- "Frame stutters started after I added X."
|
|
21
|
+
- "Build went from buttery to choppy and I don't know why."
|
|
22
|
+
|
|
23
|
+
## When NOT To Use
|
|
24
|
+
|
|
25
|
+
- "The game has always been slow, help me speed it up." → `summer:tune-performance`.
|
|
26
|
+
- "I want to know if my game is fast enough to ship." → `summer:tune-performance`.
|
|
27
|
+
- "The game crashes." → `summer:debug`.
|
|
28
|
+
|
|
29
|
+
## The Iron Law
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
NO PERF FIX WITHOUT A KNOWN-GOOD vs KNOWN-BAD MEASUREMENT
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
You cannot fix a regression you have not measured. Eyeballing "feels laggy" is not a measurement. Get a number for the good state and a number for the bad state before touching code.
|
|
36
|
+
|
|
37
|
+
## The Loop
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Measure now → Find last good → Bisect changes → Match to a cliff → A/B fix → Re-measure
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 1. Measure now
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
summer_play (on the scene that's slow)
|
|
47
|
+
── wait 5-10 seconds of normal play ──
|
|
48
|
+
summer_get_diagnostics
|
|
49
|
+
summer_get_console
|
|
50
|
+
summer_stop
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
What to capture:
|
|
54
|
+
|
|
55
|
+
| Metric | Source | Why |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| Avg FPS / frame time | `summer_get_diagnostics` or in-game perf monitor | Headline number |
|
|
58
|
+
| Spike pattern | `summer_get_console` if user has frame-time prints, else in-game monitor | Steady 30 vs intermittent stutters → different causes |
|
|
59
|
+
| Scene complexity | `summer_get_scene_tree` (root counts) | Establishes baseline for instance/body count cliffs |
|
|
60
|
+
|
|
61
|
+
Write the bad-state number down. "Scene `Level3` runs at 31fps avg, drops to 12fps when 5+ enemies are on screen."
|
|
62
|
+
|
|
63
|
+
### 2. Find the last known-good state
|
|
64
|
+
|
|
65
|
+
Ask the user: when did it last run well? Then go to the VCS:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
git log --oneline --since="<last good date>" --until="now"
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
If they can name a commit ("it was fine on Monday's build"), check that out and measure it the same way. You now have:
|
|
72
|
+
|
|
73
|
+
- Known good: commit X, scene `Level3`, 60fps avg.
|
|
74
|
+
- Known bad: HEAD, scene `Level3`, 31fps avg.
|
|
75
|
+
|
|
76
|
+
If they can't name a date: ask for the rough window, list the commits, ask which ones are likely candidates. Do not bisect blind across 200 commits.
|
|
77
|
+
|
|
78
|
+
### 3. Bisect the changes
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
git log --oneline <last-good>..HEAD
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Read the list. Group commits into suspects:
|
|
85
|
+
|
|
86
|
+
| Likely culprit | Why |
|
|
87
|
+
|---|---|
|
|
88
|
+
| Big asset imports (.glb, textures, audio) | GPU memory, draw-call count |
|
|
89
|
+
| New shaders or material changes | Compilation stalls, overdraw, pipeline switches |
|
|
90
|
+
| Scene additions (enemies, props, lights) | Physics-body count, instance count, light count |
|
|
91
|
+
| `_process` / `_physics_process` additions | CPU per-frame cost |
|
|
92
|
+
| Signal connections in tight loops | Hidden per-frame cost |
|
|
93
|
+
| Particle systems | GPU + CPU |
|
|
94
|
+
| `@tool` scripts running in editor | Misleading editor FPS |
|
|
95
|
+
| Resource preload changes | First-use stalls |
|
|
96
|
+
|
|
97
|
+
If a single commit is the obvious suspect (e.g. "Added 200 enemies to spawner"), test it first. Otherwise actually `git bisect` — check out the midpoint, measure FPS, repeat. Don't theorize through it; the bisect is fast and definitive.
|
|
98
|
+
|
|
99
|
+
### 4. Match to one of the four Godot perf cliffs
|
|
100
|
+
|
|
101
|
+
Godot 4.x regressions cluster heavily into four categories. Knowing them shortens diagnosis to minutes.
|
|
102
|
+
|
|
103
|
+
| Cliff | Symptom | How to verify | Common cause |
|
|
104
|
+
|---|---|---|---|
|
|
105
|
+
| **Too many physics bodies** | FPS scales inversely with on-screen actor count, no GPU pressure | Count active `CharacterBody`/`RigidBody`/`Area` nodes; FPS doubles when half are queue_freed | Spawner with no upper cap; bullets/particles using physics bodies; collision layers too broad |
|
|
106
|
+
| **Shader compilation stalls** | First-frame or first-effect-fire stutter, then smooth; only on shipped builds, not editor | Frame-time spike on first cast/shot; clean after; `OS.has_feature("editor")` differences | New shader added; `unique` material not pre-warmed; pipeline cache not built |
|
|
107
|
+
| **GPU instance count / draw calls** | Steady low FPS, scales with what's on screen, no CPU pressure | RenderingServer perf monitors show high draw call count; FPS recovers when camera looks away | Forgot to enable MultiMeshInstance; unique materials per instance breaking instancing; too-detailed LOD0 |
|
|
108
|
+
| **Transparent overdraw** | FPS tanks when looking at smoke, fire, foliage, glass — fine otherwise | Look at the offending region, FPS drops; look away, recovers | New particle effect with large quads; transparent UI over the viewport; fog/volumetrics |
|
|
109
|
+
|
|
110
|
+
If the bad-state symptom matches one row, you have your hypothesis. Verify by reverting just the change you suspect and re-measuring.
|
|
111
|
+
|
|
112
|
+
### 5. A/B with one variable
|
|
113
|
+
|
|
114
|
+
This is the most violated step. Discipline:
|
|
115
|
+
|
|
116
|
+
- **Revert one suspect commit** (or stub the suspect feature behind a flag).
|
|
117
|
+
- Rebuild / reload the scene.
|
|
118
|
+
- Measure FPS the same way you did in step 1.
|
|
119
|
+
- Compare to known-bad. Did it recover?
|
|
120
|
+
|
|
121
|
+
If yes → root cause confirmed. Now decide: fix the change, or accept the perf cost.
|
|
122
|
+
If no → that wasn't it. Restore. Try the next suspect.
|
|
123
|
+
|
|
124
|
+
**Never** revert multiple changes at once during diagnosis. You will not know which one was the cause, and the bug will return on the next merge.
|
|
125
|
+
|
|
126
|
+
### 6. Re-measure after the fix
|
|
127
|
+
|
|
128
|
+
The fix is not done until the same measurement that found the regression returns the good number. Same scene, same play duration, same warm-up.
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
summer_clear_console
|
|
132
|
+
summer_play
|
|
133
|
+
── 5-10 seconds of play ──
|
|
134
|
+
summer_get_diagnostics
|
|
135
|
+
summer_stop
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
State the result with the number: "Reverted the per-frame `get_tree().get_nodes_in_group()` call in `enemy_manager.gd`. Level3 back to 58fps avg." Not "should be faster now."
|
|
139
|
+
|
|
140
|
+
## When To Escalate
|
|
141
|
+
|
|
142
|
+
| Situation | Go to |
|
|
143
|
+
|---|---|
|
|
144
|
+
| Regression confirmed and root cause known, but the fix is "make the feature cheaper" rather than "undo the change" | `summer:tune-performance` for the optimization pass |
|
|
145
|
+
| The regression turns out to be a crash or error in disguise (the slow path is throwing exceptions in a tight loop) | `summer:debug` |
|
|
146
|
+
| The cause is a Godot version change or engine-side regression | Surface to the user; this is not a project-side fix |
|
|
147
|
+
| Bisect lands on a commit that touches 40 files | Subdivide the commit: check out the commit, revert subsets, re-measure |
|
|
148
|
+
|
|
149
|
+
## Red Flags — STOP
|
|
150
|
+
|
|
151
|
+
| Red flag | Reality |
|
|
152
|
+
|---|---|
|
|
153
|
+
| "Just optimize the whole scene" | That's tuning, not regression diagnosis. Find what changed first. |
|
|
154
|
+
| Reverting 3 commits at once to "see if it helps" | You learn nothing. Revert one. |
|
|
155
|
+
| Eyeballing "feels slow" without measuring | You will optimize the wrong thing. Get a number. |
|
|
156
|
+
| Skipping the known-good measurement | Without a baseline, you don't know when you're done. |
|
|
157
|
+
| Reading the slow scene's code top-to-bottom looking for inefficiency | The regression is in what changed, not in what was already there. |
|
|
158
|
+
| Adding caching / pooling / LOD before identifying the cause | These are tuning moves. They can hide the regression instead of fixing it. |
|
|
159
|
+
| Trusting editor FPS as ground truth | Editor runs `@tool` scripts, debug overlays, and a different render pipeline. Measure in a built or `--game` run when possible. |
|
|
160
|
+
| "Maybe it's just a Tuesday thing" | Performance does not regress randomly. There is a cause. |
|
|
161
|
+
|
|
162
|
+
## Rationalization Prevention
|
|
163
|
+
|
|
164
|
+
| Excuse | Reality |
|
|
165
|
+
|---|---|
|
|
166
|
+
| "User wants it fixed now, no time to bisect" | Bisect is 5-15 minutes. Blind optimization can burn a day. |
|
|
167
|
+
| "The slow commit is obvious, no need to A/B" | The "obvious" cause is wrong ~30% of the time. Verify before fixing. |
|
|
168
|
+
| "I'll measure after I fix it" | If you don't have the bad number, you can't prove the fix worked. |
|
|
169
|
+
| "It's probably just Godot" | Engine-side regressions exist but are rare. Suspect your project first. |
|
|
170
|
+
| "Adding a pool / LOD / cache will help anyway" | Premature optimization on the wrong system is wasted work. |
|
|
171
|
+
|
|
172
|
+
## When The Engine Isn't Running
|
|
173
|
+
|
|
174
|
+
If `summer_play` is unavailable:
|
|
175
|
+
|
|
176
|
+
1. Ask the user for an in-game perf overlay screenshot (FPS, frame time, draw call count).
|
|
177
|
+
2. Walk the bisect logically with them: "Run on commit X, tell me the FPS. Run on commit Y, tell me the FPS."
|
|
178
|
+
3. Do not claim a fix is verified from code reading alone.
|
|
179
|
+
|
|
180
|
+
## The Bottom Line
|
|
181
|
+
|
|
182
|
+
A regression is a delta. Diagnose the delta, not the codebase.
|
|
183
|
+
|
|
184
|
+
Measure now. Measure last-good. Bisect what changed. Match to a Godot perf cliff. A/B one variable. Re-measure. Done.
|
|
185
|
+
|
|
186
|
+
**Related skills:**
|
|
187
|
+
- `summer:tune-performance` — for general optimization once the regression is fixed or when no regression exists.
|
|
188
|
+
- `summer:investigating-bugs` — when the slow path turns out to be a logic bug (errors in a tight loop).
|
|
189
|
+
- `summer:debug` — when the perf issue is actually a crash or freeze.
|
|
190
|
+
- `summer:verification-before-completion` — to claim the fix worked, with numbers.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dispatching-parallel-agents
|
|
3
|
+
description: Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Dispatching Parallel Agents
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
You delegate tasks to specialized agents with isolated context. By precisely crafting their instructions and context, you ensure they stay focused and succeed at their task. They should never inherit your session's context or history — you construct exactly what they need. This also preserves your own context for coordination work.
|
|
11
|
+
|
|
12
|
+
When you have multiple unrelated failures (different test files, different subsystems, different bugs), investigating them sequentially wastes time. Each investigation is independent and can happen in parallel.
|
|
13
|
+
|
|
14
|
+
**Core principle:** Dispatch one agent per independent problem domain. Let them work concurrently.
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
|
|
18
|
+
```dot
|
|
19
|
+
digraph when_to_use {
|
|
20
|
+
"Multiple failures?" [shape=diamond];
|
|
21
|
+
"Are they independent?" [shape=diamond];
|
|
22
|
+
"Single agent investigates all" [shape=box];
|
|
23
|
+
"One agent per problem domain" [shape=box];
|
|
24
|
+
"Can they work in parallel?" [shape=diamond];
|
|
25
|
+
"Sequential agents" [shape=box];
|
|
26
|
+
"Parallel dispatch" [shape=box];
|
|
27
|
+
|
|
28
|
+
"Multiple failures?" -> "Are they independent?" [label="yes"];
|
|
29
|
+
"Are they independent?" -> "Single agent investigates all" [label="no - related"];
|
|
30
|
+
"Are they independent?" -> "Can they work in parallel?" [label="yes"];
|
|
31
|
+
"Can they work in parallel?" -> "Parallel dispatch" [label="yes"];
|
|
32
|
+
"Can they work in parallel?" -> "Sequential agents" [label="no - shared state"];
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Use when:**
|
|
37
|
+
- 3+ test files failing with different root causes
|
|
38
|
+
- Multiple subsystems broken independently
|
|
39
|
+
- Each problem can be understood without context from others
|
|
40
|
+
- No shared state between investigations
|
|
41
|
+
|
|
42
|
+
**Don't use when:**
|
|
43
|
+
- Failures are related (fix one might fix others)
|
|
44
|
+
- Need to understand full system state
|
|
45
|
+
- Agents would interfere with each other
|
|
46
|
+
|
|
47
|
+
## The Pattern
|
|
48
|
+
|
|
49
|
+
### 1. Identify Independent Domains
|
|
50
|
+
|
|
51
|
+
Group failures by what's broken:
|
|
52
|
+
- File A tests: Tool approval flow
|
|
53
|
+
- File B tests: Batch completion behavior
|
|
54
|
+
- File C tests: Abort functionality
|
|
55
|
+
|
|
56
|
+
Each domain is independent - fixing tool approval doesn't affect abort tests.
|
|
57
|
+
|
|
58
|
+
### 2. Create Focused Agent Tasks
|
|
59
|
+
|
|
60
|
+
Each agent gets:
|
|
61
|
+
- **Specific scope:** One test file or subsystem
|
|
62
|
+
- **Clear goal:** Make these tests pass
|
|
63
|
+
- **Constraints:** Don't change other code
|
|
64
|
+
- **Expected output:** Summary of what you found and fixed
|
|
65
|
+
|
|
66
|
+
### 3. Dispatch in Parallel
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// In Claude Code / AI environment
|
|
70
|
+
Task("Fix agent-tool-abort.test.ts failures")
|
|
71
|
+
Task("Fix batch-completion-behavior.test.ts failures")
|
|
72
|
+
Task("Fix tool-approval-race-conditions.test.ts failures")
|
|
73
|
+
// All three run concurrently
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 4. Review and Integrate
|
|
77
|
+
|
|
78
|
+
When agents return:
|
|
79
|
+
- Read each summary
|
|
80
|
+
- Verify fixes don't conflict
|
|
81
|
+
- Run full test suite
|
|
82
|
+
- Integrate all changes
|
|
83
|
+
|
|
84
|
+
## Agent Prompt Structure
|
|
85
|
+
|
|
86
|
+
Good agent prompts are:
|
|
87
|
+
1. **Focused** - One clear problem domain
|
|
88
|
+
2. **Self-contained** - All context needed to understand the problem
|
|
89
|
+
3. **Specific about output** - What should the agent return?
|
|
90
|
+
|
|
91
|
+
```markdown
|
|
92
|
+
Fix the 3 failing tests in src/agents/agent-tool-abort.test.ts:
|
|
93
|
+
|
|
94
|
+
1. "should abort tool with partial output capture" - expects 'interrupted at' in message
|
|
95
|
+
2. "should handle mixed completed and aborted tools" - fast tool aborted instead of completed
|
|
96
|
+
3. "should properly track pendingToolCount" - expects 3 results but gets 0
|
|
97
|
+
|
|
98
|
+
These are timing/race condition issues. Your task:
|
|
99
|
+
|
|
100
|
+
1. Read the test file and understand what each test verifies
|
|
101
|
+
2. Identify root cause - timing issues or actual bugs?
|
|
102
|
+
3. Fix by:
|
|
103
|
+
- Replacing arbitrary timeouts with event-based waiting
|
|
104
|
+
- Fixing bugs in abort implementation if found
|
|
105
|
+
- Adjusting test expectations if testing changed behavior
|
|
106
|
+
|
|
107
|
+
Do NOT just increase timeouts - find the real issue.
|
|
108
|
+
|
|
109
|
+
Return: Summary of what you found and what you fixed.
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Common Mistakes
|
|
113
|
+
|
|
114
|
+
**❌ Too broad:** "Fix all the tests" - agent gets lost
|
|
115
|
+
**✅ Specific:** "Fix agent-tool-abort.test.ts" - focused scope
|
|
116
|
+
|
|
117
|
+
**❌ No context:** "Fix the race condition" - agent doesn't know where
|
|
118
|
+
**✅ Context:** Paste the error messages and test names
|
|
119
|
+
|
|
120
|
+
**❌ No constraints:** Agent might refactor everything
|
|
121
|
+
**✅ Constraints:** "Do NOT change production code" or "Fix tests only"
|
|
122
|
+
|
|
123
|
+
**❌ Vague output:** "Fix it" - you don't know what changed
|
|
124
|
+
**✅ Specific:** "Return summary of root cause and changes"
|
|
125
|
+
|
|
126
|
+
## When NOT to Use
|
|
127
|
+
|
|
128
|
+
**Related failures:** Fixing one might fix others - investigate together first
|
|
129
|
+
**Need full context:** Understanding requires seeing entire system
|
|
130
|
+
**Exploratory debugging:** You don't know what's broken yet
|
|
131
|
+
**Shared state:** Agents would interfere (editing same files, using same resources)
|
|
132
|
+
|
|
133
|
+
## Real Example from Session
|
|
134
|
+
|
|
135
|
+
**Scenario:** 6 test failures across 3 files after major refactoring
|
|
136
|
+
|
|
137
|
+
**Failures:**
|
|
138
|
+
- agent-tool-abort.test.ts: 3 failures (timing issues)
|
|
139
|
+
- batch-completion-behavior.test.ts: 2 failures (tools not executing)
|
|
140
|
+
- tool-approval-race-conditions.test.ts: 1 failure (execution count = 0)
|
|
141
|
+
|
|
142
|
+
**Decision:** Independent domains - abort logic separate from batch completion separate from race conditions
|
|
143
|
+
|
|
144
|
+
**Dispatch:**
|
|
145
|
+
```
|
|
146
|
+
Agent 1 → Fix agent-tool-abort.test.ts
|
|
147
|
+
Agent 2 → Fix batch-completion-behavior.test.ts
|
|
148
|
+
Agent 3 → Fix tool-approval-race-conditions.test.ts
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Results:**
|
|
152
|
+
- Agent 1: Replaced timeouts with event-based waiting
|
|
153
|
+
- Agent 2: Fixed event structure bug (threadId in wrong place)
|
|
154
|
+
- Agent 3: Added wait for async tool execution to complete
|
|
155
|
+
|
|
156
|
+
**Integration:** All fixes independent, no conflicts, full suite green
|
|
157
|
+
|
|
158
|
+
**Time saved:** 3 problems solved in parallel vs sequentially
|
|
159
|
+
|
|
160
|
+
## Key Benefits
|
|
161
|
+
|
|
162
|
+
1. **Parallelization** - Multiple investigations happen simultaneously
|
|
163
|
+
2. **Focus** - Each agent has narrow scope, less context to track
|
|
164
|
+
3. **Independence** - Agents don't interfere with each other
|
|
165
|
+
4. **Speed** - 3 problems solved in time of 1
|
|
166
|
+
|
|
167
|
+
## Verification
|
|
168
|
+
|
|
169
|
+
After agents return:
|
|
170
|
+
1. **Review each summary** - Understand what changed
|
|
171
|
+
2. **Check for conflicts** - Did agents edit same code?
|
|
172
|
+
3. **Run full suite** - Verify all fixes work together
|
|
173
|
+
4. **Spot check** - Agents can make systematic errors
|
|
174
|
+
|
|
175
|
+
## Real-World Impact
|
|
176
|
+
|
|
177
|
+
From debugging session (2025-10-03):
|
|
178
|
+
- 6 failures across 3 files
|
|
179
|
+
- 3 agents dispatched in parallel
|
|
180
|
+
- All investigations completed concurrently
|
|
181
|
+
- All fixes integrated successfully
|
|
182
|
+
- Zero conflicts between agent changes
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gameskill
|
|
3
|
+
description: Use when finishing a game-development session and you want to capture what you just learned into Summer's canonical skill library so the next session and every Summer user start smarter. Trigger on "gameskill", "/gameskill", "capture learnings", "save to skills".
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: workflow
|
|
7
|
+
allowed-tools: Read Write Edit Glob Grep Bash
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# /gameskill — Capture Session Learnings into the Skill Library
|
|
11
|
+
|
|
12
|
+
You're being invoked at the end (or middle) of a game-development session. Your job is to turn what you just figured out into a durable skill update so future agents and Summer users get to start where you ended.
|
|
13
|
+
|
|
14
|
+
This is the meta-skill: the loop that turns ad-hoc fixes into reusable expertise.
|
|
15
|
+
|
|
16
|
+
## What "Summer Engine" is, so you're grounded
|
|
17
|
+
|
|
18
|
+
Three repos, one ecosystem:
|
|
19
|
+
|
|
20
|
+
1. **SummerEngine repo** — the desktop engine (Godot fork in C++) plus the canonical CLI. Engine source: `editor/`, `core/`, and the Summer-specific module at `modules/1summer_engine/`. CLI source: `tools/summer-cli/`. The CLI ships as `npm i -g summer-engine`. It does install/login/create/run for the engine, plus `summer skills install --agent claude-code` which writes a curated subset of skills into `~/.claude/skills/` for any agent to auto-discover.
|
|
21
|
+
2. **PublicSummerEngine repo** — the web app at summerengine.com. Has its own AI skill stores at `src/lib/ai/skills/bundled/` and `public/knowledge/summer/skills/` for the in-browser chat agent. Also has its own consumers of the engine API in `src/lib/bridge/direct-executor.ts` and `src/lib/ai/tools/run-and-verify.ts` which call the same engine endpoints the CLI does.
|
|
22
|
+
3. **The active game project** — usually `~/development/<game-name>` (Godot 4.6) or whatever game you were just working on. Real working code in this repo is the gold standard for examples.
|
|
23
|
+
|
|
24
|
+
The skill system is the value flywheel. Every game shipped teaches lessons. Lessons become skills. Next user starts smarter. Your job here is to close that loop for what you just did.
|
|
25
|
+
|
|
26
|
+
## Cross-repo change awareness — read before any non-trivial fix
|
|
27
|
+
|
|
28
|
+
When the lesson is "the engine should expose more / behave differently," the change usually crosses repo boundaries. Map the layers before you edit:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
[active game] -> calls MCP / web app
|
|
32
|
+
v
|
|
33
|
+
[summer-cli MCP server (TypeScript)] -> calls /api/ops + /api/state/* on the engine
|
|
34
|
+
v
|
|
35
|
+
[Summer Engine binary (C++ in SummerEngine repo)] - source of truth for what the API returns
|
|
36
|
+
|
|
37
|
+
[PublicSummerEngine web app (TypeScript)] -> also calls the same engine endpoints via direct-executor or Redis bridge
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Implications:
|
|
41
|
+
|
|
42
|
+
- A C++ change in `SummerEngine/modules/1summer_engine/` or `SummerEngine/editor/` reaches everyone (CLI MCP, web app, future tools). Most powerful, also highest blast radius.
|
|
43
|
+
- A TypeScript change in `tools/summer-cli/src/mcp/` only changes what the CLI exposes. The web app has its own TypeScript layer at `PublicSummerEngine/src/lib/bridge/`. Same engine endpoints, different glue. Don't assume your CLI tool change is web-app-aware.
|
|
44
|
+
- A skill update in `tools/summer-cli/skills/` affects every agent that runs `summer skills install`. The web app's skill store is separate (`PublicSummerEngine/src/lib/ai/skills/bundled/`) and currently uses a different format (template wizards, not Markdown discipline guides). Don't try to mirror skills there blindly.
|
|
45
|
+
|
|
46
|
+
When you change an engine endpoint's response shape:
|
|
47
|
+
|
|
48
|
+
1. Grep both `tools/summer-cli/src/` and `PublicSummerEngine/src/lib/` for consumers of that endpoint.
|
|
49
|
+
2. Confirm the change is additive (new fields, no removed/renamed) so existing consumers still work without modification.
|
|
50
|
+
3. If the change is breaking, update both consumers in the same logical commit set.
|
|
51
|
+
4. Note in `tools/summer-cli/TOOLING-TODO.md` what's now possible that wasn't before.
|
|
52
|
+
|
|
53
|
+
Engine binary changes ship via a rebuild + new release. CLI/web TypeScript changes ship via npm publish or web deploy. State this delivery cost in your report so the user knows what they get today vs after a release.
|
|
54
|
+
|
|
55
|
+
## The four skill stores (probe each before doing anything)
|
|
56
|
+
|
|
57
|
+
1. **Canonical source** — `~/development/SummerEngine/tools/summer-cli/skills/`. Single source of truth. Domains: `ui-and-ux`, `gameplay-mechanics`, `character-controllers`, `scripting-patterns`, `visual-effects`, `debugging`, `rendering-and-lighting`, `scene-and-project`, `level-design`, `audio`, `ai-and-npcs`, `asset-pipeline`, `performance`, `deployment`, `multiplayer-and-networking`, plus `workflow` for process skills. The `skills:` array in `.claude-plugin/plugin.json` is the registry. Sibling references live at top-level `references/` and `tests/`.
|
|
58
|
+
2. **Claude auto-discovery** — `~/.claude/skills/`. Where `summer skills install --agent claude-code` writes copies. Auto-discovered by Claude Code in any session.
|
|
59
|
+
3. **Web-app stores** — `PublicSummerEngine/src/lib/ai/skills/bundled/` (template wizards, different format) and `PublicSummerEngine/public/knowledge/summer/skills/` (JSON knowledge files). Mirror only when the lesson genuinely fits their format. Most discipline-guide skills don't.
|
|
60
|
+
4. **The active game** — read it as ground truth. Working code from the real project beats invented examples.
|
|
61
|
+
|
|
62
|
+
## What to do, in order
|
|
63
|
+
|
|
64
|
+
1. One short sentence to the user. "Capturing learnings from this session into the skill library." That's it. No plan dump.
|
|
65
|
+
|
|
66
|
+
2. Probe the stores. Glob each path above. Note what exists and what's empty. Print a tight summary.
|
|
67
|
+
|
|
68
|
+
3. Recap the session. Look back over the conversation. Pull out learnings that are non-obvious AND general — things a future agent or user would benefit from but couldn't derive from reading the codebase. Examples that count:
|
|
69
|
+
- A working shader (the actual code) -> `visual-effects`
|
|
70
|
+
- A GDScript idiom that beat the obvious approach -> `scripting-patterns`
|
|
71
|
+
- A UI layout that survived the design pass -> `ui-and-ux`
|
|
72
|
+
- A bug + root cause + fix that wasn't in any docs -> `debugging`
|
|
73
|
+
- A Godot 4.x quirk (type inference, signal gotchas, plugin layer config) -> `scripting-patterns`
|
|
74
|
+
- A spawning/AI/enemy pattern that worked -> `ai-and-npcs` or `gameplay-mechanics`
|
|
75
|
+
- A perf fix with measured before/after -> `performance`
|
|
76
|
+
- An asset workflow that beat alternatives -> `asset-pipeline`
|
|
77
|
+
- An MCP gap that needed an engine-side fix -> `tools/summer-cli/TOOLING-TODO.md` AND the relevant skill
|
|
78
|
+
|
|
79
|
+
Examples that DON'T count: one-off code with no general lesson, things already documented in CLAUDE.md or an existing skill, personal preferences without reasoning, anything you have to manufacture to fill space.
|
|
80
|
+
|
|
81
|
+
4. Decide placement. For each learning:
|
|
82
|
+
- Update existing skill: name the file, quote the section, draft the addition.
|
|
83
|
+
- Create new skill: pick the domain, name the file, draft the full skill markdown.
|
|
84
|
+
Match the format of existing skills in the same domain exactly. Read one if you're unsure.
|
|
85
|
+
|
|
86
|
+
5. One tight pause for the user. Five-to-ten lines max: what files you'll touch, what each one captures, what gets left out. Wait for OK or redirect. Don't ask multiple questions.
|
|
87
|
+
|
|
88
|
+
6. Apply.
|
|
89
|
+
- Write/edit `.md` files under `tools/summer-cli/skills/<domain>/`.
|
|
90
|
+
- Register a new skill in `.claude-plugin/plugin.json` (and sibling `.codex-plugin/`, `.cursor-plugin/` manifests) AND in `src/lib/skills-registry.ts` `SKILL_REGISTRY` array. Both are required — `plugin-manifests.test.ts` fails the build if either is missing.
|
|
91
|
+
- If the skill belongs in the curated Claude set, also write it to `~/.claude/skills/<name>/` so it's live in the current session. Tell the user to consider adding it to the CLI's default install set.
|
|
92
|
+
- If the learning applies to the web chat agent, mirror to `PublicSummerEngine` skill stores too.
|
|
93
|
+
- Run `git status` in the SummerEngine repo (and `PublicSummerEngine` if touched) so the diff is visible.
|
|
94
|
+
|
|
95
|
+
7. Report. One short message. Files changed, the future-agent payoff in one sentence per skill, and what (if anything) is still uncaptured.
|
|
96
|
+
|
|
97
|
+
## Style rules
|
|
98
|
+
|
|
99
|
+
- Tight. No slop. No glazing.
|
|
100
|
+
- Capture the why, not just the what. "Use X" rots. "Use X because Y breaks under Z" survives. Always lead skill updates with the reason.
|
|
101
|
+
- Real working code from the active project beats invented examples. Lift from the active codebase.
|
|
102
|
+
- VFX is code. Shaders + GDScript + node setup. Never image-generation pipelines or Meshy prompts.
|
|
103
|
+
- No em dashes (—) in any user-facing copy you write into skills. Use periods or restructure.
|
|
104
|
+
- No date references inside skill bodies. Skills are timeless guidance. Dates belong in commit messages and changelogs, not in `.md` skill content.
|
|
105
|
+
- No specific game / project names inside skill bodies. Skills are universal. The same skill might be installed by a future user who never heard of your current project.
|
|
106
|
+
- `[SUMMER]` markers on core Godot engine file edits in C++ changes. Skill `.md` files don't need them.
|
|
107
|
+
- Verify before claiming. If a skill says "Summer Engine does X," verify in the actual code before writing it down.
|
|
108
|
+
|
|
109
|
+
## When there's nothing worth capturing
|
|
110
|
+
|
|
111
|
+
It's totally fine to come back with "session was tactical, no durable learnings worth a skill update." Don't manufacture skills from thin air. Better to ship nothing than ship noise.
|