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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/.factory-plugin/plugin.json +1 -1
- package/CHANGELOG.md +18 -0
- package/README.md +4 -4
- package/dist/cli/commands/setup.js +6 -19
- package/dist/cli/commands/skills.js +40 -33
- package/dist/core/capabilities/runtime-control.d.ts +4 -4
- package/dist/core/skills-registry.d.ts +9 -1
- package/dist/core/skills-registry.js +25 -2
- package/dist/installer/agent-config.d.ts +9 -4
- package/dist/installer/agent-config.js +192 -392
- package/dist/installer/agent-table.d.ts +103 -0
- package/dist/installer/agent-table.js +584 -0
- package/dist/installer/setup.js +4 -2
- package/dist/installer/skill-locations.d.ts +8 -17
- package/dist/installer/skill-locations.js +22 -101
- package/dist/installer/version-check.d.ts +5 -1
- package/dist/installer/version-check.js +38 -28
- package/gemini-extension.json +1 -1
- package/integrations/README.md +48 -19
- package/integrations/amp/README.md +12 -0
- package/integrations/amp/manifest-target.json +3 -0
- package/integrations/antigravity/README.md +12 -0
- package/integrations/antigravity/manifest-target.json +3 -0
- package/integrations/claude-desktop/README.md +12 -0
- package/integrations/claude-desktop/manifest-target.json +3 -0
- package/integrations/cline/README.md +8 -9
- package/integrations/cline-cli/README.md +12 -0
- package/integrations/cline-cli/manifest-target.json +3 -0
- package/integrations/copilot-jetbrains/README.md +12 -0
- package/integrations/copilot-jetbrains/manifest-target.json +3 -0
- package/integrations/crush/README.md +12 -0
- package/integrations/crush/manifest-target.json +3 -0
- package/integrations/github-copilot/README.md +8 -8
- package/integrations/goose/README.md +12 -0
- package/integrations/goose/manifest-target.json +3 -0
- package/integrations/grok-build/README.md +12 -0
- package/integrations/grok-build/manifest-target.json +3 -0
- package/integrations/hermes/README.md +12 -0
- package/integrations/hermes/manifest-target.json +3 -0
- package/integrations/junie/README.md +12 -0
- package/integrations/junie/manifest-target.json +3 -0
- package/integrations/kilo-code/README.md +6 -10
- package/integrations/kimi-code/README.md +12 -0
- package/integrations/kimi-code/manifest-target.json +3 -0
- package/integrations/kiro/README.md +12 -0
- package/integrations/kiro/manifest-target.json +3 -0
- package/integrations/lm-studio/README.md +8 -8
- package/integrations/mistral-vibe/README.md +12 -0
- package/integrations/mistral-vibe/manifest-target.json +3 -0
- package/integrations/opencode/README.md +9 -12
- package/integrations/qoder/README.md +12 -0
- package/integrations/qoder/manifest-target.json +3 -0
- package/integrations/qwen-code/README.md +12 -0
- package/integrations/qwen-code/manifest-target.json +3 -0
- package/integrations/roo-code/README.md +8 -7
- package/integrations/rovo-dev/README.md +12 -0
- package/integrations/rovo-dev/manifest-target.json +3 -0
- package/integrations/trae/README.md +12 -0
- package/integrations/trae/manifest-target.json +3 -0
- package/integrations/visual-studio/README.md +12 -0
- package/integrations/visual-studio/manifest-target.json +3 -0
- package/integrations/vscode-copilot/README.md +9 -9
- package/integrations/warp/README.md +12 -0
- package/integrations/warp/manifest-target.json +3 -0
- package/integrations/windsurf/README.md +8 -9
- package/integrations/zed/README.md +12 -0
- package/integrations/zed/manifest-target.json +3 -0
- package/library/skills/README.md +242 -0
- package/package.json +3 -3
- package/registry/generated/gemini-extension.json +1 -1
- package/registry/generated/marketplace.claude.json +1 -1
- package/registry/generated/plugin.claude.json +1 -1
- package/registry/generated/plugin.codex.json +1 -1
- package/registry/generated/plugin.cursor.json +1 -1
- package/registry/generated/plugin.factory.json +1 -1
- package/registry/generated/skills-index.md +242 -0
- 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
|
|
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
|
|
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 === "
|
|
52
|
-
|
|
53
|
-
|
|
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 (
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
-
|
|
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:
|
|
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 {
|
|
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
|
|
201
|
+
const ctx = defaultPathContext();
|
|
201
202
|
const candidates = [
|
|
202
|
-
{ agent: "
|
|
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
|
-
//
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
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
|
-
|
|
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;
|
package/gemini-extension.json
CHANGED
|
@@ -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.
|
|
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": {
|
package/integrations/README.md
CHANGED
|
@@ -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
|
|
6
|
-
|
|
7
|
-
`scripts/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 (
|
|
22
|
-
|
|
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`
|
|
56
|
-
|
|
|
57
|
-
|
|
|
58
|
-
|
|
|
59
|
-
|
|
|
60
|
-
|
|
|
61
|
-
|
|
|
62
|
-
|
|
|
63
|
-
|
|
|
64
|
-
|
|
|
65
|
-
|
|
|
66
|
-
|
|
|
67
|
-
|
|
|
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,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,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).
|
|
@@ -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
|
|
5
|
+
`summer setup cline` (aliases: `cline-vscode`), which writes:
|
|
6
6
|
|
|
7
|
-
- MCP config:
|
|
8
|
-
`
|
|
9
|
-
|
|
10
|
-
-
|
|
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-
|
|
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,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,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).
|
|
@@ -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
|
-
|
|
5
|
-
|
|
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
|
|
8
|
-
|
|
9
|
-
- Skills: `
|
|
10
|
-
|
|
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-
|
|
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,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,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).
|