summer-engine 3.8.0 → 4.2.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 +24 -22
- package/.codex-plugin/plugin.json +18 -22
- package/.cursor-plugin/plugin.json +8 -14
- package/.factory-plugin/plugin.json +6 -13
- package/AGENTS.md +19 -12
- package/CHANGELOG.md +133 -0
- package/GEMINI.md +3 -3
- package/README.md +118 -37
- package/assets/icon.png +0 -0
- package/commands/start.md +71 -0
- package/commands/summer.md +3 -2
- package/dist/cli/banner.js +3 -0
- package/dist/cli/commands/config.js +3 -2
- package/dist/cli/commands/create.js +12 -3
- package/dist/cli/commands/list.d.ts +5 -0
- package/dist/cli/commands/list.js +30 -13
- package/dist/cli/commands/login.d.ts +27 -0
- package/dist/cli/commands/login.js +58 -12
- package/dist/cli/commands/memory.js +6 -2
- package/dist/cli/commands/ops.d.ts +64 -0
- package/dist/cli/commands/ops.js +329 -0
- package/dist/cli/commands/setup.d.ts +4 -0
- package/dist/cli/commands/setup.js +254 -26
- package/dist/cli/commands/skills.js +28 -11
- package/dist/cli/commands/status.d.ts +26 -0
- package/dist/cli/commands/status.js +36 -21
- 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 +33 -10
- package/dist/core/capabilities/apps.js +25 -12
- package/dist/core/capabilities/audit/args.d.ts +6 -6
- package/dist/core/capabilities/doctor.d.ts +3 -0
- package/dist/core/capabilities/doctor.js +20 -15
- package/dist/core/capabilities/fabricate-mesh.d.ts +4 -4
- 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/hdri-import.d.ts +2 -2
- package/dist/core/capabilities/motion-generation.d.ts +2 -2
- 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/placement.d.ts +23 -23
- package/dist/core/capabilities/publish-build.js +2 -0
- package/dist/core/capabilities/runtime-control.d.ts +42 -42
- 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/seeing/args.d.ts +16 -16
- 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 +81 -46
- package/dist/core/capabilities/ui-control.d.ts +2 -2
- package/dist/core/capabilities/world-snapshot.d.ts +4 -4
- 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.d.ts +2 -2
- package/dist/core/library-search.js +2 -1
- package/dist/core/oauth.js +4 -0
- package/dist/core/ops/areas.d.ts +11 -0
- package/dist/core/ops/areas.js +24 -0
- package/dist/core/ops/catalog.d.ts +45 -0
- package/dist/core/ops/catalog.js +157 -0
- package/dist/core/ops/cloud.d.ts +64 -0
- package/dist/core/ops/cloud.js +198 -0
- package/dist/core/ops/contract.d.ts +120 -0
- package/dist/core/ops/contract.js +134 -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/public-catalog.d.ts +48 -0
- package/dist/core/ops/public-catalog.js +56 -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 +8 -0
- package/dist/core/ops/search.js +187 -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 +27 -6
- package/dist/installer/agent-table.d.ts +12 -0
- package/dist/installer/agent-table.js +33 -9
- package/dist/installer/cli-permissions.d.ts +65 -0
- package/dist/installer/cli-permissions.js +182 -0
- package/dist/installer/setup.d.ts +4 -0
- package/dist/installer/setup.js +12 -4
- package/dist/installer/skills-refresh.d.ts +29 -0
- package/dist/installer/skills-refresh.js +261 -0
- package/dist/installer/version-check.d.ts +51 -11
- package/dist/installer/version-check.js +147 -37
- package/dist/mcp/command.js +7 -0
- package/dist/mcp/hosted-mount.d.ts +27 -2
- package/dist/mcp/hosted-mount.js +53 -23
- 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 +453 -0
- package/dist/mcp/server.d.ts +45 -11
- package/dist/mcp/server.js +263 -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.js +9 -2
- 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/dist/project-memory/agent-instructions.d.ts +47 -0
- package/dist/project-memory/agent-instructions.js +226 -0
- package/gemini-extension.json +6 -13
- package/hooks/pre-commit-doctor.sh +5 -4
- package/hooks/session-start.sh +24 -28
- package/integrations/README.md +1 -1
- package/integrations/claude/README.md +6 -0
- package/integrations/claude/manifest-target.json +4 -0
- package/integrations/claude-desktop/README.md +1 -1
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/gemini/README.md +11 -0
- 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/integrations/windsurf/README.md +1 -1
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +79 -51
- 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 +69 -28
- package/library/skills/3d-lighting/resource.yaml +1 -1
- package/library/skills/README.md +121 -118
- package/library/skills/adaptive-music/SKILL.md +40 -23
- package/library/skills/adaptive-music/resource.yaml +1 -1
- package/library/skills/agent-playtesting/SKILL.md +23 -1
- package/library/skills/agent-playtesting/resource.yaml +1 -1
- package/library/skills/ai-characters-in-games/SKILL.md +16 -1
- package/library/skills/ai-characters-in-games/resource.yaml +1 -1
- package/library/skills/ambient-bed/SKILL.md +38 -13
- package/library/skills/ambient-bed/resource.yaml +1 -1
- package/library/skills/animated-loop/SKILL.md +60 -32
- package/library/skills/animated-loop/resource.yaml +1 -1
- package/library/skills/animation-tree/SKILL.md +27 -1
- package/library/skills/animation-tree/resource.yaml +1 -1
- package/library/skills/art-direction/SKILL.md +17 -3
- package/library/skills/art-direction/resource.yaml +1 -1
- package/library/skills/asset-strategy/SKILL.md +51 -4
- package/library/skills/asset-strategy/resource.yaml +2 -1
- package/library/skills/audio-direction/SKILL.md +26 -10
- package/library/skills/audio-direction/resource.yaml +1 -1
- package/library/skills/auto-fire-targeting/SKILL.md +15 -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 +14 -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 +11 -1
- package/library/skills/browse-templates/resource.yaml +1 -1
- package/library/skills/camera-rigs/SKILL.md +22 -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 +28 -4
- package/library/skills/character-animation-wiring/resource.yaml +1 -1
- package/library/skills/character-model/SKILL.md +83 -47
- package/library/skills/character-model/resource.yaml +1 -1
- package/library/skills/character-movement/SKILL.md +27 -3
- package/library/skills/character-movement/resource.yaml +1 -1
- package/library/skills/character-portrait/SKILL.md +39 -19
- package/library/skills/character-portrait/resource.yaml +1 -1
- package/library/skills/cinematic-cutscene/SKILL.md +79 -46
- package/library/skills/cinematic-cutscene/resource.yaml +1 -1
- package/library/skills/combat-basics/SKILL.md +20 -1
- package/library/skills/combat-basics/resource.yaml +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +12 -1
- package/library/skills/compatibility-renderer-traps/resource.yaml +1 -1
- package/library/skills/concept-art/SKILL.md +29 -12
- package/library/skills/concept-art/resource.yaml +1 -1
- package/library/skills/concept-to-level/SKILL.md +258 -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 +37 -13
- package/library/skills/create-asset-sheet/resource.yaml +1 -1
- package/library/skills/debug/SKILL.md +34 -2
- package/library/skills/debug/resource.yaml +1 -1
- package/library/skills/debugging-game-feel/SKILL.md +13 -1
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +40 -35
- package/library/skills/design-level/resource.yaml +1 -1
- package/library/skills/design-mechanic/SKILL.md +18 -1
- package/library/skills/design-mechanic/resource.yaml +1 -1
- package/library/skills/design-npc/SKILL.md +43 -24
- package/library/skills/design-npc/resource.yaml +1 -1
- package/library/skills/diagnosing-perf-regressions/SKILL.md +13 -1
- package/library/skills/diagnosing-perf-regressions/resource.yaml +1 -1
- package/library/skills/driving-the-editor-ui/SKILL.md +24 -1
- package/library/skills/driving-the-editor-ui/resource.yaml +1 -1
- package/library/skills/environment-kit/SKILL.md +43 -16
- package/library/skills/environment-kit/resource.yaml +1 -1
- package/library/skills/export-and-ship/SKILL.md +29 -6
- package/library/skills/export-and-ship/resource.yaml +1 -1
- package/library/skills/fabricating-assets/SKILL.md +30 -7
- package/library/skills/fabricating-assets/resource.yaml +3 -3
- package/library/skills/facial-and-lipsync/SKILL.md +36 -15
- package/library/skills/facial-and-lipsync/resource.yaml +1 -1
- package/library/skills/fps-controller/SKILL.md +50 -41
- package/library/skills/fps-controller/resource.yaml +1 -1
- package/library/skills/game-feel/SKILL.md +34 -8
- package/library/skills/game-feel/resource.yaml +1 -1
- package/library/skills/gameskill/SKILL.md +15 -4
- package/library/skills/gameskill/resource.yaml +1 -1
- package/library/skills/gdscript-patterns/SKILL.md +16 -1
- package/library/skills/gdscript-patterns/resource.yaml +1 -1
- package/library/skills/generate-motion/SKILL.md +51 -21
- package/library/skills/generate-motion/resource.yaml +1 -1
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +18 -1
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +1 -0
- package/library/skills/grow-analytics/SKILL.md +13 -3
- package/library/skills/grow-analytics/resource.yaml +1 -1
- package/library/skills/headless-scripting/SKILL.md +14 -1
- package/library/skills/headless-scripting/resource.yaml +1 -1
- package/library/skills/in-game-purchases/SKILL.md +12 -1
- package/library/skills/in-game-purchases/resource.yaml +1 -1
- package/library/skills/instantiate-asset-pack/SKILL.md +19 -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 +33 -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 +13 -1
- package/library/skills/multiplayer/resource.yaml +1 -1
- package/library/skills/multiplayer-movement/SKILL.md +19 -1
- package/library/skills/multiplayer-movement/resource.yaml +1 -1
- package/library/skills/multiplayer-project/SKILL.md +18 -1
- package/library/skills/multiplayer-project/resource.yaml +1 -1
- package/library/skills/multiplayer-publish/SKILL.md +25 -7
- package/library/skills/multiplayer-publish/resource.yaml +3 -3
- package/library/skills/multiplayer-state/SKILL.md +17 -1
- package/library/skills/multiplayer-state/resource.yaml +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +16 -1
- package/library/skills/multiplayer-testing/resource.yaml +1 -1
- package/library/skills/music-track/SKILL.md +38 -13
- package/library/skills/music-track/resource.yaml +1 -1
- package/library/skills/navigate-summer/SKILL.md +26 -9
- package/library/skills/navigate-summer/resource.yaml +1 -1
- package/library/skills/new-project/SKILL.md +12 -1
- package/library/skills/new-project/resource.yaml +1 -1
- package/library/skills/organic-model/SKILL.md +48 -18
- package/library/skills/organic-model/resource.yaml +1 -1
- package/library/skills/pixel-art/SKILL.md +42 -23
- package/library/skills/pixel-art/resource.yaml +1 -1
- package/library/skills/play/SKILL.md +19 -1
- package/library/skills/play/resource.yaml +1 -1
- package/library/skills/playtesting-a-feature/SKILL.md +24 -1
- package/library/skills/playtesting-a-feature/resource.yaml +1 -1
- package/library/skills/procedural-animation/SKILL.md +38 -16
- package/library/skills/procedural-animation/resource.yaml +1 -1
- package/library/skills/prop-model/SKILL.md +48 -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 +43 -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 +13 -1
- package/library/skills/release-readiness/resource.yaml +1 -1
- package/library/skills/remote-deploy/SKILL.md +15 -1
- package/library/skills/remote-deploy/resource.yaml +1 -1
- package/library/skills/retarget/SKILL.md +43 -20
- package/library/skills/retarget/resource.yaml +1 -1
- package/library/skills/running-in-the-cloud/SKILL.md +11 -1
- package/library/skills/running-in-the-cloud/resource.yaml +1 -1
- package/library/skills/save-load/SKILL.md +16 -1
- package/library/skills/save-load/resource.yaml +1 -1
- package/library/skills/scene-composition/SKILL.md +18 -1
- package/library/skills/scene-composition/resource.yaml +1 -1
- package/library/skills/scene-hierarchy-design/SKILL.md +26 -2
- package/library/skills/scene-hierarchy-design/resource.yaml +1 -1
- package/library/skills/scene-scripting/SKILL.md +96 -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 +24 -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 +12 -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 +47 -21
- package/library/skills/skybox-panorama/resource.yaml +1 -1
- package/library/skills/sound-effect/SKILL.md +52 -20
- package/library/skills/sound-effect/resource.yaml +1 -1
- package/library/skills/spatial-placement/SKILL.md +44 -9
- package/library/skills/spatial-placement/resource.yaml +1 -1
- package/library/skills/sprite-sheet/SKILL.md +55 -27
- package/library/skills/sprite-sheet/resource.yaml +1 -1
- package/library/skills/store-art/SKILL.md +14 -3
- package/library/skills/store-art/resource.yaml +2 -2
- package/library/skills/store-listing/SKILL.md +13 -3
- package/library/skills/store-listing/resource.yaml +2 -2
- package/library/skills/summer-analytics/SKILL.md +22 -5
- package/library/skills/summer-analytics/resource.yaml +2 -2
- package/library/skills/summer-apps/SKILL.md +77 -32
- package/library/skills/summer-apps/manifest.md +1 -1
- package/library/skills/summer-apps/minimal-app.md +7 -7
- package/library/skills/summer-apps/resource.yaml +1 -1
- package/library/skills/summer-apps/sdk-reference.md +5 -5
- package/library/skills/summer-apps-design/SKILL.md +1 -1
- package/library/skills/summer-apps-design/resource.yaml +1 -1
- package/library/skills/summer-assets/SKILL.md +86 -0
- package/library/skills/summer-assets/resource.yaml +34 -0
- package/library/skills/summer-cli/SKILL.md +133 -0
- package/library/skills/summer-cli/resource.yaml +31 -0
- package/library/skills/summer-friends/SKILL.md +14 -0
- package/library/skills/summer-leaderboards/SKILL.md +16 -0
- package/library/skills/summer-match-results/SKILL.md +17 -0
- package/library/skills/summer-matchmaking/SKILL.md +17 -0
- package/library/skills/summer-parties/SKILL.md +14 -0
- package/library/skills/summer-player-data/SKILL.md +14 -0
- package/library/skills/summer-store/SKILL.md +16 -1
- package/library/skills/summer-world-chat/SKILL.md +14 -0
- package/library/skills/summer-world-saves/SKILL.md +14 -0
- package/library/skills/text-to-motion/SKILL.md +45 -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 +37 -15
- package/library/skills/tileable-texture/resource.yaml +1 -1
- package/library/skills/trailer-shot/SKILL.md +46 -24
- package/library/skills/trailer-shot/resource.yaml +1 -1
- package/library/skills/tune-performance/SKILL.md +32 -6
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-basics/SKILL.md +55 -36
- package/library/skills/ui-basics/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +64 -38
- package/library/skills/ui-graphics/resource.yaml +1 -1
- package/library/skills/use-widget-asset/SKILL.md +15 -1
- package/library/skills/use-widget-asset/resource.yaml +1 -1
- package/library/skills/using-summer/SKILL.md +32 -5
- package/library/skills/using-summer/resource.yaml +3 -2
- package/library/skills/vehicle-model/SKILL.md +92 -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 +31 -2
- package/library/skills/verifying-scenes/resource.yaml +1 -1
- package/library/skills/vfx-dissolve/SKILL.md +21 -2
- package/library/skills/vfx-dissolve/resource.yaml +1 -1
- package/library/skills/vfx-fire/SKILL.md +41 -41
- package/library/skills/vfx-fire/resource.yaml +1 -1
- package/library/skills/vfx-hit-spark/SKILL.md +24 -1
- package/library/skills/vfx-hit-spark/resource.yaml +1 -1
- package/library/skills/vfx-lightning/SKILL.md +30 -16
- package/library/skills/vfx-lightning/resource.yaml +1 -1
- package/library/skills/vfx-magic-glow/SKILL.md +46 -32
- package/library/skills/vfx-magic-glow/resource.yaml +1 -1
- package/library/skills/vfx-muzzle-flash/SKILL.md +43 -35
- package/library/skills/vfx-muzzle-flash/resource.yaml +1 -1
- package/library/skills/vfx-smoke/SKILL.md +39 -31
- package/library/skills/vfx-smoke/resource.yaml +1 -1
- package/library/skills/vfx-water-ripple/SKILL.md +35 -31
- package/library/skills/vfx-water-ripple/resource.yaml +1 -1
- package/library/skills/voice-line/SKILL.md +87 -40
- package/library/skills/voice-line/resource.yaml +1 -1
- package/library/skills/web-and-touch-input/SKILL.md +20 -1
- package/library/skills/web-and-touch-input/resource.yaml +1 -1
- package/library/skills/web-compatibility-look/SKILL.md +21 -1
- package/library/skills/web-compatibility-look/resource.yaml +1 -1
- package/library/skills/world-building-3d/SKILL.md +29 -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 +1 -1
- package/library/tools/app-guide/resource.yaml +2 -2
- package/library/tools/app-page/resource.yaml +1 -1
- package/library/tools/app-screenshot/resource.yaml +19 -1
- package/library/tools/app-tools/resource.yaml +1 -1
- 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/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 +8 -5
- package/registry/generated/counts.json +2 -2
- package/registry/generated/gemini-extension.json +6 -13
- package/registry/generated/index.json +482 -349
- package/registry/generated/marketplace.claude.json +2 -13
- package/registry/generated/plugin.claude-directory.json +168 -0
- package/registry/generated/plugin.claude.json +24 -22
- package/registry/generated/plugin.codex.json +18 -22
- package/registry/generated/plugin.cursor.json +8 -14
- package/registry/generated/plugin.factory.json +6 -13
- package/registry/generated/server.json +43 -0
- package/registry/generated/skills-index.md +121 -118
- package/registry/generated/skills-registry.json +167 -115
- 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 +1241 -0
- package/registry/operations/public-catalog.json +33160 -0
- 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
|
|
|
@@ -125,3 +125,25 @@ Expect about 30 minutes for the asset packs (in parallel) and another 15 for sce
|
|
|
125
125
|
- **Auto-tiling terrain.** The pipeline node exists in the decision tree but the leaf skill that implements it is not built.
|
|
126
126
|
- **Animation orchestration.** Per-character `sprite-sheet` is invoked manually; no auto-pairing of characters with their animation pipelines yet.
|
|
127
127
|
- **Gameplay code.** Player movement, interactions, win conditions — those are level-design + gameplay-mechanics skills, not this one.
|
|
128
|
+
|
|
129
|
+
<!-- shell-commands: generated from the operation catalog by npm run generate:registry; do not edit by hand -->
|
|
130
|
+
## From a shell
|
|
131
|
+
|
|
132
|
+
No Summer MCP tools in this session? Run each one as a command; when `summer --version` is missing or below 4.0, use `npx -y summer-engine@latest` in place of `summer`. Fields are flags in kebab-case (`--scene-path res://main.tscn`) or one `--input '<json>'`, and `summer ops describe <op>` prints the exact input. The `summer-cli` skill has the rest.
|
|
133
|
+
|
|
134
|
+
| In this skill | Command |
|
|
135
|
+
|---|---|
|
|
136
|
+
| `summer_assets_search` | `summer assets search` |
|
|
137
|
+
| `summer_add_node` | `summer engine add-node` |
|
|
138
|
+
| `summer_create_scene` | `summer engine create-scene` |
|
|
139
|
+
| `summer_get_diagnostics` | `summer engine get-diagnostics` |
|
|
140
|
+
| `summer_get_scene_tree` | `summer engine get-scene-tree` |
|
|
141
|
+
| `summer_get_script_errors` | `summer engine get-script-errors` |
|
|
142
|
+
| `summer_import_from_url` | `summer engine import-from-url` |
|
|
143
|
+
| `summer_inspect_node` | `summer engine inspect-node` |
|
|
144
|
+
| `summer_open_scene` | `summer engine open-scene` |
|
|
145
|
+
| `summer_play` | `summer engine play` |
|
|
146
|
+
| `summer_save_scene` | `summer engine save-scene` |
|
|
147
|
+
| `summer_set_prop` | `summer engine set-prop` |
|
|
148
|
+
| `summer_set_resource_property` | `summer engine set-resource-property` |
|
|
149
|
+
<!-- /shell-commands -->
|
|
@@ -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,17 @@ 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
|
|
87
|
+
|
|
88
|
+
<!-- shell-commands: generated from the operation catalog by npm run generate:registry; do not edit by hand -->
|
|
89
|
+
## From a shell
|
|
90
|
+
|
|
91
|
+
No Summer MCP tools in this session? Run each one as a command; when `summer --version` is missing or below 4.0, use `npx -y summer-engine@latest` in place of `summer`. Fields are flags in kebab-case (`--scene-path res://main.tscn`) or one `--input '<json>'`, and `summer ops describe <op>` prints the exact input. The `summer-cli` skill has the rest.
|
|
92
|
+
|
|
93
|
+
| In this skill | Command |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `summer_docs_read` | `summer docs read` |
|
|
96
|
+
<!-- /shell-commands -->
|
|
@@ -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,24 @@ 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`.
|
|
208
|
+
|
|
209
|
+
<!-- shell-commands: generated from the operation catalog by npm run generate:registry; do not edit by hand -->
|
|
210
|
+
## From a shell
|
|
211
|
+
|
|
212
|
+
No Summer MCP tools in this session? Run each one as a command; when `summer --version` is missing or below 4.0, use `npx -y summer-engine@latest` in place of `summer`. Fields are flags in kebab-case (`--scene-path res://main.tscn`) or one `--input '<json>'`, and `summer ops describe <op>` prints the exact input. The `summer-cli` skill has the rest.
|
|
213
|
+
|
|
214
|
+
| In this skill | Command |
|
|
215
|
+
|---|---|
|
|
216
|
+
| `assets.generate_image`, `summer_assets_generate_image` | `summer assets generate-image` |
|
|
217
|
+
| `summer_assets_search` | `summer assets search` |
|
|
218
|
+
| `summer_docs_read` | `summer docs read` |
|
|
219
|
+
| `summer_add_node` | `summer engine add-node` |
|
|
220
|
+
| `summer_import_from_url` | `summer engine import-from-url` |
|
|
221
|
+
| `summer_inspect_node` | `summer engine inspect-node` |
|
|
222
|
+
| `summer_play` | `summer engine play` |
|
|
223
|
+
| `summer_save_scene` | `summer engine save-scene` |
|
|
224
|
+
| `summer_set_prop` | `summer engine set-prop` |
|
|
225
|
+
| `summer_set_resource_property` | `summer engine set-resource-property` |
|
|
226
|
+
| `summer_write_file` | `summer engine write-file` |
|
|
227
|
+
<!-- /shell-commands -->
|
|
@@ -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
|