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
@@ -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
  ```
@@ -11,9 +11,9 @@ paths: ["project.godot", "tests/**/*.gd", "tools/**/*.gd"]
11
11
 
12
12
  # Bounded engine runs for agents
13
13
 
14
- Agents verify games by running the engine many times: imports, tests, captures, multiplayer bots. Each run
15
- that hangs, overlaps another, makes noise or hides an error costs time and trust. These rules come from a
16
- day of several agents sharing one project on one Mac.
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
17
 
18
18
  ## 1. Every run is bounded, muted and alone
19
19
 
@@ -29,14 +29,13 @@ day of several agents sharing one project on one Mac.
29
29
  <project>/.engine.lock 180 <summer> ...
30
30
  ```
31
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. One day of several agents
33
- running builds, renders and a browser load of a large web export at once kernel-panicked the Mac
34
- (compressor full, swap unable to grow). The wrapper should run the command as a child, sum the resident
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
35
34
  memory of its whole process tree (browsers spawn GPU/renderer helpers), kill the tree past a cap (e.g.
36
35
  3 GB), and also stop when system free memory falls low (`sysctl -n kern.memorystatus_level` < 15 on macOS),
37
36
  because GPU memory on Apple Silicon is system memory but is not counted in RSS. Refuse to start when the
38
37
  system is already short (< 35).
39
- - **Mute it.** `--audio-driver Dummy`. Someone is working next to you.
38
+ - **Mute it.** `--audio-driver Dummy`.
40
39
  - **Render only when you must, and offscreen.** `--headless` for logic (no pixels). For visual checks use
41
40
  `--summer-offscreen` with a fixed `--resolution` and a capture script that saves PNGs and quits. Visible
42
41
  windows only when a human asked to watch.
@@ -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
@@ -22,21 +22,19 @@ Every project goes through this process. A todo list, a single-function utility,
22
22
  You MUST create a task for each of these items and complete them in order:
23
23
 
24
24
  1. **Explore project context** — check files, docs, recent commits
25
- 3. **Ask clarifying questions** — one at a time, understand purpose/constraints/success criteria
26
- 4. **Propose 2-3 approaches** — with trade-offs and your recommendation
27
- 5. **Present design** — in sections scaled to their complexity, get user approval after each section
28
- 6. **Write design doc** — save to `.summer/specs/YYYY-MM-DD-<topic>-design.md` in the game project and commit
29
- 7. **Spec self-review** — quick inline check for placeholders, contradictions, ambiguity, scope (see below)
30
- 8. **User reviews written spec** — ask user to review the spec file before proceeding
31
- 9. **Transition to implementation** — invoke writing-plans skill to create implementation plan
25
+ 2. **Ask clarifying questions** — one at a time, understand purpose/constraints/success criteria
26
+ 3. **Propose 2-3 approaches** — with trade-offs and your recommendation
27
+ 4. **Present design** — in sections scaled to their complexity, get user approval after each section
28
+ 5. **Write design doc** — save to `.summer/specs/YYYY-MM-DD-<topic>-design.md` in the game project and commit
29
+ 6. **Spec self-review** — quick inline check for placeholders, contradictions, ambiguity, scope (see below)
30
+ 7. **User reviews written spec** — ask user to review the spec file before proceeding
31
+ 8. **Transition to implementation** — invoke writing-plans skill to create implementation plan
32
32
 
33
33
  ## Process Flow
34
34
 
35
35
  ```dot
36
36
  digraph brainstorming {
37
37
  "Explore project context" [shape=box];
38
- "Visual questions ahead?" [shape=diamond];
39
- "Offer Visual Companion\n(own message, no other content)" [shape=box];
40
38
  "Ask clarifying questions" [shape=box];
41
39
  "Propose 2-3 approaches" [shape=box];
42
40
  "Present design sections" [shape=box];
@@ -46,10 +44,7 @@ digraph brainstorming {
46
44
  "User reviews spec?" [shape=diamond];
47
45
  "Invoke writing-plans skill" [shape=doublecircle];
48
46
 
49
- "Explore project context" -> "Visual questions ahead?";
50
- "Visual questions ahead?" -> "Offer Visual Companion\n(own message, no other content)" [label="yes"];
51
- "Visual questions ahead?" -> "Ask clarifying questions" [label="no"];
52
- "Offer Visual Companion\n(own message, no other content)" -> "Ask clarifying questions";
47
+ "Explore project context" -> "Ask clarifying questions";
53
48
  "Ask clarifying questions" -> "Propose 2-3 approaches";
54
49
  "Propose 2-3 approaches" -> "Present design sections";
55
50
  "Present design sections" -> "User approves design?";
@@ -62,7 +57,7 @@ digraph brainstorming {
62
57
  }
63
58
  ```
64
59
 
65
- **The terminal state is invoking writing-plans.** Do NOT invoke frontend-design, mcp-builder, or any other implementation skill. The ONLY skill you invoke after brainstorming is writing-plans.
60
+ **The terminal state is invoking writing-plans.** Do NOT invoke any implementation skill. The ONLY skill you invoke after brainstorming is writing-plans.
66
61
 
67
62
  ## The Process
68
63
 
@@ -109,7 +104,6 @@ digraph brainstorming {
109
104
 
110
105
  - Write the validated design (spec) to `.summer/specs/YYYY-MM-DD-<topic>-design.md` in the game project
111
106
  - (User preferences for spec location override this default)
112
- - Use elements-of-style:writing-clearly-and-concisely skill if available
113
107
  - Commit the design document to git
114
108
 
115
109
  **Spec Self-Review:**
@@ -16,11 +16,11 @@ confidence: extracted
16
16
 
17
17
  ## Outcome
18
18
 
19
- A 2D character controller for SummerEngine that reproduces the tuning architecture and forgiveness mechanics of Celeste's player movement: momentum-based running with distinct ground/air acceleration, variable-height jumping with coyote time, a multi-directional dash with cooldown and residual speed, wall interaction (jump, slide, climb with stamina), and pixel-scale corner corrections that make near-miss inputs succeed instead of fail.
19
+ A 2D character controller for Summer Engine that reproduces the tuning architecture and forgiveness mechanics of Celeste's player movement: momentum-based running with distinct ground/air acceleration, variable-height jumping with coyote time, a multi-directional dash with cooldown and residual speed, wall interaction (jump, slide, climb with stamina), and pixel-scale corner corrections that make near-miss inputs succeed instead of fail.
20
20
 
21
21
  ## When to Use
22
22
 
23
- - Building a precision 2D platformer in SummerEngine where movement feel is the core gameplay.
23
+ - Building a precision 2D platformer in Summer Engine where movement feel is the core gameplay.
24
24
  - Porting or prototyping Celeste-style mechanics (dash, wall jump, climb stamina).
25
25
  - Tuning an existing platformer controller that feels "unfair" or unresponsive — the forgiveness systems below are the primary fix.
26
26
 
@@ -28,9 +28,9 @@ Do not use for: 3D character controllers, physics-driven (RigidBody) movement, o
28
28
 
29
29
  ## Core Principle
30
30
 
31
- Celeste's movement is a **single controller class driven by an explicit integer state machine**, with all feel-critical numbers as a **flat compile-time constants table** at the top of the class. The retrieved source (Player.cs, 5,471 lines) defines states `Normal=0, Climb=1, Dash=2, Swim=3, Boost=4, RedDash=5, HitSquash=6, Launch=7, Pickup=8, DreamDash=9` (+ a Summit state), each with Begin/Update/End callbacks. State transitions are direct integer assignments.
31
+ Celeste's movement is a **single controller class driven by an explicit integer state machine**, with all feel-critical numbers as a **flat compile-time constants table** at the top of the class. The released source (`Player.cs`, 5,471 lines) defines states `Normal=0, Climb=1, Dash=2, Swim=3, Boost=4, RedDash=5, HitSquash=6, Launch=7, Pickup=8, DreamDash=9` (+ a Summit state), each with Begin/Update/End callbacks. State transitions are direct integer assignments.
32
32
 
33
- The second principle: **forgiveness at the pixel and millisecond scale**. The code repeatedly nudges the player 2–6 pixels or grants 50–200 ms windows so that inputs which are *almost* correct still succeed. This is the source of the "tightest" feel described in the originating post.
33
+ The second principle: **forgiveness at the pixel and millisecond scale**. The code repeatedly nudges the player 2–6 pixels or grants 50–200 ms windows so that inputs which are *almost* correct still succeed. Most of the "tight" feel comes from these windows.
34
34
 
35
35
  ## Tuning Constants (verbatim from Player.cs)
36
36
 
@@ -133,7 +133,7 @@ Celeste's units are pixels/second for speeds and pixels/second² for acceleratio
133
133
  | DuckWindMult | 0 (ducking negates wind) |
134
134
  | SpacePhysicsMult | 0.6 (low-gravity zones) |
135
135
 
136
- ## Scene / Node Shape (Godot 4)
136
+ ## Scene / Node Shape
137
137
 
138
138
  ```
139
139
  Player (CharacterBody2D)
@@ -300,7 +300,7 @@ func _probe_wall() -> int:
300
300
  return 0
301
301
  ```
302
302
 
303
- The skeleton above is a structural translation for Godot; the exact per-frame update bodies from Player.cs were not fully retrievable (see evidence limitations). The constants, state IDs, and confirmed behaviors (corner correction loops, variable-jump window logic, forced wall-jump timers, stamina costs, squish safety) are extracted directly from the source.
303
+ The skeleton above is a structural translation to GDScript, not a line-by-line port of the per-frame update bodies in `Player.cs`. The constants, state IDs, and confirmed behaviors (corner correction loops, variable-jump window logic, forced wall-jump timers, stamina costs, squish safety) are extracted directly from the source.
304
304
 
305
305
  ## Confirmed Behavioral Patterns to Replicate
306
306
 
@@ -322,7 +322,7 @@ The skeleton above is a structural translation for Godot; the exact per-frame up
322
322
  6. Implement dash with 8-way aim, cooldown, residual EndDashSpeed, and corner correction.
323
323
  7. Implement climb stamina with the three cost rates and tired threshold.
324
324
  8. Add forgiveness pass: upward corner correction on jump, dash nudges, jump-through assist, wall speed retention, squish-safety cascade.
325
- 9. Rescale units if SummerEngine's pixels-per-meter differs from Celeste's native resolution: preserve ratios (e.g., DashSpeed ≈ 2.67× MaxRun; RunAccel ≈ 11× MaxRun).
325
+ 9. Rescale units if your game's pixels-per-meter differs from Celeste's native resolution: preserve ratios (e.g., DashSpeed ≈ 2.67× MaxRun; RunAccel ≈ 11× MaxRun).
326
326
 
327
327
  ## Tunables
328
328
 
@@ -358,9 +358,4 @@ After implementing, test each forgiveness system explicitly:
358
358
 
359
359
  ## Confidence
360
360
 
361
- `extracted` — All tuning values, state IDs, and confirmed behavioral patterns are taken directly from the retrieved Player.cs source. Per-state update-loop bodies from the middle of the 182 KB file were not retrievable (tool truncation); where the skeleton fills standard platformer patterns (e.g., jump-cut-on-release), this is noted as structural translation, not extracted code. Not yet verified inside SummerEngine.
362
-
363
- ## Evidence
364
-
365
- - sources/web/celeste-player-cs/source.md — primary source record: constants tables, state machine, confirmed behavioral snippets, retrieval limitations.
366
- - sources/x/valigo-celeste-movement/source.md — originating post and primary-source identification.
361
+ `extracted` — All tuning values, state IDs, and confirmed behavioral patterns come from Celeste's publicly released `Player.cs`. Where the skeleton fills in standard platformer patterns (for example jump-cut-on-release), it is a structural translation, not extracted code. Not yet verified inside Summer Engine.
@@ -9,7 +9,7 @@ use_when:
9
9
  - "my 2D platformer controller feels unfair or unresponsive"
10
10
  do_not_use_when:
11
11
  - "3D character controllers, physics-driven RigidBody movement, or games that want floaty arcade jump physics over momentum precision"
12
- - "intake from the gamedev-knowledge pipeline (source-cited, pipeline-validated, not yet exercised in-engine by the Summer team) — verify results in the engine as you would any technique"
12
+ - "you need an in-engine verified controller — this one is source-cited but not yet exercised in Summer Engine; verify results in the engine before relying on it"
13
13
  facets:
14
14
  lifecycle:
15
15
  - build
@@ -172,7 +172,7 @@ func run(ctx):
172
172
 
173
173
  That is the mechanism; a full audio-synced viseme timeline is `facial-and-lipsync`. Bone-track keyframes work the same way through `animate()` v2 — `ctx.animate(character, "Skeleton3D:Head/rotation", keys, "nod")` creates a proper bone rotation track (the helper owns the quaternion conversion; never hand-build quaternion tracks).
174
174
 
175
- ## Step 6 — Root motion, honestly
175
+ ## Step 6 — Root motion
176
176
 
177
177
  Meshy/mocap locomotion clips translate the root bone forward (Meshy `run` moves ~5m per cycle). Two valid setups — **pick one, never both**:
178
178
 
@@ -185,7 +185,7 @@ Root motion CANNOT be judged from the editor state. Playtest it: `summer_play`,
185
185
 
186
186
  ## Raw lane — the same wiring on older engines
187
187
 
188
- Every class above is script-bound; `ctx.anim_state_machine` is convenience, not capability. The raw locomotion wiring, verbatim the calls that matter:
188
+ Every class above is script-bound; `ctx.anim_state_machine` is convenience, not capability. The raw locomotion wiring:
189
189
 
190
190
  ```gdscript
191
191
  func run(ctx):
@@ -11,31 +11,21 @@ paths: ["assets/characters/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
11
11
 
12
12
  # Character Model — T-Pose to Rigged Humanoid, Gated
13
13
 
14
- This is the **canonical Meshy auto-rig pipeline**. It produces a humanoid `.glb` with a Meshy-compatible skeleton that `generate-motion` can drive directly. The work is split into two paid passes with a **mandatory user-review gate between them** — the rig pass is more expensive and locks the topology, so the user must see the un-rigged preview and approve before you spend on the rig.
14
+ This is the canonical auto-rig pipeline. It produces a humanoid `.glb` with a skeleton that `generate-motion` can drive directly. The work is two paid passes with a **mandatory user-review gate between them**: the rig pass costs more credits and locks the topology, so the user must see the un-rigged preview and approve it first.
15
15
 
16
16
  The whole flow:
17
17
 
18
18
  ```
19
- 1. T-pose reference image → summer_generate_image (~$0.05, ~10s)
20
- 2. Un-rigged 3D mesh → summer_generate_3d(image-to-3d) (~$0.50, ~60s)
19
+ 1. T-pose reference image → summer_generate_image (~10s)
20
+ 2. Un-rigged 3D mesh → summer_generate_3d(image-to-3d) (~60s)
21
21
  3. ── USER REVIEW GATE ──
22
- 4. Rigged .glb → summer_generate_3d(image-to-3d, rig=true) (~$1.00, ~90s)
22
+ 4. Rigged .glb → summer_generate_3d(image-to-3d, rig=true) (~90s)
23
23
  5. Import → editor RESTART → wire as CharacterBody3D / Node3D
24
24
  6. Hand off to generate-motion for clips
25
25
  ```
26
26
 
27
27
  The animation skill (`generate-motion`) requires a rigged humanoid; a static `.glb` won't drive motion.
28
28
 
29
- ## Web Chat / Public Orchestrator Equivalent
30
-
31
- When this skill is running inside the PublicSummerEngine chat orchestrator, use the chat-native tools directly instead of sending the user to Studio:
32
-
33
- ```
34
- generateImage -> createCharacter -> checkGenerationStatus/meshyJobStatus -> listUserAssets readiness -> rigModel if needed -> generateAnimation -> meshyJobStatus -> importAssets -> import-character
35
- ```
36
-
37
- Use Studio only when the user explicitly asks for visual/manual picking or when chat-side generation fails. The recovered working flow used `createCharacter`, confirmed the rig had `hasMeshyRigTask` or `animationsReady:true`, then generated `idle`, `walk`, `run`, `jump`, and `attack`, imported the rig plus child animation GLBs into `res://characters/<slug>/`, then wired playback from the imported GLB AnimationPlayers/libraries. If `generateAnimation` returns `animations_preparing`, wait, poll/list the rig asset again, and retry instead of routing to Studio. Keep this path repeatable for "animated character", "3D character with animations", "walking enemy", and similar prompts.
38
-
39
29
  ## When to use
40
30
 
41
31
  - "Make a knight character for the player to control."
@@ -121,11 +111,11 @@ Before paying for the rig pass, surface the un-rigged mesh:
121
111
 
122
112
  > Un-rigged knight mesh ready: `res://assets/characters/knight_unrigged.glb` (~12k tris, [preview link]).
123
113
  >
124
- > Next step is the **rig pass** (~$1.00, ~90s, Meshy auto-rig). It locks the topology and adds a skeleton compatible with `generate-motion`. Once you approve I'll run it.
114
+ > Next step is the **rig pass** (uses credits, ~90s). It locks the topology and adds a skeleton compatible with `generate-motion`. Once you approve I'll run it.
125
115
  >
126
116
  > **Approve the mesh and proceed to rig?** Or regenerate the mesh first (different prompt, different polycount, different model)?
127
117
 
128
- If the user wants changes, loop back to step 1 or 2. Do NOT silently run the rig pass — it doubles the cost and locks the design.
118
+ If the user wants changes, loop back to step 1 or 2. Do NOT silently run the rig pass — it spends more credits and locks the design.
129
119
 
130
120
  ### 4. Run the rig pass
131
121
 
@@ -205,17 +195,16 @@ The imported `.glb` includes its own `Skeleton3D` and `AnimationPlayer` (empty l
205
195
 
206
196
  ### 7. Hand off to animation
207
197
 
208
- > Knight is wired at `./World/Knight` with a Meshy-rigged skeleton. `rigAssetId` saved.
198
+ > Knight is wired at `./World/Knight` with an auto-rigged skeleton. `rigAssetId` saved.
209
199
  >
210
200
  > Next: `generate-motion` to add idle / walk / run / attack
211
201
  > clips. Example call: `summer_generate_motion(rigAssetId: "<saved id>",
212
- > backend: "meshy-library", motionName: "walk")`. Custom prompt-driven motion
213
- > is not shipped; hand-author one-off moves in Summer Engine or import a
214
- > licensed clip.
202
+ > backend: "meshy-library", motionName: "walk")`. For custom actions, use
203
+ > `text-to-motion` (`backend: "text-to-motion"`).
215
204
 
216
205
  ## Anti-patterns
217
206
 
218
- - **Skipping the user-review gate.** Doubles cost, locks the design, and removes the user's chance to course-correct cheaply.
207
+ - **Skipping the user-review gate.** Spends the rig credits, locks the design, and removes the user's chance to course-correct cheaply.
219
208
  - **Generating the mesh from a non-T-pose image.** Locomotion will look broken (inverted knees, snapped elbows). Always re-pose first.
220
209
  - **Forgetting the editor restart.** Animations will appear to bind successfully but play to a stale skeleton — the character T-poses motionless. The fix is always restart, never code.
221
210
  - **Wrapping a cinematic NPC in CharacterBody3D.** Wastes physics ticks; use Node3D.
@@ -225,7 +214,7 @@ The imported `.glb` includes its own `Skeleton3D` and `AnimationPlayer` (empty l
225
214
 
226
215
  ## Edge cases
227
216
 
228
- - **Multiple characters share a silhouette.** Generate the rig once, then re-skin via texture swap (cheaper than re-rigging). See `character-model` retexture flow (TBD) — for now, route to `asset-strategy`.
217
+ - **Multiple characters share a silhouette.** Generate the rig once, then re-skin via texture swap (cheaper than re-rigging): generate a new albedo and assign it as a material override.
229
218
  - **Character has wings, tail, extra limbs.** Meshy's humanoid rig only weights the standard skeleton — extras sag. Either prompt them as static (e.g. cape held by physics in-engine) or hand-rig in Blender post-export.
230
219
  - **Child / dwarf / giant.** Generate at correct proportions in the T-pose; the rig retargets cleanly. Locomotion clips from `generate-motion` will retarget but stride length needs `playback_speed` tuning on the AnimationPlayer.
231
220
  - **First-person hands-only character.** Generate just hands + forearms in T-pose; rig pass still works. See `fps-controller` for first-person wiring.
@@ -233,20 +222,20 @@ The imported `.glb` includes its own `Skeleton3D` and `AnimationPlayer` (empty l
233
222
 
234
223
  ## Fallback (no MCP)
235
224
 
236
- 1. Generate the T-pose reference at the Summer dashboard (or any image gen — Midjourney, nano-banana web, DALL-E).
237
- 2. Upload to Meshy at meshy.ai → Image to 3D → enable rigging.
225
+ 1. Generate the T-pose reference in the Summer dashboard.
226
+ 2. Run image-to-3D with rigging enabled in the Summer dashboard.
238
227
  3. Download the `.glb`.
239
228
  4. Drop into `res://assets/characters/`; Summer Engine's Import dock picks it up.
240
229
  5. Restart the editor.
241
230
  6. Wire as CharacterBody3D / Node3D in Summer Engine manually.
242
231
 
243
- The output is identical to the MCP path — same Meshy skeleton, same compatibility with `generate-motion` (which has its own dashboard fallback).
232
+ The output matches the MCP path — same skeleton, same compatibility with `generate-motion` (which has its own dashboard fallback).
244
233
 
245
234
  ## Handoff
246
235
 
247
236
  After the rigged character is wired:
248
237
 
249
- > `Knight` is at `./World/Knight` with a Meshy-rigged skeleton. Next:
238
+ > `Knight` is at `./World/Knight` with an auto-rigged skeleton. Next:
250
239
  > - **Animations:** `generate-motion` for idle / walk / run / attack. Pass the `rigAssetId` returned in step 4.
251
240
  > - **State machine:** after a few clips exist, `animation-tree` for idle → walk → run blends.
252
241
  > - **Player input:** if this is the player, wire WASD + mouse via `fps-controller` or a third-person controller skill.
@@ -207,7 +207,7 @@ integration handed off for a playtest, not an incomplete one.
207
207
  Referencing an unbound action is a silent no-op that reads as "controls dead".
208
208
  5. Compile-check, then run and watch it move. Feel is a user call, not a still frame.
209
209
 
210
- ## 2D side-scroller controller (the 40% every 2D game shares)
210
+ ## 2D side-scroller controller
211
211
 
212
212
  ```gdscript
213
213
  extends CharacterBody2D
@@ -84,7 +84,7 @@ Set its `collision_mask` to your Level layer only (not the player).
84
84
  Third-person differences from FPS:
85
85
  - Mouse motion rotates the `CameraController` (orbit), not the body.
86
86
  - The visual wrapper rotates to face the MOVEMENT direction, decoupled from the camera.
87
- Because imported characters face Godot forward `-Z`, lerp
87
+ Because imported characters face the engine forward `-Z`, lerp
88
88
  `CharacterRotationRoot.rotation.y` toward `atan2(-direction.x, -direction.z)`.
89
89
  - Rotate only `CharacterRotationRoot.rotation.y`. Do not yaw the CharacterBody3D or add a
90
90
  compensating 180-degree model rotation. The package already normalizes forward to `-Z`.
@@ -5,7 +5,7 @@ license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_resource_property
8
+ allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url summer_set_prop summer_set_resource_property
9
9
  paths: ["assets/**", "art/portraits/**", "ui/portraits/**"]
10
10
  ---
11
11
 
@@ -62,7 +62,7 @@ background: muted painterly gradient, dark teal to deep brown, no scene detail
62
62
  style: semi-realistic painterly, soft edges, oil-painting feel
63
63
  ```
64
64
 
65
- Note there is no aspect line. `summer_generate_image` has no size or aspect argument — every MCP image comes back at the server's 1:1 default. Bust framing reads fine square, which is why this skill works over MCP at all; if the cast needs true portrait framing, generate in the Summer dashboard (which exposes aspect ratio) and bring the results back with `summer_import_from_url`, or crop after. Whichever you pick, do it for the *whole* cast — mixed aspect is as visible as mixed lighting.
65
+ Note there is no aspect line. `summer_generate_image` has no size or aspect argument — every MCP image comes back at the server's 1:1 default. Bust framing reads fine square; if the cast needs true portrait framing, generate in the Summer dashboard (which exposes aspect ratio) and bring the results back with `summer_import_from_url`, or crop after. Whichever you pick, do it for the *whole* cast — mixed aspect is as visible as mixed lighting.
66
66
 
67
67
  Every subsequent portrait in this cast appends the anchor to the prompt verbatim. **Do not edit the anchor mid-cast** unless the user explicitly says "I want the new ones to look different."
68
68
 
@@ -86,7 +86,7 @@ The character description should include: identity (age, build, hair, distinctiv
86
86
 
87
87
  ### 4. Confirm and call
88
88
 
89
- > Generating Aria the witch portrait — 1 image, ~$0.02, model nano-banana-2, anchor locked from `.summer/portrait-anchor.md`. OK?
89
+ > Generating Aria the witch portrait — 1 image (uses credits), model nano-banana-2, anchor locked from `.summer/portrait-anchor.md`. OK?
90
90
 
91
91
  ```
92
92
  summer_generate_image(
@@ -96,7 +96,7 @@ summer_generate_image(
96
96
  )
97
97
  ```
98
98
 
99
- `style: "none"` because the anchor's "semi-realistic painterly" already specifies style. Be clear about what the preset actually does though: only `cartoon` and `anime` append anything to the prompt, and `realistic` / `none` append nothing — any other value is coerced to `none`. So the preset cannot "fight" a painterly anchor; it just does nothing either way, and every bit of the look has to be in the prompt.
99
+ `style: "none"` because the anchor's "semi-realistic painterly" already specifies style. Only `cartoon` and `anime` append anything to the prompt, and `realistic` / `none` append nothing — any other value is coerced to `none`. So the preset cannot "fight" a painterly anchor; it just does nothing either way, and every bit of the look has to be in the prompt.
100
100
 
101
101
  `options={ image_size: ... }` is dropped without an error — see the anchor note above.
102
102