summer-engine 2.8.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +134 -41
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +159 -391
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/{commands → cli/commands}/setup.js +43 -89
- package/dist/{commands → cli/commands}/skills.js +85 -222
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +47 -0
- package/dist/core/skills-registry.js +83 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/{lib → installer}/agent-config.d.ts +20 -1
- package/dist/{lib → installer}/agent-config.js +148 -23
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +146 -0
- package/dist/installer/skill-locations.d.ts +45 -0
- package/dist/installer/skill-locations.js +170 -0
- package/dist/installer/version-check.d.ts +174 -0
- package/dist/{lib → installer}/version-check.js +173 -42
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +70 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/cline/README.md +13 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +16 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/opencode/README.md +15 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +13 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +13 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +1 -1
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +23 -23
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +9 -1
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +1 -1
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +1 -1
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +22 -16
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-registry.json +851 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/status.js +0 -46
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -2,28 +2,16 @@ import { createHash } from "node:crypto";
|
|
|
2
2
|
import { createReadStream } from "node:fs";
|
|
3
3
|
import { lstat, readFile } from "node:fs/promises";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
|
-
import { getCredentialMetadata, getCreatorToken, } from "
|
|
6
|
-
import { getCreatorApiUrl, readSummerConfig, } from "
|
|
7
|
-
import { appendStoreJsonLine } from "
|
|
5
|
+
import { getCredentialMetadata, getCreatorToken, } from "../auth.js";
|
|
6
|
+
import { getCreatorApiUrl, readSummerConfig, } from "../config.js";
|
|
7
|
+
import { appendStoreJsonLine } from "../store.js";
|
|
8
|
+
import { readJsonResponse } from "../util/http.js";
|
|
8
9
|
export const CREATOR_API_CONTRACT = "summer.creator.v1";
|
|
9
10
|
const CREATOR_PUBLISH_PATH = "/api/creator/v1/publish";
|
|
10
11
|
const CREATOR_RELEASES_PATH = "/api/creator/v1/releases";
|
|
11
12
|
const REQUIRED_SCOPE = "publish";
|
|
12
13
|
const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
13
14
|
const VERSION = /^[A-Za-z0-9][A-Za-z0-9._-]{0,31}$/;
|
|
14
|
-
export const CREATOR_API_AUDIT = {
|
|
15
|
-
auditedAt: "2026-07-30",
|
|
16
|
-
repository: "SummerEngine/summercraft",
|
|
17
|
-
contract: CREATOR_API_CONTRACT,
|
|
18
|
-
credentialAudience: "summercraft-creator",
|
|
19
|
-
requiredServerScope: REQUIRED_SCOPE,
|
|
20
|
-
operations: {
|
|
21
|
-
publish: { supported: true, route: CREATOR_PUBLISH_PATH },
|
|
22
|
-
releases: { supported: true, route: CREATOR_RELEASES_PATH },
|
|
23
|
-
logs: { supported: false, route: null },
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
const LOGS_RECOVERY = "Recovery: Summercraft must first own a durable runtime-log source with retention, redaction, project/release authorization, and a versioned query route. No placeholder logs were returned.";
|
|
27
15
|
export class CreatorOperationError extends Error {
|
|
28
16
|
code;
|
|
29
17
|
operation;
|
|
@@ -55,7 +43,7 @@ async function resolveProjectId(explicit) {
|
|
|
55
43
|
async function requireCreatorCredential(operation) {
|
|
56
44
|
const token = await getCreatorToken();
|
|
57
45
|
if (!token) {
|
|
58
|
-
throw new CreatorOperationError("creator_token_required", operation, "Creator publishing needs a separate
|
|
46
|
+
throw new CreatorOperationError("creator_token_required", operation, "Creator publishing needs a separate Summer Platform creator API token.", 'Recovery: run "summer login --creator", mint a token with the exact "publish" scope in the opened browser page, and paste its one-time sc_ value. Your core Summer login will not be changed.');
|
|
59
47
|
}
|
|
60
48
|
const metadata = await getCredentialMetadata();
|
|
61
49
|
if (!metadata.creator?.scopes.includes(REQUIRED_SCOPE)) {
|
|
@@ -73,15 +61,12 @@ function recoveryForStatus(operation, status) {
|
|
|
73
61
|
if (status === 409 && operation === "publish") {
|
|
74
62
|
return "Recovery: read the server detail, bump an immutable version when required, then repeat the unconfirmed command to review the new exact target.";
|
|
75
63
|
}
|
|
76
|
-
return `Recovery: retry once; if it repeats, check creator.apiUrl and the
|
|
64
|
+
return `Recovery: retry once; if it repeats, check creator.apiUrl and the Summer Platform creator API health.`;
|
|
77
65
|
}
|
|
78
|
-
async function
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
payload = JSON.parse(text);
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
66
|
+
async function readCreatorResponse(response, operation) {
|
|
67
|
+
const { json, parsed } = await readJsonResponse(response);
|
|
68
|
+
const payload = json;
|
|
69
|
+
if (!parsed) {
|
|
85
70
|
throw new CreatorOperationError("creator_invalid_response", operation, `The creator API returned a non-JSON response (${response.status}).`, recoveryForStatus(operation, response.status), response.status);
|
|
86
71
|
}
|
|
87
72
|
if (!response.ok) {
|
|
@@ -116,7 +101,7 @@ async function creatorRequest(operation, path, token, deps, init = {}) {
|
|
|
116
101
|
catch (error) {
|
|
117
102
|
throw new CreatorOperationError("creator_network_failed", operation, `The creator API request failed: ${error instanceof Error ? error.message : String(error)}.`, "Recovery: check your network and creator.apiUrl, then retry. No successful release is being claimed.");
|
|
118
103
|
}
|
|
119
|
-
return
|
|
104
|
+
return readCreatorResponse(response, operation);
|
|
120
105
|
}
|
|
121
106
|
async function inspectArtifact(path) {
|
|
122
107
|
const artifactPath = resolve(path);
|
|
@@ -152,7 +137,7 @@ async function readManifest(path) {
|
|
|
152
137
|
}
|
|
153
138
|
function assertUploadUrl(value) {
|
|
154
139
|
if (typeof value !== "string") {
|
|
155
|
-
throw new CreatorOperationError("creator_invalid_response", "publish", "The prepare response did not contain an uploadUrl.", "Recovery: retry once; if it repeats, report the
|
|
140
|
+
throw new CreatorOperationError("creator_invalid_response", "publish", "The prepare response did not contain an uploadUrl.", "Recovery: retry once; if it repeats, report the Summer Platform creator API as unhealthy.");
|
|
156
141
|
}
|
|
157
142
|
let url;
|
|
158
143
|
try {
|
|
@@ -173,7 +158,7 @@ function assertUploadUrl(value) {
|
|
|
173
158
|
}
|
|
174
159
|
function assertUploadHeaders(value) {
|
|
175
160
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
176
|
-
throw new CreatorOperationError("creator_invalid_response", "publish", "The prepare response did not contain signed upload headers.", "Recovery: retry once; if it repeats, report the
|
|
161
|
+
throw new CreatorOperationError("creator_invalid_response", "publish", "The prepare response did not contain signed upload headers.", "Recovery: retry once; if it repeats, report the Summer Platform creator API as unhealthy.");
|
|
177
162
|
}
|
|
178
163
|
const headers = Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "string"));
|
|
179
164
|
if (headers["content-type"] !== "application/octet-stream" ||
|
|
@@ -212,7 +197,7 @@ export async function publishCreator(input, overrides = {}) {
|
|
|
212
197
|
(await readSummerConfig()).creator?.channel ||
|
|
213
198
|
"production";
|
|
214
199
|
if (channel !== "production") {
|
|
215
|
-
throw new CreatorOperationError("creator_channel_unsupported", "publish", `The
|
|
200
|
+
throw new CreatorOperationError("creator_channel_unsupported", "publish", `The Summer Platform creator API has no "${channel}" release channel.`, 'Recovery: use --channel production or run "summer config set creator.channel production". No release was created.');
|
|
216
201
|
}
|
|
217
202
|
const version = input.version?.trim();
|
|
218
203
|
if (!version || !VERSION.test(version)) {
|
|
@@ -387,7 +372,3 @@ export async function listCreatorReleases(input, overrides = {}) {
|
|
|
387
372
|
nextCursor: payload.nextCursor,
|
|
388
373
|
};
|
|
389
374
|
}
|
|
390
|
-
export async function readCreatorLogs(input) {
|
|
391
|
-
await resolveProjectId(input.projectId);
|
|
392
|
-
throw new CreatorOperationError("creator_backend_unavailable", "logs", "Summercraft does not have a durable creator runtime-log API.", LOGS_RECOVERY);
|
|
393
|
-
}
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
-
import { createRequire } from "node:module";
|
|
3
2
|
import { hostname, platform, release } from "node:os";
|
|
4
3
|
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
5
|
-
import { EngineApiClient } from "
|
|
6
|
-
import { shapeEngineLogResponse } from "
|
|
7
|
-
import { tildeify } from "
|
|
8
|
-
import { getMcpLogPath, readRecentMcpLogLines } from "
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
4
|
+
import { EngineApiClient } from "../api-client.js";
|
|
5
|
+
import { shapeEngineLogResponse } from "../log-filters.js";
|
|
6
|
+
import { tildeify } from "../format.js";
|
|
7
|
+
import { getMcpLogPath, readRecentMcpLogLines } from "../mcp-log.js";
|
|
8
|
+
import { redactLogLine, redactSensitive } from "../redact.js";
|
|
9
|
+
import { runDoctor } from "./doctor.js";
|
|
10
|
+
import { asRecord } from "../util/json.js";
|
|
11
|
+
import { sleep } from "../util/sleep.js";
|
|
12
|
+
import { TOOLKIT_VERSION as version } from "../version.js";
|
|
15
13
|
function errorMessage(error) {
|
|
16
14
|
return error instanceof Error ? error.message : String(error);
|
|
17
15
|
}
|
|
@@ -21,11 +19,6 @@ function timestampForFile(date) {
|
|
|
21
19
|
export function defaultDebugReportFilename(date = new Date()) {
|
|
22
20
|
return `summer-debug-report-${timestampForFile(date)}.md`;
|
|
23
21
|
}
|
|
24
|
-
function asRecord(value) {
|
|
25
|
-
return value && typeof value === "object" && !Array.isArray(value)
|
|
26
|
-
? value
|
|
27
|
-
: null;
|
|
28
|
-
}
|
|
29
22
|
function pickString(value, keys) {
|
|
30
23
|
const record = asRecord(value);
|
|
31
24
|
if (!record)
|
|
@@ -122,21 +115,9 @@ async function collectPlaySession(client, options) {
|
|
|
122
115
|
}
|
|
123
116
|
return session;
|
|
124
117
|
}
|
|
118
|
+
/** Debug reports also blank hostnames — a support artifact needs none. */
|
|
125
119
|
function redact(value) {
|
|
126
|
-
|
|
127
|
-
return value.map((item) => redact(item));
|
|
128
|
-
if (!value || typeof value !== "object")
|
|
129
|
-
return value;
|
|
130
|
-
const out = {};
|
|
131
|
-
for (const [key, nested] of Object.entries(value)) {
|
|
132
|
-
if (/token|secret|password|authorization|cookie|api[-_]?key|hostname/i.test(key)) {
|
|
133
|
-
out[key] = "[REDACTED]";
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
out[key] = redact(nested);
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return out;
|
|
120
|
+
return redactSensitive(value, { extraKeys: /hostname/i, strings: true });
|
|
140
121
|
}
|
|
141
122
|
export function redactDebugReport(report) {
|
|
142
123
|
return redact(report);
|
|
@@ -193,7 +174,7 @@ ${report.doctor ? jsonBlock(report.doctor) : "Doctor was skipped."}
|
|
|
193
174
|
|
|
194
175
|
Log path: ${tildeify(report.mcp.logPath)}
|
|
195
176
|
|
|
196
|
-
${report.mcp.recentLog.length > 0 ? `\`\`\`jsonl\n${report.mcp.recentLog.join("\n")}\n\`\`\`` : "No MCP lifecycle log entries found."}
|
|
177
|
+
${report.mcp.recentLog.length > 0 ? `\`\`\`jsonl\n${report.mcp.recentLog.map(redactLogLine).join("\n")}\n\`\`\`` : "No MCP lifecycle log entries found."}
|
|
197
178
|
|
|
198
179
|
## Engine Health
|
|
199
180
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ProjectMemorySummary } from "../../project-memory/project-memory.js";
|
|
2
2
|
export type DoctorStatus = "ok" | "warning" | "fail";
|
|
3
3
|
export interface DoctorCheck {
|
|
4
4
|
id: string;
|
|
@@ -20,7 +20,12 @@ interface DoctorOptions {
|
|
|
20
20
|
json?: boolean;
|
|
21
21
|
quiet?: boolean;
|
|
22
22
|
}
|
|
23
|
-
export declare const doctorCommand: Command;
|
|
24
23
|
export declare function runDoctor(options?: DoctorOptions): Promise<DoctorResult>;
|
|
24
|
+
export declare function checkLogin(): Promise<DoctorCheck>;
|
|
25
|
+
export declare function checkEngineInstall(): DoctorCheck;
|
|
26
|
+
/** The one-line Project Memory verdict: Markdown counts plus the template pin
|
|
27
|
+
* (`.summer/project.json` is memory too — the first fact a fresh agent
|
|
28
|
+
* needs). Exported for tests. */
|
|
29
|
+
export declare function describeProjectMemory(summary: ProjectMemorySummary): string;
|
|
25
30
|
export declare function printDoctorResult(result: DoctorResult): void;
|
|
26
31
|
export {};
|
|
@@ -1,50 +1,20 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
|
-
import { existsSync } from "fs";
|
|
3
|
-
import { createRequire } from "node:module";
|
|
4
|
-
import { platform } from "os";
|
|
5
|
-
import { Command } from "commander";
|
|
6
2
|
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
7
3
|
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
8
|
-
import { getAuthToken, getUserInfo } from "../
|
|
9
|
-
import {
|
|
10
|
-
import { checkEngineHealth, getApiPort, getApiToken } from "../
|
|
11
|
-
import {
|
|
12
|
-
import { getMcpLogPath } from "../
|
|
13
|
-
import { getProjectMemorySummary } from "
|
|
14
|
-
import { buildCliVersionCheck, buildSkillsVersionCheck, defaultSkillMarkerCandidates, fetchLatestRegistryVersion, } from "
|
|
15
|
-
|
|
16
|
-
const { version } = require("../../package.json");
|
|
4
|
+
import { getAuthToken, getUserInfo } from "../auth.js";
|
|
5
|
+
import { ENGINE_BIN_ENV, ENGINE_BINARY_ENV, findEngineBinary } from "../engine-install.js";
|
|
6
|
+
import { checkEngineHealth, getApiPort, getApiToken } from "../engine.js";
|
|
7
|
+
import { c, pad, sym, tildeify } from "../format.js";
|
|
8
|
+
import { getMcpLogPath } from "../mcp-log.js";
|
|
9
|
+
import { formatProjectPin, getProjectMemorySummary, } from "../../project-memory/project-memory.js";
|
|
10
|
+
import { buildCliVersionCheck, buildSkillsVersionCheck, defaultSkillMarkerCandidates, detectRecordedInstall, fetchLatestRegistryVersion, } from "../../installer/version-check.js";
|
|
11
|
+
import { TOOLKIT_VERSION as version } from "../version.js";
|
|
17
12
|
const MIN_EXPECTED_MCP_TOOLS = 50;
|
|
18
13
|
const REQUIRED_MCP_TOOLS = [
|
|
19
14
|
"summer_get_project_context",
|
|
20
15
|
"summer_generate_image",
|
|
21
16
|
"summer_create_debug_report",
|
|
22
17
|
];
|
|
23
|
-
const MAC_ENGINE_PATHS = [
|
|
24
|
-
"/Applications/Summer.app/Contents/MacOS/Summer",
|
|
25
|
-
`${process.env.HOME}/Applications/Summer.app/Contents/MacOS/Summer`,
|
|
26
|
-
];
|
|
27
|
-
const WIN_ENGINE_PATHS = [
|
|
28
|
-
`${process.env.LOCALAPPDATA}\\SummerEngine\\current\\Summer.exe`,
|
|
29
|
-
`${process.env.LOCALAPPDATA}\\Programs\\Summer Engine\\Summer.exe`,
|
|
30
|
-
`${process.env.PROGRAMFILES}\\Summer Engine\\Summer.exe`,
|
|
31
|
-
];
|
|
32
|
-
export const doctorCommand = new Command("doctor")
|
|
33
|
-
.description("Diagnose Node, login, engine, project memory, local API, and MCP registration")
|
|
34
|
-
.option("--json", "Print diagnostics as JSON")
|
|
35
|
-
.action(async (opts) => {
|
|
36
|
-
if (!opts.json) {
|
|
37
|
-
const { createRequire: req } = await import("node:module");
|
|
38
|
-
const ver = req(import.meta.url)("../../package.json").version;
|
|
39
|
-
console.log("");
|
|
40
|
-
console.log(brandLine(ver));
|
|
41
|
-
console.log("");
|
|
42
|
-
}
|
|
43
|
-
const result = await runDoctor({ json: Boolean(opts.json) });
|
|
44
|
-
if (!result.ok) {
|
|
45
|
-
process.exit(1);
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
18
|
export async function runDoctor(options = {}) {
|
|
49
19
|
const checks = [];
|
|
50
20
|
checks.push(checkNodeVersion());
|
|
@@ -55,10 +25,9 @@ export async function runDoctor(options = {}) {
|
|
|
55
25
|
message: `v${version}`,
|
|
56
26
|
});
|
|
57
27
|
checks.push(await checkCliVersionCurrent());
|
|
58
|
-
checks.push(checkSkillsVersion());
|
|
28
|
+
checks.push(await checkSkillsVersion());
|
|
59
29
|
checks.push(await checkLogin());
|
|
60
30
|
checks.push(checkEngineInstall());
|
|
61
|
-
checks.push(await checkGitForCheckpoints());
|
|
62
31
|
checks.push(await checkLocalApi());
|
|
63
32
|
checks.push(await checkProjectMemory());
|
|
64
33
|
checks.push(await checkMcpBoot());
|
|
@@ -105,10 +74,17 @@ async function checkCliVersionCurrent() {
|
|
|
105
74
|
details: result.details,
|
|
106
75
|
};
|
|
107
76
|
}
|
|
108
|
-
|
|
109
|
-
|
|
77
|
+
/** Stale skills are a warning, never a failure (TESTING.md §d: only failures
|
|
78
|
+
* exit 1). The recommended refresh follows how the agent's MCP entry was
|
|
79
|
+
* recorded by `summer setup`: a `--local-dev` link gets the local-dev form
|
|
80
|
+
* so the fix does not replace the checkout with the published package. */
|
|
81
|
+
async function checkSkillsVersion() {
|
|
82
|
+
const registry = await fetchLatestRegistryVersion();
|
|
83
|
+
const result = await buildSkillsVersionCheck({
|
|
110
84
|
installedCliVersion: version,
|
|
111
85
|
candidates: defaultSkillMarkerCandidates(),
|
|
86
|
+
recordedInstall: detectRecordedInstall,
|
|
87
|
+
...(registry.ok ? { latestRegistryVersion: registry.version } : {}),
|
|
112
88
|
});
|
|
113
89
|
return {
|
|
114
90
|
id: "skills-version-stale",
|
|
@@ -118,7 +94,7 @@ function checkSkillsVersion() {
|
|
|
118
94
|
details: result.details,
|
|
119
95
|
};
|
|
120
96
|
}
|
|
121
|
-
async function checkLogin() {
|
|
97
|
+
export async function checkLogin() {
|
|
122
98
|
const token = await getAuthToken();
|
|
123
99
|
const user = await getUserInfo();
|
|
124
100
|
if (!token) {
|
|
@@ -126,7 +102,15 @@ async function checkLogin() {
|
|
|
126
102
|
id: "login",
|
|
127
103
|
label: "Login",
|
|
128
104
|
status: "warning",
|
|
129
|
-
message: "not signed in (run: summer login)",
|
|
105
|
+
message: "not signed in (run: summer login — only gateway features need it; engine tools work without)",
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (process.env.SUMMER_TOKEN?.trim()) {
|
|
109
|
+
return {
|
|
110
|
+
id: "login",
|
|
111
|
+
label: "Login",
|
|
112
|
+
status: "ok",
|
|
113
|
+
message: "token from SUMMER_TOKEN env",
|
|
130
114
|
};
|
|
131
115
|
}
|
|
132
116
|
return {
|
|
@@ -136,7 +120,7 @@ async function checkLogin() {
|
|
|
136
120
|
message: user ? user.email : "signed in",
|
|
137
121
|
};
|
|
138
122
|
}
|
|
139
|
-
function checkEngineInstall() {
|
|
123
|
+
export function checkEngineInstall() {
|
|
140
124
|
const binary = findEngineBinary();
|
|
141
125
|
if (binary) {
|
|
142
126
|
// Shorten /Applications/Summer.app/Contents/MacOS/Summer -> /Applications/Summer.app
|
|
@@ -153,24 +137,7 @@ function checkEngineInstall() {
|
|
|
153
137
|
id: "engine-install",
|
|
154
138
|
label: "Engine",
|
|
155
139
|
status: "warning",
|
|
156
|
-
message:
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
async function checkGitForCheckpoints() {
|
|
160
|
-
const available = await isGitAvailable();
|
|
161
|
-
if (available) {
|
|
162
|
-
return {
|
|
163
|
-
id: "git",
|
|
164
|
-
label: "Git (cloud checkpoints)",
|
|
165
|
-
status: "ok",
|
|
166
|
-
message: "git found on PATH",
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
return {
|
|
170
|
-
id: "git",
|
|
171
|
-
label: "Git (cloud checkpoints)",
|
|
172
|
-
status: "warning",
|
|
173
|
-
message: "git not found; Summer Cloud sync needs git for pre-sync safety checkpoints",
|
|
140
|
+
message: `not installed (run: summer install, or set ${ENGINE_BIN_ENV} / ${ENGINE_BINARY_ENV} to an existing binary)`,
|
|
174
141
|
};
|
|
175
142
|
}
|
|
176
143
|
async function checkLocalApi() {
|
|
@@ -237,15 +204,29 @@ async function checkProjectMemory() {
|
|
|
237
204
|
id: "project-memory",
|
|
238
205
|
label: "Project Memory",
|
|
239
206
|
status: "ok",
|
|
240
|
-
message:
|
|
207
|
+
message: describeProjectMemory(summary),
|
|
241
208
|
details: {
|
|
242
209
|
projectPath: health.project_path,
|
|
243
210
|
files: summary.files.length,
|
|
244
211
|
memoryFiles: summary.structured.fileCount,
|
|
245
212
|
locked: summary.structured.lockedCount,
|
|
213
|
+
pin: summary.pin,
|
|
214
|
+
...(summary.pinError ? { pinError: summary.pinError } : {}),
|
|
246
215
|
},
|
|
247
216
|
};
|
|
248
217
|
}
|
|
218
|
+
/** The one-line Project Memory verdict: Markdown counts plus the template pin
|
|
219
|
+
* (`.summer/project.json` is memory too — the first fact a fresh agent
|
|
220
|
+
* needs). Exported for tests. */
|
|
221
|
+
export function describeProjectMemory(summary) {
|
|
222
|
+
const pin = formatProjectPin(summary.pin);
|
|
223
|
+
const pinPart = summary.pinError
|
|
224
|
+
? `pin unreadable (${summary.pinError})`
|
|
225
|
+
: pin
|
|
226
|
+
? `pin ${pin}`
|
|
227
|
+
: "no pin";
|
|
228
|
+
return `${summary.files.length} files, ${summary.structured.fileCount} memory, ${summary.structured.lockedCount} locked, ${pinPart}`;
|
|
229
|
+
}
|
|
249
230
|
async function checkMcpBoot() {
|
|
250
231
|
const resolved = resolveCurrentMcpCommand();
|
|
251
232
|
if (!resolved) {
|
|
@@ -429,7 +410,8 @@ function summarizeChecks(checks) {
|
|
|
429
410
|
export function printDoctorResult(result) {
|
|
430
411
|
console.log(c.bold("Doctor"));
|
|
431
412
|
console.log("");
|
|
432
|
-
|
|
413
|
+
// Widest label + 2 so long labels ("CLI up to date") keep their gap.
|
|
414
|
+
const labelWidth = result.checks.reduce((w, check) => Math.max(w, check.label.length), 0) + 2;
|
|
433
415
|
for (const check of result.checks) {
|
|
434
416
|
const mark = check.status === "ok"
|
|
435
417
|
? sym.ok()
|
|
@@ -449,14 +431,6 @@ export function printDoctorResult(result) {
|
|
|
449
431
|
console.log(c.green("Everything's wired up."));
|
|
450
432
|
}
|
|
451
433
|
}
|
|
452
|
-
function findEngineBinary() {
|
|
453
|
-
const paths = platform() === "darwin" ? MAC_ENGINE_PATHS : WIN_ENGINE_PATHS;
|
|
454
|
-
for (const path of paths) {
|
|
455
|
-
if (path && existsSync(path))
|
|
456
|
-
return path;
|
|
457
|
-
}
|
|
458
|
-
return null;
|
|
459
|
-
}
|
|
460
434
|
function trimOutput(output) {
|
|
461
435
|
return {
|
|
462
436
|
stdout: output.stdout.trim().slice(0, 500),
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* engine-fallbacks — the `engine_lacks_op` fallback sentences, ONE copy for
|
|
3
|
+
* every face (src/mcp/tools/spatial-tools.ts, src/mcp/tools/perception-tools.ts,
|
|
4
|
+
* src/core/capabilities/tool-dispatch.ts). Each names what an agent should do
|
|
5
|
+
* on an engine build that lacks the op, whether the capability pre-flight
|
|
6
|
+
* refused before sending (missingEngineOpResult) or the engine answered
|
|
7
|
+
* "unknown op" (withOldEngineHint) — the sentence is identical either way.
|
|
8
|
+
*
|
|
9
|
+
* Rule (E2E 2026-09-03 F-16): a fallback names ONLY tools every shipped engine
|
|
10
|
+
* has — summer_get_scene_tree, summer_inspect_node, summer_inspect_resource,
|
|
11
|
+
* summer_set_prop, summer_screenshot, a RunVerification probe.
|
|
12
|
+
* summer_world_snapshot is itself engine_lacks_op on every shipped build, so a
|
|
13
|
+
* fallback that routes through it sends the agent from one dead end to the
|
|
14
|
+
* next. The scripting fallbacks live with their op builders in ./scene-script.ts.
|
|
15
|
+
*/
|
|
16
|
+
export declare const WORLD_SNAPSHOT_FALLBACK = "read structure with summer_get_scene_tree (pass depth) and verify visually with summer_screenshot";
|
|
17
|
+
export declare const SNAPSHOT_DIFF_FALLBACK = "re-read with summer_get_scene_tree (pass depth) and summer_inspect_node and compare against your earlier read yourself";
|
|
18
|
+
export declare const RUNTIME_TREE_FALLBACK = "probe runtime state with a RunVerification probe (dump_tree/report \u2014 see the playbook's rawOpsViaBatch)";
|
|
19
|
+
export declare const RUNTIME_NODE_FALLBACK = "probe the node from a RunVerification probe (report(key, value) \u2014 see the playbook's rawOpsViaBatch)";
|
|
20
|
+
export declare const TEST_PLACEMENT_FALLBACK = "list the subject and its neighbours with summer_get_scene_tree, read their positions and mesh/shape sizes with summer_inspect_node (summer_inspect_resource for mesh/shape extents), judge clearance from those, then verify with summer_screenshot";
|
|
21
|
+
export declare const SNAP_TO_SURFACE_FALLBACK = "read the support's position and mesh/shape size with summer_inspect_node / summer_inspect_resource, set the subject's position with summer_set_prop so its bottom sits on the support's top, and verify with summer_screenshot";
|
|
22
|
+
export declare const ALIGN_DISTRIBUTE_FALLBACK = "compute the shared anchor or spacing from the subjects' positions and sizes (summer_inspect_node / summer_inspect_resource) and set each subject's position with summer_set_prop (or one summer_run_editor_script)";
|
|
23
|
+
export declare const NAVIGATION_PROBE_FALLBACK = "probe reachability from a RunVerification probe (NavigationServer3D.map_get_path \u2014 see the playbook's rawOpsViaBatch)";
|
|
24
|
+
export declare const STARCAST_FALLBACK = "read the subject and its neighbours with summer_get_scene_tree + summer_inspect_node and judge support, contact, and clearance from their positions and sizes, then verify with summer_screenshot";
|
|
25
|
+
/** Every fallback, for the parity test: none may mention summer_world_snapshot. */
|
|
26
|
+
export declare const ENGINE_OP_FALLBACKS: Readonly<Record<string, string>>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* engine-fallbacks — the `engine_lacks_op` fallback sentences, ONE copy for
|
|
3
|
+
* every face (src/mcp/tools/spatial-tools.ts, src/mcp/tools/perception-tools.ts,
|
|
4
|
+
* src/core/capabilities/tool-dispatch.ts). Each names what an agent should do
|
|
5
|
+
* on an engine build that lacks the op, whether the capability pre-flight
|
|
6
|
+
* refused before sending (missingEngineOpResult) or the engine answered
|
|
7
|
+
* "unknown op" (withOldEngineHint) — the sentence is identical either way.
|
|
8
|
+
*
|
|
9
|
+
* Rule (E2E 2026-09-03 F-16): a fallback names ONLY tools every shipped engine
|
|
10
|
+
* has — summer_get_scene_tree, summer_inspect_node, summer_inspect_resource,
|
|
11
|
+
* summer_set_prop, summer_screenshot, a RunVerification probe.
|
|
12
|
+
* summer_world_snapshot is itself engine_lacks_op on every shipped build, so a
|
|
13
|
+
* fallback that routes through it sends the agent from one dead end to the
|
|
14
|
+
* next. The scripting fallbacks live with their op builders in ./scene-script.ts.
|
|
15
|
+
*/
|
|
16
|
+
export const WORLD_SNAPSHOT_FALLBACK = "read structure with summer_get_scene_tree (pass depth) and verify visually with summer_screenshot";
|
|
17
|
+
export const SNAPSHOT_DIFF_FALLBACK = "re-read with summer_get_scene_tree (pass depth) and summer_inspect_node and compare against your earlier read yourself";
|
|
18
|
+
export const RUNTIME_TREE_FALLBACK = "probe runtime state with a RunVerification probe (dump_tree/report — see the playbook's rawOpsViaBatch)";
|
|
19
|
+
export const RUNTIME_NODE_FALLBACK = "probe the node from a RunVerification probe (report(key, value) — see the playbook's rawOpsViaBatch)";
|
|
20
|
+
export const TEST_PLACEMENT_FALLBACK = "list the subject and its neighbours with summer_get_scene_tree, read their positions and mesh/shape sizes with summer_inspect_node (summer_inspect_resource for mesh/shape extents), judge clearance from those, then verify with summer_screenshot";
|
|
21
|
+
export const SNAP_TO_SURFACE_FALLBACK = "read the support's position and mesh/shape size with summer_inspect_node / summer_inspect_resource, set the subject's position with summer_set_prop so its bottom sits on the support's top, and verify with summer_screenshot";
|
|
22
|
+
export const ALIGN_DISTRIBUTE_FALLBACK = "compute the shared anchor or spacing from the subjects' positions and sizes (summer_inspect_node / summer_inspect_resource) and set each subject's position with summer_set_prop (or one summer_run_editor_script)";
|
|
23
|
+
export const NAVIGATION_PROBE_FALLBACK = "probe reachability from a RunVerification probe (NavigationServer3D.map_get_path — see the playbook's rawOpsViaBatch)";
|
|
24
|
+
export const STARCAST_FALLBACK = "read the subject and its neighbours with summer_get_scene_tree + summer_inspect_node and judge support, contact, and clearance from their positions and sizes, then verify with summer_screenshot";
|
|
25
|
+
/** Every fallback, for the parity test: none may mention summer_world_snapshot. */
|
|
26
|
+
export const ENGINE_OP_FALLBACKS = {
|
|
27
|
+
GetWorldSnapshot: WORLD_SNAPSHOT_FALLBACK,
|
|
28
|
+
DiffWorldSnapshot: SNAPSHOT_DIFF_FALLBACK,
|
|
29
|
+
GetRuntimeSceneTree: RUNTIME_TREE_FALLBACK,
|
|
30
|
+
GetRuntimeNode: RUNTIME_NODE_FALLBACK,
|
|
31
|
+
TestPlacement3D: TEST_PLACEMENT_FALLBACK,
|
|
32
|
+
SnapToSurface: SNAP_TO_SURFACE_FALLBACK,
|
|
33
|
+
AlignDistribute3D: ALIGN_DISTRIBUTE_FALLBACK,
|
|
34
|
+
NavigationProbe3D: NAVIGATION_PROBE_FALLBACK,
|
|
35
|
+
Starcast3D: STARCAST_FALLBACK,
|
|
36
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Engine op helpers shared by both faces — the MCP tools (src/mcp/tools/*) and
|
|
3
|
+
* the CLI dispatch table (src/core/capabilities/tool-dispatch.ts). ONE copy of
|
|
4
|
+
* the scene-mutation single-op contract and of the guarded-file safety checks.
|
|
5
|
+
*/
|
|
6
|
+
import type { EngineApiClient } from "../api-client.js";
|
|
7
|
+
import { type JsonRecord } from "../util/json.js";
|
|
8
|
+
export declare function isSingleOnlyOp(kind: string, singleOnly: ReadonlySet<string>): boolean;
|
|
9
|
+
/** Append the transaction-boundary SaveScene (or validate the caller's). */
|
|
10
|
+
export declare function sceneMutationOps(ops: JsonRecord[]): JsonRecord[];
|
|
11
|
+
/** Split an op list into sequential engine requests: consecutive batchable ops
|
|
12
|
+
* stay grouped, each single-only op becomes its own request. Order preserved. */
|
|
13
|
+
export declare function chunkOpsForDispatch(ops: JsonRecord[], singleOnly: ReadonlySet<string>): JsonRecord[][];
|
|
14
|
+
/** Execute an op list as sequential engine requests honoring the single-op
|
|
15
|
+
* dispatch contract. Receipts from every request are preserved and merged, so
|
|
16
|
+
* an op that applied followed by one that failed is reported honestly instead
|
|
17
|
+
* of masked. */
|
|
18
|
+
export declare function executeOpsChunked(send: (chunk: JsonRecord[]) => Promise<unknown>, ops: JsonRecord[], singleOnly: ReadonlySet<string>): Promise<unknown>;
|
|
19
|
+
/** Scene mutation entry point: appends the transaction-boundary SaveScene, then
|
|
20
|
+
* dispatches with the single-op contract (mutations batch together, SaveScene
|
|
21
|
+
* and other single-only ops travel alone). */
|
|
22
|
+
export declare function executeSceneMutation(client: EngineApiClient, scenePath: string, ops: JsonRecord[], options?: JsonRecord): Promise<unknown>;
|
|
23
|
+
/** Normalize a project path; refuses anything that is not a traversal-free res:// path. */
|
|
24
|
+
export declare function safeProjectPath(path: string): string;
|
|
25
|
+
export declare function validSha256(value: unknown): value is string;
|
|
26
|
+
/** Validate a ReadFile receipt for a safe text mutation: text content, not
|
|
27
|
+
* truncated, with a full-file sha256 the follow-up WriteFile can guard on. */
|
|
28
|
+
export declare function readTextPayload(result: unknown): {
|
|
29
|
+
content: string;
|
|
30
|
+
sha256: string;
|
|
31
|
+
size?: number;
|
|
32
|
+
};
|
|
33
|
+
export declare function occurrenceCount(content: string, needle: string): number;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { resolveSingleOnlyOps } from "../capability-skew.js";
|
|
2
|
+
import { ToolInputError } from "../tool-errors.js";
|
|
3
|
+
import { asRecord } from "../util/json.js";
|
|
4
|
+
import { extractOpError } from "./engine-receipt.js";
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
// Scene-mutation dispatch. The engine rejects multi-op batches containing
|
|
7
|
+
// single-only ops wholesale, and every scene mutation batch ends in exactly one
|
|
8
|
+
// SaveScene. Single-only classification comes from the engine's /api/health
|
|
9
|
+
// advert when present, else core/capability-skew FALLBACK_SINGLE_ONLY_OPS.
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
export function isSingleOnlyOp(kind, singleOnly) {
|
|
12
|
+
return singleOnly.has(kind) || kind.startsWith("Git");
|
|
13
|
+
}
|
|
14
|
+
/** Append the transaction-boundary SaveScene (or validate the caller's). */
|
|
15
|
+
export function sceneMutationOps(ops) {
|
|
16
|
+
const saveIndexes = ops
|
|
17
|
+
.map((op, index) => (op.op === "SaveScene" ? index : -1))
|
|
18
|
+
.filter((index) => index >= 0);
|
|
19
|
+
if (saveIndexes.length > 1) {
|
|
20
|
+
throw new ToolInputError("A scene mutation batch may contain only one SaveScene");
|
|
21
|
+
}
|
|
22
|
+
if (saveIndexes.length === 1) {
|
|
23
|
+
if (saveIndexes[0] !== ops.length - 1) {
|
|
24
|
+
throw new ToolInputError("SaveScene must be the final operation in a scene mutation batch");
|
|
25
|
+
}
|
|
26
|
+
return ops;
|
|
27
|
+
}
|
|
28
|
+
return [...ops, { op: "SaveScene" }];
|
|
29
|
+
}
|
|
30
|
+
/** Split an op list into sequential engine requests: consecutive batchable ops
|
|
31
|
+
* stay grouped, each single-only op becomes its own request. Order preserved. */
|
|
32
|
+
export function chunkOpsForDispatch(ops, singleOnly) {
|
|
33
|
+
const chunks = [];
|
|
34
|
+
let current = [];
|
|
35
|
+
for (const op of ops) {
|
|
36
|
+
if (isSingleOnlyOp(String(op.op ?? ""), singleOnly)) {
|
|
37
|
+
if (current.length > 0) {
|
|
38
|
+
chunks.push(current);
|
|
39
|
+
current = [];
|
|
40
|
+
}
|
|
41
|
+
chunks.push([op]);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
current.push(op);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (current.length > 0)
|
|
48
|
+
chunks.push(current);
|
|
49
|
+
return chunks;
|
|
50
|
+
}
|
|
51
|
+
/** Execute an op list as sequential engine requests honoring the single-op
|
|
52
|
+
* dispatch contract. Receipts from every request are preserved and merged, so
|
|
53
|
+
* an op that applied followed by one that failed is reported honestly instead
|
|
54
|
+
* of masked. */
|
|
55
|
+
export async function executeOpsChunked(send, ops, singleOnly) {
|
|
56
|
+
const chunks = chunkOpsForDispatch(ops, singleOnly);
|
|
57
|
+
if (chunks.length === 1)
|
|
58
|
+
return send(chunks[0]);
|
|
59
|
+
const receipts = [];
|
|
60
|
+
const combinedResults = [];
|
|
61
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
62
|
+
const receipt = await send(chunks[i]);
|
|
63
|
+
receipts.push(receipt);
|
|
64
|
+
const envelope = (receipt ?? {});
|
|
65
|
+
if (Array.isArray(envelope.results)) {
|
|
66
|
+
combinedResults.push(...envelope.results);
|
|
67
|
+
}
|
|
68
|
+
if (extractOpError(receipt)) {
|
|
69
|
+
const failedKind = String(chunks[i][0]?.op ?? "batch");
|
|
70
|
+
const appliedOps = chunks.slice(0, i).flat().map((op) => String(op.op ?? ""));
|
|
71
|
+
const notSent = chunks.slice(i + 1).flat().map((op) => String(op.op ?? ""));
|
|
72
|
+
const baseError = (typeof envelope.error === "string" && envelope.error) || `Engine request failed (${failedKind}).`;
|
|
73
|
+
const honestError = appliedOps.length > 0
|
|
74
|
+
? `${baseError} NOTE: ${appliedOps.length} earlier op(s) already applied (${appliedOps.join(", ")})` +
|
|
75
|
+
(failedKind === "SaveScene"
|
|
76
|
+
? " — the scene is modified in the editor but NOT saved to disk. Fix the problem, then call summer_save_scene."
|
|
77
|
+
: ".") +
|
|
78
|
+
(notSent.length > 0 ? ` Not sent: ${notSent.join(", ")}.` : "")
|
|
79
|
+
: baseError;
|
|
80
|
+
return {
|
|
81
|
+
...envelope,
|
|
82
|
+
error: honestError,
|
|
83
|
+
results: combinedResults,
|
|
84
|
+
receipts,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const last = (receipts[receipts.length - 1] ?? {});
|
|
89
|
+
return { ...last, results: combinedResults, requests: chunks.length, receipts };
|
|
90
|
+
}
|
|
91
|
+
/** Scene mutation entry point: appends the transaction-boundary SaveScene, then
|
|
92
|
+
* dispatches with the single-op contract (mutations batch together, SaveScene
|
|
93
|
+
* and other single-only ops travel alone). */
|
|
94
|
+
export function executeSceneMutation(client, scenePath, ops, options) {
|
|
95
|
+
return executeOpsChunked((chunk) => client.executeIdentityBoundOps(chunk, { ...(options ?? {}), scenePath }), sceneMutationOps(ops), resolveSingleOnlyOps(client));
|
|
96
|
+
}
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
// Guarded file helpers: fail-closed writes, sha256 receipts.
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
/** Normalize a project path; refuses anything that is not a traversal-free res:// path. */
|
|
101
|
+
export function safeProjectPath(path) {
|
|
102
|
+
const normalized = path.trim().replace(/\\/g, "/");
|
|
103
|
+
if (!normalized.startsWith("res://") || normalized.includes("..")) {
|
|
104
|
+
throw new ToolInputError("File path must be a traversal-free res:// project path.");
|
|
105
|
+
}
|
|
106
|
+
return normalized;
|
|
107
|
+
}
|
|
108
|
+
export function validSha256(value) {
|
|
109
|
+
return typeof value === "string" && /^[0-9a-f]{64}$/i.test(value);
|
|
110
|
+
}
|
|
111
|
+
/** Validate a ReadFile receipt for a safe text mutation: text content, not
|
|
112
|
+
* truncated, with a full-file sha256 the follow-up WriteFile can guard on. */
|
|
113
|
+
export function readTextPayload(result) {
|
|
114
|
+
const root = asRecord(result);
|
|
115
|
+
const data = asRecord(root?.data);
|
|
116
|
+
if (root?.ok === false) {
|
|
117
|
+
throw new Error(String(root.error ?? "Engine could not read the file."));
|
|
118
|
+
}
|
|
119
|
+
if (data?.encoding === "binary" || typeof data?.content !== "string") {
|
|
120
|
+
throw new Error("Safe text mutation refused: the engine did not return text content.");
|
|
121
|
+
}
|
|
122
|
+
if (data.truncated === true) {
|
|
123
|
+
throw new Error("Safe text mutation refused: the file exceeds the 1 MB read limit.");
|
|
124
|
+
}
|
|
125
|
+
const sha256 = typeof data.sha256 === "string" ? data.sha256 : undefined;
|
|
126
|
+
if (!validSha256(sha256)) {
|
|
127
|
+
throw new Error("Safe text mutation refused: the engine did not return a full-file sha256 receipt.");
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
content: data.content,
|
|
131
|
+
sha256,
|
|
132
|
+
size: typeof data.size === "number" ? data.size : undefined,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export function occurrenceCount(content, needle) {
|
|
136
|
+
let count = 0;
|
|
137
|
+
let offset = 0;
|
|
138
|
+
while (true) {
|
|
139
|
+
const index = content.indexOf(needle, offset);
|
|
140
|
+
if (index < 0)
|
|
141
|
+
return count;
|
|
142
|
+
count++;
|
|
143
|
+
offset = index + needle.length;
|
|
144
|
+
}
|
|
145
|
+
}
|