summer-engine 3.7.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -13
- package/.claude-plugin/plugin.json +25 -22
- package/.codex-plugin/plugin.json +8 -14
- package/.cursor-plugin/plugin.json +7 -13
- package/.factory-plugin/plugin.json +7 -13
- package/AGENTS.md +19 -12
- package/CHANGELOG.md +112 -0
- package/GEMINI.md +3 -3
- package/README.md +111 -31
- package/assets/icon.png +0 -0
- package/commands/start.md +71 -0
- package/commands/summer.md +5 -3
- package/dist/cli/banner.js +3 -0
- package/dist/cli/commands/login.d.ts +27 -0
- package/dist/cli/commands/login.js +58 -12
- package/dist/cli/commands/ops.d.ts +47 -0
- package/dist/cli/commands/ops.js +301 -0
- package/dist/cli/commands/setup.d.ts +2 -0
- package/dist/cli/commands/setup.js +37 -12
- package/dist/cli/commands/skills.js +11 -7
- package/dist/cli/index.js +7 -0
- package/dist/core/agent-host.d.ts +65 -0
- package/dist/core/agent-host.js +193 -0
- package/dist/core/capabilities/agent-playbook.d.ts +3 -0
- package/dist/core/capabilities/agent-playbook.js +54 -2
- package/dist/core/capabilities/apps.d.ts +341 -0
- package/dist/core/capabilities/apps.js +353 -0
- package/dist/core/capabilities/doctor.d.ts +3 -0
- package/dist/core/capabilities/doctor.js +20 -15
- package/dist/core/capabilities/enable-plugin.d.ts +27 -0
- package/dist/core/capabilities/enable-plugin.js +75 -0
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -2
- package/dist/core/capabilities/game-task-plan.d.ts +12 -6
- package/dist/core/capabilities/game-task-plan.js +80 -5
- package/dist/core/capabilities/motion-generation.js +2 -2
- package/dist/core/capabilities/navigation/open.d.ts +6 -2
- package/dist/core/capabilities/navigation/open.js +3 -0
- package/dist/core/capabilities/publish-build.js +2 -0
- package/dist/core/capabilities/runtime-control.d.ts +4 -4
- package/dist/core/capabilities/scene-script-target.d.ts +17 -0
- package/dist/core/capabilities/scene-script-target.js +70 -0
- package/dist/core/capabilities/sfx-choices.d.ts +4 -0
- package/dist/core/capabilities/sfx-choices.js +13 -6
- package/dist/core/capabilities/tool-dispatch.d.ts +12 -3
- package/dist/core/capabilities/tool-dispatch.js +130 -46
- package/dist/core/capability-skew.js +4 -0
- package/dist/core/embeddings.d.ts +2 -0
- package/dist/core/embeddings.js +1 -1
- package/dist/core/error-codes.d.ts +62 -0
- package/dist/core/error-codes.js +97 -0
- package/dist/core/format.d.ts +2 -0
- package/dist/core/format.js +2 -1
- package/dist/core/hosted-mcp.d.ts +22 -0
- package/dist/core/hosted-mcp.js +56 -1
- package/dist/core/library-read.js +5 -0
- package/dist/core/library-search.js +2 -1
- package/dist/core/oauth.js +4 -0
- package/dist/core/ops/catalog.d.ts +41 -0
- package/dist/core/ops/catalog.js +145 -0
- package/dist/core/ops/cloud.d.ts +56 -0
- package/dist/core/ops/cloud.js +175 -0
- package/dist/core/ops/contract.d.ts +119 -0
- package/dist/core/ops/contract.js +142 -0
- package/dist/core/ops/engine-answer.d.ts +25 -0
- package/dist/core/ops/engine-answer.js +117 -0
- package/dist/core/ops/engine.d.ts +55 -0
- package/dist/core/ops/engine.js +649 -0
- package/dist/core/ops/save-files.d.ts +78 -0
- package/dist/core/ops/save-files.js +419 -0
- package/dist/core/ops/search.d.ts +9 -0
- package/dist/core/ops/search.js +55 -0
- package/dist/core/skills-registry.d.ts +16 -1
- package/dist/core/skills-registry.js +35 -2
- package/dist/core/telemetry.d.ts +32 -0
- package/dist/core/telemetry.js +38 -10
- package/dist/core/tool-profiles.d.ts +25 -0
- package/dist/core/tool-profiles.js +41 -0
- package/dist/installer/agent-config.d.ts +17 -4
- package/dist/installer/agent-config.js +22 -6
- package/dist/installer/agent-table.d.ts +3 -0
- package/dist/installer/agent-table.js +10 -7
- package/dist/installer/setup.d.ts +2 -0
- package/dist/installer/setup.js +9 -4
- package/dist/installer/version-check.d.ts +29 -9
- package/dist/installer/version-check.js +81 -28
- package/dist/mcp/command.js +7 -0
- package/dist/mcp/hosted-mount.d.ts +27 -2
- package/dist/mcp/hosted-mount.js +66 -24
- package/dist/mcp/legacy-toolset.d.ts +27 -0
- package/dist/mcp/legacy-toolset.js +43 -0
- package/dist/mcp/ops-surface.d.ts +59 -0
- package/dist/mcp/ops-surface.js +443 -0
- package/dist/mcp/server.d.ts +35 -11
- package/dist/mcp/server.js +236 -89
- package/dist/mcp/tool-results.d.ts +26 -0
- package/dist/mcp/tool-results.js +81 -0
- package/dist/mcp/tool-surface.d.ts +65 -0
- package/dist/mcp/tool-surface.js +317 -0
- package/dist/mcp/tools/app-tools.d.ts +2 -0
- package/dist/mcp/tools/app-tools.js +71 -0
- package/dist/mcp/tools/asset-tools.js +55 -53
- package/dist/mcp/tools/audit-tools.js +21 -21
- package/dist/mcp/tools/debug-tools.js +6 -6
- package/dist/mcp/tools/fabricate-tools.js +6 -6
- package/dist/mcp/tools/generate-tools.js +76 -70
- package/dist/mcp/tools/project-tools.d.ts +9 -4
- package/dist/mcp/tools/project-tools.js +16 -10
- package/dist/mcp/tools/scene-tools.js +12 -23
- package/dist/mcp/tools/script-tools.js +9 -5
- package/dist/mcp/tools/with-engine.d.ts +6 -0
- package/dist/mcp/tools/with-engine.js +19 -0
- package/gemini-extension.json +6 -12
- package/hooks/pre-commit-doctor.sh +5 -4
- package/hooks/session-start.sh +24 -28
- package/integrations/claude-desktop/README.md +1 -1
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/junie/README.md +1 -1
- package/integrations/lm-studio/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/visual-studio/README.md +1 -1
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +85 -35
- package/library/references/mcp-tools-reference/resource.yaml +1 -1
- package/library/references/product-map/resource.yaml +2 -2
- package/library/skills/3d-lighting/SKILL.md +53 -28
- package/library/skills/3d-lighting/resource.yaml +1 -1
- package/library/skills/README.md +126 -116
- package/library/skills/adaptive-music/SKILL.md +19 -23
- package/library/skills/adaptive-music/resource.yaml +1 -1
- package/library/skills/agent-playtesting/SKILL.md +1 -1
- package/library/skills/agent-playtesting/resource.yaml +1 -1
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ai-characters-in-games/resource.yaml +1 -1
- package/library/skills/ambient-bed/SKILL.md +22 -13
- package/library/skills/ambient-bed/resource.yaml +1 -1
- package/library/skills/animated-loop/SKILL.md +41 -32
- package/library/skills/animated-loop/resource.yaml +1 -1
- package/library/skills/animation-tree/SKILL.md +1 -1
- package/library/skills/animation-tree/resource.yaml +1 -1
- package/library/skills/art-direction/SKILL.md +3 -3
- package/library/skills/art-direction/resource.yaml +1 -1
- package/library/skills/asset-strategy/SKILL.md +21 -4
- package/library/skills/asset-strategy/resource.yaml +2 -1
- package/library/skills/audio-direction/SKILL.md +10 -10
- package/library/skills/audio-direction/resource.yaml +1 -1
- package/library/skills/auto-fire-targeting/SKILL.md +1 -1
- package/library/skills/auto-fire-targeting/resource.yaml +1 -1
- package/library/skills/bounded-engine-runs/SKILL.md +1 -1
- package/library/skills/bounded-engine-runs/resource.yaml +1 -1
- package/library/skills/brainstorm-game/SKILL.md +1 -1
- package/library/skills/brainstorm-game/resource.yaml +1 -1
- package/library/skills/brainstorming/SKILL.md +1 -1
- package/library/skills/brainstorming/resource.yaml +1 -1
- package/library/skills/browse-templates/SKILL.md +1 -1
- package/library/skills/browse-templates/resource.yaml +1 -1
- package/library/skills/camera-rigs/SKILL.md +2 -2
- package/library/skills/camera-rigs/resource.yaml +1 -1
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -0
- package/library/skills/character-animation-wiring/SKILL.md +4 -4
- package/library/skills/character-animation-wiring/resource.yaml +1 -1
- package/library/skills/character-model/SKILL.md +55 -47
- package/library/skills/character-model/resource.yaml +1 -1
- package/library/skills/character-movement/SKILL.md +3 -3
- package/library/skills/character-movement/resource.yaml +1 -1
- package/library/skills/character-portrait/SKILL.md +24 -19
- package/library/skills/character-portrait/resource.yaml +1 -1
- package/library/skills/cinematic-cutscene/SKILL.md +58 -46
- package/library/skills/cinematic-cutscene/resource.yaml +1 -1
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/combat-basics/resource.yaml +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
- package/library/skills/concept-art/SKILL.md +16 -12
- package/library/skills/concept-art/resource.yaml +1 -1
- package/library/skills/concept-to-level/SKILL.md +239 -0
- package/library/skills/concept-to-level/references/technical-rules.md +150 -0
- package/library/skills/concept-to-level/resource.yaml +44 -0
- package/library/skills/create-asset-sheet/SKILL.md +19 -13
- package/library/skills/create-asset-sheet/resource.yaml +1 -1
- package/library/skills/debug/SKILL.md +2 -2
- package/library/skills/debug/resource.yaml +1 -1
- package/library/skills/debugging-game-feel/SKILL.md +1 -1
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +23 -35
- package/library/skills/design-level/resource.yaml +1 -1
- package/library/skills/design-mechanic/SKILL.md +1 -1
- package/library/skills/design-mechanic/resource.yaml +1 -1
- package/library/skills/design-npc/SKILL.md +22 -24
- package/library/skills/design-npc/resource.yaml +1 -1
- package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
- package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
- package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
- package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
- package/library/skills/environment-kit/SKILL.md +20 -16
- package/library/skills/environment-kit/resource.yaml +1 -1
- package/library/skills/export-and-ship/SKILL.md +6 -6
- package/library/skills/export-and-ship/resource.yaml +1 -1
- package/library/skills/fabricating-assets/SKILL.md +7 -7
- package/library/skills/fabricating-assets/resource.yaml +3 -3
- package/library/skills/facial-and-lipsync/SKILL.md +14 -15
- package/library/skills/facial-and-lipsync/resource.yaml +1 -1
- package/library/skills/fps-controller/SKILL.md +33 -41
- package/library/skills/fps-controller/resource.yaml +1 -1
- package/library/skills/game-feel/SKILL.md +8 -8
- package/library/skills/game-feel/resource.yaml +1 -1
- package/library/skills/gameskill/SKILL.md +4 -4
- package/library/skills/gameskill/resource.yaml +1 -1
- package/library/skills/gdscript-patterns/SKILL.md +1 -1
- package/library/skills/gdscript-patterns/resource.yaml +1 -1
- package/library/skills/generate-motion/SKILL.md +30 -21
- package/library/skills/generate-motion/resource.yaml +1 -1
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
- package/library/skills/grow-analytics/SKILL.md +3 -3
- package/library/skills/grow-analytics/resource.yaml +1 -1
- package/library/skills/headless-scripting/SKILL.md +1 -1
- package/library/skills/headless-scripting/resource.yaml +1 -1
- package/library/skills/in-game-purchases/SKILL.md +1 -1
- package/library/skills/in-game-purchases/resource.yaml +1 -1
- package/library/skills/instantiate-asset-pack/SKILL.md +2 -2
- package/library/skills/instantiate-asset-pack/resource.yaml +1 -1
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +1 -0
- package/library/skills/make-game/SKILL.md +4 -4
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/make-game/references/3d-fps.md +1 -1
- package/library/skills/make-game/references/3d-horror.md +1 -1
- package/library/skills/make-game/references/3d-third-person.md +2 -2
- package/library/skills/make-game/resource.yaml +1 -1
- package/library/skills/multiplayer/SKILL.md +1 -1
- package/library/skills/multiplayer/resource.yaml +1 -1
- package/library/skills/multiplayer-movement/SKILL.md +1 -1
- package/library/skills/multiplayer-movement/resource.yaml +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-project/resource.yaml +1 -1
- package/library/skills/multiplayer-publish/SKILL.md +8 -7
- package/library/skills/multiplayer-publish/resource.yaml +3 -3
- package/library/skills/multiplayer-state/SKILL.md +1 -1
- package/library/skills/multiplayer-state/resource.yaml +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/resource.yaml +1 -1
- package/library/skills/music-track/SKILL.md +22 -13
- package/library/skills/music-track/resource.yaml +1 -1
- package/library/skills/navigate-summer/SKILL.md +11 -9
- package/library/skills/navigate-summer/resource.yaml +1 -1
- package/library/skills/new-project/SKILL.md +1 -1
- package/library/skills/new-project/resource.yaml +1 -1
- package/library/skills/organic-model/SKILL.md +24 -18
- package/library/skills/organic-model/resource.yaml +1 -1
- package/library/skills/pixel-art/SKILL.md +27 -23
- package/library/skills/pixel-art/resource.yaml +1 -1
- package/library/skills/play/SKILL.md +1 -1
- package/library/skills/play/resource.yaml +1 -1
- package/library/skills/playtesting-a-feature/SKILL.md +1 -1
- package/library/skills/playtesting-a-feature/resource.yaml +1 -1
- package/library/skills/procedural-animation/SKILL.md +20 -16
- package/library/skills/procedural-animation/resource.yaml +1 -1
- package/library/skills/prop-model/SKILL.md +25 -19
- package/library/skills/prop-model/resource.yaml +1 -1
- package/library/skills/psx-retro-rendering/resource.yaml +1 -0
- package/library/skills/publish-your-game/SKILL.md +16 -6
- package/library/skills/publish-your-game/resource.yaml +3 -3
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -0
- package/library/skills/release-readiness/SKILL.md +1 -1
- package/library/skills/release-readiness/resource.yaml +1 -1
- package/library/skills/remote-deploy/SKILL.md +1 -1
- package/library/skills/remote-deploy/resource.yaml +1 -1
- package/library/skills/retarget/SKILL.md +23 -20
- package/library/skills/retarget/resource.yaml +1 -1
- package/library/skills/running-in-the-cloud/SKILL.md +1 -1
- package/library/skills/running-in-the-cloud/resource.yaml +1 -1
- package/library/skills/save-load/SKILL.md +1 -1
- package/library/skills/save-load/resource.yaml +1 -1
- package/library/skills/scene-composition/SKILL.md +1 -1
- package/library/skills/scene-composition/resource.yaml +1 -1
- package/library/skills/scene-hierarchy-design/SKILL.md +2 -2
- package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
- package/library/skills/scene-scripting/SKILL.md +66 -636
- package/library/skills/scene-scripting/references/ctx-api.md +184 -0
- package/library/skills/scene-scripting/references/recipes-2d-ui.md +193 -0
- package/library/skills/scene-scripting/references/recipes-3d.md +280 -0
- package/library/skills/scene-scripting/resource.yaml +4 -4
- package/library/skills/scene-to-level/SKILL.md +2 -2
- package/library/skills/scene-to-level/resource.yaml +1 -1
- package/library/skills/skill-create/resource.yaml +1 -0
- package/library/skills/skill-improve/resource.yaml +1 -0
- package/library/skills/skill-test/SKILL.md +2 -2
- package/library/skills/skill-test/resource.yaml +1 -0
- package/library/skills/skintokens-auto-rigging/resource.yaml +1 -0
- package/library/skills/skybox-panorama/SKILL.md +27 -21
- package/library/skills/skybox-panorama/resource.yaml +1 -1
- package/library/skills/sound-effect/SKILL.md +31 -20
- package/library/skills/sound-effect/resource.yaml +1 -1
- package/library/skills/spatial-placement/SKILL.md +14 -9
- package/library/skills/spatial-placement/resource.yaml +1 -1
- package/library/skills/sprite-sheet/SKILL.md +32 -27
- package/library/skills/sprite-sheet/resource.yaml +1 -1
- package/library/skills/store-art/SKILL.md +3 -3
- package/library/skills/store-art/resource.yaml +2 -2
- package/library/skills/store-listing/SKILL.md +3 -3
- package/library/skills/store-listing/resource.yaml +2 -2
- package/library/skills/summer-analytics/SKILL.md +7 -5
- package/library/skills/summer-analytics/resource.yaml +2 -2
- package/library/skills/summer-apps/SKILL.md +168 -0
- package/library/skills/summer-apps/manifest.md +57 -0
- package/library/skills/summer-apps/minimal-app.md +183 -0
- package/library/skills/summer-apps/resource.yaml +36 -0
- package/library/skills/summer-apps/sdk-reference.md +135 -0
- package/library/skills/summer-apps-design/SKILL.md +197 -0
- package/library/skills/summer-apps-design/resource.yaml +23 -0
- package/library/skills/summer-assets/SKILL.md +56 -0
- package/library/skills/summer-assets/resource.yaml +34 -0
- package/library/skills/summer-store/SKILL.md +1 -1
- package/library/skills/text-to-motion/SKILL.md +30 -23
- package/library/skills/text-to-motion/prompts-and-controls.md +5 -5
- package/library/skills/text-to-motion/resource.yaml +1 -1
- package/library/skills/text-to-motion/rigging-for-text-motion.md +2 -2
- package/library/skills/tileable-texture/SKILL.md +19 -15
- package/library/skills/tileable-texture/resource.yaml +1 -1
- package/library/skills/trailer-shot/SKILL.md +28 -24
- package/library/skills/trailer-shot/resource.yaml +1 -1
- package/library/skills/tune-performance/SKILL.md +6 -6
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-basics/SKILL.md +41 -36
- package/library/skills/ui-basics/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +47 -38
- package/library/skills/ui-graphics/resource.yaml +1 -1
- package/library/skills/use-widget-asset/SKILL.md +1 -1
- package/library/skills/use-widget-asset/resource.yaml +1 -1
- package/library/skills/using-summer/SKILL.md +7 -5
- package/library/skills/using-summer/resource.yaml +1 -1
- package/library/skills/vehicle-model/SKILL.md +65 -57
- package/library/skills/vehicle-model/resource.yaml +1 -1
- package/library/skills/verification-before-completion/SKILL.md +1 -1
- package/library/skills/verification-before-completion/resource.yaml +1 -1
- package/library/skills/verifying-scenes/SKILL.md +2 -2
- package/library/skills/verifying-scenes/resource.yaml +1 -1
- package/library/skills/vfx-dissolve/SKILL.md +2 -2
- package/library/skills/vfx-dissolve/resource.yaml +1 -1
- package/library/skills/vfx-fire/SKILL.md +15 -41
- package/library/skills/vfx-fire/resource.yaml +1 -1
- package/library/skills/vfx-hit-spark/SKILL.md +1 -1
- package/library/skills/vfx-hit-spark/resource.yaml +1 -1
- package/library/skills/vfx-lightning/SKILL.md +7 -16
- package/library/skills/vfx-lightning/resource.yaml +1 -1
- package/library/skills/vfx-magic-glow/SKILL.md +23 -32
- package/library/skills/vfx-magic-glow/resource.yaml +1 -1
- package/library/skills/vfx-muzzle-flash/SKILL.md +20 -35
- package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
- package/library/skills/vfx-smoke/SKILL.md +13 -31
- package/library/skills/vfx-smoke/resource.yaml +1 -1
- package/library/skills/vfx-water-ripple/SKILL.md +12 -31
- package/library/skills/vfx-water-ripple/resource.yaml +1 -1
- package/library/skills/voice-line/SKILL.md +71 -40
- package/library/skills/voice-line/resource.yaml +1 -1
- package/library/skills/web-and-touch-input/SKILL.md +1 -1
- package/library/skills/web-and-touch-input/resource.yaml +1 -1
- package/library/skills/web-compatibility-look/SKILL.md +1 -1
- package/library/skills/web-compatibility-look/resource.yaml +1 -1
- package/library/skills/world-building-3d/SKILL.md +1 -1
- package/library/skills/world-building-3d/resource.yaml +1 -1
- package/library/skills/writing-skills/resource.yaml +1 -0
- package/library/tools/add-node/GUIDE.md +14 -0
- package/library/tools/align-distribute-3d/GUIDE.md +7 -0
- package/library/tools/app-call/resource.yaml +59 -0
- package/library/tools/app-create/resource.yaml +67 -0
- package/library/tools/app-data/resource.yaml +74 -0
- package/library/tools/app-dock/resource.yaml +59 -0
- package/library/tools/app-events/resource.yaml +68 -0
- package/library/tools/app-get/resource.yaml +46 -0
- package/library/tools/app-guide/resource.yaml +55 -0
- package/library/tools/app-list/resource.yaml +48 -0
- package/library/tools/app-page/resource.yaml +74 -0
- package/library/tools/app-publish/resource.yaml +90 -0
- package/library/tools/app-report-gap/resource.yaml +58 -0
- package/library/tools/app-screenshot/resource.yaml +103 -0
- package/library/tools/app-tools/resource.yaml +46 -0
- package/library/tools/app-update/resource.yaml +68 -0
- package/library/tools/attach-to-surface/GUIDE.md +15 -0
- package/library/tools/batch/GUIDE.md +27 -0
- package/library/tools/camera-bookmark/GUIDE.md +12 -0
- package/library/tools/capture-gameplay/GUIDE.md +3 -0
- package/library/tools/capture-gameplay/resource.yaml +3 -3
- package/library/tools/check-job/resource.yaml +1 -1
- package/library/tools/clear-console/GUIDE.md +3 -0
- package/library/tools/connect-ports/GUIDE.md +9 -0
- package/library/tools/connect-signal/GUIDE.md +14 -0
- package/library/tools/create-debug-report/GUIDE.md +10 -0
- package/library/tools/create-scene/GUIDE.md +10 -0
- package/library/tools/debug-views/GUIDE.md +7 -0
- package/library/tools/enable-plugin/GUIDE.md +3 -0
- package/library/tools/enable-plugin/resource.yaml +53 -0
- package/library/tools/export-game/GUIDE.md +3 -0
- package/library/tools/export-game/resource.yaml +3 -3
- package/library/tools/export-templates/GUIDE.md +3 -0
- package/library/tools/fabricate-3d/GUIDE.md +19 -0
- package/library/tools/frame-nodes/GUIDE.md +9 -0
- package/library/tools/frame-shot/GUIDE.md +9 -0
- package/library/tools/game-control/GUIDE.md +9 -0
- package/library/tools/game-input/GUIDE.md +9 -0
- package/library/tools/game-probe/GUIDE.md +9 -0
- package/library/tools/generate-3d/resource.yaml +3 -3
- package/library/tools/generate-motion/resource.yaml +2 -2
- package/library/tools/get-console/GUIDE.md +9 -0
- package/library/tools/get-console/resource.yaml +5 -0
- package/library/tools/get-debugger-errors/GUIDE.md +7 -0
- package/library/tools/get-debugger-errors/resource.yaml +5 -0
- package/library/tools/get-debugger-warnings/GUIDE.md +7 -0
- package/library/tools/get-debugger-warnings/resource.yaml +5 -0
- package/library/tools/get-diagnostics/GUIDE.md +13 -0
- package/library/tools/get-project-context/GUIDE.md +25 -0
- package/library/tools/get-runtime-tree/GUIDE.md +7 -0
- package/library/tools/get-runtime-tree/resource.yaml +5 -0
- package/library/tools/get-scene-tree/GUIDE.md +11 -0
- package/library/tools/get-scene-tree/resource.yaml +5 -0
- package/library/tools/get-script-errors/GUIDE.md +5 -0
- package/library/tools/grep/GUIDE.md +11 -0
- package/library/tools/import-asset/GUIDE.md +8 -0
- package/library/tools/import-asset-by-id/GUIDE.md +12 -0
- package/library/tools/import-from-url/GUIDE.md +10 -0
- package/library/tools/import-from-url-batch/GUIDE.md +3 -0
- package/library/tools/import-hdri/GUIDE.md +16 -0
- package/library/tools/input-map-bind/GUIDE.md +11 -0
- package/library/tools/inspect-asset/GUIDE.md +14 -0
- package/library/tools/inspect-asset/resource.yaml +5 -0
- package/library/tools/inspect-node/GUIDE.md +11 -0
- package/library/tools/inspect-node/resource.yaml +5 -0
- package/library/tools/inspect-resource/GUIDE.md +7 -0
- package/library/tools/inspect-resource/resource.yaml +5 -0
- package/library/tools/inspect-runtime-node/GUIDE.md +7 -0
- package/library/tools/inspect-runtime-node/resource.yaml +5 -0
- package/library/tools/instantiate-scene/GUIDE.md +12 -0
- package/library/tools/is-running/GUIDE.md +3 -0
- package/library/tools/measure/GUIDE.md +8 -0
- package/library/tools/navigation-probe/GUIDE.md +9 -0
- package/library/tools/open/resource.yaml +2 -2
- package/library/tools/open-main-scene/GUIDE.md +6 -0
- package/library/tools/open-scene/GUIDE.md +8 -0
- package/library/tools/place-adjacent/GUIDE.md +7 -0
- package/library/tools/play/GUIDE.md +13 -0
- package/library/tools/project-setting/GUIDE.md +9 -0
- package/library/tools/publish-build/resource.yaml +6 -6
- package/library/tools/raycast/GUIDE.md +7 -0
- package/library/tools/read-file/GUIDE.md +10 -0
- package/library/tools/read-library/resource.yaml +5 -0
- package/library/tools/recent-events/GUIDE.md +7 -0
- package/library/tools/remove-node/GUIDE.md +3 -0
- package/library/tools/repeat-along/GUIDE.md +5 -0
- package/library/tools/replace-node/GUIDE.md +9 -0
- package/library/tools/replace-text/GUIDE.md +5 -0
- package/library/tools/run-editor-script/GUIDE.md +16 -0
- package/library/tools/run-script/GUIDE.md +30 -0
- package/library/tools/run-script/resource.yaml +6 -3
- package/library/tools/runtime-animate/GUIDE.md +7 -0
- package/library/tools/runtime-call/GUIDE.md +7 -0
- package/library/tools/runtime-set/GUIDE.md +9 -0
- package/library/tools/runtime-spawn/GUIDE.md +9 -0
- package/library/tools/save-scene/GUIDE.md +3 -0
- package/library/tools/scene-audit/GUIDE.md +29 -0
- package/library/tools/screenshot/GUIDE.md +17 -0
- package/library/tools/select-node/GUIDE.md +3 -0
- package/library/tools/set-prop/GUIDE.md +23 -0
- package/library/tools/set-resource-property/GUIDE.md +8 -0
- package/library/tools/shot-sheet/GUIDE.md +7 -0
- package/library/tools/snap-to-surface/GUIDE.md +17 -0
- package/library/tools/snapshot-diff/GUIDE.md +7 -0
- package/library/tools/starcast/GUIDE.md +12 -0
- package/library/tools/stop/GUIDE.md +3 -0
- package/library/tools/test-placement/GUIDE.md +7 -0
- package/library/tools/ui-actions/GUIDE.md +12 -0
- package/library/tools/ui-activate/GUIDE.md +11 -0
- package/library/tools/ui-screenshot/GUIDE.md +9 -0
- package/library/tools/ui-tree/GUIDE.md +10 -0
- package/library/tools/wait-for-event/GUIDE.md +11 -0
- package/library/tools/world-snapshot/GUIDE.md +9 -0
- package/library/tools/write-file/GUIDE.md +5 -0
- package/library/tools/zoom/GUIDE.md +5 -0
- package/package.json +6 -4
- package/registry/generated/aliases.json +15 -0
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +6 -12
- package/registry/generated/index.json +1155 -408
- package/registry/generated/marketplace.claude.json +2 -13
- package/registry/generated/plugin.claude.json +25 -22
- package/registry/generated/plugin.codex.json +8 -14
- package/registry/generated/plugin.cursor.json +7 -13
- package/registry/generated/plugin.factory.json +7 -13
- package/registry/generated/server.json +34 -0
- package/registry/generated/skills-index.md +126 -116
- package/registry/generated/skills-registry.json +178 -113
- package/registry/operations/fixtures/invalid-deprecated-without-replacement.json +60 -0
- package/registry/operations/fixtures/invalid-name.json +60 -0
- package/registry/operations/fixtures/invalid-publish-without-owner.json +82 -0
- package/registry/operations/fixtures/invalid-spend-without-estimate.json +42 -0
- package/registry/operations/fixtures/invalid-unknown-field.json +61 -0
- package/registry/operations/fixtures/valid-player-facing.json +82 -0
- package/registry/operations/fixtures/valid-read.json +60 -0
- package/registry/operations/fixtures/valid-spend.json +43 -0
- package/registry/operations/legacy-names.json +1206 -0
- package/registry/schemas/allowed-hosts.json +4 -2
- package/registry/schemas/operation.schema.json +318 -0
- package/registry/schemas/skill.schema.json +4 -0
- package/CLAUDE.md +0 -7
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
# scene-scripting: 3D recipes
|
|
2
|
+
|
|
3
|
+
Every recipe below is the `source` of one call: `summer_run_script(scenePath="res://<the scene>.tscn", source=<the recipe>)`. Name the scene every time; it is opened first when it is not the edited one, and the person's tab comes back after the run. The core helpers (`add_node`, `find`, `add_mesh`, `make_material`, `save_scene` ...) are in the `scene-scripting` skill itself.
|
|
4
|
+
|
|
5
|
+
## Scatter N instances with randomized transforms
|
|
6
|
+
|
|
7
|
+
```gdscript
|
|
8
|
+
func run(ctx):
|
|
9
|
+
var root = ctx.get_scene_root()
|
|
10
|
+
var rng := RandomNumberGenerator.new()
|
|
11
|
+
rng.seed = 12345 # deterministic re-runs
|
|
12
|
+
var source: PackedScene = load("res://props/tree.tscn")
|
|
13
|
+
for i in range(40):
|
|
14
|
+
var tree := source.instantiate()
|
|
15
|
+
root.add_child(tree)
|
|
16
|
+
ctx.set_owner_recursive(tree) # owns the whole instanced subtree
|
|
17
|
+
tree.position = Vector3(rng.randf_range(-20, 20), 0, rng.randf_range(-20, 20))
|
|
18
|
+
tree.rotation.y = rng.randf_range(0, TAU)
|
|
19
|
+
var s := rng.randf_range(0.8, 1.3)
|
|
20
|
+
tree.scale = Vector3(s, s, s)
|
|
21
|
+
ctx.report("scattered", 40)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Procedural mesh via SurfaceTool
|
|
25
|
+
|
|
26
|
+
```gdscript
|
|
27
|
+
func run(ctx):
|
|
28
|
+
var root = ctx.get_scene_root()
|
|
29
|
+
var st := SurfaceTool.new()
|
|
30
|
+
st.begin(Mesh.PRIMITIVE_TRIANGLES)
|
|
31
|
+
st.set_normal(Vector3.UP)
|
|
32
|
+
st.add_vertex(Vector3(0, 0, 0))
|
|
33
|
+
st.add_vertex(Vector3(1, 0, 0))
|
|
34
|
+
st.add_vertex(Vector3(0, 0, 1))
|
|
35
|
+
var mesh := st.commit() # ArrayMesh
|
|
36
|
+
var mi := MeshInstance3D.new()
|
|
37
|
+
mi.mesh = mesh
|
|
38
|
+
mi.name = "GeneratedMesh"
|
|
39
|
+
root.add_child(mi)
|
|
40
|
+
ctx.set_owner_recursive(mi)
|
|
41
|
+
ctx.report("surfaces", mesh.get_surface_count())
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
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.
|
|
45
|
+
|
|
46
|
+
## CSG primitives (fast blockouts)
|
|
47
|
+
|
|
48
|
+
```gdscript
|
|
49
|
+
func run(ctx):
|
|
50
|
+
var root = ctx.get_scene_root()
|
|
51
|
+
var body := CSGCombiner3D.new()
|
|
52
|
+
body.name = "Blockout"
|
|
53
|
+
root.add_child(body)
|
|
54
|
+
var box := CSGBox3D.new()
|
|
55
|
+
box.size = Vector3(6, 3, 6)
|
|
56
|
+
body.add_child(box)
|
|
57
|
+
var hole := CSGCylinder3D.new()
|
|
58
|
+
hole.operation = CSGShape3D.OPERATION_SUBTRACTION
|
|
59
|
+
hole.radius = 1.0
|
|
60
|
+
hole.height = 7.0
|
|
61
|
+
body.add_child(hole)
|
|
62
|
+
ctx.set_owner_recursive(body) # owner is the SCENE root, not the parent
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
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.
|
|
66
|
+
|
|
67
|
+
## Boolean blockout — carve a doorway (geometry tier)
|
|
68
|
+
|
|
69
|
+
Box minus box, baked. The inputs are consumed; only the result remains.
|
|
70
|
+
|
|
71
|
+
```gdscript
|
|
72
|
+
func run(ctx):
|
|
73
|
+
var wall = ctx.add_mesh("box", "Wall", null, {"size": Vector3(6, 3, 0.3)})
|
|
74
|
+
var hole = ctx.add_mesh("box", "DoorHole", null, {"size": Vector3(1.0, 2.1, 0.5)})
|
|
75
|
+
hole.position = Vector3(0, -0.45, 0) # sink the opening to floor level
|
|
76
|
+
var carved = ctx.boolean(wall, hole, "difference")
|
|
77
|
+
if carved == null:
|
|
78
|
+
return # reports carry the reason — read them
|
|
79
|
+
carved.name = "WallWithDoorway"
|
|
80
|
+
ctx.uv_box(carved) # boolean output needs UVs to take a texture
|
|
81
|
+
ctx.report("doorway", str(carved.get_path()))
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
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.
|
|
85
|
+
|
|
86
|
+
## Lathe a goblet / pillar (geometry tier)
|
|
87
|
+
|
|
88
|
+
`lathe` revolves a 2D profile (x = radius, y = height) around Y. Design the profile from the axis outward.
|
|
89
|
+
|
|
90
|
+
```gdscript
|
|
91
|
+
func run(ctx):
|
|
92
|
+
var profile := PackedVector2Array([
|
|
93
|
+
Vector2(0.0, 0.0), Vector2(0.45, 0.0), # foot
|
|
94
|
+
Vector2(0.08, 0.1), Vector2(0.08, 0.55), # stem
|
|
95
|
+
Vector2(0.35, 0.7), Vector2(0.4, 1.1), # bowl
|
|
96
|
+
Vector2(0.0, 1.15),
|
|
97
|
+
])
|
|
98
|
+
var goblet = ctx.lathe(profile, "Goblet", null, 360.0, 48)
|
|
99
|
+
ctx.set_smooth(goblet, 40.0) # lathes look faceted without it
|
|
100
|
+
ctx.apply_material(goblet, ctx.make_material({"albedo_color": Color(0.85, 0.7, 0.2), "metallic": 0.8, "roughness": 0.25}))
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
A square-ish profile with `sides: 8` and `spin_degrees: 360` makes a chamfered pillar; `spin_degrees: 180` makes an apse/half-dome.
|
|
104
|
+
|
|
105
|
+
## Sweep a rail / pipe (geometry tier)
|
|
106
|
+
|
|
107
|
+
`sweep` extrudes a 2D cross-section along a 3D polyline.
|
|
108
|
+
|
|
109
|
+
```gdscript
|
|
110
|
+
func run(ctx):
|
|
111
|
+
var section := PackedVector2Array([ # small circle-ish octagon, the pipe wall
|
|
112
|
+
Vector2(0.05, 0), Vector2(0.035, 0.035), Vector2(0, 0.05), Vector2(-0.035, 0.035),
|
|
113
|
+
Vector2(-0.05, 0), Vector2(-0.035, -0.035), Vector2(0, -0.05), Vector2(0.035, -0.035),
|
|
114
|
+
])
|
|
115
|
+
var path := PackedVector3Array([
|
|
116
|
+
Vector3(0, 1, 0), Vector3(4, 1, 0), Vector3(6, 1, 2), Vector3(6, 3, 6),
|
|
117
|
+
])
|
|
118
|
+
var pipe = ctx.sweep(section, path, "SteamPipe")
|
|
119
|
+
ctx.set_smooth(pipe, 45.0)
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Rails, roads, cables, gutters — same recipe, different cross-section. Keep path points a reasonable distance apart; hairpin corners self-intersect.
|
|
123
|
+
|
|
124
|
+
## Terrain with collision (geometry tier)
|
|
125
|
+
|
|
126
|
+
```gdscript
|
|
127
|
+
func run(ctx):
|
|
128
|
+
var ground = ctx.terrain(Vector2(64, 64), 6.0, 1337, "Terrain")
|
|
129
|
+
ctx.apply_material(ground, ctx.make_material({"albedo_color": Color(0.35, 0.5, 0.25), "roughness": 1.0}))
|
|
130
|
+
ctx.report("terrain", ctx.summary())
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
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.
|
|
134
|
+
|
|
135
|
+
## Text signage (geometry tier)
|
|
136
|
+
|
|
137
|
+
`add_mesh` accepts `torus` and `text` on geometry-tier engines:
|
|
138
|
+
|
|
139
|
+
```gdscript
|
|
140
|
+
func run(ctx):
|
|
141
|
+
var sign = ctx.add_mesh("text", "ExitSign", null, {"text": "EXIT", "depth": 0.08})
|
|
142
|
+
sign.position = Vector3(0, 2.6, -4)
|
|
143
|
+
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}))
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Emissive text only proves itself in a `framing:"camera"` screenshot — preset framings substitute the environment and mute emission.
|
|
147
|
+
|
|
148
|
+
## Decimate for LOD, convex collision for props (geometry tier)
|
|
149
|
+
|
|
150
|
+
Dense generated/imported meshes (Meshy-class output) want both before they ship:
|
|
151
|
+
|
|
152
|
+
```gdscript
|
|
153
|
+
func run(ctx):
|
|
154
|
+
var prop = ctx.find("AncientStatue") # e.g. a generated import
|
|
155
|
+
if prop == null:
|
|
156
|
+
ctx.report("error", "AncientStatue not found")
|
|
157
|
+
return
|
|
158
|
+
ctx.decimate(prop, 0.35) # keep ~35% of the triangles
|
|
159
|
+
var body = ctx.convex_collision(prop, true) # V-HACD multi-shape for concave props
|
|
160
|
+
ctx.report("collision_body", str(body.get_path()))
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`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.
|
|
164
|
+
|
|
165
|
+
## Mirror symmetry (geometry tier)
|
|
166
|
+
|
|
167
|
+
```gdscript
|
|
168
|
+
func run(ctx):
|
|
169
|
+
var left_tower = ctx.find("Tower")
|
|
170
|
+
var right_tower = ctx.mirror(left_tower, "x") # mirrored duplicate, owned
|
|
171
|
+
right_tower.name = "TowerMirrored"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
The mirror is a real duplicate with flipped winding/normals — edit either side independently afterward.
|
|
175
|
+
|
|
176
|
+
## Animate — camera flythrough and a door-open (geometry tier)
|
|
177
|
+
|
|
178
|
+
`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.
|
|
179
|
+
|
|
180
|
+
```gdscript
|
|
181
|
+
func run(ctx):
|
|
182
|
+
var cam = ctx.add_camera(Vector3(0, 4, 12), Vector3.ZERO, true)
|
|
183
|
+
ctx.animate(cam, "position", [
|
|
184
|
+
[0.0, Vector3(0, 4, 12)],
|
|
185
|
+
[4.0, Vector3(8, 5, 4)],
|
|
186
|
+
[8.0, Vector3(0, 6, -10)],
|
|
187
|
+
], "flythrough")
|
|
188
|
+
ctx.animate(cam, "rotation_degrees", [
|
|
189
|
+
[0.0, Vector3(-10, 0, 0)],
|
|
190
|
+
[4.0, Vector3(-12, 60, 0)],
|
|
191
|
+
[8.0, Vector3(-15, 175, 0)],
|
|
192
|
+
], "flythrough") # same clip — second track appended
|
|
193
|
+
|
|
194
|
+
var door = ctx.find("Door")
|
|
195
|
+
ctx.animate(door, "rotation_degrees", [
|
|
196
|
+
[0.0, Vector3(0, 0, 0)],
|
|
197
|
+
[0.8, Vector3(0, 110, 0)],
|
|
198
|
+
], "open")
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
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`.
|
|
202
|
+
|
|
203
|
+
## make_shader — dissolve / glow FX with the compile-error loop (geometry tier)
|
|
204
|
+
|
|
205
|
+
`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:
|
|
206
|
+
|
|
207
|
+
```gdscript
|
|
208
|
+
func run(ctx):
|
|
209
|
+
var mat = ctx.make_shader("""
|
|
210
|
+
shader_type spatial;
|
|
211
|
+
uniform float threshold : hint_range(0.0, 1.0) = 0.3;
|
|
212
|
+
uniform vec4 edge_color : source_color = vec4(1.0, 0.55, 0.1, 1.0);
|
|
213
|
+
void fragment() {
|
|
214
|
+
float n = fract(sin(dot(UV * 12.0, vec2(12.9898, 78.233))) * 43758.5453);
|
|
215
|
+
if (n < threshold) { discard; }
|
|
216
|
+
ALBEDO = vec3(0.8);
|
|
217
|
+
EMISSION = edge_color.rgb * smoothstep(threshold + 0.08, threshold, n) * 4.0;
|
|
218
|
+
}
|
|
219
|
+
""", {"threshold": 0.35})
|
|
220
|
+
ctx.apply_material(ctx.find("Crystal"), mat)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
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.
|
|
224
|
+
|
|
225
|
+
## GridMap fills
|
|
226
|
+
|
|
227
|
+
```gdscript
|
|
228
|
+
func run(ctx):
|
|
229
|
+
var root = ctx.get_scene_root()
|
|
230
|
+
var grid: GridMap = root.get_node("GridMap") # needs mesh_library assigned
|
|
231
|
+
for x in range(16):
|
|
232
|
+
for z in range(16):
|
|
233
|
+
grid.set_cell_item(Vector3i(x, 0, z), 0) # item = MeshLibrary index
|
|
234
|
+
ctx.report("cells", 256)
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Cells serialize into packed data — scripting is the ONLY sane way to fill them; never hand-edit `tile_map_data`-style fields as text.
|
|
238
|
+
|
|
239
|
+
## 3-point lighting rig
|
|
240
|
+
|
|
241
|
+
```gdscript
|
|
242
|
+
func run(ctx):
|
|
243
|
+
var root = ctx.get_scene_root()
|
|
244
|
+
var rig := Node3D.new()
|
|
245
|
+
rig.name = "LightRig"
|
|
246
|
+
root.add_child(rig)
|
|
247
|
+
|
|
248
|
+
var key := DirectionalLight3D.new()
|
|
249
|
+
key.name = "KeyLight"
|
|
250
|
+
key.light_energy = 1.2
|
|
251
|
+
key.shadow_enabled = true
|
|
252
|
+
key.rotation_degrees = Vector3(-45, -30, 0)
|
|
253
|
+
|
|
254
|
+
var fill := OmniLight3D.new()
|
|
255
|
+
fill.name = "FillLight"
|
|
256
|
+
fill.light_energy = 0.4
|
|
257
|
+
fill.position = Vector3(-4, 2, 4)
|
|
258
|
+
|
|
259
|
+
var rim := SpotLight3D.new()
|
|
260
|
+
rim.name = "RimLight"
|
|
261
|
+
rim.light_energy = 0.8
|
|
262
|
+
rim.position = Vector3(0, 3, -5)
|
|
263
|
+
rim.rotation_degrees = Vector3(-20, 180, 0)
|
|
264
|
+
|
|
265
|
+
for light in [key, fill, rim]:
|
|
266
|
+
rig.add_child(light)
|
|
267
|
+
ctx.set_owner_recursive(rig)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
Then `summer_screenshot` — lighting is exactly the kind of change you cannot judge without pixels.
|
|
271
|
+
|
|
272
|
+
## Pitfalls
|
|
273
|
+
|
|
274
|
+
| Pitfall | Reality |
|
|
275
|
+
|---|---|
|
|
276
|
+
| 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. |
|
|
277
|
+
| 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. |
|
|
278
|
+
| Hand-writing AnimationPlayer/library/track plumbing | `ctx.animate` is one call per property and dodges the quaternion trap. |
|
|
279
|
+
| Heavy batch loop in `summer_run_script` | It blocks the live editor. Move project-wide work to `summer_run_editor_script`. |
|
|
280
|
+
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
id: skill/scene-scripting
|
|
2
2
|
kind: skill
|
|
3
|
-
version: 1.
|
|
4
|
-
summary:
|
|
3
|
+
version: 1.2.0
|
|
4
|
+
summary: "Build scenes, levels, HUDs and wiring with one editor GDScript (summer_run_script) instead of call chains."
|
|
5
5
|
use_when:
|
|
6
6
|
- a scene change needs 3+ related ops or any computed placement — scattering, grids, rings, procedural meshes, geometry helpers, terrain, lighting rigs, keyframe animation, shader FX
|
|
7
7
|
- a 2D level (tilemap paint, bodies, camera limits, parallax), an animated sprite, a HUD or Control tree, a persisted signal connection, an attached script, a prefab, input actions, an autoload, or the main scene should be built in one script
|
|
@@ -11,7 +11,7 @@ do_not_use_when:
|
|
|
11
11
|
- a single property tweak — summer_set_prop is cheaper
|
|
12
12
|
- one signal, one input binding, or one project setting — summer_connect_signal, summer_input_map_bind, summer_project_setting are one call each and ship today
|
|
13
13
|
- "the engine build lacks RunSceneScript (Summer Engine 0.5.66 or newer; older engines return engine_lacks_op) — RunEditorScript and RunVerification DO ship today, so fall back to summer_run_editor_script or the scene tools"
|
|
14
|
-
- "the 2D/UI/gameplay-code ctx helpers (Summer Engine 0.5.66 or newer) are missing on the engine — the
|
|
14
|
+
- "the 2D/UI/gameplay-code ctx helpers (Summer Engine 0.5.66 or newer) are missing on the engine — the fallback table in its references/ctx-api.md names what works everywhere"
|
|
15
15
|
facets:
|
|
16
16
|
lifecycle:
|
|
17
17
|
- build
|
|
@@ -52,7 +52,7 @@ related:
|
|
|
52
52
|
- template/2d-platformer
|
|
53
53
|
source: official
|
|
54
54
|
license: MIT
|
|
55
|
-
status:
|
|
55
|
+
status: stable
|
|
56
56
|
recommended: true
|
|
57
57
|
aliases:
|
|
58
58
|
- skills/workflow/scene-scripting
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: scene-to-level
|
|
3
|
-
description: "
|
|
3
|
+
description: "Turn a reference image or concept art into a playable scene: concept, asset pack, terrain, assembly."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: level-design
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep Glob Write Edit summer_create_scene summer_open_scene summer_add_node summer_set_prop summer_set_resource_property summer_save_scene summer_get_scene_tree summer_inspect_node
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_create_scene summer_open_scene summer_add_node summer_set_prop summer_set_resource_property summer_save_scene summer_get_scene_tree summer_inspect_node summer_assets_search summer_import_from_url summer_call
|
|
9
9
|
paths: ["**/*.tscn", "**/*.gd", "assets/**", ".summer/**", "levels/**"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
id: skill/scene-to-level
|
|
2
2
|
kind: skill
|
|
3
3
|
version: 1.0.3
|
|
4
|
-
summary:
|
|
4
|
+
summary: "Turn a reference image or concept art into a playable scene: concept, asset pack, terrain, assembly."
|
|
5
5
|
use_when:
|
|
6
6
|
- going from a scene reference image or concept art to a playable Summer Engine scene populated with the right assets and terrain
|
|
7
7
|
- the user shares concept art or a reference screenshot and wants that location built as a playable scene
|
|
@@ -23,7 +23,7 @@ For a single skill at `library/skills/<slug>/`, run these checks:
|
|
|
23
23
|
4. **Collaborative protocol.** If the skill triggers user-visible writes, body must contain at least one of: `May I`, `I'm about to`, `Continue?`, `OK?`, `Proceed?`. Skills that only inspect/read are exempt.
|
|
24
24
|
5. **Template-id resolved.** If the skill's frontmatter declares `template-id: <id>`, that id must exist in the template registry: `library/templates/<id>/resource.yaml` (see `library/templates/README.md`).
|
|
25
25
|
6. **Behavioral spec.** If the skill has a spec (`evals/skills/specs/<slug>.md` or `tests/spec.md` in the skill folder), it has at least one `## Case` heading. A missing spec is a WARN, not a FAIL.
|
|
26
|
-
7. **
|
|
26
|
+
7. **Links stay inside the skill folder.** Every relative link (`](./references/...)`, `](./examples/...)`) must point at an existing file in the skill's own folder (FAIL if broken). `summer setup` copies each skill folder alone, so a path that climbs out of it (`../`) breaks after install: name a shared reference by its library id (`summer_docs_read` id `reference/<slug>`) and another skill by its bare slug (`design-mechanic`).
|
|
27
27
|
|
|
28
28
|
Output:
|
|
29
29
|
|
|
@@ -80,7 +80,7 @@ This skill is **read-only**. It never writes. No "May I" needed.
|
|
|
80
80
|
|
|
81
81
|
## See also
|
|
82
82
|
|
|
83
|
-
-
|
|
83
|
+
- `summer_docs_read` id `reference/collaborative-protocol`
|
|
84
84
|
- the template registry: `library/templates/<id>/resource.yaml` (see `library/templates/README.md`)
|
|
85
85
|
- `tests/runner.md`
|
|
86
86
|
- `evals/skills/specs/` — per-skill behavioral specs
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: skybox-panorama
|
|
3
|
-
description: "Generate a 360-degree
|
|
3
|
+
description: "Generate a 360-degree sky panorama and wire it as a PanoramaSkyMaterial Sky resource on WorldEnvironment."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 2d-assets
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep Glob Write Edit
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_assets_generate_image summer_assets_search summer_import_from_url summer_set_resource_property summer_write_file summer_add_node summer_set_prop summer_save_scene summer_inspect_node summer_call
|
|
9
9
|
paths: ["assets/**", "art/sky/**", "environments/**"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -38,7 +38,7 @@ The most common failure is **non-equirectangular output**. Image models default
|
|
|
38
38
|
### 1. Search for an existing sky
|
|
39
39
|
|
|
40
40
|
```
|
|
41
|
-
|
|
41
|
+
assets.search({ query: "<vibe> sky panorama", assetType: "2d_image", scope: "all" })
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
Polyhaven (`polyhaven.com/hdris`) hosts hundreds of free CC0 HDRIs. They look more realistic than generated skies and carry real HDR lighting data. Prefer Polyhaven for realistic exteriors; generate for stylized, fantasy or sci-fi skies.
|
|
@@ -60,23 +60,24 @@ Load-bearing phrases:
|
|
|
60
60
|
|
|
61
61
|
### 3. Generate, then fix the aspect yourself
|
|
62
62
|
|
|
63
|
-
Equirectangular MUST be 2:1 (width = 2× height). **`
|
|
63
|
+
Equirectangular MUST be 2:1 (width = 2× height). **`assets.generate_image` has no 2:1 `aspectRatio`**: the closest are `16:9` and `21:9`. Generate at `16:9`. For a larger sky, leave `model` out and add `width: 2048, height: 1152`: a model that reaches that size is picked.
|
|
64
64
|
|
|
65
65
|
```
|
|
66
|
-
|
|
67
|
-
prompt
|
|
68
|
-
model
|
|
69
|
-
style
|
|
70
|
-
|
|
66
|
+
assets.generate_image({
|
|
67
|
+
prompt: "dramatic fantasy sky, golden hour, large purple-orange clouds, distant mountains silhouetted at very bottom, soft god-rays, 360 degree panoramic equirectangular projection, wide panoramic framing, seamless horizontal wrap, no visible seam, no foreground objects, sky only. No vertical seam, no ground objects, no horizon-level detail, not distorted or warped, no characters, no buildings.",
|
|
68
|
+
model: "nano-banana-2",
|
|
69
|
+
style: "realistic",
|
|
70
|
+
aspectRatio: "16:9"
|
|
71
|
+
})
|
|
71
72
|
```
|
|
72
73
|
|
|
73
|
-
|
|
74
|
+
The result reports its real `width` and `height`. Then one of these has to happen before the image is usable as a panorama:
|
|
74
75
|
|
|
75
|
-
- **
|
|
76
|
-
- **Or
|
|
76
|
+
- **Crop the 16:9 result to 2:1** by trimming the top and bottom (about 11% of the height) before importing. The width stays whole, so the horizontal wrap the prompt asked for survives; the zenith and nadir are the least informative regions of a sky anyway.
|
|
77
|
+
- **Or generate in the Summer dashboard**, which offers 2:1, and bring the result back with `summer_import_from_url`.
|
|
77
78
|
- **Or use a Polyhaven HDRI**, already 2:1 and better for realistic exteriors.
|
|
78
79
|
|
|
79
|
-
Do not import a 1:1 image as a `PanoramaSkyMaterial` panorama and call it done — it wraps with obvious horizontal compression.
|
|
80
|
+
Do not import a 16:9 or 1:1 image as a `PanoramaSkyMaterial` panorama and call it done — it wraps with obvious horizontal compression. Never crop the sides: that breaks the seamless wrap.
|
|
80
81
|
|
|
81
82
|
### 4. Verify the seam and projection
|
|
82
83
|
|
|
@@ -154,7 +155,7 @@ Then `summer_play` and look around. Sun in the right place? Seam invisible? Top/
|
|
|
154
155
|
## Anti-patterns
|
|
155
156
|
|
|
156
157
|
- **Including foreground or horizon.** Mountains, trees, buildings at horizon level warp weirdly when sphere-mapped (the "swimming horizon" effect). Skies show ONLY sky. If the level needs distant mountains, model them as low-poly meshes in the scene, not in the sky texture.
|
|
157
|
-
- **Assuming
|
|
158
|
+
- **Assuming the image is 2:1.** `aspectRatio` has no 2:1 value; read the returned `width` and `height`. A 1:1 or 16:9 panorama wrapped equirectangular has obvious horizontal compression. Crop the top and bottom, or generate in the dashboard where 2:1 exists.
|
|
158
159
|
- **Tight features at zenith/nadir.** Anything in the top or bottom 10% of the image gets pinched. Bias toward soft, diffuse features there.
|
|
159
160
|
- **Expecting HDR / IBL quality.** AI panoramas are 8-bit. If the user needs realistic environment lighting from the sky, point them at Polyhaven HDRIs (CC0). AI is for visual sky, not for lighting.
|
|
160
161
|
- **Forgetting `Repeat: Disabled` on import.** Panoramas wrap once via the material; if `Repeat` is on, you can get duplicate-tile artifacts at the seam.
|
|
@@ -167,19 +168,24 @@ Then `summer_play` and look around. Sun in the right place? Seam invisible? Top/
|
|
|
167
168
|
- **Indoor scene.** Skyboxes are wasted indoors — use `BG_COLOR` or a flat black background. Don't generate a sky for a windowless dungeon.
|
|
168
169
|
- **Visible vertical seam after generation.** Fix in Photoshop/GIMP: `Filter → Other → Offset` by 50% horizontally → the seam moves to the center → heal with content-aware fill or clone stamp → offset back to 0. Or regenerate with seed bump and `seamless horizontal wrap, no visible seam at left and right edges` repeated twice in the prompt.
|
|
169
170
|
|
|
171
|
+
## Without Summer Engine
|
|
172
|
+
|
|
173
|
+
In a session without Summer Engine tools (the assets profile; the `summer-assets` skill has the whole loop), do steps 1-4 and skip steps 5-7 (import, `WorldEnvironment`, scene check). Pass `out` with the person's folder so the image lands there (the `summer-assets` skill says how). Tell them it is a 2:1 equirectangular panorama, the shape most engines take for a sky.
|
|
174
|
+
|
|
170
175
|
## Fallback (no MCP)
|
|
171
176
|
|
|
172
177
|
Print the call:
|
|
173
178
|
|
|
174
179
|
```
|
|
175
|
-
|
|
176
|
-
prompt
|
|
177
|
-
model
|
|
178
|
-
style
|
|
179
|
-
|
|
180
|
+
assets.generate_image({
|
|
181
|
+
prompt: "<sky> 360 degree panoramic equirectangular projection, seamless horizontal wrap, no visible seam, no foreground objects, sky only",
|
|
182
|
+
model: "nano-banana-2",
|
|
183
|
+
style: "realistic",
|
|
184
|
+
aspectRatio: "16:9"
|
|
185
|
+
})
|
|
180
186
|
```
|
|
181
187
|
|
|
182
|
-
The dashboard is the better surface for this skill: it
|
|
188
|
+
The dashboard is the better surface for this skill: it offers 2:1 and a real negative prompt, which the asset operations do not. Tell the user to set 2:1 and a negative of `vertical seam, foreground, distorted, warped, characters, buildings`, then `summer_import_from_url` to `res://art/sky/<name>.png`, set `Repeat: Disabled`, and wire the WorldEnvironment.
|
|
183
189
|
|
|
184
190
|
If MCP is offline entirely: Polyhaven (`polyhaven.com/hdris`) has hundreds of free CC0 HDRIs ready to drop into `PanoramaSkyMaterial`, and often the better choice for realistic exteriors.
|
|
185
191
|
|
|
@@ -198,4 +204,4 @@ After the sky is wired:
|
|
|
198
204
|
- `tileable-texture` — ground/floor counterpart.
|
|
199
205
|
- `scene-composition` — WorldEnvironment placement and configuration.
|
|
200
206
|
- `asset-strategy` — meta-router.
|
|
201
|
-
-
|
|
207
|
+
- `summer_docs_read` id `reference/mcp-tools-reference` — how to call `assets.generate_image`.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
id: skill/skybox-panorama
|
|
2
2
|
kind: skill
|
|
3
3
|
version: 1.0.3
|
|
4
|
-
summary: Generate a 360-degree
|
|
4
|
+
summary: "Generate a 360-degree sky panorama and wire it as a PanoramaSkyMaterial Sky resource on WorldEnvironment."
|
|
5
5
|
use_when:
|
|
6
6
|
- generating a 360-degree panoramic sky image for use as a Sky resource (PanoramaSkyMaterial) in a 3D scene
|
|
7
7
|
- a 3D scene has a flat or default sky and needs a 360-degree backdrop matching the art direction
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sound-effect
|
|
3
|
-
description: "Make
|
|
3
|
+
description: "Make sound effects (swings, hits, whooshes, reloads, UI): three versions to pick from, then wire them."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: audio
|
|
7
7
|
user-invocable: true
|
|
8
|
-
allowed-tools: Read Grep Glob Write Edit
|
|
8
|
+
allowed-tools: Read Grep Glob Write Edit summer_assets_generate_sfx_choices summer_assets_choices summer_assets_generate_audio summer_assets_search summer_import_from_url summer_import_asset_by_id summer_add_node summer_set_prop summer_instantiate_scene summer_inspect_node summer_get_scene_tree summer_call
|
|
9
9
|
paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -17,8 +17,8 @@ paths: ["audio/sfx/**", "scripts/**", "**/*.tscn"]
|
|
|
17
17
|
>
|
|
18
18
|
> Say why in one plain line: the best model changes a lot from one sound to the next, so picking by ear gives a better result.
|
|
19
19
|
>
|
|
20
|
-
> - **Yes** → `
|
|
21
|
-
> - **No** → `
|
|
20
|
+
> - **Yes** → `assets.generate_sfx_choices`, tell them where to listen (their Studio tab opens the page, else `reviewUrl`), then `assets.choices` until they decide. Import the approved clips and wire them. The model they approve becomes their default.
|
|
21
|
+
> - **No** → `assets.generate_audio` with `capability: "sound_effects"` and **no** `modelId` (it uses their approved default, else ElevenLabs).
|
|
22
22
|
>
|
|
23
23
|
> Ask once per chat. After they answer, do not ask again in the same chat; follow their answer for the rest of it.
|
|
24
24
|
|
|
@@ -38,7 +38,7 @@ Read `.summer/audio-bible.md` if it exists and map the request to one of its SFX
|
|
|
38
38
|
|
|
39
39
|
### 2. Reuse before you generate
|
|
40
40
|
|
|
41
|
-
Generation costs credits. `
|
|
41
|
+
Generation costs credits (`dryRun: true` on the generate call shows how many). `assets.search({ query: "<subject>", assetType: "audio", scope: "all" })`; if a clip fits, ask whether to use it.
|
|
42
42
|
|
|
43
43
|
### 3. Write the prompt
|
|
44
44
|
|
|
@@ -60,7 +60,7 @@ Foley one-shot: <physical event with materials>, <transient + tail described>, c
|
|
|
60
60
|
Foley sequence, exactly 2 seconds, three distinct mechanical sounds: at 0.2 s the empty magazine is released and pulled out with a metal click; at 1.0 s a full magazine is slammed in with a solid clack; at 1.6 s the charging handle is pulled back and released with a sharp metallic snap. Close-mic, dry, no gunshot, no music.
|
|
61
61
|
```
|
|
62
62
|
|
|
63
|
-
**Loops:** write `seamless loop` in the text and pass `loop: true`. Only ElevenLabs SFX v2 makes loops: use `
|
|
63
|
+
**Loops:** write `seamless loop` in the text and pass `loop: true`. Only ElevenLabs SFX v2 makes loops: use `assets.generate_audio` with `modelId: "eleven_text_to_sound_v2"`, or include it in a choice set.
|
|
64
64
|
|
|
65
65
|
Avoid: vibe words (`epic`, `cool`, `realistic`), several unrelated events in one prompt (split them, unless it is a timed sequence), and no length.
|
|
66
66
|
|
|
@@ -87,32 +87,34 @@ Show the prompt and the length before you call; every version is a billed genera
|
|
|
87
87
|
**Choice set (the person said yes):**
|
|
88
88
|
|
|
89
89
|
```
|
|
90
|
-
|
|
90
|
+
assets.generate_sfx_choices({ text: "<prompt>", durationSeconds: 1.0 })
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
-
The
|
|
93
|
+
The answer has `choiceSetId`, `reviewUrl`, the `clips` and `studioTabOpened`. The page opens in their open Summer Studio tab; if `studioTabOpened` is false, give them `reviewUrl`. Do not pick for them. Then:
|
|
94
94
|
|
|
95
95
|
```
|
|
96
|
-
|
|
96
|
+
assets.choices({ choiceSetId: "<id>", waitSeconds: 50 })
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
Call it again while `status` is `pending`. When it is `decided`, each
|
|
99
|
+
Call it again while `status` is `pending`. When it is `decided`, each clip with `approved: true` has `audioUrl`, `assetId` and the person's `note`. If they approved none, ask what to change and make a new set.
|
|
100
100
|
|
|
101
101
|
**One version (the person said no, or later sounds after a decided set):**
|
|
102
102
|
|
|
103
103
|
```
|
|
104
|
-
|
|
104
|
+
assets.generate_audio({ capability: "sound_effects", text: "<prompt>", durationSeconds: 1.0 })
|
|
105
105
|
```
|
|
106
106
|
|
|
107
|
-
Leave out `modelId` so their approved default runs. The description goes in `text`, not `prompt` (`
|
|
107
|
+
Leave out `modelId` so their approved default runs. The description goes in `text`, not `prompt` (without `text` the call is refused: `text_required`). The answer's `asset` has `assetId`, `fileUrl` and `durationSeconds`.
|
|
108
|
+
|
|
109
|
+
No Summer project (an asset-only request, or the engine is not installed or not running): stop here. The clips are in the person's Summer library; give them the `audioUrl` of each approved version and skip steps 7 and 8.
|
|
108
110
|
|
|
109
111
|
### 7. Import
|
|
110
112
|
|
|
111
113
|
```
|
|
112
|
-
summer_import_from_url(url: "<audioUrl>", path: "res://audio/sfx/sword_clash_01.<
|
|
114
|
+
summer_import_from_url(url: "<audioUrl>", path: "res://audio/sfx/sword_clash_01.<ext>")
|
|
113
115
|
```
|
|
114
116
|
|
|
115
|
-
or `summer_import_asset_by_id(assetId: "<assetId>", path: "res://audio/sfx/sword_clash_01.<
|
|
117
|
+
or `summer_import_asset_by_id(assetId: "<assetId>", path: "res://audio/sfx/sword_clash_01.<ext>")`. Keep the extension of the file you got (the end of `audioUrl` or `fileUrl`). When the person approved several versions, import each one (`_01`, `_02`, …) and play a random one per event for variety.
|
|
116
118
|
|
|
117
119
|
One-shots keep loop OFF in the Import dock; looping a one-shot clicks. For a loop: WAV uses Edit > Loop Mode = Forward; OGG/MP3 use Loop = on.
|
|
118
120
|
|
|
@@ -124,13 +126,18 @@ One-shots keep loop OFF in the Import dock; looping a one-shot clicks. For a loo
|
|
|
124
126
|
| `AudioStreamPlayer2D` | 2D positional |
|
|
125
127
|
| `AudioStreamPlayer3D` | 3D positional (weapon swing in the world, footstep) |
|
|
126
128
|
|
|
127
|
-
|
|
129
|
+
One script adds the player with its settings; `scenePath` is the exact scene to change:
|
|
128
130
|
|
|
129
131
|
```
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
summer_run_script(scenePath="res://main.tscn", source="""
|
|
133
|
+
func run(ctx):
|
|
134
|
+
ctx.add_node("AudioStreamPlayer3D", "SwingSFX", ctx.find("Player"), {
|
|
135
|
+
"stream": load("res://audio/sfx/sword_swing_01.wav"),
|
|
136
|
+
"bus": "SFX",
|
|
137
|
+
"max_distance": 25.0,
|
|
138
|
+
})
|
|
139
|
+
ctx.save_scene()
|
|
140
|
+
""")
|
|
134
141
|
```
|
|
135
142
|
|
|
136
143
|
The bus must match the bible (`SFX`, `UI`, `Ambient`, …); the default bus is `Master`. If the bus does not exist, run `/audio-direction`.
|
|
@@ -154,6 +161,10 @@ Save it as a `.tscn` and instantiate it per event in GDScript (`preload(...).ins
|
|
|
154
161
|
|
|
155
162
|
`summer_inspect_node(path="Player/SwingSFX")`: verify `stream`, `bus`, `volume_db`. Too quiet: raise `volume_db` (+3 to +9, never past +12), else regenerate with a heavier description. Too long: `stop()` on a timer.
|
|
156
163
|
|
|
164
|
+
## Without Summer Engine
|
|
165
|
+
|
|
166
|
+
In a session without Summer Engine tools (the assets profile; the `summer-assets` skill has the whole loop), do steps 1-6 and skip steps 7-9 (import, wiring, scene check). With `assets.generate_sfx_choices`, the person picks in the page; then save each approved clip where the person asked with `assets.get` and `out` (the `summer-assets` skill says how), and tell them the path and format.
|
|
167
|
+
|
|
157
168
|
## Fallback (no MCP)
|
|
158
169
|
|
|
159
170
|
Print the prompt, the length and the target path (`res://audio/sfx/<name>.wav`), and tell the person to make it in Summer Studio, then import it.
|
|
@@ -164,4 +175,4 @@ Print the prompt, the length and the target path (`res://audio/sfx/<name>.wav`),
|
|
|
164
175
|
- `ambient-bed` — long looping textures
|
|
165
176
|
- `music-track` — music
|
|
166
177
|
- `voice-line` — speech
|
|
167
|
-
-
|
|
178
|
+
- `summer_docs_read` id `reference/mcp-tools-reference`
|