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,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai-characters-in-games
|
|
3
|
+
description: "Safe AI characters in published games: no keys in the build, replies via Summer's player AI gateway, moderation, spend caps, offline brain and a report button."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: ai-and-npcs
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Edit Write summer_get_scene_tree summer_add_node summer_set_prop summer_connect_signal summer_save_scene summer_get_script_errors
|
|
9
|
+
paths: ["**/*.gd", "**/*.tscn"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# AI Characters in Games
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
A talking flower, a shopkeeper who answers questions, a companion who reacts to what the player says. Players, often children, type or speak to it and it answers in character.
|
|
17
|
+
|
|
18
|
+
**Core principle:** the game never talks to an AI provider. It asks Summer, as the signed-in player, for a reply from a persona the developer declared. Summer holds the keys (you never bring your own), moderates both directions, charges the cost to the developer's Summer credits and can switch the feature off per game. The game treats every AI answer as optional flavour on top of an offline brain that always works.
|
|
19
|
+
|
|
20
|
+
**Status: preview.** `Summer.client.ai` ships with an upcoming Summer Engine release. The example checks for it at runtime and reads the `capabilities` of `status()` before using a call, and uses the offline brain whenever either is missing, so a game written this way ships today and gains AI replies when the platform turns them on.
|
|
21
|
+
|
|
22
|
+
## When to use
|
|
23
|
+
|
|
24
|
+
- A character, creature or object answers free-form player text or speech.
|
|
25
|
+
- You are about to put a model name, a provider SDK or a key into a game project. Stop and use this instead.
|
|
26
|
+
|
|
27
|
+
Not for scripted dialogue trees (design-npc) or for enemy behaviour.
|
|
28
|
+
|
|
29
|
+
## The rules, and why
|
|
30
|
+
|
|
31
|
+
| Rule | Why |
|
|
32
|
+
| --- | --- |
|
|
33
|
+
| No provider key, provider URL or provider SDK in the project | Anything in a build can be extracted. A leaked key is spent by strangers on your account, and there is no way to take it back from builds already installed. |
|
|
34
|
+
| Call the Summer gateway as the player | The player's own credential identifies who is talking, so limits, age policy and reports attach to a real person, not to the game. |
|
|
35
|
+
| Personas live in the game's AI settings; the game sends only a persona id | If the client could send system text, anyone could turn your flower into a general chatbot. Persona text is moderated when the developer saves it. |
|
|
36
|
+
| History is kept by the gateway | A client that sends its own history can forge what the character "said" before. Send a conversation id instead. |
|
|
37
|
+
| Moderation runs on player text and on the reply, and fails closed | Young audience. A flagged turn returns the persona's safe line (`moderated: true`); show it like any other reply. |
|
|
38
|
+
| Handle every refusal code by falling back, never by retrying in a loop | The limit and the kill switch are how cost and incidents are contained. A retry loop turns them into spend and noise. |
|
|
39
|
+
| Hold-to-talk plus a typed box | Many players cannot or will not use a microphone. Speech is transcribed to text and then goes through the same reply path. |
|
|
40
|
+
| Offline brain always present | The gateway can be off, over its limit, unavailable for the player's age or unreachable. The game must still be good. |
|
|
41
|
+
| AI replies never change game state directly | A model can be talked into anything. If a reply should matter (a mood, a gift), derive a small bounded effect from the player's words on the authority, the same way the offline brain does. |
|
|
42
|
+
| A report button on every AI reply | App store rules for user-facing generated content. The report names the exchange id, so the stored text is the evidence, not a screenshot. |
|
|
43
|
+
| Never ask for or keep personal details | Summer strips contact details before the model sees them; do not store transcripts in saves either. |
|
|
44
|
+
| Label AI characters as AI | Players must know they are talking to generated replies (EU AI Act transparency duties apply from August 2026). A small "AI" tag on the bubble is enough; store listings such as Steam also ask you to disclose live-generated content. |
|
|
45
|
+
| Ask before using the microphone, and say audio is not stored | Consent is expected, and it is true: Summer transcribes and discards the clip. |
|
|
46
|
+
| No voice cloning or speaker identification on player audio | Biometric laws (for example Illinois BIPA) treat voiceprints as protected data. Characters speak only in voices you chose. |
|
|
47
|
+
| Keep characters off mental health, self-harm and romance | Companion-chatbot rules (for example California SB 243) target exactly these. Write it into the persona description and rely on the safe line. |
|
|
48
|
+
|
|
49
|
+
## Top up and set limits
|
|
50
|
+
|
|
51
|
+
AI characters are paid from the Summer credits of the developer who turned them on: usage is billed from your Summer credits. Cost depends on the models and voices you choose. Your dashboard shows spend as it happens, and your limits cap it. Players never pay. There is nothing to configure in the game project.
|
|
52
|
+
|
|
53
|
+
1. In Summer Studio, open the game and its **AI characters** section.
|
|
54
|
+
2. Add a persona per character: name, a plain-words description, an optional voice, reply length, a safe line in character, and the model (from the models the game allows, each marked fast or smart).
|
|
55
|
+
3. Set limits per player per day, per game per day and per month, optional per-model caps, and the refill amount; see your dashboard for the ranges.
|
|
56
|
+
4. Turn **Enable** on. Saving makes you the funding developer: Summer moves your credits into the game's AI balance in refill-sized chunks as it runs low.
|
|
57
|
+
5. Top up credits from the billing page when the balance is low. **Withdraw unused AI credits** returns what no call has reserved.
|
|
58
|
+
|
|
59
|
+
When credits or a limit run out, players get `credits_exhausted` or `limit_exceeded` and the game falls back to its offline brain; nothing crashes. **Enable** off is the kill switch and applies to the next request. Children and players who have not declared an age are excluded.
|
|
60
|
+
|
|
61
|
+
## The SDK
|
|
62
|
+
|
|
63
|
+
`Summer.client.ai` exists only on engines that include it; everywhere else it is `null`. Every method returns a `SummerOperation`. Await it race-free:
|
|
64
|
+
|
|
65
|
+
```gdscript
|
|
66
|
+
var op: Object = ai.reply(persona_id, text)
|
|
67
|
+
var r: SummerResult = await op.get_result_or_completed_signal()
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`r.ok`, `r.code` and `r.retryable` say how it went; the answer itself is on the operation, a `SummerAIOperation` (`op.text`, `op.audio`, ...), because replies and voice clips are larger than a result's `details`. Type it as `Object` so the script still parses on engines without that class. The engine creates request ids itself.
|
|
71
|
+
|
|
72
|
+
| Call | Set on the operation on success |
|
|
73
|
+
| --- | --- |
|
|
74
|
+
| `status()` | `available: bool`, `reason: String` (`""` or one of the failure codes below: `ai_disabled`, `age_policy`, `credits_exhausted`, `limit_exceeded`, `unavailable`, `unsupported`), `personas: Array` of `{id, name, has_voice}`, `capabilities: PackedStringArray` (`"reply"`, `"transcribe"`, `"speak"`, `"report"`), `version: String`. `status` never fails for policy reasons. |
|
|
75
|
+
| `reply(persona_id, text, conversation_id = "")` | `exchange_id`, `persona_id`, `text`, `moderated: bool`. `text` is 1 to 500 characters. |
|
|
76
|
+
| `transcribe(audio: PackedByteArray, mime_type, language = "")` | `text`. At most 240 KiB and 15 seconds (compressed `audio/ogg` or `audio/webm` fits more speech than WAV), as `audio/wav`, `audio/ogg`, `audio/mpeg`, `audio/webm` or `audio/mp4`. Audio is not stored. |
|
|
77
|
+
| `speak(exchange_id)` | `exchange_id`, `mime_type` (`audio/mpeg`), `audio: PackedByteArray`. Only the player's own reply, within an hour of it. Voice is the largest cost: speak only for personas with `has_voice`, and consider voicing on tap. |
|
|
78
|
+
| `report(exchange_id, reason, details = "")` | `report_id`, `status`. The player's own reply, within 30 days. |
|
|
79
|
+
|
|
80
|
+
`moderated: true` is not an error: the persona's safe line replaced the answer. Show it like any reply. Names are snake_case in GDScript (`op.exchange_id`, `persona.has_voice`). After `limit_exceeded` or `rate_limited`, `op.retry_after_seconds` says when asking again can succeed.
|
|
81
|
+
|
|
82
|
+
In multiplayer, never broadcast text a client sent you. The dedicated authority verifies the exchange and broadcasts the text Summer returns:
|
|
83
|
+
|
|
84
|
+
```gdscript
|
|
85
|
+
var ai: Object = Summer.authority.get("ai")
|
|
86
|
+
var check: Object = ai.verify_exchange(session, exchange_id)
|
|
87
|
+
var r: SummerResult = await check.get_result_or_completed_signal()
|
|
88
|
+
if r.ok:
|
|
89
|
+
broadcast_line(check.persona_id, check.text) # exactly what that player was shown; check.player_id said it
|
|
90
|
+
# not_found: forged, another player's, or older than an hour. Drop it.
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Failure codes (`r.ok == false`):
|
|
94
|
+
|
|
95
|
+
| Code | Meaning | Game does |
|
|
96
|
+
| --- | --- | --- |
|
|
97
|
+
| `ai_disabled` | AI is switched off for this game | Offline brain for the session |
|
|
98
|
+
| `age_policy` | Child or undeclared age | Offline brain for the session |
|
|
99
|
+
| `credits_exhausted` | The developer's AI credits ran out | Offline brain for the session |
|
|
100
|
+
| `limit_exceeded` | A player, game or model limit is used up | Offline brain for the session |
|
|
101
|
+
| `provider_error`, `unavailable`, `rate_limited` | Transient (`retryable` is true) | Offline brain for this line |
|
|
102
|
+
| `not_signed_in`, `unsupported` | No player session, or no AI in this build | Offline brain |
|
|
103
|
+
| `persona_unknown`, `invalid_request` | Bug: the persona id or the input | Fix the game or the settings |
|
|
104
|
+
| `not_found` | `report` or `speak` named an exchange that is not the player's own, or is too old | Hide the button |
|
|
105
|
+
|
|
106
|
+
## Steps
|
|
107
|
+
|
|
108
|
+
1. **Write the offline brain first.** Keyword intents plus a few lines per personality, deterministic per (character, text) so every client agrees. This is the shipped experience when AI is unavailable.
|
|
109
|
+
2. **Declare personas in the game's AI characters settings** (see Top up and set limits), not in scripts: one per character, a short description in plain words, a safe line in character ("Let's talk about sunshine instead!").
|
|
110
|
+
3. **Add the talk UI**: a typed box, a hold-to-talk button that only appears when the microphone is allowed, the reply bubble, and a small report button on every AI reply.
|
|
111
|
+
4. **Route through one character script** (below): gateway when `status` says available, offline brain otherwise and on every refusal.
|
|
112
|
+
5. **Keep effects on the authority.** If talking changes something, the authority computes it from the player's words with the offline rules and clamps it.
|
|
113
|
+
6. **Verify** (below).
|
|
114
|
+
|
|
115
|
+
## Example
|
|
116
|
+
|
|
117
|
+
```gdscript
|
|
118
|
+
class_name TalkingCharacter
|
|
119
|
+
extends Node
|
|
120
|
+
## One AI character. Answers through Summer's player AI gateway when it is
|
|
121
|
+
## available and falls back to the offline brain for everything else.
|
|
122
|
+
|
|
123
|
+
signal replied(text: String, exchange_id: String, from_ai: bool)
|
|
124
|
+
|
|
125
|
+
## Codes after which asking again this session only wastes calls.
|
|
126
|
+
const STOP_CODES := [&"ai_disabled", &"age_policy", &"credits_exhausted", &"limit_exceeded", &"not_signed_in", &"unsupported"]
|
|
127
|
+
|
|
128
|
+
@export var persona_id := "cheerful"
|
|
129
|
+
@export var personality := "cheerful"
|
|
130
|
+
|
|
131
|
+
var _conversation_id := ""
|
|
132
|
+
var _ai_ready := false
|
|
133
|
+
var _can_speak := false
|
|
134
|
+
|
|
135
|
+
func _ready() -> void:
|
|
136
|
+
_conversation_id = "c%d" % (Time.get_ticks_usec() % 1000000000)
|
|
137
|
+
_ai_ready = await _gateway_available()
|
|
138
|
+
|
|
139
|
+
func say(player_text: String) -> void:
|
|
140
|
+
var text := player_text.strip_edges().left(500)
|
|
141
|
+
if text.is_empty():
|
|
142
|
+
return
|
|
143
|
+
var ai := _gateway()
|
|
144
|
+
if _ai_ready and ai != null:
|
|
145
|
+
var op: Object = ai.reply(persona_id, text, _conversation_id)
|
|
146
|
+
var r: SummerResult = await op.get_result_or_completed_signal()
|
|
147
|
+
if r.ok:
|
|
148
|
+
replied.emit(op.text, op.exchange_id, true)
|
|
149
|
+
return
|
|
150
|
+
# Transient codes (provider_error, unavailable, rate_limited) fall through
|
|
151
|
+
# for this line only.
|
|
152
|
+
if r.code in STOP_CODES:
|
|
153
|
+
_ai_ready = false
|
|
154
|
+
replied.emit(OfflineBrain.answer(personality, text), "", false)
|
|
155
|
+
|
|
156
|
+
## Voice a reply, for example when the player taps the bubble.
|
|
157
|
+
func speak(exchange_id: String, player: AudioStreamPlayer) -> void:
|
|
158
|
+
var ai := _gateway()
|
|
159
|
+
if not _can_speak or ai == null or exchange_id == "":
|
|
160
|
+
return
|
|
161
|
+
var op: Object = ai.speak(exchange_id)
|
|
162
|
+
var r: SummerResult = await op.get_result_or_completed_signal()
|
|
163
|
+
if r.ok:
|
|
164
|
+
var stream := AudioStreamMP3.new()
|
|
165
|
+
stream.data = op.audio
|
|
166
|
+
player.stream = stream
|
|
167
|
+
player.play()
|
|
168
|
+
|
|
169
|
+
func report(exchange_id: String) -> void:
|
|
170
|
+
var ai := _gateway()
|
|
171
|
+
if exchange_id != "" and ai != null:
|
|
172
|
+
await ai.report(exchange_id, "inappropriate").get_result_or_completed_signal()
|
|
173
|
+
|
|
174
|
+
func _gateway_available() -> bool:
|
|
175
|
+
var ai := _gateway()
|
|
176
|
+
if ai == null:
|
|
177
|
+
return false
|
|
178
|
+
var op: Object = ai.status()
|
|
179
|
+
var r: SummerResult = await op.get_result_or_completed_signal()
|
|
180
|
+
if not r.ok or not op.available or not "reply" in op.capabilities:
|
|
181
|
+
return false
|
|
182
|
+
for p in op.personas:
|
|
183
|
+
if p.id == persona_id:
|
|
184
|
+
_can_speak = p.has_voice and "speak" in op.capabilities
|
|
185
|
+
return true
|
|
186
|
+
|
|
187
|
+
## The only place that knows how the engine exposes the gateway. Engines
|
|
188
|
+
## without it return null and the character stays offline.
|
|
189
|
+
func _gateway() -> Object:
|
|
190
|
+
if not Engine.has_singleton("Summer") or Summer.client == null:
|
|
191
|
+
return null
|
|
192
|
+
var ai: Object = Summer.client.get("ai")
|
|
193
|
+
if ai == null or not ai.has_method("reply") or not ai.has_method("status"):
|
|
194
|
+
return null
|
|
195
|
+
return ai
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
`OfflineBrain.answer(personality, text)` is your step 1 script. Keep the report button visible only when `exchange_id` is not empty, since offline lines are your own text.
|
|
199
|
+
|
|
200
|
+
## Verify
|
|
201
|
+
|
|
202
|
+
- `grep` the project for provider names, model ids and anything key-shaped: none.
|
|
203
|
+
- With the gateway absent (every engine today), every character answers from the offline brain and no error is shown.
|
|
204
|
+
- Typed input works with the microphone denied.
|
|
205
|
+
- Each failure code in the table leads to an offline answer, and the session-level codes stop further gateway calls.
|
|
206
|
+
- With Enable off, or the game's AI credits withdrawn, the game still plays and every character answers offline.
|
|
207
|
+
- `credits_exhausted` leads to an offline answer with no error shown.
|
|
208
|
+
- A reply marked `moderated` shows the safe line.
|
|
209
|
+
- AI replies carry an "AI" label, and the microphone is only used after the player agreed.
|
|
210
|
+
- In multiplayer, the authority broadcasts only text returned by `verify_exchange`.
|
|
211
|
+
- A reply never grants items, currency or progress by itself; the authority applies any effect.
|
|
212
|
+
- Every AI reply shows a report button that sends its exchange id.
|
|
213
|
+
|
|
214
|
+
## Common mistakes
|
|
215
|
+
|
|
216
|
+
- Sending the persona description from the client "just for testing". It ships.
|
|
217
|
+
- Treating `moderated: true` as an error. It is a normal reply.
|
|
218
|
+
- Retrying on `limit_exceeded` or `credits_exhausted`. The limit is the product working.
|
|
219
|
+
- Putting a provider key in the project "until Summer is live". There is no bring-your-own-key path; keys in builds leak.
|
|
220
|
+
- Letting the model decide rewards because "it only suggests". It will be talked into suggesting everything.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
id: skill/ai-characters-in-games
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 0.3.0
|
|
4
|
+
summary: "Safe AI characters in published games: no keys in the build, replies via Summer's player AI gateway, moderation, spend caps, offline brain and a report button."
|
|
5
|
+
use_when:
|
|
6
|
+
- a character, creature or object should answer free-form player text or speech in a published game (talking flowers, shopkeepers, companions)
|
|
7
|
+
- about to put a model name, a provider SDK or a provider key into a game project
|
|
8
|
+
- handling AI refusals (ai_disabled, age_policy, credits_exhausted, limit_exceeded) or adding the report button for AI replies
|
|
9
|
+
- topping up Summer credits, setting AI limits or the kill switch for a game's AI characters
|
|
10
|
+
do_not_use_when:
|
|
11
|
+
- scripted dialogue trees or enemy behaviour — design-npc
|
|
12
|
+
facets:
|
|
13
|
+
lifecycle:
|
|
14
|
+
- build
|
|
15
|
+
domains:
|
|
16
|
+
- ai
|
|
17
|
+
- npc
|
|
18
|
+
modalities:
|
|
19
|
+
- scripts
|
|
20
|
+
- scenes
|
|
21
|
+
compatibility:
|
|
22
|
+
engine: ">=4.6"
|
|
23
|
+
related:
|
|
24
|
+
skills:
|
|
25
|
+
- skill/design-npc
|
|
26
|
+
- skill/multiplayer-state
|
|
27
|
+
source: official
|
|
28
|
+
license: MIT
|
|
29
|
+
status: preview
|
|
30
|
+
recommended: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ambient-bed
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a long looping location ambience — forest, dungeon, city, spaceship, cave — a looping AudioStreamPlayer on the Ambient bus with a seamless loop."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: audio
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: animated-loop
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a short seamlessly-looping video clip — splash background, animated logo backdrop, idle title-screen footage — wired as a looping VideoStreamPlayer."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: video
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: animation-tree
|
|
3
|
-
description:
|
|
3
|
+
description: "Design and wire AnimationTree state machines and blend trees so clips respond to gameplay — locomotion blends, attack interrupts, hit reactions."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: animation
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: art-direction
|
|
3
|
-
description:
|
|
3
|
+
description: "Define the game's visual style — references, palette, mood, lighting plan, post-processing, do/don't list — output as an art bible at .summer/art-bible.md."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: rendering-and-lighting
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: asset-strategy
|
|
3
|
-
description:
|
|
3
|
+
description: "Route any 'I need a [thing]' asset request to the right specialist skill — disambiguates 2D / 3D / audio / video / VFX / animation pipelines."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: asset-pipeline
|
|
@@ -84,6 +84,7 @@ Polycount targets (hero 8k–15k, grunt 3k–6k, mobile 1k–3k, cinematic 20k
|
|
|
84
84
|
| Request | Skill |
|
|
85
85
|
|---|---|
|
|
86
86
|
| Idle / walk / run / attack — new clip | `generate-motion` |
|
|
87
|
+
| Custom action or non-humanoid rig (flower, creature, prop) — clip from text | `text-to-motion` |
|
|
87
88
|
| Apply library to a different character | `retarget` |
|
|
88
89
|
| Blend tree / state machine | `animation-tree` |
|
|
89
90
|
| Look-at / IK / foot placement | `procedural-animation` |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
id: skill/asset-strategy
|
|
2
2
|
kind: skill
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.3
|
|
4
4
|
summary: Route any 'I need a [thing]' asset request to the right specialist skill — disambiguates 2D / 3D / audio / video / VFX / animation pipelines.
|
|
5
5
|
use_when:
|
|
6
6
|
- planning asset creation, picking an asset pipeline, or routing an 'I need a [thing]' request to the right specialist skill
|
|
@@ -35,6 +35,7 @@ related:
|
|
|
35
35
|
- skill/animation-tree
|
|
36
36
|
- skill/facial-and-lipsync
|
|
37
37
|
- skill/generate-motion
|
|
38
|
+
- skill/text-to-motion
|
|
38
39
|
- skill/procedural-animation
|
|
39
40
|
- skill/retarget
|
|
40
41
|
- skill/adaptive-music
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: audio-direction
|
|
3
|
-
description:
|
|
3
|
+
description: "Define the game's sonic identity — music style, instruments, SFX vocabulary, dynamic music plan — output as an audio bible at .summer/audio-bible.md."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: audio
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: auto-fire-targeting
|
|
3
|
-
description:
|
|
3
|
+
description: "Design or fix auto-fire weapon targeting (survivors, top-down ARPG, tower defense) — the pending-damage pattern that prevents over-commit and overkill."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: gameplay-mechanics
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: brainstorm-game
|
|
3
|
-
description:
|
|
3
|
+
description: "Turn a vague idea into a buildable plan — genre, scope, core loop, mechanics, art direction — written as a 1-page brief to .summer/GameSoul.md."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: scene-and-project
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: brainstorming
|
|
3
|
-
description: "
|
|
3
|
+
description: "Explore user intent, requirements, and design before implementation — must run before any creative work: features, components, mechanics, behavior."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Brainstorming Ideas Into Designs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: browse-templates
|
|
3
|
-
description:
|
|
3
|
+
description: "List available Summer Engine project templates, present the choices, and create a project from the chosen one via summer create."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
|
|
6
6
|
category: scene-and-project
|
|
@@ -11,7 +11,7 @@ paths: ["**/project.godot"]
|
|
|
11
11
|
|
|
12
12
|
# /browse-templates — Pick a registry template and create a project from it
|
|
13
13
|
|
|
14
|
-
Summer's templates are the pin manifests in `library/templates/<slug>/resource.yaml`, compiled into `registry/generated/templates-registry.json`: `3d-third-person-controller`, `
|
|
14
|
+
Summer's templates are the pin manifests in `library/templates/<slug>/resource.yaml`, compiled into `registry/generated/templates-registry.json`: `3d-third-person-controller`, `2d-platformer`, and so on. Each pinned template names a repo, an exact commit, and a tree digest; the two built-ins (`empty`, `3d-basic`) are generated locally. They're working starter projects — open in Summer Engine and play immediately.
|
|
15
15
|
|
|
16
16
|
## When to use this skill
|
|
17
17
|
|
|
@@ -99,7 +99,7 @@ Confirm it opens. Then invoke `play` to verify the template runs as expected bef
|
|
|
99
99
|
Once the project is created and running, hand off cleanly. The next skill that fires depends on the template:
|
|
100
100
|
|
|
101
101
|
- Third-person controller → likely `scene-composition` or `gdscript-patterns` next.
|
|
102
|
-
- Multiplayer starter → `
|
|
102
|
+
- Multiplayer starter → `multiplayer` (it routes to `multiplayer-project`).
|
|
103
103
|
- 2D platformer → `design-mechanic` for the platforming feel, then `design-level`.
|
|
104
104
|
|
|
105
105
|
Don't auto-fire the next skill — wait for the user to say what they want to change first.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
id: skill/browse-templates
|
|
2
2
|
kind: skill
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.5
|
|
4
4
|
summary: List available Summer Engine project templates, present the choices, and create a project from the chosen one via summer create.
|
|
5
5
|
use_when:
|
|
6
6
|
- the user wants to see available Summer Engine project templates, start from an existing template, or asks what templates exist
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: camera-rigs
|
|
3
|
+
description: "Camera rigs for 2D and 3D: Camera2D follow with limits, first-person head camera, SpringArm3D third-person, orthographic top-down, FOV guidance."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode]
|
|
6
|
+
category: scene-and-project
|
|
7
|
+
user-invocable: false
|
|
8
|
+
allowed-tools: Read Grep summer_get_scene_tree summer_inspect_node summer_add_node summer_set_prop summer_batch summer_save_scene summer_screenshot summer_play summer_stop summer_get_diagnostics
|
|
9
|
+
paths: ["**/*.tscn", "**/*.gd"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Camera Rigs
|
|
13
|
+
|
|
14
|
+
One rule above all: exactly ONE camera is active. In 3D that is the single
|
|
15
|
+
`Camera3D` with `current = true`; two current cameras = flicker or the wrong
|
|
16
|
+
view, and a scene with no current camera renders nothing in the game. In 2D a
|
|
17
|
+
`Camera2D` is active when `enabled = true` (the default) and it is in the tree;
|
|
18
|
+
with several enabled cameras, call `make_current()` on the one you want.
|
|
19
|
+
|
|
20
|
+
Trigger phrases: "black screen on play", "camera shows past the level edge",
|
|
21
|
+
"jerky follow", "wrong FOV", "I need a top-down / isometric / orbit camera".
|
|
22
|
+
|
|
23
|
+
Ops use engine variant strings (`"Vector3(0, 5, 10)"`), never JSON objects
|
|
24
|
+
(`{x: 0, y: 5, z: 10}` fails). Every mutation names its scene: pass the exact
|
|
25
|
+
`scenePath` (e.g. `res://main.tscn`). One `summer_batch` per rig saves the scene
|
|
26
|
+
once; the examples below use it.
|
|
27
|
+
|
|
28
|
+
## 2D follow camera
|
|
29
|
+
|
|
30
|
+
Add the `Camera2D` as a CHILD of the player so it follows for free, then smooth
|
|
31
|
+
it and clamp it to the level.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
summer_batch(scenePath="res://main.tscn", ops=[
|
|
35
|
+
{"op": "AddNode", "parent": "./Player", "type": "Camera2D", "name": "Camera"},
|
|
36
|
+
{"op": "SetProp", "path": "./Player/Camera", "key": "position_smoothing_enabled", "value": true},
|
|
37
|
+
{"op": "SetProp", "path": "./Player/Camera", "key": "position_smoothing_speed", "value": 6.0},
|
|
38
|
+
{"op": "SetProp", "path": "./Player/Camera", "key": "limit_left", "value": 0},
|
|
39
|
+
{"op": "SetProp", "path": "./Player/Camera", "key": "limit_right", "value": 1920},
|
|
40
|
+
{"op": "SetProp", "path": "./Player/Camera", "key": "limit_top", "value": 0},
|
|
41
|
+
{"op": "SetProp", "path": "./Player/Camera", "key": "limit_bottom", "value": 1080}
|
|
42
|
+
])
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
- Smoothing speed 5-8 feels responsive; higher = tighter, lower = drifty.
|
|
46
|
+
- Set limits to the actual level bounds (the numbers above are placeholders).
|
|
47
|
+
`limit_smoothing_enabled = true` avoids a hard stop at the edge.
|
|
48
|
+
- Zoom `Vector2(2, 2)` zooms IN (bigger), `Vector2(0.5, 0.5)` zooms OUT (top-down).
|
|
49
|
+
|
|
50
|
+
## 2D top-down camera
|
|
51
|
+
|
|
52
|
+
Same as above minus the platformer edge-lock urgency. Zoom out to show the field
|
|
53
|
+
(`Vector2(0.5, 0.5)`). Keep it centered on the player; no vertical bias.
|
|
54
|
+
|
|
55
|
+
## 3D first-person camera
|
|
56
|
+
|
|
57
|
+
Camera is a child of a `Head` node on the player. Body yaws, Head pitches. See
|
|
58
|
+
the `character-movement` skill (its `../character-movement/references/movement-3d.md`) or
|
|
59
|
+
`fps-controller` for the look script. FOV 70-75, near 0.05.
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
summer_batch(scenePath="res://main.tscn", ops=[
|
|
63
|
+
{"op": "AddNode", "parent": "./Player/Head", "type": "Camera3D", "name": "Camera"},
|
|
64
|
+
{"op": "SetProp", "path": "./Player/Head/Camera", "key": "fov", "value": 72.0},
|
|
65
|
+
{"op": "SetProp", "path": "./Player/Head/Camera", "key": "near", "value": 0.05},
|
|
66
|
+
{"op": "SetProp", "path": "./Player/Head/Camera", "key": "current", "value": true}
|
|
67
|
+
])
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 3D third-person camera (spring arm)
|
|
71
|
+
|
|
72
|
+
The `SpringArm3D` pushes the camera in when a wall is behind the player, so it
|
|
73
|
+
never clips through geometry. This is the correct third-person rig - do not just
|
|
74
|
+
park a Camera3D behind the player.
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
summer_batch(scenePath="res://main.tscn", ops=[
|
|
78
|
+
{"op": "AddNode", "parent": "./Player", "type": "SpringArm3D", "name": "SpringArm"},
|
|
79
|
+
{"op": "SetProp", "path": "./Player/SpringArm", "key": "position", "value": "Vector3(0, 2, 0)"},
|
|
80
|
+
{"op": "SetProp", "path": "./Player/SpringArm", "key": "spring_length", "value": 4.5},
|
|
81
|
+
{"op": "SetProp", "path": "./Player/SpringArm", "key": "collision_mask", "value": 2},
|
|
82
|
+
{"op": "AddNode", "parent": "./Player/SpringArm", "type": "Camera3D", "name": "Camera"},
|
|
83
|
+
{"op": "SetProp", "path": "./Player/SpringArm/Camera", "key": "current", "value": true}
|
|
84
|
+
])
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Set `collision_mask` to the LEVEL layer only. If it includes the player layer the
|
|
88
|
+
arm collapses to length 0 and you see inside the character (a controller script
|
|
89
|
+
can also call `add_excluded_object(get_rid())` on the arm).
|
|
90
|
+
|
|
91
|
+
## Orthographic top-down 3D (twin-stick, strategy, isometric)
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
summer_batch(scenePath="res://main.tscn", ops=[
|
|
95
|
+
{"op": "SetProp", "path": "./Camera", "key": "projection", "value": 1},
|
|
96
|
+
{"op": "SetProp", "path": "./Camera", "key": "size", "value": 20.0},
|
|
97
|
+
{"op": "SetProp", "path": "./Camera", "key": "position", "value": "Vector3(0, 20, 0)"},
|
|
98
|
+
{"op": "SetProp", "path": "./Camera", "key": "rotation_degrees", "value": "Vector3(-90, 0, 0)"}
|
|
99
|
+
])
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`projection = 1` is orthogonal. `size` is the vertical world units shown - bigger
|
|
103
|
+
= more zoomed out. For isometric, rotate ~(-30, 45, 0) instead of straight down.
|
|
104
|
+
|
|
105
|
+
## FOV guidance
|
|
106
|
+
|
|
107
|
+
- 60-75: most 3D games. 90+: fast FPS (feels faster, more peripheral).
|
|
108
|
+
- Under 40 or over 110 distorts. Never animate FOV wildly; a small kick (+8 on
|
|
109
|
+
sprint, tweened back) reads as speed.
|
|
110
|
+
|
|
111
|
+
## Verify
|
|
112
|
+
|
|
113
|
+
A camera is only proven by a frame. After the rig is in, `summer_play`, then
|
|
114
|
+
`summer_screenshot` with `target: "game"`, then `summer_stop`; or save frames
|
|
115
|
+
from a `RunVerification` probe while the player moves (see
|
|
116
|
+
`playtesting-a-feature`). An editor `viewport` screenshot shows the editor's
|
|
117
|
+
camera, not the game's.
|
|
118
|
+
|
|
119
|
+
## Troubleshooting
|
|
120
|
+
|
|
121
|
+
| Symptom | Cause | Fix |
|
|
122
|
+
|---------|-------|-----|
|
|
123
|
+
| Black screen | No current/enabled camera | 3D: `current = true` on exactly one; 2D: one enabled Camera2D in the tree |
|
|
124
|
+
| Camera inside geometry | Spawned inside a wall/player | Move it out; spring arm for 3P |
|
|
125
|
+
| Jerky follow | Smoothing off/too slow | Enable smoothing, speed 6-10 |
|
|
126
|
+
| Shows past level edge | No 2D limits | Set `limit_*` to level bounds |
|
|
127
|
+
| Wrong facing (3D) | rotation.y off | y: 0 = forward, 180 = backward |
|
|
128
|
+
| Everything tiny/huge (ortho) | `size` wrong | Tune `size`, not `position.y` |
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
id: skill/camera-rigs
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Camera rigs for 2D and 3D: Camera2D follow with limits, first-person head camera, SpringArm3D third-person, orthographic top-down, FOV guidance."
|
|
5
|
+
use_when:
|
|
6
|
+
- black screen on play, or the camera shows past the level edge
|
|
7
|
+
- jerky camera follow, wrong FOV, or the third-person camera clips into walls
|
|
8
|
+
- need a top-down, isometric, orthographic, orbit, or spring-arm camera
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- build
|
|
12
|
+
domains:
|
|
13
|
+
- scenes
|
|
14
|
+
- 3d
|
|
15
|
+
- 2d
|
|
16
|
+
modalities:
|
|
17
|
+
- scenes
|
|
18
|
+
- scripts
|
|
19
|
+
compatibility:
|
|
20
|
+
engine: ">=4.6"
|
|
21
|
+
related:
|
|
22
|
+
skills:
|
|
23
|
+
- skill/make-game
|
|
24
|
+
- skill/character-movement
|
|
25
|
+
- skill/fps-controller
|
|
26
|
+
source: official
|
|
27
|
+
license: MIT
|
|
28
|
+
status: preview
|
|
29
|
+
recommended: false
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: celeste-momentum-platforming
|
|
3
|
-
description: "
|
|
3
|
+
description: "Celeste-style 2D precision platformer movement — momentum running, coyote time, variable jumps, dash, wall jump/slide, climb stamina, pixel corner correction."
|
|
4
4
|
license: MIT
|
|
5
5
|
category: game-feel
|
|
6
6
|
tags:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: character-animation-wiring
|
|
3
|
-
description:
|
|
3
|
+
description: "Wire a rigged, animated character end to end — inspect real clips and bones, locomotion state machine, method-track events, poses, blend shapes, root motion."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: animation
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: character-model
|
|
3
|
-
description:
|
|
3
|
+
description: "Generate a rigged humanoid — player, NPC, enemy, boss — via T-pose reference, user-gated preview, and Meshy auto-rig, wired as CharacterBody3D or Node3D."
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
6
|
category: 3d-assets
|