@every-env/compound-plugin 0.5.2 → 0.8.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 (56) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.cursor-plugin/marketplace.json +25 -0
  3. package/CHANGELOG.md +47 -0
  4. package/README.md +29 -6
  5. package/bun.lock +1 -0
  6. package/docs/brainstorms/2026-02-14-copilot-converter-target-brainstorm.md +117 -0
  7. package/docs/brainstorms/2026-02-17-copilot-skill-naming-brainstorm.md +30 -0
  8. package/docs/plans/2026-02-14-feat-add-copilot-converter-target-plan.md +328 -0
  9. package/docs/plans/2026-02-14-feat-add-gemini-cli-target-provider-plan.md +370 -0
  10. package/docs/specs/copilot.md +122 -0
  11. package/docs/specs/gemini.md +122 -0
  12. package/package.json +1 -1
  13. package/plugins/coding-tutor/.cursor-plugin/plugin.json +21 -0
  14. package/plugins/compound-engineering/.claude-plugin/plugin.json +1 -1
  15. package/plugins/compound-engineering/.cursor-plugin/plugin.json +31 -0
  16. package/plugins/compound-engineering/.mcp.json +8 -0
  17. package/plugins/compound-engineering/CHANGELOG.md +27 -0
  18. package/plugins/compound-engineering/commands/lfg.md +3 -3
  19. package/plugins/compound-engineering/commands/slfg.md +2 -2
  20. package/plugins/compound-engineering/commands/workflows/plan.md +18 -1
  21. package/plugins/compound-engineering/commands/workflows/work.md +8 -1
  22. package/src/commands/convert.ts +14 -25
  23. package/src/commands/install.ts +27 -25
  24. package/src/commands/sync.ts +44 -21
  25. package/src/converters/{claude-to-cursor.ts → claude-to-copilot.ts} +93 -49
  26. package/src/converters/claude-to-gemini.ts +193 -0
  27. package/src/converters/claude-to-opencode.ts +16 -0
  28. package/src/converters/claude-to-pi.ts +205 -0
  29. package/src/sync/copilot.ts +100 -0
  30. package/src/sync/droid.ts +21 -0
  31. package/src/sync/pi.ts +88 -0
  32. package/src/targets/copilot.ts +48 -0
  33. package/src/targets/gemini.ts +68 -0
  34. package/src/targets/index.ts +25 -7
  35. package/src/targets/pi.ts +131 -0
  36. package/src/templates/pi/compat-extension.ts +452 -0
  37. package/src/types/copilot.ts +31 -0
  38. package/src/types/gemini.ts +29 -0
  39. package/src/types/pi.ts +40 -0
  40. package/src/utils/frontmatter.ts +1 -1
  41. package/src/utils/resolve-home.ts +17 -0
  42. package/tests/cli.test.ts +76 -0
  43. package/tests/converter.test.ts +29 -0
  44. package/tests/copilot-converter.test.ts +467 -0
  45. package/tests/copilot-writer.test.ts +189 -0
  46. package/tests/gemini-converter.test.ts +373 -0
  47. package/tests/gemini-writer.test.ts +181 -0
  48. package/tests/pi-converter.test.ts +116 -0
  49. package/tests/pi-writer.test.ts +99 -0
  50. package/tests/sync-copilot.test.ts +148 -0
  51. package/tests/sync-droid.test.ts +57 -0
  52. package/tests/sync-pi.test.ts +68 -0
  53. package/src/targets/cursor.ts +0 -48
  54. package/src/types/cursor.ts +0 -29
  55. package/tests/cursor-converter.test.ts +0 -347
  56. package/tests/cursor-writer.test.ts +0 -137
@@ -0,0 +1,370 @@
1
+ ---
2
+ title: Add Gemini CLI as a Target Provider
3
+ type: feat
4
+ status: completed
5
+ completed_date: 2026-02-14
6
+ completed_by: "Claude Opus 4.6"
7
+ actual_effort: "Completed in one session"
8
+ date: 2026-02-14
9
+ ---
10
+
11
+ # Add Gemini CLI as a Target Provider
12
+
13
+ ## Overview
14
+
15
+ Add `gemini` as a sixth target provider in the converter CLI, alongside `opencode`, `codex`, `droid`, `cursor`, and `pi`. This enables `--to gemini` for both `convert` and `install` commands, converting Claude Code plugins into Gemini CLI-compatible format.
16
+
17
+ Gemini CLI ([google-gemini/gemini-cli](https://github.com/google-gemini/gemini-cli)) is Google's open-source AI agent for the terminal. It supports GEMINI.md context files, custom commands (TOML format), agent skills (SKILL.md standard), MCP servers, and extensions -- making it a strong conversion target with good coverage of Claude Code plugin concepts.
18
+
19
+ ## Component Mapping
20
+
21
+ | Claude Code | Gemini Equivalent | Notes |
22
+ |---|---|---|
23
+ | `agents/*.md` | `.gemini/skills/*/SKILL.md` | Agents become skills -- Gemini activates them on demand via `activate_skill` tool based on description matching |
24
+ | `commands/*.md` | `.gemini/commands/*.toml` | TOML format with `prompt` and `description` fields; namespaced via directory structure |
25
+ | `skills/*/SKILL.md` | `.gemini/skills/*/SKILL.md` | **Identical standard** -- copy directly |
26
+ | MCP servers | `settings.json` `mcpServers` | Same MCP protocol; different config location (`settings.json` vs `.mcp.json`) |
27
+ | `hooks/` | `settings.json` hooks | Gemini has hooks (`BeforeTool`, `AfterTool`, `SessionStart`, etc.) but different format; emit `console.warn` and skip for now |
28
+ | `.claude/` paths | `.gemini/` paths | Content rewriting needed |
29
+
30
+ ### Key Design Decisions
31
+
32
+ **1. Agents become skills (not GEMINI.md context)**
33
+
34
+ With 29 agents, dumping them into GEMINI.md would flood every session's context. Instead, agents convert to skills -- Gemini autonomously activates them based on the skill description when relevant. This matches how Claude Code agents are invoked on demand via the Task tool.
35
+
36
+ **2. Commands use TOML format with directory-based namespacing**
37
+
38
+ Gemini CLI commands are `.toml` files where the path determines the command name: `.gemini/commands/git/commit.toml` becomes `/git:commit`. This maps cleanly from Claude Code's colon-namespaced commands (`workflows:plan` -> `.gemini/commands/workflows/plan.toml`).
39
+
40
+ **3. Commands use `{{args}}` placeholder**
41
+
42
+ Gemini's TOML commands support `{{args}}` for argument injection, mapping from Claude Code's `argument-hint` field. Commands with `argument-hint` get `{{args}}` appended to the prompt.
43
+
44
+ **4. MCP servers go into project-level settings.json**
45
+
46
+ Gemini CLI reads MCP config from `.gemini/settings.json` under the `mcpServers` key. The format is compatible -- same `command`, `args`, `env` fields, plus Gemini-specific `cwd`, `timeout`, `trust`, `includeTools`, `excludeTools`.
47
+
48
+ **5. Skills pass through unchanged**
49
+
50
+ Gemini adopted the same SKILL.md standard (YAML frontmatter with `name` and `description`, markdown body). Skills copy directly.
51
+
52
+ ### TOML Command Format
53
+
54
+ ```toml
55
+ description = "Brief description of the command"
56
+ prompt = """
57
+ The prompt content that will be sent to Gemini.
58
+
59
+ User request: {{args}}
60
+ """
61
+ ```
62
+
63
+ - `description` (string): One-line description shown in `/help`
64
+ - `prompt` (string): The prompt sent to the model; supports `{{args}}`, `!{shell}`, `@{file}` placeholders
65
+
66
+ ### Skill (SKILL.md) Format
67
+
68
+ ```yaml
69
+ ---
70
+ name: skill-name
71
+ description: When and how Gemini should use this skill
72
+ ---
73
+
74
+ # Skill Title
75
+
76
+ Detailed instructions...
77
+ ```
78
+
79
+ Identical to Claude Code's format. The `description` field is critical -- Gemini uses it to decide when to activate the skill.
80
+
81
+ ### MCP Server Format (settings.json)
82
+
83
+ ```json
84
+ {
85
+ "mcpServers": {
86
+ "server-name": {
87
+ "command": "npx",
88
+ "args": ["-y", "package-name"],
89
+ "env": { "KEY": "value" }
90
+ }
91
+ }
92
+ }
93
+ ```
94
+
95
+ ## Acceptance Criteria
96
+
97
+ - [x] `bun run src/index.ts convert --to gemini ./plugins/compound-engineering` produces valid Gemini config
98
+ - [x] Agents convert to `.gemini/skills/*/SKILL.md` with populated `description` in frontmatter
99
+ - [x] Commands convert to `.gemini/commands/*.toml` with `prompt` and `description` fields
100
+ - [x] Namespaced commands create directory structure (`workflows:plan` -> `commands/workflows/plan.toml`)
101
+ - [x] Commands with `argument-hint` include `{{args}}` placeholder in prompt
102
+ - [x] Commands with `disable-model-invocation: true` are still included (TOML commands are prompts, not code)
103
+ - [x] Skills copied to `.gemini/skills/` (identical format)
104
+ - [x] MCP servers written to `.gemini/settings.json` under `mcpServers` key
105
+ - [x] Existing `.gemini/settings.json` is backed up before overwrite, and MCP config is merged (not clobbered)
106
+ - [x] Content transformation rewrites `.claude/` and `~/.claude/` paths to `.gemini/` and `~/.gemini/`
107
+ - [x] `/workflows:plan` transformed to `/workflows:plan` (Gemini preserves colon namespacing via directories)
108
+ - [x] `Task agent-name(args)` transformed to `Use the agent-name skill to: args`
109
+ - [x] Plugins with hooks emit `console.warn` about format differences
110
+ - [x] Writer does not double-nest `.gemini/.gemini/`
111
+ - [x] `model` and `allowedTools` fields silently dropped (no Gemini equivalent in skills/commands)
112
+ - [x] Converter and writer tests pass
113
+ - [x] Existing tests still pass (`bun test`)
114
+
115
+ ## Implementation
116
+
117
+ ### Phase 1: Types
118
+
119
+ **Create `src/types/gemini.ts`**
120
+
121
+ ```typescript
122
+ export type GeminiSkill = {
123
+ name: string
124
+ content: string // Full SKILL.md with YAML frontmatter
125
+ }
126
+
127
+ export type GeminiSkillDir = {
128
+ name: string
129
+ sourceDir: string
130
+ }
131
+
132
+ export type GeminiCommand = {
133
+ name: string // e.g. "plan" or "workflows/plan"
134
+ content: string // Full TOML content
135
+ }
136
+
137
+ export type GeminiBundle = {
138
+ generatedSkills: GeminiSkill[] // From agents
139
+ skillDirs: GeminiSkillDir[] // From skills (pass-through)
140
+ commands: GeminiCommand[]
141
+ mcpServers?: Record<string, {
142
+ command?: string
143
+ args?: string[]
144
+ env?: Record<string, string>
145
+ url?: string
146
+ headers?: Record<string, string>
147
+ }>
148
+ }
149
+ ```
150
+
151
+ ### Phase 2: Converter
152
+
153
+ **Create `src/converters/claude-to-gemini.ts`**
154
+
155
+ Core functions:
156
+
157
+ 1. **`convertClaudeToGemini(plugin, options)`** -- main entry point
158
+ - Convert each agent to a skill via `convertAgentToSkill()`
159
+ - Convert each command via `convertCommand()`
160
+ - Pass skills through as directory references
161
+ - Convert MCP servers to settings-compatible object
162
+ - Emit `console.warn` if `plugin.hooks` has entries
163
+
164
+ 2. **`convertAgentToSkill(agent)`** -- agent -> SKILL.md
165
+ - Frontmatter: `name` (from agent name), `description` (from agent description, max ~300 chars)
166
+ - Body: agent body with content transformations applied
167
+ - Prepend capabilities section if present
168
+ - Silently drop `model` field (no Gemini equivalent)
169
+ - If description is empty, generate from agent name: `"Use this skill for ${agent.name} tasks"`
170
+
171
+ 3. **`convertCommand(command, usedNames)`** -- command -> TOML file
172
+ - Preserve namespace structure: `workflows:plan` -> path `workflows/plan`
173
+ - `description` field from command description
174
+ - `prompt` field from command body with content transformations
175
+ - If command has `argument-hint`, append `\n\nUser request: {{args}}` to prompt
176
+ - Body: apply `transformContentForGemini()` transformations
177
+ - Silently drop `allowedTools` (no Gemini equivalent)
178
+
179
+ 4. **`transformContentForGemini(body)`** -- content rewriting
180
+ - `.claude/` -> `.gemini/` and `~/.claude/` -> `~/.gemini/`
181
+ - `Task agent-name(args)` -> `Use the agent-name skill to: args`
182
+ - `@agent-name` references -> `the agent-name skill`
183
+ - Skip file paths (containing `/`) and common non-command patterns
184
+
185
+ 5. **`convertMcpServers(servers)`** -- MCP config
186
+ - Map each `ClaudeMcpServer` entry to Gemini-compatible JSON
187
+ - Pass through: `command`, `args`, `env`, `url`, `headers`
188
+ - Drop `type` field (Gemini infers transport)
189
+
190
+ 6. **`toToml(description, prompt)`** -- TOML serializer
191
+ - Escape TOML strings properly
192
+ - Use multi-line strings (`"""`) for prompt field
193
+ - Simple string for description
194
+
195
+ ### Phase 3: Writer
196
+
197
+ **Create `src/targets/gemini.ts`**
198
+
199
+ Output structure:
200
+
201
+ ```
202
+ .gemini/
203
+ ├── commands/
204
+ │ ├── plan.toml
205
+ │ └── workflows/
206
+ │ └── plan.toml
207
+ ├── skills/
208
+ │ ├── agent-name-1/
209
+ │ │ └── SKILL.md
210
+ │ ├── agent-name-2/
211
+ │ │ └── SKILL.md
212
+ │ └── original-skill/
213
+ │ └── SKILL.md
214
+ └── settings.json (only mcpServers key)
215
+ ```
216
+
217
+ Core function: `writeGeminiBundle(outputRoot, bundle)`
218
+
219
+ - `resolveGeminiPaths(outputRoot)` -- detect if path already ends in `.gemini` to avoid double-nesting (follow droid writer pattern)
220
+ - Write generated skills to `skills/<name>/SKILL.md`
221
+ - Copy original skill directories to `skills/` via `copyDir()`
222
+ - Write commands to `commands/` as `.toml` files, creating subdirectories for namespaced commands
223
+ - Write `settings.json` with `{ "mcpServers": {...} }` via `writeJson()` with `backupFile()` for existing files
224
+ - If settings.json exists, read it first and merge `mcpServers` key (don't clobber other settings)
225
+
226
+ ### Phase 4: Wire into CLI
227
+
228
+ **Modify `src/targets/index.ts`**
229
+
230
+ ```typescript
231
+ import { convertClaudeToGemini } from "../converters/claude-to-gemini"
232
+ import { writeGeminiBundle } from "./gemini"
233
+ import type { GeminiBundle } from "../types/gemini"
234
+
235
+ // Add to targets:
236
+ gemini: {
237
+ name: "gemini",
238
+ implemented: true,
239
+ convert: convertClaudeToGemini as TargetHandler<GeminiBundle>["convert"],
240
+ write: writeGeminiBundle as TargetHandler<GeminiBundle>["write"],
241
+ },
242
+ ```
243
+
244
+ **Modify `src/commands/convert.ts`**
245
+
246
+ - Update `--to` description: `"Target format (opencode | codex | droid | cursor | pi | gemini)"`
247
+ - Add to `resolveTargetOutputRoot`: `if (targetName === "gemini") return path.join(outputRoot, ".gemini")`
248
+
249
+ **Modify `src/commands/install.ts`**
250
+
251
+ - Same two changes as convert.ts
252
+
253
+ ### Phase 5: Tests
254
+
255
+ **Create `tests/gemini-converter.test.ts`**
256
+
257
+ Test cases (use inline `ClaudePlugin` fixtures, following existing converter test patterns):
258
+
259
+ - Agent converts to skill with SKILL.md frontmatter (`name` and `description` populated)
260
+ - Agent with empty description gets default description text
261
+ - Agent with capabilities prepended to body
262
+ - Agent `model` field silently dropped
263
+ - Agent with empty body gets default body text
264
+ - Command converts to TOML with `prompt` and `description` fields
265
+ - Namespaced command creates correct path (`workflows:plan` -> `workflows/plan`)
266
+ - Command with `disable-model-invocation` is still included
267
+ - Command `allowedTools` silently dropped
268
+ - Command with `argument-hint` gets `{{args}}` placeholder in prompt
269
+ - Skills pass through as directory references
270
+ - MCP servers convert to settings.json-compatible config
271
+ - Content transformation: `.claude/` paths -> `.gemini/`
272
+ - Content transformation: `~/.claude/` paths -> `~/.gemini/`
273
+ - Content transformation: `Task agent(args)` -> natural language skill reference
274
+ - Hooks present -> `console.warn` emitted
275
+ - Plugin with zero agents produces empty generatedSkills array
276
+ - Plugin with only skills works correctly
277
+ - TOML output is valid (description and prompt properly escaped)
278
+
279
+ **Create `tests/gemini-writer.test.ts`**
280
+
281
+ Test cases (use temp directories, following existing writer test patterns):
282
+
283
+ - Full bundle writes skills, commands, settings.json
284
+ - Generated skills written as `skills/<name>/SKILL.md`
285
+ - Original skills copied to `skills/` directory
286
+ - Commands written as `.toml` files in `commands/` directory
287
+ - Namespaced commands create subdirectories (`commands/workflows/plan.toml`)
288
+ - MCP config written as valid JSON `settings.json` with `mcpServers` key
289
+ - Existing `settings.json` is backed up before overwrite
290
+ - Output root already ending in `.gemini` does NOT double-nest
291
+ - Empty bundle produces no output
292
+
293
+ ### Phase 6: Documentation
294
+
295
+ **Create `docs/specs/gemini.md`**
296
+
297
+ Document the Gemini CLI spec as reference, following existing `docs/specs/codex.md` pattern:
298
+
299
+ - GEMINI.md context file format
300
+ - Custom commands format (TOML with `prompt`, `description`)
301
+ - Skills format (identical SKILL.md standard)
302
+ - MCP server configuration (`settings.json`)
303
+ - Extensions system (for reference, not converted)
304
+ - Hooks system (for reference, format differences noted)
305
+ - Config file locations (user-level `~/.gemini/` vs project-level `.gemini/`)
306
+ - Directory layout conventions
307
+
308
+ **Update `README.md`**
309
+
310
+ Add `gemini` to the supported targets in the CLI usage section.
311
+
312
+ ## What We're NOT Doing
313
+
314
+ - Not converting hooks (Gemini has hooks but different format -- `BeforeTool`/`AfterTool` with matchers -- warn and skip)
315
+ - Not generating full `settings.json` (only `mcpServers` key -- user-specific settings like `model`, `tools.sandbox` are out of scope)
316
+ - Not creating extensions (extension format is for distributing packages, not for converted plugins)
317
+ - Not using `@{file}` or `!{shell}` placeholders in converted commands (would require analyzing command intent)
318
+ - Not transforming content inside copied SKILL.md files (known limitation -- skills may reference `.claude/` paths internally)
319
+ - Not clearing old output before writing (matches existing target behavior)
320
+ - Not merging into existing settings.json intelligently beyond `mcpServers` key (too risky to modify user config)
321
+
322
+ ## Complexity Assessment
323
+
324
+ This is a **medium change**. The converter architecture is well-established with five existing targets, so this is mostly pattern-following. The key novelties are:
325
+
326
+ 1. The TOML command format (unique among all targets -- need simple TOML serializer)
327
+ 2. Agents map to skills rather than a direct 1:1 concept (but this is the same pattern as codex)
328
+ 3. Namespaced commands use directory structure (new approach vs flattening in cursor/codex)
329
+ 4. MCP config goes into a broader `settings.json` file (need to merge, not clobber)
330
+
331
+ Skills being identical across platforms simplifies things significantly. The TOML serialization is simple (only two fields: `description` string and `prompt` multi-line string).
332
+
333
+ ## References
334
+
335
+ - [Gemini CLI Repository](https://github.com/google-gemini/gemini-cli)
336
+ - [Gemini CLI Configuration](https://geminicli.com/docs/get-started/configuration/)
337
+ - [Custom Commands (TOML)](https://geminicli.com/docs/cli/custom-commands/)
338
+ - [Agent Skills](https://geminicli.com/docs/cli/skills/)
339
+ - [Creating Skills](https://geminicli.com/docs/cli/creating-skills/)
340
+ - [Extensions](https://geminicli.com/docs/extensions/writing-extensions/)
341
+ - [MCP Servers](https://google-gemini.github.io/gemini-cli/docs/tools/mcp-server.html)
342
+ - Existing cursor plan: `docs/plans/2026-02-12-feat-add-cursor-cli-target-provider-plan.md`
343
+ - Existing codex converter: `src/converters/claude-to-codex.ts` (has `uniqueName()` and skill generation patterns)
344
+ - Existing droid writer: `src/targets/droid.ts` (has double-nesting guard pattern)
345
+ - Target registry: `src/targets/index.ts`
346
+
347
+ ## Completion Summary
348
+
349
+ ### What Was Delivered
350
+ - [x] Phase 1: Types (`src/types/gemini.ts`)
351
+ - [x] Phase 2: Converter (`src/converters/claude-to-gemini.ts`)
352
+ - [x] Phase 3: Writer (`src/targets/gemini.ts`)
353
+ - [x] Phase 4: CLI wiring (`src/targets/index.ts`, `src/commands/convert.ts`, `src/commands/install.ts`)
354
+ - [x] Phase 5: Tests (`tests/gemini-converter.test.ts`, `tests/gemini-writer.test.ts`)
355
+ - [x] Phase 6: Documentation (`docs/specs/gemini.md`, `README.md`)
356
+
357
+ ### Implementation Statistics
358
+ - 10 files changed
359
+ - 27 new tests added (129 total, all passing)
360
+ - 148 output files generated from compound-engineering plugin conversion
361
+ - 0 dependencies added
362
+
363
+ ### Git Commits
364
+ - `201ad6d` feat(gemini): add Gemini CLI as sixth target provider
365
+ - `8351851` docs: add Gemini CLI spec and update README with gemini target
366
+
367
+ ### Completion Details
368
+ - **Completed By:** Claude Opus 4.6
369
+ - **Date:** 2026-02-14
370
+ - **Session:** Single session
@@ -0,0 +1,122 @@
1
+ # GitHub Copilot Spec (Agents, Skills, MCP)
2
+
3
+ Last verified: 2026-02-14
4
+
5
+ ## Primary sources
6
+
7
+ ```
8
+ https://docs.github.com/en/copilot/reference/custom-agents-configuration
9
+ https://docs.github.com/en/copilot/concepts/agents/about-agent-skills
10
+ https://docs.github.com/en/copilot/concepts/agents/coding-agent/mcp-and-coding-agent
11
+ ```
12
+
13
+ ## Config locations
14
+
15
+ | Scope | Path |
16
+ |-------|------|
17
+ | Project agents | `.github/agents/*.agent.md` |
18
+ | Project skills | `.github/skills/*/SKILL.md` |
19
+ | Project instructions | `.github/copilot-instructions.md` |
20
+ | Path-specific instructions | `.github/instructions/*.instructions.md` |
21
+ | Project prompts | `.github/prompts/*.prompt.md` |
22
+ | Org/enterprise agents | `.github-private/agents/*.agent.md` |
23
+ | Personal skills | `~/.copilot/skills/*/SKILL.md` |
24
+ | Directory instructions | `AGENTS.md` (nearest ancestor wins) |
25
+
26
+ ## Agents (.agent.md files)
27
+
28
+ - Custom agents are Markdown files with YAML frontmatter stored in `.github/agents/`.
29
+ - File extension is `.agent.md` (or `.md`). Filenames may only contain: `.`, `-`, `_`, `a-z`, `A-Z`, `0-9`.
30
+ - `description` is the only required frontmatter field.
31
+
32
+ ### Frontmatter fields
33
+
34
+ | Field | Required | Default | Description |
35
+ |-------|----------|---------|-------------|
36
+ | `name` | No | Derived from filename | Display name |
37
+ | `description` | **Yes** | — | What the agent does |
38
+ | `tools` | No | `["*"]` | Tool access list. `[]` disables all tools. |
39
+ | `target` | No | both | `vscode`, `github-copilot`, or omit for both |
40
+ | `infer` | No | `true` | Auto-select based on task context |
41
+ | `model` | No | Platform default | AI model (works in IDE, may be ignored on github.com) |
42
+ | `mcp-servers` | No | — | MCP config (org/enterprise agents only) |
43
+ | `metadata` | No | — | Arbitrary key-value annotations |
44
+
45
+ ### Character limit
46
+
47
+ Agent body content is limited to **30,000 characters**.
48
+
49
+ ### Tool names
50
+
51
+ | Name | Aliases | Purpose |
52
+ |------|---------|---------|
53
+ | `execute` | `shell`, `Bash` | Run shell commands |
54
+ | `read` | `Read` | Read files |
55
+ | `edit` | `Edit`, `Write` | Modify files |
56
+ | `search` | `Grep`, `Glob` | Search files |
57
+ | `agent` | `Task` | Invoke other agents |
58
+ | `web` | `WebSearch`, `WebFetch` | Web access |
59
+
60
+ ## Skills (SKILL.md)
61
+
62
+ - Skills follow the open SKILL.md standard (same format as Claude Code and Cursor).
63
+ - A skill is a directory containing `SKILL.md` plus optional `scripts/`, `references/`, and `assets/`.
64
+ - YAML frontmatter requires `name` and `description` fields.
65
+ - Skills are loaded on-demand when Copilot determines relevance.
66
+
67
+ ### Discovery locations
68
+
69
+ | Scope | Path |
70
+ |-------|------|
71
+ | Project | `.github/skills/*/SKILL.md` |
72
+ | Project (Claude-compatible) | `.claude/skills/*/SKILL.md` |
73
+ | Project (auto-discovery) | `.agents/skills/*/SKILL.md` |
74
+ | Personal | `~/.copilot/skills/*/SKILL.md` |
75
+
76
+ ## MCP (Model Context Protocol)
77
+
78
+ - MCP configuration is set via **Repository Settings > Copilot > Coding agent > MCP configuration** on GitHub.
79
+ - Repository-level agents **cannot** define MCP servers inline; use repository settings instead.
80
+ - Org/enterprise agents can embed MCP server definitions in frontmatter.
81
+ - All env var names must use the `COPILOT_MCP_` prefix.
82
+ - Only MCP tools are supported (not resources or prompts).
83
+
84
+ ### Config structure
85
+
86
+ ```json
87
+ {
88
+ "mcpServers": {
89
+ "server-name": {
90
+ "type": "local",
91
+ "command": "npx",
92
+ "args": ["package"],
93
+ "tools": ["*"],
94
+ "env": {
95
+ "API_KEY": "COPILOT_MCP_API_KEY"
96
+ }
97
+ }
98
+ }
99
+ }
100
+ ```
101
+
102
+ ### Server types
103
+
104
+ | Type | Fields |
105
+ |------|--------|
106
+ | Local/stdio | `type: "local"`, `command`, `args`, `tools`, `env` |
107
+ | Remote/SSE | `type: "sse"`, `url`, `tools`, `headers` |
108
+
109
+ ## Prompts (.prompt.md)
110
+
111
+ - Reusable prompt files stored in `.github/prompts/`.
112
+ - Available in VS Code, Visual Studio, and JetBrains IDEs only (not on github.com).
113
+ - Invoked via `/promptname` in chat.
114
+ - Support variable syntax: `${input:name}`, `${file}`, `${selection}`.
115
+
116
+ ## Precedence
117
+
118
+ 1. Repository-level agents
119
+ 2. Organization-level agents (`.github-private`)
120
+ 3. Enterprise-level agents (`.github-private`)
121
+
122
+ Within a repo, `AGENTS.md` files in directories provide nearest-ancestor-wins instructions.
@@ -0,0 +1,122 @@
1
+ # Gemini CLI Spec (GEMINI.md, Commands, Skills, MCP, Settings)
2
+
3
+ Last verified: 2026-02-14
4
+
5
+ ## Primary sources
6
+
7
+ ```
8
+ https://github.com/google-gemini/gemini-cli
9
+ https://geminicli.com/docs/get-started/configuration/
10
+ https://geminicli.com/docs/cli/custom-commands/
11
+ https://geminicli.com/docs/cli/skills/
12
+ https://geminicli.com/docs/cli/creating-skills/
13
+ https://geminicli.com/docs/extensions/writing-extensions/
14
+ https://google-gemini.github.io/gemini-cli/docs/tools/mcp-server.html
15
+ ```
16
+
17
+ ## Config locations
18
+
19
+ - User-level config: `~/.gemini/settings.json`
20
+ - Project-level config: `.gemini/settings.json`
21
+ - Project-level takes precedence over user-level for most settings.
22
+ - GEMINI.md context file lives at project root (similar to CLAUDE.md).
23
+
24
+ ## GEMINI.md context file
25
+
26
+ - A markdown file at project root loaded into every session's context.
27
+ - Used for project-wide instructions, coding standards, and conventions.
28
+ - Equivalent to Claude Code's CLAUDE.md.
29
+
30
+ ## Custom commands (TOML format)
31
+
32
+ - Custom commands are TOML files stored in `.gemini/commands/`.
33
+ - Command name is derived from the file path: `.gemini/commands/git/commit.toml` becomes `/git:commit`.
34
+ - Directory-based namespacing: subdirectories create namespaced commands.
35
+ - Each command file has two fields:
36
+ - `description` (string): One-line description shown in `/help`
37
+ - `prompt` (string): The prompt sent to the model
38
+ - Supports placeholders:
39
+ - `{{args}}` — user-provided arguments
40
+ - `!{shell}` — output of a shell command
41
+ - `@{file}` — contents of a file
42
+ - Example:
43
+
44
+ ```toml
45
+ description = "Create a git commit with a good message"
46
+ prompt = """
47
+ Look at the current git diff and create a commit with a descriptive message.
48
+
49
+ User request: {{args}}
50
+ """
51
+ ```
52
+
53
+ ## Skills (SKILL.md standard)
54
+
55
+ - A skill is a folder containing `SKILL.md` plus optional supporting files.
56
+ - Skills live in `.gemini/skills/`.
57
+ - `SKILL.md` uses YAML frontmatter with `name` and `description` fields.
58
+ - Gemini activates skills on demand via `activate_skill` tool based on description matching.
59
+ - The `description` field is critical — Gemini uses it to decide when to activate the skill.
60
+ - Format is identical to Claude Code's SKILL.md standard.
61
+ - Example:
62
+
63
+ ```yaml
64
+ ---
65
+ name: security-reviewer
66
+ description: Review code for security vulnerabilities and OWASP compliance
67
+ ---
68
+
69
+ # Security Reviewer
70
+
71
+ Detailed instructions for security review...
72
+ ```
73
+
74
+ ## MCP server configuration
75
+
76
+ - MCP servers are configured in `settings.json` under the `mcpServers` key.
77
+ - Same MCP protocol as Claude Code; different config location.
78
+ - Supports `command`, `args`, `env` for stdio transport.
79
+ - Supports `url`, `headers` for HTTP/SSE transport.
80
+ - Additional Gemini-specific fields: `cwd`, `timeout`, `trust`, `includeTools`, `excludeTools`.
81
+ - Example:
82
+
83
+ ```json
84
+ {
85
+ "mcpServers": {
86
+ "context7": {
87
+ "url": "https://mcp.context7.com/mcp"
88
+ },
89
+ "playwright": {
90
+ "command": "npx",
91
+ "args": ["-y", "@anthropic/mcp-playwright"]
92
+ }
93
+ }
94
+ }
95
+ ```
96
+
97
+ ## Hooks
98
+
99
+ - Gemini supports hooks: `BeforeTool`, `AfterTool`, `SessionStart`, etc.
100
+ - Hooks use a different format from Claude Code hooks (matchers-based).
101
+ - Not converted by the plugin converter — a warning is emitted.
102
+
103
+ ## Extensions
104
+
105
+ - Extensions are distributable packages for Gemini CLI.
106
+ - They extend functionality with custom tools, hooks, and commands.
107
+ - Not used for plugin conversion (different purpose from Claude Code plugins).
108
+
109
+ ## Settings.json structure
110
+
111
+ ```json
112
+ {
113
+ "model": "gemini-2.5-pro",
114
+ "mcpServers": { ... },
115
+ "tools": {
116
+ "sandbox": true
117
+ }
118
+ }
119
+ ```
120
+
121
+ - Only the `mcpServers` key is written during plugin conversion.
122
+ - Other settings (model, tools, sandbox) are user-specific and out of scope.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@every-env/compound-plugin",
3
- "version": "0.5.2",
3
+ "version": "0.8.0",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "bin": {
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "coding-tutor",
3
+ "displayName": "Coding Tutor",
4
+ "version": "1.2.1",
5
+ "description": "Personalized coding tutorials that use your actual codebase for examples with spaced repetition quizzes",
6
+ "author": {
7
+ "name": "Nityesh Agarwal"
8
+ },
9
+ "homepage": "https://github.com/EveryInc/compound-engineering-plugin",
10
+ "repository": "https://github.com/EveryInc/compound-engineering-plugin",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "cursor",
14
+ "plugin",
15
+ "coding",
16
+ "programming",
17
+ "tutorial",
18
+ "learning",
19
+ "spaced-repetition"
20
+ ]
21
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "compound-engineering",
3
- "version": "2.33.0",
3
+ "version": "2.35.0",
4
4
  "description": "AI-powered development tools. 29 agents, 22 commands, 19 skills, 1 MCP server for code review, research, design, and workflow automation.",
5
5
  "author": {
6
6
  "name": "Kieran Klaassen",
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "compound-engineering",
3
+ "displayName": "Compound Engineering",
4
+ "version": "2.33.0",
5
+ "description": "AI-powered development tools. 29 agents, 22 commands, 19 skills, 1 MCP server for code review, research, design, and workflow automation.",
6
+ "author": {
7
+ "name": "Kieran Klaassen",
8
+ "email": "kieran@every.to",
9
+ "url": "https://github.com/kieranklaassen"
10
+ },
11
+ "homepage": "https://every.to/source-code/my-ai-had-already-fixed-the-code-before-i-saw-it",
12
+ "repository": "https://github.com/EveryInc/compound-engineering-plugin",
13
+ "license": "MIT",
14
+ "keywords": [
15
+ "cursor",
16
+ "plugin",
17
+ "ai-powered",
18
+ "compound-engineering",
19
+ "workflow-automation",
20
+ "code-review",
21
+ "rails",
22
+ "ruby",
23
+ "python",
24
+ "typescript",
25
+ "knowledge-management",
26
+ "image-generation",
27
+ "agent-browser",
28
+ "browser-automation"
29
+ ],
30
+ "mcpServers": ".mcp.json"
31
+ }