summer-engine 3.3.0 → 3.4.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.
Files changed (68) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -2
  3. package/.codex-plugin/plugin.json +5 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  6. package/CHANGELOG.md +36 -0
  7. package/README.md +2 -1
  8. package/assets/api-docs.json.gz +0 -0
  9. package/dist/cli/commands/install.d.ts +10 -0
  10. package/dist/cli/commands/install.js +55 -10
  11. package/dist/cli/commands/tool.d.ts +7 -0
  12. package/dist/cli/commands/tool.js +36 -1
  13. package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
  14. package/dist/core/capabilities/capture-gameplay.js +283 -0
  15. package/dist/core/capabilities/creator.js +1 -1
  16. package/dist/core/capabilities/doctor.d.ts +9 -1
  17. package/dist/core/capabilities/doctor.js +47 -4
  18. package/dist/core/capabilities/engine-run.d.ts +4 -0
  19. package/dist/core/capabilities/engine-run.js +33 -5
  20. package/dist/core/capabilities/export-engine-version.d.ts +15 -0
  21. package/dist/core/capabilities/export-engine-version.js +24 -0
  22. package/dist/core/capabilities/export-game.d.ts +9 -1
  23. package/dist/core/capabilities/export-game.js +112 -36
  24. package/dist/core/capabilities/image-generation.d.ts +9 -0
  25. package/dist/core/capabilities/image-generation.js +19 -1
  26. package/dist/core/capabilities/publish-build.d.ts +14 -1
  27. package/dist/core/capabilities/publish-build.js +74 -22
  28. package/dist/core/capabilities/tool-dispatch.js +10 -0
  29. package/dist/core/config.js +2 -2
  30. package/dist/core/engine-install.d.ts +16 -0
  31. package/dist/core/engine-install.js +32 -2
  32. package/dist/core/hosted-mcp.d.ts +115 -0
  33. package/dist/core/hosted-mcp.js +164 -0
  34. package/dist/core/launch-posture.d.ts +3 -0
  35. package/dist/core/launch-posture.js +15 -2
  36. package/dist/mcp/hosted-mount.d.ts +13 -59
  37. package/dist/mcp/hosted-mount.js +24 -30
  38. package/dist/mcp/server.js +3 -2
  39. package/dist/mcp/tools/creator-tools.js +13 -3
  40. package/dist/mcp/tools/generate-tools.js +12 -2
  41. package/gemini-extension.json +3 -1
  42. package/library/references/mcp-tools-reference/mcp-tools-reference.md +3 -2
  43. package/library/skills/README.md +6 -4
  44. package/library/skills/bounded-engine-runs/SKILL.md +96 -0
  45. package/library/skills/bounded-engine-runs/resource.yaml +29 -0
  46. package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
  47. package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
  48. package/library/skills/concept-art/SKILL.md +2 -2
  49. package/library/skills/export-and-ship/SKILL.md +2 -0
  50. package/library/skills/headless-scripting/resource.yaml +1 -0
  51. package/library/skills/in-game-purchases/SKILL.md +123 -118
  52. package/library/skills/in-game-purchases/resource.yaml +2 -2
  53. package/library/skills/web-compatibility-look/resource.yaml +1 -0
  54. package/library/tools/capture-gameplay/resource.yaml +73 -0
  55. package/library/tools/generate-image/resource.yaml +15 -1
  56. package/library/tools/publish-build/resource.yaml +1 -1
  57. package/package.json +1 -1
  58. package/registry/generated/aliases.json +1 -0
  59. package/registry/generated/counts.json +3 -3
  60. package/registry/generated/gemini-extension.json +3 -1
  61. package/registry/generated/index.json +125 -12
  62. package/registry/generated/marketplace.claude.json +2 -2
  63. package/registry/generated/plugin.claude.json +4 -2
  64. package/registry/generated/plugin.codex.json +5 -3
  65. package/registry/generated/plugin.cursor.json +4 -2
  66. package/registry/generated/plugin.factory.json +4 -2
  67. package/registry/generated/skills-index.md +6 -4
  68. package/registry/generated/skills-registry.json +28 -1
@@ -17,7 +17,7 @@
17
17
 
18
18
  **Rule of thumb:** project reads/writes go through Summer; live hierarchy/inspector changes use scene tools; process-level work remains with the host.
19
19
 
20
- ## Tool surface (104 tools)
20
+ ## Tool surface (105 tools)
21
21
 
22
22
  ### Project files (4)
23
23
 
@@ -237,7 +237,7 @@ Preview. One fast, read-only call that walks every node of a 3D scene and lists
237
237
  | `summer_get_project_context` | Project, scene, and `.summer` memory summary — call at start of session. Binds the session to the open project and surfaces a `capabilitySkewWarning` when the engine build and CLI have drifted; tools whose op the engine provably lacks return a structured `engine_lacks_op` result instead of running. Compact by default (a few KB: `sceneSummary`, scalar `health` with capability counts); `include:['scene_tree','capabilities','settings']` adds the heavy blocks, `omitted` says how. |
238
238
  | `summer_get_agent_playbook` | Daily operating contract (observe-first loop, content routing, invariants, verification ritual) — call at start of session. Also served natively as the `summer_agent_playbook` MCP prompt. |
239
239
 
240
- ### Creator platform (5)
240
+ ### Creator platform (7)
241
241
 
242
242
  | Tool | Use |
243
243
  |---|---|
@@ -247,6 +247,7 @@ Preview. One fast, read-only call that walks every node of a 3D scene and lists
247
247
  | `summer_creator_publish` | **Deprecated** (use the two tools above). Compute the exact `.pck` digest and size, require user confirmation, then run versioned prepare → write-once upload → finalize. The server independently verifies `publish` scope, ownership, bytes, and review state. |
248
248
  | `summer_creator_releases` | List real creator-owned releases from `summer.creator.v1`, with opaque cursor pagination. |
249
249
  | `summer_creator_config` | Read or confirm updates to the shared non-secret `~/.summer/config.json`. It never accepts or returns tokens. |
250
+ | `summer_capture_gameplay` | Real gameplay frames without a running editor: starts the game (main scene or `scene`) in the engine's offscreen verify instance (`--summer-verify`, real renderer, window parked offscreen, no focus) at `resolution` (default `1920x1080`), waits `waitSeconds`, saves `frames` PNGs (HUD included) to `<project>/.summer/captures/<time>/`. Imports the project first when `.godot/` is missing. Returns each path with its real width and height; warns when the stretch settings render another size. For store screenshots. |
250
251
 
251
252
  ### Library search (2)
252
253
 
@@ -1,6 +1,6 @@
1
1
  # Summer skills
2
2
 
3
- > 116 skills, grouped by their primary domain. **Generated** by `npm run generate:registry` from each skill's `resource.yaml`; `--check` fails when this file and the library disagree. Do not edit by hand.
3
+ > 118 skills, grouped by their primary domain. **Generated** by `npm run generate:registry` from each skill's `resource.yaml`; `--check` fails when this file and the library disagree. Do not edit by hand.
4
4
 
5
5
  The folder is flat on purpose (`docs/design/DECISIONS.md`, D3): a skill usually belongs to several domains, so categories live in each skill's `facets.domains` and this index is rendered from them. The first domain listed is the primary one. `summer skills list --by-domain` prints the same grouping; `summer skills info <slug>` shows one skill.
6
6
 
@@ -10,7 +10,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
10
10
 
11
11
  - [2d](#2d) (10)
12
12
  - [3d](#3d) (6)
13
- - [agent-workflow](#agent-workflow) (17)
13
+ - [agent-workflow](#agent-workflow) (18)
14
14
  - [ai](#ai) (2)
15
15
  - [animation](#animation) (7)
16
16
  - [assets](#assets) (3)
@@ -24,7 +24,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
24
24
  - [multiplayer](#multiplayer) (16)
25
25
  - [navigation](#navigation) (1)
26
26
  - [performance](#performance) (1)
27
- - [rendering](#rendering) (5)
27
+ - [rendering](#rendering) (6)
28
28
  - [runtime](#runtime) (1)
29
29
  - [scenes](#scenes) (12)
30
30
  - [scripting](#scripting) (2)
@@ -62,6 +62,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
62
62
 
63
63
  | skill | when to use | also |
64
64
  |---|---|---|
65
+ | [*bounded-engine-runs*](./bounded-engine-runs/SKILL.md) ★ (preview) | Run Summer headless or offscreen safely from an agent: time limits, one engine per project, muted runs, import passes, tests that fail on crashes. | headless, verification |
65
66
  | [brainstorming](./brainstorming/SKILL.md) ★ | Explore user intent, requirements, and design before implementation — must run before any creative work: features, components, mechanics, behavior. | game-design |
66
67
  | [debugging-game-feel](./debugging-game-feel/SKILL.md) | Debug features that work but feel wrong — floaty jumps, mushy combat, sluggish camera — subjective bugs living in tuning, timing, and feedback layers. | gameplay |
67
68
  | [diagnosing-perf-regressions](./diagnosing-perf-regressions/SKILL.md) | Find why frame rate, frame time, or load time got worse since a known-good state — regression hunting, not general performance tuning. | performance |
@@ -152,7 +153,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
152
153
  | [*celeste-momentum-platforming*](./celeste-momentum-platforming/SKILL.md) (preview) | Celeste-style 2D precision platformer movement — momentum running, coyote time, variable jumps, dash, wall jump/slide, climb stamina, pixel corner correction. | character-controller, game-design |
153
154
  | [*combat-basics*](./combat-basics/SKILL.md) (preview) | Damage in Summer Engine: hitbox and hurtbox Areas on opposing layers, a reusable Health component, damage signals, knockback, hit feedback, projectiles. | scripting, game-design |
154
155
  | [design-mechanic](./design-mechanic/SKILL.md) ★ | Design one game mechanic in detail — input, response, feedback, failure modes, depth, tunables — outputs a design doc, node-graph sketch, GDScript stub. | game-design |
155
- | [*in-game-purchases*](./in-game-purchases/SKILL.md) (preview) | Sell items for Sparks and let short players buy Sparks in game via the Summer purchase sheet: checkout, Sparks purchase, results, testing, store policy. | scripting, game-design |
156
+ | [*in-game-purchases*](./in-game-purchases/SKILL.md) (preview) | Sell items for Sparks in a game shop via the Summer purchase sheet: checkout, results, not enough Sparks, inventory unlocks, authority grants, store policy. | scripting, game-design |
156
157
  | [*web-and-touch-input*](./web-and-touch-input/SKILL.md) ★ (preview) | Input for the browser and phones: the first-click rule for sound and mouse capture, focus, and touch buttons or a virtual stick on the same actions. | ui |
157
158
 
158
159
  ## level-design
@@ -201,6 +202,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
201
202
  |---|---|---|
202
203
  | [3d-lighting](./3d-lighting/SKILL.md) ★ | Set up 3D scene lighting — DirectionalLight3D vs Omni vs Spot, WorldEnvironment, sky, shadow tuning, ambient — per current Summer conventions. | lighting |
203
204
  | [art-direction](./art-direction/SKILL.md) ★ | 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. | lighting |
205
+ | [*compatibility-renderer-traps*](./compatibility-renderer-traps/SKILL.md) ★ (preview) | Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors. | performance |
204
206
  | [*psx-retro-rendering*](./psx-retro-rendering/SKILL.md) (preview) | Hardware-informed PlayStation 1 rendering in Godot 4 — low-res output, RGB5 and exact dither, affine textures, vertex snapping, blend modes, fog; limits named. | 3d |
205
207
  | [*realtime-wet-surfaces*](./realtime-wet-surfaces/SKILL.md) (preview) | Real-time wetness on existing Godot 4 materials without losing their values — value-copying wet shader, geometry-driven wet mask, instance-uniform wet amount. | vfx |
206
208
  | [*web-compatibility-look*](./web-compatibility-look/SKILL.md) ★ (preview) | Make a web or browser game look high-end in the Compatibility renderer (WebGL 2): what works, what to avoid, 2D and 3D recipes, web performance. | 2d, 3d |
@@ -0,0 +1,96 @@
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. Each run
15
+ that hangs, overlaps another, makes noise or hides an error costs time and trust. These rules come from a
16
+ day of several agents sharing one project on one Mac.
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. One day of several agents
33
+ running builds, renders and a browser load of a large web export at once kernel-panicked the Mac
34
+ (compressor full, swap unable to grow). The wrapper should run the command as a child, sum the resident
35
+ memory of its whole process tree (browsers spawn GPU/renderer helpers), kill the tree past a cap (e.g.
36
+ 3 GB), and also stop when system free memory falls low (`sysctl -n kern.memorystatus_level` < 15 on macOS),
37
+ because GPU memory on Apple Silicon is system memory but is not counted in RSS. Refuse to start when the
38
+ system is already short (< 35).
39
+ - **Mute it.** `--audio-driver Dummy`. Someone is working next to you.
40
+ - **Render only when you must, and offscreen.** `--headless` for logic (no pixels). For visual checks use
41
+ `--summer-offscreen` with a fixed `--resolution` and a capture script that saves PNGs and quits. Visible
42
+ windows only when a human asked to watch.
43
+
44
+ ## 2. Imports and parse errors
45
+
46
+ - New `class_name` scripts are unknown to `-s` scripts until an import pass registers them:
47
+ `<summer> --headless --audio-driver Dummy --path . --import`.
48
+ - The first import may rewrite `project.godot` (reorder keys, add a `[summer]` section; one trial saw a
49
+ hand-written `[rendering]` section dropped). Check `git diff project.godot` after it, and pass renderer
50
+ choices on the command line (`--rendering-method ...`) when a run depends on them.
51
+ - One broken `class_name` script cascades into "Could not parse global class" and dozens of unrelated
52
+ "cannot infer type" errors. Get the real line with:
53
+ `<summer> --headless --path . --check-only -s res://path/to/file.gd`
54
+ - Compile every script before booting the game: a tiny `SceneTree` script that `load()`s each `.gd` under
55
+ a folder and reports `can_instantiate()` failures, exit code = failures.
56
+
57
+ ## 3. Tests that can't lie
58
+
59
+ - A runtime script error inside a test does not fail it by default; the test just stops and counts as
60
+ passed. Register a logger and fail the test when its error count rises:
61
+ ```gdscript
62
+ class ErrorCounter extends Logger:
63
+ var script_errors := 0
64
+ func _log_error(_f: String, file: String, _line: int, _c: String, _r: String, _n: bool, type: int, _bt: Array[ScriptBacktrace]) -> void:
65
+ if type == Logger.ERROR_TYPE_SCRIPT or file.ends_with(".gd"):
66
+ script_errors += 1
67
+ func _log_message(_m: String, _e: bool) -> void:
68
+ pass
69
+ # in the runner: OS.add_logger(counter); compare counter.script_errors before and after each test
70
+ ```
71
+ - Exit 0 is not success. Always grep the log for `SCRIPT ERROR`, `Parse Error` and `ERROR:`, and print
72
+ one explicit success line (`TESTS passed=N failed=0`) you can check for.
73
+
74
+ ## 4. Typed GDScript traps agents hit repeatedly
75
+
76
+ - `var x := dict["k"]` cannot infer a type (Dictionary values are Variant). Write `var x: int = dict["k"]`.
77
+ - A loop variable that shadows an outer variable is a parse error that takes the whole class down.
78
+ - Don't name a class after an engine class (`SummerSession`); the error only says it "hides a native class".
79
+
80
+ ## 5. Web exports on a dev machine
81
+
82
+ - Check the `.pck` size before opening it in a browser; the browser holds all of it in memory. A project that
83
+ exports every imported asset of a large scene can pass 250 MB. Ship only what the game uses first.
84
+ - Load it in a browser only under the same memory-capped wrapper, one at a time, never next to other engine runs.
85
+
86
+ ## 6. Captures you can trust
87
+
88
+ - Read every PNG you produce. If several files are identical (`md5 -r *.png`), the run froze; rerun alone.
89
+ - Keep evidence outside the project (logs, PNGs) so imports never pick it up. If it must live inside, put an
90
+ empty `.gdignore` file in that folder so the editor and imports skip it.
91
+
92
+ ## See also
93
+
94
+ - `headless-scripting` (writing the SceneTree scripts these runs execute)
95
+ - `multiplayer-testing` (Local Play bot runs)
96
+ - `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
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: compatibility-renderer-traps
3
+ description: "Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: rendering-and-lighting
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Glob Edit Write summer_project_setting summer_get_script_errors
9
+ paths: ["**/*.gdshader", "**/*.gdshaderinc", "**/*.gd", "project.godot"]
10
+ ---
11
+
12
+ # Forward+ and Compatibility without surprises
13
+
14
+ Games built on Forward+ can end up on the Compatibility renderer (OpenGL): phones where Metal/Vulkan is
15
+ unavailable, weak GPUs, or a project that picks it for battery. The failures are silent: no error, just
16
+ black fruit, pale colors, or objects that stop animating after the first few hundred. These are the traps
17
+ that cost real renders in a shipped-quality game, each with the fix and the reason.
18
+
19
+ ## 1. Know which renderer you actually got
20
+
21
+ - Phones use `rendering/renderer/rendering_method.mobile`, which defaults to `mobile`, not Forward+.
22
+ Set it explicitly.
23
+ - A device can fall back to another renderer when it lacks a capability. Trust the renderer name printed
24
+ at startup (or `RenderingServer.get_current_rendering_method()`), not the project setting.
25
+ - Preview Compatibility on your computer:
26
+ `<summer> --path . --rendering-method gl_compatibility`.
27
+
28
+ ## 2. The traps
29
+
30
+ | Symptom on Compatibility | Cause | Fix |
31
+ |---|---|---|
32
+ | Objects past roughly the 250th stop growing, lose color or read as default | GLES3 reserves 16 `instance uniform` slots per instance out of 4096, so only about 256 instances in the whole scene can use them. Beyond that, values silently read 0. | Don't use `instance uniform` for anything numerous. Put per-instance state in a one-instance MultiMesh's `INSTANCE_CUSTOM` (a vec4), or bake it into mesh vertex colors. |
33
+ | Fruit/flowers render solid black | GLES3 multiplies `COLOR` by the MultiMesh instance color, which is 0 when `use_colors` is off. | Enable `use_colors` and set every instance color to white, or don't read `COLOR` in that path. |
34
+ | Everything looks pastel on Forward+ (saturated on Compatibility) | Forward+ shades in linear space, Compatibility in sRGB. Colors you bake into vertex `COLOR` or hard-code into `ALBEDO` are usually sRGB. | Convert once, only where needed: `if (!OUTPUT_IS_SRGB) col = to_linear(col);` with the helper below (the shading language has no built-in `srgb_to_linear`). Or pass colors as `uniform vec3 c : source_color`, which converts for you. |
35
+ | Whole scene pale/lime on Compatibility while Forward+ looks right | Tonemap, glow and ambient respond differently. | Keep a Compatibility branch of your lighting profile (lower ambient and exposure) and check both. |
36
+ | Foliage glows white | Glow threshold too low for bright leaves. | Raise the glow HDR threshold (~1.5) and keep bloom near 0. |
37
+
38
+ Everything the player must see (ripe crop, enemy, pickup) must stay readable without glow, SSR,
39
+ volumetric fog or other Forward+-only effects: use shape, color and icons too.
40
+
41
+ The helper (standard sRGB curve):
42
+
43
+ ```glsl
44
+ vec3 to_linear(vec3 c) {
45
+ return mix(pow((c + vec3(0.055)) * (1.0 / 1.055), vec3(2.4)), c * (1.0 / 12.92), lessThan(c, vec3(0.04045)));
46
+ }
47
+ ```
48
+
49
+ ## 3. Keep one shader path
50
+
51
+ Write shaders in plain spatial math: vertex-color ramps, simple rim terms, no custom `light()` unless
52
+ you test it on both renderers. One path for both renderers means one set of bugs and no drift.
53
+
54
+ ## 4. Verify, don't assume
55
+
56
+ 1. Render the same scene on Forward+ and `gl_compatibility` offscreen:
57
+ `<summer> --audio-driver Dummy --summer-offscreen --path . --resolution 1600x900 -s res://tools/capture.gd -- --out=<dir>`
58
+ (add `--rendering-method gl_compatibility` for the second run).
59
+ 2. Read both images side by side, and include a stress shot with many instances (the 256 limit only shows
60
+ at scale).
61
+ 3. Grep the log for `SCRIPT ERROR`, `SHADER ERROR` and `ERROR:`. A shader that fails to compile still lets
62
+ the capture exit 0 and draws the object untextured, so a missing grep hides the failure.
63
+ 4. If later captures repeat the same frame, the offscreen run froze (it happens when another engine
64
+ renders at the same time). Check with `md5 -r *.png` and rerun alone.
65
+
66
+ ## Common mistakes
67
+
68
+ - Checking only the project setting and calling it "Forward+ on phones".
69
+ - Using `instance uniform` for per-plant or per-tile state.
70
+ - Reading `COLOR` from a MultiMesh without instance colors.
71
+ - Testing Compatibility with ten objects when the game shows five hundred.
72
+ - Budgeting one run per fix: every look change needs two captures (one per renderer). Plan runs in pairs.
73
+
74
+ ## See also
75
+
76
+ - `web-compatibility-look` (a finished look when the game only runs on Compatibility, as on the web)
77
+ - `3d-lighting` (lighting profiles)
78
+ - `bounded-engine-runs` (safe offscreen capture runs)
@@ -0,0 +1,28 @@
1
+ id: skill/compatibility-renderer-traps
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Make a Forward+ Summer game also look right on the Compatibility renderer: instance-uniform budget, black MultiMesh colors, sRGB vertex colors."
5
+ use_when:
6
+ - a game must run on phones or weak GPUs that may use the Compatibility or Mobile renderer
7
+ - objects render black, pale or stop animating on one renderer but not another
8
+ - writing shaders for many instances (crops, foliage, tiles) that must work everywhere
9
+ facets:
10
+ lifecycle:
11
+ - build
12
+ domains:
13
+ - rendering
14
+ - performance
15
+ modalities:
16
+ - shaders
17
+ - scripts
18
+ compatibility:
19
+ engine: ">=4.6"
20
+ related:
21
+ skills:
22
+ - skill/web-compatibility-look
23
+ - skill/3d-lighting
24
+ - skill/bounded-engine-runs
25
+ source: official
26
+ license: MIT
27
+ status: preview
28
+ recommended: true
@@ -77,7 +77,7 @@ summer_generate_image(
77
77
 
78
78
  `style: "none"` is intentional, but be precise about why: only `cartoon` and `anime` append anything to the prompt, `realistic` and `none` append nothing, and any other value is coerced to `none`. So the preset cannot override the prompt's stylistic direction — it just contributes nothing, which is what concept art wants. All four variants' divergence has to come from the prompt.
79
79
 
80
- There is no `image_size` argument, and `options` only recognizes Nano Banana provider keys plus `removeBackground` — an unrecognized key is dropped without an error. Every MCP image comes back at the server's 1:1 default. For wide key art, ask for "wide cinematic framing" in the prompt and accept the square canvas, or generate in the Summer dashboard where aspect ratio is exposed. Since these are exploration images the user reacts to and throws away, square is usually fine.
80
+ For a shape other than square, pass `aspectRatio` (`"16:9"`, `"9:16"`, ...) or `width` + `height`; the result reports the real width and height and the model that ran. Exploration images are thrown away, so square is usually fine.
81
81
 
82
82
  ### 5. Present the batch
83
83
 
@@ -121,7 +121,7 @@ The structure: **subject + axis variant + "concept art" + lighting/atmosphere**.
121
121
 
122
122
  - **User says "just one" after you propose 4.** That's a `character-portrait` job. Hand off.
123
123
  - **User wants 8+ variants.** Generate 4 first; if the user wants more on the same axis, generate 4 more. Don't dump 8 at once — overload paralyzes choice.
124
- - **Subject is a fully described scene, not an asset.** You're producing key art, not asset reference. Ask for wide cinematic framing in the prompt and bias toward atmospheric — you cannot set an aspect ratio over MCP.
124
+ - **Subject is a fully described scene, not an asset.** You're producing key art, not asset reference. Pass `aspectRatio: "16:9"` (or `width: 1920, height: 1080` for store key art) and bias toward atmospheric.
125
125
  - **User wants the final to be 3D.** After they pick a direction, route to `asset-strategy` — concept-art images are not 3D-ready references (they have backgrounds, scene context, dramatic lighting baked in). The 3D pipeline needs its own clean white-background reference.
126
126
 
127
127
  ## Fallback (no MCP)
@@ -293,6 +293,8 @@ Per platform, point the user at the correct upload path:
293
293
 
294
294
  - **summer.games:** `summer_export_game` writes the summer.games `.zip`; `summer_publish_build` uploads it to the game's store listing after the user confirms the exact game, file and version (needs `summer login --store`). If it answers `store_auth_refused`, the user uploads the `.zip` in Studio instead.
295
295
  - Per platform, the store takes: iPhone, Android, macOS and Windows in the Summer apps = one summer.games bundle (`summer_export_game` `targets`, format `bundle`; no template, no signing; a game without a server targets `ios`/`android` only). Web = an HTML5 `.zip` on Summer's WebGPU Forward+ template (`targets:["web"]`; the project must render with Forward+ or Mobile). A macOS or Windows download for the store page = `targets:["macos"]` or `["windows"]` with format `download`. Download exports need the template: `summer_export_templates` `install` fetches it from Summer's CDN.
296
+ - Hosted games: if `summer_export_game` fails with "… is in the source graph's authority_engine domain, which the client pack leaves out", an authority root in `source-domains.json` holds a file the client loads (often the composition `.tres`). Narrow that root to the server-only files, or move the shared file under a `shared` path, then export again. Every exporter message is in the `multiplayer-publish` skill's export-errors.md; the folder rules are in `multiplayer-project`.
297
+ - Store page art: key art, covers and icons carry no text, logos or UI (the store page shows the title). Screenshots are real gameplay and may show the game's own HUD; add no captions, logos or overlays. Capture them with `summer_capture_gameplay` (offscreen, no editor needed; `resolution` `1920x1080`, or `1080x1920` for portrait; pass the gameplay `scene` when the main scene is a title menu), or `summer_screenshot` target `game` while the editor runs the game.
296
298
  - **Steam:** `steamcmd` + Steam Pipe (`builder_app_xxx.vdf`). Set up depots first in Steamworks.
297
299
  - **itch.io:** `butler push <path> <user>/<game>:<channel>` (e.g. `butler push build/win <user>/mygame:windows`).
298
300
  - **Web (itch hosted):** zip + drop into itch upload UI as "playable in browser".
@@ -18,6 +18,7 @@ compatibility:
18
18
  related:
19
19
  skills:
20
20
  - skill/scene-scripting
21
+ - skill/bounded-engine-runs
21
22
  source: official
22
23
  license: MIT
23
24
  status: stable