summer-engine 2.2.0 → 2.3.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.
@@ -7,7 +7,7 @@
7
7
  {
8
8
  "name": "summer",
9
9
  "source": "./",
10
- "version": "2.2.0",
10
+ "version": "2.3.0",
11
11
  "description": "Superpowers for AI game dev. 60 auto-trigger skills under summer: namespace, MCP bridge to the local Summer Engine, session-start + pre-commit hooks.",
12
12
  "author": { "name": "Summer Engine", "email": "founders@summerengine.com" },
13
13
  "category": "game-development",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "summer",
4
- "version": "2.2.0",
4
+ "version": "2.3.0",
5
5
  "description": "Superpowers for AI game dev. 60 auto-trigger skills + lifecycle hooks + MCP bridge to the local Summer Engine — the AI-native game engine.",
6
6
  "author": {
7
7
  "name": "Summer Engine",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "summer",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Superpowers for AI game dev. 60 auto-trigger skills, MCP bridge to the local Summer Engine, lifecycle hooks. Build games by talking.",
5
5
  "author": {
6
6
  "name": "Summer Engine",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://cursor.com/schemas/cursor-plugin/plugin.json",
3
3
  "name": "summer",
4
4
  "displayName": "Summer",
5
- "version": "2.2.0",
5
+ "version": "2.3.0",
6
6
  "description": "Superpowers for AI game dev. 60 auto-trigger skills + lifecycle hooks + MCP bridge to the local Summer Engine — the AI-native game engine.",
7
7
  "author": { "name": "Summer Engine", "email": "founders@summerengine.com" },
8
8
  "publisher": "summer-engine",
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Build real 2D and 3D games through conversation. No coding required. Export to Steam, desktop, mobile, and web. Built on the Godot team's work, customized and honed so AI agents and humans can collaborate on great games.
4
4
 
5
- **Summer** is the open-source plugin that connects your AI coding agent to Summer Engine. MIT licensed. Works in Claude Code, Cursor, Codex, Gemini CLI, OpenCode, Factory Droid, GitHub Copilot CLI, and Windsurf.
5
+ **Summer** is the open-source plugin that connects your AI coding agent to Summer Engine. MIT licensed. Works in Claude Code, Cursor, Codex, Gemini CLI, OpenCode, Cline, Roo Code, Factory Droid, GitHub Copilot CLI, and Windsurf.
6
6
 
7
7
  It just works. Open your agent, say *"let's make an FPS in Summer Engine,"* and it does.
8
8
 
@@ -42,7 +42,7 @@ If this fails or returns a version below 18, **stop**. Tell the user: "Summer ne
42
42
  ### Step 0 — Pre-detection (no commits to disk, just check state)
43
43
 
44
44
  ```bash
45
- npx -y summer-engine doctor --json
45
+ npx -y summer-engine@latest doctor --json
46
46
  ```
47
47
 
48
48
  The first invocation downloads the npm package transparently to npx's cache (~3 MB, ~5 sec). Subsequent calls are fast. The `-y` flag auto-confirms npx's "ok to install summer-engine?" prompt so the call doesn't hang in a non-interactive shell.
@@ -78,10 +78,10 @@ Parse the JSON output. Top-level `ok: true` means everything is installed and yo
78
78
  ### Step 1 — Install user-level skills (idempotent, fast)
79
79
 
80
80
  ```bash
81
- npx -y summer-engine setup claude-code --yes
81
+ npx -y summer-engine@latest setup claude-code --yes
82
82
  ```
83
83
 
84
- Replace `claude-code` with the user's actual agent: `codex`, `cursor`, or `windsurf`. (Gemini, OpenCode, Factory Droid, Copilot CLI use different install paths — see [`docs/`](docs/) per harness.) This writes 60 skill files to `~/.claude/skills/<name>/SKILL.md` (or the agent's equivalent user-skill directory) AND writes the MCP server config so the agent can talk to the engine.
84
+ Replace `claude-code` with the user's actual agent: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, or `opencode`. (Factory Droid and Copilot CLI use different install paths — see [`docs/`](docs/) per harness.) This writes 60 skill files to `~/.claude/skills/<name>/SKILL.md` (or the agent's equivalent user-skill directory) AND writes the MCP server config so the agent can talk to the engine.
85
85
 
86
86
  **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.**
87
87
 
@@ -90,7 +90,7 @@ Replace `claude-code` with the user's actual agent: `codex`, `cursor`, or `winds
90
90
  ### Step 2 — Install the engine app (only if `engine-install` check failed)
91
91
 
92
92
  ```bash
93
- npx -y summer-engine install
93
+ npx -y summer-engine@latest install
94
94
  ```
95
95
 
96
96
  ~1 GB. Downloads from Summer's signed releases. The bundle includes the engine binary plus Git and a handful of other runtime tools so users who don't already have them aren't blocked. The CLI prints the URL and size before touching disk. Tell the user **"downloading the engine app, ~1 GB — this takes a couple minutes"** so they don't bail thinking it stalled.
@@ -100,15 +100,15 @@ npx -y summer-engine install
100
100
  ### Step 3 — Sign in (only if `login` check failed)
101
101
 
102
102
  ```bash
103
- npx -y summer-engine login
103
+ npx -y summer-engine@latest login
104
104
  ```
105
105
 
106
- This opens the user's default browser. **Tell the user**: "Your browser is opening now. Click sign-in once and come back to this terminal." The CLI waits up to 120 seconds for the auth callback, writes the token to `~/.summer/auth-token`, and returns. **If the user takes longer than 120s, the command exits with an error — just re-run `npx -y summer-engine login` and tell them to be quicker.** Don't loop indefinitely. The same token is shared with the engine — they sign in once, both surfaces accept it.
106
+ This opens the user's default browser. **Tell the user**: "Your browser is opening now. Click sign-in once and come back to this terminal." The CLI waits up to 120 seconds for the auth callback, writes the token to `~/.summer/auth-token`, and returns. **If the user takes longer than 120s, the command exits with an error — just re-run `npx -y summer-engine@latest login` and tell them to be quicker.** Don't loop indefinitely. The same token is shared with the engine — they sign in once, both surfaces accept it.
107
107
 
108
108
  ### Step 4 — Re-run doctor to confirm
109
109
 
110
110
  ```bash
111
- npx -y summer-engine doctor --json
111
+ npx -y summer-engine@latest doctor --json
112
112
  ```
113
113
 
114
114
  Should now return `ok: true` for `cli-version`, `login`, and `engine-install`. (`local-api` will still be `warning` — that's expected; the engine isn't running yet.) If a setup check still fails, surface the specific message to the user — don't loop or paper over it.
@@ -124,8 +124,8 @@ cd ~/Projects # or wherever the user keeps code
124
124
  If the user said "let's make a game" without specifying a template, default to `3d-basic`. Pick a sensible project name from the user's request (e.g. "FPS" → `my-fps-game`). Avoid spaces in the name.
125
125
 
126
126
  ```bash
127
- npx -y summer-engine create 3d-basic my-fps-game
128
- npx -y summer-engine run my-fps-game
127
+ npx -y summer-engine@latest create 3d-basic my-fps-game
128
+ npx -y summer-engine@latest run my-fps-game
129
129
  ```
130
130
 
131
131
  `summer run` launches the engine app with the project loaded and polls the engine's local API for up to 20 seconds before returning.
@@ -137,13 +137,13 @@ If the engine takes longer than 20s to boot (cold start, slow disk, etc.), `summ
137
137
  ```bash
138
138
  # Poll doctor until local-api flips to ok (max ~30s):
139
139
  for i in 1 2 3 4 5 6; do
140
- result=$(npx -y summer-engine doctor --json)
140
+ result=$(npx -y summer-engine@latest doctor --json)
141
141
  echo "$result" | grep -q '"id":"local-api","status":"ok"' && break
142
142
  sleep 5
143
143
  done
144
144
  ```
145
145
 
146
- (Equivalent PowerShell: `for ($i=0; $i -lt 6; $i++) { $r = npx -y summer-engine doctor --json; if ($r -match '"id":"local-api","status":"ok"') { break }; Start-Sleep 5 }`)
146
+ (Equivalent PowerShell: `for ($i=0; $i -lt 6; $i++) { $r = npx -y summer-engine@latest doctor --json; if ($r -match '"id":"local-api","status":"ok"') { break }; Start-Sleep 5 }`)
147
147
 
148
148
  Once `local-api` is `ok`, MCP tools are safe to call.
149
149
 
@@ -155,20 +155,21 @@ Only skip brainstorm if the user explicitly said "skip brainstorm" or "just buil
155
155
 
156
156
  ### Anti-patterns (do NOT do these)
157
157
 
158
- - **Don't run `npm install -g summer-engine`.** Use `npx -y summer-engine ...` instead. `-g` requires `sudo` on most Mac/Linux setups — the user will get permission errors and you'll get stuck. `npx` works without root and the MCP config we ship already points at `npx summer-engine mcp`.
158
+ - **Don't run `npm install -g summer-engine`.** Use `npx -y summer-engine@latest ...` instead. `-g` requires `sudo` on most Mac/Linux setups — the user will get permission errors and you'll get stuck. `npx` works without root and the MCP config we ship already points at `npx summer-engine mcp`.
159
159
  - **Don't try to install Node.js for the user.** If `node --version` fails, point them at https://nodejs.org and stop.
160
160
  - **Don't ask the user "do you want the engine too?" or "do you also want the CLI?"** — there is one product, three pieces, all installed by this playbook.
161
- - **Don't double-install.** Always run `npx -y summer-engine doctor --json` first. Skip steps that already returned `status: ok`.
161
+ - **Don't double-install.** Always run `npx -y summer-engine@latest doctor --json` first. Skip steps that already returned `status: ok`.
162
162
  - **Don't tell the user to type `/plugin marketplace add` or `/plugin install`.** The CLI path is the canonical install — those slash commands are an alternative for the marketplace TUI, not the primary flow.
163
163
  - **Don't run `summer install` or `summer login` in the background.** They print user-facing output (engine download progress, browser-opening notice). Run them in the foreground so the user sees what's happening.
164
164
  - **Don't skip the `--json` flag on `summer doctor`** — text output is fragile to parse and changes per version.
165
165
  - **Don't skip the `-y` flag on `npx`** — without it, npx prompts "ok to install summer-engine?" interactively and the call hangs in a non-interactive shell.
166
+ - **Don't drop `@latest` from the npx commands.** `npx -y summer-engine` (no version pin) serves whatever's in npx's local cache, which can be a stale older version. The `@latest` tag forces npm to re-resolve from the registry. If a user reports "unknown command 'doctor'" or sees a much smaller skill list than expected, they got cache-served — tell them to run `npx clear-npx-cache` then retry with `@latest`.
166
167
  - **Don't call MCP tools (`summer_get_scene_tree`, etc.) until `local-api` is `ok`.** The engine takes a few seconds to boot after `summer run`. Use Step 5b's wait-loop.
167
168
  - **Don't `summer create` without `cd`'ing to a stable parent directory first.** It writes into CWD; agents that start in a temp dir will leave the project there.
168
169
  - **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.
169
170
  - **Don't jump straight into `summer create` from a vague prompt.** Invoke `summer:brainstorm-game` first (Step 6). The build skills assume `.summer/GameSoul.md` exists.
170
171
 
171
- **Using a different agent?** Replace `claude-code` with `codex`, `cursor`, or `windsurf` in Step 1. Skill targets vary per agent (Cursor uses `.cursor/rules/`, Windsurf uses `.windsurfrules`, etc.). The CLI handles the difference. For Gemini, OpenCode, Factory Droid, and Copilot CLI, see [`docs/`](docs/) — those agents have their own install paths that the CLI doesn't fully automate yet.
172
+ **Using a different agent?** Replace `claude-code` with any supported agent in Step 1: `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, or `opencode`. Skill targets vary per agent (Cursor uses `.cursor/rules/`, Windsurf uses `.windsurfrules`, Cline + Roo use `.clinerules/`, OpenCode uses agent definitions, etc.). The CLI handles the difference. 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. **Factory Droid and Copilot CLI** still have their own install paths — see [`docs/`](docs/).
172
173
 
173
174
  **Power-user note:** if the user specifically wants `summer` on their `PATH` for everyday terminal use (outside the AI agent), they can run `npm install -g summer-engine` themselves later. The agent flow doesn't need it.
174
175
 
@@ -352,13 +353,29 @@ droid plugin marketplace add https://github.com/SummerEngine/summer
352
353
  droid plugin install summer@summer-engine
353
354
  ```
354
355
 
356
+ ### Cline (VS Code)
357
+
358
+ ```bash
359
+ npx -y summer-engine@latest setup cline --yes
360
+ ```
361
+
362
+ Writes the MCP server config to VS Code's globalStorage for the Cline extension and drops project rules into `.clinerules/`. **Restart VS Code** so Cline reloads its MCP config.
363
+
364
+ ### Roo Code (VS Code)
365
+
366
+ ```bash
367
+ npx -y summer-engine@latest setup roo-code --yes
368
+ ```
369
+
370
+ Same shape as Cline (Roo Code is a Cline fork) — writes globalStorage MCP config and `.clinerules/` files. **Restart VS Code** afterward.
371
+
355
372
  ### Gemini CLI
356
373
 
357
374
  ```bash
358
- gemini extensions install https://github.com/SummerEngine/summer
375
+ npx -y summer-engine@latest setup gemini --yes
359
376
  ```
360
377
 
361
- Update later: `gemini extensions update summer`.
378
+ Drops a Summer extension manifest at `~/.gemini/extensions/summer-engine/`. If the extension isn't auto-enabled on next launch, run `gemini extensions enable summer-engine`. The marketplace path (`gemini extensions install https://github.com/SummerEngine/summer`) still works for users who prefer it — both end up at the same place.
362
379
 
363
380
  ### GitHub Copilot CLI
364
381
 
@@ -370,24 +387,10 @@ copilot plugin install summer@summer-engine
370
387
  ### OpenCode
371
388
 
372
389
  ```bash
373
- npm install --save-dev summer-engine
374
- ```
375
-
376
- Add to `opencode.json`:
377
-
378
- ```json
379
- {
380
- "plugin": ["summer-engine"],
381
- "mcp": {
382
- "summer-engine": {
383
- "command": "npx",
384
- "args": ["summer-engine", "mcp"]
385
- }
386
- }
387
- }
390
+ npx -y summer-engine@latest setup opencode --yes
388
391
  ```
389
392
 
390
- Restart. Full guide: [`.opencode/INSTALL.md`](./.opencode/INSTALL.md).
393
+ Writes the MCP server entry into `opencode.json` (`~/.config/opencode/opencode.json` for user scope, `./opencode.json` for project) using the array-shaped `command: ["npx", "-y", "summer-engine@latest", "mcp"]` format. Restart OpenCode. Full guide: [`.opencode/INSTALL.md`](./.opencode/INSTALL.md).
391
394
 
392
395
  ### Windsurf and others
393
396
 
@@ -419,7 +422,7 @@ summer doctor
419
422
  | `summer mcp setup <agent>` | Write MCP config for an agent. |
420
423
  | `summer setup <agent> [--yes]` | One shot: MCP config + recommended skills + doctor. |
421
424
 
422
- Agents: `claude-code`, `codex`, `cursor`, `gemini`, `opencode`, `windsurf`. Scopes: `--scope user` (default), `--scope project`.
425
+ Agents: `claude-code`, `codex`, `cursor`, `windsurf`, `cline`, `roo-code`, `gemini`, `opencode`. Scopes: `--scope user` (default), `--scope project`.
423
426
 
424
427
  ---
425
428
 
@@ -11,6 +11,10 @@ const AGENT_LABEL = {
11
11
  codex: "Codex",
12
12
  cursor: "Cursor",
13
13
  windsurf: "Windsurf",
14
+ cline: "Cline",
15
+ "roo-code": "Roo Code",
16
+ gemini: "Gemini CLI",
17
+ opencode: "OpenCode",
14
18
  };
15
19
  export const setupCommand = new Command("setup")
16
20
  .description("Configure Summer Engine for an AI agent and run diagnostics")
@@ -2,7 +2,7 @@ import { Command } from "commander";
2
2
  import { existsSync, mkdirSync, readFileSync, cpSync, writeFileSync, } from "fs";
3
3
  import { join, dirname } from "path";
4
4
  import { fileURLToPath } from "url";
5
- import { homedir } from "os";
5
+ import { homedir, platform } from "os";
6
6
  import { AGENT_CLIENTS, SKILL_REGISTRY, } from "../lib/skills-registry.js";
7
7
  import { tildeify } from "../lib/format.js";
8
8
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -102,8 +102,12 @@ function resolveAgent(opts) {
102
102
  function resolveScope(agent, opts) {
103
103
  if (opts.scope)
104
104
  return parseScope(opts.scope);
105
- if (agent === "cursor" || agent === "windsurf")
105
+ if (agent === "cursor" ||
106
+ agent === "windsurf" ||
107
+ agent === "cline" ||
108
+ agent === "roo-code") {
106
109
  return "project";
110
+ }
107
111
  return "user";
108
112
  }
109
113
  function agentLabel(agent) {
@@ -116,6 +120,14 @@ function agentLabel(agent) {
116
120
  return "Cursor";
117
121
  case "windsurf":
118
122
  return "Windsurf";
123
+ case "cline":
124
+ return "Cline";
125
+ case "roo-code":
126
+ return "Roo Code";
127
+ case "gemini":
128
+ return "Gemini CLI";
129
+ case "opencode":
130
+ return "OpenCode";
119
131
  case "summer":
120
132
  return "Summer";
121
133
  }
@@ -128,6 +140,15 @@ function resolveInstallLocation(agent, scope) {
128
140
  if (agent === "windsurf") {
129
141
  return { kind: "windsurf-rule-file", path: join(overrideDir, ".windsurfrules") };
130
142
  }
143
+ if (agent === "cline" || agent === "roo-code") {
144
+ return { kind: "cline-rule-dir", path: overrideDir };
145
+ }
146
+ if (agent === "gemini") {
147
+ return { kind: "gemini-skill-dir", path: overrideDir };
148
+ }
149
+ if (agent === "opencode") {
150
+ return { kind: "opencode-skill-dir", path: overrideDir };
151
+ }
131
152
  return { kind: "skill-dir", path: overrideDir };
132
153
  }
133
154
  const root = scope === "user" ? homedir() : process.cwd();
@@ -140,10 +161,55 @@ function resolveInstallLocation(agent, scope) {
140
161
  return { kind: "cursor-rule-dir", path: join(root, ".cursor", "rules") };
141
162
  case "windsurf":
142
163
  return { kind: "windsurf-rule-file", path: join(root, ".windsurfrules") };
164
+ case "cline":
165
+ return {
166
+ kind: "cline-rule-dir",
167
+ path: scope === "user"
168
+ ? clineUserRulesDir()
169
+ : join(process.cwd(), ".clinerules"),
170
+ };
171
+ case "roo-code":
172
+ return {
173
+ kind: "cline-rule-dir",
174
+ path: scope === "user"
175
+ ? rooCodeUserRulesDir()
176
+ : join(process.cwd(), ".clinerules"),
177
+ };
178
+ case "gemini":
179
+ return {
180
+ kind: "gemini-skill-dir",
181
+ path: join(homedir(), ".gemini", "extensions", "summer-engine", "skills"),
182
+ };
183
+ case "opencode":
184
+ return {
185
+ kind: "opencode-skill-dir",
186
+ path: scope === "user"
187
+ ? opencodeUserAgentsDir()
188
+ : join(process.cwd(), ".opencode", "agents", "summer"),
189
+ };
143
190
  case "summer":
144
191
  return { kind: "skill-dir", path: join(root, ".summer", "skills") };
145
192
  }
146
193
  }
194
+ function clineUserRulesDir() {
195
+ // Cline reads global rules from the user's Documents/Cline/Rules folder.
196
+ return join(homedir(), "Documents", "Cline", "Rules");
197
+ }
198
+ function rooCodeUserRulesDir() {
199
+ // Roo Code reads global rules from the user's Documents/Roo/Rules folder.
200
+ return join(homedir(), "Documents", "Roo", "Rules");
201
+ }
202
+ function opencodeUserAgentsDir() {
203
+ // OpenCode's user-scope agent definition directory varies by OS.
204
+ // On Windows, OpenCode reads from %APPDATA%/opencode/agents/summer.
205
+ // On Linux/macOS, it reads from $XDG_CONFIG_HOME or ~/.config/opencode/agents/summer.
206
+ if (platform() === "win32") {
207
+ const appData = process.env.APPDATA ?? join(homedir(), "AppData", "Roaming");
208
+ return join(appData, "opencode", "agents", "summer");
209
+ }
210
+ const xdg = process.env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
211
+ return join(xdg, "opencode", "agents", "summer");
212
+ }
147
213
  function selectSkills(name, opts) {
148
214
  if (opts.all && opts.recommended) {
149
215
  die("Use only one bulk option: --all or --recommended.");
@@ -189,6 +255,12 @@ function installSkill(skill, agent, location) {
189
255
  return writeCursorRule(skill, location.path);
190
256
  case "windsurf-rule-file":
191
257
  return upsertWindsurfRule(skill, location.path);
258
+ case "cline-rule-dir":
259
+ return writeClineRule(skill, location.path);
260
+ case "gemini-skill-dir":
261
+ return writeGeminiSkill(skill, location.path);
262
+ case "opencode-skill-dir":
263
+ return writeOpencodeSkill(skill, location.path);
192
264
  }
193
265
  }
194
266
  function copySkillDirectory(skill, targetDir) {
@@ -219,6 +291,35 @@ function upsertWindsurfRule(skill, rulePath) {
219
291
  writeFileSync(rulePath, next, "utf-8");
220
292
  return { action: "Generated", path: rulePath };
221
293
  }
294
+ function writeClineRule(skill, rulesDir) {
295
+ // Cline + Roo Code read project rules from .clinerules/ and global rules
296
+ // from Documents/Cline (or Roo)/Rules. Both expect plain markdown files.
297
+ // SKILL.md isn't recognized as a special filename, so we name files <skill>.md.
298
+ mkdirSync(rulesDir, { recursive: true });
299
+ const rulePath = join(rulesDir, `summer-${skill.name}.md`);
300
+ writeFileSync(rulePath, renderRuleBody(skill) + "\n", "utf-8");
301
+ return { action: "Generated", path: rulePath };
302
+ }
303
+ function writeGeminiSkill(skill, skillsDir) {
304
+ // Gemini extensions support a contextFileName, but skill discovery for
305
+ // arbitrary markdown is not standardized. We drop each SKILL.md alongside
306
+ // the extension so the agent can reference them by path; the install
307
+ // summary surfaces this so the user knows where to point Gemini.
308
+ mkdirSync(skillsDir, { recursive: true });
309
+ const rulePath = join(skillsDir, `${skill.name}.md`);
310
+ writeFileSync(rulePath, renderRuleBody(skill) + "\n", "utf-8");
311
+ return { action: "Generated", path: rulePath };
312
+ }
313
+ function writeOpencodeSkill(skill, skillsDir) {
314
+ // OpenCode supports agent markdown definitions; the exact discovery
315
+ // convention for ad-hoc skills isn't fully documented. We write each skill
316
+ // as a markdown file under agents/summer/ so OpenCode can reference them
317
+ // directly. The install summary shows the path.
318
+ mkdirSync(skillsDir, { recursive: true });
319
+ const rulePath = join(skillsDir, `${skill.name}.md`);
320
+ writeFileSync(rulePath, renderRuleBody(skill) + "\n", "utf-8");
321
+ return { action: "Generated", path: rulePath };
322
+ }
222
323
  function renderCursorRule(skill) {
223
324
  const description = `Summer skill ${skill.name}: ${skill.description}`;
224
325
  return `---\ndescription: ${JSON.stringify(description)}\nglobs: []\nalwaysApply: false\n---\n\n${renderRuleBody(skill)}\n`;
@@ -251,6 +352,18 @@ function printInstallSummary(count, agent, scope, location) {
251
352
  else if (location.kind === "cursor-rule-dir") {
252
353
  console.log(`Cursor rules are in ${tildeified}/summer-<skill>.mdc`);
253
354
  }
355
+ else if (location.kind === "cline-rule-dir") {
356
+ console.log(`${label} rules are in ${tildeified}/summer-<skill>.md`);
357
+ console.log("Restart VS Code to pick up new rules.");
358
+ }
359
+ else if (location.kind === "gemini-skill-dir") {
360
+ console.log(`Skill files are in ${tildeified}/<skill>.md`);
361
+ console.log("Reference them from Gemini by path, or run `gemini extensions enable summer-engine` to load the bundled context.");
362
+ }
363
+ else if (location.kind === "opencode-skill-dir") {
364
+ console.log(`Skill files are in ${tildeified}/<skill>.md`);
365
+ console.log("Restart OpenCode so it picks up the new agent definitions.");
366
+ }
254
367
  else {
255
368
  console.log(`Windsurf rules are in ${tildeified}`);
256
369
  }
@@ -1,5 +1,5 @@
1
1
  export declare const SUMMER_MCP_SERVER_NAME = "summer-engine";
2
- export declare const supportedAgents: readonly ["codex", "claude-code", "cursor", "windsurf"];
2
+ export declare const supportedAgents: readonly ["codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
3
3
  export type SupportedAgent = (typeof supportedAgents)[number];
4
4
  export type ConfigScope = "user" | "project";
5
5
  export interface StdioMcpServerConfig {
@@ -22,7 +22,7 @@ export interface AgentConfigResult {
22
22
  path: string;
23
23
  serverName: string;
24
24
  server: StdioMcpServerConfig;
25
- format: "json" | "toml";
25
+ format: "json" | "toml" | "json-opencode";
26
26
  snippet: string;
27
27
  changed: boolean;
28
28
  wrote: boolean;
@@ -2,13 +2,17 @@ import { existsSync } from "fs";
2
2
  import { mkdir, readFile, writeFile } from "fs/promises";
3
3
  import { dirname, join, resolve } from "path";
4
4
  import { fileURLToPath } from "url";
5
- import { homedir } from "os";
5
+ import { homedir, platform } from "os";
6
6
  export const SUMMER_MCP_SERVER_NAME = "summer-engine";
7
7
  export const supportedAgents = [
8
8
  "codex",
9
9
  "claude-code",
10
10
  "cursor",
11
11
  "windsurf",
12
+ "cline",
13
+ "roo-code",
14
+ "gemini",
15
+ "opencode",
12
16
  ];
13
17
  const agentAliases = {
14
18
  claude: "claude-code",
@@ -16,6 +20,14 @@ const agentAliases = {
16
20
  codex: "codex",
17
21
  cursor: "cursor",
18
22
  windsurf: "windsurf",
23
+ cline: "cline",
24
+ "roo-code": "roo-code",
25
+ roo: "roo-code",
26
+ roocode: "roo-code",
27
+ gemini: "gemini",
28
+ "gemini-cli": "gemini",
29
+ opencode: "opencode",
30
+ "open-code": "opencode",
19
31
  };
20
32
  export function parseAgent(value) {
21
33
  if (!value)
@@ -43,7 +55,11 @@ export async function configureAgentMcp(options) {
43
55
  ? { changed: true }
44
56
  : target.format === "toml"
45
57
  ? await upsertCodexConfig(target.path, server, shouldWrite)
46
- : await upsertJsonMcpConfig(target.path, server, shouldWrite);
58
+ : target.format === "json-opencode"
59
+ ? await upsertOpencodeConfig(target.path, server, shouldWrite)
60
+ : options.agent === "gemini"
61
+ ? await upsertGeminiExtension(target.path, server, shouldWrite)
62
+ : await upsertJsonMcpConfig(target.path, server, shouldWrite);
47
63
  return {
48
64
  agent: options.agent,
49
65
  scope: options.scope,
@@ -70,13 +86,24 @@ export function createSummerMcpServerConfig(localDev) {
70
86
  }
71
87
  return {
72
88
  command: "npx",
73
- args: ["summer-engine", "mcp"],
89
+ args: ["-y", "summer-engine@latest", "mcp"],
74
90
  };
75
91
  }
76
92
  export function renderConfigSnippet(agent, server) {
77
93
  if (agent === "codex") {
78
94
  return renderCodexServerTable(server);
79
95
  }
96
+ if (agent === "opencode") {
97
+ return (JSON.stringify({
98
+ $schema: "https://opencode.ai/config.json",
99
+ mcp: {
100
+ [SUMMER_MCP_SERVER_NAME]: opencodeServerEntry(server),
101
+ },
102
+ }, null, 2) + "\n");
103
+ }
104
+ if (agent === "gemini") {
105
+ return (JSON.stringify(geminiExtensionManifest(server), null, 2) + "\n");
106
+ }
80
107
  return (JSON.stringify({
81
108
  mcpServers: {
82
109
  [SUMMER_MCP_SERVER_NAME]: server,
@@ -91,9 +118,17 @@ function resolveConfigTarget(agent, scope, cwd, env) {
91
118
  const override = getConfigPathOverride(agent, env);
92
119
  const warnings = [];
93
120
  if (override) {
121
+ if (scope === "project" &&
122
+ (agent === "cline" || agent === "roo-code" || agent === "gemini")) {
123
+ warnings.push(`${agent} MCP config has no project scope today; treating as user scope.`);
124
+ }
94
125
  return {
95
126
  path: resolve(override),
96
- format: agent === "codex" ? "toml" : "json",
127
+ format: agent === "codex"
128
+ ? "toml"
129
+ : agent === "opencode"
130
+ ? "json-opencode"
131
+ : "json",
97
132
  warnings,
98
133
  };
99
134
  }
@@ -124,6 +159,45 @@ function resolveConfigTarget(agent, scope, cwd, env) {
124
159
  warnings,
125
160
  };
126
161
  }
162
+ if (agent === "cline") {
163
+ if (scope === "project") {
164
+ warnings.push("Cline MCP config has no project scope today; writing to user-scope global VS Code storage instead.");
165
+ }
166
+ return {
167
+ path: vsCodeGlobalStoragePath(env, "saoudrizwan.claude-dev"),
168
+ format: "json",
169
+ warnings,
170
+ };
171
+ }
172
+ if (agent === "roo-code") {
173
+ if (scope === "project") {
174
+ warnings.push("Roo Code MCP config has no project scope today; writing to user-scope global VS Code storage instead.");
175
+ }
176
+ return {
177
+ path: vsCodeGlobalStoragePath(env, "rooveterinaryinc.roo-cline"),
178
+ format: "json",
179
+ warnings,
180
+ };
181
+ }
182
+ if (agent === "gemini") {
183
+ if (scope === "project") {
184
+ warnings.push("Gemini extensions are user-scoped today; writing to ~/.gemini/extensions/summer-engine/ instead of project.");
185
+ }
186
+ return {
187
+ path: join(homedir(), ".gemini", "extensions", "summer-engine", "gemini-extension.json"),
188
+ format: "json",
189
+ warnings,
190
+ };
191
+ }
192
+ if (agent === "opencode") {
193
+ return {
194
+ path: scope === "user"
195
+ ? opencodeUserConfigPath(env)
196
+ : join(cwd, "opencode.json"),
197
+ format: "json-opencode",
198
+ warnings,
199
+ };
200
+ }
127
201
  if (scope === "project") {
128
202
  warnings.push("Windsurf documents MCP configuration as user-scoped; project scope writes .windsurf/mcp_config.json for teams that load workspace config.");
129
203
  }
@@ -135,6 +209,28 @@ function resolveConfigTarget(agent, scope, cwd, env) {
135
209
  warnings,
136
210
  };
137
211
  }
212
+ function vsCodeGlobalStoragePath(env, extensionId) {
213
+ const os = platform();
214
+ if (os === "win32") {
215
+ const appData = env.APPDATA ?? join(homedir(), "AppData", "Roaming");
216
+ return join(appData, "Code", "User", "globalStorage", extensionId, "settings", "cline_mcp_settings.json");
217
+ }
218
+ if (os === "darwin") {
219
+ return join(homedir(), "Library", "Application Support", "Code", "User", "globalStorage", extensionId, "settings", "cline_mcp_settings.json");
220
+ }
221
+ // Linux and other Unix
222
+ const xdg = env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
223
+ return join(xdg, "Code", "User", "globalStorage", extensionId, "settings", "cline_mcp_settings.json");
224
+ }
225
+ function opencodeUserConfigPath(env) {
226
+ const os = platform();
227
+ if (os === "win32") {
228
+ const appData = env.APPDATA ?? join(homedir(), "AppData", "Roaming");
229
+ return join(appData, "opencode", "opencode.json");
230
+ }
231
+ const xdg = env.XDG_CONFIG_HOME ?? join(homedir(), ".config");
232
+ return join(xdg, "opencode", "opencode.json");
233
+ }
138
234
  function getConfigPathOverride(agent, env) {
139
235
  if (agent === "codex")
140
236
  return env.SUMMER_CODEX_CONFIG_FILE;
@@ -142,6 +238,14 @@ function getConfigPathOverride(agent, env) {
142
238
  return env.SUMMER_CLAUDE_CONFIG_FILE;
143
239
  if (agent === "cursor")
144
240
  return env.SUMMER_CURSOR_MCP_CONFIG_FILE;
241
+ if (agent === "cline")
242
+ return env.SUMMER_CLINE_CONFIG_FILE;
243
+ if (agent === "roo-code")
244
+ return env.SUMMER_ROO_CODE_CONFIG_FILE;
245
+ if (agent === "gemini")
246
+ return env.SUMMER_GEMINI_CONFIG_FILE;
247
+ if (agent === "opencode")
248
+ return env.SUMMER_OPENCODE_CONFIG_FILE;
145
249
  return env.SUMMER_WINDSURF_MCP_CONFIG_FILE;
146
250
  }
147
251
  async function upsertJsonMcpConfig(path, server, write) {
@@ -198,6 +302,60 @@ async function upsertCodexConfig(path, server, write) {
198
302
  }
199
303
  return { changed };
200
304
  }
305
+ async function upsertOpencodeConfig(path, server, write) {
306
+ const current = await readJsonConfig(path);
307
+ const next = copyJsonObject(current);
308
+ if (typeof next.$schema !== "string") {
309
+ next.$schema = "https://opencode.ai/config.json";
310
+ }
311
+ const existingMcp = isJsonObject(next.mcp) ? next.mcp : {};
312
+ next.mcp = {
313
+ ...existingMcp,
314
+ [SUMMER_MCP_SERVER_NAME]: opencodeServerEntry(server),
315
+ };
316
+ const currentRendered = renderJsonFile(current);
317
+ const nextRendered = renderJsonFile(next);
318
+ const changed = currentRendered !== nextRendered;
319
+ if (write && changed) {
320
+ await writeTextFile(path, nextRendered);
321
+ }
322
+ return { changed };
323
+ }
324
+ async function upsertGeminiExtension(path, server, write) {
325
+ const current = await readJsonConfig(path);
326
+ const next = geminiExtensionManifest(server, current);
327
+ const currentRendered = renderJsonFile(current);
328
+ const nextRendered = renderJsonFile(next);
329
+ const changed = currentRendered !== nextRendered;
330
+ if (write && changed) {
331
+ await writeTextFile(path, nextRendered);
332
+ }
333
+ return { changed };
334
+ }
335
+ function opencodeServerEntry(server) {
336
+ const entry = {
337
+ type: "local",
338
+ command: [server.command, ...server.args],
339
+ };
340
+ if (server.env && Object.keys(server.env).length > 0) {
341
+ entry.environment = { ...server.env };
342
+ }
343
+ return entry;
344
+ }
345
+ function geminiExtensionManifest(server, base = {}) {
346
+ const manifest = { ...base };
347
+ manifest.name = "summer";
348
+ manifest.description =
349
+ "Superpowers for AI game dev. MCP bridge to the local Summer Engine plus a context primer that teaches Gemini the Summer skills.";
350
+ manifest.contextFileName = "GEMINI.md";
351
+ manifest.mcpServers = {
352
+ [SUMMER_MCP_SERVER_NAME]: {
353
+ command: server.command,
354
+ args: server.args,
355
+ },
356
+ };
357
+ return manifest;
358
+ }
201
359
  async function readTextFileIfExists(path) {
202
360
  if (!existsSync(path))
203
361
  return "";
@@ -273,7 +431,15 @@ function createNextSteps(agent, scope, path) {
273
431
  ? "Restart Codex or run /mcp in a new session."
274
432
  : agent === "cursor"
275
433
  ? "Restart Cursor and enable the summer-engine MCP server if prompted."
276
- : "Restart Windsurf and refresh MCP servers from Cascade settings.";
434
+ : agent === "cline"
435
+ ? "Restart VS Code so Cline reloads its MCP config."
436
+ : agent === "roo-code"
437
+ ? "Restart VS Code so Roo Code reloads its MCP config."
438
+ : agent === "gemini"
439
+ ? "Run `gemini extensions enable summer-engine` (if not already enabled), then restart Gemini CLI."
440
+ : agent === "opencode"
441
+ ? "Restart OpenCode so it reloads opencode.json."
442
+ : "Restart Windsurf and refresh MCP servers from Cascade settings.";
277
443
  const projectTrust = scope === "project" && agent === "codex"
278
444
  ? "Codex only loads project .codex/config.toml from trusted projects."
279
445
  : null;
@@ -1,4 +1,4 @@
1
- export declare const AGENT_CLIENTS: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
1
+ export declare const AGENT_CLIENTS: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
2
2
  export type AgentClient = (typeof AGENT_CLIENTS)[number];
3
3
  export declare const SKILL_CATEGORIES: readonly ["_meta", "2d-assets", "3d-assets", "video", "character-controllers", "gameplay-mechanics", "scripting-patterns", "scene-and-project", "rendering-and-lighting", "shaders", "visual-effects", "post-processing", "animation", "audio", "physics", "multiplayer-and-networking", "ai-and-npcs", "level-design", "performance", "ui-and-ux", "asset-pipeline", "input-and-controls", "debugging", "deployment"];
4
4
  export type SkillCategory = (typeof SKILL_CATEGORIES)[number];
@@ -20,7 +20,7 @@ export declare const SKILL_REGISTRY: readonly [{
20
20
  readonly name: "debug";
21
21
  readonly category: "debugging";
22
22
  readonly public: true;
23
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
23
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
24
24
  readonly recommended: true;
25
25
  readonly requiresMcpTools: readonly ["summer_get_console", "summer_get_debugger_errors", "summer_get_script_errors", "summer_get_diagnostics", "summer_clear_console", "summer_play", "summer_stop", "summer_inspect_node"];
26
26
  readonly testScenario: "Triage a runtime crash end-to-end: read errors, locate code, propose fix, apply on approval, verify.";
@@ -28,7 +28,7 @@ export declare const SKILL_REGISTRY: readonly [{
28
28
  readonly name: "play";
29
29
  readonly category: "scene-and-project";
30
30
  readonly public: true;
31
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
31
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
32
32
  readonly recommended: true;
33
33
  readonly requiresMcpTools: readonly ["summer_is_running", "summer_play", "summer_stop", "summer_clear_console", "summer_get_diagnostics", "summer_get_debugger_errors", "summer_get_script_errors"];
34
34
  readonly testScenario: "Run the game from a clean state, wait for first frame, report whether it runs cleanly or has errors.";
@@ -36,7 +36,7 @@ export declare const SKILL_REGISTRY: readonly [{
36
36
  readonly name: "gdscript-patterns";
37
37
  readonly category: "scripting-patterns";
38
38
  readonly public: true;
39
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
39
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
40
40
  readonly recommended: true;
41
41
  readonly requiresMcpTools: readonly ["summer_get_script_errors"];
42
42
  readonly testScenario: "Write a typed GDScript with a signal, attach it to a node, connect the signal, and verify script errors.";
@@ -44,7 +44,7 @@ export declare const SKILL_REGISTRY: readonly [{
44
44
  readonly name: "scene-composition";
45
45
  readonly category: "scene-and-project";
46
46
  readonly public: true;
47
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
47
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
48
48
  readonly recommended: true;
49
49
  readonly requiresMcpTools: readonly ["summer_create_scene", "summer_open_scene", "summer_get_scene_tree", "summer_add_node", "summer_instantiate_scene", "summer_save_scene"];
50
50
  readonly testScenario: "Build a small reusable player scene, instantiate it in a main scene, and save both scenes through Summer tools.";
@@ -52,7 +52,7 @@ export declare const SKILL_REGISTRY: readonly [{
52
52
  readonly name: "fps-controller";
53
53
  readonly category: "character-controllers";
54
54
  readonly public: true;
55
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
55
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
56
56
  readonly recommended: true;
57
57
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_input_map_bind"];
58
58
  readonly testScenario: "Create a CharacterBody3D player with collision, camera, input actions, and a host-edited controller script.";
@@ -60,7 +60,7 @@ export declare const SKILL_REGISTRY: readonly [{
60
60
  readonly name: "3d-lighting";
61
61
  readonly category: "rendering-and-lighting";
62
62
  readonly public: true;
63
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
63
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
64
64
  readonly recommended: true;
65
65
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property"];
66
66
  readonly testScenario: "Add sun, fill lighting, WorldEnvironment, and shadow settings to a simple 3D scene.";
@@ -68,7 +68,7 @@ export declare const SKILL_REGISTRY: readonly [{
68
68
  readonly name: "ui-basics";
69
69
  readonly category: "ui-and-ux";
70
70
  readonly public: true;
71
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
71
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
72
72
  readonly recommended: true;
73
73
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_connect_signal"];
74
74
  readonly testScenario: "Create a HUD CanvasLayer with labels, a ProgressBar, and a connected Button signal.";
@@ -76,7 +76,7 @@ export declare const SKILL_REGISTRY: readonly [{
76
76
  readonly name: "asset-strategy";
77
77
  readonly category: "asset-pipeline";
78
78
  readonly public: true;
79
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
79
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
80
80
  readonly recommended: true;
81
81
  readonly requiresMcpTools: readonly ["summer_search_assets", "summer_import_asset", "summer_import_from_url", "summer_generate_image", "summer_generate_3d", "summer_generate_audio"];
82
82
  readonly testScenario: "Choose library, generated, or primitive assets for a small level and import one asset into the project.";
@@ -84,7 +84,7 @@ export declare const SKILL_REGISTRY: readonly [{
84
84
  readonly name: "make-game";
85
85
  readonly category: "scene-and-project";
86
86
  readonly public: true;
87
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
87
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
88
88
  readonly recommended: true;
89
89
  readonly requiresMcpTools: readonly ["summer_get_agent_playbook", "summer_get_project_context", "summer_create_scene", "summer_open_scene", "summer_save_scene", "summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_instantiate_scene", "summer_play", "summer_stop", "summer_get_diagnostics"];
90
90
  readonly testScenario: "Build one narrow playable prototype from requirements through scene setup, host-edited scripts, and diagnostics.";
@@ -92,7 +92,7 @@ export declare const SKILL_REGISTRY: readonly [{
92
92
  readonly name: "brainstorm-game";
93
93
  readonly category: "scene-and-project";
94
94
  readonly public: true;
95
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
95
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
96
96
  readonly recommended: true;
97
97
  readonly requiresMcpTools: readonly ["summer_get_project_context", "summer_get_scene_tree"];
98
98
  readonly testScenario: "Walk a fresh user from \"I want to make a game but I don't know what\" to a 1-page brief saved at .summer/GameSoul.md.";
@@ -100,7 +100,7 @@ export declare const SKILL_REGISTRY: readonly [{
100
100
  readonly name: "new-project";
101
101
  readonly category: "scene-and-project";
102
102
  readonly public: true;
103
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
103
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
104
104
  readonly recommended: true;
105
105
  readonly requiresMcpTools: readonly ["summer_get_project_context"];
106
106
  readonly testScenario: "User says \"start a blank project\" — skill asks for the name, picks empty vs 3d-basic, runs summer create, opens the engine, and stops to ask what to build.";
@@ -108,7 +108,7 @@ export declare const SKILL_REGISTRY: readonly [{
108
108
  readonly name: "browse-templates";
109
109
  readonly category: "scene-and-project";
110
110
  readonly public: true;
111
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
111
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
112
112
  readonly recommended: true;
113
113
  readonly requiresMcpTools: readonly ["summer_get_project_context"];
114
114
  readonly testScenario: "User says \"what templates exist?\" — skill runs summer list templates, presents 3-5 curated picks, asks the project name, and runs summer create <slug> <name>.";
@@ -116,7 +116,7 @@ export declare const SKILL_REGISTRY: readonly [{
116
116
  readonly name: "design-mechanic";
117
117
  readonly category: "gameplay-mechanics";
118
118
  readonly public: true;
119
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
119
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
120
120
  readonly recommended: true;
121
121
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_add_node", "summer_set_prop", "summer_input_map_bind", "summer_save_scene", "summer_get_script_errors"];
122
122
  readonly testScenario: "Design the double-jump mechanic end-to-end: input, response, feedback, failure modes, depth, then drop a GDScript stub and node sketch.";
@@ -124,7 +124,7 @@ export declare const SKILL_REGISTRY: readonly [{
124
124
  readonly name: "design-level";
125
125
  readonly category: "level-design";
126
126
  readonly public: true;
127
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
127
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
128
128
  readonly recommended: true;
129
129
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_create_scene", "summer_open_scene", "summer_add_node", "summer_set_prop", "summer_save_scene", "summer_get_script_errors"];
130
130
  readonly testScenario: "Design level 1, a 5-minute combat encounter that teaches parry, and produce a node-tree skeleton ready for summer_create_scene.";
@@ -132,7 +132,7 @@ export declare const SKILL_REGISTRY: readonly [{
132
132
  readonly name: "art-direction";
133
133
  readonly category: "rendering-and-lighting";
134
134
  readonly public: true;
135
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
135
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
136
136
  readonly recommended: true;
137
137
  readonly requiresMcpTools: readonly ["summer_get_project_context", "summer_project_setting", "summer_inspect_node", "summer_set_prop"];
138
138
  readonly testScenario: "Define art direction for a cozy farming sim using Stardew Valley and Sable as references; write the bible to .summer/art-bible.md.";
@@ -140,7 +140,7 @@ export declare const SKILL_REGISTRY: readonly [{
140
140
  readonly name: "audio-direction";
141
141
  readonly category: "audio";
142
142
  readonly public: true;
143
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
143
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
144
144
  readonly recommended: true;
145
145
  readonly requiresMcpTools: readonly ["summer_get_project_context", "summer_get_scene_tree", "summer_inspect_node", "summer_add_node", "summer_project_setting", "summer_generate_audio"];
146
146
  readonly testScenario: "Define audio direction (music + SFX vocabulary + dynamic plan) for a cozy farming sim; write .summer/audio-bible.md and configure the audio bus layout.";
@@ -148,7 +148,7 @@ export declare const SKILL_REGISTRY: readonly [{
148
148
  readonly name: "game-feel";
149
149
  readonly category: "visual-effects";
150
150
  readonly public: true;
151
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
151
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
152
152
  readonly recommended: true;
153
153
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_inspect_resource", "summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_connect_signal", "summer_save_scene", "summer_get_script_errors", "summer_play", "summer_stop"];
154
154
  readonly testScenario: "Add visible juice to flat combat hits in a 30-minute polish pass: hit flash, screen shake, particles, with verified scene state changes.";
@@ -156,7 +156,7 @@ export declare const SKILL_REGISTRY: readonly [{
156
156
  readonly name: "tune-performance";
157
157
  readonly category: "performance";
158
158
  readonly public: true;
159
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
159
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
160
160
  readonly recommended: true;
161
161
  readonly requiresMcpTools: readonly ["summer_get_diagnostics", "summer_get_console", "summer_get_scene_tree", "summer_inspect_node", "summer_inspect_resource", "summer_play", "summer_stop", "summer_is_running", "summer_clear_console", "summer_set_prop", "summer_project_setting"];
162
162
  readonly testScenario: "Profile a slow forest scene (~22 fps), identify the rendering hotspot via diagnostics, propose a fix, verify the metric moved.";
@@ -164,7 +164,7 @@ export declare const SKILL_REGISTRY: readonly [{
164
164
  readonly name: "design-npc";
165
165
  readonly category: "ai-and-npcs";
166
166
  readonly public: true;
167
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
167
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
168
168
  readonly recommended: true;
169
169
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_connect_signal", "summer_save_scene", "summer_get_script_errors", "summer_input_map_bind"];
170
170
  readonly testScenario: "Design a basic patrol-and-chase enemy with perception, decision logic, tells, and defeat handling; output state-machine GDScript stub plus scene tree.";
@@ -172,7 +172,7 @@ export declare const SKILL_REGISTRY: readonly [{
172
172
  readonly name: "setup-multiplayer";
173
173
  readonly category: "multiplayer-and-networking";
174
174
  readonly public: true;
175
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
175
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
176
176
  readonly recommended: true;
177
177
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_add_node", "summer_set_prop", "summer_connect_signal", "summer_save_scene", "summer_get_script_errors", "summer_project_setting", "summer_play", "summer_stop"];
178
178
  readonly testScenario: "Add co-op LAN multiplayer (2-4 players) using MultiplayerAPI + MultiplayerSpawner + MultiplayerSynchronizer + ENet; lock authority model up front.";
@@ -180,7 +180,7 @@ export declare const SKILL_REGISTRY: readonly [{
180
180
  readonly name: "peer-to-peer-multiplayer";
181
181
  readonly category: "multiplayer-and-networking";
182
182
  readonly public: true;
183
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
183
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
184
184
  readonly recommended: true;
185
185
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_create_scene", "summer_add_node", "summer_set_prop", "summer_connect_signal", "summer_save_scene", "summer_get_script_errors", "summer_project_setting"];
186
186
  readonly testScenario: "Build the four-layer P2P architecture from the ground up (NetworkManager + GameState + RPC patterns + prediction/interpolation) for a 2-player co-op game.";
@@ -188,7 +188,7 @@ export declare const SKILL_REGISTRY: readonly [{
188
188
  readonly name: "host-authoritative-state";
189
189
  readonly category: "multiplayer-and-networking";
190
190
  readonly public: true;
191
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
191
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
192
192
  readonly recommended: true;
193
193
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_save_scene", "summer_get_script_errors"];
194
194
  readonly testScenario: "Walk a 17-field state ownership audit, design a HealthManager + ScoreManager with the canonical Manager pattern, and verify late-join state replay works.";
@@ -196,7 +196,7 @@ export declare const SKILL_REGISTRY: readonly [{
196
196
  readonly name: "export-and-ship";
197
197
  readonly category: "deployment";
198
198
  readonly public: true;
199
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
199
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
200
200
  readonly recommended: true;
201
201
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_project_setting", "summer_get_console", "summer_get_diagnostics"];
202
202
  readonly testScenario: "Run the Steam pre-flight checklist (Windows + Mac + Linux), validate icons/banners/screenshots/build config, and produce a release build only when green.";
@@ -204,7 +204,7 @@ export declare const SKILL_REGISTRY: readonly [{
204
204
  readonly name: "concept-art";
205
205
  readonly category: "2d-assets";
206
206
  readonly public: true;
207
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
207
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
208
208
  readonly recommended: true;
209
209
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_search_assets", "summer_import_from_url"];
210
210
  readonly testScenario: "User asks for 'concept art for the protagonist' — skill produces 3-4 variant prompts on a locked style anchor and writes prompts to art/concept/_prompts.md as fallback when MCP unavailable.";
@@ -212,7 +212,7 @@ export declare const SKILL_REGISTRY: readonly [{
212
212
  readonly name: "character-portrait";
213
213
  readonly category: "2d-assets";
214
214
  readonly public: true;
215
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
215
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
216
216
  readonly recommended: true;
217
217
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_search_assets", "summer_import_from_url"];
218
218
  readonly testScenario: "User asks for a 'final portrait of the queen for dialogue UI' — skill locks composition, generates one polished bust against a locked anchor, imports as res://art/portraits/queen.png.";
@@ -220,7 +220,7 @@ export declare const SKILL_REGISTRY: readonly [{
220
220
  readonly name: "pixel-art";
221
221
  readonly category: "2d-assets";
222
222
  readonly public: true;
223
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
223
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
224
224
  readonly recommended: true;
225
225
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_search_assets", "summer_import_from_url"];
226
226
  readonly testScenario: "User requests a '64x64 pixel art heart icon' — skill generates with style: 'pixel', enforces nearest-neighbor texture filter project setting, imports to res://art/sprites/.";
@@ -228,7 +228,7 @@ export declare const SKILL_REGISTRY: readonly [{
228
228
  readonly name: "ui-graphics";
229
229
  readonly category: "2d-assets";
230
230
  readonly public: true;
231
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
231
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
232
232
  readonly recommended: false;
233
233
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
234
234
  readonly testScenario: "User asks for an inventory grid icon set — skill generates flat-design transparent PNGs, sets up AtlasTexture import, wires into TextureRect / NinePatchRect.";
@@ -236,7 +236,7 @@ export declare const SKILL_REGISTRY: readonly [{
236
236
  readonly name: "tileable-texture";
237
237
  readonly category: "2d-assets";
238
238
  readonly public: true;
239
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
239
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
240
240
  readonly recommended: false;
241
241
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_import_from_url", "summer_set_resource_property"];
242
242
  readonly testScenario: "User asks for a 'seamless brick wall texture' — skill generates with seamless prompt suffix, applies to PlaneMesh + StandardMaterial3D with uv1_scale tiled.";
@@ -244,7 +244,7 @@ export declare const SKILL_REGISTRY: readonly [{
244
244
  readonly name: "sprite-sheet";
245
245
  readonly category: "2d-assets";
246
246
  readonly public: true;
247
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
247
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
248
248
  readonly recommended: false;
249
249
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_import_from_url", "summer_set_resource_property", "summer_add_node", "summer_set_prop"];
250
250
  readonly testScenario: "User requests a '4-frame walk cycle for the goblin' — skill generates per-frame at locked anchor, builds SpriteFrames resource, wires AnimatedSprite2D.";
@@ -252,7 +252,7 @@ export declare const SKILL_REGISTRY: readonly [{
252
252
  readonly name: "skybox-panorama";
253
253
  readonly category: "2d-assets";
254
254
  readonly public: true;
255
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
255
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
256
256
  readonly recommended: false;
257
257
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_import_from_url", "summer_set_resource_property"];
258
258
  readonly testScenario: "User asks for a 'sunset desert skybox' — skill generates equirectangular 2:1 panorama, wires PanoramaSkyMaterial on WorldEnvironment.";
@@ -260,7 +260,7 @@ export declare const SKILL_REGISTRY: readonly [{
260
260
  readonly name: "prop-model";
261
261
  readonly category: "3d-assets";
262
262
  readonly public: true;
263
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
263
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
264
264
  readonly recommended: true;
265
265
  readonly requiresMcpTools: readonly ["summer_generate_3d", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
266
266
  readonly testScenario: "User asks for 'a treasure chest' — skill calls summer_generate_3d via image-to-3d pipeline with white-background prompt suffix, imports as MeshInstance3D.";
@@ -268,7 +268,7 @@ export declare const SKILL_REGISTRY: readonly [{
268
268
  readonly name: "character-model";
269
269
  readonly category: "3d-assets";
270
270
  readonly public: true;
271
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
271
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
272
272
  readonly recommended: true;
273
273
  readonly requiresMcpTools: readonly ["summer_generate_image", "summer_generate_3d", "summer_generate_motion", "summer_search_assets", "summer_inspect_resource", "summer_add_node", "summer_set_prop", "summer_save_scene"];
274
274
  readonly testScenario: "User asks for 'a knight character' — skill produces T-pose ref via image, gates rig pass on user approval, imports rigged glb, wires CharacterBody3D + Skeleton3D, hands off to animation/generate-motion.";
@@ -276,7 +276,7 @@ export declare const SKILL_REGISTRY: readonly [{
276
276
  readonly name: "environment-kit";
277
277
  readonly category: "3d-assets";
278
278
  readonly public: true;
279
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
279
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
280
280
  readonly recommended: false;
281
281
  readonly requiresMcpTools: readonly ["summer_generate_3d", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop", "summer_save_scene"];
282
282
  readonly testScenario: "User asks for 'a dungeon kit' — skill locks style anchor, generates 5-10 modular pieces with consistent prompt suffix, imports on snap-grid.";
@@ -284,7 +284,7 @@ export declare const SKILL_REGISTRY: readonly [{
284
284
  readonly name: "vehicle-model";
285
285
  readonly category: "3d-assets";
286
286
  readonly public: true;
287
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
287
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
288
288
  readonly recommended: false;
289
289
  readonly requiresMcpTools: readonly ["summer_generate_3d", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
290
290
  readonly testScenario: "User asks for 'a sci-fi hover bike' — skill provides multi-angle reference, generates with hard-surface model preference, recommends texture pass for panel detail.";
@@ -292,7 +292,7 @@ export declare const SKILL_REGISTRY: readonly [{
292
292
  readonly name: "organic-model";
293
293
  readonly category: "3d-assets";
294
294
  readonly public: true;
295
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
295
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
296
296
  readonly recommended: false;
297
297
  readonly requiresMcpTools: readonly ["summer_generate_3d", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
298
298
  readonly testScenario: "User asks for 'a glowing mushroom cluster' — skill generates organic shape via summer_generate_3d, imports with emission material, suggests MultiMeshInstance3D for forest fill.";
@@ -300,7 +300,7 @@ export declare const SKILL_REGISTRY: readonly [{
300
300
  readonly name: "generate-motion";
301
301
  readonly category: "animation";
302
302
  readonly public: true;
303
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
303
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
304
304
  readonly recommended: true;
305
305
  readonly requiresMcpTools: readonly ["summer_generate_motion", "summer_check_job", "summer_search_assets", "summer_inspect_resource", "summer_get_scene_tree", "summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_save_scene"];
306
306
  readonly testScenario: "User asks for 'a walk animation on the goblin' — skill verifies the rigged target, picks meshy-library backend for standard 'walk', wires the clip into AnimationPlayer.";
@@ -308,7 +308,7 @@ export declare const SKILL_REGISTRY: readonly [{
308
308
  readonly name: "retarget";
309
309
  readonly category: "animation";
310
310
  readonly public: true;
311
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
311
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
312
312
  readonly recommended: false;
313
313
  readonly requiresMcpTools: readonly ["summer_generate_motion", "summer_search_assets", "summer_inspect_resource", "summer_set_resource_property", "summer_save_scene"];
314
314
  readonly testScenario: "User asks to 'apply the goblin's walk to the orc' — skill identifies the source clip, retargets to the orc skeleton via SkeletonProfile, wires into the orc's AnimationPlayer.";
@@ -316,7 +316,7 @@ export declare const SKILL_REGISTRY: readonly [{
316
316
  readonly name: "animation-tree";
317
317
  readonly category: "animation";
318
318
  readonly public: true;
319
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
319
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
320
320
  readonly recommended: false;
321
321
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_save_scene"];
322
322
  readonly testScenario: "User has idle/walk/run clips — skill builds an AnimationTree with a BlendSpace1D driven by speed, wires the BlendTree to the player controller.";
@@ -324,7 +324,7 @@ export declare const SKILL_REGISTRY: readonly [{
324
324
  readonly name: "procedural-animation";
325
325
  readonly category: "animation";
326
326
  readonly public: true;
327
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
327
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
328
328
  readonly recommended: false;
329
329
  readonly requiresMcpTools: readonly ["summer_get_scene_tree", "summer_inspect_node", "summer_add_node", "summer_set_prop", "summer_save_scene"];
330
330
  readonly testScenario: "User asks for 'foot IK so the character doesn't sink into stairs' — skill adds SkeletonModification3DLookAt + raycasting on each foot, wires into the character's Skeleton3D.";
@@ -332,7 +332,7 @@ export declare const SKILL_REGISTRY: readonly [{
332
332
  readonly name: "facial-and-lipsync";
333
333
  readonly category: "animation";
334
334
  readonly public: true;
335
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
335
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
336
336
  readonly recommended: false;
337
337
  readonly requiresMcpTools: readonly ["summer_inspect_resource", "summer_set_resource_property", "summer_save_scene", "summer_generate_audio"];
338
338
  readonly testScenario: "User has a voice line and wants the character to lip-sync to it — skill generates phoneme markers, builds blend-shape animation track on the character's MeshInstance3D.";
@@ -340,7 +340,7 @@ export declare const SKILL_REGISTRY: readonly [{
340
340
  readonly name: "sound-effect";
341
341
  readonly category: "audio";
342
342
  readonly public: true;
343
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
343
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
344
344
  readonly recommended: true;
345
345
  readonly requiresMcpTools: readonly ["summer_generate_audio", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
346
346
  readonly testScenario: "User asks for 'a sword swing sound' — skill reads audio bible, builds ElevenLabs SFX prompt with material+action+intensity, wires AudioStreamPlayer3D on the SFX bus.";
@@ -348,7 +348,7 @@ export declare const SKILL_REGISTRY: readonly [{
348
348
  readonly name: "music-track";
349
349
  readonly category: "audio";
350
350
  readonly public: true;
351
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
351
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
352
352
  readonly recommended: true;
353
353
  readonly requiresMcpTools: readonly ["summer_generate_audio", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
354
354
  readonly testScenario: "User asks for 'ambient forest theme music for level 1' — skill generates 60s loop via ElevenLabs music, imports with loop enabled, wires AudioStreamPlayer on Music bus.";
@@ -356,7 +356,7 @@ export declare const SKILL_REGISTRY: readonly [{
356
356
  readonly name: "ambient-bed";
357
357
  readonly category: "audio";
358
358
  readonly public: true;
359
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
359
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
360
360
  readonly recommended: false;
361
361
  readonly requiresMcpTools: readonly ["summer_generate_audio", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
362
362
  readonly testScenario: "User asks for 'rain on tin roof ambience' — skill generates loop-clean ambience, sets up positional or non-positional player on Ambient bus.";
@@ -364,7 +364,7 @@ export declare const SKILL_REGISTRY: readonly [{
364
364
  readonly name: "voice-line";
365
365
  readonly category: "audio";
366
366
  readonly public: true;
367
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
367
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
368
368
  readonly recommended: true;
369
369
  readonly requiresMcpTools: readonly ["summer_generate_audio", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
370
370
  readonly testScenario: "User asks for 'the king says: you have served me well' — skill picks a voice ID matching character traits, generates TTS, wires to character's mouth via AudioStreamPlayer3D.";
@@ -372,7 +372,7 @@ export declare const SKILL_REGISTRY: readonly [{
372
372
  readonly name: "adaptive-music";
373
373
  readonly category: "audio";
374
374
  readonly public: true;
375
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
375
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
376
376
  readonly recommended: false;
377
377
  readonly requiresMcpTools: readonly ["summer_generate_audio", "summer_search_assets", "summer_inspect_node", "summer_add_node", "summer_set_prop", "summer_set_resource_property"];
378
378
  readonly testScenario: "User wants combat music that swells when enemies are nearby — skill generates layered stems (calm, tension, combat), wires AudioStreamPlaybackInteractive with combat-state listener.";
@@ -380,7 +380,7 @@ export declare const SKILL_REGISTRY: readonly [{
380
380
  readonly name: "cinematic-cutscene";
381
381
  readonly category: "video";
382
382
  readonly public: true;
383
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
383
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
384
384
  readonly recommended: true;
385
385
  readonly requiresMcpTools: readonly ["summer_generate_video", "summer_generate_image", "summer_generate_audio", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
386
386
  readonly testScenario: "User asks for 'an opening cutscene where the hero arrives at the castle' — skill builds reference image, generates 5-10s shot via image-to-video, wires VideoStreamPlayer in cutscene scene.";
@@ -388,7 +388,7 @@ export declare const SKILL_REGISTRY: readonly [{
388
388
  readonly name: "trailer-shot";
389
389
  readonly category: "video";
390
390
  readonly public: true;
391
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
391
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
392
392
  readonly recommended: false;
393
393
  readonly requiresMcpTools: readonly ["summer_generate_video", "summer_generate_image", "summer_search_assets", "summer_import_from_url"];
394
394
  readonly testScenario: "User asks for 'a hero shot of the boss for the trailer' — skill picks kling for premium quality, generates 5s low-angle dramatic shot, exports to assets/trailer/.";
@@ -396,7 +396,7 @@ export declare const SKILL_REGISTRY: readonly [{
396
396
  readonly name: "animated-loop";
397
397
  readonly category: "video";
398
398
  readonly public: true;
399
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
399
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
400
400
  readonly recommended: false;
401
401
  readonly requiresMcpTools: readonly ["summer_generate_video", "summer_search_assets", "summer_import_from_url", "summer_add_node", "summer_set_prop"];
402
402
  readonly testScenario: "User asks for 'a looping fire backdrop for the title screen' — skill generates 3-5s loop-clean clip via ltx, wires VideoStreamPlayer with autoplay+loop in title scene.";
@@ -404,7 +404,7 @@ export declare const SKILL_REGISTRY: readonly [{
404
404
  readonly name: "fire";
405
405
  readonly category: "visual-effects";
406
406
  readonly public: true;
407
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
407
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
408
408
  readonly recommended: true;
409
409
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene"];
410
410
  readonly testScenario: "User asks for 'a torch flame' — skill creates GPUParticles3D with custom shader, writes addons/vfx/fire/{fire.gdshader, fire_controller.gd}, wires to scene.";
@@ -412,7 +412,7 @@ export declare const SKILL_REGISTRY: readonly [{
412
412
  readonly name: "muzzle-flash";
413
413
  readonly category: "visual-effects";
414
414
  readonly public: true;
415
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
415
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
416
416
  readonly recommended: true;
417
417
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene"];
418
418
  readonly testScenario: "User asks for 'a muzzle flash on the rifle' — skill creates one-shot GPUParticles3D with star-burst shader, wires restart() on weapon-fire signal.";
@@ -420,7 +420,7 @@ export declare const SKILL_REGISTRY: readonly [{
420
420
  readonly name: "water-ripple";
421
421
  readonly category: "visual-effects";
422
422
  readonly public: true;
423
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
423
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
424
424
  readonly recommended: false;
425
425
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene"];
426
426
  readonly testScenario: "User wants 'water ripples when objects splash' — skill creates MeshInstance3D plane with custom water shader, exposes add_ripple(position) API.";
@@ -428,7 +428,7 @@ export declare const SKILL_REGISTRY: readonly [{
428
428
  readonly name: "lightning";
429
429
  readonly category: "visual-effects";
430
430
  readonly public: true;
431
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
431
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
432
432
  readonly recommended: false;
433
433
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene", "summer_connect_signal"];
434
434
  readonly testScenario: "User wants 'a lightning strike VFX' — skill builds ImmediateMesh-based jagged-segment renderer with shader, calls CameraShake.add_trauma(0.6) on cast.";
@@ -436,7 +436,7 @@ export declare const SKILL_REGISTRY: readonly [{
436
436
  readonly name: "dissolve";
437
437
  readonly category: "visual-effects";
438
438
  readonly public: true;
439
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
439
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
440
440
  readonly recommended: false;
441
441
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene"];
442
442
  readonly testScenario: "User wants 'an enemy that dissolves on death' — skill writes dissolve.gdshader override + dissolve_object(target, duration) controller, animates threshold uniform.";
@@ -444,7 +444,7 @@ export declare const SKILL_REGISTRY: readonly [{
444
444
  readonly name: "smoke";
445
445
  readonly category: "visual-effects";
446
446
  readonly public: true;
447
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
447
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
448
448
  readonly recommended: false;
449
449
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene"];
450
450
  readonly testScenario: "User wants 'smoke from a burning torch' — skill creates GPUParticles3D + smoke shader using shared FBM noise, wires wind direction parameter.";
@@ -452,7 +452,7 @@ export declare const SKILL_REGISTRY: readonly [{
452
452
  readonly name: "hit-spark";
453
453
  readonly category: "visual-effects";
454
454
  readonly public: true;
455
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
455
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
456
456
  readonly recommended: false;
457
457
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene"];
458
458
  readonly testScenario: "User wants 'sparks when a sword hits metal' — skill spawns one-shot GPUParticles3D with additive billboard material, orients to surface normal.";
@@ -460,7 +460,7 @@ export declare const SKILL_REGISTRY: readonly [{
460
460
  readonly name: "magic-glow";
461
461
  readonly category: "visual-effects";
462
462
  readonly public: true;
463
- readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf"];
463
+ readonly clients: readonly ["summer", "codex", "claude-code", "cursor", "windsurf", "cline", "roo-code", "gemini", "opencode"];
464
464
  readonly recommended: false;
465
465
  readonly requiresMcpTools: readonly ["summer_add_node", "summer_set_prop", "summer_set_resource_property", "summer_inspect_node", "summer_save_scene"];
466
466
  readonly testScenario: "User wants 'a magical glow on a rune' — skill creates OmniLight3D with pulse-on-sin script + GPUParticles3D motes, uses additive billboard material from building blocks.";
@@ -4,6 +4,10 @@ export const AGENT_CLIENTS = [
4
4
  "claude-code",
5
5
  "cursor",
6
6
  "windsurf",
7
+ "cline",
8
+ "roo-code",
9
+ "gemini",
10
+ "opencode",
7
11
  ];
8
12
  export const SKILL_CATEGORIES = [
9
13
  "_meta",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "summer-engine",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Summer — superpowers for AI game dev. CLI, skills, and MCP tools for Summer Engine.",
5
5
  "keywords": [
6
6
  "game-engine",