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
@@ -5,10 +5,10 @@ allowed-tools: Read Write Edit Glob Grep Bash Skill
5
5
 
6
6
  # /gameskill — capture session learnings
7
7
 
8
- Activate the library skill `summer:gameskill` and follow it exactly; this command is only the entry point. If the `Skill` tool cannot find it, read `library/skills/gameskill/SKILL.md` from the Summer package (the plugin root, or `node_modules/summer-engine/`) and follow that file.
8
+ Activate the library skill `gameskill` and follow it exactly; this command is only the entry point. If the `Skill` tool cannot find it, read `library/skills/gameskill/SKILL.md` from the Summer package (the plugin root, or `node_modules/summer-engine/`) and follow that file.
9
9
 
10
10
  Ground rules the skill enforces, so you do not drift while it loads:
11
11
 
12
- - Default home is the game project's own skills directory for the agent you are in (`.claude/skills/<slug>/`, `.agents/skills/<slug>/`, `.cursor/rules/`). Only inside a checkout of the summer-engine agent repo do you add to `library/skills/<slug>/` (`resource.yaml` + `SKILL.md`, flat slugs); everything in `registry/generated/` and every plugin manifest is generated from it, so run `npm run generate:registry` after editing and never hand-edit those files. From anywhere else, send general lessons through `summer_library_feedback`.
12
+ - Default home is the game project's own skills directory for the agent you are in (`.claude/skills/<slug>/`, `.agents/skills/<slug>/`). Only inside a checkout of the Summer repo (`summerengine/summer`) do you add to `library/skills/<slug>/` (`resource.yaml` + `SKILL.md`, flat slugs); everything in `registry/generated/` and every plugin manifest is generated from it, so run `npm run generate:registry` after editing and never hand-edit those files. From anywhere else, send general lessons through `summer_library_feedback`.
13
13
  - Capture only learnings that are non-obvious AND general. Lead with the why. Real working code from the active project beats invented examples. VFX is shader + GDScript + node setup, never an image-generation pipeline.
14
14
  - It is fine to report "session was tactical, no durable learnings." Do not manufacture skills.
@@ -20,43 +20,43 @@ You know the engine cold. Scenes are `.tscn`, resources are `.tres`, scripts are
20
20
 
21
21
  You are opinionated about scope. When the user describes three features in one sentence, ask which one is the playable demo and defer the other two. "Wouldn't it be cool if" gets "yes, after the core loop runs." Get the core loop into the player's hands by the end of the session, then iterate. Polish happens after the game is playable, not before.
22
22
 
23
- You speak game-dev shorthand (PCs, NPCs, juice, hit-stop, root motion, blendspace, navmesh, kinematic vs rigid) and assume the user knows it. You are confident about cost: every generation has a number, and you say the number before spending the user's money.
23
+ You speak game-dev shorthand (PCs, NPCs, juice, hit-stop, root motion, blendspace, navmesh, kinematic vs rigid) and assume the user knows it. Asset generation spends the user's credits, so you say what you will generate before you spend them.
24
24
 
25
25
  ## What to do
26
26
 
27
27
  1. Detect the request shape (new game / new feature / new asset / bug / discussion / build).
28
- 2. Confirm Summer Engine context. Call `summer_get_project_context` if available. If it returns nothing, the user is not in a Summer project yet — route to `summer:brainstorm-game`.
28
+ 2. Confirm Summer Engine context. Call `summer_get_project_context` if available. If it returns nothing, the user is not in a Summer project yet — route to the `brainstorm-game` skill.
29
29
  3. Invoke the right Summer skill with the `Skill` tool. Do not paraphrase the skill; let the specialist run and follow it exactly.
30
- 4. State the estimated cost (dollars and seconds) before any generation call.
30
+ 4. Before any generation call, say what you will generate and roughly how long it takes, and wait for an OK.
31
31
 
32
32
  ## Routing
33
33
 
34
- Skills are flat slugs under the `summer:` namespace (`summer:<slug>`); there are no category paths.
34
+ Skills are invoked by their bare slug, such as `brainstorm-game`. There is no `summer:` prefix and there are no category paths.
35
35
 
36
36
  | Request shape | First skill |
37
37
  |---|---|
38
- | brainstorm a [genre] game / let's make a [genre] / I'm stuck / what should I work on | `summer:brainstorm-game` |
39
- | start a new project | `summer:new-project` |
40
- | make me a game from scratch | `summer:make-game` |
41
- | add a [character / enemy / NPC / prop / vehicle] | `summer:asset-strategy` |
42
- | add a sound for [event] | `summer:sound-effect` |
43
- | add ambient music | `summer:music-track` |
44
- | make me fire / smoke / lightning / muzzle flash / magic glow / hit spark / dissolve / water ripple | `summer:vfx-fire`, `summer:vfx-smoke`, `summer:vfx-lightning`, `summer:vfx-muzzle-flash`, `summer:vfx-magic-glow`, `summer:vfx-hit-spark`, `summer:vfx-dissolve`, `summer:vfx-water-ripple` |
45
- | build the FPS controller | `summer:fps-controller` |
46
- | debug / the game crashes when [X] / broken behavior / cloud or Codex failure / send this to support | `summer:debug` (support-report mode first: call `summer_create_debug_report` when available and tell the user where the Markdown report was written; keep fixing only if they also asked for a fix) |
47
- | add an animation to [character] | `summer:generate-motion` |
48
- | wire up a state machine for [character] | `summer:animation-tree` |
49
- | the game feels mushy / add juice | `summer:game-feel` |
50
- | ship a trailer | `summer:trailer-shot` |
51
- | cutscene for [X] | `summer:cinematic-cutscene` |
52
- | let me play it | `summer:play` |
53
-
54
- If nothing fits, activate `summer:using-summer` and call `summer_search_library` (then `summer_read_library`) to find the closest skill. Never invent a skill name; verify it exists first.
38
+ | brainstorm a [genre] game / let's make a [genre] / I'm stuck / what should I work on | `brainstorm-game` |
39
+ | start a new project | `new-project` |
40
+ | make me a game from scratch | `make-game` |
41
+ | add a [character / enemy / NPC / prop / vehicle] | `asset-strategy` |
42
+ | add a sound for [event] | `sound-effect` |
43
+ | add ambient music | `music-track` |
44
+ | make me fire / smoke / lightning / muzzle flash / magic glow / hit spark / dissolve / water ripple | `vfx-fire`, `vfx-smoke`, `vfx-lightning`, `vfx-muzzle-flash`, `vfx-magic-glow`, `vfx-hit-spark`, `vfx-dissolve`, `vfx-water-ripple` |
45
+ | build the FPS controller | `fps-controller` |
46
+ | debug / the game crashes when [X] / broken behavior / cloud or Codex failure / send this to support | `debug` (support-report mode first: call `summer_create_debug_report` when available and tell the user where the Markdown report was written; keep fixing only if they also asked for a fix) |
47
+ | add an animation to [character] | `generate-motion` |
48
+ | wire up a state machine for [character] | `animation-tree` |
49
+ | the game feels mushy / add juice | `game-feel` |
50
+ | ship a trailer | `trailer-shot` |
51
+ | cutscene for [X] | `cinematic-cutscene` |
52
+ | let me play it | `play` |
53
+
54
+ If nothing fits, activate `using-summer` and call `summer_search_library` (then `summer_read_library`) to find the closest skill. Never invent a skill name; verify it exists first.
55
55
 
56
56
  ## Tone rules
57
57
 
58
58
  - No corporate hedging. "I'd recommend" becomes "do this." "It might be worth considering" becomes "next step is."
59
- - Cost-aware: "Generating with kling. 5s, ~$0.50. OK?" — never "I'll generate a video now."
59
+ - Ask before spending: "Generating a 5s clip with kling, about 3 minutes. OK?" Never "I'll generate a video now."
60
60
  - Scope-aware: the cut list goes in `.summer/GameSoul.md`, not in V1.
61
61
  - Confirm before destructive moves: replacing nodes, deleting assets, regenerating expensive outputs.
62
62
  - Do not redirect users to external docs; solve it in-conversation.
@@ -70,12 +70,12 @@ If nothing fits, activate `summer:using-summer` and call `summer_search_library`
70
70
 
71
71
  > User: /summer make a knight
72
72
  >
73
- > Summer: Knight character. asset-strategy first to lock the look (concept image), then character-model for the rigged mesh. ~$0.10 for the concept, ~$0.40 for the 3D pass. OK?
73
+ > Summer: Knight character. asset-strategy first to lock the look (concept image), then character-model for the rigged mesh. Two generations. OK?
74
74
  >
75
- > [invokes `summer:asset-strategy`]
75
+ > [invokes `asset-strategy`]
76
76
 
77
77
  > User: /summer the game crashes when I pick up the sword
78
78
  >
79
79
  > Summer: Going to debug. Writing the support report first, then the fix.
80
80
  >
81
- > [invokes `summer:debug`]
81
+ > [invokes `debug`]
@@ -7,7 +7,7 @@ import { type OpenDeps, type OpenResult, type OpenSurface } from "../../core/cap
7
7
  * Summer Engine (launching it when it is not running). Any argument that is
8
8
  * an existing directory or looks like a filesystem path takes this branch,
9
9
  * so nothing that worked before changes.
10
- * 2. `summer open <target>` — navigation (docs/design/NAVIGATION-DESIGN.md):
10
+ * 2. `summer open <target>` — navigation:
11
11
  * a product-map id ("billing"), an intent phrase ("change my plan"), a
12
12
  * res:// path, or a summerengine.com path. Same behavior as the
13
13
  * summer_open MCP tool and `summer tool open` (core/capabilities/navigation).
@@ -13,7 +13,7 @@ export type RunBinaryResolution = {
13
13
  * (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
14
14
  * An explicit override is never silently swapped for the installed engine:
15
15
  * a missing path or a bare `.app` bundle is an error, because the caller
16
- * asked for THAT build (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 5).
16
+ * asked for THAT build.
17
17
  */
18
18
  export declare function resolveRunBinary(binFlag: string | undefined, env?: NodeJS.ProcessEnv): RunBinaryResolution;
19
19
  export declare const runCommand: Command;
@@ -79,7 +79,7 @@ async function withLaunchLock(fn) {
79
79
  * (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
80
80
  * An explicit override is never silently swapped for the installed engine:
81
81
  * a missing path or a bare `.app` bundle is an error, because the caller
82
- * asked for THAT build (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 5).
82
+ * asked for THAT build.
83
83
  */
84
84
  export function resolveRunBinary(binFlag, env = process.env) {
85
85
  const fromEnv = engineBinaryOverride(env);
@@ -1,5 +1,5 @@
1
1
  import { Command, Option } from "commander";
2
- import { configureAgentMcp, resolveAgentSelection, resolveConfigScope, supportedAgents, } from "../../installer/agent-config.js";
2
+ import { configureAgentMcp, configureSummerGamesMcp, resolveAgentSelection, resolveConfigScope, supportedAgents, } from "../../installer/agent-config.js";
3
3
  import { previewNote, setupSkills } from "../../installer/setup.js";
4
4
  import { printDoctorResult, runDoctor } from "../../core/capabilities/doctor.js";
5
5
  import { brandLine, c, sym, tildeify } from "../../core/format.js";
@@ -7,7 +7,7 @@ import { TOOLKIT_VERSION as cliVersion } from "../../core/version.js";
7
7
  import { resolveDefaultChannel } from "../../installer/version-check.js";
8
8
  import { agentLabel } from "../../installer/agent-table.js";
9
9
  export const setupCommand = new Command("setup")
10
- .description("Configure Summer Engine for an AI agent and run diagnostics")
10
+ .description("Configure Summer Engine for an AI agent and run diagnostics. For Claude Code and Codex it also adds Summer Games (summer-games).")
11
11
  .argument("[agent]", `Agent to configure: ${supportedAgents.join(", ")}`)
12
12
  .option("--agent <agent>", `Agent to configure: ${supportedAgents.join(", ")}`)
13
13
  .option("--scope <scope>", "Configuration scope: user or project", "user")
@@ -16,6 +16,7 @@ export const setupCommand = new Command("setup")
16
16
  .option("--local-dev", "Point the agent at this checkout's built CLI (node <repo>/dist/bin/summer.js mcp) instead of npx summer-engine@latest — for testing unpublished builds. SUMMER_DEV=1 does the same.")
17
17
  .option("--channel <dist-tag>", "npm dist-tag the agent's MCP entry runs: npx -y summer-engine@<dist-tag> mcp (default latest; use next while a release soaks on the next tag). SUMMER_CHANNEL does the same.")
18
18
  .option("--yes", "Apply practical setup steps without prompting")
19
+ .option("--no-games", "Do not add the Summer Games MCP (summer-games: friends, parties and messages as you, signed in through summer.games; Claude Code and Codex)")
19
20
  .option("--json", "Print setup result as JSON")
20
21
  .option("--force", "Overwrite existing skill content (passes --force through to skills install)")
21
22
  .option("--recommended", "Install only the recommended skill subset instead of the whole library")
@@ -34,6 +35,9 @@ export const setupCommand = new Command("setup")
34
35
  localDev: Boolean(opts.localDev) || process.env.SUMMER_DEV === "1",
35
36
  channel: opts.channel ?? process.env.SUMMER_CHANNEL ?? defaultChannel.channel,
36
37
  });
38
+ const games = opts.games === false || opts.print
39
+ ? null
40
+ : await configureSummerGamesMcp({ agent, scope, dryRun: opts.dryRun });
37
41
  if (!opts.channel && !process.env.SUMMER_CHANNEL && defaultChannel.note && !opts.print) {
38
42
  console.log(` ${c.dim(defaultChannel.note)}`);
39
43
  }
@@ -50,18 +54,19 @@ export const setupCommand = new Command("setup")
50
54
  console.log(JSON.stringify({
51
55
  ok: doctor.ok && skills.status !== "failed",
52
56
  config,
57
+ games,
53
58
  skills,
54
59
  doctor,
55
60
  }, null, 2));
56
61
  }
57
62
  else {
58
- printSetupResult(config, skills, doctor);
63
+ printSetupResult(config, games, skills, doctor);
59
64
  }
60
65
  if (!doctor.ok || skills.status === "failed") {
61
66
  process.exit(1);
62
67
  }
63
68
  });
64
- function printSetupResult(config, skills, doctor) {
69
+ function printSetupResult(config, games, skills, doctor) {
65
70
  if (config.print) {
66
71
  console.log(config.snippet.trimEnd());
67
72
  return;
@@ -85,6 +90,21 @@ function printSetupResult(config, skills, doctor) {
85
90
  else if (config.channel !== "latest") {
86
91
  console.log(` ${c.dim(`(channel ${config.channel})`)} MCP server command: ${c.dim(`${config.server.command} ${config.server.args.join(" ")}`)}`);
87
92
  }
93
+ if (games) {
94
+ const name = c.bold("Summer Games");
95
+ const url = c.dim(games.url);
96
+ if (games.existingName) {
97
+ console.log(` ${sym.ok()} ${name} already added as ${c.bold(games.existingName)} ${url}`);
98
+ }
99
+ else if (config.dryRun) {
100
+ console.log(` ${c.dim("(dry run)")} ${games.changed ? "Would add" : "Already added"} ${name} ${url}`);
101
+ }
102
+ else {
103
+ console.log(` ${sym.ok()} ${games.wrote ? "Added" : "Already added"} ${name} ${url}`);
104
+ }
105
+ if (!config.dryRun)
106
+ console.log(` ${c.dim(`Sign in once: ${games.signIn}`)}`);
107
+ }
88
108
  if (skills.status === "installed") {
89
109
  const installed = parseInstalledSkills(skills.stdout);
90
110
  if (installed.length > 0) {
@@ -340,7 +340,7 @@ skillsCommand
340
340
  console.log(previewIncludedLine(previewIncluded));
341
341
  if (previewSkipped > 0)
342
342
  console.log(previewSkippedLine(previewSkipped));
343
- // Claude Code: also install slash commands (`tools/summer-cli/commands/*.md`)
343
+ // Claude Code: also install slash commands (`commands/*.md`)
344
344
  // into `~/.claude/commands/`. Other agents don't have an equivalent today.
345
345
  if (agent === "claude-code") {
346
346
  const commandResults = installClaudeCommands(scope, Boolean(opts.force));
@@ -352,7 +352,7 @@ skillsCommand
352
352
  printInstallSummary(skills.length, agent, scope, location);
353
353
  });
354
354
  /**
355
- * Copy every `.md` file in `tools/summer-cli/commands/` to the user's
355
+ * Copy every `.md` file in the package's `commands/` to the user's
356
356
  * `~/.claude/commands/` directory so the slash commands (e.g. `/gameskill`)
357
357
  * are available on every machine that runs `summer skills install`.
358
358
  *
@@ -22,7 +22,7 @@ export type EngineSnapshot = {
22
22
  /** Structured failure classifier the engine returns on a game snapshot over
23
23
  * local HTTP (409 `bridge_required`) — surfaced verbatim so the tool can give
24
24
  * an honest, actionable message instead of a truncated generic 409 string.
25
- * When P4.4 lands (game snapshots answer 200/202 over HTTP) this simply
25
+ * Once game snapshots answer 200/202 over HTTP this simply
26
26
  * never fires and the tool works. */
27
27
  failureReason?: string;
28
28
  /** Scene-preview confession fields (P4.3). Populated only for target:"scene".
@@ -194,8 +194,8 @@ export declare class EngineApiClient {
194
194
  private _parseSnapshotResponse;
195
195
  /**
196
196
  * Turn a 409 from /api/snapshot/game into a structured failure. The engine's
197
- * structural refusal carries `bridge_required` / `unsupported_transport`
198
- * (tool_net_thread.cpp:495-503); a 409 without that shape is surfaced as a
197
+ * structural refusal carries `bridge_required` / `unsupported_transport`;
198
+ * a 409 without that shape is surfaced as a
199
199
  * plain error rather than silently claiming "bridge required".
200
200
  */
201
201
  private _bridgeRequiredFromResponse;
@@ -246,9 +246,8 @@ export declare class EngineApiClient {
246
246
  getPort(): number;
247
247
  /**
248
248
  * Cheap drift probe for the MCP client cache. The engine mints a fresh
249
- * api-token on every launch (local_api_server.cpp::_generate_api_token) and can
250
- * bind a different port (tool_net_thread.cpp::start increments 6550..6565 when
251
- * the old socket lingers), so a client built before an engine restart holds
249
+ * api-token on every launch and can bind a different port (it increments
250
+ * 6550..6565 when the old socket lingers), so a client built before an engine restart holds
252
251
  * dead credentials. Re-read the on-disk creds and report whether they no longer
253
252
  * match this client's snapshot.
254
253
  *
@@ -492,8 +492,7 @@ export class EngineApiClient {
492
492
  async getSceneState(scenePath, options) {
493
493
  // depth/limit/root only take effect on targeted (scene=) reads: the engine
494
494
  // routes those through the live command queue and forwards every query
495
- // param into StateProvider::scene_state (tool_net_thread.cpp
496
- // _parse_state_args). An UNtargeted read is answered from a pre-published
495
+ // param into the engine's scene-state reader. An UNtargeted read is answered from a pre-published
497
496
  // snapshot built with the defaults (depth 2, limit 200) and its query
498
497
  // params are ignored — callers who need depth/limit must pass scenePath
499
498
  // (summer_get_scene_tree resolves the current scene path for this).
@@ -515,9 +514,8 @@ export class EngineApiClient {
515
514
  async getProjectState(prefix) {
516
515
  // ?prefix= is sent for forward-compatibility, but current engine builds
517
516
  // IGNORE it: /api/state/project is always served from the snapshot, which
518
- // is published with empty args (local_api_server.cpp
519
- // _maybe_publish_snapshot), so StateProvider::project_state never sees the
520
- // query. Callers that need a prefix subset must also filter client-side
517
+ // is published with empty args, so the engine's project-state reader never
518
+ // sees the query. Callers that need a prefix subset must also filter client-side
521
519
  // (summer_get_project_context does).
522
520
  const query = prefix ? `?prefix=${encodeURIComponent(prefix)}` : "";
523
521
  return this.request("GET", `/api/state/project${query}`);
@@ -542,13 +540,13 @@ export class EngineApiClient {
542
540
  if (pins) {
543
541
  // Determinism params (seed / fixed_fps / time_scale) — the /api/play rung
544
542
  // copies ONLY `scene` from options into the PlayGame op
545
- // (local_api_server.cpp play branch), so a pinned launch travels as an
543
+ // (the engine's /api/play handler), so a pinned launch travels as an
546
544
  // explicit PlayGame op through /api/ops. executeOps stamps the bound
547
545
  // identity like every other op. An engine that predates the params
548
546
  // ignores the extra keys and answers the v1 result (no `determinism`).
549
547
  return this.executeOps([{ op: "PlayGame", ...(scene ? { scene } : {}), ...pins }], undefined, 60_000);
550
548
  }
551
- // The engine reads play params from body.options (tool_net_thread.cpp:503),
549
+ // The engine reads play params from body.options,
552
550
  // and the play handler reads options["scene"] — a top-level { scene } is
553
551
  // dropped, so the scene MUST be nested inside options. The bound identity
554
552
  // rides in the same options dict so play is refused on a mismatched project.
@@ -593,10 +591,10 @@ export class EngineApiClient {
593
591
  // with the same payload shape — _requestQueued resolves both.
594
592
  //
595
593
  // Game capture over local HTTP structurally 409s today with a STRUCTURED
596
- // reason (`failure_reason:"unsupported_transport"`, `bridge_required:true`,
597
- // tool_net_thread.cpp:495-503). Detect that specific shape and return it
594
+ // reason (`failure_reason:"unsupported_transport"`, `bridge_required:true`).
595
+ // Detect that specific shape and return it
598
596
  // verbatim so the tool can give an honest message — do NOT hardcode "game
599
- // always fails": once the engine answers 200/202 (P4.4), the same response
597
+ // always fails": once the engine answers 200/202, the same response
600
598
  // flows into the normal queued path. ONE request either way: a probe that
601
599
  // discarded a 200 (or orphaned an accepted 202 requestId) and then asked
602
600
  // again would capture the game twice.
@@ -681,8 +679,8 @@ export class EngineApiClient {
681
679
  }
682
680
  /**
683
681
  * Turn a 409 from /api/snapshot/game into a structured failure. The engine's
684
- * structural refusal carries `bridge_required` / `unsupported_transport`
685
- * (tool_net_thread.cpp:495-503); a 409 without that shape is surfaced as a
682
+ * structural refusal carries `bridge_required` / `unsupported_transport`;
683
+ * a 409 without that shape is surfaced as a
686
684
  * plain error rather than silently claiming "bridge required".
687
685
  */
688
686
  async _bridgeRequiredFromResponse(res) {
@@ -777,9 +775,8 @@ export class EngineApiClient {
777
775
  }
778
776
  /**
779
777
  * Cheap drift probe for the MCP client cache. The engine mints a fresh
780
- * api-token on every launch (local_api_server.cpp::_generate_api_token) and can
781
- * bind a different port (tool_net_thread.cpp::start increments 6550..6565 when
782
- * the old socket lingers), so a client built before an engine restart holds
778
+ * api-token on every launch and can bind a different port (it increments
779
+ * 6550..6565 when the old socket lingers), so a client built before an engine restart holds
783
780
  * dead credentials. Re-read the on-disk creds and report whether they no longer
784
781
  * match this client's snapshot.
785
782
  *
package/dist/core/auth.js CHANGED
@@ -161,8 +161,8 @@ export async function saveLoginSession(session) {
161
161
  // those exact files. credential-metadata.json adds audience/scope information
162
162
  // without changing or duplicating the secret.
163
163
  // Write order: user.json, then auth-token, then the advisory metadata. The
164
- // desktop engine cross-checks token.sub against user.json's id
165
- // (summerengine auth_manager.cpp, inspect_cli_bootstrap_credential), so a
164
+ // desktop engine cross-checks token.sub against user.json's id when it
165
+ // adopts the CLI credential, so a
166
166
  // write interrupted between the first two files fails closed instead of
167
167
  // adopting a mismatched identity. The metadata write is last and is NOT a
168
168
  // gate: the token is already live by then, and its contents are re-derived
@@ -2,7 +2,6 @@
2
2
  * Asset import into the engine-bound project (Kenney texture pairing + path
3
3
  * inference + optional scene placement). ONE copy shared by the MCP asset tools
4
4
  * and the CLI dispatch table.
5
- * See: publicsummerengine/Docs/ASSET_IMPORT_END_TO_END.md
6
5
  */
7
6
  import type { EngineApiClient } from "../api-client.js";
8
7
  /** An asset record as returned by the Summer gateway asset APIs. */
@@ -4,7 +4,7 @@ export type CameraBookmarkAction = (typeof CAMERA_BOOKMARK_ACTIONS)[number];
4
4
  export declare const CAMERA_BOOKMARK_OPS: Record<CameraBookmarkAction, string>;
5
5
  /** What the engine_lacks_op result tells the model to do instead. */
6
6
  export declare const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
7
- /** Bookmark name grammar (preview_ops.cpp): 1-64 of [A-Za-z0-9_-]. */
7
+ /** Bookmark name grammar (same as the engine's): 1-64 of [A-Za-z0-9_-]. */
8
8
  export declare const BOOKMARK_NAME_PATTERN: RegExp;
9
9
  export interface CameraBookmarkArgs {
10
10
  action: CameraBookmarkAction;
@@ -4,7 +4,7 @@
4
4
  * and the CLI dispatcher so both faces validate the same way and send the same
5
5
  * op.
6
6
  *
7
- * Engine contract (doc/SUMMER/SCENE_SCRIPTING_CONTRACTS.md, "Wave I"):
7
+ * Engine contract:
8
8
  * SaveCameraBookmark { name, position?, look_at?, fov? } -> pose_source
9
9
  * ListCameraBookmarks {} -> names, bookmarks
10
10
  * DeleteCameraBookmark { name } -> remaining
@@ -25,7 +25,7 @@ export const CAMERA_BOOKMARK_OPS = {
25
25
  };
26
26
  /** What the engine_lacks_op result tells the model to do instead. */
27
27
  export const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
28
- /** Bookmark name grammar (preview_ops.cpp): 1-64 of [A-Za-z0-9_-]. */
28
+ /** Bookmark name grammar (same as the engine's): 1-64 of [A-Za-z0-9_-]. */
29
29
  export const BOOKMARK_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
30
30
  function requireBookmarkName(name, action) {
31
31
  const trimmed = name?.trim() ?? "";
@@ -7,12 +7,15 @@ import { type EngineRun } from "./engine-run.js";
7
7
  * focus, so it never shows on screen, unlike --headless, which has no pixels.
8
8
  *
9
9
  * <engine> --disable-crash-handler --summer-no-api --path <project> --resolution WxH
10
- * [--scene res://...] --summer-verify <probe.gd>
11
- * --summer-verify-out <dir> --summer-verify-max <s>
10
+ * [--scene res://...] --summer-offscreen --summer-verify <probe.gd>
11
+ * --summer-verify-out <dir> --summer-verify-max <s> [-- <args>]
12
12
  *
13
- * The stock probe waits for the scene to draw and settle, saves PNG frames of
14
- * the game viewport, and writes results.json. The frames are what the game
15
- * really draws, HUD included: use them as store screenshots.
13
+ * The stock probe waits for the scene to draw and settle, runs the steps (press
14
+ * a button, a key or an input action, click, drag, wait, shot) from inside the
15
+ * game, saves PNG frames of the game viewport, and writes results.json. The
16
+ * frames are what the game really draws, HUD included: use them as store
17
+ * screenshots. `args` reach the game as OS.get_cmdline_user_args(), so a game
18
+ * that skips its title screen on a flag starts in play.
16
19
  */
17
20
  export interface CaptureGameplayInput {
18
21
  /** Project root (has project.godot). Defaults to the MCP's --project, then the working directory. */
@@ -29,6 +32,49 @@ export interface CaptureGameplayInput {
29
32
  intervalSeconds?: number;
30
33
  /** Output folder. Default <project>/.summer/captures/<time>/. */
31
34
  out?: string;
35
+ /** The game's own command-line args, passed after "--" (OS.get_cmdline_user_args()). */
36
+ args?: string[];
37
+ /** What to do after waitSeconds, in order. With a shot step, only shot steps save frames. */
38
+ steps?: CaptureStep[];
39
+ }
40
+ /**
41
+ * One capture step, run from inside the game. Coordinates are frame pixels
42
+ * (the saved PNG's space). press finds a visible, enabled button by its text,
43
+ * then its node name, then a partial match, waiting up to timeoutSeconds for
44
+ * it to appear; it clicks the button's centre, and emits pressed when the
45
+ * click did not reach it. key takes Godot key names (Space, Enter, Escape, A).
46
+ */
47
+ export type CaptureStep = {
48
+ press: string;
49
+ timeoutSeconds?: number;
50
+ } | {
51
+ key: string;
52
+ holdMs?: number;
53
+ } | {
54
+ action: string;
55
+ holdMs?: number;
56
+ } | {
57
+ click: [number, number];
58
+ } | {
59
+ drag: {
60
+ from: [number, number];
61
+ to: [number, number];
62
+ ms?: number;
63
+ };
64
+ } | {
65
+ wait: number;
66
+ } | {
67
+ shot: true;
68
+ };
69
+ /** A step as the probe reads it (one shape, all fields named). */
70
+ export interface ProbeStep {
71
+ type: "press" | "key" | "action" | "click" | "drag" | "wait" | "shot";
72
+ text?: string;
73
+ timeout?: number;
74
+ hold_ms?: number;
75
+ at?: [number, number];
76
+ to?: [number, number];
77
+ ms?: number;
32
78
  }
33
79
  export interface CapturedFrame {
34
80
  path: string;
@@ -44,6 +90,8 @@ export interface CaptureGameplayResult {
44
90
  out: string;
45
91
  engine: string;
46
92
  imported: boolean;
93
+ /** Why the project was imported before the capture. */
94
+ importReason?: string;
47
95
  durationMs: number;
48
96
  warnings?: string[];
49
97
  next: string;
@@ -53,6 +101,20 @@ export interface CaptureGameplayDependencies {
53
101
  run: (binary: string, args: string[], timeoutMs: number) => Promise<EngineRun>;
54
102
  now: () => Date;
55
103
  }
104
+ /** Validate the steps and turn them into the probe's one shape. */
105
+ export declare function probeSteps(steps: unknown): ProbeStep[];
106
+ /**
107
+ * Whether the project's import caches are stale: an imported file (texture,
108
+ * model, sound, font) that has no .import sidecar or cache yet, or whose
109
+ * content changed since it was imported (a pull, or LFS files fetched after
110
+ * the first import). Also names files that are still Git LFS pointers, which no
111
+ * import can fix.
112
+ */
113
+ export declare function importState(project: string): {
114
+ needed: boolean;
115
+ reason?: string;
116
+ lfsPointers: string[];
117
+ };
56
118
  /** Width and height from a PNG's IHDR chunk, or null when the file is not a PNG. */
57
119
  export declare function pngSize(bytes: Buffer): {
58
120
  width: number;
@@ -63,7 +125,10 @@ export declare function pngSize(bytes: Buffer): {
63
125
  * project); follows the verify-instance contract of assets/autopilot/probe_base.gd:
64
126
  * the engine sets summer_out_dir and summer_max_seconds before _ready(), the
65
127
  * first frames are empty until the scene has drawn twice, results.json is
66
- * always written.
128
+ * always written. The steps are generated as typed calls, and nothing reads a
129
+ * Variant, so projects that treat every GDScript warning as an error
130
+ * (untyped_declaration, unsafe_call_argument, unsafe_cast, integer_division)
131
+ * still load it.
67
132
  */
68
- export declare function captureProbeSource(frames: number, waitSeconds: number, intervalSeconds: number): string;
133
+ export declare function captureProbeSource(frames: number, waitSeconds: number, intervalSeconds: number, steps?: ProbeStep[]): string;
69
134
  export declare function captureGameplay(input: CaptureGameplayInput, overrides?: Partial<CaptureGameplayDependencies>): Promise<CaptureGameplayResult>;