summer-engine 2.8.2 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +27 -7
- package/.claude-plugin/plugin.json +99 -83
- package/.codex-plugin/plugin.json +112 -82
- package/.cursor-plugin/plugin.json +119 -83
- package/.factory-plugin/plugin.json +100 -3
- package/.mcp.json +6 -1
- package/.opencode/INSTALL.md +7 -4
- package/.opencode/plugins/summer.js +31 -18
- package/AGENTS.md +107 -34
- package/CHANGELOG.md +149 -44
- package/CLAUDE.md +4 -2
- package/GEMINI.md +7 -53
- package/NOTICE +31 -0
- package/README.md +161 -393
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/README.md +20 -6
- package/assets/autopilot/autopilot.gd +80 -26
- package/assets/autopilot/run.sh +132 -7
- package/assets/navigation/web-routes.json +719 -0
- package/commands/gameskill.md +10 -108
- package/commands/summer.md +72 -4
- package/dist/bin/summer.js +6 -87
- package/dist/cli/banner.d.ts +1 -0
- package/dist/cli/banner.js +33 -0
- package/dist/{commands → cli/commands}/config.js +1 -1
- package/dist/cli/commands/create.d.ts +30 -0
- package/dist/cli/commands/create.js +212 -0
- package/dist/{commands → cli/commands}/debug.js +2 -2
- package/dist/cli/commands/doctor.d.ts +2 -0
- package/dist/cli/commands/doctor.js +18 -0
- package/dist/cli/commands/events.d.ts +57 -0
- package/dist/cli/commands/events.js +158 -0
- package/dist/cli/commands/install.d.ts +50 -0
- package/dist/cli/commands/install.js +447 -0
- package/dist/cli/commands/list.js +72 -0
- package/dist/{commands → cli/commands}/login.js +33 -17
- package/dist/{commands → cli/commands}/logout.d.ts +1 -0
- package/dist/cli/commands/logout.js +19 -0
- package/dist/{commands → cli/commands}/memory.d.ts +1 -8
- package/dist/{commands → cli/commands}/memory.js +20 -11
- package/dist/cli/commands/open.d.ts +45 -0
- package/dist/cli/commands/open.js +216 -0
- package/dist/{commands → cli/commands}/plan.js +2 -2
- package/dist/{commands → cli/commands}/publish.js +1 -1
- package/dist/{commands → cli/commands}/releases.js +1 -1
- package/dist/cli/commands/run.d.ts +19 -0
- package/dist/cli/commands/run.js +255 -0
- package/dist/cli/commands/setup.js +158 -0
- package/dist/{commands → cli/commands}/skills.js +121 -251
- package/dist/{commands → cli/commands}/status.d.ts +1 -0
- package/dist/cli/commands/status.js +62 -0
- package/dist/cli/commands/tool.d.ts +11 -0
- package/dist/cli/commands/tool.js +121 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.js +89 -0
- package/dist/cli/root-action.d.ts +7 -0
- package/dist/cli/root-action.js +15 -0
- package/dist/{lib → core}/api-client.d.ts +106 -15
- package/dist/{lib → core}/api-client.js +267 -75
- package/dist/{lib → core}/async-op-lifecycle.d.ts +3 -4
- package/dist/{lib → core}/async-op-lifecycle.js +3 -4
- package/dist/{lib → core}/auth.d.ts +14 -6
- package/dist/{lib → core}/auth.js +56 -40
- package/dist/core/capabilities/agent-playbook.d.ts +20 -0
- package/dist/core/capabilities/agent-playbook.js +218 -0
- package/dist/core/capabilities/api-docs.d.ts +36 -0
- package/dist/core/capabilities/api-docs.js +118 -0
- package/dist/core/capabilities/asset-import.d.ts +49 -0
- package/dist/core/capabilities/asset-import.js +134 -0
- package/dist/core/capabilities/camera-view.d.ts +98 -0
- package/dist/core/capabilities/camera-view.js +222 -0
- package/dist/core/capabilities/capture.d.ts +63 -0
- package/dist/core/capabilities/capture.js +67 -0
- package/dist/core/capabilities/console-read.d.ts +17 -0
- package/dist/core/capabilities/console-read.js +21 -0
- package/dist/{lib → core/capabilities}/creator.d.ts +1 -29
- package/dist/{lib → core/capabilities}/creator.js +14 -33
- package/dist/{lib → core/capabilities}/debug-report.d.ts +1 -1
- package/dist/{lib → core/capabilities}/debug-report.js +12 -31
- package/dist/{commands → core/capabilities}/doctor.d.ts +7 -2
- package/dist/{commands → core/capabilities}/doctor.js +47 -73
- package/dist/core/capabilities/engine-fallbacks.d.ts +26 -0
- package/dist/core/capabilities/engine-fallbacks.js +36 -0
- package/dist/core/capabilities/engine-ops.d.ts +33 -0
- package/dist/core/capabilities/engine-ops.js +145 -0
- package/dist/core/capabilities/engine-receipt.d.ts +53 -0
- package/dist/core/capabilities/engine-receipt.js +134 -0
- package/dist/core/capabilities/events.d.ts +200 -0
- package/dist/core/capabilities/events.js +383 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +111 -0
- package/dist/core/capabilities/fabricate-mesh.js +165 -0
- package/dist/core/capabilities/frame-quality.d.ts +71 -0
- package/dist/core/capabilities/frame-quality.js +449 -0
- package/dist/core/capabilities/game-task-plan.d.ts +66 -0
- package/dist/{lib → core/capabilities}/game-task-plan.js +59 -8
- package/dist/core/capabilities/hdri-import.d.ts +90 -0
- package/dist/core/capabilities/hdri-import.js +250 -0
- package/dist/core/capabilities/image-generation.d.ts +24 -0
- package/dist/core/capabilities/image-generation.js +22 -0
- package/dist/core/capabilities/navigation/open.d.ts +156 -0
- package/dist/core/capabilities/navigation/open.js +567 -0
- package/dist/core/capabilities/navigation/render-product-map.d.ts +1 -0
- package/dist/core/capabilities/navigation/render-product-map.js +84 -0
- package/dist/core/capabilities/navigation/targets.d.ts +87 -0
- package/dist/core/capabilities/navigation/targets.js +250 -0
- package/dist/core/capabilities/play-determinism.d.ts +35 -0
- package/dist/core/capabilities/play-determinism.js +86 -0
- package/dist/core/capabilities/project-context.d.ts +114 -0
- package/dist/core/capabilities/project-context.js +249 -0
- package/dist/core/capabilities/runtime-control.d.ts +540 -0
- package/dist/core/capabilities/runtime-control.js +1011 -0
- package/dist/core/capabilities/scene-kind.d.ts +19 -0
- package/dist/core/capabilities/scene-kind.js +137 -0
- package/dist/core/capabilities/scene-script.d.ts +38 -0
- package/dist/core/capabilities/scene-script.js +45 -0
- package/dist/core/capabilities/tool-dispatch.d.ts +42 -0
- package/dist/core/capabilities/tool-dispatch.js +1490 -0
- package/dist/core/capabilities/ui-control.d.ts +179 -0
- package/dist/core/capabilities/ui-control.js +423 -0
- package/dist/core/capabilities/variant-types.d.ts +22 -0
- package/dist/core/capabilities/variant-types.js +101 -0
- package/dist/core/capability-skew.d.ts +205 -0
- package/dist/core/capability-skew.js +386 -0
- package/dist/{lib → core}/config.d.ts +11 -1
- package/dist/{lib → core}/config.js +13 -2
- package/dist/core/embeddings.d.ts +78 -0
- package/dist/core/embeddings.js +166 -0
- package/dist/core/engine-install.d.ts +105 -0
- package/dist/core/engine-install.js +190 -0
- package/dist/core/engine.d.ts +94 -0
- package/dist/{lib → core}/engine.js +74 -28
- package/dist/core/feedback/client.d.ts +88 -0
- package/dist/core/feedback/client.js +182 -0
- package/dist/{lib → core}/format.d.ts +0 -1
- package/dist/{lib → core}/format.js +1 -1
- package/dist/core/headless/connection.d.ts +86 -0
- package/dist/core/headless/connection.js +97 -0
- package/dist/core/headless/editor-connection.d.ts +26 -0
- package/dist/core/headless/editor-connection.js +81 -0
- package/dist/core/headless/mcp-routing.d.ts +38 -0
- package/dist/core/headless/mcp-routing.js +83 -0
- package/dist/core/headless/registry.d.ts +91 -0
- package/dist/core/headless/registry.js +226 -0
- package/dist/core/headless/resolve.d.ts +46 -0
- package/dist/core/headless/resolve.js +75 -0
- package/dist/core/headless/spawn.d.ts +46 -0
- package/dist/core/headless/spawn.js +205 -0
- package/dist/core/headless/worker-connection.d.ts +96 -0
- package/dist/core/headless/worker-connection.js +353 -0
- package/dist/core/headless/worker-engine-client.d.ts +58 -0
- package/dist/core/headless/worker-engine-client.js +246 -0
- package/dist/core/launch-posture.d.ts +170 -0
- package/dist/core/launch-posture.js +317 -0
- package/dist/core/library-read.d.ts +73 -0
- package/dist/core/library-read.js +279 -0
- package/dist/core/library-search.d.ts +143 -0
- package/dist/core/library-search.js +301 -0
- package/dist/{lib → core}/log-filters.js +4 -2
- package/dist/{lib → core}/mcp-log.js +2 -17
- package/dist/core/package-root.d.ts +9 -0
- package/dist/core/package-root.js +11 -0
- package/dist/core/redact.d.ts +20 -0
- package/dist/core/redact.js +64 -0
- package/dist/core/registry-search.d.ts +167 -0
- package/dist/core/registry-search.js +358 -0
- package/dist/core/skills-registry.d.ts +55 -0
- package/dist/core/skills-registry.js +106 -0
- package/dist/{lib → core}/store.js +11 -7
- package/dist/{lib → core}/summer-compatibility.js +3 -3
- package/dist/{lib → core}/telemetry.js +5 -2
- package/dist/core/templates.d.ts +98 -0
- package/dist/core/templates.js +241 -0
- package/dist/core/tool-errors.d.ts +30 -0
- package/dist/core/tool-errors.js +40 -0
- package/dist/core/trajectory.d.ts +80 -0
- package/dist/core/trajectory.js +307 -0
- package/dist/core/util/http.d.ts +13 -0
- package/dist/core/util/http.js +28 -0
- package/dist/core/util/json.d.ts +12 -0
- package/dist/core/util/json.js +21 -0
- package/dist/core/util/process.d.ts +3 -0
- package/dist/core/util/process.js +13 -0
- package/dist/core/util/sleep.d.ts +1 -0
- package/dist/core/util/sleep.js +3 -0
- package/dist/core/version.d.ts +3 -0
- package/dist/core/version.js +5 -0
- package/dist/installer/agent-config.d.ts +63 -0
- package/dist/installer/agent-config.js +540 -0
- package/dist/installer/agent-table.d.ts +103 -0
- package/dist/installer/agent-table.js +584 -0
- package/dist/installer/legacy-skills.d.ts +26 -0
- package/dist/installer/legacy-skills.js +53 -0
- package/dist/installer/setup.d.ts +76 -0
- package/dist/installer/setup.js +148 -0
- package/dist/installer/skill-locations.d.ts +36 -0
- package/dist/installer/skill-locations.js +91 -0
- package/dist/installer/version-check.d.ts +178 -0
- package/dist/installer/version-check.js +479 -0
- package/dist/{lib/mcp-boot-notice.d.ts → mcp/boot-notice.d.ts} +1 -1
- package/dist/{commands/mcp.js → mcp/command.js} +18 -6
- package/dist/mcp/server.d.ts +23 -3
- package/dist/mcp/server.js +122 -28
- package/dist/mcp/tools/asset-tools.js +62 -142
- package/dist/mcp/tools/creator-tools.js +5 -23
- package/dist/mcp/tools/debug-tools.js +61 -18
- package/dist/mcp/tools/event-tools.d.ts +14 -0
- package/dist/mcp/tools/event-tools.js +41 -0
- package/dist/mcp/tools/fabricate-tools.d.ts +2 -0
- package/dist/mcp/tools/fabricate-tools.js +28 -0
- package/dist/mcp/tools/feedback-tools.d.ts +77 -0
- package/dist/mcp/tools/feedback-tools.js +88 -0
- package/dist/mcp/tools/file-tools.js +6 -53
- package/dist/mcp/tools/generate-tools.js +37 -63
- package/dist/mcp/tools/library-tools.d.ts +11 -0
- package/dist/mcp/tools/library-tools.js +42 -0
- package/dist/mcp/tools/navigation-tools.d.ts +7 -0
- package/dist/mcp/tools/navigation-tools.js +37 -0
- package/dist/mcp/tools/perception-tools.d.ts +20 -0
- package/dist/mcp/tools/perception-tools.js +146 -0
- package/dist/mcp/tools/project-tools.d.ts +14 -0
- package/dist/mcp/tools/project-tools.js +72 -281
- package/dist/mcp/tools/runtime-tools.d.ts +2 -0
- package/dist/mcp/tools/runtime-tools.js +92 -0
- package/dist/mcp/tools/scene-tools.d.ts +3 -0
- package/dist/mcp/tools/scene-tools.js +68 -119
- package/dist/mcp/tools/script-tools.d.ts +3 -0
- package/dist/mcp/tools/script-tools.js +118 -0
- package/dist/mcp/tools/spatial-tools.d.ts +2 -0
- package/dist/mcp/tools/spatial-tools.js +485 -0
- package/dist/mcp/tools/text-json.d.ts +8 -0
- package/dist/mcp/tools/text-json.js +12 -0
- package/dist/mcp/tools/{cloud-tools.d.ts → ui-tools.d.ts} +1 -1
- package/dist/mcp/tools/ui-tools.js +82 -0
- package/dist/mcp/tools/visual-tools.d.ts +2 -7
- package/dist/mcp/tools/visual-tools.js +383 -101
- package/dist/mcp/tools/with-engine.d.ts +9 -15
- package/dist/mcp/tools/with-engine.js +60 -96
- package/dist/project-memory/project-manifest.d.ts +36 -0
- package/dist/project-memory/project-manifest.js +50 -0
- package/dist/project-memory/project-memory.d.ts +57 -0
- package/dist/{lib → project-memory}/project-memory.js +46 -0
- package/gemini-extension.json +103 -2
- package/hooks/hooks-cursor.json +2 -2
- package/hooks/hooks.json +2 -1
- package/hooks/pre-commit-doctor.sh +45 -39
- package/hooks/run-hook.cmd +30 -23
- package/hooks/run-hook.sh +20 -0
- package/hooks/session-start.sh +18 -7
- package/integrations/README.md +99 -0
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude/README.md +19 -0
- package/integrations/claude/manifest-target.json +16 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +12 -0
- package/integrations/cline/manifest-target.json +3 -0
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/codex/README.md +15 -0
- package/integrations/codex/manifest-target.json +5 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -0
- package/integrations/cursor/README.md +16 -0
- package/integrations/cursor/manifest-target.json +5 -0
- package/integrations/factory/README.md +26 -0
- package/integrations/factory/manifest-target.json +5 -0
- package/integrations/gemini/README.md +26 -0
- package/integrations/gemini/manifest-target.json +5 -0
- package/integrations/github-copilot/README.md +12 -0
- package/integrations/github-copilot/manifest-target.json +3 -0
- package/integrations/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +12 -0
- package/integrations/kilo-code/manifest-target.json +3 -0
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +12 -0
- package/integrations/lm-studio/manifest-target.json +3 -0
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +12 -0
- package/integrations/opencode/manifest-target.json +3 -0
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +14 -0
- package/integrations/roo-code/manifest-target.json +3 -0
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +12 -0
- package/integrations/vscode-copilot/manifest-target.json +3 -0
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +12 -0
- package/integrations/windsurf/manifest-target.json +3 -0
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/manifest-target.json +3 -0
- package/library/references/collaborative-protocol/resource.yaml +24 -0
- package/library/references/gd-style/resource.yaml +24 -0
- package/{references → library/references/godot-version}/godot-version.md +6 -6
- package/library/references/godot-version/resource.yaml +22 -0
- package/library/references/headless-routing/headless-routing.md +46 -0
- package/library/references/headless-routing/resource.yaml +24 -0
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +49 -0
- package/library/references/mcp-fresh-chat-playbook/resource.yaml +23 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +271 -0
- package/library/references/mcp-tools-reference/resource.yaml +17 -0
- package/library/references/product-map/product-map.md +103 -0
- package/library/references/product-map/resource.yaml +33 -0
- package/{references → library/references/public-surface-language}/public-surface-language.md +5 -7
- package/library/references/public-surface-language/resource.yaml +17 -0
- package/library/references/summer-folder/resource.yaml +20 -0
- package/{references → library/references/summer-folder}/summer-folder.md +22 -21
- package/{skills/rendering-and-lighting → library/skills}/3d-lighting/SKILL.md +15 -11
- package/library/skills/3d-lighting/resource.yaml +27 -0
- package/library/skills/README.md +242 -0
- package/{skills/audio → library/skills}/adaptive-music/SKILL.md +1 -1
- package/library/skills/adaptive-music/resource.yaml +28 -0
- package/library/skills/agent-playtesting/SKILL.md +148 -0
- package/library/skills/agent-playtesting/resource.yaml +52 -0
- package/library/skills/ambient-bed/resource.yaml +24 -0
- package/{skills/video → library/skills}/animated-loop/SKILL.md +1 -1
- package/library/skills/animated-loop/resource.yaml +27 -0
- package/{skills/animation → library/skills}/animation-tree/SKILL.md +29 -14
- package/library/skills/animation-tree/resource.yaml +33 -0
- package/{skills/rendering-and-lighting → library/skills}/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +29 -0
- package/{skills/asset-pipeline → library/skills}/asset-strategy/SKILL.md +44 -44
- package/library/skills/asset-strategy/resource.yaml +63 -0
- package/{skills/audio → library/skills}/audio-direction/SKILL.md +7 -7
- package/library/skills/audio-direction/resource.yaml +32 -0
- package/library/skills/auto-fire-targeting/resource.yaml +22 -0
- package/{skills/scene-and-project → library/skills}/brainstorm-game/SKILL.md +8 -8
- package/library/skills/brainstorm-game/resource.yaml +30 -0
- package/{skills/workflow → library/skills}/brainstorming/SKILL.md +2 -22
- package/library/skills/brainstorming/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/brainstorming/spec-document-reviewer-prompt.md +1 -1
- package/{skills/scene-and-project → library/skills}/browse-templates/SKILL.md +18 -18
- package/library/skills/browse-templates/resource.yaml +23 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +366 -0
- package/library/skills/celeste-momentum-platforming/resource.yaml +33 -0
- package/library/skills/character-animation-wiring/SKILL.md +249 -0
- package/library/skills/character-animation-wiring/resource.yaml +39 -0
- package/{skills/3d-assets → library/skills}/character-model/SKILL.md +25 -25
- package/library/skills/character-model/resource.yaml +36 -0
- package/{skills/2d-assets → library/skills}/character-portrait/SKILL.md +14 -14
- package/library/skills/character-portrait/resource.yaml +30 -0
- package/{skills/video → library/skills}/cinematic-cutscene/SKILL.md +2 -2
- package/library/skills/cinematic-cutscene/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/concept-art/SKILL.md +15 -15
- package/library/skills/concept-art/resource.yaml +34 -0
- package/{skills/2d-assets → library/skills}/create-asset-sheet/SKILL.md +8 -8
- package/library/skills/create-asset-sheet/resource.yaml +33 -0
- package/{skills/debugging → library/skills}/debug/SKILL.md +3 -3
- package/library/skills/debug/resource.yaml +31 -0
- package/{skills/workflow → library/skills}/debugging-game-feel/SKILL.md +11 -11
- package/library/skills/debugging-game-feel/resource.yaml +25 -0
- package/{skills/level-design → library/skills}/design-level/SKILL.md +6 -6
- package/library/skills/design-level/resource.yaml +31 -0
- package/{skills/gameplay-mechanics → library/skills}/design-mechanic/SKILL.md +3 -3
- package/library/skills/design-mechanic/resource.yaml +31 -0
- package/{skills/ai-and-npcs → library/skills}/design-npc/SKILL.md +7 -3
- package/library/skills/design-npc/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/diagnosing-perf-regressions/SKILL.md +10 -10
- package/library/skills/diagnosing-perf-regressions/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/dispatching-parallel-agents/SKILL.md +8 -8
- package/library/skills/dispatching-parallel-agents/resource.yaml +23 -0
- package/library/skills/driving-the-editor-ui/SKILL.md +85 -0
- package/library/skills/driving-the-editor-ui/resource.yaml +46 -0
- package/{skills/3d-assets → library/skills}/environment-kit/SKILL.md +11 -11
- package/library/skills/environment-kit/resource.yaml +29 -0
- package/{skills/deployment → library/skills}/export-and-ship/SKILL.md +5 -5
- package/library/skills/export-and-ship/resource.yaml +32 -0
- package/library/skills/fabricating-assets/SKILL.md +195 -0
- package/library/skills/fabricating-assets/resource.yaml +52 -0
- package/{skills/animation → library/skills}/facial-and-lipsync/SKILL.md +23 -11
- package/library/skills/facial-and-lipsync/resource.yaml +36 -0
- package/{skills/character-controllers → library/skills}/fps-controller/SKILL.md +8 -4
- package/library/skills/fps-controller/resource.yaml +29 -0
- package/{skills/visual-effects → library/skills}/game-feel/SKILL.md +7 -7
- package/library/skills/game-feel/resource.yaml +27 -0
- package/library/skills/gameskill/SKILL.md +64 -0
- package/library/skills/gameskill/resource.yaml +22 -0
- package/library/skills/gdscript-patterns/resource.yaml +23 -0
- package/{skills/animation → library/skills}/generate-motion/SKILL.md +16 -16
- package/library/skills/generate-motion/resource.yaml +34 -0
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +223 -0
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +33 -0
- package/{skills/workflow → library/skills}/headless-scripting/SKILL.md +14 -7
- package/library/skills/headless-scripting/resource.yaml +26 -0
- package/library/skills/host-authoritative-state/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/instantiate-asset-pack/SKILL.md +10 -12
- package/library/skills/instantiate-asset-pack/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/investigating-bugs/SKILL.md +4 -4
- package/{skills/workflow → library/skills}/investigating-bugs/condition-based-waiting.md +8 -8
- package/library/skills/investigating-bugs/resource.yaml +24 -0
- package/{skills/workflow → library/skills}/investigating-bugs/root-cause-tracing.md +1 -7
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +164 -0
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/make-game/SKILL.md +22 -22
- package/library/skills/make-game/resource.yaml +35 -0
- package/library/skills/music-track/resource.yaml +28 -0
- package/library/skills/navigate-summer/SKILL.md +61 -0
- package/library/skills/navigate-summer/resource.yaml +35 -0
- package/{skills/scene-and-project → library/skills}/new-project/SKILL.md +10 -10
- package/library/skills/new-project/resource.yaml +28 -0
- package/{skills/3d-assets → library/skills}/organic-model/SKILL.md +16 -16
- package/library/skills/organic-model/resource.yaml +32 -0
- package/{skills/multiplayer-and-networking → library/skills}/peer-to-peer-multiplayer/SKILL.md +2 -2
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +28 -0
- package/{skills/2d-assets → library/skills}/pixel-art/SKILL.md +13 -13
- package/library/skills/pixel-art/resource.yaml +31 -0
- package/library/skills/play/resource.yaml +26 -0
- package/{skills/workflow → library/skills}/playtesting-a-feature/SKILL.md +41 -22
- package/library/skills/playtesting-a-feature/resource.yaml +31 -0
- package/{skills/animation → library/skills}/procedural-animation/SKILL.md +25 -10
- package/library/skills/procedural-animation/resource.yaml +33 -0
- package/{skills/3d-assets → library/skills}/prop-model/SKILL.md +13 -13
- package/library/skills/prop-model/resource.yaml +33 -0
- package/library/skills/psx-retro-rendering/SKILL.md +416 -0
- package/library/skills/psx-retro-rendering/resource.yaml +36 -0
- package/library/skills/realtime-wet-surfaces/SKILL.md +189 -0
- package/library/skills/realtime-wet-surfaces/resource.yaml +31 -0
- package/{skills/deployment → library/skills}/remote-deploy/SKILL.md +3 -3
- package/library/skills/remote-deploy/resource.yaml +23 -0
- package/{skills/animation → library/skills}/retarget/SKILL.md +15 -14
- package/library/skills/retarget/resource.yaml +33 -0
- package/library/skills/running-in-the-cloud/SKILL.md +103 -0
- package/library/skills/running-in-the-cloud/resource.yaml +33 -0
- package/{skills/scene-and-project → library/skills}/scene-composition/SKILL.md +8 -0
- package/library/skills/scene-composition/resource.yaml +27 -0
- package/library/skills/scene-hierarchy-design/SKILL.md +102 -0
- package/library/skills/scene-hierarchy-design/resource.yaml +31 -0
- package/library/skills/scene-scripting/SKILL.md +764 -0
- package/library/skills/scene-scripting/resource.yaml +58 -0
- package/{skills/level-design → library/skills}/scene-to-level/SKILL.md +16 -17
- package/library/skills/scene-to-level/resource.yaml +33 -0
- package/library/skills/setup-multiplayer/resource.yaml +28 -0
- package/library/skills/skill-create/SKILL.md +138 -0
- package/library/skills/skill-create/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-improve/SKILL.md +2 -2
- package/library/skills/skill-improve/resource.yaml +25 -0
- package/{skills/workflow → library/skills}/skill-test/SKILL.md +4 -4
- package/library/skills/skill-test/resource.yaml +26 -0
- package/library/skills/skintokens-auto-rigging/SKILL.md +200 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +38 -0
- package/{skills/2d-assets → library/skills}/skybox-panorama/SKILL.md +8 -8
- package/library/skills/skybox-panorama/resource.yaml +28 -0
- package/{skills/audio → library/skills}/sound-effect/SKILL.md +2 -2
- package/library/skills/sound-effect/resource.yaml +27 -0
- package/library/skills/spatial-placement/SKILL.md +74 -0
- package/library/skills/spatial-placement/resource.yaml +42 -0
- package/library/skills/spatial-placement/tests/spec.md +65 -0
- package/{skills/2d-assets → library/skills}/sprite-sheet/SKILL.md +12 -12
- package/library/skills/sprite-sheet/resource.yaml +32 -0
- package/{skills/2d-assets → library/skills}/tileable-texture/SKILL.md +9 -9
- package/library/skills/tileable-texture/resource.yaml +31 -0
- package/{skills/video → library/skills}/trailer-shot/SKILL.md +1 -1
- package/library/skills/trailer-shot/resource.yaml +27 -0
- package/{skills/performance → library/skills}/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +31 -0
- package/library/skills/ui-basics/resource.yaml +25 -0
- package/{skills/2d-assets → library/skills}/ui-graphics/SKILL.md +11 -11
- package/library/skills/ui-graphics/resource.yaml +29 -0
- package/{skills/2d-assets → library/skills}/use-widget-asset/SKILL.md +4 -4
- package/library/skills/use-widget-asset/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/using-summer/SKILL.md +12 -9
- package/library/skills/using-summer/resource.yaml +41 -0
- package/{skills/3d-assets → library/skills}/vehicle-model/SKILL.md +18 -18
- package/library/skills/vehicle-model/resource.yaml +34 -0
- package/{skills/workflow → library/skills}/verification-before-completion/SKILL.md +10 -10
- package/library/skills/verification-before-completion/resource.yaml +23 -0
- package/library/skills/verifying-scenes/SKILL.md +98 -0
- package/library/skills/verifying-scenes/resource.yaml +42 -0
- package/{skills/visual-effects/recipes/dissolve → library/skills/vfx-dissolve}/SKILL.md +31 -11
- package/library/skills/vfx-dissolve/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/fire → library/skills/vfx-fire}/SKILL.md +43 -12
- package/library/skills/vfx-fire/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-fire/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/hit-spark → library/skills/vfx-hit-spark}/SKILL.md +16 -10
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-hit-spark/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/lightning → library/skills/vfx-lightning}/SKILL.md +24 -11
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-lightning/resource.yaml +33 -0
- package/{skills/visual-effects/recipes/magic-glow → library/skills/vfx-magic-glow}/SKILL.md +31 -11
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-magic-glow/resource.yaml +34 -0
- package/{skills/visual-effects/recipes/muzzle-flash → library/skills/vfx-muzzle-flash}/SKILL.md +29 -9
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +53 -0
- package/library/skills/vfx-muzzle-flash/resource.yaml +35 -0
- package/{skills/visual-effects/recipes/smoke → library/skills/vfx-smoke}/SKILL.md +35 -9
- package/library/skills/vfx-smoke/_building-blocks/noise-3d-fbm.gdshaderinc +45 -0
- package/library/skills/vfx-smoke/resource.yaml +32 -0
- package/{skills/visual-effects/recipes/water-ripple → library/skills/vfx-water-ripple}/SKILL.md +31 -9
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +37 -0
- package/library/skills/vfx-water-ripple/resource.yaml +31 -0
- package/library/skills/voice-line/resource.yaml +27 -0
- package/library/skills/world-building-3d/SKILL.md +105 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +50 -0
- package/library/skills/world-building-3d/resource.yaml +44 -0
- package/library/skills/world-building-3d/tests/spec.md +48 -0
- package/{skills/workflow → library/skills}/writing-plans/SKILL.md +19 -14
- package/library/skills/writing-plans/resource.yaml +23 -0
- package/{skills/workflow → library/skills}/writing-skills/SKILL.md +38 -44
- package/library/skills/writing-skills/resource.yaml +29 -0
- package/{skills/workflow → library/skills}/writing-skills/testing-skills-with-subagents.md +13 -14
- package/library/templates/2d-brario-platformer/resource.yaml +21 -0
- package/library/templates/2d-dungeon-roguelike/resource.yaml +23 -0
- package/library/templates/2d-grid-puzzle/resource.yaml +21 -0
- package/library/templates/2d-plants-and-zombies-tower-defense/resource.yaml +21 -0
- package/library/templates/2d-platformer/resource.yaml +24 -0
- package/library/templates/2d-rpg/resource.yaml +21 -0
- package/library/templates/2d-vampire-survivor-roguelike/resource.yaml +21 -0
- package/library/templates/3d-basic/resource.yaml +16 -0
- package/library/templates/3d-city-kit/resource.yaml +24 -0
- package/library/templates/3d-fps-old-school/resource.yaml +21 -0
- package/library/templates/3d-fps-simple-animated-npc/resource.yaml +21 -0
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +22 -0
- package/library/templates/3d-open-world-explore-tps/resource.yaml +21 -0
- package/library/templates/3d-procedural-road-world/resource.yaml +21 -0
- package/library/templates/3d-racing-game/resource.yaml +21 -0
- package/library/templates/3d-royale-clash-type/resource.yaml +21 -0
- package/library/templates/3d-third-person-controller/resource.yaml +21 -0
- package/library/templates/3d-voxel-sandbox/resource.yaml +24 -0
- package/library/templates/README.md +94 -0
- package/library/templates/empty/resource.yaml +16 -0
- package/library/tools/add-node/resource.yaml +60 -0
- package/library/tools/align-distribute-3d/resource.yaml +87 -0
- package/library/tools/api-docs/resource.yaml +57 -0
- package/library/tools/batch/resource.yaml +52 -0
- package/library/tools/camera-bookmark/resource.yaml +73 -0
- package/library/tools/check-job/resource.yaml +45 -0
- package/library/tools/clear-console/resource.yaml +40 -0
- package/library/tools/connect-signal/resource.yaml +63 -0
- package/library/tools/create-debug-report/resource.yaml +67 -0
- package/library/tools/create-scene/resource.yaml +59 -0
- package/library/tools/creator-config/resource.yaml +63 -0
- package/library/tools/creator-publish/resource.yaml +73 -0
- package/library/tools/creator-releases/resource.yaml +53 -0
- package/library/tools/fabricate-3d/resource.yaml +108 -0
- package/library/tools/game-control/resource.yaml +84 -0
- package/library/tools/game-input/resource.yaml +159 -0
- package/library/tools/game-probe/resource.yaml +90 -0
- package/library/tools/generate-3d/resource.yaml +112 -0
- package/library/tools/generate-audio/resource.yaml +80 -0
- package/library/tools/generate-image/resource.yaml +62 -0
- package/library/tools/generate-motion/resource.yaml +66 -0
- package/library/tools/generate-video/resource.yaml +66 -0
- package/library/tools/get-agent-playbook/resource.yaml +40 -0
- package/library/tools/get-asset/resource.yaml +42 -0
- package/library/tools/get-asset-download-url/resource.yaml +52 -0
- package/library/tools/get-console/resource.yaml +69 -0
- package/library/tools/get-debugger-errors/resource.yaml +56 -0
- package/library/tools/get-debugger-warnings/resource.yaml +52 -0
- package/library/tools/get-diagnostics/resource.yaml +42 -0
- package/library/tools/get-project-context/resource.yaml +45 -0
- package/library/tools/get-runtime-tree/resource.yaml +62 -0
- package/library/tools/get-scene-tree/resource.yaml +52 -0
- package/library/tools/get-script-errors/resource.yaml +45 -0
- package/library/tools/get-studio-workflow/resource.yaml +43 -0
- package/library/tools/import-asset/resource.yaml +73 -0
- package/library/tools/import-asset-by-id/resource.yaml +56 -0
- package/library/tools/import-from-url/resource.yaml +51 -0
- package/library/tools/import-from-url-batch/resource.yaml +60 -0
- package/library/tools/import-hdri/resource.yaml +69 -0
- package/library/tools/input-map-bind/resource.yaml +52 -0
- package/library/tools/inspect-node/resource.yaml +46 -0
- package/library/tools/inspect-resource/resource.yaml +45 -0
- package/library/tools/inspect-runtime-node/resource.yaml +54 -0
- package/library/tools/instantiate-scene/resource.yaml +62 -0
- package/library/tools/is-running/resource.yaml +40 -0
- package/library/tools/library-feedback/resource.yaml +89 -0
- package/library/tools/list-my-assets/resource.yaml +56 -0
- package/library/tools/navigation-probe/resource.yaml +85 -0
- package/library/tools/open/resource.yaml +80 -0
- package/library/tools/open-main-scene/resource.yaml +40 -0
- package/library/tools/open-scene/resource.yaml +46 -0
- package/library/tools/play/resource.yaml +91 -0
- package/library/tools/project-setting/resource.yaml +53 -0
- package/library/tools/read-file/resource.yaml +47 -0
- package/library/tools/read-library/resource.yaml +67 -0
- package/library/tools/recent-events/resource.yaml +71 -0
- package/library/tools/remove-node/resource.yaml +51 -0
- package/library/tools/replace-node/resource.yaml +57 -0
- package/library/tools/replace-text/resource.yaml +61 -0
- package/library/tools/run-editor-script/resource.yaml +61 -0
- package/library/tools/run-script/resource.yaml +73 -0
- package/library/tools/runtime-animate/resource.yaml +140 -0
- package/library/tools/runtime-call/resource.yaml +74 -0
- package/library/tools/runtime-set/resource.yaml +80 -0
- package/library/tools/runtime-spawn/resource.yaml +95 -0
- package/library/tools/save-scene/resource.yaml +50 -0
- package/library/tools/screenshot/resource.yaml +112 -0
- package/library/tools/search-assets/resource.yaml +67 -0
- package/library/tools/search-library/resource.yaml +81 -0
- package/library/tools/select-node/resource.yaml +48 -0
- package/library/tools/set-prop/resource.yaml +64 -0
- package/library/tools/set-resource-property/resource.yaml +66 -0
- package/library/tools/slice-asset-sheet/resource.yaml +47 -0
- package/library/tools/snap-to-surface/resource.yaml +90 -0
- package/library/tools/snapshot-diff/resource.yaml +58 -0
- package/library/tools/starcast/resource.yaml +120 -0
- package/library/tools/start-game-task/resource.yaml +91 -0
- package/library/tools/stop/resource.yaml +51 -0
- package/library/tools/test-placement/resource.yaml +109 -0
- package/library/tools/ui-actions/resource.yaml +77 -0
- package/library/tools/ui-activate/resource.yaml +88 -0
- package/library/tools/ui-screenshot/resource.yaml +63 -0
- package/library/tools/ui-tree/resource.yaml +69 -0
- package/library/tools/wait-for-event/resource.yaml +84 -0
- package/library/tools/world-snapshot/resource.yaml +60 -0
- package/library/tools/write-file/resource.yaml +54 -0
- package/package.json +21 -15
- package/registry/generated/aliases.json +207 -0
- package/registry/generated/counts.json +12 -0
- package/registry/generated/gemini-extension.json +122 -0
- package/registry/generated/index.json +7709 -0
- package/registry/generated/marketplace.claude.json +44 -0
- package/registry/generated/mcp.json +13 -0
- package/registry/generated/plugin.claude.json +135 -0
- package/registry/generated/plugin.codex.json +144 -0
- package/registry/generated/plugin.cursor.json +134 -0
- package/registry/generated/plugin.factory.json +117 -0
- package/registry/generated/skills-index.md +242 -0
- package/registry/generated/skills-registry.json +1249 -0
- package/registry/generated/templates-registry.json +455 -0
- package/registry/schemas/allowed-hosts.json +19 -0
- package/registry/schemas/collection.schema.json +68 -0
- package/registry/schemas/domains.json +96 -0
- package/registry/schemas/example.schema.json +11 -0
- package/registry/schemas/reference.schema.json +10 -0
- package/registry/schemas/resource.schema.json +154 -0
- package/registry/schemas/skill.schema.json +14 -0
- package/registry/schemas/template.schema.json +46 -0
- package/registry/schemas/tool.schema.json +61 -0
- package/_persona/summer/SKILL.md +0 -113
- package/dist/bin/postinstall.d.ts +0 -2
- package/dist/bin/postinstall.js +0 -3
- package/dist/commands/cloud.d.ts +0 -2
- package/dist/commands/cloud.js +0 -80
- package/dist/commands/create.d.ts +0 -3
- package/dist/commands/create.js +0 -171
- package/dist/commands/install.d.ts +0 -19
- package/dist/commands/install.js +0 -194
- package/dist/commands/list.js +0 -67
- package/dist/commands/logout.js +0 -13
- package/dist/commands/logs.d.ts +0 -2
- package/dist/commands/logs.js +0 -19
- package/dist/commands/open.d.ts +0 -2
- package/dist/commands/open.js +0 -32
- package/dist/commands/orchestrator.d.ts +0 -8
- package/dist/commands/orchestrator.js +0 -143
- package/dist/commands/run.d.ts +0 -2
- package/dist/commands/run.js +0 -167
- package/dist/commands/setup.js +0 -217
- package/dist/commands/status.js +0 -46
- package/dist/lib/agent-config.d.ts +0 -39
- package/dist/lib/agent-config.js +0 -626
- package/dist/lib/banner.d.ts +0 -4
- package/dist/lib/banner.js +0 -122
- package/dist/lib/cloud/api.d.ts +0 -79
- package/dist/lib/cloud/api.js +0 -107
- package/dist/lib/cloud/apply.d.ts +0 -32
- package/dist/lib/cloud/apply.js +0 -294
- package/dist/lib/cloud/checkpoint.d.ts +0 -26
- package/dist/lib/cloud/checkpoint.js +0 -142
- package/dist/lib/cloud/conflicts.d.ts +0 -55
- package/dist/lib/cloud/conflicts.js +0 -131
- package/dist/lib/cloud/containment.d.ts +0 -8
- package/dist/lib/cloud/containment.js +0 -52
- package/dist/lib/cloud/diff.d.ts +0 -39
- package/dist/lib/cloud/diff.js +0 -138
- package/dist/lib/cloud/engine-bridge.d.ts +0 -34
- package/dist/lib/cloud/engine-bridge.js +0 -139
- package/dist/lib/cloud/hash-cache.d.ts +0 -23
- package/dist/lib/cloud/hash-cache.js +0 -44
- package/dist/lib/cloud/hash.d.ts +0 -10
- package/dist/lib/cloud/hash.js +0 -111
- package/dist/lib/cloud/http.d.ts +0 -17
- package/dist/lib/cloud/http.js +0 -47
- package/dist/lib/cloud/lock-path.d.ts +0 -1
- package/dist/lib/cloud/lock-path.js +0 -5
- package/dist/lib/cloud/lock.d.ts +0 -14
- package/dist/lib/cloud/lock.js +0 -143
- package/dist/lib/cloud/manifest.d.ts +0 -6
- package/dist/lib/cloud/manifest.js +0 -41
- package/dist/lib/cloud/paths.d.ts +0 -20
- package/dist/lib/cloud/paths.js +0 -90
- package/dist/lib/cloud/project-godot-merge.d.ts +0 -32
- package/dist/lib/cloud/project-godot-merge.js +0 -185
- package/dist/lib/cloud/rules.d.ts +0 -39
- package/dist/lib/cloud/rules.js +0 -159
- package/dist/lib/cloud/sync.d.ts +0 -21
- package/dist/lib/cloud/sync.js +0 -518
- package/dist/lib/cloud/transfer.d.ts +0 -23
- package/dist/lib/cloud/transfer.js +0 -184
- package/dist/lib/cloud/types.d.ts +0 -62
- package/dist/lib/cloud/types.js +0 -1
- package/dist/lib/cloud/validate-path.d.ts +0 -23
- package/dist/lib/cloud/validate-path.js +0 -103
- package/dist/lib/engine.d.ts +0 -51
- package/dist/lib/game-task-plan.d.ts +0 -42
- package/dist/lib/project-memory.d.ts +0 -33
- package/dist/lib/public-surface-paths.d.ts +0 -13
- package/dist/lib/public-surface-paths.js +0 -42
- package/dist/lib/remote-templates.d.ts +0 -25
- package/dist/lib/remote-templates.js +0 -86
- package/dist/lib/skills-registry.d.ts +0 -572
- package/dist/lib/skills-registry.js +0 -1061
- package/dist/lib/version-check.d.ts +0 -106
- package/dist/lib/version-check.js +0 -338
- package/dist/mcp/tools/cloud-tools.js +0 -42
- package/references/mcp-tools-reference.md +0 -199
- package/references/template-registry.md +0 -73
- package/skills/README.md +0 -103
- package/skills/scene-and-project/summer-cloud/SKILL.md +0 -92
- package/skills/workflow/brainstorming/scripts/frame-template.html +0 -214
- package/skills/workflow/brainstorming/scripts/helper.js +0 -88
- package/skills/workflow/brainstorming/scripts/server.cjs +0 -354
- package/skills/workflow/brainstorming/scripts/start-server.sh +0 -148
- package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/workflow/brainstorming/visual-companion.md +0 -287
- package/skills/workflow/gameskill/SKILL.md +0 -120
- package/skills/workflow/investigating-bugs/CREATION-LOG.md +0 -119
- package/skills/workflow/investigating-bugs/condition-based-waiting-example.ts +0 -158
- package/skills/workflow/investigating-bugs/find-polluter.sh +0 -63
- package/skills/workflow/investigating-bugs/test-academic.md +0 -14
- package/skills/workflow/investigating-bugs/test-pressure-1.md +0 -58
- package/skills/workflow/investigating-bugs/test-pressure-2.md +0 -68
- package/skills/workflow/investigating-bugs/test-pressure-3.md +0 -69
- package/skills/workflow/mcpupdate/SKILL.md +0 -134
- package/skills/workflow/skill-create/SKILL.md +0 -153
- package/skills/workflow/writing-skills/anthropic-best-practices.md +0 -1150
- package/skills/workflow/writing-skills/examples/CLAUDE_MD_TESTING.md +0 -189
- package/skills/workflow/writing-skills/graphviz-conventions.dot +0 -172
- package/skills/workflow/writing-skills/persuasion-principles.md +0 -187
- package/skills/workflow/writing-skills/render-graphs.js +0 -168
- /package/dist/{commands → cli/commands}/config.d.ts +0 -0
- /package/dist/{commands → cli/commands}/debug.d.ts +0 -0
- /package/dist/{commands → cli/commands}/list.d.ts +0 -0
- /package/dist/{commands → cli/commands}/login.d.ts +0 -0
- /package/dist/{commands → cli/commands}/plan.d.ts +0 -0
- /package/dist/{commands → cli/commands}/publish.d.ts +0 -0
- /package/dist/{commands → cli/commands}/releases.d.ts +0 -0
- /package/dist/{commands → cli/commands}/setup.d.ts +0 -0
- /package/dist/{commands → cli/commands}/skills.d.ts +0 -0
- /package/dist/{lib → core}/log-filters.d.ts +0 -0
- /package/dist/{lib → core}/mcp-log.d.ts +0 -0
- /package/dist/{lib → core}/store.d.ts +0 -0
- /package/dist/{lib → core}/summer-compatibility.d.ts +0 -0
- /package/dist/{lib → core}/telemetry.d.ts +0 -0
- /package/dist/{lib/mcp-boot-notice.js → mcp/boot-notice.js} +0 -0
- /package/dist/{commands/mcp.d.ts → mcp/command.d.ts} +0 -0
- /package/{references → library/references/collaborative-protocol}/collaborative-protocol.md +0 -0
- /package/{references → library/references/gd-style}/gd-style.md +0 -0
- /package/{skills/audio → library/skills}/ambient-bed/SKILL.md +0 -0
- /package/{skills/gameplay-mechanics → library/skills}/auto-fire-targeting/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/SKILL.md +0 -0
- /package/{skills/scripting-patterns → library/skills}/gdscript-patterns/reference.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/host-authoritative-state/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/investigating-bugs/defense-in-depth.md +0 -0
- /package/{skills/audio → library/skills}/music-track/SKILL.md +0 -0
- /package/{skills/scene-and-project → library/skills}/play/SKILL.md +0 -0
- /package/{skills/multiplayer-and-networking → library/skills}/setup-multiplayer/SKILL.md +0 -0
- /package/{skills/ui-and-ux → library/skills}/ui-basics/SKILL.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-dissolve}/_building-blocks/noise-3d-fbm.gdshaderinc +0 -0
- /package/{skills/visual-effects → library/skills/vfx-fire}/_building-blocks/additive-billboard-particles.md +0 -0
- /package/{skills/visual-effects → library/skills/vfx-lightning}/_building-blocks/trauma-shake-snippet.md +0 -0
- /package/{skills/audio → library/skills}/voice-line/SKILL.md +0 -0
- /package/{skills/workflow → library/skills}/writing-plans/plan-document-reviewer-prompt.md +0 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { ToolInputError } from "../tool-errors.js";
|
|
2
|
+
/** Kenney Cloudinary URL pattern: .../summer_art/kenney/3d/{pack-slug}/{filename}.glb */
|
|
3
|
+
const KENNEY_URL_PATTERN = /\/kenney\/3d\/([^/]+)\//;
|
|
4
|
+
function getPackSlugFromUrl(fileUrl) {
|
|
5
|
+
return fileUrl.match(KENNEY_URL_PATTERN)?.[1] ?? null;
|
|
6
|
+
}
|
|
7
|
+
export function buildKenneyTextureUrl(fileUrl) {
|
|
8
|
+
const lastSlash = fileUrl.lastIndexOf("/");
|
|
9
|
+
const base = lastSlash >= 0 ? fileUrl.slice(0, lastSlash) : fileUrl;
|
|
10
|
+
return `${base}/Textures/colormap.png`;
|
|
11
|
+
}
|
|
12
|
+
export async function textureExists(url) {
|
|
13
|
+
try {
|
|
14
|
+
const res = await fetch(url, { method: "HEAD", signal: AbortSignal.timeout(5000) });
|
|
15
|
+
return res.ok;
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build import entries for Kenney 3D assets: texture first, then GLB.
|
|
23
|
+
* Pack-scoped paths prevent texture collision (each pack has its own Textures/colormap.png).
|
|
24
|
+
*/
|
|
25
|
+
async function buildKenneyImportEntries(fileUrl, packSlug, fileName) {
|
|
26
|
+
const textureUrl = buildKenneyTextureUrl(fileUrl);
|
|
27
|
+
const hasTexture = await textureExists(textureUrl);
|
|
28
|
+
if (!hasTexture) {
|
|
29
|
+
return [{ url: fileUrl, path: `res://assets/models/kenney/${packSlug}/${fileName}` }];
|
|
30
|
+
}
|
|
31
|
+
const glbPath = `res://assets/models/kenney/${packSlug}/${fileName}`;
|
|
32
|
+
const glbDir = glbPath.replace(/\/[^/]+$/, "");
|
|
33
|
+
const texturePath = `${glbDir}/Textures/colormap.png`;
|
|
34
|
+
return [
|
|
35
|
+
{ url: textureUrl, path: texturePath },
|
|
36
|
+
{ url: fileUrl, path: glbPath },
|
|
37
|
+
];
|
|
38
|
+
}
|
|
39
|
+
function fileNameFromUrl(fileUrl) {
|
|
40
|
+
return fileUrl.split("/").pop()?.split("?")[0] || "asset";
|
|
41
|
+
}
|
|
42
|
+
/** Godot node names reject . : @ / " %; keep letters, digits and underscores. */
|
|
43
|
+
export function sanitizeNodeName(name) {
|
|
44
|
+
return ((name || "Asset")
|
|
45
|
+
.replace(/[^\p{L}\p{N}_]+/gu, "_")
|
|
46
|
+
.replace(/^_+|_+$/g, "") || "Asset");
|
|
47
|
+
}
|
|
48
|
+
async function buildImportEntriesForAsset(asset, targetPath) {
|
|
49
|
+
const fileUrl = asset.importUrl || asset.fileUrl;
|
|
50
|
+
if (!fileUrl)
|
|
51
|
+
throw new Error("Asset has no import URL.");
|
|
52
|
+
const fileName = targetPath?.split("/").pop() || asset.fileName || fileNameFromUrl(fileUrl);
|
|
53
|
+
const packSlug = asset.packSlug ?? getPackSlugFromUrl(fileUrl) ?? "misc";
|
|
54
|
+
if (targetPath) {
|
|
55
|
+
if (asset.type === "3d_model" && fileUrl.includes("kenney/3d/")) {
|
|
56
|
+
const textureUrl = buildKenneyTextureUrl(fileUrl);
|
|
57
|
+
const hasTexture = await textureExists(textureUrl);
|
|
58
|
+
if (hasTexture) {
|
|
59
|
+
const glbDir = targetPath.replace(/\/[^/]+$/, "");
|
|
60
|
+
return {
|
|
61
|
+
importPath: targetPath,
|
|
62
|
+
imports: [
|
|
63
|
+
{ url: textureUrl, path: `${glbDir}/Textures/colormap.png` },
|
|
64
|
+
{ url: fileUrl, path: targetPath },
|
|
65
|
+
],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
importPath: targetPath,
|
|
71
|
+
imports: [{ url: fileUrl, path: targetPath }],
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (asset.type === "3d_model" && fileUrl.includes("kenney/3d/")) {
|
|
75
|
+
const imports = await buildKenneyImportEntries(fileUrl, packSlug, fileName);
|
|
76
|
+
return { imports, importPath: imports[imports.length - 1].path };
|
|
77
|
+
}
|
|
78
|
+
const path = asset.type === "3d_model"
|
|
79
|
+
? `res://assets/models/${fileName}`
|
|
80
|
+
: `res://assets/${fileName}`;
|
|
81
|
+
return { imports: [{ url: fileUrl, path }], importPath: path };
|
|
82
|
+
}
|
|
83
|
+
/** Import a resolved gateway asset into the project (texture + GLB for Kenney
|
|
84
|
+
* packs) and, for 3D models with a `parent`, instantiate it into `scenePath`
|
|
85
|
+
* and save. Throws with a user-facing message on any engine refusal. */
|
|
86
|
+
export async function importResolvedAsset(client, args) {
|
|
87
|
+
const { asset, parent, scenePath, path, name } = args;
|
|
88
|
+
if (parent && !scenePath) {
|
|
89
|
+
throw new ToolInputError("scenePath is required when importing an asset into a scene");
|
|
90
|
+
}
|
|
91
|
+
const { imports, importPath } = await buildImportEntriesForAsset(asset, path);
|
|
92
|
+
const importResult = imports.length === 1
|
|
93
|
+
? await client.executeOps([
|
|
94
|
+
{ op: "ImportFromUrl", url: imports[0].url, path: imports[0].path },
|
|
95
|
+
])
|
|
96
|
+
: await client.executeOps([{ op: "ImportFromUrlBatch", imports }]);
|
|
97
|
+
const importReceipts = importResult?.results ?? [];
|
|
98
|
+
const importFailure = importReceipts.find((receipt) => receipt?.ok === false);
|
|
99
|
+
if (importResult?.status === "error" || importFailure) {
|
|
100
|
+
throw new Error(importFailure?.error || "Could not import asset. Check engine logs.");
|
|
101
|
+
}
|
|
102
|
+
let addedToScene = false;
|
|
103
|
+
let sceneReceipt = null;
|
|
104
|
+
if (parent && asset.type === "3d_model") {
|
|
105
|
+
sceneReceipt = await client.executeIdentityBoundOps([
|
|
106
|
+
{
|
|
107
|
+
op: "InstantiateScene",
|
|
108
|
+
parent,
|
|
109
|
+
scene: importPath,
|
|
110
|
+
name: sanitizeNodeName(name || asset.title),
|
|
111
|
+
},
|
|
112
|
+
{ op: "SaveScene" },
|
|
113
|
+
], { scenePath });
|
|
114
|
+
const placementReceipts = sceneReceipt?.results ?? [];
|
|
115
|
+
const placementFailure = placementReceipts.find((receipt) => receipt?.ok !== true);
|
|
116
|
+
if (sceneReceipt?.status === "error" ||
|
|
117
|
+
placementReceipts.length !== 2 ||
|
|
118
|
+
placementFailure) {
|
|
119
|
+
throw new Error(placementFailure?.error || `Could not add asset to ${scenePath}`);
|
|
120
|
+
}
|
|
121
|
+
addedToScene = true;
|
|
122
|
+
}
|
|
123
|
+
return {
|
|
124
|
+
success: true,
|
|
125
|
+
assetId: asset.id,
|
|
126
|
+
asset: asset.title,
|
|
127
|
+
type: asset.type,
|
|
128
|
+
importedTo: importPath,
|
|
129
|
+
addedToScene,
|
|
130
|
+
parent: parent || null,
|
|
131
|
+
scenePath: scenePath || null,
|
|
132
|
+
sceneReceipt,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export declare const CAMERA_BOOKMARK_ACTIONS: readonly ["save", "list", "delete"];
|
|
2
|
+
export type CameraBookmarkAction = (typeof CAMERA_BOOKMARK_ACTIONS)[number];
|
|
3
|
+
/** Engine op kind per action — the pre-flight checks THIS kind, not all three. */
|
|
4
|
+
export declare const CAMERA_BOOKMARK_OPS: Record<CameraBookmarkAction, string>;
|
|
5
|
+
/** What the engine_lacks_op result tells the model to do instead. */
|
|
6
|
+
export declare const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
|
|
7
|
+
/** Bookmark name grammar (preview_ops.cpp): 1-64 of [A-Za-z0-9_-]. */
|
|
8
|
+
export declare const BOOKMARK_NAME_PATTERN: RegExp;
|
|
9
|
+
export interface CameraBookmarkArgs {
|
|
10
|
+
action: CameraBookmarkAction;
|
|
11
|
+
name?: string;
|
|
12
|
+
/** Godot literal, e.g. "Vector3(0, 5, 10)". Goes together with look_at. */
|
|
13
|
+
position?: string;
|
|
14
|
+
look_at?: string;
|
|
15
|
+
fov?: number;
|
|
16
|
+
}
|
|
17
|
+
/** Build the engine op for one bookmark action. Throws ToolInputError (nothing
|
|
18
|
+
* sent) for a missing/invalid name or a half-given pose. */
|
|
19
|
+
export declare function buildCameraBookmarkOp(args: CameraBookmarkArgs): Record<string, unknown>;
|
|
20
|
+
export declare const PRESET_FRAMINGS: readonly ["auto", "iso", "top", "front", "back", "left", "right", "camera"];
|
|
21
|
+
export declare const FIXED_POSE_FRAMINGS: readonly ["free", "bookmark"];
|
|
22
|
+
/** The framing enum both faces expose. "bookmark" pairs with `bookmark_name`
|
|
23
|
+
* (the wire form is "bookmark:<name>"; the enum stays closed so the
|
|
24
|
+
* descriptor/zod parity holds and agents see a finite list). */
|
|
25
|
+
export declare const SCREENSHOT_FRAMINGS: readonly ["auto", "iso", "top", "front", "back", "left", "right", "camera", "free", "bookmark"];
|
|
26
|
+
export type ScreenshotFraming = (typeof SCREENSHOT_FRAMINGS)[number];
|
|
27
|
+
export interface ScenePreviewArgs {
|
|
28
|
+
scenePath?: string;
|
|
29
|
+
framing?: ScreenshotFraming;
|
|
30
|
+
bookmark_name?: string;
|
|
31
|
+
size?: [number, number];
|
|
32
|
+
nodePath?: string;
|
|
33
|
+
camera_path?: string;
|
|
34
|
+
camera_position?: string;
|
|
35
|
+
camera_look_at?: string;
|
|
36
|
+
fov?: number;
|
|
37
|
+
marks?: boolean;
|
|
38
|
+
max_marks?: number;
|
|
39
|
+
}
|
|
40
|
+
/** The api-client scenePreview input, with the framing resolved to its wire
|
|
41
|
+
* form ("bookmark" + bookmark_name -> "bookmark:<name>"). */
|
|
42
|
+
export interface ScenePreviewInput {
|
|
43
|
+
scenePath?: string;
|
|
44
|
+
/** Wire framing: a preset, "free", or "bookmark:<name>". */
|
|
45
|
+
framing?: string;
|
|
46
|
+
size?: [number, number];
|
|
47
|
+
nodePath?: string;
|
|
48
|
+
cameraPath?: string;
|
|
49
|
+
cameraPosition?: string;
|
|
50
|
+
cameraLookAt?: string;
|
|
51
|
+
fov?: number;
|
|
52
|
+
marks?: boolean;
|
|
53
|
+
maxMarks?: number;
|
|
54
|
+
}
|
|
55
|
+
export declare const MAX_MARKS_CAP = 128;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve screenshot args into the ScenePreview input. Infers framing "free"
|
|
58
|
+
* from a camera pose and "bookmark" from a bookmark_name when `framing` is
|
|
59
|
+
* omitted; refuses (ToolInputError, nothing sent) when they contradict a
|
|
60
|
+
* preset, when "free" lacks half its pose, or when "bookmark" has no name.
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildScenePreviewInput(args: ScenePreviewArgs): ScenePreviewInput;
|
|
63
|
+
/** True for the wave-I fixed-pose framings ("free", "bookmark:<name>"). */
|
|
64
|
+
export declare function isFixedPoseFraming(wireFraming: string | undefined): boolean;
|
|
65
|
+
export interface SceneMark {
|
|
66
|
+
id: number;
|
|
67
|
+
path: string;
|
|
68
|
+
class: string;
|
|
69
|
+
screen_rect?: {
|
|
70
|
+
x: number;
|
|
71
|
+
y: number;
|
|
72
|
+
w: number;
|
|
73
|
+
h: number;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export interface SceneMarksSummary {
|
|
77
|
+
marks: SceneMark[];
|
|
78
|
+
skipped?: number;
|
|
79
|
+
candidates?: number;
|
|
80
|
+
truncated?: boolean;
|
|
81
|
+
maxMarks?: number;
|
|
82
|
+
/** "2d_scene" when the engine could not mark this scene. */
|
|
83
|
+
unsupported?: string;
|
|
84
|
+
}
|
|
85
|
+
/** Read the Set-of-Mark fields off a ScenePreview payload (`metadata` of the
|
|
86
|
+
* EngineSnapshot). Returns null when the payload carries no marks key at all —
|
|
87
|
+
* i.e. the engine ignored `marks:true` (an older build). */
|
|
88
|
+
export declare function readSceneMarks(payload: Record<string, unknown> | undefined): SceneMarksSummary | null;
|
|
89
|
+
export interface CameraPose {
|
|
90
|
+
position?: string;
|
|
91
|
+
look_at?: string;
|
|
92
|
+
fov?: number;
|
|
93
|
+
}
|
|
94
|
+
/** camera_pose {position, look_at, fov} as the engine echoes it (3dp literals). */
|
|
95
|
+
export declare function readCameraPose(payload: Record<string, unknown> | undefined): CameraPose | null;
|
|
96
|
+
/** One compact line per mark so the model can map a numbered label in the
|
|
97
|
+
* image to a node path: `1 -> Props/Crate_02 (MeshInstance3D) @ 120,80 200x140`. */
|
|
98
|
+
export declare function formatSceneMarks(summary: SceneMarksSummary): string[];
|
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Camera viewpoints (perception): camera bookmarks and the fixed-pose
|
|
3
|
+
* ScenePreview framings. Shared by the MCP tools (src/mcp/tools/visual-tools.ts)
|
|
4
|
+
* and the CLI dispatcher so both faces validate the same way and send the same
|
|
5
|
+
* op.
|
|
6
|
+
*
|
|
7
|
+
* Engine contract (doc/SUMMER/SCENE_SCRIPTING_CONTRACTS.md, "Wave I"):
|
|
8
|
+
* SaveCameraBookmark { name, position?, look_at?, fov? } -> pose_source
|
|
9
|
+
* ListCameraBookmarks {} -> names, bookmarks
|
|
10
|
+
* DeleteCameraBookmark { name } -> remaining
|
|
11
|
+
* and ScenePreview framings "free" (camera_position, camera_look_at, fov) and
|
|
12
|
+
* "bookmark:<name>" plus the Set-of-Mark overlay (marks, max_marks).
|
|
13
|
+
*
|
|
14
|
+
* Bookmarks live in the PROJECT (res://.summer/camera_bookmarks.json), so a
|
|
15
|
+
* viewpoint saved once is the same viewpoint next session and on another
|
|
16
|
+
* machine — the point is before/after screenshots that actually line up.
|
|
17
|
+
*/
|
|
18
|
+
import { ToolInputError } from "../tool-errors.js";
|
|
19
|
+
export const CAMERA_BOOKMARK_ACTIONS = ["save", "list", "delete"];
|
|
20
|
+
/** Engine op kind per action — the pre-flight checks THIS kind, not all three. */
|
|
21
|
+
export const CAMERA_BOOKMARK_OPS = {
|
|
22
|
+
save: "SaveCameraBookmark",
|
|
23
|
+
list: "ListCameraBookmarks",
|
|
24
|
+
delete: "DeleteCameraBookmark",
|
|
25
|
+
};
|
|
26
|
+
/** What the engine_lacks_op result tells the model to do instead. */
|
|
27
|
+
export const CAMERA_BOOKMARK_FALLBACK = "pass the pose explicitly on every capture with summer_screenshot framing:\"free\" (camera_position + camera_look_at), or render through a Camera3D placed in the scene with framing:\"camera\"";
|
|
28
|
+
/** Bookmark name grammar (preview_ops.cpp): 1-64 of [A-Za-z0-9_-]. */
|
|
29
|
+
export const BOOKMARK_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
30
|
+
function requireBookmarkName(name, action) {
|
|
31
|
+
const trimmed = name?.trim() ?? "";
|
|
32
|
+
if (!trimmed) {
|
|
33
|
+
throw new ToolInputError(`action "${action}" needs a bookmark name (1-64 of A-Z a-z 0-9 _ -). Nothing was sent.`);
|
|
34
|
+
}
|
|
35
|
+
if (!BOOKMARK_NAME_PATTERN.test(trimmed)) {
|
|
36
|
+
throw new ToolInputError(`Bookmark name "${trimmed}" is invalid — use 1-64 characters from A-Z a-z 0-9 _ - (no spaces or slashes). Nothing was sent.`);
|
|
37
|
+
}
|
|
38
|
+
return trimmed;
|
|
39
|
+
}
|
|
40
|
+
/** Build the engine op for one bookmark action. Throws ToolInputError (nothing
|
|
41
|
+
* sent) for a missing/invalid name or a half-given pose. */
|
|
42
|
+
export function buildCameraBookmarkOp(args) {
|
|
43
|
+
const kind = CAMERA_BOOKMARK_OPS[args.action];
|
|
44
|
+
if (!kind) {
|
|
45
|
+
throw new ToolInputError(`Unknown action "${String(args.action)}". Use save, list, or delete.`);
|
|
46
|
+
}
|
|
47
|
+
if (args.action === "list")
|
|
48
|
+
return { op: kind };
|
|
49
|
+
const name = requireBookmarkName(args.name, args.action);
|
|
50
|
+
if (args.action === "delete")
|
|
51
|
+
return { op: kind, name };
|
|
52
|
+
const op = { op: kind, name };
|
|
53
|
+
const position = args.position?.trim();
|
|
54
|
+
const lookAt = args.look_at?.trim();
|
|
55
|
+
if ((position && !lookAt) || (!position && lookAt)) {
|
|
56
|
+
throw new ToolInputError("position and look_at go together: pass both as Godot literals (\"Vector3(x, y, z)\") for an explicit pose, or omit both to capture the CURRENT editor 3D viewport camera. Nothing was sent.");
|
|
57
|
+
}
|
|
58
|
+
if (position && lookAt) {
|
|
59
|
+
op.position = position;
|
|
60
|
+
op.look_at = lookAt;
|
|
61
|
+
}
|
|
62
|
+
if (args.fov !== undefined)
|
|
63
|
+
op.fov = args.fov;
|
|
64
|
+
return op;
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// ScenePreview framing (summer_screenshot target:"scene")
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
export const PRESET_FRAMINGS = ["auto", "iso", "top", "front", "back", "left", "right", "camera"];
|
|
70
|
+
export const FIXED_POSE_FRAMINGS = ["free", "bookmark"];
|
|
71
|
+
/** The framing enum both faces expose. "bookmark" pairs with `bookmark_name`
|
|
72
|
+
* (the wire form is "bookmark:<name>"; the enum stays closed so the
|
|
73
|
+
* descriptor/zod parity holds and agents see a finite list). */
|
|
74
|
+
export const SCREENSHOT_FRAMINGS = [...PRESET_FRAMINGS, ...FIXED_POSE_FRAMINGS];
|
|
75
|
+
export const MAX_MARKS_CAP = 128;
|
|
76
|
+
/**
|
|
77
|
+
* Resolve screenshot args into the ScenePreview input. Infers framing "free"
|
|
78
|
+
* from a camera pose and "bookmark" from a bookmark_name when `framing` is
|
|
79
|
+
* omitted; refuses (ToolInputError, nothing sent) when they contradict a
|
|
80
|
+
* preset, when "free" lacks half its pose, or when "bookmark" has no name.
|
|
81
|
+
*/
|
|
82
|
+
export function buildScenePreviewInput(args) {
|
|
83
|
+
const position = args.camera_position?.trim();
|
|
84
|
+
const lookAt = args.camera_look_at?.trim();
|
|
85
|
+
const bookmark = args.bookmark_name?.trim();
|
|
86
|
+
let framing = args.framing;
|
|
87
|
+
if (!framing) {
|
|
88
|
+
if (bookmark)
|
|
89
|
+
framing = "bookmark";
|
|
90
|
+
else if (position || lookAt)
|
|
91
|
+
framing = "free";
|
|
92
|
+
}
|
|
93
|
+
if (framing === "bookmark") {
|
|
94
|
+
if (!bookmark) {
|
|
95
|
+
throw new ToolInputError('framing:"bookmark" needs bookmark_name — the name you saved with summer_camera_bookmark (list them with action:"list"). Nothing was sent.');
|
|
96
|
+
}
|
|
97
|
+
if (!BOOKMARK_NAME_PATTERN.test(bookmark)) {
|
|
98
|
+
throw new ToolInputError(`bookmark_name "${bookmark}" is invalid — bookmark names are 1-64 characters from A-Z a-z 0-9 _ -. Nothing was sent.`);
|
|
99
|
+
}
|
|
100
|
+
if (position || lookAt) {
|
|
101
|
+
throw new ToolInputError('framing:"bookmark" takes its pose from the bookmark; drop camera_position/camera_look_at, or use framing:"free" with both. Nothing was sent.');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else if (framing === "free") {
|
|
105
|
+
if (!position || !lookAt) {
|
|
106
|
+
throw new ToolInputError('framing:"free" needs BOTH camera_position and camera_look_at as Godot literals ("Vector3(x, y, z)"). Nothing was sent.');
|
|
107
|
+
}
|
|
108
|
+
if (bookmark) {
|
|
109
|
+
throw new ToolInputError('framing:"free" and bookmark_name contradict each other — use framing:"bookmark" with bookmark_name, or framing:"free" with a pose. Nothing was sent.');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (framing && (position || lookAt || bookmark)) {
|
|
113
|
+
throw new ToolInputError(`framing:"${framing}" is a fixed preset; camera_position/camera_look_at need framing:"free" and bookmark_name needs framing:"bookmark". Nothing was sent.`);
|
|
114
|
+
}
|
|
115
|
+
if (args.max_marks !== undefined && (!Number.isInteger(args.max_marks) || args.max_marks < 1 || args.max_marks > MAX_MARKS_CAP)) {
|
|
116
|
+
throw new ToolInputError(`max_marks must be an integer from 1 through ${MAX_MARKS_CAP}. Nothing was sent.`);
|
|
117
|
+
}
|
|
118
|
+
const input = {};
|
|
119
|
+
if (args.scenePath)
|
|
120
|
+
input.scenePath = args.scenePath;
|
|
121
|
+
if (framing)
|
|
122
|
+
input.framing = framing === "bookmark" ? `bookmark:${bookmark}` : framing;
|
|
123
|
+
if (args.size)
|
|
124
|
+
input.size = args.size;
|
|
125
|
+
if (args.nodePath)
|
|
126
|
+
input.nodePath = args.nodePath;
|
|
127
|
+
if (args.camera_path)
|
|
128
|
+
input.cameraPath = args.camera_path;
|
|
129
|
+
if (framing === "free") {
|
|
130
|
+
input.cameraPosition = position;
|
|
131
|
+
input.cameraLookAt = lookAt;
|
|
132
|
+
}
|
|
133
|
+
if (args.fov !== undefined && (framing === "free" || framing === "bookmark"))
|
|
134
|
+
input.fov = args.fov;
|
|
135
|
+
if (args.marks !== undefined)
|
|
136
|
+
input.marks = args.marks;
|
|
137
|
+
if (args.max_marks !== undefined)
|
|
138
|
+
input.maxMarks = args.max_marks;
|
|
139
|
+
return input;
|
|
140
|
+
}
|
|
141
|
+
/** True for the wave-I fixed-pose framings ("free", "bookmark:<name>"). */
|
|
142
|
+
export function isFixedPoseFraming(wireFraming) {
|
|
143
|
+
return wireFraming === "free" || (wireFraming?.startsWith("bookmark:") ?? false);
|
|
144
|
+
}
|
|
145
|
+
function num(value) {
|
|
146
|
+
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
147
|
+
}
|
|
148
|
+
/** Read the Set-of-Mark fields off a ScenePreview payload (`metadata` of the
|
|
149
|
+
* EngineSnapshot). Returns null when the payload carries no marks key at all —
|
|
150
|
+
* i.e. the engine ignored `marks:true` (an older build). */
|
|
151
|
+
export function readSceneMarks(payload) {
|
|
152
|
+
if (!payload || !("marks" in payload))
|
|
153
|
+
return null;
|
|
154
|
+
const raw = Array.isArray(payload.marks) ? payload.marks : [];
|
|
155
|
+
const marks = [];
|
|
156
|
+
for (const entry of raw) {
|
|
157
|
+
if (!entry || typeof entry !== "object")
|
|
158
|
+
continue;
|
|
159
|
+
const mark = entry;
|
|
160
|
+
const id = num(mark.id);
|
|
161
|
+
if (id === undefined)
|
|
162
|
+
continue;
|
|
163
|
+
const rect = mark.screen_rect;
|
|
164
|
+
const x = num(rect?.x);
|
|
165
|
+
const y = num(rect?.y);
|
|
166
|
+
const w = num(rect?.w);
|
|
167
|
+
const h = num(rect?.h);
|
|
168
|
+
marks.push({
|
|
169
|
+
id,
|
|
170
|
+
path: typeof mark.path === "string" ? mark.path : "?",
|
|
171
|
+
class: typeof mark.class === "string" ? mark.class : "?",
|
|
172
|
+
...(x !== undefined && y !== undefined && w !== undefined && h !== undefined
|
|
173
|
+
? { screen_rect: { x, y, w, h } }
|
|
174
|
+
: {}),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
marks,
|
|
179
|
+
skipped: num(payload.marks_skipped),
|
|
180
|
+
candidates: num(payload.marks_candidates),
|
|
181
|
+
truncated: payload.marks_truncated === true ? true : undefined,
|
|
182
|
+
maxMarks: num(payload.max_marks),
|
|
183
|
+
unsupported: typeof payload.marks_unsupported === "string" ? payload.marks_unsupported : undefined,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/** camera_pose {position, look_at, fov} as the engine echoes it (3dp literals). */
|
|
187
|
+
export function readCameraPose(payload) {
|
|
188
|
+
const raw = payload?.camera_pose;
|
|
189
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
190
|
+
return null;
|
|
191
|
+
const pose = raw;
|
|
192
|
+
return {
|
|
193
|
+
position: typeof pose.position === "string" ? pose.position : undefined,
|
|
194
|
+
look_at: typeof pose.look_at === "string" ? pose.look_at : undefined,
|
|
195
|
+
fov: num(pose.fov),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/** One compact line per mark so the model can map a numbered label in the
|
|
199
|
+
* image to a node path: `1 -> Props/Crate_02 (MeshInstance3D) @ 120,80 200x140`. */
|
|
200
|
+
export function formatSceneMarks(summary) {
|
|
201
|
+
const lines = [];
|
|
202
|
+
if (summary.unsupported) {
|
|
203
|
+
lines.push(`marks: unsupported for this scene (${summary.unsupported}) — no overlay was drawn; the image carries no numbered labels.`);
|
|
204
|
+
return lines;
|
|
205
|
+
}
|
|
206
|
+
const counts = [];
|
|
207
|
+
if (summary.candidates !== undefined)
|
|
208
|
+
counts.push(`${summary.candidates} candidate(s)`);
|
|
209
|
+
if (summary.skipped)
|
|
210
|
+
counts.push(`${summary.skipped} skipped off-screen/extent-less`);
|
|
211
|
+
if (summary.truncated)
|
|
212
|
+
counts.push(`truncated at max_marks ${summary.maxMarks ?? "?"}`);
|
|
213
|
+
lines.push(`marks: ${summary.marks.length} numbered label(s) drawn${counts.length ? ` (${counts.join(", ")})` : ""}` +
|
|
214
|
+
(summary.marks.length ? " — label -> node path:" : "."));
|
|
215
|
+
for (const mark of summary.marks) {
|
|
216
|
+
const rect = mark.screen_rect
|
|
217
|
+
? ` @ ${Math.round(mark.screen_rect.x)},${Math.round(mark.screen_rect.y)} ${Math.round(mark.screen_rect.w)}x${Math.round(mark.screen_rect.h)}`
|
|
218
|
+
: "";
|
|
219
|
+
lines.push(` ${mark.id} -> ${mark.path} (${mark.class})${rect}`);
|
|
220
|
+
}
|
|
221
|
+
return lines;
|
|
222
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* capture — frame capture with the toolkit-side honesty checks, ONE copy for
|
|
3
|
+
* both faces (src/mcp/tools/visual-tools.ts renders the MCP caption from it;
|
|
4
|
+
* src/core/capabilities/tool-dispatch.ts returns the receipt as JSON).
|
|
5
|
+
*
|
|
6
|
+
* Frame honesty (E2E 2026-09-03, F-01 / F-05):
|
|
7
|
+
* - Every frame goes through a zero-dependency content check
|
|
8
|
+
* (./frame-quality.ts). A "viewport" frame that comes back flat (uniformly
|
|
9
|
+
* black/grey) is recaptured ONCE after a settle delay; the result says which
|
|
10
|
+
* frame it is and what the first one looked like, so no face can present a
|
|
11
|
+
* blank frame as evidence about the scene. Root-cause status is written in
|
|
12
|
+
* frame-quality.ts: the engine reads the editor SubViewport texture as-is
|
|
13
|
+
* (no forced draw, no blank retry), consistent with — but not proven to be —
|
|
14
|
+
* a not-yet-redrawn 2D subviewport right after the editor switched tabs.
|
|
15
|
+
* - The "scene" target's no-camera confession is phrased for the scene's
|
|
16
|
+
* kind: a 3D scene without a Camera3D plays grey/black; a 2D scene without
|
|
17
|
+
* a Camera2D simply plays from the origin and is NOT an error. The engine
|
|
18
|
+
* receipt reports scene_has_camera for both kinds without saying which, so
|
|
19
|
+
* the kind comes from a scene-tree read (./scene-kind.ts).
|
|
20
|
+
*/
|
|
21
|
+
import type { EngineSnapshot } from "../api-client.js";
|
|
22
|
+
import { type FrameQuality } from "./frame-quality.js";
|
|
23
|
+
import { type SceneKindResult } from "./scene-kind.js";
|
|
24
|
+
import type { ScenePreviewInput } from "./camera-view.js";
|
|
25
|
+
/** Settle delay before the single automatic viewport recapture. */
|
|
26
|
+
export declare const VIEWPORT_RECAPTURE_DELAY_MS = 700;
|
|
27
|
+
export interface RecaptureInfo {
|
|
28
|
+
delayMs: number;
|
|
29
|
+
/** Analysis of the flat frame that triggered the recapture. */
|
|
30
|
+
firstFrame: FrameQuality;
|
|
31
|
+
/** Set when the second capture itself failed — the FIRST frame is returned. */
|
|
32
|
+
error?: string;
|
|
33
|
+
}
|
|
34
|
+
/** EngineSnapshot plus the toolkit-side honesty fields both faces read. */
|
|
35
|
+
export type CaptureResult = EngineSnapshot & {
|
|
36
|
+
frameQuality?: FrameQuality;
|
|
37
|
+
recapture?: RecaptureInfo;
|
|
38
|
+
sceneKind?: SceneKindResult;
|
|
39
|
+
};
|
|
40
|
+
/** The ScenePreview input in its wire form (framing resolved to a preset,
|
|
41
|
+
* "free", or "bookmark:<name>"; camera pose / marks fields) is owned by
|
|
42
|
+
* ./camera-view.ts, where both faces build it from their arguments. */
|
|
43
|
+
export type { ScenePreviewInput } from "./camera-view.js";
|
|
44
|
+
/** The engine reads capture needs — a structural subset of EngineApiClient. */
|
|
45
|
+
export interface CaptureClient {
|
|
46
|
+
viewportSnapshot(): Promise<EngineSnapshot>;
|
|
47
|
+
scenePreview(input?: ScenePreviewInput): Promise<EngineSnapshot>;
|
|
48
|
+
gameSnapshot(): Promise<EngineSnapshot>;
|
|
49
|
+
getSceneState(scenePath?: string, options?: {
|
|
50
|
+
depth?: number;
|
|
51
|
+
limit?: number;
|
|
52
|
+
}): Promise<unknown>;
|
|
53
|
+
}
|
|
54
|
+
/** Stamp the content check onto a successful frame. */
|
|
55
|
+
export declare function analyzedSnapshot(snap: EngineSnapshot): CaptureResult;
|
|
56
|
+
/** Viewport capture with ONE automatic recapture when the first frame is flat. */
|
|
57
|
+
export declare function captureViewport(client: CaptureClient): Promise<CaptureResult>;
|
|
58
|
+
/** Offscreen scene render; when the engine confesses the scene has no camera
|
|
59
|
+
* of its own, read the tree to learn whether that is a 3D or a 2D scene. */
|
|
60
|
+
export declare function captureScene(client: CaptureClient, input: ScenePreviewInput): Promise<CaptureResult>;
|
|
61
|
+
/** Running-game frame with the content check (no recapture: a booting or
|
|
62
|
+
* fading game legitimately shows a flat frame). */
|
|
63
|
+
export declare function captureGame(client: CaptureClient): Promise<CaptureResult>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { analyzeFrameBase64 } from "./frame-quality.js";
|
|
2
|
+
import { classifySceneKindFromTree } from "./scene-kind.js";
|
|
3
|
+
import { sleep } from "../util/sleep.js";
|
|
4
|
+
/** Settle delay before the single automatic viewport recapture. */
|
|
5
|
+
export const VIEWPORT_RECAPTURE_DELAY_MS = 700;
|
|
6
|
+
/** Bounds for the scene-kind tree read (the engine honours depth/limit only on
|
|
7
|
+
* scene-targeted reads; an untargeted read is the depth-2 snapshot). */
|
|
8
|
+
const SCENE_KIND_TREE_DEPTH = 8;
|
|
9
|
+
const SCENE_KIND_TREE_LIMIT = 600;
|
|
10
|
+
/** Stamp the content check onto a successful frame. */
|
|
11
|
+
export function analyzedSnapshot(snap) {
|
|
12
|
+
if (!snap.ok || !snap.base64)
|
|
13
|
+
return snap;
|
|
14
|
+
return { ...snap, frameQuality: analyzeFrameBase64(snap.base64, snap.mime) };
|
|
15
|
+
}
|
|
16
|
+
function errorMessage(err) {
|
|
17
|
+
return err instanceof Error ? err.message : String(err);
|
|
18
|
+
}
|
|
19
|
+
/** Viewport capture with ONE automatic recapture when the first frame is flat. */
|
|
20
|
+
export async function captureViewport(client) {
|
|
21
|
+
const first = analyzedSnapshot(await client.viewportSnapshot());
|
|
22
|
+
const quality = first.frameQuality;
|
|
23
|
+
if (!quality?.analyzable || !quality.flat)
|
|
24
|
+
return first;
|
|
25
|
+
await sleep(VIEWPORT_RECAPTURE_DELAY_MS);
|
|
26
|
+
const recapture = { delayMs: VIEWPORT_RECAPTURE_DELAY_MS, firstFrame: quality };
|
|
27
|
+
let second;
|
|
28
|
+
try {
|
|
29
|
+
second = await client.viewportSnapshot();
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
return { ...first, recapture: { ...recapture, error: errorMessage(err) } };
|
|
33
|
+
}
|
|
34
|
+
if (!second.ok || !second.base64) {
|
|
35
|
+
return {
|
|
36
|
+
...first,
|
|
37
|
+
recapture: { ...recapture, error: second.error ?? "recapture returned no image data" },
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return { ...analyzedSnapshot(second), recapture };
|
|
41
|
+
}
|
|
42
|
+
/** Offscreen scene render; when the engine confesses the scene has no camera
|
|
43
|
+
* of its own, read the tree to learn whether that is a 3D or a 2D scene. */
|
|
44
|
+
export async function captureScene(client, input) {
|
|
45
|
+
const snap = analyzedSnapshot(await client.scenePreview(input));
|
|
46
|
+
if (!snap.ok || !snap.base64 || snap.sceneHasCamera !== false)
|
|
47
|
+
return snap;
|
|
48
|
+
return { ...snap, sceneKind: await readSceneKind(client, input.scenePath) };
|
|
49
|
+
}
|
|
50
|
+
/** Running-game frame with the content check (no recapture: a booting or
|
|
51
|
+
* fading game legitimately shows a flat frame). */
|
|
52
|
+
export async function captureGame(client) {
|
|
53
|
+
return analyzedSnapshot(await client.gameSnapshot());
|
|
54
|
+
}
|
|
55
|
+
async function readSceneKind(client, scenePath) {
|
|
56
|
+
try {
|
|
57
|
+
const trimmed = scenePath?.trim();
|
|
58
|
+
const targeted = trimmed && trimmed !== "." && trimmed !== "./" ? trimmed : undefined;
|
|
59
|
+
const state = targeted
|
|
60
|
+
? await client.getSceneState(targeted, { depth: SCENE_KIND_TREE_DEPTH, limit: SCENE_KIND_TREE_LIMIT })
|
|
61
|
+
: await client.getSceneState();
|
|
62
|
+
return classifySceneKindFromTree(state);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return { kind: "unknown", reason: errorMessage(err) };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope note stamped on every shaped summer_get_console result.
|
|
3
|
+
*
|
|
4
|
+
* E2E 2026-09-03 F-07: right after a play session that produced four runtime
|
|
5
|
+
* errors, `summer_get_console` reported `errors 0` — correctly. The editor
|
|
6
|
+
* Output panel (EditorLog) never received them: a running game's errors are
|
|
7
|
+
* collected by the debugger (summer_get_debugger_errors / the `debugger`
|
|
8
|
+
* section of summer_get_diagnostics). The engine types console lines straight
|
|
9
|
+
* from EditorLog::MSG_TYPE (error / warning / std / editor — debug_ops.cpp
|
|
10
|
+
* GetConsoleOutput), so dropping `std` lines by default hides nothing that
|
|
11
|
+
* was an error; the trap is treating this tool's count as the post-play
|
|
12
|
+
* verdict at all. The note travels with the result because tool descriptions
|
|
13
|
+
* are read once and results are read every time.
|
|
14
|
+
*/
|
|
15
|
+
export declare const CONSOLE_SCOPE_NOTE = "Editor Output panel only. Runtime errors from a played game are collected by the debugger, not here \u2014 this count is NOT the post-play verdict. Read summer_get_diagnostics (console + debugger + script errors together) or summer_get_debugger_errors for that.";
|
|
16
|
+
/** Attach `_scope` to a shaped console result. Non-object results pass through. */
|
|
17
|
+
export declare function withConsoleScope<T>(result: T): T;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scope note stamped on every shaped summer_get_console result.
|
|
3
|
+
*
|
|
4
|
+
* E2E 2026-09-03 F-07: right after a play session that produced four runtime
|
|
5
|
+
* errors, `summer_get_console` reported `errors 0` — correctly. The editor
|
|
6
|
+
* Output panel (EditorLog) never received them: a running game's errors are
|
|
7
|
+
* collected by the debugger (summer_get_debugger_errors / the `debugger`
|
|
8
|
+
* section of summer_get_diagnostics). The engine types console lines straight
|
|
9
|
+
* from EditorLog::MSG_TYPE (error / warning / std / editor — debug_ops.cpp
|
|
10
|
+
* GetConsoleOutput), so dropping `std` lines by default hides nothing that
|
|
11
|
+
* was an error; the trap is treating this tool's count as the post-play
|
|
12
|
+
* verdict at all. The note travels with the result because tool descriptions
|
|
13
|
+
* are read once and results are read every time.
|
|
14
|
+
*/
|
|
15
|
+
export const CONSOLE_SCOPE_NOTE = "Editor Output panel only. Runtime errors from a played game are collected by the debugger, not here — this count is NOT the post-play verdict. Read summer_get_diagnostics (console + debugger + script errors together) or summer_get_debugger_errors for that.";
|
|
16
|
+
/** Attach `_scope` to a shaped console result. Non-object results pass through. */
|
|
17
|
+
export function withConsoleScope(result) {
|
|
18
|
+
if (!result || typeof result !== "object" || Array.isArray(result))
|
|
19
|
+
return result;
|
|
20
|
+
return { ...result, _scope: CONSOLE_SCOPE_NOTE };
|
|
21
|
+
}
|
|
@@ -1,27 +1,6 @@
|
|
|
1
|
-
export type CreatorOperation = "publish" | "releases"
|
|
1
|
+
export type CreatorOperation = "publish" | "releases";
|
|
2
2
|
export type CreatorFace = "cli" | "mcp";
|
|
3
3
|
export declare const CREATOR_API_CONTRACT: "summer.creator.v1";
|
|
4
|
-
export declare const CREATOR_API_AUDIT: {
|
|
5
|
-
readonly auditedAt: "2026-07-30";
|
|
6
|
-
readonly repository: "SummerEngine/summercraft";
|
|
7
|
-
readonly contract: "summer.creator.v1";
|
|
8
|
-
readonly credentialAudience: "summercraft-creator";
|
|
9
|
-
readonly requiredServerScope: "publish";
|
|
10
|
-
readonly operations: {
|
|
11
|
-
readonly publish: {
|
|
12
|
-
readonly supported: true;
|
|
13
|
-
readonly route: "/api/creator/v1/publish";
|
|
14
|
-
};
|
|
15
|
-
readonly releases: {
|
|
16
|
-
readonly supported: true;
|
|
17
|
-
readonly route: "/api/creator/v1/releases";
|
|
18
|
-
};
|
|
19
|
-
readonly logs: {
|
|
20
|
-
readonly supported: false;
|
|
21
|
-
readonly route: null;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
4
|
export declare class CreatorOperationError extends Error {
|
|
26
5
|
readonly code: string;
|
|
27
6
|
readonly operation: CreatorOperation;
|
|
@@ -84,10 +63,3 @@ export interface CreatorReleasesResult {
|
|
|
84
63
|
nextCursor: string | null;
|
|
85
64
|
}
|
|
86
65
|
export declare function listCreatorReleases(input: ListCreatorReleasesInput, overrides?: Partial<CreatorClientDependencies>): Promise<CreatorReleasesResult>;
|
|
87
|
-
export interface ReadCreatorLogsInput {
|
|
88
|
-
projectId?: string;
|
|
89
|
-
releaseId?: string;
|
|
90
|
-
limit?: number;
|
|
91
|
-
face: CreatorFace;
|
|
92
|
-
}
|
|
93
|
-
export declare function readCreatorLogs(input: ReadCreatorLogsInput): Promise<never>;
|