summer-engine 3.0.0 → 3.1.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 (81) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.codex-plugin/plugin.json +1 -1
  4. package/.cursor-plugin/plugin.json +1 -1
  5. package/.factory-plugin/plugin.json +1 -1
  6. package/CHANGELOG.md +18 -0
  7. package/README.md +4 -4
  8. package/dist/cli/commands/setup.js +6 -19
  9. package/dist/cli/commands/skills.js +40 -33
  10. package/dist/core/capabilities/runtime-control.d.ts +4 -4
  11. package/dist/core/skills-registry.d.ts +9 -1
  12. package/dist/core/skills-registry.js +25 -2
  13. package/dist/installer/agent-config.d.ts +9 -4
  14. package/dist/installer/agent-config.js +192 -392
  15. package/dist/installer/agent-table.d.ts +103 -0
  16. package/dist/installer/agent-table.js +584 -0
  17. package/dist/installer/setup.js +4 -2
  18. package/dist/installer/skill-locations.d.ts +8 -17
  19. package/dist/installer/skill-locations.js +22 -101
  20. package/dist/installer/version-check.d.ts +5 -1
  21. package/dist/installer/version-check.js +38 -28
  22. package/gemini-extension.json +1 -1
  23. package/integrations/README.md +48 -19
  24. package/integrations/amp/README.md +12 -0
  25. package/integrations/amp/manifest-target.json +3 -0
  26. package/integrations/antigravity/README.md +12 -0
  27. package/integrations/antigravity/manifest-target.json +3 -0
  28. package/integrations/claude-desktop/README.md +12 -0
  29. package/integrations/claude-desktop/manifest-target.json +3 -0
  30. package/integrations/cline/README.md +8 -9
  31. package/integrations/cline-cli/README.md +12 -0
  32. package/integrations/cline-cli/manifest-target.json +3 -0
  33. package/integrations/copilot-jetbrains/README.md +12 -0
  34. package/integrations/copilot-jetbrains/manifest-target.json +3 -0
  35. package/integrations/crush/README.md +12 -0
  36. package/integrations/crush/manifest-target.json +3 -0
  37. package/integrations/github-copilot/README.md +8 -8
  38. package/integrations/goose/README.md +12 -0
  39. package/integrations/goose/manifest-target.json +3 -0
  40. package/integrations/grok-build/README.md +12 -0
  41. package/integrations/grok-build/manifest-target.json +3 -0
  42. package/integrations/hermes/README.md +12 -0
  43. package/integrations/hermes/manifest-target.json +3 -0
  44. package/integrations/junie/README.md +12 -0
  45. package/integrations/junie/manifest-target.json +3 -0
  46. package/integrations/kilo-code/README.md +6 -10
  47. package/integrations/kimi-code/README.md +12 -0
  48. package/integrations/kimi-code/manifest-target.json +3 -0
  49. package/integrations/kiro/README.md +12 -0
  50. package/integrations/kiro/manifest-target.json +3 -0
  51. package/integrations/lm-studio/README.md +8 -8
  52. package/integrations/mistral-vibe/README.md +12 -0
  53. package/integrations/mistral-vibe/manifest-target.json +3 -0
  54. package/integrations/opencode/README.md +9 -12
  55. package/integrations/qoder/README.md +12 -0
  56. package/integrations/qoder/manifest-target.json +3 -0
  57. package/integrations/qwen-code/README.md +12 -0
  58. package/integrations/qwen-code/manifest-target.json +3 -0
  59. package/integrations/roo-code/README.md +8 -7
  60. package/integrations/rovo-dev/README.md +12 -0
  61. package/integrations/rovo-dev/manifest-target.json +3 -0
  62. package/integrations/trae/README.md +12 -0
  63. package/integrations/trae/manifest-target.json +3 -0
  64. package/integrations/visual-studio/README.md +12 -0
  65. package/integrations/visual-studio/manifest-target.json +3 -0
  66. package/integrations/vscode-copilot/README.md +9 -9
  67. package/integrations/warp/README.md +12 -0
  68. package/integrations/warp/manifest-target.json +3 -0
  69. package/integrations/windsurf/README.md +8 -9
  70. package/integrations/zed/README.md +12 -0
  71. package/integrations/zed/manifest-target.json +3 -0
  72. package/library/skills/README.md +242 -0
  73. package/package.json +3 -3
  74. package/registry/generated/gemini-extension.json +1 -1
  75. package/registry/generated/marketplace.claude.json +1 -1
  76. package/registry/generated/plugin.claude.json +1 -1
  77. package/registry/generated/plugin.codex.json +1 -1
  78. package/registry/generated/plugin.cursor.json +1 -1
  79. package/registry/generated/plugin.factory.json +1 -1
  80. package/registry/generated/skills-index.md +242 -0
  81. package/registry/generated/skills-registry.json +492 -94
@@ -3,12 +3,15 @@
3
3
  *
4
4
  * Lives in the installer layer (not cli/) so `summer setup` can report the
5
5
  * destination and count without importing the CLI (import-direction contract
6
- * §2: shared layers never import cli or mcp).
6
+ * §2: shared layers never import cli or mcp). The per-agent paths come from
7
+ * the one agent table (agent-table.ts); only the `summer` pseudo-client is
8
+ * resolved here.
7
9
  */
8
10
  import { join } from "path";
9
- import { homedir, platform } from "os";
11
+ import { homedir } from "os";
10
12
  import { AGENT_CLIENTS } from "../core/skills-registry.js";
11
13
  import { tildeify } from "../core/format.js";
14
+ import { agentSpec, defaultPathContext, resolveSkillPath, } from "./agent-table.js";
12
15
  export const SKILL_SCOPES = ["user", "project"];
13
16
  function isAgentClient(value) {
14
17
  return AGENT_CLIENTS.includes(value);
@@ -44,114 +47,32 @@ export function resolveSkillAgent(opts) {
44
47
  }
45
48
  return parseSkillAgent(opts.agent ?? legacyAgent ?? "summer");
46
49
  }
47
- /** Explicit --scope wins; otherwise project-rooted agents default to "project". */
50
+ /** Explicit --scope wins; otherwise the agent's default (rule-file agents default to "project"). */
48
51
  export function resolveSkillScope(agent, opts) {
49
52
  if (opts.scope)
50
53
  return parseSkillScope(opts.scope);
51
- if (agent === "cursor" ||
52
- agent === "windsurf" ||
53
- agent === "cline" ||
54
- agent === "roo-code" ||
55
- agent === "kilo-code") {
56
- return "project";
57
- }
58
- return "user";
54
+ if (agent === "summer")
55
+ return "user";
56
+ return agentSpec(agent).skills?.defaultScope ?? "user";
59
57
  }
60
58
  export function resolveInstallLocation(agent, scope) {
61
59
  const overrideDir = process.env.SUMMER_SKILLS_DIR;
62
- if (overrideDir) {
63
- if (agent === "cursor")
64
- return { kind: "cursor-rule-dir", path: overrideDir };
65
- if (agent === "windsurf") {
66
- return { kind: "windsurf-rule-file", path: join(overrideDir, ".windsurfrules") };
67
- }
68
- if (agent === "cline" || agent === "roo-code" || agent === "kilo-code") {
69
- return { kind: "cline-rule-dir", path: overrideDir };
70
- }
71
- if (agent === "gemini") {
72
- return { kind: "skill-dir", path: overrideDir };
73
- }
74
- if (agent === "opencode") {
75
- return { kind: "opencode-skill-dir", path: overrideDir };
76
- }
77
- return { kind: "skill-dir", path: overrideDir };
60
+ if (agent === "summer") {
61
+ const root = scope === "user" ? homedir() : process.cwd();
62
+ return { kind: "skill-dir", path: overrideDir ?? join(root, ".summer", "skills") };
78
63
  }
79
- const root = scope === "user" ? homedir() : process.cwd();
80
- switch (agent) {
81
- case "codex":
82
- return { kind: "skill-dir", path: join(root, ".agents", "skills") };
83
- case "claude-code":
84
- return { kind: "skill-dir", path: join(root, ".claude", "skills") };
85
- case "cursor":
86
- return { kind: "cursor-rule-dir", path: join(root, ".cursor", "rules") };
87
- case "windsurf":
88
- return { kind: "windsurf-rule-file", path: join(root, ".windsurfrules") };
89
- case "cline":
90
- return {
91
- kind: "cline-rule-dir",
92
- path: scope === "user"
93
- ? clineUserRulesDir()
94
- : join(process.cwd(), ".clinerules"),
95
- };
96
- case "roo-code":
97
- return {
98
- kind: "cline-rule-dir",
99
- path: scope === "user"
100
- ? rooCodeUserRulesDir()
101
- : join(process.cwd(), ".clinerules"),
102
- };
103
- case "kilo-code":
104
- return {
105
- kind: "cline-rule-dir",
106
- path: scope === "user"
107
- ? join(homedir(), ".kilocode", "rules")
108
- : join(process.cwd(), ".kilocode", "rules"),
109
- };
110
- case "gemini":
111
- // Gemini discovers extension skills from <extension>/skills/<name>/SKILL.md
112
- // (geminicli.com/docs/extensions/reference), so copy the skill directories
113
- // as-is. The extension dir itself is written by `summer setup gemini`.
114
- return {
115
- kind: "skill-dir",
116
- path: join(homedir(), ".gemini", "extensions", "summer-engine", "skills"),
117
- };
118
- case "github-copilot":
119
- case "vscode-copilot":
120
- return {
121
- kind: "skill-dir",
122
- path: scope === "user"
123
- ? join(homedir(), ".copilot", "skills")
124
- : join(process.cwd(), ".github", "skills"),
125
- };
126
- case "opencode":
127
- return {
128
- kind: "opencode-skill-dir",
129
- path: scope === "user"
130
- ? opencodeUserAgentsDir()
131
- : join(process.cwd(), ".opencode", "agents", "summer"),
132
- };
133
- case "summer":
134
- return { kind: "skill-dir", path: join(root, ".summer", "skills") };
64
+ const spec = agentSpec(agent);
65
+ const resolved = resolveSkillPath(spec, scope, defaultPathContext());
66
+ if (!resolved) {
67
+ throw new Error(`${spec.label} has no skills folder. ${spec.noSkillsNote ?? ""}`.trim());
135
68
  }
136
- }
137
- function clineUserRulesDir() {
138
- // Cline reads global rules from the user's Documents/Cline/Rules folder.
139
- return join(homedir(), "Documents", "Cline", "Rules");
140
- }
141
- function rooCodeUserRulesDir() {
142
- // Roo Code reads global rules from the user's Documents/Roo/Rules folder.
143
- return join(homedir(), "Documents", "Roo", "Rules");
144
- }
145
- function opencodeUserAgentsDir() {
146
- // OpenCode's user-scope agent definition directory varies by OS.
147
- // On Windows, OpenCode reads from %APPDATA%/opencode/agents/summer.
148
- // On Linux/macOS, it reads from $XDG_CONFIG_HOME or ~/.config/opencode/agents/summer.
149
- if (platform() === "win32") {
150
- const appData = process.env.APPDATA ?? join(homedir(), "AppData", "Roaming");
151
- return join(appData, "opencode", "agents", "summer");
69
+ if (overrideDir) {
70
+ return {
71
+ kind: resolved.kind,
72
+ path: resolved.kind === "windsurf-rule-file" ? join(overrideDir, ".windsurfrules") : overrideDir,
73
+ };
152
74
  }
153
- const xdg = process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
154
- return join(xdg, "opencode", "agents", "summer");
75
+ return { kind: resolved.kind, path: resolved.path };
155
76
  }
156
77
  /** One-line, human path pattern for where an install location puts skills. */
157
78
  export function describeInstallLocation(location) {
@@ -11,6 +11,7 @@
11
11
  * Both are designed to be silent on offline / network errors — we never want
12
12
  * to false-alarm a user just because their wifi is flaky.
13
13
  */
14
+ import { type McpFormat } from "./agent-table.js";
14
15
  import { type StdioMcpServerConfig } from "./agent-config.js";
15
16
  export interface SemverParts {
16
17
  major: number;
@@ -145,10 +146,13 @@ export declare function isLocalDevServerConfig(server: StdioMcpServerConfig): bo
145
146
  * json-copilot {"mcpServers": {"summer-engine": {type, command, args}}}
146
147
  * json-vscode {"servers": {"summer-engine": {type, command, args}}}
147
148
  * json-opencode {"mcp": {"summer-engine": {type, command: [cmd, ...args]}}}
149
+ * json-zed {"context_servers": {"summer-engine": {source, command, args}}}
150
+ * yaml-goose extensions: summer-engine: {cmd, args}
151
+ * yaml-hermes mcp_servers: summer-engine: {command, args}
148
152
  * toml (codex) [mcp_servers.summer-engine]\ncommand = "…"\nargs = ["…", …]
149
153
  * Returns null when the file is missing, unparsable, or has no Summer entry.
150
154
  */
151
- export declare function readRecordedMcpServer(text: string, format: "json" | "toml" | "json-opencode" | "json-copilot" | "json-vscode"): StdioMcpServerConfig | null;
155
+ export declare function readRecordedMcpServer(text: string, format: McpFormat): StdioMcpServerConfig | null;
152
156
  /** Is the CLI running this check a source checkout rather than an installed
153
157
  * package? npm/npx/global installs all live under a node_modules directory. */
154
158
  export declare function runningCliIsCheckout(packageRoot?: string): boolean;
@@ -12,10 +12,11 @@
12
12
  * to false-alarm a user just because their wifi is flaky.
13
13
  */
14
14
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
15
- import { homedir, platform } from "node:os";
15
+ import { parse as parseYaml } from "yaml";
16
+ import { allAgentSpecs, defaultPathContext, resolveSkillPath } from "./agent-table.js";
16
17
  import { join, sep } from "node:path";
17
18
  import { PACKAGE_ROOT } from "../core/package-root.js";
18
- import { configureAgentMcp, parseAgent, SUMMER_MCP_SERVER_NAME, } from "./agent-config.js";
19
+ import { configureAgentMcp, parseAgent, SUMMER_MCP_SERVER_NAME, topLevelKey, } from "./agent-config.js";
19
20
  const NPM_REGISTRY_LATEST_URL = "https://registry.npmjs.org/summer-engine/latest";
20
21
  const REGISTRY_FETCH_TIMEOUT_MS = 3000;
21
22
  export function parseSemver(version) {
@@ -197,32 +198,17 @@ export function writeSkillMarker(dir, version, now = new Date()) {
197
198
  return path;
198
199
  }
199
200
  export function defaultSkillMarkerCandidates() {
200
- const home = homedir();
201
+ const ctx = defaultPathContext();
201
202
  const candidates = [
202
- { agent: "claude-code", dir: join(home, ".claude", "skills") },
203
- { agent: "codex", dir: join(home, ".agents", "skills") },
204
- { agent: "summer", dir: join(home, ".summer", "skills") },
205
- { agent: "cline", dir: join(home, "Documents", "Cline", "Rules") },
206
- { agent: "roo-code", dir: join(home, "Documents", "Roo", "Rules") },
207
- {
208
- agent: "gemini",
209
- dir: join(home, ".gemini", "extensions", "summer-engine", "skills"),
210
- },
203
+ { agent: "summer", dir: join(ctx.home, ".summer", "skills") },
211
204
  ];
212
- // OpenCode user-scope agent dir is OS-dependent.
213
- if (platform() === "win32") {
214
- const appData = process.env.APPDATA ?? join(home, "AppData", "Roaming");
215
- candidates.push({
216
- agent: "opencode",
217
- dir: join(appData, "opencode", "agents", "summer"),
218
- });
219
- }
220
- else {
221
- const xdg = process.env.XDG_CONFIG_HOME ?? join(home, ".config");
222
- candidates.push({
223
- agent: "opencode",
224
- dir: join(xdg, "opencode", "agents", "summer"),
225
- });
205
+ // Every agent with a user-scope skills home, from the one agent table.
206
+ // Devin Desktop's single rules file has no dir to mark; skip that kind.
207
+ for (const spec of allAgentSpecs()) {
208
+ const home = resolveSkillPath(spec, "user", ctx);
209
+ if (!home || home.kind === "windsurf-rule-file")
210
+ continue;
211
+ candidates.push({ agent: spec.id, dir: home.path });
226
212
  }
227
213
  return candidates;
228
214
  }
@@ -362,12 +348,29 @@ export function isLocalDevServerConfig(server) {
362
348
  * json-copilot {"mcpServers": {"summer-engine": {type, command, args}}}
363
349
  * json-vscode {"servers": {"summer-engine": {type, command, args}}}
364
350
  * json-opencode {"mcp": {"summer-engine": {type, command: [cmd, ...args]}}}
351
+ * json-zed {"context_servers": {"summer-engine": {source, command, args}}}
352
+ * yaml-goose extensions: summer-engine: {cmd, args}
353
+ * yaml-hermes mcp_servers: summer-engine: {command, args}
365
354
  * toml (codex) [mcp_servers.summer-engine]\ncommand = "…"\nargs = ["…", …]
366
355
  * Returns null when the file is missing, unparsable, or has no Summer entry.
367
356
  */
368
357
  export function readRecordedMcpServer(text, format) {
369
358
  if (!text.trim())
370
359
  return null;
360
+ if (format === "toml-array") {
361
+ const block = text.match(new RegExp(`^\\[\\[mcp_servers\\]\\]\\s*$([\\s\\S]*?)(?=^\\[|(?![\\s\\S]))`, "gm"));
362
+ for (const candidate of block ?? []) {
363
+ if (!new RegExp(`^name\\s*=\\s*"${SUMMER_MCP_SERVER_NAME}"`, "m").test(candidate))
364
+ continue;
365
+ const command = candidate.match(/^command\s*=\s*"((?:[^"\\]|\\.)*)"/m)?.[1];
366
+ const argsText = candidate.match(/^args\s*=\s*\[([^\]]*)\]/m)?.[1] ?? "";
367
+ if (!command)
368
+ return null;
369
+ const args = [...argsText.matchAll(/"((?:[^"\\]|\\.)*)"/g)].map((m) => m[1].replace(/\\(.)/g, "$1"));
370
+ return { command: command.replace(/\\(.)/g, "$1"), args };
371
+ }
372
+ return null;
373
+ }
371
374
  if (format === "toml") {
372
375
  const table = text.match(new RegExp(`^\\[mcp_servers\\.${SUMMER_MCP_SERVER_NAME.replace(/[-.]/g, "\\$&")}\\]\\s*$([\\s\\S]*?)(?=^\\[|(?![\\s\\S]))`, "m"));
373
376
  if (!table)
@@ -381,7 +384,7 @@ export function readRecordedMcpServer(text, format) {
381
384
  }
382
385
  let parsed;
383
386
  try {
384
- parsed = JSON.parse(text);
387
+ parsed = format === "yaml-goose" || format === "yaml-hermes" ? parseYaml(text) : JSON.parse(text);
385
388
  }
386
389
  catch {
387
390
  return null;
@@ -389,7 +392,9 @@ export function readRecordedMcpServer(text, format) {
389
392
  if (!parsed || typeof parsed !== "object")
390
393
  return null;
391
394
  const root = parsed;
392
- for (const container of ["mcpServers", "servers", "mcp"]) {
395
+ // The format's own key first, then the other shapes (a user may have moved to a newer file layout).
396
+ const containers = [topLevelKey(format), "mcpServers", "servers", "mcp", "context_servers", "extensions", "mcp_servers", "amp.mcpServers"];
397
+ for (const container of [...new Set(containers)]) {
393
398
  const servers = root[container];
394
399
  if (!servers || typeof servers !== "object")
395
400
  continue;
@@ -397,6 +402,11 @@ export function readRecordedMcpServer(text, format) {
397
402
  if (!entry || typeof entry !== "object")
398
403
  continue;
399
404
  const record = entry;
405
+ if (typeof record.cmd === "string") {
406
+ // Goose: { cmd, args }
407
+ const args = Array.isArray(record.args) ? record.args.filter((part) => typeof part === "string") : [];
408
+ return { command: record.cmd, args };
409
+ }
400
410
  if (Array.isArray(record.command)) {
401
411
  const [command, ...args] = record.command.filter((part) => typeof part === "string");
402
412
  return command ? { command, args } : null;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_generated": "GENERATED from integrations/gemini — do not edit; npm run generate:registry",
3
3
  "name": "summer",
4
- "version": "3.0.0",
4
+ "version": "3.1.0",
5
5
  "description": "Agent tooling for Summer Engine: MCP bridge, context primer, and game-dev skills. Use with the npm CLI for skill files on disk.",
6
6
  "contextFileName": "GEMINI.md",
7
7
  "mcpServers": {
@@ -2,10 +2,11 @@
2
2
 
3
3
  One folder per supported client. This directory is the single place that
4
4
  says which agents Summer supports and how each one consumes the library.
5
- Adding a new agent (e.g. Grok) = one folder here (plus, if it has a manifest
6
- file, a builder in `scripts/generate-registry/manifests.ts` and a target in
7
- `scripts/generate-registry/targets.ts`) + `npm run generate:registry` —
8
- never hand-editing root files.
5
+ Adding a new agent = one row in `src/installer/agent-table.ts` + one folder
6
+ here + an empty entry in `scripts/generate-registry/targets.ts` (plus, if it
7
+ has a manifest file, a builder in `scripts/generate-registry/manifests.ts`) +
8
+ `npm run generate:registry` — never hand-editing root files. Tests fail when
9
+ the table, this directory, and targets.ts disagree.
9
10
 
10
11
  Each folder contains:
11
12
 
@@ -18,8 +19,8 @@ installs every skill (`skills install --all`, preview included; `--stable-only`
18
19
  skips preview) in the SAME scope,
19
20
  so a user-scope MCP config never ends up beside project-scope skills.
20
21
  `--scope project` moves both; `--recommended` installs only the recommended
21
- subset. Clients whose MCP config is user-only (cline, roo-code, lm-studio,
22
- gemini) fall back to user scope with a warning. `.mcp.json` at the repo root
22
+ subset. Clients whose MCP config is user-only (see the table) fall back to user
23
+ scope with a warning. `.mcp.json` at the repo root
23
24
  (the MCP pointer the claude / codex / cursor / factory manifests share) is
24
25
  generated too — `registry/generated/mcp.json -> .mcp.json`.
25
26
  - `manifest-target.json` — mapping of generated file -> repo-root destination
@@ -52,19 +53,47 @@ How the plugin manifests reference skills, and what is verified:
52
53
 
53
54
  | Client | Manifest generated in this repo | `summer setup` writes |
54
55
  |---|---|---|
55
- | claude | `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, `.mcp.json` | MCP: `~/.claude.json` (user) / `.mcp.json` (project); skills: `~/.claude/skills/` (user) / `.claude/skills/` (project); slash commands from `commands/` to `~/.claude/commands/` |
56
- | codex | `.codex-plugin/plugin.json` | MCP: `~/.codex/config.toml` (TOML); skills: `.agents/skills/` |
57
- | cursor | `.cursor-plugin/plugin.json` | MCP: `~/.cursor/mcp.json` / `.cursor/mcp.json`; skills: `.cursor/rules/` |
58
- | factory | `.factory-plugin/plugin.json` | nothing — there is no `summer setup factory` target. Install via the plugin marketplace: `droid plugin marketplace add https://github.com/summerengine/summer` then `droid plugin install summer@summer-engine`. Factory reads MCP from the plugin's `.mcp.json` and skills only from a root `skills/` dir (this package ships them under `library/skills/`, so the manifest `skills` array is not read by Factory — open gap) |
59
- | gemini | `gemini-extension.json` | extension dir `~/.gemini/extensions/summer-engine/`: the generated manifest (renamed `summer-engine` to match the dir, MCP launcher swapped to `npx -y summer-engine@latest mcp`) + `GEMINI.md` + `AGENTS.md`; skills: `~/.gemini/extensions/summer-engine/skills/<slug>/SKILL.md` (Gemini extension-skill discovery; user scope only) |
60
- | windsurf (Devin Desktop) | — | MCP: `~/.codeium/windsurf/mcp_config.json`; rules: `.windsurfrules` |
61
- | cline | — | MCP: VS Code global storage (`saoudrizwan.claude-dev`); rules: `.clinerules` |
62
- | roo-code | — | MCP: VS Code global storage (`rooveterinaryinc.roo-cline`); rules: `.clinerules` |
63
- | kilo-code | — | MCP: VS Code global storage `kilocode.kilo-code/settings/mcp_settings.json` (user) / `.kilocode/mcp.json` (project); rules: `~/.kilocode/rules/` (user) / `.kilocode/rules/` (project) |
64
- | github-copilot | — | MCP: `~/.copilot/mcp-config.json` / `.mcp.json`; skills: `~/.copilot/skills/` or `.github/skills/` |
65
- | vscode-copilot | — | MCP: VS Code user-profile `mcp.json` / `.vscode/mcp.json`; skills: `~/.copilot/skills/` or `.github/skills/` |
66
- | opencode | — (JS plugin via npm `main`, `.opencode/plugins/summer.js`) | MCP entry in `opencode.json` (`type: "local"`, array `command`); skills: the plugin registers `library/skills/` via `skills.paths`; `skills install --agent opencode` additionally writes `agents/summer/` markdown |
67
- | lm-studio | — | MCP: `~/.lmstudio/mcp.json` (app-global); no skills folder — guidance via `summer_get_agent_playbook` |
56
+ | claude | `.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`, `.mcp.json` | MCP: `~/.claude.json`; Windows `%USERPROFILE%/.claude.json` / `.mcp.json`; skills: `~/.claude/skills` / `.claude/skills` (`<skill>/SKILL.md`) |
57
+ | claude-desktop | — | MCP: `~/Library/Application Support/Claude/claude_desktop_config.json`; Linux `~/.config/Claude/claude_desktop_config.json`; Windows `%APPDATA%/Claude/claude_desktop_config.json`; no skills folder (MCP only) |
58
+ | codex | `.codex-plugin/plugin.json` | MCP: `~/.codex/config.toml`; Windows `%USERPROFILE%/.codex/config.toml` / `.codex/config.toml`; skills: `~/.agents/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
59
+ | cursor | `.cursor-plugin/plugin.json` | MCP: `~/.cursor/mcp.json`; Windows `%USERPROFILE%/.cursor/mcp.json` / `.cursor/mcp.json`; skills: `~/.cursor/skills` / `.cursor/skills` (`<skill>/SKILL.md`) |
60
+ | windsurf | — | MCP: `~/.codeium/windsurf/mcp_config.json`; Windows `%USERPROFILE%/.codeium/windsurf/mcp_config.json`; skills: `~/.codeium/windsurf/skills` / `.windsurf/skills` (`<skill>/SKILL.md`) |
61
+ | antigravity | — | MCP: `~/.gemini/config/mcp_config.json`; Windows `%USERPROFILE%/.gemini/config/mcp_config.json` / `.agents/mcp_config.json`; skills: `~/.gemini/config/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
62
+ | gemini (legacy) | `gemini-extension.json` | MCP: `~/.gemini/extensions/summer-engine/gemini-extension.json`; Windows `%USERPROFILE%/.gemini/extensions/summer-engine/gemini-extension.json`; skills: `~/.gemini/extensions/summer-engine/skills` (`<skill>/SKILL.md`) |
63
+ | cline | — | MCP: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; Linux `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; Windows `%APPDATA%/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; skills: `~/.cline/skills` / `.cline/skills` (`<skill>/SKILL.md`) |
64
+ | cline-cli | — | MCP: `~/.cline/data/settings/cline_mcp_settings.json`; Windows `%USERPROFILE%/.cline/data/settings/cline_mcp_settings.json`; skills: `~/.cline/skills` / `.cline/skills` (`<skill>/SKILL.md`) |
65
+ | roo-code (legacy) | — | MCP: `~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; Linux `~/.config/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; Windows `%APPDATA%/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json`; skills: `~/Documents/Roo/Rules` / `.clinerules` (rule files `summer-<skill>.md`) |
66
+ | kilo-code | — | MCP: `~/.config/kilo/kilo.json`; Windows `%APPDATA%/kilo/kilo.json` / `kilo.json`; skills: `~/.kilo/skills` / `.kilo/skills` (`<skill>/SKILL.md`) |
67
+ | github-copilot | — | MCP: `~/.copilot/mcp-config.json`; Windows `%USERPROFILE%/.copilot/mcp-config.json` / `.mcp.json`; skills: `~/.copilot/skills` / `.github/skills` (`<skill>/SKILL.md`) |
68
+ | vscode-copilot | — | MCP: `~/Library/Application Support/Code/User/mcp.json`; Linux `~/.config/Code/User/mcp.json`; Windows `%APPDATA%/Code/User/mcp.json` / `.vscode/mcp.json`; skills: `~/.copilot/skills` / `.github/skills` (`<skill>/SKILL.md`) |
69
+ | visual-studio | — | MCP: `~/.mcp.json`; Windows `%USERPROFILE%/.mcp.json` / `.mcp.json`; no skills folder (MCP only) |
70
+ | copilot-jetbrains | — | MCP: `~/.config/github-copilot/intellij/mcp.json`; Windows `%APPDATA%/github-copilot/intellij/mcp.json`; no skills folder (MCP only) |
71
+ | opencode | — | MCP: `~/.config/opencode/opencode.json`; Windows `%APPDATA%/opencode/opencode.json` / `opencode.json`; skills: `~/.config/opencode/skills` / `.opencode/skills` (`<skill>/SKILL.md`) |
72
+ | zed | — | MCP: `~/.config/zed/settings.json`; Windows `%APPDATA%/zed/settings.json`; skills: `~/.agents/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
73
+ | kiro | — | MCP: `~/.kiro/settings/mcp.json`; Windows `%USERPROFILE%/.kiro/settings/mcp.json` / `.kiro/settings/mcp.json`; skills: `~/.kiro/skills` / `.kiro/skills` (`<skill>/SKILL.md`) |
74
+ | goose | — | MCP: `~/.config/goose/config.yaml`; Windows `%APPDATA%/Block/goose/config/config.yaml`; skills: `~/.config/agents/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
75
+ | hermes | — | MCP: `~/.hermes/config.yaml`; Windows `%USERPROFILE%/.hermes/config.yaml`; skills: `~/.hermes/skills` / `.hermes/skills` (`<skill>/SKILL.md`) |
76
+ | trae | — | MCP: `.trae/mcp.json` / `.trae/mcp.json`; no skills folder (MCP only) |
77
+ | qwen-code | — | MCP: `~/.qwen/settings.json`; Windows `%USERPROFILE%/.qwen/settings.json` / `.qwen/settings.json`; skills: `~/.qwen/skills` / `.qwen/skills` (`<skill>/SKILL.md`) |
78
+ | kimi-code | — | MCP: `~/.kimi-code/mcp.json`; Windows `%USERPROFILE%/.kimi-code/mcp.json` / `.kimi-code/mcp.json`; skills: `~/.kimi-code/skills` / `.kimi-code/skills` (`<skill>/SKILL.md`) |
79
+ | crush | — | MCP: `~/.config/crush/crushrc`; Windows `%USERPROFILE%/.config/crush/crushrc` / `.crushrc`; skills: `~/.config/crush/skills` / `.crush/skills` (`<skill>/SKILL.md`) |
80
+ | amp | — | MCP: `~/.config/amp/settings.json`; Windows `%APPDATA%/amp/settings.json`; skills: `~/.config/amp/skills` / `.agents/skills` (`<skill>/SKILL.md`) |
81
+ | factory | `.factory-plugin/plugin.json` | MCP: `~/.factory/mcp.json`; Windows `%USERPROFILE%/.factory/mcp.json` / `.factory/mcp.json`; skills: `~/.factory/skills` / `.factory/skills` (`<skill>/SKILL.md`) |
82
+ | junie | — | MCP: `~/.junie/mcp/mcp.json`; Windows `%USERPROFILE%/.junie/mcp/mcp.json` / `.junie/mcp/mcp.json`; no skills folder (MCP only) |
83
+ | warp | — | MCP: `~/.warp/.mcp.json`; Windows `%USERPROFILE%/.warp/.mcp.json` / `.warp/.mcp.json`; skills: `~/.warp/skills` / `.warp/skills` (`<skill>/SKILL.md`) |
84
+ | rovo-dev | — | MCP: `~/.rovodev/mcp.json`; Windows `%USERPROFILE%/.rovodev/mcp.json`; skills: `~/.rovodev/skills` / `.rovodev/skills` (`<skill>/SKILL.md`) |
85
+ | qoder | — | MCP: `~/.qoder/settings.json`; Windows `%USERPROFILE%/.qoder/settings.json` / `.mcp.json`; skills: `~/.qoder/skills` / `.qoder/skills` (`<skill>/SKILL.md`) |
86
+ | grok-build | — | MCP: `~/.grok/config.toml`; Windows `%USERPROFILE%/.grok/config.toml` / `.grok/config.toml`; skills: `~/.grok/skills` / `.grok/skills` (`<skill>/SKILL.md`) |
87
+ | mistral-vibe | — | MCP: `~/.vibe/config.toml`; Windows `%USERPROFILE%/.vibe/config.toml` / `.vibe/config.toml`; skills: `~/.vibe/skills` / `.vibe/skills` (`<skill>/SKILL.md`) |
88
+ | lm-studio | — | MCP: `~/.lmstudio/mcp.json`; Windows `%USERPROFILE%/.lmstudio/mcp.json`; no skills folder (MCP only) |
68
89
 
69
90
  Source of truth for the setup paths: `src/installer/agent-config.ts` and
70
91
  `src/cli/commands/skills.ts`.
92
+
93
+ Not supported on purpose (checked 2026-09-11): OpenHands CLI (its `[mcp] stdio_servers`
94
+ inline-table array has a known upstream write bug), Xcode's agent folders (Apple
95
+ documents the folder but not the file names), Pi (no MCP by design), Aider,
96
+ ChatGPT desktop, Replit, Perplexity, JetBrains AI Assistant and Android Studio
97
+ (UI-only MCP), Continue.dev (shut down), Void (archived), Cody (enterprise only).
98
+ Grok Build also reads `~/.claude.json` and `.cursor/mcp.json`, so a Claude Code or
99
+ Cursor setup already covers it; `summer setup grok-build` writes its own file too.
@@ -0,0 +1,12 @@
1
+ # Amp integration
2
+
3
+ No manifest file is generated in this repo for Amp — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup amp` (aliases: `sourcegraph-amp`, `ampcode`), which writes:
6
+
7
+ - MCP config: `~/.config/amp/settings.json`; Windows `%APPDATA%/amp/settings.json` (user); user scope only (project requests fall back with a warning).
8
+ Shape: `"amp.mcpServers".summer-engine = { command, args }`.
9
+ - Skills: `~/.config/amp/skills` (user) or `.agents/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: Restart Amp so it reloads settings.json.
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -0,0 +1,12 @@
1
+ # Antigravity integration
2
+
3
+ No manifest file is generated in this repo for Antigravity — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup antigravity` (aliases: `agy`, `google-antigravity`), which writes:
6
+
7
+ - MCP config: `~/.gemini/config/mcp_config.json`; Windows `%USERPROFILE%/.gemini/config/mcp_config.json` (user); `.agents/mcp_config.json` (project).
8
+ Shape: `mcpServers.summer-engine = { command, args }`.
9
+ - Skills: `~/.gemini/config/skills` (user) or `.agents/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: In Antigravity open the agent panel's MCP servers view and refresh; summer-engine appears in the list (IDE and CLI share this file).
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -0,0 +1,12 @@
1
+ # Claude Desktop integration
2
+
3
+ No manifest file is generated in this repo for Claude Desktop — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup claude-desktop` (aliases: `claude-app`, `claudedesktop`), which writes:
6
+
7
+ - MCP config: `~/Library/Application Support/Claude/claude_desktop_config.json`; Linux `~/.config/Claude/claude_desktop_config.json`; Windows `%APPDATA%/Claude/claude_desktop_config.json` (user); user scope only (project requests fall back with a warning).
8
+ Shape: `mcpServers.summer-engine = { command, args }`.
9
+ - Skills: none. Claude Desktop has no skills folder. The MCP server ships summer_get_agent_playbook, so the model can pull Summer guidance in-chat.
10
+ - After: Quit and reopen Claude Desktop; the summer-engine tools appear under the tools menu in a new chat.
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -1,13 +1,12 @@
1
- # Cline integration
1
+ # Cline (VS Code) integration
2
2
 
3
- No manifest file is generated in this repo for Cline — `manifest-target.json`
3
+ No manifest file is generated in this repo for Cline (VS Code) — `manifest-target.json`
4
4
  is intentionally empty. Support is delivered at install time by
5
- `summer setup cline`, which writes:
5
+ `summer setup cline` (aliases: `cline-vscode`), which writes:
6
6
 
7
- - MCP config: Cline's VS Code global storage (extension
8
- `saoudrizwan.claude-dev`). User scope only — Cline has no project-scoped MCP
9
- config today; project requests fall back to user scope with a warning.
10
- - Skills: `summer skills install --agent cline` writes rule files to Cline's
11
- user rules directory (user scope) or `./.clinerules` (project scope).
7
+ - MCP config: `~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; Linux `~/.config/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json`; Windows `%APPDATA%/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json` (user); user scope only (project requests fall back with a warning).
8
+ Shape: `mcpServers.summer-engine = { command, args }`.
9
+ - Skills: `~/.cline/skills` (user) or `.cline/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: Restart VS Code so Cline reloads its MCP config.
12
11
 
13
- Source of truth: `src/installer/agent-config.ts`, `src/cli/commands/skills.ts`.
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,12 @@
1
+ # Cline CLI integration
2
+
3
+ No manifest file is generated in this repo for Cline CLI — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup cline-cli` (aliases: `clinecli`), which writes:
6
+
7
+ - MCP config: `~/.cline/data/settings/cline_mcp_settings.json`; Windows `%USERPROFILE%/.cline/data/settings/cline_mcp_settings.json` (user); user scope only (project requests fall back with a warning).
8
+ Shape: `mcpServers.summer-engine = { command, args }`.
9
+ - Skills: `~/.cline/skills` (user) or `.cline/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: Restart the Cline CLI so it reloads its MCP settings.
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -0,0 +1,12 @@
1
+ # GitHub Copilot in JetBrains IDEs integration
2
+
3
+ No manifest file is generated in this repo for GitHub Copilot in JetBrains IDEs — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup copilot-jetbrains` (aliases: `jetbrains-copilot`, `intellij-copilot`, `copilot-intellij`), which writes:
6
+
7
+ - MCP config: `~/.config/github-copilot/intellij/mcp.json`; Windows `%APPDATA%/github-copilot/intellij/mcp.json` (user); user scope only (project requests fall back with a warning).
8
+ Shape: undefined.
9
+ - Skills: none. Copilot in JetBrains documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.
10
+ - After: Restart the JetBrains IDE and open Copilot Chat in Agent mode; summer-engine shows in the tools list.
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -0,0 +1,12 @@
1
+ # Crush integration
2
+
3
+ No manifest file is generated in this repo for Crush — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup crush` (aliases: `charm-crush`), which writes:
6
+
7
+ - MCP config: `~/.config/crush/crushrc`; Windows `%USERPROFILE%/.config/crush/crushrc` (user); `.crushrc` (project).
8
+ Shape: `mcp.summer-engine = { type: "stdio", command, args }`.
9
+ - Skills: `~/.config/crush/skills` (user) or `.crush/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: Restart Crush so it reloads crushrc.
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -1,12 +1,12 @@
1
1
  # GitHub Copilot CLI integration
2
2
 
3
- No manifest file is generated in this repo for Copilot CLI —
4
- `manifest-target.json` is intentionally empty. Support is delivered at install
5
- time by `summer setup github-copilot`, which writes:
3
+ No manifest file is generated in this repo for GitHub Copilot CLI — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup github-copilot` (aliases: `copilot`, `copilot-cli`, `github-copilot-cli`), which writes:
6
6
 
7
- - MCP config: `~/.copilot/mcp-config.json` (user scope) or `./.mcp.json`
8
- (project scope), in Copilot's MCP config format.
9
- - Skills: `summer skills install --agent github-copilot` writes skill files to
10
- `~/.copilot/skills/` (user scope) or `./.github/skills/` (project scope).
7
+ - MCP config: `~/.copilot/mcp-config.json`; Windows `%USERPROFILE%/.copilot/mcp-config.json` (user); `.mcp.json` (project).
8
+ Shape: `mcpServers.summer-engine = { type: "local", command, args, tools: ["*"] }`.
9
+ - Skills: `~/.copilot/skills` (user) or `.github/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: Restart Copilot CLI, or run /mcp reload and /skills reload in the active session.
11
11
 
12
- Source of truth: `src/installer/agent-config.ts`, `src/cli/commands/skills.ts`.
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,12 @@
1
+ # Goose integration
2
+
3
+ No manifest file is generated in this repo for Goose — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup goose` (aliases: `block-goose`, `codename-goose`), which writes:
6
+
7
+ - MCP config: `~/.config/goose/config.yaml`; Windows `%APPDATA%/Block/goose/config/config.yaml` (user); user scope only (project requests fall back with a warning).
8
+ Shape: `extensions.summer-engine = { type: stdio, cmd, args, enabled, timeout }` (YAML).
9
+ - Skills: `~/.config/agents/skills` (user) or `.agents/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: Restart Goose (CLI or Desktop); summer-engine is listed under Extensions.
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -0,0 +1,12 @@
1
+ # Grok Build integration
2
+
3
+ No manifest file is generated in this repo for Grok Build — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup grok-build` (aliases: `grok`, `xai-grok`), which writes:
6
+
7
+ - MCP config: `~/.grok/config.toml`; Windows `%USERPROFILE%/.grok/config.toml` (user); `.grok/config.toml` (project).
8
+ Shape: `[mcp_servers.summer-engine]` table (TOML).
9
+ - Skills: `~/.grok/skills` (user) or `.grok/skills` (project) as `<skill>/SKILL.md`.
10
+ - After: Restart Grok Build so it reloads config.toml (it also reads ~/.claude.json and .cursor/mcp.json).
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).
@@ -0,0 +1,3 @@
1
+ {
2
+ "targets": []
3
+ }
@@ -0,0 +1,12 @@
1
+ # Hermes Agent integration
2
+
3
+ No manifest file is generated in this repo for Hermes Agent — `manifest-target.json`
4
+ is intentionally empty. Support is delivered at install time by
5
+ `summer setup hermes` (aliases: `hermes-agent`, `nous-hermes`), which writes:
6
+
7
+ - MCP config: `~/.hermes/config.yaml`; Windows `%USERPROFILE%/.hermes/config.yaml` (user); user scope only (project requests fall back with a warning).
8
+ Shape: `mcp_servers.summer-engine = { command, args }` (YAML).
9
+ - Skills: `~/.hermes/skills` (user) or `.hermes/skills` (project) as `<skill>/SKILL.md`. Project skills need `hermes skills trust` before Hermes loads them.
10
+ - After: Run /reload-mcp in Hermes Agent (or restart it).
11
+
12
+ Source of truth: `src/installer/agent-table.ts` (one row per agent).