summer-engine 2.6.5 → 2.7.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 (57) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +3 -1
  3. package/.codex-plugin/plugin.json +5 -2
  4. package/.cursor-plugin/plugin.json +4 -1
  5. package/.opencode/plugins/summer.js +1 -1
  6. package/AGENTS.md +8 -4
  7. package/CHANGELOG.md +41 -0
  8. package/GEMINI.md +5 -4
  9. package/README.md +25 -20
  10. package/_persona/summer/SKILL.md +1 -0
  11. package/commands/summer.md +13 -0
  12. package/dist/bin/summer.js +4 -0
  13. package/dist/commands/debug.d.ts +2 -0
  14. package/dist/commands/debug.js +44 -0
  15. package/dist/commands/doctor.js +112 -8
  16. package/dist/commands/skills.js +1 -1
  17. package/dist/lib/api-client.d.ts +22 -6
  18. package/dist/lib/api-client.js +161 -36
  19. package/dist/lib/async-op-lifecycle.d.ts +7 -2
  20. package/dist/lib/async-op-lifecycle.js +32 -9
  21. package/dist/lib/cloud/engine-bridge.js +9 -1
  22. package/dist/lib/debug-report.d.ts +50 -0
  23. package/dist/lib/debug-report.js +308 -0
  24. package/dist/lib/game-task-plan.js +4 -4
  25. package/dist/lib/mcp-boot-notice.d.ts +3 -0
  26. package/dist/lib/mcp-boot-notice.js +7 -0
  27. package/dist/lib/mcp-log.d.ts +3 -0
  28. package/dist/lib/mcp-log.js +72 -0
  29. package/dist/lib/skills-registry.d.ts +25 -1
  30. package/dist/lib/skills-registry.js +46 -0
  31. package/dist/mcp/server.d.ts +2 -2
  32. package/dist/mcp/server.js +79 -7
  33. package/dist/mcp/tools/asset-tools.js +33 -12
  34. package/dist/mcp/tools/cloud-tools.js +15 -15
  35. package/dist/mcp/tools/debug-tools.js +44 -1
  36. package/dist/mcp/tools/file-tools.d.ts +2 -0
  37. package/dist/mcp/tools/file-tools.js +154 -0
  38. package/dist/mcp/tools/generate-tools.js +143 -5
  39. package/dist/mcp/tools/project-tools.js +25 -20
  40. package/dist/mcp/tools/scene-tools.js +101 -24
  41. package/dist/mcp/tools/with-engine.js +4 -4
  42. package/hooks/pre-commit-doctor.sh +0 -0
  43. package/hooks/run-hook.cmd +0 -0
  44. package/hooks/session-start.sh +0 -0
  45. package/package.json +6 -2
  46. package/skills/2d-assets/create-asset-sheet/SKILL.md +17 -15
  47. package/skills/debugging/debug/SKILL.md +23 -1
  48. package/skills/deployment/remote-deploy/SKILL.md +107 -0
  49. package/skills/scene-and-project/brainstorm-game/SKILL.md +4 -4
  50. package/skills/scene-and-project/summer-cloud/SKILL.md +92 -0
  51. package/skills/scripting-patterns/gdscript-patterns/SKILL.md +1 -1
  52. package/skills/workflow/brainstorming/scripts/start-server.sh +0 -0
  53. package/skills/workflow/brainstorming/scripts/stop-server.sh +0 -0
  54. package/skills/workflow/investigating-bugs/find-polluter.sh +0 -0
  55. package/skills/workflow/mcpupdate/SKILL.md +6 -6
  56. package/skills/workflow/using-summer/SKILL.md +20 -1
  57. package/skills/workflow/writing-skills/render-graphs.js +0 -0
@@ -8,7 +8,7 @@
8
8
  "name": "summer",
9
9
  "source": "./",
10
10
  "version": "2.5.1",
11
- "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 44-tool MCP bridge to the local desktop app.",
11
+ "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 50+ tool MCP bridge to the local desktop app.",
12
12
  "author": { "name": "Summer Engine", "email": "founders@summerengine.com" },
13
13
  "category": "game-development",
14
14
  "tags": ["game-dev", "godot", "ai-game-engine"],
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "summer",
4
4
  "version": "2.5.1",
5
- "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 52-tool MCP bridge to the local desktop app.",
5
+ "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 56-tool MCP bridge to the local desktop app.",
6
6
  "author": {
7
7
  "name": "Summer Engine",
8
8
  "email": "founders@summerengine.com",
@@ -46,6 +46,7 @@
46
46
  "./skills/scene-and-project/browse-templates/",
47
47
  "./skills/scene-and-project/play/",
48
48
  "./skills/scene-and-project/scene-composition/",
49
+ "./skills/scene-and-project/summer-cloud/",
49
50
  "./skills/scene-and-project/make-game/",
50
51
  "./skills/debugging/debug/",
51
52
  "./skills/gameplay-mechanics/design-mechanic/",
@@ -62,6 +63,7 @@
62
63
  "./skills/multiplayer-and-networking/host-authoritative-state/",
63
64
  "./skills/multiplayer-and-networking/peer-to-peer-multiplayer/",
64
65
  "./skills/deployment/export-and-ship/",
66
+ "./skills/deployment/remote-deploy/",
65
67
  "./skills/character-controllers/fps-controller/",
66
68
  "./skills/scripting-patterns/gdscript-patterns/",
67
69
  "./skills/ui-and-ux/ui-basics/",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "summer",
3
3
  "version": "2.5.1",
4
- "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 52-tool MCP bridge. Build games by talking.",
4
+ "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 56-tool MCP bridge. Build games by talking.",
5
5
  "author": {
6
6
  "name": "Summer Engine",
7
7
  "email": "founders@summerengine.com",
@@ -35,6 +35,7 @@
35
35
  "./skills/scene-and-project/browse-templates/",
36
36
  "./skills/scene-and-project/play/",
37
37
  "./skills/scene-and-project/scene-composition/",
38
+ "./skills/scene-and-project/summer-cloud/",
38
39
  "./skills/scene-and-project/make-game/",
39
40
  "./skills/debugging/debug/",
40
41
  "./skills/gameplay-mechanics/design-mechanic/",
@@ -49,6 +50,7 @@
49
50
  "./skills/multiplayer-and-networking/host-authoritative-state/",
50
51
  "./skills/multiplayer-and-networking/peer-to-peer-multiplayer/",
51
52
  "./skills/deployment/export-and-ship/",
53
+ "./skills/deployment/remote-deploy/",
52
54
  "./skills/character-controllers/fps-controller/",
53
55
  "./skills/scripting-patterns/gdscript-patterns/",
54
56
  "./skills/ui-and-ux/ui-basics/",
@@ -59,6 +61,7 @@
59
61
  "./skills/2d-assets/ui-graphics/",
60
62
  "./skills/2d-assets/tileable-texture/",
61
63
  "./skills/2d-assets/sprite-sheet/",
64
+ "./skills/2d-assets/create-asset-sheet/",
62
65
  "./skills/2d-assets/skybox-panorama/",
63
66
  "./skills/3d-assets/prop-model/",
64
67
  "./skills/3d-assets/character-model/",
@@ -92,7 +95,7 @@
92
95
  "interface": {
93
96
  "displayName": "Summer",
94
97
  "shortDescription": "Superpowers for AI game dev. Build games by talking.",
95
- "longDescription": "Summer turns Codex into a game-dev studio for Summer Engine, the AI-native game engine. It adds game-dev skills, a using-summer workflow skill, lifecycle hooks, and a 52-tool MCP bridge for scene editing, asset import, play mode, diagnostics, and generation. File, git, shell, and grep stay with the host agent. Summer Engine is compatible with Godot 4.5. Write code in GDScript and drive the engine through MCP. Session-start orients the session. Pre-commit doctor (opt-in) blocks bad commits.",
98
+ "longDescription": "Summer turns Codex into a game-dev studio for Summer Engine, the AI-native game engine. It adds game-dev skills, lifecycle hooks, and a 56-tool MCP bridge for guarded project files, scene editing, asset import, play mode, diagnostics, and generation. Git, shell, and grep stay with the host agent. Summer Engine is compatible with Godot 4.5. Write code in GDScript and drive project mutations through MCP. Session-start orients the session. Pre-commit doctor (opt-in) blocks bad commits.",
96
99
  "developerName": "Summer Engine",
97
100
  "category": "Coding",
98
101
  "capabilities": ["Interactive", "Read", "Write"],
@@ -3,7 +3,7 @@
3
3
  "name": "summer",
4
4
  "displayName": "Summer",
5
5
  "version": "2.5.1",
6
- "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 52-tool MCP bridge to the local desktop app.",
6
+ "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 56-tool MCP bridge to the local desktop app.",
7
7
  "author": { "name": "Summer Engine", "email": "founders@summerengine.com" },
8
8
  "publisher": "summer-engine",
9
9
  "homepage": "https://summerengine.com",
@@ -37,6 +37,7 @@
37
37
  "./skills/scene-and-project/browse-templates/",
38
38
  "./skills/scene-and-project/play/",
39
39
  "./skills/scene-and-project/scene-composition/",
40
+ "./skills/scene-and-project/summer-cloud/",
40
41
  "./skills/scene-and-project/make-game/",
41
42
  "./skills/debugging/debug/",
42
43
  "./skills/gameplay-mechanics/design-mechanic/",
@@ -51,6 +52,7 @@
51
52
  "./skills/multiplayer-and-networking/host-authoritative-state/",
52
53
  "./skills/multiplayer-and-networking/peer-to-peer-multiplayer/",
53
54
  "./skills/deployment/export-and-ship/",
55
+ "./skills/deployment/remote-deploy/",
54
56
  "./skills/character-controllers/fps-controller/",
55
57
  "./skills/scripting-patterns/gdscript-patterns/",
56
58
  "./skills/ui-and-ux/ui-basics/",
@@ -61,6 +63,7 @@
61
63
  "./skills/2d-assets/ui-graphics/",
62
64
  "./skills/2d-assets/tileable-texture/",
63
65
  "./skills/2d-assets/sprite-sheet/",
66
+ "./skills/2d-assets/create-asset-sheet/",
64
67
  "./skills/2d-assets/skybox-panorama/",
65
68
  "./skills/3d-assets/prop-model/",
66
69
  "./skills/3d-assets/character-model/",
@@ -20,7 +20,7 @@ Process skills (run before building): brainstorm-game, debug, play.
20
20
  Discipline skills (shape what you build): gdscript-patterns, scene-composition, art-direction, audio-direction, asset-strategy.
21
21
  Build skills (produce artifacts): fps-controller, design-mechanic, design-level, setup-multiplayer, host-authoritative-state, peer-to-peer-multiplayer, design-npc, 3d-lighting, ui-basics, vfx, tune-performance, export-and-ship, make-game.
22
22
 
23
- Always check for a relevant skill before responding. The summer-engine MCP server (npx summer-engine mcp) provides scene mutation, asset import, render, play, and diagnostics tools — file ops, git, shell, and grep are NOT exposed (use OpenCode's native tools).
23
+ Always check for a relevant skill before responding. The summer-engine MCP server (npx summer-engine mcp) provides identity-bound project file mutations plus scene, asset, render, play, and diagnostics tools. Git, shell, and grep remain native; do not bypass Summer's file guards when MCP is available.
24
24
  </EXTREMELY_IMPORTANT>`;
25
25
 
26
26
  export const SummerPlugin = async ({ client, directory }) => {
package/AGENTS.md CHANGED
@@ -13,6 +13,9 @@ This file is for any AI agent that loads context from `AGENTS.md` (Codex CLI, Fa
13
13
  3. **Don't grep the whole project before reading the actual error.** Use `summer_get_script_errors` first.
14
14
  4. **Don't edit `.tscn` files directly while the engine is running.** Use the `summer_*` MCP tools — direct edits get overwritten when the editor saves.
15
15
  5. **Never call `summer_set_resource_property` against an inline `sub_resource`** — it silently drops the value. Instantiate via `summer_set_prop` with a class-name string first.
16
+ 6. **Every scene mutation names its target.** Pass the exact `res://...tscn` as `scenePath` to add/set/remove/replace/connect/instantiate/save tools and mutation batches. `summer_open_scene` is a user-visible tab action, not a prerequisite or target selector.
17
+ 7. **Never mix `OpenScene` with scene mutations in one batch.** Send the UI action separately; `scenePath` already selects the mutation target.
18
+ 8. **Save once at the transaction boundary.** Dedicated scene mutation tools and `summer_batch` append one final `SaveScene`. Raw engine batches must include one final `SaveScene` themselves.
16
19
 
17
20
  ## Skill priority
18
21
 
@@ -22,18 +25,19 @@ This file is for any AI agent that loads context from `AGENTS.md` (Codex CLI, Fa
22
25
 
23
26
  ## MCP tool palette (engine on `localhost:6550`)
24
27
 
25
- 52 tools total. Categories:
28
+ 56 tools total. Categories:
26
29
 
27
30
  - Scene: `summer_get_scene_tree`, `summer_open_scene`, `summer_create_scene`, `summer_add_node`, `summer_set_prop`, `summer_set_resource_property`, `summer_remove_node`, `summer_save_scene`, `summer_instantiate_scene`, `summer_replace_node`, `summer_select_node`, `summer_inspect_node`, `summer_inspect_resource`, `summer_connect_signal`, `summer_batch`.
28
- - Diagnostics: `summer_get_script_errors`, `summer_get_diagnostics`, `summer_get_console`, `summer_clear_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings`.
31
+ - Diagnostics: `summer_create_debug_report`, `summer_get_script_errors`, `summer_get_diagnostics`, `summer_get_console`, `summer_clear_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings`.
29
32
  - Runtime: `summer_play`, `summer_stop`, `summer_is_running`.
30
33
  - Visual: `summer_screenshot` (capture the editor viewport or running game as an image to verify it).
31
34
  - Project: `summer_get_project_context`, `summer_open_main_scene`, `summer_project_setting`, `summer_input_map_bind`, `summer_get_agent_playbook`.
35
+ - Files: `summer_read_file`, `summer_write_file`, `summer_replace_text` (identity-bound; create-only or sha256-guarded writes).
32
36
  - Assets: `summer_search_assets`, `summer_list_my_assets`, `summer_get_asset`, `summer_get_asset_download_url`, `summer_import_asset`, `summer_import_asset_by_id`, `summer_import_from_url`, `summer_import_from_url_batch`.
33
37
  - Generation: `summer_generate_image`, `summer_generate_3d`, `summer_generate_audio`, `summer_generate_video`, `summer_generate_motion`, `summer_check_job`.
34
38
  - Meta: `summer_start_game_task`.
35
39
 
36
- File ops, git, shell, and grep are NOT exposed — use the host's native tools.
40
+ Git, shell, and grep are not exposed. Project file reads and writes are exposed through identity-bound Summer tools; do not bypass them with host writes when MCP is available. External host tools cannot be technically blocked, so the agent must follow this rule.
37
41
 
38
42
  ## Type-system gotchas
39
43
 
@@ -50,5 +54,5 @@ Resources are class names: `"BoxMesh"`, `"StandardMaterial3D"`, `"CapsuleShape3D
50
54
  |---|---|
51
55
  | MCP tool returns "Summer Engine is not running" | Tell user `summer run`. Continue with non-MCP work. |
52
56
  | Skill loads but seems wrong | Re-read it. Skills evolve. |
53
- | Skill not found | Check `summer skills list`, then `summer setup <agent> --yes`. |
57
+ | Skill not found or stale | Run `summer doctor`; if `cli-version-current` or `skills-version-stale` warns, run `npx clear-npx-cache && npx -y summer-engine@latest setup <agent> --yes --force`. |
54
58
  | Generic engine errors on launch | Run `summer doctor` first — usually reveals auth/port/path issues. |
package/CHANGELOG.md CHANGED
@@ -2,6 +2,47 @@
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
+ ## [2.7.0] — 2026-07-24 — "Reliable project mutations"
6
+
7
+ ### Added
8
+ - `summer_read_file`, `summer_write_file`, and `summer_replace_text` expose engine-routed project file access, including `.tscn` and `.tres`. New files require `create_only:true`; overwrites require an engine sha256 receipt.
9
+ - File mutations fail closed unless the MCP client has a complete engine/project identity and use the bound project hash even if caller options attempt to override it.
10
+
11
+ ### Changed
12
+ - Agent playbooks now route project file mutations through Summer MCP instead of recommending host writes that bypass identity, content guards, and editor reload handling.
13
+ - Scene mutation tools require an explicit `scenePath`; the target scene does not need to be the visible editor tab.
14
+ - `summer_open_scene` is navigation only and no longer acts as implicit mutation targeting.
15
+ - Dedicated scene mutations and mutation batches append one final `SaveScene` at the transaction boundary.
16
+ - Agent guidance no longer claims that routine scene edits require stopping the running game.
17
+
18
+ ### Fixed
19
+ - Bridge/project identity rejections now return one correlated `not_sent`
20
+ terminal, allowing the web harness to retry safely instead of waiting for a
21
+ mutation receipt that cannot exist.
22
+ - Same-file MCP mutations now serialize the complete read-to-write transaction,
23
+ preventing concurrent replacements from racing on a stale file preimage.
24
+ - Accepted engine operations preserve their request identity and report whether
25
+ they are still queued, still running, or uncertain instead of claiming that
26
+ nothing was applied after a client wait deadline.
27
+ - `summer_batch` no longer permits raw file mutations that bypass the guarded
28
+ `summer_write_file` and `summer_replace_text` tools.
29
+ - Scene operations return target/persistence evidence and concrete dependency errors instead of relying on ambient open-scene state.
30
+ - Asset placement reports success only after both the import and explicit target-scene mutation are confirmed.
31
+
32
+ ### Limitations
33
+ - The package cannot intercept an external agent's native filesystem tools. A host can still mutate files outside MCP, and a non-atomic external write can race the engine between validation and write; those cases remain technically unenforceable.
34
+
35
+ ## [2.6.6] — 2026-07-15 — "Project-bound engine requests"
36
+
37
+ ### Fixed
38
+ - Every local engine request now carries the engine instance ID, stable project ID, project ID hash, and identity protocol version captured when the CLI connects. This lets compatible engine builds reject stale requests after a project or engine switch instead of acting on the wrong target.
39
+ - An explicit project rebind now refreshes the complete engine and project identity, while keeping the existing project-hash mutation guard and screenshot drift checks.
40
+ - Summer Cloud's engine bridge now binds its save, rescan, and scene reload requests to the project it verified on disk.
41
+
42
+ ### Changed
43
+ - Summer Cloud is documented as an optional Research Preview instead of part of the core local CLI and MCP workflow.
44
+ - Release metadata and the manual npm runbook now pin the public registry and require a clean, reviewed public source checkout.
45
+
5
46
  ## [2.6.5] — 2026-07-04 — "Cloud tools don't need the engine"
6
47
 
7
48
  ### Fixed
package/GEMINI.md CHANGED
@@ -20,17 +20,18 @@ The single most important skill to know is `summer:using-summer` — it explains
20
20
 
21
21
  ## MCP tools (when the engine is running on `localhost:6550`)
22
22
 
23
- The `summer-engine` MCP server exposes 52 focused tools. The most important:
23
+ The `summer-engine` MCP server exposes 56 focused tools. The most important:
24
24
 
25
- - **Scene mutation**: `summer_add_node`, `summer_set_prop`, `summer_set_resource_property`, `summer_remove_node`, `summer_save_scene`, `summer_replace_node`, `summer_batch`.
25
+ - **Scene mutation**: `summer_add_node`, `summer_set_prop`, `summer_set_resource_property`, `summer_remove_node`, `summer_save_scene`, `summer_replace_node`, `summer_batch`. Every scene mutation requires the exact `res://...tscn` `scenePath`; opening a scene is a user-visible UI action, not a mutation prerequisite. Mutation tools append one final `SaveScene`; raw engine batches must do the same.
26
26
  - **Scene inspection**: `summer_get_scene_tree`, `summer_inspect_node`, `summer_inspect_resource`.
27
- - **Diagnostics**: `summer_get_script_errors` (cheapest), `summer_get_diagnostics`, `summer_get_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings`.
27
+ - **Diagnostics**: `summer_create_debug_report`, `summer_get_script_errors` (cheapest), `summer_get_diagnostics`, `summer_get_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings`.
28
28
  - **Run game**: `summer_play`, `summer_stop`, `summer_is_running`.
29
29
  - **Visual**: `summer_screenshot` (capture the viewport or running game as an image you can see).
30
30
  - **Project**: `summer_get_project_context`, `summer_open_main_scene`, `summer_project_setting`, `summer_input_map_bind`.
31
+ - **Files**: `summer_read_file`, `summer_write_file`, `summer_replace_text` (identity-bound, create-only or sha256-guarded mutations).
31
32
  - **Assets**: `summer_search_assets`, `summer_import_asset`, `summer_import_from_url`, `summer_generate_image`, `summer_generate_3d`, `summer_generate_audio`, `summer_generate_video`, `summer_check_job`.
32
33
 
33
- File ops (Read/Write/Edit), git, shell, and grep are deliberately **not** exposed via MCP — Gemini already has those natively.
34
+ Git, shell, and grep remain host-native. Use the Summer file tools for project reads and writes whenever MCP is available; host file writes bypass engine identity, sha guards, and reload handling and cannot be technically prevented by this package.
34
35
 
35
36
  ## Type-system traps
36
37
 
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Summer Engine: the AI game engine
2
2
 
3
+ > **Engine mirror only.** This directory is intentionally marked `private` and must never be published to npm. Review and reconcile changes into [SummerEngine/summer-engine-agent](https://github.com/SummerEngine/summer-engine-agent), which is the only npm release source.
4
+
3
5
  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
6
 
5
7
  **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, Devin Desktop (formerly Windsurf), Cline, Roo Code, Gemini CLI, GitHub Copilot CLI, GitHub Copilot in VS Code, and OpenCode. Factory Droid uses the plugin marketplace path.
@@ -18,27 +20,11 @@ It just works. Open your agent, say *"let's make an FPS in Summer Engine,"* and
18
20
  Three names, one npm package (`summer-engine`):
19
21
 
20
22
  - **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 52 engine tools to build, run, and debug a real game. See [www.summerengine.com/mcp](https://www.summerengine.com/mcp).
23
+ - **Summer MCP**: the local MCP server that gives your agent 56 engine tools to build, run, and debug a real game. See [www.summerengine.com/mcp](https://www.summerengine.com/mcp).
22
24
  - **Summer agent layer**: the game-dev skills, hooks, and plugin manifests that give your AI agent judgment, not just a chat box.
23
25
 
24
26
  All MIT, all free to use. One paste sets up all three.
25
27
 
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
28
  ## Get started: one prompt
43
29
 
44
30
  Open your AI agent (Claude Code, Cursor, Codex, Copilot, Devin Desktop, etc.) and paste:
@@ -269,19 +255,20 @@ Two pieces, plus the glue.
269
255
 
270
256
  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.
271
257
 
272
- **MCP bridge.** The `summer-engine` MCP server gives the agent 52 tools that talk to your local engine on `localhost:6550`:
258
+ **MCP bridge.** The `summer-engine` MCP server gives the agent 56 tools that talk to your local engine on `localhost:6550`:
273
259
 
274
260
  | | |
275
261
  |---|---|
276
262
  | 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` |
263
+ | Diagnostics | `summer_create_debug_report`, `summer_get_script_errors`, `summer_get_diagnostics`, `summer_get_console`, `summer_clear_console`, `summer_get_debugger_errors`, `summer_get_debugger_warnings` |
278
264
  | Runtime | `summer_play`, `summer_stop`, `summer_is_running` |
279
265
  | Visual | `summer_screenshot` (see the editor viewport, an offscreen scene render, or the running game) |
280
266
  | Interactive | `SimulateInput` / `RunVerification` raw ops via `summer_batch` — drive the running game or run a hidden GDScript probe (engine-build dependent) |
281
267
  | Project | `summer_get_project_context`, `summer_open_main_scene`, `summer_project_setting`, `summer_input_map_bind` |
268
+ | Files | `summer_read_file`, `summer_write_file`, `summer_replace_text` — identity-bound, create-only or sha256-guarded mutations |
282
269
  | Assets | `summer_search_assets`, `summer_import_asset`, `summer_import_from_url`, `summer_generate_image`, `summer_generate_3d`, `summer_generate_audio`, `summer_generate_video` |
283
270
 
284
- File ops, git, shell, and grep already belong to your agent. We don't shadow them.
271
+ Git, shell, and grep remain host-native. Project file reads and writes use Summer's identity-bound tools so compatible engine builds can reject wrong-project and stale-content mutations. A host agent can still bypass these safeguards with its own file tools; the package cannot technically intercept that external process.
285
272
 
286
273
  **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.
287
274
 
@@ -556,6 +543,24 @@ Skills evolve fast. Two ways to help:
556
543
 
557
544
  ---
558
545
 
546
+ ## Research Preview: Summer Cloud
547
+
548
+ Summer Cloud is an experimental R&D preview. It is optional, it may change or break, and it is **not** the core Summer CLI or MCP workflow. You do not need it to install or run Summer Engine, work with local projects, or use the local MCP server. The stable workflow is the local engine, CLI, MCP bridge, and agent skills described above.
549
+
550
+ The preview explores content-addressed project sync across machines, including large assets that do not fit comfortably in git:
551
+
552
+ ```bash
553
+ summer cloud init
554
+ summer cloud status
555
+ summer cloud push
556
+ summer cloud pull
557
+ summer cloud restore
558
+ ```
559
+
560
+ Matching `summer_cloud_*` MCP tools are also experimental. Keep an independent backup and do not use this preview as the only recovery path for an important project. See [www.summerengine.com/cloud](https://www.summerengine.com/cloud).
561
+
562
+ ---
563
+
559
564
  ## License
560
565
 
561
566
  MIT for everything in this repo. Summer Engine itself is proprietary. See [What's open and what's not](#whats-open-and-whats-not).
@@ -41,6 +41,7 @@ When the user invokes `/summer`, you:
41
41
  | "/summer add ambient music" | `summer:audio/music-track` |
42
42
  | "/summer make me [a VFX effect]" | `summer:visual-effects/recipes/<closest>` (e.g., "make me fire" -> `recipes/fire`; "lightning" -> `recipes/lightning`; "muzzle flash" -> `recipes/muzzle-flash`; "smoke" -> `recipes/smoke`; "magic glow" -> `recipes/magic-glow`; "hit spark" -> `recipes/hit-spark`; "dissolve" -> `recipes/dissolve`; "water ripple" -> `recipes/water-ripple`) |
43
43
  | "/summer build the FPS controller" | `summer:character-controllers/fps-controller` |
44
+ | "/summer debug" or "/summer debug [issue]" | `summer:debugging/debug` (support report mode first) |
44
45
  | "/summer the game crashes when [X]" | `summer:debugging/debug` |
45
46
  | "/summer add an animation to [character]" | `summer:animation/generate-motion` |
46
47
  | "/summer wire up a state machine for [character]" | `summer:animation/animation-tree` |
@@ -0,0 +1,13 @@
1
+ You are the Summer Engine command router. The user invoked `/summer` because they want game-development help inside Summer Engine, not generic software advice.
2
+
3
+ Arguments:
4
+
5
+ ```
6
+ $ARGUMENTS
7
+ ```
8
+
9
+ First, route the request to the closest Summer skill. Use `summer:using-summer` if you need base context before choosing.
10
+
11
+ If the arguments start with `debug`, or the user is reporting a crash, error, broken behavior, cloud/Codex failure, or anything they want to send to Summer support, use `summer:debugging/debug`. In that support-report mode, call `summer_create_debug_report` when available and tell the user where the Markdown report was written. Continue fixing the issue only if the user also asked for a fix.
12
+
13
+ For all other requests, follow the `/summer` persona routing table from the Summer skill family and start the appropriate game-dev workflow.
@@ -17,6 +17,7 @@ import { setupCommand } from "../commands/setup.js";
17
17
  import { doctorCommand } from "../commands/doctor.js";
18
18
  import { planCommand } from "../commands/plan.js";
19
19
  import { cloudCommand } from "../commands/cloud.js";
20
+ import { debugCommand } from "../commands/debug.js";
20
21
  import { getBanner } from "../lib/banner.js";
21
22
  import { c, sym } from "../lib/format.js";
22
23
  const require = createRequire(import.meta.url);
@@ -42,6 +43,7 @@ program.addCommand(skillsCommand);
42
43
  program.addCommand(mcpCommand);
43
44
  program.addCommand(setupCommand);
44
45
  program.addCommand(doctorCommand);
46
+ program.addCommand(debugCommand);
45
47
  program.addCommand(planCommand);
46
48
  program.addCommand(orchestratorCommand);
47
49
  program.addCommand(cloudCommand);
@@ -63,10 +65,12 @@ function printIntro(version) {
63
65
  console.log(` ${c.dim("$")} npx -y summer-engine@latest setup claude-code --yes`);
64
66
  console.log(` ${c.dim("$")} npx -y summer-engine@latest create 3d-basic my-game`);
65
67
  console.log(` ${c.dim("$")} npx -y summer-engine@latest plan make a small arena shooter`);
68
+ console.log(` ${c.dim("$")} npx -y summer-engine@latest debug "player crashes on pickup"`);
66
69
  console.log(` ${c.dim("$")} npx -y summer-engine@latest memory`);
67
70
  console.log(` ${c.dim("$")} npx -y summer-engine@latest doctor`);
68
71
  console.log("");
69
72
  console.log(` ${c.bold("Slash commands")} ${c.dim("(in your AI agent)")}`);
73
+ console.log(` ${c.brand("/summer debug")} ${c.dim("Create a support-ready debug report")}`);
70
74
  console.log(` ${c.brand("/debug")} ${c.dim("Triage and fix a bug end-to-end")}`);
71
75
  console.log(` ${c.brand("/play")} ${c.dim("Run the game and report state")}`);
72
76
  console.log("");
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const debugCommand: Command;
@@ -0,0 +1,44 @@
1
+ import { Command } from "commander";
2
+ import { createDebugReportArtifact, redactDebugReport } from "../lib/debug-report.js";
3
+ import { c, sym, tildeify } from "../lib/format.js";
4
+ function parsePositiveInt(value, fallback) {
5
+ if (!value)
6
+ return fallback;
7
+ const parsed = Number.parseInt(value, 10);
8
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
9
+ }
10
+ export const debugCommand = new Command("debug")
11
+ .description("Create a support-ready Markdown debug report")
12
+ .argument("[issue...]", "What is broken or surprising?")
13
+ .option("-o, --output <path>", "Write the report to this path")
14
+ .option("--json", "Print JSON with the report path and collected data")
15
+ .option("--play", "Also launch the game briefly and collect post-play diagnostics")
16
+ .option("--no-doctor", "Skip summer doctor checks")
17
+ .option("--max-console-lines <n>", "Console lines to collect", "200")
18
+ .option("--max-debugger-entries <n>", "Debugger entries to collect", "100")
19
+ .option("--play-wait-ms <n>", "Milliseconds to wait after --play starts", "2500")
20
+ .action(async (issueParts, opts) => {
21
+ const issue = issueParts.join(" ").trim();
22
+ const artifact = await createDebugReportArtifact({
23
+ issue,
24
+ outputPath: opts.output,
25
+ includePlaySession: Boolean(opts.play),
26
+ includeDoctor: opts.doctor !== false,
27
+ maxConsoleLines: parsePositiveInt(opts.maxConsoleLines, 200),
28
+ maxDebuggerEntries: parsePositiveInt(opts.maxDebuggerEntries, 100),
29
+ playWaitMs: parsePositiveInt(opts.playWaitMs, 2500),
30
+ });
31
+ if (opts.json) {
32
+ console.log(JSON.stringify({
33
+ ok: true,
34
+ path: artifact.path,
35
+ report: redactDebugReport(artifact.report),
36
+ }, null, 2));
37
+ return;
38
+ }
39
+ console.log("");
40
+ console.log(`${sym.ok()} ${c.bold("Summer debug report created")}`);
41
+ console.log(` ${tildeify(artifact.path)}`);
42
+ console.log("");
43
+ console.log("Review it before sending. It omits auth tokens, but may include local paths and stack traces.");
44
+ });
@@ -3,14 +3,23 @@ import { existsSync } from "fs";
3
3
  import { createRequire } from "node:module";
4
4
  import { platform } from "os";
5
5
  import { Command } from "commander";
6
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
7
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
6
8
  import { getAuthToken, getUserInfo } from "../lib/auth.js";
7
9
  import { isGitAvailable } from "../lib/cloud/checkpoint.js";
8
10
  import { checkEngineHealth, getApiPort, getApiToken } from "../lib/engine.js";
9
11
  import { brandLine, c, pad, sym, tildeify } from "../lib/format.js";
12
+ import { getMcpLogPath } from "../lib/mcp-log.js";
10
13
  import { getProjectMemorySummary } from "../lib/project-memory.js";
11
14
  import { buildCliVersionCheck, buildSkillsVersionCheck, defaultSkillMarkerCandidates, fetchLatestRegistryVersion, } from "../lib/version-check.js";
12
15
  const require = createRequire(import.meta.url);
13
16
  const { version } = require("../../package.json");
17
+ const MIN_EXPECTED_MCP_TOOLS = 50;
18
+ const REQUIRED_MCP_TOOLS = [
19
+ "summer_get_project_context",
20
+ "summer_generate_image",
21
+ "summer_create_debug_report",
22
+ ];
14
23
  const MAC_ENGINE_PATHS = [
15
24
  "/Applications/Summer.app/Contents/MacOS/Summer",
16
25
  `${process.env.HOME}/Applications/Summer.app/Contents/MacOS/Summer`,
@@ -21,7 +30,7 @@ const WIN_ENGINE_PATHS = [
21
30
  `${process.env.PROGRAMFILES}\\Summer Engine\\Summer.exe`,
22
31
  ];
23
32
  export const doctorCommand = new Command("doctor")
24
- .description("Diagnose Node, login, engine, project memory, local API, and MCP boot")
33
+ .description("Diagnose Node, login, engine, project memory, local API, and MCP registration")
25
34
  .option("--json", "Print diagnostics as JSON")
26
35
  .action(async (opts) => {
27
36
  if (!opts.json) {
@@ -53,6 +62,7 @@ export async function runDoctor(options = {}) {
53
62
  checks.push(await checkLocalApi());
54
63
  checks.push(await checkProjectMemory());
55
64
  checks.push(await checkMcpBoot());
65
+ checks.push(await checkMcpToolsList());
56
66
  const result = summarizeChecks(checks);
57
67
  if (!options.quiet) {
58
68
  if (options.json) {
@@ -237,8 +247,8 @@ async function checkProjectMemory() {
237
247
  };
238
248
  }
239
249
  async function checkMcpBoot() {
240
- const cliPath = process.argv[1];
241
- if (!cliPath) {
250
+ const resolved = resolveCurrentMcpCommand();
251
+ if (!resolved) {
242
252
  return {
243
253
  id: "mcp-boot",
244
254
  label: "MCP Server",
@@ -247,9 +257,7 @@ async function checkMcpBoot() {
247
257
  };
248
258
  }
249
259
  return new Promise((resolve) => {
250
- const command = cliPath.endsWith(".js") ? process.execPath : cliPath;
251
- const args = cliPath.endsWith(".js") ? [cliPath, "mcp"] : ["mcp"];
252
- const child = spawn(command, args, {
260
+ const child = spawn(resolved.command, resolved.args, {
253
261
  env: process.env,
254
262
  stdio: ["pipe", "pipe", "pipe"],
255
263
  });
@@ -269,7 +277,7 @@ async function checkMcpBoot() {
269
277
  label: "MCP Server",
270
278
  status: "fail",
271
279
  message: "MCP server did not finish startup within 3 seconds.",
272
- details: trimOutput({ stdout, stderr }),
280
+ details: { ...trimOutput({ stdout, stderr }), ...resolved },
273
281
  });
274
282
  }, 3000);
275
283
  child.stderr.on("data", (chunk) => {
@@ -281,6 +289,7 @@ async function checkMcpBoot() {
281
289
  label: "MCP Server",
282
290
  status: "ok",
283
291
  message: "ready",
292
+ details: { ...resolved },
284
293
  });
285
294
  }
286
295
  });
@@ -294,6 +303,7 @@ async function checkMcpBoot() {
294
303
  label: "MCP Server",
295
304
  status: "fail",
296
305
  message: `Could not start MCP server: ${error.message}`,
306
+ details: { ...resolved },
297
307
  });
298
308
  });
299
309
  child.on("exit", (code) => {
@@ -304,12 +314,106 @@ async function checkMcpBoot() {
304
314
  label: "MCP Server",
305
315
  status: "fail",
306
316
  message: `MCP server exited before reporting readiness${code === null ? "" : ` (code ${code})`}.`,
307
- details: trimOutput({ stdout, stderr }),
317
+ details: { ...trimOutput({ stdout, stderr }), ...resolved },
308
318
  });
309
319
  }
310
320
  });
311
321
  });
312
322
  }
323
+ function resolveCurrentMcpCommand() {
324
+ const cliPath = process.argv[1];
325
+ if (!cliPath)
326
+ return null;
327
+ return cliPath.endsWith(".js")
328
+ ? { command: process.execPath, args: [cliPath, "mcp"] }
329
+ : { command: cliPath, args: ["mcp"] };
330
+ }
331
+ function inheritedEnv(extra = {}) {
332
+ const env = {};
333
+ for (const [key, value] of Object.entries(process.env)) {
334
+ if (value !== undefined)
335
+ env[key] = value;
336
+ }
337
+ return { ...env, ...extra };
338
+ }
339
+ async function checkMcpToolsList() {
340
+ const resolved = resolveCurrentMcpCommand();
341
+ if (!resolved) {
342
+ return {
343
+ id: "mcp-tools-list",
344
+ label: "MCP Tools",
345
+ status: "fail",
346
+ message: "Could not resolve the current Summer CLI entrypoint.",
347
+ };
348
+ }
349
+ const client = new Client({ name: "summer-doctor", version });
350
+ const transport = new StdioClientTransport({
351
+ ...resolved,
352
+ env: inheritedEnv({ SUMMER_MCP_DOCTOR: "1" }),
353
+ stderr: "pipe",
354
+ });
355
+ let stderr = "";
356
+ transport.stderr?.on("data", (chunk) => {
357
+ stderr += Buffer.isBuffer(chunk) ? chunk.toString("utf-8") : String(chunk);
358
+ });
359
+ try {
360
+ await client.connect(transport, { timeout: 5000 });
361
+ const listed = await client.listTools(undefined, { timeout: 5000 });
362
+ const toolNames = listed.tools.map((tool) => tool.name).sort();
363
+ const missing = REQUIRED_MCP_TOOLS.filter((tool) => !toolNames.includes(tool));
364
+ const details = {
365
+ ...resolved,
366
+ toolCount: toolNames.length,
367
+ requiredTools: REQUIRED_MCP_TOOLS,
368
+ missing,
369
+ server: client.getServerVersion(),
370
+ stderr: stderr.trim().slice(-1000),
371
+ logPath: getMcpLogPath(),
372
+ };
373
+ if (missing.length > 0) {
374
+ return {
375
+ id: "mcp-tools-list",
376
+ label: "MCP Tools",
377
+ status: "fail",
378
+ message: `missing required tools: ${missing.join(", ")}`,
379
+ details,
380
+ };
381
+ }
382
+ if (toolNames.length < MIN_EXPECTED_MCP_TOOLS) {
383
+ return {
384
+ id: "mcp-tools-list",
385
+ label: "MCP Tools",
386
+ status: "fail",
387
+ message: `only ${toolNames.length} tools listed; expected ${MIN_EXPECTED_MCP_TOOLS}+`,
388
+ details,
389
+ };
390
+ }
391
+ return {
392
+ id: "mcp-tools-list",
393
+ label: "MCP Tools",
394
+ status: "ok",
395
+ message: `${toolNames.length} tools registered`,
396
+ details,
397
+ };
398
+ }
399
+ catch (error) {
400
+ return {
401
+ id: "mcp-tools-list",
402
+ label: "MCP Tools",
403
+ status: "fail",
404
+ message: `protocol handshake/list failed: ${error instanceof Error ? error.message : String(error)}`,
405
+ details: {
406
+ ...resolved,
407
+ stderr: stderr.trim().slice(-1000),
408
+ logPath: getMcpLogPath(),
409
+ },
410
+ };
411
+ }
412
+ finally {
413
+ await client.close().catch(() => undefined);
414
+ await transport.close().catch(() => undefined);
415
+ }
416
+ }
313
417
  function summarizeChecks(checks) {
314
418
  const summary = {
315
419
  ok: checks.filter((check) => check.status === "ok").length,
@@ -367,7 +367,7 @@ function renderRuleBody(skill) {
367
367
 
368
368
  ${skill.description}
369
369
 
370
- Use Summer MCP tools for scene, editor, asset, play, and diagnostics operations. Use the host agent's normal file editing tools for scripts and other text files.
370
+ Use Summer MCP tools for project files, scenes, editor state, assets, play, and diagnostics. Read project text with summer_read_file and mutate it with summer_replace_text or guarded summer_write_file.
371
371
 
372
372
  ## Skill
373
373