summer-engine 2.8.1 → 3.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 (742) hide show
  1. package/.claude-plugin/marketplace.json +27 -7
  2. package/.claude-plugin/plugin.json +99 -83
  3. package/.codex-plugin/plugin.json +112 -82
  4. package/.cursor-plugin/plugin.json +119 -83
  5. package/.factory-plugin/plugin.json +100 -3
  6. package/.mcp.json +6 -1
  7. package/.opencode/INSTALL.md +7 -4
  8. package/.opencode/plugins/summer.js +31 -18
  9. package/AGENTS.md +107 -34
  10. package/CHANGELOG.md +134 -41
  11. package/CLAUDE.md +4 -2
  12. package/GEMINI.md +7 -53
  13. package/NOTICE +31 -0
  14. package/README.md +159 -391
  15. package/assets/api-docs.json.gz +0 -0
  16. package/assets/autopilot/README.md +20 -6
  17. package/assets/autopilot/autopilot.gd +80 -26
  18. package/assets/autopilot/run.sh +132 -7
  19. package/assets/navigation/web-routes.json +719 -0
  20. package/commands/gameskill.md +10 -108
  21. package/commands/summer.md +72 -4
  22. package/dist/bin/summer.js +6 -87
  23. package/dist/cli/banner.d.ts +1 -0
  24. package/dist/cli/banner.js +33 -0
  25. package/dist/{commands → cli/commands}/config.js +1 -1
  26. package/dist/cli/commands/create.d.ts +30 -0
  27. package/dist/cli/commands/create.js +212 -0
  28. package/dist/{commands → cli/commands}/debug.js +2 -2
  29. package/dist/cli/commands/doctor.d.ts +2 -0
  30. package/dist/cli/commands/doctor.js +18 -0
  31. package/dist/cli/commands/events.d.ts +57 -0
  32. package/dist/cli/commands/events.js +158 -0
  33. package/dist/cli/commands/install.d.ts +50 -0
  34. package/dist/cli/commands/install.js +447 -0
  35. package/dist/cli/commands/list.js +72 -0
  36. package/dist/{commands → cli/commands}/login.js +33 -17
  37. package/dist/{commands → cli/commands}/logout.d.ts +1 -0
  38. package/dist/cli/commands/logout.js +19 -0
  39. package/dist/{commands → cli/commands}/memory.d.ts +1 -8
  40. package/dist/{commands → cli/commands}/memory.js +20 -11
  41. package/dist/cli/commands/open.d.ts +45 -0
  42. package/dist/cli/commands/open.js +216 -0
  43. package/dist/{commands → cli/commands}/plan.js +2 -2
  44. package/dist/{commands → cli/commands}/publish.js +1 -1
  45. package/dist/{commands → cli/commands}/releases.js +1 -1
  46. package/dist/cli/commands/run.d.ts +19 -0
  47. package/dist/cli/commands/run.js +255 -0
  48. package/dist/{commands → cli/commands}/setup.js +43 -89
  49. package/dist/{commands → cli/commands}/skills.js +85 -222
  50. package/dist/{commands → cli/commands}/status.d.ts +1 -0
  51. package/dist/cli/commands/status.js +62 -0
  52. package/dist/cli/commands/tool.d.ts +11 -0
  53. package/dist/cli/commands/tool.js +121 -0
  54. package/dist/cli/index.d.ts +6 -0
  55. package/dist/cli/index.js +89 -0
  56. package/dist/cli/root-action.d.ts +7 -0
  57. package/dist/cli/root-action.js +15 -0
  58. package/dist/{lib → core}/api-client.d.ts +106 -15
  59. package/dist/{lib → core}/api-client.js +267 -75
  60. package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
  61. package/dist/{lib → core}/async-op-lifecycle.js +3 -4
  62. package/dist/{lib → core}/auth.d.ts +14 -6
  63. package/dist/{lib → core}/auth.js +56 -40
  64. package/dist/core/capabilities/agent-playbook.d.ts +20 -0
  65. package/dist/core/capabilities/agent-playbook.js +218 -0
  66. package/dist/core/capabilities/api-docs.d.ts +36 -0
  67. package/dist/core/capabilities/api-docs.js +118 -0
  68. package/dist/core/capabilities/asset-import.d.ts +49 -0
  69. package/dist/core/capabilities/asset-import.js +134 -0
  70. package/dist/core/capabilities/camera-view.d.ts +98 -0
  71. package/dist/core/capabilities/camera-view.js +222 -0
  72. package/dist/core/capabilities/capture.d.ts +63 -0
  73. package/dist/core/capabilities/capture.js +67 -0
  74. package/dist/core/capabilities/console-read.d.ts +17 -0
  75. package/dist/core/capabilities/console-read.js +21 -0
  76. package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
  77. package/dist/{lib → core/capabilities}/creator.js +14 -33
  78. package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
  79. package/dist/{lib → core/capabilities}/debug-report.js +12 -31
  80. package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
  81. package/dist/{commands → core/capabilities}/doctor.js +47 -73
  82. package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
  83. package/dist/core/capabilities/engine-fallbacks.js +36 -0
  84. package/dist/core/capabilities/engine-ops.d.ts +33 -0
  85. package/dist/core/capabilities/engine-ops.js +145 -0
  86. package/dist/core/capabilities/engine-receipt.d.ts +53 -0
  87. package/dist/core/capabilities/engine-receipt.js +134 -0
  88. package/dist/core/capabilities/events.d.ts +200 -0
  89. package/dist/core/capabilities/events.js +383 -0
  90. package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
  91. package/dist/core/capabilities/fabricate-mesh.js +165 -0
  92. package/dist/core/capabilities/frame-quality.d.ts +71 -0
  93. package/dist/core/capabilities/frame-quality.js +449 -0
  94. package/dist/core/capabilities/game-task-plan.d.ts +66 -0
  95. package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
  96. package/dist/core/capabilities/hdri-import.d.ts +90 -0
  97. package/dist/core/capabilities/hdri-import.js +250 -0
  98. package/dist/core/capabilities/image-generation.d.ts +24 -0
  99. package/dist/core/capabilities/image-generation.js +22 -0
  100. package/dist/core/capabilities/navigation/open.d.ts +156 -0
  101. package/dist/core/capabilities/navigation/open.js +567 -0
  102. package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
  103. package/dist/core/capabilities/navigation/render-product-map.js +84 -0
  104. package/dist/core/capabilities/navigation/targets.d.ts +87 -0
  105. package/dist/core/capabilities/navigation/targets.js +250 -0
  106. package/dist/core/capabilities/play-determinism.d.ts +35 -0
  107. package/dist/core/capabilities/play-determinism.js +86 -0
  108. package/dist/core/capabilities/project-context.d.ts +114 -0
  109. package/dist/core/capabilities/project-context.js +249 -0
  110. package/dist/core/capabilities/runtime-control.d.ts +540 -0
  111. package/dist/core/capabilities/runtime-control.js +1011 -0
  112. package/dist/core/capabilities/scene-kind.d.ts +19 -0
  113. package/dist/core/capabilities/scene-kind.js +137 -0
  114. package/dist/core/capabilities/scene-script.d.ts +38 -0
  115. package/dist/core/capabilities/scene-script.js +45 -0
  116. package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
  117. package/dist/core/capabilities/tool-dispatch.js +1490 -0
  118. package/dist/core/capabilities/ui-control.d.ts +179 -0
  119. package/dist/core/capabilities/ui-control.js +423 -0
  120. package/dist/core/capabilities/variant-types.d.ts +22 -0
  121. package/dist/core/capabilities/variant-types.js +101 -0
  122. package/dist/core/capability-skew.d.ts +205 -0
  123. package/dist/core/capability-skew.js +386 -0
  124. package/dist/{lib → core}/config.d.ts +11 -1
  125. package/dist/{lib → core}/config.js +13 -2
  126. package/dist/core/embeddings.d.ts +78 -0
  127. package/dist/core/embeddings.js +166 -0
  128. package/dist/core/engine-install.d.ts +105 -0
  129. package/dist/core/engine-install.js +190 -0
  130. package/dist/core/engine.d.ts +94 -0
  131. package/dist/{lib → core}/engine.js +74 -28
  132. package/dist/core/feedback/client.d.ts +88 -0
  133. package/dist/core/feedback/client.js +182 -0
  134. package/dist/{lib → core}/format.d.ts +0 -1
  135. package/dist/{lib → core}/format.js +1 -1
  136. package/dist/core/headless/connection.d.ts +86 -0
  137. package/dist/core/headless/connection.js +97 -0
  138. package/dist/core/headless/editor-connection.d.ts +26 -0
  139. package/dist/core/headless/editor-connection.js +81 -0
  140. package/dist/core/headless/mcp-routing.d.ts +38 -0
  141. package/dist/core/headless/mcp-routing.js +83 -0
  142. package/dist/core/headless/registry.d.ts +91 -0
  143. package/dist/core/headless/registry.js +226 -0
  144. package/dist/core/headless/resolve.d.ts +46 -0
  145. package/dist/core/headless/resolve.js +75 -0
  146. package/dist/core/headless/spawn.d.ts +46 -0
  147. package/dist/core/headless/spawn.js +205 -0
  148. package/dist/core/headless/worker-connection.d.ts +96 -0
  149. package/dist/core/headless/worker-connection.js +353 -0
  150. package/dist/core/headless/worker-engine-client.d.ts +58 -0
  151. package/dist/core/headless/worker-engine-client.js +246 -0
  152. package/dist/core/launch-posture.d.ts +170 -0
  153. package/dist/core/launch-posture.js +317 -0
  154. package/dist/core/library-read.d.ts +73 -0
  155. package/dist/core/library-read.js +279 -0
  156. package/dist/core/library-search.d.ts +143 -0
  157. package/dist/core/library-search.js +301 -0
  158. package/dist/{lib → core}/log-filters.js +4 -2
  159. package/dist/{lib → core}/mcp-log.js +2 -17
  160. package/dist/core/package-root.d.ts +9 -0
  161. package/dist/core/package-root.js +11 -0
  162. package/dist/core/redact.d.ts +20 -0
  163. package/dist/core/redact.js +64 -0
  164. package/dist/core/registry-search.d.ts +167 -0
  165. package/dist/core/registry-search.js +358 -0
  166. package/dist/core/skills-registry.d.ts +47 -0
  167. package/dist/core/skills-registry.js +83 -0
  168. package/dist/{lib → core}/store.js +11 -7
  169. package/dist/{lib → core}/summer-compatibility.js +3 -3
  170. package/dist/{lib → core}/telemetry.js +5 -2
  171. package/dist/core/templates.d.ts +98 -0
  172. package/dist/core/templates.js +241 -0
  173. package/dist/core/tool-errors.d.ts +30 -0
  174. package/dist/core/tool-errors.js +40 -0
  175. package/dist/core/trajectory.d.ts +80 -0
  176. package/dist/core/trajectory.js +307 -0
  177. package/dist/core/util/http.d.ts +13 -0
  178. package/dist/core/util/http.js +28 -0
  179. package/dist/core/util/json.d.ts +12 -0
  180. package/dist/core/util/json.js +21 -0
  181. package/dist/core/util/process.d.ts +3 -0
  182. package/dist/core/util/process.js +13 -0
  183. package/dist/core/util/sleep.d.ts +1 -0
  184. package/dist/core/util/sleep.js +3 -0
  185. package/dist/core/version.d.ts +3 -0
  186. package/dist/core/version.js +5 -0
  187. package/dist/{lib → installer}/agent-config.d.ts +20 -1
  188. package/dist/{lib → installer}/agent-config.js +148 -23
  189. package/dist/installer/legacy-skills.d.ts +26 -0
  190. package/dist/installer/legacy-skills.js +53 -0
  191. package/dist/installer/setup.d.ts +76 -0
  192. package/dist/installer/setup.js +146 -0
  193. package/dist/installer/skill-locations.d.ts +45 -0
  194. package/dist/installer/skill-locations.js +170 -0
  195. package/dist/installer/version-check.d.ts +174 -0
  196. package/dist/{lib → installer}/version-check.js +173 -42
  197. package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
  198. package/dist/{commands/mcp.js → mcp/command.js} +18 -6
  199. package/dist/mcp/server.d.ts +23 -3
  200. package/dist/mcp/server.js +122 -28
  201. package/dist/mcp/tools/asset-tools.js +62 -142
  202. package/dist/mcp/tools/creator-tools.js +5 -23
  203. package/dist/mcp/tools/debug-tools.js +61 -18
  204. package/dist/mcp/tools/event-tools.d.ts +14 -0
  205. package/dist/mcp/tools/event-tools.js +41 -0
  206. package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
  207. package/dist/mcp/tools/fabricate-tools.js +28 -0
  208. package/dist/mcp/tools/feedback-tools.d.ts +77 -0
  209. package/dist/mcp/tools/feedback-tools.js +88 -0
  210. package/dist/mcp/tools/file-tools.js +6 -53
  211. package/dist/mcp/tools/generate-tools.js +37 -63
  212. package/dist/mcp/tools/library-tools.d.ts +11 -0
  213. package/dist/mcp/tools/library-tools.js +42 -0
  214. package/dist/mcp/tools/navigation-tools.d.ts +7 -0
  215. package/dist/mcp/tools/navigation-tools.js +37 -0
  216. package/dist/mcp/tools/perception-tools.d.ts +20 -0
  217. package/dist/mcp/tools/perception-tools.js +146 -0
  218. package/dist/mcp/tools/project-tools.d.ts +14 -0
  219. package/dist/mcp/tools/project-tools.js +72 -281
  220. package/dist/mcp/tools/runtime-tools.d.ts +2 -0
  221. package/dist/mcp/tools/runtime-tools.js +92 -0
  222. package/dist/mcp/tools/scene-tools.d.ts +3 -0
  223. package/dist/mcp/tools/scene-tools.js +68 -119
  224. package/dist/mcp/tools/script-tools.d.ts +3 -0
  225. package/dist/mcp/tools/script-tools.js +118 -0
  226. package/dist/mcp/tools/spatial-tools.d.ts +2 -0
  227. package/dist/mcp/tools/spatial-tools.js +485 -0
  228. package/dist/mcp/tools/text-json.d.ts +8 -0
  229. package/dist/mcp/tools/text-json.js +12 -0
  230. package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
  231. package/dist/mcp/tools/ui-tools.js +82 -0
  232. package/dist/mcp/tools/visual-tools.d.ts +2 -7
  233. package/dist/mcp/tools/visual-tools.js +383 -101
  234. package/dist/mcp/tools/with-engine.d.ts +9 -15
  235. package/dist/mcp/tools/with-engine.js +60 -96
  236. package/dist/project-memory/project-manifest.d.ts +36 -0
  237. package/dist/project-memory/project-manifest.js +50 -0
  238. package/dist/project-memory/project-memory.d.ts +57 -0
  239. package/dist/{lib → project-memory}/project-memory.js +46 -0
  240. package/gemini-extension.json +103 -2
  241. package/hooks/hooks-cursor.json +2 -2
  242. package/hooks/hooks.json +2 -1
  243. package/hooks/pre-commit-doctor.sh +45 -39
  244. package/hooks/run-hook.cmd +30 -23
  245. package/hooks/run-hook.sh +20 -0
  246. package/hooks/session-start.sh +18 -7
  247. package/integrations/README.md +70 -0
  248. package/integrations/claude/README.md +19 -0
  249. package/integrations/claude/manifest-target.json +16 -0
  250. package/integrations/cline/README.md +13 -0
  251. package/integrations/cline/manifest-target.json +3 -0
  252. package/integrations/codex/README.md +15 -0
  253. package/integrations/codex/manifest-target.json +5 -0
  254. package/integrations/cursor/README.md +16 -0
  255. package/integrations/cursor/manifest-target.json +5 -0
  256. package/integrations/factory/README.md +26 -0
  257. package/integrations/factory/manifest-target.json +5 -0
  258. package/integrations/gemini/README.md +26 -0
  259. package/integrations/gemini/manifest-target.json +5 -0
  260. package/integrations/github-copilot/README.md +12 -0
  261. package/integrations/github-copilot/manifest-target.json +3 -0
  262. package/integrations/kilo-code/README.md +16 -0
  263. package/integrations/kilo-code/manifest-target.json +3 -0
  264. package/integrations/lm-studio/README.md +12 -0
  265. package/integrations/lm-studio/manifest-target.json +3 -0
  266. package/integrations/opencode/README.md +15 -0
  267. package/integrations/opencode/manifest-target.json +3 -0
  268. package/integrations/roo-code/README.md +13 -0
  269. package/integrations/roo-code/manifest-target.json +3 -0
  270. package/integrations/vscode-copilot/README.md +12 -0
  271. package/integrations/vscode-copilot/manifest-target.json +3 -0
  272. package/integrations/windsurf/README.md +13 -0
  273. package/integrations/windsurf/manifest-target.json +3 -0
  274. package/library/references/collaborative-protocol/resource.yaml +24 -0
  275. package/library/references/gd-style/resource.yaml +24 -0
  276. package/{references → library/references/godot-version}/godot-version.md +6 -6
  277. package/library/references/godot-version/resource.yaml +22 -0
  278. package/library/references/headless-routing/headless-routing.md +46 -0
  279. package/library/references/headless-routing/resource.yaml +24 -0
  280. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
  281. package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
  282. package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
  283. package/library/references/mcp-tools-reference/resource.yaml +17 -0
  284. package/library/references/product-map/product-map.md +103 -0
  285. package/library/references/product-map/resource.yaml +33 -0
  286. package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
  287. package/library/references/public-surface-language/resource.yaml +17 -0
  288. package/library/references/summer-folder/resource.yaml +20 -0
  289. package/{references → library/references/summer-folder}/summer-folder.md +22 -21
  290. package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
  291. package/library/skills/3d-lighting/resource.yaml +27 -0
  292. package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
  293. package/library/skills/adaptive-music/resource.yaml +28 -0
  294. package/library/skills/agent-playtesting/SKILL.md +148 -0
  295. package/library/skills/agent-playtesting/resource.yaml +52 -0
  296. package/library/skills/ambient-bed/resource.yaml +24 -0
  297. package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
  298. package/library/skills/animated-loop/resource.yaml +27 -0
  299. package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
  300. package/library/skills/animation-tree/resource.yaml +33 -0
  301. package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
  302. package/library/skills/art-direction/resource.yaml +29 -0
  303. package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
  304. package/library/skills/asset-strategy/resource.yaml +63 -0
  305. package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
  306. package/library/skills/audio-direction/resource.yaml +32 -0
  307. package/library/skills/auto-fire-targeting/resource.yaml +22 -0
  308. package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
  309. package/library/skills/brainstorm-game/resource.yaml +30 -0
  310. package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
  311. package/library/skills/brainstorming/resource.yaml +23 -0
  312. package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
  313. package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
  314. package/library/skills/browse-templates/resource.yaml +23 -0
  315. package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
  316. package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
  317. package/library/skills/character-animation-wiring/SKILL.md +249 -0
  318. package/library/skills/character-animation-wiring/resource.yaml +39 -0
  319. package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
  320. package/library/skills/character-model/resource.yaml +36 -0
  321. package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
  322. package/library/skills/character-portrait/resource.yaml +30 -0
  323. package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
  324. package/library/skills/cinematic-cutscene/resource.yaml +29 -0
  325. package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
  326. package/library/skills/concept-art/resource.yaml +34 -0
  327. package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
  328. package/library/skills/create-asset-sheet/resource.yaml +33 -0
  329. package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
  330. package/library/skills/debug/resource.yaml +31 -0
  331. package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
  332. package/library/skills/debugging-game-feel/resource.yaml +25 -0
  333. package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
  334. package/library/skills/design-level/resource.yaml +31 -0
  335. package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
  336. package/library/skills/design-mechanic/resource.yaml +31 -0
  337. package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
  338. package/library/skills/design-npc/resource.yaml +29 -0
  339. package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
  340. package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
  341. package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
  342. package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
  343. package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
  344. package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
  345. package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
  346. package/library/skills/environment-kit/resource.yaml +29 -0
  347. package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
  348. package/library/skills/export-and-ship/resource.yaml +32 -0
  349. package/library/skills/fabricating-assets/SKILL.md +195 -0
  350. package/library/skills/fabricating-assets/resource.yaml +52 -0
  351. package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
  352. package/library/skills/facial-and-lipsync/resource.yaml +36 -0
  353. package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
  354. package/library/skills/fps-controller/resource.yaml +29 -0
  355. package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
  356. package/library/skills/game-feel/resource.yaml +27 -0
  357. package/library/skills/gameskill/SKILL.md +64 -0
  358. package/library/skills/gameskill/resource.yaml +22 -0
  359. package/library/skills/gdscript-patterns/resource.yaml +23 -0
  360. package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
  361. package/library/skills/generate-motion/resource.yaml +34 -0
  362. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
  363. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
  364. package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
  365. package/library/skills/headless-scripting/resource.yaml +26 -0
  366. package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +1 -1
  367. package/library/skills/host-authoritative-state/resource.yaml +28 -0
  368. package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
  369. package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
  370. package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
  371. package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
  372. package/library/skills/investigating-bugs/resource.yaml +24 -0
  373. package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
  374. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
  375. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
  376. package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +23 -23
  377. package/library/skills/make-game/resource.yaml +35 -0
  378. package/library/skills/music-track/resource.yaml +28 -0
  379. package/library/skills/navigate-summer/SKILL.md +61 -0
  380. package/library/skills/navigate-summer/resource.yaml +35 -0
  381. package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
  382. package/library/skills/new-project/resource.yaml +28 -0
  383. package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
  384. package/library/skills/organic-model/resource.yaml +32 -0
  385. package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
  386. package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
  387. package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
  388. package/library/skills/pixel-art/resource.yaml +31 -0
  389. package/library/skills/play/resource.yaml +26 -0
  390. package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
  391. package/library/skills/playtesting-a-feature/resource.yaml +31 -0
  392. package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
  393. package/library/skills/procedural-animation/resource.yaml +33 -0
  394. package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
  395. package/library/skills/prop-model/resource.yaml +33 -0
  396. package/library/skills/psx-retro-rendering/SKILL.md +416 -0
  397. package/library/skills/psx-retro-rendering/resource.yaml +36 -0
  398. package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
  399. package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
  400. package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
  401. package/library/skills/remote-deploy/resource.yaml +23 -0
  402. package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
  403. package/library/skills/retarget/resource.yaml +33 -0
  404. package/library/skills/running-in-the-cloud/SKILL.md +103 -0
  405. package/library/skills/running-in-the-cloud/resource.yaml +33 -0
  406. package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +9 -1
  407. package/library/skills/scene-composition/resource.yaml +27 -0
  408. package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
  409. package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
  410. package/library/skills/scene-scripting/SKILL.md +764 -0
  411. package/library/skills/scene-scripting/resource.yaml +58 -0
  412. package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
  413. package/library/skills/scene-to-level/resource.yaml +33 -0
  414. package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +1 -1
  415. package/library/skills/setup-multiplayer/resource.yaml +28 -0
  416. package/library/skills/skill-create/SKILL.md +138 -0
  417. package/library/skills/skill-create/resource.yaml +25 -0
  418. package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
  419. package/library/skills/skill-improve/resource.yaml +25 -0
  420. package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
  421. package/library/skills/skill-test/resource.yaml +26 -0
  422. package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
  423. package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
  424. package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
  425. package/library/skills/skybox-panorama/resource.yaml +28 -0
  426. package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
  427. package/library/skills/sound-effect/resource.yaml +27 -0
  428. package/library/skills/spatial-placement/SKILL.md +74 -0
  429. package/library/skills/spatial-placement/resource.yaml +42 -0
  430. package/library/skills/spatial-placement/tests/spec.md +65 -0
  431. package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
  432. package/library/skills/sprite-sheet/resource.yaml +32 -0
  433. package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
  434. package/library/skills/tileable-texture/resource.yaml +31 -0
  435. package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
  436. package/library/skills/trailer-shot/resource.yaml +27 -0
  437. package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
  438. package/library/skills/tune-performance/resource.yaml +31 -0
  439. package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +1 -1
  440. package/library/skills/ui-basics/resource.yaml +25 -0
  441. package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
  442. package/library/skills/ui-graphics/resource.yaml +29 -0
  443. package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
  444. package/library/skills/use-widget-asset/resource.yaml +29 -0
  445. package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
  446. package/library/skills/using-summer/resource.yaml +41 -0
  447. package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
  448. package/library/skills/vehicle-model/resource.yaml +34 -0
  449. package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
  450. package/library/skills/verification-before-completion/resource.yaml +23 -0
  451. package/library/skills/verifying-scenes/SKILL.md +98 -0
  452. package/library/skills/verifying-scenes/resource.yaml +42 -0
  453. package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
  454. package/library/skills/vfx-dissolve/resource.yaml +33 -0
  455. package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
  456. package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
  457. package/library/skills/vfx-fire/resource.yaml +35 -0
  458. package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
  459. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
  460. package/library/skills/vfx-hit-spark/resource.yaml +34 -0
  461. package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
  462. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
  463. package/library/skills/vfx-lightning/resource.yaml +33 -0
  464. package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
  465. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
  466. package/library/skills/vfx-magic-glow/resource.yaml +34 -0
  467. package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
  468. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
  469. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
  470. package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
  471. package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
  472. package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
  473. package/library/skills/vfx-smoke/resource.yaml +32 -0
  474. package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
  475. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
  476. package/library/skills/vfx-water-ripple/resource.yaml +31 -0
  477. package/library/skills/voice-line/resource.yaml +27 -0
  478. package/library/skills/world-building-3d/SKILL.md +105 -0
  479. package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
  480. package/library/skills/world-building-3d/resource.yaml +44 -0
  481. package/library/skills/world-building-3d/tests/spec.md +48 -0
  482. package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
  483. package/library/skills/writing-plans/resource.yaml +23 -0
  484. package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
  485. package/library/skills/writing-skills/resource.yaml +29 -0
  486. package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
  487. package/library/templates/2d-brario-platformer/resource.yaml +21 -0
  488. package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
  489. package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
  490. package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
  491. package/library/templates/2d-platformer/resource.yaml +24 -0
  492. package/library/templates/2d-rpg/resource.yaml +21 -0
  493. package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
  494. package/library/templates/3d-basic/resource.yaml +16 -0
  495. package/library/templates/3d-city-kit/resource.yaml +24 -0
  496. package/library/templates/3d-fps-old-school/resource.yaml +21 -0
  497. package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
  498. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
  499. package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
  500. package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
  501. package/library/templates/3d-racing-game/resource.yaml +21 -0
  502. package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
  503. package/library/templates/3d-third-person-controller/resource.yaml +21 -0
  504. package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
  505. package/library/templates/README.md +94 -0
  506. package/library/templates/empty/resource.yaml +16 -0
  507. package/library/tools/add-node/resource.yaml +60 -0
  508. package/library/tools/align-distribute-3d/resource.yaml +87 -0
  509. package/library/tools/api-docs/resource.yaml +57 -0
  510. package/library/tools/batch/resource.yaml +52 -0
  511. package/library/tools/camera-bookmark/resource.yaml +73 -0
  512. package/library/tools/check-job/resource.yaml +45 -0
  513. package/library/tools/clear-console/resource.yaml +40 -0
  514. package/library/tools/connect-signal/resource.yaml +63 -0
  515. package/library/tools/create-debug-report/resource.yaml +67 -0
  516. package/library/tools/create-scene/resource.yaml +59 -0
  517. package/library/tools/creator-config/resource.yaml +63 -0
  518. package/library/tools/creator-publish/resource.yaml +73 -0
  519. package/library/tools/creator-releases/resource.yaml +53 -0
  520. package/library/tools/fabricate-3d/resource.yaml +108 -0
  521. package/library/tools/game-control/resource.yaml +84 -0
  522. package/library/tools/game-input/resource.yaml +159 -0
  523. package/library/tools/game-probe/resource.yaml +90 -0
  524. package/library/tools/generate-3d/resource.yaml +112 -0
  525. package/library/tools/generate-audio/resource.yaml +80 -0
  526. package/library/tools/generate-image/resource.yaml +62 -0
  527. package/library/tools/generate-motion/resource.yaml +66 -0
  528. package/library/tools/generate-video/resource.yaml +66 -0
  529. package/library/tools/get-agent-playbook/resource.yaml +40 -0
  530. package/library/tools/get-asset/resource.yaml +42 -0
  531. package/library/tools/get-asset-download-url/resource.yaml +52 -0
  532. package/library/tools/get-console/resource.yaml +69 -0
  533. package/library/tools/get-debugger-errors/resource.yaml +56 -0
  534. package/library/tools/get-debugger-warnings/resource.yaml +52 -0
  535. package/library/tools/get-diagnostics/resource.yaml +42 -0
  536. package/library/tools/get-project-context/resource.yaml +45 -0
  537. package/library/tools/get-runtime-tree/resource.yaml +62 -0
  538. package/library/tools/get-scene-tree/resource.yaml +52 -0
  539. package/library/tools/get-script-errors/resource.yaml +45 -0
  540. package/library/tools/get-studio-workflow/resource.yaml +43 -0
  541. package/library/tools/import-asset/resource.yaml +73 -0
  542. package/library/tools/import-asset-by-id/resource.yaml +56 -0
  543. package/library/tools/import-from-url/resource.yaml +51 -0
  544. package/library/tools/import-from-url-batch/resource.yaml +60 -0
  545. package/library/tools/import-hdri/resource.yaml +69 -0
  546. package/library/tools/input-map-bind/resource.yaml +52 -0
  547. package/library/tools/inspect-node/resource.yaml +46 -0
  548. package/library/tools/inspect-resource/resource.yaml +45 -0
  549. package/library/tools/inspect-runtime-node/resource.yaml +54 -0
  550. package/library/tools/instantiate-scene/resource.yaml +62 -0
  551. package/library/tools/is-running/resource.yaml +40 -0
  552. package/library/tools/library-feedback/resource.yaml +89 -0
  553. package/library/tools/list-my-assets/resource.yaml +56 -0
  554. package/library/tools/navigation-probe/resource.yaml +85 -0
  555. package/library/tools/open/resource.yaml +80 -0
  556. package/library/tools/open-main-scene/resource.yaml +40 -0
  557. package/library/tools/open-scene/resource.yaml +46 -0
  558. package/library/tools/play/resource.yaml +91 -0
  559. package/library/tools/project-setting/resource.yaml +53 -0
  560. package/library/tools/read-file/resource.yaml +47 -0
  561. package/library/tools/read-library/resource.yaml +67 -0
  562. package/library/tools/recent-events/resource.yaml +71 -0
  563. package/library/tools/remove-node/resource.yaml +51 -0
  564. package/library/tools/replace-node/resource.yaml +57 -0
  565. package/library/tools/replace-text/resource.yaml +61 -0
  566. package/library/tools/run-editor-script/resource.yaml +61 -0
  567. package/library/tools/run-script/resource.yaml +73 -0
  568. package/library/tools/runtime-animate/resource.yaml +140 -0
  569. package/library/tools/runtime-call/resource.yaml +74 -0
  570. package/library/tools/runtime-set/resource.yaml +80 -0
  571. package/library/tools/runtime-spawn/resource.yaml +95 -0
  572. package/library/tools/save-scene/resource.yaml +50 -0
  573. package/library/tools/screenshot/resource.yaml +112 -0
  574. package/library/tools/search-assets/resource.yaml +67 -0
  575. package/library/tools/search-library/resource.yaml +81 -0
  576. package/library/tools/select-node/resource.yaml +48 -0
  577. package/library/tools/set-prop/resource.yaml +64 -0
  578. package/library/tools/set-resource-property/resource.yaml +66 -0
  579. package/library/tools/slice-asset-sheet/resource.yaml +47 -0
  580. package/library/tools/snap-to-surface/resource.yaml +90 -0
  581. package/library/tools/snapshot-diff/resource.yaml +58 -0
  582. package/library/tools/starcast/resource.yaml +120 -0
  583. package/library/tools/start-game-task/resource.yaml +91 -0
  584. package/library/tools/stop/resource.yaml +51 -0
  585. package/library/tools/test-placement/resource.yaml +109 -0
  586. package/library/tools/ui-actions/resource.yaml +77 -0
  587. package/library/tools/ui-activate/resource.yaml +88 -0
  588. package/library/tools/ui-screenshot/resource.yaml +63 -0
  589. package/library/tools/ui-tree/resource.yaml +69 -0
  590. package/library/tools/wait-for-event/resource.yaml +84 -0
  591. package/library/tools/world-snapshot/resource.yaml +60 -0
  592. package/library/tools/write-file/resource.yaml +54 -0
  593. package/package.json +22 -16
  594. package/registry/generated/aliases.json +207 -0
  595. package/registry/generated/counts.json +12 -0
  596. package/registry/generated/gemini-extension.json +122 -0
  597. package/registry/generated/index.json +7709 -0
  598. package/registry/generated/marketplace.claude.json +44 -0
  599. package/registry/generated/mcp.json +13 -0
  600. package/registry/generated/plugin.claude.json +135 -0
  601. package/registry/generated/plugin.codex.json +144 -0
  602. package/registry/generated/plugin.cursor.json +134 -0
  603. package/registry/generated/plugin.factory.json +117 -0
  604. package/registry/generated/skills-registry.json +851 -0
  605. package/registry/generated/templates-registry.json +455 -0
  606. package/registry/schemas/allowed-hosts.json +19 -0
  607. package/registry/schemas/collection.schema.json +68 -0
  608. package/registry/schemas/domains.json +96 -0
  609. package/registry/schemas/example.schema.json +11 -0
  610. package/registry/schemas/reference.schema.json +10 -0
  611. package/registry/schemas/resource.schema.json +154 -0
  612. package/registry/schemas/skill.schema.json +14 -0
  613. package/registry/schemas/template.schema.json +46 -0
  614. package/registry/schemas/tool.schema.json +61 -0
  615. package/_persona/summer/SKILL.md +0 -113
  616. package/dist/bin/postinstall.d.ts +0 -2
  617. package/dist/bin/postinstall.js +0 -3
  618. package/dist/commands/cloud.d.ts +0 -2
  619. package/dist/commands/cloud.js +0 -80
  620. package/dist/commands/create.d.ts +0 -3
  621. package/dist/commands/create.js +0 -171
  622. package/dist/commands/install.d.ts +0 -19
  623. package/dist/commands/install.js +0 -194
  624. package/dist/commands/list.js +0 -67
  625. package/dist/commands/logout.js +0 -13
  626. package/dist/commands/logs.d.ts +0 -2
  627. package/dist/commands/logs.js +0 -19
  628. package/dist/commands/open.d.ts +0 -2
  629. package/dist/commands/open.js +0 -32
  630. package/dist/commands/orchestrator.d.ts +0 -8
  631. package/dist/commands/orchestrator.js +0 -143
  632. package/dist/commands/run.d.ts +0 -2
  633. package/dist/commands/run.js +0 -167
  634. package/dist/commands/status.js +0 -46
  635. package/dist/lib/banner.d.ts +0 -4
  636. package/dist/lib/banner.js +0 -122
  637. package/dist/lib/cloud/api.d.ts +0 -79
  638. package/dist/lib/cloud/api.js +0 -107
  639. package/dist/lib/cloud/apply.d.ts +0 -32
  640. package/dist/lib/cloud/apply.js +0 -294
  641. package/dist/lib/cloud/checkpoint.d.ts +0 -26
  642. package/dist/lib/cloud/checkpoint.js +0 -142
  643. package/dist/lib/cloud/conflicts.d.ts +0 -55
  644. package/dist/lib/cloud/conflicts.js +0 -131
  645. package/dist/lib/cloud/containment.d.ts +0 -8
  646. package/dist/lib/cloud/containment.js +0 -52
  647. package/dist/lib/cloud/diff.d.ts +0 -39
  648. package/dist/lib/cloud/diff.js +0 -138
  649. package/dist/lib/cloud/engine-bridge.d.ts +0 -34
  650. package/dist/lib/cloud/engine-bridge.js +0 -139
  651. package/dist/lib/cloud/hash-cache.d.ts +0 -23
  652. package/dist/lib/cloud/hash-cache.js +0 -44
  653. package/dist/lib/cloud/hash.d.ts +0 -10
  654. package/dist/lib/cloud/hash.js +0 -111
  655. package/dist/lib/cloud/http.d.ts +0 -17
  656. package/dist/lib/cloud/http.js +0 -47
  657. package/dist/lib/cloud/lock-path.d.ts +0 -1
  658. package/dist/lib/cloud/lock-path.js +0 -5
  659. package/dist/lib/cloud/lock.d.ts +0 -14
  660. package/dist/lib/cloud/lock.js +0 -143
  661. package/dist/lib/cloud/manifest.d.ts +0 -6
  662. package/dist/lib/cloud/manifest.js +0 -41
  663. package/dist/lib/cloud/paths.d.ts +0 -20
  664. package/dist/lib/cloud/paths.js +0 -90
  665. package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
  666. package/dist/lib/cloud/project-godot-merge.js +0 -185
  667. package/dist/lib/cloud/rules.d.ts +0 -39
  668. package/dist/lib/cloud/rules.js +0 -159
  669. package/dist/lib/cloud/sync.d.ts +0 -21
  670. package/dist/lib/cloud/sync.js +0 -518
  671. package/dist/lib/cloud/transfer.d.ts +0 -23
  672. package/dist/lib/cloud/transfer.js +0 -184
  673. package/dist/lib/cloud/types.d.ts +0 -62
  674. package/dist/lib/cloud/types.js +0 -1
  675. package/dist/lib/cloud/validate-path.d.ts +0 -23
  676. package/dist/lib/cloud/validate-path.js +0 -103
  677. package/dist/lib/engine.d.ts +0 -51
  678. package/dist/lib/game-task-plan.d.ts +0 -42
  679. package/dist/lib/project-memory.d.ts +0 -33
  680. package/dist/lib/public-surface-paths.d.ts +0 -13
  681. package/dist/lib/public-surface-paths.js +0 -42
  682. package/dist/lib/remote-templates.d.ts +0 -25
  683. package/dist/lib/remote-templates.js +0 -86
  684. package/dist/lib/skills-registry.d.ts +0 -572
  685. package/dist/lib/skills-registry.js +0 -1061
  686. package/dist/lib/version-check.d.ts +0 -106
  687. package/dist/mcp/tools/cloud-tools.js +0 -42
  688. package/references/mcp-tools-reference.md +0 -199
  689. package/references/template-registry.md +0 -73
  690. package/skills/README.md +0 -103
  691. package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
  692. package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
  693. package/skills/workflow/brainstorming/scripts/helper.js +0 -88
  694. package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
  695. package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
  696. package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
  697. package/skills/workflow/brainstorming/visual-companion.md +0 -287
  698. package/skills/workflow/gameskill/SKILL.md +0 -120
  699. package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
  700. package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
  701. package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
  702. package/skills/workflow/investigating-bugs/test-academic.md +0 -14
  703. package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
  704. package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
  705. package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
  706. package/skills/workflow/mcpupdate/SKILL.md +0 -134
  707. package/skills/workflow/skill-create/SKILL.md +0 -153
  708. package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
  709. package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
  710. package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
  711. package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
  712. package/skills/workflow/writing-skills/render-graphs.js +0 -168
  713. /package/dist/{commands → cli/commands}/config.d.ts +0 -0
  714. /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
  715. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  716. /package/dist/{commands → cli/commands}/login.d.ts +0 -0
  717. /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
  718. /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
  719. /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
  720. /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
  721. /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
  722. /package/dist/{lib → core}/log-filters.d.ts +0 -0
  723. /package/dist/{lib → core}/mcp-log.d.ts +0 -0
  724. /package/dist/{lib → core}/store.d.ts +0 -0
  725. /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
  726. /package/dist/{lib → core}/telemetry.d.ts +0 -0
  727. /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
  728. /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
  729. /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
  730. /package/{references → library/references/gd-style}/gd-style.md +0 -0
  731. /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
  732. /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
  733. /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
  734. /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
  735. /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
  736. /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
  737. /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
  738. /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
  739. /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
  740. /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
  741. /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
  742. /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
@@ -0,0 +1,383 @@
1
+ /**
2
+ * Engine events channel — the ONE implementation behind summer_wait_for_event,
3
+ * summer_recent_events (MCP + `summer tool`) and `summer events` (CLI).
4
+ *
5
+ * Transport: GET /api/events/poll, the engine's long-poll route
6
+ * ({events:[{seq, kind, ts, data}], next_seq, last_seq, since, truncated,
7
+ * timed_out}). The SSE route (GET /api/events) is deliberately NOT consumed in
8
+ * v1 — the poll loop is the portable path through MCP hosts and proxies; an
9
+ * SSE client is a follow-up.
10
+ *
11
+ * Two rules every caller inherits:
12
+ * - `seq` is a monotonic cursor. A result's next_seq is the `since` of the
13
+ * next call; events are delivered live from `since`, so a caller who might
14
+ * miss an event that fires immediately takes a cursor FIRST (recentEvents)
15
+ * and passes it as `since`.
16
+ * - timed_out:true is reported as exactly that — no match arrived — never
17
+ * coerced into a failure or a success.
18
+ *
19
+ * Whether the engine HAS the channel is decided before anything is sent by
20
+ * missingEngineEventsResult (core/capability-skew.ts); this module carries the
21
+ * post-hoc twin for engines reached with the pre-flight off (HTTP 404).
22
+ */
23
+ import { z } from "zod";
24
+ import { EVENTS_FALLBACK, buildMissingEventsResult, } from "../capability-skew.js";
25
+ import { asRecord, numberFrom, stringFrom } from "../util/json.js";
26
+ /** Event kinds v1 (SCENE_SCRIPTING_CONTRACTS.md, the engine scene-scripting contracts). sys.* transport
27
+ * frames (sys.gap, sys.closed) are not kinds: never in the ring, never
28
+ * filterable, surfaced separately below. */
29
+ export const EVENT_KINDS_V1 = [
30
+ "op.applied",
31
+ "op.failed",
32
+ "script.error",
33
+ "play.started",
34
+ "play.stopped",
35
+ "scene.saved",
36
+ "scene.opened",
37
+ "import.completed",
38
+ "selection.changed",
39
+ "snapshot.published",
40
+ ];
41
+ export const WAIT_DEFAULT_SECONDS = 30;
42
+ export const WAIT_MIN_SECONDS = 1;
43
+ export const WAIT_MAX_SECONDS = 120;
44
+ /** Each held poll stays under this: below typical proxy/host idle limits and
45
+ * under the engine's own 60 s cap. The wait loop chains slices. */
46
+ export const POLL_SLICE_MS = 25_000;
47
+ export const WAIT_MAX_EVENTS_DEFAULT = 20;
48
+ /** Engine cap on `limit` per poll answer. */
49
+ export const POLL_LIMIT_CAP = 500;
50
+ export const RECENT_LIMIT_DEFAULT = 50;
51
+ export const RECENT_LIMIT_CAP = 200;
52
+ /** Pacing sleep after a zero-event answer that came back before its `wait`
53
+ * elapsed (an engine that answers held polls early would otherwise spin the
54
+ * loop). Exported for the CLI follow loop. */
55
+ export const PACING_MS = 250;
56
+ // ---------------------------------------------------------------------------
57
+ // Argument schemas — shared by the MCP registration (raw shape) and the CLI
58
+ // dispatcher (same zod), so both faces reject the same inputs.
59
+ // ---------------------------------------------------------------------------
60
+ const kindsSchema = z
61
+ .array(z.string().min(1))
62
+ .describe(`Event kinds to deliver (default: all). v1 kinds: ${EVENT_KINDS_V1.join(", ")}. Unknown kinds are refused before waiting when the engine advertises its list.`);
63
+ export const waitForEventArgsSchema = z.object({
64
+ kinds: kindsSchema.optional(),
65
+ since: z
66
+ .number()
67
+ .int()
68
+ .nonnegative()
69
+ .optional()
70
+ .describe("Deliver events with seq > since. Omit = live from now (an event that already fired is NOT delivered — take a cursor with summer_recent_events first and pass its next_seq here). 0 = replay the retained ring."),
71
+ timeout_seconds: z
72
+ .number()
73
+ .optional()
74
+ .describe("How long to wait for a match (default 30, clamped 1-120). The call long-polls in slices of at most 25 s."),
75
+ match: z
76
+ .object({
77
+ requestId: z
78
+ .string()
79
+ .min(1)
80
+ .optional()
81
+ .describe("Only op.applied / op.failed events for this requestId match; every other kind passes through."),
82
+ })
83
+ .optional()
84
+ .describe("Extra client-side filters applied after the kinds filter."),
85
+ max_events: z
86
+ .number()
87
+ .int()
88
+ .positive()
89
+ .optional()
90
+ .describe("Maximum matched events to return (default 20, cap 500)."),
91
+ });
92
+ export const recentEventsArgsSchema = z.object({
93
+ since: z
94
+ .number()
95
+ .int()
96
+ .nonnegative()
97
+ .optional()
98
+ .describe("Deliver events with seq > since. Omit = the newest `limit` sequence numbers. 0 = the whole retained ring from the oldest (paged: pass next_seq back while truncated is true)."),
99
+ kinds: kindsSchema.optional(),
100
+ limit: z
101
+ .number()
102
+ .int()
103
+ .positive()
104
+ .optional()
105
+ .describe("Maximum events to return (default 50, cap 200)."),
106
+ });
107
+ // ---------------------------------------------------------------------------
108
+ // Helpers (exported for the CLI command and tests)
109
+ // ---------------------------------------------------------------------------
110
+ function clampInt(value, min, max) {
111
+ return Math.min(max, Math.max(min, Math.round(value)));
112
+ }
113
+ /** Trim, drop empties, dedupe, keep order. */
114
+ export function normalizeKinds(kinds) {
115
+ const out = [];
116
+ for (const raw of kinds ?? []) {
117
+ const kind = raw.trim();
118
+ if (kind && !out.includes(kind))
119
+ out.push(kind);
120
+ }
121
+ return out;
122
+ }
123
+ /**
124
+ * Refuse kinds the engine cannot emit — waiting on one would only time out.
125
+ * Decidable only when the engine advertises `capabilities.events.kinds`; an
126
+ * engine without the list lets every kind through (forward-compatible with
127
+ * kinds newer than this CLI).
128
+ */
129
+ export function unknownKindsFailure(kinds, client) {
130
+ const advertised = typeof client.getEngineCapabilities === "function"
131
+ ? client.getEngineCapabilities()?.events?.kinds
132
+ : undefined;
133
+ if (!advertised || advertised.length === 0)
134
+ return null;
135
+ const known = new Set(advertised);
136
+ const unknown = kinds.filter((kind) => !known.has(kind));
137
+ if (unknown.length === 0)
138
+ return null;
139
+ return {
140
+ ok: false,
141
+ failure_reason: "unknown_event_kind",
142
+ unknown_kinds: unknown,
143
+ known_kinds: [...advertised],
144
+ error: `This Summer Engine build does not emit event kind(s) ${unknown.join(", ")} — nothing was sent (waiting would only time out). ` +
145
+ `Kinds it emits: ${advertised.join(", ")}.`,
146
+ };
147
+ }
148
+ /** Shape-tolerant read of a poll envelope: ring events need a numeric seq and
149
+ * a string kind; sys.* frames are split out (they may carry no seq). */
150
+ export function parsePollPage(raw) {
151
+ const record = asRecord(raw) ?? {};
152
+ const events = [];
153
+ const frames = [];
154
+ if (Array.isArray(record.events)) {
155
+ for (const entry of record.events) {
156
+ const item = asRecord(entry);
157
+ const kind = item ? stringFrom(item.kind) : undefined;
158
+ if (!item || !kind)
159
+ continue;
160
+ if (kind.startsWith("sys.")) {
161
+ frames.push({ kind, data: item.data });
162
+ continue;
163
+ }
164
+ const seq = numberFrom(item.seq);
165
+ if (seq === undefined)
166
+ continue;
167
+ const event = { seq, kind };
168
+ const ts = numberFrom(item.ts);
169
+ if (ts !== undefined)
170
+ event.ts = ts;
171
+ if (item.data !== undefined)
172
+ event.data = item.data;
173
+ events.push(event);
174
+ }
175
+ }
176
+ return {
177
+ events,
178
+ frames,
179
+ next_seq: numberFrom(record.next_seq),
180
+ last_seq: numberFrom(record.last_seq),
181
+ since: numberFrom(record.since),
182
+ truncated: record.truncated === true,
183
+ timed_out: record.timed_out === true,
184
+ };
185
+ }
186
+ /**
187
+ * A poll answer that is a structured failure, or null on a 2xx envelope. The
188
+ * post-hoc twin of the missingEngineEventsResult pre-flight: an engine that
189
+ * answers HTTP 404 for the poll route has no channel (reachable only with
190
+ * SUMMER_CAPABILITY_PREFLIGHT=off, or an advert that lies), so the answer is
191
+ * rewritten into the same engine_lacks_events shape the pre-flight returns.
192
+ */
193
+ export function eventsFailure(page, client) {
194
+ const record = asRecord(page);
195
+ if (!record) {
196
+ return {
197
+ ok: false,
198
+ failure_reason: "malformed_events_envelope",
199
+ error: "Summer Engine answered the events poll with a non-object body; nothing can be read from it.",
200
+ };
201
+ }
202
+ if (record.ok !== false)
203
+ return null;
204
+ if (record.http_status === 404) {
205
+ const version = typeof client.getEngineVersion === "function" ? client.getEngineVersion() : undefined;
206
+ const missing = buildMissingEventsResult(version ?? null);
207
+ return {
208
+ ...record,
209
+ ok: false,
210
+ failure_reason: missing.failure_reason,
211
+ engine_version: missing.engine_version,
212
+ hint: missing.hint,
213
+ error: "This Summer Engine build doesn't expose the events channel yet (GET /api/events/poll answered HTTP 404) — " +
214
+ `${EVENTS_FALLBACK}, or update Summer Engine (restart it after updating).`,
215
+ };
216
+ }
217
+ return record;
218
+ }
219
+ /** op.* events match only when data.requestId equals the requested id; every
220
+ * other kind passes. */
221
+ export function selectMatches(events, requestId) {
222
+ if (!requestId)
223
+ return [...events];
224
+ return events.filter((event) => {
225
+ if (!event.kind.startsWith("op."))
226
+ return true;
227
+ return asRecord(event.data)?.requestId === requestId;
228
+ });
229
+ }
230
+ function gapOf(frames) {
231
+ return frames.find((frame) => frame.kind === "sys.gap")?.data;
232
+ }
233
+ function maxSeq(events) {
234
+ let max;
235
+ for (const event of events)
236
+ if (max === undefined || event.seq > max)
237
+ max = event.seq;
238
+ return max;
239
+ }
240
+ // ---------------------------------------------------------------------------
241
+ // summer_wait_for_event
242
+ // ---------------------------------------------------------------------------
243
+ /**
244
+ * Long-poll the engine in slices of at most POLL_SLICE_MS until an event
245
+ * passes the kinds + match filters, or timeout_seconds elapses. Every poll
246
+ * feeds the engine's next_seq back as `since`, so nothing between slices is
247
+ * skipped; sys.gap frames are surfaced (never counted as a match).
248
+ */
249
+ export async function waitForEvent(client, args, deps = {}) {
250
+ const now = deps.now ?? (() => Date.now());
251
+ const sleep = deps.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
252
+ const kinds = normalizeKinds(args.kinds);
253
+ const unknown = unknownKindsFailure(kinds, client);
254
+ if (unknown)
255
+ return unknown;
256
+ const timeoutSeconds = clampInt(args.timeout_seconds ?? WAIT_DEFAULT_SECONDS, WAIT_MIN_SECONDS, WAIT_MAX_SECONDS);
257
+ const maxEvents = clampInt(args.max_events ?? WAIT_MAX_EVENTS_DEFAULT, 1, POLL_LIMIT_CAP);
258
+ const requestId = args.match?.requestId?.trim() || undefined;
259
+ const kindsParam = kinds.length > 0 ? kinds : undefined;
260
+ const start = now();
261
+ const deadline = start + timeoutSeconds * 1000;
262
+ let since = args.since;
263
+ let resolvedSince = args.since ?? null;
264
+ let polls = 0;
265
+ let gap;
266
+ for (;;) {
267
+ const remaining = deadline - now();
268
+ if (remaining <= 0)
269
+ break;
270
+ const wait = Math.min(POLL_SLICE_MS, remaining);
271
+ const pollStart = now();
272
+ const page = await client.pollEvents({ since, kinds: kindsParam, wait, limit: maxEvents });
273
+ const held = now() - pollStart;
274
+ polls += 1;
275
+ const failure = eventsFailure(page, client);
276
+ if (failure)
277
+ return failure;
278
+ const parsed = parsePollPage(page);
279
+ if (resolvedSince === null && parsed.since !== undefined)
280
+ resolvedSince = parsed.since;
281
+ const frameGap = gapOf(parsed.frames);
282
+ if (frameGap !== undefined)
283
+ gap = frameGap;
284
+ const advanced = parsed.next_seq ?? maxSeq(parsed.events);
285
+ if (advanced !== undefined)
286
+ since = advanced;
287
+ const matched = selectMatches(parsed.events, requestId).slice(0, maxEvents);
288
+ if (matched.length > 0) {
289
+ return {
290
+ ok: true,
291
+ matched: true,
292
+ events: matched,
293
+ next_seq: since ?? null,
294
+ since: resolvedSince,
295
+ timed_out: false,
296
+ waited_ms: now() - start,
297
+ polls,
298
+ kinds: kinds.length > 0 ? kinds : "all",
299
+ ...(requestId ? { match: { requestId } } : {}),
300
+ ...(gap !== undefined ? { gap } : {}),
301
+ ...(parsed.truncated ? { truncated: true } : {}),
302
+ };
303
+ }
304
+ // A zero-event answer that returned before its hold elapsed must not spin
305
+ // the loop (the flag is not trusted; the clock is).
306
+ if (parsed.events.length === 0 && held < wait)
307
+ await sleep(Math.min(PACING_MS, wait - held));
308
+ }
309
+ return {
310
+ ok: true,
311
+ matched: false,
312
+ events: [],
313
+ next_seq: since ?? null,
314
+ since: resolvedSince,
315
+ timed_out: true,
316
+ waited_ms: now() - start,
317
+ polls,
318
+ kinds: kinds.length > 0 ? kinds : "all",
319
+ ...(requestId ? { match: { requestId } } : {}),
320
+ ...(gap !== undefined ? { gap } : {}),
321
+ hint: `No matching event arrived within ${timeoutSeconds}s. This is not evidence that it did not happen: ` +
322
+ "an event that fired before `since` is never delivered (take a cursor with summer_recent_events BEFORE triggering the action next time). " +
323
+ "Verify the state directly (summer_is_running, summer_get_diagnostics, summer_get_scene_tree) and never claim an event you did not receive. " +
324
+ "To keep waiting without a gap, call again with since = next_seq.",
325
+ };
326
+ }
327
+ // ---------------------------------------------------------------------------
328
+ // summer_recent_events
329
+ // ---------------------------------------------------------------------------
330
+ /**
331
+ * One zero-wait read. `since` given: everything after it (paged by limit).
332
+ * `since` omitted: the newest `limit` sequence numbers — the poll route has no
333
+ * "tail" mode, so this costs two zero-wait calls (learn last_seq, then read
334
+ * from last_seq - limit). `since: 0` pages the retained ring from the oldest.
335
+ */
336
+ export async function recentEvents(client, args) {
337
+ const kinds = normalizeKinds(args.kinds);
338
+ const unknown = unknownKindsFailure(kinds, client);
339
+ if (unknown)
340
+ return unknown;
341
+ const limit = clampInt(args.limit ?? RECENT_LIMIT_DEFAULT, 1, RECENT_LIMIT_CAP);
342
+ const kindsParam = kinds.length > 0 ? kinds : undefined;
343
+ let since = args.since;
344
+ let window = since === undefined ? "newest" : since === 0 ? "ring" : "since";
345
+ if (since === undefined) {
346
+ // Live-only head read: zero events, but the newest seq.
347
+ const head = await client.pollEvents({ wait: 0, limit: 1 });
348
+ const headFailure = eventsFailure(head, client);
349
+ if (headFailure)
350
+ return headFailure;
351
+ const parsedHead = parsePollPage(head);
352
+ const newest = parsedHead.last_seq ?? parsedHead.next_seq;
353
+ if (newest === undefined) {
354
+ since = 0;
355
+ window = "ring";
356
+ }
357
+ else {
358
+ since = Math.max(0, newest - limit);
359
+ }
360
+ }
361
+ const page = await client.pollEvents({ since, kinds: kindsParam, wait: 0, limit });
362
+ const failure = eventsFailure(page, client);
363
+ if (failure)
364
+ return failure;
365
+ const parsed = parsePollPage(page);
366
+ const nextSeq = parsed.next_seq ?? maxSeq(parsed.events) ?? since;
367
+ const gap = gapOf(parsed.frames);
368
+ return {
369
+ ok: true,
370
+ events: parsed.events,
371
+ count: parsed.events.length,
372
+ next_seq: nextSeq ?? null,
373
+ last_seq: parsed.last_seq ?? null,
374
+ since: parsed.since ?? since ?? null,
375
+ window,
376
+ truncated: parsed.truncated,
377
+ kinds: kinds.length > 0 ? kinds : "all",
378
+ ...(gap !== undefined ? { gap } : {}),
379
+ hint: "Pass next_seq as `since` to summer_wait_for_event BEFORE triggering the action you will wait on, or back to this tool to read what arrived since. " +
380
+ "The engine retains 512 events / 10 minutes — an empty result is not proof nothing happened earlier." +
381
+ (parsed.truncated ? " truncated:true — this page was full; pass next_seq back as since for the rest." : ""),
382
+ };
383
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Mesh-fabrication op builder (tool/fabricate-3d -> engine op FabricateMesh).
3
+ * Shared by the MCP tool (summer_fabricate_3d) and the CLI dispatcher
4
+ * (`summer tool fabricate-3d`) so both faces validate the same arguments, send
5
+ * the same op with the same clamps, and wait the same client poll budget.
6
+ *
7
+ * What the op does on the engine side (fabricate_ops.cpp, mesh fabrication): run one
8
+ * agent-authored bpy script in a supervised headless child of the USER'S OWN
9
+ * Blender install, validate the .glb the child exported, move it under res://,
10
+ * wait for the editor import to settle, and optionally instantiate it into the
11
+ * edited scene. This package never spawns Blender, never imports bpy, and
12
+ * never downloads or bundles Blender — it only sends the op. "Blender" appears
13
+ * in user-facing text only as the name of the dependency.
14
+ *
15
+ * Server-side clamps mirrored here: 15..600 s, default 120 — the budget covers
16
+ * Blender boot + the script + procedural-colour bakes + export, so the floor is
17
+ * the same as RunEditorScript's child-editor floor.
18
+ */
19
+ import { z } from "zod";
20
+ export declare const FABRICATE_MIN_SECONDS = 15;
21
+ export declare const FABRICATE_MAX_SECONDS = 600;
22
+ export declare const FABRICATE_DEFAULT_SECONDS = 120;
23
+ /** Client poll headroom beyond the engine's own budget: the res:// move, the
24
+ * import settle-wait and InstantiateScene all run AFTER the child exits. */
25
+ export declare const FABRICATE_CLIENT_HEADROOM_MS = 60000;
26
+ /** Where the engine writes the .glb when out_path is omitted. */
27
+ export declare const FABRICATE_DEFAULT_OUT_DIR = "res://assets/fabricated/";
28
+ /** What the tool tells the model to do when the engine lacks FabricateMesh. */
29
+ export declare const FABRICATE_FALLBACK = "generate the asset with summer_generate_3d, import one from the free library with summer_search_assets / summer_import_asset, use summer_import_hdri for environment lighting, or build blockout geometry in-scene with summer_add_node / summer_set_prop or a summer_run_editor_script";
30
+ /**
31
+ * Mirror of the engine's out_path pre-validation (fabricate_ops.cpp
32
+ * _resolve_out_path) so a bad destination is refused on this side with the
33
+ * same words, and nothing is sent. Returns null when the path is acceptable.
34
+ */
35
+ export declare function fabricateOutPathProblem(rawPath: string): string | null;
36
+ /**
37
+ * The one input contract for summer_fabricate_3d, shared by the MCP tool
38
+ * (pass `.shape` to server.tool) and the CLI dispatcher (`summer tool
39
+ * fabricate-3d`) so both faces reject the same inputs with the same message.
40
+ */
41
+ export declare const fabricateArgsSchema: z.ZodObject<{
42
+ source: z.ZodString;
43
+ name: z.ZodString;
44
+ out_path: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
45
+ target_size: z.ZodOptional<z.ZodNumber>;
46
+ import_to_scene: z.ZodOptional<z.ZodObject<{
47
+ parent: z.ZodString;
48
+ position: z.ZodOptional<z.ZodString>;
49
+ }, "strip", z.ZodTypeAny, {
50
+ parent: string;
51
+ position?: string | undefined;
52
+ }, {
53
+ parent: string;
54
+ position?: string | undefined;
55
+ }>>;
56
+ max_seconds: z.ZodOptional<z.ZodNumber>;
57
+ checkpoint: z.ZodOptional<z.ZodBoolean>;
58
+ blender_path: z.ZodOptional<z.ZodString>;
59
+ }, "strip", z.ZodTypeAny, {
60
+ source: string;
61
+ name: string;
62
+ out_path?: string | undefined;
63
+ target_size?: number | undefined;
64
+ import_to_scene?: {
65
+ parent: string;
66
+ position?: string | undefined;
67
+ } | undefined;
68
+ max_seconds?: number | undefined;
69
+ checkpoint?: boolean | undefined;
70
+ blender_path?: string | undefined;
71
+ }, {
72
+ source: string;
73
+ name: string;
74
+ out_path?: string | undefined;
75
+ target_size?: number | undefined;
76
+ import_to_scene?: {
77
+ parent: string;
78
+ position?: string | undefined;
79
+ } | undefined;
80
+ max_seconds?: number | undefined;
81
+ checkpoint?: boolean | undefined;
82
+ blender_path?: string | undefined;
83
+ }>;
84
+ export interface FabricateImportToScene {
85
+ parent: string;
86
+ position?: string;
87
+ }
88
+ export interface FabricateMeshArgs {
89
+ source: string;
90
+ name: string;
91
+ out_path?: string;
92
+ target_size?: number;
93
+ import_to_scene?: FabricateImportToScene;
94
+ max_seconds?: number;
95
+ checkpoint?: boolean;
96
+ blender_path?: string;
97
+ }
98
+ export interface BuiltFabricateOp {
99
+ op: Record<string, unknown>;
100
+ /** Client poll budget — MUST outlive the engine's own max_seconds plus the
101
+ * main-thread finalizer (move, import settle, instantiate), or a long but
102
+ * successful fabrication is reported as timed_out client-side. */
103
+ timeoutMs: number;
104
+ }
105
+ /**
106
+ * Build the single FabricateMesh op (+ client budget) from validated args.
107
+ * Re-checks the pre-apply invariants so a caller that bypasses the zod schema
108
+ * still cannot send a bad destination or an unusable script: every throw here
109
+ * is a ToolInputError, classified as "nothing was sent" by both faces.
110
+ */
111
+ export declare function buildFabricateMeshOp(args: FabricateMeshArgs): BuiltFabricateOp;
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Mesh-fabrication op builder (tool/fabricate-3d -> engine op FabricateMesh).
3
+ * Shared by the MCP tool (summer_fabricate_3d) and the CLI dispatcher
4
+ * (`summer tool fabricate-3d`) so both faces validate the same arguments, send
5
+ * the same op with the same clamps, and wait the same client poll budget.
6
+ *
7
+ * What the op does on the engine side (fabricate_ops.cpp, mesh fabrication): run one
8
+ * agent-authored bpy script in a supervised headless child of the USER'S OWN
9
+ * Blender install, validate the .glb the child exported, move it under res://,
10
+ * wait for the editor import to settle, and optionally instantiate it into the
11
+ * edited scene. This package never spawns Blender, never imports bpy, and
12
+ * never downloads or bundles Blender — it only sends the op. "Blender" appears
13
+ * in user-facing text only as the name of the dependency.
14
+ *
15
+ * Server-side clamps mirrored here: 15..600 s, default 120 — the budget covers
16
+ * Blender boot + the script + procedural-colour bakes + export, so the floor is
17
+ * the same as RunEditorScript's child-editor floor.
18
+ */
19
+ import { z } from "zod";
20
+ import { ToolInputError } from "../tool-errors.js";
21
+ export const FABRICATE_MIN_SECONDS = 15;
22
+ export const FABRICATE_MAX_SECONDS = 600;
23
+ export const FABRICATE_DEFAULT_SECONDS = 120;
24
+ /** Client poll headroom beyond the engine's own budget: the res:// move, the
25
+ * import settle-wait and InstantiateScene all run AFTER the child exits. */
26
+ export const FABRICATE_CLIENT_HEADROOM_MS = 60_000;
27
+ /** Where the engine writes the .glb when out_path is omitted. */
28
+ export const FABRICATE_DEFAULT_OUT_DIR = "res://assets/fabricated/";
29
+ /** What the tool tells the model to do when the engine lacks FabricateMesh. */
30
+ export const FABRICATE_FALLBACK = "generate the asset with summer_generate_3d, import one from the free library with summer_search_assets / summer_import_asset, use summer_import_hdri for environment lighting, or build blockout geometry in-scene with summer_add_node / summer_set_prop or a summer_run_editor_script";
31
+ const VECTOR3_VARIANT_RE = /^Vector3\(\s*[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?\s*,\s*[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?\s*,\s*[-+]?(?:\d+\.?\d*|\.\d+)(?:[eE][-+]?\d+)?\s*\)$/;
32
+ /**
33
+ * Mirror of the engine's out_path pre-validation (fabricate_ops.cpp
34
+ * _resolve_out_path) so a bad destination is refused on this side with the
35
+ * same words, and nothing is sent. Returns null when the path is acceptable.
36
+ */
37
+ export function fabricateOutPathProblem(rawPath) {
38
+ const path = rawPath.trim().replace(/\\/g, "/");
39
+ if (!path.startsWith("res://"))
40
+ return `out_path must start with res:// (got '${path}').`;
41
+ if (!/\.glb$/i.test(path)) {
42
+ return "out_path must end in .glb; the fabricator exports binary glTF which the engine imports as a scene.";
43
+ }
44
+ const parts = path.slice("res://".length).split("/").filter((part) => part.length > 0);
45
+ if (parts.length < 1)
46
+ return "out_path must name a file under res://.";
47
+ for (const part of parts) {
48
+ if (part === "..")
49
+ return "out_path may not contain '..'.";
50
+ if (part.startsWith(".")) {
51
+ return `out_path may not point into a hidden directory or file (the editor never imports those): ${path}`;
52
+ }
53
+ }
54
+ return null;
55
+ }
56
+ /**
57
+ * The one input contract for summer_fabricate_3d, shared by the MCP tool
58
+ * (pass `.shape` to server.tool) and the CLI dispatcher (`summer tool
59
+ * fabricate-3d`) so both faces reject the same inputs with the same message.
60
+ */
61
+ export const fabricateArgsSchema = z.object({
62
+ source: z
63
+ .string()
64
+ .min(1)
65
+ .describe("Blender Python (bpy) code that CREATES mesh objects and leaves them linked in the scene. Do not export — the engine exports the .glb for you. Pre-bound names: bpy, bmesh, mathutils, math, Vector, Matrix, Euler."),
66
+ name: z
67
+ .string()
68
+ .min(1)
69
+ .describe("Asset name — used for the default out_path (res://assets/fabricated/<name>.glb) and for the instantiated node. Sanitized by the engine to [A-Za-z0-9_-]."),
70
+ out_path: z
71
+ .string()
72
+ .superRefine((value, ctx) => {
73
+ const problem = fabricateOutPathProblem(value);
74
+ if (problem)
75
+ ctx.addIssue({ code: z.ZodIssueCode.custom, message: problem });
76
+ })
77
+ .optional()
78
+ .describe("Destination res:// path ending in .glb (default res://assets/fabricated/<name>.glb). An existing file is overwritten; '..' and hidden directories are refused."),
79
+ target_size: z
80
+ .number()
81
+ .positive()
82
+ .optional()
83
+ .describe("Largest world-AABB dimension in units after instantiation — uniform scale, same rule as summer_instantiate_scene target_size (chair 1.0, car 4.5). Only used together with import_to_scene."),
84
+ import_to_scene: z
85
+ .object({
86
+ parent: z
87
+ .string()
88
+ .describe("Parent node path in the CURRENTLY OPEN scene, e.g. '/' (scene root) or './World'."),
89
+ position: z
90
+ .string()
91
+ .regex(VECTOR3_VARIANT_RE, "position must be a 'Vector3(x, y, z)' variant string")
92
+ .optional()
93
+ .describe("Optional local position as the engine variant string 'Vector3(x, y, z)'."),
94
+ })
95
+ .optional()
96
+ .describe("Instantiate the imported .glb into the currently open scene after import (one undo action). Omit to only write and import the file."),
97
+ max_seconds: z
98
+ .number()
99
+ .optional()
100
+ .describe("Child budget in seconds (default 120, clamped 15-600): Blender boot + script + procedural-colour bakes + export. Raise it for heavy booleans or bakes; the client waits max_seconds + 60 s."),
101
+ checkpoint: z
102
+ .boolean()
103
+ .optional()
104
+ .describe("Take a SummerGit checkpoint before the child runs (default false). The result confesses (no_rewind_point) when none could be taken."),
105
+ blender_path: z
106
+ .string()
107
+ .optional()
108
+ .describe("Explicit Blender executable. Pass only when the user named one; otherwise the engine resolves SUMMER_BLENDER_BIN, the editor setting filesystem/import/blender/blender_path, then PATH and well-known install locations."),
109
+ });
110
+ function clamp(value, min, max) {
111
+ return Math.min(max, Math.max(min, Math.round(value)));
112
+ }
113
+ /**
114
+ * Build the single FabricateMesh op (+ client budget) from validated args.
115
+ * Re-checks the pre-apply invariants so a caller that bypasses the zod schema
116
+ * still cannot send a bad destination or an unusable script: every throw here
117
+ * is a ToolInputError, classified as "nothing was sent" by both faces.
118
+ */
119
+ export function buildFabricateMeshOp(args) {
120
+ if (typeof args.source !== "string" || args.source.trim().length === 0) {
121
+ throw new ToolInputError("source is required: bpy code that creates mesh objects and leaves them linked in the scene (the engine exports them).");
122
+ }
123
+ if (typeof args.name !== "string" || args.name.trim().length === 0) {
124
+ throw new ToolInputError("name is required: it names the .glb (res://assets/fabricated/<name>.glb) and the instantiated node.");
125
+ }
126
+ const budgetSeconds = clamp(typeof args.max_seconds === "number" && Number.isFinite(args.max_seconds)
127
+ ? args.max_seconds
128
+ : FABRICATE_DEFAULT_SECONDS, FABRICATE_MIN_SECONDS, FABRICATE_MAX_SECONDS);
129
+ const op = {
130
+ op: "FabricateMesh",
131
+ script_source: args.source,
132
+ name: args.name.trim(),
133
+ max_seconds: budgetSeconds,
134
+ };
135
+ if (typeof args.out_path === "string" && args.out_path.trim().length > 0) {
136
+ const problem = fabricateOutPathProblem(args.out_path);
137
+ if (problem)
138
+ throw new ToolInputError(problem);
139
+ op.out_path = args.out_path.trim().replace(/\\/g, "/");
140
+ }
141
+ if (args.target_size !== undefined) {
142
+ if (typeof args.target_size !== "number" || !Number.isFinite(args.target_size) || args.target_size <= 0) {
143
+ throw new ToolInputError("target_size must be a positive number (largest AABB dimension after instantiation).");
144
+ }
145
+ op.target_size = args.target_size;
146
+ }
147
+ if (args.import_to_scene !== undefined) {
148
+ const spec = args.import_to_scene;
149
+ const parent = typeof spec.parent === "string" && spec.parent.trim().length > 0 ? spec.parent.trim() : "/";
150
+ const importSpec = { parent };
151
+ if (spec.position !== undefined) {
152
+ if (typeof spec.position !== "string" || !VECTOR3_VARIANT_RE.test(spec.position.trim())) {
153
+ throw new ToolInputError(`import_to_scene.position must be a 'Vector3(x, y, z)' variant string (got ${JSON.stringify(spec.position)}).`);
154
+ }
155
+ importSpec.position = spec.position.trim();
156
+ }
157
+ op.import_to_scene = importSpec;
158
+ }
159
+ if (args.checkpoint !== undefined)
160
+ op.checkpoint = args.checkpoint;
161
+ if (typeof args.blender_path === "string" && args.blender_path.trim().length > 0) {
162
+ op.blender_path = args.blender_path.trim();
163
+ }
164
+ return { op, timeoutMs: budgetSeconds * 1000 + FABRICATE_CLIENT_HEADROOM_MS };
165
+ }