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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +3 -1
- package/.codex-plugin/plugin.json +5 -3
- package/.cursor-plugin/plugin.json +4 -2
- package/.factory-plugin/plugin.json +4 -2
- package/AGENTS.md +2 -2
- package/CHANGELOG.md +100 -0
- package/README.md +67 -27
- package/commands/start.md +19 -15
- package/commands/summer.md +1 -0
- package/dist/cli/command-usage.d.ts +3 -1
- package/dist/cli/command-usage.js +10 -4
- package/dist/cli/commands/create.d.ts +1 -25
- package/dist/cli/commands/create.js +10 -138
- package/dist/cli/commands/dev.d.ts +66 -0
- package/dist/cli/commands/dev.js +234 -0
- package/dist/cli/commands/install.d.ts +15 -58
- package/dist/cli/commands/install.js +31 -481
- package/dist/cli/commands/login.js +1 -1
- package/dist/cli/commands/ops.d.ts +17 -1
- package/dist/cli/commands/ops.js +97 -9
- package/dist/cli/commands/preview.d.ts +58 -0
- package/dist/cli/commands/preview.js +181 -0
- package/dist/cli/commands/run.d.ts +1 -17
- package/dist/cli/commands/run.js +17 -206
- package/dist/cli/commands/setup.js +175 -32
- package/dist/cli/index.js +5 -0
- package/dist/core/agent-host.d.ts +3 -0
- package/dist/core/agent-host.js +1 -1
- package/dist/core/api-client.d.ts +10 -2
- package/dist/core/api-client.js +13 -8
- package/dist/core/capabilities/agent-playbook.js +1 -0
- package/dist/core/capabilities/apps.d.ts +9 -9
- package/dist/core/capabilities/asset-import.d.ts +4 -1
- package/dist/core/capabilities/asset-import.js +15 -6
- package/dist/core/capabilities/capture-gameplay.js +1 -1
- package/dist/core/capabilities/connect-signal.d.ts +2 -2
- package/dist/core/capabilities/content-make/index.d.ts +81 -0
- package/dist/core/capabilities/content-make/index.js +706 -0
- package/dist/core/capabilities/content-make/media.d.ts +57 -0
- package/dist/core/capabilities/content-make/media.js +172 -0
- package/dist/core/capabilities/content-make/plan.d.ts +130 -0
- package/dist/core/capabilities/content-make/plan.js +433 -0
- package/dist/core/capabilities/content-make/render.d.ts +64 -0
- package/dist/core/capabilities/content-make/render.js +370 -0
- package/dist/core/capabilities/content-make/study.d.ts +13 -0
- package/dist/core/capabilities/content-make/study.js +165 -0
- package/dist/core/capabilities/content-make/types.d.ts +173 -0
- package/dist/core/capabilities/content-make/types.js +6 -0
- package/dist/core/capabilities/content-make/voice.d.ts +7 -0
- package/dist/core/capabilities/content-make/voice.js +27 -0
- package/dist/core/capabilities/events.d.ts +2 -2
- package/dist/core/capabilities/export-game.d.ts +4 -1
- package/dist/core/capabilities/export-game.js +4 -3
- package/dist/core/capabilities/export-presets.d.ts +2 -1
- package/dist/core/capabilities/export-presets.js +2 -1
- package/dist/core/capabilities/go-live.d.ts +14 -0
- package/dist/core/capabilities/go-live.js +408 -0
- package/dist/core/capabilities/image-generation.d.ts +6 -6
- package/dist/core/capabilities/item-manifest.d.ts +92 -0
- package/dist/core/capabilities/item-manifest.js +247 -0
- package/dist/core/capabilities/placement.d.ts +7 -7
- package/dist/core/capabilities/projects-local.d.ts +68 -0
- package/dist/core/capabilities/projects-local.js +172 -0
- package/dist/core/capabilities/publish-build.d.ts +13 -2
- package/dist/core/capabilities/publish-build.js +87 -21
- package/dist/core/capabilities/publish-download.js +1 -1
- package/dist/core/capabilities/runtime-control.d.ts +7 -2
- package/dist/core/capabilities/runtime-control.js +27 -1
- package/dist/core/capabilities/seeing/args.d.ts +2 -2
- package/dist/core/capabilities/store-checks.d.ts +45 -0
- package/dist/core/capabilities/store-checks.js +85 -0
- package/dist/core/capabilities/store-details.d.ts +37 -0
- package/dist/core/capabilities/store-details.js +94 -0
- package/dist/core/capabilities/summer-bundle.d.ts +21 -2
- package/dist/core/capabilities/summer-bundle.js +54 -7
- package/dist/core/capabilities/sync-items.d.ts +89 -0
- package/dist/core/capabilities/sync-items.js +352 -0
- package/dist/core/capabilities/tool-dispatch.js +66 -6
- package/dist/core/capabilities/video-ogv.d.ts +49 -0
- package/dist/core/capabilities/video-ogv.js +260 -0
- package/dist/core/capability-skew.js +2 -2
- package/dist/core/cli-usage-beacon.js +26 -2
- package/dist/core/cli-usage.d.ts +5 -2
- package/dist/core/cli-usage.js +8 -2
- package/dist/core/engine-install.d.ts +53 -0
- package/dist/core/engine-install.js +93 -0
- package/dist/core/engine-installer.d.ts +134 -0
- package/dist/core/engine-installer.js +760 -0
- package/dist/core/engine-launch.d.ts +126 -0
- package/dist/core/engine-launch.js +398 -0
- package/dist/core/engine-self-start.d.ts +63 -0
- package/dist/core/engine-self-start.js +282 -0
- package/dist/core/engine.d.ts +7 -1
- package/dist/core/engine.js +9 -2
- package/dist/core/error-codes.d.ts +4 -1
- package/dist/core/error-codes.js +7 -3
- package/dist/core/library-read.d.ts +2 -2
- package/dist/core/library-search.d.ts +2 -2
- package/dist/core/local-project.d.ts +50 -0
- package/dist/core/local-project.js +234 -0
- package/dist/core/ops/areas.js +9 -3
- package/dist/core/ops/catalog.d.ts +9 -0
- package/dist/core/ops/catalog.js +56 -4
- package/dist/core/ops/engine-answer.d.ts +4 -1
- package/dist/core/ops/engine-answer.js +16 -3
- package/dist/core/ops/engine.js +4 -4
- package/dist/core/ops/save-files.d.ts +6 -1
- package/dist/core/ops/save-files.js +67 -50
- package/dist/core/ops/search.js +9 -2
- package/dist/core/preview/input.d.ts +35 -0
- package/dist/core/preview/input.js +105 -0
- package/dist/core/preview/launch-config.d.ts +52 -0
- package/dist/core/preview/launch-config.js +137 -0
- package/dist/core/preview/page.d.ts +22 -0
- package/dist/core/preview/page.js +232 -0
- package/dist/core/preview/preview-source.d.ts +179 -0
- package/dist/core/preview/preview-source.js +350 -0
- package/dist/core/preview/server.d.ts +26 -0
- package/dist/core/preview/server.js +218 -0
- package/dist/core/telemetry.d.ts +20 -16
- package/dist/core/telemetry.js +92 -16
- package/dist/core/templates.d.ts +20 -0
- package/dist/core/templates.js +300 -3
- package/dist/core/tool-profiles.d.ts +2 -2
- package/dist/core/tool-profiles.js +1 -0
- package/dist/core/usage-fields.d.ts +41 -0
- package/dist/core/usage-fields.js +150 -0
- package/dist/core/util/sleep.d.ts +3 -0
- package/dist/core/util/sleep.js +12 -0
- package/dist/installer/agent-config.d.ts +29 -0
- package/dist/installer/agent-config.js +75 -11
- package/dist/installer/agent-detect.d.ts +44 -0
- package/dist/installer/agent-detect.js +166 -0
- package/dist/installer/agent-table.d.ts +19 -0
- package/dist/installer/agent-table.js +130 -0
- package/dist/installer/setup-error.d.ts +19 -0
- package/dist/installer/setup-error.js +34 -0
- package/dist/installer/version-check.d.ts +5 -0
- package/dist/installer/version-check.js +21 -0
- package/dist/mcp/ops-surface.d.ts +7 -0
- package/dist/mcp/ops-surface.js +40 -3
- package/dist/mcp/server.d.ts +14 -4
- package/dist/mcp/server.js +42 -8
- package/dist/mcp/tool-surface.d.ts +8 -0
- package/dist/mcp/tool-surface.js +19 -2
- package/dist/mcp/tools/creator-tools.js +92 -14
- package/dist/mcp/tools/debug-tools.js +2 -0
- package/dist/mcp/tools/local-project-tools.d.ts +6 -0
- package/dist/mcp/tools/local-project-tools.js +33 -0
- package/dist/mcp/tools/navigation-tools.js +2 -1
- package/dist/mcp/tools/project-tools.js +5 -8
- package/dist/mcp/tools/seeing-tools.js +1 -1
- package/dist/mcp/tools/visual-tools.js +1 -1
- package/dist/mcp/tools/with-engine.js +1 -1
- package/dist/project-memory/agent-instructions.js +11 -3
- package/gemini-extension.json +3 -1
- package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -5
- package/library/skills/README.md +12 -8
- package/library/skills/animated-loop/SKILL.md +10 -16
- package/library/skills/cinematic-cutscene/SKILL.md +7 -18
- package/library/skills/headless-scripting/SKILL.md +7 -4
- package/library/skills/in-game-purchases/SKILL.md +25 -8
- package/library/skills/in-game-purchases/resource.yaml +2 -1
- package/library/skills/launch-ready/SKILL.md +351 -0
- package/library/skills/launch-ready/resource.yaml +45 -0
- package/library/skills/make-content/SKILL.md +202 -0
- package/library/skills/make-content/resource.yaml +32 -0
- package/library/skills/make-game/SKILL.md +6 -4
- package/library/skills/make-game/resource.yaml +2 -1
- package/library/skills/navigate-summer/SKILL.md +4 -2
- package/library/skills/new-project/SKILL.md +15 -22
- package/library/skills/new-project/resource.yaml +2 -1
- package/library/skills/painted-25d-world/SKILL.md +366 -0
- package/library/skills/painted-25d-world/_building-blocks/blender-route.md +33 -0
- package/library/skills/painted-25d-world/_building-blocks/blockout_builder.gd +149 -0
- package/library/skills/painted-25d-world/_building-blocks/capture_paint_view.gd +32 -0
- package/library/skills/painted-25d-world/_building-blocks/paint_projection.gdshader +23 -0
- package/library/skills/painted-25d-world/_building-blocks/paintcam_check.gd +25 -0
- package/library/skills/painted-25d-world/_building-blocks/painted_door.gd +17 -0
- package/library/skills/painted-25d-world/_building-blocks/painted_location.gd +56 -0
- package/library/skills/painted-25d-world/_building-blocks/painted_player.gd +125 -0
- package/library/skills/painted-25d-world/_building-blocks/painted_world.gd +111 -0
- package/library/skills/painted-25d-world/_building-blocks/tools/cam.py +57 -0
- package/library/skills/painted-25d-world/_building-blocks/tools/detail4k.py +81 -0
- package/library/skills/painted-25d-world/_building-blocks/tools/overlay.py +17 -0
- package/library/skills/painted-25d-world/_building-blocks/tools/preview.py +60 -0
- package/library/skills/painted-25d-world/resource.yaml +39 -0
- package/library/skills/publish-your-game/SKILL.md +13 -14
- package/library/skills/publish-your-game/resource.yaml +4 -3
- package/library/skills/release-checklist/SKILL.md +188 -0
- package/library/skills/release-checklist/resource.yaml +40 -0
- package/library/skills/release-readiness/SKILL.md +1 -1
- package/library/skills/release-readiness/resource.yaml +1 -1
- package/library/skills/store-art/SKILL.md +1 -1
- package/library/skills/store-art/resource.yaml +1 -1
- package/library/skills/store-listing/SKILL.md +1 -1
- package/library/skills/store-listing/resource.yaml +1 -1
- package/library/skills/summer-cli/SKILL.md +2 -0
- package/library/skills/summer-store/SKILL.md +295 -39
- package/library/skills/summer-store/resource.yaml +9 -3
- package/library/skills/trailer-shot/SKILL.md +3 -3
- package/library/templates/README.md +5 -0
- package/library/tools/content-make/resource.yaml +132 -0
- package/library/tools/frame-shot/GUIDE.md +1 -1
- package/library/tools/go-live/resource.yaml +67 -0
- package/library/tools/import-from-url/GUIDE.md +1 -0
- package/library/tools/import-from-url-batch/GUIDE.md +1 -1
- package/library/tools/play/GUIDE.md +2 -0
- package/library/tools/projects-create-local/resource.yaml +55 -0
- package/library/tools/projects-open-local/resource.yaml +51 -0
- package/library/tools/publish-build/resource.yaml +3 -3
- package/library/tools/screenshot/GUIDE.md +1 -1
- package/library/tools/store-set-details/resource.yaml +114 -0
- package/library/tools/sync-items/resource.yaml +72 -0
- package/package.json +1 -1
- package/registry/generated/aliases.json +6 -0
- package/registry/generated/counts.json +3 -3
- package/registry/generated/gemini-extension.json +3 -1
- package/registry/generated/index.json +463 -37
- package/registry/generated/marketplace.claude.json +1 -1
- package/registry/generated/plugin.claude-directory.json +4 -2
- package/registry/generated/plugin.claude.json +3 -1
- package/registry/generated/plugin.codex.json +5 -3
- package/registry/generated/plugin.cursor.json +4 -2
- package/registry/generated/plugin.factory.json +4 -2
- package/registry/generated/server.json +2 -2
- package/registry/generated/skills-index.md +12 -8
- package/registry/generated/skills-registry.json +62 -5
- package/registry/operations/legacy-names.json +40 -0
- 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;
|
package/dist/mcp/ops-surface.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
"
|
|
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];
|
package/dist/mcp/server.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
19
|
-
* the
|
|
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
|
-
|
|
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
|