summer-engine 2.8.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +149 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +161 -393
- 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/cli/commands/setup.js +158 -0
- package/dist/{commands → cli/commands}/skills.js +121 -251
- 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 +55 -0
- package/dist/core/skills-registry.js +106 -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/installer/agent-config.d.ts +63 -0
- package/dist/installer/agent-config.js +540 -0
- package/dist/installer/agent-table.d.ts +103 -0
- package/dist/installer/agent-table.js +584 -0
- 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 +148 -0
- package/dist/installer/skill-locations.d.ts +36 -0
- package/dist/installer/skill-locations.js +91 -0
- package/dist/installer/version-check.d.ts +178 -0
- package/dist/installer/version-check.js +479 -0
- 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 +99 -0
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +12 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -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/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +12 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +12 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +14 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +12 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/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/library/skills/README.md +242 -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/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 +22 -22
- 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 +8 -0
- 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/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/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 +21 -15
- 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-index.md +242 -0
- package/registry/generated/skills-registry.json +1249 -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/setup.js +0 -217
- package/dist/commands/status.js +0 -46
- package/dist/lib/agent-config.d.ts +0 -39
- package/dist/lib/agent-config.js +0 -626
- 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/lib/version-check.js +0 -338
- 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/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.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/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
- /package/{skills/ui-and-ux → library/skills}/ui-basics/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,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine/CLI capability handshake.
|
|
3
|
+
*
|
|
4
|
+
* The MCP server and the engine build ship separately, so the tool surface can
|
|
5
|
+
* outrun the engine in the field. Newer engines advertise their dispatchable
|
|
6
|
+
* op kinds (and a protocol version) in /api/health `capabilities`. Two uses:
|
|
7
|
+
*
|
|
8
|
+
* 1. summer_get_project_context compares the advertised `opKinds` against
|
|
9
|
+
* the ops this CLI's tools send and surfaces a ONE-LINE, NON-FATAL
|
|
10
|
+
* warning (plus one mcp.log line per process).
|
|
11
|
+
* 2. Tools whose op the engine does not advertise return a STRUCTURED
|
|
12
|
+
* "engine lacks op X (engine version Y); update the engine" result
|
|
13
|
+
* BEFORE sending anything, instead of a raw "unknown op" error.
|
|
14
|
+
*
|
|
15
|
+
* Engines that predate `capabilities.opKinds` stay silent on both paths — an
|
|
16
|
+
* absent list proves nothing, and the per-tool "unknown op" hints still cover
|
|
17
|
+
* the failure at call time.
|
|
18
|
+
*/
|
|
19
|
+
/** Protocol generation this CLI speaks. Bump only alongside a real wire
|
|
20
|
+
* change; used purely for the skew warning, never to refuse a connection. */
|
|
21
|
+
export const CLI_PROTOCOL_VERSION = 1;
|
|
22
|
+
/**
|
|
23
|
+
* Every engine op kind this package's tools CONSTRUCT themselves (every
|
|
24
|
+
* `op: "<Kind>"` literal under src/, MCP tools and the CLI dispatcher alike).
|
|
25
|
+
* capability-skew.test.ts scans the sources and fails when a literal is
|
|
26
|
+
* missing here; src/core/op-registry-drift.test.ts guards the other direction
|
|
27
|
+
* inside the engine monorepo (never send an op the engine has no branch for).
|
|
28
|
+
*
|
|
29
|
+
* Deliberately NOT listed: ops an agent may compose by hand through
|
|
30
|
+
* summer_batch / `summer tool batch` (MoveNode, ReparentNode, DisconnectSignal,
|
|
31
|
+
* Undo, Git*, RunCommand, ExtractZipFromUrl, CustomBake, ...). The CLI only
|
|
32
|
+
* classifies those for dispatch (single-only / scene-mutation sets) and never
|
|
33
|
+
* sends them on its own, so listing them would warn about skew the CLI cannot
|
|
34
|
+
* cause; the engine's per-op "unknown op" error still covers them at call time.
|
|
35
|
+
*/
|
|
36
|
+
export const CLI_KNOWN_OP_NEEDS = [
|
|
37
|
+
// Scene graph + properties
|
|
38
|
+
"AddNode", "RemoveNode", "ReplaceNode", "SetProp", "SetResourceProperty",
|
|
39
|
+
"ConnectSignal", "SelectNode", "OpenScene", "SaveScene", "InstantiateScene",
|
|
40
|
+
// Navigation (summer_open: core/capabilities/navigation/) — Navigate is the
|
|
41
|
+
// one-table op (engine navigate_ops.cpp); the other three are the legacy
|
|
42
|
+
// fallbacks on engines that predate it.
|
|
43
|
+
"Navigate", "OpenResource", "FocusDock", "RevealInFileSystem",
|
|
44
|
+
// Project + input
|
|
45
|
+
"ProjectSetting", "InputMapAddAction", "InputMapBind",
|
|
46
|
+
// Files (summer_write_file / summer_replace_text / summer_create_scene)
|
|
47
|
+
"WriteFile",
|
|
48
|
+
// Import
|
|
49
|
+
"ImportFromUrl", "ImportFromUrlBatch",
|
|
50
|
+
// Diagnostics + runtime control
|
|
51
|
+
"GetConsoleOutput", "ClearConsoleOutput", "GetDebuggerErrors", "IsGameRunning",
|
|
52
|
+
// summer_play / summer_stop send these as ops for the instance-aware and
|
|
53
|
+
// determinism variants (seed / fixed_fps / time_scale, instance / mode) —
|
|
54
|
+
// the legacy /api/play route forwards only `scene`, so the plain launch
|
|
55
|
+
// stays there.
|
|
56
|
+
"PlayGame", "StopGame",
|
|
57
|
+
// runtime control & playtest ops (summer_runtime_* / summer_game_*)
|
|
58
|
+
"SetRuntimeProp", "CallRuntimeMethod", "SpawnRuntimeScene", "FreeRuntimeNode",
|
|
59
|
+
"RuntimeAnimation", "RuntimeAnimationTree", "GetRuntimeBones",
|
|
60
|
+
"GamePause", "GameStep", "GameSpeed",
|
|
61
|
+
"SimulateInputScript", "InputRecordStart", "InputRecordStop", "InputReplay",
|
|
62
|
+
"GameProbe", "ListGameInstances",
|
|
63
|
+
// Capture (+ camera bookmarks: summer_camera_bookmark, perception)
|
|
64
|
+
"ViewportSnapshot", "GameSnapshot", "ScenePreview",
|
|
65
|
+
"SaveCameraBookmark", "ListCameraBookmarks", "DeleteCameraBookmark",
|
|
66
|
+
// Scripting + verification
|
|
67
|
+
"RunSceneScript", "RunEditorScript", "RunVerification", "SimulateInput",
|
|
68
|
+
// Perception
|
|
69
|
+
"GetWorldSnapshot", "DiffWorldSnapshot", "GetRuntimeSceneTree", "GetRuntimeNode",
|
|
70
|
+
// Spatial / world building
|
|
71
|
+
"TestPlacement3D", "SnapToSurface", "AlignDistribute3D", "NavigationProbe3D",
|
|
72
|
+
"Starcast3D",
|
|
73
|
+
// Mesh fabrication (summer_fabricate_3d — the user's own Blender, engine-supervised)
|
|
74
|
+
"FabricateMesh",
|
|
75
|
+
// Editor UI control (editor UI control: summer_ui_actions / summer_ui_tree /
|
|
76
|
+
// summer_ui_activate / summer_ui_screenshot). All synchronous and
|
|
77
|
+
// batchable — none joins the single-only set.
|
|
78
|
+
"UiListActions", "UiInvoke", "UiTree", "UiActivate", "UiScreenshot",
|
|
79
|
+
"UiDialogs", "UiDismissDialog",
|
|
80
|
+
];
|
|
81
|
+
/** The `capabilities` block of /api/health, shape-checked. Every field is
|
|
82
|
+
* optional: an older engine advertises none of them. */
|
|
83
|
+
/**
|
|
84
|
+
* Escape hatch for the capability pre-flight. The op advert and the ops
|
|
85
|
+
* themselves ship on different engine branches, so an engine can IMPLEMENT an
|
|
86
|
+
* op it does not yet ADVERTISE; with the pre-flight on, such a tool would be
|
|
87
|
+
* refused before sending. `SUMMER_CAPABILITY_PREFLIGHT=off` sends every call
|
|
88
|
+
* and lets the engine's own "unknown op" error decide. The skew warning still
|
|
89
|
+
* prints (it is informational) but notes that the pre-flight is off.
|
|
90
|
+
*/
|
|
91
|
+
export const CAPABILITY_PREFLIGHT_ENV = "SUMMER_CAPABILITY_PREFLIGHT";
|
|
92
|
+
export function isCapabilityPreflightDisabled(env = process.env) {
|
|
93
|
+
const raw = env[CAPABILITY_PREFLIGHT_ENV]?.trim().toLowerCase();
|
|
94
|
+
return raw === "off" || raw === "0" || raw === "false";
|
|
95
|
+
}
|
|
96
|
+
const PREFLIGHT_OFF_HINT = `If your engine build implements this op but does not advertise it yet, set ${CAPABILITY_PREFLIGHT_ENV}=off in the MCP server's environment to skip this pre-flight and let the engine answer.`;
|
|
97
|
+
function stringList(value) {
|
|
98
|
+
if (!Array.isArray(value))
|
|
99
|
+
return undefined;
|
|
100
|
+
return value.filter((entry) => typeof entry === "string");
|
|
101
|
+
}
|
|
102
|
+
function finiteNumber(value) {
|
|
103
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
104
|
+
}
|
|
105
|
+
/** Parse a raw `capabilities.events` value. Any plain object counts as an
|
|
106
|
+
* advert (an engine may advertise `events: {}`); anything else is "absent". */
|
|
107
|
+
function parseEventsCapability(raw) {
|
|
108
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
109
|
+
return undefined;
|
|
110
|
+
const record = raw;
|
|
111
|
+
const out = {};
|
|
112
|
+
const kinds = stringList(record.kinds);
|
|
113
|
+
if (kinds)
|
|
114
|
+
out.kinds = kinds;
|
|
115
|
+
for (const key of ["ring", "retainMs", "maxPayloadBytes", "maxStreams", "heartbeatMs"]) {
|
|
116
|
+
const value = finiteNumber(record[key]);
|
|
117
|
+
if (value !== undefined)
|
|
118
|
+
out[key] = value;
|
|
119
|
+
}
|
|
120
|
+
for (const key of ["sse", "poll"]) {
|
|
121
|
+
if (typeof record[key] === "boolean")
|
|
122
|
+
out[key] = record[key];
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
function parseRuntimeControl(raw) {
|
|
127
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
128
|
+
return undefined;
|
|
129
|
+
const record = raw;
|
|
130
|
+
const out = {};
|
|
131
|
+
const ops = stringList(record.ops);
|
|
132
|
+
if (ops)
|
|
133
|
+
out.ops = ops;
|
|
134
|
+
if (typeof record.summerCapture === "boolean")
|
|
135
|
+
out.summerCapture = record.summerCapture;
|
|
136
|
+
if (typeof record.maxOffscreenInstances === "number" && Number.isFinite(record.maxOffscreenInstances)) {
|
|
137
|
+
out.maxOffscreenInstances = record.maxOffscreenInstances;
|
|
138
|
+
}
|
|
139
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
140
|
+
}
|
|
141
|
+
/** Every op kind the engine advertises: `opKinds` plus the
|
|
142
|
+
* `runtimeControl.ops` block (an engine may list the runtime kinds only
|
|
143
|
+
* there). Undefined when the engine advertises no op list at all. */
|
|
144
|
+
export function advertisedOpKinds(capabilities) {
|
|
145
|
+
if (!capabilities?.opKinds)
|
|
146
|
+
return undefined;
|
|
147
|
+
return new Set([...capabilities.opKinds, ...(capabilities.runtimeControl?.ops ?? [])]);
|
|
148
|
+
}
|
|
149
|
+
/** Parse a raw /api/health `capabilities` value. Tolerates any shape; returns
|
|
150
|
+
* undefined when nothing usable is advertised. Never throws. */
|
|
151
|
+
export function parseEngineCapabilities(raw) {
|
|
152
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
153
|
+
return undefined;
|
|
154
|
+
const record = raw;
|
|
155
|
+
const out = {};
|
|
156
|
+
const rawProtocol = record.protocolVersion;
|
|
157
|
+
const protocolVersion = typeof rawProtocol === "number"
|
|
158
|
+
? rawProtocol
|
|
159
|
+
: typeof rawProtocol === "string" && /^\d+$/.test(rawProtocol)
|
|
160
|
+
? Number.parseInt(rawProtocol, 10)
|
|
161
|
+
: undefined;
|
|
162
|
+
if (protocolVersion !== undefined)
|
|
163
|
+
out.protocolVersion = protocolVersion;
|
|
164
|
+
const opKinds = stringList(record.opKinds);
|
|
165
|
+
if (opKinds)
|
|
166
|
+
out.opKinds = opKinds;
|
|
167
|
+
const singleOnlyOps = stringList(record.singleOnlyOps);
|
|
168
|
+
if (singleOnlyOps)
|
|
169
|
+
out.singleOnlyOps = singleOnlyOps;
|
|
170
|
+
const events = parseEventsCapability(record.events);
|
|
171
|
+
if (events)
|
|
172
|
+
out.events = events;
|
|
173
|
+
const runtimeControl = parseRuntimeControl(record.runtimeControl);
|
|
174
|
+
if (runtimeControl)
|
|
175
|
+
out.runtimeControl = runtimeControl;
|
|
176
|
+
const navigation = parseNavigation(record.navigation);
|
|
177
|
+
if (navigation)
|
|
178
|
+
out.navigation = navigation;
|
|
179
|
+
const launchPostures = stringList(record.launchPostures) ?? stringList(record.launch_postures);
|
|
180
|
+
if (launchPostures)
|
|
181
|
+
out.launchPostures = launchPostures;
|
|
182
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
183
|
+
}
|
|
184
|
+
function parseNavigation(raw) {
|
|
185
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
186
|
+
return undefined;
|
|
187
|
+
const record = raw;
|
|
188
|
+
if (!Array.isArray(record.targets))
|
|
189
|
+
return undefined;
|
|
190
|
+
const targets = [];
|
|
191
|
+
for (const entry of record.targets) {
|
|
192
|
+
if (!entry || typeof entry !== "object")
|
|
193
|
+
continue;
|
|
194
|
+
const item = entry;
|
|
195
|
+
if (typeof item.id !== "string" || item.id.length === 0)
|
|
196
|
+
continue;
|
|
197
|
+
const args = stringList(item.args);
|
|
198
|
+
targets.push({
|
|
199
|
+
id: item.id,
|
|
200
|
+
...(typeof item.title === "string" ? { title: item.title } : {}),
|
|
201
|
+
...(args ? { args } : {}),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const version = typeof record.version === "number" ? record.version : undefined;
|
|
205
|
+
return { ...(version !== undefined ? { version } : {}), targets };
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* True ONLY when the engine advertises an op list and `op` is not on it. An
|
|
209
|
+
* engine without an advert returns false — we cannot prove absence, so the
|
|
210
|
+
* call goes through and the per-tool "unknown op" hint handles the failure.
|
|
211
|
+
*/
|
|
212
|
+
export function engineLacksOp(capabilities, op) {
|
|
213
|
+
const advertised = advertisedOpKinds(capabilities);
|
|
214
|
+
if (!advertised)
|
|
215
|
+
return false;
|
|
216
|
+
return !advertised.has(op);
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* The structured result a tool returns when the engine provably lacks its op.
|
|
220
|
+
* Shaped like an engine op failure ({ok:false, op, error, failure_reason}) so
|
|
221
|
+
* withEngine/extractOpError classify it the same way, and the model reads the
|
|
222
|
+
* upgrade path instead of retrying.
|
|
223
|
+
*/
|
|
224
|
+
export function buildMissingOpResult(op, engineVersion, fallback) {
|
|
225
|
+
const version = engineVersion ?? null;
|
|
226
|
+
return {
|
|
227
|
+
ok: false,
|
|
228
|
+
op,
|
|
229
|
+
failure_reason: "engine_lacks_op",
|
|
230
|
+
engine_version: version,
|
|
231
|
+
error: `This Summer Engine build${version ? ` (engine version ${version})` : ""} does not support the ${op} op — ` +
|
|
232
|
+
"nothing was sent. Update Summer Engine (restart it after updating). " +
|
|
233
|
+
`Until then: ${fallback}. ${PREFLIGHT_OFF_HINT}`,
|
|
234
|
+
hint: `${fallback}. ${PREFLIGHT_OFF_HINT}`,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Events channel pre-flight (a capability, not an op — deliberately NOT folded
|
|
239
|
+
// into CLI_KNOWN_OP_NEEDS / engineLacksOp)
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
/**
|
|
242
|
+
* True when the engine does NOT advertise the events channel. Unlike ops,
|
|
243
|
+
* where an absent `opKinds` list proves nothing (ops predate the advert), the
|
|
244
|
+
* events channel and its `capabilities.events` advert ship together: a build
|
|
245
|
+
* with the channel always advertises it, so absence — including an engine that
|
|
246
|
+
* advertises no capabilities at all — is proof.
|
|
247
|
+
*/
|
|
248
|
+
export function engineLacksEvents(capabilities) {
|
|
249
|
+
return !capabilities?.events;
|
|
250
|
+
}
|
|
251
|
+
/** What the events tools tell the model to do when the channel is missing. */
|
|
252
|
+
export const EVENTS_FALLBACK = "poll the state you are waiting for instead (summer_is_running after summer_play; summer_get_debugger_errors / summer_get_console for script errors; summer_get_scene_tree after a long op)";
|
|
253
|
+
const EVENTS_PREFLIGHT_OFF_HINT = `If your engine build serves GET /api/events/poll but does not advertise capabilities.events yet, set ${CAPABILITY_PREFLIGHT_ENV}=off in the MCP server's environment to skip this pre-flight and let the engine answer.`;
|
|
254
|
+
/**
|
|
255
|
+
* The structured result an events tool returns when the engine provably lacks
|
|
256
|
+
* the channel. Shaped like buildMissingOpResult ({ok:false, failure_reason,
|
|
257
|
+
* engine_version, error, hint}) so withEngine/extractOpError classify it the
|
|
258
|
+
* same way and `summer tool` prints it whole — but under its own
|
|
259
|
+
* failure_reason, because no op was ever involved.
|
|
260
|
+
*/
|
|
261
|
+
export function buildMissingEventsResult(engineVersion, fallback = EVENTS_FALLBACK) {
|
|
262
|
+
const version = engineVersion ?? null;
|
|
263
|
+
return {
|
|
264
|
+
ok: false,
|
|
265
|
+
failure_reason: "engine_lacks_events",
|
|
266
|
+
engine_version: version,
|
|
267
|
+
error: `This Summer Engine build${version ? ` (engine version ${version})` : ""} does not expose the events channel ` +
|
|
268
|
+
"(no capabilities.events in /api/health) — nothing was sent. Update Summer Engine to a build with the events channel " +
|
|
269
|
+
`(restart it after updating). Until then: ${fallback}. ${EVENTS_PREFLIGHT_OFF_HINT}`,
|
|
270
|
+
hint: `${fallback}. ${EVENTS_PREFLIGHT_OFF_HINT}`,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Capability pre-flight for the events tools (summer_wait_for_event,
|
|
275
|
+
* summer_recent_events, `summer events`). Returns a structured
|
|
276
|
+
* engine_lacks_events result (nothing is sent) when the engine's /api/health
|
|
277
|
+
* advert lacks `capabilities.events`; null when the channel is advertised or
|
|
278
|
+
* the SUMMER_CAPABILITY_PREFLIGHT=off escape hatch is set. Sibling of
|
|
279
|
+
* missingEngineOpResult — kept separate because events are a capability, not
|
|
280
|
+
* an op kind.
|
|
281
|
+
*/
|
|
282
|
+
export function missingEngineEventsResult(client, fallback = EVENTS_FALLBACK) {
|
|
283
|
+
if (isCapabilityPreflightDisabled())
|
|
284
|
+
return null;
|
|
285
|
+
const capabilities = typeof client.getEngineCapabilities === "function"
|
|
286
|
+
? client.getEngineCapabilities()
|
|
287
|
+
: undefined;
|
|
288
|
+
if (!engineLacksEvents(capabilities))
|
|
289
|
+
return null;
|
|
290
|
+
const version = typeof client.getEngineVersion === "function" ? client.getEngineVersion() : undefined;
|
|
291
|
+
return buildMissingEventsResult(version ?? null, fallback);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Build the one-line skew warning from a raw /api/health payload, or null when
|
|
295
|
+
* there is nothing trustworthy to say (no capabilities advertised, or no skew).
|
|
296
|
+
* Shape-tolerant: never throws on odd payloads.
|
|
297
|
+
*/
|
|
298
|
+
export function buildCapabilitySkewWarning(health) {
|
|
299
|
+
if (!health || typeof health !== "object")
|
|
300
|
+
return null;
|
|
301
|
+
const capabilities = parseEngineCapabilities(health.capabilities);
|
|
302
|
+
if (!capabilities)
|
|
303
|
+
return null;
|
|
304
|
+
const parts = [];
|
|
305
|
+
if (capabilities.protocolVersion !== undefined &&
|
|
306
|
+
capabilities.protocolVersion !== CLI_PROTOCOL_VERSION) {
|
|
307
|
+
parts.push(`engine protocolVersion ${capabilities.protocolVersion} != CLI protocolVersion ${CLI_PROTOCOL_VERSION}`);
|
|
308
|
+
}
|
|
309
|
+
const advertised = advertisedOpKinds(capabilities);
|
|
310
|
+
if (advertised) {
|
|
311
|
+
const missing = CLI_KNOWN_OP_NEEDS.filter((op) => !advertised.has(op));
|
|
312
|
+
if (missing.length > 0) {
|
|
313
|
+
parts.push(`engine does not advertise ${missing.length} op(s) this CLI can send (${missing.join(", ")})`);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
if (parts.length === 0)
|
|
317
|
+
return null;
|
|
318
|
+
const preflight = isCapabilityPreflightDisabled()
|
|
319
|
+
? `Non-fatal — ${CAPABILITY_PREFLIGHT_ENV}=off is set, so affected tools are sent anyway and the engine's own unknown-op error decides.`
|
|
320
|
+
: `Non-fatal — affected tools return a structured engine_lacks_op result instead of running (set ${CAPABILITY_PREFLIGHT_ENV}=off to send them anyway if your engine implements an op it does not advertise).`;
|
|
321
|
+
return (`Engine/CLI version skew detected: ${parts.join("; ")}. ` +
|
|
322
|
+
`${preflight} Update Summer Engine (or the summer-engine CLI) so both sides match.`);
|
|
323
|
+
}
|
|
324
|
+
// ---------------------------------------------------------------------------
|
|
325
|
+
// Single-only dispatch classification
|
|
326
|
+
// ---------------------------------------------------------------------------
|
|
327
|
+
/**
|
|
328
|
+
* Engine ops that MUST be dispatched as their own single-op request. Mirrors
|
|
329
|
+
* _summer_requires_single_async_dispatch (local_api_server.cpp, engine
|
|
330
|
+
* 0.5.60+): the engine rejects any multi-op batch containing one of these
|
|
331
|
+
* WHOLESALE — nothing in the batch executes, and the batch fails with per-op
|
|
332
|
+
* failure_reason "unsupported_transport"/"skipped". Git ops are covered by a
|
|
333
|
+
* prefix check in the dispatchers.
|
|
334
|
+
*
|
|
335
|
+
* This hardcoded list is the FALLBACK for engines that predate the
|
|
336
|
+
* /api/health `capabilities.singleOnlyOps` advert; when the engine advertises
|
|
337
|
+
* its own list, that list is authoritative (resolveSingleOnlyOps).
|
|
338
|
+
*/
|
|
339
|
+
export const FALLBACK_SINGLE_ONLY_OPS = new Set([
|
|
340
|
+
"SaveScene", "InstantiateScene", "ReplaceNode",
|
|
341
|
+
"SimulateInput", "ViewportSnapshot", "GameSnapshot",
|
|
342
|
+
// Runtime debugger reads share GameSnapshot's async single-only dispatch
|
|
343
|
+
// classification.
|
|
344
|
+
"GetRuntimeSceneTree", "GetRuntimeNode",
|
|
345
|
+
"RunCommand", "RunVerification", "RunEditorScript", "RunSceneScript",
|
|
346
|
+
"ImportFromUrl", "ImportFromUrlBatch", "ExtractZipFromUrl",
|
|
347
|
+
// Mesh fabrication: a headless Blender child on the same async single-op lane as
|
|
348
|
+
// RunEditorScript (local_api_server.cpp SUMMER_SINGLE_ASYNC_OPS).
|
|
349
|
+
"FabricateMesh",
|
|
350
|
+
// runtime control (RuntimeOps::async_op_kinds): every op below rides
|
|
351
|
+
// the `summer` debugger capture, so like GameSnapshot each needs the async
|
|
352
|
+
// single-op reply channel. ListGameInstances is deliberately NOT here — it
|
|
353
|
+
// is a cheap synchronous editor read that batches fine (runtime_ops.h).
|
|
354
|
+
"SetRuntimeProp", "CallRuntimeMethod", "SpawnRuntimeScene", "FreeRuntimeNode",
|
|
355
|
+
"RuntimeAnimation", "RuntimeAnimationTree", "GetRuntimeBones",
|
|
356
|
+
"GamePause", "GameSpeed", "GameStep",
|
|
357
|
+
"SimulateInputScript", "InputRecordStart", "InputRecordStop", "InputReplay",
|
|
358
|
+
"GameProbe",
|
|
359
|
+
]);
|
|
360
|
+
/** The single-only op set for THIS engine: its advertised
|
|
361
|
+
* `capabilities.singleOnlyOps` when present, else the hardcoded fallback. An
|
|
362
|
+
* empty advertised list counts as no advert — never as "everything batches". */
|
|
363
|
+
export function resolveSingleOnlyOps(client) {
|
|
364
|
+
const advertised = typeof client.getEngineCapabilities === "function"
|
|
365
|
+
? client.getEngineCapabilities()?.singleOnlyOps
|
|
366
|
+
: undefined;
|
|
367
|
+
return advertised && advertised.length > 0 ? new Set(advertised) : FALLBACK_SINGLE_ONLY_OPS;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Capability pre-flight for tools that depend on an op an older engine may
|
|
371
|
+
* lack. Returns a structured engine_lacks_op result (nothing is sent) when
|
|
372
|
+
* the engine's /api/health advert PROVES the op is missing; null otherwise —
|
|
373
|
+
* including for engines that advertise nothing, where the per-tool
|
|
374
|
+
* "unknown op" hint still covers the failure at call time.
|
|
375
|
+
*/
|
|
376
|
+
export function missingEngineOpResult(client, op, fallback) {
|
|
377
|
+
if (isCapabilityPreflightDisabled())
|
|
378
|
+
return null;
|
|
379
|
+
const capabilities = typeof client.getEngineCapabilities === "function"
|
|
380
|
+
? client.getEngineCapabilities()
|
|
381
|
+
: undefined;
|
|
382
|
+
if (!engineLacksOp(capabilities, op))
|
|
383
|
+
return null;
|
|
384
|
+
const version = typeof client.getEngineVersion === "function" ? client.getEngineVersion() : undefined;
|
|
385
|
+
return buildMissingOpResult(op, version ?? null, fallback);
|
|
386
|
+
}
|
|
@@ -16,5 +16,15 @@ export declare function getConfigValue(config: SummerConfig, key: ConfigKey): st
|
|
|
16
16
|
export declare function setConfigValue(key: ConfigKey, rawValue: string): Promise<SummerConfig>;
|
|
17
17
|
export declare function unsetConfigValue(key: ConfigKey): Promise<SummerConfig>;
|
|
18
18
|
export declare function isConfigKey(value: string): value is ConfigKey;
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* The ONE gateway base URL for every Summer gateway call: login, generation,
|
|
21
|
+
* asset search/get, job polling, telemetry, and library feedback all resolve
|
|
22
|
+
* through here so a token minted against one gateway is never posted to
|
|
23
|
+
* another. Precedence: SUMMER_GATEWAY_URL env > ~/.summer/config.json
|
|
24
|
+
* gateway.url > production. Resolved at CALL time (never at import) so a
|
|
25
|
+
* config change is seen by every caller in the same process, and validated on
|
|
26
|
+
* every read: HTTPS only, except plain HTTP to loopback for local development.
|
|
27
|
+
* Returns an origin-like base without a trailing slash.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveGatewayUrl(): Promise<string>;
|
|
20
30
|
export declare function getCreatorApiUrl(): Promise<string>;
|
|
@@ -129,12 +129,23 @@ export async function unsetConfigValue(key) {
|
|
|
129
129
|
export function isConfigKey(value) {
|
|
130
130
|
return CONFIG_KEYS.includes(value);
|
|
131
131
|
}
|
|
132
|
-
|
|
132
|
+
/**
|
|
133
|
+
* The ONE gateway base URL for every Summer gateway call: login, generation,
|
|
134
|
+
* asset search/get, job polling, telemetry, and library feedback all resolve
|
|
135
|
+
* through here so a token minted against one gateway is never posted to
|
|
136
|
+
* another. Precedence: SUMMER_GATEWAY_URL env > ~/.summer/config.json
|
|
137
|
+
* gateway.url > production. Resolved at CALL time (never at import) so a
|
|
138
|
+
* config change is seen by every caller in the same process, and validated on
|
|
139
|
+
* every read: HTTPS only, except plain HTTP to loopback for local development.
|
|
140
|
+
* Returns an origin-like base without a trailing slash.
|
|
141
|
+
*/
|
|
142
|
+
export async function resolveGatewayUrl() {
|
|
133
143
|
const environment = process.env.SUMMER_GATEWAY_URL?.trim();
|
|
134
144
|
if (environment)
|
|
135
145
|
return validateGatewayUrl(environment);
|
|
136
146
|
const config = await readSummerConfig();
|
|
137
|
-
|
|
147
|
+
const configured = config.gateway?.url?.trim();
|
|
148
|
+
return configured ? validateGatewayUrl(configured) : DEFAULT_GATEWAY_URL;
|
|
138
149
|
}
|
|
139
150
|
export async function getCreatorApiUrl() {
|
|
140
151
|
const config = await readSummerConfig();
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embeddings — the one implementation of the wire protocol, the vector
|
|
3
|
+
* encoding, and the vector math behind semantic library search.
|
|
4
|
+
*
|
|
5
|
+
* Shared by the runtime (src/core/library-search.ts: embed the QUERY) and the
|
|
6
|
+
* registry compiler (scripts/generate-registry/embed.ts: embed every ENTRY
|
|
7
|
+
* into registry/generated/embeddings.json). Deliberately free of relative
|
|
8
|
+
* imports so the compiler script can load it as plain TypeScript the way
|
|
9
|
+
* evals/routing/runner.ts loads registry-search.ts.
|
|
10
|
+
*
|
|
11
|
+
* Provider protocol (SUMMER_EMBED_URL, or <gateway>/api/mcp/embed):
|
|
12
|
+
* POST { text } -> 2xx JSON { vector: number[], model?: string }
|
|
13
|
+
* Anything else — non-2xx, timeout, malformed body, wrong dims — is a
|
|
14
|
+
* provider failure. Callers decide what that means (the runtime degrades to
|
|
15
|
+
* lexical search; the compiler aborts the embed step).
|
|
16
|
+
*
|
|
17
|
+
* File format (registry/generated/embeddings.json), a sidecar of index.json:
|
|
18
|
+
* { _generated, model, dims, encoding: "base64-float32",
|
|
19
|
+
* entries: { "<id>": { content_hash, vector: "<base64 float32 LE>" } } }
|
|
20
|
+
* base64 float32 is ~2x smaller than rounded JSON number arrays and ~5x
|
|
21
|
+
* smaller than full-precision ones (measured on 384-dim vectors), and
|
|
22
|
+
* lossless for float32 providers.
|
|
23
|
+
*/
|
|
24
|
+
export declare const EMBEDDINGS_FILE = "embeddings.json";
|
|
25
|
+
export declare const EMBEDDINGS_ENCODING = "base64-float32";
|
|
26
|
+
export declare const EMBED_PATH = "/api/mcp/embed";
|
|
27
|
+
export interface EmbeddingsEntry {
|
|
28
|
+
content_hash: string;
|
|
29
|
+
/** base64-encoded little-endian float32 array (EMBEDDINGS_ENCODING). */
|
|
30
|
+
vector: string;
|
|
31
|
+
}
|
|
32
|
+
export interface EmbeddingsFile {
|
|
33
|
+
_generated?: string;
|
|
34
|
+
model: string;
|
|
35
|
+
dims: number;
|
|
36
|
+
encoding: typeof EMBEDDINGS_ENCODING;
|
|
37
|
+
entries: Record<string, EmbeddingsEntry>;
|
|
38
|
+
}
|
|
39
|
+
export interface EmbedResponse {
|
|
40
|
+
vector: number[];
|
|
41
|
+
model?: string;
|
|
42
|
+
}
|
|
43
|
+
export type EmbedProvider = (text: string) => Promise<EmbedResponse>;
|
|
44
|
+
export interface EmbedProviderOptions {
|
|
45
|
+
url: string;
|
|
46
|
+
/** Summer account token; sent as an Authorization header when present. */
|
|
47
|
+
token?: string | null;
|
|
48
|
+
timeoutMs: number;
|
|
49
|
+
fetchImpl?: typeof fetch;
|
|
50
|
+
}
|
|
51
|
+
export declare function encodeVector(vector: readonly number[]): string;
|
|
52
|
+
export declare function decodeVector(encoded: string): Float32Array;
|
|
53
|
+
export declare function cosineSimilarity(a: ArrayLike<number>, b: ArrayLike<number>): number;
|
|
54
|
+
/** Reciprocal rank fusion (Cormack et al. 2009): score(d) = sum over lists of
|
|
55
|
+
* 1 / (k + rank), rank starting at 1. Ties break on id for determinism. */
|
|
56
|
+
export declare const RRF_K = 60;
|
|
57
|
+
export declare function reciprocalRankFusion(rankedLists: ReadonlyArray<readonly string[]>, k?: number): Array<{
|
|
58
|
+
id: string;
|
|
59
|
+
score: number;
|
|
60
|
+
}>;
|
|
61
|
+
export interface EmbeddableEntry {
|
|
62
|
+
summary?: unknown;
|
|
63
|
+
use_when?: unknown;
|
|
64
|
+
facets?: unknown;
|
|
65
|
+
}
|
|
66
|
+
/** The text an entry is embedded from: summary + use_when + facets. Same
|
|
67
|
+
* function at compile time and (for tests/tools) at runtime so the two can
|
|
68
|
+
* never drift. */
|
|
69
|
+
export declare function buildEmbeddingText(entry: EmbeddableEntry): string;
|
|
70
|
+
/** Shape-tolerant parse; returns null for anything unusable so callers can
|
|
71
|
+
* fall back to lexical search instead of throwing. */
|
|
72
|
+
export declare function parseEmbeddingsFile(json: unknown): EmbeddingsFile | null;
|
|
73
|
+
/**
|
|
74
|
+
* Build a provider: POST { text } to `url`, expect { vector, model? }.
|
|
75
|
+
* Throws on every failure mode (network, timeout, non-2xx, malformed body).
|
|
76
|
+
* Never logs: the runtime caller runs inside a stdio MCP server.
|
|
77
|
+
*/
|
|
78
|
+
export declare function createEmbedProvider(options: EmbedProviderOptions): EmbedProvider;
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embeddings — the one implementation of the wire protocol, the vector
|
|
3
|
+
* encoding, and the vector math behind semantic library search.
|
|
4
|
+
*
|
|
5
|
+
* Shared by the runtime (src/core/library-search.ts: embed the QUERY) and the
|
|
6
|
+
* registry compiler (scripts/generate-registry/embed.ts: embed every ENTRY
|
|
7
|
+
* into registry/generated/embeddings.json). Deliberately free of relative
|
|
8
|
+
* imports so the compiler script can load it as plain TypeScript the way
|
|
9
|
+
* evals/routing/runner.ts loads registry-search.ts.
|
|
10
|
+
*
|
|
11
|
+
* Provider protocol (SUMMER_EMBED_URL, or <gateway>/api/mcp/embed):
|
|
12
|
+
* POST { text } -> 2xx JSON { vector: number[], model?: string }
|
|
13
|
+
* Anything else — non-2xx, timeout, malformed body, wrong dims — is a
|
|
14
|
+
* provider failure. Callers decide what that means (the runtime degrades to
|
|
15
|
+
* lexical search; the compiler aborts the embed step).
|
|
16
|
+
*
|
|
17
|
+
* File format (registry/generated/embeddings.json), a sidecar of index.json:
|
|
18
|
+
* { _generated, model, dims, encoding: "base64-float32",
|
|
19
|
+
* entries: { "<id>": { content_hash, vector: "<base64 float32 LE>" } } }
|
|
20
|
+
* base64 float32 is ~2x smaller than rounded JSON number arrays and ~5x
|
|
21
|
+
* smaller than full-precision ones (measured on 384-dim vectors), and
|
|
22
|
+
* lossless for float32 providers.
|
|
23
|
+
*/
|
|
24
|
+
export const EMBEDDINGS_FILE = "embeddings.json";
|
|
25
|
+
export const EMBEDDINGS_ENCODING = "base64-float32";
|
|
26
|
+
export const EMBED_PATH = "/api/mcp/embed";
|
|
27
|
+
// ── Vector encoding ────────────────────────────────────────────────────────
|
|
28
|
+
export function encodeVector(vector) {
|
|
29
|
+
const floats = new Float32Array(vector.length);
|
|
30
|
+
for (let i = 0; i < vector.length; i++)
|
|
31
|
+
floats[i] = vector[i];
|
|
32
|
+
return Buffer.from(floats.buffer, floats.byteOffset, floats.byteLength).toString("base64");
|
|
33
|
+
}
|
|
34
|
+
export function decodeVector(encoded) {
|
|
35
|
+
const bytes = Buffer.from(encoded, "base64");
|
|
36
|
+
if (bytes.byteLength % 4 !== 0)
|
|
37
|
+
throw new Error("embedding vector: byte length is not a multiple of 4");
|
|
38
|
+
// Copy into an aligned buffer: Buffer slices from the pool are not 4-aligned.
|
|
39
|
+
const aligned = new ArrayBuffer(bytes.byteLength);
|
|
40
|
+
new Uint8Array(aligned).set(bytes);
|
|
41
|
+
return new Float32Array(aligned);
|
|
42
|
+
}
|
|
43
|
+
// ── Vector math ────────────────────────────────────────────────────────────
|
|
44
|
+
export function cosineSimilarity(a, b) {
|
|
45
|
+
if (a.length !== b.length || a.length === 0)
|
|
46
|
+
return 0;
|
|
47
|
+
let dot = 0;
|
|
48
|
+
let na = 0;
|
|
49
|
+
let nb = 0;
|
|
50
|
+
for (let i = 0; i < a.length; i++) {
|
|
51
|
+
dot += a[i] * b[i];
|
|
52
|
+
na += a[i] * a[i];
|
|
53
|
+
nb += b[i] * b[i];
|
|
54
|
+
}
|
|
55
|
+
if (na === 0 || nb === 0)
|
|
56
|
+
return 0;
|
|
57
|
+
return dot / (Math.sqrt(na) * Math.sqrt(nb));
|
|
58
|
+
}
|
|
59
|
+
/** Reciprocal rank fusion (Cormack et al. 2009): score(d) = sum over lists of
|
|
60
|
+
* 1 / (k + rank), rank starting at 1. Ties break on id for determinism. */
|
|
61
|
+
export const RRF_K = 60;
|
|
62
|
+
export function reciprocalRankFusion(rankedLists, k = RRF_K) {
|
|
63
|
+
const scores = new Map();
|
|
64
|
+
for (const list of rankedLists) {
|
|
65
|
+
list.forEach((id, index) => {
|
|
66
|
+
scores.set(id, (scores.get(id) ?? 0) + 1 / (k + index + 1));
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
return [...scores.entries()]
|
|
70
|
+
.map(([id, score]) => ({ id, score }))
|
|
71
|
+
.sort((a, b) => b.score - a.score || a.id.localeCompare(b.id));
|
|
72
|
+
}
|
|
73
|
+
/** The text an entry is embedded from: summary + use_when + facets. Same
|
|
74
|
+
* function at compile time and (for tests/tools) at runtime so the two can
|
|
75
|
+
* never drift. */
|
|
76
|
+
export function buildEmbeddingText(entry) {
|
|
77
|
+
const parts = [];
|
|
78
|
+
if (typeof entry.summary === "string")
|
|
79
|
+
parts.push(entry.summary.trim());
|
|
80
|
+
if (Array.isArray(entry.use_when)) {
|
|
81
|
+
for (const line of entry.use_when)
|
|
82
|
+
if (typeof line === "string")
|
|
83
|
+
parts.push(line.trim());
|
|
84
|
+
}
|
|
85
|
+
if (entry.facets && typeof entry.facets === "object" && !Array.isArray(entry.facets)) {
|
|
86
|
+
const facetWords = [];
|
|
87
|
+
for (const value of Object.values(entry.facets)) {
|
|
88
|
+
if (Array.isArray(value))
|
|
89
|
+
for (const v of value)
|
|
90
|
+
if (typeof v === "string")
|
|
91
|
+
facetWords.push(v);
|
|
92
|
+
}
|
|
93
|
+
if (facetWords.length > 0)
|
|
94
|
+
parts.push(facetWords.join(" "));
|
|
95
|
+
}
|
|
96
|
+
return parts.filter((p) => p.length > 0).join("\n");
|
|
97
|
+
}
|
|
98
|
+
// ── File parsing ───────────────────────────────────────────────────────────
|
|
99
|
+
/** Shape-tolerant parse; returns null for anything unusable so callers can
|
|
100
|
+
* fall back to lexical search instead of throwing. */
|
|
101
|
+
export function parseEmbeddingsFile(json) {
|
|
102
|
+
if (!json || typeof json !== "object" || Array.isArray(json))
|
|
103
|
+
return null;
|
|
104
|
+
const raw = json;
|
|
105
|
+
if (raw.encoding !== EMBEDDINGS_ENCODING)
|
|
106
|
+
return null;
|
|
107
|
+
if (typeof raw.dims !== "number" || !Number.isInteger(raw.dims) || raw.dims <= 0)
|
|
108
|
+
return null;
|
|
109
|
+
if (!raw.entries || typeof raw.entries !== "object" || Array.isArray(raw.entries))
|
|
110
|
+
return null;
|
|
111
|
+
const entries = {};
|
|
112
|
+
for (const [id, value] of Object.entries(raw.entries)) {
|
|
113
|
+
if (!value || typeof value !== "object")
|
|
114
|
+
continue;
|
|
115
|
+
const entry = value;
|
|
116
|
+
if (typeof entry.content_hash !== "string" || typeof entry.vector !== "string")
|
|
117
|
+
continue;
|
|
118
|
+
entries[id] = { content_hash: entry.content_hash, vector: entry.vector };
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
_generated: typeof raw._generated === "string" ? raw._generated : undefined,
|
|
122
|
+
model: typeof raw.model === "string" ? raw.model : "unknown",
|
|
123
|
+
dims: raw.dims,
|
|
124
|
+
encoding: EMBEDDINGS_ENCODING,
|
|
125
|
+
entries,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// ── Provider client ────────────────────────────────────────────────────────
|
|
129
|
+
function isFiniteNumberArray(value) {
|
|
130
|
+
return Array.isArray(value) && value.length > 0 && value.every((n) => typeof n === "number" && Number.isFinite(n));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Build a provider: POST { text } to `url`, expect { vector, model? }.
|
|
134
|
+
* Throws on every failure mode (network, timeout, non-2xx, malformed body).
|
|
135
|
+
* Never logs: the runtime caller runs inside a stdio MCP server.
|
|
136
|
+
*/
|
|
137
|
+
export function createEmbedProvider(options) {
|
|
138
|
+
const fetchImpl = options.fetchImpl ?? fetch;
|
|
139
|
+
return async (text) => {
|
|
140
|
+
const controller = new AbortController();
|
|
141
|
+
const timer = setTimeout(() => controller.abort(), options.timeoutMs);
|
|
142
|
+
try {
|
|
143
|
+
const headers = { "Content-Type": "application/json" };
|
|
144
|
+
if (options.token)
|
|
145
|
+
headers.Authorization = `Bearer ${options.token}`;
|
|
146
|
+
const response = await fetchImpl(options.url, {
|
|
147
|
+
method: "POST",
|
|
148
|
+
headers,
|
|
149
|
+
body: JSON.stringify({ text }),
|
|
150
|
+
signal: controller.signal,
|
|
151
|
+
});
|
|
152
|
+
if (!response.ok)
|
|
153
|
+
throw new Error(`embedding provider responded ${response.status}`);
|
|
154
|
+
const body = (await response.json());
|
|
155
|
+
if (!isFiniteNumberArray(body.vector))
|
|
156
|
+
throw new Error("embedding provider returned no numeric vector");
|
|
157
|
+
return {
|
|
158
|
+
vector: body.vector,
|
|
159
|
+
...(typeof body.model === "string" && body.model ? { model: body.model } : {}),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
clearTimeout(timer);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
}
|