summer-engine 3.3.0 → 3.4.1

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 (293) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -2
  3. package/.codex-plugin/plugin.json +5 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  6. package/.opencode/INSTALL.md +8 -8
  7. package/.opencode/plugins/summer.js +2 -2
  8. package/AGENTS.md +7 -7
  9. package/CHANGELOG.md +50 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +32 -35
  13. package/assets/api-docs.json.gz +0 -0
  14. package/assets/autopilot/run.sh +2 -2
  15. package/assets/navigation/web-routes.json +1 -1
  16. package/commands/gameskill.md +2 -2
  17. package/commands/summer.md +25 -25
  18. package/dist/cli/commands/install.d.ts +10 -0
  19. package/dist/cli/commands/install.js +55 -10
  20. package/dist/cli/commands/open.d.ts +1 -1
  21. package/dist/cli/commands/run.d.ts +1 -1
  22. package/dist/cli/commands/run.js +1 -1
  23. package/dist/cli/commands/skills.js +2 -2
  24. package/dist/cli/commands/tool.d.ts +7 -0
  25. package/dist/cli/commands/tool.js +36 -1
  26. package/dist/core/api-client.d.ts +5 -6
  27. package/dist/core/api-client.js +12 -15
  28. package/dist/core/auth.js +2 -2
  29. package/dist/core/capabilities/asset-import.d.ts +0 -1
  30. package/dist/core/capabilities/camera-view.d.ts +1 -1
  31. package/dist/core/capabilities/camera-view.js +2 -2
  32. package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
  33. package/dist/core/capabilities/capture-gameplay.js +283 -0
  34. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  35. package/dist/core/capabilities/connect-signal.js +1 -2
  36. package/dist/core/capabilities/console-read.d.ts +2 -2
  37. package/dist/core/capabilities/console-read.js +2 -2
  38. package/dist/core/capabilities/creator.js +1 -1
  39. package/dist/core/capabilities/doctor.d.ts +9 -1
  40. package/dist/core/capabilities/doctor.js +47 -4
  41. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  42. package/dist/core/capabilities/engine-receipt.js +7 -9
  43. package/dist/core/capabilities/engine-run.d.ts +4 -0
  44. package/dist/core/capabilities/engine-run.js +33 -5
  45. package/dist/core/capabilities/export-engine-version.d.ts +15 -0
  46. package/dist/core/capabilities/export-engine-version.js +24 -0
  47. package/dist/core/capabilities/export-game.d.ts +9 -1
  48. package/dist/core/capabilities/export-game.js +115 -39
  49. package/dist/core/capabilities/export-presets.d.ts +1 -1
  50. package/dist/core/capabilities/export-presets.js +1 -1
  51. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  52. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  53. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  54. package/dist/core/capabilities/frame-quality.js +4 -4
  55. package/dist/core/capabilities/grep.d.ts +1 -1
  56. package/dist/core/capabilities/grep.js +1 -1
  57. package/dist/core/capabilities/image-generation.d.ts +9 -0
  58. package/dist/core/capabilities/image-generation.js +19 -1
  59. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  60. package/dist/core/capabilities/navigation/open.js +1 -1
  61. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  62. package/dist/core/capabilities/navigation/targets.js +2 -2
  63. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  64. package/dist/core/capabilities/placement-batch.js +2 -2
  65. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  66. package/dist/core/capabilities/play-determinism.js +1 -1
  67. package/dist/core/capabilities/publish-build.d.ts +15 -2
  68. package/dist/core/capabilities/publish-build.js +78 -28
  69. package/dist/core/capabilities/publish-download.d.ts +1 -2
  70. package/dist/core/capabilities/publish-download.js +2 -3
  71. package/dist/core/capabilities/replace-node.d.ts +1 -3
  72. package/dist/core/capabilities/replace-node.js +1 -3
  73. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  74. package/dist/core/capabilities/runtime-control.js +7 -9
  75. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  76. package/dist/core/capabilities/scene-batch.js +1 -1
  77. package/dist/core/capabilities/scene-kind.js +1 -1
  78. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  79. package/dist/core/capabilities/scene-readback.js +3 -4
  80. package/dist/core/capabilities/scene-script.d.ts +2 -2
  81. package/dist/core/capabilities/scene-script.js +2 -2
  82. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  83. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  84. package/dist/core/capabilities/summer-bundle.d.ts +2 -3
  85. package/dist/core/capabilities/summer-bundle.js +2 -3
  86. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  87. package/dist/core/capabilities/surface-snap.js +1 -1
  88. package/dist/core/capabilities/tool-dispatch.js +11 -1
  89. package/dist/core/capabilities/ui-control.d.ts +1 -2
  90. package/dist/core/capabilities/ui-control.js +1 -2
  91. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  92. package/dist/core/capabilities/world-snapshot.js +1 -1
  93. package/dist/core/capability-skew.d.ts +2 -3
  94. package/dist/core/capability-skew.js +4 -5
  95. package/dist/core/config.js +2 -2
  96. package/dist/core/engine-install.d.ts +16 -0
  97. package/dist/core/engine-install.js +32 -2
  98. package/dist/core/feedback/client.js +1 -1
  99. package/dist/core/hosted-mcp.d.ts +115 -0
  100. package/dist/core/hosted-mcp.js +164 -0
  101. package/dist/core/launch-posture.d.ts +6 -3
  102. package/dist/core/launch-posture.js +18 -5
  103. package/dist/core/library-read.js +1 -2
  104. package/dist/core/templates.d.ts +1 -2
  105. package/dist/core/templates.js +1 -2
  106. package/dist/mcp/hosted-mount.d.ts +13 -59
  107. package/dist/mcp/hosted-mount.js +24 -30
  108. package/dist/mcp/server.d.ts +2 -2
  109. package/dist/mcp/server.js +5 -4
  110. package/dist/mcp/tools/creator-tools.js +14 -4
  111. package/dist/mcp/tools/debug-tools.js +1 -1
  112. package/dist/mcp/tools/generate-tools.js +19 -9
  113. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  114. package/dist/mcp/tools/navigation-tools.js +1 -1
  115. package/dist/mcp/tools/spatial-tools.js +1 -1
  116. package/dist/mcp/tools/visual-tools.js +2 -2
  117. package/dist/mcp/tools/with-engine.d.ts +1 -2
  118. package/dist/mcp/tools/with-engine.js +1 -2
  119. package/gemini-extension.json +3 -1
  120. package/hooks/session-start.sh +2 -2
  121. package/integrations/README.md +70 -76
  122. package/integrations/claude/README.md +0 -3
  123. package/integrations/codex/README.md +1 -2
  124. package/integrations/copilot-jetbrains/README.md +1 -1
  125. package/integrations/cursor/README.md +1 -2
  126. package/integrations/factory/README.md +15 -11
  127. package/integrations/mistral-vibe/README.md +1 -1
  128. package/integrations/opencode/README.md +1 -1
  129. package/integrations/roo-code/README.md +1 -1
  130. package/integrations/rovo-dev/README.md +1 -1
  131. package/integrations/trae/README.md +1 -1
  132. package/integrations/windsurf/README.md +3 -3
  133. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  134. package/library/references/gd-style/gd-style.md +4 -6
  135. package/library/references/godot-version/godot-version.md +3 -3
  136. package/library/references/headless-routing/headless-routing.md +2 -2
  137. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  138. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
  139. package/library/references/product-map/product-map.md +1 -1
  140. package/library/references/public-surface-language/public-surface-language.md +1 -1
  141. package/library/references/summer-folder/summer-folder.md +1 -1
  142. package/library/skills/3d-lighting/SKILL.md +4 -4
  143. package/library/skills/README.md +11 -9
  144. package/library/skills/adaptive-music/SKILL.md +7 -7
  145. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  146. package/library/skills/ambient-bed/SKILL.md +12 -14
  147. package/library/skills/animated-loop/SKILL.md +42 -42
  148. package/library/skills/animation-tree/SKILL.md +6 -6
  149. package/library/skills/art-direction/SKILL.md +8 -11
  150. package/library/skills/asset-strategy/SKILL.md +3 -3
  151. package/library/skills/audio-direction/SKILL.md +8 -10
  152. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  153. package/library/skills/bounded-engine-runs/SKILL.md +95 -0
  154. package/library/skills/bounded-engine-runs/resource.yaml +29 -0
  155. package/library/skills/brainstorm-game/SKILL.md +5 -5
  156. package/library/skills/brainstorming/SKILL.md +9 -15
  157. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  158. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  159. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  160. package/library/skills/character-model/SKILL.md +15 -26
  161. package/library/skills/character-movement/SKILL.md +1 -1
  162. package/library/skills/character-movement/references/movement-3d.md +1 -1
  163. package/library/skills/character-portrait/SKILL.md +4 -4
  164. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  165. package/library/skills/combat-basics/SKILL.md +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
  168. package/library/skills/concept-art/SKILL.md +4 -4
  169. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  170. package/library/skills/debug/SKILL.md +5 -4
  171. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  172. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  173. package/library/skills/design-level/SKILL.md +5 -5
  174. package/library/skills/design-mechanic/SKILL.md +6 -6
  175. package/library/skills/design-npc/SKILL.md +8 -15
  176. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  177. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  178. package/library/skills/environment-kit/SKILL.md +5 -5
  179. package/library/skills/export-and-ship/SKILL.md +25 -24
  180. package/library/skills/fabricating-assets/SKILL.md +1 -1
  181. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  182. package/library/skills/fps-controller/SKILL.md +17 -16
  183. package/library/skills/fps-controller/resource.yaml +0 -2
  184. package/library/skills/game-feel/SKILL.md +6 -7
  185. package/library/skills/gameskill/SKILL.md +3 -3
  186. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  187. package/library/skills/generate-motion/SKILL.md +5 -22
  188. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  189. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  190. package/library/skills/headless-scripting/SKILL.md +8 -8
  191. package/library/skills/headless-scripting/resource.yaml +1 -0
  192. package/library/skills/in-game-purchases/SKILL.md +123 -118
  193. package/library/skills/in-game-purchases/resource.yaml +2 -2
  194. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  195. package/library/skills/investigating-bugs/SKILL.md +3 -11
  196. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  197. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  198. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  199. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  200. package/library/skills/make-game/SKILL.md +3 -5
  201. package/library/skills/make-game/references/2d-platformer.md +1 -1
  202. package/library/skills/multiplayer-project/SKILL.md +1 -1
  203. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  204. package/library/skills/music-track/SKILL.md +40 -38
  205. package/library/skills/new-project/SKILL.md +4 -6
  206. package/library/skills/organic-model/SKILL.md +9 -9
  207. package/library/skills/pixel-art/SKILL.md +6 -6
  208. package/library/skills/play/SKILL.md +3 -4
  209. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  210. package/library/skills/procedural-animation/SKILL.md +10 -11
  211. package/library/skills/prop-model/SKILL.md +4 -4
  212. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  213. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  214. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  215. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  216. package/library/skills/remote-deploy/SKILL.md +20 -21
  217. package/library/skills/retarget/SKILL.md +19 -23
  218. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  219. package/library/skills/scene-composition/SKILL.md +5 -5
  220. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  221. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  222. package/library/skills/scene-scripting/SKILL.md +3 -3
  223. package/library/skills/scene-to-level/SKILL.md +28 -31
  224. package/library/skills/skill-create/SKILL.md +1 -1
  225. package/library/skills/skill-improve/SKILL.md +9 -9
  226. package/library/skills/skill-test/SKILL.md +10 -10
  227. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  228. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  229. package/library/skills/skybox-panorama/SKILL.md +8 -9
  230. package/library/skills/sound-effect/SKILL.md +19 -19
  231. package/library/skills/spatial-placement/SKILL.md +2 -2
  232. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  233. package/library/skills/sprite-sheet/SKILL.md +10 -10
  234. package/library/skills/summer-analytics/SKILL.md +3 -3
  235. package/library/skills/summer-friends/SKILL.md +10 -10
  236. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  237. package/library/skills/summer-match-results/SKILL.md +13 -13
  238. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  239. package/library/skills/summer-parties/SKILL.md +9 -9
  240. package/library/skills/summer-player-data/SKILL.md +12 -12
  241. package/library/skills/summer-store/SKILL.md +6 -6
  242. package/library/skills/summer-world-chat/SKILL.md +9 -9
  243. package/library/skills/summer-world-saves/SKILL.md +7 -7
  244. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  245. package/library/skills/tileable-texture/SKILL.md +1 -1
  246. package/library/skills/trailer-shot/SKILL.md +36 -36
  247. package/library/skills/tune-performance/SKILL.md +13 -13
  248. package/library/skills/tune-performance/resource.yaml +1 -1
  249. package/library/skills/ui-graphics/SKILL.md +7 -7
  250. package/library/skills/use-widget-asset/SKILL.md +7 -7
  251. package/library/skills/using-summer/SKILL.md +5 -7
  252. package/library/skills/vehicle-model/SKILL.md +6 -7
  253. package/library/skills/vehicle-model/resource.yaml +2 -2
  254. package/library/skills/verification-before-completion/SKILL.md +5 -6
  255. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  256. package/library/skills/vfx-fire/SKILL.md +6 -6
  257. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  258. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  259. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  260. package/library/skills/vfx-lightning/SKILL.md +5 -5
  261. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  263. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  264. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  265. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  266. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  267. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  268. package/library/skills/vfx-smoke/SKILL.md +5 -5
  269. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  270. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  271. package/library/skills/voice-line/SKILL.md +9 -9
  272. package/library/skills/web-compatibility-look/resource.yaml +1 -0
  273. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  274. package/library/skills/writing-plans/SKILL.md +4 -4
  275. package/library/skills/writing-skills/SKILL.md +8 -8
  276. package/library/tools/capture-gameplay/resource.yaml +73 -0
  277. package/library/tools/creator-publish/resource.yaml +4 -4
  278. package/library/tools/creator-releases/resource.yaml +5 -5
  279. package/library/tools/generate-image/resource.yaml +15 -1
  280. package/library/tools/publish-build/resource.yaml +6 -2
  281. package/package.json +1 -1
  282. package/registry/generated/aliases.json +1 -0
  283. package/registry/generated/counts.json +3 -3
  284. package/registry/generated/gemini-extension.json +3 -1
  285. package/registry/generated/index.json +248 -135
  286. package/registry/generated/marketplace.claude.json +2 -2
  287. package/registry/generated/plugin.claude.json +4 -2
  288. package/registry/generated/plugin.codex.json +5 -3
  289. package/registry/generated/plugin.cursor.json +4 -2
  290. package/registry/generated/plugin.factory.json +4 -2
  291. package/registry/generated/skills-index.md +11 -9
  292. package/registry/generated/skills-registry.json +33 -6
  293. package/registry/schemas/domains.json +1 -1
@@ -13,9 +13,9 @@ paths: ["audio/ambient/**", "**/*.tscn", "**/*.import"]
13
13
 
14
14
  ## Overview
15
15
 
16
- An ambient bed is the *air* of a place. Forest at dawn, dungeon corridor, spaceship hum, market street, ocean cave. It plays at low energy under everything else — never melodic, never drawing attention, but its absence is immediately felt. Players don't notice an ambient bed; they notice the silence when you forget one.
16
+ An ambient bed is the *air* of a place. Forest at dawn, dungeon corridor, spaceship hum, market street, ocean cave. It plays at low energy under everything else and is never melodic. Players rarely notice a bed, but they notice the silence when a level has none.
17
17
 
18
- This is **not** music. Use `summer_generate_audio({capability: 'sound_effects'})`, not `{capability: 'music'}`. SFX renders textures; Music renders melody. You want texture.
18
+ This is **not** music. Use `summer_generate_audio({capability: 'sound_effects'})`, not `{capability: 'music'}`: the SFX model renders texture, the music model renders melody.
19
19
 
20
20
  Generated at 15–22 seconds (the SFX duration ceiling) and looped with a Summer
21
21
  Engine import loop point and optional crossfade.
@@ -28,9 +28,9 @@ Engine import loop point and optional crossfade.
28
28
 
29
29
  ## When NOT to use
30
30
 
31
- - Short event SFX (<5s) → `audio/sound-effect`.
32
- - Music with melody / chord progression → `audio/music-track`.
33
- - Voice barks → `audio/voice-line`.
31
+ - Short event SFX (<5s) → `sound-effect`.
32
+ - Music with melody / chord progression → `music-track`.
33
+ - Voice barks → `voice-line`.
34
34
 
35
35
  ## Steps
36
36
 
@@ -50,7 +50,7 @@ Ask if it's not pinned by context:
50
50
 
51
51
  ### 3. Build the prompt — environment + time + weather + 2–3 sources + density + duration
52
52
 
53
- ElevenLabs SFX renders ambient textures well when the prompt names sources, not vibes.
53
+ The SFX model renders ambient texture well when the prompt names sound sources, not moods.
54
54
 
55
55
  Prompts that work:
56
56
 
@@ -117,9 +117,7 @@ If the model returns a clip with a loud event near the start or end (a sudden bi
117
117
 
118
118
  ### 6. Mark the seamless loop in Summer Engine's Import dock
119
119
 
120
- This step is what makes the bed sound like a place rather than a 22-second sample.
121
-
122
- WAV and MP3 use **different importers with different option names** — do not copy the MP3 block from `audio/music-track` here. The WAV importer has no `loop` / `loop_offset`; it has an `edit/loop_mode` enum plus sample-frame bounds.
120
+ WAV and MP3 use **different importers with different option names** — do not copy the MP3 block from `music-track` here. The WAV importer has no `loop` / `loop_offset`; it has an `edit/loop_mode` enum plus sample-frame bounds.
123
121
 
124
122
  In Summer Engine, select the `.wav` and open the Import dock:
125
123
 
@@ -144,7 +142,7 @@ After changing, click `Reimport`.
144
142
 
145
143
  ### 7. Crossfade-loop pattern for seamlessness
146
144
 
147
- ElevenLabs SFX returns are not gapless. Even with `loop = true`, you'll hear a tiny click on the loop point. Fix it with a two-player crossfade in code:
145
+ Generated SFX clips are not gapless. Even with the loop mode set, you will often hear a small click at the loop point. Fix it with a two-player crossfade in code:
148
146
 
149
147
  ```gdscript
150
148
  # scripts/audio/AmbientBed.gd
@@ -278,7 +276,7 @@ Print the SFX prompt and the import dock settings. User runs via the Summer dash
278
276
 
279
277
  ## See also
280
278
 
281
- - `audio/audio-direction` — defines the Ambient layer class
282
- - `audio/sound-effect` — short event SFX layered over the bed
283
- - `audio/music-track` — melodic music layered over the bed
284
- - `audio/adaptive-music` — state-driven crossfades use the same pattern
279
+ - `audio-direction` — defines the Ambient layer class
280
+ - `sound-effect` — short event SFX layered over the bed
281
+ - `music-track` — melodic music layered over the bed
282
+ - `adaptive-music` — state-driven crossfades use the same pattern
@@ -11,11 +11,11 @@ paths: ["assets/video/**", "menus/**", "ui/**"]
11
11
 
12
12
  # animated-loop — 5 Second Seamless Background Loop
13
13
 
14
- A loop is the only video format that has to *not have* a beginning or end. The viewer sees it on the title screen for 30 seconds; if the seam between loop iterations is visible, the whole thing reads as broken. This skill exists to force the constraints that make seams invisible: take the shortest duration available, keep the motion ambient (no narrative, no big camera moves), use the cheap fast model (`ltx`), and prompt for a composition where the first and last frames are functionally identical.
14
+ A loop is the only video format that has to *not have* a beginning or end. The viewer sees it on the title screen for 30 seconds; if the seam between loop iterations is visible, the whole thing reads as broken. This skill exists to force the constraints that make seams invisible: take the shortest duration available, keep the motion ambient (no narrative, no big camera moves), use the fast model (`ltx`), and prompt for a composition where the first and last frames are functionally identical.
15
15
 
16
16
  **Duration is not a dial here.** `summer_generate_video` accepts only `duration=5` or `duration=10`; the server coerces every other value to 5. So "drop to 3s to hide the seam" is not an option — 5s is the floor, and the seam has to be won in the prompt and the reference frame instead.
17
17
 
18
- If the user wants a 5s punchy marketing shot, that's `video/trailer-shot`. If they want a 10s narrative cutscene, that's `video/cinematic-cutscene`. This skill is the one for video that has to *disappear* — atmosphere behind a logo, mood behind a menu, ambience behind a splash card.
18
+ If the user wants a 5s punchy marketing shot, that's `trailer-shot`. If they want a 10s narrative cutscene, that's `cinematic-cutscene`. This skill is the one for video that has to *disappear* — atmosphere behind a logo, mood behind a menu, ambience behind a splash card.
19
19
 
20
20
  ## When to use
21
21
 
@@ -28,9 +28,9 @@ If the user wants a 5s punchy marketing shot, that's `video/trailer-shot`. If th
28
28
 
29
29
  ## When NOT to use
30
30
 
31
- - Marketing shot for a trailer (5-10s with punch) — `video/trailer-shot`.
32
- - Narrative cutscene with a beginning and end — `video/cinematic-cutscene`.
33
- - Static splash image — generate with `2d-assets/concept-art` and use a `TextureRect`. A still is cheaper, lighter, and never seams.
31
+ - Marketing shot for a trailer (5-10s with punch) — `trailer-shot`.
32
+ - Narrative cutscene with a beginning and end — `cinematic-cutscene`.
33
+ - Static splash image — generate with `concept-art` and use a `TextureRect`. A still is cheaper, lighter, and never seams.
34
34
  - UI element animation (icons, button states) — those are GDScript `Tween` or sprite sheets, not video.
35
35
  - A 10-second shot you want to "loop". That seam will be visible. Either accept a hard cut every 10s (ugly) or generate a 5s clip designed to loop.
36
36
 
@@ -40,21 +40,21 @@ If the user wants a 5s punchy marketing shot, that's `video/trailer-shot`. If th
40
40
 
41
41
  > Quick check — this loop will play on a screen the user might stare at for 30+ seconds. That means the loop point must be invisible. I'll take the 5s minimum and prompt for ambient motion (drift, flicker, shimmer) rather than a narrative beat. OK?
42
42
 
43
- If the user wants narrative motion (a character walking, a door opening), this is the wrong skill — route to `video/cinematic-cutscene`.
43
+ If the user wants narrative motion (a character walking, a door opening), this is the wrong skill — route to `cinematic-cutscene`.
44
44
 
45
45
  ### 2. Pick the model — `ltx` first, always
46
46
 
47
- For loops, `ltx` is correct ~95% of the time. It's $0.10, ~30s, and the constraints (short duration, ambient motion) are exactly the ones `ltx` handles best. Premium models add cost without adding loop quality.
47
+ For loops, `ltx` is almost always right. It takes ~30s, and short ambient motion is what it handles best. The premium models cost more credits and do not loop better.
48
48
 
49
49
  This skill always passes `imageUrl` (step 3), which puts every call on the image-to-video route — and that route accepts only `ltx`, `kling`, and `minimax`. `kling-turbo` and `veo3` are text-to-video only; pairing either with an `imageUrl` is a 400 `invalid_model`, not a silent downgrade.
50
50
 
51
- | Model | i2v? | Cost | Speed | When |
52
- |---|---|---|---|---|
53
- | `ltx` | yes | $0.10 | ~30s | Default. Use this. |
54
- | `kling` | yes | $0.50 | 2-4 min | Only if the loop is the centerpiece of a premium splash and quality is visibly lacking on `ltx` |
55
- | `minimax` | yes | $0.25 | 2-3 min | Stylized / anime aesthetic loops |
56
- | `kling-turbo` | **no** | $0.30 | 1-2 min | Not reachable from this skill — text-to-video only |
57
- | `veo3` | **no** | $1.00 | 3-5 min | Not reachable from this skill, and pointless for ambient loops anyway |
51
+ | Model | i2v? | Speed | When |
52
+ |---|---|---|---|
53
+ | `ltx` | yes | ~30s | Default. Use this. |
54
+ | `kling` | yes | 2-4 min | Only if the loop is the centerpiece of a premium splash and quality is visibly lacking on `ltx` |
55
+ | `minimax` | yes | 2-3 min | Stylized / anime aesthetic loops |
56
+ | `kling-turbo` | **no** | 1-2 min | Not reachable from this skill — text-to-video only |
57
+ | `veo3` | **no** | 3-5 min | Not reachable from this skill, and pointless for ambient loops anyway |
58
58
 
59
59
  ### 3. Lock the look with a reference still
60
60
 
@@ -69,7 +69,7 @@ summer_generate_image(
69
69
 
70
70
  `summer_generate_image` has no size or aspect argument — `options.image_size` is dropped without an error and every MCP image comes back at the server's 1:1 default. Ask for the framing in the prompt, or generate the reference in the Summer dashboard (which exposes aspect ratio) and pass its URL.
71
71
 
72
- This matters more than usual here: on the image-to-video route `aspectRatio` is **not applied at all** — the clip inherits the reference image's framing. So a vertical mobile splash needs a genuinely 9:16 reference image, and setting `aspectRatio="9:16"` on the video call does nothing.
72
+ On the image-to-video route `aspectRatio` is **not applied at all** — the clip inherits the reference image's framing. So a vertical mobile splash needs a 9:16 reference image, and setting `aspectRatio="9:16"` on the video call does nothing.
73
73
 
74
74
  ### 4. Prompt for loopable motion only
75
75
 
@@ -89,7 +89,7 @@ summer_generate_video(
89
89
  )
90
90
  ```
91
91
 
92
- The phrase **"looping, seamless"** in the prompt biases the model toward stable first/last frames. `options.negative_prompt` is one of the few provider keys that does pass through on the video route (`prompt`, `image_url`, `num_frames`, `duration`, `resolution`, and `model` are stripped; everything else is forwarded), so the negative genuinely rules out narrative drift here — unlike on `summer_generate_image`, where no such argument exists.
92
+ The phrase **"looping, seamless"** in the prompt biases the model toward stable first/last frames. `options.negative_prompt` is one of the few provider keys that does pass through on the video route (`prompt`, `image_url`, `num_frames`, `duration`, `resolution`, and `model` are stripped; everything else is forwarded), so the negative prompt does rule out narrative drift here — unlike on `summer_generate_image`, where no such argument exists.
93
93
 
94
94
  `aspectRatio` is omitted deliberately: it is applied on the text-to-video path only, and this call passes `imageUrl`.
95
95
 
@@ -115,7 +115,7 @@ VideoStream exts: ["ogv", "tres", "res"]
115
115
  ERROR: No loader found for resource: res://clip.mp4 (expected type: unknown)
116
116
  ```
117
117
 
118
- `summer_import_from_url` downloads the bytes, runs Godot's import pipeline, and *fails the import* if the file never becomes a loadable resource — so importing the `.mp4` does not quietly half-work, it is rejected and rolled back. Convert first:
118
+ `summer_import_from_url` downloads the bytes, runs the engine's import pipeline, and *fails the import* if the file never becomes a loadable resource — so importing the `.mp4` does not quietly half-work, it is rejected and rolled back. Convert first:
119
119
 
120
120
  ```
121
121
  ffmpeg -i title_screen_bg.mp4 -c:v libtheora -q:v 8 -an title_screen_bg.ogv
@@ -137,7 +137,7 @@ summer_set_prop(scenePath="res://ui/title_screen.tscn", path="./BackgroundLoop",
137
137
  summer_save_scene(scenePath="res://ui/title_screen.tscn")
138
138
  ```
139
139
 
140
- Anchors preset 15 is "full rect" — the loop fills the menu. Place the logo and menu buttons as children *above* the `VideoStreamPlayer` in the tree (Godot draws siblings in tree order; later siblings render on top).
140
+ Anchors preset 15 is "full rect" — the loop fills the menu. Place the logo and menu buttons as children *above* the `VideoStreamPlayer` in the tree (Controls draw in tree order; later siblings render on top).
141
141
 
142
142
  ### 7. Mute the audio track
143
143
 
@@ -147,22 +147,22 @@ Loops should never have a baked audio track that loops with them — the audio s
147
147
  summer_set_prop(scenePath="res://ui/title_screen.tscn", path="./BackgroundLoop", key="volume_db", value=-80)
148
148
  ```
149
149
 
150
- Score the menu separately with `audio/music-track`.
150
+ Score the menu separately with `music-track`.
151
151
 
152
152
  ## Reference card — prompts that work
153
153
 
154
154
  Pattern: `<subject> + <ambient loopable motion> + <constant lighting> + "looping, seamless" + <stylistic anchor>`. Keep under 40 words. Always pair with `imageUrl`.
155
155
 
156
- | Goal | Model | Prompt | Cost | Duration |
157
- |---|---|---|---|---|
158
- | Title menu — fog forest | `ltx` | `dense pine forest in low fog, fog drifting slowly between trunks, soft moonlight, ambient particles rising, looping, seamless, cinematic painterly` | $0.10 | 5s |
159
- | Title menu — dungeon torch | `ltx` | `stone dungeon corridor lit by a single torch, flame flickering steadily, dust motes drifting in the light cone, looping, seamless` | $0.10 | 5s |
160
- | Splash — embers / sky | `ltx` | `dusk sky with slow drifting embers rising upward across frame, deep blue gradient, looping, seamless, cinematic` | $0.10 | 5s |
161
- | Logo backdrop — magic runes | `ltx` | `dark surface with glowing blue runes pulsing softly in slow rhythm, faint shimmer, no narrative motion, looping, seamless` | $0.10 | 5s |
162
- | Menu — underwater | `ltx` | `underwater scene with caustic light dancing on a sandy floor, slow drifting bubbles, gentle current sway on kelp, looping, seamless` | $0.10 | 5s |
163
- | Pause screen — slow rain | `ltx` | `window pane with continuous gentle rain drops, blurred warm interior glow behind, looping, seamless, ambient` | $0.10 | 5s |
164
- | Title — anime sky | `minimax` | `anime style cumulus clouds drifting slowly across a pastel sunset sky, soft, painterly, looping, seamless, Ghibli` | $0.25 | 5s |
165
- | Premium splash centerpiece | `kling` | `dragon silhouette breathing in profile against a vast sunset sky, only the chest rising and falling and clouds drifting, looping, seamless` | $0.50 | 5s |
156
+ | Goal | Model | Prompt | Duration |
157
+ |---|---|---|---|
158
+ | Title menu — fog forest | `ltx` | `dense pine forest in low fog, fog drifting slowly between trunks, soft moonlight, ambient particles rising, looping, seamless, cinematic painterly` | 5s |
159
+ | Title menu — dungeon torch | `ltx` | `stone dungeon corridor lit by a single torch, flame flickering steadily, dust motes drifting in the light cone, looping, seamless` | 5s |
160
+ | Splash — embers / sky | `ltx` | `dusk sky with slow drifting embers rising upward across frame, deep blue gradient, looping, seamless, cinematic` | 5s |
161
+ | Logo backdrop — magic runes | `ltx` | `dark surface with glowing blue runes pulsing softly in slow rhythm, faint shimmer, no narrative motion, looping, seamless` | 5s |
162
+ | Menu — underwater | `ltx` | `underwater scene with caustic light dancing on a sandy floor, slow drifting bubbles, gentle current sway on kelp, looping, seamless` | 5s |
163
+ | Pause screen — slow rain | `ltx` | `window pane with continuous gentle rain drops, blurred warm interior glow behind, looping, seamless, ambient` | 5s |
164
+ | Title — anime sky | `minimax` | `anime style cumulus clouds drifting slowly across a pastel sunset sky, soft, painterly, looping, seamless, Ghibli` | 5s |
165
+ | Premium splash centerpiece | `kling` | `dragon silhouette breathing in profile against a vast sunset sky, only the chest rising and falling and clouds drifting, looping, seamless` | 5s |
166
166
 
167
167
  ### Bad prompts and why
168
168
 
@@ -178,7 +178,7 @@ Pattern: `<subject> + <ambient loopable motion> + <constant lighting> + "looping
178
178
 
179
179
  - **Asking the model for a 10s loop.** Past ~6s, identity drifts and the seam shows. `duration=5` is both the floor and the right answer; 10 is the only other value the API accepts.
180
180
  - **Treating `summer_generate_video` as synchronous.** It returns `{ queued: true, jobId }` and no URL. Poll `summer_check_job` before claiming a clip exists.
181
- - **Spending `kling` money on a loop.** `ltx` is the right call ~95% of the time. The constraints favor the cheap model.
181
+ - **Using `kling` for a loop.** `ltx` is almost always right; short ambient motion is what it does best.
182
182
  - **Prompting narrative motion.** "Hero draws sword" doesn't loop. Use ambient verbs.
183
183
  - **Forgetting `loop=true` on the `VideoStreamPlayer`.** The clip will play once and freeze on the last frame.
184
184
  - **Forgetting to mute baked audio.** If audio is on, the loop point becomes audible even if it's invisible.
@@ -188,17 +188,17 @@ Pattern: `<subject> + <ambient loopable motion> + <constant lighting> + "looping
188
188
  ## Edge cases
189
189
 
190
190
  - **Splash loop must be tiny in build size.** Loops compress aggressively because of low motion. Target ≤2MB by exporting at 720p, low bitrate, in DaVinci. Studio's import doesn't re-encode by default.
191
- - **Mobile portrait splash.** The reference image must genuinely be portrait — `aspectRatio` is ignored on the image-to-video path, and MCP image generation is square-only, so make the reference in the Summer dashboard or crop it. Anchors preset 15 still works.
191
+ - **Mobile portrait splash.** The reference image must be portrait — `aspectRatio` is ignored on the image-to-video path, and MCP image generation is square-only, so make the reference in the Summer dashboard or crop it. Anchors preset 15 still works.
192
192
  - **Loop must sync to a music beat.** The video model doesn't know your BPM. Generate at the duration matching one bar at the menu music tempo (e.g. 120 BPM × 4 beats = 2s, or 8 beats = 4s) and confirm visually.
193
193
  - **Loop is behind translucent UI.** Generate with extra contrast headroom — the model tends toward mid-grey, and translucent UI on mid-grey reads muddy. Push for `high contrast cinematic` in the prompt.
194
194
  - **Loop seam still visible after 3 regens.** Set up two `VideoStreamPlayer` siblings and crossfade between them with a `Tween` on a 0.5s overlap. Costs an extra GPU decode but hides the seam.
195
195
 
196
196
  ## Fallback (no MCP)
197
197
 
198
- If the Studio MCP server isn't running, route the user to the Studio web dashboard:
198
+ If the MCP server isn't running, route the user to the Summer dashboard:
199
199
 
200
200
  1. Image tab → generate the reference still (the loop's "neutral frame").
201
- 2. Video tab → image-to-video with `ltx`, duration 4s, aspect ratio per target.
201
+ 2. Video tab → image-to-video with `ltx`, duration 5s, aspect ratio per target.
202
202
  3. Prompt with the loopable-motion vocabulary above and `"looping, seamless"`.
203
203
  4. Download the result, transcode to `.ogv` if needed, place under `assets/video/loops/`.
204
204
 
@@ -209,16 +209,16 @@ Print the exact prompt + model + duration + aspect ratio so the user can paste i
209
209
  Once the loop is wired:
210
210
 
211
211
  > Loop `title_screen_bg` is wired to `TitleScreen/BackgroundLoop` with autoplay + loop. Next:
212
- > - Score the menu with `audio/music-track` — a quiet ambient bed scored to the loop's mood.
213
- > - For the logo and menu UI on top, hand off to `2d-assets/ui-graphics`.
214
- > - If the user wants a punchy 5s shot for the trailer using the same look, hand off to `video/trailer-shot` (reuse the reference image).
215
- > - If the user wants a narrative intro that plays *before* the title loops, hand off to `video/cinematic-cutscene`.
212
+ > - Score the menu with `music-track` — a quiet ambient bed scored to the loop's mood.
213
+ > - For the logo and menu UI on top, hand off to `ui-graphics`.
214
+ > - If the user wants a punchy 5s shot for the trailer using the same look, hand off to `trailer-shot` (reuse the reference image).
215
+ > - If the user wants a narrative intro that plays *before* the title loops, hand off to `cinematic-cutscene`.
216
216
 
217
217
  ## See also
218
218
 
219
- - `video/trailer-shot` — punchy marketing footage.
220
- - `video/cinematic-cutscene` — narrative cutscenes with dialogue.
221
- - `audio/music-track` — score the menu.
222
- - `2d-assets/ui-graphics` — logo, menu buttons, HUD that sits over the loop.
223
- - `2d-assets/concept-art` — produce the reference still that anchors the loop.
219
+ - `trailer-shot` — punchy marketing footage.
220
+ - `cinematic-cutscene` — narrative cutscenes with dialogue.
221
+ - `music-track` — score the menu.
222
+ - `ui-graphics` — logo, menu buttons, HUD that sits over the loop.
223
+ - `concept-art` — produce the reference still that anchors the loop.
224
224
  - `../../references/mcp-tools-reference/mcp-tools-reference.md` — `summer_generate_video` parameter schema and error codes.
@@ -11,18 +11,18 @@ paths: ["**/*.gd", "**/*.tscn", "**/*.tres"]
11
11
 
12
12
  # AnimationTree — Wire Clips Into Behavior
13
13
 
14
- Generation gives you clips. The AnimationTree gives the character life. This skill is **not generative** — no FAL, no MCP AI calls. It composes existing clips on an `AnimationPlayer` into an `AnimationTree` with a `StateMachine` for distinct states (idle / attack / hit / dead) and `BlendSpace` nodes for continuous parameters (walk-run blend by speed). Done right, the character moves like a shipped game; done wrong, you get T-poses, snapping, or animations that "eat" each other.
14
+ This skill generates nothing. It composes existing clips on an `AnimationPlayer` into an `AnimationTree` with a `StateMachine` for distinct states (idle / attack / hit / dead) and `BlendSpace` nodes for continuous parameters (walk-run blend by speed). Wired wrong, you get T-poses, snapping, or clips that cut each other off.
15
15
 
16
16
  The canonical Summer Engine stack:
17
17
 
18
18
  ```
19
19
  Character (CharacterBody3D)
20
- ├── Skeleton3D (from the Meshy rig)
20
+ ├── Skeleton3D (from the rigged GLB)
21
21
  ├── AnimationPlayer # holds the raw clips (idle, walk, run, attack_sword, ...)
22
22
  └── AnimationTree # references AnimationPlayer, drives behavior
23
23
  ```
24
24
 
25
- Before adding the tree, prove direct `AnimationPlayer.play()` visibly moves the rig. Godot may import animation GLBs as `AnimationLibrary` resources or as `PackedScene`s with embedded `AnimationPlayer`s. If a copied clip appears in the list but the mesh T-poses, its tracks probably target a different root/skeleton path. Use the embedded player that came with the matching GLB, or remap/copy tracks only after confirming they target the active `Skeleton3D`. An inactive AnimationTree is also a no-op, so always set `AnimationTree.active = true`.
25
+ Before adding the tree, prove direct `AnimationPlayer.play()` visibly moves the rig. The engine may import animation GLBs as `AnimationLibrary` resources or as `PackedScene`s with embedded `AnimationPlayer`s. If a copied clip appears in the list but the mesh T-poses, its tracks probably target a different root/skeleton path. Use the embedded player that came with the matching GLB, or remap/copy tracks only after confirming they target the active `Skeleton3D`. An inactive AnimationTree is also a no-op, so always set `AnimationTree.active = true`.
26
26
 
27
27
  ## When to use this skill
28
28
 
@@ -72,7 +72,7 @@ Before walking the CRUD steps below, check the ctx lane — one `summer_run_scri
72
72
  - **Animation-tier engines:** `ctx.anim_state_machine(character, {states: {...}, transitions: [[from, to, {blend_s: 0.2}], ...], start: "idle"})` gets-or-creates the AnimationTree, wires it to the player, builds the state machine, sets `active = true`. Unknown clip names come back as a report entry listing the player's REAL clips — never wire against guessed names. Full recipe (inspect clips/bones first, method-track events, root motion, playtest verification): `character-animation-wiring`.
73
73
  - **Any engine (raw fallback):** the same classes are fully script-bound — `AnimationNodeStateMachine.add_node(name, AnimationNodeAnimation)`, `add_transition(from, to, AnimationNodeStateMachineTransition)` (one transition resource each, `xfade_time` on it), then `tree.anim_player = tree.get_path_to(player)`, `tree.tree_root = sm`, `tree.active = true`, and `ctx.set_owner_recursive(tree)`. The raw script is quoted in `character-animation-wiring`.
74
74
 
75
- Note the helper's scope honestly: `anim_state_machine` builds clip states + transitions only. The canonical machine below — BlendSpace1D locomotion, OneShot attack/hit — still needs the `.tres` (or raw-script) lane for those node types. Discrete idle/walk/run backbones don't.
75
+ Scope: `anim_state_machine` builds clip states + transitions only. The canonical machine below — BlendSpace1D locomotion, OneShot attack/hit — still needs the `.tres` (or raw-script) lane for those node types. Discrete idle/walk/run backbones don't.
76
76
 
77
77
  ## Steps via MCP
78
78
 
@@ -259,7 +259,7 @@ Then `summer_play` and watch — the goblin should idle in place, blend up to wa
259
259
 
260
260
  - **OneShot:** the action is a *temporary override* of an underlying state (attack while running, hit-react while attacking). The base keeps playing.
261
261
  - **StateMachine state:** the action is a *replacement* (dead, stunned, ragdoll). Nothing else plays.
262
- - Combat in 2026-feel games is almost always OneShot for attacks + StateMachine state for "dead". Don't model attacks as StateMachine states unless you need precise transition control between attack-string variants.
262
+ - Action combat is usually OneShot for attacks + a StateMachine state for "dead". Don't model attacks as StateMachine states unless you need precise transition control between attack-string variants.
263
263
 
264
264
  ### BlendSpace1D vs BlendSpace2D
265
265
 
@@ -270,7 +270,7 @@ Then `summer_play` and watch — the goblin should idle in place, blend up to wa
270
270
 
271
271
  - Skipping AnimationTree and calling `AnimationPlayer.play("walk")` from script. Works for one clip; breaks the moment you need a crossfade.
272
272
  - Modeling every attack as a StateMachine state. The transition matrix explodes (N states × N transitions). Use one OneShot per attack and switch its inner clip via `parameters/Attack/animation`.
273
- - Writing the `.tres` by hand without using sub_resource IDs — Godot loses references and the inspector is unhappy. Always use `[sub_resource id="..."]` blocks.
273
+ - Writing the `.tres` by hand without using sub_resource IDs — the engine loses the references. Always use `[sub_resource id="..."]` blocks.
274
274
  - Driving `blend_position` from raw input (`Input.get_axis(...)`). Drive from actual velocity — that way the blend matches the body's real motion, including knockback and slope-slide.
275
275
 
276
276
  ## Edge cases
@@ -13,7 +13,7 @@ paths: [".summer/**", "project.godot", "**/*.tscn"]
13
13
 
14
14
  ## Overview
15
15
 
16
- A consistent art direction is what makes a low-budget game *look* like a finished game. Most solo devs lose this fight by mixing styles — a toon-shaded character on a photoreal terrain, a pixel UI over a smooth 3D world. This skill builds an art bible the rest of the project obeys: references, palette, mood, lighting plan, post-processing, and a do/don't list. It writes to `.summer/art-bible.md` — the file every rendering / shader / lighting / VFX skill reads later.
16
+ A consistent art direction makes a low-budget game look finished. Solo developers most often lose it by mixing styles — a toon-shaded character on a photoreal terrain, a pixel UI over a smooth 3D world. This skill builds an art bible the rest of the project obeys: references, palette, mood, lighting plan, post-processing, and a do/don't list. It writes to `.summer/art-bible.md` — the file every rendering / shader / lighting / VFX skill reads later.
17
17
 
18
18
  **Core principle:** Constraint produces style. A game with **15 colors total** looks more intentional than a game with infinite-color textures. Pick the constraint, then defend it.
19
19
 
@@ -118,7 +118,7 @@ State the plan in one block. For the current Summer Engine rendering stack:
118
118
  ```
119
119
  Sun: DirectionalLight3D, color #fff2d9, energy 0.9, angle ~30° (warm low-angle)
120
120
  Sky: ProceduralSkyMaterial, sky_top_color #6b88a3, sky_horizon_color #d8b88e
121
- Ambient: AmbientLight #4a5570, energy 0.15
121
+ Ambient: Environment ambient_light_color #4a5570, ambient_light_energy 0.15
122
122
  Indoor fills: OmniLight3D color #ffd9a8, energy 0.6, range 4m
123
123
  NEVER: pure-white DirectionalLight, no ambient, hard cube shadows
124
124
  ```
@@ -138,7 +138,7 @@ Summer Engine post stack: Glow, SDFGI, SSAO, SSR, Adjustments, Color Correction
138
138
 
139
139
  ```
140
140
  Glow: ON, threshold 0.9, intensity 0.5 (soft bloom on highlights only)
141
- SDFGI: OFF for vertical-slice scope (perf cost; bake light probes later)
141
+ SDFGI: OFF for vertical-slice scope (perf cost; bake lightmaps later)
142
142
  SSAO: ON, light_affect 0.3 (just enough for grounding)
143
143
  SSR: OFF unless we have wet/glass surfaces
144
144
  Color correction: Filmic tonemap, slight S-curve LUT toward warm
@@ -159,7 +159,7 @@ This is the contract. Five do's, five don'ts. Specific, enforceable.
159
159
  - Outline shader on character + interactable props (no outline on environment).
160
160
  - Soft shadows (DirectionalLight3D shadow_blur 1.5).
161
161
  - Warm key + cool fill — never both warm or both cool.
162
- - Texture filter: Linear with mipmaps OFF for crunchy near-pixel feel.
162
+ - Texture filter: Nearest for a crunchy, near-pixel feel.
163
163
 
164
164
  ## DON'T
165
165
  - No pure white (#ffffff). Use #f4ecdf.
@@ -176,7 +176,7 @@ Some art-direction calls translate to `project.godot` settings. Apply them.
176
176
  **Preferred (Summer MCP):**
177
177
 
178
178
  ```
179
- summer_project_setting(key="rendering/textures/canvas_textures/default_texture_filter", value="2") # Linear no mipmaps if pixel-art-ish
179
+ summer_project_setting(key="rendering/textures/canvas_textures/default_texture_filter", value="0") # Nearest, if pixel-art-ish (1 = Linear, the default)
180
180
  summer_project_setting(key="rendering/environment/defaults/default_clear_color", value="Color(0.227, 0.290, 0.227)") # palette primary
181
181
  summer_project_setting(key="rendering/anti_aliasing/quality/msaa_3d", value="2") # MSAA 2x for clean edges
182
182
  ```
@@ -274,9 +274,6 @@ No template — this is a workflow that produces the bible the rest of the proje
274
274
 
275
275
  ## See also
276
276
 
277
- - `scene-and-project/brainstorm-game/SKILL.md` — produces the brief that anchors the bible
278
- - `audio/audio-direction/SKILL.md` — the sonic counterpart
279
- - `rendering-and-lighting/3d-lighting/SKILL.md` — implements the lighting plan
280
- - `shaders/shader-basics/SKILL.md` — for outline / toon shaders
281
- - `post-processing/bloom-and-glow/SKILL.md` — implements the glow rule
282
- - `post-processing/color-grading/SKILL.md` — implements the LUT and tonemap call
277
+ - `brainstorm-game` — produces the brief that anchors the bible
278
+ - `audio-direction` — the sonic counterpart
279
+ - `3d-lighting` — implements the lighting plan and the environment's glow, tonemap and SSAO settings
@@ -34,7 +34,7 @@ Ask the **exact phrase** before dispatching. Skipping the question is the most c
34
34
  | Concept art vs character portrait | "Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?" | `concept-art` (exploring) / `character-portrait` (final) |
35
35
  | Prop vs character model | "Static object (sword, chair, lantern) or rigged character that needs animation?" | `prop-model` / `character-model` |
36
36
  | Tile vs sprite sheet | "One seamless tile that repeats, or a frame grid for an animated sprite?" | `tileable-texture` / `sprite-sheet` |
37
- | SFX vs music | "One-shot effect or a longer track (loop, theme, ambient bed)?" | `sound-effect` / `music-track` (or `audio/ambient-bed`) |
37
+ | SFX vs music | "One-shot effect or a longer track (loop, theme, ambient bed)?" | `sound-effect` / `music-track` (or `ambient-bed`) |
38
38
  | Generate vs retarget motion | "Generate a new clip on this character, or apply an existing library to a new character?" | `generate-motion` / `retarget` |
39
39
  | VFX recipe vs game-feel | "Particle/shader effect in the world or screen-feel (camera shake, hit-stop)?" | `vfx-<name>` / `game-feel` |
40
40
 
@@ -61,7 +61,7 @@ Invoke the specialist via the `Skill` tool. Don't paraphrase — let it run. Pas
61
61
  | Request | Skill |
62
62
  |---|---|
63
63
  | Sword / chair / barrel / static object | `prop-model` |
64
- | Player / NPC / enemy / boss / rigged humanoid | `character-model` (canonical Meshy auto-rig) |
64
+ | Player / NPC / enemy / boss / rigged humanoid | `character-model` (generated mesh + auto-rig) |
65
65
  | Modular dungeon / building blocks | `environment-kit` |
66
66
  | Car / spaceship / hard-surface vehicle | `vehicle-model` |
67
67
  | Tree / rock / mushroom / foliage | `organic-model` |
@@ -132,4 +132,4 @@ VFX is **code, not generative** — recipes are shader + GDScript + node setup,
132
132
 
133
133
  ## Fallback (no MCP)
134
134
 
135
- The router still works without MCP — classification is text-only. It hands off to the specialist, which surfaces its own no-MCP fallback (typically: run the equivalent generation via the Summer dashboard / Meshy / nano-banana web, then `summer_import_from_url` once MCP is back).
135
+ The router still works without MCP — classification is text-only. It hands off to the specialist, which surfaces its own no-MCP fallback (typically: run the same generation in the Summer dashboard, then `summer_import_from_url` once MCP is back).
@@ -13,7 +13,7 @@ paths: [".summer/**", "project.godot", "**/*.tscn", "audio/**"]
13
13
 
14
14
  ## Overview
15
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.
16
+ Many indie games sound like one sound library used flat: the same generic "swoosh" for menu, jump, pickup and hit. 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
17
 
18
18
  **Core principle:** SFX needs a *vocabulary*, not a *library*. Eight named SFX classes with consistent character beat 80 random library hits.
19
19
 
@@ -25,7 +25,7 @@ Ask exactly this:
25
25
 
26
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
27
 
28
- Three is the minimum. One or two collapses into a clone. References are the highest-signal input — listen carefully.
28
+ Three is the minimum. One or two collapses into a clone.
29
29
 
30
30
  If they freeze, offer four axes (not titles):
31
31
 
@@ -237,9 +237,9 @@ End with:
237
237
  | Music louder than SFX | Players need SFX for gameplay; music is mood. Default mix is -8 dB music vs 0 dB SFX. |
238
238
  | No reverb buses | "Send" architecture (rooms route to a small/large/outdoor reverb bus) is mandatory or your mix sounds dry-then-wet inconsistently. |
239
239
  | Pure sine "ding" for pickup | Reads as cheap mobile game. Use a major-third interval with character. |
240
- | Same footstep sample for all surfaces | Material-aware footsteps are 80% of the perceived audio quality. |
240
+ | Same footstep sample for all surfaces | Players hear footsteps constantly; material-aware steps carry much of the perceived audio quality. |
241
241
  | No master ceiling / true peak | Audio clips on console builds without `-1 dBTP` ceiling. Always set it. |
242
- | Assuming SetResourceProperty fails silently on inline sub_resources | It does not — inline targets work, and the structural failures (`node not found`, `property is not a resource`, `resource is null`) are explicit errors. What *is* silent on current engines is a bad value shape: a JSON object instead of a Godot literal string, a misspelled `subProperty`, or a wrong-typed value returns `ok:true` yet no-ops or coerces destructively. Pass class names and literal strings, and confirm in the saved `.tres`/`.tscn`, never from `ok` alone. See `../../references/mcp-tools-reference/mcp-tools-reference.md`. |
242
+ | Assuming SetResourceProperty fails silently on inline sub_resources | It does not — inline targets work, and the structural failures (`node not found`, `property is not a resource`, `resource is null`) are explicit errors. What *is* silent on current engines is a bad value shape: a JSON object instead of an engine literal string, a misspelled `subProperty`, or a wrong-typed value returns `ok:true` yet no-ops or coerces destructively. Pass class names and literal strings, and confirm in the saved `.tres`/`.tscn`, never from `ok` alone. See `../../references/mcp-tools-reference/mcp-tools-reference.md`. |
243
243
 
244
244
  ## Collaborative protocol
245
245
 
@@ -255,9 +255,7 @@ No template — this is a workflow that produces the bible the rest of the proje
255
255
  - `../../references/godot-version/godot-version.md` — Summer compatibility and
256
256
  version-sensitive audio API notes
257
257
  - `../../references/mcp-tools-reference/mcp-tools-reference.md`
258
- - `scene-and-project/brainstorm-game/SKILL.md` — produces the brief that anchors the bible
259
- - `rendering-and-lighting/art-direction/SKILL.md` — the visual counterpart; audio must rhyme with it
260
- - `audio/audio-bus-setup/SKILL.md` (NEXT) — implements the bus layout in detail
261
- - `audio/3d-spatial-audio/SKILL.md` (NEXT) — spatial attenuation patterns
262
- - `audio/footstep-systems/SKILL.md` (NEXT) — material-aware footstep impl
263
- - `audio/dynamic-music-stingers/SKILL.md` (LATER) — implements the dynamic music plan
258
+ - `brainstorm-game` — produces the brief that anchors the bible
259
+ - `art-direction` — the visual counterpart; audio must rhyme with it
260
+ - `adaptive-music` — implements the dynamic music plan
261
+ - `sound-effect`, `music-track`, `ambient-bed`, `voice-line` — generate the audio the bible describes
@@ -172,10 +172,11 @@ Use `summer_get_diagnostics` to confirm no new errors.
172
172
  `summer_inspect_node` will **not** show you `pending_damage` mid-fight. It reads
173
173
  the edited scene in the editor — the response even tags itself
174
174
  `provenance: editor_scene` — so it reports the saved node, not the live
175
- instance. Runtime values need a runtime probe.
175
+ instance. Runtime values need a runtime read: with the game running, read
176
+ the enemy with `summer_inspect_runtime_node` or `summer_game_probe` (engine
177
+ builds with the runtime-control ops; see the `agent-playtesting` skill).
176
178
 
177
- The route that works from MCP is the `RunVerification` op, sent through
178
- `summer_batch`. It spins up a hidden, disposable game instance that runs a
179
+ On any build, the `RunVerification` op, sent through `summer_batch`, also works. It spins up a hidden, disposable game instance that runs a
179
180
  GDScript probe and exits; it never touches the editor:
180
181
 
181
182
  ```
@@ -0,0 +1,95 @@
1
+ ---
2
+ name: bounded-engine-runs
3
+ description: "Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: workflow
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Glob Edit Write Bash
9
+ paths: ["project.godot", "tests/**/*.gd", "tools/**/*.gd"]
10
+ ---
11
+
12
+ # Bounded engine runs for agents
13
+
14
+ Agents verify games by running the engine many times: imports, tests, captures, multiplayer bots. A run
15
+ that hangs, overlaps another, makes noise or hides an error costs time. These rules keep runs safe when
16
+ several agents share one project on one machine.
17
+
18
+ ## 1. Every run is bounded, muted and alone
19
+
20
+ - **Bound it.** macOS has no `timeout`. Wrap runs so the engine itself gets killed:
21
+ ```sh
22
+ perl -e 'alarm shift; exec @ARGV' 180 <summer> --headless --path . -s res://tests/run_tests.gd
23
+ ```
24
+ `alarm` survives `exec`; exit code 142 means the limit hit.
25
+ - **One engine per project at a time.** Two engines writing the same `.godot/` import cache corrupt it or
26
+ freeze each other's captures. Serialize with a lock file held by the engine process:
27
+ ```sh
28
+ perl -e 'use Fcntl qw(:flock); $^F=255; open(my $l,">>",shift) or die; flock($l,LOCK_EX); alarm shift; exec @ARGV' \
29
+ <project>/.engine.lock 180 <summer> ...
30
+ ```
31
+ Put this in one wrapper script and make every agent use it.
32
+ - **Cap its memory.** A time limit does not stop a run from eating all memory first; several engine runs plus a
33
+ browser loading a large web export can exhaust memory and crash the machine. The wrapper should run the command as a child, sum the resident
34
+ memory of its whole process tree (browsers spawn GPU/renderer helpers), kill the tree past a cap (e.g.
35
+ 3 GB), and also stop when system free memory falls low (`sysctl -n kern.memorystatus_level` < 15 on macOS),
36
+ because GPU memory on Apple Silicon is system memory but is not counted in RSS. Refuse to start when the
37
+ system is already short (< 35).
38
+ - **Mute it.** `--audio-driver Dummy`.
39
+ - **Render only when you must, and offscreen.** `--headless` for logic (no pixels). For visual checks use
40
+ `--summer-offscreen` with a fixed `--resolution` and a capture script that saves PNGs and quits. Visible
41
+ windows only when a human asked to watch.
42
+
43
+ ## 2. Imports and parse errors
44
+
45
+ - New `class_name` scripts are unknown to `-s` scripts until an import pass registers them:
46
+ `<summer> --headless --audio-driver Dummy --path . --import`.
47
+ - The first import may rewrite `project.godot` (reorder keys, add a `[summer]` section; one trial saw a
48
+ hand-written `[rendering]` section dropped). Check `git diff project.godot` after it, and pass renderer
49
+ choices on the command line (`--rendering-method ...`) when a run depends on them.
50
+ - One broken `class_name` script cascades into "Could not parse global class" and dozens of unrelated
51
+ "cannot infer type" errors. Get the real line with:
52
+ `<summer> --headless --path . --check-only -s res://path/to/file.gd`
53
+ - Compile every script before booting the game: a tiny `SceneTree` script that `load()`s each `.gd` under
54
+ a folder and reports `can_instantiate()` failures, exit code = failures.
55
+
56
+ ## 3. Tests that can't lie
57
+
58
+ - A runtime script error inside a test does not fail it by default; the test just stops and counts as
59
+ passed. Register a logger and fail the test when its error count rises:
60
+ ```gdscript
61
+ class ErrorCounter extends Logger:
62
+ var script_errors := 0
63
+ func _log_error(_f: String, file: String, _line: int, _c: String, _r: String, _n: bool, type: int, _bt: Array[ScriptBacktrace]) -> void:
64
+ if type == Logger.ERROR_TYPE_SCRIPT or file.ends_with(".gd"):
65
+ script_errors += 1
66
+ func _log_message(_m: String, _e: bool) -> void:
67
+ pass
68
+ # in the runner: OS.add_logger(counter); compare counter.script_errors before and after each test
69
+ ```
70
+ - Exit 0 is not success. Always grep the log for `SCRIPT ERROR`, `Parse Error` and `ERROR:`, and print
71
+ one explicit success line (`TESTS passed=N failed=0`) you can check for.
72
+
73
+ ## 4. Typed GDScript traps agents hit repeatedly
74
+
75
+ - `var x := dict["k"]` cannot infer a type (Dictionary values are Variant). Write `var x: int = dict["k"]`.
76
+ - A loop variable that shadows an outer variable is a parse error that takes the whole class down.
77
+ - Don't name a class after an engine class (`SummerSession`); the error only says it "hides a native class".
78
+
79
+ ## 5. Web exports on a dev machine
80
+
81
+ - Check the `.pck` size before opening it in a browser; the browser holds all of it in memory. A project that
82
+ exports every imported asset of a large scene can pass 250 MB. Ship only what the game uses first.
83
+ - Load it in a browser only under the same memory-capped wrapper, one at a time, never next to other engine runs.
84
+
85
+ ## 6. Captures you can trust
86
+
87
+ - Read every PNG you produce. If several files are identical (`md5 -r *.png`), the run froze; rerun alone.
88
+ - Keep evidence outside the project (logs, PNGs) so imports never pick it up. If it must live inside, put an
89
+ empty `.gdignore` file in that folder so the editor and imports skip it.
90
+
91
+ ## See also
92
+
93
+ - `headless-scripting` (writing the SceneTree scripts these runs execute)
94
+ - `multiplayer-testing` (Local Play bot runs)
95
+ - `compatibility-renderer-traps` (dual-renderer captures)
@@ -0,0 +1,29 @@
1
+ id: skill/bounded-engine-runs
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes."
5
+ use_when:
6
+ - running the engine from a shell or agent for tests, imports, captures or bots
7
+ - several agents or processes share one project
8
+ - a run hangs, a capture freezes, or errors cascade across unrelated scripts
9
+ facets:
10
+ lifecycle:
11
+ - build
12
+ domains:
13
+ - agent-workflow
14
+ - headless
15
+ - verification
16
+ modalities:
17
+ - project
18
+ - scripts
19
+ compatibility:
20
+ engine: ">=4.6"
21
+ related:
22
+ skills:
23
+ - skill/headless-scripting
24
+ - skill/multiplayer-testing
25
+ - skill/compatibility-renderer-traps
26
+ source: official
27
+ license: MIT
28
+ status: preview
29
+ recommended: true
@@ -201,8 +201,8 @@ No template — this is a workflow that produces the brief that drives template
201
201
 
202
202
  ## See also
203
203
 
204
- - `gameplay-mechanics/design-mechanic/SKILL.md` — design the core loop in detail
205
- - `level-design/design-level/SKILL.md` — sketch level 1
206
- - `rendering-and-lighting/art-direction/SKILL.md` — turn the one-phrase look into a full bible
207
- - `audio/audio-direction/SKILL.md` — sonic identity
208
- - `scene-and-project/make-game/SKILL.md` — scaffold the project once the brief is locked
204
+ - `design-mechanic` — design the core loop in detail
205
+ - `design-level` — sketch level 1
206
+ - `art-direction` — turn the one-phrase look into a full bible
207
+ - `audio-direction` — sonic identity
208
+ - `make-game` — scaffold the project once the brief is locked