summer-engine 4.3.0 → 4.6.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 (231) 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 +100 -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/commands/setup.js +175 -32
  27. package/dist/cli/index.js +5 -0
  28. package/dist/core/agent-host.d.ts +3 -0
  29. package/dist/core/agent-host.js +1 -1
  30. package/dist/core/api-client.d.ts +10 -2
  31. package/dist/core/api-client.js +13 -8
  32. package/dist/core/capabilities/agent-playbook.js +1 -0
  33. package/dist/core/capabilities/apps.d.ts +9 -9
  34. package/dist/core/capabilities/asset-import.d.ts +4 -1
  35. package/dist/core/capabilities/asset-import.js +15 -6
  36. package/dist/core/capabilities/capture-gameplay.js +1 -1
  37. package/dist/core/capabilities/connect-signal.d.ts +2 -2
  38. package/dist/core/capabilities/content-make/index.d.ts +81 -0
  39. package/dist/core/capabilities/content-make/index.js +706 -0
  40. package/dist/core/capabilities/content-make/media.d.ts +57 -0
  41. package/dist/core/capabilities/content-make/media.js +172 -0
  42. package/dist/core/capabilities/content-make/plan.d.ts +130 -0
  43. package/dist/core/capabilities/content-make/plan.js +433 -0
  44. package/dist/core/capabilities/content-make/render.d.ts +64 -0
  45. package/dist/core/capabilities/content-make/render.js +370 -0
  46. package/dist/core/capabilities/content-make/study.d.ts +13 -0
  47. package/dist/core/capabilities/content-make/study.js +165 -0
  48. package/dist/core/capabilities/content-make/types.d.ts +173 -0
  49. package/dist/core/capabilities/content-make/types.js +6 -0
  50. package/dist/core/capabilities/content-make/voice.d.ts +7 -0
  51. package/dist/core/capabilities/content-make/voice.js +27 -0
  52. package/dist/core/capabilities/events.d.ts +2 -2
  53. package/dist/core/capabilities/export-game.d.ts +4 -1
  54. package/dist/core/capabilities/export-game.js +4 -3
  55. package/dist/core/capabilities/export-presets.d.ts +2 -1
  56. package/dist/core/capabilities/export-presets.js +2 -1
  57. package/dist/core/capabilities/go-live.d.ts +14 -0
  58. package/dist/core/capabilities/go-live.js +408 -0
  59. package/dist/core/capabilities/image-generation.d.ts +6 -6
  60. package/dist/core/capabilities/item-manifest.d.ts +92 -0
  61. package/dist/core/capabilities/item-manifest.js +247 -0
  62. package/dist/core/capabilities/placement.d.ts +7 -7
  63. package/dist/core/capabilities/projects-local.d.ts +68 -0
  64. package/dist/core/capabilities/projects-local.js +172 -0
  65. package/dist/core/capabilities/publish-build.d.ts +13 -2
  66. package/dist/core/capabilities/publish-build.js +87 -21
  67. package/dist/core/capabilities/publish-download.js +1 -1
  68. package/dist/core/capabilities/runtime-control.d.ts +7 -2
  69. package/dist/core/capabilities/runtime-control.js +27 -1
  70. package/dist/core/capabilities/seeing/args.d.ts +2 -2
  71. package/dist/core/capabilities/store-checks.d.ts +45 -0
  72. package/dist/core/capabilities/store-checks.js +85 -0
  73. package/dist/core/capabilities/store-details.d.ts +37 -0
  74. package/dist/core/capabilities/store-details.js +94 -0
  75. package/dist/core/capabilities/summer-bundle.d.ts +21 -2
  76. package/dist/core/capabilities/summer-bundle.js +54 -7
  77. package/dist/core/capabilities/sync-items.d.ts +89 -0
  78. package/dist/core/capabilities/sync-items.js +352 -0
  79. package/dist/core/capabilities/tool-dispatch.js +66 -6
  80. package/dist/core/capabilities/video-ogv.d.ts +49 -0
  81. package/dist/core/capabilities/video-ogv.js +260 -0
  82. package/dist/core/capability-skew.js +2 -2
  83. package/dist/core/cli-usage-beacon.js +26 -2
  84. package/dist/core/cli-usage.d.ts +5 -2
  85. package/dist/core/cli-usage.js +8 -2
  86. package/dist/core/engine-install.d.ts +53 -0
  87. package/dist/core/engine-install.js +93 -0
  88. package/dist/core/engine-installer.d.ts +134 -0
  89. package/dist/core/engine-installer.js +760 -0
  90. package/dist/core/engine-launch.d.ts +126 -0
  91. package/dist/core/engine-launch.js +398 -0
  92. package/dist/core/engine-self-start.d.ts +63 -0
  93. package/dist/core/engine-self-start.js +282 -0
  94. package/dist/core/engine.d.ts +7 -1
  95. package/dist/core/engine.js +9 -2
  96. package/dist/core/error-codes.d.ts +4 -1
  97. package/dist/core/error-codes.js +7 -3
  98. package/dist/core/library-read.d.ts +2 -2
  99. package/dist/core/library-search.d.ts +2 -2
  100. package/dist/core/local-project.d.ts +50 -0
  101. package/dist/core/local-project.js +234 -0
  102. package/dist/core/ops/areas.js +9 -3
  103. package/dist/core/ops/catalog.d.ts +9 -0
  104. package/dist/core/ops/catalog.js +56 -4
  105. package/dist/core/ops/engine-answer.d.ts +4 -1
  106. package/dist/core/ops/engine-answer.js +16 -3
  107. package/dist/core/ops/engine.js +4 -4
  108. package/dist/core/ops/save-files.d.ts +6 -1
  109. package/dist/core/ops/save-files.js +67 -50
  110. package/dist/core/ops/search.js +9 -2
  111. package/dist/core/preview/input.d.ts +35 -0
  112. package/dist/core/preview/input.js +105 -0
  113. package/dist/core/preview/launch-config.d.ts +52 -0
  114. package/dist/core/preview/launch-config.js +137 -0
  115. package/dist/core/preview/page.d.ts +22 -0
  116. package/dist/core/preview/page.js +232 -0
  117. package/dist/core/preview/preview-source.d.ts +179 -0
  118. package/dist/core/preview/preview-source.js +350 -0
  119. package/dist/core/preview/server.d.ts +26 -0
  120. package/dist/core/preview/server.js +218 -0
  121. package/dist/core/telemetry.d.ts +20 -16
  122. package/dist/core/telemetry.js +92 -16
  123. package/dist/core/templates.d.ts +20 -0
  124. package/dist/core/templates.js +300 -3
  125. package/dist/core/tool-profiles.d.ts +2 -2
  126. package/dist/core/tool-profiles.js +1 -0
  127. package/dist/core/usage-fields.d.ts +41 -0
  128. package/dist/core/usage-fields.js +150 -0
  129. package/dist/core/util/sleep.d.ts +3 -0
  130. package/dist/core/util/sleep.js +12 -0
  131. package/dist/installer/agent-config.d.ts +29 -0
  132. package/dist/installer/agent-config.js +75 -11
  133. package/dist/installer/agent-detect.d.ts +44 -0
  134. package/dist/installer/agent-detect.js +166 -0
  135. package/dist/installer/agent-table.d.ts +19 -0
  136. package/dist/installer/agent-table.js +130 -0
  137. package/dist/installer/setup-error.d.ts +19 -0
  138. package/dist/installer/setup-error.js +34 -0
  139. package/dist/installer/version-check.d.ts +5 -0
  140. package/dist/installer/version-check.js +21 -0
  141. package/dist/mcp/ops-surface.d.ts +7 -0
  142. package/dist/mcp/ops-surface.js +40 -3
  143. package/dist/mcp/server.d.ts +14 -4
  144. package/dist/mcp/server.js +42 -8
  145. package/dist/mcp/tool-surface.d.ts +8 -0
  146. package/dist/mcp/tool-surface.js +19 -2
  147. package/dist/mcp/tools/creator-tools.js +92 -14
  148. package/dist/mcp/tools/debug-tools.js +2 -0
  149. package/dist/mcp/tools/local-project-tools.d.ts +6 -0
  150. package/dist/mcp/tools/local-project-tools.js +33 -0
  151. package/dist/mcp/tools/navigation-tools.js +2 -1
  152. package/dist/mcp/tools/project-tools.js +5 -8
  153. package/dist/mcp/tools/seeing-tools.js +1 -1
  154. package/dist/mcp/tools/visual-tools.js +1 -1
  155. package/dist/mcp/tools/with-engine.js +1 -1
  156. package/dist/project-memory/agent-instructions.js +11 -3
  157. package/gemini-extension.json +3 -1
  158. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -5
  159. package/library/skills/README.md +12 -8
  160. package/library/skills/animated-loop/SKILL.md +10 -16
  161. package/library/skills/cinematic-cutscene/SKILL.md +7 -18
  162. package/library/skills/headless-scripting/SKILL.md +7 -4
  163. package/library/skills/in-game-purchases/SKILL.md +25 -8
  164. package/library/skills/in-game-purchases/resource.yaml +2 -1
  165. package/library/skills/launch-ready/SKILL.md +351 -0
  166. package/library/skills/launch-ready/resource.yaml +45 -0
  167. package/library/skills/make-content/SKILL.md +202 -0
  168. package/library/skills/make-content/resource.yaml +32 -0
  169. package/library/skills/make-game/SKILL.md +6 -4
  170. package/library/skills/make-game/resource.yaml +2 -1
  171. package/library/skills/navigate-summer/SKILL.md +4 -2
  172. package/library/skills/new-project/SKILL.md +15 -22
  173. package/library/skills/new-project/resource.yaml +2 -1
  174. package/library/skills/painted-25d-world/SKILL.md +366 -0
  175. package/library/skills/painted-25d-world/_building-blocks/blender-route.md +33 -0
  176. package/library/skills/painted-25d-world/_building-blocks/blockout_builder.gd +149 -0
  177. package/library/skills/painted-25d-world/_building-blocks/capture_paint_view.gd +32 -0
  178. package/library/skills/painted-25d-world/_building-blocks/paint_projection.gdshader +23 -0
  179. package/library/skills/painted-25d-world/_building-blocks/paintcam_check.gd +25 -0
  180. package/library/skills/painted-25d-world/_building-blocks/painted_door.gd +17 -0
  181. package/library/skills/painted-25d-world/_building-blocks/painted_location.gd +56 -0
  182. package/library/skills/painted-25d-world/_building-blocks/painted_player.gd +125 -0
  183. package/library/skills/painted-25d-world/_building-blocks/painted_world.gd +111 -0
  184. package/library/skills/painted-25d-world/_building-blocks/tools/cam.py +57 -0
  185. package/library/skills/painted-25d-world/_building-blocks/tools/detail4k.py +81 -0
  186. package/library/skills/painted-25d-world/_building-blocks/tools/overlay.py +17 -0
  187. package/library/skills/painted-25d-world/_building-blocks/tools/preview.py +60 -0
  188. package/library/skills/painted-25d-world/resource.yaml +39 -0
  189. package/library/skills/publish-your-game/SKILL.md +13 -14
  190. package/library/skills/publish-your-game/resource.yaml +4 -3
  191. package/library/skills/release-checklist/SKILL.md +188 -0
  192. package/library/skills/release-checklist/resource.yaml +40 -0
  193. package/library/skills/release-readiness/SKILL.md +1 -1
  194. package/library/skills/release-readiness/resource.yaml +1 -1
  195. package/library/skills/store-art/SKILL.md +1 -1
  196. package/library/skills/store-art/resource.yaml +1 -1
  197. package/library/skills/store-listing/SKILL.md +1 -1
  198. package/library/skills/store-listing/resource.yaml +1 -1
  199. package/library/skills/summer-cli/SKILL.md +2 -0
  200. package/library/skills/summer-store/SKILL.md +295 -39
  201. package/library/skills/summer-store/resource.yaml +9 -3
  202. package/library/skills/trailer-shot/SKILL.md +3 -3
  203. package/library/templates/README.md +5 -0
  204. package/library/tools/content-make/resource.yaml +132 -0
  205. package/library/tools/frame-shot/GUIDE.md +1 -1
  206. package/library/tools/go-live/resource.yaml +67 -0
  207. package/library/tools/import-from-url/GUIDE.md +1 -0
  208. package/library/tools/import-from-url-batch/GUIDE.md +1 -1
  209. package/library/tools/play/GUIDE.md +2 -0
  210. package/library/tools/projects-create-local/resource.yaml +55 -0
  211. package/library/tools/projects-open-local/resource.yaml +51 -0
  212. package/library/tools/publish-build/resource.yaml +3 -3
  213. package/library/tools/screenshot/GUIDE.md +1 -1
  214. package/library/tools/store-set-details/resource.yaml +114 -0
  215. package/library/tools/sync-items/resource.yaml +72 -0
  216. package/package.json +1 -1
  217. package/registry/generated/aliases.json +6 -0
  218. package/registry/generated/counts.json +3 -3
  219. package/registry/generated/gemini-extension.json +3 -1
  220. package/registry/generated/index.json +463 -37
  221. package/registry/generated/marketplace.claude.json +1 -1
  222. package/registry/generated/plugin.claude-directory.json +4 -2
  223. package/registry/generated/plugin.claude.json +3 -1
  224. package/registry/generated/plugin.codex.json +5 -3
  225. package/registry/generated/plugin.cursor.json +4 -2
  226. package/registry/generated/plugin.factory.json +4 -2
  227. package/registry/generated/server.json +2 -2
  228. package/registry/generated/skills-index.md +12 -8
  229. package/registry/generated/skills-registry.json +62 -5
  230. package/registry/operations/legacy-names.json +40 -0
  231. package/registry/operations/public-catalog.json +10144 -387
@@ -0,0 +1,81 @@
1
+ """A 2K paint-over -> an aligned 4K painting. Upscale 2x, cut nine overlapping 2048x1152 tiles (1024x576 stride),
2
+ run a strict "redraw sharper, pixel-aligned" image-to-image pass on each tile with seedream-5-pro (the Summer image
3
+ model that returns 2048x1152), then blend the tiles back with tent weights. Nine image generations.
4
+ Uses the Summer CLI (`summer`, or set SUMMER_BIN); every call carries an idempotencyKey and numImages 1, and a
5
+ timed-out call is retried with the same key (a timeout can still charge). Needs Python with Pillow and numpy.
6
+ usage: python3 detail4k.py <painting_2k.png> <out_dir> "<style words>" [run_id]"""
7
+ import json, os, shlex, subprocess, sys, time, concurrent.futures as cf
8
+ import numpy as np
9
+ from PIL import Image
10
+ S = shlex.split(os.environ.get("SUMMER_BIN", "summer"))
11
+ src, outdir, style = sys.argv[1], sys.argv[2], sys.argv[3]
12
+ run_id = sys.argv[4] if len(sys.argv) > 4 else os.path.splitext(os.path.basename(src))[0]
13
+ os.makedirs(outdir, exist_ok=True)
14
+ PROMPT = ("This is a crop of a hand-painted game background, shown at low resolution. "
15
+ f"Redraw it at full sharpness in its own style ({style}): crisp painterly brush strokes and fine texture detail. "
16
+ "This is a texture paint-over: keep the image pixel-aligned. Every edge, silhouette, object, colour and light stays "
17
+ "exactly where it is. Same framing, no zoom, no crop. Do not add, remove, move or resize anything. "
18
+ "No characters, no text, no border.")
19
+
20
+ def run(args, inp=None):
21
+ r = subprocess.run(S + args + ["--json"] + (["--input", json.dumps(inp)] if inp else []), capture_output=True, text=True)
22
+ txt = r.stdout.strip() or r.stderr.strip()
23
+ if "{" in txt:
24
+ try:
25
+ return json.JSONDecoder().raw_decode(txt[txt.find("{"):])[0]
26
+ except Exception:
27
+ pass
28
+ sys.stderr.write("unparsed: " + txt[-300:] + r.stderr[-300:] + "\n")
29
+ return {"ok": False, "error": {"code": "outcome_unknown"}}
30
+
31
+ def upload(path):
32
+ b = run(["assets", "upload-begin"])["result"]
33
+ f = b["fields"]
34
+ cmd = ["curl", "-sS", b["uploadUrl"]] + sum([["-F", f"{k}={v}"] for k, v in f.items()], []) + ["-F", f"file=@{path}"]
35
+ up = json.loads(subprocess.run(cmd, capture_output=True, text=True).stdout)
36
+ c = run(["assets", "upload-complete"], {"publicId": up["public_id"], "version": up["version"], "uploadSignature": up["signature"], "format": "png", "title": os.path.basename(path)})
37
+ return c["result"]["fileUrl"]
38
+
39
+ def tile(job):
40
+ i, path = job
41
+ out = os.path.join(outdir, f"tile_{i}_paint.png")
42
+ if os.path.exists(out):
43
+ return out
44
+ cache = path + ".url"
45
+ if not os.path.exists(cache):
46
+ open(cache, "w").write(upload(path))
47
+ url = open(cache).read().strip()
48
+ for attempt in range(30):
49
+ r = run(["assets", "generate-image"], {"prompt": PROMPT, "referenceImageUrl": url, "model": "seedream-5-pro", "aspectRatio": "16:9",
50
+ "width": 2048, "height": 1152, "numImages": 1, "title": f"{run_id} 4k tile {i}",
51
+ "idempotencyKey": f"{run_id}-4k-tile-{i}", "out": out})
52
+ code = r.get("error", {}).get("code")
53
+ if r.get("ok") or code not in ("outcome_unknown", "in_progress"):
54
+ break
55
+ time.sleep(15)
56
+ if not r.get("ok"):
57
+ raise RuntimeError(json.dumps(r)[:600])
58
+ print("tile", i, r["result"].get("creditsCharged"), flush=True)
59
+ return out
60
+
61
+ base = Image.open(src).convert("RGB").resize((4096, 2304), Image.LANCZOS)
62
+ base.save(os.path.join(outdir, "base4k.png"))
63
+ jobs = []
64
+ for ty in range(3):
65
+ for tx in range(3):
66
+ x, y = tx * 1024, ty * 576
67
+ p = os.path.join(outdir, f"tile_{ty * 3 + tx}.png")
68
+ base.crop((x, y, x + 2048, y + 1152)).save(p)
69
+ jobs.append((ty * 3 + tx, p))
70
+ with cf.ThreadPoolExecutor(3) as ex:
71
+ outs = list(ex.map(tile, jobs))
72
+ acc = np.zeros((2304, 4096, 3)); wsum = np.zeros((2304, 4096, 1))
73
+ wx = 1 - np.abs(np.linspace(-1, 1, 2048)); wy = 1 - np.abs(np.linspace(-1, 1, 1152))
74
+ w = (np.outer(wy, wx) + 1e-3)[..., None]
75
+ for (i, _), o in zip(jobs, outs):
76
+ t = np.asarray(Image.open(o).convert("RGB").resize((2048, 1152), Image.LANCZOS)).astype(float)
77
+ x, y = (i % 3) * 1024, (i // 3) * 576
78
+ tw = w.copy()
79
+ acc[y:y + 1152, x:x + 2048] += t * tw; wsum[y:y + 1152, x:x + 2048] += tw
80
+ Image.fromarray(np.clip(acc / wsum, 0, 255).astype(np.uint8)).save(os.path.join(outdir, "paint4k.png"))
81
+ print("done", os.path.join(outdir, "paint4k.png"))
@@ -0,0 +1,17 @@
1
+ """Alignment check: red edges of the blockout render over the paint-over. Roof lines, wall corners and props must
2
+ sit on the red lines; reject a painting that moved, added or zoomed anything. Needs Python with Pillow and numpy.
3
+ usage: python3 overlay.py <blockout.png> <painting.png> <out.png>"""
4
+ import sys
5
+
6
+ import numpy as np
7
+ from PIL import Image, ImageFilter
8
+
9
+ block, paint, out = sys.argv[1:4]
10
+ p = Image.open(paint).convert("RGB")
11
+ b = Image.open(block).convert("RGB").resize(p.size, Image.NEAREST)
12
+ a = np.asarray(b).astype(int)
13
+ e = (np.abs(np.diff(a, axis=0, prepend=a[:1])).sum(2) > 40) | (np.abs(np.diff(a, axis=1, prepend=a[:, :1])).sum(2) > 40)
14
+ e = np.asarray(Image.fromarray((e * 255).astype(np.uint8)).filter(ImageFilter.MaxFilter(3))) > 0
15
+ o = np.asarray(p).copy()
16
+ o[e] = [255, 0, 0]
17
+ Image.fromarray(o).save(out)
@@ -0,0 +1,60 @@
1
+ """Draw the blockout spec's wireframe (red) over the concept through the paint camera, no engine needed.
2
+ Fix block positions until the red lines sit on the concept's silhouettes, then build in the engine
3
+ (blockout_builder.gd reads the same spec). Camera settings: see cam.py. Needs Python with Pillow.
4
+ usage: python3 preview.py <concept.png> <blockout.json> <out.png>"""
5
+ import json, math, sys, os
6
+ sys.path.insert(0, os.path.dirname(__file__))
7
+ from cam import to_px, IMG
8
+ from PIL import Image, ImageDraw
9
+
10
+ def ry(v, deg):
11
+ a = math.radians(deg); x, y, z = v
12
+ return (x * math.cos(a) + z * math.sin(a), y, -x * math.sin(a) + z * math.cos(a))
13
+ def rx(v, deg):
14
+ a = math.radians(deg); x, y, z = v
15
+ return (x, y * math.cos(a) - z * math.sin(a), y * math.sin(a) + z * math.cos(a))
16
+
17
+ def rz(v, deg):
18
+ a = math.radians(deg); x, y, z = v
19
+ return (x * math.cos(a) - y * math.sin(a), x * math.sin(a) + y * math.cos(a), z)
20
+
21
+ def edges(o):
22
+ k = o["kind"]; P = o.get("pos", [0, 0, 0]); yaw = o.get("yaw", 0); rxd = o.get("rot_x", 0); rzd = o.get("rot_z", 0)
23
+ S = o.get("scale", [1, 1, 1])
24
+ def w(v):
25
+ v = (v[0] * S[0], v[1] * S[1], v[2] * S[2])
26
+ v = ry(rx(rz(v, rzd), rxd), yaw)
27
+ return (P[0] + v[0], P[1] + v[1], P[2] + v[2])
28
+ if k == "box":
29
+ sx, sy, sz = [s / 2 for s in o["size"]]
30
+ c = [(x, y, z) for x in (-sx, sx) for y in (-sy, sy) for z in (-sz, sz)]
31
+ E = [(a, b) for a in range(8) for b in range(a + 1, 8) if bin(a ^ b).count("1") == 1]
32
+ return [(w(c[a]), w(c[b])) for a, b in E]
33
+ if k == "prism":
34
+ sx, sy, sz = [s / 2 for s in o["size"]]
35
+ v = {"l0": (-sx, -sy, -sz), "r0": (sx, -sy, -sz), "a0": (0, sy, -sz), "l1": (-sx, -sy, sz), "r1": (sx, -sy, sz), "a1": (0, sy, sz)}
36
+ E = [("l0", "r0"), ("r0", "a0"), ("a0", "l0"), ("l1", "r1"), ("r1", "a1"), ("a1", "l1"), ("l0", "l1"), ("r0", "r1"), ("a0", "a1")]
37
+ return [(w(v[a]), w(v[b])) for a, b in E]
38
+ if k in ("cyl", "sphere"):
39
+ out = []
40
+ if k == "cyl":
41
+ rings = [(0, o["r_bot"]), (o["height"], o["r_top"])]
42
+ else:
43
+ r = o["radius"]; sy = o.get("sy", 1)
44
+ rings = [(r * sy * math.sin(t), r * math.cos(t)) for t in (-0.9, -0.45, 0, 0.45, 0.9)]
45
+ for (hy, r) in rings:
46
+ pts = [(P[0] + r * math.cos(a * math.pi / 12), P[1] + hy, P[2] + r * math.sin(a * math.pi / 12)) for a in range(25)]
47
+ out += list(zip(pts, pts[1:]))
48
+ return out
49
+ if k == "poly":
50
+ pts = [(x, o["top"], z) for x, z in o["points"]]
51
+ return list(zip(pts, pts[1:] + pts[:1]))
52
+ return []
53
+
54
+ src, js, dst = sys.argv[1:4]
55
+ im = Image.open(src).convert("RGB").resize(IMG)
56
+ d = ImageDraw.Draw(im)
57
+ for o in json.load(open(js))["objects"]:
58
+ for a, b in edges(o):
59
+ d.line([to_px(a), to_px(b)], fill=(255, 30, 30), width=2)
60
+ im.save(dst)
@@ -0,0 +1,39 @@
1
+ id: skill/painted-25d-world
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Build a 2D or 2.5D game as a painted world: a 3D blockout under one fixed camera, an AI paint-over projected onto it, sprite characters."
5
+ use_when:
6
+ - the user asks for a 2D game, a 2.5D game, a top-down RPG, a cozy village or farming game, a dungeon crawler look, or a side-scroller — build the world as a painted 2.5D world, not from a 2D template
7
+ - the user wants a game that looks like a hand-painted illustration but can be walked around in, with buildings to enter
8
+ - making a level from a concept image — rebuild the concept as blocks, paint over the blockout render, project the painting onto the blocks
9
+ - adding sprite characters, interiors or weapons to a painted 2.5D world
10
+ do_not_use_when:
11
+ - the user explicitly wants pixel-art tiles or a classic 2D tile map — use pixel-art and the 2D genre playbooks in make-game
12
+ - the game is full 3D with a free camera (third-person, FPS) — the painting only holds from one camera direction
13
+ facets:
14
+ lifecycle:
15
+ - build
16
+ domains:
17
+ - 2d
18
+ - level-design
19
+ - rendering
20
+ - assets
21
+ modalities:
22
+ - images
23
+ - scenes
24
+ - scripts
25
+ - shaders
26
+ compatibility:
27
+ engine: ">=4.6"
28
+ related:
29
+ skills:
30
+ - skill/make-game
31
+ - skill/new-project
32
+ - skill/concept-art
33
+ - skill/sprite-sheet
34
+ - skill/scene-composition
35
+ source: official
36
+ license: MIT
37
+ status: preview
38
+ recommended: false
39
+ bundled: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: publish-your-game
3
- description: "Publish a game on Summer Games through MCP: store page, art, build upload, submit, owner approval link."
3
+ description: "Publish a game on Summer Games over MCP: store page, art, build upload, go live."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: deployment
@@ -10,7 +10,7 @@ allowed-tools: summer_docs_read
10
10
 
11
11
  # /publish-your-game — publish your game
12
12
 
13
- This skill covers the whole publishing journey: find the game, make its store page, write the text, set the art, export and upload the build, submit, and hand the owner the approval link.
13
+ This skill covers the whole publishing journey: find the game, make its store page, write the text, set the art, export and upload the build, and take it live.
14
14
 
15
15
  Its current text lives on the hosted Summer Engine MCP, the same text the Studio agent reads, so it changes with the store and is never stale here. Load it before you act:
16
16
 
@@ -25,14 +25,16 @@ A call written `area.action({...})` is the tool `summer_area_action` when your c
25
25
  1. `games.list()` finds the game; `games.create({ title, targets })` makes a new one with its first store page draft. Include `web` in `targets` so it plays in the browser. Keep the `gameId`.
26
26
  2. `store.get_listing({ gameId })` reads the page: text per store, art per slot, the publish checklist and the tags a page can pick.
27
27
  3. `store.update_listing`, `store.set_art`, `store.set_trailer` and `store.set_sound` fill it until `readyToPublish` is true. Editing never publishes.
28
- 4. Export with `summer_export_game`, run `release-readiness` on the exact `.zip`, and report each check to the owner; a hosted game's upload checks can pass while every online join fails. Then upload it: `store.upload_file({ gameId, clientVersion, confirm: true })` from this machine once the owner approved the exact file and version, or `store.upload_begin` (`kind` bundle, web or download), `store.upload_sign_parts` and `store.upload_complete` with the bytes. Finishing answers a job: `jobs.wait({ jobId })` until Summer's checks are done.
29
- 5. `store.publish({ gameId, price, note, idempotencyKey })` asks the owner; `price` is `{ currency: "USD", amountMinor }` in cents (0 is free), omitted it keeps the current price. It answers `needs_approval` with the owner's link and a job. Give the owner the link; `jobs.wait({ jobId })` returns once they answer.
30
- 6. `store.status({ gameId })` shows Summer's review decision and feedback, every upload, what players get now, and one next step.
31
- 7. A store bundle goes to players with `store.release({ gameId, idempotencyKey })` once Summer approved the game: it releases only the build the owner approved, and answers a job. Web builds and downloads need no release.
28
+ 4. Export with `summer_export_game`, run `release-readiness` on the exact `.zip`, and report each check to the owner; a hosted game's upload checks can pass while every online join fails. Then upload it with `summer_publish_build({ gameId, clientVersion, confirm: true })` once the owner approved the exact file and version. It waits for Summer's automated checks and answers each platform's result (`checks`), with the fix for a failed one.
29
+ 5. Run the `release-checklist` skill: the export, the upload's checks, the store art and every listing detail. `summer_store_set_details` fills the sections `store.update_listing` does not edit: the content questionnaire, the AI disclosure, genres, features, credits, languages and system requirements.
30
+ 6. `summer_go_live({ gameId, publicationId })` shows the plan; after the owner approves going live, call it again with `confirm: true`. It releases the Build to the platforms that passed, publishes the store page and watches until players get it, or names the failing check and its fix. Web builds and downloads go live with the page. It needs no owner approval link while the person's Agent permissions allow Publish (the default); with Publish off it answers `needs_permission`, and `store.publish` returns a link for the owner instead.
31
+ 7. `store.status({ gameId })` shows every upload, what players get now on each platform, and Summer's decision when there is one.
32
32
 
33
- The one rule to keep even before you load it: Asking does not publish. `store.publish` returns an approval link; only the owner's click sends the game to review, and review comes before live.
33
+ To have the agent gather everything from the project and do these steps itself (export and upload, real screenshots, store art, listing text and details), with one confirmation before going live, use the `launch-ready` skill (`summer_docs_read` with id `skill/launch-ready`).
34
34
 
35
- After the review: when `store.status` says `review.needsChanges`, fix every point in `review.feedback`, then call `store.publish` again with a new `idempotencyKey`; the owner approves the resubmission. If there is no written feedback, say so and ask the owner instead of guessing. The game is not live until Summer approves it.
35
+ The one rule to keep even before you load it: a game goes live as soon as Summer's automated checks pass. Summer's staff review it after it is live, so never tell the creator to wait for a review. When `summer_go_live` answers `waiting` with `waitingOn: "summer"`, every check passed and the platform is still holding the launch on Summer's side: nothing to fix, and it goes live by itself; call again to keep watching.
36
+
37
+ When Summer sends the page back (`needs_changes`, or `store.status` `review.needsChanges`), fix every point in the feedback with `store.update_listing`, then call `summer_go_live` again. If there is no written feedback, say so and ask the owner instead of guessing.
36
38
 
37
39
  <!-- shell-commands: generated from the operation catalog by npm run generate:registry; do not edit by hand -->
38
40
  ## From a shell
@@ -45,18 +47,15 @@ No Summer MCP tools in this session? Run each one as a command; when `summer --v
45
47
  | `summer_export_game` | `summer engine export-game` |
46
48
  | `games.create` | `summer games create` |
47
49
  | `games.list` | `summer games list` |
48
- | `jobs.wait` | `summer jobs wait` |
49
50
  | `summer_search` | `summer ops search "<what you want>"` |
50
51
  | `store.get_listing` | `summer store get-listing` |
52
+ | `summer_go_live` | `summer store go-live` |
51
53
  | `store.publish` | `summer store publish` |
52
- | `store.release` | `summer store release` |
53
54
  | `store.set_art` | `summer store set-art` |
55
+ | `summer_store_set_details` | `summer store set-details` |
54
56
  | `store.set_sound` | `summer store set-sound` |
55
57
  | `store.set_trailer` | `summer store set-trailer` |
56
58
  | `store.status` | `summer store status` |
57
59
  | `store.update_listing` | `summer store update-listing` |
58
- | `store.upload_begin` | `summer store upload-begin` |
59
- | `store.upload_complete` | `summer store upload-complete` |
60
- | `store.upload_file` | `summer store upload-file` |
61
- | `store.upload_sign_parts` | `summer store upload-sign-parts` |
60
+ | `summer_publish_build` | `summer store upload-file` |
62
61
  <!-- /shell-commands -->
@@ -1,10 +1,10 @@
1
1
  id: skill/publish-your-game
2
2
  kind: skill
3
3
  version: 1.0.0
4
- summary: "Publish a game on Summer Games through MCP: store page, art, build upload, submit, owner approval link."
4
+ summary: "Publish a game on Summer Games over MCP: store page, art, build upload, go live."
5
5
  use_when:
6
- - "the user says 'publish my game', 'put it on summer.games', 'launch it on the store' or 'submit it for review'"
7
- - "taking a built Summer game to a submitted store page: listing text, art, build upload, store.publish and the owner's approval link"
6
+ - "the user says 'publish my game', 'put it on summer.games', 'launch it on the store' or 'make it live'"
7
+ - "taking a built Summer game to live: listing text, art, build upload, the release checklist and summer_go_live"
8
8
  - "an agent publishes for the owner end to end and needs the order of the store.* operations"
9
9
  do_not_use_when:
10
10
  - "only producing a local export build — skill/export-and-ship"
@@ -22,6 +22,7 @@ related:
22
22
  - skill/store-art
23
23
  - skill/grow-analytics
24
24
  - skill/export-and-ship
25
+ - skill/release-checklist
25
26
  hosted_resource: "summer://skills/publish-your-game"
26
27
  source: official
27
28
  license: MIT
@@ -0,0 +1,188 @@
1
+ ---
2
+ name: release-checklist
3
+ description: "Pre-launch check for Summer Games: export, upload checks, store art, listing fields."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Glob summer_export_game summer_publish_build summer_go_live summer_store_set_details
9
+ ---
10
+
11
+ # /release-checklist: everything Summer Games needs before it goes live
12
+
13
+ Run this before you take a game live with `summer_go_live`, and again when
14
+ `summer_go_live` answers `blocked`. It has four parts, in the order of the
15
+ release:
16
+
17
+ 1. the build exported properly;
18
+ 2. the build uploaded and passed Summer's automated checks;
19
+ 3. the store art is there and has the right shapes;
20
+ 4. every required listing detail is filled in.
21
+
22
+ Each rule says how to check it with an MCP tool, what passes, how to fix a
23
+ failure, and where the rule comes from. "Platform" rules are enforced by
24
+ Summer's management API: a page or build that breaks one is refused. "Store"
25
+ rules are the publish checklist Studio and `store.publish` apply to every
26
+ page (`store.get_listing` returns it as `checklist` and `readyToPublish`); the
27
+ platform accepts a page without them, but it is a poor page. Follow both.
28
+
29
+ This checklist checks files and fields. Whether a player can actually play
30
+ the release (online join, saves, phones) is the `release-readiness` skill:
31
+ run it on the same `.zip` before you upload.
32
+
33
+ To have the agent make every failing rule pass (export and upload, capture
34
+ screenshots, make the art, write the listing, then go live with one
35
+ confirmation), use the `launch-ready` skill (`summer_docs_read` with id
36
+ `skill/launch-ready`).
37
+
38
+ ## Going live has no staff wait
39
+
40
+ A game goes live as soon as Summer's automated checks pass: the malware scan,
41
+ the secrets scan, the per-platform checks and the publish pipeline. Summer's
42
+ staff review the game after it is live. So:
43
+
44
+ - Never tell the creator to wait for a review, and never say a game is "in
45
+ review" as a step they must sit through.
46
+ - When `summer_go_live` answers `waiting` with `waitingOn: "summer"`, every
47
+ check passed and the platform is still holding the launch on Summer's
48
+ side. Say exactly that: nothing to fix, nothing to ask for, and the request
49
+ goes live by itself. Call `summer_go_live` again to keep watching.
50
+ - When Summer sent the page back (`needs_changes`), report the decision and
51
+ every line of its feedback, fix them, and go live again.
52
+
53
+ ## How to report
54
+
55
+ Report one line per rule:
56
+
57
+ - **pass**, with the evidence (the tool and the field you read);
58
+ - **fail**, with what you saw and the fix;
59
+ - **not applicable**, with the reason (for example, no server);
60
+ - **not run**, with what is still needed.
61
+
62
+ A rule that was not run is not a pass. Show the list to the user before you
63
+ change anything; they decide what to fix. Ask before every upload and before
64
+ going live: `summer_publish_build` and `summer_go_live` both preview first
65
+ and need `confirm: true`.
66
+
67
+ ## 1. The build exported properly
68
+
69
+ Export with `summer_export_game` (format `bundle`, the default) and read its
70
+ answer.
71
+
72
+ | Rule | Check | Pass | Fix | Source |
73
+ | --- | --- | --- | --- | --- |
74
+ | 1.1 The summer.games preset made it | `preset`, `format`, `debug` | `format` is `bundle`, `preset` is `summer.games` (or the `summer.games` preset the targets made), `debug` is false | Export again with `summer_export_game` and no `debug` | Engine `modules/1summer_engine/editor` (the summer.games export platform); platform `docs/build-publications.md` |
75
+ | 1.2 A released Summer version | `bundle.summerVersion` | A Summer release (`X.Y.Z`); for `ios` or `android`, the same MAJOR.MINOR as the current Summer release | Update Summer Engine to the current release, export again | Platform `internal/clientartifacts/template.go` (same MAJOR.MINOR, a template patch at least the pack's); refusal `engine_build_unreleased`; `release-readiness` check 9 |
76
+ | 1.3 The fixed export layout | `bundle.schema`, `bundle.paths` | `summer.bundle.v2` holds only these 6 paths: `summer-bundle.json`, `client.pck`, `config/summer.build.json` (always), `server.pck` (a game with a server only), `config/world-definitions.json` (only when the build declares queues), `config/world-support.json` (only when a World definition names a file). An older engine writes `summer.bundle.v1`, which the store still takes | Never add or rename a file in the `.zip`: upload it as Summer Engine wrote it. An extra path means the export is not from the summer.games preset; export again | Platform `docs/build-publications.md` "summer.games bundle layout", enforced by `internal/clientartifacts/bundle_layout.go` |
77
+ | 1.4 A server pack when the game has a server | `bundle.hosted`, `bundle.paths` | A game with a server (multiplayer on Summer's servers) has `hosted: true` and `server.pck`; a game without one has neither | Set up the server export (the `multiplayer-publish` skill), export again | Platform `internal/clientartifacts/exported_game.go` (manifest `server` and `compositionPath` together) |
78
+ | 1.5 The right platforms | `bundle.targetPlatforms`, `warnings` | No warning; a game without a server lists only `ios` and `android` (desktop and web ship as downloads, format `download`); a game with a server declares the same platforms in `summer.build.json` | `summer_export_game` with `targets` and, for a server game, `alignDeclaration: true` | Platform refusals `declaration_mismatch`, `template_execution_unsupported` (`api/management/openapi.yaml`, build-publications) |
79
+
80
+ For web and desktop downloads (`format: "download"`), check instead that the
81
+ `.zip` is under 500 MiB with `index.html` at its top (web), or the `.app` or
82
+ `.exe` for macOS or Windows; `summer_publish_build` refuses the rest before
83
+ it sends anything.
84
+
85
+ ## 2. The build uploaded and passed the automated checks
86
+
87
+ Upload with `summer_publish_build` (preview first, then `confirm: true`). It
88
+ waits for Summer's checks and answers with each one.
89
+
90
+ | Rule | Check | Pass | Fix | Source |
91
+ | --- | --- | --- | --- | --- |
92
+ | 2.1 Summer made the Build | `status`, `state` | `status` is `uploaded` (or `published`); a refusal comes back as an error with `code` and `recovery` | Do what `recovery` says. A refused upload usually leaves the `clientVersion` free (`bundle_invalid`, `declaration_mismatch`); a new export needs a new one | Platform build-publication intake codes (`api/management/openapi.yaml`, `:source-complete`) |
93
+ | 2.2 The malware scan passed | intake error code | No `malware_detected` or `malware_scan_unsupported`. A scan still running is a wait, never a failure: the tool keeps waiting | Clean the project's files and plugins, export again on a clean machine | Platform `docs/build-publications.md` (GuardDuty tags) |
94
+ | 2.3 The secrets scan passed (game with a server) | intake error code | No `verifying_failed` | Remove the key or password from the project, revoke it, export again | Platform `docs/build-publications.md` (Trivy secrets in the server image) |
95
+ | 2.4 Every platform check passed | `checksState`, `checks[]` | `checksState` is `passed`: every platform `passed`. `checking` means call `summer_publish_build` again with the same file and version | Each failed check has `code`, `owner` and `fix`. `owner: "creator"`: apply the fix, export again, upload with a new `clientVersion`. `owner: "summer"`: nothing to change | Platform `docs/client-pack-publication.md`, `internal/management/client_verification.go` |
96
+ | 2.5 Web builds and downloads are checked | `summer_publish_build` answer for a download, or `store.status` uploads | Each is `ready` | `rejected` names its reason: fix it, export the download again, upload it | Platform store versions (`awaiting_upload`, `processing`, `ready`, `rejected`) |
97
+
98
+ A hosted game's `web` check fails with `client_platform_unavailable` while
99
+ its phone and desktop checks pass: that is expected, and `summer_go_live`
100
+ releases the platforms that passed. Ship web for such a game as a download.
101
+
102
+ ## 3. The store art is there
103
+
104
+ Read the art with `store.get_listing`: `art` per slot, and the `checklist`
105
+ items for each slot.
106
+
107
+ | Rule | Slot | Pass | Kind | Source |
108
+ | --- | --- | --- | --- | --- |
109
+ | 3.1 Every image is verified | all | No checklist item names a refused or unchecked image | Platform: `store_page_incomplete` with `media` | Platform `internal/creatorcatalog/submission.go` |
110
+ | 3.2 Every filled slot fits its shape | all | No checklist item names a shape problem | Platform: `store_page_incomplete` with `mediaSlots`, sizes below | Platform `internal/storefront/slot_shapes.go` (within 2%) |
111
+ | 3.3 Desktop key art | `desktop.keyArt` | Present, 16:9, at least 1920x1080, no text | Store, desktop targets | PSE `src/lib/creator-store/store-slots.ts` |
112
+ | 3.4 Desktop screenshots | `desktop.screenshots` | 4 to 8, 16:9, at least 1920x1080, real play | Store, desktop targets | PSE `store-slots.ts`, `listing-spec.ts` |
113
+ | 3.5 Icons | `desktop.icon`, `mobile.icon` | Square, at least 512 (1024 is best), no words | Store; platform checks the shape | PSE `store-slots.ts`; platform `slot_shapes.go` |
114
+ | 3.6 Mobile key art | `mobile.keyArt` | 16:9, at least 1920x1080, no text | Store, phone targets; platform checks the shape | Same |
115
+ | 3.7 Mobile screenshots | `mobile.screenshots` | 3 to 8, 16:9 to 19.5:9 either way, short side at least 1080 | Store, phone targets; platform checks the shape | Same |
116
+ | 3.8 Tall cover | `mobile.tallCover` | 9:16 to 9:19.5, at least 1080x1920, no text | Store warning only (cropped from the key art when missing) | Same |
117
+ | 3.9 Capsules | `desktop.capsuleTall` 3:4 at least 600x800, `desktop.capsuleWide` 460:215 at least 920x430 | Optional (cropped from the key art at its focal point); the logo is allowed | Store, optional | Same |
118
+ | 3.10 At most 20 images and videos | all | 20 or fewer on the page | Store and platform (`mediaAssetIds` at most 20) | PSE `MEDIA_BUDGET`; platform `api/management/openapi.yaml` |
119
+
120
+ Fix: make or capture the image (the `store-art` skill; `summer_capture_gameplay`
121
+ for real screenshots) and put it in its slot with `store.set_art`. A trailer
122
+ is optional (`store.set_trailer`).
123
+
124
+ ## 4. Every required listing detail is filled in
125
+
126
+ Read `store.get_listing` (text, `checklist`, `readyToPublish`) and, for price,
127
+ `pricing.get`.
128
+
129
+ | Rule | Field | Pass | Kind | Fix | Source |
130
+ | --- | --- | --- | --- | --- | --- |
131
+ | 4.1 Title | `title` | 1 to 60 characters | Platform requires one (max 120); store max 60 | `store.update_listing` title | Platform `internal/creatorcatalog/types.go`; PSE `listing-spec.ts` |
132
+ | 4.2 Tagline | desktop and mobile tagline | 1 to 80 characters | Store | `store.update_listing` desktop.tagline, mobile.tagline | PSE `listing-spec.ts`, `store-slots.ts` |
133
+ | 4.3 Short description | desktop and mobile description | Desktop 120 to 300 characters; mobile 120 to 170 | Platform requires one; store sets the lengths | `store.update_listing` desktop.description, mobile.description | Same |
134
+ | 4.4 Long description | `longDescription` | Optional; up to 12000 characters | Optional | `store.update_listing` longDescription | Platform `internal/storefront/listing_fields.go` |
135
+ | 4.5 Tags | `tags` | 3 to 8 from the store's tag list | Store | `store.update_listing` desktop.tags | PSE `listing-spec.ts` |
136
+ | 4.6 Genres and features | `genres`, `features` | Optional; 1 to 5 genre tags, features from the closed list | Optional (shown on the page) | `summer_store_set_details` | Platform `listing_fields.go`; openapi `GameGenres`, `GameFeatures` |
137
+ | 4.7 Supported platforms | `targets` | At least one, and every platform the build was exported for | Platform | `store.update_listing` targets | Platform `internal/gameplatforms/platforms.go` |
138
+ | 4.8 Age rating | `contentRating`, `contentDescriptors` | A rating (`everyone`, `everyone10Plus`, `teen`) and descriptors answered (an empty list when none apply) | Platform: `store_page_incomplete` | `store.update_listing` contentRating, contentDescriptors | Platform `internal/creatorcatalog/types.go`, `internal/contentrating/contentrating.go` |
139
+ | 4.9 Content questionnaire | `contentSurvey` | Answered in full when the game has any mature content, user content, online interaction or purchases | Optional on the platform; every answer is required once given | `summer_store_set_details` contentSurvey | Platform `internal/storefront/page_fields.go` |
140
+ | 4.10 AI disclosure | `aiDisclosure` | Says how AI made the game (`assets`, `code`, `generatedGameplay`, or `[]` for none); `generatedGameplay` has a description | Optional on the platform; always fill it, honestly | `summer_store_set_details` aiDisclosure | Platform `page_fields.go` |
141
+ | 4.11 Support contact | support link | An https or `mailto:` support link | Optional | `store.update_listing` support | Platform `listing_fields.go` (`externalLinks` kind support) |
142
+ | 4.12 Release stage | `release` | Chosen on purpose: `released` needs a playable build on a listed platform; `in_development` lists the game only on the In development page | Platform for released pages (`playable_release_required`) | `store.update_listing` release | Platform `internal/storefront/release.go`, `playable_page.go` |
143
+ | 4.13 Price | `pricing.get` | Free, or the price the owner chose | Not checked at publish. A price can be set only once the creator's Stripe seller account takes payments (`seller_setup_required` otherwise; the game stays free), and only the owner sets that up, in Studio | `pricing.set_base` | Platform `PUT /games/{gameId}/price` (`api/management/openapi.yaml`) |
144
+ | 4.14 Legal text | none | Nothing to fill: the store page has no EULA, terms or privacy field; players accept Summer's terms | Not applicable | None | Platform `api/management/openapi.yaml` (no such field) |
145
+
146
+ Never invent features, modes, player counts, awards or prices: the
147
+ `store-listing` skill has the writing rules.
148
+
149
+ ## Then go live
150
+
151
+ When every rule passes (or the user accepted an open one), call
152
+ `summer_go_live` with the `gameId` and the `publicationId` from
153
+ `summer_publish_build`. Its first answer is the plan: show it to the user,
154
+ then call again with `confirm: true`. It releases the Build to the platforms
155
+ that passed, publishes the store page and watches until players get it:
156
+
157
+ - `live`: report it, and ask the user to check it as a player on summer.games
158
+ and in the Summer Games apps;
159
+ - `blocked`: each failure has a fix; apply them and run the failed part of
160
+ this checklist again;
161
+ - `waiting`: say what it waits on (above), call again to keep watching;
162
+ - `needs_permission`: the person's Agent permissions have Publish off: ask
163
+ them to turn it on (Studio > Agent permissions), or use `store.publish`,
164
+ which returns a link for the owner to approve;
165
+ - `needs_changes`: Summer sent the page back; fix every line of feedback.
166
+
167
+ <!-- shell-commands: generated from the operation catalog by npm run generate:registry; do not edit by hand -->
168
+ ## From a shell
169
+
170
+ 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.
171
+
172
+ | In this skill | Command |
173
+ |---|---|
174
+ | `summer_docs_read` | `summer docs read` |
175
+ | `summer_capture_gameplay` | `summer engine capture-gameplay` |
176
+ | `summer_export_game` | `summer engine export-game` |
177
+ | `pricing.get` | `summer pricing get` |
178
+ | `pricing.set_base` | `summer pricing set-base` |
179
+ | `store.get_listing` | `summer store get-listing` |
180
+ | `summer_go_live` | `summer store go-live` |
181
+ | `store.publish` | `summer store publish` |
182
+ | `store.set_art` | `summer store set-art` |
183
+ | `summer_store_set_details` | `summer store set-details` |
184
+ | `store.set_trailer` | `summer store set-trailer` |
185
+ | `store.status` | `summer store status` |
186
+ | `store.update_listing` | `summer store update-listing` |
187
+ | `summer_publish_build` | `summer store upload-file` |
188
+ <!-- /shell-commands -->
@@ -0,0 +1,40 @@
1
+ id: skill/release-checklist
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Pre-launch check for Summer Games: export, upload checks, store art, listing fields."
5
+ use_when:
6
+ - "the user says 'is it ready to go live', 'check everything before launch' or 'what is missing from my store page'"
7
+ - "before summer_go_live, or when it answers blocked: checking the export, the upload's automated checks, the store art and the listing fields"
8
+ - "summer_publish_build reports a failed platform check, or store.get_listing says readyToPublish is false"
9
+ - "checking the export holds the fixed bundle layout, the right Summer version and a server pack for a hosted build"
10
+ - "filling the age rating, content questionnaire, AI disclosure, genres or support link before launch"
11
+ do_not_use_when:
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
+ modalities:
21
+ - docs
22
+ compatibility:
23
+ engine: ">=4.6"
24
+ related:
25
+ skills:
26
+ - skill/launch-ready
27
+ - skill/release-readiness
28
+ - skill/publish-your-game
29
+ - skill/store-art
30
+ - skill/store-listing
31
+ - skill/multiplayer-publish
32
+ tools:
33
+ - tool/export-game
34
+ - tool/publish-build
35
+ - tool/go-live
36
+ - tool/store-set-details
37
+ source: official
38
+ license: MIT
39
+ status: preview
40
+ recommended: false
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: release-readiness
3
- description: "Before releasing a Summer game version, prove players can play it: server, online join, progress, files."
3
+ description: "Prove players can play a Summer release: server, online join, progress, files."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: deployment
@@ -1,7 +1,7 @@
1
1
  id: skill/release-readiness
2
2
  kind: skill
3
3
  version: 1.0.0
4
- summary: "Before releasing a Summer game version, prove players can play it: server, online join, progress, files."
4
+ summary: "Prove players can play a Summer release: server, online join, progress, files."
5
5
  use_when:
6
6
  - "before uploading, promoting or releasing a new version to players: is it ready to release"
7
7
  - "every online join fails with world_start_timeout, or the hosted server's log is empty, while Local Play works"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: store-art
3
- description: "Make Summer Games store art per slot: key art, covers, icons, screenshots, trailer, size and text rules."
3
+ description: "Make Summer Games store art per slot: key art, icons, screenshots, trailer, sizes."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: deployment
@@ -1,7 +1,7 @@
1
1
  id: skill/store-art
2
2
  kind: skill
3
3
  version: 1.0.0
4
- summary: "Make Summer Games store art per slot: key art, covers, icons, screenshots, trailer, size and text rules."
4
+ summary: "Make Summer Games store art per slot: key art, icons, screenshots, trailer, sizes."
5
5
  use_when:
6
6
  - "making or choosing store art for Summer Games: key art, cover, icon, screenshots, trailer"
7
7
  - "store.set_art rejects an image for its shape or size, or store.get_listing says an art slot is missing"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: store-listing
3
- description: "Write a Summer Games store page: title, tagline, descriptions, tags, per platform, and what never to write."
3
+ description: "Write a Summer Games store page: title, tagline, descriptions, tags, what never to write."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
6
  category: deployment
@@ -1,7 +1,7 @@
1
1
  id: skill/store-listing
2
2
  kind: skill
3
3
  version: 1.0.0
4
- summary: "Write a Summer Games store page: title, tagline, descriptions, tags, per platform, and what never to write."
4
+ summary: "Write a Summer Games store page: title, tagline, descriptions, tags, what never to write."
5
5
  use_when:
6
6
  - "writing or fixing a game's store page text on Summer Games: title, tagline, description, tags"
7
7
  - "store.update_listing or store.get_listing says a text field is missing or wrong"
@@ -92,12 +92,14 @@ summer run ./my-game # opens the project;
92
92
  summer engine get-project-context # first call: project, main scene, engine version
93
93
  summer engine get-scene-tree --scene-path res://main.tscn --depth 2
94
94
  summer engine screenshot # the answer's localPath is an image: open it to look
95
+ summer preview # the game, live, in your own browser: http://127.0.0.1:5199
95
96
  ```
96
97
 
97
98
  - Values are engine value strings, not JSON: `"Vector3(0, 10, 0)"`, `"Color(1, 0.5, 0, 1)"`. A resource is its class name: `"BoxMesh"`.
98
99
  - Name the scene in every change: `--scene-path res://<scene>.tscn`.
99
100
  - 3 or more scene edits are one script, not a chain of commands. Write a `func run(ctx):` that ends with `ctx.save_scene()` to a file, then run `summer engine run-script --scene-path res://main.tscn --source "$(cat build.gd)"`. The `scene-scripting` skill has the script API.
100
101
  - With more than one editor open, set `SUMMER_ENGINE_PROJECT` to the project folder so the command picks the right one.
102
+ - To watch the game in your own browser (Claude Code Desktop's Browser pane, the Codex app's in-app browser), run `summer preview` in the background, from the folder the session started in. It serves http://127.0.0.1:5199 (the next free port if that one is taken; it prints the URL): the running game, or the editor view when no game runs, with a status line that says what to do next. It also adds a `summer-preview` entry to `.claude/launch.json` there, so Desktop starts it and checks the game after each edit. A game frame comes about every 20 s, because reading one stalls the game; the page's Refresh button takes one now. Keys and clicks on the frame go to the running game. `--no-launch-json` leaves the file alone.
101
103
  - `summer tool <slug> --args '<json>'` runs an engine tool by its 3.x name too. `summer tool --list` lists them.
102
104
 
103
105
  ## Without Summer Engine