summer-engine 2.6.6 → 2.8.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 (168) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +4 -1
  3. package/.codex-plugin/plugin.json +6 -2
  4. package/.cursor-plugin/plugin.json +5 -1
  5. package/.opencode/INSTALL.md +1 -1
  6. package/.opencode/plugins/summer.js +2 -2
  7. package/AGENTS.md +11 -7
  8. package/CHANGELOG.md +40 -0
  9. package/GEMINI.md +9 -7
  10. package/README.md +63 -21
  11. package/_persona/summer/SKILL.md +1 -0
  12. package/assets/autopilot/README.md +51 -0
  13. package/assets/autopilot/autopilot.gd +222 -0
  14. package/assets/autopilot/probe_base.gd +262 -0
  15. package/assets/autopilot/run.sh +78 -0
  16. package/commands/gameskill.md +11 -2
  17. package/commands/summer.md +13 -0
  18. package/dist/bin/summer.js +12 -0
  19. package/dist/commands/config.d.ts +2 -0
  20. package/dist/commands/config.js +53 -0
  21. package/dist/commands/create.d.ts +1 -0
  22. package/dist/commands/create.js +38 -6
  23. package/dist/commands/debug.d.ts +2 -0
  24. package/dist/commands/debug.js +44 -0
  25. package/dist/commands/doctor.js +112 -8
  26. package/dist/commands/list.js +1 -1
  27. package/dist/commands/login.d.ts +19 -0
  28. package/dist/commands/login.js +123 -36
  29. package/dist/commands/logout.js +3 -16
  30. package/dist/commands/logs.d.ts +2 -0
  31. package/dist/commands/logs.js +19 -0
  32. package/dist/commands/mcp.js +7 -2
  33. package/dist/commands/open.js +1 -1
  34. package/dist/commands/publish.d.ts +2 -0
  35. package/dist/commands/publish.js +20 -0
  36. package/dist/commands/releases.d.ts +2 -0
  37. package/dist/commands/releases.js +20 -0
  38. package/dist/commands/run.js +1 -1
  39. package/dist/commands/skills.js +1 -1
  40. package/dist/lib/api-client.d.ts +15 -4
  41. package/dist/lib/api-client.js +138 -13
  42. package/dist/lib/async-op-lifecycle.d.ts +7 -2
  43. package/dist/lib/async-op-lifecycle.js +32 -9
  44. package/dist/lib/auth.d.ts +40 -12
  45. package/dist/lib/auth.js +173 -37
  46. package/dist/lib/cloud/engine-bridge.d.ts +17 -4
  47. package/dist/lib/cloud/engine-bridge.js +32 -6
  48. package/dist/lib/config.d.ts +20 -0
  49. package/dist/lib/config.js +142 -0
  50. package/dist/lib/creator.d.ts +93 -0
  51. package/dist/lib/creator.js +393 -0
  52. package/dist/lib/debug-report.d.ts +50 -0
  53. package/dist/lib/debug-report.js +308 -0
  54. package/dist/lib/engine.d.ts +35 -2
  55. package/dist/lib/engine.js +240 -6
  56. package/dist/lib/game-task-plan.js +4 -4
  57. package/dist/lib/mcp-boot-notice.d.ts +3 -0
  58. package/dist/lib/mcp-boot-notice.js +7 -0
  59. package/dist/lib/mcp-log.d.ts +3 -0
  60. package/dist/lib/mcp-log.js +72 -0
  61. package/dist/lib/public-surface-paths.d.ts +13 -0
  62. package/dist/lib/public-surface-paths.js +42 -0
  63. package/dist/lib/skills-registry.d.ts +33 -1
  64. package/dist/lib/skills-registry.js +55 -0
  65. package/dist/lib/store.d.ts +14 -0
  66. package/dist/lib/store.js +145 -0
  67. package/dist/lib/summer-compatibility.d.ts +6 -0
  68. package/dist/lib/summer-compatibility.js +22 -0
  69. package/dist/mcp/server.d.ts +10 -3
  70. package/dist/mcp/server.js +104 -11
  71. package/dist/mcp/tools/asset-tools.js +33 -12
  72. package/dist/mcp/tools/cloud-tools.js +15 -15
  73. package/dist/mcp/tools/creator-tools.d.ts +2 -0
  74. package/dist/mcp/tools/creator-tools.js +105 -0
  75. package/dist/mcp/tools/debug-tools.js +44 -1
  76. package/dist/mcp/tools/file-tools.d.ts +2 -0
  77. package/dist/mcp/tools/file-tools.js +154 -0
  78. package/dist/mcp/tools/generate-tools.js +159 -11
  79. package/dist/mcp/tools/project-tools.js +37 -27
  80. package/dist/mcp/tools/scene-tools.js +106 -29
  81. package/dist/mcp/tools/visual-tools.js +4 -3
  82. package/dist/mcp/tools/with-engine.js +4 -4
  83. package/hooks/session-start.sh +5 -5
  84. package/package.json +3 -1
  85. package/references/collaborative-protocol.md +50 -0
  86. package/references/gd-style.md +121 -0
  87. package/references/godot-version.md +51 -0
  88. package/references/mcp-tools-reference.md +199 -0
  89. package/references/public-surface-language.md +30 -0
  90. package/references/summer-folder.md +90 -0
  91. package/references/template-registry.md +73 -0
  92. package/skills/2d-assets/character-portrait/SKILL.md +17 -12
  93. package/skills/2d-assets/concept-art/SKILL.md +10 -9
  94. package/skills/2d-assets/create-asset-sheet/SKILL.md +17 -15
  95. package/skills/2d-assets/pixel-art/SKILL.md +36 -20
  96. package/skills/2d-assets/skybox-panorama/SKILL.md +32 -37
  97. package/skills/2d-assets/sprite-sheet/SKILL.md +40 -35
  98. package/skills/2d-assets/tileable-texture/SKILL.md +28 -22
  99. package/skills/2d-assets/ui-graphics/SKILL.md +46 -32
  100. package/skills/2d-assets/use-widget-asset/SKILL.md +8 -6
  101. package/skills/3d-assets/character-model/SKILL.md +34 -19
  102. package/skills/3d-assets/environment-kit/SKILL.md +11 -5
  103. package/skills/3d-assets/organic-model/SKILL.md +8 -5
  104. package/skills/3d-assets/prop-model/SKILL.md +9 -3
  105. package/skills/3d-assets/vehicle-model/SKILL.md +32 -19
  106. package/skills/README.md +1 -1
  107. package/skills/ai-and-npcs/design-npc/SKILL.md +31 -13
  108. package/skills/animation/animation-tree/SKILL.md +39 -15
  109. package/skills/animation/facial-and-lipsync/SKILL.md +25 -8
  110. package/skills/animation/generate-motion/SKILL.md +47 -15
  111. package/skills/animation/procedural-animation/SKILL.md +31 -13
  112. package/skills/animation/retarget/SKILL.md +127 -79
  113. package/skills/audio/adaptive-music/SKILL.md +24 -20
  114. package/skills/audio/ambient-bed/SKILL.md +22 -16
  115. package/skills/audio/audio-direction/SKILL.md +15 -10
  116. package/skills/audio/music-track/SKILL.md +18 -12
  117. package/skills/audio/sound-effect/SKILL.md +17 -12
  118. package/skills/audio/voice-line/SKILL.md +42 -42
  119. package/skills/character-controllers/fps-controller/SKILL.md +26 -16
  120. package/skills/debugging/debug/SKILL.md +74 -20
  121. package/skills/deployment/export-and-ship/SKILL.md +105 -38
  122. package/skills/deployment/remote-deploy/SKILL.md +140 -0
  123. package/skills/gameplay-mechanics/auto-fire-targeting/SKILL.md +26 -1
  124. package/skills/gameplay-mechanics/design-mechanic/SKILL.md +23 -15
  125. package/skills/level-design/design-level/SKILL.md +22 -8
  126. package/skills/level-design/scene-to-level/SKILL.md +13 -7
  127. package/skills/multiplayer-and-networking/host-authoritative-state/SKILL.md +8 -8
  128. package/skills/multiplayer-and-networking/peer-to-peer-multiplayer/SKILL.md +2 -7
  129. package/skills/multiplayer-and-networking/setup-multiplayer/SKILL.md +26 -18
  130. package/skills/performance/tune-performance/SKILL.md +51 -32
  131. package/skills/rendering-and-lighting/3d-lighting/SKILL.md +34 -5
  132. package/skills/rendering-and-lighting/art-direction/SKILL.md +6 -8
  133. package/skills/scene-and-project/brainstorm-game/SKILL.md +7 -9
  134. package/skills/scene-and-project/make-game/SKILL.md +2 -1
  135. package/skills/scene-and-project/play/SKILL.md +10 -4
  136. package/skills/scene-and-project/scene-composition/SKILL.md +21 -8
  137. package/skills/scene-and-project/summer-cloud/SKILL.md +92 -0
  138. package/skills/scripting-patterns/gdscript-patterns/SKILL.md +1 -1
  139. package/skills/ui-and-ux/ui-basics/SKILL.md +16 -7
  140. package/skills/video/animated-loop/SKILL.md +63 -39
  141. package/skills/video/cinematic-cutscene/SKILL.md +66 -30
  142. package/skills/video/trailer-shot/SKILL.md +30 -21
  143. package/skills/visual-effects/_building-blocks/additive-billboard-particles.md +25 -16
  144. package/skills/visual-effects/_building-blocks/trauma-shake-snippet.md +5 -3
  145. package/skills/visual-effects/game-feel/SKILL.md +51 -33
  146. package/skills/visual-effects/recipes/dissolve/SKILL.md +51 -9
  147. package/skills/visual-effects/recipes/fire/SKILL.md +136 -49
  148. package/skills/visual-effects/recipes/hit-spark/SKILL.md +45 -8
  149. package/skills/visual-effects/recipes/lightning/SKILL.md +59 -27
  150. package/skills/visual-effects/recipes/magic-glow/SKILL.md +59 -26
  151. package/skills/visual-effects/recipes/muzzle-flash/SKILL.md +68 -25
  152. package/skills/visual-effects/recipes/smoke/SKILL.md +89 -28
  153. package/skills/visual-effects/recipes/water-ripple/SKILL.md +83 -23
  154. package/skills/workflow/brainstorming/SKILL.md +1 -1
  155. package/skills/workflow/debugging-game-feel/SKILL.md +29 -9
  156. package/skills/workflow/diagnosing-perf-regressions/SKILL.md +46 -21
  157. package/skills/workflow/gameskill/SKILL.md +11 -2
  158. package/skills/workflow/headless-scripting/SKILL.md +407 -0
  159. package/skills/workflow/investigating-bugs/SKILL.md +4 -2
  160. package/skills/workflow/mcpupdate/SKILL.md +9 -9
  161. package/skills/workflow/playtesting-a-feature/SKILL.md +94 -21
  162. package/skills/workflow/skill-create/SKILL.md +7 -7
  163. package/skills/workflow/skill-test/SKILL.md +3 -3
  164. package/skills/workflow/using-summer/SKILL.md +32 -3
  165. package/skills/workflow/verification-before-completion/SKILL.md +2 -0
  166. package/skills/workflow/writing-plans/SKILL.md +7 -7
  167. package/skills/workflow/writing-skills/SKILL.md +7 -5
  168. package/skills/workflow/writing-skills/testing-skills-with-subagents.md +1 -1
@@ -0,0 +1,199 @@
1
+ # Summer MCP Tools — Canonical Reference
2
+
3
+ > Use this as the single source of truth for which Summer MCP tool to call. Skills should reference tool names exactly as written here.
4
+
5
+ ## When to use Summer MCP vs. host tools
6
+
7
+ **Use Summer MCP for** anything that needs the live editor or Godot's import pipeline:
8
+ - Scene graph mutation (`.tscn`)
9
+ - Node properties and resources (`.tres`)
10
+ - Project settings (`project.godot`) and InputMap
11
+ - Asset import (Godot's import pipeline must run)
12
+ - Play / stop / runtime state
13
+ - Diagnostics, console, debugger output, script errors
14
+ - Project text reads and guarded writes (`.gd`, `.cs`, `.tscn`, `.tres`, JSON, docs, config)
15
+
16
+ **Use host tools for** git, shell, grep, and non-project work. External host file writes bypass Summer's project-identity, sha256, and editor-reload safeguards and should not be used for project mutations while MCP is available.
17
+
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
+
20
+ ## Tool surface (62 tools)
21
+
22
+ ### Project files (3)
23
+
24
+ | Tool | Use |
25
+ |---|---|
26
+ | `summer_read_file` | Read project text plus a full-file sha256 receipt. |
27
+ | `summer_write_file` | Create-only or sha256-guarded complete file write. |
28
+ | `summer_replace_text` | Unique (or explicit replace-all) text mutation with read/sha guard. |
29
+
30
+ ### Scene graph (11)
31
+
32
+ | Tool | Use |
33
+ |---|---|
34
+ | `summer_get_scene_tree` | Read current scene graph. Always do this before mutating. |
35
+ | `summer_open_main_scene` | Open the project's main scene. |
36
+ | `summer_open_scene` | Open a specific `.tscn`. |
37
+ | `summer_create_scene` | Create a new scene. |
38
+ | `summer_instantiate_scene` | Add an existing scene or 3D model as a child node. |
39
+ | `summer_inspect_node` | Read a single node's properties. |
40
+ | `summer_add_node` | Add a node to the explicit `scenePath`; the tab need not be open. |
41
+ | `summer_remove_node` | Remove a node from the explicit `scenePath`. |
42
+ | `summer_replace_node` | Swap a node's type in the explicit `scenePath`, preserving children. |
43
+ | `summer_select_node` | Set editor selection (visual feedback for the user). |
44
+ | `summer_save_scene` | Explicitly save/save-as a `scenePath`; mutation tools already append one final save. |
45
+
46
+ ### Properties / resources (4)
47
+
48
+ | Tool | Use |
49
+ |---|---|
50
+ | `summer_set_prop` | Set a typed property in an explicit `scenePath` using Godot's `str_to_var()`. |
51
+ | `summer_set_resource_property` | Set a nested resource property in an explicit `scenePath`. |
52
+ | `summer_inspect_resource` | Read a resource's properties. |
53
+ | `summer_connect_signal` | Wire a signal between nodes. |
54
+
55
+ ### Project & input (2)
56
+
57
+ | Tool | Use |
58
+ |---|---|
59
+ | `summer_project_setting` | Modify `project.godot` settings (rendering, physics). |
60
+ | `summer_input_map_bind` | Bind input actions in InputMap. Folds in the legacy `add_action` step. |
61
+
62
+ ### Import pipeline (2)
63
+
64
+ | Tool | Use |
65
+ |---|---|
66
+ | `summer_import_from_url` | Download a `.glb`/`.png`/etc and run Godot's full import pipeline. |
67
+ | `summer_import_from_url_batch` | Same, batched (single filesystem scan). |
68
+
69
+ ### Play / runtime (3)
70
+
71
+ | Tool | Use |
72
+ |---|---|
73
+ | `summer_play` | Run the game. |
74
+ | `summer_stop` | Stop the running game. |
75
+ | `summer_is_running` | Check play state before deciding to call `summer_stop`. |
76
+
77
+ ### Visual capture (1)
78
+
79
+ | Tool | Use |
80
+ |---|---|
81
+ | `summer_screenshot` | Capture a frame and return it as an image the agent sees directly — editor viewport (`target:"viewport"`, default; no play needed) or running game (`target:"game"`). Use to visually verify scene layout, asset placement, scale, framing, lighting, or runtime state. On macOS the running game is a floating window that can't be captured; prefer `viewport`. |
82
+
83
+ ### Diagnostics (7)
84
+
85
+ | Tool | Use |
86
+ |---|---|
87
+ | `summer_create_debug_report` | Create a support-ready Markdown report for `/summer debug`. |
88
+ | `summer_get_diagnostics` | Aggregate error/warning summary. Call after every change. |
89
+ | `summer_get_console` | Engine output panel. |
90
+ | `summer_clear_console` | Clear before a fresh play, so post-run output is clean. |
91
+ | `summer_get_debugger_errors` | Runtime errors with stack traces. |
92
+ | `summer_get_debugger_warnings` | Runtime warnings from the debugger panel. |
93
+ | `summer_get_script_errors` | Script compilation errors. |
94
+
95
+ ### Asset library (6)
96
+
97
+ | Tool | Use |
98
+ |---|---|
99
+ | `summer_search_assets` | Free public asset search (community library + user's own). Sources: `library`, `community`, `my_assets`, `all`. |
100
+ | `summer_list_my_assets` | List/search the signed-in user's generated and uploaded assets. Empty query lists recent assets. |
101
+ | `summer_get_asset` | Fetch one exact asset by ID with file URL, download URL, viewer URL, metadata, license, and visibility. |
102
+ | `summer_get_asset_download_url` | Get the primary or thumbnail download URL for a specific asset. Stable shape for future signed URLs. |
103
+ | `summer_import_asset` | Search, choose the top match, download, run Godot import, and optionally instantiate 3D models. |
104
+ | `summer_import_asset_by_id` | Import one exact Summer asset ID. Use after generation jobs or when the user selects a specific asset. |
105
+
106
+ ### Asset generation (5 — metered)
107
+
108
+ | Tool | Use |
109
+ |---|---|
110
+ | `summer_generate_image` | AI image gen. |
111
+ | `summer_generate_3d` | Image-to-3D. |
112
+ | `summer_generate_audio` | SFX / music gen. |
113
+ | `summer_generate_video` | Video gen. |
114
+ | `summer_generate_motion` | Generate/apply 3D skeletal motion from a rigged asset. |
115
+
116
+ ### Job tracking (2)
117
+
118
+ | Tool | Use |
119
+ |---|---|
120
+ | `summer_check_job` | Poll a generation job. |
121
+ | `summer_batch` | Run multiple ops as a transaction. |
122
+
123
+ ### Meta (3)
124
+
125
+ | Tool | Use |
126
+ |---|---|
127
+ | `summer_start_game_task` | Route a user goal into the right workflow, skills, MCP tool groups, asset policy, gates, and verification path. |
128
+ | `summer_get_project_context` | Project, scene, and `.summer` memory summary — call at start of session. |
129
+ | `summer_get_agent_playbook` | Daily operating contract — call at start of session. |
130
+
131
+ ### Cloud sync (7)
132
+
133
+ | Tool | Use |
134
+ |---|---|
135
+ | `summer_cloud_init` | Enable Summer Cloud for a project. |
136
+ | `summer_cloud_status` | Show Summer Cloud sync status. |
137
+ | `summer_cloud_push` | Push local project changes to Summer Cloud. |
138
+ | `summer_cloud_pull` | Pull Summer Cloud changes into the local project. |
139
+ | `summer_cloud_restore` | Restore a retained cloud version, or a local pre-sync checkpoint. |
140
+ | `summer_cloud_checkpoints` | List local pre-sync checkpoints. |
141
+ | `summer_cloud_conflicts` | List conflict sets, or restore a preserved conflict file. |
142
+
143
+ ### Creator platform (4)
144
+
145
+ | Tool | Use |
146
+ |---|---|
147
+ | `summer_creator_publish` | 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. |
148
+ | `summer_creator_releases` | List real creator-owned releases from `summer.creator.v1`, with opaque cursor pagination. |
149
+ | `summer_creator_logs` | Read runtime logs for a project or release. Remains fail-closed until a durable platform log source exists. |
150
+ | `summer_creator_config` | Read or confirm updates to the shared non-secret `~/.summer/config.json`. It never accepts or returns tokens. |
151
+
152
+ ## Common pattern
153
+
154
+ Every scene-touching skill should follow this loop:
155
+
156
+ 1. `summer_start_game_task` — route the goal into skills/tools/gates.
157
+ 2. `summer_get_project_context` — orient.
158
+ 3. `summer_get_agent_playbook` — read the rules.
159
+ 4. Resolve the exact `res://` scene path; open it only for an intentional current-tab read/UI action.
160
+ 5. Pass that `scenePath` to mutations (`summer_add_node`, `summer_set_prop`, `summer_connect_signal`, ...).
161
+ 6. Mutation tools append one final `SaveScene`; use `summer_save_scene` directly only for a standalone save/save-as.
162
+ 7. `summer_get_script_errors` — catch GDScript breakage.
163
+ 8. `summer_play` → `summer_get_debugger_errors` → `summer_screenshot` (see what's on screen) → `summer_stop` if verifying runtime.
164
+
165
+ Every asset-generation skill should follow this loop:
166
+
167
+ 1. `summer_search_assets` or `summer_list_my_assets` — reuse before generating when reasonable.
168
+ 2. `summer_generate_image` / `summer_generate_3d` / `summer_generate_audio` — metered creation.
169
+ 3. `summer_check_job` if the generation was async.
170
+ 4. `summer_get_asset` — resolve the returned `assetId`, `rigAssetId`, or `animationAssetId`.
171
+ 5. `summer_import_asset_by_id` — import the exact result into Godot's pipeline.
172
+ 6. `summer_get_asset_download_url` — only when the user explicitly wants a downloadable file/link.
173
+
174
+ ## summer_set_resource_property — nested properties
175
+
176
+ Use it to reach a property *of a resource attached to a node* — mesh size, shape radius, material colour — the thing `summer_set_prop` cannot reach.
177
+
178
+ ```
179
+ summer_add_node(parent="/", type="MeshInstance3D", name="Box", scenePath="res://main.tscn")
180
+ summer_set_prop(path="Box", key="mesh", value="BoxMesh", scenePath="res://main.tscn")
181
+ summer_set_resource_property(
182
+ nodePath="Box", resourceProperty="mesh", subProperty="size",
183
+ value="Vector3(2, 2, 2)", scenePath="res://main.tscn")
184
+ ```
185
+
186
+ `nodePath`, `resourceProperty` and `subProperty` are all required and canonical. There is no dotted `"mesh.size"` form.
187
+
188
+ **Inline `sub_resource` targets work.** An earlier revision of this file claimed the op silently fails on an inline sub-resource and told you to save the resource as a standalone `.tres` first. That was wrong, and it propagated into nine skills. The implementation reads `node->get(resourceProperty)` and sets the sub-property on whatever comes back (`modules/1summer_engine/editor/ops/scene_ops.cpp:1273-1400`) — there is no inline-versus-external branch anywhere in it. The canonical example in the shipped `summer_batch` description does exactly this against an inline mesh.
189
+
190
+ Failures are explicit, never silent:
191
+
192
+ | Error | Meaning |
193
+ |---|---|
194
+ | `no edited scene` | Nothing open — pass `scenePath`. |
195
+ | `node not found: <path>` | `nodePath` is wrong; it is relative to the scene root. |
196
+ | `property is not a resource` | `resourceProperty` names a plain value, not a resource. |
197
+ | `resource is null` | The node has the property but nothing is assigned yet. Assign it first. |
198
+
199
+ If you get none of those and the value still did not change, that is a bug worth reporting — not expected behaviour to design around.
@@ -0,0 +1,30 @@
1
+ # Summer public-surface language boundary
2
+
3
+ Summer Engine is the creator product. Users make a **Summer game** with the
4
+ **Summer SDK**, normally in **GDScript**. Headlines, onboarding, CLI errors,
5
+ shipped skill descriptions, and generated prompts use those names.
6
+
7
+ Godot Engine remains relevant in narrow technical and legal contexts:
8
+
9
+ - upstream compatibility and continuous-upstream maintenance;
10
+ - migration of existing projects;
11
+ - extension APIs, class references, file formats, and import behavior;
12
+ - literal paths and filenames such as `project.godot` and `.godot/`;
13
+ - upstream contributions, attribution, copyright, and licenses.
14
+
15
+ The current technical base is 4.6.1 and the approved next target is 4.7.1. The
16
+ source of truth is the repository compatibility contract. Neither number is a
17
+ permanent Summer identity, so creator prompts and skills should not pin
18
+ themselves to one upstream release.
19
+
20
+ Run the focused regression guard and inventory with:
21
+
22
+ ```bash
23
+ npm run test:public-language
24
+ ```
25
+
26
+ The guard blocks known Godot-led identity phrases and stale fixed-4.5 scaffold
27
+ language across shipped surfaces. It also prints the remaining Godot-reference
28
+ inventory grouped by file. This is intentionally not a semantic linter: a human
29
+ must still review those references and confirm that each is technical,
30
+ migration-related, attribution, or legal context.
@@ -0,0 +1,90 @@
1
+ # `.summer/` Folder Convention
2
+
3
+ > The canonical layout for project-scoped Summer state. Read this if you're authoring a skill that writes durable design output, locked project memory, or agent-readable design notes.
4
+
5
+ ## Files at the root of `.summer/`
6
+
7
+ - `GameSoul.md` — the project brief. Created by `/summer:brainstorm-game`. Contains: name, one-sentence pitch, core loop, 3 mechanics max, art direction summary, scope. Updated whenever the game's high-level direction changes.
8
+ - `art-bible.md` — visual style reference. Created by `/summer:art-direction`. Contains: palette (6–15 hex codes), mood adjectives, lighting plan, post-processing notes, do/don't list, references.
9
+ - `audio-bible.md` — sonic identity. Created by `/summer:audio-direction`. Contains: music style + tempo range, SFX vocabulary (8 classes), dynamic music FSM, bus layout reference.
10
+ - `build-plan.md` — implementation plan derived from `GameSoul.md`. Created by `/summer:make-game` before scaffold/build work.
11
+
12
+ ## Subdirectories
13
+
14
+ - `mechanics/<mechanic-name>.md` — one file per designed mechanic (e.g., `double-jump.md`, `parry.md`). Created by `/summer:design-mechanic`. Contains: input → response → feedback → failure modes → tunable parameters.
15
+ - `levels/<level-name>.md` — one file per designed level. Created by `/summer:design-level`. Contains: teaching goal, pacing curve (5 beats), encounters, secrets, reward gating.
16
+ - `npcs/<npc-name>.md` — one file per designed NPC. Created by `/summer:design-npc`. Contains: archetype, perception model, decision tree, escalation, defeat sequence.
17
+ - `memory/` — structured project memory for durable facts that must survive future sessions. Use this for locked cast decisions, character facts, provider IDs, world canon, and conflict notes.
18
+ - `skills/` — installed project-scoped Summer skills. Do not put game design memory here.
19
+
20
+ ## Structured memory
21
+
22
+ Use `.summer/memory/` when the fact is more specific than a bible, must be re-used by many skills, or must not silently drift. Examples:
23
+
24
+ - `memory/casting/voices.md` — stable character-to-voice assignments, including ElevenLabs voice IDs.
25
+ - `memory/characters/<character-name>.md` — canonical character facts, aliases, personality, visual/audio constraints, linked assets.
26
+ - `memory/world/canon.md` — lore and setting facts that dialogue, quests, levels, and art should not contradict.
27
+ - `memory/systems/<system-name>.md` — gameplay rules and implementation decisions that cross scenes/scripts.
28
+ - `memory/decisions/<yyyy-mm-dd-topic>.md` — rationale for important choices.
29
+ - `memory/conflicts/open.md` — unresolved conflicts between memory and implementation.
30
+
31
+ Markdown is canonical. Optional generated indexes such as `memory/index.json` may exist for UI/search speed, but agents must treat the Markdown files as the source of truth.
32
+
33
+ Locked facts should use short YAML frontmatter:
34
+
35
+ ```yaml
36
+ ---
37
+ id: casting.voice.main-cast
38
+ type: casting
39
+ status: active
40
+ priority: locked
41
+ stable: true
42
+ applies_to:
43
+ - character:bob
44
+ - character:sarah
45
+ providers:
46
+ - elevenlabs
47
+ ---
48
+ ```
49
+
50
+ Then write the fact in normal Markdown so users can inspect and edit it:
51
+
52
+ ```markdown
53
+ # Main Voice Cast
54
+
55
+ | Character | Provider | Voice ID | Stability |
56
+ |---|---|---|---|
57
+ | Bob | ElevenLabs | `voice_bob_id` | locked |
58
+ | Sarah | ElevenLabs | `voice_sarah_id` | locked |
59
+ ```
60
+
61
+ ## Conventions
62
+
63
+ - All filenames are lowercase, hyphens not underscores.
64
+ - Skills MUST ask "May I write/update `.summer/<file>`?" before any write to this folder.
65
+ - Skills MAY read existing files in `.summer/` without permission to ground their output in prior decisions.
66
+ - The folder lives in the project root (sibling to `project.godot`).
67
+ - Add `.summer/` to `.gitignore` if the user prefers it private; default is to commit it (game design lives with the game).
68
+ - Changing a `priority: locked` memory requires explicit user confirmation. If implementation data conflicts with locked memory, stop and ask whether to update memory or fix the implementation.
69
+
70
+ ## Skills that write here
71
+
72
+ | Skill | Writes |
73
+ |---|---|
74
+ | `/summer:brainstorm-game` | `.summer/GameSoul.md` |
75
+ | `/summer:art-direction` | `.summer/art-bible.md` |
76
+ | `/summer:audio-direction` | `.summer/audio-bible.md` |
77
+ | `/summer:design-mechanic` | `.summer/mechanics/<name>.md` |
78
+ | `/summer:design-level` | `.summer/levels/<name>.md` |
79
+ | `/summer:design-npc` | `.summer/npcs/<name>.md` |
80
+ | `/summer:voice-line` | `.summer/memory/casting/voices.md` |
81
+ | `/summer:debug` | does NOT write here |
82
+ | `/summer:play` | does NOT write here |
83
+ | `/summer:vfx` | does NOT write here (VFX edits scenes/scripts) |
84
+ | `/summer:tune-performance` | optionally writes `.summer/perf-notes.md` if user requests |
85
+ | `/summer:setup-multiplayer` | optionally writes `.summer/multiplayer-architecture.md` |
86
+ | `/summer:export-and-ship` | does NOT write here (writes export configs in `project.godot`) |
87
+
88
+ ## Linter check (future)
89
+
90
+ Once `workflow/skill-test` gains an executable mode, it should validate that any skill writing to `.summer/` is documented in the table above.
@@ -0,0 +1,73 @@
1
+ # Template Registry
2
+
3
+ > Skills cross-link to template repos via the `template-id` frontmatter field.
4
+ >
5
+ > **This file is a convenience snapshot, not the source of truth.** Templates are discovered live from the GitHub org, so this table goes stale the moment a template is added. Ask the CLI instead:
6
+ >
7
+ > ```bash
8
+ > summer list templates
9
+ > ```
10
+
11
+ ## How discovery actually works
12
+
13
+ `summer list templates` queries `github.com/SummerEngine` for repos named `template-*`, and **strips the `template-` prefix to produce the slug** (`src/lib/remote-templates.ts`). So the repo `template-2d-platformer` is created with:
14
+
15
+ ```bash
16
+ summer create 2d-platformer my-game
17
+ ```
18
+
19
+ There is no `summer template clone` command. `summer create <slug> [dir]` is the only bootstrap path, and it takes the stripped slug, not the repo name.
20
+
21
+ ## Snapshot — verified against `summer list templates`
22
+
23
+ Built-in, no download required:
24
+
25
+ | slug | Description |
26
+ |---|---|
27
+ | `empty` | Empty 3D project with just a root node |
28
+ | `3d-basic` | 3D scene with camera, light, and floor |
29
+
30
+ Community templates, all at `https://github.com/SummerEngine/template-<slug>`:
31
+
32
+ | slug | Description |
33
+ |---|---|
34
+ | `2d-brario-platformer` | 2D platformer starter |
35
+ | `2d-grid-puzzle` | Grid-based puzzle starter |
36
+ | `2d-plants-and-zombies-tower-defense` | Lane tower-defense starter |
37
+ | `2d-platformer` | 2D platformer starter (TileMap, CharacterBody2D, parallax) |
38
+ | `2d-rpg` | 2D top-down RPG starter (built on GDQuest's open-source work) |
39
+ | `2d-vampire-survivor-roguelike` | Survivors-like roguelike starter |
40
+ | `3d-fps-old-school` | Retro first-person shooter starter |
41
+ | `3d-fps-simple-animated-npc` | FPS starter with an animated NPC |
42
+ | `3d-lan-multiplayer-starter` | 3D LAN multiplayer starter (built on GDQuest's open-source work) |
43
+ | `3d-open-world-explore-tps` | Third-person open-world exploration starter |
44
+ | `3d-racing-game` | Racing starter |
45
+ | `3d-royale-clash-type` | Auto-battler / lane-pusher starter |
46
+ | `3d-third-person-controller` | 3D third-person character controller (built on GDQuest's open-source work) |
47
+ | `3d-voxel-sandbox` | Voxel sandbox (chunked world, face culling, mining/building, seeded gen) |
48
+
49
+ If a slug you expect is missing here, it is this file that is out of date, not the CLI. Run `summer list templates`.
50
+
51
+ ## Convention
52
+
53
+ Each template is its own GitHub repo under the `SummerEngine` org, MIT licensed, kept small (< 50 MB), and named `template-<slug>`. Templates ship working code; skills describe patterns. A skill links to the matching template via:
54
+
55
+ ```markdown
56
+ ## Want a working starter?
57
+
58
+ This skill describes the pattern. For a runnable project, use the template:
59
+
60
+ → **template-id**: `template-2d-platformer`
61
+ → **Repo**: https://github.com/SummerEngine/template-2d-platformer
62
+ → **Bootstrap**: `summer create 2d-platformer my-game`
63
+ ```
64
+
65
+ ## Linter check
66
+
67
+ The `workflow/skill-test/SKILL.md` static linter validates that any `template-id:` declared in a skill's frontmatter exists in the table above. Because the table is a snapshot, a linter failure may mean the table is stale rather than the skill being wrong — check `summer list templates` before editing the skill.
68
+
69
+ ## Adding a template
70
+
71
+ 1. Create a new repo under the `SummerEngine` org named `template-<slug>`, MIT license.
72
+ 2. It appears in `summer list templates` automatically — no registration step.
73
+ 3. Add it to the snapshot above and reference the `template-id` from any relevant skill.
@@ -60,15 +60,16 @@ angle: three-quarter view, slight turn to character's left
60
60
  lighting: soft warm key from upper right, cool fill from left, gentle rim
61
61
  background: muted painterly gradient, dark teal to deep brown, no scene detail
62
62
  style: semi-realistic painterly, soft edges, oil-painting feel
63
- aspect: portrait_4_3
64
63
  ```
65
64
 
65
+ Note there is no aspect line. `summer_generate_image` has no size or aspect argument — every MCP image comes back at the server's 1:1 default. Bust framing reads fine square, which is why this skill works over MCP at all; if the cast needs true portrait framing, generate in the Summer dashboard (which exposes aspect ratio) and bring the results back with `summer_import_from_url`, or crop after. Whichever you pick, do it for the *whole* cast — mixed aspect is as visible as mixed lighting.
66
+
66
67
  Every subsequent portrait in this cast appends the anchor to the prompt verbatim. **Do not edit the anchor mid-cast** unless the user explicitly says "I want the new ones to look different."
67
68
 
68
69
  ### 2. Search for an existing portrait
69
70
 
70
71
  ```
71
- summer_search_assets(query="<character name> portrait", filter={ kind: "image" })
72
+ summer_search_assets(query="<character name> portrait", assetType="2d_image", source="all")
72
73
  ```
73
74
 
74
75
  Reuse beats regenerate. If the user wants to iterate on an existing one, pull its URL and pass it as `referenceImageUrl` for img2img.
@@ -91,12 +92,13 @@ The character description should include: identity (age, build, hair, distinctiv
91
92
  summer_generate_image(
92
93
  prompt="Aria, young witch, mid-twenties, pale skin, long black hair with silver streak, sharp green eyes, half-smile, wearing dark indigo robes with silver embroidery, raven on shoulder. <anchor verbatim>",
93
94
  model="nano-banana-2",
94
- style="none",
95
- options={ image_size: "portrait_4_3" }
95
+ style="none"
96
96
  )
97
97
  ```
98
98
 
99
- `style: "none"` because the anchor's "semi-realistic painterly" already specifies style; the preset would fight it.
99
+ `style: "none"` because the anchor's "semi-realistic painterly" already specifies style. Be clear about what the preset actually does though: only `cartoon` and `anime` append anything to the prompt, and `realistic` / `none` append nothing — any other value is coerced to `none`. So the preset cannot "fight" a painterly anchor; it just does nothing either way, and every bit of the look has to be in the prompt.
100
+
101
+ `options={ image_size: ... }` is dropped without an error — see the anchor note above.
100
102
 
101
103
  ### 5. Import and wire into UI
102
104
 
@@ -110,13 +112,16 @@ summer_import_from_url(
110
112
  For dialogue UI nodes, wire the texture into a `TextureRect`:
111
113
 
112
114
  ```
113
- summer_set_resource_property(
114
- nodePath="/root/UI/DialogueBox/PortraitRect",
115
- resourceProperty="texture",
115
+ summer_set_prop(
116
+ scenePath="res://ui/dialogue.tscn",
117
+ path="./DialogueBox/PortraitRect",
118
+ key="texture",
116
119
  value="res://ui/portraits/aria.png"
117
120
  )
118
121
  ```
119
122
 
123
+ `texture` is a property on the node, so this is `summer_set_prop` — which needs an explicit `scenePath`, a node path relative to that scene's root (`./`), and a `key` argument, not `property`. `summer_set_resource_property` is for reaching one level *inside* a resource the node already holds and requires all five of `scenePath`, `nodePath`, `resourceProperty`, `subProperty`, `value`.
124
+
120
125
  For character-select with multiple portraits, name files consistently: `aria.png`, `borin.png`, `cael.png`, `dara.png`. Index-able from code via `"res://ui/portraits/%s.png" % character_id`.
121
126
 
122
127
  ### 6. Iterate (img2img) instead of regenerating from scratch
@@ -150,7 +155,7 @@ summer_generate_image(
150
155
  | `cool warrior portrait` | No identity, no anchor. Returns generic stock art. |
151
156
  | `the witch but make her sad` (no img2img ref) | Without `referenceImageUrl`, you get a *different* witch who is sad. Identity drift. |
152
157
  | Anchor inconsistent across cast | Each portrait looks like a different game. The cast doesn't read as a cast. |
153
- | `full body portrait` | "Portrait" implies bust. If you want full body, say so explicitly AND switch to `image_size: "portrait_4_3"` framed full-body — but that's a different asset class; consider `concept-art` or 3D pipeline. |
158
+ | `full body portrait` | "Portrait" implies bust. If you want full body, say so explicitly in the prompt — there is no size argument to reframe with, and full body in a square frame is a different asset class anyway; consider `concept-art` or the 3D pipeline. |
154
159
  | `transparent background` for a painterly portrait | Painterly + transparent fails on most models. Use a flat or gradient background, then alpha-cut in an editor if you must. |
155
160
 
156
161
  ## Anti-patterns
@@ -159,7 +164,7 @@ summer_generate_image(
159
164
  - **Editing the anchor mid-cast.** If you change lighting from "warm key" to "dramatic side" halfway through, the cast splits visually. Either commit to the change and regenerate everyone, or stick with the anchor.
160
165
  - **Regenerating from scratch when img2img would do.** Identity drifts every regen. Iterate via `referenceImageUrl`.
161
166
  - **Using the portrait as a 3D reference.** Portraits have dramatic lighting, painterly backgrounds, and cropped framing — all of which corrupt 3D generation. For 3D, generate a separate clean white-bg full-body T-pose via `summer:asset-pipeline/asset-strategy`.
162
- - **Using `style: "realistic"` or `"cartoon"`** when the anchor already names a style. The preset overrides the anchor.
167
+ - **Expecting `style` to carry the look.** Only `cartoon` and `anime` append anything; `realistic` and `none` append nothing and any other value is coerced to `none`. If the anchor names the style, `"none"` is correct — but the anchor text is doing all the work, not the preset.
163
168
 
164
169
  ## Edge cases
165
170
 
@@ -173,7 +178,7 @@ summer_generate_image(
173
178
  Print the prompt and the call:
174
179
 
175
180
  ```
176
- summer_generate_image(prompt="<character + anchor>", model="nano-banana-2", style="none", options={ image_size: "portrait_4_3" })
181
+ summer_generate_image(prompt="<character + anchor>", model="nano-banana-2", style="none")
177
182
  ```
178
183
 
179
184
  Tell the user to run via the Summer dashboard, then `summer_import_from_url` the result to `res://ui/portraits/<name>.png`.
@@ -193,4 +198,4 @@ After the portrait is wired:
193
198
  - `summer:2d-assets/concept-art` — explore the look first if not yet locked.
194
199
  - `summer:asset-pipeline/asset-strategy` — meta-router and the 3D pipeline.
195
200
  - `summer:scene-composition` — wiring the portrait into a dialogue UI scene.
196
- - `references/mcp-tools-reference.md` — `summer_generate_image` parameter schema.
201
+ - `../../../references/mcp-tools-reference.md` — `summer_generate_image` parameter schema.
@@ -44,7 +44,7 @@ If "final" → hand off to `summer:2d-assets/character-portrait`. If "explore"
44
44
  ### 2. Search for prior concepts
45
45
 
46
46
  ```
47
- summer_search_assets(query="<subject> concept", filter={ kind: "image" })
47
+ summer_search_assets(query="<subject> concept", assetType="2d_image", source="all")
48
48
  ```
49
49
 
50
50
  If something already exists, ask if the user wants to riff on it (img2img via `referenceImageUrl`) or start fresh.
@@ -69,14 +69,15 @@ Issue 3-4 calls in parallel, one per variant. Use the same subject phrasing acro
69
69
 
70
70
  ```
71
71
  summer_generate_image(
72
- prompt="<subject>. <axis variant 1>. concept art, evocative, rough painterly, atmospheric lighting",
72
+ prompt="<subject>. <axis variant 1>. concept art, evocative, rough painterly, atmospheric lighting, wide cinematic framing",
73
73
  model="nano-banana-2",
74
- style="none",
75
- options={ image_size: "landscape_16_9" }
74
+ style="none"
76
75
  )
77
76
  ```
78
77
 
79
- `style: "none"` is intentional — concept art doesn't want the default "realistic" or "cartoon" preset overriding the prompt's stylistic direction.
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
+
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
81
 
81
82
  ### 5. Present the batch
82
83
 
@@ -112,7 +113,7 @@ The structure: **subject + axis variant + "concept art" + lighting/atmosphere**.
112
113
 
113
114
  - **Generating 4 near-identical variants** because you didn't pick a real axis. The user can't choose between four images that all look like the same painting.
114
115
  - **Importing concept art as final assets.** These are exploration. The polished version comes from `character-portrait` after a direction is picked.
115
- - **Using `style: "realistic"` or `style: "cartoon"`** — the preset fights the prompt's stylistic direction. Use `style: "none"` for concept art.
116
+ - **Treating `style` as the variant axis.** The presets are `realistic | cartoon | anime | none`, and only two of them append anything. Four "stylization" variants have to differ in their prompt text, not in the `style` argument.
116
117
  - **Skipping the disambiguation question.** If you don't ask, you'll get yelled at when you generate 4 portraits and the user wanted one polished bust.
117
118
  - **Generating before the GameSoul.md is written.** If `.summer/GameSoul.md` exists, read it first — its visual-style section narrows the axis.
118
119
 
@@ -120,7 +121,7 @@ The structure: **subject + axis variant + "concept art" + lighting/atmosphere**.
120
121
 
121
122
  - **User says "just one" after you propose 4.** That's a `character-portrait` job. Hand off.
122
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.
123
- - **Subject is a fully described scene, not an asset.** You're producing key art, not asset reference. Use `image_size: "landscape_16_9"` and bias toward atmospheric.
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
125
  - **User wants the final to be 3D.** After they pick a direction, route to `summer:asset-pipeline/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.
125
126
 
126
127
  ## Fallback (no MCP)
@@ -128,7 +129,7 @@ The structure: **subject + axis variant + "concept art" + lighting/atmosphere**.
128
129
  Print the 4 prompts and the call for each:
129
130
 
130
131
  ```
131
- summer_generate_image(prompt="<variant 1>", model="nano-banana-2", style="none", options={ image_size: "landscape_16_9" })
132
+ summer_generate_image(prompt="<variant 1>", model="nano-banana-2", style="none")
132
133
  summer_generate_image(prompt="<variant 2>", ...)
133
134
  ...
134
135
  ```
@@ -149,4 +150,4 @@ Once the user picks a direction:
149
150
 
150
151
  - `summer:asset-pipeline/asset-strategy` — meta-router that delegates here vs other 2d-assets skills.
151
152
  - `summer:2d-assets/character-portrait` — the polished single-image counterpart.
152
- - `references/mcp-tools-reference.md` — `summer_generate_image` parameter schema.
153
+ - `../../../references/mcp-tools-reference.md` — `summer_generate_image` parameter schema.
@@ -5,7 +5,7 @@ license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: 2d-assets
7
7
  user-invocable: true
8
- allowed-tools: Read Grep Glob Write Edit summer_generate_image summer_search_assets summer_import_from_url
8
+ allowed-tools: Read Grep Glob Write Edit summer_get_studio_workflow summer_generate_image summer_slice_asset_sheet summer_search_assets summer_import_asset_by_id summer_import_from_url
9
9
  paths: ["assets/**", "art/**", "sprites/**"]
10
10
  ---
11
11
 
@@ -58,13 +58,16 @@ Direct the user there if they're working in the browser. The wizard:
58
58
  - Has per-slice HD upscale + bulk "Upscale all"
59
59
  - Saves as a pack ArtAsset visible in the user's library
60
60
 
61
- If the user is in a chat / agent context and can't open the browser, fall back to the programmatic path below.
61
+ If the user is in a chat / agent context, use the programmatic path below. It
62
+ now calls the same server-side slicer as the Studio wizard.
62
63
 
63
64
  ## Programmatic path (chat / agent driving the engine)
64
65
 
65
- The slicing + classification endpoints are not yet exposed as `summer_*` MCP tools. Until they are, the agent can replicate the flow manually:
66
+ 1. **Load the exact current recipe.** Call
67
+ `summer_get_studio_workflow({workflowId: "asset-pack"})`. Follow its ordered
68
+ steps and report any `manual` handoff instead of pretending it ran.
66
69
 
67
- 1. **Generate the sheet.** Call `summer_generate_image` with a prompt like:
70
+ 2. **Generate the sheet.** Call `summer_generate_image` with a prompt like:
68
71
 
69
72
  ```
70
73
  <theme> asset sheet: <comma-separated list of items>. Each item isolated with empty space around it, transparent or neutral background.
@@ -74,21 +77,18 @@ The slicing + classification endpoints are not yet exposed as `summer_*` MCP too
74
77
  - 1024x1024 is the sweet spot. Larger sheets fragment in the slicer when individual assets get below ~64px.
75
78
  - Keep the asset list to 6–20 items per sheet. Past 20, model attention degrades and slices get muddy.
76
79
 
77
- 2. **Remove background.** Call `fal-ai/bria/background/remove` on the generated URL. Cost: $0.05.
78
-
79
- 3. **Detect + name + classify.** Send the transparent PNG to a vision LLM (Gemini 3 Pro is currently the strongest at bbox + category in one shot). Use this system prompt structure:
80
+ 3. **Slice, remove background, detect, name, classify, crop, and save.** Pass
81
+ the returned image asset id to:
80
82
 
81
83
  ```
82
- Output strict JSON array, no prose:
83
- [{"name":"snake_case_name","category":"character|terrain|nature|lighting|water|decorative|buildings|ui|vfx","x":<0-100>,"y":<0-100>,"w":<0-100>,"h":<0-100>}]
84
-
85
- Coordinates are percentages of image dimensions, top-left origin.
86
- Names are 1-3 words, snake_case, specific (stone_lantern, not lamp).
84
+ summer_slice_asset_sheet({ assetId: "<generated asset id>" })
87
85
  ```
88
86
 
89
- 4. **Crop** each region with sharp / PIL / equivalent. Pad bboxes by 4px to leave breathing room.
87
+ This is the same cloud slicing pipeline used by the Studio flow. Keep the
88
+ returned slice ids/names/categories; do not reimplement the vision boxes
89
+ locally.
90
90
 
91
- 5. **Optional upscale.** For any crop where longest side < 256px, send through fal flux-2/edit i2i with prompt:
91
+ 4. **Optional upscale.** For any crop where longest side < 256px, send through fal flux-2/edit i2i with prompt:
92
92
 
93
93
  ```
94
94
  Recreate this exact <name> at high resolution. Preserve every detail, the exact pose, the exact style. Sharper edges, more detail. Transparent background. Single isolated asset, no scene.
@@ -97,7 +97,9 @@ The slicing + classification endpoints are not yet exposed as `summer_*` MCP too
97
97
  - Scale longest side to 1024, preserve aspect ratio (FLUX requires multiples of 32).
98
98
  - Don't blindly upscale everything — high-res slices get diminishing returns and you spend $0.04/slice.
99
99
 
100
- 6. **Save** as a pack record in `art_assets`: `isPack: true`, `packFiles: [{url, name, type: "image/png"}]`, `metadata.sliceBboxes`, `parentAssetId` pointing to the source sheet.
100
+ 5. **Import what the game needs.** Use the returned asset ids with
101
+ `summer_import_asset_by_id`. Keep the source pack in My Assets so the agent
102
+ and the human Studio session see the same result.
101
103
 
102
104
  ## Prompt patterns that work
103
105