summer-engine 3.4.1 → 3.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 (60) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +5 -1
  3. package/.codex-plugin/plugin.json +5 -1
  4. package/.cursor-plugin/plugin.json +5 -1
  5. package/.factory-plugin/plugin.json +5 -1
  6. package/CHANGELOG.md +23 -0
  7. package/README.md +5 -1
  8. package/dist/cli/commands/setup.js +24 -4
  9. package/dist/core/capabilities/capture-gameplay.d.ts +72 -7
  10. package/dist/core/capabilities/capture-gameplay.js +386 -25
  11. package/dist/core/capabilities/export-engine-version.d.ts +7 -0
  12. package/dist/core/capabilities/export-engine-version.js +9 -0
  13. package/dist/core/capabilities/export-game.d.ts +4 -0
  14. package/dist/core/capabilities/export-game.js +50 -7
  15. package/dist/core/capabilities/image-generation.d.ts +12 -2
  16. package/dist/core/capabilities/image-generation.js +31 -2
  17. package/dist/core/capabilities/publish-build.js +17 -3
  18. package/dist/core/capabilities/summer-bundle.d.ts +9 -0
  19. package/dist/core/capabilities/summer-bundle.js +19 -0
  20. package/dist/core/capabilities/tool-dispatch.js +13 -2
  21. package/dist/core/library-read.d.ts +7 -0
  22. package/dist/core/library-read.js +59 -7
  23. package/dist/core/library-search.d.ts +2 -0
  24. package/dist/installer/agent-config.d.ts +25 -0
  25. package/dist/installer/agent-config.js +114 -3
  26. package/dist/installer/agent-table.d.ts +12 -0
  27. package/dist/installer/agent-table.js +9 -0
  28. package/dist/mcp/tools/creator-tools.js +32 -3
  29. package/dist/mcp/tools/generate-tools.js +11 -30
  30. package/dist/mcp/tools/library-tools.d.ts +2 -1
  31. package/dist/mcp/tools/library-tools.js +1 -0
  32. package/gemini-extension.json +5 -1
  33. package/library/references/mcp-tools-reference/mcp-tools-reference.md +1 -1
  34. package/library/skills/README.md +11 -1
  35. package/library/skills/export-and-ship/SKILL.md +1 -1
  36. package/library/skills/export-and-ship/resource.yaml +2 -1
  37. package/library/skills/grow-analytics/SKILL.md +21 -0
  38. package/library/skills/grow-analytics/resource.yaml +27 -0
  39. package/library/skills/publish-your-game/SKILL.md +21 -0
  40. package/library/skills/publish-your-game/resource.yaml +29 -0
  41. package/library/skills/store-art/SKILL.md +23 -0
  42. package/library/skills/store-art/resource.yaml +30 -0
  43. package/library/skills/store-listing/SKILL.md +21 -0
  44. package/library/skills/store-listing/resource.yaml +25 -0
  45. package/library/skills/summer-analytics/resource.yaml +1 -0
  46. package/library/tools/capture-gameplay/resource.yaml +66 -1
  47. package/library/tools/export-game/resource.yaml +3 -0
  48. package/library/tools/generate-image/resource.yaml +4 -2
  49. package/package.json +1 -1
  50. package/registry/generated/counts.json +2 -2
  51. package/registry/generated/gemini-extension.json +5 -1
  52. package/registry/generated/index.json +153 -10
  53. package/registry/generated/marketplace.claude.json +1 -1
  54. package/registry/generated/plugin.claude.json +5 -1
  55. package/registry/generated/plugin.codex.json +5 -1
  56. package/registry/generated/plugin.cursor.json +5 -1
  57. package/registry/generated/plugin.factory.json +5 -1
  58. package/registry/generated/skills-index.md +11 -1
  59. package/registry/generated/skills-registry.json +52 -0
  60. package/registry/schemas/skill.schema.json +5 -0
@@ -40,7 +40,7 @@ async function creatorResult(operation) {
40
40
  }
41
41
  }
42
42
  export function registerCreatorTools(server) {
43
- server.tool("summer_export_game", "Export the game in the exact file the Summer Games store takes, with the installed Summer Engine headless (no window). format \"bundle\" (default): the summer.games .zip the Summer apps run on iPhone, Android, macOS and Windows; targets picks the platforms (a game without a server: ios and android only); upload it with summer_publish_build. format \"download\" with one target: web (an HTML5 .zip on Summer's WebGPU Forward+ web template, played on summer.games), macos (.app zip, macos-universal) or windows (.exe zip, windows-x64); these need the export template from summer_export_templates and are uploaded as store versions. Needs Summer Engine 0.7.0 or newer: an older engine is refused before anything is written (code engine_too_old). Works without the editor running. Returns path, sha256, size, the manifest or store platform, and warnings.", {
43
+ server.tool("summer_export_game", "Export the game in the exact file the Summer Games store takes, with the installed Summer Engine headless (no window). format \"bundle\" (default): the summer.games .zip the Summer apps run on iPhone, Android, macOS and Windows; targets picks the platforms (a game without a server: ios and android only); upload it with summer_publish_build. format \"download\" with one target: web (an HTML5 .zip on Summer's WebGPU Forward+ web template, played on summer.games), macos (.app zip, macos-universal) or windows (.exe zip, windows-x64); these need the export template from summer_export_templates and are uploaded as store versions. Needs Summer Engine 0.7.0 or newer: an older engine is refused before anything is written (code engine_too_old). A target the installed engine cannot build (android needs 0.7.1) is left out: the other targets export, and skippedTargets plus a warning name it. A game with a server declares its platforms in summer.build.json; when they differ from the exported targets a warning says so (summer_publish_build would be refused), and alignDeclaration:true aligns them. Works without the editor running. Returns path, sha256, size, the manifest or store platform, and warnings.", {
44
44
  project: z.string().optional().describe("Project folder with project.godot. Defaults to the MCP's bound project, then the working directory."),
45
45
  out: z.string().optional().describe("Output .zip path. Defaults to <project>/.summer/exports/."),
46
46
  targets: z
@@ -53,7 +53,11 @@ export function registerCreatorTools(server) {
53
53
  .describe("bundle (default): the summer.games store build. download: a web build or native download; the default when targets is [\"web\"]."),
54
54
  debug: z.boolean().default(false).describe("Export a debug build (--export-debug)."),
55
55
  timeoutSeconds: z.number().int().min(10).max(7200).optional().describe("Stop the engine after this many seconds (default 900; a first export imports every asset)."),
56
- }, async ({ project, out, targets, format, debug, timeoutSeconds }) => creatorResult(() => exportGame({ project, out, targets, format, debug, ...(timeoutSeconds ? { timeoutMs: timeoutSeconds * 1000 } : {}) })));
56
+ alignDeclaration: z
57
+ .boolean()
58
+ .optional()
59
+ .describe("A game with a server: set summer.build.json targetPlatforms to targets before exporting. The store refuses an upload whose declaration differs from the exported platforms (declaration_mismatch) and that spends the version."),
60
+ }, async ({ project, out, targets, format, debug, timeoutSeconds, alignDeclaration }) => creatorResult(() => exportGame({ project, out, targets, format, debug, alignDeclaration, ...(timeoutSeconds ? { timeoutMs: timeoutSeconds * 1000 } : {}) })));
57
61
  server.tool("summer_export_templates", "List, download and install Summer Engine export templates from Summer's CDN into the folder the installed engine reads, checking each file's sha256. Needed only for summer_export_game format \"download\": web (Summer's WebGPU Forward+ template), macos, windows. Store bundles (format \"bundle\") need no template. action list shows what is installed and published; action install fetches the platforms asked (default web).", {
58
62
  action: z.enum(["list", "install"]).describe("list: installed and published templates. install: download and install."),
59
63
  platforms: z
@@ -66,7 +70,7 @@ export function registerCreatorTools(server) {
66
70
  .optional()
67
71
  .describe("The installed Summer Engine version (Help > About, e.g. 0.7.1). Read automatically on macOS; needed on Windows and Linux."),
68
72
  }, async ({ action, platforms, includeDebug, summerVersion }) => creatorResult(() => exportTemplates({ action, platforms, includeDebug, summerVersion })));
69
- server.tool("summer_capture_gameplay", "Capture real gameplay frames without a running editor: starts the game in Summer Engine's offscreen verify instance (a real renderer, a window parked offscreen with no focus, never on screen), lets it run waitSeconds, and saves PNG frames of what the game draws, HUD included. Use for store screenshots (1920x1080 landscape or 1080x1920 portrait). With an editor open, summer_screenshot target game also works. Returns each frame's path, width and height; look at them before using them.", {
73
+ server.tool("summer_capture_gameplay", "Capture real gameplay frames without a running editor: starts the game in Summer Engine's offscreen verify instance (--summer-offscreen: a real renderer, a window parked offscreen with no focus, never on screen), lets it run waitSeconds, runs steps, and saves PNG frames of what the game draws, HUD included. Use for store screenshots (1920x1080 landscape or 1080x1920 portrait). The main scene is often a title menu: pass the game's own flags in args (after \"--\", e.g. [\"--autostart\"]), a gameplay scene, or steps that play like a player: [{press:\"Play\"}, {wait:3000}, {key:\"Space\"}, {action:\"jump\"}, {click:[960,540]}, {drag:{from:[400,800],to:[1400,800]}}, {shot:true}]. With a shot step, only shot steps save frames; without one, frames are saved after the steps. A step that cannot run (no such button, key or action) becomes a warning. With an editor open, summer_screenshot target game also works. Returns each frame's path, width and height; look at them before using them.", {
70
74
  project: z.string().optional().describe("Project folder with project.godot. Defaults to the MCP's bound project, then the working directory."),
71
75
  scene: z.string().optional().describe("Scene to start (res://... or uid://...). Default: the project's main scene, which is often a title menu; pass the gameplay scene for gameplay frames."),
72
76
  resolution: z.string().optional().describe("Window size WIDTHxHEIGHT (default 1920x1080; 1080x1920 for portrait)."),
@@ -74,6 +78,31 @@ export function registerCreatorTools(server) {
74
78
  waitSeconds: z.number().min(0).max(120).optional().describe("Seconds the game runs before the first frame (default 3)."),
75
79
  intervalSeconds: z.number().min(0.1).max(60).optional().describe("Seconds between frames (default 1)."),
76
80
  out: z.string().optional().describe("Output folder. Defaults to <project>/.summer/captures/<time>/ (ignored by git)."),
81
+ args: z
82
+ .array(z.string())
83
+ .max(32)
84
+ .optional()
85
+ .describe('The game\'s own command-line flags, passed after "--" (OS.get_cmdline_user_args()), e.g. ["--autostart", "--solo"] to skip the title screen.'),
86
+ steps: z
87
+ .array(z
88
+ .object({
89
+ press: z.string().optional().describe("Press the visible button with this text (or node name); waits up to timeoutSeconds (default 10) for it."),
90
+ timeoutSeconds: z.number().min(0).max(60).optional(),
91
+ key: z.string().optional().describe("Press a key by Godot name: Space, Enter, Escape, A, Up."),
92
+ action: z.string().optional().describe("Press an input action from the project's InputMap, e.g. jump."),
93
+ holdMs: z.number().min(0).max(10000).optional().describe("How long key or action is held (default 100)."),
94
+ click: z.tuple([z.number(), z.number()]).optional().describe("Left-click at [x, y] in frame pixels."),
95
+ drag: z
96
+ .object({ from: z.tuple([z.number(), z.number()]), to: z.tuple([z.number(), z.number()]), ms: z.number().min(0).max(10000).optional() })
97
+ .optional()
98
+ .describe("Drag with the left button from [x, y] to [x, y] over ms (default 300)."),
99
+ wait: z.number().min(0).max(60000).optional().describe("Wait this many milliseconds."),
100
+ shot: z.boolean().optional().describe("true: save a frame now."),
101
+ })
102
+ .strict())
103
+ .max(50)
104
+ .optional()
105
+ .describe("What to do after waitSeconds, in order; exactly one of press, key, action, click, drag, wait, shot per step."),
77
106
  }, async (args) => creatorResult(() => captureGameplay(args)));
78
107
  server.tool("summer_publish_build", "Upload an export from summer_export_game to the creator's game on summer.games, through the same store upload Studio uses, straight from disk. A store bundle (format bundle): declare, upload parts, seal, wait until Summer makes the Build, name its client pack, and with publish=true approve it. A web build or native download (format download): upload it as the game's store version for its platform (web, macos-universal, windows-x64, linux-x64; read from the last export) and wait until Summer has checked it. First call with confirm=false: it checks that the game exists for this account and warns when its store page does not list the export's platforms, then returns the target (game name and id, file, digest, size, version) to show the user; set confirm only after they approve. Needs \"summer login --store\". A retry with the same file and clientVersion continues the same upload. Nothing here makes a game live: the owner approves publishing (summer_store_submit).", {
79
108
  gameId: z.string().optional().describe("The store game id (from summer_store_list_games, or the Studio store page URL). Without it the call fails with game_required and lists your store games, or says why the store did not list them."),
@@ -1,10 +1,7 @@
1
1
  import { z } from "zod";
2
2
  import { BOARD_ENDPOINT, boardArgsSchema, boardContent, boardQuery } from "../../core/capabilities/board.js";
3
- import { imageGenerationArgsSchema } from "../../core/capabilities/image-generation.js";
3
+ import { IMAGE_GENERATION_TIMEOUT_MS, imageGenerationArgsSchema, saveGeneratedImage } from "../../core/capabilities/image-generation.js";
4
4
  import { buildMotionRequestBody, motionErrorHint, motionGenerationArgsSchema, motionJobFailureHint, } from "../../core/capabilities/motion-generation.js";
5
- import { writeFile, mkdir } from "fs/promises";
6
- import { tmpdir } from "os";
7
- import { join } from "path";
8
5
  import { getAuthToken } from "../../core/auth.js";
9
6
  import { resolveGatewayUrl } from "../../core/config.js";
10
7
  import { readJsonResponse } from "../../core/util/http.js";
@@ -151,26 +148,6 @@ async function mcpGet(endpoint, searchParams, timeoutMs = 30_000) {
151
148
  }
152
149
  return { data, status: res.status };
153
150
  }
154
- /**
155
- * Download an image URL to a temp file so the AI can Read it and show the user.
156
- */
157
- async function downloadToTemp(url, prefix, ext = "png") {
158
- try {
159
- const dir = join(tmpdir(), "summer-gen");
160
- await mkdir(dir, { recursive: true });
161
- const filename = `${prefix}-${Date.now()}.${ext}`;
162
- const filepath = join(dir, filename);
163
- const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });
164
- if (!res.ok)
165
- return null;
166
- const buffer = Buffer.from(await res.arrayBuffer());
167
- await writeFile(filepath, buffer);
168
- return filepath;
169
- }
170
- catch {
171
- return null;
172
- }
173
- }
174
151
  /**
175
152
  * Poll a job until completed, failed, or timeout.
176
153
  * Returns the final job status object.
@@ -281,7 +258,8 @@ Requires authentication: run 'npx -y summer-engine@latest login' first.`, boardA
281
258
  server.tool("summer_generate_image", `Generate an image using AI models via Summer Engine Studio.
282
259
 
283
260
  Known models:
284
- - "nano-banana-2" (default) — High quality, supports txt2img and img2img
261
+ - "nano-banana-2" — High quality, supports txt2img and img2img (used when no
262
+ model and no size is asked)
285
263
  - "gemini-flash" — Google Gemini 2.5 Flash, fast
286
264
  - "flux-2" — FLUX.2, good for specific styles
287
265
 
@@ -300,17 +278,20 @@ guarantee transparency; background removal runs server-side after generation.
300
278
  Size: aspectRatio (1:1, 16:9, 9:16, 4:3, 3:4, ...) or width + height (the
301
279
  smallest size you need). For store art ask width 1920 height 1080 (key art)
302
280
  or width 1080 height 1920 (tall cover): the server picks a model that reaches
303
- that size, or refuses a named model that cannot, before anything is spent.
281
+ that size when model is omitted, or refuses a named model that cannot, before
282
+ anything is spent. Larger models can take over a minute; the call waits up to
283
+ 3 minutes.
304
284
  Each result reports the real width and height and the model that ran.
305
285
 
306
286
  'options' carries extra model params (seed, negative_prompt, ...); the result
307
287
  lists any the server did not use in ignoredOptions.
308
288
 
309
- Returns the asset with fileUrl (hosted) and localPath (temp file on disk).
289
+ Returns the asset with fileUrl (hosted) and localPath: the file on disk, in
290
+ 'out' (a folder, or a .png/.jpg/.webp path) or else <TMPDIR>/summer-gen/.
310
291
  Use the Read tool on localPath to show the image to the user for approval.
311
292
 
312
293
  Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
313
- Requires authentication: run 'npx -y summer-engine@latest login' first.`, imageGenerationArgsSchema.shape, async ({ prompt, model, style, referenceImageUrl, removeBackground, aspectRatio, width, height, options }) => {
294
+ Requires authentication: run 'npx -y summer-engine@latest login' first.`, imageGenerationArgsSchema.shape, async ({ prompt, model, style, referenceImageUrl, removeBackground, aspectRatio, width, height, options, out }) => {
314
295
  const result = await mcpGenerate("/api/mcp/generate/image", {
315
296
  prompt,
316
297
  model,
@@ -321,7 +302,7 @@ Requires authentication: run 'npx -y summer-engine@latest login' first.`, imageG
321
302
  width,
322
303
  height,
323
304
  options,
324
- });
305
+ }, IMAGE_GENERATION_TIMEOUT_MS);
325
306
  if (result.error) {
326
307
  return errorResult(result.error, result.data);
327
308
  }
@@ -329,7 +310,7 @@ Requires authentication: run 'npx -y summer-engine@latest login' first.`, imageG
329
310
  const imageUrl = result.data?.asset?.fileUrl || result.data?.asset?.thumbnailUrl;
330
311
  let localPath = null;
331
312
  if (imageUrl) {
332
- localPath = await downloadToTemp(imageUrl, "img");
313
+ localPath = await saveGeneratedImage(imageUrl, out);
333
314
  }
334
315
  return successResult({
335
316
  ...result.data,
@@ -3,7 +3,8 @@
3
3
  * librarian. Behavior lives in src/core/library-search.ts and
4
4
  * src/core/library-read.ts; `summer tool search-library|read-library`
5
5
  * (src/core/capabilities/tool-dispatch.ts) calls the same functions.
6
- * Engine-free: both read the library shipped with this package.
6
+ * Engine-free: both read the library shipped with this package; a hosted
7
+ * skill's body comes from the hosted Summer Engine MCP when signed in.
7
8
  */
8
9
  import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
10
  export declare const SEARCH_LIBRARY_DESCRIPTION: string;
@@ -15,6 +15,7 @@ export const READ_LIBRARY_DESCRIPTION = "Load one library entry by id (<kind>/<s
15
15
  "Skills: the SKILL.md body plus metadata (status, use_when, related) and how to invoke the skill in your host (bare slug). " +
16
16
  "Tools: how to call it (MCP name, `summer tool <slug> --args`, engine requirement, authority) plus the descriptor. " +
17
17
  "Templates: the pinned repo @ commit and tree digest (or built-in) and the `summer create <slug>` command. References: the markdown body. " +
18
+ "Hosted skills (publish-your-game, store-listing, store-art, grow-analytics; also by their summer://skills/<slug> URI): the current text from the hosted Summer Engine MCP with the store sign-in, else the local summary plus why and how to load the rest. " +
18
19
  "Linked files: a body ends with its relative links and the id that loads each; a file an entry links loads by <entry id>/<link as written> " +
19
20
  "(e.g. skill/spatial-placement/references/kit-placement-tools.md), by the relative path alone when one entry ships it, inside library/ only. " +
20
21
  "part: 'skill' = body only, 'resource' = the resource.yaml descriptor only, 'all' (default) = both. " +
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_generated": "GENERATED from integrations/gemini — do not edit; npm run generate:registry",
3
3
  "name": "summer",
4
- "version": "3.4.1",
4
+ "version": "3.5.0",
5
5
  "description": "Agent tooling for Summer Engine: MCP bridge, context primer, and game-dev skills. Use with the npm CLI for skill files on disk.",
6
6
  "contextFileName": "GEMINI.md",
7
7
  "mcpServers": {
@@ -68,6 +68,7 @@
68
68
  "./library/skills/gdscript-patterns/",
69
69
  "./library/skills/generate-motion/",
70
70
  "./library/skills/godogen-visual-proof-game-generation/",
71
+ "./library/skills/grow-analytics/",
71
72
  "./library/skills/headless-scripting/",
72
73
  "./library/skills/in-game-purchases/",
73
74
  "./library/skills/instantiate-asset-pack/",
@@ -90,6 +91,7 @@
90
91
  "./library/skills/procedural-animation/",
91
92
  "./library/skills/prop-model/",
92
93
  "./library/skills/psx-retro-rendering/",
94
+ "./library/skills/publish-your-game/",
93
95
  "./library/skills/realtime-wet-surfaces/",
94
96
  "./library/skills/remote-deploy/",
95
97
  "./library/skills/retarget/",
@@ -107,6 +109,8 @@
107
109
  "./library/skills/sound-effect/",
108
110
  "./library/skills/spatial-placement/",
109
111
  "./library/skills/sprite-sheet/",
112
+ "./library/skills/store-art/",
113
+ "./library/skills/store-listing/",
110
114
  "./library/skills/summer-analytics/",
111
115
  "./library/skills/summer-friends/",
112
116
  "./library/skills/summer-leaderboards/",
@@ -248,7 +248,7 @@ Preview. One fast, read-only call that walks every node of a 3D scene and lists
248
248
  | `summer_creator_publish` | **Deprecated** (use the two tools above). Compute the exact `.pck` digest and size, require user confirmation, then run versioned prepare → write-once upload → finalize. The server independently verifies `publish` scope, ownership, bytes, and review state. |
249
249
  | `summer_creator_releases` | **Deprecated.** Lists releases on the legacy creator API. For summer.games use `summer_store_releases` (hosted, mounted after `summer login --store`). |
250
250
  | `summer_creator_config` | Read or confirm updates to the shared non-secret `~/.summer/config.json`. It never accepts or returns tokens. |
251
- | `summer_capture_gameplay` | Real gameplay frames without a running editor: starts the game (main scene or `scene`) in the engine's offscreen verify instance (`--summer-verify`, real renderer, window parked offscreen, no focus) at `resolution` (default `1920x1080`), waits `waitSeconds`, saves `frames` PNGs (HUD included) to `<project>/.summer/captures/<time>/`. Imports the project first when `.godot/` is missing. Returns each path with its real width and height; warns when the stretch settings render another size. For store screenshots. |
251
+ | `summer_capture_gameplay` | Real gameplay frames without a running editor: starts the game (main scene or `scene`) in the engine's offscreen verify instance (`--summer-verify`, real renderer, window parked offscreen, no focus) (`--summer-offscreen`) at `resolution` (default `1920x1080`), waits `waitSeconds`, runs `steps` (`press` a button by text, `key`, `action`, `click`, `drag`, `wait`, `shot`), saves `frames` PNGs (HUD included; with a `shot` step, one per shot) to `<project>/.summer/captures/<time>/`. `args` are the game's own flags, passed after `--` (e.g. `["--autostart"]` to skip the title screen). Imports the project first when `.godot/` is missing. Returns each path with its real width and height; warns when the stretch settings render another size. For store screenshots. |
252
252
 
253
253
  ### Library search (2)
254
254
 
@@ -1,6 +1,6 @@
1
1
  # Summer skills
2
2
 
3
- > 118 skills, grouped by their primary domain. **Generated** by `npm run generate:registry` from each skill's `resource.yaml`; `--check` fails when this file and the library disagree. Do not edit by hand.
3
+ > 122 skills, grouped by their primary domain. **Generated** by `npm run generate:registry` from each skill's `resource.yaml`; `--check` fails when this file and the library disagree. Do not edit by hand.
4
4
 
5
5
  The folder is flat on purpose (`docs/design/DECISIONS.md`, D3): a skill usually belongs to several domains, so categories live in each skill's `facets.domains` and this index is rendered from them. The first domain listed is the primary one. `summer skills list --by-domain` prints the same grouping; `summer skills info <slug>` shows one skill.
6
6
 
@@ -16,6 +16,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
16
16
  - [assets](#assets) (3)
17
17
  - [audio](#audio) (6)
18
18
  - [character-controller](#character-controller) (2)
19
+ - [creator](#creator) (4)
19
20
  - [debug](#debug) (1)
20
21
  - [deployment](#deployment) (2)
21
22
  - [editor](#editor) (1)
@@ -126,6 +127,15 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
126
127
  | [*character-movement*](./character-movement/SKILL.md) (preview) | Player controllers for 2D and 3D, plus the canonical third-person controller for Summer humanoid packages: movement owns translation, clips follow state. | gameplay, 2d, 3d |
127
128
  | [fps-controller](./fps-controller/SKILL.md) ★ | Production-quality first-person controller — WASD, mouse look, jump, coyote time, jump buffering, air control, and external-velocity handling. | gameplay |
128
129
 
130
+ ## creator
131
+
132
+ | skill | when to use | also |
133
+ |---|---|---|
134
+ | [grow-analytics](./grow-analytics/SKILL.md) | Read and analyse a creator's Summer Grow numbers: store page views, launches, play sessions, play time; compare windows, flag drops. | deployment |
135
+ | [publish-your-game](./publish-your-game/SKILL.md) | Publish a Summer game on Summer Games through MCP: store page, art, build upload, submit, and one approval link for the owner. | deployment |
136
+ | [store-art](./store-art/SKILL.md) | Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks. | assets |
137
+ | [store-listing](./store-listing/SKILL.md) | Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write. | product-language |
138
+
129
139
  ## debug
130
140
 
131
141
  | skill | when to use | also |
@@ -298,7 +298,7 @@ Per platform, point the user at the correct upload path:
298
298
  - **summer.games:** `summer_export_game` writes the summer.games `.zip`; `summer_publish_build` uploads it to the game's store listing after the user confirms the exact game, file and version (needs `summer login --store`). If it answers `store_auth_refused`, the user uploads the `.zip` in Studio instead.
299
299
  - Per platform, the store takes: iPhone, Android, macOS and Windows in the Summer apps = one summer.games bundle (`summer_export_game` `targets`, format `bundle`; no template, no signing; a game without a server targets `ios`/`android` only). Web = an HTML5 `.zip` on Summer's WebGPU Forward+ template (`targets:["web"]`; the project must render with Forward+ or Mobile). A macOS or Windows download for the store page = `targets:["macos"]` or `["windows"]` with format `download`. Download exports need the template: `summer_export_templates` `install` fetches it from Summer's CDN.
300
300
  - Hosted games: if `summer_export_game` fails with "… is in the source graph's authority_engine domain, which the client pack leaves out", an authority root in `source-domains.json` holds a file the client loads (often the composition `.tres`). Narrow that root to the server-only files, or move the shared file under a `shared` path, then export again. Every exporter message is in the `multiplayer-publish` skill's export-errors.md; the folder rules are in `multiplayer-project`.
301
- - Store page art: key art, covers and icons carry no text, logos or UI (the store page shows the title). Screenshots are real gameplay and may show the game's own HUD; add no captions, logos or overlays. Capture them with `summer_capture_gameplay` (offscreen, no editor needed; `resolution` `1920x1080`, or `1080x1920` for portrait; pass the gameplay `scene` when the main scene is a title menu), or `summer_screenshot` target `game` while the editor runs the game.
301
+ - Store page art: key art, covers and icons carry no text, logos or UI (the store page shows the title). Screenshots are real gameplay and may show the game's own HUD; add no captions, logos or overlays. Capture them with `summer_capture_gameplay` (offscreen, no editor needed; `resolution` `1920x1080`, or `1080x1920` for portrait; get past a title menu with the game's own flags in `args`, e.g. `["--autostart"]`, or `steps` such as `[{"press":"Play"},{"wait":3000},{"shot":true}]`), or `summer_screenshot` target `game` while the editor runs the game.
302
302
  - **Steam:** `steamcmd` + Steam Pipe (`builder_app_xxx.vdf`). Set up depots first in Steamworks.
303
303
  - **itch.io:** `butler push <path> <user>/<game>:<channel>` (e.g. `butler push build/win <user>/mygame:windows`).
304
304
  - **Web (itch hosted):** zip + drop into itch upload UI as "playable in browser".
@@ -6,7 +6,7 @@ use_when:
6
6
  - the user wants to assess or prepare a Summer game export — Steam, itch, HTML5, iOS, Android targets as available in the installed build
7
7
  - the user says 'publish my game', 'release it', or 'ship a build to players' — produce the build they will upload
8
8
  do_not_use_when:
9
- - publishing, uploading, hosting, or submitting a game — this skill only produces local builds
9
+ - publishing, uploading, hosting, or submitting a game — this skill only produces local builds; publishing is skill/publish-your-game
10
10
  facets:
11
11
  lifecycle:
12
12
  - launch
@@ -21,6 +21,7 @@ related:
21
21
  skills:
22
22
  - skill/debug
23
23
  - skill/tune-performance
24
+ - skill/publish-your-game
24
25
  source: official
25
26
  license: MIT
26
27
  status: stable
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: grow-analytics
3
+ description: "Read and analyse a creator's Summer Grow numbers: store page views, launches, play sessions, play time; compare windows, flag drops."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: summer_read_library
9
+ ---
10
+
11
+ # /grow-analytics — grow analytics
12
+
13
+ This skill covers how to read a creator's Summer Grow numbers (store page views, launches, play sessions, play time) and analyse them: compare windows, walk the funnel, flag drops, give one next step.
14
+
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
+
17
+ 1. `summer_read_library` with id `skill/grow-analytics` returns the current text when this machine has a store sign-in (`summer login --store`).
18
+ 2. A host that shows MCP prompts or resources has it as the `grow-analytics` prompt and the resource `summer://skills/grow-analytics`.
19
+ 3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
+
21
+ The one rule to keep even before you load it: Report what the numbers show; do not guess causes the data cannot support.
@@ -0,0 +1,27 @@
1
+ id: skill/grow-analytics
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Read and analyse a creator's Summer Grow numbers: store page views, launches, play sessions, play time; compare windows, flag drops."
5
+ use_when:
6
+ - "the user asks how their game is doing on Summer Games: views, launches, players, play time"
7
+ - "reading summer_grow_overview or summer_grow_analytics and turning the numbers into one next step"
8
+ - "comparing two time windows, walking the store funnel or finding where players drop"
9
+ do_not_use_when:
10
+ - "sending analytics events from game code — skill/summer-analytics"
11
+ facets:
12
+ lifecycle:
13
+ - grow
14
+ domains:
15
+ - creator
16
+ - deployment
17
+ modalities:
18
+ - docs
19
+ related:
20
+ skills:
21
+ - skill/publish-your-game
22
+ - skill/summer-analytics
23
+ hosted_resource: "summer://skills/grow-analytics"
24
+ source: official
25
+ license: MIT
26
+ status: stable
27
+ recommended: false
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: publish-your-game
3
+ description: "Publish a Summer game on Summer Games through MCP: store page, art, build upload, submit, and one approval link for the owner."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: summer_read_library
9
+ ---
10
+
11
+ # /publish-your-game — publish your game
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.
14
+
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
+
17
+ 1. `summer_read_library` with id `skill/publish-your-game` returns the current text when this machine has a store sign-in (`summer login --store`).
18
+ 2. A host that shows MCP prompts or resources has it as the `publish-your-game` prompt and the resource `summer://skills/publish-your-game`.
19
+ 3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
+
21
+ The one rule to keep even before you load it: Submitting does not publish. `summer_store_submit` returns an approval link; only the owner's click sends the game to review, and review comes before live.
@@ -0,0 +1,29 @@
1
+ id: skill/publish-your-game
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Publish a Summer game on Summer Games through MCP: store page, art, build upload, submit, and one approval link for the owner."
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, summer_store_submit and the owner's approval link"
8
+ - "an agent publishes for the owner end to end and needs the order of the summer_store_* and summer_build_* tools"
9
+ do_not_use_when:
10
+ - "only producing a local export build — skill/export-and-ship"
11
+ facets:
12
+ lifecycle:
13
+ - launch
14
+ domains:
15
+ - creator
16
+ - deployment
17
+ modalities:
18
+ - docs
19
+ related:
20
+ skills:
21
+ - skill/store-listing
22
+ - skill/store-art
23
+ - skill/grow-analytics
24
+ - skill/export-and-ship
25
+ hosted_resource: "summer://skills/publish-your-game"
26
+ source: official
27
+ license: MIT
28
+ status: stable
29
+ recommended: false
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: store-art
3
+ description: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: summer_read_library
9
+ ---
10
+
11
+ # /store-art — store art
12
+
13
+ This skill covers every store art slot per flow (desktop and mobile): size, shape, text rules, fallbacks, and why each one matters.
14
+
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
+
17
+ 1. `summer_read_library` with id `skill/store-art` returns the current text when this machine has a store sign-in (`summer login --store`).
18
+ 2. A host that shows MCP prompts or resources has it as the `store-art` prompt and the resource `summer://skills/store-art`.
19
+ 3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
+
21
+ Screenshots: `summer_capture_gameplay` takes them offscreen. Get past the title screen with the game's own flags in `args` or with `steps`, e.g. `{"args":["--autostart"],"steps":[{"wait":3000},{"shot":true},{"key":"Space"},{"wait":800},{"shot":true}]}`.
22
+
23
+ The one rule to keep even before you load it: Key art, covers and icons carry no text: the stores draw the title over them. Screenshots are real play.
@@ -0,0 +1,30 @@
1
+ id: skill/store-art
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Make Summer Games store art per slot and flow: key art, covers, icons, screenshots, trailer: size, shape, text rules, fallbacks."
5
+ use_when:
6
+ - "making or choosing store art for Summer Games: key art, cover, icon, screenshots, trailer"
7
+ - "summer_store_set_art rejects an image for its shape or size, or summer_store_get_listing says an art slot is missing"
8
+ - "deciding whether a store image may carry text, and which slot falls back to which"
9
+ facets:
10
+ lifecycle:
11
+ - launch
12
+ domains:
13
+ - creator
14
+ - assets
15
+ modalities:
16
+ - images
17
+ - video
18
+ related:
19
+ skills:
20
+ - skill/publish-your-game
21
+ - skill/store-listing
22
+ tools:
23
+ - tool/generate-image
24
+ - tool/capture-gameplay
25
+ - tool/list-my-assets
26
+ hosted_resource: "summer://skills/store-art"
27
+ source: official
28
+ license: MIT
29
+ status: stable
30
+ recommended: false
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: store-listing
3
+ description: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: summer_read_library
9
+ ---
10
+
11
+ # /store-listing — store listing
12
+
13
+ This skill covers the store page text per flow (desktop and mobile): targets, title, tagline, descriptions, tags, and what never to write.
14
+
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
+
17
+ 1. `summer_read_library` with id `skill/store-listing` returns the current text when this machine has a store sign-in (`summer login --store`).
18
+ 2. A host that shows MCP prompts or resources has it as the `store-listing` prompt and the resource `summer://skills/store-listing`.
19
+ 3. Without a store sign-in: https://docs.summerengine.com/llms.txt lists every docs page; fetch any page as .md.
20
+
21
+ The one rule to keep even before you load it: Never invent features, modes, player counts, awards or prices.
@@ -0,0 +1,25 @@
1
+ id: skill/store-listing
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Write a Summer Games store page per flow (desktop, mobile): targets, title, tagline, descriptions, tags, and what never to write."
5
+ use_when:
6
+ - "writing or fixing a game's store page text on Summer Games: title, tagline, description, tags"
7
+ - "summer_store_update_listing or summer_store_get_listing says a text field is missing or wrong"
8
+ - "choosing the targets (web, Mac, Windows, Linux, iPhone, Android) that decide the desktop and mobile store flows"
9
+ facets:
10
+ lifecycle:
11
+ - launch
12
+ domains:
13
+ - creator
14
+ - product-language
15
+ modalities:
16
+ - docs
17
+ related:
18
+ skills:
19
+ - skill/publish-your-game
20
+ - skill/store-art
21
+ hosted_resource: "summer://skills/store-listing"
22
+ source: official
23
+ license: MIT
24
+ status: stable
25
+ recommended: false
@@ -22,6 +22,7 @@ related:
22
22
  - skill/multiplayer-state
23
23
  - skill/summer-match-results
24
24
  - skill/summer-store
25
+ - skill/grow-analytics
25
26
  source: official
26
27
  license: MIT
27
28
  status: preview
@@ -1,12 +1,13 @@
1
1
  id: tool/capture-gameplay
2
2
  kind: tool
3
3
  version: 1.0.0
4
- summary: Capture real gameplay frames (PNG, HUD included) in Summer Engine's offscreen verify instance, without a running editor, e.g. store screenshots.
4
+ summary: Capture real gameplay PNGs (HUD included) offscreen without a running editor; game flags and player steps (press, key, click) get past the title screen.
5
5
  use_when:
6
6
  - '"take gameplay screenshots for my store page"'
7
7
  - '"I need screenshots but the editor is not open"'
8
8
  - '"capture a 1920x1080 frame of my game"'
9
9
  - collecting real gameplay screenshots for summer_store_set_art desktop.screenshots or mobile.screenshots
10
+ - every capture shows the title screen — pass the game's flags in args or steps like press Play
10
11
  do_not_use_when:
11
12
  - the editor is open and the game is running — tool/screenshot with target game shows the live game
12
13
  - key art, covers or icons — those are generated art, not gameplay frames
@@ -62,6 +63,70 @@ input_schema:
62
63
  out:
63
64
  type: string
64
65
  description: Output folder. Defaults to <project>/.summer/captures/<time>/ (ignored by git).
66
+ args:
67
+ type: array
68
+ maxItems: 32
69
+ items:
70
+ type: string
71
+ description: The game's own command-line flags, passed after "--" (OS.get_cmdline_user_args()), e.g. ["--autostart", "--solo"] to skip the title screen.
72
+ steps:
73
+ type: array
74
+ maxItems: 50
75
+ description: 'What to do after waitSeconds, in order; exactly one of press, key, action, click, drag, wait, shot per step. Example: [{"press":"Play"},{"wait":3000},{"key":"Space"},{"shot":true},{"action":"jump"},{"wait":500},{"shot":true}]. With a shot step only shot steps save frames. A step that cannot run becomes a warning.'
76
+ items:
77
+ type: object
78
+ properties:
79
+ press:
80
+ type: string
81
+ description: Press the visible button with this text (or node name); waits up to timeoutSeconds (default 10) for it.
82
+ timeoutSeconds:
83
+ type: number
84
+ minimum: 0
85
+ maximum: 60
86
+ key:
87
+ type: string
88
+ description: Press a key by Godot name (Space, Enter, Escape, A, Up).
89
+ action:
90
+ type: string
91
+ description: Press an input action from the project's InputMap, e.g. jump.
92
+ holdMs:
93
+ type: number
94
+ minimum: 0
95
+ maximum: 10000
96
+ description: How long key or action is held (default 100).
97
+ click:
98
+ type: array
99
+ items:
100
+ type: number
101
+ description: Left-click at [x, y] in frame pixels.
102
+ drag:
103
+ type: object
104
+ properties:
105
+ from:
106
+ type: array
107
+ items:
108
+ type: number
109
+ to:
110
+ type: array
111
+ items:
112
+ type: number
113
+ ms:
114
+ type: number
115
+ minimum: 0
116
+ maximum: 10000
117
+ required:
118
+ - from
119
+ - to
120
+ description: Drag with the left button from [x, y] to [x, y] over ms (default 300).
121
+ wait:
122
+ type: number
123
+ minimum: 0
124
+ maximum: 60000
125
+ description: Wait this many milliseconds.
126
+ shot:
127
+ type: boolean
128
+ description: true saves a frame now.
129
+ additionalProperties: false
65
130
  additionalProperties: false
66
131
  authority:
67
132
  filesystem: true
@@ -61,6 +61,9 @@ input_schema:
61
61
  minimum: 10
62
62
  maximum: 7200
63
63
  description: Stop the engine after this many seconds (default 900; a first export imports every asset).
64
+ alignDeclaration:
65
+ type: boolean
66
+ description: A game with a server, set summer.build.json targetPlatforms to targets before exporting. The store refuses an upload whose declaration differs from the exported platforms (declaration_mismatch) and that spends the version.
64
67
  additionalProperties: false
65
68
  authority:
66
69
  filesystem: true
@@ -33,8 +33,7 @@ input_schema:
33
33
  description: Description of the image to generate
34
34
  model:
35
35
  type: string
36
- default: nano-banana-2
37
- description: Model name or full provider ID
36
+ description: Model name or full provider ID. Omit it and the server picks one that reaches the requested size (nano-banana-2 when no size is asked).
38
37
  style:
39
38
  type: string
40
39
  default: realistic
@@ -63,6 +62,9 @@ input_schema:
63
62
  type: object
64
63
  additionalProperties: {}
65
64
  description: Extra model params (seed, negative_prompt, ...). The result lists any it did not use in ignoredOptions.
65
+ out:
66
+ type: string
67
+ description: Where to save the image on this machine, a folder or a file path ending in .png, .jpg or .webp. Default is <TMPDIR>/summer-gen/.
66
68
  required:
67
69
  - prompt
68
70
  additionalProperties: false