summer-engine 2.8.2 → 3.1.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 (790) 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 +149 -44
  11. package/CLAUDE.md +4 -2
  12. package/GEMINI.md +7 -53
  13. package/NOTICE +31 -0
  14. package/README.md +161 -393
  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/cli/commands/setup.js +158 -0
  49. package/dist/{commands → cli/commands}/skills.js +121 -251
  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 +55 -0
  167. package/dist/core/skills-registry.js +106 -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/installer/agent-config.d.ts +63 -0
  188. package/dist/installer/agent-config.js +540 -0
  189. package/dist/installer/agent-table.d.ts +103 -0
  190. package/dist/installer/agent-table.js +584 -0
  191. package/dist/installer/legacy-skills.d.ts +26 -0
  192. package/dist/installer/legacy-skills.js +53 -0
  193. package/dist/installer/setup.d.ts +76 -0
  194. package/dist/installer/setup.js +148 -0
  195. package/dist/installer/skill-locations.d.ts +36 -0
  196. package/dist/installer/skill-locations.js +91 -0
  197. package/dist/installer/version-check.d.ts +178 -0
  198. package/dist/installer/version-check.js +479 -0
  199. package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
  200. package/dist/{commands/mcp.js → mcp/command.js} +18 -6
  201. package/dist/mcp/server.d.ts +23 -3
  202. package/dist/mcp/server.js +122 -28
  203. package/dist/mcp/tools/asset-tools.js +62 -142
  204. package/dist/mcp/tools/creator-tools.js +5 -23
  205. package/dist/mcp/tools/debug-tools.js +61 -18
  206. package/dist/mcp/tools/event-tools.d.ts +14 -0
  207. package/dist/mcp/tools/event-tools.js +41 -0
  208. package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
  209. package/dist/mcp/tools/fabricate-tools.js +28 -0
  210. package/dist/mcp/tools/feedback-tools.d.ts +77 -0
  211. package/dist/mcp/tools/feedback-tools.js +88 -0
  212. package/dist/mcp/tools/file-tools.js +6 -53
  213. package/dist/mcp/tools/generate-tools.js +37 -63
  214. package/dist/mcp/tools/library-tools.d.ts +11 -0
  215. package/dist/mcp/tools/library-tools.js +42 -0
  216. package/dist/mcp/tools/navigation-tools.d.ts +7 -0
  217. package/dist/mcp/tools/navigation-tools.js +37 -0
  218. package/dist/mcp/tools/perception-tools.d.ts +20 -0
  219. package/dist/mcp/tools/perception-tools.js +146 -0
  220. package/dist/mcp/tools/project-tools.d.ts +14 -0
  221. package/dist/mcp/tools/project-tools.js +72 -281
  222. package/dist/mcp/tools/runtime-tools.d.ts +2 -0
  223. package/dist/mcp/tools/runtime-tools.js +92 -0
  224. package/dist/mcp/tools/scene-tools.d.ts +3 -0
  225. package/dist/mcp/tools/scene-tools.js +68 -119
  226. package/dist/mcp/tools/script-tools.d.ts +3 -0
  227. package/dist/mcp/tools/script-tools.js +118 -0
  228. package/dist/mcp/tools/spatial-tools.d.ts +2 -0
  229. package/dist/mcp/tools/spatial-tools.js +485 -0
  230. package/dist/mcp/tools/text-json.d.ts +8 -0
  231. package/dist/mcp/tools/text-json.js +12 -0
  232. package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
  233. package/dist/mcp/tools/ui-tools.js +82 -0
  234. package/dist/mcp/tools/visual-tools.d.ts +2 -7
  235. package/dist/mcp/tools/visual-tools.js +383 -101
  236. package/dist/mcp/tools/with-engine.d.ts +9 -15
  237. package/dist/mcp/tools/with-engine.js +60 -96
  238. package/dist/project-memory/project-manifest.d.ts +36 -0
  239. package/dist/project-memory/project-manifest.js +50 -0
  240. package/dist/project-memory/project-memory.d.ts +57 -0
  241. package/dist/{lib → project-memory}/project-memory.js +46 -0
  242. package/gemini-extension.json +103 -2
  243. package/hooks/hooks-cursor.json +2 -2
  244. package/hooks/hooks.json +2 -1
  245. package/hooks/pre-commit-doctor.sh +45 -39
  246. package/hooks/run-hook.cmd +30 -23
  247. package/hooks/run-hook.sh +20 -0
  248. package/hooks/session-start.sh +18 -7
  249. package/integrations/README.md +99 -0
  250. package/integrations/amp/README.md +12 -0
  251. package/integrations/amp/manifest-target.json +3 -0
  252. package/integrations/antigravity/README.md +12 -0
  253. package/integrations/antigravity/manifest-target.json +3 -0
  254. package/integrations/claude/README.md +19 -0
  255. package/integrations/claude/manifest-target.json +16 -0
  256. package/integrations/claude-desktop/README.md +12 -0
  257. package/integrations/claude-desktop/manifest-target.json +3 -0
  258. package/integrations/cline/README.md +12 -0
  259. package/integrations/cline/manifest-target.json +3 -0
  260. package/integrations/cline-cli/README.md +12 -0
  261. package/integrations/cline-cli/manifest-target.json +3 -0
  262. package/integrations/codex/README.md +15 -0
  263. package/integrations/codex/manifest-target.json +5 -0
  264. package/integrations/copilot-jetbrains/README.md +12 -0
  265. package/integrations/copilot-jetbrains/manifest-target.json +3 -0
  266. package/integrations/crush/README.md +12 -0
  267. package/integrations/crush/manifest-target.json +3 -0
  268. package/integrations/cursor/README.md +16 -0
  269. package/integrations/cursor/manifest-target.json +5 -0
  270. package/integrations/factory/README.md +26 -0
  271. package/integrations/factory/manifest-target.json +5 -0
  272. package/integrations/gemini/README.md +26 -0
  273. package/integrations/gemini/manifest-target.json +5 -0
  274. package/integrations/github-copilot/README.md +12 -0
  275. package/integrations/github-copilot/manifest-target.json +3 -0
  276. package/integrations/goose/README.md +12 -0
  277. package/integrations/goose/manifest-target.json +3 -0
  278. package/integrations/grok-build/README.md +12 -0
  279. package/integrations/grok-build/manifest-target.json +3 -0
  280. package/integrations/hermes/README.md +12 -0
  281. package/integrations/hermes/manifest-target.json +3 -0
  282. package/integrations/junie/README.md +12 -0
  283. package/integrations/junie/manifest-target.json +3 -0
  284. package/integrations/kilo-code/README.md +12 -0
  285. package/integrations/kilo-code/manifest-target.json +3 -0
  286. package/integrations/kimi-code/README.md +12 -0
  287. package/integrations/kimi-code/manifest-target.json +3 -0
  288. package/integrations/kiro/README.md +12 -0
  289. package/integrations/kiro/manifest-target.json +3 -0
  290. package/integrations/lm-studio/README.md +12 -0
  291. package/integrations/lm-studio/manifest-target.json +3 -0
  292. package/integrations/mistral-vibe/README.md +12 -0
  293. package/integrations/mistral-vibe/manifest-target.json +3 -0
  294. package/integrations/opencode/README.md +12 -0
  295. package/integrations/opencode/manifest-target.json +3 -0
  296. package/integrations/qoder/README.md +12 -0
  297. package/integrations/qoder/manifest-target.json +3 -0
  298. package/integrations/qwen-code/README.md +12 -0
  299. package/integrations/qwen-code/manifest-target.json +3 -0
  300. package/integrations/roo-code/README.md +14 -0
  301. package/integrations/roo-code/manifest-target.json +3 -0
  302. package/integrations/rovo-dev/README.md +12 -0
  303. package/integrations/rovo-dev/manifest-target.json +3 -0
  304. package/integrations/trae/README.md +12 -0
  305. package/integrations/trae/manifest-target.json +3 -0
  306. package/integrations/visual-studio/README.md +12 -0
  307. package/integrations/visual-studio/manifest-target.json +3 -0
  308. package/integrations/vscode-copilot/README.md +12 -0
  309. package/integrations/vscode-copilot/manifest-target.json +3 -0
  310. package/integrations/warp/README.md +12 -0
  311. package/integrations/warp/manifest-target.json +3 -0
  312. package/integrations/windsurf/README.md +12 -0
  313. package/integrations/windsurf/manifest-target.json +3 -0
  314. package/integrations/zed/README.md +12 -0
  315. package/integrations/zed/manifest-target.json +3 -0
  316. package/library/references/collaborative-protocol/resource.yaml +24 -0
  317. package/library/references/gd-style/resource.yaml +24 -0
  318. package/{references → library/references/godot-version}/godot-version.md +6 -6
  319. package/library/references/godot-version/resource.yaml +22 -0
  320. package/library/references/headless-routing/headless-routing.md +46 -0
  321. package/library/references/headless-routing/resource.yaml +24 -0
  322. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
  323. package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
  324. package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
  325. package/library/references/mcp-tools-reference/resource.yaml +17 -0
  326. package/library/references/product-map/product-map.md +103 -0
  327. package/library/references/product-map/resource.yaml +33 -0
  328. package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
  329. package/library/references/public-surface-language/resource.yaml +17 -0
  330. package/library/references/summer-folder/resource.yaml +20 -0
  331. package/{references → library/references/summer-folder}/summer-folder.md +22 -21
  332. package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
  333. package/library/skills/3d-lighting/resource.yaml +27 -0
  334. package/library/skills/README.md +242 -0
  335. package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
  336. package/library/skills/adaptive-music/resource.yaml +28 -0
  337. package/library/skills/agent-playtesting/SKILL.md +148 -0
  338. package/library/skills/agent-playtesting/resource.yaml +52 -0
  339. package/library/skills/ambient-bed/resource.yaml +24 -0
  340. package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
  341. package/library/skills/animated-loop/resource.yaml +27 -0
  342. package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
  343. package/library/skills/animation-tree/resource.yaml +33 -0
  344. package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
  345. package/library/skills/art-direction/resource.yaml +29 -0
  346. package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
  347. package/library/skills/asset-strategy/resource.yaml +63 -0
  348. package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
  349. package/library/skills/audio-direction/resource.yaml +32 -0
  350. package/library/skills/auto-fire-targeting/resource.yaml +22 -0
  351. package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
  352. package/library/skills/brainstorm-game/resource.yaml +30 -0
  353. package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
  354. package/library/skills/brainstorming/resource.yaml +23 -0
  355. package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
  356. package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
  357. package/library/skills/browse-templates/resource.yaml +23 -0
  358. package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
  359. package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
  360. package/library/skills/character-animation-wiring/SKILL.md +249 -0
  361. package/library/skills/character-animation-wiring/resource.yaml +39 -0
  362. package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
  363. package/library/skills/character-model/resource.yaml +36 -0
  364. package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
  365. package/library/skills/character-portrait/resource.yaml +30 -0
  366. package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
  367. package/library/skills/cinematic-cutscene/resource.yaml +29 -0
  368. package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
  369. package/library/skills/concept-art/resource.yaml +34 -0
  370. package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
  371. package/library/skills/create-asset-sheet/resource.yaml +33 -0
  372. package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
  373. package/library/skills/debug/resource.yaml +31 -0
  374. package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
  375. package/library/skills/debugging-game-feel/resource.yaml +25 -0
  376. package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
  377. package/library/skills/design-level/resource.yaml +31 -0
  378. package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
  379. package/library/skills/design-mechanic/resource.yaml +31 -0
  380. package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
  381. package/library/skills/design-npc/resource.yaml +29 -0
  382. package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
  383. package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
  384. package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
  385. package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
  386. package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
  387. package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
  388. package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
  389. package/library/skills/environment-kit/resource.yaml +29 -0
  390. package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
  391. package/library/skills/export-and-ship/resource.yaml +32 -0
  392. package/library/skills/fabricating-assets/SKILL.md +195 -0
  393. package/library/skills/fabricating-assets/resource.yaml +52 -0
  394. package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
  395. package/library/skills/facial-and-lipsync/resource.yaml +36 -0
  396. package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
  397. package/library/skills/fps-controller/resource.yaml +29 -0
  398. package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
  399. package/library/skills/game-feel/resource.yaml +27 -0
  400. package/library/skills/gameskill/SKILL.md +64 -0
  401. package/library/skills/gameskill/resource.yaml +22 -0
  402. package/library/skills/gdscript-patterns/resource.yaml +23 -0
  403. package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
  404. package/library/skills/generate-motion/resource.yaml +34 -0
  405. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
  406. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
  407. package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
  408. package/library/skills/headless-scripting/resource.yaml +26 -0
  409. package/library/skills/host-authoritative-state/resource.yaml +28 -0
  410. package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
  411. package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
  412. package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
  413. package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
  414. package/library/skills/investigating-bugs/resource.yaml +24 -0
  415. package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
  416. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
  417. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
  418. package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
  419. package/library/skills/make-game/resource.yaml +35 -0
  420. package/library/skills/music-track/resource.yaml +28 -0
  421. package/library/skills/navigate-summer/SKILL.md +61 -0
  422. package/library/skills/navigate-summer/resource.yaml +35 -0
  423. package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
  424. package/library/skills/new-project/resource.yaml +28 -0
  425. package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
  426. package/library/skills/organic-model/resource.yaml +32 -0
  427. package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
  428. package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
  429. package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
  430. package/library/skills/pixel-art/resource.yaml +31 -0
  431. package/library/skills/play/resource.yaml +26 -0
  432. package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
  433. package/library/skills/playtesting-a-feature/resource.yaml +31 -0
  434. package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
  435. package/library/skills/procedural-animation/resource.yaml +33 -0
  436. package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
  437. package/library/skills/prop-model/resource.yaml +33 -0
  438. package/library/skills/psx-retro-rendering/SKILL.md +416 -0
  439. package/library/skills/psx-retro-rendering/resource.yaml +36 -0
  440. package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
  441. package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
  442. package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
  443. package/library/skills/remote-deploy/resource.yaml +23 -0
  444. package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
  445. package/library/skills/retarget/resource.yaml +33 -0
  446. package/library/skills/running-in-the-cloud/SKILL.md +103 -0
  447. package/library/skills/running-in-the-cloud/resource.yaml +33 -0
  448. package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
  449. package/library/skills/scene-composition/resource.yaml +27 -0
  450. package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
  451. package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
  452. package/library/skills/scene-scripting/SKILL.md +764 -0
  453. package/library/skills/scene-scripting/resource.yaml +58 -0
  454. package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
  455. package/library/skills/scene-to-level/resource.yaml +33 -0
  456. package/library/skills/setup-multiplayer/resource.yaml +28 -0
  457. package/library/skills/skill-create/SKILL.md +138 -0
  458. package/library/skills/skill-create/resource.yaml +25 -0
  459. package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
  460. package/library/skills/skill-improve/resource.yaml +25 -0
  461. package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
  462. package/library/skills/skill-test/resource.yaml +26 -0
  463. package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
  464. package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
  465. package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
  466. package/library/skills/skybox-panorama/resource.yaml +28 -0
  467. package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
  468. package/library/skills/sound-effect/resource.yaml +27 -0
  469. package/library/skills/spatial-placement/SKILL.md +74 -0
  470. package/library/skills/spatial-placement/resource.yaml +42 -0
  471. package/library/skills/spatial-placement/tests/spec.md +65 -0
  472. package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
  473. package/library/skills/sprite-sheet/resource.yaml +32 -0
  474. package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
  475. package/library/skills/tileable-texture/resource.yaml +31 -0
  476. package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
  477. package/library/skills/trailer-shot/resource.yaml +27 -0
  478. package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
  479. package/library/skills/tune-performance/resource.yaml +31 -0
  480. package/library/skills/ui-basics/resource.yaml +25 -0
  481. package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
  482. package/library/skills/ui-graphics/resource.yaml +29 -0
  483. package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
  484. package/library/skills/use-widget-asset/resource.yaml +29 -0
  485. package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
  486. package/library/skills/using-summer/resource.yaml +41 -0
  487. package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
  488. package/library/skills/vehicle-model/resource.yaml +34 -0
  489. package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
  490. package/library/skills/verification-before-completion/resource.yaml +23 -0
  491. package/library/skills/verifying-scenes/SKILL.md +98 -0
  492. package/library/skills/verifying-scenes/resource.yaml +42 -0
  493. package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
  494. package/library/skills/vfx-dissolve/resource.yaml +33 -0
  495. package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
  496. package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
  497. package/library/skills/vfx-fire/resource.yaml +35 -0
  498. package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
  499. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
  500. package/library/skills/vfx-hit-spark/resource.yaml +34 -0
  501. package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
  502. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
  503. package/library/skills/vfx-lightning/resource.yaml +33 -0
  504. package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
  505. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
  506. package/library/skills/vfx-magic-glow/resource.yaml +34 -0
  507. package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
  508. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
  509. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
  510. package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
  511. package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
  512. package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
  513. package/library/skills/vfx-smoke/resource.yaml +32 -0
  514. package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
  515. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
  516. package/library/skills/vfx-water-ripple/resource.yaml +31 -0
  517. package/library/skills/voice-line/resource.yaml +27 -0
  518. package/library/skills/world-building-3d/SKILL.md +105 -0
  519. package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
  520. package/library/skills/world-building-3d/resource.yaml +44 -0
  521. package/library/skills/world-building-3d/tests/spec.md +48 -0
  522. package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
  523. package/library/skills/writing-plans/resource.yaml +23 -0
  524. package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
  525. package/library/skills/writing-skills/resource.yaml +29 -0
  526. package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
  527. package/library/templates/2d-brario-platformer/resource.yaml +21 -0
  528. package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
  529. package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
  530. package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
  531. package/library/templates/2d-platformer/resource.yaml +24 -0
  532. package/library/templates/2d-rpg/resource.yaml +21 -0
  533. package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
  534. package/library/templates/3d-basic/resource.yaml +16 -0
  535. package/library/templates/3d-city-kit/resource.yaml +24 -0
  536. package/library/templates/3d-fps-old-school/resource.yaml +21 -0
  537. package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
  538. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
  539. package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
  540. package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
  541. package/library/templates/3d-racing-game/resource.yaml +21 -0
  542. package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
  543. package/library/templates/3d-third-person-controller/resource.yaml +21 -0
  544. package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
  545. package/library/templates/README.md +94 -0
  546. package/library/templates/empty/resource.yaml +16 -0
  547. package/library/tools/add-node/resource.yaml +60 -0
  548. package/library/tools/align-distribute-3d/resource.yaml +87 -0
  549. package/library/tools/api-docs/resource.yaml +57 -0
  550. package/library/tools/batch/resource.yaml +52 -0
  551. package/library/tools/camera-bookmark/resource.yaml +73 -0
  552. package/library/tools/check-job/resource.yaml +45 -0
  553. package/library/tools/clear-console/resource.yaml +40 -0
  554. package/library/tools/connect-signal/resource.yaml +63 -0
  555. package/library/tools/create-debug-report/resource.yaml +67 -0
  556. package/library/tools/create-scene/resource.yaml +59 -0
  557. package/library/tools/creator-config/resource.yaml +63 -0
  558. package/library/tools/creator-publish/resource.yaml +73 -0
  559. package/library/tools/creator-releases/resource.yaml +53 -0
  560. package/library/tools/fabricate-3d/resource.yaml +108 -0
  561. package/library/tools/game-control/resource.yaml +84 -0
  562. package/library/tools/game-input/resource.yaml +159 -0
  563. package/library/tools/game-probe/resource.yaml +90 -0
  564. package/library/tools/generate-3d/resource.yaml +112 -0
  565. package/library/tools/generate-audio/resource.yaml +80 -0
  566. package/library/tools/generate-image/resource.yaml +62 -0
  567. package/library/tools/generate-motion/resource.yaml +66 -0
  568. package/library/tools/generate-video/resource.yaml +66 -0
  569. package/library/tools/get-agent-playbook/resource.yaml +40 -0
  570. package/library/tools/get-asset/resource.yaml +42 -0
  571. package/library/tools/get-asset-download-url/resource.yaml +52 -0
  572. package/library/tools/get-console/resource.yaml +69 -0
  573. package/library/tools/get-debugger-errors/resource.yaml +56 -0
  574. package/library/tools/get-debugger-warnings/resource.yaml +52 -0
  575. package/library/tools/get-diagnostics/resource.yaml +42 -0
  576. package/library/tools/get-project-context/resource.yaml +45 -0
  577. package/library/tools/get-runtime-tree/resource.yaml +62 -0
  578. package/library/tools/get-scene-tree/resource.yaml +52 -0
  579. package/library/tools/get-script-errors/resource.yaml +45 -0
  580. package/library/tools/get-studio-workflow/resource.yaml +43 -0
  581. package/library/tools/import-asset/resource.yaml +73 -0
  582. package/library/tools/import-asset-by-id/resource.yaml +56 -0
  583. package/library/tools/import-from-url/resource.yaml +51 -0
  584. package/library/tools/import-from-url-batch/resource.yaml +60 -0
  585. package/library/tools/import-hdri/resource.yaml +69 -0
  586. package/library/tools/input-map-bind/resource.yaml +52 -0
  587. package/library/tools/inspect-node/resource.yaml +46 -0
  588. package/library/tools/inspect-resource/resource.yaml +45 -0
  589. package/library/tools/inspect-runtime-node/resource.yaml +54 -0
  590. package/library/tools/instantiate-scene/resource.yaml +62 -0
  591. package/library/tools/is-running/resource.yaml +40 -0
  592. package/library/tools/library-feedback/resource.yaml +89 -0
  593. package/library/tools/list-my-assets/resource.yaml +56 -0
  594. package/library/tools/navigation-probe/resource.yaml +85 -0
  595. package/library/tools/open/resource.yaml +80 -0
  596. package/library/tools/open-main-scene/resource.yaml +40 -0
  597. package/library/tools/open-scene/resource.yaml +46 -0
  598. package/library/tools/play/resource.yaml +91 -0
  599. package/library/tools/project-setting/resource.yaml +53 -0
  600. package/library/tools/read-file/resource.yaml +47 -0
  601. package/library/tools/read-library/resource.yaml +67 -0
  602. package/library/tools/recent-events/resource.yaml +71 -0
  603. package/library/tools/remove-node/resource.yaml +51 -0
  604. package/library/tools/replace-node/resource.yaml +57 -0
  605. package/library/tools/replace-text/resource.yaml +61 -0
  606. package/library/tools/run-editor-script/resource.yaml +61 -0
  607. package/library/tools/run-script/resource.yaml +73 -0
  608. package/library/tools/runtime-animate/resource.yaml +140 -0
  609. package/library/tools/runtime-call/resource.yaml +74 -0
  610. package/library/tools/runtime-set/resource.yaml +80 -0
  611. package/library/tools/runtime-spawn/resource.yaml +95 -0
  612. package/library/tools/save-scene/resource.yaml +50 -0
  613. package/library/tools/screenshot/resource.yaml +112 -0
  614. package/library/tools/search-assets/resource.yaml +67 -0
  615. package/library/tools/search-library/resource.yaml +81 -0
  616. package/library/tools/select-node/resource.yaml +48 -0
  617. package/library/tools/set-prop/resource.yaml +64 -0
  618. package/library/tools/set-resource-property/resource.yaml +66 -0
  619. package/library/tools/slice-asset-sheet/resource.yaml +47 -0
  620. package/library/tools/snap-to-surface/resource.yaml +90 -0
  621. package/library/tools/snapshot-diff/resource.yaml +58 -0
  622. package/library/tools/starcast/resource.yaml +120 -0
  623. package/library/tools/start-game-task/resource.yaml +91 -0
  624. package/library/tools/stop/resource.yaml +51 -0
  625. package/library/tools/test-placement/resource.yaml +109 -0
  626. package/library/tools/ui-actions/resource.yaml +77 -0
  627. package/library/tools/ui-activate/resource.yaml +88 -0
  628. package/library/tools/ui-screenshot/resource.yaml +63 -0
  629. package/library/tools/ui-tree/resource.yaml +69 -0
  630. package/library/tools/wait-for-event/resource.yaml +84 -0
  631. package/library/tools/world-snapshot/resource.yaml +60 -0
  632. package/library/tools/write-file/resource.yaml +54 -0
  633. package/package.json +21 -15
  634. package/registry/generated/aliases.json +207 -0
  635. package/registry/generated/counts.json +12 -0
  636. package/registry/generated/gemini-extension.json +122 -0
  637. package/registry/generated/index.json +7709 -0
  638. package/registry/generated/marketplace.claude.json +44 -0
  639. package/registry/generated/mcp.json +13 -0
  640. package/registry/generated/plugin.claude.json +135 -0
  641. package/registry/generated/plugin.codex.json +144 -0
  642. package/registry/generated/plugin.cursor.json +134 -0
  643. package/registry/generated/plugin.factory.json +117 -0
  644. package/registry/generated/skills-index.md +242 -0
  645. package/registry/generated/skills-registry.json +1249 -0
  646. package/registry/generated/templates-registry.json +455 -0
  647. package/registry/schemas/allowed-hosts.json +19 -0
  648. package/registry/schemas/collection.schema.json +68 -0
  649. package/registry/schemas/domains.json +96 -0
  650. package/registry/schemas/example.schema.json +11 -0
  651. package/registry/schemas/reference.schema.json +10 -0
  652. package/registry/schemas/resource.schema.json +154 -0
  653. package/registry/schemas/skill.schema.json +14 -0
  654. package/registry/schemas/template.schema.json +46 -0
  655. package/registry/schemas/tool.schema.json +61 -0
  656. package/_persona/summer/SKILL.md +0 -113
  657. package/dist/bin/postinstall.d.ts +0 -2
  658. package/dist/bin/postinstall.js +0 -3
  659. package/dist/commands/cloud.d.ts +0 -2
  660. package/dist/commands/cloud.js +0 -80
  661. package/dist/commands/create.d.ts +0 -3
  662. package/dist/commands/create.js +0 -171
  663. package/dist/commands/install.d.ts +0 -19
  664. package/dist/commands/install.js +0 -194
  665. package/dist/commands/list.js +0 -67
  666. package/dist/commands/logout.js +0 -13
  667. package/dist/commands/logs.d.ts +0 -2
  668. package/dist/commands/logs.js +0 -19
  669. package/dist/commands/open.d.ts +0 -2
  670. package/dist/commands/open.js +0 -32
  671. package/dist/commands/orchestrator.d.ts +0 -8
  672. package/dist/commands/orchestrator.js +0 -143
  673. package/dist/commands/run.d.ts +0 -2
  674. package/dist/commands/run.js +0 -167
  675. package/dist/commands/setup.js +0 -217
  676. package/dist/commands/status.js +0 -46
  677. package/dist/lib/agent-config.d.ts +0 -39
  678. package/dist/lib/agent-config.js +0 -626
  679. package/dist/lib/banner.d.ts +0 -4
  680. package/dist/lib/banner.js +0 -122
  681. package/dist/lib/cloud/api.d.ts +0 -79
  682. package/dist/lib/cloud/api.js +0 -107
  683. package/dist/lib/cloud/apply.d.ts +0 -32
  684. package/dist/lib/cloud/apply.js +0 -294
  685. package/dist/lib/cloud/checkpoint.d.ts +0 -26
  686. package/dist/lib/cloud/checkpoint.js +0 -142
  687. package/dist/lib/cloud/conflicts.d.ts +0 -55
  688. package/dist/lib/cloud/conflicts.js +0 -131
  689. package/dist/lib/cloud/containment.d.ts +0 -8
  690. package/dist/lib/cloud/containment.js +0 -52
  691. package/dist/lib/cloud/diff.d.ts +0 -39
  692. package/dist/lib/cloud/diff.js +0 -138
  693. package/dist/lib/cloud/engine-bridge.d.ts +0 -34
  694. package/dist/lib/cloud/engine-bridge.js +0 -139
  695. package/dist/lib/cloud/hash-cache.d.ts +0 -23
  696. package/dist/lib/cloud/hash-cache.js +0 -44
  697. package/dist/lib/cloud/hash.d.ts +0 -10
  698. package/dist/lib/cloud/hash.js +0 -111
  699. package/dist/lib/cloud/http.d.ts +0 -17
  700. package/dist/lib/cloud/http.js +0 -47
  701. package/dist/lib/cloud/lock-path.d.ts +0 -1
  702. package/dist/lib/cloud/lock-path.js +0 -5
  703. package/dist/lib/cloud/lock.d.ts +0 -14
  704. package/dist/lib/cloud/lock.js +0 -143
  705. package/dist/lib/cloud/manifest.d.ts +0 -6
  706. package/dist/lib/cloud/manifest.js +0 -41
  707. package/dist/lib/cloud/paths.d.ts +0 -20
  708. package/dist/lib/cloud/paths.js +0 -90
  709. package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
  710. package/dist/lib/cloud/project-godot-merge.js +0 -185
  711. package/dist/lib/cloud/rules.d.ts +0 -39
  712. package/dist/lib/cloud/rules.js +0 -159
  713. package/dist/lib/cloud/sync.d.ts +0 -21
  714. package/dist/lib/cloud/sync.js +0 -518
  715. package/dist/lib/cloud/transfer.d.ts +0 -23
  716. package/dist/lib/cloud/transfer.js +0 -184
  717. package/dist/lib/cloud/types.d.ts +0 -62
  718. package/dist/lib/cloud/types.js +0 -1
  719. package/dist/lib/cloud/validate-path.d.ts +0 -23
  720. package/dist/lib/cloud/validate-path.js +0 -103
  721. package/dist/lib/engine.d.ts +0 -51
  722. package/dist/lib/game-task-plan.d.ts +0 -42
  723. package/dist/lib/project-memory.d.ts +0 -33
  724. package/dist/lib/public-surface-paths.d.ts +0 -13
  725. package/dist/lib/public-surface-paths.js +0 -42
  726. package/dist/lib/remote-templates.d.ts +0 -25
  727. package/dist/lib/remote-templates.js +0 -86
  728. package/dist/lib/skills-registry.d.ts +0 -572
  729. package/dist/lib/skills-registry.js +0 -1061
  730. package/dist/lib/version-check.d.ts +0 -106
  731. package/dist/lib/version-check.js +0 -338
  732. package/dist/mcp/tools/cloud-tools.js +0 -42
  733. package/references/mcp-tools-reference.md +0 -199
  734. package/references/template-registry.md +0 -73
  735. package/skills/README.md +0 -103
  736. package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
  737. package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
  738. package/skills/workflow/brainstorming/scripts/helper.js +0 -88
  739. package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
  740. package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
  741. package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
  742. package/skills/workflow/brainstorming/visual-companion.md +0 -287
  743. package/skills/workflow/gameskill/SKILL.md +0 -120
  744. package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
  745. package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
  746. package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
  747. package/skills/workflow/investigating-bugs/test-academic.md +0 -14
  748. package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
  749. package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
  750. package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
  751. package/skills/workflow/mcpupdate/SKILL.md +0 -134
  752. package/skills/workflow/skill-create/SKILL.md +0 -153
  753. package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
  754. package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
  755. package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
  756. package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
  757. package/skills/workflow/writing-skills/render-graphs.js +0 -168
  758. /package/dist/{commands → cli/commands}/config.d.ts +0 -0
  759. /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
  760. /package/dist/{commands → cli/commands}/list.d.ts +0 -0
  761. /package/dist/{commands → cli/commands}/login.d.ts +0 -0
  762. /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
  763. /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
  764. /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
  765. /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
  766. /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
  767. /package/dist/{lib → core}/log-filters.d.ts +0 -0
  768. /package/dist/{lib → core}/mcp-log.d.ts +0 -0
  769. /package/dist/{lib → core}/store.d.ts +0 -0
  770. /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
  771. /package/dist/{lib → core}/telemetry.d.ts +0 -0
  772. /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
  773. /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
  774. /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
  775. /package/{references → library/references/gd-style}/gd-style.md +0 -0
  776. /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
  777. /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
  778. /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
  779. /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
  780. /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
  781. /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
  782. /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
  783. /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
  784. /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
  785. /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
  786. /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
  787. /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
  788. /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
  789. /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
  790. /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
@@ -1,12 +1,102 @@
1
1
  import { z } from "zod";
2
- import { withEngine } from "./with-engine.js";
2
+ import { withEngine, missingEngineOpResult, withOldEngineHint } from "./with-engine.js";
3
+ import { withFailureReasonHint } from "./perception-tools.js";
4
+ import { analyzedSnapshot, captureGame, captureScene, captureViewport, VIEWPORT_RECAPTURE_DELAY_MS, } from "../../core/capabilities/capture.js";
5
+ import { describeFlatFrame } from "../../core/capabilities/frame-quality.js";
6
+ import { CAMERA_BOOKMARK_ACTIONS, CAMERA_BOOKMARK_FALLBACK, SCREENSHOT_FRAMINGS, MAX_MARKS_CAP, buildCameraBookmarkOp, buildScenePreviewInput, formatSceneMarks, isFixedPoseFraming, readCameraPose, readSceneMarks, } from "../../core/capabilities/camera-view.js";
7
+ // The capture path (content check, single viewport recapture, scene-kind read
8
+ // for the no-camera confession) is ONE copy in core/capabilities/capture.ts,
9
+ // shared with the CLI face; re-exported so tests and callers keep this door.
10
+ export { analyzedSnapshot, captureScene, captureViewport, VIEWPORT_RECAPTURE_DELAY_MS };
3
11
  /**
4
12
  * Visual capture tools. Unlike the in-product chat agent (a text-only "brain"
5
13
  * that needs a separate vision model to describe frames for it), an MCP client
6
14
  * like Claude Code can SEE images directly. So we hand the raw engine frame back
7
15
  * as an MCP image content block — no vision-model prepass, no paraphrase. The
8
16
  * model reviews the actual pixels.
17
+ *
18
+ * Frame honesty (E2E 2026-09-03, F-01 / F-05) is decided in
19
+ * core/capabilities/capture.ts (frame content check + one automatic viewport
20
+ * recapture; scene kind for the no-camera confession). This module only
21
+ * renders the caption from those fields; the CLI face prints them as JSON.
22
+ *
23
+ * perception adds stable viewpoints: camera bookmarks
24
+ * (summer_camera_bookmark, persisted in the project) and the fixed-pose
25
+ * framings "free" / "bookmark" plus the Set-of-Mark overlay on
26
+ * summer_screenshot target:"scene". Older engines resolve the new framings to
27
+ * a preset and echo it — the caption confesses that instead of letting a
28
+ * preset render pass as a pose-stable comparison.
9
29
  */
30
+ function viewportLabel(snap) {
31
+ const meta = snap.metadata;
32
+ const surface = typeof meta?.source_surface === "string" ? meta.source_surface : "";
33
+ if (surface === "editor_2d_subviewport_texture")
34
+ return "Editor viewport (2D tab)";
35
+ if (surface === "editor_3d_subviewport_texture")
36
+ return "Editor viewport (3D tab)";
37
+ return "Editor viewport";
38
+ }
39
+ const BLANK_VIEWPORT_ADVICE = "The engine reads the editor viewport texture as-is; right after a tab switch or a scene mutation it may not have been redrawn yet. This frame is NOT evidence about lights, cameras, materials, or scene content — do not fix anything based on it. Wait a moment and call summer_screenshot again (switching the editor tab or nudging the view forces a redraw), verify structure with summer_get_scene_tree / summer_inspect_node, or render the saved scene with target:\"scene\".";
40
+ /** The first per-op result inside an envelope (or the envelope itself). */
41
+ function firstOpResult(result) {
42
+ if (!result || typeof result !== "object")
43
+ return {};
44
+ const envelope = result;
45
+ const first = Array.isArray(envelope.results) ? envelope.results[0] : undefined;
46
+ return first && typeof first === "object" ? first : envelope;
47
+ }
48
+ /** Teach the engine's bookmark failure_reasons; `available` names ride along
49
+ * on not_found so the model can pick a real one without a second call. */
50
+ function teachBookmarkFailure(result) {
51
+ const failed = firstOpResult(result);
52
+ const available = Array.isArray(failed.available)
53
+ ? failed.available.filter((n) => typeof n === "string")
54
+ : [];
55
+ const availableText = available.length
56
+ ? ` Saved bookmarks: ${available.join(", ")}.`
57
+ : " No bookmarks are saved yet — save one with action:\"save\".";
58
+ return withFailureReasonHint(result, {
59
+ not_found: `No bookmark by that name.${availableText}`,
60
+ no_editor_camera: "No pose was given and the editor has no 3D viewport camera to capture (2D scene, or the 3D editor is not open). Pass position and look_at explicitly (\"Vector3(x, y, z)\" literals), or open the 3D viewport on the scene first.",
61
+ bad_args: "Check the arguments: name is 1-64 of A-Z a-z 0-9 _ -; position and look_at are \"Vector3(x, y, z)\" literals given together and must differ; fov is 1..179.",
62
+ io_failed: "res://.summer/camera_bookmarks.json could not be read or written (or exists but is not a JSON object — it was NOT overwritten). Inspect it with summer_read_file path:\"res://.summer/camera_bookmarks.json\".",
63
+ });
64
+ }
65
+ /** Success prose for the bookmark tool: what happened and how to reuse it. */
66
+ function describeBookmarkResult(action, result) {
67
+ const data = firstOpResult(result);
68
+ if (action === "save") {
69
+ const name = typeof data.name === "string" ? data.name : "?";
70
+ const source = typeof data.pose_source === "string" ? data.pose_source : "unknown";
71
+ const overwritten = data.overwritten === true ? " (replaced an existing bookmark of the same name)" : "";
72
+ return (`Saved camera bookmark "${name}" from ${source === "editor_viewport" ? "the current editor 3D viewport camera" : "the explicit pose"}${overwritten}. ` +
73
+ `Reuse it for a pose-stable frame: summer_screenshot target:"scene" framing:"bookmark" bookmark_name:"${name}" — every capture from it lines up with the last, so before/after comparisons are real.`);
74
+ }
75
+ if (action === "delete") {
76
+ const name = typeof data.name === "string" ? data.name : "?";
77
+ const remaining = Array.isArray(data.remaining) ? data.remaining.filter((n) => typeof n === "string") : null;
78
+ return `Deleted camera bookmark "${name}".${remaining ? (remaining.length ? ` Remaining: ${remaining.join(", ")}.` : " No bookmarks remain.") : ""}`;
79
+ }
80
+ const names = Array.isArray(data.names) ? data.names.filter((n) => typeof n === "string") : [];
81
+ if (!names.length) {
82
+ return 'No camera bookmarks saved in this project. Save one with action:"save" (omit position/look_at to capture the current editor viewport camera).';
83
+ }
84
+ return `${names.length} camera bookmark(s): ${names.join(", ")}. Use one with summer_screenshot target:"scene" framing:"bookmark" bookmark_name:"<name>".`;
85
+ }
86
+ /** Amend ScenePreview failures specific to the fixed-pose framings. The
87
+ * structured failureReason stays; only the error text is taught. */
88
+ function teachPreviewFailure(snap) {
89
+ const hints = {
90
+ unknown_bookmark: 'That bookmark does not exist in this project. List the saved names with summer_camera_bookmark action:"list", or save one with action:"save".',
91
+ bad_camera_pose: 'framing:"free" / "bookmark" needs a valid 3D pose: camera_position and camera_look_at as "Vector3(x, y, z)" literals that differ, fov 1..179, and a 3D scene (2D scenes have nowhere to place a Camera3D — use the default framing).',
92
+ node_focus_unsupported: "A fixed camera pose cannot be re-aimed at a node. Drop nodePath, or use a directional framing (iso/top/...) with nodePath.",
93
+ };
94
+ const reason = snap.failureReason;
95
+ if (!snap.ok && reason && reason in hints) {
96
+ return { ...snap, error: `${hints[reason]} Engine said: ${snap.error ?? reason}` };
97
+ }
98
+ return snap;
99
+ }
10
100
  export function registerVisualTools(server) {
11
101
  server.tool("summer_screenshot", `Capture a frame from Summer Engine and return it as an image you can look at directly.
12
102
 
@@ -14,11 +104,15 @@ Use this to visually verify your work: scene layout, asset placement, scale, fra
14
104
 
15
105
  target:
16
106
  "viewport" (default) — the editor's CURRENT view (whatever scene/tab is open). No game boot. Use for edit-time checks of how the scene looks right now.
17
- "scene" — an OFFSCREEN render of a scene file (no game boot; physics/particles/animations are static at t=0). Optionally pass scenePath/framing/size/nodePath. Use for COMPOSITION, SCALE and FRAMING without touching the editor's open tab.
18
- It does NOT use the scene's environment/sky, and it injects a synthetic camera and light when the scene has none. The scene's WorldEnvironment — sky, fog, tonemap, glow, SSAO, ambient — is replaced by a flat preview environment. So this target CANNOT verify lighting, mood, or any material property that depends on the environment: change them and the frame comes back identical. For those, boot the game or run a RunVerification probe, whose instance renders the real environment.
19
- "game" — a frame from the RUNNING game (real runtime state). Start the game first (summer_play). Not available over a plain local connection — needs the Summer desktop app bridge.
107
+ "scene" — an OFFSCREEN render of a scene file (no game boot; scripts do not run, physics/particles/animations are static at t=0, so runtime-hidden UI shows as saved). Optionally pass scenePath/framing/size/nodePath. Use for COMPOSITION, SCALE and FRAMING without touching the editor's open tab.
108
+ With the preset framings (iso/top/...), it does NOT use the scene's environment/sky, and it injects a synthetic camera and light when the scene has none. The scene's WorldEnvironment — sky, fog, tonemap, glow, SSAO, ambient — is replaced by a flat preview environment. So those framings CANNOT verify lighting, mood, or any material property that depends on the environment: change them and the frame comes back identical.
109
+ framing:"camera" is the exception and the trustworthy way to check lighting edit-time: it renders through the scene's OWN current/first Camera3D (or the one named by camera_path) with the scene's REAL WorldEnvironment — sky, fog, tonemap, glow, ambient all live. Use it before/after any lighting, environment, or emissive-material change, and to see the scene the way the played game will actually frame it.
110
+ STABLE VIEWPOINTS (newer engines): framing:"bookmark" + bookmark_name renders from a pose saved with summer_camera_bookmark, and framing:"free" from an explicit camera_position / camera_look_at (+ fov). Both are fixed synthetic poses rendered with the scene's REAL WorldEnvironment, and the same pose every time — the way to take before/after frames that actually line up. marks:true draws a Set-of-Mark overlay (numbered tags + boxes over the largest visible 3D nodes, up to max_marks) and the caption lists label -> node path, so you can say "label 3 (Props/Crate_02) is floating" instead of guessing. The scene file is never touched. 2D scenes render normally with marks_unsupported. Older engines resolve the new framings to a preset and ignore marks — the caption says so; a frame from such a build is NOT pose-stable.
111
+ "game" — a frame from the RUNNING game (real runtime state). Start the game first (summer_play). Works over the plain local connection on current Summer Engine builds (verified on 0.5.65, about 1.4 s); if a build refuses with bridge_required the result says so and names the alternatives.
112
+
113
+ BLANK FRAMES ARE A CAPTURE CONDITION, NOT A SCENE FACT. A uniformly black/grey "viewport" frame means the editor had not redrawn its viewport texture when it was read (typically right after a tab switch or a scene mutation) — not that the scene is dark or has no camera. Every frame is content-checked; a flat viewport frame is recaptured once automatically and the caption says what happened. Never conclude anything about lights, cameras, or content from a blank frame: recapture first.
20
114
 
21
- Static frame only — one moment, not motion. For a SEQUENCE of frames over time, or for anything lighting-dependent when the desktop bridge is unavailable, use a RunVerification probe's save_frame(name) — its instance has a real renderer.`, {
115
+ Static frame only — one moment, not motion. For a SEQUENCE of frames over time, or for anything lighting-dependent on an engine build without framing:"camera", use a RunVerification probe's save_frame(name) — its instance has a real renderer.`, {
22
116
  target: z
23
117
  .enum(["viewport", "scene", "game"])
24
118
  .optional()
@@ -29,12 +123,20 @@ Static frame only — one moment, not motion. For a SEQUENCE of frames over time
29
123
  .optional()
30
124
  .describe('target:"scene" only. Full scene path, e.g. "res://main.tscn". Omit to render the currently-open scene.'),
31
125
  framing: z
32
- .enum(["auto", "iso", "top", "front", "back", "left", "right"])
126
+ .enum(SCREENSHOT_FRAMINGS)
33
127
  .optional()
34
128
  .describe('target:"scene" only, 3D scenes. Camera direction preset: "iso" = 3/4 diagonal view, ' +
35
129
  '"top" = straight down, "front" = camera at +Z, "back" = camera at -Z, ' +
36
130
  '"left" = camera at -X, "right" = camera at +X. "auto" (default) is an alias of "iso". ' +
37
- "The result reports the resolved framing."),
131
+ '"camera" = render through the scene\'s OWN Camera3D with its REAL WorldEnvironment — ' +
132
+ "the only edit-time framing that truthfully shows lighting/mood. " +
133
+ '"bookmark" (+ bookmark_name) = the fixed pose saved with summer_camera_bookmark; "free" (+ camera_position, camera_look_at, fov) = an explicit fixed pose. ' +
134
+ "Both keep the REAL WorldEnvironment and repeat exactly, so before/after frames line up. " +
135
+ "The result reports the resolved framing — an older engine echoes a preset instead, and the caption warns."),
136
+ bookmark_name: z
137
+ .string()
138
+ .optional()
139
+ .describe('framing:"bookmark" only (implies it when framing is omitted). Name of a bookmark saved with summer_camera_bookmark (list them with action:"list"). Fails with failure_reason "unknown_bookmark" (+ the available names) when it does not exist.'),
38
140
  size: z
39
141
  .array(z.number().int().positive())
40
142
  .length(2)
@@ -46,105 +148,285 @@ Static frame only — one moment, not motion. For a SEQUENCE of frames over time
46
148
  .describe('target:"scene" only. Node path relative to the scene root (e.g. "Player/Mesh") to frame ' +
47
149
  "INSTEAD of the whole scene — the camera fits that node's combined bounds (3D visual AABBs " +
48
150
  "or 2D rects, children included). A bare unique name is also found recursively. " +
49
- 'Fails with failure_reason "node_not_found" when the path does not resolve (no silent whole-scene fallback).'),
50
- }, async ({ target, scenePath, framing, size, nodePath }) => withEngine(async (client) => {
51
- if (target === "game")
52
- return client.gameSnapshot();
53
- if (target === "scene")
54
- return client.scenePreview({
55
- scenePath,
56
- framing,
57
- size: size,
58
- nodePath,
59
- });
60
- return client.viewportSnapshot();
61
- }, {
62
- // Game capture is structurally blocked over local HTTP today (409
63
- // bridge_required). Treat that as a clean, honest failure rather than a
64
- // truncated generic error — fail loud (isError) so the model does not
65
- // proceed as if it saw the game. Written so that when the engine starts
66
- // answering over HTTP (P4.4) `failureReason` never fires and the normal
67
- // image path below just works.
68
- onResult: (snap) => {
69
- if (target === "game" && snap.failureReason === "bridge_required") {
70
- return {
71
- content: [
151
+ 'Fails with failure_reason "node_not_found" when the path does not resolve (no silent whole-scene fallback). ' +
152
+ 'Cannot combine with a fixed pose (framing "camera"/"free"/"bookmark").'),
153
+ camera_path: z
154
+ .string()
155
+ .optional()
156
+ .describe('framing:"camera" only. Path of the Camera3D to render through (relative to the scene root) when ' +
157
+ "the scene has several cameras or none marked current. Omit to use the scene's current/first Camera3D."),
158
+ camera_position: z
159
+ .string()
160
+ .optional()
161
+ .describe('framing:"free" only (implies it when framing is omitted). Camera position as a Godot literal, e.g. "Vector3(0, 5, 12)". Goes together with camera_look_at.'),
162
+ camera_look_at: z
163
+ .string()
164
+ .optional()
165
+ .describe('framing:"free" only. Point the camera looks at, e.g. "Vector3(0, 1, 0)". Must differ from camera_position.'),
166
+ fov: z
167
+ .number()
168
+ .optional()
169
+ .describe('framing:"free" / "bookmark" only. Vertical field of view in degrees (1..179; default 60 for "free", the bookmark\'s own for "bookmark").'),
170
+ marks: z
171
+ .boolean()
172
+ .optional()
173
+ .describe('target:"scene" only, 3D scenes. Draw a Set-of-Mark overlay: numbered tags + box outlines over the largest visible VisualInstance3D nodes (lights excluded), ranked by projected screen area. The caption lists label -> node path (scene-root-relative) so you can name what you see. Works with every framing. 2D scenes return marks_unsupported. Default false.'),
174
+ max_marks: z
175
+ .number()
176
+ .int()
177
+ .min(1)
178
+ .max(MAX_MARKS_CAP)
179
+ .optional()
180
+ .describe(`marks:true only. Cap on numbered labels (engine default 32, at most ${MAX_MARKS_CAP}). The caption says when the cap truncated the list.`),
181
+ }, async ({ target, scenePath, framing, bookmark_name, size, nodePath, camera_path, camera_position, camera_look_at, fov, marks, max_marks, }) => {
182
+ // Resolved inside the engine closure so a contradictory framing is a
183
+ // classified invalid_input (nothing sent), never a transport failure.
184
+ let preview;
185
+ return withEngine(async (client) => {
186
+ if (target === "game")
187
+ return captureGame(client);
188
+ if (target === "scene") {
189
+ preview = buildScenePreviewInput({
190
+ scenePath,
191
+ framing,
192
+ bookmark_name,
193
+ size: size,
194
+ nodePath,
195
+ camera_path,
196
+ camera_position,
197
+ camera_look_at,
198
+ fov,
199
+ marks,
200
+ max_marks,
201
+ });
202
+ return teachPreviewFailure(await captureScene(client, preview));
203
+ }
204
+ return captureViewport(client);
205
+ }, {
206
+ // Game capture used to be structurally blocked over local HTTP (409
207
+ // bridge_required); 0.5.65 answers it over the plain local connection.
208
+ // Keep the honest failure for builds that still refuse — fail loud
209
+ // (isError) so the model does not proceed as if it saw the game.
210
+ onResult: (snap) => {
211
+ if (target === "game" && snap.failureReason === "bridge_required") {
212
+ return {
213
+ content: [
214
+ {
215
+ type: "text",
216
+ text: "Game capture is not available over this connection on this Summer Engine build (it requires the desktop app bridge). " +
217
+ "Use target:'viewport' for the editor view, target:'scene' for an offscreen scene render, " +
218
+ "a RunVerification probe's save_frame for a rendered runtime frame, or ask the user to describe / screenshot the running game.\n\n" +
219
+ `Engine reason: ${snap.error ?? "unsupported_transport"}`,
220
+ },
221
+ ],
222
+ isError: true,
223
+ };
224
+ }
225
+ return null;
226
+ },
227
+ toContent: (snap) => {
228
+ // withEngine only calls toContent on success (ok:true, error cleared
229
+ // by extractOpError). Missing image bytes on a "success" is still
230
+ // possible defensively, so fall back to text rather than emit a
231
+ // broken image block.
232
+ if (!snap.base64) {
233
+ return [
72
234
  {
73
235
  type: "text",
74
- text: "Game capture is not available over this connection (requires the Summer desktop app bridge). " +
75
- "Use target:'viewport' for the editor view, target:'scene' for an offscreen scene render, " +
76
- "or ask the user to describe / screenshot the running game.\n\n" +
77
- `Engine reason: ${snap.error ?? "unsupported_transport"}`,
236
+ text: snap.error ||
237
+ "Snapshot succeeded but returned no image data. Try again, or use summer_get_scene_tree to inspect structurally.",
78
238
  },
79
- ],
80
- isError: true,
81
- };
82
- }
83
- return null;
84
- },
85
- toContent: (snap) => {
86
- // withEngine only calls toContent on success (ok:true, error cleared
87
- // by extractOpError). Missing image bytes on a "success" is still
88
- // possible defensively, so fall back to text rather than emit a
89
- // broken image block.
90
- if (!snap.base64) {
91
- return [
92
- {
93
- type: "text",
94
- text: snap.error ||
95
- "Snapshot succeeded but returned no image data. Try again, or use summer_get_scene_tree to inspect structurally.",
96
- },
97
- ];
98
- }
99
- const dims = snap.width && snap.height ? `${snap.width}x${snap.height}` : "unknown size";
100
- const label = target === "game"
101
- ? "Running game frame"
102
- : target === "scene"
103
- ? "Scene preview (offscreen render, physics/animations static)"
104
- : "Editor viewport";
105
- const warnings = [];
106
- // Project-drift warning (item 4): the engine may have switched
107
- // projects since this session bound — this frame could be from the
108
- // WRONG project.
109
- if (snap.projectMismatch) {
110
- warnings.push("WARNING: the engine is now on a DIFFERENT project than this session is bound to — this frame may be from the wrong project. Call summer_get_project_context to rebind before trusting it.");
111
- }
112
- // Scene-preview confession fields (P4.3): a scene with no camera plays
113
- // grey/black.
114
- if (target === "scene") {
115
- if (snap.sceneHasCamera === false) {
116
- warnings.push("WARNING: this scene has no Camera3D — it will render grey/black when played.");
239
+ ];
117
240
  }
118
- if (snap.sceneHadLight === false) {
119
- warnings.push("WARNING: this scene has no light — lit materials may appear black when played.");
241
+ const dims = snap.width && snap.height ? `${snap.width}x${snap.height}` : "unknown size";
242
+ const label = target === "game"
243
+ ? "Running game frame"
244
+ : target === "scene"
245
+ ? "Scene preview (offscreen render of the saved scene; scripts not run, physics/animations static)"
246
+ : viewportLabel(snap);
247
+ const warnings = [];
248
+ const notes = [];
249
+ // Project-drift warning (item 4): the engine may have switched
250
+ // projects since this session bound — this frame could be from the
251
+ // WRONG project.
252
+ if (snap.projectMismatch) {
253
+ warnings.push("WARNING: the engine is now on a DIFFERENT project than this session is bound to — this frame may be from the wrong project. Call summer_get_project_context to rebind before trusting it.");
120
254
  }
121
- // The engine ALWAYS synthesizes the preview camera (preview_ops.cpp
122
- // sets used_synthetic_camera unconditionally) — the flag says nothing
123
- // about the scene's own cameras. sceneHasCamera above is the
124
- // authoritative "does this scene have a camera" answer.
125
- if (snap.usedSyntheticCamera) {
126
- warnings.push("NOTE: this preview is framed by a synthetic render camera, NOT the scene's own camera — the played game will not frame like this image.");
255
+ const meta = snap.metadata;
256
+ const requestedFraming = preview?.framing;
257
+ // Frame content check (F-01). Wording is per target because a flat
258
+ // frame means different things: viewport = texture not redrawn;
259
+ // game = booting / loading / fade; scene = nothing visible in the
260
+ // framing or a blank readback the engine's own retries did not fix.
261
+ const quality = snap.frameQuality;
262
+ const recapture = snap.recapture;
263
+ let frameCheck = "";
264
+ if (quality?.analyzable && quality.flat) {
265
+ const flat = describeFlatFrame(quality);
266
+ if (target === "viewport") {
267
+ warnings.push(recapture
268
+ ? `WARNING: this frame is ${flat}, and so was the automatic recapture ${recapture.delayMs} ms later${recapture.error ? ` (the recapture failed: ${recapture.error}; this is the first frame)` : ""}. ${BLANK_VIEWPORT_ADVICE}`
269
+ : `WARNING: this frame is ${flat}. ${BLANK_VIEWPORT_ADVICE}`);
270
+ }
271
+ else if (target === "game") {
272
+ warnings.push(`WARNING: this game frame is ${flat}. A game that has just booted, is loading, or is mid-fade legitimately shows this; it is NOT by itself evidence of a missing camera or light. Wait a moment and capture again before concluding anything.`);
273
+ }
274
+ else {
275
+ warnings.push(`WARNING: this preview is ${flat} (engine render retries: ${snap.renderRetries ?? 0}). Either nothing is visible in this framing or the readback was blank; verify with summer_get_scene_tree and, for 3D scenes, framing:"camera" before concluding anything.`);
276
+ }
127
277
  }
128
- }
129
- // Scene-preview capture details: resolved framing ("auto" -> "iso"),
130
- // which node was framed (confirms nodePath resolved), and how many
131
- // blank-readback retries the engine needed (0 = omitted).
132
- const details = [];
133
- if (target === "scene") {
134
- if (snap.framing)
135
- details.push(`framing: ${snap.framing}`);
136
- if (snap.framedNode)
137
- details.push(`framed node: ${snap.framedNode}`);
138
- if (snap.renderRetries)
139
- details.push(`render retries: ${snap.renderRetries}`);
140
- }
141
- const detailNote = details.length ? `; ${details.join(", ")}` : "";
142
- const caption = `${label} (${dims}${detailNote}). Saved to ${snap.localPath ?? "n/a"}. Review the image above and describe what you actually see.` +
143
- (warnings.length ? `\n\n${warnings.join("\n")}` : "");
144
- return [
145
- { type: "image", data: snap.base64, mimeType: snap.mime || "image/jpeg" },
146
- { type: "text", text: caption },
147
- ];
148
- },
278
+ else if (quality?.analyzable) {
279
+ frameCheck = ` Frame check: not blank (luma spread ${quality.lumaSpread}).`;
280
+ if (recapture) {
281
+ notes.push(`NOTE: the first capture came back ${describeFlatFrame(recapture.firstFrame)} — the viewport texture had not been redrawn yet (this happens right after a tab switch or a scene mutation). This image is the automatic recapture taken ${recapture.delayMs} ms later.`);
282
+ }
283
+ }
284
+ else if (quality && target !== "scene") {
285
+ notes.push(`NOTE: frame content check unavailable (${quality.reason ?? "unknown reason"}). If the image is uniformly black or grey, the viewport had not redrawn when it was read — recapture before concluding anything about lights, cameras, or content.`);
286
+ }
287
+ // Scene-preview confession fields (P4.3 + F-05).
288
+ if (target === "scene") {
289
+ if (snap.sceneHasCamera === false) {
290
+ const kind = snap.sceneKind?.kind ?? "unknown";
291
+ if (kind === "3d") {
292
+ warnings.push("WARNING: this 3D scene has no Camera3D — it will render grey/black when played.");
293
+ }
294
+ else if (kind === "2d" || kind === "none") {
295
+ notes.push("NOTE: this 2D scene has no Camera2D. That is normal for many 2D scenes and not an error: when played, the game shows the canvas from the viewport origin at the project's window size, not this fitted preview framing.");
296
+ }
297
+ else {
298
+ const reason = snap.sceneKind?.reason ? ` (${snap.sceneKind.reason})` : "";
299
+ warnings.push(`WARNING: this scene has no camera of its own (the preview camera was synthesized) and the scene tree could not be read to tell 2D from 3D${reason}. If it is a 3D scene it will render grey/black when played; a 2D scene simply plays from the viewport origin.`);
300
+ }
301
+ }
302
+ // The engine reports scene_had_light:false for 3D scenes only
303
+ // (2D scenes get true = not applicable), so this stays unconditional.
304
+ if (snap.sceneHadLight === false) {
305
+ warnings.push("WARNING: this scene has no light — lit materials may appear black when played.");
306
+ }
307
+ // The engine ALWAYS synthesizes the preview camera (preview_ops.cpp
308
+ // sets used_synthetic_camera unconditionally) — the flag says nothing
309
+ // about the scene's own cameras. sceneHasCamera above is the
310
+ // authoritative "does this scene have a camera" answer.
311
+ if (snap.usedSyntheticCamera) {
312
+ notes.push("NOTE: this preview is framed by a synthetic render camera, NOT the scene's own camera — the played game will not frame like this image.");
313
+ }
314
+ notes.push('NOTE: this is the SAVED scene rendered with scripts not running: nodes a script hides, moves, or spawns at runtime (e.g. a PauseMenu CanvasLayer hidden in _ready) appear here exactly as saved. Judge runtime visibility with target:"game" or a RunVerification save_frame, not this image.');
315
+ // Old engines that predate framing:"camera" resolve unknown
316
+ // framings to a preset and echo the result. Confess it rather
317
+ // than let a flat-environment frame pass as a lighting check.
318
+ if (requestedFraming === "camera" && snap.framing && snap.framing !== "camera") {
319
+ warnings.push(`WARNING: you asked for framing:"camera" but this Summer Engine build resolved it to "${snap.framing}" — it predates camera framing. This frame uses the synthetic preview camera and FLAT environment, so it does NOT verify lighting/mood. Update Summer Engine, or verify lighting by booting the game / a RunVerification probe.`);
320
+ }
321
+ // Same confession for the fixed-pose framings: an older engine
322
+ // echoes the preset it fell back to, so the frame is NOT the
323
+ // requested viewpoint and cannot anchor a before/after comparison.
324
+ if (isFixedPoseFraming(requestedFraming) && snap.framing && snap.framing !== requestedFraming) {
325
+ warnings.push(`WARNING: you asked for framing:"${requestedFraming}" but this Summer Engine build resolved it to "${snap.framing}" — this engine does not expose the free/bookmark framings (Summer Engine 0.5.66 or newer does). This is the "${snap.framing}" preset render from a synthetic camera with a FLAT environment, NOT your viewpoint, so it is not pose-stable and cannot anchor a before/after comparison. Update Summer Engine, or place a Camera3D at the pose and use framing:"camera".`);
326
+ }
327
+ // marks:true on an engine without Set-of-Mark: no marks key at all.
328
+ if (preview?.marks && readSceneMarks(meta) === null) {
329
+ warnings.push("WARNING: you asked for marks:true but this Summer Engine build ignored it (this engine does not expose the Set-of-Mark overlay; Summer Engine 0.5.66 or newer does). There are NO numbered labels in this image; do not read any into it. Update Summer Engine to get label -> node path mapping.");
330
+ }
331
+ }
332
+ // Scene-preview capture details: resolved framing ("auto" -> "iso"),
333
+ // which node was framed (confirms nodePath resolved), and how many
334
+ // blank-readback retries the engine needed (0 = omitted).
335
+ const details = [];
336
+ let marksBlock = [];
337
+ if (target === "scene") {
338
+ if (snap.framing)
339
+ details.push(`framing: ${snap.framing}`);
340
+ if (snap.framedNode)
341
+ details.push(`framed node: ${snap.framedNode}`);
342
+ if (snap.renderRetries)
343
+ details.push(`render retries: ${snap.renderRetries}`);
344
+ // Camera-framing provenance (camera framing provenance): which camera the
345
+ // engine rendered through and which environment was live.
346
+ if (typeof meta?.camera_path === "string" && meta.camera_path) {
347
+ details.push(`scene camera: ${meta.camera_path}`);
348
+ }
349
+ if (typeof meta?.environment_used === "string" && meta.environment_used) {
350
+ details.push(`environment: ${meta.environment_used}`);
351
+ }
352
+ // fixed-pose provenance: where the pose came from and the
353
+ // exact pose rendered (3dp literals) — quote it when comparing.
354
+ if (typeof meta?.framing_source === "string" && meta.framing_source) {
355
+ details.push(`framing source: ${meta.framing_source}${typeof meta.bookmark === "string" && meta.bookmark ? ` "${meta.bookmark}"` : ""}`);
356
+ }
357
+ const pose = readCameraPose(meta);
358
+ if (pose) {
359
+ const parts = [];
360
+ if (pose.position)
361
+ parts.push(`position ${pose.position}`);
362
+ if (pose.look_at)
363
+ parts.push(`look_at ${pose.look_at}`);
364
+ if (pose.fov !== undefined)
365
+ parts.push(`fov ${pose.fov}`);
366
+ if (parts.length)
367
+ details.push(`camera pose: ${parts.join(", ")}`);
368
+ }
369
+ const marksSummary = readSceneMarks(meta);
370
+ if (marksSummary)
371
+ marksBlock = formatSceneMarks(marksSummary);
372
+ }
373
+ const detailNote = details.length ? `; ${details.join(", ")}` : "";
374
+ const trailer = [...warnings, ...notes];
375
+ const caption = `${label} (${dims}${detailNote}). Saved to ${snap.localPath ?? "n/a"}.${frameCheck} Describe only what is visibly in the image above.` +
376
+ (marksBlock.length ? `\n\n${marksBlock.join("\n")}` : "") +
377
+ (trailer.length ? `\n\n${trailer.join("\n")}` : "");
378
+ return [
379
+ { type: "image", data: snap.base64, mimeType: snap.mime || "image/jpeg" },
380
+ { type: "text", text: caption },
381
+ ];
382
+ },
383
+ });
384
+ });
385
+ server.tool("summer_camera_bookmark", `Save, list, or delete named camera viewpoints for the edited 3D scene. A bookmark is a fixed pose (position, look_at, fov) stored IN THE PROJECT at res://.summer/camera_bookmarks.json, so it survives sessions and machines — the scene file is never touched.
386
+
387
+ WHY: screenshots taken from a preset framing re-fit the scene bounds every time, so a before/after pair shifts whenever anything moves; a bookmark is the same pose every time, which makes before/after comparison real. Save once, then reuse on every capture: summer_screenshot target:"scene" framing:"bookmark" bookmark_name:"<name>" (add marks:true for numbered labels mapped to node paths).
388
+
389
+ action:
390
+ "save" — name (1-64 of A-Z a-z 0-9 _ -) plus EITHER position + look_at as Godot literals ("Vector3(x, y, z)", optional fov, default 60) OR neither: omit both to capture the CURRENT editor 3D viewport camera (result pose_source: "editor_viewport" vs "explicit"; overwritten says whether a same-named bookmark was replaced).
391
+ "list" — every saved bookmark (names sorted, poses, created timestamps, file path).
392
+ "delete" — remove one by name (result lists the remaining names).
393
+
394
+ Failures are structured: bad_args (name grammar, half-given pose, fov outside 1..179, position == look_at), no_editor_camera (no pose given and no 3D viewport camera to capture), not_found (+ available names), io_failed (file unreadable/unwritable; a malformed file is reported, never overwritten). Edit-time only — no running game needed. If this engine build predates the bookmark ops, the result is a structured engine_lacks_op failure (nothing is sent) naming the fallback.`, {
395
+ action: z
396
+ .enum(CAMERA_BOOKMARK_ACTIONS)
397
+ .describe('"save" a viewpoint, "list" the saved ones, or "delete" one by name.'),
398
+ name: z
399
+ .string()
400
+ .optional()
401
+ .describe("Bookmark name for save/delete: 1-64 characters from A-Z a-z 0-9 _ - (e.g. \"hero_closeup\")."),
402
+ position: z
403
+ .string()
404
+ .optional()
405
+ .describe('save only. Camera position as a Godot literal, e.g. "Vector3(0, 5, 12)". Goes together with look_at; omit BOTH to capture the current editor 3D viewport camera.'),
406
+ look_at: z
407
+ .string()
408
+ .optional()
409
+ .describe('save only. Point the camera looks at, e.g. "Vector3(0, 1, 0)". Must differ from position.'),
410
+ fov: z
411
+ .number()
412
+ .optional()
413
+ .describe("save only. Vertical field of view in degrees (1..179, default 60). With a captured viewport pose the viewport camera's fov wins."),
414
+ }, async ({ action, name, position, look_at, fov }) => withEngine(async (client) => {
415
+ // Argument validation first (a bad name never needs an engine), then
416
+ // the capability pre-flight on THIS action's op kind.
417
+ const op = buildCameraBookmarkOp({ action, name, position, look_at, fov });
418
+ const kind = String(op.op);
419
+ const missing = missingEngineOpResult(client, kind, CAMERA_BOOKMARK_FALLBACK);
420
+ if (missing)
421
+ return missing;
422
+ const result = await client.executeOps([op]);
423
+ return teachBookmarkFailure(withOldEngineHint(result, kind, CAMERA_BOOKMARK_FALLBACK));
424
+ }, {
425
+ toContent: (result) => [
426
+ {
427
+ type: "text",
428
+ text: `${JSON.stringify(result, null, 2)}\n\n${describeBookmarkResult(action, result)}`,
429
+ },
430
+ ],
149
431
  }));
150
432
  }
@@ -1,4 +1,8 @@
1
1
  import { getClient } from "../server.js";
2
+ import { extractOpError, withOldEngineHint } from "../../core/capabilities/engine-receipt.js";
3
+ export { extractOpError, withOldEngineHint };
4
+ export { missingEngineOpResult, type CapabilityAdvertisingClient, } from "../../core/capability-skew.js";
5
+ export { ToolInputError, UnsupportedOperationError } from "../../core/tool-errors.js";
2
6
  type ToolResultContent = {
3
7
  type: "text";
4
8
  text: string;
@@ -35,20 +39,6 @@ export interface WithEngineOptions<T> {
35
39
  toContent?: (result: T) => ToolResultContent[];
36
40
  onResult?: (result: T) => ToolResult | null;
37
41
  }
38
- /**
39
- * Decide whether an engine result envelope represents a FAILURE, and if so
40
- * return a model-visible message. Returns null only for genuine success.
41
- *
42
- * Guards the two web bug classes (publicsummerengine cf17134f + contract.ts
43
- * `isFailureSignal`):
44
- * - a failure `terminalState` (anything other than applied/no_op) is a failure
45
- * even when results[] is absent — the cf17134f "no-results envelope looked
46
- * applied" masking. The poll loop surfaces timed_out/etc. here.
47
- * - an explicit ok:false / status:"error" / failed op inside results[].
48
- *
49
- * Exported for unit tests.
50
- */
51
- export declare function extractOpError(result: unknown): string | null;
52
42
  /**
53
43
  * An auth failure is the ONE class of thrown error that is provably pre-apply:
54
44
  * the engine rejects on the Bearer-token check (tool_net_thread.cpp::_validate_auth)
@@ -68,4 +58,8 @@ export declare function extractOpError(result: unknown): string | null;
68
58
  */
69
59
  export declare function isAuthError(err: unknown): boolean;
70
60
  export declare function withEngine<T>(fn: (client: Awaited<ReturnType<typeof getClient>>) => Promise<T>, opts?: WithEngineOptions<T>): Promise<ToolResult>;
71
- export {};
61
+ /** Every transport-level failure must TEACH recovery, not just name the error.
62
+ * getClient()'s connect failure already carries its own instructions; anything
63
+ * else (fetch failed / abort / HTTP status thrown mid-call) gets the generic
64
+ * recovery recipe appended. Exported for unit tests. */
65
+ export declare function withTransportRecovery(message: string): string;