summer-engine 2.8.2 → 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 +131 -44
- 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 +138 -24
- 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/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 +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/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
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
1
|
+
import { existsSync, readFileSync, realpathSync, statSync } from "node:fs";
|
|
2
2
|
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
3
3
|
import { Command } from "commander";
|
|
4
|
-
import { checkEngineHealth, getApiPort } from "
|
|
5
|
-
import { getProjectMemorySummary, } from "
|
|
6
|
-
import { c, pad, tildeify } from "
|
|
4
|
+
import { checkEngineHealth, getApiPort } from "../../core/engine.js";
|
|
5
|
+
import { getProjectMemorySummary, } from "../../project-memory/project-memory.js";
|
|
6
|
+
import { c, pad, tildeify } from "../../core/format.js";
|
|
7
7
|
export const memoryCommand = new Command("memory")
|
|
8
8
|
.description("Inspect project memory in .summer")
|
|
9
9
|
.option("--project <path>", "Project directory to inspect")
|
|
@@ -59,7 +59,7 @@ memoryCommand
|
|
|
59
59
|
}
|
|
60
60
|
console.log(join(resolvedProject.projectPath, ".summer"));
|
|
61
61
|
});
|
|
62
|
-
|
|
62
|
+
async function resolveMemoryProject(projectOption) {
|
|
63
63
|
if (projectOption) {
|
|
64
64
|
const projectPath = resolve(projectOption);
|
|
65
65
|
if (!existsSync(projectPath)) {
|
|
@@ -105,17 +105,26 @@ export function findProjectRoot(startDir) {
|
|
|
105
105
|
}
|
|
106
106
|
export function resolveMemoryFilePath(projectPath, requested) {
|
|
107
107
|
const summerDir = resolve(projectPath, ".summer");
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
const
|
|
112
|
-
|
|
108
|
+
// Accept Windows-style separators in the requested name on every platform;
|
|
109
|
+
// memory file names never legitimately contain a backslash.
|
|
110
|
+
const normalized = requested.replace(/\\/g, "/");
|
|
111
|
+
const rawPath = normalized.startsWith(".summer/")
|
|
112
|
+
? resolve(projectPath, normalized)
|
|
113
|
+
: resolve(summerDir, normalized);
|
|
114
|
+
if (!isPathInside(summerDir, rawPath)) {
|
|
113
115
|
throw new Error("Memory files must be inside the project's .summer directory.");
|
|
114
116
|
}
|
|
115
117
|
if (!existsSync(rawPath)) {
|
|
116
118
|
throw new Error(`Memory file not found: ${requested}`);
|
|
117
119
|
}
|
|
118
|
-
|
|
120
|
+
// The lexical check above follows nothing; a symlink placed inside .summer
|
|
121
|
+
// can point anywhere. Compare real paths on BOTH sides so a link that leaves
|
|
122
|
+
// .summer is refused (and a legitimately symlinked .summer still works).
|
|
123
|
+
const realPath = realpathSync(rawPath);
|
|
124
|
+
if (!isPathInside(realpathSync(summerDir), realPath)) {
|
|
125
|
+
throw new Error("Memory files must be inside the project's .summer directory (a symlink that leaves it is refused).");
|
|
126
|
+
}
|
|
127
|
+
if (!statSync(realPath).isFile()) {
|
|
119
128
|
throw new Error(`Memory path is not a file: ${requested}`);
|
|
120
129
|
}
|
|
121
130
|
return rawPath;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type OpenDeps, type OpenResult, type OpenSurface } from "../../core/capabilities/navigation/open.js";
|
|
3
|
+
/**
|
|
4
|
+
* `summer open` has two jobs that share one verb:
|
|
5
|
+
*
|
|
6
|
+
* 1. `summer open <project-dir>` — the original command: open a project in
|
|
7
|
+
* Summer Engine (launching it when it is not running). Any argument that is
|
|
8
|
+
* an existing directory or looks like a filesystem path takes this branch,
|
|
9
|
+
* so nothing that worked before changes.
|
|
10
|
+
* 2. `summer open <target>` — navigation (docs/design/NAVIGATION-DESIGN.md):
|
|
11
|
+
* a product-map id ("billing"), an intent phrase ("change my plan"), a
|
|
12
|
+
* res:// path, or a summerengine.com path. Same behavior as the
|
|
13
|
+
* summer_open MCP tool and `summer tool open` (core/capabilities/navigation).
|
|
14
|
+
*/
|
|
15
|
+
export interface OpenNavigationOptions {
|
|
16
|
+
print?: boolean;
|
|
17
|
+
list?: boolean;
|
|
18
|
+
web?: boolean;
|
|
19
|
+
editor?: boolean;
|
|
20
|
+
json?: boolean;
|
|
21
|
+
path?: string;
|
|
22
|
+
node?: string;
|
|
23
|
+
scene?: string;
|
|
24
|
+
param?: string[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Which branch does `summer open <arg>` take?
|
|
28
|
+
* - An exact product-map id or alias (`billing`, `inspector`) is ALWAYS a
|
|
29
|
+
* navigation target, even if a directory of that name exists in cwd — use
|
|
30
|
+
* `./billing` to open a project folder that happens to share a name.
|
|
31
|
+
* - `./x`, `../x`, `~/x`, `.`, `..`, Windows drive paths: project directory.
|
|
32
|
+
* - `/x`: a project directory when it exists on disk; otherwise a
|
|
33
|
+
* summerengine.com path (`/pricing`) when the map knows it; otherwise the
|
|
34
|
+
* project-directory branch, which reports "Directory not found".
|
|
35
|
+
* - Anything else: a project directory only when it exists as one.
|
|
36
|
+
*/
|
|
37
|
+
export declare function looksLikeProjectPath(arg: string): boolean;
|
|
38
|
+
export declare function parseParamOptions(options: OpenNavigationOptions): Record<string, string>;
|
|
39
|
+
export declare function surfaceFromOptions(options: OpenNavigationOptions): OpenSurface;
|
|
40
|
+
export declare function formatOpenResult(result: OpenResult): string;
|
|
41
|
+
export declare function defaultOpenDeps(): OpenDeps;
|
|
42
|
+
/** The navigation branch. Returns the result so tests can assert without a
|
|
43
|
+
* process exit; sets exitCode 1 when nothing could be opened. */
|
|
44
|
+
export declare function runOpenNavigation(target: string | undefined, options: OpenNavigationOptions, deps?: OpenDeps, log?: (line: string) => void): Promise<OpenResult>;
|
|
45
|
+
export declare const openCommand: Command;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { existsSync, statSync } from "fs";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
import open from "open";
|
|
5
|
+
import { getApiPort, checkEngineHealth } from "../../core/engine.js";
|
|
6
|
+
import { getAuthToken } from "../../core/auth.js";
|
|
7
|
+
import { resolveGatewayUrl } from "../../core/config.js";
|
|
8
|
+
import { EngineApiClient } from "../../core/api-client.js";
|
|
9
|
+
import { resolveTarget, runOpen, } from "../../core/capabilities/navigation/open.js";
|
|
10
|
+
import { getNavTarget } from "../../core/capabilities/navigation/targets.js";
|
|
11
|
+
import { c, sym } from "../../core/format.js";
|
|
12
|
+
/**
|
|
13
|
+
* Which branch does `summer open <arg>` take?
|
|
14
|
+
* - An exact product-map id or alias (`billing`, `inspector`) is ALWAYS a
|
|
15
|
+
* navigation target, even if a directory of that name exists in cwd — use
|
|
16
|
+
* `./billing` to open a project folder that happens to share a name.
|
|
17
|
+
* - `./x`, `../x`, `~/x`, `.`, `..`, Windows drive paths: project directory.
|
|
18
|
+
* - `/x`: a project directory when it exists on disk; otherwise a
|
|
19
|
+
* summerengine.com path (`/pricing`) when the map knows it; otherwise the
|
|
20
|
+
* project-directory branch, which reports "Directory not found".
|
|
21
|
+
* - Anything else: a project directory only when it exists as one.
|
|
22
|
+
*/
|
|
23
|
+
export function looksLikeProjectPath(arg) {
|
|
24
|
+
const trimmed = arg.trim();
|
|
25
|
+
if (getNavTarget(trimmed.toLowerCase().replace(/\s+/g, "-")))
|
|
26
|
+
return false;
|
|
27
|
+
if (/^(\.\/|\.\.\/|~)/.test(trimmed) || /^[A-Za-z]:[\\/]/.test(trimmed) || trimmed === "." || trimmed === "..")
|
|
28
|
+
return true;
|
|
29
|
+
if (trimmed.startsWith("/")) {
|
|
30
|
+
if (isDirectory(trimmed))
|
|
31
|
+
return true;
|
|
32
|
+
const resolution = resolveTarget(trimmed, {}, "web");
|
|
33
|
+
return !(resolution.kind === "target");
|
|
34
|
+
}
|
|
35
|
+
return isDirectory(trimmed);
|
|
36
|
+
}
|
|
37
|
+
function isDirectory(path) {
|
|
38
|
+
try {
|
|
39
|
+
return statSync(resolve(path)).isDirectory();
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export function parseParamOptions(options) {
|
|
46
|
+
const params = {};
|
|
47
|
+
for (const pair of options.param ?? []) {
|
|
48
|
+
const eq = pair.indexOf("=");
|
|
49
|
+
if (eq <= 0)
|
|
50
|
+
throw new Error(`--param expects key=value, got "${pair}"`);
|
|
51
|
+
params[pair.slice(0, eq).trim()] = pair.slice(eq + 1).trim();
|
|
52
|
+
}
|
|
53
|
+
if (options.path)
|
|
54
|
+
params.path = options.path;
|
|
55
|
+
if (options.node)
|
|
56
|
+
params.node = options.node;
|
|
57
|
+
if (options.scene)
|
|
58
|
+
params.scene = options.scene;
|
|
59
|
+
return params;
|
|
60
|
+
}
|
|
61
|
+
export function surfaceFromOptions(options) {
|
|
62
|
+
if (options.web && options.editor)
|
|
63
|
+
throw new Error("--web and --editor are mutually exclusive");
|
|
64
|
+
return options.web ? "web" : options.editor ? "editor" : "auto";
|
|
65
|
+
}
|
|
66
|
+
export function formatOpenResult(result) {
|
|
67
|
+
const lines = [];
|
|
68
|
+
switch (result.action) {
|
|
69
|
+
case "listed": {
|
|
70
|
+
const targets = result.targets ?? [];
|
|
71
|
+
const width = Math.max(...targets.map((t) => t.id.length), 2);
|
|
72
|
+
lines.push(c.bold(`Summer destinations (${targets.length})`));
|
|
73
|
+
for (const t of targets) {
|
|
74
|
+
const req = t.requires.login ? c.dim(" [login]") : "";
|
|
75
|
+
const avail = t.availability === "available"
|
|
76
|
+
? c.green("available ")
|
|
77
|
+
: t.availability === "legacy"
|
|
78
|
+
? c.dim("legacy op ")
|
|
79
|
+
: t.availability === "unavailable"
|
|
80
|
+
? c.yellow("unavailable")
|
|
81
|
+
: t.availability === "unknown"
|
|
82
|
+
? c.dim("unknown ")
|
|
83
|
+
: c.dim("web ");
|
|
84
|
+
lines.push(` ${t.id.padEnd(width)} ${avail} ${t.title}${req}`);
|
|
85
|
+
}
|
|
86
|
+
lines.push("");
|
|
87
|
+
lines.push(c.dim("Editor availability comes from the connected engine (unknown = engine not running; unavailable = update Summer Engine)."));
|
|
88
|
+
lines.push(c.dim("Open one: summer open <id> Print instead: summer open <id> --print Phrases work too: summer open \"change my plan\""));
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "opened":
|
|
92
|
+
lines.push(`${sym.ok()} Opened ${result.target?.title ?? result.url ?? "destination"}`);
|
|
93
|
+
if (result.opened_url)
|
|
94
|
+
lines.push(` ${result.opened_url}`);
|
|
95
|
+
if (result.op)
|
|
96
|
+
lines.push(` ${c.dim(JSON.stringify(result.op))}`);
|
|
97
|
+
if (result.hint)
|
|
98
|
+
lines.push(` ${c.dim(result.hint)}`);
|
|
99
|
+
break;
|
|
100
|
+
case "printed":
|
|
101
|
+
if (result.url)
|
|
102
|
+
lines.push(result.url);
|
|
103
|
+
if (result.login_url && result.logged_in === false)
|
|
104
|
+
lines.push(c.dim(`not logged in here — through login: ${result.login_url}`));
|
|
105
|
+
if (result.op)
|
|
106
|
+
lines.push(JSON.stringify(result.op));
|
|
107
|
+
if (result.target)
|
|
108
|
+
lines.push(c.dim(`${result.target.title} — ${result.target.description}`));
|
|
109
|
+
if (result.engine && !result.engine.running)
|
|
110
|
+
lines.push(c.dim("(engine not running; nothing was sent)"));
|
|
111
|
+
break;
|
|
112
|
+
case "ambiguous":
|
|
113
|
+
lines.push(`${sym.warn()} ${result.hint ?? "Several destinations match."}`);
|
|
114
|
+
for (const m of result.matches ?? [])
|
|
115
|
+
lines.push(` ${m.id.padEnd(18)} ${m.surface.padEnd(6)} ${m.title}`);
|
|
116
|
+
break;
|
|
117
|
+
case "unsupported":
|
|
118
|
+
lines.push(`${sym.warn()} ${result.target?.title ?? result.target?.id} is not available on this Summer Engine build.`);
|
|
119
|
+
if (result.hint)
|
|
120
|
+
lines.push(` ${result.hint}`);
|
|
121
|
+
if (result.op)
|
|
122
|
+
lines.push(` would send: ${JSON.stringify(result.op)}`);
|
|
123
|
+
break;
|
|
124
|
+
case "open_failed":
|
|
125
|
+
case "blocked_origin":
|
|
126
|
+
lines.push(c.red(result.hint ?? result.action));
|
|
127
|
+
if (result.url)
|
|
128
|
+
lines.push(` ${result.url}`);
|
|
129
|
+
break;
|
|
130
|
+
case "engine_not_running":
|
|
131
|
+
lines.push(c.red("Summer Engine is not running (or no project is open) — nothing was opened."));
|
|
132
|
+
if (result.op)
|
|
133
|
+
lines.push(` would send: ${JSON.stringify(result.op)}`);
|
|
134
|
+
lines.push(" Start it with 'summer run <project>' or open the project in the Summer desktop app, then retry.");
|
|
135
|
+
break;
|
|
136
|
+
default:
|
|
137
|
+
lines.push(c.red(result.hint ?? result.action));
|
|
138
|
+
for (const m of result.matches ?? [])
|
|
139
|
+
lines.push(` ${m.id.padEnd(18)} ${m.title}`);
|
|
140
|
+
}
|
|
141
|
+
return lines.join("\n");
|
|
142
|
+
}
|
|
143
|
+
export function defaultOpenDeps() {
|
|
144
|
+
return {
|
|
145
|
+
engine: () => EngineApiClient.connect(),
|
|
146
|
+
openUrl: (url) => open(url),
|
|
147
|
+
isLoggedIn: async () => (await getAuthToken()) !== null,
|
|
148
|
+
gatewayUrl: resolveGatewayUrl,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** The navigation branch. Returns the result so tests can assert without a
|
|
152
|
+
* process exit; sets exitCode 1 when nothing could be opened. */
|
|
153
|
+
export async function runOpenNavigation(target, options, deps = defaultOpenDeps(), log = console.log) {
|
|
154
|
+
const result = await runOpen({
|
|
155
|
+
target: options.list ? undefined : target,
|
|
156
|
+
params: parseParamOptions(options),
|
|
157
|
+
surface: surfaceFromOptions(options),
|
|
158
|
+
open: options.print !== true,
|
|
159
|
+
}, deps);
|
|
160
|
+
log(options.json ? JSON.stringify(result, null, 2) : formatOpenResult(result));
|
|
161
|
+
if (!result.ok)
|
|
162
|
+
process.exitCode = 1;
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
async function openProjectPath(projectPath) {
|
|
166
|
+
const fullPath = resolve(projectPath);
|
|
167
|
+
if (!existsSync(fullPath)) {
|
|
168
|
+
console.error(`Directory not found: ${fullPath}`);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
if (!existsSync(`${fullPath}/project.godot`)) {
|
|
172
|
+
console.error(`No project.godot found in ${fullPath}\n` +
|
|
173
|
+
"This doesn't look like a Summer Engine project.\n" +
|
|
174
|
+
"Create one with: summer create 3d-basic my-game");
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
const port = await getApiPort();
|
|
178
|
+
const health = await checkEngineHealth(port);
|
|
179
|
+
if (!health) {
|
|
180
|
+
console.log("Engine not running. Launching with this project...");
|
|
181
|
+
// Import dynamically to avoid circular deps. `from: "user"` means the
|
|
182
|
+
// array holds ONLY user arguments — no node/script prefix — otherwise
|
|
183
|
+
// commander binds `[path]` to "node".
|
|
184
|
+
const { runCommand } = await import("./run.js");
|
|
185
|
+
await runCommand.parseAsync([fullPath], { from: "user" });
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
console.log(`Opening project: ${fullPath}`);
|
|
189
|
+
console.log("Note: To switch projects, close the current one in Summer Engine first,\n" +
|
|
190
|
+
"then run: summer run " + fullPath);
|
|
191
|
+
}
|
|
192
|
+
export const openCommand = new Command("open")
|
|
193
|
+
.description("Open a project in Summer Engine, or open a Summer destination by name — a summerengine.com page (billing, my-games, pricing, mcp-guide …) or an editor surface (scene, node, script, inspector …)")
|
|
194
|
+
.argument("[target]", "Project directory (contains project.godot), or a destination: id, phrase, res:// path, or summerengine.com path")
|
|
195
|
+
.option("--print", "Resolve only: print the URL or engine op, open nothing")
|
|
196
|
+
.option("--list", "List every destination with surface and status")
|
|
197
|
+
.option("--web", "Only match website destinations")
|
|
198
|
+
.option("--editor", "Only match editor destinations")
|
|
199
|
+
.option("--json", "Print the full result as JSON")
|
|
200
|
+
.option("--path <res>", "res:// path for scene / script / file targets")
|
|
201
|
+
.option("--node <path>", "Node path for the node target, e.g. Player/Camera3D")
|
|
202
|
+
.option("--scene <res>", "Scene to open before selecting a node")
|
|
203
|
+
.option("--param <key=value>", "Slot value (gameId, section, username, version, guide); repeatable", (value, previous = []) => [...previous, value])
|
|
204
|
+
.action(async (target, options) => {
|
|
205
|
+
if (target !== undefined && !options.list && looksLikeProjectPath(target)) {
|
|
206
|
+
await openProjectPath(target);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
await runOpenNavigation(target, options);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
214
|
+
process.exitCode = 1;
|
|
215
|
+
}
|
|
216
|
+
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { ASSET_POLICIES, GAME_TASK_MODES, GAME_TASK_TARGETS, VERIFICATION_LEVELS, buildGameTaskPlan, } from "
|
|
3
|
-
import { c } from "
|
|
2
|
+
import { ASSET_POLICIES, GAME_TASK_MODES, GAME_TASK_TARGETS, VERIFICATION_LEVELS, buildGameTaskPlan, } from "../../core/capabilities/game-task-plan.js";
|
|
3
|
+
import { c } from "../../core/format.js";
|
|
4
4
|
function parseChoice(value, choices, label) {
|
|
5
5
|
if (!value)
|
|
6
6
|
return undefined;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { publishCreator } from "
|
|
2
|
+
import { publishCreator } from "../../core/capabilities/creator.js";
|
|
3
3
|
export const publishCommand = new Command("publish")
|
|
4
4
|
.description("Publish a confirmed creator release")
|
|
5
5
|
.argument("[project]", "Project root. Defaults to the current directory.")
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { listCreatorReleases } from "
|
|
2
|
+
import { listCreatorReleases } from "../../core/capabilities/creator.js";
|
|
3
3
|
export const releasesCommand = new Command("releases")
|
|
4
4
|
.description("List creator releases for a project")
|
|
5
5
|
.option("--project-id <id>", "Creator project ID")
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { ENGINE_BIN_ENV } from "../../core/engine-install.js";
|
|
3
|
+
export type RunBinaryResolution = {
|
|
4
|
+
binary: string;
|
|
5
|
+
source: "--bin" | typeof ENGINE_BIN_ENV | "installed";
|
|
6
|
+
} | {
|
|
7
|
+
binary: null;
|
|
8
|
+
error: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Which engine executable `summer run` launches (and probes with --help):
|
|
12
|
+
* `--bin <path>`, else SUMMER_BIN, else the installed engine
|
|
13
|
+
* (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
|
|
14
|
+
* An explicit override is never silently swapped for the installed engine:
|
|
15
|
+
* a missing path or a bare `.app` bundle is an error, because the caller
|
|
16
|
+
* asked for THAT build (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 5).
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveRunBinary(binFlag: string | undefined, env?: NodeJS.ProcessEnv): RunBinaryResolution;
|
|
19
|
+
export declare const runCommand: Command;
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { spawn } from "child_process";
|
|
3
|
+
import { existsSync } from "fs";
|
|
4
|
+
import { mkdir, readFile, rm, writeFile } from "fs/promises";
|
|
5
|
+
import { join, resolve } from "path";
|
|
6
|
+
import { getSummerDir } from "../../core/auth.js";
|
|
7
|
+
import { getApiPort, checkEngineHealth } from "../../core/engine.js";
|
|
8
|
+
import { describeEngineExecutableProblem, ENGINE_BIN_ENV, engineBinaryOverride, findEngineBinary, } from "../../core/engine-install.js";
|
|
9
|
+
import { advertisedBackgroundPosture, backgroundLaunchSupport, detectBackgroundLaunchSupport, planLaunch, resolveLaunchPosture, BACKGROUND_LAUNCH_FLAG, BACKGROUND_LAUNCH_MIN_ENGINE_VERSION, } from "../../core/launch-posture.js";
|
|
10
|
+
import { sleep } from "../../core/util/sleep.js";
|
|
11
|
+
const LAUNCH_LOCK_STALE_MS = 60_000;
|
|
12
|
+
const LAUNCH_LOCK_WAIT_MS = 15_000;
|
|
13
|
+
function isProcessAlive(pid) {
|
|
14
|
+
if (!Number.isInteger(pid) || pid <= 0)
|
|
15
|
+
return false;
|
|
16
|
+
try {
|
|
17
|
+
process.kill(pid, 0);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const code = error.code;
|
|
22
|
+
return code === "EPERM";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async function removeStaleLaunchLock(lockDir) {
|
|
26
|
+
const ownerPath = join(lockDir, "owner.json");
|
|
27
|
+
try {
|
|
28
|
+
const raw = await readFile(ownerPath, "utf-8");
|
|
29
|
+
const owner = JSON.parse(raw);
|
|
30
|
+
const pid = typeof owner.pid === "number" ? owner.pid : 0;
|
|
31
|
+
const createdAt = typeof owner.createdAt === "number" ? owner.createdAt : 0;
|
|
32
|
+
const staleByTime = Date.now() - createdAt > LAUNCH_LOCK_STALE_MS;
|
|
33
|
+
const staleByPid = !isProcessAlive(pid);
|
|
34
|
+
if (!staleByTime && !staleByPid) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// Broken owner metadata should not permanently block launches.
|
|
40
|
+
}
|
|
41
|
+
await rm(lockDir, { recursive: true, force: true });
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
async function withLaunchLock(fn) {
|
|
45
|
+
const summerDir = getSummerDir();
|
|
46
|
+
await mkdir(summerDir, { recursive: true, mode: 0o700 });
|
|
47
|
+
const lockDir = join(summerDir, "launch.lock");
|
|
48
|
+
const ownerPath = join(lockDir, "owner.json");
|
|
49
|
+
const startedAt = Date.now();
|
|
50
|
+
while (true) {
|
|
51
|
+
try {
|
|
52
|
+
await mkdir(lockDir, { mode: 0o700 });
|
|
53
|
+
try {
|
|
54
|
+
await writeFile(ownerPath, JSON.stringify({ pid: process.pid, createdAt: Date.now() }, null, 2), { encoding: "utf-8", mode: 0o600 });
|
|
55
|
+
return await fn();
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
await rm(lockDir, { recursive: true, force: true });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
const code = error.code;
|
|
63
|
+
if (code !== "EEXIST") {
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
if (await removeStaleLaunchLock(lockDir)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (Date.now() - startedAt > LAUNCH_LOCK_WAIT_MS) {
|
|
70
|
+
throw new Error("Another `summer run` launch is still in progress. Try again in a few seconds.");
|
|
71
|
+
}
|
|
72
|
+
await sleep(100);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Which engine executable `summer run` launches (and probes with --help):
|
|
78
|
+
* `--bin <path>`, else SUMMER_BIN, else the installed engine
|
|
79
|
+
* (findEngineBinary, which also honours the older SUMMER_ENGINE_BINARY).
|
|
80
|
+
* An explicit override is never silently swapped for the installed engine:
|
|
81
|
+
* a missing path or a bare `.app` bundle is an error, because the caller
|
|
82
|
+
* asked for THAT build (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 5).
|
|
83
|
+
*/
|
|
84
|
+
export function resolveRunBinary(binFlag, env = process.env) {
|
|
85
|
+
const fromEnv = engineBinaryOverride(env);
|
|
86
|
+
const explicit = binFlag?.trim()
|
|
87
|
+
? { source: "--bin", path: binFlag.trim() }
|
|
88
|
+
: fromEnv?.name === ENGINE_BIN_ENV
|
|
89
|
+
? { source: ENGINE_BIN_ENV, path: fromEnv.path }
|
|
90
|
+
: null;
|
|
91
|
+
if (explicit) {
|
|
92
|
+
const path = resolve(explicit.path);
|
|
93
|
+
const problem = describeEngineExecutableProblem(path, explicit.source);
|
|
94
|
+
return problem ? { binary: null, error: problem } : { binary: path, source: explicit.source };
|
|
95
|
+
}
|
|
96
|
+
const installed = findEngineBinary();
|
|
97
|
+
if (!installed) {
|
|
98
|
+
return {
|
|
99
|
+
binary: null,
|
|
100
|
+
error: "Summer Engine not found. Install it first:\n" +
|
|
101
|
+
" summer install\n" +
|
|
102
|
+
" or download from https://summerengine.com/download\n" +
|
|
103
|
+
`To launch a build that is not installed, pass --bin <executable> or set ${ENGINE_BIN_ENV}.`,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return { binary: installed, source: "installed" };
|
|
107
|
+
}
|
|
108
|
+
export const runCommand = new Command("run")
|
|
109
|
+
.description("Launch Summer Engine with a project. Without a path it launches a bare " +
|
|
110
|
+
"detached editor (project manager), which requires --no-project.")
|
|
111
|
+
.argument("[path]", "Path to a project directory (must contain project.godot)")
|
|
112
|
+
.option("--no-project", "Launch a bare detached editor (project manager) without opening a project")
|
|
113
|
+
.option("--background", "Launch without taking focus: the window exists but stays behind until clicked " +
|
|
114
|
+
"(default when stdout is not a terminal, i.e. an agent is driving)")
|
|
115
|
+
.option("--focus", "Launch and bring the editor to the front (default when a human runs this in a terminal)")
|
|
116
|
+
.option("--bin <path>", `Engine executable to launch instead of the installed one (env: ${ENGINE_BIN_ENV}). ` +
|
|
117
|
+
"On macOS this is the executable inside the bundle, e.g. /path/Summer.app/Contents/MacOS/Summer, never the .app itself")
|
|
118
|
+
.action(async (projectPath, opts) => {
|
|
119
|
+
// Posture is decided up front so a bad flag combination fails before any
|
|
120
|
+
// filesystem or engine work. Why the TTY heuristic: a human at a terminal
|
|
121
|
+
// typed `summer run` to SEE the editor; an agent (no TTY on stdout) is
|
|
122
|
+
// launching it as a means to an end while the user works on something else
|
|
123
|
+
// and must not be interrupted. See src/core/launch-posture.ts.
|
|
124
|
+
let posture;
|
|
125
|
+
try {
|
|
126
|
+
posture = resolveLaunchPosture({ focus: opts.focus, background: opts.background }, { stdoutIsTTY: process.stdout.isTTY === true });
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
console.error(error.message);
|
|
130
|
+
process.exitCode = 1;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const fullProjectPath = projectPath ? resolve(projectPath) : null;
|
|
134
|
+
if (!fullProjectPath && opts.project !== false) {
|
|
135
|
+
console.error("summer run needs a project path (a directory containing project.godot).\n" +
|
|
136
|
+
"To launch a bare editor without a project, pass --no-project.");
|
|
137
|
+
process.exitCode = 1;
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (fullProjectPath) {
|
|
141
|
+
if (!existsSync(fullProjectPath)) {
|
|
142
|
+
console.error(`Directory not found: ${fullProjectPath}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
if (!existsSync(join(fullProjectPath, "project.godot"))) {
|
|
146
|
+
console.error(`No project.godot found in ${fullProjectPath}\n` +
|
|
147
|
+
"This doesn't look like a Summer Engine project.");
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
await withLaunchLock(async () => {
|
|
152
|
+
const port = await getApiPort();
|
|
153
|
+
const health = await checkEngineHealth(port);
|
|
154
|
+
if (health) {
|
|
155
|
+
const runningProjectPath = health.project_path
|
|
156
|
+
? resolve(health.project_path)
|
|
157
|
+
: null;
|
|
158
|
+
if (!fullProjectPath || runningProjectPath === fullProjectPath) {
|
|
159
|
+
console.log(`Summer Engine is already running (v${health.version}) on port ${port}`);
|
|
160
|
+
if (health.project_name) {
|
|
161
|
+
console.log(` Project: ${health.project_name}`);
|
|
162
|
+
}
|
|
163
|
+
if (health.project_path) {
|
|
164
|
+
console.log(` Path: ${health.project_path}`);
|
|
165
|
+
}
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
console.log(`Summer Engine is already running (v${health.version}) on port ${port}`);
|
|
169
|
+
console.log(` Current project: ${health.project_path ?? health.project_name ?? "unknown"}`);
|
|
170
|
+
console.error(`Refusing to launch a second editor for: ${fullProjectPath}\n` +
|
|
171
|
+
"Close or switch the current Summer Engine project first, then run this command again.");
|
|
172
|
+
process.exitCode = 1;
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const resolved = resolveRunBinary(opts.bin);
|
|
176
|
+
if (resolved.binary === null) {
|
|
177
|
+
console.error(resolved.error);
|
|
178
|
+
process.exitCode = 1;
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
const binary = resolved.binary;
|
|
182
|
+
if (resolved.source !== "installed") {
|
|
183
|
+
console.log(`Using engine from ${resolved.source}: ${binary}`);
|
|
184
|
+
}
|
|
185
|
+
// The engine is not running yet, so /api/health cannot tell us whether
|
|
186
|
+
// it honours --summer-background. Ask THAT binary itself (`--help`, which
|
|
187
|
+
// exits headless before any window exists; cached per install) with the
|
|
188
|
+
// installed version as pre-check and fallback; pass the flag only when
|
|
189
|
+
// the engine is known to support it. Focus launches have nothing to decide.
|
|
190
|
+
const support = posture === "background" ? await detectBackgroundLaunchSupport(binary) : backgroundLaunchSupport(null);
|
|
191
|
+
const plan = planLaunch(posture, support);
|
|
192
|
+
const args = ["--editor", ...plan.extraArgs];
|
|
193
|
+
if (fullProjectPath) {
|
|
194
|
+
args.unshift("--path", fullProjectPath);
|
|
195
|
+
}
|
|
196
|
+
if (plan.note)
|
|
197
|
+
console.log(plan.note);
|
|
198
|
+
console.log(plan.background
|
|
199
|
+
? "Launching Summer Engine in the background (the window will not take focus until you click it)..."
|
|
200
|
+
: "Launching Summer Engine...");
|
|
201
|
+
// Direct executable, never `open -a`: LaunchServices activates whatever
|
|
202
|
+
// it opens and would defeat --summer-background regardless of flags.
|
|
203
|
+
const child = spawn(binary, args, { detached: true, stdio: "ignore" });
|
|
204
|
+
// A stale or non-executable binary surfaces as an async "error" event
|
|
205
|
+
// (ENOENT/EACCES). Without a listener Node raises it as an uncaught
|
|
206
|
+
// exception with a raw stack; catch it and report the path instead.
|
|
207
|
+
const spawnState = { error: null };
|
|
208
|
+
child.on("error", (error) => {
|
|
209
|
+
spawnState.error = error;
|
|
210
|
+
});
|
|
211
|
+
child.unref();
|
|
212
|
+
// Wait for engine to start responding
|
|
213
|
+
const startTime = Date.now();
|
|
214
|
+
const timeout = 20000;
|
|
215
|
+
while (Date.now() - startTime < timeout) {
|
|
216
|
+
await sleep(500);
|
|
217
|
+
if (spawnState.error) {
|
|
218
|
+
reportSpawnFailure(spawnState.error, binary);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
const newPort = await getApiPort();
|
|
222
|
+
const h = await checkEngineHealth(newPort);
|
|
223
|
+
if (h) {
|
|
224
|
+
console.log(`Summer Engine running (v${h.version}) on port ${newPort}`);
|
|
225
|
+
if (h.project_name) {
|
|
226
|
+
console.log(` Project: ${h.project_name}`);
|
|
227
|
+
}
|
|
228
|
+
// Background was wanted but the flag was withheld, and the running
|
|
229
|
+
// engine now says (capabilities.launchPostures, else its version)
|
|
230
|
+
// that it would have honoured it: say so, so the next launch can be
|
|
231
|
+
// fixed rather than silently repeating a focus launch.
|
|
232
|
+
if (posture === "background" && !plan.background) {
|
|
233
|
+
const advert = advertisedBackgroundPosture(h.capabilities);
|
|
234
|
+
const wouldHonour = advert ?? backgroundLaunchSupport(h.version).supported;
|
|
235
|
+
if (wouldHonour) {
|
|
236
|
+
console.log(` Note: this engine (v${h.version}) ${advert ? "advertises" : "should support"} background launches (${BACKGROUND_LAUNCH_FLAG}, ${BACKGROUND_LAUNCH_MIN_ENGINE_VERSION}+), but that could not be confirmed before launch on this platform.`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (spawnState.error) {
|
|
243
|
+
reportSpawnFailure(spawnState.error, binary);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
console.log("Summer Engine launched but API not responding yet.\n" +
|
|
247
|
+
"It may still be loading. Run 'summer status' to check.");
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
function reportSpawnFailure(error, binary) {
|
|
251
|
+
const code = error.code ?? error.message;
|
|
252
|
+
console.error(`Summer Engine binary failed to start: ${code} (${binary})\n` +
|
|
253
|
+
"Re-run 'summer install' to repair the installation, or check the binary path.");
|
|
254
|
+
process.exitCode = 1;
|
|
255
|
+
}
|