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,764 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: scene-scripting
|
|
3
|
+
description: Use when building or modifying a scene takes more than a couple of node/property calls — scattering instances, procedural meshes, booleans/lathe/sweep geometry, terrain, GridMap fills, lighting rigs, keyframe animation, shader FX, 2D levels (tilemaps, sprites, bodies, cameras, parallax), HUDs and Control trees, persisted signal wiring, attached scripts, prefabs, input actions/autoloads/main scene, or anything with computed placement. Runs one GDScript inside the live editor via summer_run_script instead of long CRUD chains, verifies with summer_snapshot_diff + summer_screenshot, and checks API names with summer_api_docs instead of guessing.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Scene Scripting
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
`summer_run_script` executes a GDScript **inside the live editor, against the currently open scene**. One script replaces a chain of `summer_add_node` / `summer_set_prop` calls, and it can do what CRUD ops cannot: loops, randomness, math, procedural geometry, reading existing nodes before deciding.
|
|
11
|
+
|
|
12
|
+
**The rule: 3 or more related ops, or ANY computed placement → write a script.** A single property tweak → `summer_set_prop`. A cold project-wide batch job → `summer_run_editor_script` (see below).
|
|
13
|
+
|
|
14
|
+
## The contract
|
|
15
|
+
|
|
16
|
+
Your source is just the function — no `extends`, no `@tool`:
|
|
17
|
+
|
|
18
|
+
```gdscript
|
|
19
|
+
func run(ctx):
|
|
20
|
+
var root = ctx.get_scene_root()
|
|
21
|
+
var node := MeshInstance3D.new()
|
|
22
|
+
node.mesh = BoxMesh.new()
|
|
23
|
+
root.add_child(node)
|
|
24
|
+
ctx.set_owner_recursive(node) # REQUIRED — see owner rules
|
|
25
|
+
ctx.report("added", node.name)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- `ctx.get_scene_root()` — root node of the open scene.
|
|
29
|
+
- `ctx.set_owner_recursive(node)` — stamp a created subtree with the scene-root owner.
|
|
30
|
+
- `ctx.report(key, value)` — structured results back to you (`reports` in the result).
|
|
31
|
+
- `print(...)` — captured into `output`.
|
|
32
|
+
- Values are real GDScript: `Vector3(0, 10, 0)`, `Color(1, 0, 0, 1)`. The quoted variant-string convention (`"Vector3(0, 10, 0)"`) belongs to `summer_set_prop`, not to script code.
|
|
33
|
+
- Budget: `max_seconds` default 20, clamp 5–120. The script blocks the editor between frames — keep it fast; move heavy batch work to `summer_run_editor_script`. On newer engines the budget is a HARD deadline: overrun raises the script error `"Summer script budget exceeded (Ns)"` (result `budget_enforced: true`). Split the work into smaller scripts — never resubmit the same oversized one.
|
|
34
|
+
- Transactions: newer engines wrap the run in ONE named undo action (`undo: "action"`, the default) and roll it back on a mid-script runtime error — the result then carries `rolled_back: true` and the scene is untouched. Pass `undo: "none"` for v1 behavior (checkpoint only, partial mutations survive an error). Older engines ignore the param; treat any `errors` there as a possible half-applied mutation.
|
|
35
|
+
|
|
36
|
+
## The ctx stdlib (newer engines)
|
|
37
|
+
|
|
38
|
+
Creation helpers that **set the owner for you** (to the edited scene root) and return the created node — prefer them over the manual `new()` + `add_child` + `set_owner_recursive` dance. Frozen signatures:
|
|
39
|
+
|
|
40
|
+
```gdscript
|
|
41
|
+
add_node(type: String, name: String, parent: Node = null, props: Dictionary = {}) -> Node
|
|
42
|
+
find(name: String) -> Node # recursive in edited scene; null on miss
|
|
43
|
+
get_or_create(type: String, name: String, parent: Node = null) -> Node
|
|
44
|
+
instance_scene(res_path: String, parent: Node = null, name: String = "") -> Node
|
|
45
|
+
add_mesh(shape: String, name: String, parent: Node = null, props: Dictionary = {}) -> MeshInstance3D
|
|
46
|
+
# shape: box|sphere|capsule|cylinder|plane
|
|
47
|
+
add_mesh_with_collision(shape, name, parent = null, props = {}) -> MeshInstance3D
|
|
48
|
+
# + StaticBody3D/CollisionShape3D child matching the mesh
|
|
49
|
+
mesh_from_arrays(vertices: PackedVector3Array, indices: PackedInt32Array,
|
|
50
|
+
uvs: PackedVector2Array = [], name: String = "Mesh",
|
|
51
|
+
parent: Node = null) -> MeshInstance3D
|
|
52
|
+
make_material(props: Dictionary) -> StandardMaterial3D
|
|
53
|
+
apply_material(node: Node, material: Material) -> bool
|
|
54
|
+
grid(count_x: int, count_z: int, spacing: Vector3, maker: Callable) -> Array
|
|
55
|
+
# maker(i: int, pos: Vector3) -> Node
|
|
56
|
+
scatter(area: AABB, count: int, maker: Callable, seed: int = 0) -> Array
|
|
57
|
+
add_light_rig(target: Node = null) -> Node3D # key/fill/rim under one Node3D
|
|
58
|
+
ensure_environment(props: Dictionary = {}) -> WorldEnvironment
|
|
59
|
+
add_camera(position: Vector3, look_at: Vector3 = Vector3.ZERO,
|
|
60
|
+
make_current: bool = false) -> Camera3D
|
|
61
|
+
summary() -> Dictionary # counts by class, lights, cameras, scene AABB
|
|
62
|
+
save_scene(path: String = "") -> bool # ownership audit first; false + report on audit failure
|
|
63
|
+
frames_budget_exceeded() -> bool
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`props` dictionaries apply via `set()` per key; unknown keys are collected into a `prop_warnings` report entry, never silently dropped — read it. On an **older engine** a missing helper is a plain GDScript error (`Invalid call to method 'add_mesh'…`): fall back to the manual form, which works everywhere.
|
|
67
|
+
|
|
68
|
+
## The geometry & authoring stdlib (geometry tier)
|
|
69
|
+
|
|
70
|
+
Newer engines extend ctx with a second tier: real geometry (booleans, lathe, sweep, terrain), mesh post-processing (smooth, decimate, UVs, mirror, collision), keyframe animation, and text shaders. Frozen signatures:
|
|
71
|
+
|
|
72
|
+
```gdscript
|
|
73
|
+
boolean(a: Node, b: Node, op: String = "union") -> MeshInstance3D
|
|
74
|
+
# op: union|difference|intersection. Manifold-exact CSG, baked to a plain
|
|
75
|
+
# ArrayMesh — no live CSG nodes remain. a and b are CONSUMED (freed) by
|
|
76
|
+
# default; pass keep_inputs: bool = true as the final param to keep them.
|
|
77
|
+
extrude_polygon(points: PackedVector2Array, depth: float, name: String,
|
|
78
|
+
parent: Node = null) -> MeshInstance3D # 2D footprint -> prism, baked
|
|
79
|
+
lathe(points: PackedVector2Array, name: String, parent: Node = null,
|
|
80
|
+
spin_degrees: float = 360.0, sides: int = 32) -> MeshInstance3D # revolve a profile, baked
|
|
81
|
+
sweep(points: PackedVector2Array, path_points: PackedVector3Array,
|
|
82
|
+
name: String, parent: Node = null) -> MeshInstance3D # profile swept along a 3D path, baked
|
|
83
|
+
# add_mesh shapes extended: torus | text (props.text: String, TextMesh)
|
|
84
|
+
set_smooth(node: Node, angle_deg: float = 30.0) -> bool # shade smooth by angle
|
|
85
|
+
terrain(size: Vector2, height: float, seed: int, name: String,
|
|
86
|
+
parent: Node = null, image_path: String = "") -> MeshInstance3D
|
|
87
|
+
# noise heightfield (or heightmap image via image_path); adds
|
|
88
|
+
# HeightMapShape3D collision under a StaticBody3D child automatically
|
|
89
|
+
decimate(node: Node, ratio: float) -> bool # simplify mesh to ~ratio of triangles
|
|
90
|
+
convex_collision(node: Node, decompose: bool = false) -> Node
|
|
91
|
+
# single convex hull, or multi-shape convex decomposition when decompose;
|
|
92
|
+
# ALL created bodies are owned — they survive the save
|
|
93
|
+
uv_planar(node: Node, axis: String = "y", scale: float = 1.0) -> bool
|
|
94
|
+
uv_box(node: Node, scale: float = 1.0) -> bool # make textures land on generated geometry
|
|
95
|
+
mirror(node: Node, axis: String = "x") -> Node # mirrored duplicate
|
|
96
|
+
animate(node: Node, property: String, keys: Array, anim_name: String = "",
|
|
97
|
+
loop: bool = false, player: AnimationPlayer = null) -> AnimationPlayer
|
|
98
|
+
# keys: [[time_s, value], ...]; gets-or-creates the AnimationPlayer and
|
|
99
|
+
# library; position/rotation/scale get dedicated 3D tracks (rotation keys
|
|
100
|
+
# are converted for you — never hand-build quaternion tracks)
|
|
101
|
+
make_shader(code: String, params: Dictionary = {}) -> ShaderMaterial
|
|
102
|
+
# builds Shader + ShaderMaterial from source and sets shader parameters;
|
|
103
|
+
# compile errors come back VERBATIM in the result (the `make_shader_errors`
|
|
104
|
+
# report entry, plus errors[]) — read them
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Conventions, same as the rest of the stdlib: creation helpers set the owner and return the created node; bad input produces a per-helper `report` entry plus a `null`/`false` return, never a crash; every baked mesh carries generated normals (and tangents where UVs exist). On an older engine these helpers are missing — the CSG-node fallback recipe below still works everywhere.
|
|
108
|
+
|
|
109
|
+
## The animation stdlib (animation tier)
|
|
110
|
+
|
|
111
|
+
Character-animation USAGE on top of `animate()` — state machines, method tracks, bone poses, head tracking. Same conventions. Frozen signatures:
|
|
112
|
+
|
|
113
|
+
```gdscript
|
|
114
|
+
animate(...) v2 — additive extensions, signature unchanged:
|
|
115
|
+
# keys entries also accept {time, value, interpolation: "nearest"|"linear"|"cubic"}
|
|
116
|
+
# property may target bones: "<skeleton_node>:<bone_name>/position|rotation|scale"
|
|
117
|
+
# -> creates bone position_3d/rotation_3d/scale_3d tracks (path "Skeleton:bone")
|
|
118
|
+
animate_method(node: Node, calls: Array, anim_name: String = "",
|
|
119
|
+
loop: bool = false, player: AnimationPlayer = null) -> AnimationPlayer
|
|
120
|
+
# calls: [[time_s, method_name, args_array], ...] -> one method-call track
|
|
121
|
+
anim_state_machine(target: Node, spec: Dictionary,
|
|
122
|
+
player: AnimationPlayer = null) -> AnimationTree
|
|
123
|
+
# spec: { states: {name: clip_name}, transitions: [[from, to, {auto?: bool,
|
|
124
|
+
# blend_s?: float}], ...], start: name }
|
|
125
|
+
# get-or-create AnimationTree wired to the (found or given) player,
|
|
126
|
+
# AnimationNodeStateMachine, active=true; unknown clip names -> report
|
|
127
|
+
# entry listing the player's actual clips (never silent)
|
|
128
|
+
bone_pose(skeleton: Node, bone: String, pose: Dictionary) -> bool
|
|
129
|
+
# pose keys position/rotation/scale -> set_bone_pose_* on Skeleton3D;
|
|
130
|
+
# unknown bone -> false + report listing bone names (capped 64)
|
|
131
|
+
look_at_modifier(node: Node, target: Node, props: Dictionary = {}) -> Node
|
|
132
|
+
# LookAtModifier3D under the skeleton/node, owned
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Blend shapes key through plain `animate()` with property `"blend_shapes/<name>"` (value tracks) — no separate helper. The end-to-end recipe (inspect an imported rig's real clips/bones, locomotion wiring, footstep method tracks, root motion, the raw-GDScript fallback for engines without these helpers) lives in `character-animation-wiring` — one hop, not duplicated here.
|
|
136
|
+
|
|
137
|
+
## The game-completeness stdlib (game-completeness tier: 2D, UI, gameplay code)
|
|
138
|
+
|
|
139
|
+
Everything a script needs to produce a GAME, not just a 3D scene: 2D levels, Control trees, persisted signal connections, attached scripts, prefabs, project settings. Same conventions (owner-by-default, return the node, `prop_warnings`, structured report entries on failure — never silent). 2D helpers work in any edited scene (root may be `Node2D` or `Node`); Control helpers parent under the edited root unless a parent is given. Frozen signatures:
|
|
140
|
+
|
|
141
|
+
```gdscript
|
|
142
|
+
# 2D
|
|
143
|
+
add_sprite(texture_path: String, name: String, parent: Node = null,
|
|
144
|
+
props: Dictionary = {}) -> Sprite2D # missing texture -> report + null
|
|
145
|
+
add_animated_sprite(frames: Dictionary, name: String, parent: Node = null,
|
|
146
|
+
autoplay: String = "") -> AnimatedSprite2D
|
|
147
|
+
# frames: { anim_name: { frames: [texture_paths], fps: float, loop: bool } } -> SpriteFrames
|
|
148
|
+
add_tilemap(tileset_path: String, name: String, parent: Node = null) -> TileMapLayer
|
|
149
|
+
paint_tiles(layer: TileMapLayer, cells: Array, source_id: int,
|
|
150
|
+
atlas_coords: Vector2i = Vector2i.ZERO) -> int # cells: [Vector2i]; returns count
|
|
151
|
+
paint_rect(layer: TileMapLayer, rect: Rect2i, source_id: int,
|
|
152
|
+
atlas_coords: Vector2i = Vector2i.ZERO) -> int
|
|
153
|
+
add_body_2d(kind: String, name: String, parent: Node = null,
|
|
154
|
+
shape: Dictionary = {}, props: Dictionary = {}) -> Node
|
|
155
|
+
# kind: static|rigid|character|area ; shape: {type: rect|circle|capsule, size|radius|height}
|
|
156
|
+
# -> body + owned CollisionShape2D child. Empty shape = a 32x32 rect (confessed in
|
|
157
|
+
# prop_warnings); size may be a float (square); props try the body, then the shape
|
|
158
|
+
add_camera_2d(position: Vector2, zoom: Vector2 = Vector2.ONE, make_current: bool = true,
|
|
159
|
+
limits: Rect2i = Rect2i()) -> Camera2D # empty limits = unlimited
|
|
160
|
+
# Camera2D has no saved "current" flag: make_current persists as `enabled` (+ a live
|
|
161
|
+
# make_current()); make_current: false saves the camera disabled
|
|
162
|
+
add_parallax(layers: Array, name: String, parent: Node = null) -> Node
|
|
163
|
+
# layers: [{texture: path, motion_scale: Vector2, repeat: Vector2i}] -> one Parallax2D per
|
|
164
|
+
# layer under one Node2D group; repeat -> repeat_size. Parallax2D is in the engine tree
|
|
165
|
+
# (no ParallaxBackground fallback); a layer whose texture fails to load is skipped + reported
|
|
166
|
+
|
|
167
|
+
# UI (Control)
|
|
168
|
+
add_ui(kind: String, name: String, parent: Node = null, props: Dictionary = {}) -> Control
|
|
169
|
+
# kind: label|button|panel|vbox|hbox|grid|margin|texture_rect|progress_bar|line_edit|
|
|
170
|
+
# rich_text|color_rect|center ; panel -> PanelContainer (container semantics for HUD
|
|
171
|
+
# layouts; a plain Panel is add_node("Panel", ...)). props.anchor: full_rect|center|
|
|
172
|
+
# top_left|top_right|bottom_left|bottom_right|top_wide|bottom_wide (+ the other
|
|
173
|
+
# Control::PRESET_* names) -> set_anchors_and_offsets_preset, applied BEFORE the other
|
|
174
|
+
# props so an explicit size/position wins; props.text/custom_minimum_size/etc via set();
|
|
175
|
+
# props.texture as a "res://" path is loaded for you. A Control parented under a Node2D
|
|
176
|
+
# gets a prop_warning (it scrolls with the camera — HUDs go under add_canvas_layer)
|
|
177
|
+
add_canvas_layer(name: String, layer: int = 1, parent: Node = null) -> CanvasLayer
|
|
178
|
+
set_theme_overrides(control: Control, overrides: Dictionary) -> int
|
|
179
|
+
# {font_size: int, font_color: Color, <theme_item>: value} -> add_theme_*_override; count applied
|
|
180
|
+
# dispatch by value: Color or "#hex" -> color; int/float -> font_size when the key is/ends with
|
|
181
|
+
# font_size, else constant; StyleBox/Font/Texture2D (or a "res://" path) -> style/font/icon.
|
|
182
|
+
# An item the control's theme type does not define is stored but confessed in prop_warnings
|
|
183
|
+
connect_signal(emitter: Node, signal_name: String, target: Node, method: String,
|
|
184
|
+
binds: Array = []) -> bool # PERSIST flag so it saves in .tscn;
|
|
185
|
+
# unknown signal/method -> report, false
|
|
186
|
+
# NOT `connect` — a ctx method of that name would shadow Object.connect on the ctx object,
|
|
187
|
+
# so nothing named `connect` is bound. Method gate: target.has_method, else its script
|
|
188
|
+
# has_method, else the script SOURCE declares `func <method>(` (attached this run, not yet
|
|
189
|
+
# compiled). Already connected -> true (+ already_connected in the report). Both ends must
|
|
190
|
+
# be owned by the edited root for the .tscn to carry the connection (prop_warning otherwise)
|
|
191
|
+
|
|
192
|
+
# Gameplay-code lane
|
|
193
|
+
attach_script(node: Node, source: String, path: String = "") -> Script
|
|
194
|
+
# compile-validate first (GDScriptLanguage::validate; parse errors -> `attach_script_errors`
|
|
195
|
+
# report entry {node, path, errors: [{line, column, message}]}, null, nothing written);
|
|
196
|
+
# path empty -> res://scripts/<SceneName>/<NodeName>.gd (dirs created; the root node's name
|
|
197
|
+
# when the scene was never saved, prop_warning); writes the file, FS rescan, set_script.
|
|
198
|
+
# An existing file at path IS overwritten; its previous sha is recorded in the report (the
|
|
199
|
+
# pre-run checkpoint covers rollback). Gate: the script's native base (`extends`) must be an
|
|
200
|
+
# ancestor of the node's class — else the file is written but NOT attached (report, null)
|
|
201
|
+
make_prefab(node: Node, path: String, replace_with_instance: bool = true) -> Node
|
|
202
|
+
# pack the subtree to res:// path as a PackedScene (owner fix-up first), save; when
|
|
203
|
+
# replace_with_instance the node is swapped for an instance of the new file (same
|
|
204
|
+
# name/transform/parent; outgoing persisted connections re-established) and the instance
|
|
205
|
+
# is returned; else returns node. REFUSES the scene root and a path open in an editor tab.
|
|
206
|
+
# The node's own position is zeroed for the pack (prefab authored at its origin, like the
|
|
207
|
+
# editor's Save Branch) and restored / copied onto the instance; rotation and scale stay in
|
|
208
|
+
# the prefab. A failure AFTER the file was written keeps + returns the original node (report)
|
|
209
|
+
add_autoload(name: String, path: String) -> bool # ProjectSettings autoload/<name>="*res://…"
|
|
210
|
+
# same gates as the editor's autoload dock: valid identifier, no engine/global-class
|
|
211
|
+
# collision, existing res:// path to a Script or PackedScene
|
|
212
|
+
add_input_action(action: String, events: Array) -> bool
|
|
213
|
+
# events: [{type: key, keycode: String|int} | {type: mouse_button, button_index: int} |
|
|
214
|
+
# {type: joypad_button, button_index: int} | {type: joypad_axis, axis:int, value:float}]
|
|
215
|
+
# writes input/<action> = {deadzone, events} in ProjectSettings + saves; every event is
|
|
216
|
+
# built BEFORE anything is written — unknown shape -> report, false, nothing half-written.
|
|
217
|
+
# New action: deadzone = the engine default 0.2. Existing action: keeps its deadzone and
|
|
218
|
+
# gains only the events it does not already match. Keycode strings go through
|
|
219
|
+
# find_keycode ("Space", "Left", "Ctrl+S" — modifiers become the event's modifier flags)
|
|
220
|
+
set_main_scene(path: String) -> bool # application/run/main_scene + save
|
|
221
|
+
# path must exist and be a PackedScene
|
|
222
|
+
# Project settings are written in the res:// PATH form ("*res://…", "res://…"); the editor UI
|
|
223
|
+
# writes uid:// forms — both resolve. Do not "fix" one into the other.
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Engine posture. Read before relying on any of this.** The game-completeness tier is a frozen contract that not every engine build exposes yet; treat it with the same preview posture as `summer_run_script` itself (which returns `engine_lacks_op` on engines without RunSceneScript). On an engine that has RunSceneScript but predates this tier, a missing helper is a plain GDScript error (`Invalid call to method 'add_ui'…`) and, under the default `undo: "action"`, the whole run rolls back. Fall back to what works everywhere:
|
|
227
|
+
|
|
228
|
+
| Game-completeness helper | Works on every engine |
|
|
229
|
+
|---|---|
|
|
230
|
+
| `add_tilemap` / `paint_tiles` / `paint_rect` | `TileMapLayer.new()` + `layer.tile_set = load(path)`, then `layer.set_cell(coords, source_id, atlas_coords)` in a loop — the GridMap recipe, in 2D |
|
|
231
|
+
| `add_sprite` / `add_animated_sprite` / `add_body_2d` / `add_camera_2d` / `add_parallax` | manual `.new()` + `add_child` + `ctx.set_owner_recursive` |
|
|
232
|
+
| `add_ui` / `add_canvas_layer` / `set_theme_overrides` | `.new()` + `set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)` + `add_theme_constant_override(...)`, owned as above — or the `ui-basics` skill's `summer_add_node` / `summer_set_prop` path |
|
|
233
|
+
| `connect_signal` | `summer_connect_signal` (persists in the `.tscn`); a raw `emitter.pressed.connect(...)` inside the run script does NOT persist |
|
|
234
|
+
| `attach_script` | `summer_write_file` the source, `summer_get_script_errors` on it, then `node.set_script(load(path))` in a script |
|
|
235
|
+
| `make_prefab` | `PackedScene.new().pack(node)` + `ResourceSaver.save(...)` (pack includes only OWNED descendants — owner rules again), then `summer_instantiate_scene` |
|
|
236
|
+
| `add_input_action` / `add_autoload` / `set_main_scene` | `summer_input_map_bind`; `summer_project_setting` (`autoload/<Name>`, `application/run/main_scene`) |
|
|
237
|
+
|
|
238
|
+
**Undo posture.** File-writing helpers (`attach_script`, `make_prefab`) and project-settings helpers (`add_autoload`, `add_input_action`, `set_main_scene`) are covered by the pre-run checkpoint, NOT by the packed-scene undo action — a `rolled_back: true` result has reverted the scene but not those files or settings. The result's `undo_action` note says so whenever any of them ran (`files_written: [paths]`, `project_settings_changed: [keys]`): read it, and surface `no_rewind_point: true` to the user before more work of this kind.
|
|
239
|
+
|
|
240
|
+
## Owner rules — the silent killer
|
|
241
|
+
|
|
242
|
+
<EXTREMELY-IMPORTANT>
|
|
243
|
+
**Every node you create must be owned by the scene root, or it silently vanishes when the scene saves.** Descendants too — being under an owned node is NOT enough. `add_child` succeeds, the screenshot even shows it, and the saved `.tscn` is missing it.
|
|
244
|
+
|
|
245
|
+
```gdscript
|
|
246
|
+
root.add_child(node)
|
|
247
|
+
ctx.set_owner_recursive(node) # node + every descendant
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
`ctx.set_owner_recursive(node)` is the ctx helper for exactly this; the manual form is `node.owner = root` on the node AND each descendant. Either way, set owners AFTER `add_child` — owner assignment fails on a node not yet in the tree.
|
|
251
|
+
</EXTREMELY-IMPORTANT>
|
|
252
|
+
|
|
253
|
+
## The loop
|
|
254
|
+
|
|
255
|
+
1. `summer_world_snapshot` — the structured BEFORE baseline; keep its `snapshot_id`.
|
|
256
|
+
2. `summer_api_docs` — verify every property/method name you are not certain of.
|
|
257
|
+
3. `summer_run_script` — run the script.
|
|
258
|
+
4. Read `errors`, `reports`, and `rolled_back` in the result — `rolled_back: true` means a runtime error undid everything (fix and re-run); on older engines / `undo: "none"`, an error can leave a partial mutation.
|
|
259
|
+
5. `summer_snapshot_diff from_id:<the id>` — the structural receipt: exactly the nodes you meant to add were added, nothing else changed, nothing vanished (an unowned node dropping on save shows up HERE).
|
|
260
|
+
6. `summer_screenshot` — LOOK at it. Use `target:"scene" framing:"camera"` when the change touched lighting, environment, or emissive materials — the preset framings render a flat substitute environment and cannot show those.
|
|
261
|
+
7. Iterate. Never claim visual success without steps 5–6 (honesty rule: a capture is a fact; describing an unseen frame is fabrication). The full perception discipline lives in `verifying-scenes`.
|
|
262
|
+
|
|
263
|
+
## Verify names with summer_api_docs — never guess
|
|
264
|
+
|
|
265
|
+
Wrong property names fail silently or throw mid-script after half the mutation applied. Before using an unfamiliar class:
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
summer_api_docs class_name:"CylinderMesh" → all properties/methods
|
|
269
|
+
summer_api_docs class_name:"BoxShape3D" member:"size" → {type:"Vector3", default:"Vector3(1, 1, 1)"}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Entries list only members **declared on that class** — `position` lives on `Node3D`, not `MeshInstance3D`. Walk `inherits` upward when a member seems missing.
|
|
273
|
+
|
|
274
|
+
## Recipes
|
|
275
|
+
|
|
276
|
+
### Scatter N instances with randomized transforms
|
|
277
|
+
|
|
278
|
+
```gdscript
|
|
279
|
+
func run(ctx):
|
|
280
|
+
var root = ctx.get_scene_root()
|
|
281
|
+
var rng := RandomNumberGenerator.new()
|
|
282
|
+
rng.seed = 12345 # deterministic re-runs
|
|
283
|
+
var source: PackedScene = load("res://props/tree.tscn")
|
|
284
|
+
for i in range(40):
|
|
285
|
+
var tree := source.instantiate()
|
|
286
|
+
root.add_child(tree)
|
|
287
|
+
ctx.set_owner_recursive(tree) # owns the whole instanced subtree
|
|
288
|
+
tree.position = Vector3(rng.randf_range(-20, 20), 0, rng.randf_range(-20, 20))
|
|
289
|
+
tree.rotation.y = rng.randf_range(0, TAU)
|
|
290
|
+
var s := rng.randf_range(0.8, 1.3)
|
|
291
|
+
tree.scale = Vector3(s, s, s)
|
|
292
|
+
ctx.report("scattered", 40)
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Procedural mesh via SurfaceTool
|
|
296
|
+
|
|
297
|
+
```gdscript
|
|
298
|
+
func run(ctx):
|
|
299
|
+
var root = ctx.get_scene_root()
|
|
300
|
+
var st := SurfaceTool.new()
|
|
301
|
+
st.begin(Mesh.PRIMITIVE_TRIANGLES)
|
|
302
|
+
st.set_normal(Vector3.UP)
|
|
303
|
+
st.add_vertex(Vector3(0, 0, 0))
|
|
304
|
+
st.add_vertex(Vector3(1, 0, 0))
|
|
305
|
+
st.add_vertex(Vector3(0, 0, 1))
|
|
306
|
+
var mesh := st.commit() # ArrayMesh
|
|
307
|
+
var mi := MeshInstance3D.new()
|
|
308
|
+
mi.mesh = mesh
|
|
309
|
+
mi.name = "GeneratedMesh"
|
|
310
|
+
root.add_child(mi)
|
|
311
|
+
ctx.set_owner_recursive(mi)
|
|
312
|
+
ctx.report("surfaces", mesh.get_surface_count())
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
For grids/heightfields, build `PackedVector3Array`s and feed `ArrayMesh.add_surface_from_arrays` directly. Call `st.generate_normals()` before `commit()` when you did not set normals by hand.
|
|
316
|
+
|
|
317
|
+
### CSG primitives (fast blockouts)
|
|
318
|
+
|
|
319
|
+
```gdscript
|
|
320
|
+
func run(ctx):
|
|
321
|
+
var root = ctx.get_scene_root()
|
|
322
|
+
var body := CSGCombiner3D.new()
|
|
323
|
+
body.name = "Blockout"
|
|
324
|
+
root.add_child(body)
|
|
325
|
+
var box := CSGBox3D.new()
|
|
326
|
+
box.size = Vector3(6, 3, 6)
|
|
327
|
+
body.add_child(box)
|
|
328
|
+
var hole := CSGCylinder3D.new()
|
|
329
|
+
hole.operation = CSGShape3D.OPERATION_SUBTRACTION
|
|
330
|
+
hole.radius = 1.0
|
|
331
|
+
hole.height = 7.0
|
|
332
|
+
body.add_child(hole)
|
|
333
|
+
ctx.set_owner_recursive(body) # owner is the SCENE root, not the parent
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Live CSG nodes are the **older-engine fallback** — they re-evaluate every frame and should be converted before shipping (`scene-composition`). On a geometry-tier engine prefer `ctx.boolean(...)`, which bakes to a plain ArrayMesh and leaves no CSG nodes behind.
|
|
337
|
+
|
|
338
|
+
### Boolean blockout — carve a doorway (geometry tier)
|
|
339
|
+
|
|
340
|
+
Box minus box, baked. The inputs are consumed; only the result remains.
|
|
341
|
+
|
|
342
|
+
```gdscript
|
|
343
|
+
func run(ctx):
|
|
344
|
+
var wall := ctx.add_mesh("box", "Wall", null, {"size": Vector3(6, 3, 0.3)})
|
|
345
|
+
var hole := ctx.add_mesh("box", "DoorHole", null, {"size": Vector3(1.0, 2.1, 0.5)})
|
|
346
|
+
hole.position = Vector3(0, -0.45, 0) # sink the opening to floor level
|
|
347
|
+
var carved := ctx.boolean(wall, hole, "difference")
|
|
348
|
+
if carved == null:
|
|
349
|
+
return # reports carry the reason — read them
|
|
350
|
+
carved.name = "WallWithDoorway"
|
|
351
|
+
ctx.uv_box(carved) # boolean output needs UVs to take a texture
|
|
352
|
+
ctx.report("doorway", str(carved.get_path()))
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Then `summer_snapshot_diff` must show `Wall` and `DoorHole` GONE and `WallWithDoorway` added — leftover inputs mean the boolean failed and returned null. Screenshot to check the opening is where you meant.
|
|
356
|
+
|
|
357
|
+
### Lathe a goblet / pillar (geometry tier)
|
|
358
|
+
|
|
359
|
+
`lathe` revolves a 2D profile (x = radius, y = height) around Y. Design the profile from the axis outward.
|
|
360
|
+
|
|
361
|
+
```gdscript
|
|
362
|
+
func run(ctx):
|
|
363
|
+
var profile := PackedVector2Array([
|
|
364
|
+
Vector2(0.0, 0.0), Vector2(0.45, 0.0), # foot
|
|
365
|
+
Vector2(0.08, 0.1), Vector2(0.08, 0.55), # stem
|
|
366
|
+
Vector2(0.35, 0.7), Vector2(0.4, 1.1), # bowl
|
|
367
|
+
Vector2(0.0, 1.15),
|
|
368
|
+
])
|
|
369
|
+
var goblet := ctx.lathe(profile, "Goblet", null, 360.0, 48)
|
|
370
|
+
ctx.set_smooth(goblet, 40.0) # lathes look faceted without it
|
|
371
|
+
ctx.apply_material(goblet, ctx.make_material({"albedo_color": Color(0.85, 0.7, 0.2), "metallic": 0.8, "roughness": 0.25}))
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
A square-ish profile with `sides: 8` and `spin_degrees: 360` makes a chamfered pillar; `spin_degrees: 180` makes an apse/half-dome.
|
|
375
|
+
|
|
376
|
+
### Sweep a rail / pipe (geometry tier)
|
|
377
|
+
|
|
378
|
+
`sweep` extrudes a 2D cross-section along a 3D polyline.
|
|
379
|
+
|
|
380
|
+
```gdscript
|
|
381
|
+
func run(ctx):
|
|
382
|
+
var section := PackedVector2Array([ # small circle-ish octagon, the pipe wall
|
|
383
|
+
Vector2(0.05, 0), Vector2(0.035, 0.035), Vector2(0, 0.05), Vector2(-0.035, 0.035),
|
|
384
|
+
Vector2(-0.05, 0), Vector2(-0.035, -0.035), Vector2(0, -0.05), Vector2(0.035, -0.035),
|
|
385
|
+
])
|
|
386
|
+
var path := PackedVector3Array([
|
|
387
|
+
Vector3(0, 1, 0), Vector3(4, 1, 0), Vector3(6, 1, 2), Vector3(6, 3, 6),
|
|
388
|
+
])
|
|
389
|
+
var pipe := ctx.sweep(section, path, "SteamPipe")
|
|
390
|
+
ctx.set_smooth(pipe, 45.0)
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
Rails, roads, cables, gutters — same recipe, different cross-section. Keep path points a reasonable distance apart; hairpin corners self-intersect.
|
|
394
|
+
|
|
395
|
+
### Terrain with collision (geometry tier)
|
|
396
|
+
|
|
397
|
+
```gdscript
|
|
398
|
+
func run(ctx):
|
|
399
|
+
var ground := ctx.terrain(Vector2(64, 64), 6.0, 1337, "Terrain")
|
|
400
|
+
ctx.apply_material(ground, ctx.make_material({"albedo_color": Color(0.35, 0.5, 0.25), "roughness": 1.0}))
|
|
401
|
+
ctx.report("terrain", ctx.summary())
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
Collision arrives automatically (a `StaticBody3D` + `HeightMapShape3D` child), already owned. Same seed → same terrain, so re-runs are deterministic. Pass `image_path` to drive heights from a grayscale heightmap instead of noise. Verify with `summer_screenshot framing:"camera"` — terrain reads wrong from preset framings' top-down angles.
|
|
405
|
+
|
|
406
|
+
### Text signage (geometry tier)
|
|
407
|
+
|
|
408
|
+
`add_mesh` accepts `torus` and `text` on geometry-tier engines:
|
|
409
|
+
|
|
410
|
+
```gdscript
|
|
411
|
+
func run(ctx):
|
|
412
|
+
var sign := ctx.add_mesh("text", "ExitSign", null, {"text": "EXIT", "depth": 0.08})
|
|
413
|
+
sign.position = Vector3(0, 2.6, -4)
|
|
414
|
+
ctx.apply_material(sign, ctx.make_material({"albedo_color": Color(1, 0.2, 0.2), "emission_enabled": true, "emission": Color(1, 0.1, 0.1), "emission_energy_multiplier": 3.0}))
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Emissive text only proves itself in a `framing:"camera"` screenshot — preset framings substitute the environment and mute emission.
|
|
418
|
+
|
|
419
|
+
### Decimate for LOD, convex collision for props (geometry tier)
|
|
420
|
+
|
|
421
|
+
Dense generated/imported meshes (Meshy-class output) want both before they ship:
|
|
422
|
+
|
|
423
|
+
```gdscript
|
|
424
|
+
func run(ctx):
|
|
425
|
+
var prop := ctx.find("AncientStatue") # e.g. a generated import
|
|
426
|
+
if prop == null:
|
|
427
|
+
ctx.report("error", "AncientStatue not found")
|
|
428
|
+
return
|
|
429
|
+
ctx.decimate(prop, 0.35) # keep ~35% of the triangles
|
|
430
|
+
var body := ctx.convex_collision(prop, true) # V-HACD multi-shape for concave props
|
|
431
|
+
ctx.report("collision_body", str(body.get_path()))
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
`decimate` returns `false` (with a report entry) instead of ruining the mesh when the ratio is out of range. `convex_collision` owns every body it creates — the diff after `save_scene` is your receipt that nothing was silently dropped. Simple convex props (crates, rocks): leave `decompose` false, one hull is cheaper.
|
|
435
|
+
|
|
436
|
+
### Mirror symmetry (geometry tier)
|
|
437
|
+
|
|
438
|
+
```gdscript
|
|
439
|
+
func run(ctx):
|
|
440
|
+
var left_tower := ctx.find("Tower")
|
|
441
|
+
var right_tower := ctx.mirror(left_tower, "x") # mirrored duplicate, owned
|
|
442
|
+
right_tower.name = "TowerMirrored"
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
The mirror is a real duplicate with flipped winding/normals — edit either side independently afterward.
|
|
446
|
+
|
|
447
|
+
### Animate — camera flythrough and a door-open (geometry tier)
|
|
448
|
+
|
|
449
|
+
`animate` collapses the AnimationPlayer/library/track boilerplate into one call per property. Multiple calls with the same `anim_name` append tracks to the same clip.
|
|
450
|
+
|
|
451
|
+
```gdscript
|
|
452
|
+
func run(ctx):
|
|
453
|
+
var cam := ctx.add_camera(Vector3(0, 4, 12), Vector3.ZERO, true)
|
|
454
|
+
ctx.animate(cam, "position", [
|
|
455
|
+
[0.0, Vector3(0, 4, 12)],
|
|
456
|
+
[4.0, Vector3(8, 5, 4)],
|
|
457
|
+
[8.0, Vector3(0, 6, -10)],
|
|
458
|
+
], "flythrough")
|
|
459
|
+
ctx.animate(cam, "rotation_degrees", [
|
|
460
|
+
[0.0, Vector3(-10, 0, 0)],
|
|
461
|
+
[4.0, Vector3(-12, 60, 0)],
|
|
462
|
+
[8.0, Vector3(-15, 175, 0)],
|
|
463
|
+
], "flythrough") # same clip — second track appended
|
|
464
|
+
|
|
465
|
+
var door := ctx.find("Door")
|
|
466
|
+
ctx.animate(door, "rotation_degrees", [
|
|
467
|
+
[0.0, Vector3(0, 0, 0)],
|
|
468
|
+
[0.8, Vector3(0, 110, 0)],
|
|
469
|
+
], "open")
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
Pass plain `position` / `rotation_degrees` values — the helper picks the right track type and handles the quaternion conversion for rotation. Verify by playing: `summer_play`, trigger the clip (or set autoplay), `summer_screenshot target:"game"`, `summer_stop`.
|
|
473
|
+
|
|
474
|
+
### make_shader — dissolve / glow FX with the compile-error loop (geometry tier)
|
|
475
|
+
|
|
476
|
+
`make_shader` is the safe lane for text shaders because compile errors come back **verbatim** in the result (the `make_shader_errors` report entry, with the line number) instead of failing silently to a magenta material:
|
|
477
|
+
|
|
478
|
+
```gdscript
|
|
479
|
+
func run(ctx):
|
|
480
|
+
var mat := ctx.make_shader("""
|
|
481
|
+
shader_type spatial;
|
|
482
|
+
uniform float threshold : hint_range(0.0, 1.0) = 0.3;
|
|
483
|
+
uniform vec4 edge_color : source_color = vec4(1.0, 0.55, 0.1, 1.0);
|
|
484
|
+
void fragment() {
|
|
485
|
+
float n = fract(sin(dot(UV * 12.0, vec2(12.9898, 78.233))) * 43758.5453);
|
|
486
|
+
if (n < threshold) { discard; }
|
|
487
|
+
ALBEDO = vec3(0.8);
|
|
488
|
+
EMISSION = edge_color.rgb * smoothstep(threshold + 0.08, threshold, n) * 4.0;
|
|
489
|
+
}
|
|
490
|
+
""", {"threshold": 0.35})
|
|
491
|
+
ctx.apply_material(ctx.find("Crystal"), mat)
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
The loop when it fails: read the exact compile error (line number included) from the `make_shader_errors` report entry → fix that line → re-run. Do not guess-and-mutate; the error text names the line and identifier. For production-grade dissolve/fire/glow (FBM noise include, controllers, cookbook variants) use the `vfx-<effect>` recipes — `make_shader` is the fast lane for one-off FX and for iterating on a shader before writing it to a file.
|
|
495
|
+
|
|
496
|
+
### GridMap fills
|
|
497
|
+
|
|
498
|
+
```gdscript
|
|
499
|
+
func run(ctx):
|
|
500
|
+
var root = ctx.get_scene_root()
|
|
501
|
+
var grid: GridMap = root.get_node("GridMap") # needs mesh_library assigned
|
|
502
|
+
for x in range(16):
|
|
503
|
+
for z in range(16):
|
|
504
|
+
grid.set_cell_item(Vector3i(x, 0, z), 0) # item = MeshLibrary index
|
|
505
|
+
ctx.report("cells", 256)
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
Cells serialize into packed data — scripting is the ONLY sane way to fill them; never hand-edit `tile_map_data`-style fields as text.
|
|
509
|
+
|
|
510
|
+
### 3-point lighting rig
|
|
511
|
+
|
|
512
|
+
```gdscript
|
|
513
|
+
func run(ctx):
|
|
514
|
+
var root = ctx.get_scene_root()
|
|
515
|
+
var rig := Node3D.new()
|
|
516
|
+
rig.name = "LightRig"
|
|
517
|
+
root.add_child(rig)
|
|
518
|
+
|
|
519
|
+
var key := DirectionalLight3D.new()
|
|
520
|
+
key.name = "KeyLight"
|
|
521
|
+
key.light_energy = 1.2
|
|
522
|
+
key.shadow_enabled = true
|
|
523
|
+
key.rotation_degrees = Vector3(-45, -30, 0)
|
|
524
|
+
|
|
525
|
+
var fill := OmniLight3D.new()
|
|
526
|
+
fill.name = "FillLight"
|
|
527
|
+
fill.light_energy = 0.4
|
|
528
|
+
fill.position = Vector3(-4, 2, 4)
|
|
529
|
+
|
|
530
|
+
var rim := SpotLight3D.new()
|
|
531
|
+
rim.name = "RimLight"
|
|
532
|
+
rim.light_energy = 0.8
|
|
533
|
+
rim.position = Vector3(0, 3, -5)
|
|
534
|
+
rim.rotation_degrees = Vector3(-20, 180, 0)
|
|
535
|
+
|
|
536
|
+
for light in [key, fill, rim]:
|
|
537
|
+
rig.add_child(light)
|
|
538
|
+
ctx.set_owner_recursive(rig)
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
Then `summer_screenshot` — lighting is exactly the kind of change you cannot judge without pixels.
|
|
542
|
+
|
|
543
|
+
### 2D platformer level — tilemap paint, character body, camera limits, parallax (game-completeness tier)
|
|
544
|
+
|
|
545
|
+
One script lays down the level: paint the ground, drop a character body with collision, bound the camera to the level, stack parallax behind it. Tile coordinates are cells; camera limits are pixels (cells × tile size — 32 here).
|
|
546
|
+
|
|
547
|
+
```gdscript
|
|
548
|
+
func run(ctx):
|
|
549
|
+
const TILE := 32
|
|
550
|
+
var ground := ctx.add_tilemap("res://tilesets/grass.tres", "Ground")
|
|
551
|
+
var painted := ctx.paint_rect(ground, Rect2i(0, 12, 64, 4), 0, Vector2i(0, 0)) # floor: 64 wide, 4 deep
|
|
552
|
+
painted += ctx.paint_rect(ground, Rect2i(20, 8, 6, 1), 0, Vector2i(1, 0)) # a floating platform
|
|
553
|
+
painted += ctx.paint_tiles(ground, [Vector2i(10, 11), Vector2i(11, 11), Vector2i(12, 11)], 0, Vector2i(2, 0)) # a step
|
|
554
|
+
ctx.report("tiles_painted", painted)
|
|
555
|
+
|
|
556
|
+
var player := ctx.add_body_2d("character", "Player", null,
|
|
557
|
+
{"type": "capsule", "radius": 14.0, "height": 60.0},
|
|
558
|
+
{"position": Vector2(3 * TILE, 11 * TILE)})
|
|
559
|
+
ctx.add_sprite("res://sprites/player_idle.png", "Sprite", player)
|
|
560
|
+
|
|
561
|
+
var cam := ctx.add_camera_2d(player.position, Vector2(2, 2), true, Rect2i(0, 0, 64 * TILE, 16 * TILE))
|
|
562
|
+
cam.reparent(player, false) # follow the body...
|
|
563
|
+
cam.position = Vector2.ZERO
|
|
564
|
+
ctx.set_owner_recursive(cam) # ...and re-stamp the owner after ANY reparent
|
|
565
|
+
|
|
566
|
+
ctx.add_parallax([
|
|
567
|
+
{"texture": "res://backgrounds/sky.png", "motion_scale": Vector2(0.1, 0.1), "repeat": Vector2i(1024, 0)},
|
|
568
|
+
{"texture": "res://backgrounds/hills.png", "motion_scale": Vector2(0.4, 0.4), "repeat": Vector2i(1024, 0)},
|
|
569
|
+
], "Background")
|
|
570
|
+
ctx.report("level", ctx.summary())
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
Compare `tiles_painted` with the cell areas you asked for (256 + 6 + 3 here) — a short count means cells were skipped. Then `summer_snapshot_diff`: `added` must list `Ground`, `Player` **with its `CollisionShape2D` child**, the camera under `Player`, and the `Background` group with one `Parallax2D` per layer. Screenshot `target:"scene" nodePath:"Player"` to see the body standing on the floor row, then the whole scene to see the platform is reachable. Movement needs the controller script and the input actions — two recipes below. Want a working baseline instead of a blank scene? The `2d-platformer` template already has tilemap + `CharacterBody2D` + parallax wired.
|
|
574
|
+
|
|
575
|
+
### Animated sprite (game-completeness tier)
|
|
576
|
+
|
|
577
|
+
`add_animated_sprite` builds the `SpriteFrames` resource from per-frame texture paths — one entry per animation, `fps` and `loop` per clip — and optionally autoplays one. Cut a sheet into frames first (`summer_slice_asset_sheet`, or the `sprite-sheet` skill when generating them).
|
|
578
|
+
|
|
579
|
+
```gdscript
|
|
580
|
+
func run(ctx):
|
|
581
|
+
var player := ctx.find("Player")
|
|
582
|
+
if player == null:
|
|
583
|
+
ctx.report("error", "Player not found")
|
|
584
|
+
return
|
|
585
|
+
var anim := ctx.add_animated_sprite({
|
|
586
|
+
"idle": {"frames": ["res://sprites/player/idle_0.png", "res://sprites/player/idle_1.png"], "fps": 4.0, "loop": true},
|
|
587
|
+
"run": {"frames": ["res://sprites/player/run_0.png", "res://sprites/player/run_1.png",
|
|
588
|
+
"res://sprites/player/run_2.png", "res://sprites/player/run_3.png"], "fps": 12.0, "loop": true},
|
|
589
|
+
"jump": {"frames": ["res://sprites/player/jump_0.png"], "fps": 1.0, "loop": false},
|
|
590
|
+
}, "Anim", player, "idle")
|
|
591
|
+
ctx.report("animations", anim.sprite_frames.get_animation_names())
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
A missing texture path comes back as a report entry — read it before wondering why a clip is short. Which clip plays when is gameplay code (`anim.play("run")` from the controller's `_physics_process`), not scene setup. Verify by playing: `summer_play`, move, `summer_screenshot target:"game"` — an edit-time preview shows frame 0 only.
|
|
595
|
+
|
|
596
|
+
### HUD — canvas layer, margin, vbox, label/progress/button, anchors, theme overrides (game-completeness tier)
|
|
597
|
+
|
|
598
|
+
```gdscript
|
|
599
|
+
func run(ctx):
|
|
600
|
+
var hud := ctx.add_canvas_layer("HUD", 1)
|
|
601
|
+
var margin := ctx.add_ui("margin", "Margin", hud, {"anchor": "full_rect"})
|
|
602
|
+
ctx.set_theme_overrides(margin, {"margin_left": 24, "margin_top": 24, "margin_right": 24, "margin_bottom": 24})
|
|
603
|
+
|
|
604
|
+
var column := ctx.add_ui("vbox", "TopLeft", margin)
|
|
605
|
+
var score := ctx.add_ui("label", "Score", column, {"text": "Score: 0"})
|
|
606
|
+
ctx.set_theme_overrides(score, {"font_size": 28, "font_color": Color(1, 1, 1)})
|
|
607
|
+
var health := ctx.add_ui("progress_bar", "Health", column,
|
|
608
|
+
{"min_value": 0, "max_value": 100, "value": 100, "show_percentage": false,
|
|
609
|
+
"custom_minimum_size": Vector2(240, 18)})
|
|
610
|
+
|
|
611
|
+
var pause := ctx.add_ui("button", "PauseButton", hud, {"text": "Pause", "anchor": "top_right"})
|
|
612
|
+
pause.process_mode = Node.PROCESS_MODE_ALWAYS # still clickable while the tree is paused
|
|
613
|
+
ctx.report("hud", ctx.summary())
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
`props.anchor` runs `set_anchors_and_offsets_preset` — the right way to pin a Control; hand-set `anchor_*`/`offset_*` values drift the moment the window resizes. The preset is applied before the other props, so an explicit `size`/`position` in the same dict wins. `add_ui("panel", …)` is a **PanelContainer** (it sizes to its child — a backdrop for a vbox/hbox); a plain `Panel` is `add_node("Panel", …)`. `set_theme_overrides` returns how many overrides it applied — compare with what you passed (an `int` on a key that is not `font_size` becomes a *constant* override, as with the margins above). Unknown `props` keys land in `prop_warnings` as always (use real property names: `custom_minimum_size`, not `min_size` or a guess). HUD Controls belong under a `CanvasLayer` — a Control parented under a `Node2D` scrolls with the camera and gets a `prop_warning`. For the layout and theme *design* — which container for which job, theme vs inline styling — use `ui-basics`; this is its one-script form.
|
|
617
|
+
|
|
618
|
+
### Wire a button with connect_signal() (game-completeness tier)
|
|
619
|
+
|
|
620
|
+
`ctx.connect_signal` makes a **persisted** connection (`CONNECT_PERSIST`) — it survives in the `.tscn`, exactly what the editor's ConnectionsDock writes. The target needs a method to call, so attach the script first; a script attached in the same run has not compiled yet, and `connect_signal` accepts it because the source declares `func _on_pause_pressed(` (the method gate):
|
|
621
|
+
|
|
622
|
+
```gdscript
|
|
623
|
+
func run(ctx):
|
|
624
|
+
var hud := ctx.find("HUD")
|
|
625
|
+
var button := ctx.find("PauseButton")
|
|
626
|
+
if ctx.attach_script(hud, """
|
|
627
|
+
extends CanvasLayer
|
|
628
|
+
|
|
629
|
+
func _on_pause_pressed() -> void:
|
|
630
|
+
get_tree().paused = not get_tree().paused
|
|
631
|
+
""") == null:
|
|
632
|
+
return # parse errors are in the report — fix, re-run
|
|
633
|
+
if not ctx.connect_signal(button, "pressed", hud, "_on_pause_pressed"):
|
|
634
|
+
return # the report names the unknown signal or method
|
|
635
|
+
ctx.report("wired", "PauseButton.pressed -> HUD._on_pause_pressed")
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
Never wire with a bare `button.pressed.connect(...)` inside the run script: that connection lives only in the editor process and is not saved. And the helper is `connect_signal`, not `connect` — `ctx.connect(...)` is `Object.connect` on the ctx object itself and fails with a wrong-signature error. `true` from `ctx.connect_signal` says the connection was made and flagged persistent (an already-connected pair also returns `true`, with `already_connected` in the report); both ends must be owned by the edited root or the `.tscn` cannot carry it. The proof is `summer_play`, click, `summer_screenshot target:"game"`.
|
|
639
|
+
|
|
640
|
+
### attach_script — behavior with the parse-error loop (game-completeness tier)
|
|
641
|
+
|
|
642
|
+
`attach_script` validates the source **before** writing anything: a parse error comes back as a report entry (with the line) and the return is `null` — no half-written file, no broken node. Empty `path` → `res://scripts/<SceneName>/<NodeName>.gd`.
|
|
643
|
+
|
|
644
|
+
```gdscript
|
|
645
|
+
func run(ctx):
|
|
646
|
+
var player := ctx.find("Player")
|
|
647
|
+
var script := ctx.attach_script(player, """
|
|
648
|
+
extends CharacterBody2D
|
|
649
|
+
|
|
650
|
+
const SPEED := 220.0
|
|
651
|
+
const JUMP_VELOCITY := -420.0
|
|
652
|
+
|
|
653
|
+
@onready var anim: AnimatedSprite2D = $Anim
|
|
654
|
+
|
|
655
|
+
func _physics_process(delta: float) -> void:
|
|
656
|
+
if not is_on_floor():
|
|
657
|
+
velocity += get_gravity() * delta
|
|
658
|
+
if Input.is_action_just_pressed("jump") and is_on_floor():
|
|
659
|
+
velocity.y = JUMP_VELOCITY
|
|
660
|
+
var dir := Input.get_axis("move_left", "move_right")
|
|
661
|
+
velocity.x = dir * SPEED
|
|
662
|
+
if dir != 0.0:
|
|
663
|
+
anim.flip_h = dir < 0.0
|
|
664
|
+
anim.play("jump" if not is_on_floor() else ("run" if dir != 0.0 else "idle"))
|
|
665
|
+
move_and_slide()
|
|
666
|
+
""")
|
|
667
|
+
if script == null:
|
|
668
|
+
return # read the report: line + message; fix THAT line; re-run
|
|
669
|
+
ctx.report("script", script.resource_path)
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
The loop: read the exact parse error (line and identifier) from the report → fix that line → re-run. Do not guess-and-mutate. An existing file at `path` is overwritten and its previous sha recorded in the report — the pre-run checkpoint is the rollback for that, not the undo action. Idioms (typed declarations, signals, `_ready` vs `_process`): `gdscript-patterns`. Later edits to a script already on disk: `summer_write_file` + `summer_get_script_errors`.
|
|
673
|
+
|
|
674
|
+
### make_prefab — turn a built subtree into a reusable .tscn (game-completeness tier)
|
|
675
|
+
|
|
676
|
+
Build the thing once in-scene, then pack it. With `replace_with_instance` (the default) the inline subtree is swapped for an instance of the new file — same name, transform, parent — and the instance is returned.
|
|
677
|
+
|
|
678
|
+
```gdscript
|
|
679
|
+
func run(ctx):
|
|
680
|
+
var torch := ctx.find("Torch") # Sprite2D + PointLight2D + Area2D you built above
|
|
681
|
+
if torch == null:
|
|
682
|
+
return
|
|
683
|
+
var first := ctx.make_prefab(torch, "res://prefabs/torch.tscn")
|
|
684
|
+
for i in range(3):
|
|
685
|
+
var t := ctx.instance_scene("res://prefabs/torch.tscn", null, "Torch%d" % (i + 2))
|
|
686
|
+
t.position = first.position + Vector2(160 * (i + 1), 0)
|
|
687
|
+
ctx.report("prefab", first.scene_file_path)
|
|
688
|
+
```
|
|
689
|
+
|
|
690
|
+
The owner fix-up runs before packing, so a child you forgot to own is included instead of silently dropped. The prefab is authored at its origin — the node's position is zeroed for the pack (the editor's Save Branch default) and copied back onto the instance, so `first.position` above is still where the torch stood; rotation and scale stay in the prefab. `make_prefab` refuses the scene root (pack a child subtree, never `ctx.get_scene_root()`) and a path that is open in an editor tab. The receipt: `res://prefabs/torch.tscn` in the result's `files_written`, `Torch` now reporting a `scene_file_path`, and the copies in the diff's `added`. From here on, edit the prefab file, not the instances.
|
|
691
|
+
|
|
692
|
+
### Input actions, autoload, main scene (game-completeness tier)
|
|
693
|
+
|
|
694
|
+
Project-level wiring in one run — the platformer controller above already reads these actions:
|
|
695
|
+
|
|
696
|
+
```gdscript
|
|
697
|
+
func run(ctx):
|
|
698
|
+
ctx.add_input_action("move_left", [{"type": "key", "keycode": "A"}, {"type": "key", "keycode": "Left"},
|
|
699
|
+
{"type": "joypad_axis", "axis": 0, "value": -1.0}])
|
|
700
|
+
ctx.add_input_action("move_right", [{"type": "key", "keycode": "D"}, {"type": "key", "keycode": "Right"},
|
|
701
|
+
{"type": "joypad_axis", "axis": 0, "value": 1.0}])
|
|
702
|
+
ctx.add_input_action("jump", [{"type": "key", "keycode": "Space"}, {"type": "joypad_button", "button_index": 0}])
|
|
703
|
+
ctx.add_autoload("GameState", "res://scripts/autoload/game_state.gd") # the file must exist — write it first
|
|
704
|
+
if ctx.save_scene("res://levels/level_01.tscn"):
|
|
705
|
+
ctx.set_main_scene("res://levels/level_01.tscn")
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
An unknown event shape → report + `false`, never a half-written action (every event is built before anything is written). A new action gets the engine's default deadzone, 0.2; re-running on an existing action keeps its deadzone and appends only the events it does not already match, so the recipe is safe to re-run. Keycode strings are `find_keycode` names (`"Space"`, `"Left"`, `"Ctrl+S"` — modifiers become the event's modifier flags). Write the autoload's script before registering it (`summer_write_file`, or `attach_script` on a node you then `make_prefab`) — `add_autoload` applies the editor dock's gates (valid identifier, no class-name collision, an existing `res://` Script or PackedScene). These helpers write the `res://` path form (`"*res://…"`, `"res://…"`); the editor UI writes `uid://` forms and both resolve — leave them be. They write `project.godot`, not the scene: the result's `undo_action` note lists them under `project_settings_changed`, outside the scene undo — checkpoint territory. Proof: `summer_play` → `summer_get_runtime_tree` shows `/root/GameState`; the keys move the body in a `target:"game"` capture.
|
|
709
|
+
|
|
710
|
+
### Verifying 2D and UI work
|
|
711
|
+
|
|
712
|
+
Same loop, different framing:
|
|
713
|
+
|
|
714
|
+
- **Diff first.** `added` must carry the bodies' `CollisionShape2D` children, the `CanvasLayer` with its Controls, one `Parallax2D` per layer. Anchors and theme overrides show up as `changed` properties on the Controls.
|
|
715
|
+
- **2D scene captures.** `summer_screenshot target:"scene"` on a 2D scene synthesizes a `Camera2D` and auto-fits the `CanvasItem` bounds — the 3D presets do not apply, and `framing:"camera"` errors on a scene with no 3D content. `nodePath:"Player"` frames one node (its 2D rect, children included); `size:[1280, 720]` sets the resolution that anchors resolve against.
|
|
716
|
+
- **UI and anything input-driven** is only proven in the running game: `summer_play`, then `summer_screenshot target:"game"`. An edit-time preview of a HUD approximates a viewport the editor does not have.
|
|
717
|
+
- Read the confession fields in every capture (synthetic camera, no camera, project mismatch). A capture you did not receive is not evidence — `verifying-scenes` has the full discipline.
|
|
718
|
+
|
|
719
|
+
## summer_run_editor_script — the cold path
|
|
720
|
+
|
|
721
|
+
A different tool for a different job: it boots a **fresh headless child editor against the ON-DISK project**, runs one `EditorScript` (`func _run():`), and exits.
|
|
722
|
+
|
|
723
|
+
- Unsaved live edits are INVISIBLE to it; the live editor may need a file reload to show its output.
|
|
724
|
+
- Use for batch/project-wide work: re-saving every scene, sweeping resources, mass fixes, generating `.tres` assets.
|
|
725
|
+
- Budget default 120s, clamp 15–600 — include boot time (30s+ on large projects).
|
|
726
|
+
- It confesses `no_rewind_point:true` when no pre-run checkpoint could be taken — surface that to the user before more destructive work.
|
|
727
|
+
- No renderer: it can never screenshot. Judge it by artifacts on disk (see `headless-scripting` for the full discipline).
|
|
728
|
+
|
|
729
|
+
If `summer_run_script` fails with "doesn't support RunSceneScript yet", the engine build is too old — fall back to `summer_run_editor_script` or tell the user to update Summer Engine.
|
|
730
|
+
|
|
731
|
+
## Red Flags — STOP
|
|
732
|
+
|
|
733
|
+
| Red flag | Reality |
|
|
734
|
+
|---|---|
|
|
735
|
+
| Ten `summer_add_node`/`summer_set_prop` calls in a row | That is one script. Write the script. |
|
|
736
|
+
| `add_child` without `ctx.set_owner_recursive(node)` (or manual `.owner`) | Saved scene silently loses the node. |
|
|
737
|
+
| Guessing a property name "it's probably `color`" | `summer_api_docs` answers in one call. Wrong names fail after half the mutation applied. |
|
|
738
|
+
| Claiming "the forest looks great" without a screenshot | Describe only frames you received. Run `summer_screenshot`. |
|
|
739
|
+
| Heavy batch loop in `summer_run_script` | It blocks the live editor. Move it to `summer_run_editor_script`. |
|
|
740
|
+
| Using `summer_run_editor_script` to edit the OPEN scene | It sees only the on-disk file; live edits are invisible and collisions likely. Use `summer_run_script`. |
|
|
741
|
+
| `"Vector3(0,10,0)"` (quoted) inside script source | That is the `summer_set_prop` wire convention. In GDScript write `Vector3(0, 10, 0)`. |
|
|
742
|
+
| Ignoring `errors` because `ok` was true | A partially-failed script may have half-mutated the scene. Read them. |
|
|
743
|
+
| Hand-building CSG node trees on a geometry-tier engine | `ctx.boolean/lathe/sweep/extrude_polygon` bake clean ArrayMeshes with no live CSG left behind. |
|
|
744
|
+
| Re-running a failed `make_shader` with a guessed fix | The compile error is in the `make_shader_errors` report verbatim, with the line. Read it, fix that line. |
|
|
745
|
+
| Hand-writing AnimationPlayer/library/track plumbing | `ctx.animate` is one call per property and dodges the quaternion trap. |
|
|
746
|
+
| Painting tiles with `summer_set_prop`, or hand-editing `tile_map_data` | `ctx.paint_rect` / `paint_tiles` (or `set_cell` in a loop) — cells are packed data. |
|
|
747
|
+
| Building a HUD with a dozen `summer_add_node`/`summer_set_prop` calls | One script: `add_canvas_layer` → `add_ui` → `set_theme_overrides`. |
|
|
748
|
+
| `button.pressed.connect(...)` inside the run script | Not persisted — gone when the script ends. `ctx.connect_signal` (or `summer_connect_signal`) saves it in the `.tscn`. |
|
|
749
|
+
| `ctx.connect(button, "pressed", hud, "_on_pressed")` | That is `Object.connect` on the ctx object, not the helper — wrong-signature error. The helper is `ctx.connect_signal(...)`. |
|
|
750
|
+
| `{"min_size": ...}` in `add_ui` props | Not a Control property — lands in `prop_warnings` and does nothing. The property is `custom_minimum_size`. |
|
|
751
|
+
| `ctx.make_prefab(ctx.get_scene_root(), ...)` | Refused. Pack a child subtree; the scene itself is `save_scene`. |
|
|
752
|
+
| Re-running a failed `attach_script` with a guessed fix | The parse error is in the report with the line. Read it, fix that line. |
|
|
753
|
+
| Judging a HUD from an edit-time scene preview | Anchors resolve against the real viewport. `summer_play` + `target:"game"`. |
|
|
754
|
+
| Calling game-completeness helpers on an engine that predates them | `Invalid call to method` — the run rolls back. Use the fallback table above. |
|
|
755
|
+
| Reading `rolled_back: true` as "nothing happened" after `attach_script` / `add_autoload` / `set_main_scene` | Files and `project.godot` sit outside the undo action. Read `files_written` / `project_settings_changed`; the checkpoint is the rollback. |
|
|
756
|
+
|
|
757
|
+
**Related skills:**
|
|
758
|
+
- `verifying-scenes` — the perception discipline: snapshot/diff/screenshot before-and-after, runtime reads, honest claims.
|
|
759
|
+
- `headless-scripting` — shell-launched engine scripts, imports, exports.
|
|
760
|
+
- `scene-composition` — what a well-structured scene looks like before you generate one.
|
|
761
|
+
- `ui-basics` — Control hierarchy, containers, anchors, theme vs inline styling: the design behind the HUD recipe.
|
|
762
|
+
- `gdscript-patterns` — idioms for the scripts `attach_script` writes.
|
|
763
|
+
- `sprite-sheet` — generating the frames `add_animated_sprite` consumes.
|
|
764
|
+
- `verification-before-completion` — proving the result before claiming done.
|