summer-engine 3.3.0 → 3.4.1
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 +4 -2
- package/.codex-plugin/plugin.json +5 -3
- package/.cursor-plugin/plugin.json +4 -2
- package/.factory-plugin/plugin.json +4 -2
- package/.opencode/INSTALL.md +8 -8
- package/.opencode/plugins/summer.js +2 -2
- package/AGENTS.md +7 -7
- package/CHANGELOG.md +50 -0
- package/GEMINI.md +1 -1
- package/NOTICE +1 -1
- package/README.md +32 -35
- package/assets/api-docs.json.gz +0 -0
- package/assets/autopilot/run.sh +2 -2
- package/assets/navigation/web-routes.json +1 -1
- package/commands/gameskill.md +2 -2
- package/commands/summer.md +25 -25
- package/dist/cli/commands/install.d.ts +10 -0
- package/dist/cli/commands/install.js +55 -10
- package/dist/cli/commands/open.d.ts +1 -1
- package/dist/cli/commands/run.d.ts +1 -1
- package/dist/cli/commands/run.js +1 -1
- package/dist/cli/commands/skills.js +2 -2
- package/dist/cli/commands/tool.d.ts +7 -0
- package/dist/cli/commands/tool.js +36 -1
- package/dist/core/api-client.d.ts +5 -6
- package/dist/core/api-client.js +12 -15
- package/dist/core/auth.js +2 -2
- package/dist/core/capabilities/asset-import.d.ts +0 -1
- package/dist/core/capabilities/camera-view.d.ts +1 -1
- package/dist/core/capabilities/camera-view.js +2 -2
- package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
- package/dist/core/capabilities/capture-gameplay.js +283 -0
- package/dist/core/capabilities/connect-signal.d.ts +1 -2
- package/dist/core/capabilities/connect-signal.js +1 -2
- package/dist/core/capabilities/console-read.d.ts +2 -2
- package/dist/core/capabilities/console-read.js +2 -2
- package/dist/core/capabilities/creator.js +1 -1
- package/dist/core/capabilities/doctor.d.ts +9 -1
- package/dist/core/capabilities/doctor.js +47 -4
- package/dist/core/capabilities/engine-receipt.d.ts +5 -7
- package/dist/core/capabilities/engine-receipt.js +7 -9
- package/dist/core/capabilities/engine-run.d.ts +4 -0
- package/dist/core/capabilities/engine-run.js +33 -5
- package/dist/core/capabilities/export-engine-version.d.ts +15 -0
- package/dist/core/capabilities/export-engine-version.js +24 -0
- package/dist/core/capabilities/export-game.d.ts +9 -1
- package/dist/core/capabilities/export-game.js +115 -39
- package/dist/core/capabilities/export-presets.d.ts +1 -1
- package/dist/core/capabilities/export-presets.js +1 -1
- package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
- package/dist/core/capabilities/fabricate-mesh.js +2 -3
- package/dist/core/capabilities/frame-quality.d.ts +4 -4
- package/dist/core/capabilities/frame-quality.js +4 -4
- package/dist/core/capabilities/grep.d.ts +1 -1
- package/dist/core/capabilities/grep.js +1 -1
- package/dist/core/capabilities/image-generation.d.ts +9 -0
- package/dist/core/capabilities/image-generation.js +19 -1
- package/dist/core/capabilities/navigation/open.d.ts +1 -1
- package/dist/core/capabilities/navigation/open.js +1 -1
- package/dist/core/capabilities/navigation/render-product-map.js +1 -1
- package/dist/core/capabilities/navigation/targets.js +2 -2
- package/dist/core/capabilities/placement-batch.d.ts +1 -1
- package/dist/core/capabilities/placement-batch.js +2 -2
- package/dist/core/capabilities/play-determinism.d.ts +1 -1
- package/dist/core/capabilities/play-determinism.js +1 -1
- package/dist/core/capabilities/publish-build.d.ts +15 -2
- package/dist/core/capabilities/publish-build.js +78 -28
- package/dist/core/capabilities/publish-download.d.ts +1 -2
- package/dist/core/capabilities/publish-download.js +2 -3
- package/dist/core/capabilities/replace-node.d.ts +1 -3
- package/dist/core/capabilities/replace-node.js +1 -3
- package/dist/core/capabilities/runtime-control.d.ts +5 -7
- package/dist/core/capabilities/runtime-control.js +7 -9
- package/dist/core/capabilities/scene-batch.d.ts +1 -1
- package/dist/core/capabilities/scene-batch.js +1 -1
- package/dist/core/capabilities/scene-kind.js +1 -1
- package/dist/core/capabilities/scene-readback.d.ts +3 -4
- package/dist/core/capabilities/scene-readback.js +3 -4
- package/dist/core/capabilities/scene-script.d.ts +2 -2
- package/dist/core/capabilities/scene-script.js +2 -2
- package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
- package/dist/core/capabilities/seeing/shot-store.js +1 -1
- package/dist/core/capabilities/summer-bundle.d.ts +2 -3
- package/dist/core/capabilities/summer-bundle.js +2 -3
- package/dist/core/capabilities/surface-snap.d.ts +1 -1
- package/dist/core/capabilities/surface-snap.js +1 -1
- package/dist/core/capabilities/tool-dispatch.js +11 -1
- package/dist/core/capabilities/ui-control.d.ts +1 -2
- package/dist/core/capabilities/ui-control.js +1 -2
- package/dist/core/capabilities/world-snapshot.d.ts +1 -1
- package/dist/core/capabilities/world-snapshot.js +1 -1
- package/dist/core/capability-skew.d.ts +2 -3
- package/dist/core/capability-skew.js +4 -5
- package/dist/core/config.js +2 -2
- package/dist/core/engine-install.d.ts +16 -0
- package/dist/core/engine-install.js +32 -2
- package/dist/core/feedback/client.js +1 -1
- package/dist/core/hosted-mcp.d.ts +115 -0
- package/dist/core/hosted-mcp.js +164 -0
- package/dist/core/launch-posture.d.ts +6 -3
- package/dist/core/launch-posture.js +18 -5
- package/dist/core/library-read.js +1 -2
- package/dist/core/templates.d.ts +1 -2
- package/dist/core/templates.js +1 -2
- package/dist/mcp/hosted-mount.d.ts +13 -59
- package/dist/mcp/hosted-mount.js +24 -30
- package/dist/mcp/server.d.ts +2 -2
- package/dist/mcp/server.js +5 -4
- package/dist/mcp/tools/creator-tools.js +14 -4
- package/dist/mcp/tools/debug-tools.js +1 -1
- package/dist/mcp/tools/generate-tools.js +19 -9
- package/dist/mcp/tools/navigation-tools.d.ts +1 -1
- package/dist/mcp/tools/navigation-tools.js +1 -1
- package/dist/mcp/tools/spatial-tools.js +1 -1
- package/dist/mcp/tools/visual-tools.js +2 -2
- package/dist/mcp/tools/with-engine.d.ts +1 -2
- package/dist/mcp/tools/with-engine.js +1 -2
- package/gemini-extension.json +3 -1
- package/hooks/session-start.sh +2 -2
- package/integrations/README.md +70 -76
- package/integrations/claude/README.md +0 -3
- package/integrations/codex/README.md +1 -2
- package/integrations/copilot-jetbrains/README.md +1 -1
- package/integrations/cursor/README.md +1 -2
- package/integrations/factory/README.md +15 -11
- package/integrations/mistral-vibe/README.md +1 -1
- package/integrations/opencode/README.md +1 -1
- package/integrations/roo-code/README.md +1 -1
- package/integrations/rovo-dev/README.md +1 -1
- package/integrations/trae/README.md +1 -1
- package/integrations/windsurf/README.md +3 -3
- package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
- package/library/references/gd-style/gd-style.md +4 -6
- package/library/references/godot-version/godot-version.md +3 -3
- package/library/references/headless-routing/headless-routing.md +2 -2
- package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
- package/library/references/product-map/product-map.md +1 -1
- package/library/references/public-surface-language/public-surface-language.md +1 -1
- package/library/references/summer-folder/summer-folder.md +1 -1
- package/library/skills/3d-lighting/SKILL.md +4 -4
- package/library/skills/README.md +11 -9
- package/library/skills/adaptive-music/SKILL.md +7 -7
- package/library/skills/ai-characters-in-games/SKILL.md +1 -1
- package/library/skills/ambient-bed/SKILL.md +12 -14
- package/library/skills/animated-loop/SKILL.md +42 -42
- package/library/skills/animation-tree/SKILL.md +6 -6
- package/library/skills/art-direction/SKILL.md +8 -11
- package/library/skills/asset-strategy/SKILL.md +3 -3
- package/library/skills/audio-direction/SKILL.md +8 -10
- package/library/skills/auto-fire-targeting/SKILL.md +4 -3
- package/library/skills/bounded-engine-runs/SKILL.md +95 -0
- package/library/skills/bounded-engine-runs/resource.yaml +29 -0
- package/library/skills/brainstorm-game/SKILL.md +5 -5
- package/library/skills/brainstorming/SKILL.md +9 -15
- package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
- package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
- package/library/skills/character-animation-wiring/SKILL.md +2 -2
- package/library/skills/character-model/SKILL.md +15 -26
- package/library/skills/character-movement/SKILL.md +1 -1
- package/library/skills/character-movement/references/movement-3d.md +1 -1
- package/library/skills/character-portrait/SKILL.md +4 -4
- package/library/skills/cinematic-cutscene/SKILL.md +38 -38
- package/library/skills/combat-basics/SKILL.md +1 -1
- package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
- package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
- package/library/skills/concept-art/SKILL.md +4 -4
- package/library/skills/create-asset-sheet/SKILL.md +12 -31
- package/library/skills/debug/SKILL.md +5 -4
- package/library/skills/debugging-game-feel/SKILL.md +1 -4
- package/library/skills/debugging-game-feel/resource.yaml +1 -1
- package/library/skills/design-level/SKILL.md +5 -5
- package/library/skills/design-mechanic/SKILL.md +6 -6
- package/library/skills/design-npc/SKILL.md +8 -15
- package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
- package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
- package/library/skills/environment-kit/SKILL.md +5 -5
- package/library/skills/export-and-ship/SKILL.md +25 -24
- package/library/skills/fabricating-assets/SKILL.md +1 -1
- package/library/skills/facial-and-lipsync/SKILL.md +5 -5
- package/library/skills/fps-controller/SKILL.md +17 -16
- package/library/skills/fps-controller/resource.yaml +0 -2
- package/library/skills/game-feel/SKILL.md +6 -7
- package/library/skills/gameskill/SKILL.md +3 -3
- package/library/skills/gdscript-patterns/SKILL.md +3 -3
- package/library/skills/generate-motion/SKILL.md +5 -22
- package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
- package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
- package/library/skills/headless-scripting/SKILL.md +8 -8
- package/library/skills/headless-scripting/resource.yaml +1 -0
- package/library/skills/in-game-purchases/SKILL.md +123 -118
- package/library/skills/in-game-purchases/resource.yaml +2 -2
- package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
- package/library/skills/investigating-bugs/SKILL.md +3 -11
- package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
- package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
- package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
- package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
- package/library/skills/make-game/SKILL.md +3 -5
- package/library/skills/make-game/references/2d-platformer.md +1 -1
- package/library/skills/multiplayer-project/SKILL.md +1 -1
- package/library/skills/multiplayer-testing/SKILL.md +4 -4
- package/library/skills/music-track/SKILL.md +40 -38
- package/library/skills/new-project/SKILL.md +4 -6
- package/library/skills/organic-model/SKILL.md +9 -9
- package/library/skills/pixel-art/SKILL.md +6 -6
- package/library/skills/play/SKILL.md +3 -4
- package/library/skills/playtesting-a-feature/SKILL.md +4 -6
- package/library/skills/procedural-animation/SKILL.md +10 -11
- package/library/skills/prop-model/SKILL.md +4 -4
- package/library/skills/psx-retro-rendering/SKILL.md +20 -20
- package/library/skills/psx-retro-rendering/resource.yaml +2 -3
- package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
- package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
- package/library/skills/remote-deploy/SKILL.md +20 -21
- package/library/skills/retarget/SKILL.md +19 -23
- package/library/skills/running-in-the-cloud/SKILL.md +5 -5
- package/library/skills/scene-composition/SKILL.md +5 -5
- package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
- package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
- package/library/skills/scene-scripting/SKILL.md +3 -3
- package/library/skills/scene-to-level/SKILL.md +28 -31
- package/library/skills/skill-create/SKILL.md +1 -1
- package/library/skills/skill-improve/SKILL.md +9 -9
- package/library/skills/skill-test/SKILL.md +10 -10
- package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
- package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
- package/library/skills/skybox-panorama/SKILL.md +8 -9
- package/library/skills/sound-effect/SKILL.md +19 -19
- package/library/skills/spatial-placement/SKILL.md +2 -2
- package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
- package/library/skills/sprite-sheet/SKILL.md +10 -10
- package/library/skills/summer-analytics/SKILL.md +3 -3
- package/library/skills/summer-friends/SKILL.md +10 -10
- package/library/skills/summer-leaderboards/SKILL.md +6 -6
- package/library/skills/summer-match-results/SKILL.md +13 -13
- package/library/skills/summer-matchmaking/SKILL.md +11 -11
- package/library/skills/summer-parties/SKILL.md +9 -9
- package/library/skills/summer-player-data/SKILL.md +12 -12
- package/library/skills/summer-store/SKILL.md +6 -6
- package/library/skills/summer-world-chat/SKILL.md +9 -9
- package/library/skills/summer-world-saves/SKILL.md +7 -7
- package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
- package/library/skills/tileable-texture/SKILL.md +1 -1
- package/library/skills/trailer-shot/SKILL.md +36 -36
- package/library/skills/tune-performance/SKILL.md +13 -13
- package/library/skills/tune-performance/resource.yaml +1 -1
- package/library/skills/ui-graphics/SKILL.md +7 -7
- package/library/skills/use-widget-asset/SKILL.md +7 -7
- package/library/skills/using-summer/SKILL.md +5 -7
- package/library/skills/vehicle-model/SKILL.md +6 -7
- package/library/skills/vehicle-model/resource.yaml +2 -2
- package/library/skills/verification-before-completion/SKILL.md +5 -6
- package/library/skills/vfx-dissolve/SKILL.md +4 -4
- package/library/skills/vfx-fire/SKILL.md +6 -6
- package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-hit-spark/SKILL.md +4 -4
- package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/SKILL.md +5 -5
- package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-magic-glow/SKILL.md +4 -4
- package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
- package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
- package/library/skills/vfx-smoke/SKILL.md +5 -5
- package/library/skills/vfx-water-ripple/SKILL.md +2 -2
- package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
- package/library/skills/voice-line/SKILL.md +9 -9
- package/library/skills/web-compatibility-look/resource.yaml +1 -0
- package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
- package/library/skills/writing-plans/SKILL.md +4 -4
- package/library/skills/writing-skills/SKILL.md +8 -8
- package/library/tools/capture-gameplay/resource.yaml +73 -0
- package/library/tools/creator-publish/resource.yaml +4 -4
- package/library/tools/creator-releases/resource.yaml +5 -5
- package/library/tools/generate-image/resource.yaml +15 -1
- package/library/tools/publish-build/resource.yaml +6 -2
- package/package.json +1 -1
- package/registry/generated/aliases.json +1 -0
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +3 -1
- package/registry/generated/index.json +248 -135
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +4 -2
- package/registry/generated/plugin.codex.json +5 -3
- package/registry/generated/plugin.cursor.json +4 -2
- package/registry/generated/plugin.factory.json +4 -2
- package/registry/generated/skills-index.md +11 -9
- package/registry/generated/skills-registry.json +33 -6
- package/registry/schemas/domains.json +1 -1
|
@@ -13,9 +13,9 @@ paths: ["audio/ambient/**", "**/*.tscn", "**/*.import"]
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
An ambient bed is the *air* of a place. Forest at dawn, dungeon corridor, spaceship hum, market street, ocean cave. It plays at low energy under everything else
|
|
16
|
+
An ambient bed is the *air* of a place. Forest at dawn, dungeon corridor, spaceship hum, market street, ocean cave. It plays at low energy under everything else and is never melodic. Players rarely notice a bed, but they notice the silence when a level has none.
|
|
17
17
|
|
|
18
|
-
This is **not** music. Use `summer_generate_audio({capability: 'sound_effects'})`, not `{capability: 'music'}
|
|
18
|
+
This is **not** music. Use `summer_generate_audio({capability: 'sound_effects'})`, not `{capability: 'music'}`: the SFX model renders texture, the music model renders melody.
|
|
19
19
|
|
|
20
20
|
Generated at 15–22 seconds (the SFX duration ceiling) and looped with a Summer
|
|
21
21
|
Engine import loop point and optional crossfade.
|
|
@@ -28,9 +28,9 @@ Engine import loop point and optional crossfade.
|
|
|
28
28
|
|
|
29
29
|
## When NOT to use
|
|
30
30
|
|
|
31
|
-
- Short event SFX (<5s) → `
|
|
32
|
-
- Music with melody / chord progression → `
|
|
33
|
-
- Voice barks → `
|
|
31
|
+
- Short event SFX (<5s) → `sound-effect`.
|
|
32
|
+
- Music with melody / chord progression → `music-track`.
|
|
33
|
+
- Voice barks → `voice-line`.
|
|
34
34
|
|
|
35
35
|
## Steps
|
|
36
36
|
|
|
@@ -50,7 +50,7 @@ Ask if it's not pinned by context:
|
|
|
50
50
|
|
|
51
51
|
### 3. Build the prompt — environment + time + weather + 2–3 sources + density + duration
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
The SFX model renders ambient texture well when the prompt names sound sources, not moods.
|
|
54
54
|
|
|
55
55
|
Prompts that work:
|
|
56
56
|
|
|
@@ -117,9 +117,7 @@ If the model returns a clip with a loud event near the start or end (a sudden bi
|
|
|
117
117
|
|
|
118
118
|
### 6. Mark the seamless loop in Summer Engine's Import dock
|
|
119
119
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
WAV and MP3 use **different importers with different option names** — do not copy the MP3 block from `audio/music-track` here. The WAV importer has no `loop` / `loop_offset`; it has an `edit/loop_mode` enum plus sample-frame bounds.
|
|
120
|
+
WAV and MP3 use **different importers with different option names** — do not copy the MP3 block from `music-track` here. The WAV importer has no `loop` / `loop_offset`; it has an `edit/loop_mode` enum plus sample-frame bounds.
|
|
123
121
|
|
|
124
122
|
In Summer Engine, select the `.wav` and open the Import dock:
|
|
125
123
|
|
|
@@ -144,7 +142,7 @@ After changing, click `Reimport`.
|
|
|
144
142
|
|
|
145
143
|
### 7. Crossfade-loop pattern for seamlessness
|
|
146
144
|
|
|
147
|
-
|
|
145
|
+
Generated SFX clips are not gapless. Even with the loop mode set, you will often hear a small click at the loop point. Fix it with a two-player crossfade in code:
|
|
148
146
|
|
|
149
147
|
```gdscript
|
|
150
148
|
# scripts/audio/AmbientBed.gd
|
|
@@ -278,7 +276,7 @@ Print the SFX prompt and the import dock settings. User runs via the Summer dash
|
|
|
278
276
|
|
|
279
277
|
## See also
|
|
280
278
|
|
|
281
|
-
- `audio
|
|
282
|
-
- `
|
|
283
|
-
- `
|
|
284
|
-
- `
|
|
279
|
+
- `audio-direction` — defines the Ambient layer class
|
|
280
|
+
- `sound-effect` — short event SFX layered over the bed
|
|
281
|
+
- `music-track` — melodic music layered over the bed
|
|
282
|
+
- `adaptive-music` — state-driven crossfades use the same pattern
|
|
@@ -11,11 +11,11 @@ paths: ["assets/video/**", "menus/**", "ui/**"]
|
|
|
11
11
|
|
|
12
12
|
# animated-loop — 5 Second Seamless Background Loop
|
|
13
13
|
|
|
14
|
-
A loop is the only video format that has to *not have* a beginning or end. The viewer sees it on the title screen for 30 seconds; if the seam between loop iterations is visible, the whole thing reads as broken. This skill exists to force the constraints that make seams invisible: take the shortest duration available, keep the motion ambient (no narrative, no big camera moves), use the
|
|
14
|
+
A loop is the only video format that has to *not have* a beginning or end. The viewer sees it on the title screen for 30 seconds; if the seam between loop iterations is visible, the whole thing reads as broken. This skill exists to force the constraints that make seams invisible: take the shortest duration available, keep the motion ambient (no narrative, no big camera moves), use the fast model (`ltx`), and prompt for a composition where the first and last frames are functionally identical.
|
|
15
15
|
|
|
16
16
|
**Duration is not a dial here.** `summer_generate_video` accepts only `duration=5` or `duration=10`; the server coerces every other value to 5. So "drop to 3s to hide the seam" is not an option — 5s is the floor, and the seam has to be won in the prompt and the reference frame instead.
|
|
17
17
|
|
|
18
|
-
If the user wants a 5s punchy marketing shot, that's `
|
|
18
|
+
If the user wants a 5s punchy marketing shot, that's `trailer-shot`. If they want a 10s narrative cutscene, that's `cinematic-cutscene`. This skill is the one for video that has to *disappear* — atmosphere behind a logo, mood behind a menu, ambience behind a splash card.
|
|
19
19
|
|
|
20
20
|
## When to use
|
|
21
21
|
|
|
@@ -28,9 +28,9 @@ If the user wants a 5s punchy marketing shot, that's `video/trailer-shot`. If th
|
|
|
28
28
|
|
|
29
29
|
## When NOT to use
|
|
30
30
|
|
|
31
|
-
- Marketing shot for a trailer (5-10s with punch) — `
|
|
32
|
-
- Narrative cutscene with a beginning and end — `
|
|
33
|
-
- Static splash image — generate with `
|
|
31
|
+
- Marketing shot for a trailer (5-10s with punch) — `trailer-shot`.
|
|
32
|
+
- Narrative cutscene with a beginning and end — `cinematic-cutscene`.
|
|
33
|
+
- Static splash image — generate with `concept-art` and use a `TextureRect`. A still is cheaper, lighter, and never seams.
|
|
34
34
|
- UI element animation (icons, button states) — those are GDScript `Tween` or sprite sheets, not video.
|
|
35
35
|
- A 10-second shot you want to "loop". That seam will be visible. Either accept a hard cut every 10s (ugly) or generate a 5s clip designed to loop.
|
|
36
36
|
|
|
@@ -40,21 +40,21 @@ If the user wants a 5s punchy marketing shot, that's `video/trailer-shot`. If th
|
|
|
40
40
|
|
|
41
41
|
> Quick check — this loop will play on a screen the user might stare at for 30+ seconds. That means the loop point must be invisible. I'll take the 5s minimum and prompt for ambient motion (drift, flicker, shimmer) rather than a narrative beat. OK?
|
|
42
42
|
|
|
43
|
-
If the user wants narrative motion (a character walking, a door opening), this is the wrong skill — route to `
|
|
43
|
+
If the user wants narrative motion (a character walking, a door opening), this is the wrong skill — route to `cinematic-cutscene`.
|
|
44
44
|
|
|
45
45
|
### 2. Pick the model — `ltx` first, always
|
|
46
46
|
|
|
47
|
-
For loops, `ltx` is
|
|
47
|
+
For loops, `ltx` is almost always right. It takes ~30s, and short ambient motion is what it handles best. The premium models cost more credits and do not loop better.
|
|
48
48
|
|
|
49
49
|
This skill always passes `imageUrl` (step 3), which puts every call on the image-to-video route — and that route accepts only `ltx`, `kling`, and `minimax`. `kling-turbo` and `veo3` are text-to-video only; pairing either with an `imageUrl` is a 400 `invalid_model`, not a silent downgrade.
|
|
50
50
|
|
|
51
|
-
| Model | i2v? |
|
|
52
|
-
|
|
53
|
-
| `ltx` | yes |
|
|
54
|
-
| `kling` | yes |
|
|
55
|
-
| `minimax` | yes |
|
|
56
|
-
| `kling-turbo` | **no** |
|
|
57
|
-
| `veo3` | **no** |
|
|
51
|
+
| Model | i2v? | Speed | When |
|
|
52
|
+
|---|---|---|---|
|
|
53
|
+
| `ltx` | yes | ~30s | Default. Use this. |
|
|
54
|
+
| `kling` | yes | 2-4 min | Only if the loop is the centerpiece of a premium splash and quality is visibly lacking on `ltx` |
|
|
55
|
+
| `minimax` | yes | 2-3 min | Stylized / anime aesthetic loops |
|
|
56
|
+
| `kling-turbo` | **no** | 1-2 min | Not reachable from this skill — text-to-video only |
|
|
57
|
+
| `veo3` | **no** | 3-5 min | Not reachable from this skill, and pointless for ambient loops anyway |
|
|
58
58
|
|
|
59
59
|
### 3. Lock the look with a reference still
|
|
60
60
|
|
|
@@ -69,7 +69,7 @@ summer_generate_image(
|
|
|
69
69
|
|
|
70
70
|
`summer_generate_image` has no size or aspect argument — `options.image_size` is dropped without an error and every MCP image comes back at the server's 1:1 default. Ask for the framing in the prompt, or generate the reference in the Summer dashboard (which exposes aspect ratio) and pass its URL.
|
|
71
71
|
|
|
72
|
-
|
|
72
|
+
On the image-to-video route `aspectRatio` is **not applied at all** — the clip inherits the reference image's framing. So a vertical mobile splash needs a 9:16 reference image, and setting `aspectRatio="9:16"` on the video call does nothing.
|
|
73
73
|
|
|
74
74
|
### 4. Prompt for loopable motion only
|
|
75
75
|
|
|
@@ -89,7 +89,7 @@ summer_generate_video(
|
|
|
89
89
|
)
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
-
The phrase **"looping, seamless"** in the prompt biases the model toward stable first/last frames. `options.negative_prompt` is one of the few provider keys that does pass through on the video route (`prompt`, `image_url`, `num_frames`, `duration`, `resolution`, and `model` are stripped; everything else is forwarded), so the negative
|
|
92
|
+
The phrase **"looping, seamless"** in the prompt biases the model toward stable first/last frames. `options.negative_prompt` is one of the few provider keys that does pass through on the video route (`prompt`, `image_url`, `num_frames`, `duration`, `resolution`, and `model` are stripped; everything else is forwarded), so the negative prompt does rule out narrative drift here — unlike on `summer_generate_image`, where no such argument exists.
|
|
93
93
|
|
|
94
94
|
`aspectRatio` is omitted deliberately: it is applied on the text-to-video path only, and this call passes `imageUrl`.
|
|
95
95
|
|
|
@@ -115,7 +115,7 @@ VideoStream exts: ["ogv", "tres", "res"]
|
|
|
115
115
|
ERROR: No loader found for resource: res://clip.mp4 (expected type: unknown)
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
`summer_import_from_url` downloads the bytes, runs
|
|
118
|
+
`summer_import_from_url` downloads the bytes, runs the engine's import pipeline, and *fails the import* if the file never becomes a loadable resource — so importing the `.mp4` does not quietly half-work, it is rejected and rolled back. Convert first:
|
|
119
119
|
|
|
120
120
|
```
|
|
121
121
|
ffmpeg -i title_screen_bg.mp4 -c:v libtheora -q:v 8 -an title_screen_bg.ogv
|
|
@@ -137,7 +137,7 @@ summer_set_prop(scenePath="res://ui/title_screen.tscn", path="./BackgroundLoop",
|
|
|
137
137
|
summer_save_scene(scenePath="res://ui/title_screen.tscn")
|
|
138
138
|
```
|
|
139
139
|
|
|
140
|
-
Anchors preset 15 is "full rect" — the loop fills the menu. Place the logo and menu buttons as children *above* the `VideoStreamPlayer` in the tree (
|
|
140
|
+
Anchors preset 15 is "full rect" — the loop fills the menu. Place the logo and menu buttons as children *above* the `VideoStreamPlayer` in the tree (Controls draw in tree order; later siblings render on top).
|
|
141
141
|
|
|
142
142
|
### 7. Mute the audio track
|
|
143
143
|
|
|
@@ -147,22 +147,22 @@ Loops should never have a baked audio track that loops with them — the audio s
|
|
|
147
147
|
summer_set_prop(scenePath="res://ui/title_screen.tscn", path="./BackgroundLoop", key="volume_db", value=-80)
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
Score the menu separately with `
|
|
150
|
+
Score the menu separately with `music-track`.
|
|
151
151
|
|
|
152
152
|
## Reference card — prompts that work
|
|
153
153
|
|
|
154
154
|
Pattern: `<subject> + <ambient loopable motion> + <constant lighting> + "looping, seamless" + <stylistic anchor>`. Keep under 40 words. Always pair with `imageUrl`.
|
|
155
155
|
|
|
156
|
-
| Goal | Model | Prompt |
|
|
157
|
-
|
|
158
|
-
| Title menu — fog forest | `ltx` | `dense pine forest in low fog, fog drifting slowly between trunks, soft moonlight, ambient particles rising, looping, seamless, cinematic painterly` |
|
|
159
|
-
| Title menu — dungeon torch | `ltx` | `stone dungeon corridor lit by a single torch, flame flickering steadily, dust motes drifting in the light cone, looping, seamless` |
|
|
160
|
-
| Splash — embers / sky | `ltx` | `dusk sky with slow drifting embers rising upward across frame, deep blue gradient, looping, seamless, cinematic` |
|
|
161
|
-
| Logo backdrop — magic runes | `ltx` | `dark surface with glowing blue runes pulsing softly in slow rhythm, faint shimmer, no narrative motion, looping, seamless` |
|
|
162
|
-
| Menu — underwater | `ltx` | `underwater scene with caustic light dancing on a sandy floor, slow drifting bubbles, gentle current sway on kelp, looping, seamless` |
|
|
163
|
-
| Pause screen — slow rain | `ltx` | `window pane with continuous gentle rain drops, blurred warm interior glow behind, looping, seamless, ambient` |
|
|
164
|
-
| Title — anime sky | `minimax` | `anime style cumulus clouds drifting slowly across a pastel sunset sky, soft, painterly, looping, seamless, Ghibli` |
|
|
165
|
-
| Premium splash centerpiece | `kling` | `dragon silhouette breathing in profile against a vast sunset sky, only the chest rising and falling and clouds drifting, looping, seamless` |
|
|
156
|
+
| Goal | Model | Prompt | Duration |
|
|
157
|
+
|---|---|---|---|
|
|
158
|
+
| Title menu — fog forest | `ltx` | `dense pine forest in low fog, fog drifting slowly between trunks, soft moonlight, ambient particles rising, looping, seamless, cinematic painterly` | 5s |
|
|
159
|
+
| Title menu — dungeon torch | `ltx` | `stone dungeon corridor lit by a single torch, flame flickering steadily, dust motes drifting in the light cone, looping, seamless` | 5s |
|
|
160
|
+
| Splash — embers / sky | `ltx` | `dusk sky with slow drifting embers rising upward across frame, deep blue gradient, looping, seamless, cinematic` | 5s |
|
|
161
|
+
| Logo backdrop — magic runes | `ltx` | `dark surface with glowing blue runes pulsing softly in slow rhythm, faint shimmer, no narrative motion, looping, seamless` | 5s |
|
|
162
|
+
| Menu — underwater | `ltx` | `underwater scene with caustic light dancing on a sandy floor, slow drifting bubbles, gentle current sway on kelp, looping, seamless` | 5s |
|
|
163
|
+
| Pause screen — slow rain | `ltx` | `window pane with continuous gentle rain drops, blurred warm interior glow behind, looping, seamless, ambient` | 5s |
|
|
164
|
+
| Title — anime sky | `minimax` | `anime style cumulus clouds drifting slowly across a pastel sunset sky, soft, painterly, looping, seamless, Ghibli` | 5s |
|
|
165
|
+
| Premium splash centerpiece | `kling` | `dragon silhouette breathing in profile against a vast sunset sky, only the chest rising and falling and clouds drifting, looping, seamless` | 5s |
|
|
166
166
|
|
|
167
167
|
### Bad prompts and why
|
|
168
168
|
|
|
@@ -178,7 +178,7 @@ Pattern: `<subject> + <ambient loopable motion> + <constant lighting> + "looping
|
|
|
178
178
|
|
|
179
179
|
- **Asking the model for a 10s loop.** Past ~6s, identity drifts and the seam shows. `duration=5` is both the floor and the right answer; 10 is the only other value the API accepts.
|
|
180
180
|
- **Treating `summer_generate_video` as synchronous.** It returns `{ queued: true, jobId }` and no URL. Poll `summer_check_job` before claiming a clip exists.
|
|
181
|
-
- **
|
|
181
|
+
- **Using `kling` for a loop.** `ltx` is almost always right; short ambient motion is what it does best.
|
|
182
182
|
- **Prompting narrative motion.** "Hero draws sword" doesn't loop. Use ambient verbs.
|
|
183
183
|
- **Forgetting `loop=true` on the `VideoStreamPlayer`.** The clip will play once and freeze on the last frame.
|
|
184
184
|
- **Forgetting to mute baked audio.** If audio is on, the loop point becomes audible even if it's invisible.
|
|
@@ -188,17 +188,17 @@ Pattern: `<subject> + <ambient loopable motion> + <constant lighting> + "looping
|
|
|
188
188
|
## Edge cases
|
|
189
189
|
|
|
190
190
|
- **Splash loop must be tiny in build size.** Loops compress aggressively because of low motion. Target ≤2MB by exporting at 720p, low bitrate, in DaVinci. Studio's import doesn't re-encode by default.
|
|
191
|
-
- **Mobile portrait splash.** The reference image must
|
|
191
|
+
- **Mobile portrait splash.** The reference image must be portrait — `aspectRatio` is ignored on the image-to-video path, and MCP image generation is square-only, so make the reference in the Summer dashboard or crop it. Anchors preset 15 still works.
|
|
192
192
|
- **Loop must sync to a music beat.** The video model doesn't know your BPM. Generate at the duration matching one bar at the menu music tempo (e.g. 120 BPM × 4 beats = 2s, or 8 beats = 4s) and confirm visually.
|
|
193
193
|
- **Loop is behind translucent UI.** Generate with extra contrast headroom — the model tends toward mid-grey, and translucent UI on mid-grey reads muddy. Push for `high contrast cinematic` in the prompt.
|
|
194
194
|
- **Loop seam still visible after 3 regens.** Set up two `VideoStreamPlayer` siblings and crossfade between them with a `Tween` on a 0.5s overlap. Costs an extra GPU decode but hides the seam.
|
|
195
195
|
|
|
196
196
|
## Fallback (no MCP)
|
|
197
197
|
|
|
198
|
-
If the
|
|
198
|
+
If the MCP server isn't running, route the user to the Summer dashboard:
|
|
199
199
|
|
|
200
200
|
1. Image tab → generate the reference still (the loop's "neutral frame").
|
|
201
|
-
2. Video tab → image-to-video with `ltx`, duration
|
|
201
|
+
2. Video tab → image-to-video with `ltx`, duration 5s, aspect ratio per target.
|
|
202
202
|
3. Prompt with the loopable-motion vocabulary above and `"looping, seamless"`.
|
|
203
203
|
4. Download the result, transcode to `.ogv` if needed, place under `assets/video/loops/`.
|
|
204
204
|
|
|
@@ -209,16 +209,16 @@ Print the exact prompt + model + duration + aspect ratio so the user can paste i
|
|
|
209
209
|
Once the loop is wired:
|
|
210
210
|
|
|
211
211
|
> Loop `title_screen_bg` is wired to `TitleScreen/BackgroundLoop` with autoplay + loop. Next:
|
|
212
|
-
> - Score the menu with `
|
|
213
|
-
> - For the logo and menu UI on top, hand off to `
|
|
214
|
-
> - If the user wants a punchy 5s shot for the trailer using the same look, hand off to `
|
|
215
|
-
> - If the user wants a narrative intro that plays *before* the title loops, hand off to `
|
|
212
|
+
> - Score the menu with `music-track` — a quiet ambient bed scored to the loop's mood.
|
|
213
|
+
> - For the logo and menu UI on top, hand off to `ui-graphics`.
|
|
214
|
+
> - If the user wants a punchy 5s shot for the trailer using the same look, hand off to `trailer-shot` (reuse the reference image).
|
|
215
|
+
> - If the user wants a narrative intro that plays *before* the title loops, hand off to `cinematic-cutscene`.
|
|
216
216
|
|
|
217
217
|
## See also
|
|
218
218
|
|
|
219
|
-
- `
|
|
220
|
-
- `
|
|
221
|
-
- `
|
|
222
|
-
- `
|
|
223
|
-
- `
|
|
219
|
+
- `trailer-shot` — punchy marketing footage.
|
|
220
|
+
- `cinematic-cutscene` — narrative cutscenes with dialogue.
|
|
221
|
+
- `music-track` — score the menu.
|
|
222
|
+
- `ui-graphics` — logo, menu buttons, HUD that sits over the loop.
|
|
223
|
+
- `concept-art` — produce the reference still that anchors the loop.
|
|
224
224
|
- `../../references/mcp-tools-reference/mcp-tools-reference.md` — `summer_generate_video` parameter schema and error codes.
|
|
@@ -11,18 +11,18 @@ paths: ["**/*.gd", "**/*.tscn", "**/*.tres"]
|
|
|
11
11
|
|
|
12
12
|
# AnimationTree — Wire Clips Into Behavior
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
This skill generates nothing. It composes existing clips on an `AnimationPlayer` into an `AnimationTree` with a `StateMachine` for distinct states (idle / attack / hit / dead) and `BlendSpace` nodes for continuous parameters (walk-run blend by speed). Wired wrong, you get T-poses, snapping, or clips that cut each other off.
|
|
15
15
|
|
|
16
16
|
The canonical Summer Engine stack:
|
|
17
17
|
|
|
18
18
|
```
|
|
19
19
|
Character (CharacterBody3D)
|
|
20
|
-
├── Skeleton3D (from the
|
|
20
|
+
├── Skeleton3D (from the rigged GLB)
|
|
21
21
|
├── AnimationPlayer # holds the raw clips (idle, walk, run, attack_sword, ...)
|
|
22
22
|
└── AnimationTree # references AnimationPlayer, drives behavior
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Before adding the tree, prove direct `AnimationPlayer.play()` visibly moves the rig.
|
|
25
|
+
Before adding the tree, prove direct `AnimationPlayer.play()` visibly moves the rig. The engine may import animation GLBs as `AnimationLibrary` resources or as `PackedScene`s with embedded `AnimationPlayer`s. If a copied clip appears in the list but the mesh T-poses, its tracks probably target a different root/skeleton path. Use the embedded player that came with the matching GLB, or remap/copy tracks only after confirming they target the active `Skeleton3D`. An inactive AnimationTree is also a no-op, so always set `AnimationTree.active = true`.
|
|
26
26
|
|
|
27
27
|
## When to use this skill
|
|
28
28
|
|
|
@@ -72,7 +72,7 @@ Before walking the CRUD steps below, check the ctx lane — one `summer_run_scri
|
|
|
72
72
|
- **Animation-tier engines:** `ctx.anim_state_machine(character, {states: {...}, transitions: [[from, to, {blend_s: 0.2}], ...], start: "idle"})` gets-or-creates the AnimationTree, wires it to the player, builds the state machine, sets `active = true`. Unknown clip names come back as a report entry listing the player's REAL clips — never wire against guessed names. Full recipe (inspect clips/bones first, method-track events, root motion, playtest verification): `character-animation-wiring`.
|
|
73
73
|
- **Any engine (raw fallback):** the same classes are fully script-bound — `AnimationNodeStateMachine.add_node(name, AnimationNodeAnimation)`, `add_transition(from, to, AnimationNodeStateMachineTransition)` (one transition resource each, `xfade_time` on it), then `tree.anim_player = tree.get_path_to(player)`, `tree.tree_root = sm`, `tree.active = true`, and `ctx.set_owner_recursive(tree)`. The raw script is quoted in `character-animation-wiring`.
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
Scope: `anim_state_machine` builds clip states + transitions only. The canonical machine below — BlendSpace1D locomotion, OneShot attack/hit — still needs the `.tres` (or raw-script) lane for those node types. Discrete idle/walk/run backbones don't.
|
|
76
76
|
|
|
77
77
|
## Steps via MCP
|
|
78
78
|
|
|
@@ -259,7 +259,7 @@ Then `summer_play` and watch — the goblin should idle in place, blend up to wa
|
|
|
259
259
|
|
|
260
260
|
- **OneShot:** the action is a *temporary override* of an underlying state (attack while running, hit-react while attacking). The base keeps playing.
|
|
261
261
|
- **StateMachine state:** the action is a *replacement* (dead, stunned, ragdoll). Nothing else plays.
|
|
262
|
-
-
|
|
262
|
+
- Action combat is usually OneShot for attacks + a StateMachine state for "dead". Don't model attacks as StateMachine states unless you need precise transition control between attack-string variants.
|
|
263
263
|
|
|
264
264
|
### BlendSpace1D vs BlendSpace2D
|
|
265
265
|
|
|
@@ -270,7 +270,7 @@ Then `summer_play` and watch — the goblin should idle in place, blend up to wa
|
|
|
270
270
|
|
|
271
271
|
- Skipping AnimationTree and calling `AnimationPlayer.play("walk")` from script. Works for one clip; breaks the moment you need a crossfade.
|
|
272
272
|
- Modeling every attack as a StateMachine state. The transition matrix explodes (N states × N transitions). Use one OneShot per attack and switch its inner clip via `parameters/Attack/animation`.
|
|
273
|
-
- Writing the `.tres` by hand without using sub_resource IDs —
|
|
273
|
+
- Writing the `.tres` by hand without using sub_resource IDs — the engine loses the references. Always use `[sub_resource id="..."]` blocks.
|
|
274
274
|
- Driving `blend_position` from raw input (`Input.get_axis(...)`). Drive from actual velocity — that way the blend matches the body's real motion, including knockback and slope-slide.
|
|
275
275
|
|
|
276
276
|
## Edge cases
|
|
@@ -13,7 +13,7 @@ paths: [".summer/**", "project.godot", "**/*.tscn"]
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
A consistent art direction
|
|
16
|
+
A consistent art direction makes a low-budget game look finished. Solo developers most often lose it by mixing styles — a toon-shaded character on a photoreal terrain, a pixel UI over a smooth 3D world. This skill builds an art bible the rest of the project obeys: references, palette, mood, lighting plan, post-processing, and a do/don't list. It writes to `.summer/art-bible.md` — the file every rendering / shader / lighting / VFX skill reads later.
|
|
17
17
|
|
|
18
18
|
**Core principle:** Constraint produces style. A game with **15 colors total** looks more intentional than a game with infinite-color textures. Pick the constraint, then defend it.
|
|
19
19
|
|
|
@@ -118,7 +118,7 @@ State the plan in one block. For the current Summer Engine rendering stack:
|
|
|
118
118
|
```
|
|
119
119
|
Sun: DirectionalLight3D, color #fff2d9, energy 0.9, angle ~30° (warm low-angle)
|
|
120
120
|
Sky: ProceduralSkyMaterial, sky_top_color #6b88a3, sky_horizon_color #d8b88e
|
|
121
|
-
Ambient:
|
|
121
|
+
Ambient: Environment ambient_light_color #4a5570, ambient_light_energy 0.15
|
|
122
122
|
Indoor fills: OmniLight3D color #ffd9a8, energy 0.6, range 4m
|
|
123
123
|
NEVER: pure-white DirectionalLight, no ambient, hard cube shadows
|
|
124
124
|
```
|
|
@@ -138,7 +138,7 @@ Summer Engine post stack: Glow, SDFGI, SSAO, SSR, Adjustments, Color Correction
|
|
|
138
138
|
|
|
139
139
|
```
|
|
140
140
|
Glow: ON, threshold 0.9, intensity 0.5 (soft bloom on highlights only)
|
|
141
|
-
SDFGI: OFF for vertical-slice scope (perf cost; bake
|
|
141
|
+
SDFGI: OFF for vertical-slice scope (perf cost; bake lightmaps later)
|
|
142
142
|
SSAO: ON, light_affect 0.3 (just enough for grounding)
|
|
143
143
|
SSR: OFF unless we have wet/glass surfaces
|
|
144
144
|
Color correction: Filmic tonemap, slight S-curve LUT toward warm
|
|
@@ -159,7 +159,7 @@ This is the contract. Five do's, five don'ts. Specific, enforceable.
|
|
|
159
159
|
- Outline shader on character + interactable props (no outline on environment).
|
|
160
160
|
- Soft shadows (DirectionalLight3D shadow_blur 1.5).
|
|
161
161
|
- Warm key + cool fill — never both warm or both cool.
|
|
162
|
-
- Texture filter:
|
|
162
|
+
- Texture filter: Nearest for a crunchy, near-pixel feel.
|
|
163
163
|
|
|
164
164
|
## DON'T
|
|
165
165
|
- No pure white (#ffffff). Use #f4ecdf.
|
|
@@ -176,7 +176,7 @@ Some art-direction calls translate to `project.godot` settings. Apply them.
|
|
|
176
176
|
**Preferred (Summer MCP):**
|
|
177
177
|
|
|
178
178
|
```
|
|
179
|
-
summer_project_setting(key="rendering/textures/canvas_textures/default_texture_filter", value="
|
|
179
|
+
summer_project_setting(key="rendering/textures/canvas_textures/default_texture_filter", value="0") # Nearest, if pixel-art-ish (1 = Linear, the default)
|
|
180
180
|
summer_project_setting(key="rendering/environment/defaults/default_clear_color", value="Color(0.227, 0.290, 0.227)") # palette primary
|
|
181
181
|
summer_project_setting(key="rendering/anti_aliasing/quality/msaa_3d", value="2") # MSAA 2x for clean edges
|
|
182
182
|
```
|
|
@@ -274,9 +274,6 @@ No template — this is a workflow that produces the bible the rest of the proje
|
|
|
274
274
|
|
|
275
275
|
## See also
|
|
276
276
|
|
|
277
|
-
- `
|
|
278
|
-
- `audio
|
|
279
|
-
- `
|
|
280
|
-
- `shaders/shader-basics/SKILL.md` — for outline / toon shaders
|
|
281
|
-
- `post-processing/bloom-and-glow/SKILL.md` — implements the glow rule
|
|
282
|
-
- `post-processing/color-grading/SKILL.md` — implements the LUT and tonemap call
|
|
277
|
+
- `brainstorm-game` — produces the brief that anchors the bible
|
|
278
|
+
- `audio-direction` — the sonic counterpart
|
|
279
|
+
- `3d-lighting` — implements the lighting plan and the environment's glow, tonemap and SSAO settings
|
|
@@ -34,7 +34,7 @@ Ask the **exact phrase** before dispatching. Skipping the question is the most c
|
|
|
34
34
|
| Concept art vs character portrait | "Quick check — exploring the look (3-4 variants for art direction) or generating a final character portrait for dialogue UI?" | `concept-art` (exploring) / `character-portrait` (final) |
|
|
35
35
|
| Prop vs character model | "Static object (sword, chair, lantern) or rigged character that needs animation?" | `prop-model` / `character-model` |
|
|
36
36
|
| Tile vs sprite sheet | "One seamless tile that repeats, or a frame grid for an animated sprite?" | `tileable-texture` / `sprite-sheet` |
|
|
37
|
-
| SFX vs music | "One-shot effect or a longer track (loop, theme, ambient bed)?" | `sound-effect` / `music-track` (or `
|
|
37
|
+
| SFX vs music | "One-shot effect or a longer track (loop, theme, ambient bed)?" | `sound-effect` / `music-track` (or `ambient-bed`) |
|
|
38
38
|
| Generate vs retarget motion | "Generate a new clip on this character, or apply an existing library to a new character?" | `generate-motion` / `retarget` |
|
|
39
39
|
| VFX recipe vs game-feel | "Particle/shader effect in the world or screen-feel (camera shake, hit-stop)?" | `vfx-<name>` / `game-feel` |
|
|
40
40
|
|
|
@@ -61,7 +61,7 @@ Invoke the specialist via the `Skill` tool. Don't paraphrase — let it run. Pas
|
|
|
61
61
|
| Request | Skill |
|
|
62
62
|
|---|---|
|
|
63
63
|
| Sword / chair / barrel / static object | `prop-model` |
|
|
64
|
-
| Player / NPC / enemy / boss / rigged humanoid | `character-model` (
|
|
64
|
+
| Player / NPC / enemy / boss / rigged humanoid | `character-model` (generated mesh + auto-rig) |
|
|
65
65
|
| Modular dungeon / building blocks | `environment-kit` |
|
|
66
66
|
| Car / spaceship / hard-surface vehicle | `vehicle-model` |
|
|
67
67
|
| Tree / rock / mushroom / foliage | `organic-model` |
|
|
@@ -132,4 +132,4 @@ VFX is **code, not generative** — recipes are shader + GDScript + node setup,
|
|
|
132
132
|
|
|
133
133
|
## Fallback (no MCP)
|
|
134
134
|
|
|
135
|
-
The router still works without MCP — classification is text-only. It hands off to the specialist, which surfaces its own no-MCP fallback (typically: run the
|
|
135
|
+
The router still works without MCP — classification is text-only. It hands off to the specialist, which surfaces its own no-MCP fallback (typically: run the same generation in the Summer dashboard, then `summer_import_from_url` once MCP is back).
|
|
@@ -13,7 +13,7 @@ paths: [".summer/**", "project.godot", "**/*.tscn", "audio/**"]
|
|
|
13
13
|
|
|
14
14
|
## Overview
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Many indie games sound like one sound library used flat: the same generic "swoosh" for menu, jump, pickup and hit. This skill builds an audio bible that names the music style, the SFX vocabulary, the dynamic music plan, and the spatial / mix rules. Writes to `.summer/audio-bible.md` and configures the audio bus layout in the project so the rest of the work has a real foundation.
|
|
17
17
|
|
|
18
18
|
**Core principle:** SFX needs a *vocabulary*, not a *library*. Eight named SFX classes with consistent character beat 80 random library hits.
|
|
19
19
|
|
|
@@ -25,7 +25,7 @@ Ask exactly this:
|
|
|
25
25
|
|
|
26
26
|
> Three reference tracks, games, or films for the music. What instruments matter? And what's the SFX vibe — chunky, clean, synthetic, or organic?
|
|
27
27
|
|
|
28
|
-
Three is the minimum. One or two collapses into a clone.
|
|
28
|
+
Three is the minimum. One or two collapses into a clone.
|
|
29
29
|
|
|
30
30
|
If they freeze, offer four axes (not titles):
|
|
31
31
|
|
|
@@ -237,9 +237,9 @@ End with:
|
|
|
237
237
|
| Music louder than SFX | Players need SFX for gameplay; music is mood. Default mix is -8 dB music vs 0 dB SFX. |
|
|
238
238
|
| No reverb buses | "Send" architecture (rooms route to a small/large/outdoor reverb bus) is mandatory or your mix sounds dry-then-wet inconsistently. |
|
|
239
239
|
| Pure sine "ding" for pickup | Reads as cheap mobile game. Use a major-third interval with character. |
|
|
240
|
-
| Same footstep sample for all surfaces |
|
|
240
|
+
| Same footstep sample for all surfaces | Players hear footsteps constantly; material-aware steps carry much of the perceived audio quality. |
|
|
241
241
|
| No master ceiling / true peak | Audio clips on console builds without `-1 dBTP` ceiling. Always set it. |
|
|
242
|
-
| Assuming SetResourceProperty fails silently on inline sub_resources | It does not — inline targets work, and the structural failures (`node not found`, `property is not a resource`, `resource is null`) are explicit errors. What *is* silent on current engines is a bad value shape: a JSON object instead of
|
|
242
|
+
| Assuming SetResourceProperty fails silently on inline sub_resources | It does not — inline targets work, and the structural failures (`node not found`, `property is not a resource`, `resource is null`) are explicit errors. What *is* silent on current engines is a bad value shape: a JSON object instead of an engine literal string, a misspelled `subProperty`, or a wrong-typed value returns `ok:true` yet no-ops or coerces destructively. Pass class names and literal strings, and confirm in the saved `.tres`/`.tscn`, never from `ok` alone. See `../../references/mcp-tools-reference/mcp-tools-reference.md`. |
|
|
243
243
|
|
|
244
244
|
## Collaborative protocol
|
|
245
245
|
|
|
@@ -255,9 +255,7 @@ No template — this is a workflow that produces the bible the rest of the proje
|
|
|
255
255
|
- `../../references/godot-version/godot-version.md` — Summer compatibility and
|
|
256
256
|
version-sensitive audio API notes
|
|
257
257
|
- `../../references/mcp-tools-reference/mcp-tools-reference.md`
|
|
258
|
-
- `
|
|
259
|
-
- `
|
|
260
|
-
- `
|
|
261
|
-
- `
|
|
262
|
-
- `audio/footstep-systems/SKILL.md` (NEXT) — material-aware footstep impl
|
|
263
|
-
- `audio/dynamic-music-stingers/SKILL.md` (LATER) — implements the dynamic music plan
|
|
258
|
+
- `brainstorm-game` — produces the brief that anchors the bible
|
|
259
|
+
- `art-direction` — the visual counterpart; audio must rhyme with it
|
|
260
|
+
- `adaptive-music` — implements the dynamic music plan
|
|
261
|
+
- `sound-effect`, `music-track`, `ambient-bed`, `voice-line` — generate the audio the bible describes
|
|
@@ -172,10 +172,11 @@ Use `summer_get_diagnostics` to confirm no new errors.
|
|
|
172
172
|
`summer_inspect_node` will **not** show you `pending_damage` mid-fight. It reads
|
|
173
173
|
the edited scene in the editor — the response even tags itself
|
|
174
174
|
`provenance: editor_scene` — so it reports the saved node, not the live
|
|
175
|
-
instance. Runtime values need a runtime
|
|
175
|
+
instance. Runtime values need a runtime read: with the game running, read
|
|
176
|
+
the enemy with `summer_inspect_runtime_node` or `summer_game_probe` (engine
|
|
177
|
+
builds with the runtime-control ops; see the `agent-playtesting` skill).
|
|
176
178
|
|
|
177
|
-
|
|
178
|
-
`summer_batch`. It spins up a hidden, disposable game instance that runs a
|
|
179
|
+
On any build, the `RunVerification` op, sent through `summer_batch`, also works. It spins up a hidden, disposable game instance that runs a
|
|
179
180
|
GDScript probe and exits; it never touches the editor:
|
|
180
181
|
|
|
181
182
|
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bounded-engine-runs
|
|
3
|
+
description: "Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes."
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: [Cursor, Claude Code, Windsurf, Codex]
|
|
6
|
+
category: workflow
|
|
7
|
+
user-invocable: true
|
|
8
|
+
allowed-tools: Read Grep Glob Edit Write Bash
|
|
9
|
+
paths: ["project.godot", "tests/**/*.gd", "tools/**/*.gd"]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Bounded engine runs for agents
|
|
13
|
+
|
|
14
|
+
Agents verify games by running the engine many times: imports, tests, captures, multiplayer bots. A run
|
|
15
|
+
that hangs, overlaps another, makes noise or hides an error costs time. These rules keep runs safe when
|
|
16
|
+
several agents share one project on one machine.
|
|
17
|
+
|
|
18
|
+
## 1. Every run is bounded, muted and alone
|
|
19
|
+
|
|
20
|
+
- **Bound it.** macOS has no `timeout`. Wrap runs so the engine itself gets killed:
|
|
21
|
+
```sh
|
|
22
|
+
perl -e 'alarm shift; exec @ARGV' 180 <summer> --headless --path . -s res://tests/run_tests.gd
|
|
23
|
+
```
|
|
24
|
+
`alarm` survives `exec`; exit code 142 means the limit hit.
|
|
25
|
+
- **One engine per project at a time.** Two engines writing the same `.godot/` import cache corrupt it or
|
|
26
|
+
freeze each other's captures. Serialize with a lock file held by the engine process:
|
|
27
|
+
```sh
|
|
28
|
+
perl -e 'use Fcntl qw(:flock); $^F=255; open(my $l,">>",shift) or die; flock($l,LOCK_EX); alarm shift; exec @ARGV' \
|
|
29
|
+
<project>/.engine.lock 180 <summer> ...
|
|
30
|
+
```
|
|
31
|
+
Put this in one wrapper script and make every agent use it.
|
|
32
|
+
- **Cap its memory.** A time limit does not stop a run from eating all memory first; several engine runs plus a
|
|
33
|
+
browser loading a large web export can exhaust memory and crash the machine. The wrapper should run the command as a child, sum the resident
|
|
34
|
+
memory of its whole process tree (browsers spawn GPU/renderer helpers), kill the tree past a cap (e.g.
|
|
35
|
+
3 GB), and also stop when system free memory falls low (`sysctl -n kern.memorystatus_level` < 15 on macOS),
|
|
36
|
+
because GPU memory on Apple Silicon is system memory but is not counted in RSS. Refuse to start when the
|
|
37
|
+
system is already short (< 35).
|
|
38
|
+
- **Mute it.** `--audio-driver Dummy`.
|
|
39
|
+
- **Render only when you must, and offscreen.** `--headless` for logic (no pixels). For visual checks use
|
|
40
|
+
`--summer-offscreen` with a fixed `--resolution` and a capture script that saves PNGs and quits. Visible
|
|
41
|
+
windows only when a human asked to watch.
|
|
42
|
+
|
|
43
|
+
## 2. Imports and parse errors
|
|
44
|
+
|
|
45
|
+
- New `class_name` scripts are unknown to `-s` scripts until an import pass registers them:
|
|
46
|
+
`<summer> --headless --audio-driver Dummy --path . --import`.
|
|
47
|
+
- The first import may rewrite `project.godot` (reorder keys, add a `[summer]` section; one trial saw a
|
|
48
|
+
hand-written `[rendering]` section dropped). Check `git diff project.godot` after it, and pass renderer
|
|
49
|
+
choices on the command line (`--rendering-method ...`) when a run depends on them.
|
|
50
|
+
- One broken `class_name` script cascades into "Could not parse global class" and dozens of unrelated
|
|
51
|
+
"cannot infer type" errors. Get the real line with:
|
|
52
|
+
`<summer> --headless --path . --check-only -s res://path/to/file.gd`
|
|
53
|
+
- Compile every script before booting the game: a tiny `SceneTree` script that `load()`s each `.gd` under
|
|
54
|
+
a folder and reports `can_instantiate()` failures, exit code = failures.
|
|
55
|
+
|
|
56
|
+
## 3. Tests that can't lie
|
|
57
|
+
|
|
58
|
+
- A runtime script error inside a test does not fail it by default; the test just stops and counts as
|
|
59
|
+
passed. Register a logger and fail the test when its error count rises:
|
|
60
|
+
```gdscript
|
|
61
|
+
class ErrorCounter extends Logger:
|
|
62
|
+
var script_errors := 0
|
|
63
|
+
func _log_error(_f: String, file: String, _line: int, _c: String, _r: String, _n: bool, type: int, _bt: Array[ScriptBacktrace]) -> void:
|
|
64
|
+
if type == Logger.ERROR_TYPE_SCRIPT or file.ends_with(".gd"):
|
|
65
|
+
script_errors += 1
|
|
66
|
+
func _log_message(_m: String, _e: bool) -> void:
|
|
67
|
+
pass
|
|
68
|
+
# in the runner: OS.add_logger(counter); compare counter.script_errors before and after each test
|
|
69
|
+
```
|
|
70
|
+
- Exit 0 is not success. Always grep the log for `SCRIPT ERROR`, `Parse Error` and `ERROR:`, and print
|
|
71
|
+
one explicit success line (`TESTS passed=N failed=0`) you can check for.
|
|
72
|
+
|
|
73
|
+
## 4. Typed GDScript traps agents hit repeatedly
|
|
74
|
+
|
|
75
|
+
- `var x := dict["k"]` cannot infer a type (Dictionary values are Variant). Write `var x: int = dict["k"]`.
|
|
76
|
+
- A loop variable that shadows an outer variable is a parse error that takes the whole class down.
|
|
77
|
+
- Don't name a class after an engine class (`SummerSession`); the error only says it "hides a native class".
|
|
78
|
+
|
|
79
|
+
## 5. Web exports on a dev machine
|
|
80
|
+
|
|
81
|
+
- Check the `.pck` size before opening it in a browser; the browser holds all of it in memory. A project that
|
|
82
|
+
exports every imported asset of a large scene can pass 250 MB. Ship only what the game uses first.
|
|
83
|
+
- Load it in a browser only under the same memory-capped wrapper, one at a time, never next to other engine runs.
|
|
84
|
+
|
|
85
|
+
## 6. Captures you can trust
|
|
86
|
+
|
|
87
|
+
- Read every PNG you produce. If several files are identical (`md5 -r *.png`), the run froze; rerun alone.
|
|
88
|
+
- Keep evidence outside the project (logs, PNGs) so imports never pick it up. If it must live inside, put an
|
|
89
|
+
empty `.gdignore` file in that folder so the editor and imports skip it.
|
|
90
|
+
|
|
91
|
+
## See also
|
|
92
|
+
|
|
93
|
+
- `headless-scripting` (writing the SceneTree scripts these runs execute)
|
|
94
|
+
- `multiplayer-testing` (Local Play bot runs)
|
|
95
|
+
- `compatibility-renderer-traps` (dual-renderer captures)
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
id: skill/bounded-engine-runs
|
|
2
|
+
kind: skill
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
summary: "Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes."
|
|
5
|
+
use_when:
|
|
6
|
+
- running the engine from a shell or agent for tests, imports, captures or bots
|
|
7
|
+
- several agents or processes share one project
|
|
8
|
+
- a run hangs, a capture freezes, or errors cascade across unrelated scripts
|
|
9
|
+
facets:
|
|
10
|
+
lifecycle:
|
|
11
|
+
- build
|
|
12
|
+
domains:
|
|
13
|
+
- agent-workflow
|
|
14
|
+
- headless
|
|
15
|
+
- verification
|
|
16
|
+
modalities:
|
|
17
|
+
- project
|
|
18
|
+
- scripts
|
|
19
|
+
compatibility:
|
|
20
|
+
engine: ">=4.6"
|
|
21
|
+
related:
|
|
22
|
+
skills:
|
|
23
|
+
- skill/headless-scripting
|
|
24
|
+
- skill/multiplayer-testing
|
|
25
|
+
- skill/compatibility-renderer-traps
|
|
26
|
+
source: official
|
|
27
|
+
license: MIT
|
|
28
|
+
status: preview
|
|
29
|
+
recommended: true
|
|
@@ -201,8 +201,8 @@ No template — this is a workflow that produces the brief that drives template
|
|
|
201
201
|
|
|
202
202
|
## See also
|
|
203
203
|
|
|
204
|
-
- `
|
|
205
|
-
- `
|
|
206
|
-
- `
|
|
207
|
-
- `audio
|
|
208
|
-
- `
|
|
204
|
+
- `design-mechanic` — design the core loop in detail
|
|
205
|
+
- `design-level` — sketch level 1
|
|
206
|
+
- `art-direction` — turn the one-phrase look into a full bible
|
|
207
|
+
- `audio-direction` — sonic identity
|
|
208
|
+
- `make-game` — scaffold the project once the brief is locked
|