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
@@ -11,7 +11,7 @@
11
11
  {
12
12
  "name": "summer",
13
13
  "source": "./",
14
- "version": "3.0.0",
14
+ "version": "3.1.0",
15
15
  "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 86-tool MCP bridge to the local desktop app.",
16
16
  "author": {
17
17
  "name": "Summer Engine",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "_generated": "GENERATED from integrations/claude — do not edit; npm run generate:registry",
4
4
  "name": "summer",
5
- "version": "3.0.0",
5
+ "version": "3.1.0",
6
6
  "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 86-tool MCP bridge to the local desktop app.",
7
7
  "author": {
8
8
  "name": "Summer Engine",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_generated": "GENERATED from integrations/codex — 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: game-dev skills, lifecycle hooks, and a 86-tool MCP bridge. Build games by talking.",
6
6
  "author": {
7
7
  "name": "Summer Engine",
@@ -3,7 +3,7 @@
3
3
  "_generated": "GENERATED from integrations/cursor — do not edit; npm run generate:registry",
4
4
  "name": "summer",
5
5
  "displayName": "Summer",
6
- "version": "3.0.0",
6
+ "version": "3.1.0",
7
7
  "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 86-tool MCP bridge to the local desktop app.",
8
8
  "author": {
9
9
  "name": "Summer Engine",
@@ -2,7 +2,7 @@
2
2
  "_generated": "GENERATED from integrations/factory — do not edit; npm run generate:registry",
3
3
  "name": "summer",
4
4
  "description": "Agent tooling for Summer Engine: game-dev skills, lifecycle hooks, and a 86-tool MCP bridge to the local desktop app.",
5
- "version": "3.0.0",
5
+ "version": "3.1.0",
6
6
  "author": {
7
7
  "name": "Summer Engine",
8
8
  "email": "founders@summerengine.com",
package/CHANGELOG.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  All notable changes to summer-engine will be documented here. Following [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/).
4
4
 
5
+ ## [3.1.0] - 2026-09-11
6
+
7
+ ### Added
8
+ - `summer setup` now covers every MCP-capable coding agent with a user-editable config: Claude Desktop, Antigravity, Zed, Kiro, Goose, Hermes Agent, GitHub Copilot in Visual Studio and in JetBrains IDEs, Trae, Qwen Code, Kimi Code CLI, Crush, Amp, Factory Droid, Junie, Warp, Rovo Dev CLI, Qoder CLI, Grok Build, Mistral Vibe and Cline CLI join the existing targets (31 active agents). New file shapes: Zed `context_servers`, Amp `amp.mcpServers`, Crush `mcp`, Rovo `transport: stdio`, Mistral Vibe `[[mcp_servers]]` TOML, Goose and Hermes YAML (comments preserved), typed-stdio `mcpServers`.
9
+ - One agent table (`src/installer/agent-table.ts`) now holds every per-agent fact: label, aliases, MCP path per scope and OS, file shape, skills home, restart hint. `integrations/<id>/` folders, `AGENT_CLIENTS`, doctor's skill-marker probes and the docs tables are checked against it by tests.
10
+
11
+ ### Changed
12
+ - Cursor skills install as `~/.cursor/skills/<skill>/SKILL.md` (Cursor's skills format) instead of `.cursor/rules/*.mdc`; `--force` removes the old rule files.
13
+ - Devin Desktop (formerly Windsurf) skills install as `~/.codeium/windsurf/skills/<skill>/SKILL.md` instead of a `.windsurfrules` block.
14
+ - Cline skills install to `~/.cline/skills` (shared by the VS Code extension and the CLI) instead of `Documents/Cline/Rules` markdown.
15
+ - OpenCode skills install to `~/.config/opencode/skills/<skill>/SKILL.md` (OpenCode's native skills folder) instead of `agents/summer/*.md`; `--force` removes the old files.
16
+ - Kilo Code config moved to `~/.config/kilo/kilo.json` (`mcp` key, array command, `enabled: true`) and `./kilo.json` for project scope, matching Kilo's current CLI + extension; skills go to `~/.kilo/skills`.
17
+ - Claude Code and Cursor entries now carry `type: "stdio"`, which both products' docs list as required.
18
+ - Project requests on agents with a user-only config now warn with one shared wording ("writing user scope instead"); Trae, whose user-level servers are UI-managed, writes its project file.
19
+
20
+ ### Deprecated
21
+ - `gemini` (Gemini CLI, retired for individual accounts 2026-06-18) and `roo-code` (shut down 2026-05-15) still work but are hidden from help and warn on use; `antigravity` is the replacement for Gemini users.
22
+
5
23
  ## [3.0.0] (2026-09-09): "The Library"
6
24
 
7
25
  v3 rebuilds the package around one idea: every resource is described once (`library/<kind>/<slug>/resource.yaml`) and everything else (the searchable index, every agent manifest, the skill and template registries, counts, aliases) is generated from it, with CI failing on drift. Migrating from v2: `docs/MIGRATION-V2-V3.md`. The design contract and the verified-vs-planned status live in the repository under `docs/design/`.
package/README.md CHANGED
@@ -93,7 +93,7 @@ The check ids are `node-version`, `cli-version`, `cli-version-current`, `skills-
93
93
  npx -y summer-engine@latest setup claude-code --yes --force
94
94
  ```
95
95
 
96
- Replace `claude-code` with the user's actual agent: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `kilo-code`, `gemini`, `github-copilot`, `vscode-copilot`, `opencode`, or `lm-studio`. Use `github-copilot` for Copilot CLI and `vscode-copilot` for GitHub Copilot Chat/Agent in VS Code. Factory Droid uses the plugin marketplace path (see [`integrations/README.md`](integrations/README.md)). This installs **every skill in the library** (`status: preview` skills included — they are labelled as preview in their guidance, and `--stable-only` skips them) to `~/.claude/skills/<slug>/SKILL.md` (or the agent's equivalent user-skill directory) AND writes the MCP server config so the agent can talk to the engine, then runs doctor and prints what it installed and where. The `--force` flag wipes any stale skill content first, so re-runs always end up with the latest copy. `--recommended` installs only the recommended subset — don't use it from this playbook.
96
+ Replace `claude-code` with the user's actual agent: `claude-desktop`, `codex`, `cursor`, `windsurf`, `antigravity`, `cline`, `cline-cli`, `kilo-code`, `github-copilot`, `vscode-copilot`, `visual-studio`, `copilot-jetbrains`, `opencode`, `zed`, `kiro`, `goose`, `hermes`, `trae`, `qwen-code`, `kimi-code`, `crush`, `amp`, `factory`, `junie`, `warp`, `rovo-dev`, `qoder`, `grok-build`, `mistral-vibe`, `lm-studio`. Use `github-copilot` for Copilot CLI, `vscode-copilot` for GitHub Copilot Chat/Agent in VS Code, `visual-studio` for Copilot in Visual Studio, and `copilot-jetbrains` for Copilot in JetBrains IDEs. `gemini` (Gemini CLI, retired June 2026) and `roo-code` (shut down May 2026) still work but are legacy; use `antigravity` for Google's agent. This installs **every skill in the library** (`status: preview` skills included — they are labelled as preview in their guidance, and `--stable-only` skips them) to `~/.claude/skills/<slug>/SKILL.md` (or the agent's equivalent user-skill directory) AND writes the MCP server config so the agent can talk to the engine, then runs doctor and prints what it installed and where. The `--force` flag wipes any stale skill content first, so re-runs always end up with the latest copy. `--recommended` installs only the recommended subset — don't use it from this playbook.
97
97
 
98
98
  **First-install detection:** if `~/.claude/skills/` didn't exist before this command, Claude Code wasn't watching it and won't auto-detect the new files this session. Tell the user **once**: "Skills installed - restart your agent so they load." On subsequent installs (directory already existed), skills auto-detect mid-session and no restart is needed. **You can detect first-install vs upgrade by checking if `~/.claude/skills/` existed before Step 1; record the result before running setup.**
99
99
 
@@ -186,7 +186,7 @@ Only skip brainstorm if the user explicitly said "skip brainstorm" or "just buil
186
186
  - **Don't loop `summer login` if it times out at 120s.** Re-run it once and tell the user to be quicker; loop forever and the user is stuck.
187
187
  - **Don't jump straight into `summer create` from a vague prompt.** Invoke the `brainstorm-game` skill first (Step 6). The build skills assume `.summer/GameSoul.md` exists.
188
188
 
189
- **Using a different agent?** Replace `claude-code` with any supported agent in Step 1: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `kilo-code`, `gemini`, `github-copilot`, `vscode-copilot`, `opencode`, or `lm-studio`. (`devin` is also accepted as an alias for `windsurf`.) Skill targets vary per agent; the CLI handles the difference, and [`integrations/README.md`](integrations/README.md) documents exactly what gets written where for every client. After install, **Cline and Roo Code users should restart VS Code** so the extension reloads its MCP config. **Gemini users** may need to run `gemini extensions enable summer-engine` after the first install. **VS Code Copilot users** should start the `summer-engine` MCP server from Agent mode if VS Code does not autostart it.
189
+ **Using a different agent?** Replace `claude-code` with any supported agent in Step 1: `claude-desktop`, `codex`, `cursor`, `windsurf`, `antigravity`, `cline`, `cline-cli`, `kilo-code`, `github-copilot`, `vscode-copilot`, `visual-studio`, `copilot-jetbrains`, `opencode`, `zed`, `kiro`, `goose`, `hermes`, `trae`, `qwen-code`, `kimi-code`, `crush`, `amp`, `factory`, `junie`, `warp`, `rovo-dev`, `qoder`, `grok-build`, `mistral-vibe`, `lm-studio`. (`devin` is also accepted as an alias for `windsurf`; `agy` for `antigravity`; `droid` for `factory`.) Skill targets vary per agent; the CLI handles the difference, and [`integrations/README.md`](integrations/README.md) documents exactly what gets written where for every client. After install, **Cline users should restart VS Code** so the extension reloads its MCP config. **VS Code Copilot users** should start the `summer-engine` MCP server from Agent mode if VS Code does not autostart it.
190
190
 
191
191
  **Power-user note:** if the user specifically wants `summer` on their `PATH` for everyday terminal use outside the AI agent, a global npm install is still possible. The agent flow doesn't need it.
192
192
 
@@ -336,7 +336,7 @@ matchmaking are not promised by this package.
336
336
  | `summer list templates` / `projects` | Browse. |
337
337
  | `summer events [--follow] [--kinds <csv>] [--since <seq>] [--json]` | The engine events channel (engine 0.5.66+): newest events, or stream them live. |
338
338
  | `summer debug [issue…]` | Support-ready Markdown debug report. |
339
- | `summer skills list` | Show all skills. |
339
+ | `summer skills list` | Show all skills (`--by-domain` groups them; the same grouping is in [`library/skills/README.md`](library/skills/README.md)). |
340
340
  | `summer skills install <name>` | Install one. |
341
341
  | `summer skills install --all --agent <agent>` / `--recommended` [`--stable-only`] | Install every skill (preview included and labelled), or only the recommended subset; `--stable-only` skips preview skills. |
342
342
  | `summer tool <name> --args '<json>'` | Run any Summer tool from the shell — the same implementation the MCP tool uses. `summer tool --list` prints them all. |
@@ -344,7 +344,7 @@ matchmaking are not promised by this package.
344
344
  | `summer mcp setup <agent>` | Deprecated alias of `summer setup <agent>`. |
345
345
  | `summer setup <agent> [--yes] [--force] [--recommended] [--stable-only]` | One shot: MCP config + all skills, preview included (`--recommended` for the subset, `--stable-only` to skip preview) + doctor. Idempotent. |
346
346
 
347
- Agents: `claude-code`, `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `kilo-code`, `gemini`, `github-copilot`, `vscode-copilot`, `opencode`, `lm-studio`. (`devin` and `devin-desktop` are accepted as aliases for `windsurf`.) Scopes: `--scope user` (default), `--scope project`.
347
+ Agents: `claude-code`, `claude-desktop`, `codex`, `cursor`, `windsurf`, `antigravity`, `cline`, `cline-cli`, `kilo-code`, `github-copilot`, `vscode-copilot`, `visual-studio`, `copilot-jetbrains`, `opencode`, `zed`, `kiro`, `goose`, `hermes`, `trae`, `qwen-code`, `kimi-code`, `crush`, `amp`, `factory`, `junie`, `warp`, `rovo-dev`, `qoder`, `grok-build`, `mistral-vibe`, `lm-studio`. Legacy (still accepted, warn on use): `gemini`, `roo-code`. Aliases: `devin`/`devin-desktop` → `windsurf`, `agy` → `antigravity`, `droid` → `factory`, `copilot` → `github-copilot`, `vscode` → `vscode-copilot`, `kilo` → `kilo-code`, `qwen` → `qwen-code`, `kimi` → `kimi-code`. Scopes: `--scope user` (default), `--scope project`.
348
348
 
349
349
  ## Contributing
350
350
 
@@ -5,20 +5,7 @@ import { printDoctorResult, runDoctor } from "../../core/capabilities/doctor.js"
5
5
  import { brandLine, c, sym, tildeify } from "../../core/format.js";
6
6
  import { TOOLKIT_VERSION as cliVersion } from "../../core/version.js";
7
7
  import { resolveDefaultChannel } from "../../installer/version-check.js";
8
- const AGENT_LABEL = {
9
- "claude-code": "Claude Code",
10
- codex: "Codex",
11
- cursor: "Cursor",
12
- windsurf: "Devin Desktop (Windsurf)",
13
- cline: "Cline",
14
- "roo-code": "Roo Code",
15
- "kilo-code": "Kilo Code",
16
- gemini: "Gemini CLI",
17
- "github-copilot": "GitHub Copilot CLI",
18
- "vscode-copilot": "GitHub Copilot in VS Code",
19
- opencode: "OpenCode",
20
- "lm-studio": "LM Studio",
21
- };
8
+ import { agentLabel } from "../../installer/agent-table.js";
22
9
  export const setupCommand = new Command("setup")
23
10
  .description("Configure Summer Engine for an AI agent and run diagnostics")
24
11
  .argument("[agent]", `Agent to configure: ${supportedAgents.join(", ")}`)
@@ -82,15 +69,15 @@ function printSetupResult(config, skills, doctor) {
82
69
  console.log("");
83
70
  console.log(brandLine(cliVersion));
84
71
  console.log("");
85
- const agentLabel = AGENT_LABEL[config.agent] ?? config.agent;
72
+ const label = agentLabel(config.agent);
86
73
  if (config.dryRun) {
87
- console.log(` ${c.dim("(dry run)")} Would link to ${agentLabel} ${c.dim(tildeify(config.path))}`);
74
+ console.log(` ${c.dim("(dry run)")} Would link to ${label} ${c.dim(tildeify(config.path))}`);
88
75
  }
89
76
  else if (config.wrote) {
90
- console.log(` ${sym.ok()} Linked to ${c.bold(agentLabel)} ${c.dim(tildeify(config.path))}`);
77
+ console.log(` ${sym.ok()} Linked to ${c.bold(label)} ${c.dim(tildeify(config.path))}`);
91
78
  }
92
79
  else {
93
- console.log(` ${sym.ok()} Already linked to ${c.bold(agentLabel)} ${c.dim(tildeify(config.path))}`);
80
+ console.log(` ${sym.ok()} Already linked to ${c.bold(label)} ${c.dim(tildeify(config.path))}`);
94
81
  }
95
82
  if (config.localDev) {
96
83
  console.log(` ${c.dim("(local dev)")} MCP server command: ${c.dim(`${config.server.command} ${config.server.args.join(" ")}`)}`);
@@ -140,7 +127,7 @@ function printSetupResult(config, skills, doctor) {
140
127
  printDoctorResult(doctor);
141
128
  if (doctor.ok && skills.status !== "failed" && !config.dryRun) {
142
129
  console.log("");
143
- console.log(`${c.dim("Try it:")} open ${AGENT_LABEL[config.agent] ?? config.agent} and ask: ${c.bold("\"add a DirectionalLight3D and Camera3D to my scene\"")}`);
130
+ console.log(`${c.dim("Try it:")} open ${label} and ask: ${c.bold("\"add a DirectionalLight3D and Camera3D to my scene\"")}`);
144
131
  }
145
132
  }
146
133
  function parseInstalledSkills(stdout) {
@@ -8,6 +8,7 @@ import { writeSkillMarker } from "../../installer/version-check.js";
8
8
  import { pruneRetiredSkills } from "../../installer/legacy-skills.js";
9
9
  import { resolveInstallLocation, resolveSkillAgent, resolveSkillScope, } from "../../installer/skill-locations.js";
10
10
  import { PACKAGE_ROOT } from "../../core/package-root.js";
11
+ import { agentLabel as tableAgentLabel, agentSpec, defaultPathContext, legacyRuleFiles } from "../../installer/agent-table.js";
11
12
  import { TOOLKIT_VERSION as cliVersion } from "../../core/version.js";
12
13
  // Skill files live in library/skills/<slug>/ and are resolved through the
13
14
  // generated registry (registry/generated/skills-registry.json).
@@ -52,32 +53,7 @@ function orDie(parse) {
52
53
  }
53
54
  }
54
55
  function agentLabel(agent) {
55
- switch (agent) {
56
- case "claude-code":
57
- return "Claude Code";
58
- case "codex":
59
- return "Codex";
60
- case "cursor":
61
- return "Cursor";
62
- case "windsurf":
63
- return "Devin Desktop (Windsurf)";
64
- case "cline":
65
- return "Cline";
66
- case "roo-code":
67
- return "Roo Code";
68
- case "kilo-code":
69
- return "Kilo Code";
70
- case "gemini":
71
- return "Gemini CLI";
72
- case "github-copilot":
73
- return "GitHub Copilot CLI";
74
- case "vscode-copilot":
75
- return "GitHub Copilot in VS Code";
76
- case "opencode":
77
- return "OpenCode";
78
- case "summer":
79
- return "Summer";
80
- }
56
+ return agent === "summer" ? "Summer" : tableAgentLabel(agent);
81
57
  }
82
58
  function previewSkippedLine(count) {
83
59
  return ` Skipped ${count} preview skill${count === 1 ? "" : "s"} (--stable-only).`;
@@ -219,11 +195,11 @@ function printInstallSummary(count, agent, scope, location) {
219
195
  const label = agentLabel(agent);
220
196
  const tildeified = tildeify(location.path);
221
197
  console.log(`\n${count} skill${count === 1 ? "" : "s"} ready for ${label} (${scope} scope).`);
198
+ const reloadHint = agent === "summer" ? undefined : agentSpec(agent).skills?.reloadHint;
222
199
  if (location.kind === "skill-dir") {
223
200
  console.log(`${label} can read skills from ${tildeified}/<skill>/SKILL.md`);
224
- if (agent === "gemini") {
225
- console.log("Gemini loads them as extension skills; run `summer setup gemini` once so the extension manifest exists, then restart Gemini CLI.");
226
- }
201
+ if (reloadHint)
202
+ console.log(reloadHint);
227
203
  }
228
204
  else if (location.kind === "cursor-rule-dir") {
229
205
  console.log(`Cursor rules are in ${tildeified}/summer-<skill>.mdc`);
@@ -248,17 +224,36 @@ export const skillsCommand = new Command("skills")
248
224
  skillsCommand
249
225
  .command("list")
250
226
  .description("List available skills")
251
- .action(() => {
227
+ .option("--by-domain", "Group skills by their primary domain (same grouping as library/skills/README.md)")
228
+ .action((opts) => {
252
229
  const skills = getBuiltinSkills();
253
230
  if (skills.length === 0) {
254
231
  console.log("No skills found.");
255
232
  return;
256
233
  }
257
- console.log("Available public skills:\n");
258
- for (const s of skills) {
234
+ const line = (s) => {
259
235
  const badge = s.recommended ? "recommended" : "optional";
260
236
  const tag = s.status === "preview" ? "[preview] " : "";
261
- console.log(` ${s.name.padEnd(24)} ${badge.padEnd(11)} ${tag}${s.description}`);
237
+ return ` ${s.name.padEnd(24)} ${badge.padEnd(11)} ${tag}${s.description}`;
238
+ };
239
+ if (opts.byDomain) {
240
+ const groups = new Map();
241
+ for (const s of skills) {
242
+ const primary = s.domains[0] ?? "uncategorised";
243
+ groups.set(primary, [...(groups.get(primary) ?? []), s]);
244
+ }
245
+ console.log(`${skills.length} skills by primary domain (full index: library/skills/README.md):`);
246
+ for (const domain of [...groups.keys()].sort()) {
247
+ const group = groups.get(domain);
248
+ console.log(`\n${domain} (${group.length})`);
249
+ for (const s of group)
250
+ console.log(line(s));
251
+ }
252
+ }
253
+ else {
254
+ console.log("Available public skills:\n");
255
+ for (const s of skills)
256
+ console.log(line(s));
262
257
  }
263
258
  const previewCount = skills.filter((s) => s.status === "preview").length;
264
259
  if (previewCount > 0) {
@@ -307,6 +302,18 @@ skillsCommand
307
302
  for (const pruned of pruneRetiredSkills(location.path, getSkillRegistry().map((entry) => entry.name))) {
308
303
  console.log(` Removed ${pruned.name} -> ${pruned.path} (retired in 3.0.0)`);
309
304
  }
305
+ // Agents that moved from generated rule files to SKILL.md skills in 3.1
306
+ // (Cursor, OpenCode): drop the rule files 3.0 wrote so the agent does not
307
+ // load both for the same slug. Only files with Summer's own naming go.
308
+ if (agent !== "summer" && !process.env.SUMMER_SKILLS_DIR) {
309
+ const legacy = legacyRuleFiles(agentSpec(agent), scope, defaultPathContext(), skills.map((skill) => skill.name)) ?? [];
310
+ for (const file of legacy) {
311
+ if (!existsSync(file))
312
+ continue;
313
+ rmSync(file, { force: true });
314
+ console.log(` Removed ${tildeify(file)} (rule file from Summer 3.0; now a skill)`);
315
+ }
316
+ }
310
317
  }
311
318
  if (name && skills[0]?.status === "preview") {
312
319
  console.log(` Note: ${name} is a preview skill — not yet exercised in-engine by the Summer team; its guidance says so.`);
@@ -186,18 +186,18 @@ export declare const runtimeAnimateArgsSchema: z.ZodObject<{
186
186
  instance?: string | undefined;
187
187
  name?: string | undefined;
188
188
  value?: string | number | boolean | undefined;
189
+ space?: "local" | "global" | "both" | undefined;
190
+ cmd?: "pause" | "play" | "stop" | "state" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
189
191
  blend?: number | undefined;
190
192
  state?: string | undefined;
191
193
  position?: number | undefined;
192
194
  speed?: number | undefined;
193
195
  bones?: string[] | undefined;
194
- cmd?: "pause" | "play" | "stop" | "state" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
195
196
  from_end?: boolean | undefined;
196
197
  update?: boolean | undefined;
197
198
  reset?: boolean | undefined;
198
199
  param?: string | undefined;
199
200
  playback_path?: string | undefined;
200
- space?: "local" | "global" | "both" | undefined;
201
201
  include_rest?: boolean | undefined;
202
202
  }, {
203
203
  path: string;
@@ -205,18 +205,18 @@ export declare const runtimeAnimateArgsSchema: z.ZodObject<{
205
205
  instance?: string | undefined;
206
206
  name?: string | undefined;
207
207
  value?: string | number | boolean | undefined;
208
+ space?: "local" | "global" | "both" | undefined;
209
+ cmd?: "pause" | "play" | "stop" | "state" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
208
210
  blend?: number | undefined;
209
211
  state?: string | undefined;
210
212
  position?: number | undefined;
211
213
  speed?: number | undefined;
212
214
  bones?: string[] | undefined;
213
- cmd?: "pause" | "play" | "stop" | "state" | "seek" | "speed" | "travel" | "start" | "set_param" | "get_param" | undefined;
214
215
  from_end?: boolean | undefined;
215
216
  update?: boolean | undefined;
216
217
  reset?: boolean | undefined;
217
218
  param?: string | undefined;
218
219
  playback_path?: string | undefined;
219
- space?: "local" | "global" | "both" | undefined;
220
220
  include_rest?: boolean | undefined;
221
221
  }>;
222
222
  export type RuntimeAnimateArgs = z.infer<typeof runtimeAnimateArgsSchema>;
@@ -1,4 +1,10 @@
1
- export declare const AGENT_CLIENTS: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "kilo-code", "gemini", "github-copilot", "vscode-copilot", "opencode"];
1
+ /**
2
+ * Clients `summer skills install --agent` accepts: "summer" (the toolkit's
3
+ * own ~/.summer/skills) plus every agent in the installer's agent table that
4
+ * has a skills or rules folder. core/ cannot import installer/, so this list
5
+ * is written out; agent-table.test.ts fails if the two drift.
6
+ */
7
+ export declare const AGENT_CLIENTS: readonly ["summer", "claude-code", "codex", "cursor", "windsurf", "antigravity", "gemini", "cline", "cline-cli", "roo-code", "kilo-code", "github-copilot", "vscode-copilot", "opencode", "zed", "kiro", "goose", "hermes", "qwen-code", "kimi-code", "crush", "amp", "factory", "warp", "rovo-dev", "qoder", "grok-build", "mistral-vibe"];
2
8
  export type AgentClient = (typeof AGENT_CLIENTS)[number];
3
9
  /** resource.yaml `status` (registry/schemas/skill.schema.json). */
4
10
  export type SkillStatus = "stable" | "preview" | "deprecated";
@@ -17,6 +23,8 @@ export interface SkillRegistryEntry {
17
23
  status: SkillStatus;
18
24
  /** Package-root-relative skill dir, e.g. "library/skills/3d-lighting/". */
19
25
  path: string;
26
+ /** facets.domains from resource.yaml; the first is the primary domain. Empty on old registries. */
27
+ domains: string[];
20
28
  }
21
29
  /**
22
30
  * Load the generated skill registry (cached after first read).
@@ -11,19 +11,41 @@
11
11
  import { readFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  import { PACKAGE_ROOT } from "./package-root.js";
14
+ /**
15
+ * Clients `summer skills install --agent` accepts: "summer" (the toolkit's
16
+ * own ~/.summer/skills) plus every agent in the installer's agent table that
17
+ * has a skills or rules folder. core/ cannot import installer/, so this list
18
+ * is written out; agent-table.test.ts fails if the two drift.
19
+ */
14
20
  export const AGENT_CLIENTS = [
15
21
  "summer",
16
- "codex",
17
22
  "claude-code",
23
+ "codex",
18
24
  "cursor",
19
25
  "windsurf",
26
+ "antigravity",
27
+ "gemini",
20
28
  "cline",
29
+ "cline-cli",
21
30
  "roo-code",
22
31
  "kilo-code",
23
- "gemini",
24
32
  "github-copilot",
25
33
  "vscode-copilot",
26
34
  "opencode",
35
+ "zed",
36
+ "kiro",
37
+ "goose",
38
+ "hermes",
39
+ "qwen-code",
40
+ "kimi-code",
41
+ "crush",
42
+ "amp",
43
+ "factory",
44
+ "warp",
45
+ "rovo-dev",
46
+ "qoder",
47
+ "grok-build",
48
+ "mistral-vibe",
27
49
  ];
28
50
  const packageRoot = PACKAGE_ROOT;
29
51
  const REGISTRY_RELPATH = join("registry", "generated", "skills-registry.json");
@@ -55,6 +77,7 @@ export function parseSkillRegistry(json) {
55
77
  recommended: s.recommended === true,
56
78
  status: s.status === "preview" || s.status === "deprecated" ? s.status : "stable",
57
79
  path: s.path,
80
+ domains: Array.isArray(s.domains) ? s.domains.filter((d) => typeof d === "string") : [],
58
81
  }));
59
82
  }
60
83
  /**
@@ -1,7 +1,6 @@
1
+ import { type ConfigScope, type McpFormat, type SupportedAgent } from "./agent-table.js";
2
+ export { supportedAgents, type ConfigScope, type SupportedAgent } from "./agent-table.js";
1
3
  export declare const SUMMER_MCP_SERVER_NAME = "summer-engine";
2
- export declare const supportedAgents: readonly ["codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "kilo-code", "gemini", "github-copilot", "vscode-copilot", "opencode", "lm-studio"];
3
- export type SupportedAgent = (typeof supportedAgents)[number];
4
- export type ConfigScope = "user" | "project";
5
4
  export interface StdioMcpServerConfig {
6
5
  command: string;
7
6
  args: string[];
@@ -25,7 +24,7 @@ export interface AgentConfigResult {
25
24
  path: string;
26
25
  serverName: string;
27
26
  server: StdioMcpServerConfig;
28
- format: "json" | "toml" | "json-opencode" | "json-copilot" | "json-vscode";
27
+ format: McpFormat;
29
28
  snippet: string;
30
29
  changed: boolean;
31
30
  wrote: boolean;
@@ -37,6 +36,7 @@ export interface AgentConfigResult {
37
36
  warnings: string[];
38
37
  nextSteps: string[];
39
38
  }
39
+ type JsonObject = Record<string, unknown>;
40
40
  export declare function parseAgent(value: string | undefined): SupportedAgent | null;
41
41
  export declare function parseScope(value: string | undefined): ConfigScope | null;
42
42
  /** `summer setup [agent] --agent <agent>`: positional and option must agree;
@@ -52,7 +52,12 @@ export declare const DEFAULT_CHANNEL = "latest";
52
52
  export declare function normalizeChannel(channel: string | undefined): string;
53
53
  export declare function createSummerMcpServerConfig(localDev: boolean, platform?: NodeJS.Platform, channel?: string): StdioMcpServerConfig;
54
54
  export declare function renderConfigSnippet(agent: SupportedAgent, server: StdioMcpServerConfig): string;
55
+ /** The key under which the file lists MCP servers (see McpFormat in agent-table.ts). */
56
+ export declare function topLevelKey(format: McpFormat): string;
57
+ /** One server entry in the shape the agent's file expects. */
58
+ export declare function mcpEntry(format: McpFormat, server: StdioMcpServerConfig): JsonObject;
55
59
  /** Installed package root (dist/ and src/ alike). */
56
60
  export declare function resolvePackageRoot(): string;
57
61
  /** Directory name Gemini expects the extension under; the manifest `name` must match it. */
58
62
  export declare const GEMINI_EXTENSION_DIR_NAME = "summer-engine";
63
+ export declare function upsertTomlArrayBlock(content: string, block: string): string;