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
|
@@ -0,0 +1,584 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one table of agent clients `summer setup` and `summer skills install`
|
|
3
|
+
* know how to write for. Every per-agent fact lives here: label, aliases,
|
|
4
|
+
* where the MCP config file is (per scope and OS), which file shape it uses,
|
|
5
|
+
* where skills go, and what to tell the user afterwards. agent-config.ts and
|
|
6
|
+
* skill-locations.ts read this table; nothing else hard-codes an agent.
|
|
7
|
+
*
|
|
8
|
+
* Adding an agent = one entry here + an `integrations/<id>/` folder (a test
|
|
9
|
+
* keeps the two in lockstep) + a row in the docs tables.
|
|
10
|
+
*
|
|
11
|
+
* Paths were checked against each product's official docs on 2026-09-11.
|
|
12
|
+
*/
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import { homedir, platform } from "os";
|
|
15
|
+
/** Ids `summer setup <agent>` accepts. Legacy ids stay so old commands and
|
|
16
|
+
* configs keep resolving, but they are hidden from help and warn on use. */
|
|
17
|
+
export const AGENT_IDS = [
|
|
18
|
+
"claude-code",
|
|
19
|
+
"claude-desktop",
|
|
20
|
+
"codex",
|
|
21
|
+
"cursor",
|
|
22
|
+
"windsurf",
|
|
23
|
+
"antigravity",
|
|
24
|
+
"gemini",
|
|
25
|
+
"cline",
|
|
26
|
+
"cline-cli",
|
|
27
|
+
"roo-code",
|
|
28
|
+
"kilo-code",
|
|
29
|
+
"github-copilot",
|
|
30
|
+
"vscode-copilot",
|
|
31
|
+
"visual-studio",
|
|
32
|
+
"copilot-jetbrains",
|
|
33
|
+
"opencode",
|
|
34
|
+
"zed",
|
|
35
|
+
"kiro",
|
|
36
|
+
"goose",
|
|
37
|
+
"hermes",
|
|
38
|
+
"trae",
|
|
39
|
+
"qwen-code",
|
|
40
|
+
"kimi-code",
|
|
41
|
+
"crush",
|
|
42
|
+
"amp",
|
|
43
|
+
"factory",
|
|
44
|
+
"junie",
|
|
45
|
+
"warp",
|
|
46
|
+
"rovo-dev",
|
|
47
|
+
"qoder",
|
|
48
|
+
"grok-build",
|
|
49
|
+
"mistral-vibe",
|
|
50
|
+
"lm-studio",
|
|
51
|
+
];
|
|
52
|
+
// ---- path helpers ---------------------------------------------------------
|
|
53
|
+
function appData(ctx) {
|
|
54
|
+
return ctx.env.APPDATA ?? join(ctx.home, "AppData", "Roaming");
|
|
55
|
+
}
|
|
56
|
+
function xdgConfig(ctx) {
|
|
57
|
+
return ctx.env.XDG_CONFIG_HOME ?? join(ctx.home, ".config");
|
|
58
|
+
}
|
|
59
|
+
/** ~/.config on Linux, %APPDATA% on Windows, ~/Library/Application Support on macOS. */
|
|
60
|
+
function appConfigRoot(ctx) {
|
|
61
|
+
if (ctx.os === "win32")
|
|
62
|
+
return appData(ctx);
|
|
63
|
+
if (ctx.os === "darwin")
|
|
64
|
+
return join(ctx.home, "Library", "Application Support");
|
|
65
|
+
return xdgConfig(ctx);
|
|
66
|
+
}
|
|
67
|
+
/** XDG on Linux AND macOS (CLI tools that ignore Application Support), %APPDATA% on Windows. */
|
|
68
|
+
function xdgOrAppData(ctx) {
|
|
69
|
+
return ctx.os === "win32" ? appData(ctx) : xdgConfig(ctx);
|
|
70
|
+
}
|
|
71
|
+
function vsCodeUserDir(ctx) {
|
|
72
|
+
return join(appConfigRoot(ctx), "Code", "User");
|
|
73
|
+
}
|
|
74
|
+
function vsCodeGlobalStorage(ctx, extensionId, fileName) {
|
|
75
|
+
return join(vsCodeUserDir(ctx), "globalStorage", extensionId, "settings", fileName);
|
|
76
|
+
}
|
|
77
|
+
const home = (...parts) => (ctx) => join(ctx.home, ...parts);
|
|
78
|
+
const project = (...parts) => (ctx) => join(ctx.cwd, ...parts);
|
|
79
|
+
/** agentskills.io layout (`<dir>/<skill>/SKILL.md`) under a user dir and a project dir. */
|
|
80
|
+
function skillDirs(user, proj, extra = {}) {
|
|
81
|
+
return { kind: "skill-dir", user, project: proj, ...extra };
|
|
82
|
+
}
|
|
83
|
+
// ---- the table ------------------------------------------------------------
|
|
84
|
+
const SPECS = [
|
|
85
|
+
{
|
|
86
|
+
id: "claude-code",
|
|
87
|
+
label: "Claude Code",
|
|
88
|
+
aliases: ["claude"],
|
|
89
|
+
status: "active",
|
|
90
|
+
envOverride: "SUMMER_CLAUDE_CONFIG_FILE",
|
|
91
|
+
format: "json-stdio",
|
|
92
|
+
mcp: { user: home(".claude.json"), project: project(".mcp.json") },
|
|
93
|
+
restart: "Restart Claude Code or run /mcp in a new session.",
|
|
94
|
+
skills: skillDirs(home(".claude", "skills"), project(".claude", "skills")),
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: "claude-desktop",
|
|
98
|
+
label: "Claude Desktop",
|
|
99
|
+
aliases: ["claude-app", "claudedesktop"],
|
|
100
|
+
status: "active",
|
|
101
|
+
envOverride: "SUMMER_CLAUDE_DESKTOP_CONFIG_FILE",
|
|
102
|
+
format: "json",
|
|
103
|
+
mcp: {
|
|
104
|
+
user: (ctx) => join(appConfigRoot(ctx), "Claude", "claude_desktop_config.json"),
|
|
105
|
+
project: null,
|
|
106
|
+
},
|
|
107
|
+
restart: "Quit and reopen Claude Desktop; the summer-engine tools appear under the tools menu in a new chat.",
|
|
108
|
+
skills: null,
|
|
109
|
+
noSkillsNote: "Claude Desktop has no skills folder. The MCP server ships summer_get_agent_playbook, so the model can pull Summer guidance in-chat.",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "codex",
|
|
113
|
+
label: "Codex",
|
|
114
|
+
aliases: ["codex-cli", "openai-codex"],
|
|
115
|
+
status: "active",
|
|
116
|
+
envOverride: "SUMMER_CODEX_CONFIG_FILE",
|
|
117
|
+
format: "toml",
|
|
118
|
+
mcp: {
|
|
119
|
+
user: home(".codex", "config.toml"),
|
|
120
|
+
project: project(".codex", "config.toml"),
|
|
121
|
+
projectNote: "Codex only loads project .codex/config.toml from trusted projects.",
|
|
122
|
+
},
|
|
123
|
+
restart: "Restart Codex or run /mcp in a new session.",
|
|
124
|
+
skills: skillDirs(home(".agents", "skills"), project(".agents", "skills")),
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: "cursor",
|
|
128
|
+
label: "Cursor",
|
|
129
|
+
aliases: [],
|
|
130
|
+
status: "active",
|
|
131
|
+
envOverride: "SUMMER_CURSOR_MCP_CONFIG_FILE",
|
|
132
|
+
format: "json-stdio",
|
|
133
|
+
mcp: { user: home(".cursor", "mcp.json"), project: project(".cursor", "mcp.json") },
|
|
134
|
+
restart: "Restart Cursor and enable the summer-engine MCP server if prompted.",
|
|
135
|
+
skills: skillDirs(home(".cursor", "skills"), project(".cursor", "skills"), {
|
|
136
|
+
reloadHint: "Cursor loads skills in the next chat. Summer 3.0 and earlier wrote rule files to .cursor/rules; `--force` removes those.",
|
|
137
|
+
legacyRules: { user: home(".cursor", "rules"), project: project(".cursor", "rules"), suffix: ".mdc" },
|
|
138
|
+
}),
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "windsurf",
|
|
142
|
+
label: "Devin Desktop (formerly Windsurf)",
|
|
143
|
+
aliases: ["devin", "devin-desktop", "devindesktop"],
|
|
144
|
+
status: "active",
|
|
145
|
+
envOverride: "SUMMER_WINDSURF_MCP_CONFIG_FILE",
|
|
146
|
+
format: "json",
|
|
147
|
+
mcp: {
|
|
148
|
+
user: home(".codeium", "windsurf", "mcp_config.json"),
|
|
149
|
+
project: null,
|
|
150
|
+
},
|
|
151
|
+
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.",
|
|
152
|
+
skills: skillDirs(home(".codeium", "windsurf", "skills"), project(".windsurf", "skills")),
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: "antigravity",
|
|
156
|
+
label: "Antigravity",
|
|
157
|
+
aliases: ["agy", "google-antigravity"],
|
|
158
|
+
status: "active",
|
|
159
|
+
envOverride: "SUMMER_ANTIGRAVITY_CONFIG_FILE",
|
|
160
|
+
format: "json",
|
|
161
|
+
mcp: {
|
|
162
|
+
user: home(".gemini", "config", "mcp_config.json"),
|
|
163
|
+
project: project(".agents", "mcp_config.json"),
|
|
164
|
+
},
|
|
165
|
+
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).",
|
|
166
|
+
skills: skillDirs(home(".gemini", "config", "skills"), project(".agents", "skills")),
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
id: "gemini",
|
|
170
|
+
label: "Gemini CLI",
|
|
171
|
+
aliases: ["gemini-cli"],
|
|
172
|
+
status: "legacy",
|
|
173
|
+
legacyNote: "Gemini CLI was retired for individual accounts on 2026-06-18 and replaced by Antigravity. Use `summer setup antigravity` unless you are on a Workspace/enterprise Gemini CLI.",
|
|
174
|
+
envOverride: "SUMMER_GEMINI_CONFIG_FILE",
|
|
175
|
+
format: "json-gemini",
|
|
176
|
+
mcp: {
|
|
177
|
+
user: home(".gemini", "extensions", "summer-engine", "gemini-extension.json"),
|
|
178
|
+
project: null,
|
|
179
|
+
},
|
|
180
|
+
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).",
|
|
181
|
+
skills: skillDirs(home(".gemini", "extensions", "summer-engine", "skills"), null),
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
id: "cline",
|
|
185
|
+
label: "Cline (VS Code)",
|
|
186
|
+
aliases: ["cline-vscode"],
|
|
187
|
+
status: "active",
|
|
188
|
+
envOverride: "SUMMER_CLINE_CONFIG_FILE",
|
|
189
|
+
format: "json",
|
|
190
|
+
mcp: {
|
|
191
|
+
user: (ctx) => vsCodeGlobalStorage(ctx, "saoudrizwan.claude-dev", "cline_mcp_settings.json"),
|
|
192
|
+
project: null,
|
|
193
|
+
},
|
|
194
|
+
restart: "Restart VS Code so Cline reloads its MCP config.",
|
|
195
|
+
skills: skillDirs(home(".cline", "skills"), project(".cline", "skills")),
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: "cline-cli",
|
|
199
|
+
label: "Cline CLI",
|
|
200
|
+
aliases: ["clinecli"],
|
|
201
|
+
status: "active",
|
|
202
|
+
envOverride: "SUMMER_CLINE_CLI_CONFIG_FILE",
|
|
203
|
+
format: "json",
|
|
204
|
+
mcp: { user: home(".cline", "data", "settings", "cline_mcp_settings.json"), project: null },
|
|
205
|
+
restart: "Restart the Cline CLI so it reloads its MCP settings.",
|
|
206
|
+
skills: skillDirs(home(".cline", "skills"), project(".cline", "skills")),
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
id: "roo-code",
|
|
210
|
+
label: "Roo Code",
|
|
211
|
+
aliases: ["roo", "roocode"],
|
|
212
|
+
status: "legacy",
|
|
213
|
+
legacyNote: "Roo Code shut down on 2026-05-15. The extension may still run, but it is no longer maintained; consider Cline or Kilo Code.",
|
|
214
|
+
envOverride: "SUMMER_ROO_CODE_CONFIG_FILE",
|
|
215
|
+
format: "json",
|
|
216
|
+
mcp: {
|
|
217
|
+
user: (ctx) => vsCodeGlobalStorage(ctx, "rooveterinaryinc.roo-cline", "cline_mcp_settings.json"),
|
|
218
|
+
project: null,
|
|
219
|
+
},
|
|
220
|
+
restart: "Restart VS Code so Roo Code reloads its MCP config.",
|
|
221
|
+
skills: {
|
|
222
|
+
kind: "cline-rule-dir",
|
|
223
|
+
user: home("Documents", "Roo", "Rules"),
|
|
224
|
+
project: project(".clinerules"),
|
|
225
|
+
defaultScope: "project",
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
id: "kilo-code",
|
|
230
|
+
label: "Kilo Code",
|
|
231
|
+
aliases: ["kilo", "kilocode"],
|
|
232
|
+
status: "active",
|
|
233
|
+
envOverride: "SUMMER_KILO_CODE_CONFIG_FILE",
|
|
234
|
+
format: "json-opencode",
|
|
235
|
+
mcp: {
|
|
236
|
+
user: (ctx) => join(xdgOrAppData(ctx), "kilo", "kilo.json"),
|
|
237
|
+
project: project("kilo.json"),
|
|
238
|
+
},
|
|
239
|
+
restart: "Restart Kilo (CLI or the VS Code extension) so it reloads kilo.json.",
|
|
240
|
+
skills: skillDirs(home(".kilo", "skills"), project(".kilo", "skills")),
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
id: "github-copilot",
|
|
244
|
+
label: "GitHub Copilot CLI",
|
|
245
|
+
aliases: ["copilot", "copilot-cli", "github-copilot-cli"],
|
|
246
|
+
status: "active",
|
|
247
|
+
envOverride: "SUMMER_GITHUB_COPILOT_CONFIG_FILE",
|
|
248
|
+
format: "json-copilot",
|
|
249
|
+
mcp: { user: home(".copilot", "mcp-config.json"), project: project(".mcp.json") },
|
|
250
|
+
restart: "Restart Copilot CLI, or run /mcp reload and /skills reload in the active session.",
|
|
251
|
+
skills: skillDirs(home(".copilot", "skills"), project(".github", "skills")),
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
id: "vscode-copilot",
|
|
255
|
+
label: "GitHub Copilot in VS Code",
|
|
256
|
+
aliases: ["vscode", "vs-code", "vs-code-copilot", "github-copilot-vscode"],
|
|
257
|
+
status: "active",
|
|
258
|
+
envOverride: "SUMMER_VSCODE_COPILOT_CONFIG_FILE",
|
|
259
|
+
format: "json-vscode",
|
|
260
|
+
mcp: { user: (ctx) => join(vsCodeUserDir(ctx), "mcp.json"), project: project(".vscode", "mcp.json") },
|
|
261
|
+
restart: "Restart VS Code or run MCP: List Servers, then start summer-engine in Copilot Agent mode.",
|
|
262
|
+
skills: skillDirs(home(".copilot", "skills"), project(".github", "skills")),
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
id: "visual-studio",
|
|
266
|
+
label: "GitHub Copilot in Visual Studio",
|
|
267
|
+
aliases: ["vs", "vs2026", "visual-studio-2026", "visualstudio"],
|
|
268
|
+
status: "active",
|
|
269
|
+
envOverride: "SUMMER_VISUAL_STUDIO_CONFIG_FILE",
|
|
270
|
+
format: "json-vscode",
|
|
271
|
+
mcp: { user: home(".mcp.json"), project: project(".mcp.json") },
|
|
272
|
+
restart: "Restart Visual Studio, open Copilot Chat in Agent mode, and enable summer-engine in the tools picker.",
|
|
273
|
+
skills: null,
|
|
274
|
+
noSkillsNote: "Visual Studio's Copilot has no skills folder yet; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: "copilot-jetbrains",
|
|
278
|
+
label: "GitHub Copilot in JetBrains IDEs",
|
|
279
|
+
aliases: ["jetbrains-copilot", "intellij-copilot", "copilot-intellij"],
|
|
280
|
+
status: "active",
|
|
281
|
+
envOverride: "SUMMER_COPILOT_JETBRAINS_CONFIG_FILE",
|
|
282
|
+
format: "json-servers",
|
|
283
|
+
mcp: {
|
|
284
|
+
user: (ctx) => join(xdgOrAppData(ctx), "github-copilot", "intellij", "mcp.json"),
|
|
285
|
+
project: null,
|
|
286
|
+
},
|
|
287
|
+
restart: "Restart the JetBrains IDE and open Copilot Chat in Agent mode; summer-engine shows in the tools list.",
|
|
288
|
+
skills: null,
|
|
289
|
+
noSkillsNote: "Copilot in JetBrains documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
id: "opencode",
|
|
293
|
+
label: "OpenCode",
|
|
294
|
+
aliases: ["open-code"],
|
|
295
|
+
status: "active",
|
|
296
|
+
envOverride: "SUMMER_OPENCODE_CONFIG_FILE",
|
|
297
|
+
format: "json-opencode",
|
|
298
|
+
mcp: {
|
|
299
|
+
user: (ctx) => join(xdgOrAppData(ctx), "opencode", "opencode.json"),
|
|
300
|
+
project: project("opencode.json"),
|
|
301
|
+
},
|
|
302
|
+
restart: "Restart OpenCode so it reloads opencode.json.",
|
|
303
|
+
skills: skillDirs((ctx) => join(xdgOrAppData(ctx), "opencode", "skills"), project(".opencode", "skills"), {
|
|
304
|
+
reloadHint: "OpenCode loads skills from this folder on the next session. Summer 3.0 and earlier wrote markdown under agents/summer; `--force` removes those.",
|
|
305
|
+
legacyRules: { user: (ctx) => join(xdgOrAppData(ctx), "opencode", "agents", "summer"), project: project(".opencode", "agents", "summer"), suffix: ".md" },
|
|
306
|
+
}),
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
id: "zed",
|
|
310
|
+
label: "Zed",
|
|
311
|
+
aliases: ["zed-editor"],
|
|
312
|
+
status: "active",
|
|
313
|
+
envOverride: "SUMMER_ZED_CONFIG_FILE",
|
|
314
|
+
format: "json-zed",
|
|
315
|
+
mcp: {
|
|
316
|
+
user: (ctx) => join(xdgOrAppData(ctx), "zed", "settings.json"),
|
|
317
|
+
project: null,
|
|
318
|
+
},
|
|
319
|
+
restart: "Zed reloads settings.json live; open the Agent panel and check summer-engine under MCP servers.",
|
|
320
|
+
skills: skillDirs(home(".agents", "skills"), project(".agents", "skills")),
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
id: "kiro",
|
|
324
|
+
label: "Kiro",
|
|
325
|
+
aliases: ["kiro-ide", "aws-kiro"],
|
|
326
|
+
status: "active",
|
|
327
|
+
envOverride: "SUMMER_KIRO_CONFIG_FILE",
|
|
328
|
+
format: "json",
|
|
329
|
+
mcp: { user: home(".kiro", "settings", "mcp.json"), project: project(".kiro", "settings", "mcp.json") },
|
|
330
|
+
restart: "Kiro reloads MCP config on save; open the MCP Servers view to confirm summer-engine is connected.",
|
|
331
|
+
skills: skillDirs(home(".kiro", "skills"), project(".kiro", "skills")),
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
id: "goose",
|
|
335
|
+
label: "Goose",
|
|
336
|
+
aliases: ["block-goose", "codename-goose"],
|
|
337
|
+
status: "active",
|
|
338
|
+
envOverride: "SUMMER_GOOSE_CONFIG_FILE",
|
|
339
|
+
format: "yaml-goose",
|
|
340
|
+
mcp: {
|
|
341
|
+
user: (ctx) => ctx.os === "win32"
|
|
342
|
+
? join(appData(ctx), "Block", "goose", "config", "config.yaml")
|
|
343
|
+
: join(xdgConfig(ctx), "goose", "config.yaml"),
|
|
344
|
+
project: null,
|
|
345
|
+
},
|
|
346
|
+
restart: "Restart Goose (CLI or Desktop); summer-engine is listed under Extensions.",
|
|
347
|
+
skills: skillDirs((ctx) => join(xdgConfig(ctx), "agents", "skills"), project(".agents", "skills")),
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
id: "hermes",
|
|
351
|
+
label: "Hermes Agent",
|
|
352
|
+
aliases: ["hermes-agent", "nous-hermes"],
|
|
353
|
+
status: "active",
|
|
354
|
+
envOverride: "SUMMER_HERMES_CONFIG_FILE",
|
|
355
|
+
format: "yaml-hermes",
|
|
356
|
+
mcp: { user: home(".hermes", "config.yaml"), project: null },
|
|
357
|
+
restart: "Run /reload-mcp in Hermes Agent (or restart it).",
|
|
358
|
+
skills: skillDirs(home(".hermes", "skills"), project(".hermes", "skills"), {
|
|
359
|
+
reloadHint: "Project skills need `hermes skills trust` before Hermes loads them.",
|
|
360
|
+
}),
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
id: "trae",
|
|
364
|
+
label: "Trae",
|
|
365
|
+
aliases: ["trae-ide", "bytedance-trae"],
|
|
366
|
+
status: "active",
|
|
367
|
+
envOverride: "SUMMER_TRAE_CONFIG_FILE",
|
|
368
|
+
format: "json",
|
|
369
|
+
mcp: {
|
|
370
|
+
user: null,
|
|
371
|
+
project: project(".trae", "mcp.json"),
|
|
372
|
+
projectNote: "Trae manages user-level MCP servers in its UI; writing the project file .trae/mcp.json instead.",
|
|
373
|
+
},
|
|
374
|
+
restart: "Restart Trae and open the MCP settings; summer-engine should show as connected.",
|
|
375
|
+
skills: null,
|
|
376
|
+
noSkillsNote: "Trae documents no skills folder; the MCP server ships summer_get_agent_playbook for in-chat guidance.",
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
id: "qwen-code",
|
|
380
|
+
label: "Qwen Code",
|
|
381
|
+
aliases: ["qwen", "qwencode"],
|
|
382
|
+
status: "active",
|
|
383
|
+
envOverride: "SUMMER_QWEN_CODE_CONFIG_FILE",
|
|
384
|
+
format: "json",
|
|
385
|
+
mcp: { user: home(".qwen", "settings.json"), project: project(".qwen", "settings.json") },
|
|
386
|
+
restart: "Restart Qwen Code or run /mcp in a new session.",
|
|
387
|
+
skills: skillDirs(home(".qwen", "skills"), project(".qwen", "skills")),
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
id: "kimi-code",
|
|
391
|
+
label: "Kimi Code CLI",
|
|
392
|
+
aliases: ["kimi", "kimi-cli", "kimicode"],
|
|
393
|
+
status: "active",
|
|
394
|
+
envOverride: "SUMMER_KIMI_CODE_CONFIG_FILE",
|
|
395
|
+
format: "json",
|
|
396
|
+
mcp: { user: home(".kimi-code", "mcp.json"), project: project(".kimi-code", "mcp.json") },
|
|
397
|
+
restart: "Restart Kimi Code CLI so it reconnects its MCP servers.",
|
|
398
|
+
skills: skillDirs(home(".kimi-code", "skills"), project(".kimi-code", "skills")),
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
id: "crush",
|
|
402
|
+
label: "Crush",
|
|
403
|
+
aliases: ["charm-crush"],
|
|
404
|
+
status: "active",
|
|
405
|
+
envOverride: "SUMMER_CRUSH_CONFIG_FILE",
|
|
406
|
+
format: "json-crush",
|
|
407
|
+
mcp: {
|
|
408
|
+
user: home(".config", "crush", "crushrc"),
|
|
409
|
+
project: project(".crushrc"),
|
|
410
|
+
},
|
|
411
|
+
restart: "Restart Crush so it reloads crushrc.",
|
|
412
|
+
skills: skillDirs(home(".config", "crush", "skills"), project(".crush", "skills")),
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
id: "amp",
|
|
416
|
+
label: "Amp",
|
|
417
|
+
aliases: ["sourcegraph-amp", "ampcode"],
|
|
418
|
+
status: "active",
|
|
419
|
+
envOverride: "SUMMER_AMP_CONFIG_FILE",
|
|
420
|
+
format: "json-amp",
|
|
421
|
+
mcp: { user: (ctx) => join(xdgOrAppData(ctx), "amp", "settings.json"), project: null },
|
|
422
|
+
restart: "Restart Amp so it reloads settings.json.",
|
|
423
|
+
skills: skillDirs((ctx) => join(xdgOrAppData(ctx), "amp", "skills"), project(".agents", "skills")),
|
|
424
|
+
},
|
|
425
|
+
{
|
|
426
|
+
id: "factory",
|
|
427
|
+
label: "Factory Droid",
|
|
428
|
+
aliases: ["droid", "factory-droid"],
|
|
429
|
+
status: "active",
|
|
430
|
+
envOverride: "SUMMER_FACTORY_CONFIG_FILE",
|
|
431
|
+
format: "json-stdio",
|
|
432
|
+
mcp: { user: home(".factory", "mcp.json"), project: project(".factory", "mcp.json") },
|
|
433
|
+
restart: "Restart droid or run /mcp in the active session.",
|
|
434
|
+
skills: skillDirs(home(".factory", "skills"), project(".factory", "skills")),
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
id: "junie",
|
|
438
|
+
label: "Junie",
|
|
439
|
+
aliases: ["jetbrains-junie"],
|
|
440
|
+
status: "active",
|
|
441
|
+
envOverride: "SUMMER_JUNIE_CONFIG_FILE",
|
|
442
|
+
format: "json",
|
|
443
|
+
mcp: { user: home(".junie", "mcp", "mcp.json"), project: project(".junie", "mcp", "mcp.json") },
|
|
444
|
+
restart: "Restart the JetBrains IDE so Junie reloads its MCP config.",
|
|
445
|
+
skills: null,
|
|
446
|
+
noSkillsNote: "Junie has no skills folder; put project guidance in .junie/guidelines.md. The MCP server ships summer_get_agent_playbook for in-chat guidance.",
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
id: "warp",
|
|
450
|
+
label: "Warp",
|
|
451
|
+
aliases: ["warp-terminal"],
|
|
452
|
+
status: "active",
|
|
453
|
+
envOverride: "SUMMER_WARP_CONFIG_FILE",
|
|
454
|
+
format: "json",
|
|
455
|
+
mcp: { user: home(".warp", ".mcp.json"), project: project(".warp", ".mcp.json") },
|
|
456
|
+
restart: "Warp detects the file and spawns the server; check Settings > AI > MCP servers.",
|
|
457
|
+
skills: skillDirs(home(".warp", "skills"), project(".warp", "skills")),
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
id: "rovo-dev",
|
|
461
|
+
label: "Rovo Dev CLI",
|
|
462
|
+
aliases: ["rovodev", "rovo", "atlassian-rovo-dev"],
|
|
463
|
+
status: "active",
|
|
464
|
+
envOverride: "SUMMER_ROVO_DEV_CONFIG_FILE",
|
|
465
|
+
format: "json-transport",
|
|
466
|
+
mcp: { user: home(".rovodev", "mcp.json"), project: null },
|
|
467
|
+
restart: "Restart Rovo Dev CLI so it reconnects its MCP servers.",
|
|
468
|
+
skills: skillDirs(home(".rovodev", "skills"), project(".rovodev", "skills")),
|
|
469
|
+
},
|
|
470
|
+
{
|
|
471
|
+
id: "qoder",
|
|
472
|
+
label: "Qoder CLI",
|
|
473
|
+
aliases: ["qoder-cli"],
|
|
474
|
+
status: "active",
|
|
475
|
+
envOverride: "SUMMER_QODER_CONFIG_FILE",
|
|
476
|
+
format: "json",
|
|
477
|
+
mcp: { user: home(".qoder", "settings.json"), project: project(".mcp.json") },
|
|
478
|
+
restart: "Restart Qoder CLI so it reloads its MCP settings (the Qoder IDE manages servers in its UI).",
|
|
479
|
+
skills: skillDirs(home(".qoder", "skills"), project(".qoder", "skills")),
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
id: "grok-build",
|
|
483
|
+
label: "Grok Build",
|
|
484
|
+
aliases: ["grok", "xai-grok"],
|
|
485
|
+
status: "active",
|
|
486
|
+
envOverride: "SUMMER_GROK_BUILD_CONFIG_FILE",
|
|
487
|
+
format: "toml",
|
|
488
|
+
mcp: { user: home(".grok", "config.toml"), project: project(".grok", "config.toml") },
|
|
489
|
+
restart: "Restart Grok Build so it reloads config.toml (it also reads ~/.claude.json and .cursor/mcp.json).",
|
|
490
|
+
skills: skillDirs(home(".grok", "skills"), project(".grok", "skills")),
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
id: "mistral-vibe",
|
|
494
|
+
label: "Mistral Vibe",
|
|
495
|
+
aliases: ["vibe", "mistral"],
|
|
496
|
+
status: "active",
|
|
497
|
+
envOverride: "SUMMER_MISTRAL_VIBE_CONFIG_FILE",
|
|
498
|
+
format: "toml-array",
|
|
499
|
+
mcp: { user: home(".vibe", "config.toml"), project: project(".vibe", "config.toml") },
|
|
500
|
+
restart: "Restart Vibe so it reloads config.toml.",
|
|
501
|
+
skills: skillDirs(home(".vibe", "skills"), project(".vibe", "skills")),
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
id: "lm-studio",
|
|
505
|
+
label: "LM Studio",
|
|
506
|
+
aliases: ["lmstudio", "lm_studio"],
|
|
507
|
+
status: "active",
|
|
508
|
+
envOverride: "SUMMER_LM_STUDIO_CONFIG_FILE",
|
|
509
|
+
format: "json",
|
|
510
|
+
mcp: { user: home(".lmstudio", "mcp.json"), project: null },
|
|
511
|
+
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.",
|
|
512
|
+
skills: null,
|
|
513
|
+
noSkillsNote: "LM Studio has no rules or skills folder. The MCP server ships summer_get_agent_playbook, so the model can pull Summer guidance in-chat.",
|
|
514
|
+
},
|
|
515
|
+
];
|
|
516
|
+
const BY_ID = new Map(SPECS.map((spec) => [spec.id, spec]));
|
|
517
|
+
export function agentSpec(id) {
|
|
518
|
+
const spec = BY_ID.get(id);
|
|
519
|
+
if (!spec)
|
|
520
|
+
throw new Error(`Unknown agent: ${id}`);
|
|
521
|
+
return spec;
|
|
522
|
+
}
|
|
523
|
+
export function allAgentSpecs() {
|
|
524
|
+
return SPECS;
|
|
525
|
+
}
|
|
526
|
+
/** Ids shown in help and error messages (legacy ids still parse). */
|
|
527
|
+
export const supportedAgents = SPECS.filter((s) => s.status === "active").map((s) => s.id);
|
|
528
|
+
/** Ids with a skills/rules home; `AGENT_CLIENTS` in core mirrors this plus "summer". */
|
|
529
|
+
export const skillCapableAgents = SPECS.filter((s) => s.skills !== null).map((s) => s.id);
|
|
530
|
+
/** Every spelling → canonical id. Aliases must be unique across the table. */
|
|
531
|
+
export function agentAliasMap() {
|
|
532
|
+
const map = {};
|
|
533
|
+
for (const spec of SPECS) {
|
|
534
|
+
for (const key of [spec.id, ...spec.aliases]) {
|
|
535
|
+
if (map[key] && map[key] !== spec.id) {
|
|
536
|
+
throw new Error(`Agent alias "${key}" is claimed by both ${map[key]} and ${spec.id}`);
|
|
537
|
+
}
|
|
538
|
+
map[key] = spec.id;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
return map;
|
|
542
|
+
}
|
|
543
|
+
export function agentLabel(id) {
|
|
544
|
+
return agentSpec(id).label;
|
|
545
|
+
}
|
|
546
|
+
export function defaultPathContext(env = process.env, cwd = process.cwd()) {
|
|
547
|
+
return { home: homedir(), os: platform(), env, cwd };
|
|
548
|
+
}
|
|
549
|
+
/** Where the MCP config goes for an agent and requested scope, with the warnings to show. */
|
|
550
|
+
export function resolveMcpPath(spec, scope, ctx) {
|
|
551
|
+
const warnings = [];
|
|
552
|
+
if (spec.status === "legacy" && spec.legacyNote)
|
|
553
|
+
warnings.push(spec.legacyNote);
|
|
554
|
+
if (scope === "project" || spec.mcp.user === null) {
|
|
555
|
+
if (spec.mcp.project) {
|
|
556
|
+
if (spec.mcp.projectNote && (scope === "project" || spec.mcp.user === null))
|
|
557
|
+
warnings.push(spec.mcp.projectNote);
|
|
558
|
+
return { path: spec.mcp.project(ctx), scope: "project", warnings };
|
|
559
|
+
}
|
|
560
|
+
warnings.push(spec.mcp.projectNote ??
|
|
561
|
+
`${spec.label} reads MCP config from one user-level file only; writing user scope instead.`);
|
|
562
|
+
}
|
|
563
|
+
if (spec.mcp.user === null)
|
|
564
|
+
throw new Error(`${spec.label} has neither a user nor a project MCP config path.`);
|
|
565
|
+
return { path: spec.mcp.user(ctx), scope: "user", warnings };
|
|
566
|
+
}
|
|
567
|
+
/** Rule files a pre-3.1 Summer wrote for this agent at this scope; `null` when the agent never had any. */
|
|
568
|
+
export function legacyRuleFiles(spec, scope, ctx, skillNames) {
|
|
569
|
+
const legacy = spec.skills?.legacyRules;
|
|
570
|
+
if (!legacy)
|
|
571
|
+
return null;
|
|
572
|
+
const dir = scope === "project" && legacy.project ? legacy.project(ctx) : legacy.user(ctx);
|
|
573
|
+
const prefix = spec.id === "opencode" ? "" : "summer-";
|
|
574
|
+
return [...skillNames].map((name) => join(dir, `${prefix}${name}${legacy.suffix}`));
|
|
575
|
+
}
|
|
576
|
+
/** Where skills go for an agent with a skills home. */
|
|
577
|
+
export function resolveSkillPath(spec, scope, ctx) {
|
|
578
|
+
if (!spec.skills)
|
|
579
|
+
return null;
|
|
580
|
+
if (scope === "project" && spec.skills.project) {
|
|
581
|
+
return { kind: spec.skills.kind, path: spec.skills.project(ctx), scope };
|
|
582
|
+
}
|
|
583
|
+
return { kind: spec.skills.kind, path: spec.skills.user(ctx), scope: "user" };
|
|
584
|
+
}
|
package/dist/installer/setup.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { spawnSync } from "child_process";
|
|
2
2
|
import { AGENT_CLIENTS, getSkillRegistry, selectSkillsForBulkInstall, } from "../core/skills-registry.js";
|
|
3
3
|
import { describeInstallLocation, resolveInstallLocation } from "./skill-locations.js";
|
|
4
|
+
import { agentSpec } from "./agent-table.js";
|
|
4
5
|
/**
|
|
5
6
|
* The preview clause of the setup summary — one wording for the result message
|
|
6
7
|
* and the CLI line, e.g. "10 preview — labelled in each skill's guidance; use
|
|
@@ -26,10 +27,11 @@ export function previewNote(result) {
|
|
|
26
27
|
* the preview skills (installed by default, labelled in their guidance).
|
|
27
28
|
*/
|
|
28
29
|
export function setupSkills(agent, options) {
|
|
29
|
-
|
|
30
|
+
const spec = agentSpec(agent);
|
|
31
|
+
if (!spec.skills) {
|
|
30
32
|
return {
|
|
31
33
|
status: "skipped",
|
|
32
|
-
message:
|
|
34
|
+
message: spec.noSkillsNote ?? `${spec.label} has no skills folder; the MCP server alone is configured.`,
|
|
33
35
|
};
|
|
34
36
|
}
|
|
35
37
|
const scope = options.scope ?? "user";
|
|
@@ -3,9 +3,12 @@
|
|
|
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 { type AgentClient } from "../core/skills-registry.js";
|
|
11
|
+
import { type SkillLocationKind } from "./agent-table.js";
|
|
9
12
|
export declare const SKILL_SCOPES: readonly ["user", "project"];
|
|
10
13
|
export type SkillScope = (typeof SKILL_SCOPES)[number];
|
|
11
14
|
/** The agent/scope flags `summer skills install` accepts (legacy aliases included). */
|
|
@@ -22,24 +25,12 @@ export declare function parseSkillScope(value: string): SkillScope;
|
|
|
22
25
|
/** Pick the agent from --agent / legacy --as-claude-skill / --as-cursor-skill
|
|
23
26
|
* (default "summer"); throws on conflicting flags. */
|
|
24
27
|
export declare function resolveSkillAgent(opts: SkillInstallSelection): AgentClient;
|
|
25
|
-
/** Explicit --scope wins; otherwise
|
|
28
|
+
/** Explicit --scope wins; otherwise the agent's default (rule-file agents default to "project"). */
|
|
26
29
|
export declare function resolveSkillScope(agent: AgentClient, opts: SkillInstallSelection): SkillScope;
|
|
27
|
-
export
|
|
28
|
-
kind:
|
|
30
|
+
export interface InstallLocation {
|
|
31
|
+
kind: SkillLocationKind;
|
|
29
32
|
path: string;
|
|
30
|
-
}
|
|
31
|
-
kind: "cursor-rule-dir";
|
|
32
|
-
path: string;
|
|
33
|
-
} | {
|
|
34
|
-
kind: "windsurf-rule-file";
|
|
35
|
-
path: string;
|
|
36
|
-
} | {
|
|
37
|
-
kind: "cline-rule-dir";
|
|
38
|
-
path: string;
|
|
39
|
-
} | {
|
|
40
|
-
kind: "opencode-skill-dir";
|
|
41
|
-
path: string;
|
|
42
|
-
};
|
|
33
|
+
}
|
|
43
34
|
export declare function resolveInstallLocation(agent: AgentClient, scope: SkillScope): InstallLocation;
|
|
44
35
|
/** One-line, human path pattern for where an install location puts skills. */
|
|
45
36
|
export declare function describeInstallLocation(location: InstallLocation): string;
|