summer-engine 4.3.0 → 4.5.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 (218) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +3 -1
  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/AGENTS.md +2 -2
  7. package/CHANGELOG.md +87 -0
  8. package/README.md +67 -27
  9. package/commands/start.md +19 -15
  10. package/commands/summer.md +1 -0
  11. package/dist/cli/command-usage.d.ts +3 -1
  12. package/dist/cli/command-usage.js +10 -4
  13. package/dist/cli/commands/create.d.ts +1 -25
  14. package/dist/cli/commands/create.js +10 -138
  15. package/dist/cli/commands/dev.d.ts +66 -0
  16. package/dist/cli/commands/dev.js +234 -0
  17. package/dist/cli/commands/install.d.ts +15 -58
  18. package/dist/cli/commands/install.js +31 -481
  19. package/dist/cli/commands/login.js +1 -1
  20. package/dist/cli/commands/ops.d.ts +17 -1
  21. package/dist/cli/commands/ops.js +97 -9
  22. package/dist/cli/commands/preview.d.ts +58 -0
  23. package/dist/cli/commands/preview.js +181 -0
  24. package/dist/cli/commands/run.d.ts +1 -17
  25. package/dist/cli/commands/run.js +17 -206
  26. package/dist/cli/index.js +5 -0
  27. package/dist/core/agent-host.d.ts +3 -0
  28. package/dist/core/agent-host.js +1 -1
  29. package/dist/core/api-client.d.ts +10 -2
  30. package/dist/core/api-client.js +13 -8
  31. package/dist/core/capabilities/agent-playbook.js +1 -0
  32. package/dist/core/capabilities/apps.d.ts +9 -9
  33. package/dist/core/capabilities/asset-import.d.ts +4 -1
  34. package/dist/core/capabilities/asset-import.js +15 -6
  35. package/dist/core/capabilities/capture-gameplay.js +1 -1
  36. package/dist/core/capabilities/connect-signal.d.ts +2 -2
  37. package/dist/core/capabilities/content-make/index.d.ts +81 -0
  38. package/dist/core/capabilities/content-make/index.js +706 -0
  39. package/dist/core/capabilities/content-make/media.d.ts +57 -0
  40. package/dist/core/capabilities/content-make/media.js +172 -0
  41. package/dist/core/capabilities/content-make/plan.d.ts +130 -0
  42. package/dist/core/capabilities/content-make/plan.js +433 -0
  43. package/dist/core/capabilities/content-make/render.d.ts +64 -0
  44. package/dist/core/capabilities/content-make/render.js +370 -0
  45. package/dist/core/capabilities/content-make/study.d.ts +13 -0
  46. package/dist/core/capabilities/content-make/study.js +165 -0
  47. package/dist/core/capabilities/content-make/types.d.ts +173 -0
  48. package/dist/core/capabilities/content-make/types.js +6 -0
  49. package/dist/core/capabilities/content-make/voice.d.ts +7 -0
  50. package/dist/core/capabilities/content-make/voice.js +27 -0
  51. package/dist/core/capabilities/events.d.ts +2 -2
  52. package/dist/core/capabilities/export-game.d.ts +4 -1
  53. package/dist/core/capabilities/export-game.js +4 -3
  54. package/dist/core/capabilities/export-presets.d.ts +2 -1
  55. package/dist/core/capabilities/export-presets.js +2 -1
  56. package/dist/core/capabilities/go-live.d.ts +14 -0
  57. package/dist/core/capabilities/go-live.js +408 -0
  58. package/dist/core/capabilities/image-generation.d.ts +6 -6
  59. package/dist/core/capabilities/item-manifest.d.ts +92 -0
  60. package/dist/core/capabilities/item-manifest.js +247 -0
  61. package/dist/core/capabilities/placement.d.ts +7 -7
  62. package/dist/core/capabilities/projects-local.d.ts +68 -0
  63. package/dist/core/capabilities/projects-local.js +172 -0
  64. package/dist/core/capabilities/publish-build.d.ts +13 -2
  65. package/dist/core/capabilities/publish-build.js +87 -21
  66. package/dist/core/capabilities/publish-download.js +1 -1
  67. package/dist/core/capabilities/runtime-control.d.ts +7 -2
  68. package/dist/core/capabilities/runtime-control.js +27 -1
  69. package/dist/core/capabilities/seeing/args.d.ts +2 -2
  70. package/dist/core/capabilities/store-checks.d.ts +45 -0
  71. package/dist/core/capabilities/store-checks.js +85 -0
  72. package/dist/core/capabilities/store-details.d.ts +37 -0
  73. package/dist/core/capabilities/store-details.js +94 -0
  74. package/dist/core/capabilities/summer-bundle.d.ts +21 -2
  75. package/dist/core/capabilities/summer-bundle.js +54 -7
  76. package/dist/core/capabilities/sync-items.d.ts +89 -0
  77. package/dist/core/capabilities/sync-items.js +352 -0
  78. package/dist/core/capabilities/tool-dispatch.js +66 -6
  79. package/dist/core/capabilities/video-ogv.d.ts +49 -0
  80. package/dist/core/capabilities/video-ogv.js +260 -0
  81. package/dist/core/capability-skew.js +2 -2
  82. package/dist/core/cli-usage-beacon.js +26 -2
  83. package/dist/core/cli-usage.d.ts +5 -2
  84. package/dist/core/cli-usage.js +8 -2
  85. package/dist/core/engine-install.d.ts +53 -0
  86. package/dist/core/engine-install.js +93 -0
  87. package/dist/core/engine-installer.d.ts +134 -0
  88. package/dist/core/engine-installer.js +760 -0
  89. package/dist/core/engine-launch.d.ts +126 -0
  90. package/dist/core/engine-launch.js +398 -0
  91. package/dist/core/engine-self-start.d.ts +63 -0
  92. package/dist/core/engine-self-start.js +282 -0
  93. package/dist/core/engine.d.ts +7 -1
  94. package/dist/core/engine.js +9 -2
  95. package/dist/core/error-codes.d.ts +4 -1
  96. package/dist/core/error-codes.js +7 -3
  97. package/dist/core/library-read.d.ts +2 -2
  98. package/dist/core/library-search.d.ts +2 -2
  99. package/dist/core/local-project.d.ts +50 -0
  100. package/dist/core/local-project.js +234 -0
  101. package/dist/core/ops/areas.js +9 -3
  102. package/dist/core/ops/catalog.d.ts +9 -0
  103. package/dist/core/ops/catalog.js +56 -4
  104. package/dist/core/ops/engine-answer.d.ts +4 -1
  105. package/dist/core/ops/engine-answer.js +16 -3
  106. package/dist/core/ops/engine.js +4 -4
  107. package/dist/core/ops/save-files.d.ts +6 -1
  108. package/dist/core/ops/save-files.js +67 -50
  109. package/dist/core/ops/search.js +9 -2
  110. package/dist/core/preview/input.d.ts +35 -0
  111. package/dist/core/preview/input.js +105 -0
  112. package/dist/core/preview/launch-config.d.ts +52 -0
  113. package/dist/core/preview/launch-config.js +137 -0
  114. package/dist/core/preview/page.d.ts +22 -0
  115. package/dist/core/preview/page.js +232 -0
  116. package/dist/core/preview/preview-source.d.ts +179 -0
  117. package/dist/core/preview/preview-source.js +350 -0
  118. package/dist/core/preview/server.d.ts +26 -0
  119. package/dist/core/preview/server.js +218 -0
  120. package/dist/core/telemetry.d.ts +20 -16
  121. package/dist/core/telemetry.js +92 -16
  122. package/dist/core/templates.d.ts +20 -0
  123. package/dist/core/templates.js +300 -3
  124. package/dist/core/tool-profiles.d.ts +2 -2
  125. package/dist/core/tool-profiles.js +1 -0
  126. package/dist/core/usage-fields.d.ts +41 -0
  127. package/dist/core/usage-fields.js +150 -0
  128. package/dist/core/util/sleep.d.ts +3 -0
  129. package/dist/core/util/sleep.js +12 -0
  130. package/dist/mcp/ops-surface.js +28 -2
  131. package/dist/mcp/server.d.ts +14 -4
  132. package/dist/mcp/server.js +42 -8
  133. package/dist/mcp/tool-surface.d.ts +8 -0
  134. package/dist/mcp/tool-surface.js +19 -2
  135. package/dist/mcp/tools/creator-tools.js +92 -14
  136. package/dist/mcp/tools/debug-tools.js +2 -0
  137. package/dist/mcp/tools/local-project-tools.d.ts +6 -0
  138. package/dist/mcp/tools/local-project-tools.js +33 -0
  139. package/dist/mcp/tools/navigation-tools.js +2 -1
  140. package/dist/mcp/tools/project-tools.js +5 -8
  141. package/dist/mcp/tools/seeing-tools.js +1 -1
  142. package/dist/mcp/tools/visual-tools.js +1 -1
  143. package/dist/mcp/tools/with-engine.js +1 -1
  144. package/gemini-extension.json +3 -1
  145. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -5
  146. package/library/skills/README.md +12 -8
  147. package/library/skills/animated-loop/SKILL.md +10 -16
  148. package/library/skills/cinematic-cutscene/SKILL.md +7 -18
  149. package/library/skills/headless-scripting/SKILL.md +7 -4
  150. package/library/skills/in-game-purchases/SKILL.md +25 -8
  151. package/library/skills/in-game-purchases/resource.yaml +2 -1
  152. package/library/skills/launch-ready/SKILL.md +351 -0
  153. package/library/skills/launch-ready/resource.yaml +45 -0
  154. package/library/skills/make-content/SKILL.md +202 -0
  155. package/library/skills/make-content/resource.yaml +32 -0
  156. package/library/skills/make-game/SKILL.md +2 -0
  157. package/library/skills/make-game/resource.yaml +2 -1
  158. package/library/skills/navigate-summer/SKILL.md +4 -2
  159. package/library/skills/new-project/SKILL.md +15 -22
  160. package/library/skills/new-project/resource.yaml +2 -1
  161. package/library/skills/painted-25d-world/SKILL.md +366 -0
  162. package/library/skills/painted-25d-world/_building-blocks/blender-route.md +33 -0
  163. package/library/skills/painted-25d-world/_building-blocks/blockout_builder.gd +149 -0
  164. package/library/skills/painted-25d-world/_building-blocks/capture_paint_view.gd +32 -0
  165. package/library/skills/painted-25d-world/_building-blocks/paint_projection.gdshader +23 -0
  166. package/library/skills/painted-25d-world/_building-blocks/paintcam_check.gd +25 -0
  167. package/library/skills/painted-25d-world/_building-blocks/painted_door.gd +17 -0
  168. package/library/skills/painted-25d-world/_building-blocks/painted_location.gd +56 -0
  169. package/library/skills/painted-25d-world/_building-blocks/painted_player.gd +125 -0
  170. package/library/skills/painted-25d-world/_building-blocks/painted_world.gd +111 -0
  171. package/library/skills/painted-25d-world/_building-blocks/tools/cam.py +57 -0
  172. package/library/skills/painted-25d-world/_building-blocks/tools/detail4k.py +81 -0
  173. package/library/skills/painted-25d-world/_building-blocks/tools/overlay.py +17 -0
  174. package/library/skills/painted-25d-world/_building-blocks/tools/preview.py +60 -0
  175. package/library/skills/painted-25d-world/resource.yaml +39 -0
  176. package/library/skills/publish-your-game/SKILL.md +13 -14
  177. package/library/skills/publish-your-game/resource.yaml +4 -3
  178. package/library/skills/release-checklist/SKILL.md +188 -0
  179. package/library/skills/release-checklist/resource.yaml +40 -0
  180. package/library/skills/release-readiness/SKILL.md +1 -1
  181. package/library/skills/release-readiness/resource.yaml +1 -1
  182. package/library/skills/store-art/SKILL.md +1 -1
  183. package/library/skills/store-art/resource.yaml +1 -1
  184. package/library/skills/store-listing/SKILL.md +1 -1
  185. package/library/skills/store-listing/resource.yaml +1 -1
  186. package/library/skills/summer-cli/SKILL.md +2 -0
  187. package/library/skills/summer-store/SKILL.md +295 -39
  188. package/library/skills/summer-store/resource.yaml +9 -3
  189. package/library/skills/trailer-shot/SKILL.md +3 -3
  190. package/library/templates/README.md +5 -0
  191. package/library/tools/content-make/resource.yaml +132 -0
  192. package/library/tools/frame-shot/GUIDE.md +1 -1
  193. package/library/tools/go-live/resource.yaml +67 -0
  194. package/library/tools/import-from-url/GUIDE.md +1 -0
  195. package/library/tools/import-from-url-batch/GUIDE.md +1 -1
  196. package/library/tools/play/GUIDE.md +2 -0
  197. package/library/tools/projects-create-local/resource.yaml +55 -0
  198. package/library/tools/projects-open-local/resource.yaml +51 -0
  199. package/library/tools/publish-build/resource.yaml +3 -3
  200. package/library/tools/screenshot/GUIDE.md +1 -1
  201. package/library/tools/store-set-details/resource.yaml +114 -0
  202. package/library/tools/sync-items/resource.yaml +72 -0
  203. package/package.json +1 -1
  204. package/registry/generated/aliases.json +6 -0
  205. package/registry/generated/counts.json +3 -3
  206. package/registry/generated/gemini-extension.json +3 -1
  207. package/registry/generated/index.json +463 -37
  208. package/registry/generated/marketplace.claude.json +1 -1
  209. package/registry/generated/plugin.claude-directory.json +4 -2
  210. package/registry/generated/plugin.claude.json +3 -1
  211. package/registry/generated/plugin.codex.json +5 -3
  212. package/registry/generated/plugin.cursor.json +4 -2
  213. package/registry/generated/plugin.factory.json +4 -2
  214. package/registry/generated/server.json +2 -2
  215. package/registry/generated/skills-index.md +12 -8
  216. package/registry/generated/skills-registry.json +62 -5
  217. package/registry/operations/legacy-names.json +40 -0
  218. package/registry/operations/public-catalog.json +10144 -387
@@ -0,0 +1,351 @@
1
+ ---
2
+ name: launch-ready
3
+ description: "Get a game ready to launch on Summer Games and take it live: upload, real screenshots, store art and listing, gathered and filled in."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Glob Bash summer_get_project_context summer_read_file summer_export_game summer_publish_build summer_capture_gameplay summer_play summer_game_input summer_screenshot summer_stop summer_get_diagnostics summer_store_set_details summer_go_live summer_docs_read summer_call
9
+ ---
10
+
11
+ # /launch-ready: gather everything the game needs, then take it live
12
+
13
+ The `release-checklist` skill checks a game before launch and reports what is
14
+ missing. This skill makes it pass: it exports and uploads the build, captures
15
+ real gameplay screenshots, makes the key art and icons, writes the store page
16
+ from the project, fills in every listing detail, shows the creator the result
17
+ and takes the game live with one confirmation.
18
+
19
+ The checklist is the source of the rules. Read it first
20
+ (`summer_docs_read` with id `skill/release-checklist`); this skill names its
21
+ rules by number (1.1 to 4.14) and says how to make each one pass.
22
+
23
+ A call written `area.action` is the tool `summer_area_action` when your client
24
+ lists it, else `summer_call` with `op: "area.action"`. Engine tools keep their
25
+ `summer_*` names.
26
+
27
+ ## Rules that never bend
28
+
29
+ - **Never invent a fact.** Every feature, mode, player count, language,
30
+ rating answer and AI answer comes from something you saw in the project or
31
+ in play, or from the creator. When you can't tell, ask.
32
+ - **Screenshots are real gameplay.** Frames from the running game, unedited:
33
+ no captions, no overlays, no mockups, no AI edits. The game's own HUD may
34
+ show.
35
+ - **Key art may be generated, but it shows this game:** its characters, its
36
+ world, its art style, and nothing it doesn't have. Start from a real
37
+ capture.
38
+ - **Tags, genres and features describe the game.** They are not keywords for
39
+ reach. Pick only what is true; never add a popular tag the game doesn't
40
+ earn.
41
+ - **The content rating, the content questionnaire and the AI disclosure are
42
+ statements the creator makes.** Draft them from evidence, show the
43
+ evidence, and have the creator confirm them. Parents' controls use the
44
+ rating, so when in doubt pick the stricter answer.
45
+ - **Ask the creator** for what the project can't tell you: the price, the
46
+ support contact, the developer name, the release stage, and anything legal
47
+ or factual you could not see.
48
+ - **Say what you will generate before you spend credits.** Every generation
49
+ call takes `dryRun: true` for the estimate.
50
+ - **Nothing goes live before the creator's yes** to the summary in step 6.
51
+
52
+ ## The flow
53
+
54
+ 1. Find the game and run the checklist, changing nothing.
55
+ 2. Gather the facts from the project.
56
+ 3. Ask the creator once: the questions and the plan.
57
+ 4. Fix each failure: build, screenshots, art, listing.
58
+ 5. Run the checklist again until it passes.
59
+ 6. Show the creator everything and get one confirmation.
60
+ 7. Go live, and report live or the exact blocker.
61
+
62
+ ## 1. Find the game and run the checklist
63
+
64
+ 1. `summer_get_project_context`: binds the project and returns the main
65
+ scene and project memory (GameSoul, decisions).
66
+ 2. `games.list` finds the store game by name. When there is none, plan
67
+ `games.create` with the title and targets (it makes a draft; nothing is
68
+ published).
69
+ 3. Read the state: `store.get_listing` with `previews: true` (text, art per
70
+ slot, `checklist`, `readyToPublish`, `availableTags`), `store.status`
71
+ (every upload, its version, state and checks, and what is live) and
72
+ `pricing.get`.
73
+ 4. Mark every checklist rule pass, fail, not applicable or not run. Rules 1.x
74
+ and 2.x stay not run until step 4 exports and uploads.
75
+
76
+ ## 2. Gather the facts from the project
77
+
78
+ Read before you write. Keep each fact with where you found it; the summary
79
+ in step 6 shows the source.
80
+
81
+ | Fact | Where |
82
+ | --- | --- |
83
+ | What the game is, its genre, its core loop, its look | `.summer/GameSoul.md`, `.summer/memory/`, `.summer/build-plan.md`, `README.md`, `project.godot` (`application/config/name`, `description`) |
84
+ | The gameplay scene and how to reach it | The main scene, the title screen's buttons, the game's command-line flags (`OS.get_cmdline_user_args`) |
85
+ | Online play | `summer.build.json` names a server; `Summer.client` matchmaking or join code |
86
+ | Saves that follow the player | `Summer.authority.player_data` commits |
87
+ | Purchases | `summer.items.json`, `Summer.client.store` calls |
88
+ | Controller support | Joypad events in the InputMap: every action (full) or some (partial) |
89
+ | Languages | `internationalization/locale/translations`, `.po` or `.csv` files; voiced lines and their subtitles |
90
+ | Renderer and size | `rendering/renderer/rendering_method`; the export's file size |
91
+ | Phone orientation | `display/window/handheld/orientation` |
92
+ | Mature content | What you see in play, the dialogue and text files, the art |
93
+ | AI use | Assets generated with Summer (`assets.get` says `aiGenerated`), `.summer/` generation records, code an agent wrote (git history, `.summer/` records, and you if you wrote any), AI that runs inside the game |
94
+
95
+ Then **play it**: `summer_play`, reach the gameplay with `summer_game_input`,
96
+ and look with `summer_screenshot` (`target: "game"`). Note the good moments
97
+ for screenshots (below) and the inputs that reach them, and anything a
98
+ rating answer depends on: violence, blood, language, flashing lights, other
99
+ players. `summer_get_diagnostics`, then `summer_stop`.
100
+
101
+ ## 3. Ask the creator once
102
+
103
+ One message, before anything changes or anything is spent:
104
+
105
+ - **What is missing:** each failed rule, one line.
106
+ - **What you will do:** export and upload version `vX.Y.Z`; capture N
107
+ screenshots; generate key art, icons, tall cover and capsules (with the
108
+ `dryRun` credit estimate); write the store text. Their yes approves these;
109
+ none of it makes the game live.
110
+ - **What only they can answer**, as choices with your recommendation first:
111
+ - Price: free, or a price. A paid game needs their seller account set up
112
+ in Studio first; until then it stays free.
113
+ - Support contact: an email address or an https page.
114
+ - Developer name, and the publisher if there is one.
115
+ - Release stage: released, early access, or in development (listed only on
116
+ the In development page).
117
+ - Anything the evidence did not settle: chat with strangers, content made
118
+ by players, flashing lights, real-world brands or people.
119
+
120
+ Wait for the answers.
121
+
122
+ ## 4. Fix each failure
123
+
124
+ ### Build (rules 1.1 to 2.5)
125
+
126
+ What to upload (rule 1.5): a game with a server, or one for iPhone or
127
+ Android, needs a store bundle (format `bundle`). A game without a server
128
+ ships web and desktop as downloads (format `download`), one per platform.
129
+
130
+ An upload is missing when `store.status` has none for a target, and stale
131
+ when the newest one is older than the project's last change (`git log -1
132
+ --format=%cI`, or the newest file outside `.godot/` and `.summer/`), failed,
133
+ failed a check the creator owns, or carries a Summer version line older than
134
+ the current release (rule 1.2).
135
+
136
+ 1. `summer_export_game`: format `bundle` (a game with a server passes its
137
+ `targets` and `alignDeclaration: true`), or format `download` with one
138
+ target. Read rules 1.1 to 1.5 from the answer.
139
+ 2. Run the `release-readiness` checks an agent can run on a bundle `.zip`
140
+ (1, 6, 7, 8 steps 1 to 4, 9). A failure there is a game change: show it
141
+ to the creator and fix it with their OK before uploading.
142
+ 3. `summer_publish_build` with the `gameId`, the next `clientVersion` (one
143
+ past the newest in `store.status`), the `platform` for a download, and
144
+ `confirm: true` (step 3 approved it). For a bundle, read `checksState`
145
+ and every `checks` entry: `owner: "creator"` means fix, export again and
146
+ upload a new version; `owner: "summer"` means nothing to change;
147
+ `checking` means call again. Keep the `publicationId`. A download is
148
+ ready when `store.status` says so (rule 2.5).
149
+
150
+ ### Screenshots (rules 3.4 and 3.7)
151
+
152
+ 1. **Pick the moments** from your play in step 2. Good moments show the
153
+ core action, different places, enemies or characters, and a reward or
154
+ upgrade screen. Skip menus, loading, pause, empty rooms, debug text and
155
+ near-duplicates.
156
+ 2. **Capture them full size** with `summer_capture_gameplay`: the gameplay
157
+ `scene`, or the game's `args` or `steps` to get past the title, one
158
+ `shot` step per moment, up to 10 frames. Use `resolution` `1920x1080` for
159
+ desktop. Phones take the same 1920x1080 frames when the game is
160
+ landscape, and `1080x1920` when it is portrait.
161
+ 3. **Look at every frame** before you use it. Drop black, blurred, title,
162
+ paused or repeated ones. A warning that frames are not the size you asked
163
+ for comes from the project's stretch settings: never upscale; tell the
164
+ creator and ask before changing the game.
165
+ 4. **Keep the best:** 4 to 8 for desktop, 3 to 8 for phones, the strongest
166
+ first.
167
+ 5. **Upload each one:** `assets.upload_begin`, run its `example` command
168
+ with the file path, then `assets.upload_complete` with `publicId`,
169
+ `version` and `uploadSignature` (`public_id`, `version` and `signature` in
170
+ that command's answer) and `format` `png`. You get an `assetId` and a
171
+ `fileUrl`.
172
+ 6. `store.set_art` with slot `desktop.screenshots` or `mobile.screenshots`
173
+ and the asset ids. Use `mode: "append"` to keep good screenshots already
174
+ on the page. Read `placed` and `checklist` in the answer.
175
+
176
+ ### Key art, icons, tall cover and capsules (rules 3.3, 3.5, 3.6, 3.8, 3.9)
177
+
178
+ Load the `store-art` skill first (`summer_docs_read` with id
179
+ `skill/store-art`) and follow it: it has each slot's current rules. Where it
180
+ and this table differ, it wins.
181
+
182
+ Start from the strongest capture: `assets.edit_image` with its `fileUrl` as
183
+ `imageUrl`, the size below, and a prompt that keeps the game's characters,
184
+ world, colours and art style, recomposes the scene for the slot, removes the
185
+ HUD and adds no text. When the edit loses the game's look,
186
+ `assets.generate_image` with the capture as `referenceImageUrl`.
187
+
188
+ | Slot | Size to ask for | Text |
189
+ | --- | --- | --- |
190
+ | `desktop.keyArt`, `mobile.keyArt` | 2048x1152 (16:9) | None |
191
+ | `mobile.tallCover` | 1152x2048 (9:16) | None |
192
+ | `desktop.icon`, `mobile.icon` | 1024x1024 | None; one clear subject that reads small |
193
+ | `desktop.capsuleTall` | 1200x1600 (3:4) | Only the game's own logo, when the project has one |
194
+ | `desktop.capsuleWide` | 1472x688 (460:215) | Only the game's own logo, when the project has one |
195
+
196
+ Each size is a multiple of 16 (what `assets.edit_image` takes) and above the
197
+ slot's minimum. Both key art slots may use the same image, and both icons
198
+ too. Never invent a logo.
199
+
200
+ Look at every result (`assets.get`, then open its file). It must show this
201
+ game. Make at most two tries per slot; when neither shows the game, ask the
202
+ creator. Put each into its slot with `store.set_art`, with a `focalPoint` on
203
+ key art and covers so the store's crops keep the subject. A shape refusal
204
+ names the slot's rule: make it again at the right size. The page holds at
205
+ most 20 images and videos (rule 3.10).
206
+
207
+ ### Listing details (rules 4.1 to 4.13)
208
+
209
+ Load the `store-listing` skill (`summer_docs_read` with id
210
+ `skill/store-listing`) for the writing rules. Then fill:
211
+
212
+ | Field | From | With |
213
+ | --- | --- | --- |
214
+ | Title (4.1) | The current title; else the project's name | `store.update_listing` |
215
+ | Tagline (4.2), short descriptions (4.3), long description (4.4) | GameSoul, README, what you saw in play: what the player does, the modes, the controls | `store.update_listing` |
216
+ | Tags (4.5) | 3 to 8 that are true, from `availableTags` only | `store.update_listing` |
217
+ | Targets (4.7) | The platforms the build was exported for | `store.update_listing` |
218
+ | Support (4.11), release stage (4.12) | The creator's answers | `store.update_listing` |
219
+ | Content rating and descriptors (4.8) | The questionnaire below, confirmed by the creator | `store.update_listing` |
220
+ | Genres, features (4.6) | Genres from `availableTags` (category genre); features only the project proves | `summer_store_set_details` |
221
+ | Credits, languages, system requirements | The creator's names; the languages the game ships; for requirements only what you know (operating systems from the targets, graphics from the renderer, storage from the export size, network when it plays online) | `summer_store_set_details` |
222
+ | Content questionnaire (4.9) | Below | `summer_store_set_details` |
223
+ | AI disclosure (4.10) | Below | `summer_store_set_details` |
224
+ | Price (4.13) | The creator's answer | `pricing.set_base`, only for a price they chose |
225
+
226
+ **The content questionnaire.** Answer each question from what you saw:
227
+ violence (none, fantasy, realistic), blood, sexual content, nudity, strong
228
+ language, substances, gambling (simulated or real money), content players
229
+ make that others see, playing with others online, and purchases. `none` is
230
+ an answer only after you looked. The content rating is the lowest of
231
+ `everyone`, `everyone10Plus` and `teen` that honestly covers those answers,
232
+ with every descriptor that applies (`[]` when none does). If no rating on
233
+ the list covers the content, stop and ask the creator; never pick a milder
234
+ one to fit.
235
+
236
+ **The AI disclosure.** `assets` when any image, model, sound or video in the
237
+ game or on its store page was generated (the art step above counts), `code`
238
+ when an AI agent wrote code for it (you count, if you wrote any),
239
+ `generatedGameplay` when the running game generates content with AI
240
+ (describe what it generates and its guardrails). `[]` only when the creator
241
+ confirms no AI was used.
242
+
243
+ These drafts go on the page draft, which players don't see; the creator
244
+ confirms them in step 6, before anything goes live.
245
+
246
+ `pricing.set_base` may answer `needs_approval` (give the creator the link)
247
+ or `seller_setup_required` (the game stays free until they set up selling in
248
+ Studio; say so). Record the creator's answers and what you made in
249
+ `.summer/build-plan.md`.
250
+
251
+ ## 5. Run the checklist again
252
+
253
+ Read `store.get_listing` (`checklist`, `readyToPublish`) and `store.status`,
254
+ and go through every rule. Fix what still fails and read again. Stop after
255
+ three rounds that change nothing: report the rule, what you saw and who must
256
+ act. A rule only the creator can clear (a seller account, a Studio setting)
257
+ is reported, not retried.
258
+
259
+ ## 6. Show the creator everything, and get one confirmation
260
+
261
+ 1. `summer_go_live` with the `gameId`, the bundle's `publicationId` (when
262
+ there is one) and no `confirm`: it answers the plan (the platforms, the
263
+ version, the page).
264
+ 2. `store.preview_link` with the `gameId`: a private link to the page as
265
+ players will see it.
266
+ 3. One message:
267
+ - the preview link;
268
+ - every image with its slot: the local file path of each capture, and the
269
+ preview URLs from `store.get_listing` with `previews: true`, as images
270
+ where the chat shows them;
271
+ - all text, word for word: title, tagline, descriptions, tags, genres,
272
+ features, languages, requirements, support, release stage, price;
273
+ - the content questionnaire, the rating and the AI disclosure, each answer
274
+ with its evidence;
275
+ - the build version and its checks, and the release-readiness checks only
276
+ a player can run, marked not run;
277
+ - the credits spent;
278
+ - the go-live plan.
279
+ 4. Ask one question: take it live? A change request: make it, run the
280
+ affected part of the checklist again, show what changed and ask again.
281
+
282
+ ## 7. Go live
283
+
284
+ `summer_go_live` with the `gameId`, the bundle's `publicationId` (when there
285
+ is one) and `confirm: true`. Report its answer:
286
+
287
+ - `live`: the store URL. Ask the creator to open it as a player on
288
+ summer.games and in the Summer Games apps, and to run the release-readiness
289
+ player checks (2, 8 step 5, 9 step 3, 10).
290
+ - `blocked`: each failure with its fix. Fix them (step 4) and go live again;
291
+ a fix that changes what the creator saw needs their yes again.
292
+ - `waiting` with `waitingOn: "summer"`: every check passed and Summer holds
293
+ the launch on its side. Nothing to fix; it goes live by itself. Call again
294
+ to keep watching. Never tell the creator to wait for a review.
295
+ - `needs_permission`: their Agent permissions have Publish off. Ask them to
296
+ turn it on (Studio > Agent permissions), or use `store.publish`, which
297
+ returns a link for them to approve.
298
+ - `needs_changes`: Summer sent the page back; fix every line of its feedback
299
+ and go live again.
300
+
301
+ End with one line: **Live** with the store URL, or **Not live** with the
302
+ exact blocker, who must act, and the next step.
303
+
304
+ ## Checklist
305
+
306
+ - [ ] Read `release-checklist`, `store-art` and `store-listing` before acting.
307
+ - [ ] Asked the creator once, before any spend or upload: price, support, developer, release stage, open facts.
308
+ - [ ] The build is current, uploaded and every platform check is read.
309
+ - [ ] Screenshots are unedited frames of real play, at slot size, looked at one by one.
310
+ - [ ] Key art, icons, cover and capsules start from a real capture, carry no text (a capsule at most the game's own logo) and show this game.
311
+ - [ ] Every listing fact has a source; tags, genres and features are true.
312
+ - [ ] The rating, questionnaire and AI disclosure were confirmed by the creator.
313
+ - [ ] The checklist passes, or the remaining blocker is named.
314
+ - [ ] The creator saw the preview link, every image and all text, and said yes.
315
+ - [ ] `summer_go_live` with `confirm: true` ran only after that yes; reported live or the exact blocker.
316
+
317
+ <!-- shell-commands: generated from the operation catalog by npm run generate:registry; do not edit by hand -->
318
+ ## From a shell
319
+
320
+ No Summer MCP tools in this session? Run each one as a command; when `summer --version` is missing or below 4.0, use `npx -y summer-engine@latest` in place of `summer`. Fields are flags in kebab-case (`--scene-path res://main.tscn`) or one `--input '<json>'`, and `summer ops describe <op>` prints the exact input. The `summer-cli` skill has the rest.
321
+
322
+ | In this skill | Command |
323
+ |---|---|
324
+ | `assets.generate_image` | `summer assets generate-image` |
325
+ | `assets.get` | `summer assets get` |
326
+ | `assets.upload_begin` | `summer assets upload-begin` |
327
+ | `assets.upload_complete` | `summer assets upload-complete` |
328
+ | `summer_docs_read` | `summer docs read` |
329
+ | `summer_capture_gameplay` | `summer engine capture-gameplay` |
330
+ | `summer_export_game` | `summer engine export-game` |
331
+ | `summer_game_input` | `summer engine game-input` |
332
+ | `summer_get_diagnostics` | `summer engine get-diagnostics` |
333
+ | `summer_get_project_context` | `summer engine get-project-context` |
334
+ | `summer_play` | `summer engine play` |
335
+ | `summer_read_file` | `summer engine read-file` |
336
+ | `summer_screenshot` | `summer engine screenshot` |
337
+ | `summer_stop` | `summer engine stop` |
338
+ | `games.create` | `summer games create` |
339
+ | `games.list` | `summer games list` |
340
+ | `pricing.get` | `summer pricing get` |
341
+ | `pricing.set_base` | `summer pricing set-base` |
342
+ | `store.get_listing` | `summer store get-listing` |
343
+ | `summer_go_live` | `summer store go-live` |
344
+ | `store.preview_link` | `summer store preview-link` |
345
+ | `store.publish` | `summer store publish` |
346
+ | `store.set_art` | `summer store set-art` |
347
+ | `summer_store_set_details` | `summer store set-details` |
348
+ | `store.status` | `summer store status` |
349
+ | `store.update_listing` | `summer store update-listing` |
350
+ | `summer_publish_build` | `summer store upload-file` |
351
+ <!-- /shell-commands -->
@@ -0,0 +1,45 @@
1
+ id: skill/launch-ready
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Get a game ready to launch on Summer Games and take it live: upload, real screenshots, store art and listing, gathered and filled in."
5
+ use_when:
6
+ - "the user says 'get my game ready to launch', 'make my store page', 'publish my game to summer.games' or 'do everything it needs to go live'"
7
+ - "the release checklist fails and the agent should fix it: upload the game, capture gameplay screenshots, make key art and icons, write the store text"
8
+ - "filling a whole store page from the project itself: GameSoul and project memory, README, real gameplay captures"
9
+ - "drafting the content rating, content questionnaire and AI disclosure from the project, for the creator to confirm before launch"
10
+ do_not_use_when:
11
+ - "only checking what is missing, without changing anything — skill/release-checklist"
12
+ - "proving players can join, save and play the release on phones — skill/release-readiness"
13
+ - "exporting for Steam, itch.io or app stores — skill/export-and-ship"
14
+ facets:
15
+ lifecycle:
16
+ - launch
17
+ domains:
18
+ - creator
19
+ - deployment
20
+ - assets
21
+ modalities:
22
+ - images
23
+ - docs
24
+ - project
25
+ compatibility:
26
+ engine: ">=4.6"
27
+ related:
28
+ skills:
29
+ - skill/release-checklist
30
+ - skill/store-art
31
+ - skill/store-listing
32
+ - skill/publish-your-game
33
+ - skill/release-readiness
34
+ tools:
35
+ - tool/export-game
36
+ - tool/publish-build
37
+ - tool/capture-gameplay
38
+ - tool/store-set-details
39
+ - tool/go-live
40
+ - tool/get-project-context
41
+ source: official
42
+ license: MIT
43
+ status: preview
44
+ recommended: false
45
+ bundled: false
@@ -0,0 +1,202 @@
1
+ ---
2
+ name: make-content
3
+ description: "Make a finished, postable video of your game, cut per platform and saved for review."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: video
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Glob Write Edit Bash summer_docs_read summer_call summer_jobs_wait summer_capture_gameplay summer_assets_generate_video
9
+ paths: ["content/**"]
10
+ ---
11
+
12
+ # make-content: a finished piece of content for your game
13
+
14
+ The person wants their game seen, not a content job. Decide everything and hand back a finished piece they only have to approve. Never hand back a plan, a draft list or questions you can answer yourself.
15
+
16
+ ## The method: copy one real video, beat for beat
17
+
18
+ You do not freestyle. Real creators already found what works: copy their format one to one, beat for beat, with this game in it. Every piece starts from ONE reference video: a post from `content.list_references` (its clip from `content.get_reference`), or a real creator's video the person sends you.
19
+
20
+ 1. **Study the reference first**, before you capture anything:
21
+ - a frame-exact cut list: `ffmpeg -i ref.mp4 -vf "select='gt(scene,0.3)',showinfo" -f null -` (each `pts_time` is a cut; check by eye, lower the threshold for soft cuts);
22
+ - a transcript of any voice, with times;
23
+ - the text of every beat: its wording pattern ("POV: you...", "Day 12 making..."), where it sits, its size, when it comes and goes;
24
+ - the sound (where the beat drops, where the voice sits) and the total length.
25
+ 2. **Write a beat map** in `work/beats.md`: one row per reference beat with start, end, what happens, the text, the voice line, and which of our shots fills it. Every beat gets a shot; no beat is added or dropped.
26
+ 3. **Cut to the same timings** (each cut within 2 frames), the same text pattern in our words, the same voice structure (as many lines, the same rhythm, the same places) and the same length.
27
+ 4. **Check side by side before saving:** the reference and your cut next to each other (ffmpeg `hstack`), cut by cut. A beat that is off, missing or extra is a rebuild.
28
+
29
+ Never invent a structure. If no reference fits, pick another moment, not your own structure. Copy the shape, never the material: no reference footage (a trend swap's swapped clip is the one exception), audio or caption text in the piece.
30
+
31
+ ## Hard rules (break one and it does not ship)
32
+
33
+ 1. **Highest quality always.** Never downscale or re-encode below the master to get past an upload limit; a 4K master goes up in 4K. Use a path that carries the full file.
34
+ 2. **No AI labels.** Never say or show that anything was made with AI: not in captions, titles, descriptions, on screen or in a voice-over.
35
+ 3. **No reference audio.** Never post the sound of the clip you followed. Use the game's own audio, a score made for this piece (`makers.game_score`), or a trending sound the person adds inside the app.
36
+ 4. **No credits to inspirations.** Never write "inspired by", never tag or name the creator or the game a format came from.
37
+ 5. **Vertical is reframed, never stretched.** Crop or zoom each shot onto its subject. Never squeeze, never letterbox, never a blurred copy behind the video.
38
+ 6. **No static end card on TikTok, Reels or Shorts.** The last beat is action; the play line goes over it.
39
+
40
+ Also: real game footage only for gameplay (never generated gameplay or fake UI); never claim a feature that is not live; never name other games in public copy; fresh shots for every piece (never re-cut an old piece with new text); no labels, glows, shadows or overlays the kit did not ask for.
41
+
42
+ ## 1. How to run it
43
+
44
+ 1. **Run it in a background subagent.** The coding session never waits. The main agent says one line ("Cutting a TikTok of the new boss; the review link follows.") and goes back to work.
45
+ 2. **Asked: make it. Noticed a visible change: offer once, in one line** ("Clip the new boss fight for TikTok?"). Never ask about format, length or caption: decide.
46
+ 3. **Find the game.** `team.list` gives the `teamId`. `content.list_games` gives the `contentGameId` (`content.create_game` when it has none). Then read, in this order:
47
+ - `content.get_kit`: characters with pictures, colours, fonts, style, voice, do and don't rules, the store slug, and the Learnings section. The kit wins over this skill.
48
+ - `content.list_references`: what performs now and fits this game, best fit first, each with why it works and an idea for this game. Your reference comes from here.
49
+ - `content.search_library`: the team's raw clips, pictures and earlier pieces.
50
+ - `content.list_pieces`: the last pieces, so you do not repeat them.
51
+ 4. **Feedback first, without being asked.** At session start and after every `content.save_piece`, call `content.list_pieces` with the game and status `changes_requested`. A piece with `needsWork: true` comes before anything new: `whatToChange` says what the team wants. Fix it on the same reference and beat map, then `content.update_piece` with status `in_review` and `expectedRevision`. Nobody should have to tell you twice.
52
+ 5. **Work in `content/pieces/<slug>/`** in the project. Add `content/` to `.gitignore` before the first file. Keep `raw/`, `work/` and `final/` apart.
53
+ 6. **Deliver finished:** one render per platform, a cover, captions per platform, then `content.save_piece` and one line with the `reviewUrl`. That is the whole reply.
54
+ 7. **Keep watching.** While the session lives, read each piece you saved with `content.get_piece` every few minutes. When `needsWork` turns true, act on it at once and say in one line what you changed.
55
+
56
+ Reload this skill any time with `docs.read` (`skill/make-content`).
57
+
58
+ ## 2. Pick the moment, then the reference
59
+
60
+ - **Start from the moment:** what changed or what is best in the game right now. A new boss, a rare drop, a clutch win, a funny physics bug, a new skin, a milestone.
61
+ - **Then ONE reference** whose `howGamesCanUseIt` fits that moment. Skip expired ones. Choose by the viewer hook (why a stranger stops scrolling), not by how it is made.
62
+ - **Vary:** never the same reference format twice in a row; each piece differs from the last 5 on at least 2 of format, hook, opening frame, sound, length. A numbered series keeps its format on purpose. Over a week, at least half the pieces are gameplay pieces.
63
+
64
+ ## 3. Reference shapes by viewer hook
65
+
66
+ What each kind of reference looks like, to choose which one to copy. The reference's own beats win over these notes. Lengths are vertical short-form unless noted; each example is a real, measured post.
67
+
68
+ **Trend swap with a gameplay payoff.** Hook: the viral shape, your hero as the surprise. 7-15 s, the source's length. Swap your hero into the trending clip (`content.make_video` for a library reference, or `makers.bankai_swap` with the source video and a picture of your character): the one shape that keeps the source picture. End on the same hero doing the matching move in real gameplay. Example: a costume walk shot feet first in one 15 s take, the camera tilting up to the faces on the drop (54M views).
69
+
70
+ **The reveal (the pull).** Hook: a rarity is coming. 6-10 s, or up to 50 s as a ranking. Name the payoff in the hook ("wait for the <rarest thing>."); rarity only climbs. Example: every reward of a secret drop ranked worst to best on a ladder of question marks, 59 cuts in 49 s, word-by-word captions (649K views).
71
+
72
+ **Gameplay gag or fail.** Hook: a moment every player has lived, readable muted. 5-15 s, loops; the game writes the punchline (a death screen, a banner, a stat). Example: text builds word by word over a match ("you know you're a true player when..."), then an open goal missed: 3 shots, 14 s (583K views, 3x usual).
73
+
74
+ **Clutch or big moment.** Hook: tension, then release. 8-35 s: the tension point, the result, a slow-motion replay of the key half second. Example: a speedrun time promised in the header, a big timer, a face cam with real stress, only the attempts kept (5.7M views).
75
+
76
+ **Devlog with the dev's voice.** Hook: a person, a stance, visible progress. 20-55 s, voice at 0 s, proof on screen every 2-6 s, gameplay not menus. Example: a weekly Short opens on gameplay with "This week I added <one behavior>", then it plays out: 6 cuts in 51 s, 1.8-3.5M views a part. Also "Day <N> making a <genre> game".
77
+
78
+ **WIP devlog (scuffed is fine).** Hook: real work, happening now. 20-40 s. Copy a real devlog's beats (a "this week I added..." Short is a good one) with a screen recording of the real dev session: the agent chat and the game changing, each reference beat filled by a moment something changes. Voice-over in the reference's line structure: the developer's own voice, or one that reads the key lines of the chat. Real footage only, captions burned in, no capture mode needed; rough is fine because it is real. The chat on screen is the session, not an AI label: add no "made with AI" text.
79
+
80
+ **Comment reply (viewer ideas).** Hook: the community's idea, tested, as a numbered series. Example: one viewer suggestion per episode in a single 40 s screen recording, no cuts (2M views on a 2K-follower account).
81
+
82
+ **Lore short.** Hook: a fact they half know. 20-60 s (100 s for a solved mystery): the claim over the exact thing at 0 s, the stakes by 8 s, a picture change every 2-3 s, the reveal said slower, an open question at the end. Example: a mystery solved through in-game logs, 96 s, 4.2M views on a 196K channel.
83
+
84
+ **Hero, class or skin showcase.** Hook: choice and identity. 12-30 s, the best ability first, one hero per 1.5-2 s on the beat, a comment prompt at the end. Example: one moment recorded twice and stacked, the new skin in first person on top, the enemy's view below (419K views, 4x usual).
85
+
86
+ **Trailer cut with a hook.** Hook: a premise nobody has seen, 12 words or fewer by 3 s. 20-22 s on Reels, 40-90 s on YouTube: 2-3 clean gameplay segments on the game's audio, then the name and "Play on summer.games/<slug>" from the kit ("coming soon" if not playable). Example: one tactile action in first person, then a pull back to thousands of the same thing, 13 cuts in 40 s (1.3M views on a 638-subscriber channel).
87
+
88
+ **Shots that fill a beat:** a real screenshot animated (`makers.cinematic_shot`); before and after, both real; a build in steps, each changing the silhouette; a speed build with an honest clock; a premise card over clean gameplay.
89
+
90
+ ## 4. Footage
91
+
92
+ Real gameplay wins: on our accounts real footage got 2,500-6,200 views and memes or generated visuals 270-380. Every piece shows at least 2 s of real gameplay; trend swaps end on it.
93
+
94
+ **Capture to the beat map:** each beat needs its shot, at the beat's length plus a little to trim.
95
+
96
+ **Choose the look before you capture.** This is where the first pieces failed. Pick the best map, time of day, camera and skins (never the placeholder hero or a bright test level), and write that choice into the kit's style. If no scene looks good, build a filming scene from the game's own assets: a real sky, some fog, lower exposure and bloom, a rim light on the hero. Film with the HUD off whenever you will add text. Never cut menu, store or concept art next to gameplay that does not look like it.
97
+
98
+ **Reject these frames:** debug screens, blown-out bloom, empty white skies, T-poses, foot sliding, placeholder animations, pop-in, stutter, clipping cameras, missing textures, usernames, notifications, a cursor. No edit saves cheap footage; re-capture.
99
+
100
+ Sources, best first:
101
+ 1. **The game's capture mode**, if it has one: HUD toggle, cinematic camera (orbit, follow, low hero angle, slow motion), bots for filming, forced results (a guaranteed legendary), every skin unlocked. If you own the code and it has none, add one behind a flag first; it pays back on every piece.
102
+ 2. **A web build in headless Chrome with the GPU on** (`--ignore-gpu-blocklist`). Record the game canvas, not the page: `canvas.captureStream(60)` into a `MediaRecorder` (H.264 if offered, about 40 Mbps), with the game's audio tapped from its `AudioContext`. Set the viewport to 1080x1920 and to 1920x1080 for separate takes (device scale 2 for a 4K master), so neither orientation is a crop of the other. Drive inputs from a script and record 3-5 takes per beat. Playwright's own `recordVideo` is soft and silent: use it only to plan shots.
103
+ 3. **A desktop run in movie mode:** start the game offscreen with `--write-movie shots/frame.png --fixed-fps 60` for lossless frames plus a WAV, frame-exact.
104
+ 4. **The team's raw clips** from `content.search_library`. Upload what you capture too (`content.upload_begin`), with a one-line description of what happens in it.
105
+ 5. **Stills:** `engine.capture_gameplay` saves real frames (up to 10) for covers, thumbnails and start frames; hide the HUD first if the game can. `engine.screenshot` and `engine.frame_shot` give a composed frame from the editor.
106
+ 6. **Shots made from real game art:** `makers.cinematic_shot` (a real frame plus a prompt), `assets.generate_video`, `makers.camera_moves`, `makers.character_turnaround`, from a real screenshot or the kit's pictures, in the game's style, hero on model. At most one per piece, and end on real gameplay.
107
+
108
+ Capture at 30 fps or more (60 for action you will slow down), at the final aspect. To reframe 16:9 into 9:16, capture at 1440p or higher; never upscale more than 1.35x.
109
+
110
+ ## 5. Edit recipes
111
+
112
+ You edit with your own tools (ffmpeg, scripts, Remotion if the project has it). The reference's timings, text and voice win; these are the defaults inside each beat.
113
+
114
+ - **Frame 1 moves.** No idle start, no logo, no title card, no black. Something happens by 1 s.
115
+ - **Cut on the first changed frame.** Drop dead frames. No freeze over 0.5 s in the first 1.5 s, and none over 1 s anywhere except the held payoff.
116
+ - **Payoff where the reference has it** (usually before 70%), then hold it; short pieces loop, so the last frame leads back into the first.
117
+ - **One idea per piece.** Never explain the joke.
118
+ - **Text:** big, pure white, bold sans (the kit's font, else Inter Bold), no shadow, no outline, no box behind it unless the kit says so. One text layer at a time (a fixed header, a premise card or a timer is that layer), 7 words or fewer, two sizes at most (title about 7% of the width on vertical). At least 40 px tall on a 1080-wide frame. Put it on a calm part of the frame, never over the game's HUD, a face or the action, and keep it in one place. Wrap a long line to two big lines; never shrink it.
119
+ - **Vertical:** per shot, `scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920:X:Y` with X and Y on the subject (use 2160x3840 when the source carries it). Move the crop at most once per shot, slowly.
120
+ - **Sound:** audio at 0 s and to the last frame; no dead air. The game's audio carries gameplay. Under a voice, music sits 18-22 LU lower or not at all. Build the audio track once for the whole cut, not per segment (per-segment audio drifts out of sync). Loudness -14 LUFS integrated, true peak -1 dBTP or lower.
121
+ - **Generated motion in a drawn style:** step it to 12 frames a second; smooth motion reads as fake.
122
+ - **Encode:** H.264 High, yuv420p, CRF 17, preset slow, 30 fps (keep 60 if the source has it), AAC 192k, `+faststart`. At least 4000 kbps at 1080p and about 16000 at 4K.
123
+
124
+ ## 6. Per platform
125
+
126
+ Make a separate render when length, safe zones or aspect differ. One file copied to every platform is not a per-platform cut.
127
+
128
+ | Platform | Frame | Length | Notes |
129
+ |---|---|---|---|
130
+ | TikTok | 1080x1920 (a full-frame 16:9 trailer also works) | 5-15 s for gags and trends, 15-35 s otherwise | No end card: the action line goes over the last action. Link in bio and in the first comment. |
131
+ | Instagram Reels | 1080x1920 | 20-22 s, or the trend's length | No end card. The grid crops the cover to the centre 3:4 (y 240-1680): keep the cover text there. |
132
+ | YouTube Shorts | 1080x1920 or square | 5-15 s loops, 30-58 s otherwise | Anything wider than square counts as long-form and gets no Shorts reach. Title up to 100 characters, hook in the first 40. No end card. |
133
+ | X | 1920x1080 or 1080x1080 | 30-90 s best, 140 s at most | Vertical does badly. Burn in the captions (muted autoplay). Link in a reply, not the post. |
134
+ | YouTube long | 1920x1080 or 3840x2160 | 4-15 min | Devlogs and trailers. Title as a search phrase. Thumbnail 1280x720 or larger, 3 words at most. Chapters from 00:00. No music under a voice; ship an SRT. |
135
+
136
+ **Safe zones on vertical:** keep text and key action out of the top 14%, the bottom 25%, 7% at each side, and the right 13% between 30% and 80% of the height.
137
+
138
+ ## 7. Hooks, captions, sound
139
+
140
+ **Hooks:** use the reference's hook pattern in our words. Shapes that work: the maker's story with a number ("<N> people. <N> years."); one mystery; one detail, magnified (a second-person premise: "You start as <something tiny>"); a personal, lowercase discovery; naming the payoff. **Weak:** "X but Y" comparisons, "from the studio behind", a logo or title first, a slow establishing shot. On-screen hook: 7 words or fewer, readable in 1.5 s. Spoken hook: 12 words or fewer, finished by 3 s. Rotate openers outside a series.
141
+
142
+ **Captions:** one dry line, one question that invites an answer, and the words people search for. The game name in plain text. Use 3-5 hashtags on video platforms, the game's tag first, then 1-2 niche tags and at most one trend tag. No em dashes, no emojis, no numbers you cannot source. Avoid kill, blood, murder and death in captions, titles and tags: reach drops.
143
+
144
+ **First comment:** the play link from the kit. Check it opens on a phone first. If the game is not playable yet, say "coming soon", never "play now".
145
+
146
+ **Sound:** the game's own audio or a score made for the piece. For a trending sound, cut on its beat using its audio for timing only, strip it, export with game sound, and write the sound and its start time in `suggestedSound` ("<sound name>, start 0:34"); the person adds it in the app.
147
+
148
+ ## 8. Taste bar and self-check
149
+
150
+ **Why the first pieces failed.** Summer's first game clips passed a measured critic at 7-8 of 10, and the game's maker called them very bad: a bright test map, the placeholder hero, bloom blobs, mismatched menu art, captions on the HUD. Checks catch mistakes, not a cheap look. Taste comes first.
151
+
152
+ **The taste test.** Put your frame 1 and your best frame next to the game's best art (the kit's character pictures and references, the store art) and next to the reference clip, at phone size. If yours looks cheaper, emptier or smaller, re-capture before you polish. Would a stranger stop on frame 1 with the sound off? Would the team post this on their own account today? If not, it is not done.
153
+
154
+ **Measured checks (script them; all must pass):**
155
+ - Side by side with the reference: every cut within 2 frames, the same text pattern and voice structure, the same length.
156
+ - A contact sheet every 0.5 s of every render, that you actually look at.
157
+ - Motion in frame 1: no freeze over 0.5 s in the first 1.5 s (`freezedetect`), none over 1 s anywhere except the held payoff.
158
+ - Text at least 40 px on a 1080-wide frame, inside the safe zones, clear of the HUD and faces.
159
+ - Loudness -14 LUFS (plus or minus 1), true peak -1 dBTP or lower, no silence over 0.5 s (`silencedetect` at -50 dB), audio as long as the video.
160
+ - At least 2 s of real gameplay. Short side at least 1080 px. No stretched shot.
161
+ - Copy: no AI words, no other game named, nothing that is not live, the link works.
162
+ - Different from the last 5 pieces on at least 2 of format, hook, opening frame, sound, length.
163
+
164
+ **Fresh critic.** Spawn a new subagent with none of your context. Give it the renders, the captions, the reference clip, your beat map and the game's best art. It answers first: does any frame look cheaper than that art (test map, placeholder hero, bloom blobs, empty sky, mismatched menu art, text on the HUD, a debug screen)? Any yes is a rebuild, whatever the score. Then it plays the reference and the piece side by side, beat by beat, watches the first 1.5 s muted, and gives the one idea, whether it stops the scroll, what reads wrong, and a score from 1 to 10 with timestamps. Rebuild below 8, at most twice, and keep the better render. If it still scores under 8, save it with status `draft` and say in `notes` and in your reply line what blocks it. The final score goes in `selfScore`.
165
+
166
+ ## 9. Upload and save
167
+
168
+ 1. For each render and cover: `content.upload_begin` (`fileName`, `contentType`, `size` in bytes) gives an `uploadUrl`; PUT the file there with that content type; then `content.upload_complete` (`uploadId`, `title`, `description` of what happens in it, `tags`, `folder`) gives the item id.
169
+ 2. `content.save_piece` with `contentGameId`, `title`, `format`, and `variants` (1-5, one per platform: `platform` of `tiktok`, `instagram`, `youtube`, `youtube_long` or `x`; `itemId`; `coverItemId`; `caption`; `title` for YouTube; `hashtags`; `firstComment`; `suggestedSound`). Add `referenceId` (always: the reference you copied), `sourceItemIds`, `gameplaySeconds`, `selfScore`, `notes`, and what Today shows under the player: `why` (`referenceId`, `fitReason`: one line on why it fits today, like the commit you saw, `refStats` with `views`, `likes`, `breakoutRatio`, `postedAt`), `checks` (`hook_seconds`, `min_shot_motion`, `safe_zone`, `loudness_lufs`, `true_peak_db`, `length_seconds`, `gameplay_seconds`, each with the measured `value` and `pass`; never a predicted score), `sideBySideItemId` (a library video: the reference left, yours right, synced), `contactSheetItemId`, `learningIds` (the kit learnings you applied) and `tomorrow` (what you make next). `summer content make` does all of this and reports each stage to its make request (`content.make`, `content.claim_make`, `content.update_make`; `jobs.wait` on `make:<requestId>`). It lands on the team's Today view.
170
+ 3. Reply with one line and the `reviewUrl`.
171
+ 4. Keep watching it (section 1, step 7). Feedback arrives on the piece: `needsWork` and `whatToChange`. Revise with `content.update_piece` (pass `expectedRevision`; status `in_review` sends it back). When the team says it is posted, `content.mark_posted`.
172
+
173
+ ## 10. Learnings
174
+
175
+ Every Change note and Skip reason becomes a learning in the kit by itself (`content.get_kit` `learnings`, with the piece it came from). Read them first on every run, follow each one, and list the ones you applied in `learningIds`. The team removes one with `content.delete_learning`. A data rule you find yourself stays a hypothesis until 3 pieces beat the account's median by 1.5x.
176
+
177
+ <!-- shell-commands: generated from the operation catalog by npm run generate:registry; do not edit by hand -->
178
+ ## From a shell
179
+
180
+ No Summer MCP tools in this session? Run each one as a command; when `summer --version` is missing or below 4.0, use `npx -y summer-engine@latest` in place of `summer`. Fields are flags in kebab-case (`--scene-path res://main.tscn`) or one `--input '<json>'`, and `summer ops describe <op>` prints the exact input. The `summer-cli` skill has the rest.
181
+
182
+ | In this skill | Command |
183
+ |---|---|
184
+ | `assets.generate_video`, `summer_assets_generate_video` | `summer assets generate-video` |
185
+ | `content.get_kit` | `summer content get-kit` |
186
+ | `content.list_games` | `summer content list-games` |
187
+ | `content.list_references` | `summer content list-references` |
188
+ | `content.make` | `summer content make` |
189
+ | `content.make_video` | `summer content make-video` |
190
+ | `content.mark_posted` | `summer content mark-posted` |
191
+ | `docs.read`, `summer_docs_read` | `summer docs read` |
192
+ | `engine.capture_gameplay`, `summer_capture_gameplay` | `summer engine capture-gameplay` |
193
+ | `engine.frame_shot` | `summer engine frame-shot` |
194
+ | `engine.screenshot` | `summer engine screenshot` |
195
+ | `jobs.wait`, `summer_jobs_wait` | `summer jobs wait` |
196
+ | `makers.bankai_swap` | `summer makers bankai-swap` |
197
+ | `makers.camera_moves` | `summer makers camera-moves` |
198
+ | `makers.character_turnaround` | `summer makers character-turnaround` |
199
+ | `makers.cinematic_shot` | `summer makers cinematic-shot` |
200
+ | `makers.game_score` | `summer makers game-score` |
201
+ | `team.list` | `summer team list` |
202
+ <!-- /shell-commands -->
@@ -0,0 +1,32 @@
1
+ id: skill/make-content
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Make a finished, postable video of your game, cut per platform and saved for review."
5
+ use_when:
6
+ - "a developer asks for content for their game: a TikTok, Reels or Shorts clip, an X video, a trailer cut or a devlog"
7
+ - "a visible change just landed (a boss, a skin, a level, a rare drop) and a short clip of it would do well on social"
8
+ - "a piece of content came back with a Change note on the team's Today view"
9
+ do_not_use_when:
10
+ - "one generated trailer shot with no edit around it (use trailer-shot)"
11
+ - "a scripted story cutscene inside the game (use cinematic-cutscene)"
12
+ - "store page art: key art, covers, icons, screenshots (use store-art)"
13
+ facets:
14
+ lifecycle:
15
+ - grow
16
+ - launch
17
+ domains:
18
+ - creator
19
+ - video
20
+ modalities:
21
+ - video
22
+ related:
23
+ skills:
24
+ - skill/trailer-shot
25
+ - skill/cinematic-cutscene
26
+ - skill/store-art
27
+ tools:
28
+ - tool/capture-gameplay
29
+ source: official
30
+ license: MIT
31
+ status: stable
32
+ recommended: false