summer-engine 3.0.0 → 3.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 -2
- package/.claude-plugin/plugin.json +27 -5
- package/.codex-plugin/plugin.json +28 -6
- package/.cursor-plugin/plugin.json +27 -5
- package/.factory-plugin/plugin.json +27 -5
- package/.opencode/plugins/summer.js +1 -1
- package/CHANGELOG.md +120 -0
- package/README.md +22 -7
- package/assets/audit/scene_audit.gd +4136 -0
- package/assets/seeing/seeing_probe.gd +1873 -0
- package/dist/cli/commands/setup.js +6 -19
- package/dist/cli/commands/skills.js +57 -32
- package/dist/core/api-client.d.ts +9 -1
- package/dist/core/api-client.js +21 -4
- package/dist/core/capabilities/agent-playbook.js +46 -0
- package/dist/core/capabilities/audit/accept.d.ts +55 -0
- package/dist/core/capabilities/audit/accept.js +147 -0
- package/dist/core/capabilities/audit/args.d.ts +95 -0
- package/dist/core/capabilities/audit/args.js +89 -0
- package/dist/core/capabilities/audit/audit.d.ts +56 -0
- package/dist/core/capabilities/audit/audit.js +287 -0
- package/dist/core/capabilities/audit/frame.d.ts +14 -0
- package/dist/core/capabilities/audit/frame.js +35 -0
- package/dist/core/capabilities/audit/gaps.d.ts +96 -0
- package/dist/core/capabilities/audit/gaps.js +257 -0
- package/dist/core/capabilities/audit/judge.d.ts +162 -0
- package/dist/core/capabilities/audit/judge.js +1134 -0
- package/dist/core/capabilities/audit/math.d.ts +110 -0
- package/dist/core/capabilities/audit/math.js +263 -0
- package/dist/core/capabilities/audit/summary.d.ts +74 -0
- package/dist/core/capabilities/audit/summary.js +212 -0
- package/dist/core/capabilities/board.d.ts +31 -0
- package/dist/core/capabilities/board.js +43 -0
- package/dist/core/capabilities/camera-view.d.ts +4 -2
- package/dist/core/capabilities/camera-view.js +6 -3
- package/dist/core/capabilities/connect-signal.d.ts +85 -0
- package/dist/core/capabilities/connect-signal.js +285 -0
- package/dist/core/capabilities/engine-fallbacks.d.ts +5 -0
- package/dist/core/capabilities/engine-fallbacks.js +5 -0
- package/dist/core/capabilities/engine-ops.d.ts +5 -1
- package/dist/core/capabilities/engine-ops.js +0 -3
- package/dist/core/capabilities/engine-receipt.d.ts +12 -0
- package/dist/core/capabilities/engine-receipt.js +26 -0
- package/dist/core/capabilities/file-read.d.ts +64 -0
- package/dist/core/capabilities/file-read.js +325 -0
- package/dist/core/capabilities/game-task-plan.js +4 -2
- package/dist/core/capabilities/grep.d.ts +60 -0
- package/dist/core/capabilities/grep.js +190 -0
- package/dist/core/capabilities/inspect-node.d.ts +56 -0
- package/dist/core/capabilities/inspect-node.js +225 -0
- package/dist/core/capabilities/inspect-resource.d.ts +61 -0
- package/dist/core/capabilities/inspect-resource.js +376 -0
- package/dist/core/capabilities/math3d.d.ts +28 -0
- package/dist/core/capabilities/math3d.js +88 -0
- package/dist/core/capabilities/motion-generation.d.ts +62 -0
- package/dist/core/capabilities/motion-generation.js +138 -0
- package/dist/core/capabilities/placement-batch.d.ts +102 -0
- package/dist/core/capabilities/placement-batch.js +483 -0
- package/dist/core/capabilities/placement-math.d.ts +70 -0
- package/dist/core/capabilities/placement-math.js +209 -0
- package/dist/core/capabilities/placement-script.d.ts +42 -0
- package/dist/core/capabilities/placement-script.js +1096 -0
- package/dist/core/capabilities/placement.d.ts +485 -0
- package/dist/core/capabilities/placement.js +1731 -0
- package/dist/core/capabilities/project-context.d.ts +33 -2
- package/dist/core/capabilities/project-context.js +87 -4
- package/dist/core/capabilities/replace-node.d.ts +91 -0
- package/dist/core/capabilities/replace-node.js +423 -0
- package/dist/core/capabilities/runtime-control.d.ts +20 -4
- package/dist/core/capabilities/runtime-control.js +67 -2
- package/dist/core/capabilities/scene-batch.d.ts +63 -0
- package/dist/core/capabilities/scene-batch.js +394 -0
- package/dist/core/capabilities/scene-readback.d.ts +36 -0
- package/dist/core/capabilities/scene-readback.js +54 -0
- package/dist/core/capabilities/seeing/args.d.ts +348 -0
- package/dist/core/capabilities/seeing/args.js +178 -0
- package/dist/core/capabilities/seeing/candidates.d.ts +127 -0
- package/dist/core/capabilities/seeing/candidates.js +282 -0
- package/dist/core/capabilities/seeing/math.d.ts +134 -0
- package/dist/core/capabilities/seeing/math.js +269 -0
- package/dist/core/capabilities/seeing/probe.d.ts +62 -0
- package/dist/core/capabilities/seeing/probe.js +188 -0
- package/dist/core/capabilities/seeing/scoring.d.ts +235 -0
- package/dist/core/capabilities/seeing/scoring.js +639 -0
- package/dist/core/capabilities/seeing/seeing.d.ts +233 -0
- package/dist/core/capabilities/seeing/seeing.js +1341 -0
- package/dist/core/capabilities/seeing/shot-store.d.ts +52 -0
- package/dist/core/capabilities/seeing/shot-store.js +204 -0
- package/dist/core/capabilities/surface-snap-mesh.d.ts +88 -0
- package/dist/core/capabilities/surface-snap-mesh.js +425 -0
- package/dist/core/capabilities/surface-snap.d.ts +77 -0
- package/dist/core/capabilities/surface-snap.js +461 -0
- package/dist/core/capabilities/tool-dispatch.js +231 -72
- package/dist/core/capabilities/tscn.d.ts +85 -0
- package/dist/core/capabilities/tscn.js +391 -0
- package/dist/core/capabilities/world-snapshot.d.ts +58 -0
- package/dist/core/capabilities/world-snapshot.js +150 -0
- package/dist/core/capability-skew.d.ts +5 -5
- package/dist/core/capability-skew.js +14 -6
- package/dist/core/headless/worker-engine-client.d.ts +1 -1
- package/dist/core/headless/worker-engine-client.js +2 -2
- package/dist/core/library-read.d.ts +37 -5
- package/dist/core/library-read.js +264 -33
- package/dist/core/library-search.d.ts +2 -2
- package/dist/core/skills-registry.d.ts +9 -1
- package/dist/core/skills-registry.js +25 -2
- package/dist/installer/agent-config.d.ts +9 -4
- package/dist/installer/agent-config.js +194 -392
- package/dist/installer/agent-table.d.ts +119 -0
- package/dist/installer/agent-table.js +619 -0
- package/dist/installer/setup.js +4 -2
- package/dist/installer/skill-locations.d.ts +8 -17
- package/dist/installer/skill-locations.js +22 -101
- package/dist/installer/version-check.d.ts +5 -1
- package/dist/installer/version-check.js +38 -28
- package/dist/mcp/server.js +9 -3
- package/dist/mcp/tools/asset-tools.js +21 -3
- package/dist/mcp/tools/audit-tools.d.ts +23 -0
- package/dist/mcp/tools/audit-tools.js +60 -0
- package/dist/mcp/tools/debug-tools.js +3 -1
- package/dist/mcp/tools/file-tools.js +17 -4
- package/dist/mcp/tools/generate-tools.js +74 -66
- package/dist/mcp/tools/library-tools.js +2 -0
- package/dist/mcp/tools/perception-tools.js +6 -19
- package/dist/mcp/tools/placement-tools.d.ts +24 -0
- package/dist/mcp/tools/placement-tools.js +91 -0
- package/dist/mcp/tools/project-tools.js +18 -15
- package/dist/mcp/tools/scene-tools.js +71 -83
- package/dist/mcp/tools/seeing-tools.d.ts +24 -0
- package/dist/mcp/tools/seeing-tools.js +64 -0
- package/dist/mcp/tools/spatial-tools.js +17 -9
- package/dist/mcp/tools/visual-tools.js +59 -7
- package/gemini-extension.json +26 -4
- package/integrations/README.md +48 -19
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +8 -9
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -0
- package/integrations/github-copilot/README.md +8 -8
- package/integrations/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +6 -10
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +8 -8
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +9 -12
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +8 -7
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +9 -9
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +8 -9
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/manifest-target.json +3 -0
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +59 -15
- package/library/references/mcp-tools-reference/resource.yaml +1 -1
- package/library/references/summer-folder/resource.yaml +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +1 -1
- package/library/skills/README.md +264 -0
- package/library/skills/adaptive-music/SKILL.md +1 -1
- package/library/skills/agent-playtesting/SKILL.md +1 -1
- package/library/skills/ai-characters-in-games/SKILL.md +220 -0
- package/library/skills/ai-characters-in-games/resource.yaml +30 -0
- package/library/skills/ambient-bed/SKILL.md +1 -1
- package/library/skills/animated-loop/SKILL.md +1 -1
- package/library/skills/animation-tree/SKILL.md +1 -1
- package/library/skills/art-direction/SKILL.md +1 -1
- package/library/skills/asset-strategy/SKILL.md +2 -1
- package/library/skills/asset-strategy/resource.yaml +2 -1
- package/library/skills/audio-direction/SKILL.md +1 -1
- package/library/skills/auto-fire-targeting/SKILL.md +1 -1
- package/library/skills/brainstorm-game/SKILL.md +1 -1
- package/library/skills/brainstorming/SKILL.md +1 -1
- package/library/skills/browse-templates/SKILL.md +3 -3
- package/library/skills/browse-templates/resource.yaml +1 -1
- package/library/skills/camera-rigs/SKILL.md +128 -0
- package/library/skills/camera-rigs/resource.yaml +29 -0
- package/library/skills/celeste-momentum-platforming/SKILL.md +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +1 -1
- package/library/skills/character-model/SKILL.md +1 -1
- package/library/skills/character-movement/SKILL.md +326 -0
- package/library/skills/character-movement/references/default-third-person-controller.gd +201 -0
- package/library/skills/character-movement/references/default-third-person-verification-probe.gd +154 -0
- package/library/skills/character-movement/references/movement-3d.md +136 -0
- package/library/skills/character-movement/references/platformer-feel.md +83 -0
- package/library/skills/character-movement/resource.yaml +40 -0
- package/library/skills/character-portrait/SKILL.md +1 -1
- package/library/skills/cinematic-cutscene/SKILL.md +1 -1
- package/library/skills/combat-basics/SKILL.md +159 -0
- package/library/skills/combat-basics/references/projectiles-and-aoe.md +100 -0
- package/library/skills/combat-basics/resource.yaml +34 -0
- package/library/skills/concept-art/SKILL.md +1 -1
- package/library/skills/create-asset-sheet/SKILL.md +1 -1
- package/library/skills/debug/SKILL.md +1 -1
- package/library/skills/debugging-game-feel/SKILL.md +1 -1
- package/library/skills/design-level/SKILL.md +1 -1
- package/library/skills/design-mechanic/SKILL.md +1 -1
- package/library/skills/design-npc/SKILL.md +1 -1
- package/library/skills/diagnosing-perf-regressions/SKILL.md +1 -1
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -1
- package/library/skills/driving-the-editor-ui/SKILL.md +1 -1
- package/library/skills/environment-kit/SKILL.md +1 -1
- package/library/skills/export-and-ship/SKILL.md +1 -1
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +1 -1
- package/library/skills/fps-controller/SKILL.md +9 -7
- package/library/skills/fps-controller/resource.yaml +4 -1
- package/library/skills/game-feel/SKILL.md +1 -1
- package/library/skills/gameskill/SKILL.md +1 -1
- package/library/skills/gdscript-patterns/SKILL.md +1 -1
- package/library/skills/generate-motion/SKILL.md +9 -9
- package/library/skills/generate-motion/resource.yaml +2 -1
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +1 -1
- package/library/skills/headless-scripting/SKILL.md +1 -1
- package/library/skills/in-game-purchases/SKILL.md +254 -0
- package/library/skills/in-game-purchases/resource.yaml +29 -0
- package/library/skills/instantiate-asset-pack/SKILL.md +1 -1
- package/library/skills/investigating-bugs/SKILL.md +1 -1
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +1 -1
- package/library/skills/make-game/SKILL.md +25 -3
- package/library/skills/make-game/references/2d-platformer-polish.md +93 -0
- package/library/skills/make-game/references/2d-platformer.md +117 -0
- package/library/skills/make-game/references/2d-rpg-content.md +234 -0
- package/library/skills/make-game/references/2d-rpg.md +241 -0
- package/library/skills/make-game/references/2d-survivors-progression.md +201 -0
- package/library/skills/make-game/references/2d-survivors.md +237 -0
- package/library/skills/make-game/references/3d-fps-systems.md +216 -0
- package/library/skills/make-game/references/3d-fps.md +177 -0
- package/library/skills/make-game/references/3d-horror-systems.md +186 -0
- package/library/skills/make-game/references/3d-horror.md +201 -0
- package/library/skills/make-game/references/3d-third-person-systems.md +220 -0
- package/library/skills/make-game/references/3d-third-person.md +215 -0
- package/library/skills/make-game/resource.yaml +6 -1
- package/library/skills/multiplayer/SKILL.md +150 -0
- package/library/skills/multiplayer/resource.yaml +33 -0
- package/library/skills/multiplayer-movement/SKILL.md +510 -0
- package/library/skills/multiplayer-movement/files.md +501 -0
- package/library/skills/multiplayer-movement/resource.yaml +30 -0
- package/library/skills/multiplayer-project/SKILL.md +521 -0
- package/library/skills/multiplayer-project/files.md +448 -0
- package/library/skills/multiplayer-project/resource.yaml +36 -0
- package/library/skills/multiplayer-publish/SKILL.md +229 -0
- package/library/skills/multiplayer-publish/export-errors.md +89 -0
- package/library/skills/multiplayer-publish/resource.yaml +28 -0
- package/library/skills/multiplayer-state/SKILL.md +438 -0
- package/library/skills/multiplayer-state/files.md +592 -0
- package/library/skills/multiplayer-state/resource.yaml +35 -0
- package/library/skills/multiplayer-testing/SKILL.md +236 -0
- package/library/skills/multiplayer-testing/resource.yaml +39 -0
- package/library/skills/music-track/SKILL.md +1 -1
- package/library/skills/navigate-summer/SKILL.md +1 -1
- package/library/skills/new-project/SKILL.md +1 -1
- package/library/skills/organic-model/SKILL.md +1 -1
- package/library/skills/pixel-art/SKILL.md +1 -1
- package/library/skills/play/SKILL.md +1 -1
- package/library/skills/playtesting-a-feature/SKILL.md +1 -1
- package/library/skills/procedural-animation/SKILL.md +2 -2
- package/library/skills/procedural-animation/resource.yaml +1 -1
- package/library/skills/prop-model/SKILL.md +1 -1
- package/library/skills/psx-retro-rendering/SKILL.md +1 -1
- package/library/skills/realtime-wet-surfaces/SKILL.md +2 -2
- package/library/skills/remote-deploy/SKILL.md +1 -1
- package/library/skills/retarget/SKILL.md +1 -1
- package/library/skills/running-in-the-cloud/SKILL.md +1 -1
- package/library/skills/save-load/SKILL.md +156 -0
- package/library/skills/save-load/resource.yaml +27 -0
- package/library/skills/scene-composition/SKILL.md +1 -1
- package/library/skills/scene-hierarchy-design/SKILL.md +1 -1
- package/library/skills/scene-scripting/SKILL.md +1 -1
- package/library/skills/scene-to-level/SKILL.md +1 -1
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +1 -1
- package/library/skills/skill-test/SKILL.md +1 -1
- package/library/skills/skintokens-auto-rigging/SKILL.md +1 -1
- package/library/skills/skybox-panorama/SKILL.md +1 -1
- package/library/skills/sound-effect/SKILL.md +1 -1
- package/library/skills/spatial-placement/SKILL.md +134 -3
- package/library/skills/spatial-placement/references/kit-placement-tools.md +364 -0
- package/library/skills/spatial-placement/resource.yaml +16 -2
- package/library/skills/sprite-sheet/SKILL.md +1 -1
- package/library/skills/summer-analytics/SKILL.md +147 -0
- package/library/skills/summer-analytics/resource.yaml +28 -0
- package/library/skills/summer-friends/SKILL.md +226 -0
- package/library/skills/summer-friends/resource.yaml +28 -0
- package/library/skills/summer-leaderboards/SKILL.md +231 -0
- package/library/skills/summer-leaderboards/resource.yaml +30 -0
- package/library/skills/summer-match-results/SKILL.md +286 -0
- package/library/skills/summer-match-results/resource.yaml +32 -0
- package/library/skills/summer-matchmaking/SKILL.md +301 -0
- package/library/skills/summer-matchmaking/resource.yaml +32 -0
- package/library/skills/summer-parties/SKILL.md +253 -0
- package/library/skills/summer-parties/resource.yaml +30 -0
- package/library/skills/summer-player-data/SKILL.md +322 -0
- package/library/skills/summer-player-data/resource.yaml +30 -0
- package/library/skills/summer-store/SKILL.md +271 -0
- package/library/skills/summer-store/resource.yaml +29 -0
- package/library/skills/summer-world-chat/SKILL.md +195 -0
- package/library/skills/summer-world-chat/resource.yaml +30 -0
- package/library/skills/summer-world-saves/SKILL.md +284 -0
- package/library/skills/summer-world-saves/resource.yaml +29 -0
- package/library/skills/text-to-motion/SKILL.md +99 -0
- package/library/skills/text-to-motion/prompts-and-controls.md +34 -0
- package/library/skills/text-to-motion/resource.yaml +41 -0
- package/library/skills/text-to-motion/rigging-for-text-motion.md +54 -0
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +1 -1
- package/library/skills/tune-performance/SKILL.md +1 -1
- package/library/skills/ui-basics/SKILL.md +10 -1
- package/library/skills/ui-graphics/SKILL.md +1 -1
- package/library/skills/use-widget-asset/SKILL.md +1 -1
- package/library/skills/using-summer/SKILL.md +2 -2
- package/library/skills/using-summer/resource.yaml +2 -2
- package/library/skills/vehicle-model/SKILL.md +1 -1
- package/library/skills/verification-before-completion/SKILL.md +1 -1
- package/library/skills/verifying-scenes/SKILL.md +76 -2
- package/library/skills/verifying-scenes/resource.yaml +13 -2
- package/library/skills/vfx-dissolve/SKILL.md +1 -1
- package/library/skills/vfx-fire/SKILL.md +1 -1
- package/library/skills/vfx-hit-spark/SKILL.md +1 -1
- package/library/skills/vfx-lightning/SKILL.md +1 -1
- package/library/skills/vfx-magic-glow/SKILL.md +1 -1
- package/library/skills/vfx-muzzle-flash/SKILL.md +1 -1
- package/library/skills/vfx-smoke/SKILL.md +1 -1
- package/library/skills/vfx-water-ripple/SKILL.md +1 -1
- package/library/skills/voice-line/SKILL.md +1 -1
- package/library/skills/web-and-touch-input/SKILL.md +38 -0
- package/library/skills/web-and-touch-input/resource.yaml +28 -0
- package/library/skills/web-compatibility-look/SKILL.md +62 -0
- package/library/skills/web-compatibility-look/resource.yaml +30 -0
- package/library/skills/world-building-3d/SKILL.md +8 -1
- package/library/skills/world-building-3d/references/spatial-tools.md +1 -1
- package/library/skills/world-building-3d/resource.yaml +2 -1
- package/library/skills/writing-plans/SKILL.md +1 -1
- package/library/skills/writing-skills/SKILL.md +1 -1
- package/library/templates/3d-lan-multiplayer-starter/resource.yaml +2 -2
- package/library/tools/attach-to-surface/resource.yaml +142 -0
- package/library/tools/batch/resource.yaml +9 -3
- package/library/tools/connect-ports/resource.yaml +120 -0
- package/library/tools/connect-signal/resource.yaml +3 -2
- package/library/tools/debug-views/resource.yaml +94 -0
- package/library/tools/frame-nodes/resource.yaml +104 -0
- package/library/tools/frame-shot/resource.yaml +134 -0
- package/library/tools/generate-motion/resource.yaml +44 -9
- package/library/tools/get-board/resource.yaml +50 -0
- package/library/tools/get-project-context/resource.yaml +13 -2
- package/library/tools/grep/resource.yaml +77 -0
- package/library/tools/inspect-asset/resource.yaml +71 -0
- package/library/tools/inspect-node/resource.yaml +9 -2
- package/library/tools/inspect-resource/resource.yaml +16 -5
- package/library/tools/instantiate-scene/resource.yaml +27 -2
- package/library/tools/measure/resource.yaml +96 -0
- package/library/tools/place-adjacent/resource.yaml +113 -0
- package/library/tools/play/resource.yaml +15 -2
- package/library/tools/raycast/resource.yaml +101 -0
- package/library/tools/read-file/resource.yaml +36 -2
- package/library/tools/read-library/resource.yaml +2 -2
- package/library/tools/repeat-along/resource.yaml +129 -0
- package/library/tools/replace-node/resource.yaml +11 -5
- package/library/tools/scene-audit/resource.yaml +144 -0
- package/library/tools/screenshot/resource.yaml +13 -2
- package/library/tools/search-assets/resource.yaml +18 -0
- package/library/tools/shot-sheet/resource.yaml +110 -0
- package/library/tools/snap-to-surface/resource.yaml +4 -1
- package/library/tools/world-snapshot/resource.yaml +24 -3
- package/library/tools/zoom/resource.yaml +105 -0
- package/package.json +3 -3
- package/registry/generated/aliases.json +17 -3
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +26 -4
- package/registry/generated/index.json +2154 -469
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +27 -5
- package/registry/generated/plugin.codex.json +28 -6
- package/registry/generated/plugin.cursor.json +27 -5
- package/registry/generated/plugin.factory.json +27 -5
- package/registry/generated/skills-index.md +264 -0
- package/registry/generated/skills-registry.json +901 -206
- package/registry/generated/templates-registry.json +2 -2
- package/library/skills/host-authoritative-state/SKILL.md +0 -332
- package/library/skills/host-authoritative-state/resource.yaml +0 -28
- package/library/skills/peer-to-peer-multiplayer/SKILL.md +0 -373
- package/library/skills/peer-to-peer-multiplayer/resource.yaml +0 -28
- package/library/skills/setup-multiplayer/SKILL.md +0 -336
- package/library/skills/setup-multiplayer/resource.yaml +0 -28
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export declare const SHOTS_DIR: string;
|
|
2
|
+
export declare const SAVED_SUBDIR = "saved";
|
|
3
|
+
export declare const SHOT_MAX_EDGE = 1024;
|
|
4
|
+
export declare const SHOTS_MAX_TOTAL_BYTES: number;
|
|
5
|
+
/** Same grammar as camera bookmark names (preview_ops.cpp). */
|
|
6
|
+
export declare const SHOT_NAME_PATTERN: RegExp;
|
|
7
|
+
export declare class ShotStoreError extends Error {
|
|
8
|
+
readonly reason: "bad_name" | "not_jpeg" | "too_large" | "over_cap" | "unsafe_path" | "no_project";
|
|
9
|
+
constructor(reason: "bad_name" | "not_jpeg" | "too_large" | "over_cap" | "unsafe_path" | "no_project", message: string);
|
|
10
|
+
}
|
|
11
|
+
export interface ShotWrite {
|
|
12
|
+
path: string;
|
|
13
|
+
/** res:// form of the written file. */
|
|
14
|
+
resPath: string;
|
|
15
|
+
bytes: number;
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
replaced: boolean;
|
|
19
|
+
evicted: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface ShotFile {
|
|
22
|
+
path: string;
|
|
23
|
+
bytes: number;
|
|
24
|
+
mtimeMs: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ShotStoreOptions {
|
|
27
|
+
maxTotalBytes?: number;
|
|
28
|
+
maxEdge?: number;
|
|
29
|
+
}
|
|
30
|
+
export declare class ShotStore {
|
|
31
|
+
readonly root: string;
|
|
32
|
+
private readonly projectRoot;
|
|
33
|
+
private readonly maxTotalBytes;
|
|
34
|
+
private readonly maxEdge;
|
|
35
|
+
constructor(projectRoot: string, options?: ShotStoreOptions);
|
|
36
|
+
static forProject(projectRoot: string | undefined, options?: ShotStoreOptions): ShotStore;
|
|
37
|
+
slotPath(bookmark: string): string;
|
|
38
|
+
savedPath(name: string): string;
|
|
39
|
+
resPath(path: string): string;
|
|
40
|
+
readSlot(bookmark: string): Promise<ShotFile | null>;
|
|
41
|
+
writeSlot(bookmark: string, jpeg: Uint8Array): Promise<ShotWrite>;
|
|
42
|
+
saveCopy(name: string, jpeg: Uint8Array): Promise<ShotWrite>;
|
|
43
|
+
/** Every file under the folder, oldest first. */
|
|
44
|
+
list(): Promise<ShotFile[]>;
|
|
45
|
+
private write;
|
|
46
|
+
/** Throws unless `path` resolves strictly inside the shots folder. */
|
|
47
|
+
private inside;
|
|
48
|
+
/** Refuse a symlink anywhere from the project's .summer folder down to `path`. */
|
|
49
|
+
private refuseSymlinks;
|
|
50
|
+
}
|
|
51
|
+
/** Read a stored shot (for compare_previous). */
|
|
52
|
+
export declare function readShot(path: string): Promise<Buffer>;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded image storage for the seeing tools: res://.summer/shots/.
|
|
3
|
+
*
|
|
4
|
+
* Inline images are the product; disk is a strictly bounded side channel.
|
|
5
|
+
* - Nothing is written unless a bookmark was rendered (its one before/after
|
|
6
|
+
* slot) or the caller passed save_to (one named copy).
|
|
7
|
+
* - One slot per bookmark: .summer/shots/<bookmark>.jpg, overwritten by the
|
|
8
|
+
* next render of that bookmark. Named copies: .summer/shots/saved/<name>.jpg.
|
|
9
|
+
* - JPEG only, longest edge <= SHOT_MAX_EDGE, and the folder never holds more
|
|
10
|
+
* than SHOTS_MAX_TOTAL_BYTES: the oldest files are evicted first.
|
|
11
|
+
* - Writes never leave the folder: names are validated, the resolved path is
|
|
12
|
+
* checked against the folder, and symlinks are refused at every level.
|
|
13
|
+
* Every file here is safe to delete at any time (a dot folder: not imported,
|
|
14
|
+
* synced or exported).
|
|
15
|
+
*/
|
|
16
|
+
import { lstat, mkdir, readdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
17
|
+
import { existsSync } from "node:fs";
|
|
18
|
+
import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
19
|
+
import { randomBytes } from "node:crypto";
|
|
20
|
+
import { analyzeJpegFrame } from "../frame-quality.js";
|
|
21
|
+
export const SHOTS_DIR = join(".summer", "shots");
|
|
22
|
+
export const SAVED_SUBDIR = "saved";
|
|
23
|
+
export const SHOT_MAX_EDGE = 1024;
|
|
24
|
+
export const SHOTS_MAX_TOTAL_BYTES = 20 * 1024 * 1024;
|
|
25
|
+
/** Same grammar as camera bookmark names (preview_ops.cpp). */
|
|
26
|
+
export const SHOT_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
27
|
+
export class ShotStoreError extends Error {
|
|
28
|
+
reason;
|
|
29
|
+
constructor(reason, message) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.reason = reason;
|
|
32
|
+
this.name = "ShotStoreError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export class ShotStore {
|
|
36
|
+
root;
|
|
37
|
+
projectRoot;
|
|
38
|
+
maxTotalBytes;
|
|
39
|
+
maxEdge;
|
|
40
|
+
constructor(projectRoot, options = {}) {
|
|
41
|
+
if (!projectRoot || !isAbsolute(projectRoot)) {
|
|
42
|
+
throw new ShotStoreError("no_project", "The project root is not an absolute local path; shots are unavailable.");
|
|
43
|
+
}
|
|
44
|
+
this.projectRoot = resolve(projectRoot);
|
|
45
|
+
this.root = join(this.projectRoot, SHOTS_DIR);
|
|
46
|
+
this.maxTotalBytes = options.maxTotalBytes ?? SHOTS_MAX_TOTAL_BYTES;
|
|
47
|
+
this.maxEdge = options.maxEdge ?? SHOT_MAX_EDGE;
|
|
48
|
+
}
|
|
49
|
+
static forProject(projectRoot, options) {
|
|
50
|
+
if (!projectRoot || !existsSync(join(projectRoot, "project.godot"))) {
|
|
51
|
+
throw new ShotStoreError("no_project", "The bound project is not on this machine (no project.godot at the engine's project path), so before/after shots cannot be kept.");
|
|
52
|
+
}
|
|
53
|
+
return new ShotStore(projectRoot, options);
|
|
54
|
+
}
|
|
55
|
+
slotPath(bookmark) {
|
|
56
|
+
return this.inside(join(this.root, `${checkName(bookmark, "bookmark name")}.jpg`));
|
|
57
|
+
}
|
|
58
|
+
savedPath(name) {
|
|
59
|
+
return this.inside(join(this.root, SAVED_SUBDIR, `${checkName(name, "save_to")}.jpg`));
|
|
60
|
+
}
|
|
61
|
+
resPath(path) {
|
|
62
|
+
return `res://${relative(this.projectRoot, path).split(sep).join("/")}`;
|
|
63
|
+
}
|
|
64
|
+
async readSlot(bookmark) {
|
|
65
|
+
const path = this.slotPath(bookmark);
|
|
66
|
+
await this.refuseSymlinks(path);
|
|
67
|
+
try {
|
|
68
|
+
const info = await lstat(path);
|
|
69
|
+
if (!info.isFile())
|
|
70
|
+
return null;
|
|
71
|
+
return { path, bytes: info.size, mtimeMs: info.mtimeMs };
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async writeSlot(bookmark, jpeg) {
|
|
78
|
+
return this.write(this.slotPath(bookmark), jpeg);
|
|
79
|
+
}
|
|
80
|
+
async saveCopy(name, jpeg) {
|
|
81
|
+
return this.write(this.savedPath(name), jpeg);
|
|
82
|
+
}
|
|
83
|
+
/** Every file under the folder, oldest first. */
|
|
84
|
+
async list() {
|
|
85
|
+
const out = [];
|
|
86
|
+
const walk = async (dir) => {
|
|
87
|
+
let names;
|
|
88
|
+
try {
|
|
89
|
+
names = await readdir(dir);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
for (const name of names) {
|
|
95
|
+
const full = join(dir, name);
|
|
96
|
+
let info;
|
|
97
|
+
try {
|
|
98
|
+
info = await lstat(full);
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (info.isSymbolicLink())
|
|
104
|
+
continue;
|
|
105
|
+
if (info.isDirectory())
|
|
106
|
+
await walk(full);
|
|
107
|
+
else if (info.isFile())
|
|
108
|
+
out.push({ path: full, bytes: info.size, mtimeMs: info.mtimeMs });
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
await walk(this.root);
|
|
112
|
+
return out.sort((a, b) => a.mtimeMs - b.mtimeMs || a.path.localeCompare(b.path));
|
|
113
|
+
}
|
|
114
|
+
async write(target, jpeg) {
|
|
115
|
+
const info = analyzeJpegFrame(jpeg);
|
|
116
|
+
if (jpeg.length < 4 || jpeg[0] !== 0xff || jpeg[1] !== 0xd8 || !info.width || !info.height) {
|
|
117
|
+
throw new ShotStoreError("not_jpeg", "Only baseline JPEG images are stored under .summer/shots/.");
|
|
118
|
+
}
|
|
119
|
+
if (Math.max(info.width, info.height) > this.maxEdge) {
|
|
120
|
+
throw new ShotStoreError("too_large", `Image is ${info.width}x${info.height}; stored shots are at most ${this.maxEdge} px on the longest edge.`);
|
|
121
|
+
}
|
|
122
|
+
if (jpeg.length > this.maxTotalBytes) {
|
|
123
|
+
throw new ShotStoreError("over_cap", `Image is ${jpeg.length} bytes, more than the whole ${this.maxTotalBytes}-byte shots budget.`);
|
|
124
|
+
}
|
|
125
|
+
await this.refuseSymlinks(target);
|
|
126
|
+
await mkdir(join(target, ".."), { recursive: true });
|
|
127
|
+
await this.refuseSymlinks(target);
|
|
128
|
+
let replaced = false;
|
|
129
|
+
try {
|
|
130
|
+
replaced = (await lstat(target)).isFile();
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// new file
|
|
134
|
+
}
|
|
135
|
+
// The file being replaced does not count: it is overwritten, not kept.
|
|
136
|
+
const evicted = [];
|
|
137
|
+
const files = (await this.list()).filter((f) => f.path !== target);
|
|
138
|
+
let total = files.reduce((sum, f) => sum + f.bytes, 0);
|
|
139
|
+
for (const file of files) {
|
|
140
|
+
if (total + jpeg.length <= this.maxTotalBytes)
|
|
141
|
+
break;
|
|
142
|
+
await rm(this.inside(file.path), { force: true });
|
|
143
|
+
total -= file.bytes;
|
|
144
|
+
evicted.push(this.resPath(file.path));
|
|
145
|
+
}
|
|
146
|
+
const tmp = this.inside(join(this.root, `.tmp-${randomBytes(6).toString("hex")}.jpg`));
|
|
147
|
+
await writeFile(tmp, jpeg, { mode: 0o644 });
|
|
148
|
+
try {
|
|
149
|
+
await rename(tmp, target);
|
|
150
|
+
}
|
|
151
|
+
catch (err) {
|
|
152
|
+
await rm(tmp, { force: true });
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
path: target,
|
|
157
|
+
resPath: this.resPath(target),
|
|
158
|
+
bytes: jpeg.length,
|
|
159
|
+
width: info.width,
|
|
160
|
+
height: info.height,
|
|
161
|
+
replaced,
|
|
162
|
+
evicted,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
/** Throws unless `path` resolves strictly inside the shots folder. */
|
|
166
|
+
inside(path) {
|
|
167
|
+
const full = resolve(path);
|
|
168
|
+
const rel = relative(this.root, full);
|
|
169
|
+
if (!rel || rel.startsWith("..") || isAbsolute(rel) || rel.split(sep).includes("..")) {
|
|
170
|
+
throw new ShotStoreError("unsafe_path", `Refusing to touch ${full}: outside ${this.root}.`);
|
|
171
|
+
}
|
|
172
|
+
return full;
|
|
173
|
+
}
|
|
174
|
+
/** Refuse a symlink anywhere from the project's .summer folder down to `path`. */
|
|
175
|
+
async refuseSymlinks(path) {
|
|
176
|
+
const rel = relative(this.projectRoot, path).split(sep);
|
|
177
|
+
let cur = this.projectRoot;
|
|
178
|
+
for (const part of rel) {
|
|
179
|
+
cur = join(cur, part);
|
|
180
|
+
try {
|
|
181
|
+
const info = await lstat(cur);
|
|
182
|
+
if (info.isSymbolicLink()) {
|
|
183
|
+
throw new ShotStoreError("unsafe_path", `Refusing to write through the symlink ${cur}.`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
if (err instanceof ShotStoreError)
|
|
188
|
+
throw err;
|
|
189
|
+
return; // the rest does not exist yet
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
function checkName(name, label) {
|
|
195
|
+
if (typeof name !== "string" || !SHOT_NAME_PATTERN.test(name)) {
|
|
196
|
+
throw new ShotStoreError("bad_name", `${label} must be 1-64 characters from A-Z a-z 0-9 _ - (got ${JSON.stringify(String(name)).slice(0, 80)}).`);
|
|
197
|
+
}
|
|
198
|
+
return name;
|
|
199
|
+
}
|
|
200
|
+
/** Read a stored shot (for compare_previous). */
|
|
201
|
+
export async function readShot(path) {
|
|
202
|
+
await stat(path);
|
|
203
|
+
return readFile(path);
|
|
204
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* surface-snap-mesh — the visible-mesh measurement behind
|
|
3
|
+
* `summer_snap_to_surface` when colliders cannot answer.
|
|
4
|
+
*
|
|
5
|
+
* The engine's SnapToSurface sweeps the subject's colliders against body
|
|
6
|
+
* colliders. When the subject or the support has no collider it falls back to
|
|
7
|
+
* visual_aabb: the subject's visible AABB swept against the AABB of every
|
|
8
|
+
* other visible geometry in the scene. One large AABB anywhere around the
|
|
9
|
+
* subject (a tree, a building block, a full-screen post quad whose mesh
|
|
10
|
+
* carries a huge custom AABB) then counts as an overlap that no back-off
|
|
11
|
+
* clears: collider-less ferns on a ground PlaneMesh all failed with
|
|
12
|
+
* overlap_recovery_exceeded, "starts in contact with or inside (unnamed)".
|
|
13
|
+
*
|
|
14
|
+
* This probe measures the same move from triangles instead. It is one
|
|
15
|
+
* read-only GDScript sent through RunSceneScript (undo "none", no
|
|
16
|
+
* checkpoint), with its arguments as base64 data, never source:
|
|
17
|
+
*
|
|
18
|
+
* - the subject's visible mesh triangles in scene space; its vertices are
|
|
19
|
+
* cast along the direction, each from the subject's top plane (the
|
|
20
|
+
* subject's extreme against the direction) above it, onto the
|
|
21
|
+
* triangles of every other visible mesh whose bounds meet the swept
|
|
22
|
+
* column. A surface between that plane and the vertex means the subject
|
|
23
|
+
* is sunk into it (negative travel);
|
|
24
|
+
* - the support's vertices inside the subject's footprint are cast back
|
|
25
|
+
* against the subject's triangles, for support peaks between subject
|
|
26
|
+
* vertices;
|
|
27
|
+
* - travel = the smallest of those distances; the new local position is
|
|
28
|
+
* the current one plus (travel - gap) along the direction, mapped
|
|
29
|
+
* through the parent's transform.
|
|
30
|
+
*
|
|
31
|
+
* Meshes whose shader writes POSITION (screen-space quads) and non-mesh
|
|
32
|
+
* geometry (CSG, MultiMesh, sprites) are skipped and counted. It reads the
|
|
33
|
+
* scene only; the mutation is an ordinary SetProp + SaveScene sent by
|
|
34
|
+
* surface-snap.ts.
|
|
35
|
+
*/
|
|
36
|
+
import { type CapabilityAdvertisingClient } from "../capability-skew.js";
|
|
37
|
+
import { type JsonRecord } from "../util/json.js";
|
|
38
|
+
export declare const SNAP_MESH_ARGS_TOKEN = "__SUMMER_SNAP_MESH_ARGS__";
|
|
39
|
+
export interface SnapMeshProbeArgs {
|
|
40
|
+
scenePath: string;
|
|
41
|
+
subjectPath: string;
|
|
42
|
+
direction: [number, number, number];
|
|
43
|
+
maxDistance: number;
|
|
44
|
+
gap: number;
|
|
45
|
+
}
|
|
46
|
+
export interface MeshSnapMeasure {
|
|
47
|
+
ok: true;
|
|
48
|
+
/** A support was found within maxDistance. */
|
|
49
|
+
found: boolean;
|
|
50
|
+
/** Distance the subject can move along the direction before its visible
|
|
51
|
+
* triangles touch the support's (negative: it is sunk that deep). */
|
|
52
|
+
travel?: number;
|
|
53
|
+
/** travel - gap: the move along the direction. */
|
|
54
|
+
shift?: number;
|
|
55
|
+
support?: string;
|
|
56
|
+
support_has_collider?: boolean;
|
|
57
|
+
subject_colliders?: number;
|
|
58
|
+
hit_point?: [number, number, number];
|
|
59
|
+
hit_normal?: [number, number, number];
|
|
60
|
+
/** Which cast found the contact: a subject vertex onto the support, or a support vertex onto the subject. */
|
|
61
|
+
contact_from?: "subject_vertex" | "support_vertex";
|
|
62
|
+
/** The subject's extent along the direction. */
|
|
63
|
+
extent?: number;
|
|
64
|
+
/** Godot literals of the subject's local position now and after the move. */
|
|
65
|
+
position?: string;
|
|
66
|
+
position_after?: string;
|
|
67
|
+
origin_before?: [number, number, number];
|
|
68
|
+
origin_after?: [number, number, number];
|
|
69
|
+
samples?: number;
|
|
70
|
+
subject_vertices?: number;
|
|
71
|
+
support_meshes?: number;
|
|
72
|
+
support_triangles?: number;
|
|
73
|
+
reverse_partial?: boolean;
|
|
74
|
+
skipped?: JsonRecord;
|
|
75
|
+
}
|
|
76
|
+
export interface MeshSnapFailure {
|
|
77
|
+
ok: false;
|
|
78
|
+
failure_reason: string;
|
|
79
|
+
error: string;
|
|
80
|
+
}
|
|
81
|
+
export interface SnapMeshClient extends CapabilityAdvertisingClient {
|
|
82
|
+
executeIdentityBoundOps(ops: Record<string, unknown>[], options?: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
|
|
83
|
+
}
|
|
84
|
+
/** Measure the visible-mesh snap from the subject's current pose. */
|
|
85
|
+
export declare function measureMeshSnap(client: SnapMeshClient, args: SnapMeshProbeArgs): Promise<MeshSnapMeasure | MeshSnapFailure>;
|
|
86
|
+
export declare function buildSnapMeshScript(args: Record<string, unknown>): string;
|
|
87
|
+
/** The probe source with its placeholder, for tests. */
|
|
88
|
+
export declare function snapMeshProbeTemplate(): string;
|