summer-engine 3.6.0 → 3.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.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +4 -2
- package/.codex-plugin/plugin.json +5 -3
- package/.cursor-plugin/plugin.json +4 -2
- package/.factory-plugin/plugin.json +4 -2
- package/CHANGELOG.md +24 -0
- package/README.md +11 -5
- package/commands/summer.md +2 -1
- package/dist/cli/commands/login.d.ts +0 -10
- package/dist/cli/commands/login.js +2 -82
- package/dist/cli/index.js +0 -4
- package/dist/core/auth.d.ts +0 -8
- package/dist/core/auth.js +5 -35
- package/dist/core/capabilities/apps.d.ts +318 -0
- package/dist/core/capabilities/apps.js +340 -0
- package/dist/core/capabilities/enable-plugin.d.ts +27 -0
- package/dist/core/capabilities/enable-plugin.js +75 -0
- package/dist/core/capabilities/seeing/args.d.ts +2 -2
- package/dist/core/capabilities/seeing/seeing.d.ts +1 -1
- package/dist/core/capabilities/sfx-choices.d.ts +2 -15
- package/dist/core/capabilities/sfx-choices.js +26 -64
- package/dist/core/capabilities/tool-dispatch.js +51 -54
- package/dist/core/capability-skew.js +4 -0
- package/dist/core/config.d.ts +1 -7
- package/dist/core/config.js +5 -75
- package/dist/mcp/hosted-mount.js +13 -1
- package/dist/mcp/server.d.ts +2 -1
- package/dist/mcp/server.js +8 -5
- package/dist/mcp/tools/app-tools.d.ts +2 -0
- package/dist/mcp/tools/app-tools.js +64 -0
- package/dist/mcp/tools/creator-tools.js +0 -71
- package/dist/mcp/tools/generate-tools.js +6 -7
- package/gemini-extension.json +3 -1
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +24 -5
- package/library/skills/README.md +10 -2
- package/library/skills/publish-your-game/SKILL.md +2 -0
- package/library/skills/sound-effect/SKILL.md +2 -0
- package/library/skills/summer-apps/SKILL.md +152 -0
- package/library/skills/summer-apps/manifest.md +57 -0
- package/library/skills/summer-apps/minimal-app.md +183 -0
- package/library/skills/summer-apps/resource.yaml +36 -0
- package/library/skills/summer-apps/sdk-reference.md +135 -0
- package/library/skills/summer-apps-design/SKILL.md +197 -0
- package/library/skills/summer-apps-design/resource.yaml +23 -0
- package/library/skills/using-summer/SKILL.md +1 -0
- package/library/tools/app-call/resource.yaml +59 -0
- package/library/tools/app-create/resource.yaml +67 -0
- package/library/tools/app-data/resource.yaml +74 -0
- package/library/tools/app-dock/resource.yaml +59 -0
- package/library/tools/app-events/resource.yaml +68 -0
- package/library/tools/app-get/resource.yaml +46 -0
- package/library/tools/app-guide/resource.yaml +55 -0
- package/library/tools/app-list/resource.yaml +48 -0
- package/library/tools/app-page/resource.yaml +74 -0
- package/library/tools/app-publish/resource.yaml +90 -0
- package/library/tools/app-report-gap/resource.yaml +58 -0
- package/library/tools/app-screenshot/resource.yaml +85 -0
- package/library/tools/app-tools/resource.yaml +46 -0
- package/library/tools/app-update/resource.yaml +68 -0
- package/library/tools/enable-plugin/resource.yaml +53 -0
- package/library/tools/generate-sfx-choices/resource.yaml +2 -2
- package/package.json +1 -1
- package/registry/generated/aliases.json +15 -3
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +3 -1
- package/registry/generated/index.json +759 -209
- package/registry/generated/marketplace.claude.json +2 -2
- package/registry/generated/plugin.claude.json +4 -2
- package/registry/generated/plugin.codex.json +5 -3
- package/registry/generated/plugin.cursor.json +4 -2
- package/registry/generated/plugin.factory.json +4 -2
- package/registry/generated/skills-index.md +10 -2
- package/registry/generated/skills-registry.json +27 -0
- package/registry/schemas/allowed-hosts.json +4 -2
- package/dist/cli/commands/publish.d.ts +0 -2
- package/dist/cli/commands/publish.js +0 -21
- package/dist/cli/commands/releases.d.ts +0 -2
- package/dist/cli/commands/releases.js +0 -20
- package/dist/core/capabilities/creator.d.ts +0 -65
- package/dist/core/capabilities/creator.js +0 -374
- package/library/tools/creator-config/resource.yaml +0 -63
- package/library/tools/creator-publish/resource.yaml +0 -74
- package/library/tools/creator-releases/resource.yaml +0 -53
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
{
|
|
12
12
|
"name": "summer",
|
|
13
13
|
"source": "./",
|
|
14
|
-
"version": "3.
|
|
15
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
14
|
+
"version": "3.8.0",
|
|
15
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 119-tool MCP bridge to the local desktop app.",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "Summer Engine",
|
|
18
18
|
"email": "founders@summerengine.com"
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"_generated": "GENERATED from integrations/claude — do not edit; npm run generate:registry",
|
|
4
4
|
"name": "summer",
|
|
5
|
-
"version": "3.
|
|
6
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
5
|
+
"version": "3.8.0",
|
|
6
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 119-tool MCP bridge to the local desktop app.",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Summer Engine",
|
|
9
9
|
"email": "founders@summerengine.com",
|
|
@@ -116,6 +116,8 @@
|
|
|
116
116
|
"./library/skills/store-art/",
|
|
117
117
|
"./library/skills/store-listing/",
|
|
118
118
|
"./library/skills/summer-analytics/",
|
|
119
|
+
"./library/skills/summer-apps/",
|
|
120
|
+
"./library/skills/summer-apps-design/",
|
|
119
121
|
"./library/skills/summer-friends/",
|
|
120
122
|
"./library/skills/summer-leaderboards/",
|
|
121
123
|
"./library/skills/summer-match-results/",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_generated": "GENERATED from integrations/codex — do not edit; npm run generate:registry",
|
|
3
3
|
"name": "summer",
|
|
4
|
-
"version": "3.
|
|
5
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
4
|
+
"version": "3.8.0",
|
|
5
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 119-tool MCP bridge. Build games by talking.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Summer Engine",
|
|
8
8
|
"email": "founders@summerengine.com",
|
|
@@ -111,6 +111,8 @@
|
|
|
111
111
|
"./library/skills/store-art/",
|
|
112
112
|
"./library/skills/store-listing/",
|
|
113
113
|
"./library/skills/summer-analytics/",
|
|
114
|
+
"./library/skills/summer-apps/",
|
|
115
|
+
"./library/skills/summer-apps-design/",
|
|
114
116
|
"./library/skills/summer-friends/",
|
|
115
117
|
"./library/skills/summer-leaderboards/",
|
|
116
118
|
"./library/skills/summer-match-results/",
|
|
@@ -151,7 +153,7 @@
|
|
|
151
153
|
"interface": {
|
|
152
154
|
"displayName": "Summer",
|
|
153
155
|
"shortDescription": "Superpowers for AI game dev. Build games by talking.",
|
|
154
|
-
"longDescription": "Summer turns Codex into a game-dev studio for Summer Engine. Users make Summer games with the Summer SDK and GDScript. The plugin adds game-dev skills, lifecycle hooks, and a
|
|
156
|
+
"longDescription": "Summer turns Codex into a game-dev studio for Summer Engine. Users make Summer games with the Summer SDK and GDScript. The plugin adds game-dev skills, lifecycle hooks, and a 119-tool MCP bridge for guarded project files, scene editing, asset import, play mode, diagnostics, generation, and creator workflows. Git, shell, and grep stay with the host agent. Summer follows its upstream technical base continuously; version-sensitive work uses the bundled compatibility reference instead of a fixed onboarding version. Session-start orients the session. Pre-commit doctor (opt-in) blocks bad commits.",
|
|
155
157
|
"developerName": "Summer Engine",
|
|
156
158
|
"category": "Coding",
|
|
157
159
|
"capabilities": [
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"_generated": "GENERATED from integrations/cursor — do not edit; npm run generate:registry",
|
|
4
4
|
"name": "summer",
|
|
5
5
|
"displayName": "Summer",
|
|
6
|
-
"version": "3.
|
|
7
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
6
|
+
"version": "3.8.0",
|
|
7
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 119-tool MCP bridge to the local desktop app.",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "Summer Engine",
|
|
10
10
|
"email": "founders@summerengine.com"
|
|
@@ -123,6 +123,8 @@
|
|
|
123
123
|
"./library/skills/store-art/",
|
|
124
124
|
"./library/skills/store-listing/",
|
|
125
125
|
"./library/skills/summer-analytics/",
|
|
126
|
+
"./library/skills/summer-apps/",
|
|
127
|
+
"./library/skills/summer-apps-design/",
|
|
126
128
|
"./library/skills/summer-friends/",
|
|
127
129
|
"./library/skills/summer-leaderboards/",
|
|
128
130
|
"./library/skills/summer-match-results/",
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_generated": "GENERATED from integrations/factory — do not edit; npm run generate:registry",
|
|
3
3
|
"name": "summer",
|
|
4
|
-
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a
|
|
5
|
-
"version": "3.
|
|
4
|
+
"description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 119-tool MCP bridge to the local desktop app.",
|
|
5
|
+
"version": "3.8.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Summer Engine",
|
|
8
8
|
"email": "founders@summerengine.com",
|
|
@@ -108,6 +108,8 @@
|
|
|
108
108
|
"./library/skills/store-art/",
|
|
109
109
|
"./library/skills/store-listing/",
|
|
110
110
|
"./library/skills/summer-analytics/",
|
|
111
|
+
"./library/skills/summer-apps/",
|
|
112
|
+
"./library/skills/summer-apps-design/",
|
|
111
113
|
"./library/skills/summer-friends/",
|
|
112
114
|
"./library/skills/summer-leaderboards/",
|
|
113
115
|
"./library/skills/summer-match-results/",
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to summer-engine will be documented here. Following [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [3.8.0] - 2026-10-13
|
|
6
|
+
|
|
7
|
+
Agents build Summer Apps, team tools inside Summer Studio, and asset-only requests skip the engine.
|
|
8
|
+
|
|
9
|
+
- **Summer Apps tools.** A Summer App is a tool your team uses inside Summer Studio: a balance table, a quest editor, an asset tracker, a pick-one grid. Your agent builds it and it works on the team's data. New tools: `summer_app_guide` (the build guide), `summer_app_list`, `summer_app_create`, `summer_app_publish` (from a local folder, files or a layout), `summer_app_get`, `summer_app_events` (what the app sends to agents), `summer_app_page` (fill the app's fields and press its buttons), `summer_app_data` (read and write the app's shared data; `as: "seed"` for starter data), `summer_app_tools` and `summer_app_call` (the agent tools an app declares), `summer_app_dock` (dock an app as a panel in the editor) and `summer_app_report_gap` (tell Summer what the app needed and did not have). All but `summer_app_dock` work without the engine; they need `summer login`. If Summer Apps is not open for your account yet, they answer `not_found`.
|
|
10
|
+
- **Two new skills: `summer-apps` and `summer-apps-design`.** `summer-apps` is the build loop, Layout or code, the manifest, the SDK, data and agent tools, with a complete working app. `summer-apps-design` is how an app should look: page layout, the Summer UI kit components, tables, charts, states, and a check before you publish.
|
|
11
|
+
- **`summer_app_screenshot`: see your Summer App without opening Studio.** Summer renders the app's published version with your data and returns the picture plus what to fix: console lines, uncaught errors, calls it refused, whether the SDK connected, and the fields and buttons the app declared. It is read-only: writes, sends and paid calls are refused, so nothing changes. `width: 390` shows the phone layout, `theme: "dark"` the dark theme, `fullPage` the whole scroll; `out` also saves the PNG (`summer tool app-screenshot` saves it to `./summer-app-screenshot.png`). The `summer-apps` skill now looks at every publish this way.
|
|
12
|
+
- `summer_app_create` without `workspaceId` puts the app in the person's team: the one their Studio tab is on, else their latest team, else their personal workspace. The result says which.
|
|
13
|
+
- `summer_app_events` waits up to `timeoutSeconds`, the same argument name as the hosted tool.
|
|
14
|
+
- `summer_app_guide` has section `types`: the SDK's exact TypeScript types. Keep that file one folder above the app; a `dir` publish also skips `.d.ts` files.
|
|
15
|
+
- **`summer_app_update`** renames a Summer App or sets it kept, archived or back to scratch, so agents archive the throwaway apps they made.
|
|
16
|
+
- **`summer_enable_plugin` enables an editor plugin (`res://addons/<name>/`) and reports what really happened.** On engines that wait for the plugin, it answers `enabled` with the plugin's autoloads, or the failure code with a hint. Older engines only queue the enable; the tool then answers `queued: true` and `enabled: null` with a note, and does not claim success.
|
|
17
|
+
- Hosted tools such as `summer_studio_page` no longer fail with "Tool not found" when an agent calls them right after it connects, before it lists the tools. The call now waits for the hosted tools to finish loading, then runs.
|
|
18
|
+
- **Assets only: no engine, no brainstorm, one sign-in.** If you only want assets (a sound, an image, a model), the README has a prompt to paste that skips the engine download and the starter project, and runs setup with `--no-games` so you sign in once. `/summer` sends an asset request such as "make me a sword clash sound" straight to its asset skill instead of a game brainstorm, and `sound-effect` stops after you approve the clips when there is no project to import into.
|
|
19
|
+
- Out of credits, a generation tool now gives one link: the Add credits step in Summer Studio (`https://summerengine.com/studio/credits`). Pick an amount and pay once; no plan needed.
|
|
20
|
+
|
|
21
|
+
## [3.7.0] - 2026-10-13
|
|
22
|
+
|
|
23
|
+
Sound-effect choices open in your Studio tab right away, agents act on Summer's review feedback, and the legacy creator path is gone.
|
|
24
|
+
|
|
25
|
+
- `summer_generate_sfx_choices` no longer waits 20 s and then reports `studio_tab_timeout` before it opens the page. Summer now sends the choices page to your open Summer Studio tab as it makes the versions, and the tool reads that answer: when your tab took it, no browser opens; when no tab is open, it opens your browser as before. Signing in to the store is no longer needed for the tab to open.
|
|
26
|
+
- **Removed the legacy Summercraft creator path.** The deprecated `summer_creator_publish`, `summer_creator_releases` and `summer_creator_config` MCP tools (and their `summer tool` slugs and library entries), the `summer publish` and `summer releases` commands, `summer login --creator` and the `creator.apiUrl`, `creator.projectId` and `creator.channel` config keys are gone. Publish to summer.games with `summer_export_game`, then `summer_publish_build`, then the hosted `summer_store_submit` and `summer_store_review`. `gateway.url` stays settable with `summer config`; `summer logout` still removes a `~/.summer/creator-token` an older CLI left behind.
|
|
27
|
+
- **Agents read Summer's review feedback and resubmit.** When Summer staff ask for changes to a submitted game, or do not approve it, they can now write feedback for the creator. The hosted `summer_store_review` tool returns the decision, that feedback and the next step; `publish-your-game` and the MCP instructions tell the agent to fix what the feedback names and call `summer_store_submit` again, and never to call the game live before Summer approves it.
|
|
28
|
+
|
|
5
29
|
## [3.6.0] - 2026-10-12
|
|
6
30
|
|
|
7
31
|
Pick your sound effects by ear, and hosted games: agents check that players can actually join before a release.
|
package/README.md
CHANGED
|
@@ -61,12 +61,22 @@ In most agents (Claude Code, Codex, Cursor, GitHub Copilot (VS Code, CLI, JetBra
|
|
|
61
61
|
|
|
62
62
|
Then ask the agent to build something.
|
|
63
63
|
|
|
64
|
+
### Only want assets?
|
|
65
|
+
|
|
66
|
+
Sound effects, music, voices, images, 3D models and video are made on Summer's servers, so you do not need the Summer Engine app for them. Paste this instead:
|
|
67
|
+
|
|
68
|
+
> Connect Summer to this agent so I can make game assets. Read github.com/summerengine/summer, connect yourself to Summer and log me in. Skip the Summer Engine app and the starter project, I only want assets.
|
|
69
|
+
|
|
70
|
+
The agent installs the skills and the MCP config and signs you in. It does not download the engine. Each asset lands in your Summer library, so a game project (in Summer Engine or anywhere else) can use it later.
|
|
71
|
+
|
|
64
72
|
---
|
|
65
73
|
|
|
66
74
|
## AGENTS READING THIS: install playbook
|
|
67
75
|
|
|
68
76
|
You are an AI coding agent. The user told you to install Summer Engine. **Run this playbook via your shell**: Bash on macOS/Linux or PowerShell on Windows. Detection first, then only install what's missing. (Once installed, your working guide is [`AGENTS.md`](AGENTS.md).)
|
|
69
77
|
|
|
78
|
+
**Assets only.** If the user only wants assets (sound effects, music, voices, images, 3D models, video), not a game built in Summer Engine, or tells you to skip the engine: run Step -1, Step 0, Step 1 with `--no-games` added (Summer Games is for playing with friends, and leaving it out saves a second sign-in), and Step 3, then stop installing. Skip Step 2 (the engine download), Step 5 and Step 6. On this path the doctor warnings for `engine-install` and `local-api` are expected; leave them. The asset tools (`summer_generate_audio`, `summer_generate_sfx_choices`, `summer_generate_image`, `summer_generate_3d`, `summer_generate_video`, `summer_search_assets`) run on Summer's servers and need only the login. Most agents load a new MCP server only after a restart. Until then, call the same tool from the shell: `npx -y summer-engine@latest tool <slug> --args '<json>'` (`summer tool --list` prints the slugs). For example, three versions of one sound for the user to pick from: `npx -y summer-engine@latest tool generate-sfx-choices --args '{"text":"sword clash"}'`. Each asset lands in the user's Summer library.
|
|
79
|
+
|
|
70
80
|
**Windows PowerShell: type `npx.cmd` wherever this playbook says `npx`.** Plain `npx` in PowerShell runs `npx.ps1`, which Windows blocks by default ("running scripts is disabled on this system"). `npx.cmd` is the same command without that block. Never change the execution policy or turn off Windows Defender to work around it. Bash (including Git Bash on Windows) can use plain `npx`.
|
|
71
81
|
|
|
72
82
|
### Step -1: Verify Node.js is on PATH
|
|
@@ -207,7 +217,7 @@ Only skip brainstorm if the user explicitly said "skip brainstorm" or "just buil
|
|
|
207
217
|
- **Don't run `npm install -g summer-engine`.** Use `npx -y summer-engine@latest ...` instead. `-g` requires `sudo` on most Mac/Linux setups, so the user will get permission errors and you'll get stuck. `npx` works without root and the MCP config we ship already points at `npx summer-engine mcp`.
|
|
208
218
|
- **Don't install Node.js without asking, and don't use anything but winget for it.** On Windows, Step -1 installs Node LTS with winget after the user says yes. On macOS/Linux, point them at https://nodejs.org and stop.
|
|
209
219
|
- **Don't run plain `npx` in Windows PowerShell, and don't change the execution policy or Defender to make it work.** Use `npx.cmd`.
|
|
210
|
-
- **Don't ask the user "do you want the engine too?" or "do you also want the CLI?"** This playbook installs all of it.
|
|
220
|
+
- **Don't ask the user "do you want the engine too?" or "do you also want the CLI?"** This playbook installs all of it. The one exception is an assets-only request (see **Assets only** at the top of this playbook).
|
|
211
221
|
- **Don't double-download.** Always run `npx -y summer-engine@latest doctor --json` first and skip the engine download and the browser login when their checks are `status: "ok"`. Step 1 (`setup`) is the exception: run it every time — it is idempotent, and doctor's top-level `ok` cannot tell you whether skills or the MCP config are installed.
|
|
212
222
|
- **Don't run `summer install` or `summer login` in the background.** They print user-facing output (engine download progress, browser-opening notice). Run them in the foreground so the user sees what's happening.
|
|
213
223
|
- **Don't skip the `--json` flag on `summer doctor`.** Text output is fragile to parse and changes per version.
|
|
@@ -322,7 +332,6 @@ We tell you before we touch your disk.
|
|
|
322
332
|
| `summer-engine` npm package (CLI + MCP + library) | ~2 MB download, ~6 MB unpacked | first `npx -y summer-engine@latest ...` call | [npmjs.com/package/summer-engine](https://www.npmjs.com/package/summer-engine) |
|
|
323
333
|
| Summer Engine app | ~1 GB (engine + bundled Git/runtime tools) | `npx -y summer-engine@latest install` | Summer's signed releases |
|
|
324
334
|
| Auth token | ~1 KB | `npx -y summer-engine@latest login` | Browser to `~/.summer/auth-token` |
|
|
325
|
-
| Creator token | ~50 bytes | only when you run `summer login --creator` and mint one | One-time browser value to `~/.summer/creator-token`; never replaces the auth token |
|
|
326
335
|
| Store sign-in | ~2 KB | only when you run `summer login --store` | Browser OAuth (PKCE, loopback port 47615-47617) to `~/.summer/oauth-token` with its refresh token, plus this machine's public client id in `~/.summer/oauth-client`; never replaces the auth token |
|
|
327
336
|
| Skill files | small, bundled | in the npm package | no extra network call |
|
|
328
337
|
| Generated assets (3D / image / audio / video) | varies | only on explicit `summer_generate_*` calls when that provider route is enabled for the account | Summer Engine Studio |
|
|
@@ -352,11 +361,8 @@ matchmaking are not promised by this package.
|
|
|
352
361
|
| `summer install [--yes]` | Download Summer Engine. Prints URL and size first; never replaces an installed engine without confirmation. |
|
|
353
362
|
| `summer login` | Browser-based core Summer sign-in. |
|
|
354
363
|
| `summer login --store` | Browser sign-in to the Summer store so agents can upload builds (`summer_publish_build`). |
|
|
355
|
-
| `summer login --creator` | Deprecated: connect a creator token for the legacy `summer publish`. |
|
|
356
364
|
| `summer logout` | Clear auth tokens. |
|
|
357
365
|
| `summer config [get\|set\|unset]` | Read or update the shared non-secret `~/.summer/config.json`. |
|
|
358
|
-
| `summer publish [project] --artifact <game.pck> --version <value> [--confirm]` | Deprecated: use `summer tool export-game`, then `summer tool publish-build`. |
|
|
359
|
-
| `summer releases [--cursor <value>]` | List your creator release history. |
|
|
360
366
|
| `summer status` | Engine state, port, auth. |
|
|
361
367
|
| `summer doctor` | Diagnose Node, login, engine, project memory, MCP. |
|
|
362
368
|
| `summer plan <goal>` | Route a game-building goal into skills, MCP tools, gates, and verification. |
|
package/commands/summer.md
CHANGED
|
@@ -25,7 +25,7 @@ You speak game-dev shorthand (PCs, NPCs, juice, hit-stop, root motion, blendspac
|
|
|
25
25
|
## What to do
|
|
26
26
|
|
|
27
27
|
1. Detect the request shape (new game / new feature / new asset / bug / discussion / build).
|
|
28
|
-
2. Confirm Summer Engine context. Call `summer_get_project_context` if available. If it returns nothing
|
|
28
|
+
2. Confirm Summer Engine context. Call `summer_get_project_context` if available. If it returns nothing and the user wants a game, they are not in a Summer project yet — route to the `brainstorm-game` skill. An asset-only request (a sound, music, a voice line, an image, a model) needs no project, no engine and no brainstorm: go straight to its asset skill. The asset tools run on Summer's servers.
|
|
29
29
|
3. Invoke the right Summer skill with the `Skill` tool. Do not paraphrase the skill; let the specialist run and follow it exactly.
|
|
30
30
|
4. Before any generation call, say what you will generate and roughly how long it takes, and wait for an OK.
|
|
31
31
|
|
|
@@ -40,6 +40,7 @@ Skills are invoked by their bare slug, such as `brainstorm-game`. There is no `s
|
|
|
40
40
|
| make me a game from scratch | `make-game` |
|
|
41
41
|
| add a [character / enemy / NPC / prop / vehicle] | `asset-strategy` |
|
|
42
42
|
| add a sound for [event] | `sound-effect` |
|
|
43
|
+
| make me a [sound / track / voice line / image / model], no game yet | `sound-effect`, `music-track`, `voice-line`, `concept-art`, `prop-model` (no project needed) |
|
|
43
44
|
| add ambient music | `music-track` |
|
|
44
45
|
| make me fire / smoke / lightning / muzzle flash / magic glow / hit spark / dissolve / water ripple | `vfx-fire`, `vfx-smoke`, `vfx-lightning`, `vfx-muzzle-flash`, `vfx-magic-glow`, `vfx-hit-spark`, `vfx-dissolve`, `vfx-water-ripple` |
|
|
45
46
|
| build the FPS controller | `fps-controller` |
|
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
export declare const loginCommand: Command;
|
|
3
|
-
export interface CreatorLoginDependencies {
|
|
4
|
-
openUrl: (url: string) => Promise<unknown>;
|
|
5
|
-
readSecret: (prompt: string) => Promise<string>;
|
|
6
|
-
log: (message: string) => void;
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* The browser session mints the token; the token is pasted once into a hidden
|
|
10
|
-
* prompt. This deliberately does not replace the core Summer login JWT.
|
|
11
|
-
*/
|
|
12
|
-
export declare function runCreatorLogin(overrides?: Partial<CreatorLoginDependencies>): Promise<void>;
|
|
13
3
|
export interface LoginDependencies {
|
|
14
4
|
fetch: typeof fetch;
|
|
15
5
|
openUrl: (url: string) => Promise<unknown>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { randomUUID } from "crypto";
|
|
3
3
|
import open from "open";
|
|
4
|
-
import { getAuthToken,
|
|
5
|
-
import {
|
|
4
|
+
import { getAuthToken, saveLoginSession, } from "../../core/auth.js";
|
|
5
|
+
import { resolveGatewayUrl } from "../../core/config.js";
|
|
6
6
|
import { readStoredOAuthToken, runStoreLogin } from "../../core/oauth.js";
|
|
7
7
|
const POLL_INTERVAL_MS = 2000;
|
|
8
8
|
// One generous window on ONE session id. First-time users may need to create an
|
|
@@ -14,7 +14,6 @@ const POLL_TIMEOUT_MS = 900000;
|
|
|
14
14
|
const HEARTBEAT_MS = 30000;
|
|
15
15
|
export const loginCommand = new Command("login")
|
|
16
16
|
.description("Sign in to Summer Engine via your browser")
|
|
17
|
-
.option("--creator", "Connect a separately scoped Summercraft creator token for publishing")
|
|
18
17
|
.option("--store", "Sign in to the Summer store so agents can upload builds (summer_publish_build)")
|
|
19
18
|
.option("--force", "Force re-authentication even if already logged in")
|
|
20
19
|
.action(async (opts) => {
|
|
@@ -28,15 +27,6 @@ export const loginCommand = new Command("login")
|
|
|
28
27
|
console.log("Signed in to the Summer store. Your core Summer login was not changed.");
|
|
29
28
|
return;
|
|
30
29
|
}
|
|
31
|
-
if (opts.creator) {
|
|
32
|
-
const existingCreator = await getCreatorToken();
|
|
33
|
-
if (existingCreator && !opts.force) {
|
|
34
|
-
console.log("A creator token is already connected. Use --creator --force to replace it.");
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
await runCreatorLogin();
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
30
|
const existing = await getAuthToken();
|
|
41
31
|
if (existing && !opts.force) {
|
|
42
32
|
console.log("Already logged in. Use --force to re-authenticate.");
|
|
@@ -44,76 +34,6 @@ export const loginCommand = new Command("login")
|
|
|
44
34
|
}
|
|
45
35
|
await runLogin();
|
|
46
36
|
});
|
|
47
|
-
async function readHiddenLine(prompt) {
|
|
48
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
49
|
-
process.stdout.write(prompt);
|
|
50
|
-
let value = "";
|
|
51
|
-
for await (const chunk of process.stdin)
|
|
52
|
-
value += String(chunk);
|
|
53
|
-
return value.trim();
|
|
54
|
-
}
|
|
55
|
-
process.stdout.write(prompt);
|
|
56
|
-
const input = process.stdin;
|
|
57
|
-
const wasRaw = input.isRaw;
|
|
58
|
-
input.setRawMode(true);
|
|
59
|
-
input.resume();
|
|
60
|
-
return new Promise((resolve, reject) => {
|
|
61
|
-
let value = "";
|
|
62
|
-
const finish = (error) => {
|
|
63
|
-
input.off("data", onData);
|
|
64
|
-
input.setRawMode(Boolean(wasRaw));
|
|
65
|
-
input.pause();
|
|
66
|
-
process.stdout.write("\n");
|
|
67
|
-
if (error)
|
|
68
|
-
reject(error);
|
|
69
|
-
else
|
|
70
|
-
resolve(value.trim());
|
|
71
|
-
};
|
|
72
|
-
const onData = (chunk) => {
|
|
73
|
-
for (const char of String(chunk)) {
|
|
74
|
-
if (char === "\u0003") {
|
|
75
|
-
finish(new Error("Creator token entry cancelled."));
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
if (char === "\r" || char === "\n" || char === "\u0004") {
|
|
79
|
-
finish();
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
if (char === "\u007f" || char === "\b") {
|
|
83
|
-
value = value.slice(0, -1);
|
|
84
|
-
}
|
|
85
|
-
else if (char >= " ") {
|
|
86
|
-
value += char;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
input.on("data", onData);
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
const defaultCreatorLoginDependencies = {
|
|
94
|
-
openUrl: open,
|
|
95
|
-
readSecret: readHiddenLine,
|
|
96
|
-
log: console.log,
|
|
97
|
-
};
|
|
98
|
-
/**
|
|
99
|
-
* The browser session mints the token; the token is pasted once into a hidden
|
|
100
|
-
* prompt. This deliberately does not replace the core Summer login JWT.
|
|
101
|
-
*/
|
|
102
|
-
export async function runCreatorLogin(overrides = {}) {
|
|
103
|
-
const deps = { ...defaultCreatorLoginDependencies, ...overrides };
|
|
104
|
-
const settingsUrl = `${await getCreatorApiUrl()}/creator/settings/tokens`;
|
|
105
|
-
deps.log(`Opening creator token settings: ${settingsUrl}`);
|
|
106
|
-
deps.log('Mint a token with the exact "publish" scope, copy its one-time sc_ value, then return here.');
|
|
107
|
-
try {
|
|
108
|
-
await deps.openUrl(settingsUrl);
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
deps.log("Could not open the browser. Copy the URL above and open it manually.");
|
|
112
|
-
}
|
|
113
|
-
const token = await deps.readSecret("Creator token (input hidden): ");
|
|
114
|
-
await saveCreatorToken(token);
|
|
115
|
-
deps.log("Creator publishing connected. Your core Summer login token was not changed.");
|
|
116
|
-
}
|
|
117
37
|
/** The gateway answered with a terminal 4xx — retrying the same URL cannot help. */
|
|
118
38
|
class LoginRejectedError extends Error {
|
|
119
39
|
}
|
package/dist/cli/index.js
CHANGED
|
@@ -14,8 +14,6 @@ import { doctorCommand } from "./commands/doctor.js";
|
|
|
14
14
|
import { planCommand } from "./commands/plan.js";
|
|
15
15
|
import { debugCommand } from "./commands/debug.js";
|
|
16
16
|
import { configCommand } from "./commands/config.js";
|
|
17
|
-
import { publishCommand } from "./commands/publish.js";
|
|
18
|
-
import { releasesCommand } from "./commands/releases.js";
|
|
19
17
|
import { eventsCommand } from "./commands/events.js";
|
|
20
18
|
import { toolCommand } from "./commands/tool.js";
|
|
21
19
|
import { getBanner } from "./banner.js";
|
|
@@ -51,8 +49,6 @@ export function runCli(mcpCommand) {
|
|
|
51
49
|
program.addCommand(debugCommand);
|
|
52
50
|
program.addCommand(planCommand);
|
|
53
51
|
program.addCommand(configCommand);
|
|
54
|
-
program.addCommand(publishCommand);
|
|
55
|
-
program.addCommand(releasesCommand);
|
|
56
52
|
program.addCommand(eventsCommand);
|
|
57
53
|
program.addCommand(toolCommand);
|
|
58
54
|
program.parseAsync().catch((err) => {
|
package/dist/core/auth.d.ts
CHANGED
|
@@ -14,7 +14,6 @@ export interface CredentialMetadata {
|
|
|
14
14
|
interface CredentialMetadataDocument {
|
|
15
15
|
schemaVersion: 1;
|
|
16
16
|
auth?: CredentialMetadata;
|
|
17
|
-
creator?: CredentialMetadata;
|
|
18
17
|
}
|
|
19
18
|
export interface LoginSession {
|
|
20
19
|
token: string;
|
|
@@ -37,13 +36,6 @@ export declare function getAuthToken(): Promise<string | null>;
|
|
|
37
36
|
*/
|
|
38
37
|
export declare function hasEnvAuthToken(): boolean;
|
|
39
38
|
export declare function saveAuthToken(token: string, scopes?: string[]): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Summercraft creator tokens are a separate credential audience from the
|
|
42
|
-
* core-compatible Summer CLI JWT. Never store an sc_ token in auth-token:
|
|
43
|
-
* the engine reads that file and expects the summer-cli JWT contract.
|
|
44
|
-
*/
|
|
45
|
-
export declare function getCreatorToken(): Promise<string | null>;
|
|
46
|
-
export declare function saveCreatorToken(token: string): Promise<void>;
|
|
47
39
|
export declare function getUserInfo(): Promise<SummerUserInfo | null>;
|
|
48
40
|
export declare function saveUserInfo(info: SummerUserInfo): Promise<void>;
|
|
49
41
|
export declare function saveLoginSession(session: LoginSession): Promise<void>;
|
package/dist/core/auth.js
CHANGED
|
@@ -3,7 +3,8 @@ export { getSummerDir } from "./store.js";
|
|
|
3
3
|
const AUTH_TOKEN_FILE = "auth-token";
|
|
4
4
|
/** Written by v2 `summer login` for the removed Summer Cloud sync. Only ever removed now (logout). */
|
|
5
5
|
const LEGACY_CLOUD_TOKEN_FILE = "cloud-token";
|
|
6
|
-
|
|
6
|
+
/** Written by the removed `summer login --creator` (Summercraft). Only ever removed now (logout). */
|
|
7
|
+
const LEGACY_CREATOR_TOKEN_FILE = "creator-token";
|
|
7
8
|
const USER_FILE = "user.json";
|
|
8
9
|
const METADATA_FILE = "credential-metadata.json";
|
|
9
10
|
/** The Summer store OAuth token (core/oauth.ts OAUTH_TOKEN_FILE). */
|
|
@@ -78,8 +79,8 @@ async function updateMetadata(kind, value, current) {
|
|
|
78
79
|
};
|
|
79
80
|
if (!next.auth)
|
|
80
81
|
delete next.auth;
|
|
81
|
-
|
|
82
|
-
|
|
82
|
+
// Drop the removed Summercraft creator entry left by older CLIs.
|
|
83
|
+
delete next.creator;
|
|
83
84
|
await writeStoreJson(METADATA_FILE, next);
|
|
84
85
|
}
|
|
85
86
|
/**
|
|
@@ -115,27 +116,6 @@ export async function saveAuthToken(token, scopes = []) {
|
|
|
115
116
|
await writeStoreText(AUTH_TOKEN_FILE, `${clean}\n`);
|
|
116
117
|
await updateMetadata("auth", decodeJwtMetadata(clean, scopes), metadata);
|
|
117
118
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Summercraft creator tokens are a separate credential audience from the
|
|
120
|
-
* core-compatible Summer CLI JWT. Never store an sc_ token in auth-token:
|
|
121
|
-
* the engine reads that file and expects the summer-cli JWT contract.
|
|
122
|
-
*/
|
|
123
|
-
export async function getCreatorToken() {
|
|
124
|
-
const token = await readStoreText(CREATOR_TOKEN_FILE);
|
|
125
|
-
return token?.trim() || null;
|
|
126
|
-
}
|
|
127
|
-
export async function saveCreatorToken(token) {
|
|
128
|
-
const clean = token.trim();
|
|
129
|
-
if (!/^sc_[A-Za-z0-9_-]{32,}$/.test(clean)) {
|
|
130
|
-
throw new Error('That is not a Summercraft creator API token. Recovery: open /creator/settings/tokens, mint a token with the "publish" scope, and paste the complete one-time sc_ value.');
|
|
131
|
-
}
|
|
132
|
-
await writeStoreText(CREATOR_TOKEN_FILE, `${clean}\n`);
|
|
133
|
-
await updateMetadata("creator", {
|
|
134
|
-
audience: ["summercraft-creator"],
|
|
135
|
-
scopes: ["publish"],
|
|
136
|
-
tokenType: "api",
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
119
|
export async function getUserInfo() {
|
|
140
120
|
return readStoreJson(USER_FILE);
|
|
141
121
|
}
|
|
@@ -173,21 +153,11 @@ export async function saveLoginSession(session) {
|
|
|
173
153
|
export async function getCredentialMetadata() {
|
|
174
154
|
const metadata = await readMetadata();
|
|
175
155
|
const token = await getAuthToken();
|
|
176
|
-
const creatorToken = await getCreatorToken();
|
|
177
156
|
return {
|
|
178
157
|
schemaVersion: 1,
|
|
179
158
|
...(token
|
|
180
159
|
? { auth: metadata.auth ?? decodeJwtMetadata(token) }
|
|
181
160
|
: {}),
|
|
182
|
-
...(creatorToken
|
|
183
|
-
? {
|
|
184
|
-
creator: metadata.creator ?? {
|
|
185
|
-
audience: ["summercraft-creator"],
|
|
186
|
-
scopes: [],
|
|
187
|
-
tokenType: "api",
|
|
188
|
-
},
|
|
189
|
-
}
|
|
190
|
-
: {}),
|
|
191
161
|
};
|
|
192
162
|
}
|
|
193
163
|
export async function clearAuthCredentials() {
|
|
@@ -195,7 +165,7 @@ export async function clearAuthCredentials() {
|
|
|
195
165
|
for (const file of [
|
|
196
166
|
AUTH_TOKEN_FILE,
|
|
197
167
|
LEGACY_CLOUD_TOKEN_FILE,
|
|
198
|
-
|
|
168
|
+
LEGACY_CREATOR_TOKEN_FILE,
|
|
199
169
|
STORE_OAUTH_TOKEN_FILE,
|
|
200
170
|
USER_FILE,
|
|
201
171
|
METADATA_FILE,
|