summer-engine 2.8.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +134 -41
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +159 -391
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/{commands → cli/commands}/setup.js +43 -89
- package/dist/{commands → cli/commands}/skills.js +85 -222
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +47 -0
- package/dist/core/skills-registry.js +83 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/{lib → installer}/agent-config.d.ts +20 -1
- package/dist/{lib → installer}/agent-config.js +148 -23
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +146 -0
- package/dist/installer/skill-locations.d.ts +45 -0
- package/dist/installer/skill-locations.js +170 -0
- package/dist/installer/version-check.d.ts +174 -0
- package/dist/{lib → installer}/version-check.js +173 -42
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +70 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/cline/README.md +13 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +16 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/opencode/README.md +15 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +13 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +13 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +1 -1
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +23 -23
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +9 -1
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +1 -1
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +1 -1
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +22 -16
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-registry.json +851 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/status.js +0 -46
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { execSync } from "child_process";
|
|
3
|
+
import { createInterface } from "node:readline/promises";
|
|
4
|
+
import { createHash } from "crypto";
|
|
5
|
+
import { chmodSync, createWriteStream, existsSync, mkdirSync, readdirSync, renameSync, rmSync, symlinkSync, } from "fs";
|
|
6
|
+
import { pipeline } from "stream/promises";
|
|
7
|
+
import { Readable } from "stream";
|
|
8
|
+
import { tmpdir, platform } from "os";
|
|
9
|
+
import { join, resolve } from "path";
|
|
10
|
+
import { ENGINE_BINARY_ENV, LINUX_ENGINE_BINARY_NAME, findExtractedEngineBinary, linuxArchiveKind, linuxEngineInstallDir, pickLinuxReleaseAsset, resolveLinuxInstallSource, } from "../../core/engine-install.js";
|
|
11
|
+
const RELEASES_URL = "https://www.summerengine.com/api/desktop/releases";
|
|
12
|
+
/** Guard a download URL from the releases endpoint. A missing/empty URL (an
|
|
13
|
+
* outdated or misconfigured endpoint) otherwise becomes a cryptic
|
|
14
|
+
* fetch(undefined) failure — surface it clearly with a manual fallback. */
|
|
15
|
+
export function requireDownloadUrl(value, label) {
|
|
16
|
+
if (!value || value.trim().length === 0) {
|
|
17
|
+
throw new Error(`Release info is missing the ${label} download URL — the releases endpoint may be ` +
|
|
18
|
+
`outdated. Download manually from https://summerengine.com/download`);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
/** Verify a downloaded file's sha256 against the expected hash from the releases
|
|
23
|
+
* endpoint. Skipped when no expected hash is published. Catches a truncated or
|
|
24
|
+
* corrupted download (a ~1GB install over a flaky network) before it becomes a
|
|
25
|
+
* confusing DMG-mount / installer failure downstream. */
|
|
26
|
+
export function verifyChecksum(actual, expected, label) {
|
|
27
|
+
if (!expected || expected.trim().length === 0)
|
|
28
|
+
return; // nothing published to verify against
|
|
29
|
+
if (actual.toLowerCase() !== expected.toLowerCase()) {
|
|
30
|
+
throw new Error(`${label} checksum mismatch — the download was corrupted or incomplete ` +
|
|
31
|
+
`(expected ${expected.slice(0, 12)}…, got ${actual.slice(0, 12)}…). Re-run \`summer install\`.`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// The bundle-version readers live in core (src/core/launch-posture.ts) because
|
|
35
|
+
// `summer run` needs the installed version BEFORE the engine is up to decide
|
|
36
|
+
// whether it may pass --summer-background; re-exported here for install.test.ts.
|
|
37
|
+
import { parseMacBundleVersion, readMacBundleVersion } from "../../core/launch-posture.js";
|
|
38
|
+
export { parseMacBundleVersion, readMacBundleVersion };
|
|
39
|
+
export function isSameVersion(installed, latest) {
|
|
40
|
+
if (!installed)
|
|
41
|
+
return false;
|
|
42
|
+
const norm = (value) => value.trim().replace(/^v/i, "");
|
|
43
|
+
return norm(installed) === norm(latest);
|
|
44
|
+
}
|
|
45
|
+
/** Decide what `summer install` may do about an existing /Applications/Summer.app.
|
|
46
|
+
* Replacing an installed engine is destructive, so it needs --yes or a TTY
|
|
47
|
+
* prompt; an equal version is a no-op success. */
|
|
48
|
+
export function planMacInstall(input) {
|
|
49
|
+
if (!input.exists)
|
|
50
|
+
return { action: "install" };
|
|
51
|
+
if (isSameVersion(input.installedVersion, input.latestVersion)) {
|
|
52
|
+
return { action: "up-to-date", version: input.latestVersion };
|
|
53
|
+
}
|
|
54
|
+
if (input.yes)
|
|
55
|
+
return { action: "install" };
|
|
56
|
+
if (input.isTTY)
|
|
57
|
+
return { action: "needs-confirmation", installed: input.installedVersion };
|
|
58
|
+
return {
|
|
59
|
+
action: "refuse",
|
|
60
|
+
reason: `Summer Engine ${input.installedVersion ?? "(unknown version)"} is already installed; ` +
|
|
61
|
+
`updating to v${input.latestVersion} replaces it. Re-run with --yes to confirm.`,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/** Replace destApp with the bundle on the mounted DMG WITHOUT a window where
|
|
65
|
+
* no engine exists: copy to <destApp>.new first, and only after that
|
|
66
|
+
* succeeds remove the old bundle and rename the staged copy into place. A
|
|
67
|
+
* failed copy leaves the existing install untouched. */
|
|
68
|
+
export function replaceMacApp(mountPoint, destApp, exec) {
|
|
69
|
+
const staged = `${destApp}.new`;
|
|
70
|
+
exec(`rm -rf "${staged}"`);
|
|
71
|
+
try {
|
|
72
|
+
exec(`cp -R "${mountPoint}/Summer.app" "${staged}"`);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
try {
|
|
76
|
+
exec(`rm -rf "${staged}"`);
|
|
77
|
+
}
|
|
78
|
+
catch { /* best effort */ }
|
|
79
|
+
throw err;
|
|
80
|
+
}
|
|
81
|
+
exec(`rm -rf "${destApp}"`);
|
|
82
|
+
exec(`mv "${staged}" "${destApp}"`);
|
|
83
|
+
}
|
|
84
|
+
/** Remove partial downloads / staged bundles when the user interrupts. */
|
|
85
|
+
function cleanupOnSignal(paths) {
|
|
86
|
+
const handler = () => {
|
|
87
|
+
for (const path of paths) {
|
|
88
|
+
try {
|
|
89
|
+
rmSync(path, { recursive: true, force: true });
|
|
90
|
+
}
|
|
91
|
+
catch { /* best effort */ }
|
|
92
|
+
}
|
|
93
|
+
process.exit(130);
|
|
94
|
+
};
|
|
95
|
+
process.on("SIGINT", handler);
|
|
96
|
+
process.on("SIGTERM", handler);
|
|
97
|
+
return () => {
|
|
98
|
+
process.off("SIGINT", handler);
|
|
99
|
+
process.off("SIGTERM", handler);
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
async function confirm(question) {
|
|
103
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
104
|
+
try {
|
|
105
|
+
const answer = (await rl.question(`${question} [y/N] `)).trim().toLowerCase();
|
|
106
|
+
return answer === "y" || answer === "yes";
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
rl.close();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Velopack Setup.exe install args. Velopack is NOT NSIS: silent install is
|
|
113
|
+
* `--silent` and a custom directory is `--installto <dir>` (per Velopack's
|
|
114
|
+
* setup.exe CLI). The old NSIS flags (/S, /D=) are rejected by the Velopack
|
|
115
|
+
* installer with "unexpected argument '/S' found" — this is the wizard bug. */
|
|
116
|
+
export function windowsInstallerArgs(customPath) {
|
|
117
|
+
return customPath ? `--silent --installto "${customPath}"` : "--silent";
|
|
118
|
+
}
|
|
119
|
+
export const installCommand = new Command("install")
|
|
120
|
+
.description("Download and install Summer Engine")
|
|
121
|
+
.option("--path <dir>", "Custom install directory")
|
|
122
|
+
.option("--yes", "Replace an already-installed engine without prompting")
|
|
123
|
+
.action(async (opts) => {
|
|
124
|
+
const os = platform();
|
|
125
|
+
if (os === "linux") {
|
|
126
|
+
await installLinux(opts.path);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
if (os !== "darwin" && os !== "win32") {
|
|
130
|
+
console.error(`Unsupported platform: ${os}.\n` +
|
|
131
|
+
"Summer Engine installs on macOS, Windows, and Linux (x86_64).\n" +
|
|
132
|
+
"Download from: https://summerengine.com/download");
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
console.log("Fetching latest release info...");
|
|
136
|
+
let releases;
|
|
137
|
+
try {
|
|
138
|
+
const res = await fetch(RELEASES_URL, { signal: AbortSignal.timeout(10000) });
|
|
139
|
+
if (!res.ok)
|
|
140
|
+
throw new Error(`HTTP ${res.status}`);
|
|
141
|
+
releases = (await res.json());
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
console.error("Could not fetch release info. Download manually from:\n" +
|
|
145
|
+
" https://summerengine.com/download");
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
if (os === "darwin") {
|
|
149
|
+
await installMac(releases, opts.path, Boolean(opts.yes));
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
await installWindows(releases, opts.path);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
async function installMac(releases, customPath, yes = false) {
|
|
156
|
+
const info = releases.latest.macos;
|
|
157
|
+
if (!info) {
|
|
158
|
+
console.error("No macOS release found.");
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
const dmgUrl = requireDownloadUrl(info.dmg_url, "macOS DMG");
|
|
162
|
+
console.log(`Latest version: ${info.version}`);
|
|
163
|
+
const destApp = customPath || "/Applications/Summer.app";
|
|
164
|
+
const exists = existsSync(destApp);
|
|
165
|
+
const installedVersion = exists ? readMacBundleVersion(destApp) : null;
|
|
166
|
+
const plan = planMacInstall({
|
|
167
|
+
exists,
|
|
168
|
+
installedVersion,
|
|
169
|
+
latestVersion: info.version,
|
|
170
|
+
yes,
|
|
171
|
+
isTTY: Boolean(process.stdin.isTTY),
|
|
172
|
+
});
|
|
173
|
+
if (plan.action === "up-to-date") {
|
|
174
|
+
console.log(`Summer Engine v${plan.version} is already installed at ${destApp} (up to date).`);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (plan.action === "refuse") {
|
|
178
|
+
console.error(plan.reason);
|
|
179
|
+
process.exitCode = 1;
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
if (plan.action === "needs-confirmation") {
|
|
183
|
+
console.log(`Summer Engine ${plan.installed ?? "(unknown version)"} is installed at ${destApp}.`);
|
|
184
|
+
if (!(await confirm(`Replace it with v${info.version}?`))) {
|
|
185
|
+
console.log("Cancelled. Nothing was changed.");
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
const dmgPath = join(tmpdir(), `Summer-v${info.version}.dmg`);
|
|
190
|
+
const stagedApp = `${destApp}.new`;
|
|
191
|
+
const releaseSignals = cleanupOnSignal([dmgPath, stagedApp]);
|
|
192
|
+
console.log(`Downloading Summer Engine v${info.version} (~1 GB, includes bundled Git + runtime)...`);
|
|
193
|
+
try {
|
|
194
|
+
const { sha256 } = await downloadFile(dmgUrl, dmgPath);
|
|
195
|
+
verifyChecksum(sha256, info.dmg_sha256, "DMG");
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
releaseSignals();
|
|
199
|
+
try {
|
|
200
|
+
execSync(`rm -f "${dmgPath}"`, { stdio: "ignore" });
|
|
201
|
+
}
|
|
202
|
+
catch { /* best effort */ }
|
|
203
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
204
|
+
process.exit(1);
|
|
205
|
+
}
|
|
206
|
+
console.log("Mounting DMG...");
|
|
207
|
+
const mountOutput = execSync(`hdiutil attach "${dmgPath}" -nobrowse -noverify -noautoopen`, {
|
|
208
|
+
encoding: "utf-8",
|
|
209
|
+
});
|
|
210
|
+
const mountPoint = mountOutput
|
|
211
|
+
.split("\n")
|
|
212
|
+
.filter((line) => line.includes("/Volumes/"))
|
|
213
|
+
.map((line) => line.trim().split("\t").pop()?.trim())
|
|
214
|
+
.find(Boolean);
|
|
215
|
+
if (!mountPoint) {
|
|
216
|
+
console.error("Failed to find mount point. Install manually from the DMG.");
|
|
217
|
+
process.exit(1);
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
console.log("Installing to " + destApp + "...");
|
|
221
|
+
replaceMacApp(mountPoint, destApp, (command) => execSync(command, { stdio: "ignore" }));
|
|
222
|
+
console.log("Done!");
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
console.error(`Install failed: ${err instanceof Error ? err.message : String(err)}\n` +
|
|
226
|
+
(exists ? `The existing ${destApp} was left in place.` : "Nothing was installed."));
|
|
227
|
+
process.exitCode = 1;
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
execSync(`hdiutil detach "${mountPoint}" -quiet`, { stdio: "ignore" });
|
|
232
|
+
try {
|
|
233
|
+
execSync(`rm "${dmgPath}"`, { stdio: "ignore" });
|
|
234
|
+
}
|
|
235
|
+
catch { }
|
|
236
|
+
releaseSignals();
|
|
237
|
+
}
|
|
238
|
+
console.log(`\nSummer Engine v${info.version} installed to ${destApp}`);
|
|
239
|
+
console.log("\nNext steps:");
|
|
240
|
+
console.log(" summer login # Sign in to your account");
|
|
241
|
+
console.log(" summer run # Launch the engine");
|
|
242
|
+
}
|
|
243
|
+
async function installWindows(releases, customPath) {
|
|
244
|
+
const info = releases.latest.windows;
|
|
245
|
+
if (!info) {
|
|
246
|
+
console.error("No Windows release found.");
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
const exeUrl = requireDownloadUrl(info.url, "Windows installer");
|
|
250
|
+
console.log(`Latest version: ${info.version}`);
|
|
251
|
+
const exePath = join(tmpdir(), `Summer-v${info.version}.exe`);
|
|
252
|
+
console.log(`Downloading Summer Engine v${info.version} (~1 GB, includes bundled Git + runtime)...`);
|
|
253
|
+
try {
|
|
254
|
+
const { sha256 } = await downloadFile(exeUrl, exePath);
|
|
255
|
+
verifyChecksum(sha256, info.sha256, "installer");
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
try {
|
|
259
|
+
execSync(`del "${exePath}"`, { stdio: "ignore" });
|
|
260
|
+
}
|
|
261
|
+
catch { /* best effort */ }
|
|
262
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
console.log("Running installer...");
|
|
266
|
+
try {
|
|
267
|
+
execSync(`"${exePath}" ${windowsInstallerArgs(customPath)}`, {
|
|
268
|
+
stdio: "inherit",
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
console.error("Installer failed. Try running it manually:\n " + exePath);
|
|
273
|
+
process.exit(1);
|
|
274
|
+
}
|
|
275
|
+
try {
|
|
276
|
+
execSync(`del "${exePath}"`, { stdio: "ignore" });
|
|
277
|
+
}
|
|
278
|
+
catch { }
|
|
279
|
+
console.log(`\nSummer Engine v${info.version} installed!`);
|
|
280
|
+
console.log("\nNext steps:");
|
|
281
|
+
console.log(" summer login # Sign in to your account");
|
|
282
|
+
console.log(" summer run # Launch the engine");
|
|
283
|
+
}
|
|
284
|
+
// ------------------------------------------------------------------- Linux
|
|
285
|
+
// Source resolution, release picking, and archive detection live in
|
|
286
|
+
// core/engine-install.ts; this section is the process I/O around them.
|
|
287
|
+
function walkFiles(dir) {
|
|
288
|
+
const out = [];
|
|
289
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
290
|
+
const path = join(dir, entry.name);
|
|
291
|
+
if (entry.isDirectory())
|
|
292
|
+
out.push(...walkFiles(path));
|
|
293
|
+
else if (entry.isFile())
|
|
294
|
+
out.push(path);
|
|
295
|
+
}
|
|
296
|
+
return out;
|
|
297
|
+
}
|
|
298
|
+
/** Register an existing binary the same way a download install does: the
|
|
299
|
+
* canonical ~/.summer/engine/summer-linux-x86_64 path points at it, so
|
|
300
|
+
* `summer run`/`summer doctor` find it even when the env var is not set. */
|
|
301
|
+
function registerExistingLinuxBinary(sourcePath, destDir, destBinary) {
|
|
302
|
+
const absolute = resolve(sourcePath);
|
|
303
|
+
if (!existsSync(absolute)) {
|
|
304
|
+
console.error(`${ENGINE_BINARY_ENV} points at ${absolute}, but nothing exists there.`);
|
|
305
|
+
process.exit(1);
|
|
306
|
+
}
|
|
307
|
+
try {
|
|
308
|
+
chmodSync(absolute, 0o755);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
// Best effort — a read-only mount still works if already executable.
|
|
312
|
+
}
|
|
313
|
+
mkdirSync(destDir, { recursive: true });
|
|
314
|
+
if (absolute !== destBinary) {
|
|
315
|
+
rmSync(destBinary, { force: true });
|
|
316
|
+
symlinkSync(absolute, destBinary);
|
|
317
|
+
}
|
|
318
|
+
console.log(`Registered existing engine binary: ${absolute}`);
|
|
319
|
+
console.log(` -> ${destBinary}`);
|
|
320
|
+
}
|
|
321
|
+
async function fetchLinuxReleaseAsset(apiUrl) {
|
|
322
|
+
const res = await fetch(apiUrl, {
|
|
323
|
+
headers: { Accept: "application/vnd.github+json" },
|
|
324
|
+
signal: AbortSignal.timeout(15000),
|
|
325
|
+
});
|
|
326
|
+
if (!res.ok)
|
|
327
|
+
throw new Error(`HTTP ${res.status}`);
|
|
328
|
+
return pickLinuxReleaseAsset(await res.json());
|
|
329
|
+
}
|
|
330
|
+
async function installLinux(customPath) {
|
|
331
|
+
if (process.arch !== "x64") {
|
|
332
|
+
console.error(`Linux ${process.arch} has no published Summer Engine artifact yet (x86_64 only).\n` +
|
|
333
|
+
`Build from source, then set ${ENGINE_BINARY_ENV} to the binary and re-run \`summer install\`.`);
|
|
334
|
+
process.exit(1);
|
|
335
|
+
}
|
|
336
|
+
const destDir = customPath ? resolve(customPath) : linuxEngineInstallDir();
|
|
337
|
+
const destBinary = join(destDir, LINUX_ENGINE_BINARY_NAME);
|
|
338
|
+
const source = resolveLinuxInstallSource();
|
|
339
|
+
if (source.kind === "binary") {
|
|
340
|
+
registerExistingLinuxBinary(source.path, destDir, destBinary);
|
|
341
|
+
printLinuxNextSteps(destBinary);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
let url = source.kind === "url" ? source.url : "";
|
|
345
|
+
let sha256Url;
|
|
346
|
+
let versionLabel = "custom";
|
|
347
|
+
if (source.kind === "release") {
|
|
348
|
+
console.log("Fetching latest Linux release info...");
|
|
349
|
+
try {
|
|
350
|
+
const asset = await fetchLinuxReleaseAsset(source.apiUrl);
|
|
351
|
+
url = asset.url;
|
|
352
|
+
sha256Url = asset.sha256Url;
|
|
353
|
+
versionLabel = asset.version;
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
console.error(`Could not resolve a Linux release artifact: ${err instanceof Error ? err.message : String(err)}`);
|
|
357
|
+
process.exit(1);
|
|
358
|
+
}
|
|
359
|
+
console.log(`Latest Linux release: ${versionLabel}`);
|
|
360
|
+
}
|
|
361
|
+
const kind = linuxArchiveKind(url);
|
|
362
|
+
const downloadPath = join(tmpdir(), `summer-engine-${Date.now()}.${kind === "binary" ? "bin" : kind === "zip" ? "zip" : "tar.gz"}`);
|
|
363
|
+
console.log(`Downloading ${url} ...`);
|
|
364
|
+
try {
|
|
365
|
+
const { sha256 } = await downloadFile(url, downloadPath);
|
|
366
|
+
if (sha256Url) {
|
|
367
|
+
const shaRes = await fetch(sha256Url, { signal: AbortSignal.timeout(15000) });
|
|
368
|
+
if (shaRes.ok) {
|
|
369
|
+
const expected = (await shaRes.text()).trim().split(/\s+/, 1)[0];
|
|
370
|
+
verifyChecksum(sha256, expected, "Linux artifact");
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
mkdirSync(destDir, { recursive: true });
|
|
374
|
+
let extractedBinary = downloadPath;
|
|
375
|
+
let extractDir = null;
|
|
376
|
+
if (kind !== "binary") {
|
|
377
|
+
extractDir = join(tmpdir(), `summer-engine-extract-${Date.now()}`);
|
|
378
|
+
mkdirSync(extractDir, { recursive: true });
|
|
379
|
+
if (kind === "tar.gz") {
|
|
380
|
+
execSync(`tar -xzf "${downloadPath}" -C "${extractDir}"`, { stdio: "ignore" });
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
execSync(`unzip -oq "${downloadPath}" -d "${extractDir}"`, { stdio: "ignore" });
|
|
384
|
+
}
|
|
385
|
+
const found = findExtractedEngineBinary(walkFiles(extractDir));
|
|
386
|
+
if (!found) {
|
|
387
|
+
throw new Error(`The downloaded archive contains no engine binary (expected ${LINUX_ENGINE_BINARY_NAME}).`);
|
|
388
|
+
}
|
|
389
|
+
extractedBinary = found;
|
|
390
|
+
}
|
|
391
|
+
// Replace, never edit in place: an engine reading its own binary mid-write
|
|
392
|
+
// is worse than a moment with no file. rename first (same tmpfs), copy as
|
|
393
|
+
// the cross-device fallback.
|
|
394
|
+
rmSync(destBinary, { force: true });
|
|
395
|
+
try {
|
|
396
|
+
renameSync(extractedBinary, destBinary);
|
|
397
|
+
}
|
|
398
|
+
catch {
|
|
399
|
+
execSync(`cp "${extractedBinary}" "${destBinary}"`, { stdio: "ignore" });
|
|
400
|
+
}
|
|
401
|
+
chmodSync(destBinary, 0o755);
|
|
402
|
+
if (extractDir)
|
|
403
|
+
rmSync(extractDir, { recursive: true, force: true });
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
407
|
+
process.exit(1);
|
|
408
|
+
}
|
|
409
|
+
finally {
|
|
410
|
+
rmSync(downloadPath, { force: true });
|
|
411
|
+
}
|
|
412
|
+
console.log(`\nSummer Engine (${versionLabel}) installed to ${destBinary}`);
|
|
413
|
+
printLinuxNextSteps(destBinary);
|
|
414
|
+
}
|
|
415
|
+
function printLinuxNextSteps(binary) {
|
|
416
|
+
console.log("\nNext steps:");
|
|
417
|
+
console.log(" summer doctor # Verify the setup");
|
|
418
|
+
console.log(` ${binary} --headless --editor --path <project> # Headless engine`);
|
|
419
|
+
console.log(" summer login # Optional: only gateway features (asset search/generation) need it");
|
|
420
|
+
}
|
|
421
|
+
export async function downloadFile(url, dest) {
|
|
422
|
+
const res = await fetch(url);
|
|
423
|
+
if (!res.ok || !res.body) {
|
|
424
|
+
throw new Error(`Download failed: HTTP ${res.status}`);
|
|
425
|
+
}
|
|
426
|
+
const dir = join(dest, "..");
|
|
427
|
+
if (!existsSync(dir))
|
|
428
|
+
mkdirSync(dir, { recursive: true });
|
|
429
|
+
const fileStream = createWriteStream(dest);
|
|
430
|
+
const readable = Readable.fromWeb(res.body);
|
|
431
|
+
// Hash while streaming (the 'data' listener and the pipe both see every chunk
|
|
432
|
+
// in flowing mode), so we get integrity for free without a second read pass.
|
|
433
|
+
const hash = createHash("sha256");
|
|
434
|
+
let downloaded = 0;
|
|
435
|
+
const total = parseInt(res.headers.get("content-length") || "0", 10);
|
|
436
|
+
readable.on("data", (chunk) => {
|
|
437
|
+
hash.update(chunk);
|
|
438
|
+
downloaded += chunk.length;
|
|
439
|
+
if (total > 0) {
|
|
440
|
+
const pct = Math.round((downloaded / total) * 100);
|
|
441
|
+
process.stdout.write(`\r ${pct}% (${(downloaded / 1024 / 1024).toFixed(1)}MB)`);
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
await pipeline(readable, fileStream);
|
|
445
|
+
process.stdout.write("\n");
|
|
446
|
+
return { sha256: hash.digest("hex") };
|
|
447
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { readdirSync, existsSync } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { getTemplateRegistry } from "../../core/templates.js";
|
|
5
|
+
export const listCommand = new Command("list")
|
|
6
|
+
.description("List available templates or local projects")
|
|
7
|
+
.argument("<what>", "'templates' or 'projects'")
|
|
8
|
+
.action(async (what) => {
|
|
9
|
+
if (what === "templates") {
|
|
10
|
+
listTemplates();
|
|
11
|
+
}
|
|
12
|
+
else if (what === "projects") {
|
|
13
|
+
listProjects();
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
console.error(`Unknown: '${what}'. Use 'templates' or 'projects'.`);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Registry-only listing (CONTRACT.md §7): every template shown here resolves
|
|
22
|
+
* through its library pin manifest. There is no live GitHub-org listing —
|
|
23
|
+
* anything not in the registry is not installable by `summer create`.
|
|
24
|
+
*/
|
|
25
|
+
function listTemplates() {
|
|
26
|
+
const entries = getTemplateRegistry();
|
|
27
|
+
const builtins = entries.filter((e) => e.builtin);
|
|
28
|
+
const pinned = entries.filter((e) => !e.builtin);
|
|
29
|
+
const pad = Math.max(16, ...entries.map((e) => e.slug.length));
|
|
30
|
+
const line = (t) => {
|
|
31
|
+
const flag = t.status === "stable" ? "" : ` [${t.status}]`;
|
|
32
|
+
return ` ${t.slug.padEnd(pad)} ${t.summary}${flag}`;
|
|
33
|
+
};
|
|
34
|
+
console.log("Built-in templates (generated locally, no download):\n");
|
|
35
|
+
for (const t of builtins)
|
|
36
|
+
console.log(line(t));
|
|
37
|
+
console.log("\nPinned templates (fetched at an exact commit; tree digest verified before use):\n");
|
|
38
|
+
for (const t of pinned) {
|
|
39
|
+
console.log(line(t));
|
|
40
|
+
if (t.systems.length > 0)
|
|
41
|
+
console.log(` ${"".padEnd(pad)} systems: ${t.systems.join(", ")}`);
|
|
42
|
+
if (t.status !== "stable")
|
|
43
|
+
for (const note of t.do_not_use_when)
|
|
44
|
+
console.log(` ${"".padEnd(pad)} note: ${note}`);
|
|
45
|
+
}
|
|
46
|
+
console.log("\nCreate a project: summer create <template> [name]");
|
|
47
|
+
console.log("Example: summer create 3d-third-person-controller my-game");
|
|
48
|
+
console.log("Pinning rules: library/templates/README.md");
|
|
49
|
+
}
|
|
50
|
+
function listProjects() {
|
|
51
|
+
const cwd = process.cwd();
|
|
52
|
+
const entries = readdirSync(cwd, { withFileTypes: true });
|
|
53
|
+
const projects = [];
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
if (entry.isDirectory()) {
|
|
56
|
+
const projectFile = join(cwd, entry.name, "project.godot");
|
|
57
|
+
if (existsSync(projectFile)) {
|
|
58
|
+
projects.push(entry.name);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (projects.length === 0) {
|
|
63
|
+
console.log("No Summer Engine projects found in current directory.");
|
|
64
|
+
console.log("\nCreate one: summer create 3d-basic my-game");
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.log(`Projects in ${cwd}:\n`);
|
|
68
|
+
for (const p of projects) {
|
|
69
|
+
console.log(` ${p}/`);
|
|
70
|
+
}
|
|
71
|
+
console.log(`\nOpen a project: summer run <name>`);
|
|
72
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { randomUUID } from "crypto";
|
|
3
3
|
import open from "open";
|
|
4
|
-
import { getAuthToken, getCreatorToken, saveCreatorToken, saveLoginSession, } from "
|
|
5
|
-
import { getCreatorApiUrl,
|
|
4
|
+
import { getAuthToken, getCreatorToken, saveCreatorToken, saveLoginSession, } from "../../core/auth.js";
|
|
5
|
+
import { getCreatorApiUrl, resolveGatewayUrl } from "../../core/config.js";
|
|
6
6
|
const POLL_INTERVAL_MS = 2000;
|
|
7
7
|
// One generous window on ONE session id. First-time users may need to create an
|
|
8
8
|
// account and confirm an email before they can approve the CLI. The gateway
|
|
@@ -102,6 +102,9 @@ export async function runCreatorLogin(overrides = {}) {
|
|
|
102
102
|
await saveCreatorToken(token);
|
|
103
103
|
deps.log("Creator publishing connected. Your core Summer login token was not changed.");
|
|
104
104
|
}
|
|
105
|
+
/** The gateway answered with a terminal 4xx — retrying the same URL cannot help. */
|
|
106
|
+
class LoginRejectedError extends Error {
|
|
107
|
+
}
|
|
105
108
|
const defaultDependencies = {
|
|
106
109
|
fetch,
|
|
107
110
|
openUrl: open,
|
|
@@ -112,7 +115,7 @@ const defaultDependencies = {
|
|
|
112
115
|
};
|
|
113
116
|
export async function runLogin(overrides = {}) {
|
|
114
117
|
const deps = { ...defaultDependencies, ...overrides };
|
|
115
|
-
const gatewayUrl = await
|
|
118
|
+
const gatewayUrl = await resolveGatewayUrl();
|
|
116
119
|
const sessionId = deps.randomId();
|
|
117
120
|
const loginUrl = `${gatewayUrl}/login?cli_session=${encodeURIComponent(sessionId)}`;
|
|
118
121
|
deps.log("Sign in at: " + loginUrl);
|
|
@@ -134,8 +137,15 @@ export async function runLogin(overrides = {}) {
|
|
|
134
137
|
if (deps.now() - lastHeartbeat >= HEARTBEAT_MS) {
|
|
135
138
|
lastHeartbeat = deps.now();
|
|
136
139
|
deps.log('Still waiting — finish signing in (or creating your account) in the browser, then click "Yes, Sign In". Same link: ' +
|
|
137
|
-
loginUrl
|
|
140
|
+
loginUrl +
|
|
141
|
+
(lastError ? ` (last error: ${lastError})` : ""));
|
|
138
142
|
}
|
|
143
|
+
// Only the network round-trip is retried. A completed session is handled
|
|
144
|
+
// OUTSIDE this try: saveLoginSession rejecting the token (mismatched sub,
|
|
145
|
+
// non-CLI token type, already expired) is terminal — the gateway will
|
|
146
|
+
// return the same payload forever, so polling on would only bury the
|
|
147
|
+
// recovery message under a 15-minute timeout.
|
|
148
|
+
let completed = null;
|
|
139
149
|
try {
|
|
140
150
|
const res = await deps.fetch(pollUrl, {
|
|
141
151
|
signal: AbortSignal.timeout(5000),
|
|
@@ -145,33 +155,39 @@ export async function runLogin(overrides = {}) {
|
|
|
145
155
|
lastError =
|
|
146
156
|
"The login service is unavailable (Redis/auth is not configured).";
|
|
147
157
|
}
|
|
148
|
-
else if (res.status >= 400 && res.status < 500) {
|
|
149
|
-
lastError = `The login request was rejected (${res.status}).`;
|
|
150
|
-
}
|
|
151
158
|
else if (res.status >= 500) {
|
|
152
159
|
lastError = `The login service failed (${res.status}).`;
|
|
153
160
|
}
|
|
161
|
+
else if (res.status === 429 || res.status === 408) {
|
|
162
|
+
lastError = `The login service asked us to slow down (${res.status}).`;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
// 401/403/404 and the other 4xx are terminal: this URL will not
|
|
166
|
+
// start succeeding on its own.
|
|
167
|
+
throw new LoginRejectedError(`The login request was rejected (${res.status}). Recovery: check that gateway.url (${gatewayUrl}) is the Summer gateway you meant, then run "summer login" again.`);
|
|
168
|
+
}
|
|
154
169
|
continue;
|
|
155
170
|
}
|
|
156
171
|
const data = (await res.json());
|
|
157
172
|
if (data.status === "pending")
|
|
158
173
|
continue;
|
|
159
174
|
if (data.status === "complete" && data.token) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
scopes: data.scopes,
|
|
165
|
-
cloudScopes: data.cloudScopes,
|
|
166
|
-
});
|
|
167
|
-
deps.log(`\nLogged in as ${data.user?.email || "unknown"}`);
|
|
168
|
-
return;
|
|
175
|
+
completed = { token: data.token, user: data.user, scopes: data.scopes };
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
lastError = "The login service returned an incomplete authentication result.";
|
|
169
179
|
}
|
|
170
|
-
lastError = "The login service returned an incomplete authentication result.";
|
|
171
180
|
}
|
|
172
181
|
catch (err) {
|
|
182
|
+
if (err instanceof LoginRejectedError)
|
|
183
|
+
throw err;
|
|
173
184
|
lastError = err instanceof Error ? err.message : "Network error";
|
|
174
185
|
}
|
|
186
|
+
if (completed) {
|
|
187
|
+
await saveLoginSession(completed);
|
|
188
|
+
deps.log(`\nLogged in as ${completed.user?.email || "unknown"}`);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
175
191
|
}
|
|
176
192
|
throw new Error(`Login timed out after ${Math.round(POLL_TIMEOUT_MS / 60000)} minutes.${lastError ? ` Last error: ${lastError}` : ""} Recovery: run "summer login" again and complete "Yes, Sign In" in the browser tab it opens.`);
|
|
177
193
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { clearAuthCredentials, hasEnvAuthToken } from "../../core/auth.js";
|
|
3
|
+
export const logoutCommand = new Command("logout")
|
|
4
|
+
.description("Sign out and clear stored auth tokens")
|
|
5
|
+
.action(async () => {
|
|
6
|
+
await runLogout(console.log);
|
|
7
|
+
});
|
|
8
|
+
export async function runLogout(log) {
|
|
9
|
+
const removed = await clearAuthCredentials();
|
|
10
|
+
if (removed > 0) {
|
|
11
|
+
log("Logged out. Stored auth tokens cleared.");
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
log("Already logged out (no stored tokens found).");
|
|
15
|
+
}
|
|
16
|
+
if (hasEnvAuthToken()) {
|
|
17
|
+
log("Note: SUMMER_TOKEN is set in this environment and still authenticates gateway calls — logout does not affect it. Unset SUMMER_TOKEN to sign out here.");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -1,14 +1,7 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
-
import { type ProjectMemorySummary } from "
|
|
3
|
-
interface ResolvedMemoryProject {
|
|
4
|
-
projectPath: string | null;
|
|
5
|
-
source: "option" | "engine" | "cwd" | "none";
|
|
6
|
-
reason?: string;
|
|
7
|
-
}
|
|
2
|
+
import { type ProjectMemorySummary } from "../../project-memory/project-memory.js";
|
|
8
3
|
export declare const memoryCommand: Command;
|
|
9
|
-
export declare function resolveMemoryProject(projectOption?: string): Promise<ResolvedMemoryProject>;
|
|
10
4
|
export declare function findProjectRoot(startDir: string): string | null;
|
|
11
5
|
export declare function resolveMemoryFilePath(projectPath: string, requested: string): string;
|
|
12
6
|
export declare function formatMemorySummary(projectPath: string, summary: ProjectMemorySummary): string;
|
|
13
7
|
export declare function formatStatusMemoryLine(summary: ProjectMemorySummary): string;
|
|
14
|
-
export {};
|