summer-engine 3.0.0 → 3.2.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 (413) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +27 -5
  3. package/.codex-plugin/plugin.json +28 -6
  4. package/.cursor-plugin/plugin.json +27 -5
  5. package/.factory-plugin/plugin.json +27 -5
  6. package/.opencode/plugins/summer.js +1 -1
  7. package/CHANGELOG.md +120 -0
  8. package/README.md +22 -7
  9. package/assets/audit/scene_audit.gd +4136 -0
  10. package/assets/seeing/seeing_probe.gd +1873 -0
  11. package/dist/cli/commands/setup.js +6 -19
  12. package/dist/cli/commands/skills.js +57 -32
  13. package/dist/core/api-client.d.ts +9 -1
  14. package/dist/core/api-client.js +21 -4
  15. package/dist/core/capabilities/agent-playbook.js +46 -0
  16. package/dist/core/capabilities/audit/accept.d.ts +55 -0
  17. package/dist/core/capabilities/audit/accept.js +147 -0
  18. package/dist/core/capabilities/audit/args.d.ts +95 -0
  19. package/dist/core/capabilities/audit/args.js +89 -0
  20. package/dist/core/capabilities/audit/audit.d.ts +56 -0
  21. package/dist/core/capabilities/audit/audit.js +287 -0
  22. package/dist/core/capabilities/audit/frame.d.ts +14 -0
  23. package/dist/core/capabilities/audit/frame.js +35 -0
  24. package/dist/core/capabilities/audit/gaps.d.ts +96 -0
  25. package/dist/core/capabilities/audit/gaps.js +257 -0
  26. package/dist/core/capabilities/audit/judge.d.ts +162 -0
  27. package/dist/core/capabilities/audit/judge.js +1134 -0
  28. package/dist/core/capabilities/audit/math.d.ts +110 -0
  29. package/dist/core/capabilities/audit/math.js +263 -0
  30. package/dist/core/capabilities/audit/summary.d.ts +74 -0
  31. package/dist/core/capabilities/audit/summary.js +212 -0
  32. package/dist/core/capabilities/board.d.ts +31 -0
  33. package/dist/core/capabilities/board.js +43 -0
  34. package/dist/core/capabilities/camera-view.d.ts +4 -2
  35. package/dist/core/capabilities/camera-view.js +6 -3
  36. package/dist/core/capabilities/connect-signal.d.ts +85 -0
  37. package/dist/core/capabilities/connect-signal.js +285 -0
  38. package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
  39. package/dist/core/capabilities/engine-fallbacks.js +5 -0
  40. package/dist/core/capabilities/engine-ops.d.ts +5 -1
  41. package/dist/core/capabilities/engine-ops.js +0 -3
  42. package/dist/core/capabilities/engine-receipt.d.ts +12 -0
  43. package/dist/core/capabilities/engine-receipt.js +26 -0
  44. package/dist/core/capabilities/file-read.d.ts +64 -0
  45. package/dist/core/capabilities/file-read.js +325 -0
  46. package/dist/core/capabilities/game-task-plan.js +4 -2
  47. package/dist/core/capabilities/grep.d.ts +60 -0
  48. package/dist/core/capabilities/grep.js +190 -0
  49. package/dist/core/capabilities/inspect-node.d.ts +56 -0
  50. package/dist/core/capabilities/inspect-node.js +225 -0
  51. package/dist/core/capabilities/inspect-resource.d.ts +61 -0
  52. package/dist/core/capabilities/inspect-resource.js +376 -0
  53. package/dist/core/capabilities/math3d.d.ts +28 -0
  54. package/dist/core/capabilities/math3d.js +88 -0
  55. package/dist/core/capabilities/motion-generation.d.ts +62 -0
  56. package/dist/core/capabilities/motion-generation.js +138 -0
  57. package/dist/core/capabilities/placement-batch.d.ts +102 -0
  58. package/dist/core/capabilities/placement-batch.js +483 -0
  59. package/dist/core/capabilities/placement-math.d.ts +70 -0
  60. package/dist/core/capabilities/placement-math.js +209 -0
  61. package/dist/core/capabilities/placement-script.d.ts +42 -0
  62. package/dist/core/capabilities/placement-script.js +1096 -0
  63. package/dist/core/capabilities/placement.d.ts +485 -0
  64. package/dist/core/capabilities/placement.js +1731 -0
  65. package/dist/core/capabilities/project-context.d.ts +33 -2
  66. package/dist/core/capabilities/project-context.js +87 -4
  67. package/dist/core/capabilities/replace-node.d.ts +91 -0
  68. package/dist/core/capabilities/replace-node.js +423 -0
  69. package/dist/core/capabilities/runtime-control.d.ts +20 -4
  70. package/dist/core/capabilities/runtime-control.js +67 -2
  71. package/dist/core/capabilities/scene-batch.d.ts +63 -0
  72. package/dist/core/capabilities/scene-batch.js +394 -0
  73. package/dist/core/capabilities/scene-readback.d.ts +36 -0
  74. package/dist/core/capabilities/scene-readback.js +54 -0
  75. package/dist/core/capabilities/seeing/args.d.ts +348 -0
  76. package/dist/core/capabilities/seeing/args.js +178 -0
  77. package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
  78. package/dist/core/capabilities/seeing/candidates.js +282 -0
  79. package/dist/core/capabilities/seeing/math.d.ts +134 -0
  80. package/dist/core/capabilities/seeing/math.js +269 -0
  81. package/dist/core/capabilities/seeing/probe.d.ts +62 -0
  82. package/dist/core/capabilities/seeing/probe.js +188 -0
  83. package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
  84. package/dist/core/capabilities/seeing/scoring.js +639 -0
  85. package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
  86. package/dist/core/capabilities/seeing/seeing.js +1341 -0
  87. package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
  88. package/dist/core/capabilities/seeing/shot-store.js +204 -0
  89. package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
  90. package/dist/core/capabilities/surface-snap-mesh.js +425 -0
  91. package/dist/core/capabilities/surface-snap.d.ts +77 -0
  92. package/dist/core/capabilities/surface-snap.js +461 -0
  93. package/dist/core/capabilities/tool-dispatch.js +231 -72
  94. package/dist/core/capabilities/tscn.d.ts +85 -0
  95. package/dist/core/capabilities/tscn.js +391 -0
  96. package/dist/core/capabilities/world-snapshot.d.ts +58 -0
  97. package/dist/core/capabilities/world-snapshot.js +150 -0
  98. package/dist/core/capability-skew.d.ts +5 -5
  99. package/dist/core/capability-skew.js +14 -6
  100. package/dist/core/headless/worker-engine-client.d.ts +1 -1
  101. package/dist/core/headless/worker-engine-client.js +2 -2
  102. package/dist/core/library-read.d.ts +37 -5
  103. package/dist/core/library-read.js +264 -33
  104. package/dist/core/library-search.d.ts +2 -2
  105. package/dist/core/skills-registry.d.ts +9 -1
  106. package/dist/core/skills-registry.js +25 -2
  107. package/dist/installer/agent-config.d.ts +9 -4
  108. package/dist/installer/agent-config.js +194 -392
  109. package/dist/installer/agent-table.d.ts +119 -0
  110. package/dist/installer/agent-table.js +619 -0
  111. package/dist/installer/setup.js +4 -2
  112. package/dist/installer/skill-locations.d.ts +8 -17
  113. package/dist/installer/skill-locations.js +22 -101
  114. package/dist/installer/version-check.d.ts +5 -1
  115. package/dist/installer/version-check.js +38 -28
  116. package/dist/mcp/server.js +9 -3
  117. package/dist/mcp/tools/asset-tools.js +21 -3
  118. package/dist/mcp/tools/audit-tools.d.ts +23 -0
  119. package/dist/mcp/tools/audit-tools.js +60 -0
  120. package/dist/mcp/tools/debug-tools.js +3 -1
  121. package/dist/mcp/tools/file-tools.js +17 -4
  122. package/dist/mcp/tools/generate-tools.js +74 -66
  123. package/dist/mcp/tools/library-tools.js +2 -0
  124. package/dist/mcp/tools/perception-tools.js +6 -19
  125. package/dist/mcp/tools/placement-tools.d.ts +24 -0
  126. package/dist/mcp/tools/placement-tools.js +91 -0
  127. package/dist/mcp/tools/project-tools.js +18 -15
  128. package/dist/mcp/tools/scene-tools.js +71 -83
  129. package/dist/mcp/tools/seeing-tools.d.ts +24 -0
  130. package/dist/mcp/tools/seeing-tools.js +64 -0
  131. package/dist/mcp/tools/spatial-tools.js +17 -9
  132. package/dist/mcp/tools/visual-tools.js +59 -7
  133. package/gemini-extension.json +26 -4
  134. package/integrations/README.md +48 -19
  135. package/integrations/amp/README.md +12 -0
  136. package/integrations/amp/manifest-target.json +3 -0
  137. package/integrations/antigravity/README.md +12 -0
  138. package/integrations/antigravity/manifest-target.json +3 -0
  139. package/integrations/claude-desktop/README.md +12 -0
  140. package/integrations/claude-desktop/manifest-target.json +3 -0
  141. package/integrations/cline/README.md +8 -9
  142. package/integrations/cline-cli/README.md +12 -0
  143. package/integrations/cline-cli/manifest-target.json +3 -0
  144. package/integrations/copilot-jetbrains/README.md +12 -0
  145. package/integrations/copilot-jetbrains/manifest-target.json +3 -0
  146. package/integrations/crush/README.md +12 -0
  147. package/integrations/crush/manifest-target.json +3 -0
  148. package/integrations/github-copilot/README.md +8 -8
  149. package/integrations/goose/README.md +12 -0
  150. package/integrations/goose/manifest-target.json +3 -0
  151. package/integrations/grok-build/README.md +12 -0
  152. package/integrations/grok-build/manifest-target.json +3 -0
  153. package/integrations/hermes/README.md +12 -0
  154. package/integrations/hermes/manifest-target.json +3 -0
  155. package/integrations/junie/README.md +12 -0
  156. package/integrations/junie/manifest-target.json +3 -0
  157. package/integrations/kilo-code/README.md +6 -10
  158. package/integrations/kimi-code/README.md +12 -0
  159. package/integrations/kimi-code/manifest-target.json +3 -0
  160. package/integrations/kiro/README.md +12 -0
  161. package/integrations/kiro/manifest-target.json +3 -0
  162. package/integrations/lm-studio/README.md +8 -8
  163. package/integrations/mistral-vibe/README.md +12 -0
  164. package/integrations/mistral-vibe/manifest-target.json +3 -0
  165. package/integrations/opencode/README.md +9 -12
  166. package/integrations/qoder/README.md +12 -0
  167. package/integrations/qoder/manifest-target.json +3 -0
  168. package/integrations/qwen-code/README.md +12 -0
  169. package/integrations/qwen-code/manifest-target.json +3 -0
  170. package/integrations/roo-code/README.md +8 -7
  171. package/integrations/rovo-dev/README.md +12 -0
  172. package/integrations/rovo-dev/manifest-target.json +3 -0
  173. package/integrations/trae/README.md +12 -0
  174. package/integrations/trae/manifest-target.json +3 -0
  175. package/integrations/visual-studio/README.md +12 -0
  176. package/integrations/visual-studio/manifest-target.json +3 -0
  177. package/integrations/vscode-copilot/README.md +9 -9
  178. package/integrations/warp/README.md +12 -0
  179. package/integrations/warp/manifest-target.json +3 -0
  180. package/integrations/windsurf/README.md +8 -9
  181. package/integrations/zed/README.md +12 -0
  182. package/integrations/zed/manifest-target.json +3 -0
  183. package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
  184. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  185. package/library/references/summer-folder/resource.yaml +1 -1
  186. package/library/references/summer-folder/summer-folder.md +1 -1
  187. package/library/skills/3d-lighting/SKILL.md +1 -1
  188. package/library/skills/README.md +264 -0
  189. package/library/skills/adaptive-music/SKILL.md +1 -1
  190. package/library/skills/agent-playtesting/SKILL.md +1 -1
  191. package/library/skills/ai-characters-in-games/SKILL.md +220 -0
  192. package/library/skills/ai-characters-in-games/resource.yaml +30 -0
  193. package/library/skills/ambient-bed/SKILL.md +1 -1
  194. package/library/skills/animated-loop/SKILL.md +1 -1
  195. package/library/skills/animation-tree/SKILL.md +1 -1
  196. package/library/skills/art-direction/SKILL.md +1 -1
  197. package/library/skills/asset-strategy/SKILL.md +2 -1
  198. package/library/skills/asset-strategy/resource.yaml +2 -1
  199. package/library/skills/audio-direction/SKILL.md +1 -1
  200. package/library/skills/auto-fire-targeting/SKILL.md +1 -1
  201. package/library/skills/brainstorm-game/SKILL.md +1 -1
  202. package/library/skills/brainstorming/SKILL.md +1 -1
  203. package/library/skills/browse-templates/SKILL.md +3 -3
  204. package/library/skills/browse-templates/resource.yaml +1 -1
  205. package/library/skills/camera-rigs/SKILL.md +128 -0
  206. package/library/skills/camera-rigs/resource.yaml +29 -0
  207. package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
  208. package/library/skills/character-animation-wiring/SKILL.md +1 -1
  209. package/library/skills/character-model/SKILL.md +1 -1
  210. package/library/skills/character-movement/SKILL.md +326 -0
  211. package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
  212. package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
  213. package/library/skills/character-movement/references/movement-3d.md +136 -0
  214. package/library/skills/character-movement/references/platformer-feel.md +83 -0
  215. package/library/skills/character-movement/resource.yaml +40 -0
  216. package/library/skills/character-portrait/SKILL.md +1 -1
  217. package/library/skills/cinematic-cutscene/SKILL.md +1 -1
  218. package/library/skills/combat-basics/SKILL.md +159 -0
  219. package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
  220. package/library/skills/combat-basics/resource.yaml +34 -0
  221. package/library/skills/concept-art/SKILL.md +1 -1
  222. package/library/skills/create-asset-sheet/SKILL.md +1 -1
  223. package/library/skills/debug/SKILL.md +1 -1
  224. package/library/skills/debugging-game-feel/SKILL.md +1 -1
  225. package/library/skills/design-level/SKILL.md +1 -1
  226. package/library/skills/design-mechanic/SKILL.md +1 -1
  227. package/library/skills/design-npc/SKILL.md +1 -1
  228. package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
  229. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
  230. package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
  231. package/library/skills/environment-kit/SKILL.md +1 -1
  232. package/library/skills/export-and-ship/SKILL.md +1 -1
  233. package/library/skills/fabricating-assets/SKILL.md +1 -1
  234. package/library/skills/facial-and-lipsync/SKILL.md +1 -1
  235. package/library/skills/fps-controller/SKILL.md +9 -7
  236. package/library/skills/fps-controller/resource.yaml +4 -1
  237. package/library/skills/game-feel/SKILL.md +1 -1
  238. package/library/skills/gameskill/SKILL.md +1 -1
  239. package/library/skills/gdscript-patterns/SKILL.md +1 -1
  240. package/library/skills/generate-motion/SKILL.md +9 -9
  241. package/library/skills/generate-motion/resource.yaml +2 -1
  242. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
  243. package/library/skills/headless-scripting/SKILL.md +1 -1
  244. package/library/skills/in-game-purchases/SKILL.md +254 -0
  245. package/library/skills/in-game-purchases/resource.yaml +29 -0
  246. package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
  247. package/library/skills/investigating-bugs/SKILL.md +1 -1
  248. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
  249. package/library/skills/make-game/SKILL.md +25 -3
  250. package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
  251. package/library/skills/make-game/references/2d-platformer.md +117 -0
  252. package/library/skills/make-game/references/2d-rpg-content.md +234 -0
  253. package/library/skills/make-game/references/2d-rpg.md +241 -0
  254. package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
  255. package/library/skills/make-game/references/2d-survivors.md +237 -0
  256. package/library/skills/make-game/references/3d-fps-systems.md +216 -0
  257. package/library/skills/make-game/references/3d-fps.md +177 -0
  258. package/library/skills/make-game/references/3d-horror-systems.md +186 -0
  259. package/library/skills/make-game/references/3d-horror.md +201 -0
  260. package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
  261. package/library/skills/make-game/references/3d-third-person.md +215 -0
  262. package/library/skills/make-game/resource.yaml +6 -1
  263. package/library/skills/multiplayer/SKILL.md +150 -0
  264. package/library/skills/multiplayer/resource.yaml +33 -0
  265. package/library/skills/multiplayer-movement/SKILL.md +510 -0
  266. package/library/skills/multiplayer-movement/files.md +501 -0
  267. package/library/skills/multiplayer-movement/resource.yaml +30 -0
  268. package/library/skills/multiplayer-project/SKILL.md +521 -0
  269. package/library/skills/multiplayer-project/files.md +448 -0
  270. package/library/skills/multiplayer-project/resource.yaml +36 -0
  271. package/library/skills/multiplayer-publish/SKILL.md +229 -0
  272. package/library/skills/multiplayer-publish/export-errors.md +89 -0
  273. package/library/skills/multiplayer-publish/resource.yaml +28 -0
  274. package/library/skills/multiplayer-state/SKILL.md +438 -0
  275. package/library/skills/multiplayer-state/files.md +592 -0
  276. package/library/skills/multiplayer-state/resource.yaml +35 -0
  277. package/library/skills/multiplayer-testing/SKILL.md +236 -0
  278. package/library/skills/multiplayer-testing/resource.yaml +39 -0
  279. package/library/skills/music-track/SKILL.md +1 -1
  280. package/library/skills/navigate-summer/SKILL.md +1 -1
  281. package/library/skills/new-project/SKILL.md +1 -1
  282. package/library/skills/organic-model/SKILL.md +1 -1
  283. package/library/skills/pixel-art/SKILL.md +1 -1
  284. package/library/skills/play/SKILL.md +1 -1
  285. package/library/skills/playtesting-a-feature/SKILL.md +1 -1
  286. package/library/skills/procedural-animation/SKILL.md +2 -2
  287. package/library/skills/procedural-animation/resource.yaml +1 -1
  288. package/library/skills/prop-model/SKILL.md +1 -1
  289. package/library/skills/psx-retro-rendering/SKILL.md +1 -1
  290. package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
  291. package/library/skills/remote-deploy/SKILL.md +1 -1
  292. package/library/skills/retarget/SKILL.md +1 -1
  293. package/library/skills/running-in-the-cloud/SKILL.md +1 -1
  294. package/library/skills/save-load/SKILL.md +156 -0
  295. package/library/skills/save-load/resource.yaml +27 -0
  296. package/library/skills/scene-composition/SKILL.md +1 -1
  297. package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
  298. package/library/skills/scene-scripting/SKILL.md +1 -1
  299. package/library/skills/scene-to-level/SKILL.md +1 -1
  300. package/library/skills/skill-create/SKILL.md +1 -1
  301. package/library/skills/skill-improve/SKILL.md +1 -1
  302. package/library/skills/skill-test/SKILL.md +1 -1
  303. package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
  304. package/library/skills/skybox-panorama/SKILL.md +1 -1
  305. package/library/skills/sound-effect/SKILL.md +1 -1
  306. package/library/skills/spatial-placement/SKILL.md +134 -3
  307. package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
  308. package/library/skills/spatial-placement/resource.yaml +16 -2
  309. package/library/skills/sprite-sheet/SKILL.md +1 -1
  310. package/library/skills/summer-analytics/SKILL.md +147 -0
  311. package/library/skills/summer-analytics/resource.yaml +28 -0
  312. package/library/skills/summer-friends/SKILL.md +226 -0
  313. package/library/skills/summer-friends/resource.yaml +28 -0
  314. package/library/skills/summer-leaderboards/SKILL.md +231 -0
  315. package/library/skills/summer-leaderboards/resource.yaml +30 -0
  316. package/library/skills/summer-match-results/SKILL.md +286 -0
  317. package/library/skills/summer-match-results/resource.yaml +32 -0
  318. package/library/skills/summer-matchmaking/SKILL.md +301 -0
  319. package/library/skills/summer-matchmaking/resource.yaml +32 -0
  320. package/library/skills/summer-parties/SKILL.md +253 -0
  321. package/library/skills/summer-parties/resource.yaml +30 -0
  322. package/library/skills/summer-player-data/SKILL.md +322 -0
  323. package/library/skills/summer-player-data/resource.yaml +30 -0
  324. package/library/skills/summer-store/SKILL.md +271 -0
  325. package/library/skills/summer-store/resource.yaml +29 -0
  326. package/library/skills/summer-world-chat/SKILL.md +195 -0
  327. package/library/skills/summer-world-chat/resource.yaml +30 -0
  328. package/library/skills/summer-world-saves/SKILL.md +284 -0
  329. package/library/skills/summer-world-saves/resource.yaml +29 -0
  330. package/library/skills/text-to-motion/SKILL.md +99 -0
  331. package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
  332. package/library/skills/text-to-motion/resource.yaml +41 -0
  333. package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
  334. package/library/skills/tileable-texture/SKILL.md +1 -1
  335. package/library/skills/trailer-shot/SKILL.md +1 -1
  336. package/library/skills/tune-performance/SKILL.md +1 -1
  337. package/library/skills/ui-basics/SKILL.md +10 -1
  338. package/library/skills/ui-graphics/SKILL.md +1 -1
  339. package/library/skills/use-widget-asset/SKILL.md +1 -1
  340. package/library/skills/using-summer/SKILL.md +2 -2
  341. package/library/skills/using-summer/resource.yaml +2 -2
  342. package/library/skills/vehicle-model/SKILL.md +1 -1
  343. package/library/skills/verification-before-completion/SKILL.md +1 -1
  344. package/library/skills/verifying-scenes/SKILL.md +76 -2
  345. package/library/skills/verifying-scenes/resource.yaml +13 -2
  346. package/library/skills/vfx-dissolve/SKILL.md +1 -1
  347. package/library/skills/vfx-fire/SKILL.md +1 -1
  348. package/library/skills/vfx-hit-spark/SKILL.md +1 -1
  349. package/library/skills/vfx-lightning/SKILL.md +1 -1
  350. package/library/skills/vfx-magic-glow/SKILL.md +1 -1
  351. package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
  352. package/library/skills/vfx-smoke/SKILL.md +1 -1
  353. package/library/skills/vfx-water-ripple/SKILL.md +1 -1
  354. package/library/skills/voice-line/SKILL.md +1 -1
  355. package/library/skills/web-and-touch-input/SKILL.md +38 -0
  356. package/library/skills/web-and-touch-input/resource.yaml +28 -0
  357. package/library/skills/web-compatibility-look/SKILL.md +62 -0
  358. package/library/skills/web-compatibility-look/resource.yaml +30 -0
  359. package/library/skills/world-building-3d/SKILL.md +8 -1
  360. package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
  361. package/library/skills/world-building-3d/resource.yaml +2 -1
  362. package/library/skills/writing-plans/SKILL.md +1 -1
  363. package/library/skills/writing-skills/SKILL.md +1 -1
  364. package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
  365. package/library/tools/attach-to-surface/resource.yaml +142 -0
  366. package/library/tools/batch/resource.yaml +9 -3
  367. package/library/tools/connect-ports/resource.yaml +120 -0
  368. package/library/tools/connect-signal/resource.yaml +3 -2
  369. package/library/tools/debug-views/resource.yaml +94 -0
  370. package/library/tools/frame-nodes/resource.yaml +104 -0
  371. package/library/tools/frame-shot/resource.yaml +134 -0
  372. package/library/tools/generate-motion/resource.yaml +44 -9
  373. package/library/tools/get-board/resource.yaml +50 -0
  374. package/library/tools/get-project-context/resource.yaml +13 -2
  375. package/library/tools/grep/resource.yaml +77 -0
  376. package/library/tools/inspect-asset/resource.yaml +71 -0
  377. package/library/tools/inspect-node/resource.yaml +9 -2
  378. package/library/tools/inspect-resource/resource.yaml +16 -5
  379. package/library/tools/instantiate-scene/resource.yaml +27 -2
  380. package/library/tools/measure/resource.yaml +96 -0
  381. package/library/tools/place-adjacent/resource.yaml +113 -0
  382. package/library/tools/play/resource.yaml +15 -2
  383. package/library/tools/raycast/resource.yaml +101 -0
  384. package/library/tools/read-file/resource.yaml +36 -2
  385. package/library/tools/read-library/resource.yaml +2 -2
  386. package/library/tools/repeat-along/resource.yaml +129 -0
  387. package/library/tools/replace-node/resource.yaml +11 -5
  388. package/library/tools/scene-audit/resource.yaml +144 -0
  389. package/library/tools/screenshot/resource.yaml +13 -2
  390. package/library/tools/search-assets/resource.yaml +18 -0
  391. package/library/tools/shot-sheet/resource.yaml +110 -0
  392. package/library/tools/snap-to-surface/resource.yaml +4 -1
  393. package/library/tools/world-snapshot/resource.yaml +24 -3
  394. package/library/tools/zoom/resource.yaml +105 -0
  395. package/package.json +3 -3
  396. package/registry/generated/aliases.json +17 -3
  397. package/registry/generated/counts.json +3 -3
  398. package/registry/generated/gemini-extension.json +26 -4
  399. package/registry/generated/index.json +2154 -469
  400. package/registry/generated/marketplace.claude.json +2 -2
  401. package/registry/generated/plugin.claude.json +27 -5
  402. package/registry/generated/plugin.codex.json +28 -6
  403. package/registry/generated/plugin.cursor.json +27 -5
  404. package/registry/generated/plugin.factory.json +27 -5
  405. package/registry/generated/skills-index.md +264 -0
  406. package/registry/generated/skills-registry.json +901 -206
  407. package/registry/generated/templates-registry.json +2 -2
  408. package/library/skills/host-authoritative-state/SKILL.md +0 -332
  409. package/library/skills/host-authoritative-state/resource.yaml +0 -28
  410. package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
  411. package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
  412. package/library/skills/setup-multiplayer/SKILL.md +0 -336
  413. package/library/skills/setup-multiplayer/resource.yaml +0 -28
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Argument shapes for the seeing tools — ONE copy for both faces (the MCP
3
+ * registration in src/mcp/tools/seeing-tools.ts and `summer tool <slug>` in
4
+ * tool-dispatch.ts). The descriptions are the tool docs agents read.
5
+ */
6
+ import { z } from "zod";
7
+ export declare const frameNodesShape: {
8
+ scenePath: z.ZodOptional<z.ZodString>;
9
+ nodes: z.ZodArray<z.ZodString, "many">;
10
+ direction: z.ZodOptional<z.ZodEnum<["front", "back", "left", "right", "top", "iso"]>>;
11
+ from: z.ZodOptional<z.ZodString>;
12
+ fill: z.ZodOptional<z.ZodNumber>;
13
+ fov: z.ZodOptional<z.ZodNumber>;
14
+ max_size: z.ZodOptional<z.ZodNumber>;
15
+ aspect: z.ZodOptional<z.ZodNumber>;
16
+ marks: z.ZodOptional<z.ZodBoolean>;
17
+ max_marks: z.ZodOptional<z.ZodNumber>;
18
+ bookmark_name: z.ZodOptional<z.ZodString>;
19
+ };
20
+ export declare const shotSheetShape: {
21
+ scenePath: z.ZodOptional<z.ZodString>;
22
+ shots: z.ZodArray<z.ZodObject<{
23
+ bookmark_name: z.ZodOptional<z.ZodString>;
24
+ camera_position: z.ZodOptional<z.ZodString>;
25
+ camera_look_at: z.ZodOptional<z.ZodString>;
26
+ fov: z.ZodOptional<z.ZodNumber>;
27
+ label: z.ZodOptional<z.ZodString>;
28
+ }, "strip", z.ZodTypeAny, {
29
+ camera_position?: string | undefined;
30
+ camera_look_at?: string | undefined;
31
+ fov?: number | undefined;
32
+ label?: string | undefined;
33
+ bookmark_name?: string | undefined;
34
+ }, {
35
+ camera_position?: string | undefined;
36
+ camera_look_at?: string | undefined;
37
+ fov?: number | undefined;
38
+ label?: string | undefined;
39
+ bookmark_name?: string | undefined;
40
+ }>, "many">;
41
+ view: z.ZodOptional<z.ZodEnum<["beauty", "lighting", "unshaded", "normals", "overdraw", "wireframe"]>>;
42
+ compare_previous: z.ZodOptional<z.ZodBoolean>;
43
+ update_previous: z.ZodOptional<z.ZodBoolean>;
44
+ max_size: z.ZodOptional<z.ZodNumber>;
45
+ aspect: z.ZodOptional<z.ZodNumber>;
46
+ save_to: z.ZodOptional<z.ZodString>;
47
+ };
48
+ export declare const debugViewsShape: {
49
+ scenePath: z.ZodOptional<z.ZodString>;
50
+ bookmark_name: z.ZodOptional<z.ZodString>;
51
+ camera_position: z.ZodOptional<z.ZodString>;
52
+ camera_look_at: z.ZodOptional<z.ZodString>;
53
+ fov: z.ZodOptional<z.ZodNumber>;
54
+ views: z.ZodOptional<z.ZodArray<z.ZodEnum<["beauty", "lighting", "unshaded", "normals", "overdraw", "wireframe"]>, "many">>;
55
+ update_previous: z.ZodOptional<z.ZodBoolean>;
56
+ max_size: z.ZodOptional<z.ZodNumber>;
57
+ aspect: z.ZodOptional<z.ZodNumber>;
58
+ save_to: z.ZodOptional<z.ZodString>;
59
+ };
60
+ export declare const zoomShape: {
61
+ scenePath: z.ZodOptional<z.ZodString>;
62
+ bookmark_name: z.ZodOptional<z.ZodString>;
63
+ camera_position: z.ZodOptional<z.ZodString>;
64
+ camera_look_at: z.ZodOptional<z.ZodString>;
65
+ fov: z.ZodOptional<z.ZodNumber>;
66
+ region: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
67
+ mark: z.ZodOptional<z.ZodNumber>;
68
+ reference_size: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
69
+ pad: z.ZodOptional<z.ZodNumber>;
70
+ view: z.ZodOptional<z.ZodEnum<["beauty", "lighting", "unshaded", "normals", "overdraw", "wireframe"]>>;
71
+ max_size: z.ZodOptional<z.ZodNumber>;
72
+ save_to: z.ZodOptional<z.ZodString>;
73
+ };
74
+ export declare const frameShotShape: {
75
+ scenePath: z.ZodOptional<z.ZodString>;
76
+ shot: z.ZodEnum<["establishing", "eye_level", "low_angle", "detail", "corridor"]>;
77
+ subject: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
78
+ spawn: z.ZodOptional<z.ZodString>;
79
+ eye_height: z.ZodOptional<z.ZodNumber>;
80
+ fov: z.ZodOptional<z.ZodNumber>;
81
+ aspect: z.ZodOptional<z.ZodNumber>;
82
+ occluders: z.ZodOptional<z.ZodObject<{
83
+ hard: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
84
+ soft: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
85
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
86
+ hard_layers: z.ZodOptional<z.ZodNumber>;
87
+ soft_layers: z.ZodOptional<z.ZodNumber>;
88
+ }, "strip", z.ZodTypeAny, {
89
+ ignore?: string[] | undefined;
90
+ hard?: string[] | undefined;
91
+ soft?: string[] | undefined;
92
+ hard_layers?: number | undefined;
93
+ soft_layers?: number | undefined;
94
+ }, {
95
+ ignore?: string[] | undefined;
96
+ hard?: string[] | undefined;
97
+ soft?: string[] | undefined;
98
+ hard_layers?: number | undefined;
99
+ soft_layers?: number | undefined;
100
+ }>>;
101
+ max_soft_fraction: z.ZodOptional<z.ZodNumber>;
102
+ bookmark_name: z.ZodOptional<z.ZodString>;
103
+ save_bookmark: z.ZodOptional<z.ZodBoolean>;
104
+ render: z.ZodOptional<z.ZodEnum<["sheet", "best", "none"]>>;
105
+ max_size: z.ZodOptional<z.ZodNumber>;
106
+ };
107
+ export declare const frameNodesArgsSchema: z.ZodObject<{
108
+ scenePath: z.ZodOptional<z.ZodString>;
109
+ nodes: z.ZodArray<z.ZodString, "many">;
110
+ direction: z.ZodOptional<z.ZodEnum<["front", "back", "left", "right", "top", "iso"]>>;
111
+ from: z.ZodOptional<z.ZodString>;
112
+ fill: z.ZodOptional<z.ZodNumber>;
113
+ fov: z.ZodOptional<z.ZodNumber>;
114
+ max_size: z.ZodOptional<z.ZodNumber>;
115
+ aspect: z.ZodOptional<z.ZodNumber>;
116
+ marks: z.ZodOptional<z.ZodBoolean>;
117
+ max_marks: z.ZodOptional<z.ZodNumber>;
118
+ bookmark_name: z.ZodOptional<z.ZodString>;
119
+ }, "strict", z.ZodTypeAny, {
120
+ nodes: string[];
121
+ fill?: number | undefined;
122
+ scenePath?: string | undefined;
123
+ fov?: number | undefined;
124
+ marks?: boolean | undefined;
125
+ max_marks?: number | undefined;
126
+ from?: string | undefined;
127
+ max_size?: number | undefined;
128
+ bookmark_name?: string | undefined;
129
+ aspect?: number | undefined;
130
+ direction?: "top" | "iso" | "front" | "back" | "left" | "right" | undefined;
131
+ }, {
132
+ nodes: string[];
133
+ fill?: number | undefined;
134
+ scenePath?: string | undefined;
135
+ fov?: number | undefined;
136
+ marks?: boolean | undefined;
137
+ max_marks?: number | undefined;
138
+ from?: string | undefined;
139
+ max_size?: number | undefined;
140
+ bookmark_name?: string | undefined;
141
+ aspect?: number | undefined;
142
+ direction?: "top" | "iso" | "front" | "back" | "left" | "right" | undefined;
143
+ }>;
144
+ export declare const shotSheetArgsSchema: z.ZodObject<{
145
+ scenePath: z.ZodOptional<z.ZodString>;
146
+ shots: z.ZodArray<z.ZodObject<{
147
+ bookmark_name: z.ZodOptional<z.ZodString>;
148
+ camera_position: z.ZodOptional<z.ZodString>;
149
+ camera_look_at: z.ZodOptional<z.ZodString>;
150
+ fov: z.ZodOptional<z.ZodNumber>;
151
+ label: z.ZodOptional<z.ZodString>;
152
+ }, "strip", z.ZodTypeAny, {
153
+ camera_position?: string | undefined;
154
+ camera_look_at?: string | undefined;
155
+ fov?: number | undefined;
156
+ label?: string | undefined;
157
+ bookmark_name?: string | undefined;
158
+ }, {
159
+ camera_position?: string | undefined;
160
+ camera_look_at?: string | undefined;
161
+ fov?: number | undefined;
162
+ label?: string | undefined;
163
+ bookmark_name?: string | undefined;
164
+ }>, "many">;
165
+ view: z.ZodOptional<z.ZodEnum<["beauty", "lighting", "unshaded", "normals", "overdraw", "wireframe"]>>;
166
+ compare_previous: z.ZodOptional<z.ZodBoolean>;
167
+ update_previous: z.ZodOptional<z.ZodBoolean>;
168
+ max_size: z.ZodOptional<z.ZodNumber>;
169
+ aspect: z.ZodOptional<z.ZodNumber>;
170
+ save_to: z.ZodOptional<z.ZodString>;
171
+ }, "strict", z.ZodTypeAny, {
172
+ shots: {
173
+ camera_position?: string | undefined;
174
+ camera_look_at?: string | undefined;
175
+ fov?: number | undefined;
176
+ label?: string | undefined;
177
+ bookmark_name?: string | undefined;
178
+ }[];
179
+ scenePath?: string | undefined;
180
+ max_size?: number | undefined;
181
+ save_to?: string | undefined;
182
+ view?: "lighting" | "beauty" | "unshaded" | "normals" | "overdraw" | "wireframe" | undefined;
183
+ update_previous?: boolean | undefined;
184
+ aspect?: number | undefined;
185
+ compare_previous?: boolean | undefined;
186
+ }, {
187
+ shots: {
188
+ camera_position?: string | undefined;
189
+ camera_look_at?: string | undefined;
190
+ fov?: number | undefined;
191
+ label?: string | undefined;
192
+ bookmark_name?: string | undefined;
193
+ }[];
194
+ scenePath?: string | undefined;
195
+ max_size?: number | undefined;
196
+ save_to?: string | undefined;
197
+ view?: "lighting" | "beauty" | "unshaded" | "normals" | "overdraw" | "wireframe" | undefined;
198
+ update_previous?: boolean | undefined;
199
+ aspect?: number | undefined;
200
+ compare_previous?: boolean | undefined;
201
+ }>;
202
+ export declare const debugViewsArgsSchema: z.ZodObject<{
203
+ scenePath: z.ZodOptional<z.ZodString>;
204
+ bookmark_name: z.ZodOptional<z.ZodString>;
205
+ camera_position: z.ZodOptional<z.ZodString>;
206
+ camera_look_at: z.ZodOptional<z.ZodString>;
207
+ fov: z.ZodOptional<z.ZodNumber>;
208
+ views: z.ZodOptional<z.ZodArray<z.ZodEnum<["beauty", "lighting", "unshaded", "normals", "overdraw", "wireframe"]>, "many">>;
209
+ update_previous: z.ZodOptional<z.ZodBoolean>;
210
+ max_size: z.ZodOptional<z.ZodNumber>;
211
+ aspect: z.ZodOptional<z.ZodNumber>;
212
+ save_to: z.ZodOptional<z.ZodString>;
213
+ }, "strict", z.ZodTypeAny, {
214
+ scenePath?: string | undefined;
215
+ camera_position?: string | undefined;
216
+ camera_look_at?: string | undefined;
217
+ fov?: number | undefined;
218
+ max_size?: number | undefined;
219
+ save_to?: string | undefined;
220
+ bookmark_name?: string | undefined;
221
+ views?: ("lighting" | "beauty" | "unshaded" | "normals" | "overdraw" | "wireframe")[] | undefined;
222
+ update_previous?: boolean | undefined;
223
+ aspect?: number | undefined;
224
+ }, {
225
+ scenePath?: string | undefined;
226
+ camera_position?: string | undefined;
227
+ camera_look_at?: string | undefined;
228
+ fov?: number | undefined;
229
+ max_size?: number | undefined;
230
+ save_to?: string | undefined;
231
+ bookmark_name?: string | undefined;
232
+ views?: ("lighting" | "beauty" | "unshaded" | "normals" | "overdraw" | "wireframe")[] | undefined;
233
+ update_previous?: boolean | undefined;
234
+ aspect?: number | undefined;
235
+ }>;
236
+ export declare const zoomArgsSchema: z.ZodObject<{
237
+ scenePath: z.ZodOptional<z.ZodString>;
238
+ bookmark_name: z.ZodOptional<z.ZodString>;
239
+ camera_position: z.ZodOptional<z.ZodString>;
240
+ camera_look_at: z.ZodOptional<z.ZodString>;
241
+ fov: z.ZodOptional<z.ZodNumber>;
242
+ region: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
243
+ mark: z.ZodOptional<z.ZodNumber>;
244
+ reference_size: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
245
+ pad: z.ZodOptional<z.ZodNumber>;
246
+ view: z.ZodOptional<z.ZodEnum<["beauty", "lighting", "unshaded", "normals", "overdraw", "wireframe"]>>;
247
+ max_size: z.ZodOptional<z.ZodNumber>;
248
+ save_to: z.ZodOptional<z.ZodString>;
249
+ }, "strict", z.ZodTypeAny, {
250
+ scenePath?: string | undefined;
251
+ camera_position?: string | undefined;
252
+ camera_look_at?: string | undefined;
253
+ fov?: number | undefined;
254
+ max_size?: number | undefined;
255
+ save_to?: string | undefined;
256
+ bookmark_name?: string | undefined;
257
+ view?: "lighting" | "beauty" | "unshaded" | "normals" | "overdraw" | "wireframe" | undefined;
258
+ region?: number[] | undefined;
259
+ mark?: number | undefined;
260
+ reference_size?: number[] | undefined;
261
+ pad?: number | undefined;
262
+ }, {
263
+ scenePath?: string | undefined;
264
+ camera_position?: string | undefined;
265
+ camera_look_at?: string | undefined;
266
+ fov?: number | undefined;
267
+ max_size?: number | undefined;
268
+ save_to?: string | undefined;
269
+ bookmark_name?: string | undefined;
270
+ view?: "lighting" | "beauty" | "unshaded" | "normals" | "overdraw" | "wireframe" | undefined;
271
+ region?: number[] | undefined;
272
+ mark?: number | undefined;
273
+ reference_size?: number[] | undefined;
274
+ pad?: number | undefined;
275
+ }>;
276
+ export declare const frameShotArgsSchema: z.ZodObject<{
277
+ scenePath: z.ZodOptional<z.ZodString>;
278
+ shot: z.ZodEnum<["establishing", "eye_level", "low_angle", "detail", "corridor"]>;
279
+ subject: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
280
+ spawn: z.ZodOptional<z.ZodString>;
281
+ eye_height: z.ZodOptional<z.ZodNumber>;
282
+ fov: z.ZodOptional<z.ZodNumber>;
283
+ aspect: z.ZodOptional<z.ZodNumber>;
284
+ occluders: z.ZodOptional<z.ZodObject<{
285
+ hard: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
286
+ soft: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
287
+ ignore: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
288
+ hard_layers: z.ZodOptional<z.ZodNumber>;
289
+ soft_layers: z.ZodOptional<z.ZodNumber>;
290
+ }, "strip", z.ZodTypeAny, {
291
+ ignore?: string[] | undefined;
292
+ hard?: string[] | undefined;
293
+ soft?: string[] | undefined;
294
+ hard_layers?: number | undefined;
295
+ soft_layers?: number | undefined;
296
+ }, {
297
+ ignore?: string[] | undefined;
298
+ hard?: string[] | undefined;
299
+ soft?: string[] | undefined;
300
+ hard_layers?: number | undefined;
301
+ soft_layers?: number | undefined;
302
+ }>>;
303
+ max_soft_fraction: z.ZodOptional<z.ZodNumber>;
304
+ bookmark_name: z.ZodOptional<z.ZodString>;
305
+ save_bookmark: z.ZodOptional<z.ZodBoolean>;
306
+ render: z.ZodOptional<z.ZodEnum<["sheet", "best", "none"]>>;
307
+ max_size: z.ZodOptional<z.ZodNumber>;
308
+ }, "strict", z.ZodTypeAny, {
309
+ shot: "detail" | "establishing" | "eye_level" | "low_angle" | "corridor";
310
+ spawn?: string | undefined;
311
+ scenePath?: string | undefined;
312
+ fov?: number | undefined;
313
+ max_size?: number | undefined;
314
+ bookmark_name?: string | undefined;
315
+ render?: "none" | "sheet" | "best" | undefined;
316
+ aspect?: number | undefined;
317
+ occluders?: {
318
+ ignore?: string[] | undefined;
319
+ hard?: string[] | undefined;
320
+ soft?: string[] | undefined;
321
+ hard_layers?: number | undefined;
322
+ soft_layers?: number | undefined;
323
+ } | undefined;
324
+ subject?: string[] | undefined;
325
+ eye_height?: number | undefined;
326
+ max_soft_fraction?: number | undefined;
327
+ save_bookmark?: boolean | undefined;
328
+ }, {
329
+ shot: "detail" | "establishing" | "eye_level" | "low_angle" | "corridor";
330
+ spawn?: string | undefined;
331
+ scenePath?: string | undefined;
332
+ fov?: number | undefined;
333
+ max_size?: number | undefined;
334
+ bookmark_name?: string | undefined;
335
+ render?: "none" | "sheet" | "best" | undefined;
336
+ aspect?: number | undefined;
337
+ occluders?: {
338
+ ignore?: string[] | undefined;
339
+ hard?: string[] | undefined;
340
+ soft?: string[] | undefined;
341
+ hard_layers?: number | undefined;
342
+ soft_layers?: number | undefined;
343
+ } | undefined;
344
+ subject?: string[] | undefined;
345
+ eye_height?: number | undefined;
346
+ max_soft_fraction?: number | undefined;
347
+ save_bookmark?: boolean | undefined;
348
+ }>;
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Argument shapes for the seeing tools — ONE copy for both faces (the MCP
3
+ * registration in src/mcp/tools/seeing-tools.ts and `summer tool <slug>` in
4
+ * tool-dispatch.ts). The descriptions are the tool docs agents read.
5
+ */
6
+ import { z } from "zod";
7
+ import { DIRECTION_PRESET_NAMES } from "./math.js";
8
+ import { SHOT_TYPES } from "./candidates.js";
9
+ import { MAX_IMAGE_EDGE, VIEW_MODES } from "./seeing.js";
10
+ const scenePath = z
11
+ .string()
12
+ .optional()
13
+ .describe('Scene to look at, e.g. "res://levels/town.tscn" (the SAVED file). Omit for the scene open in the editor.');
14
+ const bookmarkName = z
15
+ .string()
16
+ .optional()
17
+ .describe('Pose from a camera bookmark (summer_camera_bookmark). Use INSTEAD of camera_position/camera_look_at.');
18
+ const cameraPosition = z.string().optional().describe('Explicit pose: camera position, "Vector3(x, y, z)". Goes with camera_look_at.');
19
+ const cameraLookAt = z.string().optional().describe('Explicit pose: point the camera looks at, "Vector3(x, y, z)".');
20
+ const fov = z.number().optional().describe("Vertical field of view in degrees (1..179). Default: the bookmark's own, or 60.");
21
+ const maxSize = (fallback) => z
22
+ .number()
23
+ .int()
24
+ .min(64)
25
+ .max(MAX_IMAGE_EDGE)
26
+ .optional()
27
+ .describe(`Longest edge of the returned JPEG in pixels (default ${fallback}). Bigger costs more context; up to ${MAX_IMAGE_EDGE} for detail work on a PC.`);
28
+ const aspect = z.number().optional().describe("Frame width/height (default 1.7778 = 16:9). Every tile uses it.");
29
+ const saveTo = z
30
+ .string()
31
+ .optional()
32
+ .describe('Also write the returned image to res://.summer/shots/saved/<name>.jpg (1-64 of A-Z a-z 0-9 _ -; needs max_size <= 1024). Nothing is written without it, except one previous-image slot per rendered bookmark.');
33
+ const view = z
34
+ .enum(VIEW_MODES)
35
+ .optional()
36
+ .describe('"beauty" (default: real environment, lights, fog, tonemap), "lighting" (light only), "unshaded" (albedo/texture only), "normals" (world normals, x red y green z blue), "overdraw", "wireframe".');
37
+ export const frameNodesShape = {
38
+ scenePath,
39
+ nodes: z
40
+ .array(z.string())
41
+ .min(1)
42
+ .max(16)
43
+ .describe('Node paths relative to the scene root ("House1", "Props/Crate_02"). The camera fits their combined WORLD bounds (visible meshes, children included).'),
44
+ direction: z
45
+ .enum(DIRECTION_PRESET_NAMES)
46
+ .optional()
47
+ .describe('Side the camera sits on: "front" (+Z), "back" (-Z), "left" (-X), "right" (+X), "top", "iso" (default, 3/4 from -X,+Y,-Z like summer_screenshot). Use from for anything else.'),
48
+ from: z
49
+ .string()
50
+ .optional()
51
+ .describe('Explicit direction FROM the nodes TOWARD the camera, "Vector3(1, 0.4, 2)". Replaces direction. The fitted pose is checked in-engine: when walls block it, or it puts the camera behind or inside a one-sided surface (whose back is not drawn, so the image would look THROUGH it), the caption opens with a WARNING and offers the nearest valid from (+ fov); the requested view is still rendered.'),
52
+ fill: z.number().optional().describe("Share of the frame the nodes span along their limiting dimension (0.1..1.5, default 0.8)."),
53
+ fov: z.number().optional().describe("Vertical field of view in degrees (default 50)."),
54
+ max_size: maxSize(1024),
55
+ aspect,
56
+ marks: z
57
+ .boolean()
58
+ .optional()
59
+ .describe("Numbered Set-of-Mark labels over the largest visible nodes; the caption maps label -> node path (feed a label to summer_zoom mark). Each labelled node gets an occlusion test (centre + 4 bounds points); a node hidden behind other geometry is noted \"(hidden behind <path>)\" — ignore its label."),
60
+ max_marks: z.number().int().min(1).max(128).optional().describe("marks only: cap on labels (engine default 32)."),
61
+ bookmark_name: z
62
+ .string()
63
+ .optional()
64
+ .describe("Also save the fitted pose as this camera bookmark (1-64 of A-Z a-z 0-9 _ -), so later renders line up with it."),
65
+ };
66
+ const shotShape = z.object({
67
+ bookmark_name: bookmarkName,
68
+ camera_position: cameraPosition,
69
+ camera_look_at: cameraLookAt,
70
+ fov,
71
+ label: z.string().optional().describe("Tile label (1-64 printable characters, no quotes, backslashes or $). Default: the bookmark name or 'shot N'."),
72
+ });
73
+ export const shotSheetShape = {
74
+ scenePath,
75
+ shots: z
76
+ .array(shotShape)
77
+ .min(1)
78
+ .max(12)
79
+ .describe("1-12 shots, each a bookmark_name OR camera_position + camera_look_at (+ fov), with an optional label. Rendered in this order, left to right, top to bottom."),
80
+ view,
81
+ compare_previous: z
82
+ .boolean()
83
+ .optional()
84
+ .describe("For bookmark shots: one row per bookmark of [previous render | now | difference map], with the share of changed pixels in the caption. The previous render is the bookmark's slot in res://.summer/shots/; this render replaces it (it is the next baseline)."),
85
+ update_previous: z
86
+ .boolean()
87
+ .optional()
88
+ .describe("Replace each bookmark's previous image (its compare baseline) with this render without comparing. Default false: a sheet without compare_previous only creates a missing slot and never overwrites an existing baseline."),
89
+ max_size: maxSize(1536),
90
+ aspect,
91
+ save_to: saveTo,
92
+ };
93
+ export const debugViewsShape = {
94
+ scenePath,
95
+ bookmark_name: bookmarkName,
96
+ camera_position: cameraPosition,
97
+ camera_look_at: cameraLookAt,
98
+ fov,
99
+ views: z
100
+ .array(z.enum(VIEW_MODES))
101
+ .max(8)
102
+ .optional()
103
+ .describe("Which views, in grid order (default all six: beauty, lighting, unshaded, normals, overdraw, wireframe)."),
104
+ update_previous: z
105
+ .boolean()
106
+ .optional()
107
+ .describe("bookmark_name only: replace the bookmark's previous image (compare baseline) with this beauty tile. Default false: only a missing slot is created."),
108
+ max_size: maxSize(1536),
109
+ aspect,
110
+ save_to: saveTo,
111
+ };
112
+ export const zoomShape = {
113
+ scenePath,
114
+ bookmark_name: bookmarkName,
115
+ camera_position: cameraPosition,
116
+ camera_look_at: cameraLookAt,
117
+ fov,
118
+ region: z
119
+ .array(z.number())
120
+ .length(4)
121
+ .optional()
122
+ .describe("[x, y, w, h] as fractions (0..1) of the frame from the same pose, x/y from the TOP-LEFT. Use this OR mark. Rendered EXACTLY (no padding by default, never widened to an aspect ratio): the image takes the region's own aspect, with dark bars only for extreme shapes."),
123
+ mark: z
124
+ .number()
125
+ .int()
126
+ .optional()
127
+ .describe("A label number from a marks:true render of the SAME pose and reference_size (summer_frame_nodes, or summer_screenshot framing free/bookmark at that size). The caption warns when that node is hidden behind other geometry at this pose."),
128
+ reference_size: z
129
+ .array(z.number().int())
130
+ .length(2)
131
+ .optional()
132
+ .describe("[width, height] of the frame region/mark refer to (default [1024, 576]). Sets the zoom's aspect."),
133
+ pad: z
134
+ .number()
135
+ .optional()
136
+ .describe("Margin added around the region on each side, as a fraction of its size (0..1; default 0 for region, 0.15 for mark). The caption's widened_because says when the rendered window is larger than asked."),
137
+ view,
138
+ max_size: maxSize(1024),
139
+ save_to: saveTo,
140
+ };
141
+ export const frameShotShape = {
142
+ scenePath,
143
+ shot: z
144
+ .enum(SHOT_TYPES)
145
+ .describe('"establishing" (wide, whole subject, 12-40 deg up; a pose showing more than 15% empty ground or world edge ranks below every pose showing less), "eye_level" (player eye at spawn: its Camera3D kept inside 1.5-1.8 m, or eye_height, above the walkable surface under the camera), "low_angle" (hero, camera near the ground looking up), "detail" (close-up), "corridor" (down a lane/corridor inside the subject, found by a free-space scan, at eye height; prefers looking in from its open end). Eye-level and corridor cameras are never raised: a pose that cannot stand at eye height moves horizontally or is rejected. Every top pose states its camera height above the surface below it and its absolute y.'),
146
+ subject: z
147
+ .array(z.string())
148
+ .max(8)
149
+ .optional()
150
+ .describe("Node paths to frame (required except for eye_level, where it is what the player looks at)."),
151
+ spawn: z.string().optional().describe("eye_level only: node the player stands at, e.g. the player or a spawn marker. Its own geometry never counts as an occluder."),
152
+ eye_height: z.number().optional().describe("eye_level/corridor: exact camera height in metres above the walkable surface under the camera (default: 1.6; an eye_level spawn's own Camera3D keeps its height clamped into 1.5-1.8)."),
153
+ fov: z.number().optional().describe("Override the shot type's field of view (establishing 55, eye_level 60/75, low_angle 60 then widened, detail 40, corridor 60/75)."),
154
+ aspect,
155
+ occluders: z
156
+ .object({
157
+ hard: z.array(z.string()).optional().describe("Path prefixes that must never block the view (walls, terrain): a pose they block is rejected."),
158
+ soft: z.array(z.string()).optional().describe("Path prefixes that may sit in front as framing (foliage, fences, props)."),
159
+ ignore: z.array(z.string()).optional().describe("Path prefixes left out of the visibility pass entirely."),
160
+ hard_layers: z.number().int().optional().describe("Physics layer mask: geometry whose nearest CollisionObject3D is on these layers is hard."),
161
+ soft_layers: z.number().int().optional().describe("Physics layer mask for soft geometry."),
162
+ })
163
+ .optional()
164
+ .describe("Override the occluder classification. Default: path names (wall/house/terrain... = hard; tree/fence/lamp/prop/pipe... = soft), MultiMesh = soft, else size (<= 2.5 m = soft). The caption reports the counts by rule."),
165
+ max_soft_fraction: z.number().optional().describe("Most of the subject that soft geometry may cover before a pose is rejected (0..1, default 0.67)."),
166
+ bookmark_name: z.string().optional().describe("Name for the saved best pose (default <shot>_<subject leaf>)."),
167
+ save_bookmark: z.boolean().optional().describe("Save the best pose as a camera bookmark (default true)."),
168
+ render: z
169
+ .enum(["sheet", "best", "none"])
170
+ .optional()
171
+ .describe('"sheet" (default): the top 3 in one labelled grid with real lighting; "best": the winner only; "none": scores only.'),
172
+ max_size: maxSize(1536),
173
+ };
174
+ export const frameNodesArgsSchema = z.object(frameNodesShape).strict();
175
+ export const shotSheetArgsSchema = z.object(shotSheetShape).strict();
176
+ export const debugViewsArgsSchema = z.object(debugViewsShape).strict();
177
+ export const zoomArgsSchema = z.object(zoomShape).strict();
178
+ export const frameShotArgsSchema = z.object(frameShotShape).strict();
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Smart framing, part 1: candidate camera poses per shot type. Pure and
3
+ * engine-free — the engine only measures what these poses would see
4
+ * (assets/seeing/seeing_probe.gd "measure"); scoring.ts ranks the result.
5
+ *
6
+ * Every candidate sits at the distance where the subject fills the shot
7
+ * type's target share of the frame (fitDistance), on a ring or hemisphere
8
+ * around the subject, or along a corridor's free line. Low angles follow the
9
+ * low-angle rule (closer + wider instead of buried in the ground).
10
+ */
11
+ import { type Aabb, type Vec3 } from "./math.js";
12
+ export declare const SHOT_TYPES: readonly ["establishing", "eye_level", "low_angle", "detail", "corridor"];
13
+ export type ShotType = (typeof SHOT_TYPES)[number];
14
+ /**
15
+ * Eye mode (eye_level and corridor): the camera stands at eye height above the
16
+ * walkable surface under it and is never raised. The engine finds that
17
+ * surface straight below the lens (overhead structure never counts), checks
18
+ * it is within a step of the floor under `stand`, and puts the camera
19
+ * `target` above it (without a target: its current height, clamped into
20
+ * min..max). A pose that cannot stand there moves horizontally or is rejected.
21
+ */
22
+ export interface EyeSpec {
23
+ /** Lowest and highest allowed camera height above the walkable surface (m). */
24
+ min: number;
25
+ max: number;
26
+ /** Height above the walkable surface to stand the camera at; absent = keep
27
+ * its own height inside min..max (a spawn's Camera3D). */
28
+ target?: number;
29
+ /** Where the player stands (spawn origin, corridor seed): the floor under it
30
+ * is the walkable reference. */
31
+ stand: Vec3;
32
+ }
33
+ export interface Candidate {
34
+ id: string;
35
+ position: Vec3;
36
+ look_at: Vec3;
37
+ fov: number;
38
+ /** World points the thick sweep must reach (subject bounds or corridor line). */
39
+ samples: Vec3[];
40
+ /** Below this height above the ground under the camera the engine applies
41
+ * the low-angle rule (or raises the camera when it is not looking up).
42
+ * Ignored in eye mode. */
43
+ min_clearance: number;
44
+ low_angle_rule: boolean;
45
+ /** Eye mode: eye_level and corridor poses. */
46
+ eye?: EyeSpec;
47
+ note?: string;
48
+ /** Corridor only: 1 = from an open end looking in, 0 = looking out of a
49
+ * dead end, 0.5 = a through passage (both ends alike). */
50
+ into?: number;
51
+ }
52
+ export interface SpawnInfo {
53
+ path: string;
54
+ origin: Vec3;
55
+ forward: Vec3;
56
+ camera?: {
57
+ path: string;
58
+ position: Vec3;
59
+ forward: Vec3;
60
+ fov: number;
61
+ };
62
+ }
63
+ export interface CorridorRun {
64
+ seed: Vec3;
65
+ dir: Vec3;
66
+ fwd: number;
67
+ back: number;
68
+ left: number;
69
+ right: number;
70
+ }
71
+ export interface CorridorAxis extends CorridorRun {
72
+ /** Free length inside the subject bounds (+ a small margin) along dir. */
73
+ usableFwd: number;
74
+ usableBack: number;
75
+ width: number;
76
+ score: number;
77
+ /** The free run continues past the subject bounds on that end: an
78
+ * entrance. A closed end is a dead end (or the far wall). */
79
+ openFwd: boolean;
80
+ openBack: boolean;
81
+ }
82
+ export interface CandidateContext {
83
+ shot: ShotType;
84
+ /** Merged bounds of the subject nodes (absent for a subject-less eye-level look). */
85
+ subject?: Aabb;
86
+ spawn?: SpawnInfo;
87
+ corridor?: CorridorAxis;
88
+ aspect: number;
89
+ /** Overrides the shot type's default fov. */
90
+ fov?: number;
91
+ eyeHeight?: number;
92
+ /** Ground height under the subject; defaults to the subject's lowest point. */
93
+ groundY?: number;
94
+ }
95
+ export interface ShotDefaults {
96
+ fov: number;
97
+ /** Target share of the frame along the subject's limiting dimension. */
98
+ fill: number;
99
+ }
100
+ export declare const SHOT_DEFAULTS: Record<ShotType, ShotDefaults>;
101
+ export declare const LOW_ANGLE_CLEARANCE = 0.35;
102
+ export declare const DEFAULT_CLEARANCE = 0.3;
103
+ export declare const MAX_FOV = 100;
104
+ export declare const DEFAULT_EYE_HEIGHT = 1.6;
105
+ /** A standing eye without an explicit eye_height: 1.5-1.8 m above the walkable
106
+ * surface under the camera. */
107
+ export declare const EYE_BAND: readonly [number, number];
108
+ /** The eye band: exactly eye_height when given, else EYE_BAND. */
109
+ export declare function eyeBand(eyeHeight: number | undefined): [number, number];
110
+ /** Nine points the thick sweep aims at: the center plus the eight corners
111
+ * pulled 40% toward it, so a subject standing on the ground still offers
112
+ * points above the ground plane. */
113
+ export declare function subjectSamples(box: Aabb): Vec3[];
114
+ /** Where a ray from `origin` along `dir` leaves `box` (slab test), or Infinity. */
115
+ export declare function exitDistance(box: Aabb, origin: Vec3, dir: Vec3): number;
116
+ /**
117
+ * Pick the corridor axis from the engine's free-run scan: the longest free
118
+ * line (clipped to the subject bounds + 2 m on each end) that is also narrow
119
+ * enough to read as a corridor and wide enough to walk.
120
+ */
121
+ export declare function chooseCorridorAxis(runs: readonly CorridorRun[], box: Aabb): CorridorAxis[];
122
+ /** The walkable floor along a corridor axis: the scan put its seed at eye
123
+ * height above the floor it found there. */
124
+ export declare function corridorFloorY(axis: CorridorRun, eyeHeight: number | undefined): number;
125
+ export declare function generateCandidates(ctx: CandidateContext): Candidate[];
126
+ /** Corridor "subject" box used for frame metrics: the free line it looks down. */
127
+ export declare function corridorBox(axis: CorridorAxis, floorY: number): Aabb;