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,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Library-feedback client (CONTRACT.md §10, v1 = mailbox).
|
|
3
|
+
*
|
|
4
|
+
* Fire-and-forget POST of batched library-entry outcome reports to the
|
|
5
|
+
* Summer gateway. Structurally leak-proof by schema (enums + hard caps —
|
|
6
|
+
* no field can carry project files, chat content, or code), 1s timeout,
|
|
7
|
+
* silent failure, never throws, never retries, never blocks the agent
|
|
8
|
+
* for more than the timeout.
|
|
9
|
+
*
|
|
10
|
+
* Consent (SELF_IMPROVING_LIBRARY.md §3.4):
|
|
11
|
+
* - SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1 → nothing is ever sent.
|
|
12
|
+
* - First-run notice BEFORE the first event (CONTRACT §10): the first call
|
|
13
|
+
* ever made on a machine sends NOTHING and returns a one-paragraph notice
|
|
14
|
+
* of what a report contains + the opt-out env vars; sending starts on the
|
|
15
|
+
* next call.
|
|
16
|
+
* - Authenticated installs attribute via the auth bearer; anonymous
|
|
17
|
+
* installs use a random persisted install id (a uuid — no hardware,
|
|
18
|
+
* user, or project identity).
|
|
19
|
+
*
|
|
20
|
+
* No stdout writes anywhere in this module (stdio MCP protocol);
|
|
21
|
+
* nothing is logged on failure — silence is the contract.
|
|
22
|
+
*/
|
|
23
|
+
import { randomUUID } from "node:crypto";
|
|
24
|
+
import { getAuthToken } from "../auth.js";
|
|
25
|
+
import { resolveGatewayUrl } from "../config.js";
|
|
26
|
+
import { readStoreText, writeStoreText } from "../store.js";
|
|
27
|
+
import { TOOLKIT_VERSION } from "../version.js";
|
|
28
|
+
const FEEDBACK_PATH = "/api/mcp/library-feedback";
|
|
29
|
+
const TIMEOUT_MS = 1000;
|
|
30
|
+
const INSTALL_ID_FILE = "feedback-install-id";
|
|
31
|
+
const FIRST_RUN_MARKER_FILE = "feedback-first-run";
|
|
32
|
+
/** Random per-MCP-server-process session id. Never persisted. */
|
|
33
|
+
let sessionId = null;
|
|
34
|
+
export function getFeedbackSessionId() {
|
|
35
|
+
if (!sessionId)
|
|
36
|
+
sessionId = randomUUID();
|
|
37
|
+
return sessionId;
|
|
38
|
+
}
|
|
39
|
+
/** Test-only seam. */
|
|
40
|
+
export function _resetFeedbackSessionForTests() {
|
|
41
|
+
sessionId = null;
|
|
42
|
+
}
|
|
43
|
+
async function feedbackUrl() {
|
|
44
|
+
return `${await resolveGatewayUrl()}${FEEDBACK_PATH}`;
|
|
45
|
+
}
|
|
46
|
+
/** Kill switches: send NOTHING when either is set to "1". */
|
|
47
|
+
export function isFeedbackDisabled() {
|
|
48
|
+
return (process.env.SUMMER_NO_TELEMETRY === "1" || process.env.DO_NOT_TRACK === "1");
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Anonymous install id: a random uuid persisted once in ~/.summer/.
|
|
52
|
+
* Falls back to an ephemeral uuid if the store is unreadable/unwritable —
|
|
53
|
+
* feedback must never fail because the store does.
|
|
54
|
+
*/
|
|
55
|
+
export async function getInstallId() {
|
|
56
|
+
try {
|
|
57
|
+
const existing = await readStoreText(INSTALL_ID_FILE);
|
|
58
|
+
if (existing?.trim())
|
|
59
|
+
return existing.trim();
|
|
60
|
+
const created = randomUUID();
|
|
61
|
+
await writeStoreText(INSTALL_ID_FILE, created);
|
|
62
|
+
return created;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return randomUUID();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* First-run notice gate: returns true exactly once per machine — the first
|
|
70
|
+
* time the feedback tool is ever called — and writes the marker so every
|
|
71
|
+
* later call returns false. That first call sends nothing (the notice must
|
|
72
|
+
* precede the first event). Errors → false (no notice beats a crash, and
|
|
73
|
+
* the disclosure also lives in the tool description).
|
|
74
|
+
*/
|
|
75
|
+
export async function consumeFirstRunNotice() {
|
|
76
|
+
try {
|
|
77
|
+
const marker = await readStoreText(FIRST_RUN_MARKER_FILE);
|
|
78
|
+
if (marker !== null)
|
|
79
|
+
return false;
|
|
80
|
+
await writeStoreText(FIRST_RUN_MARKER_FILE, new Date().toISOString());
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/** Every field a report POST carries, in one place so the tool description,
|
|
88
|
+
* the first-run notice and the tests cannot disagree about what is sent. */
|
|
89
|
+
export const FEEDBACK_FIELDS_SENT = "the library entry ids you used (entry_id), one outcome word per entry, your optional note and deviation " +
|
|
90
|
+
"(280 characters max each, about the entry itself), engine_version, agent_model (your self-reported model id), " +
|
|
91
|
+
"toolkit_version (this CLI's version), client (the host app name/version from the MCP handshake), " +
|
|
92
|
+
"session_id (a random id per MCP server process, never persisted), and — only when not logged in — " +
|
|
93
|
+
"install_id (a random uuid stored in ~/.summer/; no hardware, user, or project identity). When logged in, " +
|
|
94
|
+
"the Summer account bearer token is sent instead of install_id.";
|
|
95
|
+
export const FIRST_RUN_NOTICE = "First use of summer_library_feedback on this machine — NOTHING has been sent yet, including this batch. " +
|
|
96
|
+
"Call the tool again with the same reports to send them; this notice appears only once. " +
|
|
97
|
+
`What every report sends to Summer (POST ${FEEDBACK_PATH}): ${FEEDBACK_FIELDS_SENT} ` +
|
|
98
|
+
"The report schema has no field for project files, chat content, or code. Reports are used to fix and " +
|
|
99
|
+
"re-rank library entries, so this user's own future sessions load better ones. Opt out any time by setting " +
|
|
100
|
+
"SUMMER_NO_TELEMETRY=1 or DO_NOT_TRACK=1 — then nothing is ever sent.";
|
|
101
|
+
/** Classify a non-2xx response. Exported for tests. */
|
|
102
|
+
export function dropReasonForStatus(status) {
|
|
103
|
+
if (status === 404)
|
|
104
|
+
return "endpoint_missing";
|
|
105
|
+
if (status >= 500)
|
|
106
|
+
return "server_error";
|
|
107
|
+
return "rejected";
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Send one batched feedback report. Never throws. Blocks at most TIMEOUT_MS.
|
|
111
|
+
*
|
|
112
|
+
* Result matrix:
|
|
113
|
+
* - env kill switch → { recorded: false, disabled: true } (nothing sent)
|
|
114
|
+
* - first call on machine → { recorded: false, first_run: true, notice } (nothing sent)
|
|
115
|
+
* - gateway accepted (2xx) → { recorded: true }
|
|
116
|
+
* - non-2xx → { recorded: false, dropped: true, status, reason } (no retry exists)
|
|
117
|
+
* - fetch threw / timed out → { recorded: false, dropped: true, reason: "network" }
|
|
118
|
+
*/
|
|
119
|
+
export async function sendLibraryFeedback(input) {
|
|
120
|
+
if (isFeedbackDisabled()) {
|
|
121
|
+
return { recorded: false, disabled: true };
|
|
122
|
+
}
|
|
123
|
+
// The notice must precede the first event: the first call on a machine
|
|
124
|
+
// returns the disclosure and sends nothing at all.
|
|
125
|
+
if (await consumeFirstRunNotice()) {
|
|
126
|
+
return { recorded: false, first_run: true, notice: FIRST_RUN_NOTICE };
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
let token = null;
|
|
130
|
+
try {
|
|
131
|
+
token = await getAuthToken();
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
token = null;
|
|
135
|
+
}
|
|
136
|
+
const body = {
|
|
137
|
+
reports: input.reports,
|
|
138
|
+
engine_version: input.engine_version,
|
|
139
|
+
agent_model: input.agent_model,
|
|
140
|
+
session_id: getFeedbackSessionId(),
|
|
141
|
+
toolkit_version: TOOLKIT_VERSION,
|
|
142
|
+
};
|
|
143
|
+
if (input.client)
|
|
144
|
+
body.client = input.client;
|
|
145
|
+
const headers = {
|
|
146
|
+
"Content-Type": "application/json",
|
|
147
|
+
};
|
|
148
|
+
if (token) {
|
|
149
|
+
headers.Authorization = `Bearer ${token}`;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
body.install_id = await getInstallId();
|
|
153
|
+
}
|
|
154
|
+
const ctrl = new AbortController();
|
|
155
|
+
const timer = setTimeout(() => ctrl.abort(), TIMEOUT_MS);
|
|
156
|
+
try {
|
|
157
|
+
const res = await fetch(await feedbackUrl(), {
|
|
158
|
+
method: "POST",
|
|
159
|
+
signal: ctrl.signal,
|
|
160
|
+
headers,
|
|
161
|
+
body: JSON.stringify(body),
|
|
162
|
+
});
|
|
163
|
+
if (!res.ok) {
|
|
164
|
+
return {
|
|
165
|
+
recorded: false,
|
|
166
|
+
dropped: true,
|
|
167
|
+
status: res.status,
|
|
168
|
+
reason: dropReasonForStatus(res.status),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
finally {
|
|
173
|
+
clearTimeout(timer);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Silent failure is the contract: no retry, no log, no throw. The reason
|
|
178
|
+
// is for the caller's result only — nothing is sent about it.
|
|
179
|
+
return { recorded: false, dropped: true, reason: "network" };
|
|
180
|
+
}
|
|
181
|
+
return { recorded: true };
|
|
182
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-project routing layer — shared contract types.
|
|
3
|
+
*
|
|
4
|
+
* A ProjectConnection is a uniform handle to "whatever process currently
|
|
5
|
+
* serves this project": either the live editor (today's HTTP transport,
|
|
6
|
+
* unchanged) or a headless worker (TCP newline-delimited JSON).
|
|
7
|
+
*
|
|
8
|
+
* This module is deliberately self-contained: nothing under src/core/headless/ is
|
|
9
|
+
* imported by the existing MCP/CLI code paths except behind the opt-in env
|
|
10
|
+
* flag SUMMER_HEADLESS_ROUTING=1 (see src/mcp/server.ts getClient and
|
|
11
|
+
* ./mcp-routing.ts). See docs/HEADLESS_ROUTING.md for the full
|
|
12
|
+
* contract this implements.
|
|
13
|
+
*/
|
|
14
|
+
export type ProjectConnectionKind = "editor" | "worker";
|
|
15
|
+
/** Stage that failed, for structured timeout/transport errors. */
|
|
16
|
+
export type HeadlessStage = "connect" | "auth" | "op" | "spawn";
|
|
17
|
+
/**
|
|
18
|
+
* Timeout (and stage-tagged failure) error for the headless layer. `stage`
|
|
19
|
+
* names exactly which step gave up, so callers and logs can distinguish
|
|
20
|
+
* "could not reach the worker" from "the worker went quiet mid-import".
|
|
21
|
+
* NEVER put tokens in these messages — they surface verbatim in tool results.
|
|
22
|
+
*/
|
|
23
|
+
export declare class HeadlessTimeoutError extends Error {
|
|
24
|
+
readonly stage: HeadlessStage;
|
|
25
|
+
constructor(stage: HeadlessStage, message: string);
|
|
26
|
+
}
|
|
27
|
+
/** Read a positive-integer env override with a sane default. */
|
|
28
|
+
export declare function envMs(name: string, fallback: number, env?: NodeJS.ProcessEnv): number;
|
|
29
|
+
/** Ops that may legitimately run for minutes (first import, game boot). */
|
|
30
|
+
export declare const LONG_RUNNING_OPS: ReadonlySet<string>;
|
|
31
|
+
/** Ops that MUTATE project or process state. When one of these times out the
|
|
32
|
+
* connection is QUARANTINED (destroyed + evicted via credentialsChanged)
|
|
33
|
+
* because the mutation's outcome is UNKNOWN and a blind retry could
|
|
34
|
+
* double-apply. Read-only ops that time out leave the connection usable. */
|
|
35
|
+
export declare const MUTATING_OPS: ReadonlySet<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Remove secret material from any string that can reach an error message or
|
|
38
|
+
* log line. Applied to worker-supplied error text and spawn stderr tails —
|
|
39
|
+
* defense in depth on top of "the raw token never crosses the wire" (v1.1
|
|
40
|
+
* mutual auth) and "this module never interpolates tokens itself".
|
|
41
|
+
*/
|
|
42
|
+
export declare function scrubSecrets(text: string, secrets: ReadonlyArray<string | undefined>): string;
|
|
43
|
+
/**
|
|
44
|
+
* Error for an op the WORKER answered with ok:false. `code` is the leading
|
|
45
|
+
* snake_case classifier when the worker sent a structured error (e.g.
|
|
46
|
+
* "sha256_mismatch: content changed since read", "already_exists",
|
|
47
|
+
* "needs_display"), so guard failures are distinguishable from generic
|
|
48
|
+
* transport throws.
|
|
49
|
+
*/
|
|
50
|
+
export declare class WorkerOpError extends Error {
|
|
51
|
+
readonly code?: string;
|
|
52
|
+
constructor(message: string);
|
|
53
|
+
}
|
|
54
|
+
export interface CallOptions {
|
|
55
|
+
/** Client-side INACTIVITY budget for this op: the timer restarts on every
|
|
56
|
+
* progress line, so a chatty long import stays alive while a silent hang
|
|
57
|
+
* still fails. Defaults: SUMMER_WORKER_OP_TIMEOUT_MS (30s) for normal ops,
|
|
58
|
+
* SUMMER_WORKER_LONG_OP_TIMEOUT_MS (300s) for LONG_RUNNING_OPS. */
|
|
59
|
+
timeoutMs?: number;
|
|
60
|
+
/** Interim progress lines ({"id","event":"progress","progress"}) for this
|
|
61
|
+
* request are surfaced here. Editor connections never emit progress. */
|
|
62
|
+
onProgress?: (progress: unknown) => void;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Uniform per-project backend handle.
|
|
66
|
+
*
|
|
67
|
+
* `call(op, params)` uses the WORKER op vocabulary as the canonical surface:
|
|
68
|
+
* ping, status, import, fs.list, fs.read, fs.write, uid.resolve,
|
|
69
|
+
* scene.read, game.run, game.stop, game.logs, game.screenshot
|
|
70
|
+
* EditorConnection adapts that vocabulary onto the existing EngineApiClient;
|
|
71
|
+
* WorkerConnection speaks it natively over TCP.
|
|
72
|
+
*/
|
|
73
|
+
export interface ProjectConnection {
|
|
74
|
+
readonly kind: ProjectConnectionKind;
|
|
75
|
+
/** Canonical absolute project path this connection serves. */
|
|
76
|
+
readonly projectPath: string;
|
|
77
|
+
call(op: string, params?: Record<string, unknown>, options?: CallOptions): Promise<unknown>;
|
|
78
|
+
/** True while the underlying transport is usable. A dropped worker socket
|
|
79
|
+
* flips this to false permanently — reconnect-on-drop is NOT attempted;
|
|
80
|
+
* callers re-resolve via resolveProjectConnection instead. */
|
|
81
|
+
isAlive(): boolean;
|
|
82
|
+
close(): void;
|
|
83
|
+
}
|
|
84
|
+
/** Ops the headless worker implements (mirror of the worker agent's brief). */
|
|
85
|
+
export declare const WORKER_OPS: readonly ["ping", "status", "import", "fs.list", "fs.read", "fs.write", "uid.resolve", "scene.read", "game.run", "game.stop", "game.logs", "game.screenshot"];
|
|
86
|
+
export type WorkerOp = (typeof WORKER_OPS)[number];
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-project routing layer — shared contract types.
|
|
3
|
+
*
|
|
4
|
+
* A ProjectConnection is a uniform handle to "whatever process currently
|
|
5
|
+
* serves this project": either the live editor (today's HTTP transport,
|
|
6
|
+
* unchanged) or a headless worker (TCP newline-delimited JSON).
|
|
7
|
+
*
|
|
8
|
+
* This module is deliberately self-contained: nothing under src/core/headless/ is
|
|
9
|
+
* imported by the existing MCP/CLI code paths except behind the opt-in env
|
|
10
|
+
* flag SUMMER_HEADLESS_ROUTING=1 (see src/mcp/server.ts getClient and
|
|
11
|
+
* ./mcp-routing.ts). See docs/HEADLESS_ROUTING.md for the full
|
|
12
|
+
* contract this implements.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Timeout (and stage-tagged failure) error for the headless layer. `stage`
|
|
16
|
+
* names exactly which step gave up, so callers and logs can distinguish
|
|
17
|
+
* "could not reach the worker" from "the worker went quiet mid-import".
|
|
18
|
+
* NEVER put tokens in these messages — they surface verbatim in tool results.
|
|
19
|
+
*/
|
|
20
|
+
export class HeadlessTimeoutError extends Error {
|
|
21
|
+
stage;
|
|
22
|
+
constructor(stage, message) {
|
|
23
|
+
super(`[headless:${stage}] ${message}`);
|
|
24
|
+
this.name = "HeadlessTimeoutError";
|
|
25
|
+
this.stage = stage;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Read a positive-integer env override with a sane default. */
|
|
29
|
+
export function envMs(name, fallback, env = process.env) {
|
|
30
|
+
const raw = env[name]?.trim();
|
|
31
|
+
if (!raw)
|
|
32
|
+
return fallback;
|
|
33
|
+
const value = Number(raw);
|
|
34
|
+
return Number.isFinite(value) && value > 0 ? Math.floor(value) : fallback;
|
|
35
|
+
}
|
|
36
|
+
/** Ops that may legitimately run for minutes (first import, game boot). */
|
|
37
|
+
export const LONG_RUNNING_OPS = new Set([
|
|
38
|
+
"import",
|
|
39
|
+
"game.run",
|
|
40
|
+
]);
|
|
41
|
+
/** Ops that MUTATE project or process state. When one of these times out the
|
|
42
|
+
* connection is QUARANTINED (destroyed + evicted via credentialsChanged)
|
|
43
|
+
* because the mutation's outcome is UNKNOWN and a blind retry could
|
|
44
|
+
* double-apply. Read-only ops that time out leave the connection usable. */
|
|
45
|
+
export const MUTATING_OPS = new Set([
|
|
46
|
+
"import",
|
|
47
|
+
"fs.write",
|
|
48
|
+
"game.run",
|
|
49
|
+
"game.stop",
|
|
50
|
+
]);
|
|
51
|
+
/**
|
|
52
|
+
* Remove secret material from any string that can reach an error message or
|
|
53
|
+
* log line. Applied to worker-supplied error text and spawn stderr tails —
|
|
54
|
+
* defense in depth on top of "the raw token never crosses the wire" (v1.1
|
|
55
|
+
* mutual auth) and "this module never interpolates tokens itself".
|
|
56
|
+
*/
|
|
57
|
+
export function scrubSecrets(text, secrets) {
|
|
58
|
+
let scrubbed = text;
|
|
59
|
+
for (const secret of secrets) {
|
|
60
|
+
if (secret && secret.length > 0) {
|
|
61
|
+
scrubbed = scrubbed.split(secret).join("[redacted]");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return scrubbed;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Error for an op the WORKER answered with ok:false. `code` is the leading
|
|
68
|
+
* snake_case classifier when the worker sent a structured error (e.g.
|
|
69
|
+
* "sha256_mismatch: content changed since read", "already_exists",
|
|
70
|
+
* "needs_display"), so guard failures are distinguishable from generic
|
|
71
|
+
* transport throws.
|
|
72
|
+
*/
|
|
73
|
+
export class WorkerOpError extends Error {
|
|
74
|
+
code;
|
|
75
|
+
constructor(message) {
|
|
76
|
+
super(message);
|
|
77
|
+
this.name = "WorkerOpError";
|
|
78
|
+
const match = /^([a-z][a-z0-9_]*)(?::|$)/.exec(message);
|
|
79
|
+
if (match)
|
|
80
|
+
this.code = match[1];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Ops the headless worker implements (mirror of the worker agent's brief). */
|
|
84
|
+
export const WORKER_OPS = [
|
|
85
|
+
"ping",
|
|
86
|
+
"status",
|
|
87
|
+
"import",
|
|
88
|
+
"fs.list",
|
|
89
|
+
"fs.read",
|
|
90
|
+
"fs.write",
|
|
91
|
+
"uid.resolve",
|
|
92
|
+
"scene.read",
|
|
93
|
+
"game.run",
|
|
94
|
+
"game.stop",
|
|
95
|
+
"game.logs",
|
|
96
|
+
"game.screenshot",
|
|
97
|
+
];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { EngineApiClient } from "../api-client.js";
|
|
2
|
+
import type { CallOptions, ProjectConnection } from "./connection.js";
|
|
3
|
+
/**
|
|
4
|
+
* Adapter that presents the EXISTING editor transport (EngineApiClient over
|
|
5
|
+
* local HTTP — untouched) through the uniform ProjectConnection surface.
|
|
6
|
+
*
|
|
7
|
+
* The canonical `call()` vocabulary is the WORKER op set; this adapter maps
|
|
8
|
+
* each worker op onto the editor method that answers the same question. Ops
|
|
9
|
+
* with no editor equivalent throw a clean, actionable error — they are never
|
|
10
|
+
* silently faked.
|
|
11
|
+
*
|
|
12
|
+
* The raw client stays reachable via `client` so callers that need the full
|
|
13
|
+
* editor surface (all ~22 EngineApiClient methods, identity binding, the
|
|
14
|
+
* async op lifecycle) can keep using it directly. The MCP flag-wiring does
|
|
15
|
+
* exactly that: when resolution picks the editor, the existing code path is
|
|
16
|
+
* used unchanged and this adapter is not even in the loop.
|
|
17
|
+
*/
|
|
18
|
+
export declare class EditorConnection implements ProjectConnection {
|
|
19
|
+
readonly kind: "editor";
|
|
20
|
+
readonly projectPath: string;
|
|
21
|
+
readonly client: EngineApiClient;
|
|
22
|
+
constructor(client: EngineApiClient, projectPath: string);
|
|
23
|
+
isAlive(): boolean;
|
|
24
|
+
close(): void;
|
|
25
|
+
call(op: string, params?: Record<string, unknown>, _options?: CallOptions): Promise<unknown>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter that presents the EXISTING editor transport (EngineApiClient over
|
|
3
|
+
* local HTTP — untouched) through the uniform ProjectConnection surface.
|
|
4
|
+
*
|
|
5
|
+
* The canonical `call()` vocabulary is the WORKER op set; this adapter maps
|
|
6
|
+
* each worker op onto the editor method that answers the same question. Ops
|
|
7
|
+
* with no editor equivalent throw a clean, actionable error — they are never
|
|
8
|
+
* silently faked.
|
|
9
|
+
*
|
|
10
|
+
* The raw client stays reachable via `client` so callers that need the full
|
|
11
|
+
* editor surface (all ~22 EngineApiClient methods, identity binding, the
|
|
12
|
+
* async op lifecycle) can keep using it directly. The MCP flag-wiring does
|
|
13
|
+
* exactly that: when resolution picks the editor, the existing code path is
|
|
14
|
+
* used unchanged and this adapter is not even in the loop.
|
|
15
|
+
*/
|
|
16
|
+
export class EditorConnection {
|
|
17
|
+
kind = "editor";
|
|
18
|
+
projectPath;
|
|
19
|
+
client;
|
|
20
|
+
constructor(client, projectPath) {
|
|
21
|
+
this.client = client;
|
|
22
|
+
this.projectPath = projectPath;
|
|
23
|
+
}
|
|
24
|
+
isAlive() {
|
|
25
|
+
// The HTTP transport is connectionless; liveness is checked per-request
|
|
26
|
+
// by the existing credential-drift logic in the client/getClient layer.
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
close() {
|
|
30
|
+
// Nothing to tear down — the HTTP client holds no socket.
|
|
31
|
+
}
|
|
32
|
+
async call(op, params = {}, _options = {}) {
|
|
33
|
+
switch (op) {
|
|
34
|
+
case "ping":
|
|
35
|
+
case "status":
|
|
36
|
+
return this.client.health();
|
|
37
|
+
case "import":
|
|
38
|
+
// The editor imports continuously via its filesystem scanner; there is
|
|
39
|
+
// nothing to trigger. Honest no-op with provenance.
|
|
40
|
+
return { ok: true, mode: "editor", note: "The editor imports assets continuously; no explicit import step exists on this transport." };
|
|
41
|
+
case "fs.list":
|
|
42
|
+
return this.client.getFsTree(typeof params.root === "string" ? params.root : undefined, typeof params.limit === "number" ? params.limit : undefined);
|
|
43
|
+
case "fs.read":
|
|
44
|
+
return this.client.readFile(String(params.path ?? ""), typeof params.maxBytes === "number" ? params.maxBytes : undefined);
|
|
45
|
+
case "fs.write":
|
|
46
|
+
return this.client.executeIdentityBoundOps([
|
|
47
|
+
{
|
|
48
|
+
op: "WriteFile",
|
|
49
|
+
path: String(params.path ?? ""),
|
|
50
|
+
content: String(params.content ?? ""),
|
|
51
|
+
...(typeof params.expectedSha256 === "string"
|
|
52
|
+
? { expectedSha256: params.expectedSha256 }
|
|
53
|
+
: {}),
|
|
54
|
+
...(params.mustNotExist === true ? { mustNotExist: true } : {}),
|
|
55
|
+
},
|
|
56
|
+
]);
|
|
57
|
+
case "scene.read":
|
|
58
|
+
return this.client.getSceneState(typeof params.scenePath === "string" ? params.scenePath : undefined, {
|
|
59
|
+
depth: typeof params.depth === "number" ? params.depth : undefined,
|
|
60
|
+
limit: typeof params.limit === "number" ? params.limit : undefined,
|
|
61
|
+
});
|
|
62
|
+
case "game.run":
|
|
63
|
+
return this.client.play(typeof params.scene === "string" ? params.scene : undefined);
|
|
64
|
+
case "game.stop":
|
|
65
|
+
return this.client.stop();
|
|
66
|
+
case "game.logs": {
|
|
67
|
+
const opInput = { op: "GetConsoleOutput" };
|
|
68
|
+
if (typeof params.maxLines === "number")
|
|
69
|
+
opInput.max_lines = params.maxLines;
|
|
70
|
+
if (typeof params.filter === "string")
|
|
71
|
+
opInput.filter = params.filter;
|
|
72
|
+
return this.client.executeOps([opInput]);
|
|
73
|
+
}
|
|
74
|
+
case "game.screenshot":
|
|
75
|
+
return this.client.gameSnapshot();
|
|
76
|
+
case "uid.resolve":
|
|
77
|
+
default:
|
|
78
|
+
throw new Error(`Op "${op}" has no editor-transport mapping. Use the EngineApiClient directly (EditorConnection.client) or route to a headless worker.`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { EngineApiClient } from "../api-client.js";
|
|
2
|
+
import { type EngineSelection } from "../engine.js";
|
|
3
|
+
import { resolveProjectConnection } from "./resolve.js";
|
|
4
|
+
/**
|
|
5
|
+
* The ONLY hook the existing MCP server calls into this module — and only
|
|
6
|
+
* when SUMMER_HEADLESS_ROUTING=1 (see src/mcp/server.ts getClient, which
|
|
7
|
+
* dynamic-imports this file so the flag-off path never even loads it).
|
|
8
|
+
*
|
|
9
|
+
* Behavior contract:
|
|
10
|
+
* - returns null whenever the existing code path should handle the call:
|
|
11
|
+
* * no project context on the session (no projectPath, cwd not inside
|
|
12
|
+
* a project) — legacy single-editor discovery stays in charge
|
|
13
|
+
* * a live EDITOR has the project open — the existing EngineApiClient
|
|
14
|
+
* path (caching, credential-drift, identity binding) serves it
|
|
15
|
+
* EXACTLY as with the flag off
|
|
16
|
+
* - returns a WorkerEngineClient (cast to EngineApiClient — it implements
|
|
17
|
+
* the full public method surface) only when no editor has the project,
|
|
18
|
+
* connecting to a live registered worker or spawning one on demand.
|
|
19
|
+
* - editor-resolution errors that do NOT positively mean "no editor has
|
|
20
|
+
* this project" (ambiguity, identity change, unresponsive editor) are
|
|
21
|
+
* RETHROWN — a worker must never write while an editor's presence is
|
|
22
|
+
* uncertain.
|
|
23
|
+
* - SINGLE-FLIGHT per project: concurrent tool calls share one in-flight
|
|
24
|
+
* resolution, so a burst of first calls can never spawn more than one
|
|
25
|
+
* worker or open more than one connection. A superseded cached
|
|
26
|
+
* connection is always closed, never orphaned.
|
|
27
|
+
*/
|
|
28
|
+
interface RoutingDeps {
|
|
29
|
+
/** Full resolution (editor -> worker -> spawn). Test seam. */
|
|
30
|
+
resolve: typeof resolveProjectConnection;
|
|
31
|
+
/** Cheap "does a live editor have this project?" probe used to hand a
|
|
32
|
+
* cached worker back to the editor path. Test seam. */
|
|
33
|
+
editorProbe: (projectPath: string) => Promise<boolean>;
|
|
34
|
+
}
|
|
35
|
+
export declare function getHeadlessRoutedClient(selection?: EngineSelection, deps?: Partial<RoutingDeps>): Promise<EngineApiClient | null>;
|
|
36
|
+
/** Test-only: drop the cached worker client and any in-flight routes. */
|
|
37
|
+
export declare function resetHeadlessRouting(): void;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { EngineApiClient } from "../api-client.js";
|
|
2
|
+
import { findProjectRoot } from "../engine.js";
|
|
3
|
+
import { isNoEditorForProjectError, resolveProjectConnection } from "./resolve.js";
|
|
4
|
+
import { normalizeProjectPath } from "./registry.js";
|
|
5
|
+
import { WorkerEngineClient } from "./worker-engine-client.js";
|
|
6
|
+
async function defaultEditorProbe(projectPath) {
|
|
7
|
+
try {
|
|
8
|
+
await EngineApiClient.connect({ projectPath });
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (isNoEditorForProjectError(error))
|
|
13
|
+
return false;
|
|
14
|
+
// Ambiguity / identity / unresponsive-editor: presence uncertain — the
|
|
15
|
+
// caller must NOT keep serving from a worker. Propagate.
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const defaultDeps = {
|
|
20
|
+
resolve: resolveProjectConnection,
|
|
21
|
+
editorProbe: defaultEditorProbe,
|
|
22
|
+
};
|
|
23
|
+
let cachedWorker = null;
|
|
24
|
+
// Single-flight: normalized project path -> in-flight routing decision.
|
|
25
|
+
const inFlightRoutes = new Map();
|
|
26
|
+
async function projectPathFromSelection(selection) {
|
|
27
|
+
if (selection?.projectPath) {
|
|
28
|
+
return (await findProjectRoot(selection.projectPath)) ?? null;
|
|
29
|
+
}
|
|
30
|
+
if (selection?.cwd) {
|
|
31
|
+
return findProjectRoot(selection.cwd);
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
function dropCachedWorker() {
|
|
36
|
+
cachedWorker?.client.close();
|
|
37
|
+
cachedWorker = null;
|
|
38
|
+
}
|
|
39
|
+
export async function getHeadlessRoutedClient(selection, deps = {}) {
|
|
40
|
+
const { resolve, editorProbe } = { ...defaultDeps, ...deps };
|
|
41
|
+
const projectPath = await projectPathFromSelection(selection);
|
|
42
|
+
if (!projectPath)
|
|
43
|
+
return null;
|
|
44
|
+
const key = normalizeProjectPath(projectPath);
|
|
45
|
+
const inFlight = inFlightRoutes.get(key);
|
|
46
|
+
if (inFlight)
|
|
47
|
+
return inFlight;
|
|
48
|
+
const route = (async () => {
|
|
49
|
+
// Editor beats worker on EVERY call, not just at first resolution: if an
|
|
50
|
+
// editor opened the project after a worker started serving it, hand the
|
|
51
|
+
// session back to the untouched editor path (and close the worker
|
|
52
|
+
// client — never orphan it). The probe is cheap (instance registry read
|
|
53
|
+
// + one short-timeout health GET).
|
|
54
|
+
if (cachedWorker && cachedWorker.key === key && cachedWorker.client.isAlive()) {
|
|
55
|
+
if (await editorProbe(projectPath)) {
|
|
56
|
+
dropCachedWorker();
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return cachedWorker.client;
|
|
60
|
+
}
|
|
61
|
+
// Cached client is for another project or dead — close before replacing.
|
|
62
|
+
dropCachedWorker();
|
|
63
|
+
const connection = await resolve(projectPath);
|
|
64
|
+
if (connection.kind === "editor") {
|
|
65
|
+
// Discard the probe connection (HTTP, nothing to tear down) and let
|
|
66
|
+
// the untouched existing path do what it does today.
|
|
67
|
+
connection.close();
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
const client = new WorkerEngineClient(connection);
|
|
71
|
+
cachedWorker = { key, client };
|
|
72
|
+
return client;
|
|
73
|
+
})().finally(() => {
|
|
74
|
+
inFlightRoutes.delete(key);
|
|
75
|
+
});
|
|
76
|
+
inFlightRoutes.set(key, route);
|
|
77
|
+
return route;
|
|
78
|
+
}
|
|
79
|
+
/** Test-only: drop the cached worker client and any in-flight routes. */
|
|
80
|
+
export function resetHeadlessRouting() {
|
|
81
|
+
dropCachedWorker();
|
|
82
|
+
inFlightRoutes.clear();
|
|
83
|
+
}
|