summer-engine 4.5.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +3 -2
  3. package/.codex-plugin/plugin.json +5 -4
  4. package/.cursor-plugin/plugin.json +4 -3
  5. package/.factory-plugin/plugin.json +4 -3
  6. package/CHANGELOG.md +50 -0
  7. package/README.md +3 -3
  8. package/commands/start.md +1 -1
  9. package/dist/cli/commands/api.d.ts +43 -0
  10. package/dist/cli/commands/api.js +191 -0
  11. package/dist/cli/commands/login.d.ts +2 -5
  12. package/dist/cli/commands/login.js +10 -81
  13. package/dist/cli/commands/setup.js +175 -32
  14. package/dist/cli/commands/token.d.ts +17 -0
  15. package/dist/cli/commands/token.js +25 -0
  16. package/dist/cli/index.js +4 -0
  17. package/dist/core/api-client.d.ts +5 -1
  18. package/dist/core/api-client.js +21 -0
  19. package/dist/core/capabilities/doctor.d.ts +1 -1
  20. package/dist/core/capabilities/doctor.js +1 -1
  21. package/dist/core/capabilities/game-task-plan.d.ts +2 -2
  22. package/dist/core/capabilities/navigation/open.d.ts +3 -0
  23. package/dist/core/capabilities/navigation/open.js +53 -0
  24. package/dist/core/capabilities/projects-local.js +2 -1
  25. package/dist/core/capabilities/runtime-control.d.ts +2 -2
  26. package/dist/core/capabilities/seeing/args.d.ts +4 -4
  27. package/dist/core/capabilities/tool-dispatch.js +37 -0
  28. package/dist/core/capabilities/ui-control.d.ts +2 -2
  29. package/dist/core/capabilities/view-set.d.ts +11 -0
  30. package/dist/core/capabilities/view-set.js +15 -0
  31. package/dist/core/capability-skew.d.ts +8 -0
  32. package/dist/core/capability-skew.js +18 -0
  33. package/dist/core/cli-session.d.ts +25 -0
  34. package/dist/core/cli-session.js +97 -0
  35. package/dist/core/engine-self-start.d.ts +20 -0
  36. package/dist/core/engine-self-start.js +108 -5
  37. package/dist/core/oauth.d.ts +15 -2
  38. package/dist/core/oauth.js +26 -3
  39. package/dist/core/ops/areas.d.ts +1 -1
  40. package/dist/core/ops/areas.js +5 -3
  41. package/dist/core/ops/engine-answer.js +5 -2
  42. package/dist/core/ops/engine.js +6 -0
  43. package/dist/core/ops/save-files.d.ts +2 -0
  44. package/dist/core/ops/save-files.js +13 -0
  45. package/dist/core/ops/studio-page.d.ts +22 -0
  46. package/dist/core/ops/studio-page.js +63 -0
  47. package/dist/core/sign-in-link.d.ts +38 -0
  48. package/dist/core/sign-in-link.js +106 -0
  49. package/dist/core/store.js +19 -1
  50. package/dist/core/summer-api.d.ts +114 -0
  51. package/dist/core/summer-api.js +281 -0
  52. package/dist/installer/agent-config.d.ts +29 -0
  53. package/dist/installer/agent-config.js +75 -11
  54. package/dist/installer/agent-detect.d.ts +44 -0
  55. package/dist/installer/agent-detect.js +166 -0
  56. package/dist/installer/agent-table.d.ts +19 -0
  57. package/dist/installer/agent-table.js +130 -0
  58. package/dist/installer/setup-error.d.ts +19 -0
  59. package/dist/installer/setup-error.js +34 -0
  60. package/dist/installer/version-check.d.ts +5 -0
  61. package/dist/installer/version-check.js +21 -0
  62. package/dist/mcp/ops-surface.d.ts +10 -0
  63. package/dist/mcp/ops-surface.js +18 -1
  64. package/dist/mcp/server.js +16 -4
  65. package/dist/mcp/tool-results.d.ts +9 -0
  66. package/dist/mcp/tool-results.js +64 -0
  67. package/dist/mcp/tool-surface.js +7 -1
  68. package/dist/mcp/tools/api-tools.d.ts +50 -0
  69. package/dist/mcp/tools/api-tools.js +65 -0
  70. package/dist/mcp/tools/local-project-tools.d.ts +14 -0
  71. package/dist/mcp/tools/local-project-tools.js +13 -2
  72. package/dist/mcp/tools/navigation-tools.js +1 -0
  73. package/dist/mcp/tools/scene-tools.js +7 -0
  74. package/dist/project-memory/agent-instructions.js +11 -3
  75. package/gemini-extension.json +3 -2
  76. package/library/references/mcp-tools-reference/mcp-tools-reference.md +15 -2
  77. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  78. package/library/skills/README.md +6 -5
  79. package/library/skills/design-npc/SKILL.md +1 -1
  80. package/library/skills/design-npc/resource.yaml +2 -1
  81. package/library/skills/make-game/SKILL.md +4 -4
  82. package/library/skills/navigate-summer/SKILL.md +23 -2
  83. package/library/skills/navigate-summer/resource.yaml +5 -3
  84. package/library/skills/summer-api/SKILL.md +198 -0
  85. package/library/skills/summer-api/resource.yaml +38 -0
  86. package/library/skills/summer-assets/SKILL.md +1 -1
  87. package/library/skills/summer-assets/resource.yaml +3 -2
  88. package/library/skills/summer-router/SKILL.md +251 -0
  89. package/library/skills/summer-router/resource.yaml +35 -0
  90. package/library/tools/api-batch/resource.yaml +82 -0
  91. package/library/tools/api-estimate/resource.yaml +52 -0
  92. package/library/tools/api-job/resource.yaml +58 -0
  93. package/library/tools/api-models/resource.yaml +57 -0
  94. package/library/tools/api-run/resource.yaml +70 -0
  95. package/library/tools/view-set/GUIDE.md +3 -0
  96. package/library/tools/view-set/resource.yaml +78 -0
  97. package/package.json +3 -3
  98. package/registry/generated/aliases.json +7 -0
  99. package/registry/generated/counts.json +3 -3
  100. package/registry/generated/gemini-extension.json +3 -2
  101. package/registry/generated/index.json +317 -52
  102. package/registry/generated/marketplace.claude.json +1 -1
  103. package/registry/generated/plugin.claude-directory.json +4 -3
  104. package/registry/generated/plugin.claude.json +3 -2
  105. package/registry/generated/plugin.codex.json +5 -4
  106. package/registry/generated/plugin.cursor.json +4 -3
  107. package/registry/generated/plugin.factory.json +4 -3
  108. package/registry/generated/server.json +2 -2
  109. package/registry/generated/skills-index.md +6 -5
  110. package/registry/generated/skills-registry.json +29 -15
  111. package/registry/operations/legacy-names.json +30 -0
  112. package/registry/operations/public-catalog.json +9169 -4926
  113. package/library/skills/ai-characters-in-games/SKILL.md +0 -235
  114. package/library/skills/ai-characters-in-games/resource.yaml +0 -30
@@ -1,6 +1,6 @@
1
1
  # Summer skills
2
2
 
3
- > 132 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
+ > 133 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
 
@@ -13,7 +13,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
13
13
  - [agent-workflow](#agent-workflow) (19)
14
14
  - [ai](#ai) (2)
15
15
  - [animation](#animation) (7)
16
- - [assets](#assets) (4)
16
+ - [assets](#assets) (5)
17
17
  - [audio](#audio) (6)
18
18
  - [character-controller](#character-controller) (2)
19
19
  - [creator](#creator) (7)
@@ -89,8 +89,8 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
89
89
 
90
90
  | skill | when to use | also |
91
91
  |---|---|---|
92
- | [*ai-characters-in-games*](./ai-characters-in-games/SKILL.md) (preview) | Safe AI characters in published games: no keys in the build, Summer's player AI gateway, moderation, caps. | npc |
93
92
  | [design-npc](./design-npc/SKILL.md) ★ | Design enemy, NPC, boss or companion behavior: perception, state machine, telegraphs, script stub. | npc |
93
+ | [*summer-router*](./summer-router/SKILL.md) (preview) | AI characters for games on Summer Games: Summer Router replies, tools, speech, images. | npc, multiplayer |
94
94
 
95
95
  ## animation
96
96
 
@@ -111,7 +111,8 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
111
111
  | [asset-strategy](./asset-strategy/SKILL.md) ★ | Route any 'I need a [thing]' asset request to the right skill: 2D, 3D, audio, video, VFX or animation. | pipeline |
112
112
  | [*lumera-single-image-scene-reconstruction*](./lumera-single-image-scene-reconstruction/SKILL.md) (preview) (library only) | Lumera-style single image to editable 3D scene — VLM-parsed object boxes and parametric lights, per-object meshes, HDR probe, .tscn assembly, refinement loop. | pipeline, 3d, scenes |
113
113
  | [*skintokens-auto-rigging*](./skintokens-auto-rigging/SKILL.md) (preview) (library only) | Offline auto-rigging with skin-tokens.cpp (GGML SkinTokens/TokenRig port) — skeleton and skin weights from a static GLB mesh on CPU/Vulkan, into Summer Engine. | pipeline, 3d, animation |
114
- | [summer-assets](./summer-assets/SKILL.md) | Make game assets with Summer, no Summer Engine: find, generate and download 3D models, images, audio and video for any engine or app. | agent-workflow |
114
+ | [*summer-api*](./summer-api/SKILL.md) (preview) | Summer API game assets: models, estimate, one job or a batch, download the files. | agent-workflow |
115
+ | [summer-assets](./summer-assets/SKILL.md) | Game assets for any engine, no Summer Engine: find, generate and download them. | agent-workflow |
115
116
 
116
117
  ## audio
117
118
 
@@ -207,7 +208,7 @@ Status: **stable** unless marked; *preview* = not yet exercised in-engine by the
207
208
 
208
209
  | skill | when to use | also |
209
210
  |---|---|---|
210
- | [navigate-summer](./navigate-summer/SKILL.md) ★ | Open a Summer web page or editor surface for the user (billing, their games, a scene) with studio.open. | agent-workflow, meta |
211
+ | [navigate-summer](./navigate-summer/SKILL.md) ★ | Open a Summer page or editor view for the person: studio.open, and engine.view_set while you work. | agent-workflow, meta |
211
212
 
212
213
  ## performance
213
214
 
@@ -493,7 +493,7 @@ For an animated NPC in a runnable project: `summer create 3d-fps-simple-animated
493
493
  ## See also
494
494
 
495
495
  - `animation-tree` — wire the action states to animation clips
496
- - `ai-characters-in-games` — NPCs that answer free-form player text
496
+ - `summer-router` — NPCs that answer free-form player text in a game on Summer Games
497
497
  - `vfx-hit-spark` — hit flash recipe
498
498
  - `vfx-dissolve` — death dissolve recipe
499
499
  - `game-feel` — screen-feel discipline (camera shake, hit-stop)
@@ -1,6 +1,6 @@
1
1
  id: skill/design-npc
2
2
  kind: skill
3
- version: 1.0.2
3
+ version: 1.0.3
4
4
  summary: "Design enemy, NPC, boss or companion behavior: perception, state machine, telegraphs, script stub."
5
5
  use_when:
6
6
  - designing an enemy, NPC, boss, companion, civilian, or wave-spawned mob's behavior — perception, intent, state machine, telegraphs, defeat handling
@@ -21,6 +21,7 @@ related:
21
21
  - skill/game-feel
22
22
  - skill/vfx-dissolve
23
23
  - skill/vfx-hit-spark
24
+ - skill/summer-router
24
25
  source: official
25
26
  license: MIT
26
27
  status: stable
@@ -48,7 +48,7 @@ These rules from the playbooks apply to every genre:
48
48
 
49
49
  - **2D scales to the viewport.** Set `display/window/stretch/mode = canvas_items` and `stretch/aspect = expand`; UI uses Control anchors; code-positioned nodes compute from `get_viewport_rect().size`. Never hardcode 1920x1080.
50
50
  - **Playable slice, not tech demo.** Name the core loop in one sentence; every input gets feedback (tween, sound, particle, flash, shake); progression is visible; a restart exists. The bar is "feels good for 30 seconds".
51
- - **Fast first draft when someone is waiting.** The first playable version uses shapes, the palette and any template art, plus at most one or two generated assets the person specifically asked for; generation takes minutes, so it never blocks the first play. Say plainly that it is a first draft to get a feel for the game, that the art is not final, and ask if this is the direction they want. Generate the rest of the art in later passes.
51
+ - **The first playable already looks good.** People judge Summer by the first frame of their first game, so the first version looks finished even when they ask for a quick prototype: keep the features they asked for and raise the look. Sky and sun with shadows, tonemapping and a little fog; a texture on every surface; real models for the player, characters and main props from the starter project or the Summer asset library (`summer_assets_search`), never capsules or boxes as final art; one colour palette; a styled UI font. Generation takes minutes, so it never blocks the first play: use starter and library art first, plus at most one or two generated assets the person asked for, and generate the rest in later passes. Before you say it is ready, play it and look at a screenshot of the running game, not the editor (the editor shows a preview sky and sun that the game does not have).
52
52
  - **A way back to the title.** From inside play, a pause menu or a **Leave** button returns to the title screen without quitting the app.
53
53
  - **Text the default font can show.** No emoji or symbols (▲ ◀ ★ ♥ ✓) in UI text: they render as boxes with hex codes. Use words or icons; see `ui-basics`.
54
54
 
@@ -201,7 +201,7 @@ Repeat until every mechanic in the plan is implemented OR the user calls cut.
201
201
 
202
202
  ## Phase 5: Layer (look + sound)
203
203
 
204
- **Goal**: the game stops looking like a programmer art prototype.
204
+ **Goal**: deepen the look and add sound. The first playable already looks good (see "The first playable already looks good" above); this phase writes the art bible, replaces the remaining stand-in art and adds audio.
205
205
 
206
206
  ```
207
207
  Skill: art-direction
@@ -276,7 +276,7 @@ If the brief said "jam" or "prototype", skip this phase. If the brief said "game
276
276
  |---|---|
277
277
  | Skip the brainstorm because the user said "FPS" | Even with the genre named, you need the scope cut list. Otherwise mechanic 4 quietly sneaks in and the game never ships. |
278
278
  | Let mechanic 2 start before mechanic 1 is verified clean | Compounding bugs. You'll spend the rest of the session debugging which mechanic broke what. |
279
- | Stack art direction on top of unfinished mechanics | Art changes are reversible only if the underlying scene structure is stable. Get mechanics done first. |
279
+ | Change the art style while mechanics are unfinished | Art changes are reversible only if the underlying scene structure is stable. Get mechanics done before a new style; the first playable still starts good-looking. |
280
280
  | Treat "polish" as required | If the brief says "jam in 2 days", polish is a cut item. Respect the brief. |
281
281
  | Run all phases without confirming | The user owns scope. Stop at every checkpoint. |
282
282
  | Ship online play behind a setting nobody changes | Hosted join is never exercised, so it breaks without anyone noticing. Reachable by default, or the owner joins online before every release. |
@@ -313,7 +313,7 @@ No Summer MCP tools in this session? Run each one as a command; when `summer --v
313
313
 
314
314
  | In this skill | Command |
315
315
  |---|---|
316
- | `assets.search` | `summer assets search` |
316
+ | `assets.search`, `summer_assets_search` | `summer assets search` |
317
317
  | `summer_docs_read` | `summer docs read` |
318
318
  | `summer_add_node` | `summer engine add-node` |
319
319
  | `summer_batch` | `summer engine batch` |
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: navigate-summer
3
- description: "Open a Summer web page or editor surface for the user (billing, their games, a scene) with studio.open."
3
+ description: "Open a Summer page or editor view for the person: studio.open, and engine.view_set while you work."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode, Factory, Copilot]
6
6
  category: _meta
7
7
  user-invocable: true
8
- allowed-tools: summer_call summer_get_project_context summer_is_running
8
+ allowed-tools: summer_call summer_get_project_context summer_is_running summer_view_set summer_frame_shot
9
9
  paths: ["**/project.godot", "**/*.tscn", "**/.summer/**"]
10
10
  ---
11
11
 
@@ -55,6 +55,26 @@ Use `open: false` (CLI: `--print`) and paste the `url` (or `login_url`) when the
55
55
 
56
56
  The editor owns its own table of destinations (the `Navigate` op) and tells the tool which ids it can open. `studio.open({})` lists every editor id with `availability`: `available` (Navigate op), `legacy` (an older engine serving it through its original op), `unavailable` (update Summer Engine), `unknown` (engine not running). Ids: `scene` (default = the project's main scene), `main-scene`, `node`, `script` (with `line`), `file`, `files`, `scene-tree`, `inspector`, `import-dock`, `signals-dock`, `changes-dock`, `screen-2d/3d/script/game/assetlib`, `viewport-show/hide`, `assistant`, `project-settings`, `editor-settings`, `output`, `debugger`, `editor-window`. On a legacy engine, `script` opens without taking focus — mention it if the user does not see it.
57
57
 
58
+ ## While you work: what to open when
59
+
60
+ When you drive Summer Engine from outside (Claude Code, Codex, Cursor, the `summer` CLI), the person is not using the in-app chat. The editor is their window onto your work. A line at the bottom of it names your app and says what you are doing ("Claude Code · Placing 12 trees"). You choose what they see with `engine.view_set` (3.x `summer_view_set`): `view` (`3d`, `2d`, `script`, `game`, `chat`, `home`, `studio`), optional `rail` (`scene`, `inspector`, `files`, `output`, `none`), optional `focus` and optional `frame`. A node path in `focus` selects that node; a `res://` script or scene opens. `frame` lists the nodes to frame the camera on. Switching is instant and changes nothing in the game.
61
+
62
+ | You are about to… | Show |
63
+ |---|---|
64
+ | Edit a scene (place, move, remove nodes) | `{"view": "3d", "rail": "scene", "focus": "<the node or group you edit>", "frame": ["<it>"]}`; a 2D game uses `"2d"` |
65
+ | Write or fix a script | `{"view": "script", "focus": "res://<the script>.gd"}` |
66
+ | Tune one node's properties | `{"view": "3d", "rail": "inspector", "focus": "<that node>"}` |
67
+ | Playtest | `{"view": "game"}`, then play the game |
68
+ | Review how it looks | a `summer_frame_shot` of the result |
69
+ | Read errors or logs with the person | `{"view": "3d", "rail": "output"}` |
70
+ | Finish | the best view of the result: the game in `game` for gameplay work, the framed scene in `3d` or `2d` for level and art work, the script for code-only changes |
71
+
72
+ - Open the view before the first edit of a step, so the person watches the change happen.
73
+ - Focus what you change, not the scene root; for a group, focus its parent.
74
+ - Make one call when the kind of work changes, not one per edit.
75
+ - End on the result, never on an empty or unrelated view.
76
+ - When the person is using the in-app chat, let them choose the view.
77
+
58
78
  ## Anti-patterns
59
79
 
60
80
  - Opening `billing` or `pricing` when the user asked about a **feature**, not money.
@@ -75,6 +95,7 @@ No Summer MCP tools in this session? Run each one as a command; when `summer --v
75
95
  | `summer_is_running` | `summer engine is-running` |
76
96
  | `summer_play` | `summer engine play` |
77
97
  | `summer_screenshot` | `summer engine screenshot` |
98
+ | `engine.view_set`, `summer_view_set` | `summer engine view-set` |
78
99
  | `store.publish` | `summer store publish` |
79
100
  | `studio.open`, `summer_open` | `summer studio open` |
80
101
  <!-- /shell-commands -->
@@ -1,11 +1,12 @@
1
1
  id: skill/navigate-summer
2
2
  kind: skill
3
- version: 1.0.0
4
- summary: "Open a Summer web page or editor surface for the user (billing, their games, a scene) with studio.open."
3
+ version: 1.0.1
4
+ summary: "Open a Summer page or editor view for the person: studio.open, and engine.view_set while you work."
5
5
  use_when:
6
6
  - the user asks to see, check, or decide something — "show me my billing", "where do I change my plan", "open my games", "let me look at the scene", "take me to the MCP guide for Cursor"
7
- - deciding whether to open a surface for the user or to do the work through Summer tools
7
+ - deciding whether to open a surface (a page of the website) for the user or to do the work through Summer tools or an API
8
8
  - handing the user a link (headless, remote, or the user prefers a link) instead of launching a browser
9
+ - "you drive Summer Engine from outside (Claude Code, Codex, Cursor, the summer CLI) and the editor should show what you work on: the view, rail and focus for editing, scripting, playtesting, review and the end result"
9
10
  do_not_use_when:
10
11
  - the user wants a change made — add/set/remove nodes, publish, generate; use the build skills and mutation tools
11
12
  - opening a project directory in the engine — `summer run <path>`
@@ -25,6 +26,7 @@ compatibility:
25
26
  related:
26
27
  tools:
27
28
  - tool/open
29
+ - tool/view-set
28
30
  references:
29
31
  - reference/product-map
30
32
  skills:
@@ -0,0 +1,198 @@
1
+ ---
2
+ name: summer-api
3
+ description: "Summer API game assets: models, estimate, one job or a batch, download the files."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode, Factory, Copilot]
6
+ category: _meta
7
+ user-invocable: false
8
+ allowed-tools: Bash Read Write summer_api_models summer_api_estimate summer_api_run summer_api_batch summer_api_job
9
+ ---
10
+
11
+ # Summer API: game assets for any agent
12
+
13
+ The Summer API makes game assets from curated models tested for games: 3D models (GLB), images, video, voice lines, dialogue, sound effects and music. Each finished file is saved to the person's Summer library and downloads into their project. Every model runs at the provider's list price, with no markup on assets.
14
+
15
+ Use this skill when the person asks for the Summer API, or wants asset files for any engine, app or pipeline from a script, a batch or a coding agent. Inside a running Summer Engine project, the asset skills (`prop-model`, `character-model`, `sound-effect`, ...) import the asset into the scene for you; use them there.
16
+
17
+ Two ways in, with the same calls and the same answers:
18
+
19
+ | You have | Use |
20
+ |---|---|
21
+ | A shell | `summer api ...` commands. If `summer --version` is missing or below 4.8, write `npx -y summer-engine@latest` in place of `summer`. |
22
+ | Summer's local MCP server | The tools `summer_api_models`, `summer_api_estimate`, `summer_api_run`, `summer_api_batch` and `summer_api_job` |
23
+
24
+ Your own code calls the same API over HTTP. The HTTP guide, the OpenAPI document and copy-paste code are on docs.summerengine.com/api (quickstart, jobs, errors).
25
+
26
+ ## 1. Sign in once
27
+
28
+ ```bash
29
+ summer login
30
+ ```
31
+
32
+ The browser opens the Summer sign-in page. The person signs in, picks a spend limit for this app and chooses **Allow**. Tell them the browser opens, and wait for them. The sign-in renews itself; do it once per computer. There are no API keys.
33
+
34
+ - `summer token` prints a one-hour access token from the same sign-in, for the person's own HTTP code. Keep tokens out of game code, builds and commits.
35
+ - Listing models and estimating need no sign-in. Running a job does.
36
+ - The person sees and changes each app's spend limit, or revokes it, in Settings > Connected apps on summerengine.com.
37
+
38
+ ## 2. Pick a model
39
+
40
+ ```bash
41
+ summer api models --capability 3d
42
+ summer api models 3d/default
43
+ ```
44
+
45
+ MCP: `summer_api_models({ capability: "3d" })`, `summer_api_models({ model: "3d/default" })`.
46
+
47
+ - Capabilities: `image`, `3d`, `video`, `voice`, `dialogue`, `sound`, `music`.
48
+ - `<capability>/default` (such as `3d/default`) runs the model Summer tests first for that job. A job answer names the model that ran in `model`, so you can run the same model again.
49
+ - Each model lists its `inputSchema` (the exact fields), `outputFormats`, typical time and `price`. Read prices from this list every time, never from memory.
50
+ - Voice and dialogue models list `voices` (`voiceId` and `name`). Use one of those ids.
51
+
52
+ ## 3. Price it, then ask
53
+
54
+ ```bash
55
+ summer api estimate 3d/default --input '{"kind": "text-to-3d", "prompt": "a stylized treasure chest, game prop"}'
56
+ ```
57
+
58
+ MCP: `summer_api_estimate({ model: "3d/default", input: { kind: "text-to-3d", prompt: "a stylized treasure chest, game prop" } })`.
59
+
60
+ The answer has `price` (US dollars as a decimal string), `atMost` (`true`: the most it can cost, the charge can be lower), a `breakdown`, and a `quoteId` that holds the price for 15 minutes. Estimates are free.
61
+
62
+ Before you spend: tell the person what you will make, how many, and the total. Wait for a yes. Jobs spend their paid Summer credits (plan credits and top-ups).
63
+
64
+ ## 4. Run one job
65
+
66
+ ```bash
67
+ summer api run 3d/default \
68
+ --input '{"kind": "text-to-3d", "prompt": "a stylized treasure chest, game prop"}' \
69
+ --quote <quoteId> --download assets/props
70
+ ```
71
+
72
+ MCP: `summer_api_run({ model: "3d/default", input: { kind: "text-to-3d", prompt: "a stylized treasure chest, game prop" }, quoteId: "<quoteId>", out: "assets/props" })`.
73
+
74
+ - `--download <dir>` (MCP `out`) follows the job to the end and saves every file as `<assetId>.<ext>`. `--wait` (MCP `wait: true`) follows it without saving.
75
+ - `--quote` (MCP `quoteId`): Summer refuses to charge more than the quote. If the price went up, the job does not start and nothing is charged (`conflict`): estimate again.
76
+ - Images, voice and sound usually finish inside the call. 3D and video take minutes: one MCP call follows a job for about a minute, then answers `next`. Call `summer_api_job({ jobId, wait: true })` until the job finishes. The CLI follows it to the end by itself.
77
+ - In Windows PowerShell or cmd, write the input to a file and pass `--input "@input.json"`: those shells break quotes inside `'{...}'`.
78
+ - Each run sends its own idempotency key, so a retried request never runs twice. To retry the same run by hand, pass the same `--idempotency-key` (MCP `idempotencyKey`).
79
+
80
+ ## 5. Run many: a batch
81
+
82
+ For a set of assets (props for a level, every UI icon, a sound pack), send one batch instead of many runs. One batch takes up to 500 jobs, all or none.
83
+
84
+ ```jsonl
85
+ {"model": "3d/default", "input": {"kind": "text-to-3d", "prompt": "a wooden barrel with iron bands, game prop"}}
86
+ {"model": "3d/default", "input": {"kind": "text-to-3d", "prompt": "a mossy stone well, game prop"}}
87
+ {"model": "image/default", "input": {"prompt": "a red health potion icon, flat fantasy style, centered", "removeBackground": true}}
88
+ {"model": "sound/default", "input": {"text": "glass potion bottle uncorked, short pop", "durationSeconds": 1}}
89
+ ```
90
+
91
+ ```bash
92
+ summer api run --batch jobs.jsonl --download assets
93
+ ```
94
+
95
+ MCP: `summer_api_batch({ jobs: [{ model: "3d/default", input: { kind: "text-to-3d", prompt: "a wooden barrel with iron bands, game prop" } }], out: "assets" })`. Read it again with `summer_api_batch({ batchId: "<id>", wait: true, out: "assets" })`.
96
+
97
+ - Every job is priced when the batch arrives. When the paid credits and the app's limit cover all of them, all are accepted at once and run in order; each holds its price (`estimatedPrice` on the job, the total on the batch). When they do not, nothing runs: the error's `details` say how many fit (`fits`) and how much more is needed (`shortUsd`).
98
+ - The batch answers its jobs in the order you sent them. Give each job a `title` where the model takes one (3D and image models do): it names the asset in the person's library.
99
+ - A batch takes no `quoteId`. Estimate each distinct request first (same model and input, same price), add them up, and give the person the total for the whole batch.
100
+ - Each line may carry its own `idempotencyKey`; the batch has one too (`--idempotency-key`). To pick up a batch after the terminal closed, run the same command with the same `--idempotency-key`: it answers the batch it already made and follows it. MCP: `summer_api_batch({ batchId, wait: true })`.
101
+
102
+ ## 6. Follow and read
103
+
104
+ ```bash
105
+ summer api jobs <jobId> --download assets # follow it and save its files
106
+ ```
107
+
108
+ MCP: `summer_api_job({ jobId: "<jobId>", out: "assets" })`.
109
+
110
+ A Summer API job runs to the end once it is accepted, queued or running: it cannot be cancelled. A job that fails costs nothing. So confirm the list with the person before you send it.
111
+
112
+ | `state` | Means | Do |
113
+ |---|---|---|
114
+ | `queued` | Waiting for one of the account's running slots; its price is held | Keep following; it starts in order |
115
+ | `running` | Working; `progress` 0 to 100 when known | Keep following |
116
+ | `done` | Finished; `result.assets` has the files | Download them |
117
+ | `failed` | It did not work; nothing is charged | Show `error.message`; change the input or the model |
118
+ | `cancelled`, `expired`, `stale`, `declined` | Stopped without a result | Start a new job if the person still wants it |
119
+
120
+ A finished job has `result.assets`: one entry per file, each with `assetId`, `fileUrl` and `thumbnailUrl`. The file type is the extension of `fileUrl` (the model's `outputFormats` lists them). Job ids may hold a colon (`gen:...`, `q:...`); send them as they are.
121
+
122
+ With `--json`, or when its output is piped, every command prints the API's own answer: `{"job": {...}}` for a run or a job (plus `"files"` with `--download`), `{"batch": {...}}` for a batch, the estimate's fields at the top level, and `{"ok": false, "error": {"code", "message", "details"}}` on an error. In a terminal it prints a short summary.
123
+
124
+ ## Limits: money only
125
+
126
+ - **No rate limits on paid usage.** Send as much work as the person agrees to pay for.
127
+ - **Running slots.** Each account runs 10 jobs at once at the start, and up to 40 as it buys more credits. Jobs past the slots answer `queued` (their id starts with `q:`) and start in order as slots free up. Queued work is not an error; do not resend it.
128
+ - **Two money limits**, both checked before any work starts: the person's paid balance and this app's own spend limit. Queued and running jobs hold their price against both until they are charged.
129
+ - **A failed job costs nothing.** A retry with the same idempotency key never charges twice.
130
+
131
+ ## Errors
132
+
133
+ Every error has a stable `code` and a `message` written for the person. Branch on the code; show the message.
134
+
135
+ | Code | Means | Do |
136
+ |---|---|---|
137
+ | `not_signed_in` | No sign-in, the app was revoked, or a `summer token` older than an hour | CLI and MCP: run `summer login`, then retry. Own HTTP code: get a new `summer token` |
138
+ | `no_credits` | The paid balance cannot cover the job or the batch | Show the message: it links where to add credits. Do not retry until the person tops up |
139
+ | `over_limit` | This app's own spend limit is reached | Show the message: the person raises the limit in Connected apps, or waits for it to reset |
140
+ | `invalid_input` | The input does not match the model, or the `quoteId` expired | Fix the field the message names (`param`); read the model's `inputSchema`. An expired quote: estimate again |
141
+ | `not_found` | No such model, job or batch | Model ids come from `summer api models` |
142
+ | `conflict` | The price went up since your quote | Estimate again; nothing was charged |
143
+ | `idempotency_conflict` | The key was used for a different request | Use a new key for a new job |
144
+ | `in_progress` | The first request with this key is still running | Send the same request again shortly |
145
+ | `outcome_unknown` | Summer could not tell if the work started | Send the same request with the same key; never start a new job |
146
+ | `unavailable` | A model or service is down for a moment | Retry with backoff, or pick another model for the same job |
147
+ | `unsupported` | The job cannot do that (a cancel) | Let the job finish |
148
+
149
+ `no_credits` and `over_limit` are answers about money, not failures: stop, show the person the message and its link, and continue when they say so.
150
+
151
+ ## Prompts that work, per asset type
152
+
153
+ Write prompts as plain descriptions of the thing itself. Put the style in every prompt of a set, word for word, so the assets match.
154
+
155
+ | Asset | Model | Input that works |
156
+ |---|---|---|
157
+ | Prop | `3d/default` | `{"kind": "text-to-3d", "prompt": "a wooden treasure chest with iron trim, stylized low-poly, game prop"}`. One object per job. Add `"targetPolycount": 3000` for a light mesh. |
158
+ | Character | `3d/default` | `{"kind": "text-to-3d", "assetIntent": "character", "poseMode": "a-pose", "rig": true, "animationNames": ["Idle", "Walk", "Run"], "prompt": "a dwarf blacksmith, full body, stylized"}`. Full body, one character, neutral pose. |
159
+ | 3D from concept art | `3d/default` | `{"kind": "image-to-3d", "imageUrl": "<public URL>"}`. A clean picture of one object on a plain background. |
160
+ | Concept art, key art | `image/default` | `{"prompt": "...", "aspectRatio": "16:9"}`. Name the subject, the setting, the light and the style. |
161
+ | Icon, sprite, item | `image/default` | `{"prompt": "a red health potion, centered, flat fantasy style", "removeBackground": true}`. One object, centered; a transparent PNG comes back. |
162
+ | Matching set | `image/default` | Send the first image's `fileUrl` as `referenceImageUrl` in the next jobs, and keep the same `seed` and style words. |
163
+ | Sound effect | `sound/default` | `{"text": "heavy wooden door creaks open, stone hall echo", "durationSeconds": 2}`. Source, action, material, space. `"loop": true` for ambience. |
164
+ | Voice line | `voice/default` | `{"text": "Halt! Who goes there?", "voiceId": "<from the model's voices>"}`. Punctuation sets the delivery. |
165
+ | Conversation | `dialogue/default` | `{"inputs": [{"text": "...", "voiceId": "..."}, {"text": "...", "voiceId": "..."}]}`. One entry per line, up to 40. |
166
+ | Music | `music/default` | `{"prompt": "calm medieval village theme, lute and flute, 90 bpm, loopable", "durationSeconds": 60}`. Genre, mood, instruments, tempo. |
167
+ | Video | `video/default` | `{"prompt": "slow camera push toward a castle at dawn", "duration": 5}`, or `imageUrl` to animate key art. One shot per job. |
168
+
169
+ A picture input (`imageUrl`, `referenceImageUrl`) is a public URL, such as the `fileUrl` of an earlier job. For a file on the person's computer, the docs' jobs page shows the upload (`/v1/files`).
170
+
171
+ ## Without Summer Engine
172
+
173
+ This whole skill runs without Summer Engine: the CLI, the MCP tools and the HTTP API need only the Summer sign-in. The files work in any engine or app. Stop at the files; skip any step that imports into a Summer project.
174
+
175
+ ## Use the files
176
+
177
+ - Save files inside the project (`--download assets/...`), and keep each `assetId`: in Summer Engine, an asset imports by its id.
178
+ - GLB files are Y up and not at real-world size. Scale them in the engine (a door about 2 m, a person about 1.7 m).
179
+ - Assets made through the API are private to the person's Summer library. A `fileUrl` downloads without a sign-in, so share it only where the file may be seen.
180
+
181
+ ## Pitfalls
182
+
183
+ | Pitfall | Do this instead |
184
+ |---|---|
185
+ | Typing a price from memory | Read `summer api models`, then `summer api estimate` |
186
+ | Spending before the person agreed | Estimate, say the total, wait for a yes |
187
+ | Many single runs for a set of assets | One batch: all or none, priced up front |
188
+ | Resending a job that answered `queued` | It is accepted and its price is held. Follow it. |
189
+ | Treating `no_credits` or `over_limit` as a bug to retry | Show the message and its link; wait for the person |
190
+ | A new idempotency key on a retry after a timeout | The same key: it returns the first job, never a second charge |
191
+ | A token or a sign-in in game code | Only the developer's tools sign in. A shipped game uses Summer Router (the `summer-router` skill). |
192
+ | Several objects in one 3D prompt | One object per job; place them in the engine |
193
+
194
+ ## Done means
195
+
196
+ - Every job you started is `done`, or you told the person which failed and why.
197
+ - The files are in the folder the person asked for, and you told them the paths and formats.
198
+ - You told the person what it cost (`price` on each job, or the batch's `estimatedPrice`).
@@ -0,0 +1,38 @@
1
+ id: skill/summer-api
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Summer API game assets: models, estimate, one job or a batch, download the files."
5
+ use_when:
6
+ - generating asset files (3D models, images, sounds, voice, music, video) from a script, a pipeline or a coding agent outside Summer Engine
7
+ - making a set of assets in one go (a level's props, every UI icon, a sound pack) as one batch
8
+ - choosing a generation model, pricing a job before it runs, or reading a job's state and files
9
+ - a generation job answered no_credits, over_limit, not_signed_in or queued
10
+ do_not_use_when:
11
+ - generating inside a running Summer Engine project, where the asset skills import into the scene (asset-strategy)
12
+ - AI that a shipped game calls while people play (summer-router)
13
+ facets:
14
+ lifecycle:
15
+ - build
16
+ domains:
17
+ - assets
18
+ - agent-workflow
19
+ modalities:
20
+ - 3d-models
21
+ - images
22
+ - audio
23
+ - video
24
+ related:
25
+ tools:
26
+ - tool/api-models
27
+ - tool/api-estimate
28
+ - tool/api-run
29
+ - tool/api-batch
30
+ - tool/api-job
31
+ skills:
32
+ - skill/summer-assets
33
+ - skill/summer-cli
34
+ - skill/asset-strategy
35
+ - skill/summer-router
36
+ source: official
37
+ license: MIT
38
+ status: preview
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: summer-assets
3
- description: "Make game assets with Summer, no Summer Engine: find, generate and download 3D models, images, audio and video for any engine or app."
3
+ description: "Game assets for any engine, no Summer Engine: find, generate and download them."
4
4
  license: MIT
5
5
  compatibility: [Cursor, Claude Code, Codex, Windsurf, Gemini, OpenCode, Factory, Copilot]
6
6
  category: _meta
@@ -1,7 +1,7 @@
1
1
  id: skill/summer-assets
2
2
  kind: skill
3
- version: 1.0.1
4
- summary: "Make game assets with Summer, no Summer Engine: find, generate and download 3D models, images, audio and video for any engine or app."
3
+ version: 1.0.2
4
+ summary: "Game assets for any engine, no Summer Engine: find, generate and download them."
5
5
  use_when:
6
6
  - starting a session that has the Summer assets profile (generation tools, no engine tools)
7
7
  - the person wants assets for their own engine or web app, not a game built in Summer Engine
@@ -26,6 +26,7 @@ related:
26
26
  - tool/get-asset-download-url
27
27
  skills:
28
28
  - skill/asset-strategy
29
+ - skill/summer-api
29
30
  - skill/sound-effect
30
31
  - skill/prop-model
31
32
  - skill/concept-art