summer-engine 1.4.0 → 2.0.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 (63) hide show
  1. package/.claude-plugin/plugin.json +18 -10
  2. package/.codex-plugin/plugin.json +36 -8
  3. package/.cursor-plugin/plugin.json +19 -11
  4. package/.opencode/INSTALL.md +69 -0
  5. package/.opencode/plugins/summer.js +9 -4
  6. package/CHANGELOG.md +31 -1
  7. package/README.md +268 -86
  8. package/dist/bin/summer.js +0 -0
  9. package/dist/commands/assets.d.ts +2 -0
  10. package/dist/commands/assets.js +189 -0
  11. package/dist/commands/create.js +55 -17
  12. package/dist/commands/debug.d.ts +2 -0
  13. package/dist/commands/debug.js +127 -0
  14. package/dist/commands/list.js +24 -5
  15. package/dist/commands/project.d.ts +2 -0
  16. package/dist/commands/project.js +170 -0
  17. package/dist/commands/scene.d.ts +2 -0
  18. package/dist/commands/scene.js +290 -0
  19. package/dist/lib/banner.js +2 -2
  20. package/dist/lib/log-filters.d.ts +53 -0
  21. package/dist/lib/log-filters.js +130 -0
  22. package/dist/lib/plugin-manifests.test.d.ts +1 -0
  23. package/dist/lib/plugin-manifests.test.js +134 -0
  24. package/dist/lib/remote-templates.d.ts +25 -0
  25. package/dist/lib/remote-templates.js +86 -0
  26. package/dist/lib/skills-registry.d.ts +33 -1
  27. package/dist/lib/skills-registry.js +56 -1
  28. package/dist/lib/telemetry.d.ts +13 -0
  29. package/dist/lib/telemetry.js +63 -0
  30. package/dist/lib/with-engine.d.ts +14 -0
  31. package/dist/lib/with-engine.js +109 -0
  32. package/dist/mcp/tools/asset-tools.js +12 -13
  33. package/dist/mcp/tools/debug-tools.js +32 -9
  34. package/dist/mcp/tools/with-engine.js +4 -0
  35. package/gemini-extension.json +2 -2
  36. package/hooks/pre-commit-doctor.sh +0 -0
  37. package/hooks/run-hook.cmd +0 -0
  38. package/hooks/session-start.sh +0 -0
  39. package/marketplace.json +2 -2
  40. package/package.json +3 -3
  41. package/skills/README.md +1 -1
  42. package/skills/_meta/skill-create/SKILL.md +1 -1
  43. package/skills/_meta/skill-improve/SKILL.md +1 -1
  44. package/skills/_meta/skill-test/SKILL.md +1 -1
  45. package/skills/_meta/using-summer/SKILL.md +130 -0
  46. package/skills/_tests/specs/design-npc.md +43 -12
  47. package/skills/_tests/specs/fps-controller.md +33 -20
  48. package/skills/_tests/specs/host-authoritative-state.md +104 -0
  49. package/skills/_tests/specs/vfx.md +56 -38
  50. package/skills/ai-and-npcs/design-npc/SKILL.md +264 -122
  51. package/skills/asset-pipeline/asset-strategy/SKILL.md +1 -1
  52. package/skills/catalog.yaml +21 -4
  53. package/skills/character-controllers/fps-controller/SKILL.md +260 -79
  54. package/skills/debugging/debug/SKILL.md +102 -82
  55. package/skills/multiplayer-and-networking/host-authoritative-state/SKILL.md +332 -0
  56. package/skills/rendering-and-lighting/3d-lighting/SKILL.md +1 -1
  57. package/skills/scene-and-project/browse-templates/SKILL.md +105 -0
  58. package/skills/scene-and-project/make-game/SKILL.md +159 -346
  59. package/skills/scene-and-project/new-project/SKILL.md +106 -0
  60. package/skills/scene-and-project/scene-composition/SKILL.md +1 -1
  61. package/skills/scripting-patterns/gdscript-patterns/SKILL.md +1 -1
  62. package/skills/ui-and-ux/ui-basics/SKILL.md +1 -1
  63. package/skills/visual-effects/vfx/SKILL.md +233 -134
@@ -1,452 +1,265 @@
1
1
  ---
2
2
  name: make-game
3
- description: End-to-end game creation workflow that orchestrates project setup, asset creation, scene building, scripting, and testing. Use when the user wants to build a complete game from scratch or says "make me a game". Trigger on "make a game", "build me a game", "create a new game".
3
+ description: Use when the user says "make me a game", "build me a game", "I want to make a [genre] game", "let's build something" — the orchestration spine that runs the full game-dev pipeline: brainstorm → plan → scaffold → build core mechanics → art direction → audio → polish/VFX → verify → ship. Delegates to specialist skills with explicit checkpoints between phases. Trigger on "make a game", "build me a game", "create a new game", "make me a game", "let's build a game", "I want to build [game shape]".
4
4
  license: MIT
5
- compatibility: [Cursor, Claude Code, Windsurf, Codex]
5
+ compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
6
6
  category: scene-and-project
7
- user-invocable: false
8
- allowed-tools: Read Grep Glob Write Edit summer_get_project_context summer_get_agent_playbook summer_create_scene summer_open_scene summer_save_scene summer_add_node summer_set_prop summer_set_resource_property summer_instantiate_scene summer_play summer_stop summer_get_diagnostics
9
- paths: ["**/*.gd", "**/*.tscn", "**/project.godot"]
7
+ user-invocable: true
8
+ allowed-tools: Read Edit Write Bash Skill summer_get_project_context summer_get_scene_tree summer_create_scene summer_add_node summer_set_prop summer_save_scene summer_play summer_stop summer_get_diagnostics summer_get_script_errors
9
+ paths: [".summer/**", "project.godot", "**/*.gd", "**/*.tscn"]
10
10
  ---
11
11
 
12
- # Make a Game with Summer Engine
12
+ # /make-game — The orchestration spine
13
13
 
14
- Step-by-step workflow for building a complete game. Follow phases 0-6 in order. Each phase must complete before moving to the next.
14
+ This is the skill that runs end-to-end when a user says "make me a game." It does **not** try to do everything itself. It runs the right specialist skills in the right order with explicit handoffs and a checkpoint between every phase.
15
15
 
16
- **Rule**: Scene operations (.tscn) use Summer MCP tools. Script files (.gd) use the host agent's normal file-editing tools. Never cross the streams.
16
+ **Core principle:** structure beats vibes. A guided pipeline that delegates to focused specialists produces a real game. Off-the-cuff "let me think about it" loops produce three half-finished prototypes. Follow the phases. Don't skip.
17
17
 
18
- ---
19
-
20
- ## Phase 0: Gather Requirements
21
-
22
- Before touching any tools, ask the user:
23
- 1. **What kind of game?** (platformer, FPS, top-down, puzzle, racing, etc.)
24
- 2. **2D or 3D?**
25
- 3. **Art style?** (realistic, low-poly, cartoon, pixel art)
26
- 4. **Core mechanic?** One sentence. ("player jumps between platforms collecting coins")
27
- 5. **Scope?** (1 level prototype, or multi-level)
18
+ ## When to use this skill
28
19
 
29
- Use this decision matrix:
20
+ - User says: "make me a game", "build me a game", "I want to make a [genre]", "let's build a game", "build me a [shape]".
21
+ - User has nothing yet and wants the full path from idea → playable.
22
+ - User has a vague idea and wants the agent to drive the whole arc.
30
23
 
31
- | Genre | Root Type | Camera | Player Body | Dimension |
32
- |-------|-----------|--------|-------------|-----------|
33
- | FPS | Node3D | Camera3D on player | CharacterBody3D | 3D |
34
- | Platformer 2D | Node2D | Camera2D following | CharacterBody2D | 2D |
35
- | Platformer 3D | Node3D | Camera3D following | CharacterBody3D | 3D |
36
- | Top-down | Node2D | Camera2D | CharacterBody2D | 2D |
37
- | Puzzle | Node2D or Control | Camera2D or none | varies | 2D |
38
- | Racing | Node3D | Camera3D behind car | VehicleBody3D | 3D |
39
-
40
- ---
24
+ ## When NOT to use this skill
41
25
 
42
- ## Phase 1: Project Bootstrap
26
+ - User has a specific narrow ask ("add jump", "fix this bug", "design the inventory") → use the specific skill, not this orchestrator.
27
+ - User already has a working scaffold and wants to iterate → start at the relevant phase below, don't re-run the whole pipeline.
28
+ - User says "I want to use a template" → run `summer:browse-templates` first; come back here only if they decide they want a custom build instead.
43
29
 
44
- ### 1a. Get context
30
+ ## The Pipeline
45
31
 
46
32
  ```
47
- summer_get_agent_playbook()
48
- summer_get_project_context()
33
+ Brainstorm → Plan → Scaffold → Build → Layer → Polish → Verify → Ship
34
+ │ │ │ │ │ │ │ │
35
+ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
36
+ brainstorm plan new-project build-loop art vfx play export
37
+ -game (this browse- (this skill) audio debug -and-
38
+ skill) templates ship
39
+
40
+ ↓
41
+ (one mechanic at a time:
42
+ design-mechanic + scene-composition
43
+ + gdscript-patterns + play check)
49
44
  ```
50
45
 
51
- If a scene is open: `summer_get_scene_tree()` to see what exists.
46
+ Run the phases in order. Between every phase, **stop and confirm with the user before continuing.** The user owns scope decisions; the agent owns execution discipline.
52
47
 
53
- ### 1b. Configure project
48
+ ## Phase 1: Brainstorm
54
49
 
55
- ```
56
- summer_project_setting(key="application/config/name", value="<game name>")
57
- summer_project_setting(key="display/window/size/viewport_width", value=1280)
58
- summer_project_setting(key="display/window/size/viewport_height", value=720)
59
- summer_project_setting(key="application/run/main_scene", value="res://scenes/main_level.tscn")
60
- ```
50
+ **Goal**: turn a vague idea into a 1-page brief.
61
51
 
62
- For 2D pixel art, add:
63
52
  ```
64
- summer_project_setting(key="rendering/textures/canvas_textures/default_texture_filter", value=0)
53
+ Skill: summer:brainstorm-game
65
54
  ```
66
55
 
67
- ### 1c. Create scenes
56
+ That skill asks one question, scopes mechanics, picks an art direction, and writes `.summer/GameSoul.md`. Don't skip this. **The brief is what every later phase reads.**
68
57
 
69
- ```
70
- summer_create_scene(path="res://scenes/main_level.tscn", rootName="World", allow_temporary_scene_mutation=true)
71
- summer_create_scene(path="res://scenes/player.tscn", rootName="Player", allow_temporary_scene_mutation=true)
72
- ```
58
+ If the user already has `.summer/GameSoul.md` (check via Read), skip the brainstorm and confirm:
73
59
 
74
- ### 1d. Folder conventions
60
+ > "Found `.summer/GameSoul.md` — should I build from this brief, or do you want to start over?"
75
61
 
76
- - `res://scenes/` -- .tscn files
77
- - `res://scripts/` -- .gd files
78
- - `res://assets/models/` -- 3D models
79
- - `res://assets/textures/` -- images, sprites
80
- - `res://assets/audio/` -- sounds, music
62
+ **Checkpoint before continuing:**
81
63
 
82
- ---
64
+ > "Brief saved at `.summer/GameSoul.md`. Want me to plan the build?"
83
65
 
84
- ## Phase 2: Asset Pipeline
66
+ ## Phase 2: Plan
85
67
 
86
- Pick the right strategy per asset. Prefer this order: Library > Generate > Primitives.
68
+ **Goal**: turn the brief into a concrete checklist of scenes, mechanics, and assets, in priority order.
87
69
 
88
- ### Strategy A: Asset Library (fastest, 25k+ free models)
70
+ This phase doesn't have a dedicated skill yet — do it inline. Read `.summer/GameSoul.md` and produce a plan with three sections:
89
71
 
90
- For environment props, furniture, nature, vehicles:
72
+ 1. **Core scenes** — main scene, level/menu scenes, prefabs the game needs
73
+ 2. **Core mechanics** — ranked, max 3 (the brief enforces this; respect it)
74
+ 3. **Cut list** — what's explicitly NOT in scope
91
75
 
92
- ```
93
- summer_search_assets(query="low-poly tree", assetType="3d_model", limit=5)
94
- summer_import_asset(query="wooden barrel", parent="./World/Props", assetType="3d_model")
95
- ```
76
+ Save the plan to `.summer/build-plan.md`. Format:
96
77
 
97
- ### Strategy B: AI Generation (custom assets)
78
+ ```markdown
79
+ # Build plan — <game name>
98
80
 
99
- **Images** (textures, sprites, UI art) -- sync, returns immediately:
100
- ```
101
- summer_generate_image(prompt="top-down grass tileset, seamless, 512x512", style="cartoon")
102
- ```
103
- Returns `localPath` -- use Read tool to show the user for approval.
104
- Then import:
105
- ```
106
- summer_import_from_url(url="<asset.fileUrl>", path="res://assets/textures/grass.png")
107
- ```
81
+ Source: .summer/GameSoul.md (date)
108
82
 
109
- **3D models** -- async, waits up to 5 min by default:
110
- ```
111
- summer_generate_3d(prompt="low-poly treasure chest with gold coins", kind="text-to-3d")
112
- ```
113
- Returns completed result directly. Then import the model URL.
83
+ ## Core scenes
84
+ - [ ] main.tscn — World + Player + Camera + Light + Floor
85
+ - [ ] level_01.tscn — first playable level
86
+ - [ ] hud.tscn — health, score
87
+ - [ ] (more)
114
88
 
115
- **Image-to-3D** -- generate concept art first, then convert:
116
- ```
117
- summer_generate_image(prompt="medieval sword, ornate handle, game asset, white background")
118
- # Show to user, get approval
119
- summer_generate_3d(kind="image-to-3d", imageUrl="<asset.fileUrl>")
120
- ```
89
+ ## Core mechanics (in build order)
90
+ 1. [ ] Movement (FPS / TPS / 2D platformer / etc.)
91
+ 2. [ ] Primary action (shoot / jump / interact)
92
+ 3. [ ] Win/lose state
121
93
 
122
- **Audio** -- sync:
123
- ```
124
- summer_generate_audio(capability="sound_effects", text="sword swing whoosh")
125
- summer_generate_audio(capability="music", prompt="upbeat adventure theme", durationSeconds=30)
126
- summer_generate_audio(capability="text_to_speech", text="Welcome, adventurer!", voiceId="<id>")
127
- ```
128
-
129
- **Parallel generation**: Start multiple 3D jobs with `wait=false`, work on scene setup, then check later:
130
- ```
131
- summer_generate_3d(prompt="...", wait=false) -> jobId: "abc"
132
- summer_generate_3d(prompt="...", wait=false) -> jobId: "def"
133
- # ... do scene work ...
134
- summer_check_job(jobId="abc")
135
- summer_check_job(jobId="def")
136
- ```
137
-
138
- ### Strategy C: Primitive Meshes (instant, offline)
139
-
140
- For prototyping or blocking out levels:
141
- ```
142
- summer_add_node(parent="./World", type="MeshInstance3D", name="Floor")
143
- summer_set_prop(path="./World/Floor", key="mesh", value="BoxMesh")
144
- summer_set_resource_property(nodePath="./World/Floor", resourceProperty="mesh", subProperty="size", value="Vector3(20, 0.2, 20)")
94
+ ## Cut list (NOT in scope this pass)
95
+ - Multiplayer
96
+ - Save/load
97
+ - Settings menu
98
+ - ...
145
99
  ```
146
100
 
147
- ---
101
+ **Checkpoint before continuing:**
148
102
 
149
- ## Phase 3: Scene Construction
103
+ > "Plan saved. Three core mechanics: movement, primary action, win condition. Anything you want to add or cut before I start building?"
150
104
 
151
- ### 3a. Build environment with batch
105
+ ## Phase 3: Scaffold
152
106
 
153
- Use `summer_batch` for multi-step setup in one undo step:
107
+ **Goal**: working project on disk, scene opens in the engine.
154
108
 
155
- ```
156
- summer_batch(ops=[
157
- {"op":"AddNode","parent":"./","type":"Node3D","name":"Level"},
158
- {"op":"AddNode","parent":"./Level","type":"MeshInstance3D","name":"Ground"},
159
- {"op":"SetProp","path":"./Level/Ground","key":"mesh","value":"PlaneMesh"},
160
- {"op":"SetResourceProperty","nodePath":"./Level/Ground","resourceProperty":"mesh","subProperty":"size","value":"Vector2(50,50)"},
161
- {"op":"AddNode","parent":"./","type":"DirectionalLight3D","name":"Sun"},
162
- {"op":"SetProp","path":"./Sun","key":"rotation_degrees","value":"Vector3(-45,30,0)"},
163
- {"op":"SetProp","path":"./Sun","key":"shadow_enabled","value":"true"},
164
- {"op":"AddNode","parent":"./","type":"WorldEnvironment","name":"Env"}
165
- ])
166
- ```
109
+ If the user said "I want to use a template" earlier, this is just `summer:browse-templates`.
167
110
 
168
- ### 3b. Build player
111
+ If from scratch:
169
112
 
170
- **3D FPS/Third-person:**
171
113
  ```
172
- summer_open_scene(path="res://scenes/player.tscn")
173
- summer_batch(ops=[
174
- {"op":"AddNode","parent":"./","type":"CollisionShape3D","name":"Collision"},
175
- {"op":"SetProp","path":"./Collision","key":"shape","value":"CapsuleShape3D"},
176
- {"op":"AddNode","parent":"./","type":"Camera3D","name":"Camera"},
177
- {"op":"SetProp","path":"./Camera","key":"position","value":"Vector3(0,1.6,0)"}
178
- ])
114
+ Skill: summer:new-project
179
115
  ```
180
116
 
181
- **2D Platformer:**
182
- ```
183
- summer_open_scene(path="res://scenes/player.tscn")
184
- summer_batch(ops=[
185
- {"op":"AddNode","parent":"./","type":"CollisionShape2D","name":"Collision"},
186
- {"op":"SetProp","path":"./Collision","key":"shape","value":"RectangleShape2D"},
187
- {"op":"AddNode","parent":"./","type":"Sprite2D","name":"Sprite"},
188
- {"op":"AddNode","parent":"./","type":"Camera2D","name":"Camera"}
189
- ])
190
- ```
191
-
192
- ### 3c. Input bindings
117
+ That picks `empty` vs `3d-basic` based on the GameSoul brief. After the project is created and `summer run` succeeds:
193
118
 
194
119
  ```
195
- summer_input_map_bind(name="move_forward", events=[{"type":"key","key":"W"}])
196
- summer_input_map_bind(name="move_back", events=[{"type":"key","key":"S"}])
197
- summer_input_map_bind(name="move_left", events=[{"type":"key","key":"A"}])
198
- summer_input_map_bind(name="move_right", events=[{"type":"key","key":"D"}])
199
- summer_input_map_bind(name="jump", events=[{"type":"key","key":"Space"}])
200
- summer_input_map_bind(name="interact", events=[{"type":"key","key":"E"}])
120
+ Skill: summer:scene-composition
201
121
  ```
202
122
 
203
- ### 3d. Place assets in scene
123
+ To set up the canonical hierarchy for the genre. For 3D action games:
204
124
 
205
125
  ```
206
- summer_open_scene(path="res://scenes/main_level.tscn")
207
- summer_instantiate_scene(parent="./Level", scene="res://scenes/player.tscn", name="Player")
208
- summer_instantiate_scene(parent="./Level", scene="res://assets/models/tree.glb", name="Tree1")
209
- summer_set_prop(path="./Level/Tree1", key="position", value="Vector3(5, 0, 3)")
126
+ World (Node3D)
127
+ ├── Player (CharacterBody3D)
128
+ ├── Level (Node3D)
129
+ ├── Lighting (Node3D)
130
+ │ ├── Sun (DirectionalLight3D)
131
+ │ └── Environment (WorldEnvironment)
132
+ ├── HUD (CanvasLayer)
133
+ └── GameManager (Node) # autoload-style, holds win/lose state
210
134
  ```
211
135
 
212
- ### 3e. Save
136
+ Save the scene. Run `summer_play` once to verify the empty scaffold opens cleanly. If it crashes, run `summer:debug` immediately — do NOT continue building on a broken base.
213
137
 
214
- ```
215
- summer_save_scene()
216
- ```
138
+ **Checkpoint before continuing:**
217
139
 
218
- ---
140
+ > "Scaffold is in. Empty scene plays clean. Building mechanic 1 of N: <name>. OK?"
219
141
 
220
- ## Phase 4: Scripting
142
+ ## Phase 4: Build (one mechanic at a time)
221
143
 
222
- **Write .gd files with the host agent's normal file-editing tools. Attach via MCP.**
144
+ **Goal**: each mechanic from the plan, fully working, before moving to the next.
223
145
 
224
- Workflow:
225
- 1. Write the script file to disk
226
- 2. Attach: `summer_set_prop(path="./Player", key="script", value="res://scripts/player.gd")`
227
- 3. Check: `summer_get_script_errors(path="res://scripts/player.gd")`
228
- 4. Wire signals: `summer_connect_signal(emitter="./Coin", signal="body_entered", receiver="./Coin", method="_on_body_entered")`
146
+ For each mechanic in the plan, **in order**:
229
147
 
230
- ### 3D Player Controller (FPS)
148
+ 1. **Design pass**:
149
+ ```
150
+ Skill: summer:design-mechanic
151
+ ```
152
+ Outputs the mechanic spec: input, response, feedback, failure modes, depth, tunables, GDScript stub.
231
153
 
232
- Write to `res://scripts/player.gd`:
154
+ 2. **Implement**:
155
+ - Add the nodes via `summer_add_node` / `summer_set_prop`. Use `summer:scene-composition` if the structure is non-trivial.
156
+ - For movement-class mechanics, prefer the matching pre-built skill: `summer:fps-controller`, `summer:peer-to-peer-multiplayer`, etc.
157
+ - Write GDScript with `summer:gdscript-patterns` open.
233
158
 
234
- ```gdscript
235
- extends CharacterBody3D
159
+ 3. **Verify**:
160
+ ```
161
+ Skill: summer:play
162
+ ```
163
+ Then `summer_get_diagnostics`. Clean? Move on. Errors? `summer:debug` until clean. **Do not stack mechanic 2 on top of a broken mechanic 1.**
236
164
 
237
- @export var speed: float = 5.0
238
- @export var jump_velocity: float = 4.5
239
- @export var mouse_sensitivity: float = 0.002
165
+ 4. **Checkpoint**:
240
166
 
241
- var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
167
+ > "Mechanic 1 of N working: <name>. <One-line proof: 'WASD moves the player, jump works'>. Building mechanic 2 of N: <name>. OK?"
242
168
 
243
- func _ready() -> void:
244
- Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
169
+ Repeat until every mechanic in the plan is implemented OR the user calls cut.
245
170
 
246
- func _unhandled_input(event: InputEvent) -> void:
247
- if event is InputEventMouseMotion:
248
- rotate_y(-event.relative.x * mouse_sensitivity)
249
- $Camera.rotate_x(-event.relative.y * mouse_sensitivity)
250
- $Camera.rotation.x = clampf($Camera.rotation.x, -PI/2, PI/2)
251
- if event.is_action_pressed("ui_cancel"):
252
- Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
171
+ ## Phase 5: Layer (look + sound)
253
172
 
254
- func _physics_process(delta: float) -> void:
255
- if not is_on_floor():
256
- velocity.y -= gravity * delta
173
+ **Goal**: the game stops looking like a programmer art prototype.
257
174
 
258
- if Input.is_action_just_pressed("jump") and is_on_floor():
259
- velocity.y = jump_velocity
260
-
261
- var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
262
- var direction := (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
263
-
264
- if direction:
265
- velocity.x = direction.x * speed
266
- velocity.z = direction.z * speed
267
- else:
268
- velocity.x = move_toward(velocity.x, 0, speed)
269
- velocity.z = move_toward(velocity.z, 0, speed)
270
-
271
- move_and_slide()
272
175
  ```
273
-
274
- ### 2D Platformer Controller
275
-
276
- Write to `res://scripts/player.gd`:
277
-
278
- ```gdscript
279
- extends CharacterBody2D
280
-
281
- @export var speed: float = 200.0
282
- @export var jump_velocity: float = -350.0
283
-
284
- var gravity: float = ProjectSettings.get_setting("physics/2d/default_gravity")
285
-
286
- func _physics_process(delta: float) -> void:
287
- if not is_on_floor():
288
- velocity.y += gravity * delta
289
-
290
- if Input.is_action_just_pressed("jump") and is_on_floor():
291
- velocity.y = jump_velocity
292
-
293
- var direction := Input.get_axis("move_left", "move_right")
294
- velocity.x = direction * speed if direction else move_toward(velocity.x, 0, speed)
295
-
296
- move_and_slide()
176
+ Skill: summer:art-direction
297
177
  ```
298
178
 
299
- ### Collectible Pickup
300
-
301
- Write to `res://scripts/collectible.gd`:
302
-
303
- ```gdscript
304
- extends Area3D
179
+ That writes `.summer/art-bible.md` if it doesn't exist, then guides the lighting / material / palette pass. Use `summer:3d-lighting` for the actual scene work.
305
180
 
306
- signal collected
307
-
308
- func _ready() -> void:
309
- body_entered.connect(_on_body_entered)
310
-
311
- func _on_body_entered(body: Node3D) -> void:
312
- if body.is_in_group("player"):
313
- collected.emit()
314
- queue_free()
181
+ ```
182
+ Skill: summer:audio-direction
315
183
  ```
316
184
 
317
- ### Simple Enemy Patrol
318
-
319
- Write to `res://scripts/enemy_patrol.gd`:
320
-
321
- ```gdscript
322
- extends CharacterBody3D
185
+ Writes `.summer/audio-bible.md` and sets up the audio bus structure. Wires SFX hooks into the mechanics from Phase 4.
323
186
 
324
- @export var speed: float = 2.0
325
- @export var patrol_distance: float = 5.0
187
+ Use `summer:asset-strategy` to decide whether to generate assets, search the library, or use primitives. **Public asset library search is free** — encourage it before generation, which costs credits.
326
188
 
327
- var start_pos: Vector3
328
- var direction: float = 1.0
329
- var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
189
+ **Checkpoint before continuing:**
330
190
 
331
- func _ready() -> void:
332
- start_pos = global_position
191
+ > "Art and audio direction set. Want me to add a polish pass (juice / VFX / camera shake / hit feedback)?"
333
192
 
334
- func _physics_process(delta: float) -> void:
335
- if not is_on_floor():
336
- velocity.y -= gravity * delta
193
+ ## Phase 6: Polish (skip if user wants to ship raw)
337
194
 
338
- velocity.x = direction * speed
339
- move_and_slide()
195
+ **Goal**: the game *feels* good. Hit-flash, screen shake, audio ducking, weight.
340
196
 
341
- if global_position.distance_to(start_pos) > patrol_distance:
342
- direction *= -1
343
197
  ```
344
-
345
- ---
346
-
347
- ## Phase 5: Test and Debug
348
-
349
- ```
350
- summer_clear_console()
351
- summer_play()
198
+ Skill: summer:vfx
352
199
  ```
353
200
 
354
- After a few seconds:
355
- ```
356
- summer_get_diagnostics()
357
- ```
201
+ Walks the canonical Godot 4.5 game-feel stack — hit-flash + trauma camera shake + audio ducking — wired so a single hit fires all three.
358
202
 
359
- If errors:
360
203
  ```
361
- summer_get_console(type="error")
362
- summer_get_script_errors(path="res://scripts/player.gd")
204
+ Skill: summer:tune-performance
363
205
  ```
364
206
 
365
- Fix, then:
366
- ```
367
- summer_stop()
368
- # apply fix
369
- summer_play()
370
- ```
207
+ Only if `summer_get_diagnostics` flags rendering or physics hotspots. Don't optimize prematurely.
371
208
 
372
- ### Common errors
209
+ ## Phase 7: Verify (final QA pass)
373
210
 
374
- | Error | Cause | Fix |
375
- |-------|-------|-----|
376
- | "Node not found" | Bad $NodePath | Check path with `summer_get_scene_tree()` |
377
- | "Invalid call" on move_and_slide | Wrong base class | Script must extend CharacterBody3D/2D |
378
- | Falling through floor | No collision | Add StaticBody3D + CollisionShape3D to ground |
379
- | "No main scene" | Not configured | `summer_project_setting(key="application/run/main_scene", ...)` |
380
- | Mouse not captured | Missing in _ready | Add `Input.mouse_mode = Input.MOUSE_MODE_CAPTURED` |
211
+ **Goal**: the full game runs end-to-end without errors, and the win condition can actually be reached.
381
212
 
382
- ---
213
+ 1. `summer:play` from main scene.
214
+ 2. Walk every mechanic from the plan.
215
+ 3. Hit the win condition (or lose condition).
216
+ 4. `summer_get_diagnostics` clean.
217
+ 5. `summer:debug` until clean if not.
383
218
 
384
- ## Phase 6: Iterate
219
+ **Don't skip this even if every mechanic worked individually.** Integration bugs hide between mechanics.
385
220
 
386
- After first playable, ask the user what to improve. Common next steps:
221
+ ## Phase 8: Ship
387
222
 
388
- - **More levels**: Create new .tscn, instantiate player, add to scene list
389
- - **Enemies**: New scene + patrol script + spawn in level
390
- - **UI/HUD**: Add CanvasLayer + Control nodes (see ui-basics skill)
391
- - **Sound**: Generate with `summer_generate_audio`, attach AudioStreamPlayer3D
392
- - **Lighting**: Set up WorldEnvironment + lights (see 3d-lighting skill)
393
- - **Game states**: Main menu > gameplay > game over flow via SceneTree.change_scene_to_file()
223
+ ```
224
+ Skill: summer:export-and-ship
225
+ ```
394
226
 
395
- ---
227
+ Pre-flight checklist (icon, store banners, build config) before producing release builds for the targets in the brief.
228
+
229
+ If the brief said "jam" or "prototype", skip this phase. If the brief said "game I want to release", run it.
396
230
 
397
231
  ## Anti-Patterns
398
232
 
399
- - Never write .tscn files with host agent file tools -- always use Summer MCP scene tools
400
- - Never guess node paths -- call `summer_get_scene_tree()` first
401
- - Never edit scenes while game is running -- call `summer_stop()` first
402
- - Never skip `summer_save_scene()` -- unsaved changes are editor-only
403
- - Script .gd files must exist on disk BEFORE attaching via `summer_set_prop`
404
- - `summer_create_scene` requires `allow_temporary_scene_mutation=true`
405
- - Node paths use `./` prefix. File paths use `res://` prefix. Never mix them.
233
+ | Don't | Why |
234
+ |---|---|
235
+ | Skip the brainstorm because the user said "FPS" | Even with the genre named, you need the scope cut list. Otherwise mechanic 4 quietly sneaks in and the game never ships. |
236
+ | Let mechanic 2 start before mechanic 1 is verified clean | Compounding bugs. You'll spend the rest of the session debugging which mechanic broke what. |
237
+ | Stack art direction on top of unfinished mechanics | Art changes are reversible only if the underlying scene structure is stable. Get mechanics done first. |
238
+ | Treat "polish" as required | If the brief says "jam in 2 days", polish is a cut item. Respect the brief. |
239
+ | Run all phases without confirming | The user owns scope. Stop at every checkpoint. |
240
+ | Build a fully featured menu before there's a playable mechanic | Menu work is endless polish; player-loop work is the actual game. Mechanics first. |
241
+ | Fall back to "let me try a few things" mid-pipeline | If you don't know what to do, name the phase and ask the user, don't improvise around the structure. |
406
242
 
407
- ---
243
+ ## What this skill produces (artifacts on disk)
408
244
 
409
- ## Tool Quick Reference
410
-
411
- | Category | Tool | Purpose |
412
- |----------|------|---------|
413
- | Setup | `summer_get_agent_playbook` | Safe workflow guide |
414
- | Setup | `summer_get_project_context` | Project name, paths, status |
415
- | Setup | `summer_project_setting` | Set project.godot values |
416
- | Scene | `summer_create_scene` | New scene file |
417
- | Scene | `summer_open_scene` | Switch to scene |
418
- | Scene | `summer_get_scene_tree` | Read scene structure |
419
- | Scene | `summer_save_scene` | Save to disk |
420
- | Nodes | `summer_add_node` | Add node |
421
- | Nodes | `summer_set_prop` | Set property |
422
- | Nodes | `summer_set_resource_property` | Set sub-resource prop |
423
- | Nodes | `summer_remove_node` | Delete node |
424
- | Nodes | `summer_instantiate_scene` | Place .tscn/.glb |
425
- | Nodes | `summer_batch` | Multi-op, one undo |
426
- | Nodes | `summer_connect_signal` | Wire signals |
427
- | Nodes | `summer_inspect_node` | Read node details |
428
- | Input | `summer_input_map_bind` | Bind keys to actions |
429
- | Assets | `summer_search_assets` | Search 25k+ library |
430
- | Assets | `summer_import_asset` | Search + import + place |
431
- | Assets | `summer_import_from_url` | Import from URL |
432
- | Generate | `summer_generate_image` | AI image gen |
433
- | Generate | `summer_generate_audio` | AI audio/SFX/music |
434
- | Generate | `summer_generate_3d` | AI 3D model gen |
435
- | Generate | `summer_generate_video` | AI video gen |
436
- | Generate | `summer_check_job` | Poll async jobs |
437
- | Debug | `summer_play` | Run game |
438
- | Debug | `summer_stop` | Stop game |
439
- | Debug | `summer_get_diagnostics` | Error overview |
440
- | Debug | `summer_get_console` | Read output |
441
- | Debug | `summer_get_script_errors` | Check .gd compile |
442
- | Debug | `summer_clear_console` | Clear output |
245
+ By the end of a successful run, the user has:
443
246
 
444
- ---
247
+ - `project.godot` — Summer Engine project
248
+ - `main.tscn` — playable main scene
249
+ - `.summer/GameSoul.md` — the brief
250
+ - `.summer/build-plan.md` — the checklist
251
+ - `.summer/art-bible.md` — visual direction
252
+ - `.summer/audio-bible.md` — sonic direction
253
+ - One `.gd` file per mechanic
254
+ - `summer_get_diagnostics` returns clean
255
+ - `summer_play` runs end-to-end and the win condition is reachable
256
+
257
+ That's a real game. Not a half-finished prototype.
445
258
 
446
- ## Collaborative protocol
259
+ ## Closing line
447
260
 
448
- This skill orchestrates a full game build — many writes across scenes, scripts, and project settings. Always ask before each phase: "May I bootstrap the project (scenes, project.godot, folders)?", "May I generate the assets (image + 3D) for X, Y, Z?", "May I scaffold the player scene + attach `player.gd`?". Group related writes into one ask per phase, never bulk-write across phases. See `../../_shared/collaborative-protocol.md`.
261
+ When all phases are done:
449
262
 
450
- ## Fallback
263
+ > "<Game name> is in. <N> mechanics, <playable from main scene to win condition>. <Brief summary of the build>. Want me to package a build (`summer:export-and-ship`) or iterate?"
451
264
 
452
- No fallback for this — Summer MCP required. The whole point of `make-game` is the orchestration layer over `summer_*` tools. If MCP isn't connected, fall back to running the individual sub-skills (`fps-controller`, `3d-lighting`, etc.) which each document their own MCP-or-`.tscn` fallback paths.
265
+ That's the handoff back to the user.