summer-engine 3.4.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +5 -1
  3. package/.codex-plugin/plugin.json +5 -1
  4. package/.cursor-plugin/plugin.json +5 -1
  5. package/.factory-plugin/plugin.json +5 -1
  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 +37 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +35 -35
  13. package/assets/autopilot/run.sh +2 -2
  14. package/assets/navigation/web-routes.json +1 -1
  15. package/commands/gameskill.md +2 -2
  16. package/commands/summer.md +25 -25
  17. package/dist/cli/commands/open.d.ts +1 -1
  18. package/dist/cli/commands/run.d.ts +1 -1
  19. package/dist/cli/commands/run.js +1 -1
  20. package/dist/cli/commands/setup.js +24 -4
  21. package/dist/cli/commands/skills.js +2 -2
  22. package/dist/core/api-client.d.ts +5 -6
  23. package/dist/core/api-client.js +12 -15
  24. package/dist/core/auth.js +2 -2
  25. package/dist/core/capabilities/asset-import.d.ts +0 -1
  26. package/dist/core/capabilities/camera-view.d.ts +1 -1
  27. package/dist/core/capabilities/camera-view.js +2 -2
  28. package/dist/core/capabilities/capture-gameplay.d.ts +72 -7
  29. package/dist/core/capabilities/capture-gameplay.js +386 -25
  30. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  31. package/dist/core/capabilities/connect-signal.js +1 -2
  32. package/dist/core/capabilities/console-read.d.ts +2 -2
  33. package/dist/core/capabilities/console-read.js +2 -2
  34. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  35. package/dist/core/capabilities/engine-receipt.js +7 -9
  36. package/dist/core/capabilities/export-engine-version.d.ts +7 -0
  37. package/dist/core/capabilities/export-engine-version.js +9 -0
  38. package/dist/core/capabilities/export-game.d.ts +4 -0
  39. package/dist/core/capabilities/export-game.js +53 -10
  40. package/dist/core/capabilities/export-presets.d.ts +1 -1
  41. package/dist/core/capabilities/export-presets.js +1 -1
  42. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  43. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  44. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  45. package/dist/core/capabilities/frame-quality.js +4 -4
  46. package/dist/core/capabilities/grep.d.ts +1 -1
  47. package/dist/core/capabilities/grep.js +1 -1
  48. package/dist/core/capabilities/image-generation.d.ts +12 -2
  49. package/dist/core/capabilities/image-generation.js +31 -2
  50. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  51. package/dist/core/capabilities/navigation/open.js +1 -1
  52. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  53. package/dist/core/capabilities/navigation/targets.js +2 -2
  54. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  55. package/dist/core/capabilities/placement-batch.js +2 -2
  56. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  57. package/dist/core/capabilities/play-determinism.js +1 -1
  58. package/dist/core/capabilities/publish-build.d.ts +1 -1
  59. package/dist/core/capabilities/publish-build.js +21 -9
  60. package/dist/core/capabilities/publish-download.d.ts +1 -2
  61. package/dist/core/capabilities/publish-download.js +2 -3
  62. package/dist/core/capabilities/replace-node.d.ts +1 -3
  63. package/dist/core/capabilities/replace-node.js +1 -3
  64. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  65. package/dist/core/capabilities/runtime-control.js +7 -9
  66. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  67. package/dist/core/capabilities/scene-batch.js +1 -1
  68. package/dist/core/capabilities/scene-kind.js +1 -1
  69. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  70. package/dist/core/capabilities/scene-readback.js +3 -4
  71. package/dist/core/capabilities/scene-script.d.ts +2 -2
  72. package/dist/core/capabilities/scene-script.js +2 -2
  73. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  74. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  75. package/dist/core/capabilities/summer-bundle.d.ts +11 -3
  76. package/dist/core/capabilities/summer-bundle.js +21 -3
  77. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  78. package/dist/core/capabilities/surface-snap.js +1 -1
  79. package/dist/core/capabilities/tool-dispatch.js +14 -3
  80. package/dist/core/capabilities/ui-control.d.ts +1 -2
  81. package/dist/core/capabilities/ui-control.js +1 -2
  82. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  83. package/dist/core/capabilities/world-snapshot.js +1 -1
  84. package/dist/core/capability-skew.d.ts +2 -3
  85. package/dist/core/capability-skew.js +4 -5
  86. package/dist/core/feedback/client.js +1 -1
  87. package/dist/core/launch-posture.d.ts +3 -3
  88. package/dist/core/launch-posture.js +3 -3
  89. package/dist/core/library-read.d.ts +7 -0
  90. package/dist/core/library-read.js +60 -9
  91. package/dist/core/library-search.d.ts +2 -0
  92. package/dist/core/templates.d.ts +1 -2
  93. package/dist/core/templates.js +1 -2
  94. package/dist/installer/agent-config.d.ts +25 -0
  95. package/dist/installer/agent-config.js +114 -3
  96. package/dist/installer/agent-table.d.ts +12 -0
  97. package/dist/installer/agent-table.js +9 -0
  98. package/dist/mcp/server.d.ts +2 -2
  99. package/dist/mcp/server.js +2 -2
  100. package/dist/mcp/tools/creator-tools.js +33 -4
  101. package/dist/mcp/tools/debug-tools.js +1 -1
  102. package/dist/mcp/tools/generate-tools.js +18 -37
  103. package/dist/mcp/tools/library-tools.d.ts +2 -1
  104. package/dist/mcp/tools/library-tools.js +1 -0
  105. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  106. package/dist/mcp/tools/navigation-tools.js +1 -1
  107. package/dist/mcp/tools/spatial-tools.js +1 -1
  108. package/dist/mcp/tools/visual-tools.js +2 -2
  109. package/dist/mcp/tools/with-engine.d.ts +1 -2
  110. package/dist/mcp/tools/with-engine.js +1 -2
  111. package/gemini-extension.json +5 -1
  112. package/hooks/session-start.sh +2 -2
  113. package/integrations/README.md +70 -76
  114. package/integrations/claude/README.md +0 -3
  115. package/integrations/codex/README.md +1 -2
  116. package/integrations/copilot-jetbrains/README.md +1 -1
  117. package/integrations/cursor/README.md +1 -2
  118. package/integrations/factory/README.md +15 -11
  119. package/integrations/mistral-vibe/README.md +1 -1
  120. package/integrations/opencode/README.md +1 -1
  121. package/integrations/roo-code/README.md +1 -1
  122. package/integrations/rovo-dev/README.md +1 -1
  123. package/integrations/trae/README.md +1 -1
  124. package/integrations/windsurf/README.md +3 -3
  125. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  126. package/library/references/gd-style/gd-style.md +4 -6
  127. package/library/references/godot-version/godot-version.md +3 -3
  128. package/library/references/headless-routing/headless-routing.md +2 -2
  129. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  130. package/library/references/mcp-tools-reference/mcp-tools-reference.md +16 -15
  131. package/library/references/product-map/product-map.md +1 -1
  132. package/library/references/public-surface-language/public-surface-language.md +1 -1
  133. package/library/references/summer-folder/summer-folder.md +1 -1
  134. package/library/skills/3d-lighting/SKILL.md +4 -4
  135. package/library/skills/README.md +16 -6
  136. package/library/skills/adaptive-music/SKILL.md +7 -7
  137. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  138. package/library/skills/ambient-bed/SKILL.md +12 -14
  139. package/library/skills/animated-loop/SKILL.md +42 -42
  140. package/library/skills/animation-tree/SKILL.md +6 -6
  141. package/library/skills/art-direction/SKILL.md +8 -11
  142. package/library/skills/asset-strategy/SKILL.md +3 -3
  143. package/library/skills/audio-direction/SKILL.md +8 -10
  144. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  145. package/library/skills/bounded-engine-runs/SKILL.md +6 -7
  146. package/library/skills/brainstorm-game/SKILL.md +5 -5
  147. package/library/skills/brainstorming/SKILL.md +9 -15
  148. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  149. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  150. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  151. package/library/skills/character-model/SKILL.md +15 -26
  152. package/library/skills/character-movement/SKILL.md +1 -1
  153. package/library/skills/character-movement/references/movement-3d.md +1 -1
  154. package/library/skills/character-portrait/SKILL.md +4 -4
  155. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  156. package/library/skills/combat-basics/SKILL.md +1 -1
  157. package/library/skills/compatibility-renderer-traps/SKILL.md +2 -2
  158. package/library/skills/concept-art/SKILL.md +3 -3
  159. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  160. package/library/skills/debug/SKILL.md +5 -4
  161. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  162. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  163. package/library/skills/design-level/SKILL.md +5 -5
  164. package/library/skills/design-mechanic/SKILL.md +6 -6
  165. package/library/skills/design-npc/SKILL.md +8 -15
  166. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  167. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  168. package/library/skills/environment-kit/SKILL.md +5 -5
  169. package/library/skills/export-and-ship/SKILL.md +24 -25
  170. package/library/skills/export-and-ship/resource.yaml +2 -1
  171. package/library/skills/fabricating-assets/SKILL.md +1 -1
  172. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  173. package/library/skills/fps-controller/SKILL.md +17 -16
  174. package/library/skills/fps-controller/resource.yaml +0 -2
  175. package/library/skills/game-feel/SKILL.md +6 -7
  176. package/library/skills/gameskill/SKILL.md +3 -3
  177. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  178. package/library/skills/generate-motion/SKILL.md +5 -22
  179. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  180. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  181. package/library/skills/grow-analytics/SKILL.md +21 -0
  182. package/library/skills/grow-analytics/resource.yaml +27 -0
  183. package/library/skills/headless-scripting/SKILL.md +8 -8
  184. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  185. package/library/skills/investigating-bugs/SKILL.md +3 -11
  186. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  187. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  188. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  189. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  190. package/library/skills/make-game/SKILL.md +3 -5
  191. package/library/skills/make-game/references/2d-platformer.md +1 -1
  192. package/library/skills/multiplayer-project/SKILL.md +1 -1
  193. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  194. package/library/skills/music-track/SKILL.md +40 -38
  195. package/library/skills/new-project/SKILL.md +4 -6
  196. package/library/skills/organic-model/SKILL.md +9 -9
  197. package/library/skills/pixel-art/SKILL.md +6 -6
  198. package/library/skills/play/SKILL.md +3 -4
  199. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  200. package/library/skills/procedural-animation/SKILL.md +10 -11
  201. package/library/skills/prop-model/SKILL.md +4 -4
  202. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  203. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  204. package/library/skills/publish-your-game/SKILL.md +21 -0
  205. package/library/skills/publish-your-game/resource.yaml +29 -0
  206. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  207. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  208. package/library/skills/remote-deploy/SKILL.md +20 -21
  209. package/library/skills/retarget/SKILL.md +19 -23
  210. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  211. package/library/skills/scene-composition/SKILL.md +5 -5
  212. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  213. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  214. package/library/skills/scene-scripting/SKILL.md +3 -3
  215. package/library/skills/scene-to-level/SKILL.md +28 -31
  216. package/library/skills/skill-create/SKILL.md +1 -1
  217. package/library/skills/skill-improve/SKILL.md +9 -9
  218. package/library/skills/skill-test/SKILL.md +10 -10
  219. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  220. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  221. package/library/skills/skybox-panorama/SKILL.md +8 -9
  222. package/library/skills/sound-effect/SKILL.md +19 -19
  223. package/library/skills/spatial-placement/SKILL.md +2 -2
  224. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  225. package/library/skills/sprite-sheet/SKILL.md +10 -10
  226. package/library/skills/store-art/SKILL.md +23 -0
  227. package/library/skills/store-art/resource.yaml +30 -0
  228. package/library/skills/store-listing/SKILL.md +21 -0
  229. package/library/skills/store-listing/resource.yaml +25 -0
  230. package/library/skills/summer-analytics/SKILL.md +3 -3
  231. package/library/skills/summer-analytics/resource.yaml +1 -0
  232. package/library/skills/summer-friends/SKILL.md +10 -10
  233. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  234. package/library/skills/summer-match-results/SKILL.md +13 -13
  235. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  236. package/library/skills/summer-parties/SKILL.md +9 -9
  237. package/library/skills/summer-player-data/SKILL.md +12 -12
  238. package/library/skills/summer-store/SKILL.md +6 -6
  239. package/library/skills/summer-world-chat/SKILL.md +9 -9
  240. package/library/skills/summer-world-saves/SKILL.md +7 -7
  241. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  242. package/library/skills/tileable-texture/SKILL.md +1 -1
  243. package/library/skills/trailer-shot/SKILL.md +36 -36
  244. package/library/skills/tune-performance/SKILL.md +13 -13
  245. package/library/skills/tune-performance/resource.yaml +1 -1
  246. package/library/skills/ui-graphics/SKILL.md +7 -7
  247. package/library/skills/use-widget-asset/SKILL.md +7 -7
  248. package/library/skills/using-summer/SKILL.md +5 -7
  249. package/library/skills/vehicle-model/SKILL.md +6 -7
  250. package/library/skills/vehicle-model/resource.yaml +2 -2
  251. package/library/skills/verification-before-completion/SKILL.md +5 -6
  252. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  253. package/library/skills/vfx-fire/SKILL.md +6 -6
  254. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  255. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  256. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  257. package/library/skills/vfx-lightning/SKILL.md +5 -5
  258. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  259. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  260. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  261. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  263. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  264. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  265. package/library/skills/vfx-smoke/SKILL.md +5 -5
  266. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  267. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  268. package/library/skills/voice-line/SKILL.md +9 -9
  269. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  270. package/library/skills/writing-plans/SKILL.md +4 -4
  271. package/library/skills/writing-skills/SKILL.md +8 -8
  272. package/library/tools/capture-gameplay/resource.yaml +66 -1
  273. package/library/tools/creator-publish/resource.yaml +4 -4
  274. package/library/tools/creator-releases/resource.yaml +5 -5
  275. package/library/tools/export-game/resource.yaml +3 -0
  276. package/library/tools/generate-image/resource.yaml +4 -2
  277. package/library/tools/publish-build/resource.yaml +5 -1
  278. package/package.json +1 -1
  279. package/registry/generated/counts.json +2 -2
  280. package/registry/generated/gemini-extension.json +5 -1
  281. package/registry/generated/index.json +280 -137
  282. package/registry/generated/marketplace.claude.json +1 -1
  283. package/registry/generated/plugin.claude.json +5 -1
  284. package/registry/generated/plugin.codex.json +5 -1
  285. package/registry/generated/plugin.cursor.json +5 -1
  286. package/registry/generated/plugin.factory.json +5 -1
  287. package/registry/generated/skills-index.md +16 -6
  288. package/registry/generated/skills-registry.json +57 -5
  289. package/registry/schemas/domains.json +1 -1
  290. package/registry/schemas/skill.schema.json +5 -0
@@ -20,7 +20,7 @@ groups searching players, reserves a server for them, and every player's
20
20
  The authority then reads each player's team from the verified Session.
21
21
 
22
22
  There is no lobby object, invite code or server browser. Friends who want to
23
- play together use a party (`skill/summer-parties`), which enters a queue as one group.
23
+ play together use a party (`summer-parties`), which enters a queue as one group.
24
24
 
25
25
  Where it works:
26
26
 
@@ -31,8 +31,8 @@ Where it works:
31
31
  | Accept/Decline prompt | No: no proposal happens | Yes, when the queue declares `acceptance` |
32
32
  | Rating-based grouping | No | Yes |
33
33
 
34
- This skill extends the Courtyard game from `skill/multiplayer-project` and
35
- `skill/multiplayer-state`. Its client already joins `Game.QUEUE` and sends a
34
+ This skill extends the Courtyard game from `multiplayer-project` and
35
+ `multiplayer-state`. Its client already joins `Game.QUEUE` and sends a
36
36
  `join` Command; its authority publishes `match_doc`.
37
37
 
38
38
  ## Steps
@@ -64,7 +64,7 @@ The fields Summer accepts, and their rules:
64
64
  | `minPlayers` / `maxPlayers` | Players per match | `minPlayers` ≥ 1, `maxPlayers` ≥ `minPlayers`. Measured support is up to 16 per match |
65
65
  | `worldDefinition` | The WorldDefinition's `definition_id` | Required; every WorldDefinition must be used by a queue |
66
66
  | `policy` | `fifo` (first come) or `rating` (group by skill) | `rating` needs `ratingSystemRef`; `fifo` must not declare one |
67
- | `ratingSystemRef` | `elo_v1` (Summer rates two sides) or `authority_v1` (your authority reports rating moves) | See `skill/summer-leaderboards` |
67
+ | `ratingSystemRef` | `elo_v1` (Summer rates two sides) or `authority_v1` (your authority reports rating moves) | See `summer-leaderboards` |
68
68
  | `teams` | `{count, size}`: fixed sides, such as 2v2 = `{2, 2}` | `count` 2..64, `size` 1..16, `minPlayers` = `maxPlayers` = count × size; `elo_v1` needs exactly 2 teams |
69
69
  | `acceptance` | `{"mode": "all", "ttl": "20s"}` asks every player to accept; `{"mode": "none"}` skips it | `ttl` required with `all`, forbidden with `none` |
70
70
  | `searchTtl` | `{min, default, max}` search lifetime | Go durations (`30s`, `2m`); min ≤ default ≤ max |
@@ -249,8 +249,8 @@ one you name. In the editor and with `summer_play`, name it with the
249
249
  `summer/local_play/queue` project setting:
250
250
 
251
251
  ```
252
- summer_project_setting name="summer/local_play/queue" value="duel"
253
- summer_project_setting name="summer/local_play/players" value=2
252
+ summer_project_setting key="summer/local_play/queue" value="duel"
253
+ summer_project_setting key="summer/local_play/players" value=2
254
254
  summer_play
255
255
  summer_get_diagnostics
256
256
  summer_stop
@@ -294,8 +294,8 @@ Test the accept prompt and rating-based grouping on a hosted staging build.
294
294
 
295
295
  ## See also
296
296
 
297
- - `skill/multiplayer` — how Summer multiplayer fits together
298
- - `skill/summer-match-results` — ending a match and reporting who won
299
- - `skill/summer-leaderboards` — ratings and leaderboards for rated queues
300
- - `skill/summer-parties` — friends entering a queue together
301
- - `skill/multiplayer-testing` — Local Play options and bots
297
+ - `multiplayer` — how Summer multiplayer fits together
298
+ - `summer-match-results` — ending a match and reporting who won
299
+ - `summer-leaderboards` — ratings and leaderboards for rated queues
300
+ - `summer-parties` — friends entering a queue together
301
+ - `multiplayer-testing` — Local Play options and bots
@@ -39,7 +39,7 @@ Outside a party, or when parties are unavailable, getters are empty and
39
39
  `is_in_party()` is `false`. So the same Play button works everywhere: no party
40
40
  means an ordinary `SummerJoinTarget.queue(...)` join. Build that path first.
41
41
 
42
- This skill extends the Courtyard game from `skill/multiplayer-project`
42
+ This skill extends the Courtyard game from `multiplayer-project`
43
43
  (`network/game.gd` as `Game`, `client/main.gd` with `command()`).
44
44
 
45
45
  ## Steps
@@ -48,7 +48,7 @@ This skill extends the Courtyard game from `skill/multiplayer-project`
48
48
 
49
49
  A party member must not join on their own the moment the game starts. Move the
50
50
  join out of `client/main.gd`'s `_ready` into `enter(target)`, and keep every
51
- signal connection from `skill/multiplayer-movement` and `skill/multiplayer-state`:
51
+ signal connection from `multiplayer-movement` and `multiplayer-state`:
52
52
 
53
53
  ```gdscript
54
54
  func _ready() -> void:
@@ -87,7 +87,7 @@ func enter(target: SummerJoinTarget) -> bool:
87
87
  return true
88
88
  ```
89
89
 
90
- Move the Local Play bot hook from `skill/multiplayer-testing` into `enter()`,
90
+ Move the Local Play bot hook from `multiplayer-testing` into `enter()`,
91
91
  after the joined line.
92
92
 
93
93
  ### 2. Add the party node
@@ -193,7 +193,7 @@ fails with retryable `party_version_conflict`. React to `data_changed(key)` and
193
193
  `member_data_changed(member, key)`, or just re-render on `changed`.
194
194
 
195
195
  Party data is a lobby convenience, not game state. Once the match starts, the
196
- authority owns everything (`skill/multiplayer-state`). It never sees party data;
196
+ authority owns everything (`multiplayer-state`). It never sees party data;
197
197
  send choices that matter in your `join` Command and validate them there.
198
198
 
199
199
  ### 4. Handle join failures
@@ -217,7 +217,7 @@ client joins solo from `_ready`. Test that path locally, then the party path
217
217
  on Summer staging with real accounts.
218
218
 
219
219
  ```
220
- summer_project_setting name="summer/local_play/players" value=2
220
+ summer_project_setting key="summer/local_play/players" value=2
221
221
  summer_play
222
222
  summer_get_diagnostics
223
223
  summer_stop
@@ -247,7 +247,7 @@ summer_stop
247
247
 
248
248
  ## See also
249
249
 
250
- - `skill/summer-matchmaking`: queues, sizes, teams and the accept prompt
251
- - `skill/summer-friends`: friends list, profiles and messages
252
- - `skill/multiplayer-project`: the client entry scene this extends
253
- - `skill/multiplayer-testing`: Local Play, and what needs staging
250
+ - `summer-matchmaking`: queues, sizes, teams and the accept prompt
251
+ - `summer-friends`: friends list, profiles and messages
252
+ - `multiplayer-project`: the client entry scene this extends
253
+ - `multiplayer-testing`: Local Play, and what needs staging
@@ -39,8 +39,8 @@ Local Play's store keeps the latest value plus five earlier revisions, with
39
39
  the same validation and `save_id` rules as hosted. Delete a persona's folder
40
40
  to start that player fresh. Only hosted play proves durability.
41
41
 
42
- This skill extends the game from `skill/multiplayer-project` and
43
- `skill/multiplayer-state`: the authority's `_join` Command handler, the
42
+ This skill extends the game from `multiplayer-project` and
43
+ `multiplayer-state`: the authority's `_join` Command handler, the
44
44
  private `mine` State group, and the `wallets` it keeps.
45
45
 
46
46
  ## Steps
@@ -70,7 +70,7 @@ var profiles := {}
70
70
  ```
71
71
 
72
72
  In `_ready()`, next to the other `world` signals, before `Summer.initialize`
73
- (connect `session_joined` only once if `skill/summer-match-results` already
73
+ (connect `session_joined` only once if `summer-match-results` already
74
74
  did):
75
75
 
76
76
  ```gdscript
@@ -83,7 +83,7 @@ did):
83
83
  autosave.start()
84
84
  ```
85
85
 
86
- If `_on_session_joined` already exists (`skill/summer-match-results` adds
86
+ If `_on_session_joined` already exists (`summer-match-results` adds
87
87
  one), put this body at its end instead of defining it twice.
88
88
 
89
89
  ```gdscript
@@ -254,7 +254,7 @@ func _show_saved_progress() -> void:
254
254
 
255
255
  ### 6. Keep the publish checks passing
256
256
 
257
- The source-graph check in `skill/multiplayer-publish` (step 4b) flags every
257
+ The source-graph check in `multiplayer-publish` (step 4b) flags every
258
258
  call ending in `load(` without a string literal inside, so
259
259
  `Summer.authority.player_data.load(session)` and
260
260
  `Summer.client.player_data.load()` report
@@ -274,7 +274,7 @@ Run the same session twice. Local Play personas (`player-1`, `player-2`)
274
274
  keep their files between runs, so run 2 must start where run 1 ended.
275
275
 
276
276
  ```
277
- summer_project_setting name="summer/local_play/players" value=2
277
+ summer_project_setting key="summer/local_play/players" value=2
278
278
  summer_play
279
279
  summer_get_diagnostics
280
280
  summer_stop
@@ -284,7 +284,7 @@ summer_stop
284
284
  ```
285
285
 
286
286
  From a terminal: `<summer> --path . --summer-local-play 2 --summer-local-play-headless --summer-local-play-timeout 20 -- --bot={client}`,
287
- twice (see `skill/multiplayer-testing` for bot mode). Print markers such as
287
+ twice (see `multiplayer-testing` for bot mode). Print markers such as
288
288
  `print("PROFILE_LOADED coins=", ...)` and `print("SAVED ", save_id, " revision=", commit.revision)` while testing, then check them.
289
289
 
290
290
  Files: `~/Library/Application Support/Godot/app_userdata/<project name>/summer_local_player_data/<game id>/<persona>/public.json`
@@ -311,12 +311,12 @@ folder to start over.
311
311
  | Start a second commit while one is pending | One commit per player and slot at a time | The second fails with `operation_in_progress` |
312
312
  | Keep retrying after `player_data_superseded` | Stop saving through that Session | A newer World owns the player now |
313
313
  | Store `Vector3`, `Color` or `null` | Plain JSON: numbers, strings, arrays, dictionaries | Unsupported types fail with `player_data_unsupported_type` |
314
- | Save the match (positions, round score) | Save only what outlives the match | The World ends; `skill/summer-world-saves` covers Worlds that persist |
314
+ | Save the match (positions, round score) | Save only what outlives the match | The World ends; `summer-world-saves` covers Worlds that persist |
315
315
  | Truncate data that grew past 64 KiB | Refuse to grow; test the maximum size | `player_data_too_large` rejects the whole commit |
316
316
 
317
317
  ## See also
318
318
 
319
- - `skill/multiplayer-state` — the wallet and private State group this skill saves
320
- - `skill/summer-world-saves` — saving a whole persistent World instead of one player
321
- - `skill/multiplayer-testing` — bots and repeated Local Play runs
322
- - `skill/summer-leaderboards` — scores other players can see
319
+ - `multiplayer-state` — the wallet and private State group this skill saves
320
+ - `summer-world-saves` — saving a whole persistent World instead of one player
321
+ - `multiplayer-testing` — bots and repeated Local Play runs
322
+ - `summer-leaderboards` — scores other players can see
@@ -45,8 +45,8 @@ proves nothing.
45
45
  Items and offers are created in your game's Studio pages (`summer_open` target
46
46
  `game`). Code never creates items.
47
47
 
48
- This skill extends the Courtyard game from `skill/multiplayer-project` and
49
- `skill/multiplayer-state`.
48
+ This skill extends the Courtyard game from `multiplayer-project` and
49
+ `multiplayer-state`.
50
50
 
51
51
  ## Steps
52
52
 
@@ -265,7 +265,7 @@ Walk through every outcome:
265
265
 
266
266
  ## See also
267
267
 
268
- - `skill/multiplayer-state`: Commands and the match document used for equipped items
269
- - `skill/multiplayer-testing`: Local Play fixtures and personas
270
- - `skill/summer-player-data`: saving a player's loadout between matches
271
- - `skill/summer-analytics`: measuring the shop
268
+ - `multiplayer-state`: Commands and the match document used for equipped items
269
+ - `multiplayer-testing`: Local Play fixtures and personas
270
+ - `summer-player-data`: saving a player's loadout between matches
271
+ - `summer-analytics`: measuring the shop
@@ -32,7 +32,7 @@ composition, and the authority neither sees nor writes them.
32
32
  | Channel keys | 1–64 of `A-Z a-z 0-9 _ . -`, starting with a letter or digit; at most 64 channels per World |
33
33
  | History | Best effort, not a full log. A new handle shows the newest 2 messages; `load_older()` grows the window to at most 16 |
34
34
  | Lifetime | A handle belongs to one World admission. After leaving or joining another World, open a new one |
35
- | Not included | Direct messages (`skill/summer-friends`), party chat (the Summer app) and messages written by your server |
35
+ | Not included | Direct messages (`summer-friends`), party chat (the Summer app) and messages written by your server |
36
36
 
37
37
  **Hosted only.** Chat needs a joined hosted World and a Summer app whose Player
38
38
  Host offers `player.channels`. A queue reservation is not enough: open the
@@ -40,8 +40,8 @@ channel after `enter()` succeeds. In Local Play and editor runs,
40
40
  `check_open_readiness()` and `open_world_channel()` fail with `unavailable`.
41
41
  Build the "chat hidden" path first.
42
42
 
43
- This skill extends the Courtyard game from `skill/multiplayer-project` and
44
- `skill/multiplayer-state`.
43
+ This skill extends the Courtyard game from `multiplayer-project` and
44
+ `multiplayer-state`.
45
45
 
46
46
  ## Steps
47
47
 
@@ -49,7 +49,7 @@ This skill extends the Courtyard game from `skill/multiplayer-project` and
49
49
 
50
50
  Messages carry the author's Summer user id (`player_id`), not a name. The
51
51
  authority already knows every verified name. Publish them in the shared match
52
- document (`skill/multiplayer-state`): in `authority/main.gd`'s `_join`, before
52
+ document (`multiplayer-state`): in `authority/main.gd`'s `_join`, before
53
53
  accepting, add
54
54
 
55
55
  ```gdscript
@@ -158,7 +158,7 @@ Call `$Chat.open()` after `enter()` returns `true`. Wire it into the UI:
158
158
  Locally, check that the hidden path works and nothing errors:
159
159
 
160
160
  ```
161
- summer_project_setting name="summer/local_play/players" value=2
161
+ summer_project_setting key="summer/local_play/players" value=2
162
162
  summer_play
163
163
  summer_get_diagnostics
164
164
  summer_stop
@@ -189,7 +189,7 @@ Then test real chat on Summer staging with two accounts in one match.
189
189
 
190
190
  ## See also
191
191
 
192
- - `skill/multiplayer-state`: the match document that carries player names
193
- - `skill/summer-friends`: direct messages with friends
194
- - `skill/summer-parties`: party chat lives in the Summer app
195
- - `skill/multiplayer-testing`: what Local Play can and can't test
192
+ - `multiplayer-state`: the match document that carries player names
193
+ - `summer-friends`: direct messages with friends
194
+ - `summer-parties`: party chat lives in the Summer app
195
+ - `multiplayer-testing`: what Local Play can and can't test
@@ -26,13 +26,13 @@ a move. A new authority then restores the World from its last save.
26
26
  | Keep | Use |
27
27
  |---|---|
28
28
  | What belongs to the place: built walls, chests, the coins left on the ground | **World save** (this skill) |
29
- | What belongs to a player: their coins, unlocks, level | **Player data** (`skill/summer-player-data`) |
29
+ | What belongs to a player: their coins, unlocks, level | **Player data** (`summer-player-data`) |
30
30
 
31
31
  The engine never serializes nodes for you. The game decides what one save
32
32
  holds. It must be **one consistent cut**: if an item moves from a chest into
33
33
  an inventory, both sides go in the same save.
34
34
 
35
- This skill extends the Courtyard game from `skill/multiplayer-state`: its
35
+ This skill extends the Courtyard game from `multiplayer-state`: its
36
36
  `match_doc` (the coins still on the ground, and the scoreboard) becomes the
37
37
  World's saved state.
38
38
 
@@ -238,7 +238,7 @@ Local Play runs a persistent World with an **in-memory** save store:
238
238
  - Nothing survives the run.
239
239
 
240
240
  ```
241
- summer_project_setting name="summer/local_play/players" value=2
241
+ summer_project_setting key="summer/local_play/players" value=2
242
242
  summer_play
243
243
  summer_get_diagnostics
244
244
  summer_stop
@@ -278,7 +278,7 @@ Restoring after a real restart can only be proven hosted.
278
278
 
279
279
  ## See also
280
280
 
281
- - `skill/summer-player-data` — progress that follows a player
282
- - `skill/multiplayer-state` — the shared document this skill saves
283
- - `skill/multiplayer-project` — `world.json` and the authority scene
284
- - `skill/multiplayer-testing` — Local Play runs and markers
281
+ - `summer-player-data` — progress that follows a player
282
+ - `multiplayer-state` — the shared document this skill saves
283
+ - `multiplayer-project` — `world.json` and the authority scene
284
+ - `multiplayer-testing` — Local Play runs and markers
@@ -3,7 +3,7 @@
3
3
  The motion model reads the skeleton's rest pose, hierarchy **and bone names**. Names carry
4
4
  meaning: a bone called `LeftArm` borrows everything the model learned from human arms.
5
5
  Rigs named like a human skeleton therefore animate far better than freeform names, even
6
- on non-humans. Measured on cartoon flowers (2026-09-29): with plant names (`Stem1`,
6
+ on non-humans. Measured on cartoon flowers: with plant names (`Stem1`,
7
7
  `LeafL1`) most prompts barely moved; the same rig with human names nodded, bowed,
8
8
  gestured and looked around on cue.
9
9
 
@@ -68,7 +68,7 @@ summer_generate_image(
68
68
 
69
69
  Two things about the arguments:
70
70
 
71
- - **There is no `image_size` and no `negative_prompt`.** `summer_generate_image` takes only `prompt`, `model`, `style`, `referenceImageUrl`, and `options`, and `options` only recognizes Nano Banana provider keys (`seed`, `outputFormat`, `safetyTolerance`, `syncMode`, `systemPrompt`, `limitGenerations`, `thinkingLevel`) plus `removeBackground`. Anything else is dropped without an error, so the call looks like it worked. Put the negations in the prompt text. Square is what you get regardless — MCP images come back at the server's 1:1 default, which is exactly what a tileable texture wants.
71
+ - **There is no `image_size` and no `negative_prompt`.** `summer_generate_image` takes only `prompt`, `model`, `style`, `referenceImageUrl`, `removeBackground` and `options`, and `options` only recognizes Nano Banana provider keys (`seed`, `outputFormat`, `safetyTolerance`, `syncMode`, `systemPrompt`, `limitGenerations`, `thinkingLevel`). Anything else is dropped without an error, so the call looks like it worked. Put the negations in the prompt text. Square is what you get regardless — MCP images come back at the server's 1:1 default, which is exactly what a tileable texture wants.
72
72
  - **`style: "realistic"` is a no-op.** Only `cartoon` and `anime` append anything to the prompt; `realistic` and `none` append nothing, and any other value is coerced to `none`. The photographic look has to come from the prompt (`photographic detail`). Switching to `"none"` for stylized work likewise changes nothing on its own — change the prompt.
73
73
 
74
74
  ### 4. Import to project
@@ -13,7 +13,7 @@ paths: ["assets/video/**", "trailers/**", "marketing/**"]
13
13
 
14
14
  A trailer shot is not a cutscene and not a loop. It is a single, deliberately-composed beat designed to live inside an edit — Steam capsule video, social cut, pitch-deck reel, Discord teaser, Twitter promo. Every shot has to earn its slot in 5 seconds or less because viewer attention drops past that. This skill produces those shots one at a time, with strong composition references and trailer-grade prompting, then hands the user off to a non-linear editor (DaVinci Resolve, Premiere, CapCut) to chain them. **Studio doesn't ship a video editor** — generation is the part this skill owns; the cutting is yours.
15
15
 
16
- If the user is generating a non-interactive narrative beat with dialogue, that's `video/cinematic-cutscene`. If they want a seamless background loop for a splash screen, that's `video/animated-loop`. This skill is for the punchy stuff — the kind of shot that ends up on the Steam page or in the first 10 seconds of a launch trailer.
16
+ If the user is generating a non-interactive narrative beat with dialogue, that's `cinematic-cutscene`. If they want a seamless background loop for a splash screen, that's `animated-loop`. This skill is for the punchy stuff — the kind of shot that ends up on the Steam page or in the first 10 seconds of a launch trailer.
17
17
 
18
18
  ## When to use
19
19
 
@@ -26,9 +26,9 @@ If the user is generating a non-interactive narrative beat with dialogue, that's
26
26
 
27
27
  ## When NOT to use
28
28
 
29
- - Multi-shot story sequence with dialogue — `video/cinematic-cutscene`.
30
- - Seamless looping background — `video/animated-loop`.
31
- - Static marketing key art — `2d-assets/concept-art` then `2d-assets/character-portrait`.
29
+ - Multi-shot story sequence with dialogue — `cinematic-cutscene`.
30
+ - Seamless looping background — `animated-loop`.
31
+ - Static marketing key art — `concept-art` then `character-portrait`.
32
32
  - Animated GIF of UI — that's a screen recording, not a generated video.
33
33
  - A literal Steam trailer (the assembled cut) — generate the shots here, then take them to your NLE.
34
34
 
@@ -69,13 +69,13 @@ For pure environment / abstract / VFX shots, you can skip this and prompt text-t
69
69
 
70
70
  The available models depend on whether you pass `imageUrl`. With a reference image (step 2) the call goes to the image-to-video route, which accepts only `ltx`, `kling`, and `minimax`; `kling-turbo` and `veo3` exist on the text-to-video route only, and pairing either with an `imageUrl` is a 400 `invalid_model`.
71
71
 
72
- | Model | Text-to-video | Image-to-video | Cost | Speed | When |
73
- |---|---|---|---|---|---|
74
- | `kling` | yes | yes | $0.50 | 2-4 min | Default for trailer hero shots — best motion + composition |
75
- | `ltx` | yes | yes | $0.10 | ~30s | B-roll, throwaway tests, blocking the composition before committing |
76
- | `minimax` | yes | yes | $0.25 | 2-3 min | Anime / stylized trailer looks |
77
- | `kling-turbo` | yes | **no** | $0.30 | 1-2 min | Same look as kling, faster, slight quality dip — but you lose `imageUrl` |
78
- | `veo3` | yes | **no** | $1.00 | 3-5 min | Pitch deck for investors, the one shot that has to be perfect — but you lose `imageUrl` |
72
+ | Model | Text-to-video | Image-to-video | Speed | When |
73
+ |---|---|---|---|---|
74
+ | `kling` | yes | yes | 2-4 min | Default for trailer hero shots — best motion + composition |
75
+ | `ltx` | yes | yes | ~30s | Cheapest. B-roll, throwaway tests, blocking the composition before committing |
76
+ | `minimax` | yes | yes | 2-3 min | Anime / stylized trailer looks |
77
+ | `kling-turbo` | yes | **no** | 1-2 min | Same look as kling, faster, slight quality dip — but you lose `imageUrl` |
78
+ | `veo3` | yes | **no** | 3-5 min | Most expensive. Pitch deck for investors, the one shot that has to be perfect — but you lose `imageUrl` |
79
79
 
80
80
  Default: **`ltx` first to block the composition, then `kling` for the final**. For the *one* hero shot that drives the Steam page, escalate to `veo3` only if `kling` failed twice.
81
81
 
@@ -114,7 +114,7 @@ If "regenerate", revise *one* axis (camera move, lighting, or framing) — don't
114
114
 
115
115
  Trailer footage usually lives on the user's local disk and goes straight into the NLE, where the generated `.mp4` is exactly what you want.
116
116
 
117
- For shots that double as **in-engine** splash content, transcode first — Summer Engine has no MP4 or WebM loader, and `.ogv` (Ogg Theora) is the only video container it can open. `summer_import_from_url` runs Godot's import pipeline and rejects the file if it never becomes a loadable resource, so importing the `.mp4` fails outright rather than half-working.
117
+ For shots that double as **in-engine** splash content, transcode first — Summer Engine has no MP4 or WebM loader, and `.ogv` (Ogg Theora) is the only video container it can open. `summer_import_from_url` runs the engine's import pipeline and rejects the file if it never becomes a loadable resource, so importing the `.mp4` fails outright rather than half-working.
118
118
 
119
119
  ```
120
120
  ffmpeg -i hero_boss_reveal.mp4 -c:v libtheora -q:v 8 -an hero_boss_reveal.ogv
@@ -133,24 +133,24 @@ Studio does not ship a video editor. After all the shots land, tell the user:
133
133
  > 3-5. Action beats (slow-mo combat, environmental destruction)
134
134
  > 6. Money shot (low-angle hero, ends on logo card)
135
135
  >
136
- > Score it with the music from `audio/music-track`. Add SFX hits on the cuts with `audio/sound-effect`.
136
+ > Score it with the music from `music-track`. Add SFX hits on the cuts with `sound-effect`.
137
137
 
138
138
  ## Reference card — prompts that work
139
139
 
140
140
  Pattern: `<archetype framing> + <subject> + <action verb> + <camera move> + <lighting / time of day> + <stylistic anchor>`. Keep under 50 words. Anchor with a reference image whenever a specific character or asset appears.
141
141
 
142
- | Goal | Model | Prompt | Cost | Duration |
143
- |---|---|---|---|---|
144
- | Hero boss reveal | `kling` | `low-angle hero shot of an armored dragon turning toward camera, slow tilt-up, volcanic backlight, embers in air, cinematic, anamorphic flare, 16mm grain` | $0.50 | 5s |
145
- | Slow-mo combat impact | `kling` | `mid shot of a swordsman striking a parry, sparks fly, time-dilation slow motion, dust and motion blur, dramatic side-light, cinematic` | $0.50 | 5s |
146
- | Establishing kingdom wide | `kling` | `wide aerial of a clifftop fortress at golden hour, slow dolly forward, low sun raking the towers, cinematic, anamorphic, faint heat haze` | $0.50 | 5s |
147
- | Splash screen card | `kling` | `static composition of a lone hooded figure on a windswept ridge, only the cloak and grass moving, dusk, painterly cinematic, room for title text upper third` | $0.50 | 5s |
148
- | Whip pan reveal | `kling` | `whip pan from left to right across a battlefield at night, lands on the protagonist standing alone among bodies, torches flickering, cinematic` | $0.50 | 5s |
149
- | Detail dolly-in | `kling` | `slow dolly-in on a glowing rune-etched sword embedded in stone, motes of magic rising, blue-cold key light, shallow depth of field, cinematic` | $0.50 | 5s |
150
- | Vertical social hero | `kling` | `vertical close-up of a young witch raising hands, magical wind, hair flowing, candle-warm key, cinematic, framed for 9:16` | $0.50 | 5s |
151
- | Pitch-deck premium shot | `veo3` | `wide cinematic of a fleet of airships emerging through cloud cover at dawn, slow truck forward, golden god-rays, soaring orchestral cinematic` | $1.00 | 5s |
152
- | Cheap B-roll iteration | `ltx` | `mid shot of a knight walking through fog, slow truck backward, dawn light, cinematic` | $0.10 | 5s |
153
- | Anime style hero | `minimax` | `anime-style hero girl draws a katana in slow motion, sakura petals swirling, dramatic side-light, dynamic camera, Ghibli painterly` | $0.25 | 5s |
142
+ | Goal | Model | Prompt | Duration |
143
+ |---|---|---|---|
144
+ | Hero boss reveal | `kling` | `low-angle hero shot of an armored dragon turning toward camera, slow tilt-up, volcanic backlight, embers in air, cinematic, anamorphic flare, 16mm grain` | 5s |
145
+ | Slow-mo combat impact | `kling` | `mid shot of a swordsman striking a parry, sparks fly, time-dilation slow motion, dust and motion blur, dramatic side-light, cinematic` | 5s |
146
+ | Establishing kingdom wide | `kling` | `wide aerial of a clifftop fortress at golden hour, slow dolly forward, low sun raking the towers, cinematic, anamorphic, faint heat haze` | 5s |
147
+ | Splash screen card | `kling` | `static composition of a lone hooded figure on a windswept ridge, only the cloak and grass moving, dusk, painterly cinematic, room for title text upper third` | 5s |
148
+ | Whip pan reveal | `kling` | `whip pan from left to right across a battlefield at night, lands on the protagonist standing alone among bodies, torches flickering, cinematic` | 5s |
149
+ | Detail dolly-in | `kling` | `slow dolly-in on a glowing rune-etched sword embedded in stone, motes of magic rising, blue-cold key light, shallow depth of field, cinematic` | 5s |
150
+ | Vertical social hero | `kling` | `vertical close-up of a young witch raising hands, magical wind, hair flowing, candle-warm key, cinematic, framed for 9:16` | 5s |
151
+ | Pitch-deck premium shot | `veo3` | `wide cinematic of a fleet of airships emerging through cloud cover at dawn, slow truck forward, golden god-rays, soaring orchestral cinematic` | 5s |
152
+ | Cheap B-roll iteration | `ltx` | `mid shot of a knight walking through fog, slow truck backward, dawn light, cinematic` | 5s |
153
+ | Anime style hero | `minimax` | `anime-style hero girl draws a katana in slow motion, sakura petals swirling, dramatic side-light, dynamic camera, Ghibli painterly` | 5s |
154
154
 
155
155
  ### Bad prompts and why
156
156
 
@@ -166,7 +166,7 @@ Pattern: `<archetype framing> + <subject> + <action verb> + <camera move> + <lig
166
166
 
167
167
  - **Trying to chain shots inside one video generation.** Each clip is one beat. The cut between shots is the editor's job, not the model's. A 10s prompt with three actions returns mush.
168
168
  - **Skipping the reference image for the hero shot.** The boss in the Steam capsule must look like the boss in the game. Always lock identity with `imageUrl`.
169
- - **Using `veo3` for B-roll.** Burn $0.10 on `ltx` for blocking and B-roll; reserve `veo3` for the one shot that has to be perfect.
169
+ - **Using `veo3` for B-roll.** Use `ltx` for blocking and B-roll; reserve `veo3` for the one shot that has to be perfect.
170
170
  - **Generating shots without composing the trailer first.** Make a 6-shot list before generating shot 1. Otherwise you'll generate shots that don't intercut.
171
171
  - **Assuming `aspectRatio="9:16"` reframed an image-to-video call.** It is ignored whenever `imageUrl` is set — the reference image decides the framing. Pillarboxed 16:9 on TikTok / Reels / Shorts reads as a desktop YouTube embed and gets demoted by the algorithm, so fix the reference, not the argument.
172
172
  - **Treating `summer_generate_video` as synchronous.** It returns `{ queued: true, jobId }` and no URL. Poll `summer_check_job` before handing the user a link.
@@ -176,7 +176,7 @@ Pattern: `<archetype framing> + <subject> + <action verb> + <camera move> + <lig
176
176
  ## Edge cases
177
177
 
178
178
  - **Steam capsule animated header (Steam asset).** Steam wants `.webm` at 616x353 or 1920x1080, ≤6s, 30fps, no audio, ≤4MB. Generate at 16:9, transcode in DaVinci, export `.webm` with VP9. The video model gives you the source; format conversion is on you.
179
- - **Pitch deck for investors.** One shot, `veo3`, money composition (low-angle hero or wide establishing). Worth the $1.00.
179
+ - **Pitch deck for investors.** One shot, `veo3`, money composition (low-angle hero or wide establishing).
180
180
  - **Vertical for TikTok / Shorts.** The reference image must genuinely be portrait — `aspectRatio` is ignored once `imageUrl` is set. Frame the subject in the upper-middle so titles can sit at the bottom.
181
181
  - **Subject is a UGC environment the player built.** Take a screenshot of the in-engine view, run it through `summer_generate_image` as `referenceImageUrl` to "upgrade" the look, then use that as the video reference. The model can stylize a screenshot; it can't invent the user's level.
182
182
  - **Logo splash with motion graphics.** Generate a static logo card in `summer_generate_image` (or use the user's existing logo PNG), then prompt video as `static composition of <logo>, only background particles drifting, cinematic, room for title text` — keep the foreground motionless.
@@ -197,16 +197,16 @@ Once the shots are generated:
197
197
 
198
198
  > Generated 6 shots, ready for the cut. Next:
199
199
  > - Take them into DaVinci Resolve (free) or Premiere. Studio doesn't cut video.
200
- > - Score the trailer with `audio/music-track` — a 60-second trailer cue with a swell and a cold ending.
201
- > - Add hit SFX on the cuts with `audio/sound-effect` (impact whooshes between shots).
202
- > - For the title-card splash that ships in-engine, hand off to `video/animated-loop` with the established palette.
203
- > - For a narrative beat inside the trailer (a 10s "story" segment), hand off to `video/cinematic-cutscene`.
200
+ > - Score the trailer with `music-track` — a 60-second trailer cue with a swell and a cold ending.
201
+ > - Add hit SFX on the cuts with `sound-effect` (impact whooshes between shots).
202
+ > - For the title-card splash that ships in-engine, hand off to `animated-loop` with the established palette.
203
+ > - For a narrative beat inside the trailer (a 10s "story" segment), hand off to `cinematic-cutscene`.
204
204
 
205
205
  ## See also
206
206
 
207
- - `video/cinematic-cutscene` — narrative beats with dialogue.
208
- - `video/animated-loop` — seamless background clips for splash screens / title menus.
209
- - `audio/music-track` — trailer score.
210
- - `audio/sound-effect` — cut SFX (whooshes, impacts, stingers).
211
- - `2d-assets/concept-art` — generate the reference image axis when no asset exists yet.
207
+ - `cinematic-cutscene` — narrative beats with dialogue.
208
+ - `animated-loop` — seamless background clips for splash screens / title menus.
209
+ - `music-track` — trailer score.
210
+ - `sound-effect` — cut SFX (whooshes, impacts, stingers).
211
+ - `concept-art` — generate the reference image axis when no asset exists yet.
212
212
  - `../../references/mcp-tools-reference/mcp-tools-reference.md` — `summer_generate_video` parameter schema and error codes.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: tune-performance
3
- description: "Profile a slow game via summer_get_diagnostics, identify rendering/physics/scripting hotspots, propose fixes with before/after metric expectations."
3
+ description: "Profile a slow game with a measurement probe, identify rendering/physics/scripting hotspots, propose fixes with before/after metric expectations."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: performance
@@ -23,7 +23,7 @@ Performance tuning without measurement is gambling. This skill enforces a measur
23
23
 
24
24
  > What's slow? Pick the closest: framerate drops in scene X / startup is long / freezes for a moment / runs fine on my machine but bad on hardware Y.
25
25
 
26
- Wait. The answer narrows the fix domain by 5x:
26
+ Wait for the answer. It narrows where to look:
27
27
 
28
28
  | Symptom | Likely subsystem |
29
29
  |---|---|
@@ -75,7 +75,7 @@ Write the returned numbers down before fixing anything. Drive the probe to the s
75
75
 
76
76
  **Never profile with `--headless`.** A headless instance has no renderer: `RENDER_TOTAL_DRAW_CALLS_IN_FRAME` and `RENDER_TOTAL_OBJECTS_IN_FRAME` read `0.0`, and the FPS figure is an uncapped loop rate, not the game's framerate. The verify instance is windowed-offscreen precisely so the numbers are real.
77
77
 
78
- **Genuine fallback (engine not running at all):** ask the user to enable Godot's built-in monitor (`Debug → Monitor`, or in-game with `Performance.get_monitor`) and paste numbers. At minimum: FPS, frame time, draw calls, physics active objects.
78
+ **Fallback (engine not running at all):** ask the user to open the editor's built-in monitors (Debugger → Monitors) or print `Performance.get_monitor` values in game, and paste the numbers. At minimum: FPS, frame time, draw calls, physics active objects.
79
79
 
80
80
  ### 3. Identify the dominant cost
81
81
 
@@ -91,7 +91,7 @@ Decision tree:
91
91
 
92
92
  ### 4a. Rendering hotspot
93
93
 
94
- Common Godot 4.x rendering costs, ordered by frequency:
94
+ Common rendering costs, ordered by frequency:
95
95
 
96
96
  | Pattern | Symptom | Fix |
97
97
  |---|---|---|
@@ -105,8 +105,8 @@ Common Godot 4.x rendering costs, ordered by frequency:
105
105
  To inspect a suspect node:
106
106
 
107
107
  ```
108
- summer_inspect_node "./World/Enemy"
109
- summer_inspect_resource "./World/Enemy" # for mesh/material/shape details
108
+ summer_inspect_node path:"./World/Enemy"
109
+ summer_inspect_resource nodePath:"./World/Enemy" property:"mesh" # mesh/material/shape details
110
110
  ```
111
111
 
112
112
  **Bakes: know which process can run them.** `LightmapGI.bake(from_node, image_data_path)` IS script-bound on this build — run it from `summer_run_script` in the live editor (the GPU lightmapper needs a real renderer: desktop editors have one, cloud containers need xvfb + GL per `running-in-the-cloud`, and pure-headless returns `BAKE_ERROR_NO_LIGHTMAPPER`). The `OccluderInstance3D` bake remains editor-button only — say so rather than reporting it as applied. Navmesh baking, collision-shape generation from meshes, and `ImporterMesh.generate_lods` are all scriptable and remain yours to do.
@@ -119,7 +119,7 @@ Top patterns:
119
119
  |---|---|
120
120
  | 100+ active RigidBody3D | Sleep them when idle (`can_sleep = true`), or convert to Area3D where collision response isn't needed |
121
121
  | Concave collision shapes on dynamic bodies | Convert to ConvexPolygonShape3D or compound primitives (sphere/capsule/box). Concave costs 5–20x more. |
122
- | Physics tick at 120 Hz default | Lower `physics/common/physics_ticks_per_second` to 60 if visual smoothness allows |
122
+ | Physics tick rate raised above the 60 Hz default | Lower `physics/common/physics_ticks_per_second` back to 60 if visual smoothness allows |
123
123
  | Per-frame raycast in `_physics_process` | Cache the result, raycast every N frames, or use ShapeCast3D |
124
124
  | Hundreds of overlap queries | Use Area3D with `monitoring = true` only on the bodies that need to detect — turn it off on environment |
125
125
 
@@ -142,13 +142,13 @@ Fixes:
142
142
  - Cache the group lookup in `_ready()` if the group composition is stable.
143
143
  - Move per-frame work to a timer at 10 Hz (`_on_timer_timeout`), not 60 Hz.
144
144
  - Replace `distance_to` with `distance_squared_to` in comparisons (no sqrt).
145
- - Push hot loops to a `@tool`-able C# script or GDExtension if it's truly per-frame.
145
+ - Move a truly per-frame hot loop to C# or a GDExtension.
146
146
 
147
147
  ### 4d. Frame time spikes (jitter)
148
148
 
149
149
  If FPS is good but frame time spikes:
150
150
 
151
- - **Shader compilation**: precompile shaders during loading screen via `RenderingServer.shader_compile_from_code` or by warming up the scene off-screen.
151
+ - **Shader compilation**: warm shaders up during a loading screen by rendering each material once off-screen.
152
152
  - **GC / object allocation**: `var x := []` inside `_process` allocates each frame. Pre-allocate.
153
153
  - **Async resource load**: ensure `ResourceLoader.load_threaded_request` is finished before referencing.
154
154
 
@@ -217,7 +217,7 @@ Compare: was the metric movement at least 50% of what was promised? If yes, ship
217
217
  - **"Just disable VSync to see real FPS."** Disabling VSync helps you measure, but performance work targets perceived smoothness (16.7 ms, locked). Re-enable before shipping.
218
218
  - **Premature C++ rewrite.** A GDScript hotpath at 5% of frame time isn't the bottleneck. Profile first.
219
219
  - **"It's slow on user machines, must be the GPU."** Often it's resolution scale + shadow quality + GI settings. Add a quality preset switcher first.
220
- - **Threading gameplay code.** Godot's gameplay layer isn't thread-safe. Threading is for asset load, network, AI compute — not `_physics_process`.
220
+ - **Threading gameplay code.** The scene tree isn't thread-safe. Threading is for asset load, network, AI compute — not `_physics_process`.
221
221
 
222
222
  ## Collaborative protocol
223
223
 
@@ -233,6 +233,6 @@ No template — this is a workflow. Performance tuning is project-specific by de
233
233
  - `../../references/godot-version/godot-version.md` — renderer API churn notes (Compositor, RenderSceneBuffers)
234
234
  - `../../references/collaborative-protocol/collaborative-protocol.md` — "May I write" pattern
235
235
  - `../../references/gd-style/gd-style.md` — GDScript conventions (avoid bare types, use `:=`)
236
- - `debugging/debug/SKILL.md` — bug triage (related but different)
237
- - `workflow/diagnosing-perf-regressions/SKILL.md` — when it *got* slow rather than always was
238
- - `rendering-and-lighting/3d-lighting/SKILL.md` — light setup and bake decisions
236
+ - `debug` — bug triage (related but different)
237
+ - `diagnosing-perf-regressions` — when it *got* slow rather than always was
238
+ - `3d-lighting` — light setup and bake decisions
@@ -1,7 +1,7 @@
1
1
  id: skill/tune-performance
2
2
  kind: skill
3
3
  version: 1.0.3
4
- summary: Profile a slow game via summer_get_diagnostics, identify rendering/physics/scripting hotspots, propose fixes with before/after metric expectations.
4
+ summary: Profile a slow game with a measurement probe, identify rendering/physics/scripting hotspots, propose fixes with before/after metric expectations.
5
5
  use_when:
6
6
  - the game is slow, drops framerate, stutters, takes forever to start, or runs poorly on specific hardware
7
7
  - fps drops or stutter when many units, projectiles, or particles spawn at once and the hotspot is unknown
@@ -77,7 +77,7 @@ Pattern:
77
77
  <asset class> of <subject>, game UI, <anchor style>, flat design, clean edges, transparent background, centered, isolated
78
78
  ```
79
79
 
80
- `isolated` is load-bearing. For the background, **do not rely on the prompt** — pass `options.removeBackground: true`, which runs a real background-removal pass after generation and returns a PNG with true alpha. That is the single highest-value argument in this skill, and it is the actual fix for the checkerboard failure listed below: models asked for a "transparent background" in text frequently paint the checkerboard.
80
+ `isolated` is load-bearing. For the background, **do not rely on the prompt** — pass `removeBackground: true`, which runs a real background-removal pass after generation and returns a PNG with true alpha. That is the single highest-value argument in this skill, and it is the actual fix for the checkerboard failure listed below: models asked for a "transparent background" in text frequently paint the checkerboard.
81
81
 
82
82
  ### 5. Generate
83
83
 
@@ -87,11 +87,11 @@ summer_generate_image(
87
87
  prompt="ability icon for a fire spell, glowing flame in cupped hand, game UI, flat design with subtle gradient and soft inner shadow, 2px deep navy outline, gold and parchment palette, rounded square frame, centered, isolated on a plain background. Not photorealistic, no 3D render, no scene background, not busy, no multiple objects.",
88
88
  model="nano-banana-2",
89
89
  style="none",
90
- options={ removeBackground: true }
90
+ removeBackground=true
91
91
  )
92
92
  ```
93
93
 
94
- `image_size` and `negative_prompt` do not exist on this tool and are dropped without an error — the negations have to live in the prompt text, and the size is fixed. `removeBackground` is the one `options` key here that does real work.
94
+ `image_size` and `negative_prompt` do not exist on this tool and are dropped without an error — the negations have to live in the prompt text, and the size is fixed.
95
95
 
96
96
  **Button (3 states in 3 calls):**
97
97
  ```
@@ -164,7 +164,7 @@ If you generate a 4×4 grid of icons in one image, each icon becomes an `AtlasTe
164
164
  | Bad | Failure mode |
165
165
  |---|---|
166
166
  | `cool button` | No subject, no anchor. Returns a generic button on a card background. |
167
- | `transparent button with icon` | Model often renders a checkerboard "transparent" pattern as the actual fill. There is no negative-prompt argument to counter it — drop the word "transparent" from the prompt entirely and pass `options.removeBackground: true` instead. |
167
+ | `transparent button with icon` | Model often renders a checkerboard "transparent" pattern as the actual fill. There is no negative-prompt argument to counter it — drop the word "transparent" from the prompt entirely and pass `removeBackground: true` instead. |
168
168
  | `8 ability icons in one image` | Inconsistent style across the 8. Generate one at a time with the same anchor. |
169
169
  | `realistic 3D rendered button` | Conflicts with flat-UI. Stay flat. |
170
170
  | `button with the word "Play"` on it | Models render text badly. Add text in Summer Engine via a `Label` over the button, not in the texture. |
@@ -175,7 +175,7 @@ If you generate a 4×4 grid of icons in one image, each icon becomes an `AtlasTe
175
175
  - **Letting the model render text.** Diffusion models cannot render reliable
176
176
  text. Always overlay text in Summer Engine with a `Label` node. The button
177
177
  texture is the frame; the label is the word.
178
- - **Forgetting `options.removeBackground: true`.** Default is opaque. Prompting for "transparent background" instead is what produces the painted-checkerboard failure below — the option runs a real alpha pass and does not.
178
+ - **Forgetting `removeBackground: true`.** Default is opaque. Prompting for "transparent background" instead is what produces the painted-checkerboard failure below — the option runs a real alpha pass and does not.
179
179
  - **Expecting `style` to do the work.** Only `cartoon` and `anime` append anything; `realistic` and `none` append nothing, and any other value is coerced to `none`. `style: "none"` is right for UI, but "flat design" has to be in the prompt regardless.
180
180
  - **NinePatch with no border-vs-center distinction.** The 9-slice scaling smears the border into the center.
181
181
  - **Mipmaps on UI.** UI textures shouldn't mipmap — they're displayed at 1:1 or near it. Mipmaps waste memory and blur sharp edges.
@@ -187,7 +187,7 @@ If you generate a 4×4 grid of icons in one image, each icon becomes an `AtlasTe
187
187
  `STRETCH_KEEP_ASPECT_CENTERED` scales it down cleanly.
188
188
  - **User wants pixel-style UI.** Route to `pixel-art` — different prompt pattern, different filter, different anchor.
189
189
  - **User wants animated UI (spinning loading icon).** Generate the static frame here. Animate via `AnimationPlayer` rotating the `TextureRect`, not as a sprite sheet.
190
- - **Transparency comes back as a checkerboard pattern in the image.** The model rendered the checkerboard literally because the prompt asked for transparency. Remove every mention of transparency from the prompt, generate on a plain background, and pass `options.removeBackground: true` to cut the alpha server-side.
190
+ - **Transparency comes back as a checkerboard pattern in the image.** The model rendered the checkerboard literally because the prompt asked for transparency. Remove every mention of transparency from the prompt, generate on a plain background, and pass `removeBackground: true` to cut the alpha server-side.
191
191
  - **Icons need to read at very small size (16-24px in a packed bar).** Bias prompts toward bold silhouette + minimal interior detail. Ornate detail is invisible at 16px and adds noise.
192
192
 
193
193
  ## Fallback (no MCP)
@@ -199,7 +199,7 @@ summer_generate_image(
199
199
  prompt="<asset + anchor>, isolated on a plain background. No scene background, not photorealistic, no 3D, not busy.",
200
200
  model="nano-banana-2",
201
201
  style="none",
202
- options={ removeBackground: true }
202
+ removeBackground=true
203
203
  )
204
204
  ```
205
205