summer-engine 2.5.0 → 2.6.1

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 (83) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +5 -4
  3. package/.codex-plugin/plugin.json +5 -4
  4. package/.cursor-plugin/plugin.json +4 -3
  5. package/.factory-plugin/plugin.json +3 -3
  6. package/AGENTS.md +6 -4
  7. package/CHANGELOG.md +20 -2
  8. package/GEMINI.md +3 -3
  9. package/README.md +113 -100
  10. package/dist/bin/summer.js +6 -1
  11. package/dist/commands/cloud.d.ts +2 -0
  12. package/dist/commands/cloud.js +80 -0
  13. package/dist/commands/doctor.js +19 -0
  14. package/dist/commands/login.js +4 -1
  15. package/dist/commands/logout.js +1 -1
  16. package/dist/commands/open.js +1 -1
  17. package/dist/commands/plan.d.ts +2 -0
  18. package/dist/commands/plan.js +60 -0
  19. package/dist/commands/run.js +132 -35
  20. package/dist/lib/api-client.js +4 -1
  21. package/dist/lib/auth.d.ts +2 -0
  22. package/dist/lib/auth.js +13 -0
  23. package/dist/lib/cloud/api.d.ts +79 -0
  24. package/dist/lib/cloud/api.js +107 -0
  25. package/dist/lib/cloud/apply.d.ts +32 -0
  26. package/dist/lib/cloud/apply.js +294 -0
  27. package/dist/lib/cloud/checkpoint.d.ts +26 -0
  28. package/dist/lib/cloud/checkpoint.js +142 -0
  29. package/dist/lib/cloud/conflicts.d.ts +55 -0
  30. package/dist/lib/cloud/conflicts.js +131 -0
  31. package/dist/lib/cloud/containment.d.ts +8 -0
  32. package/dist/lib/cloud/containment.js +52 -0
  33. package/dist/lib/cloud/diff.d.ts +39 -0
  34. package/dist/lib/cloud/diff.js +138 -0
  35. package/dist/lib/cloud/engine-bridge.d.ts +21 -0
  36. package/dist/lib/cloud/engine-bridge.js +105 -0
  37. package/dist/lib/cloud/hash-cache.d.ts +23 -0
  38. package/dist/lib/cloud/hash-cache.js +44 -0
  39. package/dist/lib/cloud/hash.d.ts +10 -0
  40. package/dist/lib/cloud/hash.js +111 -0
  41. package/dist/lib/cloud/http.d.ts +17 -0
  42. package/dist/lib/cloud/http.js +47 -0
  43. package/dist/lib/cloud/lock-path.d.ts +1 -0
  44. package/dist/lib/cloud/lock-path.js +5 -0
  45. package/dist/lib/cloud/lock.d.ts +14 -0
  46. package/dist/lib/cloud/lock.js +143 -0
  47. package/dist/lib/cloud/manifest.d.ts +6 -0
  48. package/dist/lib/cloud/manifest.js +41 -0
  49. package/dist/lib/cloud/paths.d.ts +20 -0
  50. package/dist/lib/cloud/paths.js +90 -0
  51. package/dist/lib/cloud/project-godot-merge.d.ts +32 -0
  52. package/dist/lib/cloud/project-godot-merge.js +185 -0
  53. package/dist/lib/cloud/rules.d.ts +39 -0
  54. package/dist/lib/cloud/rules.js +159 -0
  55. package/dist/lib/cloud/sync.d.ts +21 -0
  56. package/dist/lib/cloud/sync.js +518 -0
  57. package/dist/lib/cloud/transfer.d.ts +23 -0
  58. package/dist/lib/cloud/transfer.js +184 -0
  59. package/dist/lib/cloud/types.d.ts +62 -0
  60. package/dist/lib/cloud/types.js +1 -0
  61. package/dist/lib/cloud/validate-path.d.ts +23 -0
  62. package/dist/lib/cloud/validate-path.js +103 -0
  63. package/dist/lib/engine.d.ts +6 -0
  64. package/dist/lib/engine.js +36 -1
  65. package/dist/lib/game-task-plan.d.ts +42 -0
  66. package/dist/lib/game-task-plan.js +376 -0
  67. package/dist/mcp/server.js +2 -0
  68. package/dist/mcp/tools/asset-tools.js +265 -45
  69. package/dist/mcp/tools/cloud-tools.d.ts +2 -0
  70. package/dist/mcp/tools/cloud-tools.js +42 -0
  71. package/dist/mcp/tools/generate-tools.js +101 -13
  72. package/dist/mcp/tools/project-tools.js +59 -16
  73. package/gemini-extension.json +3 -3
  74. package/package.json +16 -5
  75. package/skills/3d-assets/character-model/SKILL.md +27 -5
  76. package/skills/3d-assets/environment-kit/SKILL.md +7 -2
  77. package/skills/3d-assets/organic-model/SKILL.md +4 -3
  78. package/skills/3d-assets/prop-model/SKILL.md +16 -8
  79. package/skills/3d-assets/vehicle-model/SKILL.md +4 -3
  80. package/skills/animation/animation-tree/SKILL.md +2 -0
  81. package/skills/animation/generate-motion/SKILL.md +25 -4
  82. package/skills/asset-pipeline/asset-strategy/SKILL.md +3 -2
  83. package/skills/workflow/mcpupdate/SKILL.md +134 -0
package/README.md CHANGED
@@ -1,29 +1,56 @@
1
- # Summer Engine — the AI game engine
1
+ # Summer Engine: the AI game engine
2
2
 
3
3
  Build real 2D and 3D games through conversation. No coding required. Export to Steam, desktop, mobile, and web. Built on the Godot team's work, customized and honed so AI agents and humans can collaborate on great games.
4
4
 
5
- **Summer** is the open-source plugin that connects your AI coding agent to Summer Engine. MIT licensed. First-class setup works in Claude Code, Cursor, Codex, Windsurf, Cline, Roo Code, Gemini CLI, GitHub Copilot CLI, GitHub Copilot in VS Code, and OpenCode. Factory Droid uses the plugin marketplace path.
5
+ **Summer** is the MIT open-source agent layer that connects your AI coding agent to Summer Engine. It is the **Summer CLI**, the **Summer MCP** server, and the **Summer agent** skills, hooks, and plugin manifests, all in one package. First-class setup works in Claude Code, Cursor, Codex, Windsurf, Cline, Roo Code, Gemini CLI, GitHub Copilot CLI, GitHub Copilot in VS Code, and OpenCode. Factory Droid uses the plugin marketplace path.
6
6
 
7
- - **Source:** [github.com/SummerEngine/summer](https://github.com/SummerEngine/summer)
8
- - **Docs:** [summerengine.com/docs](https://summerengine.com/docs)
9
- - **MCP setup:** [summerengine.com/mcp](https://summerengine.com/mcp)
7
+ - **Source:** [github.com/SummerEngine/summer-engine-agent](https://github.com/SummerEngine/summer-engine-agent)
8
+ - **CLI setup:** [www.summerengine.com/cli](https://www.summerengine.com/cli)
9
+ - **MCP setup:** [www.summerengine.com/mcp](https://www.summerengine.com/mcp)
10
+ - **Docs:** [docs.summerengine.com](https://docs.summerengine.com)
10
11
 
11
12
  It just works. Open your agent, say *"let's make an FPS in Summer Engine,"* and it does.
12
13
 
13
14
  ---
14
15
 
15
- ## Get started — one prompt
16
+ ## Summer CLI, Summer MCP, and the Summer agent
17
+
18
+ Three names, one npm package (`summer-engine`):
19
+
20
+ - **Summer CLI** (`npx -y summer-engine@latest`): installs the engine, signs you in, scaffolds and runs projects, and writes your agent's config. See [www.summerengine.com/cli](https://www.summerengine.com/cli).
21
+ - **Summer MCP**: the local MCP server that gives your agent 44 engine tools to build, run, and debug a real game. See [www.summerengine.com/mcp](https://www.summerengine.com/mcp).
22
+ - **Summer agent layer**: the game-dev skills, hooks, and plugin manifests that give your AI agent judgment, not just a chat box.
23
+
24
+ All MIT, all free to use. One paste sets up all three.
25
+
26
+ ## Summer Cloud (new in 2.6.0)
27
+
28
+ `summer cloud` syncs your whole game project across machines: scenes, scripts, settings, and the big binary assets that never fit in git. Files are stored by content hash, every push becomes a restorable version, and local checkpoints are taken before anything destructive touches your disk.
29
+
30
+ ```bash
31
+ summer cloud init # bind this project to your account
32
+ summer cloud push # upload what changed (only missing bytes travel)
33
+ summer cloud pull # make this machine match the cloud, verified by hash
34
+ summer cloud status # what differs between here and the cloud
35
+ summer cloud restore # roll the project back to any version
36
+ ```
37
+
38
+ The same operations are available to agents as MCP tools (`summer_cloud_push`, `summer_cloud_pull`, and friends). See [www.summerengine.com/cloud](https://www.summerengine.com/cloud).
39
+
40
+ ---
41
+
42
+ ## Get started: one prompt
16
43
 
17
44
  Open your AI agent (Claude Code, Cursor, Codex, Copilot, Windsurf, etc.) and paste:
18
45
 
19
- > Install Summer Engine and let's make a game.
46
+ > Install Summer Engine and let's make a game. Read github.com/SummerEngine/summer-engine-agent, check what I already have installed, install whatever is missing, log me in, and scaffold a starter project so we can start building.
20
47
 
21
48
  That's it. The agent reads this README, detects what's already on your machine, and runs only what's missing via Bash. **No `/plugin` slash commands. No manual installs. One paste.**
22
49
 
23
50
  The first run will:
24
51
  1. Install the `summer-engine` npm package (~3 MB) if it's not on `PATH`.
25
- 2. Drop 60 skills into `~/.claude/skills/` (or your agent's user-skill directory) so the agent loads them next session.
26
- 3. Download the Summer Engine app (~1 GB — bundles the engine binary plus Git and other runtime tools so users without them aren't blocked) if it's not installed.
52
+ 2. Install Summer's game-dev skills into `~/.claude/skills/` (or your agent's user-skill directory) so the agent loads them next session.
53
+ 3. Download the Summer Engine app (~1 GB, including the engine binary, Git, and other runtime tools so users without them aren't blocked) if it's not installed.
27
54
  4. Open your browser for one-click sign-in.
28
55
  5. Scaffold a starter project and open the engine.
29
56
 
@@ -31,19 +58,19 @@ At that point the agent has the skills, the MCP server, and your engine running.
31
58
 
32
59
  ---
33
60
 
34
- ## AGENTS READING THIS — the install playbook
61
+ ## AGENTS READING THIS: install playbook
35
62
 
36
- 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; `npx -y` is shell-agnostic and works identically in both. Detection first, then only install what's missing — never double-install.
63
+ 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. `npx -y` is shell-agnostic and works identically in both. Detection first, then only install what's missing.
37
64
 
38
- ### Step −1 — Verify Node.js is on PATH
65
+ ### Step -1: Verify Node.js is on PATH
39
66
 
40
67
  ```bash
41
68
  node --version
42
69
  ```
43
70
 
44
- If this fails or returns a version below 18, **stop**. Tell the user: "Summer needs Node.js 18+. Install from https://nodejs.org and re-run the prompt." Do NOT try to install Node yourself.
71
+ If this command does not print Node.js 18 or newer, **stop**. Tell the user: "Summer needs Node.js 18+. Install from https://nodejs.org and re-run the prompt." Do NOT try to install Node yourself.
45
72
 
46
- ### Step 0 — Pre-detection (no commits to disk, just check state)
73
+ ### Step 0: Pre-detection (no commits to disk, just check state)
47
74
 
48
75
  ```bash
49
76
  npx -y summer-engine@latest doctor --json
@@ -51,29 +78,14 @@ npx -y summer-engine@latest doctor --json
51
78
 
52
79
  The first invocation downloads the npm package transparently to npx's cache (~3 MB, ~5 sec). Subsequent calls are fast. The `-y` flag auto-confirms npx's "ok to install summer-engine?" prompt so the call doesn't hang in a non-interactive shell.
53
80
 
54
- Parse the JSON output. Top-level `ok: true` means everything is installed and you can skip straight to Step 5. Otherwise iterate the `checks` array and skip any step whose check returned `status: "ok"`:
55
-
56
- ```json
57
- {
58
- "ok": true | false,
59
- "checks": [
60
- { "id": "node-version", "status": "ok" | "warning" | "fail", ... },
61
- { "id": "cli-version", "status": "ok" | "warning" | "fail", ... },
62
- { "id": "cli-version-current", "status": "ok" | "warning" | "fail", ... },
63
- { "id": "skills-version-stale","status": "ok" | "warning" | "fail", ... },
64
- { "id": "login", "status": "ok" | "warning" | "fail", ... },
65
- { "id": "engine-install", "status": "ok" | "warning" | "fail", ... },
66
- { "id": "local-api", "status": "ok" | "warning" | "fail", ... },
67
- { "id": "project-memory", "status": "ok" | "warning" | "fail", ... },
68
- { "id": "mcp-server", "status": "ok" | "warning" | "fail", ... }
69
- ]
70
- }
71
- ```
81
+ Read the JSON output. If top-level `ok` is `true`, everything is installed and you can skip straight to Step 5. Otherwise use the `checks` array to run only the remediation steps that need attention.
82
+
83
+ The relevant check ids are `node-version`, `cli-version`, `cli-version-current`, `skills-version-stale`, `login`, `engine-install`, `local-api`, `project-memory`, and `mcp-server`. For any check that is not `ok`, run the action in the table below, then re-run doctor.
72
84
 
73
- | Check id | If `ok` | If not `ok` |
85
+ | Check id | If `ok` | Action when attention is needed |
74
86
  |---|---|---|
75
- | `node-version` | continue | (Step −1 already covered this) |
76
- | `cli-version` | (always ok via npx) | — |
87
+ | `node-version` | continue | Step -1 already covered this |
88
+ | `cli-version` | always ok via npx | no action |
77
89
  | `cli-version-current` | continue | run `npx clear-npx-cache && npx -y summer-engine@latest doctor --json` (forces a fresh resolve) |
78
90
  | `skills-version-stale` | skip Step 1 | run Step 1 with `--force` |
79
91
  | `engine-install` | skip Step 2 | run Step 2 |
@@ -82,55 +94,55 @@ Parse the JSON output. Top-level `ok: true` means everything is installed and yo
82
94
  | `project-memory` | continue | if a project is open, run `summer:brainstorm-game` before building |
83
95
  | `mcp-server` | skip Step 1 | run Step 1 |
84
96
 
85
- **On version drift:** if either `cli-version-current` or `skills-version-stale` returns `warning` or `fail`, you should refresh before proceeding. Tell the user once: "There's a newer Summer (X.Y.Z → A.B.C); updating before we start." Then run the recommended action from `details.recommendedAction` and re-run doctor. Don't ask the user to choose — they paste 'install' and want the latest.
97
+ **On version drift:** if either `cli-version-current` or `skills-version-stale` needs attention, refresh before proceeding. Tell the user once: "There's a newer Summer (X.Y.Z to A.B.C); updating before we start." Then run the recommended action from `details.recommendedAction` and re-run doctor. Don't ask the user to choose; they paste "install" and want the latest.
86
98
 
87
- ### Step 1 — Install user-level skills (idempotent, fast)
99
+ ### Step 1: Install user-level skills (idempotent, fast)
88
100
 
89
101
  ```bash
90
102
  npx -y summer-engine@latest setup claude-code --yes --force
91
103
  ```
92
104
 
93
- Replace `claude-code` with the user's actual agent: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, `github-copilot`, `vscode-copilot`, or `opencode`. Use `github-copilot` for Copilot CLI and `vscode-copilot` for GitHub Copilot Chat/Agent in VS Code. Factory Droid still uses the plugin marketplace path in the install section below. This writes 60 skill files to `~/.claude/skills/<name>/SKILL.md` (or the agent's equivalent user-skill directory) AND writes the MCP server config so the agent can talk to the engine. The `--force` flag wipes any stale skill content first, so re-runs always end up with the latest copy.
105
+ Replace `claude-code` with the user's actual agent: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, `github-copilot`, `vscode-copilot`, or `opencode`. Use `github-copilot` for Copilot CLI and `vscode-copilot` for GitHub Copilot Chat/Agent in VS Code. Factory Droid still uses the plugin marketplace path in the install section below. This writes the current Summer skill bundle to `~/.claude/skills/<name>/SKILL.md` (or the agent's equivalent user-skill directory) AND writes the MCP server config so the agent can talk to the engine. The `--force` flag wipes any stale skill content first, so re-runs always end up with the latest copy.
94
106
 
95
- **First-install detection:** if `~/.claude/skills/` didn't exist before this command, Claude Code wasn't watching it and won't auto-detect the new files this session. Tell the user **once**: "Skills installed — restart your agent so they load." On subsequent installs (directory already existed), skills auto-detect mid-session and no restart is needed. **You can detect first-install vs upgrade by checking if `~/.claude/skills/` existed before Step 1; record the result before running setup.**
107
+ **First-install detection:** if `~/.claude/skills/` didn't exist before this command, Claude Code wasn't watching it and won't auto-detect the new files this session. Tell the user **once**: "Skills installed - restart your agent so they load." On subsequent installs (directory already existed), skills auto-detect mid-session and no restart is needed. **You can detect first-install vs upgrade by checking if `~/.claude/skills/` existed before Step 1; record the result before running setup.**
96
108
 
97
109
  **Do NOT run `/plugin install` or any slash command.** The CLI path is the canonical install. The marketplace path is an alternative for users who specifically prefer the official plugin TUI; we don't route agents there.
98
110
 
99
- ### Step 2 — Install the engine app (only if `engine-install` check failed)
111
+ ### Step 2: Install the engine app (only if `engine-install` needs attention)
100
112
 
101
113
  ```bash
102
114
  npx -y summer-engine@latest install
103
115
  ```
104
116
 
105
- ~1 GB. Downloads from Summer's signed releases. The bundle includes the engine binary plus Git and a handful of other runtime tools so users who don't already have them aren't blocked. The CLI prints the URL and size before touching disk. Tell the user **"downloading the engine app, ~1 GB — this takes a couple minutes"** so they don't bail thinking it stalled.
117
+ ~1 GB. Downloads from Summer's signed releases. The bundle includes the engine binary plus Git and a handful of other runtime tools so users who don't already have them aren't blocked. The CLI prints the URL and size before touching disk. Tell the user **"downloading the engine app, ~1 GB, this takes a couple minutes"** so they don't bail thinking it stalled.
106
118
 
107
- **Linux note:** the engine app currently supports macOS and Windows only. On Linux, `summer install` exits with a "Linux support coming soon" message. Surface the manual download URL to the user (https://summerengine.com/download) and stop — the rest of the playbook still works once they've installed manually.
119
+ **Linux note:** the engine app currently supports macOS and Windows only. On Linux, `summer install` exits with a "Linux support coming soon" message. Surface the manual download URL to the user (https://summerengine.com/download) and stop. The rest of the playbook still works once they've installed manually.
108
120
 
109
- ### Step 3 — Sign in (only if `login` check failed)
121
+ ### Step 3: Sign in (only if `login` needs attention)
110
122
 
111
123
  ```bash
112
124
  npx -y summer-engine@latest login
113
125
  ```
114
126
 
115
- This opens the user's default browser. **Tell the user**: "Your browser is opening now. Click sign-in once and come back to this terminal." The CLI waits up to 120 seconds for the auth callback, writes the token to `~/.summer/auth-token`, and returns. **If the user takes longer than 120s, the command exits with an error — just re-run `npx -y summer-engine@latest login` and tell them to be quicker.** Don't loop indefinitely. The same token is shared with the engine — they sign in once, both surfaces accept it.
127
+ This opens the user's default browser. **Tell the user**: "Your browser is opening now. Click sign-in once and come back to this terminal." The CLI waits up to 120 seconds for the auth callback, writes the token to `~/.summer/auth-token`, and returns. **If the user takes longer than 120 seconds, re-run `npx -y summer-engine@latest login` and tell them to come back to the terminal quickly.** Don't loop indefinitely. The same token is shared with the engine; they sign in once, both surfaces accept it.
116
128
 
117
- ### Step 4 — Re-run doctor to confirm
129
+ ### Step 4: Re-run doctor to confirm
118
130
 
119
131
  ```bash
120
132
  npx -y summer-engine@latest doctor --json
121
133
  ```
122
134
 
123
- Should now return `ok: true` for `cli-version`, `login`, and `engine-install`. (`local-api` will still be `warning` — that's expected; the engine isn't running yet.) If a setup check still fails, surface the specific message to the user — don't loop or paper over it.
135
+ Should now return `ok: true` for `cli-version`, `login`, and `engine-install`. `local-api` may still need attention because the engine is not running yet. If a setup check still needs attention, surface the specific message to the user and do not loop or paper over it.
124
136
 
125
- ### Step 5 — Scaffold a project and run
137
+ ### Step 5: Scaffold a project and run
126
138
 
127
- **Important:** `summer create` writes the project into the current working directory. **Pick a stable parent directory first** — the user's home, a Projects folder, etc. — and `cd` there before running `create`. Don't let it land in a temp dir or wherever the agent happened to start.
139
+ **Important:** `summer create` writes the project into the current working directory. **Pick a stable parent directory first**, such as the user's home or a Projects folder, and `cd` there before running `create`. Don't let it land in a temp dir or wherever the agent happened to start.
128
140
 
129
141
  ```bash
130
142
  cd ~/Projects # or wherever the user keeps code
131
143
  ```
132
144
 
133
- If the user said "let's make a game" without specifying a template, default to `3d-basic`. Pick a sensible project name from the user's request (e.g. "FPS" → `my-fps-game`). Avoid spaces in the name.
145
+ If the user said "let's make a game" without specifying a template, default to `3d-basic`. Pick a sensible project name from the user's request, for example "FPS" to `my-fps-game`. Avoid spaces in the name.
134
146
 
135
147
  ```bash
136
148
  npx -y summer-engine@latest create 3d-basic my-fps-game
@@ -139,9 +151,9 @@ npx -y summer-engine@latest run my-fps-game
139
151
 
140
152
  `summer run` launches the engine app with the project loaded and polls the engine's local API for up to 20 seconds before returning.
141
153
 
142
- ### Step 5b — Wait for the engine to be reachable (only if `summer run` printed "API not responding yet")
154
+ ### Step 5b: Wait for the engine to be reachable (only if `summer run` printed "API not responding yet")
143
155
 
144
- If the engine takes longer than 20s to boot (cold start, slow disk, etc.), `summer run` returns successfully but the local API isn't up yet. Calling `summer_get_scene_tree` or any other MCP tool will fail. Wait for it:
156
+ If the engine takes longer than 20s to boot (cold start, slow disk, etc.), `summer run` returns successfully but the local API isn't up yet. MCP tools may not connect until the local API is ready. Wait for it:
145
157
 
146
158
  ```bash
147
159
  # Poll doctor until local-api flips to ok (max ~30s):
@@ -156,9 +168,9 @@ done
156
168
 
157
169
  Once `local-api` is `ok`, MCP tools are safe to call.
158
170
 
159
- ### Step 6 — Brainstorm the game, then build
171
+ ### Step 6: Brainstorm the game, then build
160
172
 
161
- Now you have skills + MCP. **Don't jump into `summer create` content from a vague prompt** — invoke the `summer:brainstorm-game` skill via the `Skill` tool first. It scopes mechanics, art direction, and the V1 cut list, and writes the result to `.summer/GameSoul.md`. Every other Summer skill reads from that file.
173
+ Now you have skills + MCP. **Don't jump into `summer create` content from a vague prompt**. Call `summer_start_game_task` with the user's goal, then invoke the recommended skill. For vague "make a game" requests, that should usually be `summer:brainstorm-game`. It scopes mechanics, art direction, and the V1 cut list, and writes the result to `.summer/GameSoul.md`. Every other Summer skill reads from that file.
162
174
 
163
175
  Project memory lives in `.summer/` as readable Markdown. Use `.summer/memory/` for locked facts that should not drift across sessions, such as character voice IDs, world canon, and provider bindings. Users can inspect it with `summer memory`; agents should read relevant memory surfaced by `summer_get_project_context` before changing creative/audio/dialogue/level/character work.
164
176
 
@@ -166,15 +178,15 @@ Only skip brainstorm if the user explicitly said "skip brainstorm" or "just buil
166
178
 
167
179
  ### Anti-patterns (do NOT do these)
168
180
 
169
- - **Don't run `npm install -g summer-engine`.** Use `npx -y summer-engine@latest ...` instead. `-g` requires `sudo` on most Mac/Linux setups — 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`.
170
- - **Don't try to install Node.js for the user.** If `node --version` fails, point them at https://nodejs.org and stop.
171
- - **Don't ask the user "do you want the engine too?" or "do you also want the CLI?"** — there is one product, three pieces, all installed by this playbook.
181
+ - **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`.
182
+ - **Don't try to install Node.js for the user.** If `node --version` is unavailable, point them at https://nodejs.org and stop.
183
+ - **Don't ask the user "do you want the engine too?" or "do you also want the CLI?"** There is one product, three pieces, all installed by this playbook.
172
184
  - **Don't double-install.** Always run `npx -y summer-engine@latest doctor --json` first. Skip steps that already returned `status: ok`.
173
- - **Don't tell the user to type `/plugin marketplace add` or `/plugin install`.** The CLI path is the canonical install — those slash commands are an alternative for the marketplace TUI, not the primary flow.
185
+ - **Don't tell the user to type `/plugin marketplace add` or `/plugin install`.** The CLI path is the canonical install. Those slash commands are an alternative for the marketplace TUI, not the primary flow.
174
186
  - **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.
175
- - **Don't skip the `--json` flag on `summer doctor`** — text output is fragile to parse and changes per version.
176
- - **Don't skip the `-y` flag on `npx`** — without it, npx prompts "ok to install summer-engine?" interactively and the call hangs in a non-interactive shell.
177
- - **Don't drop `@latest` from the npx commands.** `npx -y summer-engine` (no version pin) serves whatever's in npx's local cache, which can be a stale older version. The `@latest` tag forces npm to re-resolve from the registry. If a user reports "unknown command 'doctor'" or sees a much smaller skill list than expected, they got cache-served — tell them to run `npx clear-npx-cache` then retry with `@latest`.
187
+ - **Don't skip the `--json` flag on `summer doctor`.** Text output is fragile to parse and changes per version.
188
+ - **Don't skip the `-y` flag on `npx`.** Without it, npx prompts "ok to install summer-engine?" interactively and the call hangs in a non-interactive shell.
189
+ - **Don't drop `@latest` from the npx commands.** `npx -y summer-engine` (no version pin) serves whatever's in npx's local cache, which can be a stale older version. The `@latest` tag forces npm to re-resolve from the registry. If a user reports "unknown command 'doctor'" or sees a much smaller skill list than expected, they got cache-served. Tell them to run `npx clear-npx-cache` then retry with `@latest`.
178
190
  - **Don't call MCP tools (`summer_get_scene_tree`, etc.) until `local-api` is `ok`.** The engine takes a few seconds to boot after `summer run`. Use Step 5b's wait-loop.
179
191
  - **Don't `summer create` without `cd`'ing to a stable parent directory first.** It writes into CWD; agents that start in a temp dir will leave the project there.
180
192
  - **Don't loop `summer login` if it times out at 120s.** Re-run it once and tell the user to be quicker; loop forever and the user is stuck.
@@ -186,12 +198,12 @@ Only skip brainstorm if the user explicitly said "skip brainstorm" or "just buil
186
198
 
187
199
  ---
188
200
 
189
- ## Get started — alternative (manual install via plugin marketplace)
201
+ ## Get started: alternative manual install via plugin marketplace
190
202
 
191
203
  If you specifically prefer the official Claude Code plugin marketplace UI, you can install via:
192
204
 
193
205
  ```
194
- /plugin marketplace add SummerEngine/summer
206
+ /plugin marketplace add SummerEngine/summer-engine-agent
195
207
  /plugin install summer@summer-engine
196
208
  ```
197
209
 
@@ -201,13 +213,13 @@ This is functionally equivalent to `npx -y summer-engine@latest setup claude-cod
201
213
 
202
214
  ## What just happened (the three pieces)
203
215
 
204
- You installed one product. It has three parts. You don't have to think about them — Summer wires them up — but here's what each does:
216
+ You installed one product. It has three parts. You don't have to think about them because Summer wires them up, but here's what each does:
205
217
 
206
- - **Summer Engine** — the game engine app. Where you see, play, and debug your game. Installed by the agent via `npx -y summer-engine@latest install`. Proprietary, free to use.
207
- - **Summer plugin** — what Claude Code (or your agent) uses to know what game-dev skills to apply and which tools to call. Installed by `summer setup` or the marketplace path. MIT, open source.
208
- - **Summer CLI** — the terminal command layer that installs the engine, scaffolds projects, runs them, signs you in, and starts MCP. Usually invoked through `npx -y summer-engine@latest ...`, so no global install is needed. MIT, open source.
218
+ - **Summer Engine**: the game engine app. Where you see, play, and debug your game. Installed by the agent via `npx -y summer-engine@latest install`. Proprietary, free to use.
219
+ - **Summer agent layer**: the skills, hooks, and plugin manifests that tell Claude Code, Codex, Cursor, and other agents how to build games. Installed by `summer setup` or the marketplace path. MIT, open source.
220
+ - **Summer CLI and MCP bridge**: the terminal command and local tool server that install the engine, scaffold projects, run them, sign you in, and let agents talk to the running engine. Usually invoked through `npx -y summer-engine@latest ...`, so no global install is needed. MIT, open source.
209
221
 
210
- The plugin gives the agent the skills. The CLI gives it hands to install and launch the engine. The engine is where the game actually lives.
222
+ The agent layer gives the agent judgment. The CLI and MCP bridge give it hands. The engine is where the game actually lives.
211
223
 
212
224
  ---
213
225
 
@@ -219,7 +231,7 @@ We tell you before we touch your disk.
219
231
  |---|---|---|---|
220
232
  | `summer-engine` npm package (CLI + plugin source) | ~3 MB | first `npx -y summer-engine@latest ...` call | [npmjs.com/package/summer-engine](https://www.npmjs.com/package/summer-engine) |
221
233
  | Summer Engine app | ~1 GB (engine + bundled Git/runtime tools) | `npx -y summer-engine@latest install` | Summer's signed releases |
222
- | Auth token | ~1 KB | `npx -y summer-engine@latest login` | Browser → `~/.summer/auth-token` |
234
+ | Auth token | ~1 KB | `npx -y summer-engine@latest login` | Browser to `~/.summer/auth-token` |
223
235
  | Skill files | < 50 KB | bundled in the npm package | no extra network call |
224
236
  | Generated assets (3D / image / audio / video) | varies | only on explicit `summer_generate_*` calls | Summer Engine Studio |
225
237
  | URL imports | varies | only on explicit `summer_import_from_url` calls | the URL you provide |
@@ -235,11 +247,11 @@ Not downloaded:
235
247
 
236
248
  | Thing | License | Source |
237
249
  |---|---|---|
238
- | **Summer** (this repo: skills, MCP server, CLI, hooks, plugin manifests) | **MIT** | [SummerEngine/summer](https://github.com/SummerEngine/summer) |
239
- | **Summer Engine** (the engine binary, editor, runtime) | proprietary, free to use | [summerengine.com/download](https://summerengine.com/download) |
240
- | **Summer Engine Studio** (asset generation, cloud) | proprietary, paid plans | [summerengine.com/pricing](https://summerengine.com/pricing) |
250
+ | **Summer** (this repo: CLI, MCP server, skills, hooks, plugin manifests) | **MIT** | [SummerEngine/summer-engine-agent](https://github.com/SummerEngine/summer-engine-agent) |
251
+ | **Summer Engine app** (the desktop editor and runtime) | free to download, closed source for now | [summerengine.com/download](https://summerengine.com/download) |
252
+ | **Hosted Summer AI and cloud services** (asset generation, storage, multiplayer, orchestration) | paid Summer services | [summerengine.com/pricing](https://summerengine.com/pricing) |
241
253
 
242
- The engine is the moat. The agent layer is open so you can audit it, fork it, extend the skills, and contribute back.
254
+ The desktop app is free to download. The AI-agent layer, meaning the CLI, MCP server, skills, and plugin manifests, is MIT open source. Hosted Summer AI, asset generation, storage, multiplayer, and cloud features are paid Summer services.
243
255
 
244
256
  ---
245
257
 
@@ -247,29 +259,29 @@ The engine is the moat. The agent layer is open so you can audit it, fork it, ex
247
259
 
248
260
  Two pieces, plus the glue.
249
261
 
250
- **Skills.** Twenty-four markdown files. Each one is a discipline guide for the agent. They auto-fire on natural language:
262
+ **Skills.** A bundled set of markdown playbooks. Each one is a discipline guide for the agent. They auto-fire on natural language:
251
263
 
252
- - "Let's brainstorm a game" → `summer:brainstorm-game`
253
- - "It crashes when I press play" → `summer:debug`
254
- - "Add an FPS controller" → `summer:fps-controller`
255
- - "Make it look prettier" → `summer:art-direction`
256
- - "Set up multiplayer" → `summer:setup-multiplayer` → `summer:host-authoritative-state`
264
+ - "Let's brainstorm a game" -> `summer:brainstorm-game`
265
+ - "It crashes when I press play" -> `summer:debug`
266
+ - "Add an FPS controller" -> `summer:fps-controller`
267
+ - "Make it look prettier" -> `summer:art-direction`
268
+ - "Set up multiplayer" -> `summer:setup-multiplayer` -> `summer:host-authoritative-state`
257
269
 
258
270
  Skills don't list steps. They encode the **order of operations**: diagnose before editing, scope before building, ask before guessing. [Agent Skills](https://agentskills.io) format, so any conformant tool picks them up.
259
271
 
260
- **MCP bridge.** The `summer-engine` MCP server gives the agent 37 tools that talk to your local engine on `localhost:6550`:
272
+ **MCP bridge.** The `summer-engine` MCP server gives the agent 44 tools that talk to your local engine on `localhost:6550`:
261
273
 
262
274
  | | |
263
275
  |---|---|
264
- | Scene | `summer_add_node`, `summer_set_prop`, `summer_replace_node`, `summer_get_scene_tree`, `summer_inspect_node`, `summer_batch` |
265
- | Diagnostics | `summer_get_script_errors`, `summer_get_diagnostics`, `summer_get_console`, `summer_get_debugger_errors` |
276
+ | Scene | `summer_add_node`, `summer_set_prop`, `summer_instantiate_scene`, `summer_replace_node`, `summer_get_scene_tree`, `summer_inspect_node`, `summer_batch` |
277
+ | Diagnostics | `summer_get_script_errors`, `summer_get_diagnostics`, `summer_get_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings` |
266
278
  | Runtime | `summer_play`, `summer_stop`, `summer_is_running` |
267
279
  | Project | `summer_get_project_context`, `summer_open_main_scene`, `summer_project_setting`, `summer_input_map_bind` |
268
280
  | Assets | `summer_search_assets`, `summer_import_asset`, `summer_import_from_url`, `summer_generate_image`, `summer_generate_3d`, `summer_generate_audio`, `summer_generate_video` |
269
281
 
270
- File ops, git, shell, grep — your agent already has those. We don't shadow them.
282
+ File ops, git, shell, and grep already belong to your agent. We don't shadow them.
271
283
 
272
- **Lifecycle hooks.** A `session-start` hook detects whether you're in a Summer Engine project and feeds the agent a one-line orientation. An opt-in `pre-commit doctor` runs `summer doctor` before `git commit` and blocks on failure.
284
+ **Lifecycle hooks.** A `session-start` hook detects whether you're in a Summer Engine project and feeds the agent a one-line orientation. An opt-in `pre-commit doctor` runs `summer doctor` before `git commit` and blocks when the setup needs attention.
273
285
 
274
286
  For the full architecture, see [docs/OVERVIEW.md](docs/OVERVIEW.md).
275
287
 
@@ -286,27 +298,27 @@ For the full architecture, see [docs/OVERVIEW.md](docs/OVERVIEW.md).
286
298
  7. **debug** runs the cheapest diagnostic, forms one specific hypothesis, asks before editing, re-verifies after the fix.
287
299
  8. **export-and-ship** runs the pre-flight checklist before producing a release build.
288
300
 
289
- Twenty-four skills replace "agent flailing through tutorials" with measurable craft.
301
+ The skill bundle replaces "agent flailing through tutorials" with measurable craft.
290
302
 
291
303
  ---
292
304
 
293
305
  ## What's inside
294
306
 
295
- **Process** — `using-summer`, `brainstorm-game`, `debug`, `play`
307
+ **Process**: `using-summer`, `brainstorm-game`, `debug`, `play`
296
308
 
297
- **Project setup** — `new-project`, `browse-templates`, `make-game`, `scene-composition`
309
+ **Project setup**: `new-project`, `browse-templates`, `make-game`, `scene-composition`
298
310
 
299
- **Build** — `fps-controller`, `design-mechanic`, `design-level`, `design-npc`
311
+ **Build**: `fps-controller`, `design-mechanic`, `design-level`, `design-npc`
300
312
 
301
- **Multiplayer** — `setup-multiplayer`, `host-authoritative-state`, `peer-to-peer-multiplayer`
313
+ **Multiplayer**: `setup-multiplayer`, `host-authoritative-state`, `peer-to-peer-multiplayer`
302
314
 
303
- **Look & feel** — `art-direction`, `audio-direction`, `3d-lighting`, `vfx`, `ui-basics`
315
+ **Look & feel**: `art-direction`, `audio-direction`, `3d-lighting`, `vfx`, `ui-basics`
304
316
 
305
- **Code & assets** — `gdscript-patterns`, `asset-strategy`
317
+ **Code & assets**: `gdscript-patterns`, `asset-strategy`
306
318
 
307
- **Performance & ship** — `tune-performance`, `export-and-ship`
319
+ **Performance & ship**: `tune-performance`, `export-and-ship`
308
320
 
309
- **Skill authoring** — `skill-create`, `skill-improve`, `skill-test`
321
+ **Skill authoring**: `skill-create`, `skill-improve`, `skill-test`
310
322
 
311
323
  C# is supported by the engine. A `summer:csharp-patterns` skill is on the roadmap; for now write C# from Godot 4.5 docs.
312
324
 
@@ -322,12 +334,12 @@ Full list of shipping skills: the `skills:` array in [`.claude-plugin/plugin.jso
322
334
 
323
335
  ---
324
336
 
325
- ## Install — full instructions per harness
337
+ ## Install: full instructions per harness
326
338
 
327
339
  ### Claude Code
328
340
 
329
341
  ```bash
330
- claude /plugin marketplace add SummerEngine/summer
342
+ claude /plugin marketplace add SummerEngine/summer-engine-agent
331
343
  claude /plugin install summer@summer-engine
332
344
  ```
333
345
 
@@ -347,7 +359,7 @@ Search `summer`, install.
347
359
 
348
360
  ### Codex App
349
361
 
350
- Sidebar → **Plugins** → **Coding** → click `+` next to **Summer**.
362
+ Sidebar to **Plugins** to **Coding**, then click `+` next to **Summer**.
351
363
 
352
364
  ### Cursor
353
365
 
@@ -360,7 +372,7 @@ Or search `summer` in the Cursor plugin marketplace.
360
372
  ### Factory Droid
361
373
 
362
374
  ```bash
363
- droid plugin marketplace add https://github.com/SummerEngine/summer
375
+ droid plugin marketplace add https://github.com/SummerEngine/summer-engine-agent
364
376
  droid plugin install summer@summer-engine
365
377
  ```
366
378
 
@@ -378,7 +390,7 @@ Writes the MCP server config to VS Code's globalStorage for the Cline extension
378
390
  npx -y summer-engine@latest setup roo-code --yes
379
391
  ```
380
392
 
381
- Same shape as Cline (Roo Code is a Cline fork) — writes globalStorage MCP config and `.clinerules/` files. **Restart VS Code** afterward.
393
+ Same shape as Cline (Roo Code is a Cline fork): writes globalStorage MCP config and `.clinerules/` files. **Restart VS Code** afterward.
382
394
 
383
395
  ### Gemini CLI
384
396
 
@@ -386,7 +398,7 @@ Same shape as Cline (Roo Code is a Cline fork) — writes globalStorage MCP conf
386
398
  npx -y summer-engine@latest setup gemini --yes
387
399
  ```
388
400
 
389
- Drops a Summer extension manifest at `~/.gemini/extensions/summer-engine/`. If the extension isn't auto-enabled on next launch, run `gemini extensions enable summer-engine`. The marketplace path (`gemini extensions install https://github.com/SummerEngine/summer`) still works for users who prefer it — both end up at the same place.
401
+ Drops a Summer extension manifest at `~/.gemini/extensions/summer-engine/`. If the extension isn't auto-enabled on next launch, run `gemini extensions enable summer-engine`. The marketplace path (`gemini extensions install https://github.com/SummerEngine/summer-engine-agent`) still works for users who prefer it. Both end up at the same place.
390
402
 
391
403
  ### GitHub Copilot CLI
392
404
 
@@ -425,11 +437,12 @@ npx -y summer-engine@latest doctor
425
437
 
426
438
  | Command | What it does |
427
439
  |---|---|
428
- | `summer install` | Download Summer Engine. Transparent — prints URL + size first. |
440
+ | `summer install` | Download Summer Engine. Prints URL and size first. |
429
441
  | `summer login` | Browser-based sign-in. |
430
442
  | `summer logout` | Clear auth tokens. |
431
443
  | `summer status` | Engine state, port, auth. |
432
444
  | `summer doctor` | Diagnose Node, login, engine, project memory, MCP. |
445
+ | `summer plan <goal>` | Route a game-building goal into skills, MCP tools, gates, and verification. |
433
446
  | `summer memory` | Inspect project memory in `.summer`. |
434
447
  | `summer memory show <file>` | Print a project memory Markdown file. |
435
448
  | `summer run [path]` | Launch the engine. |
@@ -501,4 +514,4 @@ MIT for everything in this repo. Summer Engine itself is proprietary. See [What'
501
514
  - [Download Summer Engine](https://summerengine.com/download)
502
515
  - [Documentation](https://summerengine.com/docs)
503
516
  - [Community](https://summerengine.com/community)
504
- - [Issues](https://github.com/SummerEngine/summer/issues)
517
+ - [Issues](https://github.com/SummerEngine/summer-engine-agent/issues)
@@ -15,6 +15,8 @@ import { skillsCommand } from "../commands/skills.js";
15
15
  import { orchestratorCommand } from "../commands/orchestrator.js";
16
16
  import { setupCommand } from "../commands/setup.js";
17
17
  import { doctorCommand } from "../commands/doctor.js";
18
+ import { planCommand } from "../commands/plan.js";
19
+ import { cloudCommand } from "../commands/cloud.js";
18
20
  import { getBanner } from "../lib/banner.js";
19
21
  import { c, sym } from "../lib/format.js";
20
22
  const require = createRequire(import.meta.url);
@@ -40,7 +42,9 @@ program.addCommand(skillsCommand);
40
42
  program.addCommand(mcpCommand);
41
43
  program.addCommand(setupCommand);
42
44
  program.addCommand(doctorCommand);
45
+ program.addCommand(planCommand);
43
46
  program.addCommand(orchestratorCommand);
47
+ program.addCommand(cloudCommand);
44
48
  program.parseAsync().catch((err) => {
45
49
  console.error(err instanceof Error ? err.message : String(err));
46
50
  process.exit(1);
@@ -58,6 +62,7 @@ function printIntro(version) {
58
62
  console.log(` ${c.bold("Manual commands")}`);
59
63
  console.log(` ${c.dim("$")} npx -y summer-engine@latest setup claude-code --yes`);
60
64
  console.log(` ${c.dim("$")} npx -y summer-engine@latest create 3d-basic my-game`);
65
+ console.log(` ${c.dim("$")} npx -y summer-engine@latest plan make a small arena shooter`);
61
66
  console.log(` ${c.dim("$")} npx -y summer-engine@latest memory`);
62
67
  console.log(` ${c.dim("$")} npx -y summer-engine@latest doctor`);
63
68
  console.log("");
@@ -66,6 +71,6 @@ function printIntro(version) {
66
71
  console.log(` ${c.brand("/play")} ${c.dim("Run the game and report state")}`);
67
72
  console.log("");
68
73
  console.log(` ${c.dim("Docs:")} https://summerengine.com/docs`);
69
- console.log(` ${c.dim("Source:")} https://github.com/SummerEngine/summer`);
74
+ console.log(` ${c.dim("Source:")} https://github.com/SummerEngine/summer-engine-agent`);
70
75
  console.log("");
71
76
  }
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const cloudCommand: Command;
@@ -0,0 +1,80 @@
1
+ import { Command } from "commander";
2
+ import { cloudCheckpoints, cloudConflicts, cloudInit, cloudPull, cloudPush, cloudRestore, cloudStatus, } from "../lib/cloud/sync.js";
3
+ export const cloudCommand = new Command("cloud").description("Sync Summer Engine projects with Summer Cloud");
4
+ cloudCommand
5
+ .command("init")
6
+ .description("Enable Summer Cloud for this project")
7
+ .option("--project <path>", "Project root path")
8
+ .option("--json", "Print JSON")
9
+ .action(async (opts) => printResult(await cloudInit(opts), opts.json));
10
+ cloudCommand
11
+ .command("status")
12
+ .description("Show Summer Cloud sync status")
13
+ .option("--project <path>", "Project root path")
14
+ .option("--json", "Print JSON")
15
+ .action(async (opts) => printResult(await cloudStatus(opts), opts.json));
16
+ cloudCommand
17
+ .command("push")
18
+ .description("Push local project changes to Summer Cloud")
19
+ .option("--project <path>", "Project root path")
20
+ .option("--json", "Print JSON")
21
+ .option("--confirm-deletes", "Allow guarded cloud deletions")
22
+ .option("--bootstrap <choice>", "No-base bootstrap choice: keep-cloud, keep-local, merge")
23
+ .option("--adopt-path", "Accept that the project folder moved and update the recorded path")
24
+ .action(async (opts) => printResult(await cloudPush(opts), opts.json));
25
+ cloudCommand
26
+ .command("pull")
27
+ .description("Pull Summer Cloud changes into this project")
28
+ .option("--project <path>", "Project root path")
29
+ .option("--json", "Print JSON")
30
+ .option("--bootstrap <choice>", "No-base bootstrap choice: keep-cloud, keep-local, merge")
31
+ .option("--adopt-path", "Accept that the project folder moved and update the recorded path")
32
+ .action(async (opts) => printResult(await cloudPull(opts), opts.json));
33
+ cloudCommand
34
+ .command("restore")
35
+ .description("Restore a retained cloud version (new head, then pull) or a local pre-sync checkpoint")
36
+ .option("--version <number>", "Cloud version number to restore", Number)
37
+ .option("--checkpoint <stamp>", "Local checkpoint stamp or full ref (see: summer cloud checkpoints)")
38
+ .option("--project <path>", "Project root path")
39
+ .option("--json", "Print JSON")
40
+ .action(async (opts) => printResult(await cloudRestore(opts), opts.json));
41
+ cloudCommand
42
+ .command("checkpoints")
43
+ .description("List local pre-sync checkpoints")
44
+ .option("--project <path>", "Project root path")
45
+ .option("--json", "Print JSON")
46
+ .action(async (opts) => printResult(await cloudCheckpoints(opts), opts.json));
47
+ const conflictsCommand = new Command("conflicts").description("Inspect and recover Summer Cloud conflict sets");
48
+ conflictsCommand
49
+ .command("list", { isDefault: true })
50
+ .description("List local Summer Cloud conflict sets")
51
+ .option("--project <path>", "Project root path")
52
+ .option("--json", "Print JSON")
53
+ .action(async (opts) => printResult(await cloudConflicts(opts), opts.json));
54
+ conflictsCommand
55
+ .command("restore <path>")
56
+ .description("Restore a preserved conflict file back into the project as a fresh edit")
57
+ .option("--set <stamp>", "Conflict set stamp (defaults to the newest set containing the path)")
58
+ .option("--project <path>", "Project root path")
59
+ .option("--json", "Print JSON")
60
+ .action(async (restorePath, opts) => printResult(await cloudConflicts({ ...opts, restorePath }), opts.json));
61
+ cloudCommand.addCommand(conflictsCommand);
62
+ function printResult(result, json) {
63
+ if (json) {
64
+ console.log(JSON.stringify(result, null, 2));
65
+ return;
66
+ }
67
+ console.log(result.message);
68
+ if (result.projectId)
69
+ console.log(`Project: ${result.projectId}`);
70
+ if (result.version !== undefined)
71
+ console.log(`Version: ${result.version}`);
72
+ for (const notice of result.notices ?? []) {
73
+ console.log(`notice: ${notice}`);
74
+ }
75
+ if (result.details) {
76
+ for (const [key, value] of Object.entries(result.details)) {
77
+ console.log(`${key}: ${Array.isArray(value) ? value.length : String(value)}`);
78
+ }
79
+ }
80
+ }
@@ -4,6 +4,7 @@ import { createRequire } from "node:module";
4
4
  import { platform } from "os";
5
5
  import { Command } from "commander";
6
6
  import { getAuthToken, getUserInfo } from "../lib/auth.js";
7
+ import { isGitAvailable } from "../lib/cloud/checkpoint.js";
7
8
  import { checkEngineHealth, getApiPort, getApiToken } from "../lib/engine.js";
8
9
  import { brandLine, c, pad, sym, tildeify } from "../lib/format.js";
9
10
  import { getProjectMemorySummary } from "../lib/project-memory.js";
@@ -48,6 +49,7 @@ export async function runDoctor(options = {}) {
48
49
  checks.push(checkSkillsVersion());
49
50
  checks.push(await checkLogin());
50
51
  checks.push(checkEngineInstall());
52
+ checks.push(await checkGitForCheckpoints());
51
53
  checks.push(await checkLocalApi());
52
54
  checks.push(await checkProjectMemory());
53
55
  checks.push(await checkMcpBoot());
@@ -144,6 +146,23 @@ function checkEngineInstall() {
144
146
  message: "not installed (run: summer install)",
145
147
  };
146
148
  }
149
+ async function checkGitForCheckpoints() {
150
+ const available = await isGitAvailable();
151
+ if (available) {
152
+ return {
153
+ id: "git",
154
+ label: "Git (cloud checkpoints)",
155
+ status: "ok",
156
+ message: "git found on PATH",
157
+ };
158
+ }
159
+ return {
160
+ id: "git",
161
+ label: "Git (cloud checkpoints)",
162
+ status: "warning",
163
+ message: "git not found; Summer Cloud sync needs git for pre-sync safety checkpoints",
164
+ };
165
+ }
147
166
  async function checkLocalApi() {
148
167
  const token = await getApiToken();
149
168
  const port = await getApiPort();