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