summer-engine 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +131 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +159 -391
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/{commands → cli/commands}/setup.js +43 -89
- package/dist/{commands → cli/commands}/skills.js +85 -222
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +47 -0
- package/dist/core/skills-registry.js +83 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/{lib → installer}/agent-config.d.ts +20 -1
- package/dist/{lib → installer}/agent-config.js +138 -24
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +146 -0
- package/dist/installer/skill-locations.d.ts +45 -0
- package/dist/installer/skill-locations.js +170 -0
- package/dist/installer/version-check.d.ts +174 -0
- package/dist/{lib → installer}/version-check.js +173 -42
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +70 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/cline/README.md +13 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +16 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/opencode/README.md +15 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +13 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +13 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +22 -16
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-registry.json +851 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/status.js +0 -46
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
- /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -1,12 +1,102 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { withEngine } from "./with-engine.js";
|
|
2
|
+
import { withEngine, missingEngineOpResult, withOldEngineHint } from "./with-engine.js";
|
|
3
|
+
import { withFailureReasonHint } from "./perception-tools.js";
|
|
4
|
+
import { analyzedSnapshot, captureGame, captureScene, captureViewport, VIEWPORT_RECAPTURE_DELAY_MS, } from "../../core/capabilities/capture.js";
|
|
5
|
+
import { describeFlatFrame } from "../../core/capabilities/frame-quality.js";
|
|
6
|
+
import { CAMERA_BOOKMARK_ACTIONS, CAMERA_BOOKMARK_FALLBACK, SCREENSHOT_FRAMINGS, MAX_MARKS_CAP, buildCameraBookmarkOp, buildScenePreviewInput, formatSceneMarks, isFixedPoseFraming, readCameraPose, readSceneMarks, } from "../../core/capabilities/camera-view.js";
|
|
7
|
+
// The capture path (content check, single viewport recapture, scene-kind read
|
|
8
|
+
// for the no-camera confession) is ONE copy in core/capabilities/capture.ts,
|
|
9
|
+
// shared with the CLI face; re-exported so tests and callers keep this door.
|
|
10
|
+
export { analyzedSnapshot, captureScene, captureViewport, VIEWPORT_RECAPTURE_DELAY_MS };
|
|
3
11
|
/**
|
|
4
12
|
* Visual capture tools. Unlike the in-product chat agent (a text-only "brain"
|
|
5
13
|
* that needs a separate vision model to describe frames for it), an MCP client
|
|
6
14
|
* like Claude Code can SEE images directly. So we hand the raw engine frame back
|
|
7
15
|
* as an MCP image content block — no vision-model prepass, no paraphrase. The
|
|
8
16
|
* model reviews the actual pixels.
|
|
17
|
+
*
|
|
18
|
+
* Frame honesty (E2E 2026-09-03, F-01 / F-05) is decided in
|
|
19
|
+
* core/capabilities/capture.ts (frame content check + one automatic viewport
|
|
20
|
+
* recapture; scene kind for the no-camera confession). This module only
|
|
21
|
+
* renders the caption from those fields; the CLI face prints them as JSON.
|
|
22
|
+
*
|
|
23
|
+
* perception adds stable viewpoints: camera bookmarks
|
|
24
|
+
* (summer_camera_bookmark, persisted in the project) and the fixed-pose
|
|
25
|
+
* framings "free" / "bookmark" plus the Set-of-Mark overlay on
|
|
26
|
+
* summer_screenshot target:"scene". Older engines resolve the new framings to
|
|
27
|
+
* a preset and echo it — the caption confesses that instead of letting a
|
|
28
|
+
* preset render pass as a pose-stable comparison.
|
|
9
29
|
*/
|
|
30
|
+
function viewportLabel(snap) {
|
|
31
|
+
const meta = snap.metadata;
|
|
32
|
+
const surface = typeof meta?.source_surface === "string" ? meta.source_surface : "";
|
|
33
|
+
if (surface === "editor_2d_subviewport_texture")
|
|
34
|
+
return "Editor viewport (2D tab)";
|
|
35
|
+
if (surface === "editor_3d_subviewport_texture")
|
|
36
|
+
return "Editor viewport (3D tab)";
|
|
37
|
+
return "Editor viewport";
|
|
38
|
+
}
|
|
39
|
+
const BLANK_VIEWPORT_ADVICE = "The engine reads the editor viewport texture as-is; right after a tab switch or a scene mutation it may not have been redrawn yet. This frame is NOT evidence about lights, cameras, materials, or scene content — do not fix anything based on it. Wait a moment and call summer_screenshot again (switching the editor tab or nudging the view forces a redraw), verify structure with summer_get_scene_tree / summer_inspect_node, or render the saved scene with target:\"scene\".";
|
|
40
|
+
/** The first per-op result inside an envelope (or the envelope itself). */
|
|
41
|
+
function firstOpResult(result) {
|
|
42
|
+
if (!result || typeof result !== "object")
|
|
43
|
+
return {};
|
|
44
|
+
const envelope = result;
|
|
45
|
+
const first = Array.isArray(envelope.results) ? envelope.results[0] : undefined;
|
|
46
|
+
return first && typeof first === "object" ? first : envelope;
|
|
47
|
+
}
|
|
48
|
+
/** Teach the engine's bookmark failure_reasons; `available` names ride along
|
|
49
|
+
* on not_found so the model can pick a real one without a second call. */
|
|
50
|
+
function teachBookmarkFailure(result) {
|
|
51
|
+
const failed = firstOpResult(result);
|
|
52
|
+
const available = Array.isArray(failed.available)
|
|
53
|
+
? failed.available.filter((n) => typeof n === "string")
|
|
54
|
+
: [];
|
|
55
|
+
const availableText = available.length
|
|
56
|
+
? ` Saved bookmarks: ${available.join(", ")}.`
|
|
57
|
+
: " No bookmarks are saved yet — save one with action:\"save\".";
|
|
58
|
+
return withFailureReasonHint(result, {
|
|
59
|
+
not_found: `No bookmark by that name.${availableText}`,
|
|
60
|
+
no_editor_camera: "No pose was given and the editor has no 3D viewport camera to capture (2D scene, or the 3D editor is not open). Pass position and look_at explicitly (\"Vector3(x, y, z)\" literals), or open the 3D viewport on the scene first.",
|
|
61
|
+
bad_args: "Check the arguments: name is 1-64 of A-Z a-z 0-9 _ -; position and look_at are \"Vector3(x, y, z)\" literals given together and must differ; fov is 1..179.",
|
|
62
|
+
io_failed: "res://.summer/camera_bookmarks.json could not be read or written (or exists but is not a JSON object — it was NOT overwritten). Inspect it with summer_read_file path:\"res://.summer/camera_bookmarks.json\".",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/** Success prose for the bookmark tool: what happened and how to reuse it. */
|
|
66
|
+
function describeBookmarkResult(action, result) {
|
|
67
|
+
const data = firstOpResult(result);
|
|
68
|
+
if (action === "save") {
|
|
69
|
+
const name = typeof data.name === "string" ? data.name : "?";
|
|
70
|
+
const source = typeof data.pose_source === "string" ? data.pose_source : "unknown";
|
|
71
|
+
const overwritten = data.overwritten === true ? " (replaced an existing bookmark of the same name)" : "";
|
|
72
|
+
return (`Saved camera bookmark "${name}" from ${source === "editor_viewport" ? "the current editor 3D viewport camera" : "the explicit pose"}${overwritten}. ` +
|
|
73
|
+
`Reuse it for a pose-stable frame: summer_screenshot target:"scene" framing:"bookmark" bookmark_name:"${name}" — every capture from it lines up with the last, so before/after comparisons are real.`);
|
|
74
|
+
}
|
|
75
|
+
if (action === "delete") {
|
|
76
|
+
const name = typeof data.name === "string" ? data.name : "?";
|
|
77
|
+
const remaining = Array.isArray(data.remaining) ? data.remaining.filter((n) => typeof n === "string") : null;
|
|
78
|
+
return `Deleted camera bookmark "${name}".${remaining ? (remaining.length ? ` Remaining: ${remaining.join(", ")}.` : " No bookmarks remain.") : ""}`;
|
|
79
|
+
}
|
|
80
|
+
const names = Array.isArray(data.names) ? data.names.filter((n) => typeof n === "string") : [];
|
|
81
|
+
if (!names.length) {
|
|
82
|
+
return 'No camera bookmarks saved in this project. Save one with action:"save" (omit position/look_at to capture the current editor viewport camera).';
|
|
83
|
+
}
|
|
84
|
+
return `${names.length} camera bookmark(s): ${names.join(", ")}. Use one with summer_screenshot target:"scene" framing:"bookmark" bookmark_name:"<name>".`;
|
|
85
|
+
}
|
|
86
|
+
/** Amend ScenePreview failures specific to the fixed-pose framings. The
|
|
87
|
+
* structured failureReason stays; only the error text is taught. */
|
|
88
|
+
function teachPreviewFailure(snap) {
|
|
89
|
+
const hints = {
|
|
90
|
+
unknown_bookmark: 'That bookmark does not exist in this project. List the saved names with summer_camera_bookmark action:"list", or save one with action:"save".',
|
|
91
|
+
bad_camera_pose: 'framing:"free" / "bookmark" needs a valid 3D pose: camera_position and camera_look_at as "Vector3(x, y, z)" literals that differ, fov 1..179, and a 3D scene (2D scenes have nowhere to place a Camera3D — use the default framing).',
|
|
92
|
+
node_focus_unsupported: "A fixed camera pose cannot be re-aimed at a node. Drop nodePath, or use a directional framing (iso/top/...) with nodePath.",
|
|
93
|
+
};
|
|
94
|
+
const reason = snap.failureReason;
|
|
95
|
+
if (!snap.ok && reason && reason in hints) {
|
|
96
|
+
return { ...snap, error: `${hints[reason]} Engine said: ${snap.error ?? reason}` };
|
|
97
|
+
}
|
|
98
|
+
return snap;
|
|
99
|
+
}
|
|
10
100
|
export function registerVisualTools(server) {
|
|
11
101
|
server.tool("summer_screenshot", `Capture a frame from Summer Engine and return it as an image you can look at directly.
|
|
12
102
|
|
|
@@ -14,11 +104,15 @@ Use this to visually verify your work: scene layout, asset placement, scale, fra
|
|
|
14
104
|
|
|
15
105
|
target:
|
|
16
106
|
"viewport" (default) — the editor's CURRENT view (whatever scene/tab is open). No game boot. Use for edit-time checks of how the scene looks right now.
|
|
17
|
-
"scene" — an OFFSCREEN render of a scene file (no game boot; physics/particles/animations are static at t=0). Optionally pass scenePath/framing/size/nodePath. Use for COMPOSITION, SCALE and FRAMING without touching the editor's open tab.
|
|
18
|
-
|
|
19
|
-
|
|
107
|
+
"scene" — an OFFSCREEN render of a scene file (no game boot; scripts do not run, physics/particles/animations are static at t=0, so runtime-hidden UI shows as saved). Optionally pass scenePath/framing/size/nodePath. Use for COMPOSITION, SCALE and FRAMING without touching the editor's open tab.
|
|
108
|
+
With the preset framings (iso/top/...), it does NOT use the scene's environment/sky, and it injects a synthetic camera and light when the scene has none. The scene's WorldEnvironment — sky, fog, tonemap, glow, SSAO, ambient — is replaced by a flat preview environment. So those framings CANNOT verify lighting, mood, or any material property that depends on the environment: change them and the frame comes back identical.
|
|
109
|
+
framing:"camera" is the exception and the trustworthy way to check lighting edit-time: it renders through the scene's OWN current/first Camera3D (or the one named by camera_path) with the scene's REAL WorldEnvironment — sky, fog, tonemap, glow, ambient all live. Use it before/after any lighting, environment, or emissive-material change, and to see the scene the way the played game will actually frame it.
|
|
110
|
+
STABLE VIEWPOINTS (newer engines): framing:"bookmark" + bookmark_name renders from a pose saved with summer_camera_bookmark, and framing:"free" from an explicit camera_position / camera_look_at (+ fov). Both are fixed synthetic poses rendered with the scene's REAL WorldEnvironment, and the same pose every time — the way to take before/after frames that actually line up. marks:true draws a Set-of-Mark overlay (numbered tags + boxes over the largest visible 3D nodes, up to max_marks) and the caption lists label -> node path, so you can say "label 3 (Props/Crate_02) is floating" instead of guessing. The scene file is never touched. 2D scenes render normally with marks_unsupported. Older engines resolve the new framings to a preset and ignore marks — the caption says so; a frame from such a build is NOT pose-stable.
|
|
111
|
+
"game" — a frame from the RUNNING game (real runtime state). Start the game first (summer_play). Works over the plain local connection on current Summer Engine builds (verified on 0.5.65, about 1.4 s); if a build refuses with bridge_required the result says so and names the alternatives.
|
|
112
|
+
|
|
113
|
+
BLANK FRAMES ARE A CAPTURE CONDITION, NOT A SCENE FACT. A uniformly black/grey "viewport" frame means the editor had not redrawn its viewport texture when it was read (typically right after a tab switch or a scene mutation) — not that the scene is dark or has no camera. Every frame is content-checked; a flat viewport frame is recaptured once automatically and the caption says what happened. Never conclude anything about lights, cameras, or content from a blank frame: recapture first.
|
|
20
114
|
|
|
21
|
-
Static frame only — one moment, not motion. For a SEQUENCE of frames over time, or for anything lighting-dependent
|
|
115
|
+
Static frame only — one moment, not motion. For a SEQUENCE of frames over time, or for anything lighting-dependent on an engine build without framing:"camera", use a RunVerification probe's save_frame(name) — its instance has a real renderer.`, {
|
|
22
116
|
target: z
|
|
23
117
|
.enum(["viewport", "scene", "game"])
|
|
24
118
|
.optional()
|
|
@@ -29,12 +123,20 @@ Static frame only — one moment, not motion. For a SEQUENCE of frames over time
|
|
|
29
123
|
.optional()
|
|
30
124
|
.describe('target:"scene" only. Full scene path, e.g. "res://main.tscn". Omit to render the currently-open scene.'),
|
|
31
125
|
framing: z
|
|
32
|
-
.enum(
|
|
126
|
+
.enum(SCREENSHOT_FRAMINGS)
|
|
33
127
|
.optional()
|
|
34
128
|
.describe('target:"scene" only, 3D scenes. Camera direction preset: "iso" = 3/4 diagonal view, ' +
|
|
35
129
|
'"top" = straight down, "front" = camera at +Z, "back" = camera at -Z, ' +
|
|
36
130
|
'"left" = camera at -X, "right" = camera at +X. "auto" (default) is an alias of "iso". ' +
|
|
37
|
-
"
|
|
131
|
+
'"camera" = render through the scene\'s OWN Camera3D with its REAL WorldEnvironment — ' +
|
|
132
|
+
"the only edit-time framing that truthfully shows lighting/mood. " +
|
|
133
|
+
'"bookmark" (+ bookmark_name) = the fixed pose saved with summer_camera_bookmark; "free" (+ camera_position, camera_look_at, fov) = an explicit fixed pose. ' +
|
|
134
|
+
"Both keep the REAL WorldEnvironment and repeat exactly, so before/after frames line up. " +
|
|
135
|
+
"The result reports the resolved framing — an older engine echoes a preset instead, and the caption warns."),
|
|
136
|
+
bookmark_name: z
|
|
137
|
+
.string()
|
|
138
|
+
.optional()
|
|
139
|
+
.describe('framing:"bookmark" only (implies it when framing is omitted). Name of a bookmark saved with summer_camera_bookmark (list them with action:"list"). Fails with failure_reason "unknown_bookmark" (+ the available names) when it does not exist.'),
|
|
38
140
|
size: z
|
|
39
141
|
.array(z.number().int().positive())
|
|
40
142
|
.length(2)
|
|
@@ -46,105 +148,285 @@ Static frame only — one moment, not motion. For a SEQUENCE of frames over time
|
|
|
46
148
|
.describe('target:"scene" only. Node path relative to the scene root (e.g. "Player/Mesh") to frame ' +
|
|
47
149
|
"INSTEAD of the whole scene — the camera fits that node's combined bounds (3D visual AABBs " +
|
|
48
150
|
"or 2D rects, children included). A bare unique name is also found recursively. " +
|
|
49
|
-
'Fails with failure_reason "node_not_found" when the path does not resolve (no silent whole-scene fallback).'
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
151
|
+
'Fails with failure_reason "node_not_found" when the path does not resolve (no silent whole-scene fallback). ' +
|
|
152
|
+
'Cannot combine with a fixed pose (framing "camera"/"free"/"bookmark").'),
|
|
153
|
+
camera_path: z
|
|
154
|
+
.string()
|
|
155
|
+
.optional()
|
|
156
|
+
.describe('framing:"camera" only. Path of the Camera3D to render through (relative to the scene root) when ' +
|
|
157
|
+
"the scene has several cameras or none marked current. Omit to use the scene's current/first Camera3D."),
|
|
158
|
+
camera_position: z
|
|
159
|
+
.string()
|
|
160
|
+
.optional()
|
|
161
|
+
.describe('framing:"free" only (implies it when framing is omitted). Camera position as a Godot literal, e.g. "Vector3(0, 5, 12)". Goes together with camera_look_at.'),
|
|
162
|
+
camera_look_at: z
|
|
163
|
+
.string()
|
|
164
|
+
.optional()
|
|
165
|
+
.describe('framing:"free" only. Point the camera looks at, e.g. "Vector3(0, 1, 0)". Must differ from camera_position.'),
|
|
166
|
+
fov: z
|
|
167
|
+
.number()
|
|
168
|
+
.optional()
|
|
169
|
+
.describe('framing:"free" / "bookmark" only. Vertical field of view in degrees (1..179; default 60 for "free", the bookmark\'s own for "bookmark").'),
|
|
170
|
+
marks: z
|
|
171
|
+
.boolean()
|
|
172
|
+
.optional()
|
|
173
|
+
.describe('target:"scene" only, 3D scenes. Draw a Set-of-Mark overlay: numbered tags + box outlines over the largest visible VisualInstance3D nodes (lights excluded), ranked by projected screen area. The caption lists label -> node path (scene-root-relative) so you can name what you see. Works with every framing. 2D scenes return marks_unsupported. Default false.'),
|
|
174
|
+
max_marks: z
|
|
175
|
+
.number()
|
|
176
|
+
.int()
|
|
177
|
+
.min(1)
|
|
178
|
+
.max(MAX_MARKS_CAP)
|
|
179
|
+
.optional()
|
|
180
|
+
.describe(`marks:true only. Cap on numbered labels (engine default 32, at most ${MAX_MARKS_CAP}). The caption says when the cap truncated the list.`),
|
|
181
|
+
}, async ({ target, scenePath, framing, bookmark_name, size, nodePath, camera_path, camera_position, camera_look_at, fov, marks, max_marks, }) => {
|
|
182
|
+
// Resolved inside the engine closure so a contradictory framing is a
|
|
183
|
+
// classified invalid_input (nothing sent), never a transport failure.
|
|
184
|
+
let preview;
|
|
185
|
+
return withEngine(async (client) => {
|
|
186
|
+
if (target === "game")
|
|
187
|
+
return captureGame(client);
|
|
188
|
+
if (target === "scene") {
|
|
189
|
+
preview = buildScenePreviewInput({
|
|
190
|
+
scenePath,
|
|
191
|
+
framing,
|
|
192
|
+
bookmark_name,
|
|
193
|
+
size: size,
|
|
194
|
+
nodePath,
|
|
195
|
+
camera_path,
|
|
196
|
+
camera_position,
|
|
197
|
+
camera_look_at,
|
|
198
|
+
fov,
|
|
199
|
+
marks,
|
|
200
|
+
max_marks,
|
|
201
|
+
});
|
|
202
|
+
return teachPreviewFailure(await captureScene(client, preview));
|
|
203
|
+
}
|
|
204
|
+
return captureViewport(client);
|
|
205
|
+
}, {
|
|
206
|
+
// Game capture used to be structurally blocked over local HTTP (409
|
|
207
|
+
// bridge_required); 0.5.65 answers it over the plain local connection.
|
|
208
|
+
// Keep the honest failure for builds that still refuse — fail loud
|
|
209
|
+
// (isError) so the model does not proceed as if it saw the game.
|
|
210
|
+
onResult: (snap) => {
|
|
211
|
+
if (target === "game" && snap.failureReason === "bridge_required") {
|
|
212
|
+
return {
|
|
213
|
+
content: [
|
|
214
|
+
{
|
|
215
|
+
type: "text",
|
|
216
|
+
text: "Game capture is not available over this connection on this Summer Engine build (it requires the desktop app bridge). " +
|
|
217
|
+
"Use target:'viewport' for the editor view, target:'scene' for an offscreen scene render, " +
|
|
218
|
+
"a RunVerification probe's save_frame for a rendered runtime frame, or ask the user to describe / screenshot the running game.\n\n" +
|
|
219
|
+
`Engine reason: ${snap.error ?? "unsupported_transport"}`,
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
isError: true,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
},
|
|
227
|
+
toContent: (snap) => {
|
|
228
|
+
// withEngine only calls toContent on success (ok:true, error cleared
|
|
229
|
+
// by extractOpError). Missing image bytes on a "success" is still
|
|
230
|
+
// possible defensively, so fall back to text rather than emit a
|
|
231
|
+
// broken image block.
|
|
232
|
+
if (!snap.base64) {
|
|
233
|
+
return [
|
|
72
234
|
{
|
|
73
235
|
type: "text",
|
|
74
|
-
text:
|
|
75
|
-
"
|
|
76
|
-
"or ask the user to describe / screenshot the running game.\n\n" +
|
|
77
|
-
`Engine reason: ${snap.error ?? "unsupported_transport"}`,
|
|
236
|
+
text: snap.error ||
|
|
237
|
+
"Snapshot succeeded but returned no image data. Try again, or use summer_get_scene_tree to inspect structurally.",
|
|
78
238
|
},
|
|
79
|
-
]
|
|
80
|
-
isError: true,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
return null;
|
|
84
|
-
},
|
|
85
|
-
toContent: (snap) => {
|
|
86
|
-
// withEngine only calls toContent on success (ok:true, error cleared
|
|
87
|
-
// by extractOpError). Missing image bytes on a "success" is still
|
|
88
|
-
// possible defensively, so fall back to text rather than emit a
|
|
89
|
-
// broken image block.
|
|
90
|
-
if (!snap.base64) {
|
|
91
|
-
return [
|
|
92
|
-
{
|
|
93
|
-
type: "text",
|
|
94
|
-
text: snap.error ||
|
|
95
|
-
"Snapshot succeeded but returned no image data. Try again, or use summer_get_scene_tree to inspect structurally.",
|
|
96
|
-
},
|
|
97
|
-
];
|
|
98
|
-
}
|
|
99
|
-
const dims = snap.width && snap.height ? `${snap.width}x${snap.height}` : "unknown size";
|
|
100
|
-
const label = target === "game"
|
|
101
|
-
? "Running game frame"
|
|
102
|
-
: target === "scene"
|
|
103
|
-
? "Scene preview (offscreen render, physics/animations static)"
|
|
104
|
-
: "Editor viewport";
|
|
105
|
-
const warnings = [];
|
|
106
|
-
// Project-drift warning (item 4): the engine may have switched
|
|
107
|
-
// projects since this session bound — this frame could be from the
|
|
108
|
-
// WRONG project.
|
|
109
|
-
if (snap.projectMismatch) {
|
|
110
|
-
warnings.push("WARNING: the engine is now on a DIFFERENT project than this session is bound to — this frame may be from the wrong project. Call summer_get_project_context to rebind before trusting it.");
|
|
111
|
-
}
|
|
112
|
-
// Scene-preview confession fields (P4.3): a scene with no camera plays
|
|
113
|
-
// grey/black.
|
|
114
|
-
if (target === "scene") {
|
|
115
|
-
if (snap.sceneHasCamera === false) {
|
|
116
|
-
warnings.push("WARNING: this scene has no Camera3D — it will render grey/black when played.");
|
|
239
|
+
];
|
|
117
240
|
}
|
|
118
|
-
|
|
119
|
-
|
|
241
|
+
const dims = snap.width && snap.height ? `${snap.width}x${snap.height}` : "unknown size";
|
|
242
|
+
const label = target === "game"
|
|
243
|
+
? "Running game frame"
|
|
244
|
+
: target === "scene"
|
|
245
|
+
? "Scene preview (offscreen render of the saved scene; scripts not run, physics/animations static)"
|
|
246
|
+
: viewportLabel(snap);
|
|
247
|
+
const warnings = [];
|
|
248
|
+
const notes = [];
|
|
249
|
+
// Project-drift warning (item 4): the engine may have switched
|
|
250
|
+
// projects since this session bound — this frame could be from the
|
|
251
|
+
// WRONG project.
|
|
252
|
+
if (snap.projectMismatch) {
|
|
253
|
+
warnings.push("WARNING: the engine is now on a DIFFERENT project than this session is bound to — this frame may be from the wrong project. Call summer_get_project_context to rebind before trusting it.");
|
|
120
254
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
//
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
255
|
+
const meta = snap.metadata;
|
|
256
|
+
const requestedFraming = preview?.framing;
|
|
257
|
+
// Frame content check (F-01). Wording is per target because a flat
|
|
258
|
+
// frame means different things: viewport = texture not redrawn;
|
|
259
|
+
// game = booting / loading / fade; scene = nothing visible in the
|
|
260
|
+
// framing or a blank readback the engine's own retries did not fix.
|
|
261
|
+
const quality = snap.frameQuality;
|
|
262
|
+
const recapture = snap.recapture;
|
|
263
|
+
let frameCheck = "";
|
|
264
|
+
if (quality?.analyzable && quality.flat) {
|
|
265
|
+
const flat = describeFlatFrame(quality);
|
|
266
|
+
if (target === "viewport") {
|
|
267
|
+
warnings.push(recapture
|
|
268
|
+
? `WARNING: this frame is ${flat}, and so was the automatic recapture ${recapture.delayMs} ms later${recapture.error ? ` (the recapture failed: ${recapture.error}; this is the first frame)` : ""}. ${BLANK_VIEWPORT_ADVICE}`
|
|
269
|
+
: `WARNING: this frame is ${flat}. ${BLANK_VIEWPORT_ADVICE}`);
|
|
270
|
+
}
|
|
271
|
+
else if (target === "game") {
|
|
272
|
+
warnings.push(`WARNING: this game frame is ${flat}. A game that has just booted, is loading, or is mid-fade legitimately shows this; it is NOT by itself evidence of a missing camera or light. Wait a moment and capture again before concluding anything.`);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
warnings.push(`WARNING: this preview is ${flat} (engine render retries: ${snap.renderRetries ?? 0}). Either nothing is visible in this framing or the readback was blank; verify with summer_get_scene_tree and, for 3D scenes, framing:"camera" before concluding anything.`);
|
|
276
|
+
}
|
|
127
277
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
278
|
+
else if (quality?.analyzable) {
|
|
279
|
+
frameCheck = ` Frame check: not blank (luma spread ${quality.lumaSpread}).`;
|
|
280
|
+
if (recapture) {
|
|
281
|
+
notes.push(`NOTE: the first capture came back ${describeFlatFrame(recapture.firstFrame)} — the viewport texture had not been redrawn yet (this happens right after a tab switch or a scene mutation). This image is the automatic recapture taken ${recapture.delayMs} ms later.`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
else if (quality && target !== "scene") {
|
|
285
|
+
notes.push(`NOTE: frame content check unavailable (${quality.reason ?? "unknown reason"}). If the image is uniformly black or grey, the viewport had not redrawn when it was read — recapture before concluding anything about lights, cameras, or content.`);
|
|
286
|
+
}
|
|
287
|
+
// Scene-preview confession fields (P4.3 + F-05).
|
|
288
|
+
if (target === "scene") {
|
|
289
|
+
if (snap.sceneHasCamera === false) {
|
|
290
|
+
const kind = snap.sceneKind?.kind ?? "unknown";
|
|
291
|
+
if (kind === "3d") {
|
|
292
|
+
warnings.push("WARNING: this 3D scene has no Camera3D — it will render grey/black when played.");
|
|
293
|
+
}
|
|
294
|
+
else if (kind === "2d" || kind === "none") {
|
|
295
|
+
notes.push("NOTE: this 2D scene has no Camera2D. That is normal for many 2D scenes and not an error: when played, the game shows the canvas from the viewport origin at the project's window size, not this fitted preview framing.");
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
const reason = snap.sceneKind?.reason ? ` (${snap.sceneKind.reason})` : "";
|
|
299
|
+
warnings.push(`WARNING: this scene has no camera of its own (the preview camera was synthesized) and the scene tree could not be read to tell 2D from 3D${reason}. If it is a 3D scene it will render grey/black when played; a 2D scene simply plays from the viewport origin.`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// The engine reports scene_had_light:false for 3D scenes only
|
|
303
|
+
// (2D scenes get true = not applicable), so this stays unconditional.
|
|
304
|
+
if (snap.sceneHadLight === false) {
|
|
305
|
+
warnings.push("WARNING: this scene has no light — lit materials may appear black when played.");
|
|
306
|
+
}
|
|
307
|
+
// The engine ALWAYS synthesizes the preview camera (preview_ops.cpp
|
|
308
|
+
// sets used_synthetic_camera unconditionally) — the flag says nothing
|
|
309
|
+
// about the scene's own cameras. sceneHasCamera above is the
|
|
310
|
+
// authoritative "does this scene have a camera" answer.
|
|
311
|
+
if (snap.usedSyntheticCamera) {
|
|
312
|
+
notes.push("NOTE: this preview is framed by a synthetic render camera, NOT the scene's own camera — the played game will not frame like this image.");
|
|
313
|
+
}
|
|
314
|
+
notes.push('NOTE: this is the SAVED scene rendered with scripts not running: nodes a script hides, moves, or spawns at runtime (e.g. a PauseMenu CanvasLayer hidden in _ready) appear here exactly as saved. Judge runtime visibility with target:"game" or a RunVerification save_frame, not this image.');
|
|
315
|
+
// Old engines that predate framing:"camera" resolve unknown
|
|
316
|
+
// framings to a preset and echo the result. Confess it rather
|
|
317
|
+
// than let a flat-environment frame pass as a lighting check.
|
|
318
|
+
if (requestedFraming === "camera" && snap.framing && snap.framing !== "camera") {
|
|
319
|
+
warnings.push(`WARNING: you asked for framing:"camera" but this Summer Engine build resolved it to "${snap.framing}" — it predates camera framing. This frame uses the synthetic preview camera and FLAT environment, so it does NOT verify lighting/mood. Update Summer Engine, or verify lighting by booting the game / a RunVerification probe.`);
|
|
320
|
+
}
|
|
321
|
+
// Same confession for the fixed-pose framings: an older engine
|
|
322
|
+
// echoes the preset it fell back to, so the frame is NOT the
|
|
323
|
+
// requested viewpoint and cannot anchor a before/after comparison.
|
|
324
|
+
if (isFixedPoseFraming(requestedFraming) && snap.framing && snap.framing !== requestedFraming) {
|
|
325
|
+
warnings.push(`WARNING: you asked for framing:"${requestedFraming}" but this Summer Engine build resolved it to "${snap.framing}" — this engine does not expose the free/bookmark framings (Summer Engine 0.5.66 or newer does). This is the "${snap.framing}" preset render from a synthetic camera with a FLAT environment, NOT your viewpoint, so it is not pose-stable and cannot anchor a before/after comparison. Update Summer Engine, or place a Camera3D at the pose and use framing:"camera".`);
|
|
326
|
+
}
|
|
327
|
+
// marks:true on an engine without Set-of-Mark: no marks key at all.
|
|
328
|
+
if (preview?.marks && readSceneMarks(meta) === null) {
|
|
329
|
+
warnings.push("WARNING: you asked for marks:true but this Summer Engine build ignored it (this engine does not expose the Set-of-Mark overlay; Summer Engine 0.5.66 or newer does). There are NO numbered labels in this image; do not read any into it. Update Summer Engine to get label -> node path mapping.");
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// Scene-preview capture details: resolved framing ("auto" -> "iso"),
|
|
333
|
+
// which node was framed (confirms nodePath resolved), and how many
|
|
334
|
+
// blank-readback retries the engine needed (0 = omitted).
|
|
335
|
+
const details = [];
|
|
336
|
+
let marksBlock = [];
|
|
337
|
+
if (target === "scene") {
|
|
338
|
+
if (snap.framing)
|
|
339
|
+
details.push(`framing: ${snap.framing}`);
|
|
340
|
+
if (snap.framedNode)
|
|
341
|
+
details.push(`framed node: ${snap.framedNode}`);
|
|
342
|
+
if (snap.renderRetries)
|
|
343
|
+
details.push(`render retries: ${snap.renderRetries}`);
|
|
344
|
+
// Camera-framing provenance (camera framing provenance): which camera the
|
|
345
|
+
// engine rendered through and which environment was live.
|
|
346
|
+
if (typeof meta?.camera_path === "string" && meta.camera_path) {
|
|
347
|
+
details.push(`scene camera: ${meta.camera_path}`);
|
|
348
|
+
}
|
|
349
|
+
if (typeof meta?.environment_used === "string" && meta.environment_used) {
|
|
350
|
+
details.push(`environment: ${meta.environment_used}`);
|
|
351
|
+
}
|
|
352
|
+
// fixed-pose provenance: where the pose came from and the
|
|
353
|
+
// exact pose rendered (3dp literals) — quote it when comparing.
|
|
354
|
+
if (typeof meta?.framing_source === "string" && meta.framing_source) {
|
|
355
|
+
details.push(`framing source: ${meta.framing_source}${typeof meta.bookmark === "string" && meta.bookmark ? ` "${meta.bookmark}"` : ""}`);
|
|
356
|
+
}
|
|
357
|
+
const pose = readCameraPose(meta);
|
|
358
|
+
if (pose) {
|
|
359
|
+
const parts = [];
|
|
360
|
+
if (pose.position)
|
|
361
|
+
parts.push(`position ${pose.position}`);
|
|
362
|
+
if (pose.look_at)
|
|
363
|
+
parts.push(`look_at ${pose.look_at}`);
|
|
364
|
+
if (pose.fov !== undefined)
|
|
365
|
+
parts.push(`fov ${pose.fov}`);
|
|
366
|
+
if (parts.length)
|
|
367
|
+
details.push(`camera pose: ${parts.join(", ")}`);
|
|
368
|
+
}
|
|
369
|
+
const marksSummary = readSceneMarks(meta);
|
|
370
|
+
if (marksSummary)
|
|
371
|
+
marksBlock = formatSceneMarks(marksSummary);
|
|
372
|
+
}
|
|
373
|
+
const detailNote = details.length ? `; ${details.join(", ")}` : "";
|
|
374
|
+
const trailer = [...warnings, ...notes];
|
|
375
|
+
const caption = `${label} (${dims}${detailNote}). Saved to ${snap.localPath ?? "n/a"}.${frameCheck} Describe only what is visibly in the image above.` +
|
|
376
|
+
(marksBlock.length ? `\n\n${marksBlock.join("\n")}` : "") +
|
|
377
|
+
(trailer.length ? `\n\n${trailer.join("\n")}` : "");
|
|
378
|
+
return [
|
|
379
|
+
{ type: "image", data: snap.base64, mimeType: snap.mime || "image/jpeg" },
|
|
380
|
+
{ type: "text", text: caption },
|
|
381
|
+
];
|
|
382
|
+
},
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
server.tool("summer_camera_bookmark", `Save, list, or delete named camera viewpoints for the edited 3D scene. A bookmark is a fixed pose (position, look_at, fov) stored IN THE PROJECT at res://.summer/camera_bookmarks.json, so it survives sessions and machines — the scene file is never touched.
|
|
386
|
+
|
|
387
|
+
WHY: screenshots taken from a preset framing re-fit the scene bounds every time, so a before/after pair shifts whenever anything moves; a bookmark is the same pose every time, which makes before/after comparison real. Save once, then reuse on every capture: summer_screenshot target:"scene" framing:"bookmark" bookmark_name:"<name>" (add marks:true for numbered labels mapped to node paths).
|
|
388
|
+
|
|
389
|
+
action:
|
|
390
|
+
"save" — name (1-64 of A-Z a-z 0-9 _ -) plus EITHER position + look_at as Godot literals ("Vector3(x, y, z)", optional fov, default 60) OR neither: omit both to capture the CURRENT editor 3D viewport camera (result pose_source: "editor_viewport" vs "explicit"; overwritten says whether a same-named bookmark was replaced).
|
|
391
|
+
"list" — every saved bookmark (names sorted, poses, created timestamps, file path).
|
|
392
|
+
"delete" — remove one by name (result lists the remaining names).
|
|
393
|
+
|
|
394
|
+
Failures are structured: bad_args (name grammar, half-given pose, fov outside 1..179, position == look_at), no_editor_camera (no pose given and no 3D viewport camera to capture), not_found (+ available names), io_failed (file unreadable/unwritable; a malformed file is reported, never overwritten). Edit-time only — no running game needed. If this engine build predates the bookmark ops, the result is a structured engine_lacks_op failure (nothing is sent) naming the fallback.`, {
|
|
395
|
+
action: z
|
|
396
|
+
.enum(CAMERA_BOOKMARK_ACTIONS)
|
|
397
|
+
.describe('"save" a viewpoint, "list" the saved ones, or "delete" one by name.'),
|
|
398
|
+
name: z
|
|
399
|
+
.string()
|
|
400
|
+
.optional()
|
|
401
|
+
.describe("Bookmark name for save/delete: 1-64 characters from A-Z a-z 0-9 _ - (e.g. \"hero_closeup\")."),
|
|
402
|
+
position: z
|
|
403
|
+
.string()
|
|
404
|
+
.optional()
|
|
405
|
+
.describe('save only. Camera position as a Godot literal, e.g. "Vector3(0, 5, 12)". Goes together with look_at; omit BOTH to capture the current editor 3D viewport camera.'),
|
|
406
|
+
look_at: z
|
|
407
|
+
.string()
|
|
408
|
+
.optional()
|
|
409
|
+
.describe('save only. Point the camera looks at, e.g. "Vector3(0, 1, 0)". Must differ from position.'),
|
|
410
|
+
fov: z
|
|
411
|
+
.number()
|
|
412
|
+
.optional()
|
|
413
|
+
.describe("save only. Vertical field of view in degrees (1..179, default 60). With a captured viewport pose the viewport camera's fov wins."),
|
|
414
|
+
}, async ({ action, name, position, look_at, fov }) => withEngine(async (client) => {
|
|
415
|
+
// Argument validation first (a bad name never needs an engine), then
|
|
416
|
+
// the capability pre-flight on THIS action's op kind.
|
|
417
|
+
const op = buildCameraBookmarkOp({ action, name, position, look_at, fov });
|
|
418
|
+
const kind = String(op.op);
|
|
419
|
+
const missing = missingEngineOpResult(client, kind, CAMERA_BOOKMARK_FALLBACK);
|
|
420
|
+
if (missing)
|
|
421
|
+
return missing;
|
|
422
|
+
const result = await client.executeOps([op]);
|
|
423
|
+
return teachBookmarkFailure(withOldEngineHint(result, kind, CAMERA_BOOKMARK_FALLBACK));
|
|
424
|
+
}, {
|
|
425
|
+
toContent: (result) => [
|
|
426
|
+
{
|
|
427
|
+
type: "text",
|
|
428
|
+
text: `${JSON.stringify(result, null, 2)}\n\n${describeBookmarkResult(action, result)}`,
|
|
429
|
+
},
|
|
430
|
+
],
|
|
149
431
|
}));
|
|
150
432
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { getClient } from "../server.js";
|
|
2
|
+
import { extractOpError, withOldEngineHint } from "../../core/capabilities/engine-receipt.js";
|
|
3
|
+
export { extractOpError, withOldEngineHint };
|
|
4
|
+
export { missingEngineOpResult, type CapabilityAdvertisingClient, } from "../../core/capability-skew.js";
|
|
5
|
+
export { ToolInputError, UnsupportedOperationError } from "../../core/tool-errors.js";
|
|
2
6
|
type ToolResultContent = {
|
|
3
7
|
type: "text";
|
|
4
8
|
text: string;
|
|
@@ -35,20 +39,6 @@ export interface WithEngineOptions<T> {
|
|
|
35
39
|
toContent?: (result: T) => ToolResultContent[];
|
|
36
40
|
onResult?: (result: T) => ToolResult | null;
|
|
37
41
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Decide whether an engine result envelope represents a FAILURE, and if so
|
|
40
|
-
* return a model-visible message. Returns null only for genuine success.
|
|
41
|
-
*
|
|
42
|
-
* Guards the two web bug classes (publicsummerengine cf17134f + contract.ts
|
|
43
|
-
* `isFailureSignal`):
|
|
44
|
-
* - a failure `terminalState` (anything other than applied/no_op) is a failure
|
|
45
|
-
* even when results[] is absent — the cf17134f "no-results envelope looked
|
|
46
|
-
* applied" masking. The poll loop surfaces timed_out/etc. here.
|
|
47
|
-
* - an explicit ok:false / status:"error" / failed op inside results[].
|
|
48
|
-
*
|
|
49
|
-
* Exported for unit tests.
|
|
50
|
-
*/
|
|
51
|
-
export declare function extractOpError(result: unknown): string | null;
|
|
52
42
|
/**
|
|
53
43
|
* An auth failure is the ONE class of thrown error that is provably pre-apply:
|
|
54
44
|
* the engine rejects on the Bearer-token check (tool_net_thread.cpp::_validate_auth)
|
|
@@ -68,4 +58,8 @@ export declare function extractOpError(result: unknown): string | null;
|
|
|
68
58
|
*/
|
|
69
59
|
export declare function isAuthError(err: unknown): boolean;
|
|
70
60
|
export declare function withEngine<T>(fn: (client: Awaited<ReturnType<typeof getClient>>) => Promise<T>, opts?: WithEngineOptions<T>): Promise<ToolResult>;
|
|
71
|
-
|
|
61
|
+
/** Every transport-level failure must TEACH recovery, not just name the error.
|
|
62
|
+
* getClient()'s connect failure already carries its own instructions; anything
|
|
63
|
+
* else (fetch failed / abort / HTTP status thrown mid-call) gets the generic
|
|
64
|
+
* recovery recipe appended. Exported for unit tests. */
|
|
65
|
+
export declare function withTransportRecovery(message: string): string;
|