summer-engine 2.8.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +149 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +161 -393
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/cli/commands/setup.js +158 -0
- package/dist/{commands → cli/commands}/skills.js +121 -251
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +55 -0
- package/dist/core/skills-registry.js +106 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/installer/agent-config.d.ts +63 -0
- package/dist/installer/agent-config.js +540 -0
- package/dist/installer/agent-table.d.ts +103 -0
- package/dist/installer/agent-table.js +584 -0
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +148 -0
- package/dist/installer/skill-locations.d.ts +36 -0
- package/dist/installer/skill-locations.js +91 -0
- package/dist/installer/version-check.d.ts +178 -0
- package/dist/installer/version-check.js +479 -0
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +99 -0
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +12 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +12 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +12 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +14 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +12 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/library/skills/README.md +242 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +21 -15
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-index.md +242 -0
- package/registry/generated/skills-registry.json +1249 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/setup.js +0 -217
- package/dist/commands/status.js +0 -46
- package/dist/lib/agent-config.d.ts +0 -39
- package/dist/lib/agent-config.js +0 -626
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/lib/version-check.js +0 -338
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
- /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill registry — loaded from the generated registry (CONTRACT.md §6, §12).
|
|
3
|
+
*
|
|
4
|
+
* The single source of truth for installable skills is the library:
|
|
5
|
+
* `library/skills/<slug>/` (resource.yaml + SKILL.md), compiled by
|
|
6
|
+
* `npm run generate:registry` into `registry/generated/skills-registry.json`.
|
|
7
|
+
* This module reads that generated file at runtime; nothing here is
|
|
8
|
+
* hand-maintained per skill anymore. The old hand-written SKILL_REGISTRY
|
|
9
|
+
* (skills/<category>/<name> paths) was deleted at the v3 cutover.
|
|
10
|
+
*/
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import { PACKAGE_ROOT } from "./package-root.js";
|
|
14
|
+
/**
|
|
15
|
+
* Clients `summer skills install --agent` accepts: "summer" (the toolkit's
|
|
16
|
+
* own ~/.summer/skills) plus every agent in the installer's agent table that
|
|
17
|
+
* has a skills or rules folder. core/ cannot import installer/, so this list
|
|
18
|
+
* is written out; agent-table.test.ts fails if the two drift.
|
|
19
|
+
*/
|
|
20
|
+
export const AGENT_CLIENTS = [
|
|
21
|
+
"summer",
|
|
22
|
+
"claude-code",
|
|
23
|
+
"codex",
|
|
24
|
+
"cursor",
|
|
25
|
+
"windsurf",
|
|
26
|
+
"antigravity",
|
|
27
|
+
"gemini",
|
|
28
|
+
"cline",
|
|
29
|
+
"cline-cli",
|
|
30
|
+
"roo-code",
|
|
31
|
+
"kilo-code",
|
|
32
|
+
"github-copilot",
|
|
33
|
+
"vscode-copilot",
|
|
34
|
+
"opencode",
|
|
35
|
+
"zed",
|
|
36
|
+
"kiro",
|
|
37
|
+
"goose",
|
|
38
|
+
"hermes",
|
|
39
|
+
"qwen-code",
|
|
40
|
+
"kimi-code",
|
|
41
|
+
"crush",
|
|
42
|
+
"amp",
|
|
43
|
+
"factory",
|
|
44
|
+
"warp",
|
|
45
|
+
"rovo-dev",
|
|
46
|
+
"qoder",
|
|
47
|
+
"grok-build",
|
|
48
|
+
"mistral-vibe",
|
|
49
|
+
];
|
|
50
|
+
const packageRoot = PACKAGE_ROOT;
|
|
51
|
+
const REGISTRY_RELPATH = join("registry", "generated", "skills-registry.json");
|
|
52
|
+
let cache = null;
|
|
53
|
+
/**
|
|
54
|
+
* Load the generated skill registry (cached after first read).
|
|
55
|
+
* Throws if the generated file is missing or unparsable — the npm package
|
|
56
|
+
* always ships it, so a failure here means a broken build, not user error.
|
|
57
|
+
*/
|
|
58
|
+
export function getSkillRegistry() {
|
|
59
|
+
if (cache)
|
|
60
|
+
return cache;
|
|
61
|
+
const file = join(packageRoot, REGISTRY_RELPATH);
|
|
62
|
+
cache = parseSkillRegistry(JSON.parse(readFileSync(file, "utf-8")));
|
|
63
|
+
return cache;
|
|
64
|
+
}
|
|
65
|
+
/** Shape-tolerant parse of skills-registry.json. Exported for unit tests. */
|
|
66
|
+
export function parseSkillRegistry(json) {
|
|
67
|
+
const raw = (json ?? {});
|
|
68
|
+
const skills = Array.isArray(raw.skills) ? raw.skills : [];
|
|
69
|
+
return skills
|
|
70
|
+
.filter((s) => typeof s.id === "string" &&
|
|
71
|
+
typeof s.name === "string" &&
|
|
72
|
+
typeof s.path === "string")
|
|
73
|
+
.map((s) => ({
|
|
74
|
+
id: s.id,
|
|
75
|
+
name: s.name,
|
|
76
|
+
description: typeof s.description === "string" ? s.description : "",
|
|
77
|
+
recommended: s.recommended === true,
|
|
78
|
+
status: s.status === "preview" || s.status === "deprecated" ? s.status : "stable",
|
|
79
|
+
path: s.path,
|
|
80
|
+
domains: Array.isArray(s.domains) ? s.domains.filter((d) => typeof d === "string") : [],
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The one bulk-install rule (`skills install --all/--recommended` and
|
|
85
|
+
* `summer setup` both use it): `stable` and `preview` skills install —
|
|
86
|
+
* preview is a label ("not yet exercised in-engine by the Summer team"),
|
|
87
|
+
* carried in each skill's own guidance, not a reason to hide contributed work;
|
|
88
|
+
* `deprecated` never installs in bulk. `stableOnly` opts out of preview.
|
|
89
|
+
* The counts let the caller say how many preview skills it installed (or, with
|
|
90
|
+
* stableOnly, left out) instead of printing a bare total.
|
|
91
|
+
*/
|
|
92
|
+
export function selectSkillsForBulkInstall(skills, options) {
|
|
93
|
+
const candidates = options.recommended ? skills.filter((skill) => skill.recommended) : [...skills];
|
|
94
|
+
const stableOnly = options.stableOnly === true;
|
|
95
|
+
const selected = candidates.filter((skill) => skill.status === "stable" || (!stableOnly && skill.status === "preview"));
|
|
96
|
+
const preview = candidates.filter((skill) => skill.status === "preview").length;
|
|
97
|
+
return {
|
|
98
|
+
selected,
|
|
99
|
+
previewIncluded: stableOnly ? 0 : preview,
|
|
100
|
+
previewSkipped: stableOnly ? preview : 0,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** Absolute directory of a skill's library files (contains SKILL.md). */
|
|
104
|
+
export function resolveSkillDir(entry) {
|
|
105
|
+
return join(packageRoot, entry.path);
|
|
106
|
+
}
|
|
@@ -11,6 +11,10 @@ export class SummerStoreError extends Error {
|
|
|
11
11
|
this.name = "SummerStoreError";
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
+
/** The OS error code (EACCES, ENOSPC, EROFS, ...) — the one detail a user needs to fix a store failure. */
|
|
15
|
+
function errnoCode(error) {
|
|
16
|
+
return error?.code ?? "unknown";
|
|
17
|
+
}
|
|
14
18
|
export function getSummerDir() {
|
|
15
19
|
return summerDirOverride ?? join(homedir(), ".summer");
|
|
16
20
|
}
|
|
@@ -49,7 +53,7 @@ export async function ensureSummerStore() {
|
|
|
49
53
|
catch (error) {
|
|
50
54
|
if (error instanceof SummerStoreError)
|
|
51
55
|
throw error;
|
|
52
|
-
throw new SummerStoreError("store_unavailable", `Cannot secure ${dir}. Recovery: make sure the directory is owned and writable by your user, then run the command again.`);
|
|
56
|
+
throw new SummerStoreError("store_unavailable", `Cannot secure ${dir} (${errnoCode(error)}). Recovery: make sure the directory is owned and writable by your user, then run the command again.`);
|
|
53
57
|
}
|
|
54
58
|
}
|
|
55
59
|
async function assertSafeExistingFile(path) {
|
|
@@ -77,7 +81,7 @@ export async function readStoreText(name) {
|
|
|
77
81
|
catch (error) {
|
|
78
82
|
if (error instanceof SummerStoreError)
|
|
79
83
|
throw error;
|
|
80
|
-
throw new SummerStoreError("store_read_failed", `Cannot read ${path}. Recovery: make sure the file is owned and readable by your user, then run the command again.`);
|
|
84
|
+
throw new SummerStoreError("store_read_failed", `Cannot read ${path} (${errnoCode(error)}). Recovery: make sure the file is owned and readable by your user, then run the command again.`);
|
|
81
85
|
}
|
|
82
86
|
}
|
|
83
87
|
export async function readStoreJson(name) {
|
|
@@ -110,7 +114,7 @@ export async function writeStoreText(name, value) {
|
|
|
110
114
|
await rm(temporary, { force: true }).catch(() => undefined);
|
|
111
115
|
if (error instanceof SummerStoreError)
|
|
112
116
|
throw error;
|
|
113
|
-
throw new SummerStoreError("store_write_failed", `Cannot write ${destination}. Recovery: make sure ${dir} is owned and writable by your user, then run the command again.`);
|
|
117
|
+
throw new SummerStoreError("store_write_failed", `Cannot write ${destination} (${errnoCode(error)}). Recovery: make sure ${dir} is owned and writable by your user, then run the command again.`);
|
|
114
118
|
}
|
|
115
119
|
}
|
|
116
120
|
export async function writeStoreJson(name, value) {
|
|
@@ -127,8 +131,8 @@ export async function appendStoreJsonLine(name, value) {
|
|
|
127
131
|
});
|
|
128
132
|
await hardenMode(path, 0o600);
|
|
129
133
|
}
|
|
130
|
-
catch {
|
|
131
|
-
throw new SummerStoreError("store_append_failed", `Cannot append to ${path}. Recovery: make sure the file is owned and writable by your user, then run the command again.`);
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw new SummerStoreError("store_append_failed", `Cannot append to ${path} (${errnoCode(error)}). Recovery: make sure the file is owned and writable by your user, then run the command again.`);
|
|
132
136
|
}
|
|
133
137
|
}
|
|
134
138
|
export async function removeStoreFile(name) {
|
|
@@ -139,7 +143,7 @@ export async function removeStoreFile(name) {
|
|
|
139
143
|
await rm(path);
|
|
140
144
|
return true;
|
|
141
145
|
}
|
|
142
|
-
catch {
|
|
143
|
-
throw new SummerStoreError("store_remove_failed", `Cannot remove ${path}. Recovery: make sure the file is owned and writable by your user, then run the command again.`);
|
|
146
|
+
catch (error) {
|
|
147
|
+
throw new SummerStoreError("store_remove_failed", `Cannot remove ${path} (${errnoCode(error)}). Recovery: make sure the file is owned and writable by your user, then run the command again.`);
|
|
144
148
|
}
|
|
145
149
|
}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
* Summer CLI compatibility values.
|
|
3
3
|
*
|
|
4
4
|
* Keep the current technical base in one place. The project feature tag is
|
|
5
|
-
* derived from it so `summer create` cannot drift to a different line.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* derived from it so `summer create` cannot drift to a different line. The
|
|
6
|
+
* only consumer is src/cli/commands/create.ts; create.test.ts pins the
|
|
7
|
+
* rendered "Technical base <version>" line and config/features tag.
|
|
8
8
|
*/
|
|
9
9
|
const CURRENT_TECHNICAL_BASE_VERSION = "4.6.1";
|
|
10
10
|
function featureTagFor(version) {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* ignored entirely on the CLI side.
|
|
8
8
|
*/
|
|
9
9
|
import { getAuthToken } from "./auth.js";
|
|
10
|
-
|
|
10
|
+
import { resolveGatewayUrl } from "./config.js";
|
|
11
11
|
const TELEMETRY_PATH = "/api/mcp/log-local-call";
|
|
12
12
|
const TIMEOUT_MS = 5000;
|
|
13
13
|
let pinged = false;
|
|
@@ -30,10 +30,13 @@ export function recordMcpSession() {
|
|
|
30
30
|
const token = await getAuthToken();
|
|
31
31
|
if (!token)
|
|
32
32
|
return; // unauthenticated MCP usage is allowed; we just can't attribute it
|
|
33
|
+
// Resolved per call, not at import: the gateway the token belongs to is
|
|
34
|
+
// whatever env/config says NOW (see config.resolveGatewayUrl).
|
|
35
|
+
const gatewayUrl = await resolveGatewayUrl();
|
|
33
36
|
const ctrl = new AbortController();
|
|
34
37
|
const timer = setTimeout(() => ctrl.abort(), TIMEOUT_MS);
|
|
35
38
|
try {
|
|
36
|
-
await fetch(`${
|
|
39
|
+
await fetch(`${gatewayUrl}${TELEMETRY_PATH}`, {
|
|
37
40
|
method: "POST",
|
|
38
41
|
signal: ctrl.signal,
|
|
39
42
|
headers: {
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export type TemplateStatus = "stable" | "preview" | "deprecated";
|
|
2
|
+
export interface TemplatePin {
|
|
3
|
+
/** Clone URL of the satellite repo. */
|
|
4
|
+
repo: string;
|
|
5
|
+
/** Exact 40-hex commit. The only thing ever checked out. */
|
|
6
|
+
commit: string;
|
|
7
|
+
/** sha256 of `git ls-tree -r <commit> --format='%(objectname) %(path)'`. */
|
|
8
|
+
tree_digest: string;
|
|
9
|
+
/** Informational only — never resolved at runtime. */
|
|
10
|
+
default_branch?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TemplateEntry {
|
|
13
|
+
/** Library id, e.g. "template/2d-platformer". */
|
|
14
|
+
id: string;
|
|
15
|
+
/** Library slug (directory name), e.g. "2d-platformer". */
|
|
16
|
+
slug: string;
|
|
17
|
+
version: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
status: TemplateStatus;
|
|
20
|
+
/** Legacy names that still resolve, e.g. "template-2d-platformer". */
|
|
21
|
+
aliases: string[];
|
|
22
|
+
systems: string[];
|
|
23
|
+
do_not_use_when: string[];
|
|
24
|
+
/** Package-root-relative manifest dir, e.g. "library/templates/2d-platformer/". */
|
|
25
|
+
path: string;
|
|
26
|
+
/** Generated in-process by the CLI; carries no pin. */
|
|
27
|
+
builtin: boolean;
|
|
28
|
+
/** Present iff `builtin` is false. */
|
|
29
|
+
pin: TemplatePin | null;
|
|
30
|
+
}
|
|
31
|
+
export type TemplateResolution = {
|
|
32
|
+
kind: "match";
|
|
33
|
+
entry: TemplateEntry;
|
|
34
|
+
via: "id" | "slug" | "alias" | "prefix";
|
|
35
|
+
} | {
|
|
36
|
+
kind: "ambiguous";
|
|
37
|
+
candidates: TemplateEntry[];
|
|
38
|
+
} | {
|
|
39
|
+
kind: "none";
|
|
40
|
+
};
|
|
41
|
+
/** Normalize one raw generated entry; returns null when it is not usable. */
|
|
42
|
+
export declare function normalizeTemplateEntry(raw: unknown): TemplateEntry | null;
|
|
43
|
+
/**
|
|
44
|
+
* Load the generated template registry (cached after first read).
|
|
45
|
+
* Throws if the file is missing or unparsable — the npm package always ships
|
|
46
|
+
* it, so a failure here means a broken build, not user error.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getTemplateRegistry(): readonly TemplateEntry[];
|
|
49
|
+
/**
|
|
50
|
+
* Resolve a user-supplied template name. Exact matches win in order
|
|
51
|
+
* id > slug > alias; otherwise a prefix of a slug or alias must identify
|
|
52
|
+
* exactly one template.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveTemplate(query: string, entries: readonly TemplateEntry[]): TemplateResolution;
|
|
55
|
+
/** Seconds a network git call (`fetch`) may take before it is killed.
|
|
56
|
+
* `summer create` once hung 42 minutes inside a fetch
|
|
57
|
+
* (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 4). */
|
|
58
|
+
export declare const FETCH_TIMEOUT_ENV = "SUMMER_FETCH_TIMEOUT_S";
|
|
59
|
+
export declare const DEFAULT_FETCH_TIMEOUT_S = 120;
|
|
60
|
+
/** The bound in force: FETCH_TIMEOUT_ENV when it is a positive number of
|
|
61
|
+
* seconds, else the default. */
|
|
62
|
+
export declare function fetchTimeoutSeconds(env?: NodeJS.ProcessEnv): number;
|
|
63
|
+
export declare class GitTimeoutError extends Error {
|
|
64
|
+
readonly repo: string;
|
|
65
|
+
readonly seconds: number;
|
|
66
|
+
constructor(repo: string, seconds: number);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* The documented tree digest (library/templates/README.md):
|
|
70
|
+
* sha256 over the exact bytes of
|
|
71
|
+
* git ls-tree -r <commit> --format='%(objectname) %(path)'
|
|
72
|
+
* Requires git >= 2.36 (ls-tree --format).
|
|
73
|
+
*/
|
|
74
|
+
export declare function computeTreeDigest(gitDir: string, commit: string): string;
|
|
75
|
+
export declare class TemplateDigestMismatchError extends Error {
|
|
76
|
+
readonly entry: TemplateEntry;
|
|
77
|
+
readonly expected: string;
|
|
78
|
+
readonly actual: string;
|
|
79
|
+
constructor(entry: TemplateEntry, expected: string, actual: string);
|
|
80
|
+
}
|
|
81
|
+
export interface MaterializeOptions {
|
|
82
|
+
/** Where to put the project. Must not already exist. */
|
|
83
|
+
targetDir: string;
|
|
84
|
+
/** Keep the fetched .git (detached at the pinned commit). Default: remove it. */
|
|
85
|
+
keepGit?: boolean;
|
|
86
|
+
/** Progress lines. */
|
|
87
|
+
log?: (line: string) => void;
|
|
88
|
+
}
|
|
89
|
+
export interface MaterializedTemplate {
|
|
90
|
+
commit: string;
|
|
91
|
+
tree_digest: string;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Fetch exactly the pinned commit into `targetDir`, verify the tree digest,
|
|
95
|
+
* then check the tree out. On ANY failure the target directory is removed so
|
|
96
|
+
* a half-fetched template never looks like a project.
|
|
97
|
+
*/
|
|
98
|
+
export declare function materializePinnedTemplate(entry: TemplateEntry, opts: MaterializeOptions): MaterializedTemplate;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template resolution — CONTRACT.md §7 ("Templates: pinned, always").
|
|
3
|
+
*
|
|
4
|
+
* `summer create <slug>` resolves a template ONLY through its library pin
|
|
5
|
+
* manifest (`library/templates/<slug>/resource.yaml`), compiled by
|
|
6
|
+
* `npm run generate:registry` into `registry/generated/templates-registry.json`
|
|
7
|
+
* (same pattern as skills-registry.json). This module:
|
|
8
|
+
*
|
|
9
|
+
* 1. loads that generated file relative to the package root,
|
|
10
|
+
* 2. resolves a user query by id, slug, alias, or unambiguous prefix,
|
|
11
|
+
* 3. materializes a pinned template: fetch exactly `commit` from `repo`,
|
|
12
|
+
* recompute `tree_digest` with the documented formula and REFUSE on any
|
|
13
|
+
* mismatch, then check out the pinned tree (detached unless keepGit).
|
|
14
|
+
*
|
|
15
|
+
* A default branch is never consulted. Nothing here lists a GitHub org.
|
|
16
|
+
*
|
|
17
|
+
* Built-in templates (`builtin: true`) carry no pin; the CLI generates them
|
|
18
|
+
* in-process. This module only identifies them.
|
|
19
|
+
*/
|
|
20
|
+
import { execFileSync } from "node:child_process";
|
|
21
|
+
import { createHash } from "node:crypto";
|
|
22
|
+
import { existsSync, mkdirSync, readFileSync, rmSync } from "node:fs";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
import { PACKAGE_ROOT } from "./package-root.js";
|
|
25
|
+
const REGISTRY_RELPATH = join("registry", "generated", "templates-registry.json");
|
|
26
|
+
let cache = null;
|
|
27
|
+
function strList(value) {
|
|
28
|
+
return Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
|
|
29
|
+
}
|
|
30
|
+
function isStatus(value) {
|
|
31
|
+
return value === "stable" || value === "preview" || value === "deprecated";
|
|
32
|
+
}
|
|
33
|
+
/** Normalize one raw generated entry; returns null when it is not usable. */
|
|
34
|
+
export function normalizeTemplateEntry(raw) {
|
|
35
|
+
if (typeof raw !== "object" || raw === null)
|
|
36
|
+
return null;
|
|
37
|
+
const r = raw;
|
|
38
|
+
if (typeof r.id !== "string" || typeof r.slug !== "string" || typeof r.version !== "string")
|
|
39
|
+
return null;
|
|
40
|
+
const builtin = r.builtin === true;
|
|
41
|
+
let pin = null;
|
|
42
|
+
if (!builtin) {
|
|
43
|
+
const p = r.pin;
|
|
44
|
+
if (typeof p !== "object" || p === null)
|
|
45
|
+
return null;
|
|
46
|
+
const pr = p;
|
|
47
|
+
if (typeof pr.repo !== "string" || typeof pr.commit !== "string" || typeof pr.tree_digest !== "string") {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
pin = {
|
|
51
|
+
repo: pr.repo,
|
|
52
|
+
commit: pr.commit,
|
|
53
|
+
tree_digest: pr.tree_digest,
|
|
54
|
+
...(typeof pr.default_branch === "string" ? { default_branch: pr.default_branch } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
id: r.id,
|
|
59
|
+
slug: r.slug,
|
|
60
|
+
version: r.version,
|
|
61
|
+
summary: typeof r.summary === "string" ? r.summary : "",
|
|
62
|
+
status: isStatus(r.status) ? r.status : "stable",
|
|
63
|
+
aliases: strList(r.aliases),
|
|
64
|
+
systems: strList(r.systems),
|
|
65
|
+
do_not_use_when: strList(r.do_not_use_when),
|
|
66
|
+
path: typeof r.path === "string" ? r.path : `library/templates/${r.slug}/`,
|
|
67
|
+
builtin,
|
|
68
|
+
pin,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Load the generated template registry (cached after first read).
|
|
73
|
+
* Throws if the file is missing or unparsable — the npm package always ships
|
|
74
|
+
* it, so a failure here means a broken build, not user error.
|
|
75
|
+
*/
|
|
76
|
+
export function getTemplateRegistry() {
|
|
77
|
+
if (cache)
|
|
78
|
+
return cache;
|
|
79
|
+
const file = join(PACKAGE_ROOT, REGISTRY_RELPATH);
|
|
80
|
+
const json = JSON.parse(readFileSync(file, "utf-8"));
|
|
81
|
+
const raw = Array.isArray(json.templates) ? json.templates : [];
|
|
82
|
+
cache = raw.map(normalizeTemplateEntry).filter((e) => e !== null);
|
|
83
|
+
return cache;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Resolve a user-supplied template name. Exact matches win in order
|
|
87
|
+
* id > slug > alias; otherwise a prefix of a slug or alias must identify
|
|
88
|
+
* exactly one template.
|
|
89
|
+
*/
|
|
90
|
+
export function resolveTemplate(query, entries) {
|
|
91
|
+
const q = query.trim();
|
|
92
|
+
if (q === "")
|
|
93
|
+
return { kind: "none" };
|
|
94
|
+
const byId = entries.find((e) => e.id === q);
|
|
95
|
+
if (byId)
|
|
96
|
+
return { kind: "match", entry: byId, via: "id" };
|
|
97
|
+
const bySlug = entries.find((e) => e.slug === q);
|
|
98
|
+
if (bySlug)
|
|
99
|
+
return { kind: "match", entry: bySlug, via: "slug" };
|
|
100
|
+
const byAlias = entries.find((e) => e.aliases.includes(q));
|
|
101
|
+
if (byAlias)
|
|
102
|
+
return { kind: "match", entry: byAlias, via: "alias" };
|
|
103
|
+
const byPrefix = entries.filter((e) => e.slug.startsWith(q) || e.aliases.some((a) => a.startsWith(q)));
|
|
104
|
+
if (byPrefix.length === 1)
|
|
105
|
+
return { kind: "match", entry: byPrefix[0], via: "prefix" };
|
|
106
|
+
if (byPrefix.length > 1)
|
|
107
|
+
return { kind: "ambiguous", candidates: byPrefix };
|
|
108
|
+
return { kind: "none" };
|
|
109
|
+
}
|
|
110
|
+
// ---------- git ----------
|
|
111
|
+
/** Seconds a network git call (`fetch`) may take before it is killed.
|
|
112
|
+
* `summer create` once hung 42 minutes inside a fetch
|
|
113
|
+
* (docs/design/archive/TK-VS-FOLD-2026-09-07.md, gap 4). */
|
|
114
|
+
export const FETCH_TIMEOUT_ENV = "SUMMER_FETCH_TIMEOUT_S";
|
|
115
|
+
export const DEFAULT_FETCH_TIMEOUT_S = 120;
|
|
116
|
+
/** The bound in force: FETCH_TIMEOUT_ENV when it is a positive number of
|
|
117
|
+
* seconds, else the default. */
|
|
118
|
+
export function fetchTimeoutSeconds(env = process.env) {
|
|
119
|
+
const raw = env[FETCH_TIMEOUT_ENV]?.trim();
|
|
120
|
+
if (!raw)
|
|
121
|
+
return DEFAULT_FETCH_TIMEOUT_S;
|
|
122
|
+
const parsed = Number(raw);
|
|
123
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_FETCH_TIMEOUT_S;
|
|
124
|
+
}
|
|
125
|
+
/** Never prompt: a private repo (one template's is) fails at once instead of
|
|
126
|
+
* waiting on a credential prompt nobody can see. Built per call so a test can
|
|
127
|
+
* put a fake `git` on PATH. */
|
|
128
|
+
function gitEnv() {
|
|
129
|
+
return { ...process.env, GIT_TERMINAL_PROMPT: "0", GIT_ASKPASS: "" };
|
|
130
|
+
}
|
|
131
|
+
function git(cwd, args) {
|
|
132
|
+
return execFileSync("git", args, { cwd, env: gitEnv(), stdio: ["ignore", "pipe", "pipe"] });
|
|
133
|
+
}
|
|
134
|
+
/** A git call that talks to the network: bounded by fetchTimeoutSeconds(); on
|
|
135
|
+
* expiry the child is killed (SIGTERM) and a GitTimeoutError is thrown. */
|
|
136
|
+
function gitNetwork(cwd, args, repo) {
|
|
137
|
+
const seconds = fetchTimeoutSeconds();
|
|
138
|
+
try {
|
|
139
|
+
return execFileSync("git", args, {
|
|
140
|
+
cwd,
|
|
141
|
+
env: gitEnv(),
|
|
142
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
143
|
+
timeout: seconds * 1000,
|
|
144
|
+
killSignal: "SIGTERM",
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const e = err;
|
|
149
|
+
if (e.code === "ETIMEDOUT" || (e.killed && e.signal === "SIGTERM")) {
|
|
150
|
+
throw new GitTimeoutError(repo, seconds);
|
|
151
|
+
}
|
|
152
|
+
throw err;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export class GitTimeoutError extends Error {
|
|
156
|
+
repo;
|
|
157
|
+
seconds;
|
|
158
|
+
constructor(repo, seconds) {
|
|
159
|
+
super(`Timed out after ${seconds}s fetching ${repo}; the git process was killed.\n` +
|
|
160
|
+
"Nothing was written and the template pin is unchanged. Check that this machine can reach the repository " +
|
|
161
|
+
"(network, VPN, and access — credential prompts are disabled, so a private repository fails here too), " +
|
|
162
|
+
`then retry \`summer create\`. A slow network can raise the limit with ${FETCH_TIMEOUT_ENV}=<seconds>.`);
|
|
163
|
+
this.repo = repo;
|
|
164
|
+
this.seconds = seconds;
|
|
165
|
+
this.name = "GitTimeoutError";
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function gitErrorText(err) {
|
|
169
|
+
const e = err;
|
|
170
|
+
const stderr = e.stderr ? e.stderr.toString().trim() : "";
|
|
171
|
+
return stderr || e.message || String(err);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The documented tree digest (library/templates/README.md):
|
|
175
|
+
* sha256 over the exact bytes of
|
|
176
|
+
* git ls-tree -r <commit> --format='%(objectname) %(path)'
|
|
177
|
+
* Requires git >= 2.36 (ls-tree --format).
|
|
178
|
+
*/
|
|
179
|
+
export function computeTreeDigest(gitDir, commit) {
|
|
180
|
+
const out = git(gitDir, ["ls-tree", "-r", commit, "--format=%(objectname) %(path)"]);
|
|
181
|
+
return createHash("sha256").update(out).digest("hex");
|
|
182
|
+
}
|
|
183
|
+
export class TemplateDigestMismatchError extends Error {
|
|
184
|
+
entry;
|
|
185
|
+
expected;
|
|
186
|
+
actual;
|
|
187
|
+
constructor(entry, expected, actual) {
|
|
188
|
+
super(`Refusing to create project: tree digest mismatch for ${entry.id} at ${entry.pin?.commit ?? "?"}.\n` +
|
|
189
|
+
` expected ${expected}\n` +
|
|
190
|
+
` actual ${actual}\n` +
|
|
191
|
+
"The pinned commit does not contain the reviewed tree. Nothing was written. " +
|
|
192
|
+
"Re-pin the template deliberately (library/templates/README.md) instead of trusting this checkout.");
|
|
193
|
+
this.entry = entry;
|
|
194
|
+
this.expected = expected;
|
|
195
|
+
this.actual = actual;
|
|
196
|
+
this.name = "TemplateDigestMismatchError";
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Fetch exactly the pinned commit into `targetDir`, verify the tree digest,
|
|
201
|
+
* then check the tree out. On ANY failure the target directory is removed so
|
|
202
|
+
* a half-fetched template never looks like a project.
|
|
203
|
+
*/
|
|
204
|
+
export function materializePinnedTemplate(entry, opts) {
|
|
205
|
+
const pin = entry.pin;
|
|
206
|
+
if (!pin)
|
|
207
|
+
throw new Error(`${entry.id} is a built-in template and has no pin to materialize.`);
|
|
208
|
+
if (existsSync(opts.targetDir))
|
|
209
|
+
throw new Error(`Directory already exists: ${opts.targetDir}`);
|
|
210
|
+
const log = opts.log ?? (() => { });
|
|
211
|
+
mkdirSync(opts.targetDir, { recursive: true });
|
|
212
|
+
const cleanup = () => rmSync(opts.targetDir, { recursive: true, force: true });
|
|
213
|
+
try {
|
|
214
|
+
git(opts.targetDir, ["init", "-q"]);
|
|
215
|
+
git(opts.targetDir, ["remote", "add", "origin", pin.repo]);
|
|
216
|
+
log(`Fetching ${pin.repo} at ${pin.commit.slice(0, 12)} ...`);
|
|
217
|
+
try {
|
|
218
|
+
gitNetwork(opts.targetDir, ["fetch", "-q", "--depth", "1", "origin", pin.commit], pin.repo);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
if (err instanceof GitTimeoutError)
|
|
222
|
+
throw err;
|
|
223
|
+
throw new Error(`Could not fetch ${pin.repo} at ${pin.commit}.\n ${gitErrorText(err)}\n` +
|
|
224
|
+
"Either the repository is unreachable/private from this machine, git is missing, " +
|
|
225
|
+
"or upstream history was rewritten so the pinned commit no longer exists. " +
|
|
226
|
+
"The pin only moves through a reviewed change to library/templates/.");
|
|
227
|
+
}
|
|
228
|
+
const actual = computeTreeDigest(opts.targetDir, pin.commit);
|
|
229
|
+
if (actual !== pin.tree_digest)
|
|
230
|
+
throw new TemplateDigestMismatchError(entry, pin.tree_digest, actual);
|
|
231
|
+
log(`Verified tree digest ${actual.slice(0, 12)}`);
|
|
232
|
+
git(opts.targetDir, ["checkout", "-q", pin.commit]);
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
cleanup();
|
|
236
|
+
throw err;
|
|
237
|
+
}
|
|
238
|
+
if (!opts.keepGit)
|
|
239
|
+
rmSync(join(opts.targetDir, ".git"), { recursive: true, force: true });
|
|
240
|
+
return { commit: pin.commit, tree_digest: pin.tree_digest };
|
|
241
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown-error classes the MCP layer (withEngine) can tell apart from a
|
|
3
|
+
* transport failure. Lives in core so the headless worker facade can tag its
|
|
4
|
+
* own throws without importing the MCP layer.
|
|
5
|
+
*
|
|
6
|
+
* Why: withEngine used to treat EVERY throw inside a tool closure as
|
|
7
|
+
* "transport" — reset the cached client and tell the model the mutation "may
|
|
8
|
+
* have partially applied, don't blind-retry". For an argument-validation
|
|
9
|
+
* throw (nothing was ever sent) that is false and expensive: the agent goes
|
|
10
|
+
* off to inspect the scene for a change that never happened.
|
|
11
|
+
*
|
|
12
|
+
* Tagging is by symbol rather than instanceof so a copy of this module loaded
|
|
13
|
+
* twice (dist + src in tests, or a duplicated dependency) still classifies.
|
|
14
|
+
*/
|
|
15
|
+
export declare const THROWN_ERROR_CLASS: unique symbol;
|
|
16
|
+
export type ThrownErrorClass = "input" | "unsupported";
|
|
17
|
+
/** Argument validation failed BEFORE anything was sent to the engine. */
|
|
18
|
+
export declare class ToolInputError extends Error {
|
|
19
|
+
readonly [THROWN_ERROR_CLASS]: ThrownErrorClass;
|
|
20
|
+
constructor(message: string);
|
|
21
|
+
}
|
|
22
|
+
/** The client serving this call cannot perform the operation at all (e.g. the
|
|
23
|
+
* headless worker facade has no equivalent). Nothing was sent or applied. */
|
|
24
|
+
export declare class UnsupportedOperationError extends Error {
|
|
25
|
+
readonly [THROWN_ERROR_CLASS]: ThrownErrorClass;
|
|
26
|
+
constructor(message: string);
|
|
27
|
+
}
|
|
28
|
+
/** The pre-apply class of a thrown error, or null for anything unclassified
|
|
29
|
+
* (which withEngine keeps treating as transport). */
|
|
30
|
+
export declare function thrownErrorClass(err: unknown): ThrownErrorClass | null;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thrown-error classes the MCP layer (withEngine) can tell apart from a
|
|
3
|
+
* transport failure. Lives in core so the headless worker facade can tag its
|
|
4
|
+
* own throws without importing the MCP layer.
|
|
5
|
+
*
|
|
6
|
+
* Why: withEngine used to treat EVERY throw inside a tool closure as
|
|
7
|
+
* "transport" — reset the cached client and tell the model the mutation "may
|
|
8
|
+
* have partially applied, don't blind-retry". For an argument-validation
|
|
9
|
+
* throw (nothing was ever sent) that is false and expensive: the agent goes
|
|
10
|
+
* off to inspect the scene for a change that never happened.
|
|
11
|
+
*
|
|
12
|
+
* Tagging is by symbol rather than instanceof so a copy of this module loaded
|
|
13
|
+
* twice (dist + src in tests, or a duplicated dependency) still classifies.
|
|
14
|
+
*/
|
|
15
|
+
export const THROWN_ERROR_CLASS = Symbol.for("summer.thrownErrorClass");
|
|
16
|
+
/** Argument validation failed BEFORE anything was sent to the engine. */
|
|
17
|
+
export class ToolInputError extends Error {
|
|
18
|
+
[THROWN_ERROR_CLASS] = "input";
|
|
19
|
+
constructor(message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = "ToolInputError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** The client serving this call cannot perform the operation at all (e.g. the
|
|
25
|
+
* headless worker facade has no equivalent). Nothing was sent or applied. */
|
|
26
|
+
export class UnsupportedOperationError extends Error {
|
|
27
|
+
[THROWN_ERROR_CLASS] = "unsupported";
|
|
28
|
+
constructor(message) {
|
|
29
|
+
super(message);
|
|
30
|
+
this.name = "UnsupportedOperationError";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** The pre-apply class of a thrown error, or null for anything unclassified
|
|
34
|
+
* (which withEngine keeps treating as transport). */
|
|
35
|
+
export function thrownErrorClass(err) {
|
|
36
|
+
if (!err || typeof err !== "object")
|
|
37
|
+
return null;
|
|
38
|
+
const tag = err[THROWN_ERROR_CLASS];
|
|
39
|
+
return tag === "input" || tag === "unsupported" ? tag : null;
|
|
40
|
+
}
|