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,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reader for the headless process registry the engine maintains at
|
|
3
|
+
* <editor cache dir>/summer_processes.cfg (engine ConfigFile / INI-ish format).
|
|
4
|
+
*
|
|
5
|
+
* Shape (contract — mirror of the worker agent's brief):
|
|
6
|
+
* [<absolute project path>] ; section name = project path
|
|
7
|
+
* role="worker"
|
|
8
|
+
* pid=12345
|
|
9
|
+
* port=6600
|
|
10
|
+
* token="hex..."
|
|
11
|
+
* started_ts=1756700000
|
|
12
|
+
*
|
|
13
|
+
* This module only READS the registry. Dead-pid "pruning" is in-memory
|
|
14
|
+
* filtering — the CLI never rewrites the file, because the engine/worker owns
|
|
15
|
+
* it and a concurrent rewrite from the CLI could race a worker registering
|
|
16
|
+
* itself.
|
|
17
|
+
*/
|
|
18
|
+
export declare const REGISTRY_FILENAME = "summer_processes.cfg";
|
|
19
|
+
/** A registry file larger than this is treated as corrupt (empty registry). */
|
|
20
|
+
export declare const MAX_REGISTRY_BYTES: number;
|
|
21
|
+
export interface WorkerRegistryEntry {
|
|
22
|
+
/** Canonical absolute project path (the section name, resolved). */
|
|
23
|
+
projectPath: string;
|
|
24
|
+
role: string;
|
|
25
|
+
pid: number;
|
|
26
|
+
port: number;
|
|
27
|
+
token: string;
|
|
28
|
+
startedTs?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ReadRegistryOptions {
|
|
31
|
+
/** Full path to summer_processes.cfg. Overrides cacheDir. */
|
|
32
|
+
registryPath?: string;
|
|
33
|
+
/** Editor cache dir containing the registry file. */
|
|
34
|
+
cacheDir?: string;
|
|
35
|
+
/** Liveness probe, injectable for tests. Defaults to kill(pid, 0). */
|
|
36
|
+
isAlive?: (pid: number) => boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Canonicalize a project path for registry-section matching:
|
|
40
|
+
* - resolve to absolute, then REALPATH it — the engine canonicalizes the
|
|
41
|
+
* section paths it writes (macOS: /var is a symlink to /private/var), so
|
|
42
|
+
* a resolve()-only lookup of a symlinked path would never match the
|
|
43
|
+
* engine-written section and spawn would time out with the worker alive.
|
|
44
|
+
* Non-existent paths fall back to the resolved form.
|
|
45
|
+
* - strip trailing separators
|
|
46
|
+
* - on Windows: normalize backslashes to forward slashes and lowercase
|
|
47
|
+
* (NTFS is case-insensitive; the engine may write either casing)
|
|
48
|
+
* `platformName` is injectable so the Windows rules are unit-testable
|
|
49
|
+
* anywhere. Used consistently for registry lookups AND single-flight keys.
|
|
50
|
+
*/
|
|
51
|
+
export declare function normalizeProjectPath(path: string, platformName?: NodeJS.Platform): string;
|
|
52
|
+
import { processIsAlive } from "../util/process.js";
|
|
53
|
+
export { processIsAlive };
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the editor cache dir that holds summer_processes.cfg.
|
|
56
|
+
*
|
|
57
|
+
* The engine derives it from OS::get_cache_path() + get_godot_dir_name():
|
|
58
|
+
* macOS ~/Library/Caches/<Name> (platform/macos/os_macos.mm:503,561)
|
|
59
|
+
* Windows %LOCALAPPDATA%/<Name> (platform/windows/os_windows.cpp:2688)
|
|
60
|
+
* Linux $XDG_CACHE_HOME|~/.cache/<name> (platform/linuxbsd/os_linuxbsd.cpp:957)
|
|
61
|
+
* <Name> is version.py short_name — "Summer" in shipped Summer builds
|
|
62
|
+
* (verified: ~/Library/Caches/Summer holds editor_doc_cache/resthumb files),
|
|
63
|
+
* the upstream name in unrebranded dev builds. We probe the Summer name first
|
|
64
|
+
* and fall back to the upstream name only when the registry file actually
|
|
65
|
+
* exists there.
|
|
66
|
+
*
|
|
67
|
+
* SUMMER_CACHE_DIR overrides everything (useful for tests and nonstandard
|
|
68
|
+
* installs).
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveEditorCacheDir(env?: NodeJS.ProcessEnv): string;
|
|
71
|
+
export declare function registryPathFor(options?: ReadRegistryOptions): string;
|
|
72
|
+
/**
|
|
73
|
+
* Parse the registry's ConfigFile text into raw sections. Exported for tests.
|
|
74
|
+
* Tolerant: comments (; or #), blank lines, quoted or bare section names,
|
|
75
|
+
* `key=value` with or without spaces. Malformed lines are skipped — one bad
|
|
76
|
+
* section must not hide live workers.
|
|
77
|
+
*/
|
|
78
|
+
export declare function parseRegistryText(text: string): Array<{
|
|
79
|
+
section: string;
|
|
80
|
+
values: Record<string, string>;
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* Read the registry and return LIVE entries only (dead-pid sections are
|
|
84
|
+
* pruned from the result; the file itself is never rewritten). A missing or
|
|
85
|
+
* unreadable registry yields [] — same meaning as "no workers".
|
|
86
|
+
*/
|
|
87
|
+
export declare function readProcessRegistry(options?: ReadRegistryOptions): Promise<WorkerRegistryEntry[]>;
|
|
88
|
+
/** Find the live worker entry for a project (normalized path match — see
|
|
89
|
+
* normalizeProjectPath: trailing slashes stripped; on Windows additionally
|
|
90
|
+
* case-insensitive with separators normalized). */
|
|
91
|
+
export declare function findWorkerEntry(projectPath: string, options?: ReadRegistryOptions): Promise<WorkerRegistryEntry | null>;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { lstat, readFile } from "fs/promises";
|
|
2
|
+
import { existsSync, realpathSync } from "fs";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { join, resolve } from "path";
|
|
5
|
+
/**
|
|
6
|
+
* Reader for the headless process registry the engine maintains at
|
|
7
|
+
* <editor cache dir>/summer_processes.cfg (engine ConfigFile / INI-ish format).
|
|
8
|
+
*
|
|
9
|
+
* Shape (contract — mirror of the worker agent's brief):
|
|
10
|
+
* [<absolute project path>] ; section name = project path
|
|
11
|
+
* role="worker"
|
|
12
|
+
* pid=12345
|
|
13
|
+
* port=6600
|
|
14
|
+
* token="hex..."
|
|
15
|
+
* started_ts=1756700000
|
|
16
|
+
*
|
|
17
|
+
* This module only READS the registry. Dead-pid "pruning" is in-memory
|
|
18
|
+
* filtering — the CLI never rewrites the file, because the engine/worker owns
|
|
19
|
+
* it and a concurrent rewrite from the CLI could race a worker registering
|
|
20
|
+
* itself.
|
|
21
|
+
*/
|
|
22
|
+
export const REGISTRY_FILENAME = "summer_processes.cfg";
|
|
23
|
+
/** A registry file larger than this is treated as corrupt (empty registry). */
|
|
24
|
+
export const MAX_REGISTRY_BYTES = 512 * 1024;
|
|
25
|
+
/**
|
|
26
|
+
* Canonicalize a project path for registry-section matching:
|
|
27
|
+
* - resolve to absolute, then REALPATH it — the engine canonicalizes the
|
|
28
|
+
* section paths it writes (macOS: /var is a symlink to /private/var), so
|
|
29
|
+
* a resolve()-only lookup of a symlinked path would never match the
|
|
30
|
+
* engine-written section and spawn would time out with the worker alive.
|
|
31
|
+
* Non-existent paths fall back to the resolved form.
|
|
32
|
+
* - strip trailing separators
|
|
33
|
+
* - on Windows: normalize backslashes to forward slashes and lowercase
|
|
34
|
+
* (NTFS is case-insensitive; the engine may write either casing)
|
|
35
|
+
* `platformName` is injectable so the Windows rules are unit-testable
|
|
36
|
+
* anywhere. Used consistently for registry lookups AND single-flight keys.
|
|
37
|
+
*/
|
|
38
|
+
export function normalizeProjectPath(path, platformName = process.platform) {
|
|
39
|
+
let normalized = resolve(path.trim());
|
|
40
|
+
try {
|
|
41
|
+
normalized = realpathSync(normalized);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Path does not exist (yet) — keep the resolved form.
|
|
45
|
+
}
|
|
46
|
+
if (platformName === "win32") {
|
|
47
|
+
normalized = normalized.replace(/\\/g, "/").toLowerCase();
|
|
48
|
+
}
|
|
49
|
+
while (normalized.length > 1 && normalized.endsWith("/")) {
|
|
50
|
+
normalized = normalized.slice(0, -1);
|
|
51
|
+
}
|
|
52
|
+
return normalized;
|
|
53
|
+
}
|
|
54
|
+
import { processIsAlive } from "../util/process.js";
|
|
55
|
+
export { processIsAlive };
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the editor cache dir that holds summer_processes.cfg.
|
|
58
|
+
*
|
|
59
|
+
* The engine derives it from OS::get_cache_path() + get_godot_dir_name():
|
|
60
|
+
* macOS ~/Library/Caches/<Name> (platform/macos/os_macos.mm:503,561)
|
|
61
|
+
* Windows %LOCALAPPDATA%/<Name> (platform/windows/os_windows.cpp:2688)
|
|
62
|
+
* Linux $XDG_CACHE_HOME|~/.cache/<name> (platform/linuxbsd/os_linuxbsd.cpp:957)
|
|
63
|
+
* <Name> is version.py short_name — "Summer" in shipped Summer builds
|
|
64
|
+
* (verified: ~/Library/Caches/Summer holds editor_doc_cache/resthumb files),
|
|
65
|
+
* the upstream name in unrebranded dev builds. We probe the Summer name first
|
|
66
|
+
* and fall back to the upstream name only when the registry file actually
|
|
67
|
+
* exists there.
|
|
68
|
+
*
|
|
69
|
+
* SUMMER_CACHE_DIR overrides everything (useful for tests and nonstandard
|
|
70
|
+
* installs).
|
|
71
|
+
*/
|
|
72
|
+
export function resolveEditorCacheDir(env = process.env) {
|
|
73
|
+
const override = env.SUMMER_CACHE_DIR?.trim();
|
|
74
|
+
if (override)
|
|
75
|
+
return override;
|
|
76
|
+
const home = homedir();
|
|
77
|
+
let base;
|
|
78
|
+
let names;
|
|
79
|
+
switch (process.platform) {
|
|
80
|
+
case "darwin":
|
|
81
|
+
base = join(home, "Library", "Caches");
|
|
82
|
+
names = ["Summer", "Godot"];
|
|
83
|
+
break;
|
|
84
|
+
case "win32":
|
|
85
|
+
base = env.LOCALAPPDATA?.trim() || join(home, "AppData", "Local");
|
|
86
|
+
names = ["Summer", "Godot"];
|
|
87
|
+
break;
|
|
88
|
+
default: {
|
|
89
|
+
const xdg = env.XDG_CACHE_HOME?.trim();
|
|
90
|
+
base = xdg && xdg.startsWith("/") ? xdg : join(home, ".cache");
|
|
91
|
+
names = ["summer", "godot"];
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
for (const name of names) {
|
|
96
|
+
if (existsSync(join(base, name, REGISTRY_FILENAME)))
|
|
97
|
+
return join(base, name);
|
|
98
|
+
}
|
|
99
|
+
// Default to the Summer-branded dir even when the registry does not exist
|
|
100
|
+
// yet — a spawned worker will create the file there.
|
|
101
|
+
return join(base, names[0]);
|
|
102
|
+
}
|
|
103
|
+
export function registryPathFor(options = {}) {
|
|
104
|
+
if (options.registryPath)
|
|
105
|
+
return options.registryPath;
|
|
106
|
+
return join(options.cacheDir ?? resolveEditorCacheDir(), REGISTRY_FILENAME);
|
|
107
|
+
}
|
|
108
|
+
function unquote(raw) {
|
|
109
|
+
const trimmed = raw.trim();
|
|
110
|
+
if (trimmed.length >= 2 && trimmed.startsWith('"') && trimmed.endsWith('"')) {
|
|
111
|
+
// The registry's string escapes are a JSON subset for the values we
|
|
112
|
+
// care about (paths, roles, hex tokens). Fall back to a bare strip when
|
|
113
|
+
// JSON.parse rejects an exotic escape.
|
|
114
|
+
try {
|
|
115
|
+
const parsed = JSON.parse(trimmed);
|
|
116
|
+
if (typeof parsed === "string")
|
|
117
|
+
return parsed;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
/* fall through */
|
|
121
|
+
}
|
|
122
|
+
return trimmed.slice(1, -1);
|
|
123
|
+
}
|
|
124
|
+
return trimmed;
|
|
125
|
+
}
|
|
126
|
+
function numberValue(raw) {
|
|
127
|
+
const value = Number(unquote(raw));
|
|
128
|
+
return Number.isFinite(value) ? value : undefined;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Parse the registry's ConfigFile text into raw sections. Exported for tests.
|
|
132
|
+
* Tolerant: comments (; or #), blank lines, quoted or bare section names,
|
|
133
|
+
* `key=value` with or without spaces. Malformed lines are skipped — one bad
|
|
134
|
+
* section must not hide live workers.
|
|
135
|
+
*/
|
|
136
|
+
export function parseRegistryText(text) {
|
|
137
|
+
const sections = [];
|
|
138
|
+
let current = null;
|
|
139
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
140
|
+
const line = rawLine.trim();
|
|
141
|
+
if (!line || line.startsWith(";") || line.startsWith("#"))
|
|
142
|
+
continue;
|
|
143
|
+
if (line.startsWith("[") && line.endsWith("]")) {
|
|
144
|
+
// Godot's ConfigFile writes a section name as "[" + name.replace("]",
|
|
145
|
+
// "\\]") + "]", so a project path containing "]" arrives escaped and
|
|
146
|
+
// would otherwise never match the caller's normalized path.
|
|
147
|
+
const name = unquote(line.slice(1, -1).replace(/\\\]/g, "]"));
|
|
148
|
+
current = { section: name, values: {} };
|
|
149
|
+
sections.push(current);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (!current)
|
|
153
|
+
continue;
|
|
154
|
+
const eq = line.indexOf("=");
|
|
155
|
+
if (eq <= 0)
|
|
156
|
+
continue;
|
|
157
|
+
const key = line.slice(0, eq).trim();
|
|
158
|
+
const value = line.slice(eq + 1).trim();
|
|
159
|
+
if (key)
|
|
160
|
+
current.values[key] = value;
|
|
161
|
+
}
|
|
162
|
+
return sections;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Read the registry and return LIVE entries only (dead-pid sections are
|
|
166
|
+
* pruned from the result; the file itself is never rewritten). A missing or
|
|
167
|
+
* unreadable registry yields [] — same meaning as "no workers".
|
|
168
|
+
*/
|
|
169
|
+
export async function readProcessRegistry(options = {}) {
|
|
170
|
+
const path = registryPathFor(options);
|
|
171
|
+
const isAlive = options.isAlive ?? processIsAlive;
|
|
172
|
+
let text;
|
|
173
|
+
try {
|
|
174
|
+
// Trust boundary: only a REGULAR file is accepted — a symlink planted at
|
|
175
|
+
// the registry path (pointing at attacker-chosen content) is refused, as
|
|
176
|
+
// is an implausibly large file. lstat does not follow symlinks.
|
|
177
|
+
const info = await lstat(path);
|
|
178
|
+
if (!info.isFile() ||
|
|
179
|
+
info.isSymbolicLink() ||
|
|
180
|
+
info.size > MAX_REGISTRY_BYTES) {
|
|
181
|
+
return [];
|
|
182
|
+
}
|
|
183
|
+
text = await readFile(path, "utf-8");
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return [];
|
|
187
|
+
}
|
|
188
|
+
const entries = [];
|
|
189
|
+
for (const { section, values } of parseRegistryText(text)) {
|
|
190
|
+
const pid = numberValue(values.pid ?? "");
|
|
191
|
+
const port = numberValue(values.port ?? "");
|
|
192
|
+
const token = values.token !== undefined ? unquote(values.token) : "";
|
|
193
|
+
const role = values.role !== undefined ? unquote(values.role) : "";
|
|
194
|
+
if (!section ||
|
|
195
|
+
!pid ||
|
|
196
|
+
!Number.isInteger(pid) ||
|
|
197
|
+
pid <= 0 ||
|
|
198
|
+
!port ||
|
|
199
|
+
!Number.isInteger(port) ||
|
|
200
|
+
port < 1 ||
|
|
201
|
+
port > 65535 ||
|
|
202
|
+
!token) {
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
if (!isAlive(pid))
|
|
206
|
+
continue;
|
|
207
|
+
entries.push({
|
|
208
|
+
projectPath: resolve(section),
|
|
209
|
+
role,
|
|
210
|
+
pid,
|
|
211
|
+
port,
|
|
212
|
+
token,
|
|
213
|
+
startedTs: numberValue(values.started_ts ?? ""),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
return entries;
|
|
217
|
+
}
|
|
218
|
+
/** Find the live worker entry for a project (normalized path match — see
|
|
219
|
+
* normalizeProjectPath: trailing slashes stripped; on Windows additionally
|
|
220
|
+
* case-insensitive with separators normalized). */
|
|
221
|
+
export async function findWorkerEntry(projectPath, options = {}) {
|
|
222
|
+
const target = normalizeProjectPath(projectPath);
|
|
223
|
+
const entries = await readProcessRegistry(options);
|
|
224
|
+
return (entries.find((entry) => normalizeProjectPath(entry.projectPath) === target &&
|
|
225
|
+
entry.role === "worker") ?? null);
|
|
226
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { ProjectConnection } from "./connection.js";
|
|
2
|
+
import { EditorConnection } from "./editor-connection.js";
|
|
3
|
+
import { type ReadRegistryOptions, type WorkerRegistryEntry } from "./registry.js";
|
|
4
|
+
import { type SpawnWorkerOptions } from "./spawn.js";
|
|
5
|
+
import { WorkerConnection } from "./worker-connection.js";
|
|
6
|
+
/**
|
|
7
|
+
* resolveProjectConnection — the routing decision, in fixed priority order:
|
|
8
|
+
*
|
|
9
|
+
* 1. EDITOR a live editor that has the project open (today's transport,
|
|
10
|
+
* via the existing instance registry in ~/.summer/instances)
|
|
11
|
+
* 2. WORKER a live headless worker registered for the project in
|
|
12
|
+
* <editor cache dir>/summer_processes.cfg
|
|
13
|
+
* 3. SPAWN launch `<engine> --summer-worker --path <project>`, wait for
|
|
14
|
+
* its registry entry (up to ~120s), connect to it
|
|
15
|
+
*
|
|
16
|
+
* Every step is injectable for tests; the defaults wire the real editor
|
|
17
|
+
* discovery (core/engine.ts resolveEngineConnection via EngineApiClient),
|
|
18
|
+
* the real registry reader, and the real spawner.
|
|
19
|
+
*/
|
|
20
|
+
export interface ResolveProjectConnectionOptions {
|
|
21
|
+
registry?: ReadRegistryOptions;
|
|
22
|
+
spawn?: Omit<SpawnWorkerOptions, "registry">;
|
|
23
|
+
onProgress?: (progress: {
|
|
24
|
+
phase: string;
|
|
25
|
+
elapsedMs?: number;
|
|
26
|
+
}) => void;
|
|
27
|
+
/** Test seams. Defaults are the real implementations. */
|
|
28
|
+
deps?: {
|
|
29
|
+
tryEditor?: (projectPath: string) => Promise<EditorConnection>;
|
|
30
|
+
findWorker?: (projectPath: string, registry?: ReadRegistryOptions) => Promise<WorkerRegistryEntry | null>;
|
|
31
|
+
spawnWorker?: (projectPath: string, options?: SpawnWorkerOptions) => Promise<WorkerRegistryEntry>;
|
|
32
|
+
connectWorker?: (entry: WorkerRegistryEntry, projectPath: string) => Promise<WorkerConnection>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Classify an editor-resolution failure. Routing may fall through to a
|
|
37
|
+
* worker ONLY when the failure positively means "no live editor has this
|
|
38
|
+
* project" (core/engine.ts: no registry match, or legacy no-api-token).
|
|
39
|
+
* Everything else — ambiguity ("more than one editor matches"), identity
|
|
40
|
+
* changes, an editor that exists but is not responding, auth failures, a
|
|
41
|
+
* path that is not a project — means the editor's presence is UNCERTAIN, and
|
|
42
|
+
* a worker must never write while that is true. Those errors RETHROW.
|
|
43
|
+
* Exported for tests and for mcp-routing.
|
|
44
|
+
*/
|
|
45
|
+
export declare function isNoEditorForProjectError(error: unknown): boolean;
|
|
46
|
+
export declare function resolveProjectConnection(projectPath: string, options?: ResolveProjectConnectionOptions): Promise<ProjectConnection>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { resolve as resolvePath } from "path";
|
|
2
|
+
import { EngineApiClient } from "../api-client.js";
|
|
3
|
+
import { EditorConnection } from "./editor-connection.js";
|
|
4
|
+
import { findWorkerEntry, } from "./registry.js";
|
|
5
|
+
import { spawnWorker } from "./spawn.js";
|
|
6
|
+
import { WorkerConnection } from "./worker-connection.js";
|
|
7
|
+
async function defaultTryEditor(projectPath) {
|
|
8
|
+
// resolveEngineConnection (inside connect) throws when no live editor
|
|
9
|
+
// matches this exact project — ONLY that failure class is the signal to
|
|
10
|
+
// fall through to the worker path (see isNoEditorForProjectError).
|
|
11
|
+
const client = await EngineApiClient.connect({ projectPath });
|
|
12
|
+
return new EditorConnection(client, projectPath);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Classify an editor-resolution failure. Routing may fall through to a
|
|
16
|
+
* worker ONLY when the failure positively means "no live editor has this
|
|
17
|
+
* project" (core/engine.ts: no registry match, or legacy no-api-token).
|
|
18
|
+
* Everything else — ambiguity ("more than one editor matches"), identity
|
|
19
|
+
* changes, an editor that exists but is not responding, auth failures, a
|
|
20
|
+
* path that is not a project — means the editor's presence is UNCERTAIN, and
|
|
21
|
+
* a worker must never write while that is true. Those errors RETHROW.
|
|
22
|
+
* Exported for tests and for mcp-routing.
|
|
23
|
+
*/
|
|
24
|
+
export function isNoEditorForProjectError(error) {
|
|
25
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
26
|
+
return (message.includes("No running Summer editor matches") ||
|
|
27
|
+
message.includes("no api-token found"));
|
|
28
|
+
}
|
|
29
|
+
function defaultConnectWorker(entry, projectPath) {
|
|
30
|
+
return WorkerConnection.connect({
|
|
31
|
+
port: entry.port,
|
|
32
|
+
token: entry.token,
|
|
33
|
+
pid: entry.pid,
|
|
34
|
+
projectPath,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function resolveProjectConnection(projectPath, options = {}) {
|
|
38
|
+
const target = resolvePath(projectPath);
|
|
39
|
+
const tryEditor = options.deps?.tryEditor ?? defaultTryEditor;
|
|
40
|
+
const findWorker = options.deps?.findWorker ?? findWorkerEntry;
|
|
41
|
+
const doSpawn = options.deps?.spawnWorker ?? spawnWorker;
|
|
42
|
+
const connectWorker = options.deps?.connectWorker ?? defaultConnectWorker;
|
|
43
|
+
// 1. Editor beats worker. ONLY a positive "no editor has this project"
|
|
44
|
+
// falls through — ambiguity/identity/auth/unresponsive-editor errors
|
|
45
|
+
// rethrow, because a worker must never write while an editor's presence is
|
|
46
|
+
// uncertain.
|
|
47
|
+
try {
|
|
48
|
+
return await tryEditor(target);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (!isNoEditorForProjectError(error))
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
// 2. Live worker from the registry. A stale entry whose process answers the
|
|
55
|
+
// pid probe but whose socket/handshake is gone falls through to spawn —
|
|
56
|
+
// and spawnWorker snapshots it as a baseline so the stale entry can never
|
|
57
|
+
// satisfy the post-spawn poll.
|
|
58
|
+
const existing = await findWorker(target, options.registry);
|
|
59
|
+
if (existing) {
|
|
60
|
+
try {
|
|
61
|
+
return await connectWorker(existing, target);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
options.onProgress?.({ phase: "registry_worker_unreachable" });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 3. Spawn on demand, then connect.
|
|
68
|
+
options.onProgress?.({ phase: "spawning_worker" });
|
|
69
|
+
const entry = await doSpawn(target, {
|
|
70
|
+
...options.spawn,
|
|
71
|
+
registry: options.registry,
|
|
72
|
+
onProgress: options.onProgress,
|
|
73
|
+
});
|
|
74
|
+
return connectWorker(entry, target);
|
|
75
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { type ReadRegistryOptions, type WorkerRegistryEntry } from "./registry.js";
|
|
2
|
+
export declare function findEngineBinary(env?: NodeJS.ProcessEnv): string | null;
|
|
3
|
+
/** What a launcher must report back so the poll loop can fail fast when the
|
|
4
|
+
* worker dies before registering. The default launcher wires a real child
|
|
5
|
+
* process; tests inject fakes. */
|
|
6
|
+
export interface LaunchHandle {
|
|
7
|
+
/** Non-null once the child has exited. */
|
|
8
|
+
exit(): {
|
|
9
|
+
code: number | null;
|
|
10
|
+
signal: NodeJS.Signals | null;
|
|
11
|
+
} | null;
|
|
12
|
+
/** Last bytes of the child's stderr (best-effort, may be ""). MUST never
|
|
13
|
+
* contain the registry token — workers own their own log hygiene, but
|
|
14
|
+
* this layer additionally never logs tokens itself. */
|
|
15
|
+
stderrTail(): string;
|
|
16
|
+
/** Terminate the child (SIGTERM, escalating to SIGKILL after a grace
|
|
17
|
+
* period). Called whenever the spawn attempt is ABANDONED without
|
|
18
|
+
* adopting a registry entry — an unadopted worker must never be leaked.
|
|
19
|
+
* Optional so test fakes without a real process can omit it. */
|
|
20
|
+
kill?(): void;
|
|
21
|
+
}
|
|
22
|
+
export type Launcher = (binary: string, args: string[]) => LaunchHandle;
|
|
23
|
+
export interface SpawnWorkerOptions {
|
|
24
|
+
/** Explicit engine binary; defaults to findEngineBinary(). */
|
|
25
|
+
binary?: string;
|
|
26
|
+
/** Registry read options (test injection: registryPath / isAlive). */
|
|
27
|
+
registry?: ReadRegistryOptions;
|
|
28
|
+
/** Registration budget. Default SUMMER_WORKER_SPAWN_TIMEOUT_MS or 120s
|
|
29
|
+
* (first imports of large projects are slow). */
|
|
30
|
+
timeoutMs?: number;
|
|
31
|
+
pollIntervalMs?: number;
|
|
32
|
+
/** Elapsed-time progress while waiting for the worker to register. */
|
|
33
|
+
onProgress?: (progress: {
|
|
34
|
+
phase: string;
|
|
35
|
+
elapsedMs: number;
|
|
36
|
+
}) => void;
|
|
37
|
+
/** Process launcher, injectable for tests. */
|
|
38
|
+
launch?: Launcher;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Spawn a headless worker for `projectPath` and wait for its registry entry.
|
|
42
|
+
* Resolves with the live entry; rejects on missing binary, early exit
|
|
43
|
+
* (surfacing the exit code and a stderr tail), or registration timeout.
|
|
44
|
+
* Concurrent calls for the same project share ONE spawn.
|
|
45
|
+
*/
|
|
46
|
+
export declare function spawnWorker(projectPath: string, options?: SpawnWorkerOptions): Promise<WorkerRegistryEntry>;
|