summer-engine 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +131 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +159 -391
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/{commands → cli/commands}/setup.js +43 -89
- package/dist/{commands → cli/commands}/skills.js +85 -222
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +47 -0
- package/dist/core/skills-registry.js +83 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/{lib → installer}/agent-config.d.ts +20 -1
- package/dist/{lib → installer}/agent-config.js +138 -24
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +146 -0
- package/dist/installer/skill-locations.d.ts +45 -0
- package/dist/installer/skill-locations.js +170 -0
- package/dist/installer/version-check.d.ts +174 -0
- package/dist/{lib → installer}/version-check.js +173 -42
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +70 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/cline/README.md +13 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +16 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/opencode/README.md +15 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +13 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +13 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +22 -16
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-registry.json +851 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/status.js +0 -46
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
- /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export declare const TRAJECTORY_EVAL_ENV = "SUMMER_TRAJECTORY_EVAL";
|
|
2
|
+
export declare function getTrajectoryDir(): string | null;
|
|
3
|
+
/** True only when capture is on AND the eval flag is set — the flag alone
|
|
4
|
+
* does nothing (design rule: eval mode never changes the default). */
|
|
5
|
+
export declare function isTrajectoryEvalMode(env?: NodeJS.ProcessEnv): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Keep the SHAPE of a tool call's arguments, drop the bodies: any string over
|
|
8
|
+
* REDACT_STRING_LIMIT chars (script sources, file contents, notes pasted in)
|
|
9
|
+
* becomes a "[redacted N chars]" marker. Objects/arrays are walked with depth
|
|
10
|
+
* and entry caps so a pathological payload cannot balloon the record.
|
|
11
|
+
* Exported for unit tests.
|
|
12
|
+
*/
|
|
13
|
+
export declare function redactTrajectoryArgs(value: unknown, depth?: number): unknown;
|
|
14
|
+
/** The complete set of result scalars the full stream may carry. Anything
|
|
15
|
+
* else in a result body stays out — the stream records that a perception
|
|
16
|
+
* call happened and what it confessed, never what it saw. */
|
|
17
|
+
export declare const TRAJECTORY_RESULT_FIELD_ALLOWLIST: readonly string[];
|
|
18
|
+
export interface TrajectoryMediaSummary {
|
|
19
|
+
mime: string;
|
|
20
|
+
bytes: number;
|
|
21
|
+
sha256: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TrajectoryResultSummary {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
terminalState?: string;
|
|
26
|
+
failureReason?: string;
|
|
27
|
+
errorClass?: string;
|
|
28
|
+
/** Top-level keys of the result payload (≤ FULL_MAX_KEYS). */
|
|
29
|
+
keys: string[];
|
|
30
|
+
/** Allowlisted scalars found at the payload top level or inside its first
|
|
31
|
+
* results[] entry (the engine op dict), plus derived counts. */
|
|
32
|
+
fields: Record<string, string | number | boolean>;
|
|
33
|
+
/** Image/audio blocks by hash — never inline. */
|
|
34
|
+
media: TrajectoryMediaSummary[];
|
|
35
|
+
}
|
|
36
|
+
/** Bounded, allowlisted summary of a tool result. Exported for unit tests and
|
|
37
|
+
* for the outcome-eval runner, which records replayed calls through the same
|
|
38
|
+
* function so a replay run yields the same stream shape a live session does. */
|
|
39
|
+
export declare function summarizeToolResult(result: unknown, classifiers: {
|
|
40
|
+
ok: boolean;
|
|
41
|
+
terminalState?: string;
|
|
42
|
+
failureReason?: string;
|
|
43
|
+
errorClass?: string;
|
|
44
|
+
}): TrajectoryResultSummary;
|
|
45
|
+
export interface TrajectoryToolCall {
|
|
46
|
+
tool: string;
|
|
47
|
+
/** The tool's parsed arguments; `null` means the tool takes no input
|
|
48
|
+
* schema (recorded as argsRedacted: null, never as the SDK's request extra). */
|
|
49
|
+
args?: unknown;
|
|
50
|
+
isError?: boolean;
|
|
51
|
+
terminalState?: string;
|
|
52
|
+
errorClass?: string;
|
|
53
|
+
failureReason?: string;
|
|
54
|
+
/** Message of a handler THROW (as opposed to an isError result). Recorded
|
|
55
|
+
* with ok:false, errorClass "exception". Redacted like any other string. */
|
|
56
|
+
exception?: string;
|
|
57
|
+
durationMs?: number;
|
|
58
|
+
/** The tool's raw result (MCP content envelope or CLI-face object). Read
|
|
59
|
+
* ONLY in eval mode, and only through summarizeToolResult — the redacted
|
|
60
|
+
* default stream never sees it. */
|
|
61
|
+
result?: unknown;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Does a server.tool(...) registration carry an input schema? The MCP SDK
|
|
65
|
+
* accepts tool(name, description?, paramsSchema?, annotations?, cb): when a
|
|
66
|
+
* paramsSchema is present the callback receives (args, extra); when it is
|
|
67
|
+
* absent the callback receives (extra) ONLY — and recording extra as the
|
|
68
|
+
* tool's args would write {signal, requestId, ...} junk into the stream. A
|
|
69
|
+
* paramsSchema is a zod raw shape (record of zod schemas, or {} for "no
|
|
70
|
+
* parameters") or a zod object instance; a flat object of primitives is
|
|
71
|
+
* ToolAnnotations. Exported for unit tests.
|
|
72
|
+
*/
|
|
73
|
+
export declare function registrationHasInputSchema(registrationArgs: readonly unknown[]): boolean;
|
|
74
|
+
/** The args to record for one handler invocation: the parsed args when the
|
|
75
|
+
* tool has an input schema, else null (the SDK passes only `extra`). */
|
|
76
|
+
export declare function trajectoryArgsFor(hasInputSchema: boolean, handlerArgs: readonly unknown[]): unknown | null;
|
|
77
|
+
/** One line per MCP tool call. No-op (false) when capture is off. In eval
|
|
78
|
+
* mode a second, unredacted line goes to trajectory.full.jsonl; its failure
|
|
79
|
+
* never affects the return value (the redacted stream is the contract). */
|
|
80
|
+
export declare function recordToolCall(call: TrajectoryToolCall): boolean;
|