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,649 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `engine` area of the operation catalog: every operation that runs in
|
|
3
|
+
* Summer Engine on the person's computer. The 3.x tools stay the
|
|
4
|
+
* implementation and keep their MCP names (summer_set_prop is
|
|
5
|
+
* engine.set_prop); their input schemas stay in
|
|
6
|
+
* library/tools/<slug>/resource.yaml. This file adds what the catalog needs
|
|
7
|
+
* on top: a title, a short summary (what it does, what it returns, the next
|
|
8
|
+
* operation), the effect, and one real example.
|
|
9
|
+
*
|
|
10
|
+
* The long how-to text of each 3.x description lives in
|
|
11
|
+
* library/tools/<slug>/GUIDE.md (docs.read tool/<slug>), so a summary stays
|
|
12
|
+
* at or under 300 characters.
|
|
13
|
+
*
|
|
14
|
+
* Effects follow the 3.x annotations: a tool that only reads or renders
|
|
15
|
+
* evidence is `read` (render baselines and audit notes under res://.summer/
|
|
16
|
+
* do not change the game); everything else is `write`. Scene edits are
|
|
17
|
+
* undoable and checkpointed, so no engine operation is `destructive`, and
|
|
18
|
+
* none needs an approval.
|
|
19
|
+
*
|
|
20
|
+
* Two 3.x tools mixed a read with a change; their operations are split here
|
|
21
|
+
* (SPEC §3.1 rule 5) and run the same tool with its action fixed:
|
|
22
|
+
* summer_camera_bookmark (list, save, delete) and summer_ui_actions (list,
|
|
23
|
+
* invoke).
|
|
24
|
+
*/
|
|
25
|
+
const MAIN = "res://main.tscn";
|
|
26
|
+
export const ENGINE_OPS = {
|
|
27
|
+
// ── Project and reads ─────────────────────────────────────────────────────
|
|
28
|
+
"engine.get_project_context": {
|
|
29
|
+
title: "Read the project context",
|
|
30
|
+
summary: "Bind this session to the project open in Summer Engine and read it: project, current and main scene, engine health, project memory and warnings. Call it first in every chat; the scene tree and settings come on request (include). Next: engine.get_scene_tree.",
|
|
31
|
+
effect: "read",
|
|
32
|
+
example: { input: {}, note: "First call of a chat." },
|
|
33
|
+
},
|
|
34
|
+
"engine.get_scene_tree": {
|
|
35
|
+
title: "Read a scene's node tree",
|
|
36
|
+
summary: "Read the node tree of a scene: names, types and paths. Pass scenePath for an exact scene and depth for deep trees; the engine stops at depth 2 and 200 nodes by default and says truncated. Next: engine.inspect_node.",
|
|
37
|
+
effect: "read",
|
|
38
|
+
example: { input: { scenePath: MAIN, depth: 10 }, note: "The whole tree of the main scene." },
|
|
39
|
+
},
|
|
40
|
+
"engine.inspect_node": {
|
|
41
|
+
title: "Read a node's properties",
|
|
42
|
+
summary: "Read one node of the open scene: every editable property with its value and type, or only the fields you name (transform, global_transform, scene_file_path, aabb). Next: engine.set_prop.",
|
|
43
|
+
effect: "read",
|
|
44
|
+
example: { input: { path: "Player", fields: ["transform", "global_transform"] }, note: "Where the player stands." },
|
|
45
|
+
},
|
|
46
|
+
"engine.inspect_resource": {
|
|
47
|
+
title: "Read a resource",
|
|
48
|
+
summary: "Read a resource file (a mesh's bounds and surfaces, a scene's nodes, any resource's non-default properties) or a resource a node holds (nodePath and property). Next: engine.set_resource_property.",
|
|
49
|
+
effect: "read",
|
|
50
|
+
example: { input: { nodePath: "Floor", property: "material_override" }, note: "The floor material's colour and roughness." },
|
|
51
|
+
},
|
|
52
|
+
"engine.inspect_asset": {
|
|
53
|
+
title: "Measure a 3D asset file",
|
|
54
|
+
summary: "Measure a 3D asset file without placing it: bounds, origin, meshes, largest flat faces, open pipe ends, Marker3D anchors and collision shapes. Measure each kit piece once before placing it. Next: engine.instantiate_scene.",
|
|
55
|
+
effect: "read",
|
|
56
|
+
example: { input: { path: "res://kit/wall_01.glb" }, note: "Size and facing of a wall piece." },
|
|
57
|
+
},
|
|
58
|
+
"engine.world_snapshot": {
|
|
59
|
+
title: "Take a scene snapshot",
|
|
60
|
+
summary: "Take a structured snapshot of the edited scene: node paths, transforms, world bounds, fingerprints and counts, filtered by subtree, class or field. Returns snapshot_id, the baseline to diff after a change. Next: engine.snapshot_diff.",
|
|
61
|
+
effect: "read",
|
|
62
|
+
example: { input: { path_prefix: "Level" }, note: "Baseline before a change to the level." },
|
|
63
|
+
},
|
|
64
|
+
"engine.snapshot_diff": {
|
|
65
|
+
title: "Compare two scene snapshots",
|
|
66
|
+
summary: "Compare two scene snapshots: added, removed and changed nodes and count changes. The proof that a change did what you meant; an empty diff after a change means it did not land. Next: engine.screenshot.",
|
|
67
|
+
effect: "read",
|
|
68
|
+
example: { input: { from_id: "snap_3" }, note: "What changed since the baseline." },
|
|
69
|
+
},
|
|
70
|
+
"engine.get_script_errors": {
|
|
71
|
+
title: "Check a script for errors",
|
|
72
|
+
summary: "Check one GDScript file for parse and compile errors without running the game: line, message and severity of each. The first check after writing a script.",
|
|
73
|
+
effect: "read",
|
|
74
|
+
example: { input: { path: "res://player.gd" }, note: "Does the new player script compile?" },
|
|
75
|
+
},
|
|
76
|
+
"engine.get_diagnostics": {
|
|
77
|
+
title: "Read errors and warnings",
|
|
78
|
+
summary: "Read the editor console, the runtime debugger and script errors together, with complete counts and errors first. The first read after a change and after play. Next: engine.get_debugger_errors or engine.get_console for the details.",
|
|
79
|
+
effect: "read",
|
|
80
|
+
example: { input: {}, note: "Did the play session log errors?" },
|
|
81
|
+
},
|
|
82
|
+
"engine.get_console": {
|
|
83
|
+
title: "Read the editor console",
|
|
84
|
+
summary: "Read recent editor Output messages, collapsed and filtered (errors and warnings by default; errors_only false for print output). A played game's runtime errors are not here: read engine.get_diagnostics first.",
|
|
85
|
+
effect: "read",
|
|
86
|
+
example: { input: { errors_only: false, filter: "spawn" }, note: "What the spawner printed." },
|
|
87
|
+
},
|
|
88
|
+
"engine.clear_console": {
|
|
89
|
+
title: "Clear the editor console",
|
|
90
|
+
summary: "Clear the editor's Output panel, for a clean slate before the game runs.",
|
|
91
|
+
effect: "write",
|
|
92
|
+
example: { input: {}, note: "Clean slate before play." },
|
|
93
|
+
},
|
|
94
|
+
"engine.get_debugger_errors": {
|
|
95
|
+
title: "Read runtime errors",
|
|
96
|
+
summary: "Read the played game's runtime errors from the debugger (null references, missing nodes, physics errors), collapsed, with call stacks on request. After a fix, read engine.get_diagnostics again.",
|
|
97
|
+
effect: "read",
|
|
98
|
+
example: { input: { include_stack: true }, note: "The crash after play, with its stack." },
|
|
99
|
+
},
|
|
100
|
+
"engine.get_debugger_warnings": {
|
|
101
|
+
title: "Read runtime warnings",
|
|
102
|
+
summary: "Read the played game's runtime warnings from the debugger, with file, line and call stack.",
|
|
103
|
+
effect: "read",
|
|
104
|
+
example: { input: { max_warnings: 20 }, note: "The warnings diagnostics counted." },
|
|
105
|
+
},
|
|
106
|
+
"engine.read_file": {
|
|
107
|
+
title: "Read a project file",
|
|
108
|
+
summary: "Read a text file of the project (res://), a line or byte window of it, or parts of a .json, with the whole file's sha256. Pass that sha256 to engine.write_file or engine.replace_text to change the file safely.",
|
|
109
|
+
effect: "read",
|
|
110
|
+
example: { input: { path: "res://player.gd", offset: 1, limit: 80 }, note: "The first 80 lines." },
|
|
111
|
+
},
|
|
112
|
+
"engine.grep": {
|
|
113
|
+
title: "Search project files",
|
|
114
|
+
summary: "Search project files with a regular expression: file, line and text of each match, with optional context lines and a result cap. Then read the part you need with engine.read_file.",
|
|
115
|
+
effect: "read",
|
|
116
|
+
example: { input: { pattern: "func take_damage", glob: "*.gd" }, note: "Where damage is handled." },
|
|
117
|
+
},
|
|
118
|
+
"engine.is_running": {
|
|
119
|
+
title: "Check whether the game runs",
|
|
120
|
+
summary: "Check whether the game is running, and which scene it runs.",
|
|
121
|
+
effect: "read",
|
|
122
|
+
example: { input: {}, note: "Did play boot?" },
|
|
123
|
+
},
|
|
124
|
+
// ── Scene edits ───────────────────────────────────────────────────────────
|
|
125
|
+
"engine.create_scene": {
|
|
126
|
+
title: "Create a scene file",
|
|
127
|
+
summary: "Create a new, minimal .tscn file with the root type you name. It fails when the file exists and never touches the open scene. Build it out with engine.run_script and that scenePath.",
|
|
128
|
+
effect: "write",
|
|
129
|
+
example: { input: { path: "res://levels/level_02.tscn", rootType: "Node3D", rootName: "Level02" }, note: "A new empty level." },
|
|
130
|
+
},
|
|
131
|
+
"engine.run_script": {
|
|
132
|
+
title: "Run a script on a scene",
|
|
133
|
+
summary: "Run one GDScript func run(ctx) in the live editor on the scene at scenePath: the way to make 3 or more scene edits, loops, grids and procedural meshes. Returns reports, output and errors. Loop: engine.world_snapshot, this, engine.snapshot_diff, engine.screenshot.",
|
|
134
|
+
effect: "write",
|
|
135
|
+
example: {
|
|
136
|
+
input: {
|
|
137
|
+
scenePath: MAIN,
|
|
138
|
+
source: 'func run(ctx):\n\tvar root = ctx.get_scene_root()\n\tfor i in range(5):\n\t\tctx.add_mesh("box", "Crate%d" % i, root, {"position": Vector3(i * 2, 0.5, 0)})\n\tctx.save_scene()\n',
|
|
139
|
+
},
|
|
140
|
+
note: "Five crates in a row, saved.",
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
"engine.run_editor_script": {
|
|
144
|
+
title: "Run a script in a headless editor",
|
|
145
|
+
summary: "Run an EditorScript func _run() in a fresh headless editor against the project on disk: batch and project-wide jobs such as re-saving many scenes. It cannot see unsaved edits. For the open scene use engine.run_script.",
|
|
146
|
+
effect: "write",
|
|
147
|
+
example: { input: { source: 'func _run():\n\tprint(DirAccess.get_files_at("res://levels"))\n' }, note: "List the level files." },
|
|
148
|
+
},
|
|
149
|
+
"engine.add_node": {
|
|
150
|
+
title: "Add a node",
|
|
151
|
+
summary: "Add one node of any type to the scene at scenePath (it need not be the open tab) and save it. For 3 or more edits, write one engine.run_script instead. Next: engine.set_prop.",
|
|
152
|
+
effect: "write",
|
|
153
|
+
example: { input: { scenePath: MAIN, parent: ".", type: "OmniLight3D", name: "Lamp" }, note: "One light." },
|
|
154
|
+
},
|
|
155
|
+
"engine.set_prop": {
|
|
156
|
+
title: "Set a node property",
|
|
157
|
+
summary: 'Set one property of a node in the scene at scenePath and save it. Values use Godot syntax: "Vector3(0, 1, 0)", "Color(1, 0, 0, 1)", or a resource class such as "BoxMesh". For 3 or more edits, write one engine.run_script.',
|
|
158
|
+
effect: "write",
|
|
159
|
+
example: { input: { scenePath: MAIN, path: "Lamp", key: "light_energy", value: 2 }, note: "Brighter lamp." },
|
|
160
|
+
},
|
|
161
|
+
"engine.set_resource_property": {
|
|
162
|
+
title: "Set a property of a node's resource",
|
|
163
|
+
summary: "Set a property inside a resource a node holds, such as a collision shape's size or a material's albedo_color, and save the scene. The resource must exist first: assign it with engine.set_prop.",
|
|
164
|
+
effect: "write",
|
|
165
|
+
example: {
|
|
166
|
+
input: { scenePath: MAIN, nodePath: "Floor", resourceProperty: "material_override", subProperty: "albedo_color", value: "Color(0.2, 0.5, 0.2, 1)" },
|
|
167
|
+
note: "Green floor.",
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
"engine.remove_node": {
|
|
171
|
+
title: "Remove a node",
|
|
172
|
+
summary: "Remove a node and all its children from the scene at scenePath and save it. The root cannot be removed. One undo step. Remove top-level nodes only when the person asked for it.",
|
|
173
|
+
effect: "write",
|
|
174
|
+
example: { input: { scenePath: MAIN, path: "OldLamp" }, note: "Drop a leftover light." },
|
|
175
|
+
},
|
|
176
|
+
"engine.save_scene": {
|
|
177
|
+
title: "Save a scene",
|
|
178
|
+
summary: "Save the scene at scenePath, or save it under a new path. Scene edits already save once; use this for a standalone save or a save-as.",
|
|
179
|
+
effect: "write",
|
|
180
|
+
example: { input: { scenePath: MAIN }, note: "Save after a script that did not save." },
|
|
181
|
+
},
|
|
182
|
+
"engine.open_scene": {
|
|
183
|
+
title: "Open a scene in the editor",
|
|
184
|
+
summary: "Open a scene file in the editor and show its tab. A visible tab change for the person, not a target for edits: edits take scenePath. Take paths from engine.get_project_context; never guess them.",
|
|
185
|
+
effect: "write",
|
|
186
|
+
example: { input: { path: "res://levels/level_02.tscn" }, note: "Show the person level 2." },
|
|
187
|
+
},
|
|
188
|
+
"engine.open_main_scene": {
|
|
189
|
+
title: "Open the main scene",
|
|
190
|
+
summary: "Open the project's main scene (from project settings) in the editor, instead of guessing a scene file name.",
|
|
191
|
+
effect: "write",
|
|
192
|
+
example: { input: {}, note: "Nothing is open yet." },
|
|
193
|
+
},
|
|
194
|
+
"engine.instantiate_scene": {
|
|
195
|
+
title: "Add a scene or model as a node",
|
|
196
|
+
summary: "Add an existing .tscn, .glb or .gltf as a child node in the scene at scenePath, placed in the same call (position, rotation_degrees, scale or transform). Pass target_size for imported models. Next: engine.screenshot.",
|
|
197
|
+
effect: "write",
|
|
198
|
+
example: {
|
|
199
|
+
input: { scenePath: MAIN, parent: ".", scene: "res://models/barrel.glb", target_size: 1, position: [2, 0, -3] },
|
|
200
|
+
note: "A one-metre barrel by the door.",
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
"engine.replace_node": {
|
|
204
|
+
title: "Replace a node",
|
|
205
|
+
summary: "Replace a node with another scene or node type, keeping its parent, index, name, transform and children; the saved file is read back to prove it. Next: engine.get_scene_tree.",
|
|
206
|
+
effect: "write",
|
|
207
|
+
example: { input: { scenePath: MAIN, path: "Walls/Wall_03", scene: "res://kit/wall_door.tscn" }, note: "Put a door in a wall." },
|
|
208
|
+
},
|
|
209
|
+
"engine.connect_signal": {
|
|
210
|
+
title: "Connect a signal",
|
|
211
|
+
summary: "Connect a signal of one node to a method of another so the saved scene keeps it, verified from the saved .tscn. The receiver should define the method. Then test it with engine.play.",
|
|
212
|
+
effect: "write",
|
|
213
|
+
example: {
|
|
214
|
+
input: { scenePath: "res://ui/menu.tscn", emitter: "Start", signal: "pressed", receiver: ".", method: "_on_start_pressed" },
|
|
215
|
+
note: "Wire the start button.",
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
"engine.select_node": {
|
|
219
|
+
title: "Select a node in the editor",
|
|
220
|
+
summary: "Select a node in the editor's scene tree and show it in the inspector, so the person sees it. The scene does not change.",
|
|
221
|
+
effect: "write",
|
|
222
|
+
example: { input: { nodePath: "Player" }, note: "Show the person the player node." },
|
|
223
|
+
},
|
|
224
|
+
"engine.batch": {
|
|
225
|
+
title: "Run engine ops in one call",
|
|
226
|
+
summary: "Send a list of raw engine ops (AddNode, SetProp, RunVerification...) in one call: one undo step unless an op must travel alone, and one save at the end. Ask for receipt summary on long lists. For computed edits, engine.run_script is simpler.",
|
|
227
|
+
effect: "write",
|
|
228
|
+
example: {
|
|
229
|
+
input: {
|
|
230
|
+
scenePath: MAIN,
|
|
231
|
+
ops: [
|
|
232
|
+
{ op: "AddNode", parent: ".", type: "MeshInstance3D", name: "Floor" },
|
|
233
|
+
{ op: "SetProp", path: "Floor", key: "mesh", value: "PlaneMesh" },
|
|
234
|
+
],
|
|
235
|
+
receipt: "summary",
|
|
236
|
+
},
|
|
237
|
+
note: "A floor in one undo step.",
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
"engine.project_setting": {
|
|
241
|
+
title: "Set a project setting",
|
|
242
|
+
summary: "Set one project.godot setting, such as application/run/main_scene, the window size, the renderer or the default gravity.",
|
|
243
|
+
effect: "write",
|
|
244
|
+
example: { input: { key: "application/run/main_scene", value: "res://levels/level_01.tscn" }, note: "Start in level 1." },
|
|
245
|
+
},
|
|
246
|
+
"engine.input_map_bind": {
|
|
247
|
+
title: "Bind input to an action",
|
|
248
|
+
summary: "Create an input action when it is missing and bind keys or mouse buttons to it, for example jump to Space. Then try it with engine.play.",
|
|
249
|
+
effect: "write",
|
|
250
|
+
example: { input: { name: "jump", events: [{ type: "key", key: "Space" }] }, note: "Jump on Space." },
|
|
251
|
+
},
|
|
252
|
+
"engine.enable_plugin": {
|
|
253
|
+
title: "Enable an editor plugin",
|
|
254
|
+
summary: "Enable an editor plugin in res://addons/<name>/ and return the real result: enabled with its autoloads, or why it failed. Older engines only queue it (queued true); then check engine.get_debugger_errors.",
|
|
255
|
+
effect: "write",
|
|
256
|
+
example: { input: { plugin: "summer_quests" }, note: "Turn on the quest addon." },
|
|
257
|
+
},
|
|
258
|
+
"engine.write_file": {
|
|
259
|
+
title: "Write a project file",
|
|
260
|
+
summary: "Create a text file (create_only true) or overwrite one (expected_sha256 from engine.read_file); exactly one guard is required, so a stale write fails. Scripts, scenes, resources, JSON. Then check scripts with engine.get_script_errors.",
|
|
261
|
+
effect: "write",
|
|
262
|
+
example: { input: { path: "res://scripts/coin.gd", content: "extends Area3D\n", create_only: true }, note: "A new script." },
|
|
263
|
+
},
|
|
264
|
+
"engine.replace_text": {
|
|
265
|
+
title: "Replace text in a project file",
|
|
266
|
+
summary: "Replace text in an existing project file. The text must match exactly once unless replace_all is set; the write is guarded by the file's sha256. Then check scripts with engine.get_script_errors.",
|
|
267
|
+
effect: "write",
|
|
268
|
+
example: { input: { path: "res://player.gd", old_text: "const SPEED = 5.0", new_text: "const SPEED = 7.0" }, note: "A faster player." },
|
|
269
|
+
},
|
|
270
|
+
// ── Play, stop, runtime ───────────────────────────────────────────────────
|
|
271
|
+
"engine.play": {
|
|
272
|
+
title: "Play the game",
|
|
273
|
+
summary: "Start the game quietly (the editor keeps its tab and focus): the main scene or a given one, embedded or as a hidden offscreen instance, with an optional seed and fixed frame rate, or a local multiplayer session (players). Next: engine.is_running, then engine.get_diagnostics.",
|
|
274
|
+
effect: "write",
|
|
275
|
+
example: { input: { instance: "a", mode: "offscreen", deterministic: true, seed: 7 }, note: "A hidden, repeatable test run." },
|
|
276
|
+
},
|
|
277
|
+
"engine.stop": {
|
|
278
|
+
title: "Stop the game",
|
|
279
|
+
summary: "Stop the running game, or one offscreen instance by name. Scene edits stay as they are; nothing is undone or saved.",
|
|
280
|
+
effect: "write",
|
|
281
|
+
example: { input: {}, note: "End the play session." },
|
|
282
|
+
},
|
|
283
|
+
"engine.get_runtime_tree": {
|
|
284
|
+
title: "Read the running game's tree",
|
|
285
|
+
summary: "Read the node tree of the RUNNING game: spawned enemies, autoloads and pooled nodes that editor reads never show. Needs a running game. Next: engine.inspect_runtime_node.",
|
|
286
|
+
effect: "read",
|
|
287
|
+
example: { input: { path: "/root/Main/Enemies", depth: 3 }, note: "Which enemies spawned." },
|
|
288
|
+
},
|
|
289
|
+
"engine.inspect_runtime_node": {
|
|
290
|
+
title: "Read a node in the running game",
|
|
291
|
+
summary: "Read the live properties of one node in the RUNNING game (transform, visibility, physics state...) without stopping it. Paths are absolute; take them from engine.get_runtime_tree.",
|
|
292
|
+
effect: "read",
|
|
293
|
+
example: { input: { path: "/root/Main/Player" }, note: "Where the player really is." },
|
|
294
|
+
},
|
|
295
|
+
"engine.runtime_set": {
|
|
296
|
+
title: "Set a property in the running game",
|
|
297
|
+
summary: "Set one property on a node in the RUNNING game (the live object, never the scene file) and read back whether it applied: move the player, set health, flip a flag. Then check with engine.game_probe.",
|
|
298
|
+
effect: "write",
|
|
299
|
+
example: { input: { path: "/root/Main/Player", property: "position", value: "Vector3(0, 2, 0)" }, note: "Put the player at the start." },
|
|
300
|
+
},
|
|
301
|
+
"engine.runtime_call": {
|
|
302
|
+
title: "Call a method in the running game",
|
|
303
|
+
summary: "Call one method on a node in the RUNNING game and return its result, to trigger gameplay code directly. A call is an action, not proof: check what it did with engine.game_probe.",
|
|
304
|
+
effect: "write",
|
|
305
|
+
example: { input: { path: "/root/Main/Player", method: "take_damage", args: [25] }, note: "Hurt the player." },
|
|
306
|
+
},
|
|
307
|
+
"engine.runtime_spawn": {
|
|
308
|
+
title: "Spawn or free in the running game",
|
|
309
|
+
summary: "Spawn a scene into the RUNNING game (action spawn) or free a live node (action free) to set up a test. The scene file is not touched. Then check with engine.game_probe.",
|
|
310
|
+
effect: "write",
|
|
311
|
+
example: {
|
|
312
|
+
input: { action: "spawn", parent: "/root/Main/Enemies", scene: "res://enemies/goblin.tscn", props: { position: "Vector3(4, 0, -2)" } },
|
|
313
|
+
note: "One goblin to test combat.",
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
"engine.runtime_animate": {
|
|
317
|
+
title: "Drive animation in the running game",
|
|
318
|
+
summary: "Read and drive animation in the RUNNING game: AnimationPlayer clips, AnimationTree states and Skeleton3D bone poses. cmd state only reads. Prove motion with two reads around engine.game_control step.",
|
|
319
|
+
effect: "write",
|
|
320
|
+
example: { input: { target: "player", path: "/root/Main/Player/AnimationPlayer", cmd: "state" }, note: "Which clip plays now." },
|
|
321
|
+
},
|
|
322
|
+
"engine.game_control": {
|
|
323
|
+
title: "Control the game clock",
|
|
324
|
+
summary: "Pause or resume the RUNNING game, step exactly N frames, set the time scale, or list the live game instances. Step between two engine.game_probe reads for exact checks.",
|
|
325
|
+
effect: "write",
|
|
326
|
+
example: { input: { action: "step", frames: 1 }, note: "Advance one physics frame." },
|
|
327
|
+
},
|
|
328
|
+
"engine.game_input": {
|
|
329
|
+
title: "Send input to the running game",
|
|
330
|
+
summary: "Drive the RUNNING game's input: a script of timed actions, keys and clicks, or record real input and replay it on a seeded instance. Input is an action: prove its effect with engine.game_probe.",
|
|
331
|
+
effect: "write",
|
|
332
|
+
example: { input: { action: "script", events: [{ at_frame: 0, type: "action", action: "jump", hold_ms: 50 }] }, note: "Press jump once." },
|
|
333
|
+
},
|
|
334
|
+
"engine.game_probe": {
|
|
335
|
+
title: "Probe the running game",
|
|
336
|
+
summary: "Read state and pixels of one frame of the RUNNING game together: the live tree, property values and a screenshot stamped with the same frame numbers. The evidence read of a playtest.",
|
|
337
|
+
effect: "read",
|
|
338
|
+
example: { input: { props: ["/root/Main/Player:position"], screenshot: true }, note: "Before and after a jump." },
|
|
339
|
+
},
|
|
340
|
+
"engine.wait_for_event": {
|
|
341
|
+
title: "Wait for an engine event",
|
|
342
|
+
summary: "Wait for an engine event (game started, op applied or failed, script error, scene saved) instead of sleeping; it says so honestly at the timeout. Take a cursor with engine.recent_events first.",
|
|
343
|
+
effect: "read",
|
|
344
|
+
example: { input: { kinds: ["play.started"], since: 120, timeout_seconds: 30 }, note: "Wait for the game to boot." },
|
|
345
|
+
},
|
|
346
|
+
"engine.recent_events": {
|
|
347
|
+
title: "Read recent engine events",
|
|
348
|
+
summary: "Read the newest engine events (saves, plays, op results, script errors, imports) at once, and next_seq, the cursor to pass to engine.wait_for_event.",
|
|
349
|
+
effect: "read",
|
|
350
|
+
example: { input: { limit: 20 }, note: "Take a cursor before play." },
|
|
351
|
+
},
|
|
352
|
+
// ── Seeing ────────────────────────────────────────────────────────────────
|
|
353
|
+
"engine.screenshot": {
|
|
354
|
+
title: "Take a screenshot",
|
|
355
|
+
summary: "Return a frame as an image you see: the editor viewport, an offscreen render of a scene (preset, camera, bookmark or free pose, numbered marks) or the running game. A blank viewport frame means no redraw yet: capture again.",
|
|
356
|
+
effect: "read",
|
|
357
|
+
example: { input: { target: "scene", scenePath: MAIN, framing: "camera" }, note: "The level through its own camera and lights." },
|
|
358
|
+
},
|
|
359
|
+
"engine.frame_nodes": {
|
|
360
|
+
title: "Frame nodes and render them",
|
|
361
|
+
summary: "Fit a camera to the world bounds of some nodes and render them with the scene's real environment and lights; bookmark_name also saves the pose. Returns the image and a caption with the pose and bounds.",
|
|
362
|
+
effect: "write",
|
|
363
|
+
example: { input: { scenePath: MAIN, nodes: ["House1"], direction: "front", bookmark_name: "house_front" }, note: "The house, front on." },
|
|
364
|
+
},
|
|
365
|
+
"engine.shot_sheet": {
|
|
366
|
+
title: "Render a sheet of views",
|
|
367
|
+
summary: "Render several bookmarks or poses into one labelled grid with real lighting, and compare each bookmark with its last render (difference map). The quick look at every hero view after a change.",
|
|
368
|
+
effect: "read",
|
|
369
|
+
example: {
|
|
370
|
+
input: { scenePath: MAIN, shots: [{ bookmark_name: "house_front" }, { bookmark_name: "street" }], compare_previous: true },
|
|
371
|
+
note: "Before and after a lighting change.",
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
"engine.debug_views": {
|
|
375
|
+
title: "Render debug views of a pose",
|
|
376
|
+
summary: "Render one pose as a grid of debug views next to the beauty pass: lighting only, albedo, world normals, overdraw and wireframe. Shows why a shot looks wrong.",
|
|
377
|
+
effect: "read",
|
|
378
|
+
example: { input: { scenePath: MAIN, bookmark_name: "street" }, note: "Why the street looks flat." },
|
|
379
|
+
},
|
|
380
|
+
"engine.zoom": {
|
|
381
|
+
title: "Zoom into part of a frame",
|
|
382
|
+
summary: "Render a close-up of part of a frame (a region, or mark N of a marks render) at full resolution: real detail, seams and gaps, not enlarged pixels.",
|
|
383
|
+
effect: "read",
|
|
384
|
+
example: { input: { scenePath: MAIN, bookmark_name: "street", region: [0.4, 0.5, 0.2, 0.2] }, note: "The gap by the door." },
|
|
385
|
+
},
|
|
386
|
+
"engine.frame_shot": {
|
|
387
|
+
title: "Find camera poses for a shot",
|
|
388
|
+
summary: "Find, score and save camera poses for a shot type (establishing, eye level, low angle, detail, corridor), tested against the real geometry. Returns the best 3 poses and a sheet, and saves the best as a bookmark.",
|
|
389
|
+
effect: "write",
|
|
390
|
+
example: { input: { scenePath: MAIN, shot: "establishing", subject: ["Town"] }, note: "A wide shot of the town." },
|
|
391
|
+
},
|
|
392
|
+
"engine.scene_audit": {
|
|
393
|
+
title: "Audit a 3D scene",
|
|
394
|
+
summary: "Check a saved 3D scene for visual and placement problems: holes, exposed edges, floor gaps, floating or sunken props, overlaps, z-fighting, light limits. Returns issues by severity, each with the next tool. Changes nothing.",
|
|
395
|
+
effect: "read",
|
|
396
|
+
example: { input: { scenePath: MAIN, min_severity: "warn" }, note: "What looks broken in the level." },
|
|
397
|
+
},
|
|
398
|
+
"engine.capture_gameplay": {
|
|
399
|
+
title: "Capture gameplay screenshots",
|
|
400
|
+
summary: "Capture real gameplay frames (HUD included) from a hidden game window, no editor needed; game flags and player steps get past the title screen. Returns each frame's path and size: look at them before use.",
|
|
401
|
+
effect: "read",
|
|
402
|
+
example: { input: { resolution: "1920x1080", frames: 3, steps: [{ press: "Play" }, { wait: 3000 }, { shot: true }] }, note: "Store screenshots." },
|
|
403
|
+
},
|
|
404
|
+
// ── Placement ─────────────────────────────────────────────────────────────
|
|
405
|
+
"engine.test_placement": {
|
|
406
|
+
title: "Test a placement without moving",
|
|
407
|
+
summary: "Test one 3D node at a candidate world position and rotation without moving it: overlaps, grounded state and the gap to the floor. Changes nothing. Then place it with engine.set_prop or engine.snap_to_surface.",
|
|
408
|
+
effect: "read",
|
|
409
|
+
example: {
|
|
410
|
+
input: { scenePath: MAIN, subjectPath: "Props/Vase", candidateGlobalPosition: [1, 0.9, -2], candidateGlobalRotationDegrees: [0, 0, 0] },
|
|
411
|
+
note: "Does the vase fit on the shelf?",
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
"engine.snap_to_surface": {
|
|
415
|
+
title: "Snap a node onto a surface",
|
|
416
|
+
summary: "Move one 3D node along a ray until it sits at the given gap on the first surface (floor, ramp, shelf, table), then save the scene. Returns before and after transforms and the evidence.",
|
|
417
|
+
effect: "write",
|
|
418
|
+
example: { input: { scenePath: MAIN, subjectPath: "Props/Crate_02" }, note: "Seat a floating crate on the floor." },
|
|
419
|
+
},
|
|
420
|
+
"engine.align_distribute_3d": {
|
|
421
|
+
title: "Align or space 3D nodes",
|
|
422
|
+
summary: "Align 2 to 16 3D nodes on one world axis (min, center, max) or space them equally (centers or gaps) from their visible bounds, then save the scene. One undo step.",
|
|
423
|
+
effect: "write",
|
|
424
|
+
example: { input: { scenePath: MAIN, subjectPaths: ["Lamp1", "Lamp2", "Lamp3"], axis: [1, 0, 0], mode: "distribute_centers" }, note: "Even lamp spacing." },
|
|
425
|
+
},
|
|
426
|
+
"engine.place_adjacent": {
|
|
427
|
+
title: "Place a node against another",
|
|
428
|
+
summary: "Move one node so its bounds face sits against another node's, lining up the other axes: modules edge to edge, storeys stacked. Saves the scene and verifies the gap.",
|
|
429
|
+
effect: "write",
|
|
430
|
+
example: { input: { scenePath: MAIN, subject: "Facade/Module_2", reference: "Facade/Module_1", axis: "x", side: "max" }, note: "Next module to the right." },
|
|
431
|
+
},
|
|
432
|
+
"engine.attach_to_surface": {
|
|
433
|
+
title: "Mount a piece on a surface",
|
|
434
|
+
summary: "Turn a piece so its measured back faces a wall, ceiling or floor found by a ray, keep it upright and seat it at a standoff: pipes, lamps, signs. Saves the scene; a refused seat puts the piece back.",
|
|
435
|
+
effect: "write",
|
|
436
|
+
example: { input: { scenePath: MAIN, subject: "Props/Sign", surface: "Walls/Wall_01", backAxis: "-z" }, note: "Hang the sign on the wall." },
|
|
437
|
+
},
|
|
438
|
+
"engine.repeat_along": {
|
|
439
|
+
title: "Repeat a scene along a line",
|
|
440
|
+
summary: "Place copies of one scene along a line in one call: fence posts, clamps, a row of windows (at most 64). Returns the created node paths and saves the scene once.",
|
|
441
|
+
effect: "write",
|
|
442
|
+
example: {
|
|
443
|
+
input: { scenePath: MAIN, template: "res://kit/fence_post.tscn", parent: "Fence", start: [0, 0, 0], end: [10, 0, 0], spacing: 2 },
|
|
444
|
+
note: "Six fence posts.",
|
|
445
|
+
},
|
|
446
|
+
},
|
|
447
|
+
"engine.connect_ports": {
|
|
448
|
+
title: "Join two pieces at their ports",
|
|
449
|
+
summary: "Move and turn one piece so its port (a Marker3D, or an open pipe end such as +Y) meets another piece's port: pipe to pipe, duct to duct. Refuses joins that tilt the piece. Saves the scene.",
|
|
450
|
+
effect: "write",
|
|
451
|
+
example: { input: { scenePath: MAIN, subject: "Pipes/Bend_1", subjectPort: "-Y", target: "Pipes/Run_1", targetPort: "+Y" }, note: "A bend on top of a pipe." },
|
|
452
|
+
},
|
|
453
|
+
"engine.raycast": {
|
|
454
|
+
title: "Cast a ray in a scene",
|
|
455
|
+
summary: "Cast one ray from any point in a scene: the node it hits, the point and the normal. Physics first, visible bounds as a declared fallback. Changes nothing.",
|
|
456
|
+
effect: "read",
|
|
457
|
+
example: { input: { scenePath: MAIN, origin: [0, 2, 0], direction: [0, 0, -1] }, note: "How far is the wall?" },
|
|
458
|
+
},
|
|
459
|
+
"engine.measure": {
|
|
460
|
+
title: "Measure between nodes",
|
|
461
|
+
summary: "Measure the gap or overlap on each axis between two placed nodes, or check that one face of many nodes lies on one plane. Finds facade gaps and modules that stand out. Changes nothing.",
|
|
462
|
+
effect: "read",
|
|
463
|
+
example: { input: { scenePath: MAIN, mode: "pair", a: "Facade/Module_1", b: "Facade/Module_2" }, note: "Is there a gap between modules?" },
|
|
464
|
+
},
|
|
465
|
+
"engine.starcast": {
|
|
466
|
+
title: "Read the space around a node",
|
|
467
|
+
summary: "Read the clearance around one 3D node in 26 directions: what blocks each side and how far, contact, grounding and nearby objects. Changes nothing. Use it before and after placing.",
|
|
468
|
+
effect: "read",
|
|
469
|
+
example: { input: { scenePath: MAIN, path: "Props/Table" }, note: "What is the table touching?" },
|
|
470
|
+
},
|
|
471
|
+
"engine.navigation_probe": {
|
|
472
|
+
title: "Check a navigation route",
|
|
473
|
+
summary: "Check whether two world points are connected on the scene's navigation map: readiness, snapped end points, route length and route points. ready false means no evidence, not no route.",
|
|
474
|
+
effect: "read",
|
|
475
|
+
example: { input: { scenePath: MAIN, start: [0, 0, 0], end: [20, 0, 15] }, note: "Can enemies reach the gate?" },
|
|
476
|
+
},
|
|
477
|
+
// ── Imports and assets ────────────────────────────────────────────────────
|
|
478
|
+
"engine.import_from_url": {
|
|
479
|
+
title: "Import a file from a URL",
|
|
480
|
+
summary: "Download one file (model, texture, audio) from a URL into the project and run the import, so it is ready to use. For a model, next: engine.instantiate_scene.",
|
|
481
|
+
effect: "write",
|
|
482
|
+
example: { input: { url: "https://example.com/models/lamp.glb", path: "res://models/lamp.glb" }, note: "A lamp model." },
|
|
483
|
+
},
|
|
484
|
+
"engine.import_from_url_batch": {
|
|
485
|
+
title: "Import files from URLs",
|
|
486
|
+
summary: "Download several files from URLs into the project in one call, with one import scan at the end.",
|
|
487
|
+
effect: "write",
|
|
488
|
+
example: {
|
|
489
|
+
input: {
|
|
490
|
+
imports: [
|
|
491
|
+
{ url: "https://example.com/a.png", path: "res://textures/a.png" },
|
|
492
|
+
{ url: "https://example.com/b.png", path: "res://textures/b.png" },
|
|
493
|
+
],
|
|
494
|
+
},
|
|
495
|
+
note: "Two textures.",
|
|
496
|
+
},
|
|
497
|
+
},
|
|
498
|
+
"engine.import_asset": {
|
|
499
|
+
title: "Find and import a Summer asset",
|
|
500
|
+
summary: "Search the Summer asset library, import the best match into the project and, for a 3D model, add it to a scene. Needs the Summer sign-in. For an exact asset use engine.import_asset_by_id.",
|
|
501
|
+
effect: "write",
|
|
502
|
+
auth: "account",
|
|
503
|
+
example: { input: { query: "wooden barrel", parent: ".", scenePath: MAIN }, note: "A barrel in the level." },
|
|
504
|
+
},
|
|
505
|
+
"engine.import_asset_by_id": {
|
|
506
|
+
title: "Import a Summer asset by id",
|
|
507
|
+
summary: "Import one Summer asset by its id (from a search, the person's assets or a generation) into the project; a 3D model can go straight into the scene at scenePath. Needs the Summer sign-in.",
|
|
508
|
+
effect: "write",
|
|
509
|
+
auth: "account",
|
|
510
|
+
example: { input: { assetId: "a_8f2c", parent: ".", scenePath: MAIN }, note: "The model just generated." },
|
|
511
|
+
},
|
|
512
|
+
"engine.import_hdri": {
|
|
513
|
+
title: "Import an HDRI sky",
|
|
514
|
+
summary: "Find a CC0 HDRI sky on Poly Haven (or take an exact id) and import it into res://sky/ for environment light. Returns a ready engine.run_script snippet that wires it into the WorldEnvironment.",
|
|
515
|
+
effect: "write",
|
|
516
|
+
example: { input: { query: "sunset beach", resolution: "2k" }, note: "A warm evening sky." },
|
|
517
|
+
},
|
|
518
|
+
"engine.fabricate_3d": {
|
|
519
|
+
title: "Make a mesh with Blender",
|
|
520
|
+
summary: "Make a mesh with a bpy script in the person's own Blender (4.2 or newer, headless), import the .glb into the project and optionally place it. For exact modular kits and effect meshes, not characters or props.",
|
|
521
|
+
effect: "write",
|
|
522
|
+
example: {
|
|
523
|
+
input: { name: "pipe_straight", source: "import bpy\nbpy.ops.mesh.primitive_cylinder_add(radius=0.1, depth=2)\n" },
|
|
524
|
+
note: "A straight pipe piece.",
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
// ── Export and support ────────────────────────────────────────────────────
|
|
528
|
+
"engine.export_game": {
|
|
529
|
+
title: "Export the game",
|
|
530
|
+
summary: "Export the game headless as the file the Summer Games store takes: a bundle for iPhone, Android, macOS and Windows, a web build or a desktop download. Returns path, sha256 and size. Upload it with store.upload_file.",
|
|
531
|
+
effect: "write",
|
|
532
|
+
example: { input: { format: "bundle", targets: ["ios", "android"] }, note: "A phone bundle for the store." },
|
|
533
|
+
},
|
|
534
|
+
"engine.export_templates": {
|
|
535
|
+
title: "List or install export templates",
|
|
536
|
+
summary: "List or install Summer Engine export templates (web, macOS, Windows) from Summer's CDN, each sha256-checked. Needed only for engine.export_game with format download.",
|
|
537
|
+
effect: "write",
|
|
538
|
+
example: { input: { action: "install", platforms: ["web"] }, note: "Before a web export." },
|
|
539
|
+
},
|
|
540
|
+
"engine.create_debug_report": {
|
|
541
|
+
title: "Write a debug report",
|
|
542
|
+
summary: "Write a support-ready Markdown report: doctor checks, engine health, diagnostics, console and debugger output, and a hand-off prompt. No tokens or file contents; the person should still read it before sending it.",
|
|
543
|
+
effect: "write",
|
|
544
|
+
example: { input: { issue: "The player falls through the floor after the first jump." }, note: "For a bug report." },
|
|
545
|
+
},
|
|
546
|
+
// ── Editor UI ─────────────────────────────────────────────────────────────
|
|
547
|
+
"engine.ui_tree": {
|
|
548
|
+
title: "Read the editor UI",
|
|
549
|
+
summary: "Read the live editor UI as a tree (controls, paths, text, state), or every visible dialog and whether one blocks input. Its paths are what engine.ui_activate takes.",
|
|
550
|
+
effect: "read",
|
|
551
|
+
example: { input: { root: "dialogs" }, note: "Is a dialog in the way?" },
|
|
552
|
+
},
|
|
553
|
+
"engine.ui_activate": {
|
|
554
|
+
title: "Use an editor control",
|
|
555
|
+
summary: "Use one editor control by its tree path (press, toggle, focus, select a tab, type text, set a value) or dismiss a dialog; the control's state is read back. Only when no named action fits.",
|
|
556
|
+
effect: "write",
|
|
557
|
+
example: { input: { action: "select_tab", path: "main_screen", value: "3D" }, note: "Switch to the 3D view." },
|
|
558
|
+
},
|
|
559
|
+
"engine.ui_screenshot": {
|
|
560
|
+
title: "Screenshot the editor UI",
|
|
561
|
+
summary: "Return an image of the editor window, or of one dock, dialog or control: the last resort to look at the UI, never to pick click points. For scene views use engine.screenshot.",
|
|
562
|
+
effect: "read",
|
|
563
|
+
example: { input: { root: "dock:inspector" }, note: "What the inspector shows." },
|
|
564
|
+
},
|
|
565
|
+
};
|
|
566
|
+
export const ENGINE_SPLIT_OPS = {
|
|
567
|
+
"engine.list_camera_bookmarks": {
|
|
568
|
+
title: "List camera bookmarks",
|
|
569
|
+
summary: "List the camera viewpoints saved in this project: names, poses and dates. A bookmark gives screenshots that line up before and after a change: engine.screenshot with framing bookmark.",
|
|
570
|
+
effect: "read",
|
|
571
|
+
tool: "summer_camera_bookmark",
|
|
572
|
+
fixed: { action: "list" },
|
|
573
|
+
fields: [],
|
|
574
|
+
example: { input: {}, note: "Which views are saved?" },
|
|
575
|
+
},
|
|
576
|
+
"engine.save_camera_bookmark": {
|
|
577
|
+
title: "Save a camera bookmark",
|
|
578
|
+
summary: "Save a named camera viewpoint in the project (res://.summer/camera_bookmarks.json): position and look_at as Vector3 literals, or neither to take the editor's 3D camera. The scene file is not touched. Next: engine.screenshot.",
|
|
579
|
+
effect: "write",
|
|
580
|
+
tool: "summer_camera_bookmark",
|
|
581
|
+
fixed: { action: "save" },
|
|
582
|
+
fields: ["name", "position", "look_at", "fov"],
|
|
583
|
+
required: ["name"],
|
|
584
|
+
example: { input: { name: "hero_closeup", position: "Vector3(0, 2, 6)", look_at: "Vector3(0, 1, 0)" }, note: "A close-up to compare against." },
|
|
585
|
+
},
|
|
586
|
+
"engine.delete_camera_bookmark": {
|
|
587
|
+
title: "Delete a camera bookmark",
|
|
588
|
+
summary: "Delete one saved camera viewpoint by name. Returns the names that remain.",
|
|
589
|
+
effect: "write",
|
|
590
|
+
tool: "summer_camera_bookmark",
|
|
591
|
+
fixed: { action: "delete" },
|
|
592
|
+
fields: ["name"],
|
|
593
|
+
required: ["name"],
|
|
594
|
+
example: { input: { name: "old_view" }, note: "Drop a view nobody uses." },
|
|
595
|
+
},
|
|
596
|
+
"engine.list_ui_actions": {
|
|
597
|
+
title: "List editor actions",
|
|
598
|
+
summary: "List the editor's named actions (menu items and shortcuts) with labels and shortcuts, filtered by text. Actions marked denied are refused. Next: engine.invoke_ui_action.",
|
|
599
|
+
effect: "read",
|
|
600
|
+
tool: "summer_ui_actions",
|
|
601
|
+
fixed: { mode: "list" },
|
|
602
|
+
fields: ["filter", "limit"],
|
|
603
|
+
example: { input: { filter: "project_settings" }, note: "Find the Project Settings action." },
|
|
604
|
+
},
|
|
605
|
+
"engine.invoke_ui_action": {
|
|
606
|
+
title: "Run an editor action",
|
|
607
|
+
summary: "Run one named editor action exactly as its menu item or shortcut would: open Project Settings, switch the main screen, toggle a panel. Editor work only; scene work is engine.run_script. Read the effect back with engine.ui_tree.",
|
|
608
|
+
effect: "write",
|
|
609
|
+
tool: "summer_ui_actions",
|
|
610
|
+
fixed: { mode: "invoke" },
|
|
611
|
+
fields: ["action_name"],
|
|
612
|
+
required: ["action_name"],
|
|
613
|
+
example: { input: { action_name: "editor/project_settings" }, note: "Open Project Settings." },
|
|
614
|
+
},
|
|
615
|
+
};
|
|
616
|
+
/** The catalog fields of an engine operation, split or not; null for anything else. */
|
|
617
|
+
export function engineOpDef(op) {
|
|
618
|
+
return ENGINE_OPS[op] ?? ENGINE_SPLIT_OPS[op] ?? null;
|
|
619
|
+
}
|
|
620
|
+
export function isSplitOp(op) {
|
|
621
|
+
return Object.hasOwn(ENGINE_SPLIT_OPS, op);
|
|
622
|
+
}
|
|
623
|
+
/** A split operation's input as its 3.x tool takes it: only its fields, plus its fixed action. */
|
|
624
|
+
export function splitToolArgs(def, input) {
|
|
625
|
+
const args = {};
|
|
626
|
+
for (const field of def.fields)
|
|
627
|
+
if (input[field] !== undefined)
|
|
628
|
+
args[field] = input[field];
|
|
629
|
+
return { ...args, ...def.fixed };
|
|
630
|
+
}
|
|
631
|
+
/** A split operation's input JSON Schema, cut from its 3.x tool's schema. */
|
|
632
|
+
export function splitInputSchema(def, toolSchema) {
|
|
633
|
+
const properties = (toolSchema?.properties ?? {});
|
|
634
|
+
return {
|
|
635
|
+
type: "object",
|
|
636
|
+
properties: Object.fromEntries(def.fields.filter((field) => field in properties).map((field) => [field, properties[field]])),
|
|
637
|
+
...(def.required?.length ? { required: [...def.required] } : {}),
|
|
638
|
+
additionalProperties: false,
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
const OP_REF = /\b(engine|docs|store)\.[a-z][a-z0-9_]*\b/g;
|
|
642
|
+
/** Every operation a summary names (`engine.snapshot_diff`, `docs.read`). */
|
|
643
|
+
export function opsNamedIn(text) {
|
|
644
|
+
return [...new Set(text.match(OP_REF) ?? [])];
|
|
645
|
+
}
|
|
646
|
+
/** A summary with each operation it names written as the tool that runs it in this view. */
|
|
647
|
+
export function renderOpRefs(text, toolOf) {
|
|
648
|
+
return text.replace(OP_REF, (op) => toolOf(op) ?? op);
|
|
649
|
+
}
|