summer-engine 4.3.0 → 4.6.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 (231) 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 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  6. package/AGENTS.md +2 -2
  7. package/CHANGELOG.md +100 -0
  8. package/README.md +67 -27
  9. package/commands/start.md +19 -15
  10. package/commands/summer.md +1 -0
  11. package/dist/cli/command-usage.d.ts +3 -1
  12. package/dist/cli/command-usage.js +10 -4
  13. package/dist/cli/commands/create.d.ts +1 -25
  14. package/dist/cli/commands/create.js +10 -138
  15. package/dist/cli/commands/dev.d.ts +66 -0
  16. package/dist/cli/commands/dev.js +234 -0
  17. package/dist/cli/commands/install.d.ts +15 -58
  18. package/dist/cli/commands/install.js +31 -481
  19. package/dist/cli/commands/login.js +1 -1
  20. package/dist/cli/commands/ops.d.ts +17 -1
  21. package/dist/cli/commands/ops.js +97 -9
  22. package/dist/cli/commands/preview.d.ts +58 -0
  23. package/dist/cli/commands/preview.js +181 -0
  24. package/dist/cli/commands/run.d.ts +1 -17
  25. package/dist/cli/commands/run.js +17 -206
  26. package/dist/cli/commands/setup.js +175 -32
  27. package/dist/cli/index.js +5 -0
  28. package/dist/core/agent-host.d.ts +3 -0
  29. package/dist/core/agent-host.js +1 -1
  30. package/dist/core/api-client.d.ts +10 -2
  31. package/dist/core/api-client.js +13 -8
  32. package/dist/core/capabilities/agent-playbook.js +1 -0
  33. package/dist/core/capabilities/apps.d.ts +9 -9
  34. package/dist/core/capabilities/asset-import.d.ts +4 -1
  35. package/dist/core/capabilities/asset-import.js +15 -6
  36. package/dist/core/capabilities/capture-gameplay.js +1 -1
  37. package/dist/core/capabilities/connect-signal.d.ts +2 -2
  38. package/dist/core/capabilities/content-make/index.d.ts +81 -0
  39. package/dist/core/capabilities/content-make/index.js +706 -0
  40. package/dist/core/capabilities/content-make/media.d.ts +57 -0
  41. package/dist/core/capabilities/content-make/media.js +172 -0
  42. package/dist/core/capabilities/content-make/plan.d.ts +130 -0
  43. package/dist/core/capabilities/content-make/plan.js +433 -0
  44. package/dist/core/capabilities/content-make/render.d.ts +64 -0
  45. package/dist/core/capabilities/content-make/render.js +370 -0
  46. package/dist/core/capabilities/content-make/study.d.ts +13 -0
  47. package/dist/core/capabilities/content-make/study.js +165 -0
  48. package/dist/core/capabilities/content-make/types.d.ts +173 -0
  49. package/dist/core/capabilities/content-make/types.js +6 -0
  50. package/dist/core/capabilities/content-make/voice.d.ts +7 -0
  51. package/dist/core/capabilities/content-make/voice.js +27 -0
  52. package/dist/core/capabilities/events.d.ts +2 -2
  53. package/dist/core/capabilities/export-game.d.ts +4 -1
  54. package/dist/core/capabilities/export-game.js +4 -3
  55. package/dist/core/capabilities/export-presets.d.ts +2 -1
  56. package/dist/core/capabilities/export-presets.js +2 -1
  57. package/dist/core/capabilities/go-live.d.ts +14 -0
  58. package/dist/core/capabilities/go-live.js +408 -0
  59. package/dist/core/capabilities/image-generation.d.ts +6 -6
  60. package/dist/core/capabilities/item-manifest.d.ts +92 -0
  61. package/dist/core/capabilities/item-manifest.js +247 -0
  62. package/dist/core/capabilities/placement.d.ts +7 -7
  63. package/dist/core/capabilities/projects-local.d.ts +68 -0
  64. package/dist/core/capabilities/projects-local.js +172 -0
  65. package/dist/core/capabilities/publish-build.d.ts +13 -2
  66. package/dist/core/capabilities/publish-build.js +87 -21
  67. package/dist/core/capabilities/publish-download.js +1 -1
  68. package/dist/core/capabilities/runtime-control.d.ts +7 -2
  69. package/dist/core/capabilities/runtime-control.js +27 -1
  70. package/dist/core/capabilities/seeing/args.d.ts +2 -2
  71. package/dist/core/capabilities/store-checks.d.ts +45 -0
  72. package/dist/core/capabilities/store-checks.js +85 -0
  73. package/dist/core/capabilities/store-details.d.ts +37 -0
  74. package/dist/core/capabilities/store-details.js +94 -0
  75. package/dist/core/capabilities/summer-bundle.d.ts +21 -2
  76. package/dist/core/capabilities/summer-bundle.js +54 -7
  77. package/dist/core/capabilities/sync-items.d.ts +89 -0
  78. package/dist/core/capabilities/sync-items.js +352 -0
  79. package/dist/core/capabilities/tool-dispatch.js +66 -6
  80. package/dist/core/capabilities/video-ogv.d.ts +49 -0
  81. package/dist/core/capabilities/video-ogv.js +260 -0
  82. package/dist/core/capability-skew.js +2 -2
  83. package/dist/core/cli-usage-beacon.js +26 -2
  84. package/dist/core/cli-usage.d.ts +5 -2
  85. package/dist/core/cli-usage.js +8 -2
  86. package/dist/core/engine-install.d.ts +53 -0
  87. package/dist/core/engine-install.js +93 -0
  88. package/dist/core/engine-installer.d.ts +134 -0
  89. package/dist/core/engine-installer.js +760 -0
  90. package/dist/core/engine-launch.d.ts +126 -0
  91. package/dist/core/engine-launch.js +398 -0
  92. package/dist/core/engine-self-start.d.ts +63 -0
  93. package/dist/core/engine-self-start.js +282 -0
  94. package/dist/core/engine.d.ts +7 -1
  95. package/dist/core/engine.js +9 -2
  96. package/dist/core/error-codes.d.ts +4 -1
  97. package/dist/core/error-codes.js +7 -3
  98. package/dist/core/library-read.d.ts +2 -2
  99. package/dist/core/library-search.d.ts +2 -2
  100. package/dist/core/local-project.d.ts +50 -0
  101. package/dist/core/local-project.js +234 -0
  102. package/dist/core/ops/areas.js +9 -3
  103. package/dist/core/ops/catalog.d.ts +9 -0
  104. package/dist/core/ops/catalog.js +56 -4
  105. package/dist/core/ops/engine-answer.d.ts +4 -1
  106. package/dist/core/ops/engine-answer.js +16 -3
  107. package/dist/core/ops/engine.js +4 -4
  108. package/dist/core/ops/save-files.d.ts +6 -1
  109. package/dist/core/ops/save-files.js +67 -50
  110. package/dist/core/ops/search.js +9 -2
  111. package/dist/core/preview/input.d.ts +35 -0
  112. package/dist/core/preview/input.js +105 -0
  113. package/dist/core/preview/launch-config.d.ts +52 -0
  114. package/dist/core/preview/launch-config.js +137 -0
  115. package/dist/core/preview/page.d.ts +22 -0
  116. package/dist/core/preview/page.js +232 -0
  117. package/dist/core/preview/preview-source.d.ts +179 -0
  118. package/dist/core/preview/preview-source.js +350 -0
  119. package/dist/core/preview/server.d.ts +26 -0
  120. package/dist/core/preview/server.js +218 -0
  121. package/dist/core/telemetry.d.ts +20 -16
  122. package/dist/core/telemetry.js +92 -16
  123. package/dist/core/templates.d.ts +20 -0
  124. package/dist/core/templates.js +300 -3
  125. package/dist/core/tool-profiles.d.ts +2 -2
  126. package/dist/core/tool-profiles.js +1 -0
  127. package/dist/core/usage-fields.d.ts +41 -0
  128. package/dist/core/usage-fields.js +150 -0
  129. package/dist/core/util/sleep.d.ts +3 -0
  130. package/dist/core/util/sleep.js +12 -0
  131. package/dist/installer/agent-config.d.ts +29 -0
  132. package/dist/installer/agent-config.js +75 -11
  133. package/dist/installer/agent-detect.d.ts +44 -0
  134. package/dist/installer/agent-detect.js +166 -0
  135. package/dist/installer/agent-table.d.ts +19 -0
  136. package/dist/installer/agent-table.js +130 -0
  137. package/dist/installer/setup-error.d.ts +19 -0
  138. package/dist/installer/setup-error.js +34 -0
  139. package/dist/installer/version-check.d.ts +5 -0
  140. package/dist/installer/version-check.js +21 -0
  141. package/dist/mcp/ops-surface.d.ts +7 -0
  142. package/dist/mcp/ops-surface.js +40 -3
  143. package/dist/mcp/server.d.ts +14 -4
  144. package/dist/mcp/server.js +42 -8
  145. package/dist/mcp/tool-surface.d.ts +8 -0
  146. package/dist/mcp/tool-surface.js +19 -2
  147. package/dist/mcp/tools/creator-tools.js +92 -14
  148. package/dist/mcp/tools/debug-tools.js +2 -0
  149. package/dist/mcp/tools/local-project-tools.d.ts +6 -0
  150. package/dist/mcp/tools/local-project-tools.js +33 -0
  151. package/dist/mcp/tools/navigation-tools.js +2 -1
  152. package/dist/mcp/tools/project-tools.js +5 -8
  153. package/dist/mcp/tools/seeing-tools.js +1 -1
  154. package/dist/mcp/tools/visual-tools.js +1 -1
  155. package/dist/mcp/tools/with-engine.js +1 -1
  156. package/dist/project-memory/agent-instructions.js +11 -3
  157. package/gemini-extension.json +3 -1
  158. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -5
  159. package/library/skills/README.md +12 -8
  160. package/library/skills/animated-loop/SKILL.md +10 -16
  161. package/library/skills/cinematic-cutscene/SKILL.md +7 -18
  162. package/library/skills/headless-scripting/SKILL.md +7 -4
  163. package/library/skills/in-game-purchases/SKILL.md +25 -8
  164. package/library/skills/in-game-purchases/resource.yaml +2 -1
  165. package/library/skills/launch-ready/SKILL.md +351 -0
  166. package/library/skills/launch-ready/resource.yaml +45 -0
  167. package/library/skills/make-content/SKILL.md +202 -0
  168. package/library/skills/make-content/resource.yaml +32 -0
  169. package/library/skills/make-game/SKILL.md +6 -4
  170. package/library/skills/make-game/resource.yaml +2 -1
  171. package/library/skills/navigate-summer/SKILL.md +4 -2
  172. package/library/skills/new-project/SKILL.md +15 -22
  173. package/library/skills/new-project/resource.yaml +2 -1
  174. package/library/skills/painted-25d-world/SKILL.md +366 -0
  175. package/library/skills/painted-25d-world/_building-blocks/blender-route.md +33 -0
  176. package/library/skills/painted-25d-world/_building-blocks/blockout_builder.gd +149 -0
  177. package/library/skills/painted-25d-world/_building-blocks/capture_paint_view.gd +32 -0
  178. package/library/skills/painted-25d-world/_building-blocks/paint_projection.gdshader +23 -0
  179. package/library/skills/painted-25d-world/_building-blocks/paintcam_check.gd +25 -0
  180. package/library/skills/painted-25d-world/_building-blocks/painted_door.gd +17 -0
  181. package/library/skills/painted-25d-world/_building-blocks/painted_location.gd +56 -0
  182. package/library/skills/painted-25d-world/_building-blocks/painted_player.gd +125 -0
  183. package/library/skills/painted-25d-world/_building-blocks/painted_world.gd +111 -0
  184. package/library/skills/painted-25d-world/_building-blocks/tools/cam.py +57 -0
  185. package/library/skills/painted-25d-world/_building-blocks/tools/detail4k.py +81 -0
  186. package/library/skills/painted-25d-world/_building-blocks/tools/overlay.py +17 -0
  187. package/library/skills/painted-25d-world/_building-blocks/tools/preview.py +60 -0
  188. package/library/skills/painted-25d-world/resource.yaml +39 -0
  189. package/library/skills/publish-your-game/SKILL.md +13 -14
  190. package/library/skills/publish-your-game/resource.yaml +4 -3
  191. package/library/skills/release-checklist/SKILL.md +188 -0
  192. package/library/skills/release-checklist/resource.yaml +40 -0
  193. package/library/skills/release-readiness/SKILL.md +1 -1
  194. package/library/skills/release-readiness/resource.yaml +1 -1
  195. package/library/skills/store-art/SKILL.md +1 -1
  196. package/library/skills/store-art/resource.yaml +1 -1
  197. package/library/skills/store-listing/SKILL.md +1 -1
  198. package/library/skills/store-listing/resource.yaml +1 -1
  199. package/library/skills/summer-cli/SKILL.md +2 -0
  200. package/library/skills/summer-store/SKILL.md +295 -39
  201. package/library/skills/summer-store/resource.yaml +9 -3
  202. package/library/skills/trailer-shot/SKILL.md +3 -3
  203. package/library/templates/README.md +5 -0
  204. package/library/tools/content-make/resource.yaml +132 -0
  205. package/library/tools/frame-shot/GUIDE.md +1 -1
  206. package/library/tools/go-live/resource.yaml +67 -0
  207. package/library/tools/import-from-url/GUIDE.md +1 -0
  208. package/library/tools/import-from-url-batch/GUIDE.md +1 -1
  209. package/library/tools/play/GUIDE.md +2 -0
  210. package/library/tools/projects-create-local/resource.yaml +55 -0
  211. package/library/tools/projects-open-local/resource.yaml +51 -0
  212. package/library/tools/publish-build/resource.yaml +3 -3
  213. package/library/tools/screenshot/GUIDE.md +1 -1
  214. package/library/tools/store-set-details/resource.yaml +114 -0
  215. package/library/tools/sync-items/resource.yaml +72 -0
  216. package/package.json +1 -1
  217. package/registry/generated/aliases.json +6 -0
  218. package/registry/generated/counts.json +3 -3
  219. package/registry/generated/gemini-extension.json +3 -1
  220. package/registry/generated/index.json +463 -37
  221. package/registry/generated/marketplace.claude.json +1 -1
  222. package/registry/generated/plugin.claude-directory.json +4 -2
  223. package/registry/generated/plugin.claude.json +3 -1
  224. package/registry/generated/plugin.codex.json +5 -3
  225. package/registry/generated/plugin.cursor.json +4 -2
  226. package/registry/generated/plugin.factory.json +4 -2
  227. package/registry/generated/server.json +2 -2
  228. package/registry/generated/skills-index.md +12 -8
  229. package/registry/generated/skills-registry.json +62 -5
  230. package/registry/operations/legacy-names.json +40 -0
  231. package/registry/operations/public-catalog.json +10144 -387
@@ -114,6 +114,11 @@ const SPECS = [
114
114
  signIn: (name) => `In Claude Code, run /mcp, choose ${name} and sign in.`,
115
115
  },
116
116
  mcp: { user: home(".claude.json"), project: project(".mcp.json") },
117
+ detect: {
118
+ // The native installer puts claude in ~/.local/bin (macOS and Windows); older npm installs in ~/.claude/local.
119
+ bins: ["claude"],
120
+ dirs: (ctx) => [join(ctx.home, ".claude"), join(ctx.home, ".claude.json")],
121
+ },
117
122
  restart: "Restart Claude Code or run /mcp in a new session.",
118
123
  skills: skillDirs(home(".claude", "skills"), project(".claude", "skills")),
119
124
  },
@@ -129,6 +134,12 @@ const SPECS = [
129
134
  user: (ctx) => join(appConfigRoot(ctx), "Claude", "claude_desktop_config.json"),
130
135
  project: null,
131
136
  },
137
+ detect: {
138
+ macApps: ["Claude.app"],
139
+ // Squirrel install: %LOCALAPPDATA%/AnthropicClaude/claude.exe.
140
+ winApps: [join("AnthropicClaude", "claude.exe")],
141
+ dirs: (ctx) => [join(appConfigRoot(ctx), "Claude")],
142
+ },
132
143
  restart: "Quit and reopen Claude Desktop; the summer-engine tools appear under the tools menu in a new chat.",
133
144
  skills: null,
134
145
  noSkillsNote: "Claude Desktop has no skills folder. The MCP server ships summer_docs_search and summer_docs_read, so the model can pull Summer guidance in-chat.",
@@ -150,6 +161,12 @@ const SPECS = [
150
161
  project: project(".codex", "config.toml"),
151
162
  projectNote: "Codex only loads project .codex/config.toml from trusted projects.",
152
163
  },
164
+ detect: {
165
+ // The codex CLI (npm or Homebrew) and the Codex desktop app share $CODEX_HOME (default ~/.codex).
166
+ bins: ["codex"],
167
+ macApps: ["Codex.app"],
168
+ dirs: (ctx) => [ctx.env.CODEX_HOME || join(ctx.home, ".codex")],
169
+ },
153
170
  restart: "Restart Codex or run /mcp in a new session.",
154
171
  skills: sharedSkills(),
155
172
  },
@@ -165,6 +182,12 @@ const SPECS = [
165
182
  signIn: (name) => `In Cursor Settings, open MCP and click Connect (or Authenticate) next to ${name}.`,
166
183
  },
167
184
  mcp: { user: home(".cursor", "mcp.json"), project: project(".cursor", "mcp.json") },
185
+ detect: {
186
+ bins: ["cursor", "cursor-agent"],
187
+ macApps: ["Cursor.app"],
188
+ winApps: [join("Programs", "cursor", "Cursor.exe")],
189
+ dirs: (ctx) => [join(ctx.home, ".cursor")],
190
+ },
168
191
  restart: "Restart Cursor and enable the summer-engine MCP server if prompted.",
169
192
  skills: sharedSkills({
170
193
  reloadHint: "Cursor loads skills in the next chat. Summer 3.0 wrote rule files to .cursor/rules and 3.1.0 wrote .cursor/skills; `--force` removes both.",
@@ -189,6 +212,12 @@ const SPECS = [
189
212
  project: null,
190
213
  movedFrom: home(".codeium", "windsurf", "mcp_config.json"),
191
214
  },
215
+ detect: {
216
+ bins: ["windsurf", "devin"],
217
+ macApps: ["Windsurf.app", "Devin.app"],
218
+ winApps: [join("Programs", "Windsurf", "Windsurf.exe"), join("Programs", "Devin", "Devin.exe")],
219
+ dirs: (ctx) => [join(xdgOrAppData(ctx), "devin"), join(ctx.home, ".codeium", "windsurf")],
220
+ },
192
221
  restart: "Restart Devin Desktop (formerly Windsurf) and refresh MCP servers from the agent settings. Devin's docs say mcp_config.json configures the Cascade agent; for the Devin agent add the server in the app's MCP settings with the same command.",
193
222
  skills: sharedSkills({ legacyDirs: { user: home(".codeium", "windsurf", "skills"), project: project(".windsurf", "skills") } }),
194
223
  },
@@ -207,6 +236,12 @@ const SPECS = [
207
236
  user: home(".gemini", "config", "mcp_config.json"),
208
237
  project: project(".agents", "mcp_config.json"),
209
238
  },
239
+ detect: {
240
+ bins: ["antigravity", "agy"],
241
+ macApps: ["Antigravity.app"],
242
+ winApps: [join("Programs", "Antigravity", "Antigravity.exe")],
243
+ dirs: (ctx) => [join(ctx.home, ".gemini", "antigravity"), join(ctx.home, ".gemini", "config")],
244
+ },
210
245
  restart: "In Antigravity open the agent panel's MCP servers view and refresh; summer-engine appears in the list (IDE and CLI share this file).",
211
246
  skills: skillDirs(home(".gemini", "config", "skills"), project(".agents", "skills")),
212
247
  },
@@ -223,6 +258,7 @@ const SPECS = [
223
258
  user: home(".gemini", "extensions", "summer-engine", "gemini-extension.json"),
224
259
  project: null,
225
260
  },
261
+ detect: { bins: ["gemini"], dirs: (ctx) => [join(ctx.home, ".gemini", "extensions")] },
226
262
  restart: "Run `summer skills install --all --agent gemini` if skills were not installed, then restart Gemini CLI (or `gemini extensions enable summer-engine` if it is disabled).",
227
263
  skills: skillDirs(home(".gemini", "extensions", "summer-engine", "skills"), null),
228
264
  },
@@ -241,6 +277,11 @@ const SPECS = [
241
277
  user: (ctx) => vsCodeGlobalStorage(ctx, "saoudrizwan.claude-dev", "cline_mcp_settings.json"),
242
278
  project: null,
243
279
  },
280
+ detect: {
281
+ // A VS Code extension: its install folder, or the storage it makes on first run.
282
+ vscodeExtensions: ["saoudrizwan.claude-dev-"],
283
+ dirs: (ctx) => [join(vsCodeUserDir(ctx), "globalStorage", "saoudrizwan.claude-dev")],
284
+ },
244
285
  restart: "Restart VS Code so Cline reloads its MCP config.",
245
286
  skills: skillDirs(home(".cline", "skills"), project(".cline", "skills")),
246
287
  },
@@ -256,6 +297,7 @@ const SPECS = [
256
297
  signIn: (name) => `Run \`cline mcp\`, pick ${name} and choose Authorize OAuth.`,
257
298
  },
258
299
  mcp: { user: home(".cline", "data", "settings", "cline_mcp_settings.json"), project: null },
300
+ detect: { bins: ["cline"], dirs: (ctx) => [join(ctx.home, ".cline", "data")] },
259
301
  restart: "Restart the Cline CLI so it reloads its MCP settings.",
260
302
  skills: skillDirs(home(".cline", "skills"), project(".cline", "skills")),
261
303
  },
@@ -272,6 +314,10 @@ const SPECS = [
272
314
  user: (ctx) => vsCodeGlobalStorage(ctx, "rooveterinaryinc.roo-cline", "cline_mcp_settings.json"),
273
315
  project: null,
274
316
  },
317
+ detect: {
318
+ vscodeExtensions: ["rooveterinaryinc.roo-cline-"],
319
+ dirs: (ctx) => [join(vsCodeUserDir(ctx), "globalStorage", "rooveterinaryinc.roo-cline")],
320
+ },
275
321
  restart: "Restart VS Code so Roo Code reloads its MCP config.",
276
322
  skills: {
277
323
  kind: "cline-rule-dir",
@@ -295,6 +341,12 @@ const SPECS = [
295
341
  user: (ctx) => join(xdgOrAppData(ctx), "kilo", "kilo.json"),
296
342
  project: project("kilo.json"),
297
343
  },
344
+ detect: {
345
+ // The kilo CLI, or the VS Code extension.
346
+ bins: ["kilo", "kilocode"],
347
+ vscodeExtensions: ["kilocode.kilo-code-"],
348
+ dirs: (ctx) => [join(xdgOrAppData(ctx), "kilo"), join(ctx.home, ".kilo")],
349
+ },
298
350
  restart: "Restart Kilo (CLI or the VS Code extension) so it reloads kilo.json.",
299
351
  skills: skillDirs(home(".kilo", "skills"), project(".kilo", "skills")),
300
352
  },
@@ -310,6 +362,7 @@ const SPECS = [
310
362
  signIn: (name) => `Copilot CLI opens summer.games to sign in when ${name} first connects; /mcp signs in again.`,
311
363
  },
312
364
  mcp: { user: home(".copilot", "mcp-config.json"), project: project(".mcp.json") },
365
+ detect: { bins: ["copilot"], dirs: (ctx) => [join(ctx.home, ".copilot")] },
313
366
  restart: "Restart Copilot CLI, or run /mcp reload and /skills reload in the active session.",
314
367
  skills: skillDirs(home(".copilot", "skills"), project(".github", "skills")),
315
368
  },
@@ -327,6 +380,13 @@ const SPECS = [
327
380
  signIn: (name) => `In VS Code, click Allow when ${name} asks to authenticate, then sign in on summer.games.`,
328
381
  },
329
382
  mcp: { user: (ctx) => join(vsCodeUserDir(ctx), "mcp.json"), project: project(".vscode", "mcp.json") },
383
+ detect: {
384
+ // Copilot Chat ships with VS Code, so VS Code itself is the signal.
385
+ bins: ["code"],
386
+ macApps: ["Visual Studio Code.app"],
387
+ winApps: [join("Programs", "Microsoft VS Code", "Code.exe"), join("Microsoft VS Code", "Code.exe")],
388
+ dirs: (ctx) => [vsCodeUserDir(ctx)],
389
+ },
330
390
  restart: "Restart VS Code or run MCP: List Servers, then start summer-engine in Copilot Agent mode.",
331
391
  skills: sharedSkills({ legacyDirs: { user: home(".copilot", "skills"), project: project(".github", "skills") } }),
332
392
  },
@@ -339,6 +399,10 @@ const SPECS = [
339
399
  format: "json-vscode",
340
400
  // No Summer Games entry: Visual Studio's OAuth redirect for MCP is not documented; not checked against api.summer.games.
341
401
  mcp: { user: home(".mcp.json"), project: project(".mcp.json") },
402
+ detect: {
403
+ // Windows only (Visual Studio for Mac is retired): the install root under Program Files.
404
+ winApps: [join("Microsoft Visual Studio", "Installer", "vswhere.exe")],
405
+ },
342
406
  restart: "Restart Visual Studio, open Copilot Chat in Agent mode, and enable summer-engine in the tools picker.",
343
407
  skills: null,
344
408
  noSkillsNote: "Visual Studio's Copilot has no skills folder yet; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
@@ -358,6 +422,10 @@ const SPECS = [
358
422
  user: (ctx) => join(xdgOrAppData(ctx), "github-copilot", "intellij", "mcp.json"),
359
423
  project: null,
360
424
  },
425
+ detect: {
426
+ // The Copilot plugin writes its settings here on first run; the IDE itself can be any JetBrains product.
427
+ dirs: (ctx) => [join(xdgOrAppData(ctx), "github-copilot", "intellij")],
428
+ },
361
429
  restart: "Restart the JetBrains IDE and open Copilot Chat in Agent mode; summer-engine shows in the tools list.",
362
430
  skills: null,
363
431
  noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
@@ -377,6 +445,12 @@ const SPECS = [
377
445
  user: (ctx) => join(xdgOrAppData(ctx), "opencode", "opencode.json"),
378
446
  project: project("opencode.json"),
379
447
  },
448
+ detect: {
449
+ // The install script puts opencode in ~/.opencode/bin.
450
+ bins: ["opencode"],
451
+ macApps: ["OpenCode.app"],
452
+ dirs: (ctx) => [join(xdgOrAppData(ctx), "opencode"), join(ctx.home, ".opencode")],
453
+ },
380
454
  restart: "Restart OpenCode so it reloads opencode.json.",
381
455
  skills: sharedSkills({
382
456
  reloadHint: "OpenCode loads skills from this folder on the next session. Summer 3.0 wrote markdown under agents/summer and 3.1.0 wrote opencode/skills; `--force` removes both.",
@@ -399,6 +473,12 @@ const SPECS = [
399
473
  user: (ctx) => join(xdgOrAppData(ctx), "zed", "settings.json"),
400
474
  project: null,
401
475
  },
476
+ detect: {
477
+ bins: ["zed"],
478
+ macApps: ["Zed.app", "Zed Preview.app"],
479
+ winApps: [join("Programs", "Zed", "Zed.exe")],
480
+ dirs: (ctx) => [join(xdgOrAppData(ctx), "zed")],
481
+ },
402
482
  restart: "Zed reloads settings.json live; open the Agent panel and check summer-engine under MCP servers.",
403
483
  skills: sharedSkills(),
404
484
  },
@@ -414,6 +494,12 @@ const SPECS = [
414
494
  signIn: (name) => `Kiro opens summer.games to sign in when ${name} connects (Kiro CLI: /mcp auth).`,
415
495
  },
416
496
  mcp: { user: home(".kiro", "settings", "mcp.json"), project: project(".kiro", "settings", "mcp.json") },
497
+ detect: {
498
+ bins: ["kiro", "kiro-cli"],
499
+ macApps: ["Kiro.app"],
500
+ winApps: [join("Programs", "Kiro", "Kiro.exe")],
501
+ dirs: (ctx) => [join(ctx.home, ".kiro")],
502
+ },
417
503
  restart: "Kiro reloads MCP config on save; open the MCP Servers view to confirm summer-engine is connected.",
418
504
  skills: skillDirs(home(".kiro", "skills"), project(".kiro", "skills")),
419
505
  },
@@ -443,6 +529,12 @@ const SPECS = [
443
529
  : join(xdgConfig(ctx), "goose", "config.yaml"),
444
530
  project: null,
445
531
  },
532
+ detect: {
533
+ bins: ["goose"],
534
+ macApps: ["Goose.app"],
535
+ winApps: [join("Programs", "Goose", "Goose.exe")],
536
+ dirs: (ctx) => [ctx.os === "win32" ? join(appData(ctx), "Block", "goose") : join(xdgConfig(ctx), "goose")],
537
+ },
446
538
  restart: "Restart Goose (CLI or Desktop); summer-engine is listed under Extensions.",
447
539
  skills: skillDirs((ctx) => join(xdgConfig(ctx), "agents", "skills"), project(".agents", "skills")),
448
540
  },
@@ -458,6 +550,7 @@ const SPECS = [
458
550
  signIn: (name) => `Run \`hermes mcp login ${name}\`, or sign in on summer.games when Hermes first connects.`,
459
551
  },
460
552
  mcp: { user: home(".hermes", "config.yaml"), project: null },
553
+ detect: { bins: ["hermes"], dirs: (ctx) => [join(ctx.home, ".hermes")] },
461
554
  restart: "Run /reload-mcp in Hermes Agent (or restart it).",
462
555
  skills: skillDirs(home(".hermes", "skills"), SHARED_SKILLS_PROJECT, {
463
556
  reloadHint: "Project skills need `hermes skills trust` before Hermes loads them.",
@@ -480,6 +573,12 @@ const SPECS = [
480
573
  project: project(".trae", "mcp.json"),
481
574
  projectNote: "Trae manages user-level MCP servers in its UI; writing the project file .trae/mcp.json instead.",
482
575
  },
576
+ detect: {
577
+ bins: ["trae"],
578
+ macApps: ["Trae.app"],
579
+ winApps: [join("Programs", "Trae", "Trae.exe")],
580
+ dirs: (ctx) => [join(appConfigRoot(ctx), "Trae"), join(ctx.home, ".trae")],
581
+ },
483
582
  restart: "Restart Trae and open the MCP settings; summer-engine should show as connected.",
484
583
  skills: null,
485
584
  noSkillsNote: "Trae documents no skills folder; the MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
@@ -496,6 +595,7 @@ const SPECS = [
496
595
  signIn: (name) => `In Qwen Code, run /mcp auth ${name} and sign in.`,
497
596
  },
498
597
  mcp: { user: home(".qwen", "settings.json"), project: project(".qwen", "settings.json") },
598
+ detect: { bins: ["qwen"], dirs: (ctx) => [join(ctx.home, ".qwen")] },
499
599
  restart: "Restart Qwen Code or run /mcp in a new session.",
500
600
  skills: skillDirs(home(".qwen", "skills"), project(".qwen", "skills")),
501
601
  },
@@ -511,6 +611,7 @@ const SPECS = [
511
611
  signIn: (name) => `Run \`kimi mcp auth ${name}\`; it opens summer.games to sign in.`,
512
612
  },
513
613
  mcp: { user: home(".kimi-code", "mcp.json"), project: project(".kimi-code", "mcp.json") },
614
+ detect: { bins: ["kimi"], dirs: (ctx) => [join(ctx.home, ".kimi-code"), join(ctx.home, ".kimi")] },
514
615
  restart: "Restart Kimi Code CLI so it reconnects its MCP servers.",
515
616
  skills: sharedSkills({ legacyDirs: { user: home(".kimi-code", "skills"), project: project(".kimi-code", "skills") } }),
516
617
  },
@@ -529,6 +630,7 @@ const SPECS = [
529
630
  user: home(".config", "crush", "crushrc"),
530
631
  project: project(".crushrc"),
531
632
  },
633
+ detect: { bins: ["crush"], dirs: (ctx) => [join(ctx.home, ".config", "crush"), join(ctx.home, ".local", "share", "crush")] },
532
634
  restart: "Restart Crush so it reloads crushrc.",
533
635
  skills: sharedSkills({ legacyDirs: { user: home(".config", "crush", "skills"), project: project(".crush", "skills") } }),
534
636
  },
@@ -544,6 +646,7 @@ const SPECS = [
544
646
  signIn: (name) => `Amp opens summer.games to sign in for ${name} when it starts.`,
545
647
  },
546
648
  mcp: { user: (ctx) => join(xdgOrAppData(ctx), "amp", "settings.json"), project: null },
649
+ detect: { bins: ["amp"], dirs: (ctx) => [join(xdgOrAppData(ctx), "amp")] },
547
650
  restart: "Restart Amp so it reloads settings.json.",
548
651
  skills: sharedSkills({ legacyDirs: { user: (ctx) => join(xdgOrAppData(ctx), "amp", "skills"), project: null } }),
549
652
  },
@@ -559,6 +662,7 @@ const SPECS = [
559
662
  signIn: (name) => `In Droid, run /mcp, choose ${name} and Authenticate.`,
560
663
  },
561
664
  mcp: { user: home(".factory", "mcp.json"), project: project(".factory", "mcp.json") },
665
+ detect: { bins: ["droid"], dirs: (ctx) => [join(ctx.home, ".factory")] },
562
666
  restart: "Restart droid or run /mcp in the active session.",
563
667
  skills: sharedSkills({ legacyDirs: { user: home(".factory", "skills"), project: project(".factory", "skills") } }),
564
668
  },
@@ -574,6 +678,7 @@ const SPECS = [
574
678
  signIn: (name) => `In Junie, run /mcp, open ${name} and choose Authorize.`,
575
679
  },
576
680
  mcp: { user: home(".junie", "mcp", "mcp.json"), project: project(".junie", "mcp", "mcp.json") },
681
+ detect: { bins: ["junie"], dirs: (ctx) => [join(ctx.home, ".junie")] },
577
682
  restart: "Restart the JetBrains IDE so Junie reloads its MCP config.",
578
683
  skills: null,
579
684
  noSkillsNote: "Junie has no skills folder; put project guidance in .junie/guidelines.md. The MCP server ships summer_docs_search and summer_docs_read for in-chat guidance.",
@@ -590,6 +695,11 @@ const SPECS = [
590
695
  signIn: (name) => `Warp opens summer.games to sign in when ${name} starts.`,
591
696
  },
592
697
  mcp: { user: home(".warp", ".mcp.json"), project: project(".warp", ".mcp.json") },
698
+ detect: {
699
+ macApps: ["Warp.app"],
700
+ winApps: [join("Programs", "Warp", "warp.exe")],
701
+ dirs: (ctx) => [join(ctx.home, ".warp")],
702
+ },
593
703
  restart: "Warp detects the file and spawns the server; check Settings > AI > MCP servers.",
594
704
  skills: sharedSkills({ legacyDirs: { user: home(".warp", "skills"), project: project(".warp", "skills") } }),
595
705
  },
@@ -602,6 +712,11 @@ const SPECS = [
602
712
  format: "json-transport",
603
713
  // No Summer Games entry: Rovo Dev CLI has no OAuth sign-in for remote MCP servers (headers only).
604
714
  mcp: { user: home(".rovodev", "mcp.json"), project: null },
715
+ detect: {
716
+ // Rovo Dev runs as `acli rovodev`; acli alone is the Atlassian CLI, so the ~/.rovodev folder is the firmer signal.
717
+ bins: ["acli"],
718
+ dirs: (ctx) => [join(ctx.home, ".rovodev")],
719
+ },
605
720
  restart: "Restart Rovo Dev CLI so it reconnects its MCP servers.",
606
721
  skills: sharedSkills({ legacyDirs: { user: home(".rovodev", "skills"), project: project(".rovodev", "skills") } }),
607
722
  },
@@ -614,6 +729,12 @@ const SPECS = [
614
729
  format: "json",
615
730
  // No Summer Games entry: Qoder's remote-server fields in settings.json are not documented.
616
731
  mcp: { user: home(".qoder", "settings.json"), project: project(".mcp.json") },
732
+ detect: {
733
+ bins: ["qodercli"],
734
+ macApps: ["Qoder.app"],
735
+ winApps: [join("Programs", "Qoder", "Qoder.exe")],
736
+ dirs: (ctx) => [join(ctx.home, ".qoder")],
737
+ },
617
738
  restart: "Restart Qoder CLI so it reloads its MCP settings (the Qoder IDE manages servers in its UI).",
618
739
  skills: skillDirs(home(".qoder", "skills"), project(".qoder", "skills")),
619
740
  },
@@ -629,6 +750,7 @@ const SPECS = [
629
750
  signIn: (name) => `In Grok Build, run /mcps, select ${name} and press i to sign in.`,
630
751
  },
631
752
  mcp: { user: home(".grok", "config.toml"), project: project(".grok", "config.toml") },
753
+ detect: { bins: ["grok"], dirs: (ctx) => [join(ctx.home, ".grok")] },
632
754
  restart: "Restart Grok Build so it reloads config.toml (it also reads ~/.claude.json and .cursor/mcp.json).",
633
755
  skills: sharedSkills({ legacyDirs: { user: home(".grok", "skills"), project: project(".grok", "skills") } }),
634
756
  },
@@ -644,6 +766,7 @@ const SPECS = [
644
766
  signIn: (name) => `In Vibe, run /mcp login ${name}.`,
645
767
  },
646
768
  mcp: { user: home(".vibe", "config.toml"), project: project(".vibe", "config.toml") },
769
+ detect: { bins: ["vibe"], dirs: (ctx) => [join(ctx.home, ".vibe")] },
647
770
  restart: "Restart Vibe so it reloads config.toml.",
648
771
  skills: skillDirs(home(".vibe", "skills"), SHARED_SKILLS_PROJECT, { legacyDirs: { user: home(".vibe", "skills"), project: project(".vibe", "skills") } }),
649
772
  },
@@ -656,6 +779,13 @@ const SPECS = [
656
779
  format: "json",
657
780
  // No Summer Games entry: LM Studio's MCP client registration is closed and unverified.
658
781
  mcp: { user: home(".lmstudio", "mcp.json"), project: null },
782
+ detect: {
783
+ // The app installs the lms command into ~/.lmstudio/bin.
784
+ bins: ["lms"],
785
+ macApps: ["LM Studio.app"],
786
+ winApps: [join("Programs", "LM Studio", "LM Studio.exe"), join("Programs", "lm-studio", "LM Studio.exe")],
787
+ dirs: (ctx) => [join(ctx.home, ".lmstudio")],
788
+ },
659
789
  restart: "Open LM Studio, toggle on the summer-engine MCP server in the Program tab, and raise the loaded model's context length to 32k or higher.",
660
790
  skills: null,
661
791
  noSkillsNote: "LM Studio has no rules or skills folder. The MCP server ships summer_docs_search and summer_docs_read, so the model can pull Summer guidance in-chat.",
@@ -0,0 +1,19 @@
1
+ /**
2
+ * An error `summer setup` reports with a stable code, so a caller reading
3
+ * `--json` (the Summer desktop installer) can branch on the code instead of
4
+ * the message. The message stays the human sentence it always was.
5
+ */
6
+ export declare class SetupError extends Error {
7
+ readonly code: string;
8
+ constructor(code: string, message: string);
9
+ }
10
+ /**
11
+ * The code for any error a setup step throws: a SetupError's own code, a
12
+ * file-system failure by kind, else `fallback` (the step's generic code).
13
+ */
14
+ export declare function setupErrorCode(error: unknown, fallback: string): string;
15
+ export interface SetupStepError {
16
+ code: string;
17
+ message: string;
18
+ }
19
+ export declare function toStepError(error: unknown, fallback: string): SetupStepError;
@@ -0,0 +1,34 @@
1
+ /**
2
+ * An error `summer setup` reports with a stable code, so a caller reading
3
+ * `--json` (the Summer desktop installer) can branch on the code instead of
4
+ * the message. The message stays the human sentence it always was.
5
+ */
6
+ export class SetupError extends Error {
7
+ code;
8
+ constructor(code, message) {
9
+ super(message);
10
+ this.code = code;
11
+ this.name = "SetupError";
12
+ }
13
+ }
14
+ /** File-system errno codes that mean "this file cannot be written here". */
15
+ const NOT_WRITABLE = new Set(["EACCES", "EPERM", "EROFS", "EISDIR", "ENOTDIR"]);
16
+ /**
17
+ * The code for any error a setup step throws: a SetupError's own code, a
18
+ * file-system failure by kind, else `fallback` (the step's generic code).
19
+ */
20
+ export function setupErrorCode(error, fallback) {
21
+ if (error instanceof SetupError)
22
+ return error.code;
23
+ const errno = error?.code;
24
+ if (typeof errno === "string") {
25
+ if (NOT_WRITABLE.has(errno))
26
+ return "config_not_writable";
27
+ if (errno === "ENOSPC")
28
+ return "disk_full";
29
+ }
30
+ return fallback;
31
+ }
32
+ export function toStepError(error, fallback) {
33
+ return { code: setupErrorCode(error, fallback), message: error instanceof Error ? error.message : String(error) };
34
+ }
@@ -121,6 +121,8 @@ export interface RecordedInstall {
121
121
  * --cli`, or skills installed alone) and `setup --cli` can set the agent
122
122
  * up: the refresh keeps it without an MCP server. */
123
123
  cliOnly?: boolean;
124
+ /** The bundled node executable the entry runs (`setup --runtime <node> --package-dir <dir>`); cliPath is then that package's dist/bin/summer.js. */
125
+ runtime?: string;
124
126
  }
125
127
  /** An npm dist-tag (`latest`, `next`) or an exact version (`3.9.1`). */
126
128
  export type RefreshChannel = string;
@@ -170,6 +172,9 @@ export declare function buildSkillsVersionCheck(input: SkillsVersionCheckInput):
170
172
  * summer-engine entry refreshes with `--cli`, so the refresh adds no MCP server.
171
173
  */
172
174
  export declare function skillsRefreshCommand(agent: string, install: RecordedInstall | null, channel?: RefreshChannel): string;
175
+ /** The shape `summer setup --runtime <node> --package-dir <dir>` writes:
176
+ * `<absolute path to node> <dir>/dist/bin/summer.js mcp` (bundledRuntimeServerConfig). */
177
+ export declare function isBundledRuntimeServerConfig(server: StdioMcpServerConfig): boolean;
173
178
  /** The shape `summer setup --local-dev` writes: `node <…>/dist/bin/summer.js mcp`
174
179
  * (createSummerMcpServerConfig(true)). */
175
180
  export declare function isLocalDevServerConfig(server: StdioMcpServerConfig): boolean;
@@ -405,11 +405,29 @@ export function skillsRefreshCommand(agent, install, channel = "latest") {
405
405
  ? `node ${install.cliPath} setup ${agent} --cli --yes --force`
406
406
  : `npx clear-npx-cache && npx -y summer-engine@${channel} setup ${agent} --cli --yes --force`;
407
407
  }
408
+ if (install?.runtime && install.cliPath) {
409
+ // Keep the bundled runtime: the npx form needs a Node.js the person may not have.
410
+ const packageDir = install.cliPath.replace(/[\\/]dist[\\/]bin[\\/]summer\.js$/, "");
411
+ const runtime = shellArg(install.runtime);
412
+ return `${runtime} ${shellArg(install.cliPath)} setup ${agent} --runtime ${runtime} --package-dir ${shellArg(packageDir)} --yes --force`;
413
+ }
408
414
  if (install?.localDev && install.cliPath) {
409
415
  return `node ${install.cliPath} setup ${agent} --local-dev --yes --force`;
410
416
  }
411
417
  return `npx clear-npx-cache && npx -y summer-engine@${channel} setup ${agent} --yes --force${channel === "latest" ? "" : ` --channel ${channel}`}`;
412
418
  }
419
+ /** A path in a printed command: quoted when it has a space (~/Library/Application Support, C:\\Program Files). */
420
+ function shellArg(value) {
421
+ return /[\s"'$`]/.test(value) ? JSON.stringify(value) : value;
422
+ }
423
+ /** The shape `summer setup --runtime <node> --package-dir <dir>` writes:
424
+ * `<absolute path to node> <dir>/dist/bin/summer.js mcp` (bundledRuntimeServerConfig). */
425
+ export function isBundledRuntimeServerConfig(server) {
426
+ return (/^([a-z]:)?[\\/]/i.test(server.command) &&
427
+ /(^|[\\/])node(\.exe)?$/i.test(server.command) &&
428
+ /[\\/]dist[\\/]bin[\\/]summer\.js$/.test(server.args[0] ?? "") &&
429
+ server.args[1] === "mcp");
430
+ }
413
431
  /** The shape `summer setup --local-dev` writes: `node <…>/dist/bin/summer.js mcp`
414
432
  * (createSummerMcpServerConfig(true)). */
415
433
  export function isLocalDevServerConfig(server) {
@@ -550,6 +568,9 @@ export async function detectRecordedInstall(agent) {
550
568
  const text = existsSync(target.path) ? readFileSync(target.path, "utf-8") : "";
551
569
  const recorded = readRecordedMcpServer(text, target.format);
552
570
  if (recorded) {
571
+ if (isBundledRuntimeServerConfig(recorded)) {
572
+ return { localDev: false, cliPath: recorded.args[0], runtime: recorded.command, source: "agent-config" };
573
+ }
553
574
  const localDev = isLocalDevServerConfig(recorded);
554
575
  return { localDev, cliPath: localDev ? recorded.args[0] ?? null : null, source: "agent-config" };
555
576
  }
@@ -23,6 +23,13 @@ import type { HostedLocalHook } from "./hosted-mount.js";
23
23
  */
24
24
  export declare const SUMMER_SEARCH = "summer_search";
25
25
  export declare const SUMMER_CALL = "summer_call";
26
+ /**
27
+ * The first-game look rule. It opens the engine instructions because clients
28
+ * keep only the start of long server instructions (Codex: the first 512
29
+ * characters), and a project's first frame decides whether the person keeps
30
+ * going. The same rule is in the AGENTS.md block (project-memory/agent-instructions.ts).
31
+ */
32
+ export declare const FIRST_GAME_LOOK_RULE: string;
26
33
  export declare const OPS_MCP_INSTRUCTIONS: string;
27
34
  /** The assets profile's version: no engine tools, so it names none. */
28
35
  export declare const OPS_MCP_ASSETS_INSTRUCTIONS: string;
@@ -4,7 +4,7 @@ import { localEntries, localInputSchema, localWireForm, missingInput } from "../
4
4
  import { answerOfHosted, describeFromShipped, hostedCallFailure, searchEverywhere } from "../core/ops/cloud.js";
5
5
  import { errorAnswer, isLocalOp, legacyNames, localToolsFor, mcpNameOf, resolveOpName } from "../core/ops/contract.js";
6
6
  import { ENGINE_SPLIT_OPS, engineOpDef, isSplitOp, renderOpRefs, splitToolArgs } from "../core/ops/engine.js";
7
- import { answerOfEngineResult, engineFailure, textsOf } from "../core/ops/engine-answer.js";
7
+ import { answerOfEngineResult, codedLocalFailure, engineFailure, textsOf } from "../core/ops/engine-answer.js";
8
8
  import { TAKES_OUT, withOutField } from "../core/ops/save-files.js";
9
9
  import { loadLibraryIndex } from "../core/library-search.js";
10
10
  import { FOOTER_SUFFIX } from "../core/library-read.js";
@@ -29,10 +29,22 @@ import { FOOTER_SUFFIX } from "../core/library-read.js";
29
29
  */
30
30
  export const SUMMER_SEARCH = "summer_search";
31
31
  export const SUMMER_CALL = "summer_call";
32
- export const OPS_MCP_INSTRUCTIONS = "Summer Engine MCP, operation catalog. Call summer_get_project_context first when Summer Engine is open. " +
32
+ /**
33
+ * The first-game look rule. It opens the engine instructions because clients
34
+ * keep only the start of long server instructions (Codex: the first 512
35
+ * characters), and a project's first frame decides whether the person keeps
36
+ * going. The same rule is in the AGENTS.md block (project-memory/agent-instructions.ts).
37
+ */
38
+ export const FIRST_GAME_LOOK_RULE = "First game in a new project: make it look finished, even if they asked for a quick prototype, because the first frame decides if they keep going. " +
39
+ "Keep their features and raise the look: sky and sun with shadows, fog, a texture on every surface, real models for player, characters and props (starter project and summer_assets_search first, never capsules or boxes as final art), one palette, a styled UI font. " +
40
+ "Before you say it is ready, play it and check a screenshot of the running game.";
41
+ export const OPS_MCP_INSTRUCTIONS = "Summer Engine MCP. " +
42
+ FIRST_GAME_LOOK_RULE +
43
+ " Write GDScript files directly; create scenes and import assets through Summer while the project is open. summer_get_project_context tells you which project you are connected to. " +
33
44
  "Listed tools are the common jobs; for anything else, summer_search describes the job in words and returns the operation and its exact input, then summer_call runs it. " +
34
45
  "More than 3 scene edits: one summer_run_script with scenePath. Each engine tool's full guide: summer_docs_read. Long work answers with a job: jobs.wait. " +
35
- "Publishing, prices and other live changes answer needs_approval with a link: give it to the person; nothing changes until they approve.";
46
+ "Going live: skill/release-checklist, then store.go_live with the person's yes; a game is live once Summer's automated checks pass, so never tell anyone to wait for a review. Prices and other live changes may answer needs_approval with a link: give it to the person. " +
47
+ "Opening the Summer editor and playing the game in a window is allowed and expected: summer_play, then summer_screenshot or summer_frame_shot to see it; close what you opened, one editor at a time.";
36
48
  /** The assets profile's version: no engine tools, so it names none. */
37
49
  export const OPS_MCP_ASSETS_INSTRUCTIONS = "Summer MCP, assets profile, operation catalog: generation and the Summer asset library, no engine tools. " +
38
50
  "Read skill/summer-assets with summer_docs_read, then the asset's skill: stop at the file, skip its engine steps. " +
@@ -43,6 +55,8 @@ const DOCS_ALIASES = [
43
55
  ["summer_docs_search", "summer_search_library"],
44
56
  ["summer_docs_read", "summer_read_library"],
45
57
  ];
58
+ /** Local operations listed with the engine tools: they create and open the project the engine tools need, with no shell. */
59
+ const LOCAL_PROJECT_TOOLS = ["summer_projects_create_local", "summer_projects_open_local"];
46
60
  /** Listed with the engine tools although its operation is docs.engine_api: the offline engine class reference. */
47
61
  const ENGINE_REFERENCE = "summer_api_docs";
48
62
  /** Its v4 description, within the 300-character summary rule; the full text stays on the 3.x surface. */
@@ -89,6 +103,9 @@ function answerOfLocal(result, op, effect) {
89
103
  }
90
104
  if (record.isError) {
91
105
  const body = (payload && typeof payload === "object" ? payload : {});
106
+ const coded = codedLocalFailure(body);
107
+ if (coded)
108
+ return coded;
92
109
  const message = typeof body.message === "string" ? body.message : typeof body.error === "string" ? body.error : first.slice(0, 500) || "The tool failed.";
93
110
  const details = { tool: payload };
94
111
  if (/not found|does not exist|no such/i.test(message))
@@ -236,6 +253,26 @@ export function applyOpsSurface(server, options) {
236
253
  }),
237
254
  });
238
255
  }
256
+ // projects.create_local and projects.open_local: the one answer shape, like the engine tools.
257
+ const localProjectTools = options.engine ? LOCAL_PROJECT_TOOLS.filter((name) => tools[name] && entries.has(names[name]?.op ?? "")) : [];
258
+ for (const name of localProjectTools)
259
+ listed.add(name);
260
+ for (const name of localProjectTools) {
261
+ const tool = tools[name];
262
+ const op = names[name].op;
263
+ const entry = entries.get(op);
264
+ const handler = tool.handler;
265
+ rawHandlers.set(name, handler);
266
+ tool.update({
267
+ title: entry.title,
268
+ description: renderOpRefs(entry.summary, toolOf),
269
+ annotations: annotationsForEffect(entry.effect === "read" ? "read" : "write", Boolean(facts.get(name)?.network), entry.title),
270
+ callback: (async (...args) => {
271
+ const raw = await handler(...args);
272
+ return toolResult(answerOfLocal(raw, op, "write"), raw);
273
+ }),
274
+ });
275
+ }
239
276
  // Operations split out of a mixed 3.x tool: their own tool, the 3.x handler with the action fixed.
240
277
  for (const [op, def] of Object.entries(ENGINE_SPLIT_OPS)) {
241
278
  const base = tools[def.tool];
@@ -13,16 +13,26 @@ export declare const getCachedBootDriftNotice: typeof getCachedNotice;
13
13
  * session, before any tool call — the place for the habits end-to-end runs
14
14
  * showed an agent needs on the first turn and would otherwise learn the hard
15
15
  * way, including scripting a run of scene edits instead of hundreds of single
16
- * calls. Kept under 600 characters so it costs a few hundred tokens once; the
16
+ * calls. Kept under 800 characters so it costs a few hundred tokens once; the
17
17
  * full operating guide stays in the summer_agent_playbook prompt /
18
- * summer_get_agent_playbook tool. The last sentence names the publishing path,
19
- * the owner-approval rule and where review feedback is read.
18
+ * summer_get_agent_playbook tool. The publish sentence names the publishing
19
+ * path, the user's confirmation and that going live has no staff wait; the last
20
+ * says an agent may open the editor and play the game in a window.
20
21
  */
21
22
  export declare const SUMMER_MCP_INSTRUCTIONS: string;
22
23
  /** The same first-turn habits for a profile without engine tools (`--profile assets`). */
23
24
  export declare const SUMMER_MCP_ASSETS_INSTRUCTIONS: string;
24
25
  export declare function configureMcpEngineSelection(selection?: EngineSelection): void;
25
- export declare function getClient(): Promise<EngineApiClient>;
26
+ /** The session's editor selection (projects.open_local opens its project). */
27
+ export declare function currentMcpEngineSelection(): EngineSelection | undefined;
28
+ /** Bind the session to the project projects.open_local opened, with the client it connected. */
29
+ export declare function bindMcpProject(projectRoot: string, client: EngineApiClient): void;
30
+ /** The step's log lines go to the MCP log and stderr, never stdout (the protocol). */
31
+ export declare function logEngineSelfStart(line: string): void;
32
+ /** `launch: false`: connect only, never open the editor (summer_open lists and prints with no side effects). */
33
+ export declare function getClient(options?: {
34
+ launch?: boolean;
35
+ }): Promise<EngineApiClient>;
26
36
  export declare function resetClient(): void;
27
37
  /**
28
38
  * Build the MCP server with every Summer tool of the selected profile