summer-engine 3.8.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (485) hide show
  1. package/.claude-plugin/marketplace.json +2 -13
  2. package/.claude-plugin/plugin.json +23 -22
  3. package/.codex-plugin/plugin.json +4 -12
  4. package/.cursor-plugin/plugin.json +4 -12
  5. package/.factory-plugin/plugin.json +4 -12
  6. package/AGENTS.md +19 -12
  7. package/CHANGELOG.md +96 -0
  8. package/GEMINI.md +3 -3
  9. package/README.md +103 -33
  10. package/assets/icon.png +0 -0
  11. package/commands/start.md +71 -0
  12. package/commands/summer.md +3 -2
  13. package/dist/cli/banner.js +3 -0
  14. package/dist/cli/commands/login.d.ts +27 -0
  15. package/dist/cli/commands/login.js +58 -12
  16. package/dist/cli/commands/ops.d.ts +47 -0
  17. package/dist/cli/commands/ops.js +301 -0
  18. package/dist/cli/commands/setup.d.ts +2 -0
  19. package/dist/cli/commands/setup.js +37 -12
  20. package/dist/cli/commands/skills.js +11 -7
  21. package/dist/cli/index.js +7 -0
  22. package/dist/core/agent-host.d.ts +65 -0
  23. package/dist/core/agent-host.js +193 -0
  24. package/dist/core/capabilities/agent-playbook.d.ts +3 -0
  25. package/dist/core/capabilities/agent-playbook.js +54 -2
  26. package/dist/core/capabilities/apps.d.ts +25 -2
  27. package/dist/core/capabilities/apps.js +25 -12
  28. package/dist/core/capabilities/doctor.d.ts +3 -0
  29. package/dist/core/capabilities/doctor.js +20 -15
  30. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -2
  31. package/dist/core/capabilities/game-task-plan.d.ts +12 -6
  32. package/dist/core/capabilities/game-task-plan.js +80 -5
  33. package/dist/core/capabilities/motion-generation.js +2 -2
  34. package/dist/core/capabilities/navigation/open.d.ts +6 -2
  35. package/dist/core/capabilities/navigation/open.js +3 -0
  36. package/dist/core/capabilities/publish-build.js +2 -0
  37. package/dist/core/capabilities/runtime-control.d.ts +4 -4
  38. package/dist/core/capabilities/scene-script-target.d.ts +17 -0
  39. package/dist/core/capabilities/scene-script-target.js +70 -0
  40. package/dist/core/capabilities/sfx-choices.d.ts +4 -0
  41. package/dist/core/capabilities/sfx-choices.js +13 -6
  42. package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
  43. package/dist/core/capabilities/tool-dispatch.js +81 -46
  44. package/dist/core/embeddings.d.ts +2 -0
  45. package/dist/core/embeddings.js +1 -1
  46. package/dist/core/error-codes.d.ts +62 -0
  47. package/dist/core/error-codes.js +97 -0
  48. package/dist/core/format.d.ts +2 -0
  49. package/dist/core/format.js +2 -1
  50. package/dist/core/hosted-mcp.d.ts +22 -0
  51. package/dist/core/hosted-mcp.js +56 -1
  52. package/dist/core/library-read.js +5 -0
  53. package/dist/core/library-search.js +2 -1
  54. package/dist/core/oauth.js +4 -0
  55. package/dist/core/ops/catalog.d.ts +41 -0
  56. package/dist/core/ops/catalog.js +145 -0
  57. package/dist/core/ops/cloud.d.ts +56 -0
  58. package/dist/core/ops/cloud.js +175 -0
  59. package/dist/core/ops/contract.d.ts +119 -0
  60. package/dist/core/ops/contract.js +142 -0
  61. package/dist/core/ops/engine-answer.d.ts +25 -0
  62. package/dist/core/ops/engine-answer.js +117 -0
  63. package/dist/core/ops/engine.d.ts +55 -0
  64. package/dist/core/ops/engine.js +649 -0
  65. package/dist/core/ops/save-files.d.ts +78 -0
  66. package/dist/core/ops/save-files.js +419 -0
  67. package/dist/core/ops/search.d.ts +9 -0
  68. package/dist/core/ops/search.js +55 -0
  69. package/dist/core/skills-registry.d.ts +16 -1
  70. package/dist/core/skills-registry.js +35 -2
  71. package/dist/core/telemetry.d.ts +32 -0
  72. package/dist/core/telemetry.js +38 -10
  73. package/dist/core/tool-profiles.d.ts +25 -0
  74. package/dist/core/tool-profiles.js +41 -0
  75. package/dist/installer/agent-config.d.ts +17 -4
  76. package/dist/installer/agent-config.js +22 -6
  77. package/dist/installer/agent-table.d.ts +3 -0
  78. package/dist/installer/agent-table.js +10 -7
  79. package/dist/installer/setup.d.ts +2 -0
  80. package/dist/installer/setup.js +9 -4
  81. package/dist/installer/version-check.d.ts +29 -9
  82. package/dist/installer/version-check.js +81 -28
  83. package/dist/mcp/command.js +7 -0
  84. package/dist/mcp/hosted-mount.d.ts +27 -2
  85. package/dist/mcp/hosted-mount.js +53 -23
  86. package/dist/mcp/legacy-toolset.d.ts +27 -0
  87. package/dist/mcp/legacy-toolset.js +43 -0
  88. package/dist/mcp/ops-surface.d.ts +59 -0
  89. package/dist/mcp/ops-surface.js +443 -0
  90. package/dist/mcp/server.d.ts +35 -11
  91. package/dist/mcp/server.js +234 -89
  92. package/dist/mcp/tool-results.d.ts +26 -0
  93. package/dist/mcp/tool-results.js +81 -0
  94. package/dist/mcp/tool-surface.d.ts +65 -0
  95. package/dist/mcp/tool-surface.js +317 -0
  96. package/dist/mcp/tools/app-tools.js +9 -2
  97. package/dist/mcp/tools/asset-tools.js +55 -53
  98. package/dist/mcp/tools/audit-tools.js +21 -21
  99. package/dist/mcp/tools/debug-tools.js +6 -6
  100. package/dist/mcp/tools/fabricate-tools.js +6 -6
  101. package/dist/mcp/tools/generate-tools.js +76 -70
  102. package/dist/mcp/tools/project-tools.d.ts +9 -4
  103. package/dist/mcp/tools/project-tools.js +16 -10
  104. package/dist/mcp/tools/scene-tools.js +12 -23
  105. package/dist/mcp/tools/script-tools.js +9 -5
  106. package/dist/mcp/tools/with-engine.d.ts +6 -0
  107. package/dist/mcp/tools/with-engine.js +19 -0
  108. package/gemini-extension.json +4 -12
  109. package/hooks/pre-commit-doctor.sh +5 -4
  110. package/hooks/session-start.sh +24 -28
  111. package/integrations/claude-desktop/README.md +1 -1
  112. package/integrations/copilot-jetbrains/README.md +1 -1
  113. package/integrations/junie/README.md +1 -1
  114. package/integrations/lm-studio/README.md +1 -1
  115. package/integrations/trae/README.md +1 -1
  116. package/integrations/visual-studio/README.md +1 -1
  117. package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
  118. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  119. package/library/references/product-map/resource.yaml +2 -2
  120. package/library/skills/3d-lighting/SKILL.md +53 -28
  121. package/library/skills/3d-lighting/resource.yaml +1 -1
  122. package/library/skills/README.md +119 -117
  123. package/library/skills/adaptive-music/SKILL.md +19 -23
  124. package/library/skills/adaptive-music/resource.yaml +1 -1
  125. package/library/skills/agent-playtesting/SKILL.md +1 -1
  126. package/library/skills/agent-playtesting/resource.yaml +1 -1
  127. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  128. package/library/skills/ai-characters-in-games/resource.yaml +1 -1
  129. package/library/skills/ambient-bed/SKILL.md +22 -13
  130. package/library/skills/ambient-bed/resource.yaml +1 -1
  131. package/library/skills/animated-loop/SKILL.md +41 -32
  132. package/library/skills/animated-loop/resource.yaml +1 -1
  133. package/library/skills/animation-tree/SKILL.md +1 -1
  134. package/library/skills/animation-tree/resource.yaml +1 -1
  135. package/library/skills/art-direction/SKILL.md +3 -3
  136. package/library/skills/art-direction/resource.yaml +1 -1
  137. package/library/skills/asset-strategy/SKILL.md +21 -4
  138. package/library/skills/asset-strategy/resource.yaml +2 -1
  139. package/library/skills/audio-direction/SKILL.md +10 -10
  140. package/library/skills/audio-direction/resource.yaml +1 -1
  141. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  142. package/library/skills/auto-fire-targeting/resource.yaml +1 -1
  143. package/library/skills/bounded-engine-runs/SKILL.md +1 -1
  144. package/library/skills/bounded-engine-runs/resource.yaml +1 -1
  145. package/library/skills/brainstorm-game/SKILL.md +1 -1
  146. package/library/skills/brainstorm-game/resource.yaml +1 -1
  147. package/library/skills/brainstorming/SKILL.md +1 -1
  148. package/library/skills/brainstorming/resource.yaml +1 -1
  149. package/library/skills/browse-templates/SKILL.md +1 -1
  150. package/library/skills/browse-templates/resource.yaml +1 -1
  151. package/library/skills/camera-rigs/SKILL.md +2 -2
  152. package/library/skills/camera-rigs/resource.yaml +1 -1
  153. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
  154. package/library/skills/character-animation-wiring/SKILL.md +4 -4
  155. package/library/skills/character-animation-wiring/resource.yaml +1 -1
  156. package/library/skills/character-model/SKILL.md +55 -47
  157. package/library/skills/character-model/resource.yaml +1 -1
  158. package/library/skills/character-movement/SKILL.md +3 -3
  159. package/library/skills/character-movement/resource.yaml +1 -1
  160. package/library/skills/character-portrait/SKILL.md +24 -19
  161. package/library/skills/character-portrait/resource.yaml +1 -1
  162. package/library/skills/cinematic-cutscene/SKILL.md +58 -46
  163. package/library/skills/cinematic-cutscene/resource.yaml +1 -1
  164. package/library/skills/combat-basics/SKILL.md +1 -1
  165. package/library/skills/combat-basics/resource.yaml +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +1 -1
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
  168. package/library/skills/concept-art/SKILL.md +16 -12
  169. package/library/skills/concept-art/resource.yaml +1 -1
  170. package/library/skills/concept-to-level/SKILL.md +239 -0
  171. package/library/skills/concept-to-level/references/technical-rules.md +150 -0
  172. package/library/skills/concept-to-level/resource.yaml +44 -0
  173. package/library/skills/create-asset-sheet/SKILL.md +19 -13
  174. package/library/skills/create-asset-sheet/resource.yaml +1 -1
  175. package/library/skills/debug/SKILL.md +2 -2
  176. package/library/skills/debug/resource.yaml +1 -1
  177. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  178. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  179. package/library/skills/design-level/SKILL.md +23 -35
  180. package/library/skills/design-level/resource.yaml +1 -1
  181. package/library/skills/design-mechanic/SKILL.md +1 -1
  182. package/library/skills/design-mechanic/resource.yaml +1 -1
  183. package/library/skills/design-npc/SKILL.md +22 -24
  184. package/library/skills/design-npc/resource.yaml +1 -1
  185. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  186. package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
  187. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  188. package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
  189. package/library/skills/environment-kit/SKILL.md +20 -16
  190. package/library/skills/environment-kit/resource.yaml +1 -1
  191. package/library/skills/export-and-ship/SKILL.md +6 -6
  192. package/library/skills/export-and-ship/resource.yaml +1 -1
  193. package/library/skills/fabricating-assets/SKILL.md +7 -7
  194. package/library/skills/fabricating-assets/resource.yaml +3 -3
  195. package/library/skills/facial-and-lipsync/SKILL.md +14 -15
  196. package/library/skills/facial-and-lipsync/resource.yaml +1 -1
  197. package/library/skills/fps-controller/SKILL.md +33 -41
  198. package/library/skills/fps-controller/resource.yaml +1 -1
  199. package/library/skills/game-feel/SKILL.md +8 -8
  200. package/library/skills/game-feel/resource.yaml +1 -1
  201. package/library/skills/gameskill/SKILL.md +4 -4
  202. package/library/skills/gameskill/resource.yaml +1 -1
  203. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  204. package/library/skills/gdscript-patterns/resource.yaml +1 -1
  205. package/library/skills/generate-motion/SKILL.md +30 -21
  206. package/library/skills/generate-motion/resource.yaml +1 -1
  207. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  208. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
  209. package/library/skills/grow-analytics/SKILL.md +3 -3
  210. package/library/skills/grow-analytics/resource.yaml +1 -1
  211. package/library/skills/headless-scripting/SKILL.md +1 -1
  212. package/library/skills/headless-scripting/resource.yaml +1 -1
  213. package/library/skills/in-game-purchases/SKILL.md +1 -1
  214. package/library/skills/in-game-purchases/resource.yaml +1 -1
  215. package/library/skills/instantiate-asset-pack/SKILL.md +2 -2
  216. package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
  217. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
  218. package/library/skills/make-game/SKILL.md +4 -4
  219. package/library/skills/make-game/references/2d-platformer.md +1 -1
  220. package/library/skills/make-game/references/3d-fps.md +1 -1
  221. package/library/skills/make-game/references/3d-horror.md +1 -1
  222. package/library/skills/make-game/references/3d-third-person.md +2 -2
  223. package/library/skills/make-game/resource.yaml +1 -1
  224. package/library/skills/multiplayer/SKILL.md +1 -1
  225. package/library/skills/multiplayer/resource.yaml +1 -1
  226. package/library/skills/multiplayer-movement/SKILL.md +1 -1
  227. package/library/skills/multiplayer-movement/resource.yaml +1 -1
  228. package/library/skills/multiplayer-project/SKILL.md +1 -1
  229. package/library/skills/multiplayer-project/resource.yaml +1 -1
  230. package/library/skills/multiplayer-publish/SKILL.md +8 -7
  231. package/library/skills/multiplayer-publish/resource.yaml +3 -3
  232. package/library/skills/multiplayer-state/SKILL.md +1 -1
  233. package/library/skills/multiplayer-state/resource.yaml +1 -1
  234. package/library/skills/multiplayer-testing/SKILL.md +1 -1
  235. package/library/skills/multiplayer-testing/resource.yaml +1 -1
  236. package/library/skills/music-track/SKILL.md +22 -13
  237. package/library/skills/music-track/resource.yaml +1 -1
  238. package/library/skills/navigate-summer/SKILL.md +11 -9
  239. package/library/skills/navigate-summer/resource.yaml +1 -1
  240. package/library/skills/new-project/SKILL.md +1 -1
  241. package/library/skills/new-project/resource.yaml +1 -1
  242. package/library/skills/organic-model/SKILL.md +24 -18
  243. package/library/skills/organic-model/resource.yaml +1 -1
  244. package/library/skills/pixel-art/SKILL.md +27 -23
  245. package/library/skills/pixel-art/resource.yaml +1 -1
  246. package/library/skills/play/SKILL.md +1 -1
  247. package/library/skills/play/resource.yaml +1 -1
  248. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  249. package/library/skills/playtesting-a-feature/resource.yaml +1 -1
  250. package/library/skills/procedural-animation/SKILL.md +20 -16
  251. package/library/skills/procedural-animation/resource.yaml +1 -1
  252. package/library/skills/prop-model/SKILL.md +25 -19
  253. package/library/skills/prop-model/resource.yaml +1 -1
  254. package/library/skills/psx-retro-rendering/resource.yaml +1 -0
  255. package/library/skills/publish-your-game/SKILL.md +16 -6
  256. package/library/skills/publish-your-game/resource.yaml +3 -3
  257. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
  258. package/library/skills/release-readiness/SKILL.md +1 -1
  259. package/library/skills/release-readiness/resource.yaml +1 -1
  260. package/library/skills/remote-deploy/SKILL.md +1 -1
  261. package/library/skills/remote-deploy/resource.yaml +1 -1
  262. package/library/skills/retarget/SKILL.md +23 -20
  263. package/library/skills/retarget/resource.yaml +1 -1
  264. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  265. package/library/skills/running-in-the-cloud/resource.yaml +1 -1
  266. package/library/skills/save-load/SKILL.md +1 -1
  267. package/library/skills/save-load/resource.yaml +1 -1
  268. package/library/skills/scene-composition/SKILL.md +1 -1
  269. package/library/skills/scene-composition/resource.yaml +1 -1
  270. package/library/skills/scene-hierarchy-design/SKILL.md +2 -2
  271. package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
  272. package/library/skills/scene-scripting/SKILL.md +66 -636
  273. package/library/skills/scene-scripting/references/ctx-api.md +184 -0
  274. package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
  275. package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
  276. package/library/skills/scene-scripting/resource.yaml +4 -4
  277. package/library/skills/scene-to-level/SKILL.md +2 -2
  278. package/library/skills/scene-to-level/resource.yaml +1 -1
  279. package/library/skills/skill-create/resource.yaml +1 -0
  280. package/library/skills/skill-improve/resource.yaml +1 -0
  281. package/library/skills/skill-test/SKILL.md +2 -2
  282. package/library/skills/skill-test/resource.yaml +1 -0
  283. package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
  284. package/library/skills/skybox-panorama/SKILL.md +27 -21
  285. package/library/skills/skybox-panorama/resource.yaml +1 -1
  286. package/library/skills/sound-effect/SKILL.md +29 -20
  287. package/library/skills/sound-effect/resource.yaml +1 -1
  288. package/library/skills/spatial-placement/SKILL.md +14 -9
  289. package/library/skills/spatial-placement/resource.yaml +1 -1
  290. package/library/skills/sprite-sheet/SKILL.md +32 -27
  291. package/library/skills/sprite-sheet/resource.yaml +1 -1
  292. package/library/skills/store-art/SKILL.md +3 -3
  293. package/library/skills/store-art/resource.yaml +2 -2
  294. package/library/skills/store-listing/SKILL.md +3 -3
  295. package/library/skills/store-listing/resource.yaml +2 -2
  296. package/library/skills/summer-analytics/SKILL.md +7 -5
  297. package/library/skills/summer-analytics/resource.yaml +2 -2
  298. package/library/skills/summer-apps/SKILL.md +48 -32
  299. package/library/skills/summer-apps/manifest.md +1 -1
  300. package/library/skills/summer-apps/minimal-app.md +7 -7
  301. package/library/skills/summer-apps/resource.yaml +1 -1
  302. package/library/skills/summer-apps/sdk-reference.md +5 -5
  303. package/library/skills/summer-apps-design/SKILL.md +1 -1
  304. package/library/skills/summer-apps-design/resource.yaml +1 -1
  305. package/library/skills/summer-assets/SKILL.md +56 -0
  306. package/library/skills/summer-assets/resource.yaml +34 -0
  307. package/library/skills/summer-store/SKILL.md +1 -1
  308. package/library/skills/text-to-motion/SKILL.md +30 -23
  309. package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
  310. package/library/skills/text-to-motion/resource.yaml +1 -1
  311. package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
  312. package/library/skills/tileable-texture/SKILL.md +19 -15
  313. package/library/skills/tileable-texture/resource.yaml +1 -1
  314. package/library/skills/trailer-shot/SKILL.md +28 -24
  315. package/library/skills/trailer-shot/resource.yaml +1 -1
  316. package/library/skills/tune-performance/SKILL.md +6 -6
  317. package/library/skills/tune-performance/resource.yaml +1 -1
  318. package/library/skills/ui-basics/SKILL.md +41 -36
  319. package/library/skills/ui-basics/resource.yaml +1 -1
  320. package/library/skills/ui-graphics/SKILL.md +47 -38
  321. package/library/skills/ui-graphics/resource.yaml +1 -1
  322. package/library/skills/use-widget-asset/SKILL.md +1 -1
  323. package/library/skills/use-widget-asset/resource.yaml +1 -1
  324. package/library/skills/using-summer/SKILL.md +6 -5
  325. package/library/skills/using-summer/resource.yaml +1 -1
  326. package/library/skills/vehicle-model/SKILL.md +65 -57
  327. package/library/skills/vehicle-model/resource.yaml +1 -1
  328. package/library/skills/verification-before-completion/SKILL.md +1 -1
  329. package/library/skills/verification-before-completion/resource.yaml +1 -1
  330. package/library/skills/verifying-scenes/SKILL.md +2 -2
  331. package/library/skills/verifying-scenes/resource.yaml +1 -1
  332. package/library/skills/vfx-dissolve/SKILL.md +2 -2
  333. package/library/skills/vfx-dissolve/resource.yaml +1 -1
  334. package/library/skills/vfx-fire/SKILL.md +15 -41
  335. package/library/skills/vfx-fire/resource.yaml +1 -1
  336. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  337. package/library/skills/vfx-hit-spark/resource.yaml +1 -1
  338. package/library/skills/vfx-lightning/SKILL.md +7 -16
  339. package/library/skills/vfx-lightning/resource.yaml +1 -1
  340. package/library/skills/vfx-magic-glow/SKILL.md +23 -32
  341. package/library/skills/vfx-magic-glow/resource.yaml +1 -1
  342. package/library/skills/vfx-muzzle-flash/SKILL.md +20 -35
  343. package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
  344. package/library/skills/vfx-smoke/SKILL.md +13 -31
  345. package/library/skills/vfx-smoke/resource.yaml +1 -1
  346. package/library/skills/vfx-water-ripple/SKILL.md +12 -31
  347. package/library/skills/vfx-water-ripple/resource.yaml +1 -1
  348. package/library/skills/voice-line/SKILL.md +71 -40
  349. package/library/skills/voice-line/resource.yaml +1 -1
  350. package/library/skills/web-and-touch-input/SKILL.md +1 -1
  351. package/library/skills/web-and-touch-input/resource.yaml +1 -1
  352. package/library/skills/web-compatibility-look/SKILL.md +1 -1
  353. package/library/skills/web-compatibility-look/resource.yaml +1 -1
  354. package/library/skills/world-building-3d/SKILL.md +1 -1
  355. package/library/skills/world-building-3d/resource.yaml +1 -1
  356. package/library/skills/writing-skills/resource.yaml +1 -0
  357. package/library/tools/add-node/GUIDE.md +14 -0
  358. package/library/tools/align-distribute-3d/GUIDE.md +7 -0
  359. package/library/tools/app-call/resource.yaml +1 -1
  360. package/library/tools/app-guide/resource.yaml +2 -2
  361. package/library/tools/app-page/resource.yaml +1 -1
  362. package/library/tools/app-screenshot/resource.yaml +19 -1
  363. package/library/tools/app-tools/resource.yaml +1 -1
  364. package/library/tools/attach-to-surface/GUIDE.md +15 -0
  365. package/library/tools/batch/GUIDE.md +27 -0
  366. package/library/tools/camera-bookmark/GUIDE.md +12 -0
  367. package/library/tools/capture-gameplay/GUIDE.md +3 -0
  368. package/library/tools/capture-gameplay/resource.yaml +3 -3
  369. package/library/tools/check-job/resource.yaml +1 -1
  370. package/library/tools/clear-console/GUIDE.md +3 -0
  371. package/library/tools/connect-ports/GUIDE.md +9 -0
  372. package/library/tools/connect-signal/GUIDE.md +14 -0
  373. package/library/tools/create-debug-report/GUIDE.md +10 -0
  374. package/library/tools/create-scene/GUIDE.md +10 -0
  375. package/library/tools/debug-views/GUIDE.md +7 -0
  376. package/library/tools/enable-plugin/GUIDE.md +3 -0
  377. package/library/tools/export-game/GUIDE.md +3 -0
  378. package/library/tools/export-game/resource.yaml +3 -3
  379. package/library/tools/export-templates/GUIDE.md +3 -0
  380. package/library/tools/fabricate-3d/GUIDE.md +19 -0
  381. package/library/tools/frame-nodes/GUIDE.md +9 -0
  382. package/library/tools/frame-shot/GUIDE.md +9 -0
  383. package/library/tools/game-control/GUIDE.md +9 -0
  384. package/library/tools/game-input/GUIDE.md +9 -0
  385. package/library/tools/game-probe/GUIDE.md +9 -0
  386. package/library/tools/generate-3d/resource.yaml +3 -3
  387. package/library/tools/generate-motion/resource.yaml +2 -2
  388. package/library/tools/get-console/GUIDE.md +9 -0
  389. package/library/tools/get-console/resource.yaml +5 -0
  390. package/library/tools/get-debugger-errors/GUIDE.md +7 -0
  391. package/library/tools/get-debugger-errors/resource.yaml +5 -0
  392. package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
  393. package/library/tools/get-debugger-warnings/resource.yaml +5 -0
  394. package/library/tools/get-diagnostics/GUIDE.md +13 -0
  395. package/library/tools/get-project-context/GUIDE.md +25 -0
  396. package/library/tools/get-runtime-tree/GUIDE.md +7 -0
  397. package/library/tools/get-runtime-tree/resource.yaml +5 -0
  398. package/library/tools/get-scene-tree/GUIDE.md +11 -0
  399. package/library/tools/get-scene-tree/resource.yaml +5 -0
  400. package/library/tools/get-script-errors/GUIDE.md +5 -0
  401. package/library/tools/grep/GUIDE.md +11 -0
  402. package/library/tools/import-asset/GUIDE.md +8 -0
  403. package/library/tools/import-asset-by-id/GUIDE.md +12 -0
  404. package/library/tools/import-from-url/GUIDE.md +10 -0
  405. package/library/tools/import-from-url-batch/GUIDE.md +3 -0
  406. package/library/tools/import-hdri/GUIDE.md +16 -0
  407. package/library/tools/input-map-bind/GUIDE.md +11 -0
  408. package/library/tools/inspect-asset/GUIDE.md +14 -0
  409. package/library/tools/inspect-asset/resource.yaml +5 -0
  410. package/library/tools/inspect-node/GUIDE.md +11 -0
  411. package/library/tools/inspect-node/resource.yaml +5 -0
  412. package/library/tools/inspect-resource/GUIDE.md +7 -0
  413. package/library/tools/inspect-resource/resource.yaml +5 -0
  414. package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
  415. package/library/tools/inspect-runtime-node/resource.yaml +5 -0
  416. package/library/tools/instantiate-scene/GUIDE.md +12 -0
  417. package/library/tools/is-running/GUIDE.md +3 -0
  418. package/library/tools/measure/GUIDE.md +8 -0
  419. package/library/tools/navigation-probe/GUIDE.md +9 -0
  420. package/library/tools/open/resource.yaml +2 -2
  421. package/library/tools/open-main-scene/GUIDE.md +6 -0
  422. package/library/tools/open-scene/GUIDE.md +8 -0
  423. package/library/tools/place-adjacent/GUIDE.md +7 -0
  424. package/library/tools/play/GUIDE.md +13 -0
  425. package/library/tools/project-setting/GUIDE.md +9 -0
  426. package/library/tools/publish-build/resource.yaml +6 -6
  427. package/library/tools/raycast/GUIDE.md +7 -0
  428. package/library/tools/read-file/GUIDE.md +10 -0
  429. package/library/tools/read-library/resource.yaml +5 -0
  430. package/library/tools/recent-events/GUIDE.md +7 -0
  431. package/library/tools/remove-node/GUIDE.md +3 -0
  432. package/library/tools/repeat-along/GUIDE.md +5 -0
  433. package/library/tools/replace-node/GUIDE.md +9 -0
  434. package/library/tools/replace-text/GUIDE.md +5 -0
  435. package/library/tools/run-editor-script/GUIDE.md +16 -0
  436. package/library/tools/run-script/GUIDE.md +30 -0
  437. package/library/tools/run-script/resource.yaml +6 -3
  438. package/library/tools/runtime-animate/GUIDE.md +7 -0
  439. package/library/tools/runtime-call/GUIDE.md +7 -0
  440. package/library/tools/runtime-set/GUIDE.md +9 -0
  441. package/library/tools/runtime-spawn/GUIDE.md +9 -0
  442. package/library/tools/save-scene/GUIDE.md +3 -0
  443. package/library/tools/scene-audit/GUIDE.md +29 -0
  444. package/library/tools/screenshot/GUIDE.md +17 -0
  445. package/library/tools/select-node/GUIDE.md +3 -0
  446. package/library/tools/set-prop/GUIDE.md +23 -0
  447. package/library/tools/set-resource-property/GUIDE.md +8 -0
  448. package/library/tools/shot-sheet/GUIDE.md +7 -0
  449. package/library/tools/snap-to-surface/GUIDE.md +17 -0
  450. package/library/tools/snapshot-diff/GUIDE.md +7 -0
  451. package/library/tools/starcast/GUIDE.md +12 -0
  452. package/library/tools/stop/GUIDE.md +3 -0
  453. package/library/tools/test-placement/GUIDE.md +7 -0
  454. package/library/tools/ui-actions/GUIDE.md +12 -0
  455. package/library/tools/ui-activate/GUIDE.md +11 -0
  456. package/library/tools/ui-screenshot/GUIDE.md +9 -0
  457. package/library/tools/ui-tree/GUIDE.md +10 -0
  458. package/library/tools/wait-for-event/GUIDE.md +11 -0
  459. package/library/tools/world-snapshot/GUIDE.md +9 -0
  460. package/library/tools/write-file/GUIDE.md +5 -0
  461. package/library/tools/zoom/GUIDE.md +5 -0
  462. package/package.json +6 -4
  463. package/registry/generated/counts.json +2 -2
  464. package/registry/generated/gemini-extension.json +4 -12
  465. package/registry/generated/index.json +433 -339
  466. package/registry/generated/marketplace.claude.json +2 -13
  467. package/registry/generated/plugin.claude.json +23 -22
  468. package/registry/generated/plugin.codex.json +4 -12
  469. package/registry/generated/plugin.cursor.json +4 -12
  470. package/registry/generated/plugin.factory.json +4 -12
  471. package/registry/generated/server.json +34 -0
  472. package/registry/generated/skills-index.md +119 -117
  473. package/registry/generated/skills-registry.json +153 -115
  474. package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
  475. package/registry/operations/fixtures/invalid-name.json +60 -0
  476. package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
  477. package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
  478. package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
  479. package/registry/operations/fixtures/valid-player-facing.json +82 -0
  480. package/registry/operations/fixtures/valid-read.json +60 -0
  481. package/registry/operations/fixtures/valid-spend.json +43 -0
  482. package/registry/operations/legacy-names.json +1206 -0
  483. package/registry/schemas/operation.schema.json +318 -0
  484. package/registry/schemas/skill.schema.json +4 -0
  485. package/CLAUDE.md +0 -7
@@ -0,0 +1,280 @@
1
+ # scene-scripting: 3D recipes
2
+
3
+ Every recipe below is the `source` of one call: `summer_run_script(scenePath="res://<the scene>.tscn", source=<the recipe>)`. Name the scene every time; it is opened first when it is not the edited one, and the person's tab comes back after the run. The core helpers (`add_node`, `find`, `add_mesh`, `make_material`, `save_scene` ...) are in the `scene-scripting` skill itself.
4
+
5
+ ## Scatter N instances with randomized transforms
6
+
7
+ ```gdscript
8
+ func run(ctx):
9
+ var root = ctx.get_scene_root()
10
+ var rng := RandomNumberGenerator.new()
11
+ rng.seed = 12345 # deterministic re-runs
12
+ var source: PackedScene = load("res://props/tree.tscn")
13
+ for i in range(40):
14
+ var tree := source.instantiate()
15
+ root.add_child(tree)
16
+ ctx.set_owner_recursive(tree) # owns the whole instanced subtree
17
+ tree.position = Vector3(rng.randf_range(-20, 20), 0, rng.randf_range(-20, 20))
18
+ tree.rotation.y = rng.randf_range(0, TAU)
19
+ var s := rng.randf_range(0.8, 1.3)
20
+ tree.scale = Vector3(s, s, s)
21
+ ctx.report("scattered", 40)
22
+ ```
23
+
24
+ ## Procedural mesh via SurfaceTool
25
+
26
+ ```gdscript
27
+ func run(ctx):
28
+ var root = ctx.get_scene_root()
29
+ var st := SurfaceTool.new()
30
+ st.begin(Mesh.PRIMITIVE_TRIANGLES)
31
+ st.set_normal(Vector3.UP)
32
+ st.add_vertex(Vector3(0, 0, 0))
33
+ st.add_vertex(Vector3(1, 0, 0))
34
+ st.add_vertex(Vector3(0, 0, 1))
35
+ var mesh := st.commit() # ArrayMesh
36
+ var mi := MeshInstance3D.new()
37
+ mi.mesh = mesh
38
+ mi.name = "GeneratedMesh"
39
+ root.add_child(mi)
40
+ ctx.set_owner_recursive(mi)
41
+ ctx.report("surfaces", mesh.get_surface_count())
42
+ ```
43
+
44
+ For grids/heightfields, build `PackedVector3Array`s and feed `ArrayMesh.add_surface_from_arrays` directly. Call `st.generate_normals()` before `commit()` when you did not set normals by hand.
45
+
46
+ ## CSG primitives (fast blockouts)
47
+
48
+ ```gdscript
49
+ func run(ctx):
50
+ var root = ctx.get_scene_root()
51
+ var body := CSGCombiner3D.new()
52
+ body.name = "Blockout"
53
+ root.add_child(body)
54
+ var box := CSGBox3D.new()
55
+ box.size = Vector3(6, 3, 6)
56
+ body.add_child(box)
57
+ var hole := CSGCylinder3D.new()
58
+ hole.operation = CSGShape3D.OPERATION_SUBTRACTION
59
+ hole.radius = 1.0
60
+ hole.height = 7.0
61
+ body.add_child(hole)
62
+ ctx.set_owner_recursive(body) # owner is the SCENE root, not the parent
63
+ ```
64
+
65
+ Live CSG nodes are the **older-engine fallback** — they re-evaluate every frame and should be converted before shipping (`scene-composition`). On a geometry-tier engine prefer `ctx.boolean(...)`, which bakes to a plain ArrayMesh and leaves no CSG nodes behind.
66
+
67
+ ## Boolean blockout — carve a doorway (geometry tier)
68
+
69
+ Box minus box, baked. The inputs are consumed; only the result remains.
70
+
71
+ ```gdscript
72
+ func run(ctx):
73
+ var wall = ctx.add_mesh("box", "Wall", null, {"size": Vector3(6, 3, 0.3)})
74
+ var hole = ctx.add_mesh("box", "DoorHole", null, {"size": Vector3(1.0, 2.1, 0.5)})
75
+ hole.position = Vector3(0, -0.45, 0) # sink the opening to floor level
76
+ var carved = ctx.boolean(wall, hole, "difference")
77
+ if carved == null:
78
+ return # reports carry the reason — read them
79
+ carved.name = "WallWithDoorway"
80
+ ctx.uv_box(carved) # boolean output needs UVs to take a texture
81
+ ctx.report("doorway", str(carved.get_path()))
82
+ ```
83
+
84
+ Then `summer_snapshot_diff` must show `Wall` and `DoorHole` GONE and `WallWithDoorway` added — leftover inputs mean the boolean failed and returned null. Screenshot to check the opening is where you meant.
85
+
86
+ ## Lathe a goblet / pillar (geometry tier)
87
+
88
+ `lathe` revolves a 2D profile (x = radius, y = height) around Y. Design the profile from the axis outward.
89
+
90
+ ```gdscript
91
+ func run(ctx):
92
+ var profile := PackedVector2Array([
93
+ Vector2(0.0, 0.0), Vector2(0.45, 0.0), # foot
94
+ Vector2(0.08, 0.1), Vector2(0.08, 0.55), # stem
95
+ Vector2(0.35, 0.7), Vector2(0.4, 1.1), # bowl
96
+ Vector2(0.0, 1.15),
97
+ ])
98
+ var goblet = ctx.lathe(profile, "Goblet", null, 360.0, 48)
99
+ ctx.set_smooth(goblet, 40.0) # lathes look faceted without it
100
+ ctx.apply_material(goblet, ctx.make_material({"albedo_color": Color(0.85, 0.7, 0.2), "metallic": 0.8, "roughness": 0.25}))
101
+ ```
102
+
103
+ A square-ish profile with `sides: 8` and `spin_degrees: 360` makes a chamfered pillar; `spin_degrees: 180` makes an apse/half-dome.
104
+
105
+ ## Sweep a rail / pipe (geometry tier)
106
+
107
+ `sweep` extrudes a 2D cross-section along a 3D polyline.
108
+
109
+ ```gdscript
110
+ func run(ctx):
111
+ var section := PackedVector2Array([ # small circle-ish octagon, the pipe wall
112
+ Vector2(0.05, 0), Vector2(0.035, 0.035), Vector2(0, 0.05), Vector2(-0.035, 0.035),
113
+ Vector2(-0.05, 0), Vector2(-0.035, -0.035), Vector2(0, -0.05), Vector2(0.035, -0.035),
114
+ ])
115
+ var path := PackedVector3Array([
116
+ Vector3(0, 1, 0), Vector3(4, 1, 0), Vector3(6, 1, 2), Vector3(6, 3, 6),
117
+ ])
118
+ var pipe = ctx.sweep(section, path, "SteamPipe")
119
+ ctx.set_smooth(pipe, 45.0)
120
+ ```
121
+
122
+ Rails, roads, cables, gutters — same recipe, different cross-section. Keep path points a reasonable distance apart; hairpin corners self-intersect.
123
+
124
+ ## Terrain with collision (geometry tier)
125
+
126
+ ```gdscript
127
+ func run(ctx):
128
+ var ground = ctx.terrain(Vector2(64, 64), 6.0, 1337, "Terrain")
129
+ ctx.apply_material(ground, ctx.make_material({"albedo_color": Color(0.35, 0.5, 0.25), "roughness": 1.0}))
130
+ ctx.report("terrain", ctx.summary())
131
+ ```
132
+
133
+ Collision arrives automatically (a `StaticBody3D` + `HeightMapShape3D` child), already owned. Same seed → same terrain, so re-runs are deterministic. Pass `image_path` to drive heights from a grayscale heightmap instead of noise. Verify with `summer_screenshot framing:"camera"` — terrain reads wrong from preset framings' top-down angles.
134
+
135
+ ## Text signage (geometry tier)
136
+
137
+ `add_mesh` accepts `torus` and `text` on geometry-tier engines:
138
+
139
+ ```gdscript
140
+ func run(ctx):
141
+ var sign = ctx.add_mesh("text", "ExitSign", null, {"text": "EXIT", "depth": 0.08})
142
+ sign.position = Vector3(0, 2.6, -4)
143
+ ctx.apply_material(sign, ctx.make_material({"albedo_color": Color(1, 0.2, 0.2), "emission_enabled": true, "emission": Color(1, 0.1, 0.1), "emission_energy_multiplier": 3.0}))
144
+ ```
145
+
146
+ Emissive text only proves itself in a `framing:"camera"` screenshot — preset framings substitute the environment and mute emission.
147
+
148
+ ## Decimate for LOD, convex collision for props (geometry tier)
149
+
150
+ Dense generated/imported meshes (Meshy-class output) want both before they ship:
151
+
152
+ ```gdscript
153
+ func run(ctx):
154
+ var prop = ctx.find("AncientStatue") # e.g. a generated import
155
+ if prop == null:
156
+ ctx.report("error", "AncientStatue not found")
157
+ return
158
+ ctx.decimate(prop, 0.35) # keep ~35% of the triangles
159
+ var body = ctx.convex_collision(prop, true) # V-HACD multi-shape for concave props
160
+ ctx.report("collision_body", str(body.get_path()))
161
+ ```
162
+
163
+ `decimate` returns `false` (with a report entry) instead of ruining the mesh when the ratio is out of range. `convex_collision` owns every body it creates — the diff after `save_scene` is your receipt that nothing was silently dropped. Simple convex props (crates, rocks): leave `decompose` false, one hull is cheaper.
164
+
165
+ ## Mirror symmetry (geometry tier)
166
+
167
+ ```gdscript
168
+ func run(ctx):
169
+ var left_tower = ctx.find("Tower")
170
+ var right_tower = ctx.mirror(left_tower, "x") # mirrored duplicate, owned
171
+ right_tower.name = "TowerMirrored"
172
+ ```
173
+
174
+ The mirror is a real duplicate with flipped winding/normals — edit either side independently afterward.
175
+
176
+ ## Animate — camera flythrough and a door-open (geometry tier)
177
+
178
+ `animate` collapses the AnimationPlayer/library/track boilerplate into one call per property. Multiple calls with the same `anim_name` append tracks to the same clip.
179
+
180
+ ```gdscript
181
+ func run(ctx):
182
+ var cam = ctx.add_camera(Vector3(0, 4, 12), Vector3.ZERO, true)
183
+ ctx.animate(cam, "position", [
184
+ [0.0, Vector3(0, 4, 12)],
185
+ [4.0, Vector3(8, 5, 4)],
186
+ [8.0, Vector3(0, 6, -10)],
187
+ ], "flythrough")
188
+ ctx.animate(cam, "rotation_degrees", [
189
+ [0.0, Vector3(-10, 0, 0)],
190
+ [4.0, Vector3(-12, 60, 0)],
191
+ [8.0, Vector3(-15, 175, 0)],
192
+ ], "flythrough") # same clip — second track appended
193
+
194
+ var door = ctx.find("Door")
195
+ ctx.animate(door, "rotation_degrees", [
196
+ [0.0, Vector3(0, 0, 0)],
197
+ [0.8, Vector3(0, 110, 0)],
198
+ ], "open")
199
+ ```
200
+
201
+ Pass plain `position` / `rotation_degrees` values — the helper picks the right track type and handles the quaternion conversion for rotation. Verify by playing: `summer_play`, trigger the clip (or set autoplay), `summer_screenshot target:"game"`, `summer_stop`.
202
+
203
+ ## make_shader — dissolve / glow FX with the compile-error loop (geometry tier)
204
+
205
+ `make_shader` is the safe lane for text shaders because compile errors come back **verbatim** in the result (the `make_shader_errors` report entry, with the line number) instead of failing silently to a magenta material:
206
+
207
+ ```gdscript
208
+ func run(ctx):
209
+ var mat = ctx.make_shader("""
210
+ shader_type spatial;
211
+ uniform float threshold : hint_range(0.0, 1.0) = 0.3;
212
+ uniform vec4 edge_color : source_color = vec4(1.0, 0.55, 0.1, 1.0);
213
+ void fragment() {
214
+ float n = fract(sin(dot(UV * 12.0, vec2(12.9898, 78.233))) * 43758.5453);
215
+ if (n < threshold) { discard; }
216
+ ALBEDO = vec3(0.8);
217
+ EMISSION = edge_color.rgb * smoothstep(threshold + 0.08, threshold, n) * 4.0;
218
+ }
219
+ """, {"threshold": 0.35})
220
+ ctx.apply_material(ctx.find("Crystal"), mat)
221
+ ```
222
+
223
+ The loop when it fails: read the exact compile error (line number included) from the `make_shader_errors` report entry → fix that line → re-run. Do not guess-and-mutate; the error text names the line and identifier. For production-grade dissolve/fire/glow (FBM noise include, controllers, cookbook variants) use the `vfx-<effect>` recipes — `make_shader` is the fast lane for one-off FX and for iterating on a shader before writing it to a file.
224
+
225
+ ## GridMap fills
226
+
227
+ ```gdscript
228
+ func run(ctx):
229
+ var root = ctx.get_scene_root()
230
+ var grid: GridMap = root.get_node("GridMap") # needs mesh_library assigned
231
+ for x in range(16):
232
+ for z in range(16):
233
+ grid.set_cell_item(Vector3i(x, 0, z), 0) # item = MeshLibrary index
234
+ ctx.report("cells", 256)
235
+ ```
236
+
237
+ Cells serialize into packed data — scripting is the ONLY sane way to fill them; never hand-edit `tile_map_data`-style fields as text.
238
+
239
+ ## 3-point lighting rig
240
+
241
+ ```gdscript
242
+ func run(ctx):
243
+ var root = ctx.get_scene_root()
244
+ var rig := Node3D.new()
245
+ rig.name = "LightRig"
246
+ root.add_child(rig)
247
+
248
+ var key := DirectionalLight3D.new()
249
+ key.name = "KeyLight"
250
+ key.light_energy = 1.2
251
+ key.shadow_enabled = true
252
+ key.rotation_degrees = Vector3(-45, -30, 0)
253
+
254
+ var fill := OmniLight3D.new()
255
+ fill.name = "FillLight"
256
+ fill.light_energy = 0.4
257
+ fill.position = Vector3(-4, 2, 4)
258
+
259
+ var rim := SpotLight3D.new()
260
+ rim.name = "RimLight"
261
+ rim.light_energy = 0.8
262
+ rim.position = Vector3(0, 3, -5)
263
+ rim.rotation_degrees = Vector3(-20, 180, 0)
264
+
265
+ for light in [key, fill, rim]:
266
+ rig.add_child(light)
267
+ ctx.set_owner_recursive(rig)
268
+ ```
269
+
270
+ Then `summer_screenshot` — lighting is exactly the kind of change you cannot judge without pixels.
271
+
272
+ ## Pitfalls
273
+
274
+ | Pitfall | Reality |
275
+ |---|---|
276
+ | Hand-building CSG node trees on a geometry-tier engine | `ctx.boolean/lathe/sweep/extrude_polygon` bake clean ArrayMeshes with no live CSG left behind. |
277
+ | Re-running a failed `make_shader` with a guessed fix | The compile error is in the `make_shader_errors` report verbatim, with the line. Read it, fix that line. |
278
+ | Hand-writing AnimationPlayer/library/track plumbing | `ctx.animate` is one call per property and dodges the quaternion trap. |
279
+ | Heavy batch loop in `summer_run_script` | It blocks the live editor. Move project-wide work to `summer_run_editor_script`. |
280
+
@@ -1,7 +1,7 @@
1
1
  id: skill/scene-scripting
2
2
  kind: skill
3
- version: 1.1.1
4
- summary: One GDScript in the live editor (summer_run_script) builds scenes, 2D levels, HUDs and gameplay wiring instead of CRUD chains; verify with diff + screenshot.
3
+ version: 1.2.0
4
+ summary: "Build scenes, levels, HUDs and wiring with one editor GDScript (summer_run_script) instead of call chains."
5
5
  use_when:
6
6
  - a scene change needs 3+ related ops or any computed placement — scattering, grids, rings, procedural meshes, geometry helpers, terrain, lighting rigs, keyframe animation, shader FX
7
7
  - a 2D level (tilemap paint, bodies, camera limits, parallax), an animated sprite, a HUD or Control tree, a persisted signal connection, an attached script, a prefab, input actions, an autoload, or the main scene should be built in one script
@@ -11,7 +11,7 @@ do_not_use_when:
11
11
  - a single property tweak — summer_set_prop is cheaper
12
12
  - one signal, one input binding, or one project setting — summer_connect_signal, summer_input_map_bind, summer_project_setting are one call each and ship today
13
13
  - "the engine build lacks RunSceneScript (Summer Engine 0.5.66 or newer; older engines return engine_lacks_op) — RunEditorScript and RunVerification DO ship today, so fall back to summer_run_editor_script or the scene tools"
14
- - "the 2D/UI/gameplay-code ctx helpers (Summer Engine 0.5.66 or newer) are missing on the engine — the skill's fallback table names what works everywhere"
14
+ - "the 2D/UI/gameplay-code ctx helpers (Summer Engine 0.5.66 or newer) are missing on the engine — the fallback table in its references/ctx-api.md names what works everywhere"
15
15
  facets:
16
16
  lifecycle:
17
17
  - build
@@ -52,7 +52,7 @@ related:
52
52
  - template/2d-platformer
53
53
  source: official
54
54
  license: MIT
55
- status: preview
55
+ status: stable
56
56
  recommended: true
57
57
  aliases:
58
58
  - skills/workflow/scene-scripting
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: scene-to-level
3
- description: "Go from a scene reference image or concept art to a playable scene — orchestrates concept, asset pack, terrain, composition, and scene assembly."
3
+ description: "Turn a reference image or concept art into a playable scene: concept, asset pack, terrain, assembly."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: level-design
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Glob Write Edit summer_create_scene summer_open_scene summer_add_node summer_set_prop summer_set_resource_property summer_save_scene summer_get_scene_tree summer_inspect_node summer_search_assets summer_import_from_url
8
+ allowed-tools: Read Grep Glob Write Edit summer_create_scene summer_open_scene summer_add_node summer_set_prop summer_set_resource_property summer_save_scene summer_get_scene_tree summer_inspect_node summer_assets_search summer_import_from_url summer_call
9
9
  paths: ["**/*.tscn", "**/*.gd", "assets/**", ".summer/**", "levels/**"]
10
10
  ---
11
11
 
@@ -1,7 +1,7 @@
1
1
  id: skill/scene-to-level
2
2
  kind: skill
3
3
  version: 1.0.3
4
- summary: Go from a scene reference image or concept art to a playable scene — orchestrates concept, asset pack, terrain, composition, and scene assembly.
4
+ summary: "Turn a reference image or concept art into a playable scene: concept, asset pack, terrain, assembly."
5
5
  use_when:
6
6
  - going from a scene reference image or concept art to a playable Summer Engine scene populated with the right assets and terrain
7
7
  - the user shares concept art or a reference screenshot and wants that location built as a playable scene
@@ -21,5 +21,6 @@ related:
21
21
  source: official
22
22
  license: MIT
23
23
  status: stable
24
+ bundled: false
24
25
  aliases:
25
26
  - skills/workflow/skill-create
@@ -21,5 +21,6 @@ related:
21
21
  source: official
22
22
  license: MIT
23
23
  status: stable
24
+ bundled: false
24
25
  aliases:
25
26
  - skills/workflow/skill-improve
@@ -23,7 +23,7 @@ For a single skill at `library/skills/<slug>/`, run these checks:
23
23
  4. **Collaborative protocol.** If the skill triggers user-visible writes, body must contain at least one of: `May I`, `I'm about to`, `Continue?`, `OK?`, `Proceed?`. Skills that only inspect/read are exempt.
24
24
  5. **Template-id resolved.** If the skill's frontmatter declares `template-id: <id>`, that id must exist in the template registry: `library/templates/<id>/resource.yaml` (see `library/templates/README.md`).
25
25
  6. **Behavioral spec.** If the skill has a spec (`evals/skills/specs/<slug>.md` or `tests/spec.md` in the skill folder), it has at least one `## Case` heading. A missing spec is a WARN, not a FAIL.
26
- 7. **Relative links resolve.** Every `](../references/...)`, `](../../references/...)`, `](./references/...)`, and `](./examples/...)` link must point at an existing file (FAIL if broken). Links to other skills should use the bare slug (`design-mechanic`), not a path.
26
+ 7. **Links stay inside the skill folder.** Every relative link (`](./references/...)`, `](./examples/...)`) must point at an existing file in the skill's own folder (FAIL if broken). `summer setup` copies each skill folder alone, so a path that climbs out of it (`../`) breaks after install: name a shared reference by its library id (`summer_docs_read` id `reference/<slug>`) and another skill by its bare slug (`design-mechanic`).
27
27
 
28
28
  Output:
29
29
 
@@ -80,7 +80,7 @@ This skill is **read-only**. It never writes. No "May I" needed.
80
80
 
81
81
  ## See also
82
82
 
83
- - `../../references/collaborative-protocol/collaborative-protocol.md`
83
+ - `summer_docs_read` id `reference/collaborative-protocol`
84
84
  - the template registry: `library/templates/<id>/resource.yaml` (see `library/templates/README.md`)
85
85
  - `tests/runner.md`
86
86
  - `evals/skills/specs/` — per-skill behavioral specs
@@ -22,5 +22,6 @@ related:
22
22
  source: official
23
23
  license: MIT
24
24
  status: stable
25
+ bundled: false
25
26
  aliases:
26
27
  - skills/workflow/skill-test
@@ -32,6 +32,7 @@ source: official
32
32
  license: MIT
33
33
  status: preview
34
34
  recommended: false
35
+ bundled: false
35
36
  lint_exceptions:
36
37
  - url-allowlist
37
38
  - credential-pattern
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: skybox-panorama
3
- description: "Generate a 360-degree equirectangular sky panorama and wire it as a PanoramaSkyMaterial Sky resource on WorldEnvironment in a 3D scene."
3
+ description: "Generate a 360-degree sky panorama and wire it as a PanoramaSkyMaterial Sky resource on WorldEnvironment."
4
4
  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 summer_write_file summer_add_node summer_set_prop summer_save_scene summer_inspect_node
8
+ allowed-tools: Read Grep Glob Write Edit summer_assets_generate_image summer_assets_search summer_import_from_url summer_set_resource_property summer_write_file summer_add_node summer_set_prop summer_save_scene summer_inspect_node summer_call
9
9
  paths: ["assets/**", "art/sky/**", "environments/**"]
10
10
  ---
11
11
 
@@ -38,7 +38,7 @@ The most common failure is **non-equirectangular output**. Image models default
38
38
  ### 1. Search for an existing sky
39
39
 
40
40
  ```
41
- summer_search_assets(query="<vibe> sky panorama", assetType="2d_image", source="all")
41
+ assets.search({ query: "<vibe> sky panorama", assetType: "2d_image", scope: "all" })
42
42
  ```
43
43
 
44
44
  Polyhaven (`polyhaven.com/hdris`) hosts hundreds of free CC0 HDRIs. They look more realistic than generated skies and carry real HDR lighting data. Prefer Polyhaven for realistic exteriors; generate for stylized, fantasy or sci-fi skies.
@@ -60,23 +60,24 @@ Load-bearing phrases:
60
60
 
61
61
  ### 3. Generate, then fix the aspect yourself
62
62
 
63
- Equirectangular MUST be 2:1 (width = 2× height). **`summer_generate_image` cannot give you that.** The tool takes only `prompt`, `model`, `style`, `referenceImageUrl`, `removeBackground` and `options`; there is no aspect or size argument, so every MCP image comes back at the server's 1:1 default. `aspectRatio` and `image_size` inside `options` are not recognized and are dropped without an error; the underlying provider does support 2:1-class aspect ratios, but nothing on this surface lets you request one.
63
+ Equirectangular MUST be 2:1 (width = 2× height). **`assets.generate_image` has no 2:1 `aspectRatio`**: the closest are `16:9` and `21:9`. Generate at `16:9`. For a larger sky, leave `model` out and add `width: 2048, height: 1152`: a model that reaches that size is picked.
64
64
 
65
65
  ```
66
- summer_generate_image(
67
- prompt="dramatic fantasy sky, golden hour, large purple-orange clouds, distant mountains silhouetted at very bottom, soft god-rays, 360 degree panoramic equirectangular projection, wide 2:1 panoramic framing, seamless horizontal wrap, no visible seam, no foreground objects, sky only. No vertical seam, no ground objects, no horizon-level detail, not distorted or warped, no characters, no buildings.",
68
- model="nano-banana-2",
69
- style="realistic"
70
- )
66
+ assets.generate_image({
67
+ prompt: "dramatic fantasy sky, golden hour, large purple-orange clouds, distant mountains silhouetted at very bottom, soft god-rays, 360 degree panoramic equirectangular projection, wide panoramic framing, seamless horizontal wrap, no visible seam, no foreground objects, sky only. No vertical seam, no ground objects, no horizon-level detail, not distorted or warped, no characters, no buildings.",
68
+ model: "nano-banana-2",
69
+ style: "realistic",
70
+ aspectRatio: "16:9"
71
+ })
71
72
  ```
72
73
 
73
- Asking for "2:1 panoramic framing" in the prompt biases the composition; it does not change the returned pixel dimensions. So one of these has to happen before the image is usable as a panorama:
74
+ The result reports its real `width` and `height`. Then one of these has to happen before the image is usable as a panorama:
74
75
 
75
- - **Generate in the Summer dashboard instead**, which does expose aspect ratio, and bring the 2:1 result back with `summer_import_from_url`. This is the right path when the sky matters.
76
- - **Or crop the 1:1 result to 2:1** in any image editor before importing. You lose the top and bottom, which is usually acceptable for sky-only content — the zenith and nadir are the least informative regions — but it will clip a sun placed high in frame.
76
+ - **Crop the 16:9 result to 2:1** by trimming the top and bottom (about 11% of the height) before importing. The width stays whole, so the horizontal wrap the prompt asked for survives; the zenith and nadir are the least informative regions of a sky anyway.
77
+ - **Or generate in the Summer dashboard**, which offers 2:1, and bring the result back with `summer_import_from_url`.
77
78
  - **Or use a Polyhaven HDRI**, already 2:1 and better for realistic exteriors.
78
79
 
79
- Do not import a 1:1 image as a `PanoramaSkyMaterial` panorama and call it done — it wraps with obvious horizontal compression.
80
+ Do not import a 16:9 or 1:1 image as a `PanoramaSkyMaterial` panorama and call it done — it wraps with obvious horizontal compression. Never crop the sides: that breaks the seamless wrap.
80
81
 
81
82
  ### 4. Verify the seam and projection
82
83
 
@@ -154,7 +155,7 @@ Then `summer_play` and look around. Sun in the right place? Seam invisible? Top/
154
155
  ## Anti-patterns
155
156
 
156
157
  - **Including foreground or horizon.** Mountains, trees, buildings at horizon level warp weirdly when sphere-mapped (the "swimming horizon" effect). Skies show ONLY sky. If the level needs distant mountains, model them as low-poly meshes in the scene, not in the sky texture.
157
- - **Assuming `options.aspectRatio` gave you 2:1.** It is silently ignored — the call succeeds and hands you a square image. A 1:1 or 16:9 panorama wrapped equirectangular has obvious horizontal compression. Crop it, or generate in the dashboard where the control exists.
158
+ - **Assuming the image is 2:1.** `aspectRatio` has no 2:1 value; read the returned `width` and `height`. A 1:1 or 16:9 panorama wrapped equirectangular has obvious horizontal compression. Crop the top and bottom, or generate in the dashboard where 2:1 exists.
158
159
  - **Tight features at zenith/nadir.** Anything in the top or bottom 10% of the image gets pinched. Bias toward soft, diffuse features there.
159
160
  - **Expecting HDR / IBL quality.** AI panoramas are 8-bit. If the user needs realistic environment lighting from the sky, point them at Polyhaven HDRIs (CC0). AI is for visual sky, not for lighting.
160
161
  - **Forgetting `Repeat: Disabled` on import.** Panoramas wrap once via the material; if `Repeat` is on, you can get duplicate-tile artifacts at the seam.
@@ -167,19 +168,24 @@ Then `summer_play` and look around. Sun in the right place? Seam invisible? Top/
167
168
  - **Indoor scene.** Skyboxes are wasted indoors — use `BG_COLOR` or a flat black background. Don't generate a sky for a windowless dungeon.
168
169
  - **Visible vertical seam after generation.** Fix in Photoshop/GIMP: `Filter → Other → Offset` by 50% horizontally → the seam moves to the center → heal with content-aware fill or clone stamp → offset back to 0. Or regenerate with seed bump and `seamless horizontal wrap, no visible seam at left and right edges` repeated twice in the prompt.
169
170
 
171
+ ## Without Summer Engine
172
+
173
+ In a session without Summer Engine tools (the assets profile; the `summer-assets` skill has the whole loop), do steps 1-4 and skip steps 5-7 (import, `WorldEnvironment`, scene check). Pass `out` with the person's folder so the image lands there (the `summer-assets` skill says how). Tell them it is a 2:1 equirectangular panorama, the shape most engines take for a sky.
174
+
170
175
  ## Fallback (no MCP)
171
176
 
172
177
  Print the call:
173
178
 
174
179
  ```
175
- summer_generate_image(
176
- prompt="<sky> 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no foreground objects, sky only",
177
- model="nano-banana-2",
178
- style="realistic"
179
- )
180
+ assets.generate_image({
181
+ prompt: "<sky> 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no foreground objects, sky only",
182
+ model: "nano-banana-2",
183
+ style: "realistic",
184
+ aspectRatio: "16:9"
185
+ })
180
186
  ```
181
187
 
182
- The dashboard is the better surface for this skill: it exposes aspect ratio and a real negative prompt, which MCP does not. Tell the user to set 2:1 and a negative of `vertical seam, foreground, distorted, warped, characters, buildings`, then `summer_import_from_url` to `res://art/sky/<name>.png`, set `Repeat: Disabled`, and wire the WorldEnvironment.
188
+ The dashboard is the better surface for this skill: it offers 2:1 and a real negative prompt, which the asset operations do not. Tell the user to set 2:1 and a negative of `vertical seam, foreground, distorted, warped, characters, buildings`, then `summer_import_from_url` to `res://art/sky/<name>.png`, set `Repeat: Disabled`, and wire the WorldEnvironment.
183
189
 
184
190
  If MCP is offline entirely: Polyhaven (`polyhaven.com/hdris`) has hundreds of free CC0 HDRIs ready to drop into `PanoramaSkyMaterial`, and often the better choice for realistic exteriors.
185
191
 
@@ -198,4 +204,4 @@ After the sky is wired:
198
204
  - `tileable-texture` — ground/floor counterpart.
199
205
  - `scene-composition` — WorldEnvironment placement and configuration.
200
206
  - `asset-strategy` — meta-router.
201
- - `../../references/mcp-tools-reference/mcp-tools-reference.md` — `summer_generate_image` schema.
207
+ - `summer_docs_read` id `reference/mcp-tools-reference` — how to call `assets.generate_image`.
@@ -1,7 +1,7 @@
1
1
  id: skill/skybox-panorama
2
2
  kind: skill
3
3
  version: 1.0.3
4
- summary: Generate a 360-degree equirectangular sky panorama and wire it as a PanoramaSkyMaterial Sky resource on WorldEnvironment in a 3D scene.
4
+ summary: "Generate a 360-degree sky panorama and wire it as a PanoramaSkyMaterial Sky resource on WorldEnvironment."
5
5
  use_when:
6
6
  - generating a 360-degree panoramic sky image for use as a Sky resource (PanoramaSkyMaterial) in a 3D scene
7
7
  - a 3D scene has a flat or default sky and needs a 360-degree backdrop matching the art direction
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: sound-effect
3
- description: "Make SFX one-shots and timed sequences (swings, hits, whooshes, reloads, UI) - offer three model versions to pick from, then wire them as AudioStreamPlayers."
3
+ description: "Make sound effects (swings, hits, whooshes, reloads, UI): three versions to pick from, then wire them."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: audio
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Glob Write Edit summer_generate_sfx_choices summer_get_choices summer_generate_audio summer_search_assets summer_import_from_url summer_import_asset_by_id summer_add_node summer_set_prop summer_instantiate_scene summer_inspect_node summer_get_scene_tree
8
+ allowed-tools: Read Grep Glob Write Edit summer_assets_generate_sfx_choices summer_assets_choices summer_assets_generate_audio summer_assets_search summer_import_from_url summer_import_asset_by_id summer_add_node summer_set_prop summer_instantiate_scene summer_inspect_node summer_get_scene_tree summer_call
9
9
  paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
10
10
  ---
11
11
 
@@ -17,8 +17,8 @@ paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
17
17
  >
18
18
  > Say why in one plain line: the best model changes a lot from one sound to the next, so picking by ear gives a better result.
19
19
  >
20
- > - **Yes** → `summer_generate_sfx_choices`, tell them the returned `say` text, then `summer_get_choices` until they decide. Import the approved clips and wire them. The model they approve becomes their default.
21
- > - **No** → `summer_generate_audio` with `capability: "sound_effects"` and **no** `modelId` (it uses their approved default, else ElevenLabs).
20
+ > - **Yes** → `assets.generate_sfx_choices`, tell them where to listen (their Studio tab opens the page, else `reviewUrl`), then `assets.choices` until they decide. Import the approved clips and wire them. The model they approve becomes their default.
21
+ > - **No** → `assets.generate_audio` with `capability: "sound_effects"` and **no** `modelId` (it uses their approved default, else ElevenLabs).
22
22
  >
23
23
  > Ask once per chat. After they answer, do not ask again in the same chat; follow their answer for the rest of it.
24
24
 
@@ -38,7 +38,7 @@ Read `.summer/audio-bible.md` if it exists and map the request to one of its SFX
38
38
 
39
39
  ### 2. Reuse before you generate
40
40
 
41
- Generation costs credits. `summer_search_assets(query="<subject>", assetType="audio", source="all")`; if a clip fits, ask whether to use it.
41
+ Generation costs credits (`dryRun: true` on the generate call shows how many). `assets.search({ query: "<subject>", assetType: "audio", scope: "all" })`; if a clip fits, ask whether to use it.
42
42
 
43
43
  ### 3. Write the prompt
44
44
 
@@ -60,7 +60,7 @@ Foley one-shot: <physical event with materials>, <transient + tail described>, c
60
60
  Foley sequence, exactly 2 seconds, three distinct mechanical sounds: at 0.2 s the empty magazine is released and pulled out with a metal click; at 1.0 s a full magazine is slammed in with a solid clack; at 1.6 s the charging handle is pulled back and released with a sharp metallic snap. Close-mic, dry, no gunshot, no music.
61
61
  ```
62
62
 
63
- **Loops:** write `seamless loop` in the text and pass `loop: true`. Only ElevenLabs SFX v2 makes loops: use `summer_generate_audio` with `modelId: "eleven_text_to_sound_v2"`, or include it in a choice set.
63
+ **Loops:** write `seamless loop` in the text and pass `loop: true`. Only ElevenLabs SFX v2 makes loops: use `assets.generate_audio` with `modelId: "eleven_text_to_sound_v2"`, or include it in a choice set.
64
64
 
65
65
  Avoid: vibe words (`epic`, `cool`, `realistic`), several unrelated events in one prompt (split them, unless it is a timed sequence), and no length.
66
66
 
@@ -87,34 +87,34 @@ Show the prompt and the length before you call; every version is a billed genera
87
87
  **Choice set (the person said yes):**
88
88
 
89
89
  ```
90
- summer_generate_sfx_choices(text: "<prompt>", durationSeconds: 1.0)
90
+ assets.generate_sfx_choices({ text: "<prompt>", durationSeconds: 1.0 })
91
91
  ```
92
92
 
93
- The page opens in their open Summer Studio tab, else in the browser. Tell them the returned `say` text; if `shown` is `not_opened`, give them `reviewUrl`. Do not pick for them. Then:
93
+ The answer has `choiceSetId`, `reviewUrl`, the `clips` and `studioTabOpened`. The page opens in their open Summer Studio tab; if `studioTabOpened` is false, give them `reviewUrl`. Do not pick for them. Then:
94
94
 
95
95
  ```
96
- summer_get_choices(choiceSetId: "<id>", waitSeconds: 50)
96
+ assets.choices({ choiceSetId: "<id>", waitSeconds: 50 })
97
97
  ```
98
98
 
99
- Call it again while `status` is `pending`. When it is `decided`, each entry in `approved` has `audioUrl`, `assetId`, `fileExtension` and the person's `note`. If they approved none, ask what to change and make a new set.
99
+ Call it again while `status` is `pending`. When it is `decided`, each clip with `approved: true` has `audioUrl`, `assetId` and the person's `note`. If they approved none, ask what to change and make a new set.
100
100
 
101
101
  **One version (the person said no, or later sounds after a decided set):**
102
102
 
103
103
  ```
104
- summer_generate_audio(capability: "sound_effects", text: "<prompt>", durationSeconds: 1.0)
104
+ assets.generate_audio({ capability: "sound_effects", text: "<prompt>", durationSeconds: 1.0 })
105
105
  ```
106
106
 
107
- Leave out `modelId` so their approved default runs. The description goes in `text`, not `prompt` (`prompt` gives a 400 `text_required` here).
107
+ Leave out `modelId` so their approved default runs. The description goes in `text`, not `prompt` (without `text` the call is refused: `text_required`). The answer's `asset` has `assetId`, `fileUrl` and `durationSeconds`.
108
108
 
109
109
  No Summer project (an asset-only request, or the engine is not installed or not running): stop here. The clips are in the person's Summer library; give them the `audioUrl` of each approved version and skip steps 7 and 8.
110
110
 
111
111
  ### 7. Import
112
112
 
113
113
  ```
114
- summer_import_from_url(url: "<audioUrl>", path: "res://audio/sfx/sword_clash_01.<fileExtension>")
114
+ summer_import_from_url(url: "<audioUrl>", path: "res://audio/sfx/sword_clash_01.<ext>")
115
115
  ```
116
116
 
117
- or `summer_import_asset_by_id(assetId: "<assetId>", path: "res://audio/sfx/sword_clash_01.<fileExtension>")`. Keep the extension of the file you got. When the person approved several versions, import each one (`_01`, `_02`, …) and play a random one per event for variety.
117
+ or `summer_import_asset_by_id(assetId: "<assetId>", path: "res://audio/sfx/sword_clash_01.<ext>")`. Keep the extension of the file you got (the end of `audioUrl` or `fileUrl`). When the person approved several versions, import each one (`_01`, `_02`, …) and play a random one per event for variety.
118
118
 
119
119
  One-shots keep loop OFF in the Import dock; looping a one-shot clicks. For a loop: WAV uses Edit > Loop Mode = Forward; OGG/MP3 use Loop = on.
120
120
 
@@ -126,13 +126,18 @@ One-shots keep loop OFF in the Import dock; looping a one-shot clicks. For a loo
126
126
  | `AudioStreamPlayer2D` | 2D positional |
127
127
  | `AudioStreamPlayer3D` | 3D positional (weapon swing in the world, footstep) |
128
128
 
129
- Every scene-mutating tool takes an explicit `scenePath`, node paths are relative to the scene root (`./`), and the property argument is `key`:
129
+ One script adds the player with its settings; `scenePath` is the exact scene to change:
130
130
 
131
131
  ```
132
- summer_add_node(scenePath="res://main.tscn", parent="./Player", type="AudioStreamPlayer3D", name="SwingSFX")
133
- summer_set_prop(scenePath="res://main.tscn", path="./Player/SwingSFX", key="stream", value="res://audio/sfx/sword_swing_01.wav")
134
- summer_set_prop(scenePath="res://main.tscn", path="./Player/SwingSFX", key="bus", value="SFX")
135
- summer_set_prop(scenePath="res://main.tscn", path="./Player/SwingSFX", key="max_distance", value=25.0)
132
+ summer_run_script(scenePath="res://main.tscn", source="""
133
+ func run(ctx):
134
+ ctx.add_node("AudioStreamPlayer3D", "SwingSFX", ctx.find("Player"), {
135
+ "stream": load("res://audio/sfx/sword_swing_01.wav"),
136
+ "bus": "SFX",
137
+ "max_distance": 25.0,
138
+ })
139
+ ctx.save_scene()
140
+ """)
136
141
  ```
137
142
 
138
143
  The bus must match the bible (`SFX`, `UI`, `Ambient`, …); the default bus is `Master`. If the bus does not exist, run `/audio-direction`.
@@ -156,6 +161,10 @@ Save it as a `.tscn` and instantiate it per event in GDScript (`preload(...).ins
156
161
 
157
162
  `summer_inspect_node(path="Player/SwingSFX")`: verify `stream`, `bus`, `volume_db`. Too quiet: raise `volume_db` (+3 to +9, never past +12), else regenerate with a heavier description. Too long: `stop()` on a timer.
158
163
 
164
+ ## Without Summer Engine
165
+
166
+ In a session without Summer Engine tools (the assets profile; the `summer-assets` skill has the whole loop), do steps 1-6 and skip steps 7-9 (import, wiring, scene check). With `assets.generate_sfx_choices`, the person picks in the page; then save each approved clip where the person asked with `assets.get` and `out` (the `summer-assets` skill says how), and tell them the path and format.
167
+
159
168
  ## Fallback (no MCP)
160
169
 
161
170
  Print the prompt, the length and the target path (`res://audio/sfx/<name>.wav`), and tell the person to make it in Summer Studio, then import it.
@@ -166,4 +175,4 @@ Print the prompt, the length and the target path (`res://audio/sfx/<name>.wav`),
166
175
  - `ambient-bed` — long looping textures
167
176
  - `music-track` — music
168
177
  - `voice-line` — speech
169
- - `../../references/mcp-tools-reference/mcp-tools-reference.md`
178
+ - `summer_docs_read` id `reference/mcp-tools-reference`