@every-env/compound-plugin 0.3.0 → 0.5.1

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 (50) hide show
  1. package/{plugins/compound-engineering → .claude}/commands/release-docs.md +0 -1
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/.github/workflows/ci.yml +1 -1
  4. package/.github/workflows/deploy-docs.yml +3 -3
  5. package/.github/workflows/publish.yml +37 -0
  6. package/README.md +12 -3
  7. package/docs/index.html +13 -13
  8. package/docs/pages/changelog.html +39 -0
  9. package/docs/plans/2026-02-08-feat-convert-local-md-settings-for-opencode-codex-plan.md +143 -0
  10. package/docs/plans/2026-02-08-feat-simplify-plugin-settings-plan.md +195 -0
  11. package/docs/plans/2026-02-09-refactor-dspy-ruby-skill-update-plan.md +104 -0
  12. package/docs/plans/2026-02-12-feat-add-cursor-cli-target-provider-plan.md +306 -0
  13. package/docs/specs/cursor.md +85 -0
  14. package/package.json +1 -1
  15. package/plugins/compound-engineering/.claude-plugin/plugin.json +2 -2
  16. package/plugins/compound-engineering/CHANGELOG.md +38 -0
  17. package/plugins/compound-engineering/README.md +5 -3
  18. package/plugins/compound-engineering/commands/workflows/brainstorm.md +6 -1
  19. package/plugins/compound-engineering/commands/workflows/compound.md +1 -0
  20. package/plugins/compound-engineering/commands/workflows/review.md +23 -21
  21. package/plugins/compound-engineering/commands/workflows/work.md +29 -15
  22. package/plugins/compound-engineering/skills/dspy-ruby/SKILL.md +539 -396
  23. package/plugins/compound-engineering/skills/dspy-ruby/assets/config-template.rb +159 -331
  24. package/plugins/compound-engineering/skills/dspy-ruby/assets/module-template.rb +210 -236
  25. package/plugins/compound-engineering/skills/dspy-ruby/assets/signature-template.rb +173 -95
  26. package/plugins/compound-engineering/skills/dspy-ruby/references/core-concepts.md +552 -143
  27. package/plugins/compound-engineering/skills/dspy-ruby/references/observability.md +366 -0
  28. package/plugins/compound-engineering/skills/dspy-ruby/references/optimization.md +440 -460
  29. package/plugins/compound-engineering/skills/dspy-ruby/references/providers.md +305 -225
  30. package/plugins/compound-engineering/skills/dspy-ruby/references/toolsets.md +502 -0
  31. package/plugins/compound-engineering/skills/setup/SKILL.md +168 -0
  32. package/src/commands/convert.ts +10 -5
  33. package/src/commands/install.ts +18 -10
  34. package/src/converters/claude-to-codex.ts +7 -2
  35. package/src/converters/claude-to-cursor.ts +166 -0
  36. package/src/converters/claude-to-droid.ts +174 -0
  37. package/src/converters/claude-to-opencode.ts +8 -2
  38. package/src/targets/cursor.ts +48 -0
  39. package/src/targets/droid.ts +50 -0
  40. package/src/targets/index.ts +18 -0
  41. package/src/types/cursor.ts +29 -0
  42. package/src/types/droid.ts +20 -0
  43. package/tests/cli.test.ts +62 -0
  44. package/tests/codex-converter.test.ts +62 -0
  45. package/tests/converter.test.ts +61 -0
  46. package/tests/cursor-converter.test.ts +347 -0
  47. package/tests/cursor-writer.test.ts +137 -0
  48. package/tests/droid-converter.test.ts +277 -0
  49. package/tests/droid-writer.test.ts +100 -0
  50. package/plugins/compound-engineering/commands/technical_review.md +0 -8
@@ -0,0 +1,104 @@
1
+ ---
2
+ title: "refactor: Update dspy-ruby skill to DSPy.rb v0.34.3 API"
3
+ type: refactor
4
+ date: 2026-02-09
5
+ ---
6
+
7
+ # Update dspy-ruby Skill to DSPy.rb v0.34.3 API
8
+
9
+ ## Problem
10
+
11
+ The `dspy-ruby` skill uses outdated API patterns (`.forward()`, `result[:field]`, inline `T.enum([...])`, `DSPy::Tool`) and is missing 10+ features (events, lifecycle callbacks, GEPA, evaluation framework, BAML/TOON, storage, etc.).
12
+
13
+ ## Solution
14
+
15
+ Use the engineering skill as base (already has correct API), enhance with official docs content, rewrite all reference files and templates.
16
+
17
+ ### Source Priority (when conflicts arise)
18
+
19
+ 1. **Official docs** (`../dspy.rb/docs/src/`) — source of truth for API correctness
20
+ 2. **Engineering skill** (`../engineering/.../dspy-rb/SKILL.md`) — source of truth for structure/style
21
+ 3. **NavigationContext brainstorm** — for Typed Context pattern only
22
+
23
+ ## Files to Update
24
+
25
+ ### Core (SKILL.md)
26
+
27
+ 1. **`skills/dspy-ruby/SKILL.md`** — Copy from engineering base, then:
28
+ - Fix frontmatter: `name: dspy-rb` → `name: dspy-ruby`, keep long description format
29
+ - Add sections before "Guidelines for Claude": Events System, Lifecycle Callbacks, Fiber-Local LM Context, Evaluation Framework, GEPA Optimization, Typed Context Pattern, Schema Formats (BAML/TOON)
30
+ - Update Resources section with 5 references + 3 assets using markdown links
31
+ - Fix any backtick references to markdown link format
32
+
33
+ ### References (rewrite from themed doc batches)
34
+
35
+ 2. **`references/core-concepts.md`** — Rewrite
36
+ - Source: `core-concepts/signatures.md`, `modules.md`, `predictors.md`, `advanced/complex-types.md`
37
+ - Cover: signatures (Date/Time types, T::Enum, defaults, field descriptions, BAML/TOON, recursive types), modules (.call() API, lifecycle callbacks, instruction update contract), predictors (all 4 types, concurrent predictions), type system (discriminators, union types)
38
+
39
+ 3. **`references/toolsets.md`** — NEW
40
+ - Source: `core-concepts/toolsets.md`, `toolsets-guide.md`
41
+ - Cover: Tools::Base, Tools::Toolset DSL, type safety with Sorbet sigs, schema generation, built-in toolsets, testing
42
+
43
+ 4. **`references/providers.md`** — Rewrite
44
+ - Source: `llms.txt.erb`, engineering SKILL.md, `core-concepts/module-runtime-context.md`
45
+ - Cover: per-provider adapters, RubyLLM unified adapter, Rails initializer, fiber-local LM context (`DSPy.with_lm`), feature-flagged model selection, compatibility matrix
46
+
47
+ 5. **`references/optimization.md`** — Rewrite
48
+ - Source: `optimization/miprov2.md`, `gepa.md`, `evaluation.md`, `production/storage.md`
49
+ - Cover: MIPROv2 (dspy-miprov2 gem, AutoMode presets), GEPA (dspy-gepa gem, feedback maps), Evaluation (DSPy::Evals, built-in metrics, DSPy::Example), Storage (ProgramStorage)
50
+
51
+ 6. **`references/observability.md`** — NEW
52
+ - Source: `production/observability.md`, `core-concepts/events.md`, `advanced/observability-interception.md`
53
+ - Cover: event system (module-scoped + global), dspy-o11y gems, Langfuse (env vars), score reporting (DSPy.score()), observation types, DSPy::Context.with_span
54
+
55
+ ### Assets (rewrite to current API)
56
+
57
+ 7. **`assets/signature-template.rb`** — T::Enum classes, `description:` kwarg, Date/Time types, defaults, union types, `.call()` / `result.field` usage examples
58
+
59
+ 8. **`assets/module-template.rb`** — `.call()` API, `result.field`, Tools::Base, lifecycle callbacks, `DSPy.with_lm`, `configure_predictor`
60
+
61
+ 9. **`assets/config-template.rb`** — RubyLLM adapter, `structured_outputs: true`, `after_initialize` Rails pattern, dspy-o11y env vars, feature-flagged model selection
62
+
63
+ ### Metadata
64
+
65
+ 10. **`.claude-plugin/plugin.json`** — Version `2.31.0` → `2.31.1`
66
+
67
+ 11. **`CHANGELOG.md`** — Add `[2.31.1] - 2026-02-09` entry under `### Changed`
68
+
69
+ ## Verification
70
+
71
+ ```bash
72
+ # No old API patterns
73
+ grep -n '\.forward(\|result\[:\|T\.enum(\[\|DSPy::Tool[^s]' plugins/compound-engineering/skills/dspy-ruby/SKILL.md
74
+
75
+ # No backtick references
76
+ grep -E '`(references|assets|scripts)/' plugins/compound-engineering/skills/dspy-ruby/SKILL.md
77
+
78
+ # Frontmatter correct
79
+ head -4 plugins/compound-engineering/skills/dspy-ruby/SKILL.md
80
+
81
+ # JSON valid
82
+ cat plugins/compound-engineering/.claude-plugin/plugin.json | jq .
83
+
84
+ # All files exist
85
+ ls plugins/compound-engineering/skills/dspy-ruby/{references,assets}/
86
+ ```
87
+
88
+ ## Success Criteria
89
+
90
+ - [x] All API patterns updated (`.call()`, `result.field`, `T::Enum`, `Tools::Base`)
91
+ - [x] New features covered: events, callbacks, fiber-local LM, GEPA, evals, BAML/TOON, storage, score API, RubyLLM, typed context
92
+ - [x] 5 reference files present (core-concepts, toolsets, providers, optimization, observability)
93
+ - [x] 3 asset templates updated to current API
94
+ - [x] YAML frontmatter: `name: dspy-ruby`, description has "what" and "when"
95
+ - [x] All reference links use `[file.md](./references/file.md)` format
96
+ - [x] Writing style: imperative form, no "you should"
97
+ - [x] Version bumped to `2.31.1`, CHANGELOG updated
98
+ - [x] Verification commands all pass
99
+
100
+ ## Source Materials
101
+
102
+ - Engineering skill: `/Users/vicente/Workspaces/vicente.services/engineering/plugins/engineering-skills/skills/dspy-rb/SKILL.md`
103
+ - Official docs: `/Users/vicente/Workspaces/vicente.services/dspy.rb/docs/src/`
104
+ - NavigationContext brainstorm: `/Users/vicente/Workspaces/vicente.services/observo/observo-server/docs/brainstorms/2026-02-09-typed-navigation-context-brainstorm.md`
@@ -0,0 +1,306 @@
1
+ ---
2
+ title: Add Cursor CLI as a Target Provider
3
+ type: feat
4
+ date: 2026-02-12
5
+ ---
6
+
7
+ # Add Cursor CLI as a Target Provider
8
+
9
+ ## Overview
10
+
11
+ Add `cursor` as a fourth target provider in the converter CLI, alongside `opencode`, `codex`, and `droid`. This enables `--to cursor` for both `convert` and `install` commands, converting Claude Code plugins into Cursor-compatible format.
12
+
13
+ Cursor CLI (`cursor-agent`) launched in August 2025 and supports rules (`.mdc`), commands (`.md`), skills (`SKILL.md` standard), and MCP servers (`.cursor/mcp.json`). The mapping from Claude Code is straightforward because Cursor adopted the open SKILL.md standard and has a similar command format.
14
+
15
+ ## Component Mapping
16
+
17
+ | Claude Code | Cursor Equivalent | Notes |
18
+ |---|---|---|
19
+ | `agents/*.md` | `.cursor/rules/*.mdc` | Agents become "Agent Requested" rules (`alwaysApply: false`, `description` set) so the AI activates them on demand rather than flooding context |
20
+ | `commands/*.md` | `.cursor/commands/*.md` | Plain markdown files; Cursor commands have no frontmatter support -- description becomes a markdown heading |
21
+ | `skills/*/SKILL.md` | `.cursor/skills/*/SKILL.md` | **Identical standard** -- copy directly |
22
+ | MCP servers | `.cursor/mcp.json` | Same JSON structure (`mcpServers` key), compatible format |
23
+ | `hooks/` | No equivalent | Cursor has no hook system; emit `console.warn` and skip |
24
+ | `.claude/` paths | `.cursor/` paths | Content rewriting needed |
25
+
26
+ ### Key Design Decisions
27
+
28
+ **1. Agents use `alwaysApply: false` (Agent Requested mode)**
29
+
30
+ With 29 agents, setting `alwaysApply: true` would flood every Cursor session's context. Instead, agents become "Agent Requested" rules: `alwaysApply: false` with a populated `description` field. Cursor's AI reads the description and activates the rule only when relevant -- matching how Claude Code agents are invoked on demand.
31
+
32
+ **2. Commands are plain markdown (no frontmatter)**
33
+
34
+ Cursor commands (`.cursor/commands/*.md`) are simple markdown files where the filename becomes the command name. Unlike Claude Code commands, they do not support YAML frontmatter. The converter emits the description as a leading markdown comment, then the command body.
35
+
36
+ **3. Flattened command names with deduplication**
37
+
38
+ Cursor uses flat command names (no namespaces). `workflows:plan` becomes `plan`. If two commands flatten to the same name, the `uniqueName()` pattern from the codex converter appends `-2`, `-3`, etc.
39
+
40
+ ### Rules (`.mdc`) Frontmatter Format
41
+
42
+ ```yaml
43
+ ---
44
+ description: "What this rule does and when it applies"
45
+ globs: ""
46
+ alwaysApply: false
47
+ ---
48
+ ```
49
+
50
+ - `description` (string): Used by the AI to decide relevance -- maps from agent `description`
51
+ - `globs` (string): Comma-separated file patterns for auto-attachment -- leave empty for converted agents
52
+ - `alwaysApply` (boolean): Set `false` for Agent Requested mode
53
+
54
+ ### MCP Servers (`.cursor/mcp.json`)
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "server-name": {
60
+ "command": "npx",
61
+ "args": ["-y", "package-name"],
62
+ "env": { "KEY": "value" }
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ Supports both local (command-based) and remote (url-based) servers. Pass through `headers` for remote servers.
69
+
70
+ ## Acceptance Criteria
71
+
72
+ - [x] `bun run src/index.ts convert --to cursor ./plugins/compound-engineering` produces valid Cursor config
73
+ - [x] Agents convert to `.cursor/rules/*.mdc` with `alwaysApply: false` and populated `description`
74
+ - [x] Commands convert to `.cursor/commands/*.md` as plain markdown (no frontmatter)
75
+ - [x] Flattened command names that collide are deduplicated (`plan`, `plan-2`, etc.)
76
+ - [x] Skills copied to `.cursor/skills/` (identical format)
77
+ - [x] MCP servers written to `.cursor/mcp.json` with backup of existing file
78
+ - [x] Content transformation rewrites `.claude/` and `~/.claude/` paths to `.cursor/` and `~/.cursor/`
79
+ - [x] `/workflows:plan` transformed to `/plan` (flat command names)
80
+ - [x] `Task agent-name(args)` transformed to natural-language skill reference
81
+ - [x] Plugins with hooks emit `console.warn` about unsupported hooks
82
+ - [x] Writer does not double-nest `.cursor/.cursor/` (follows droid writer pattern)
83
+ - [x] `model` and `allowedTools` fields silently dropped (no Cursor equivalent)
84
+ - [x] Converter and writer tests pass
85
+ - [x] Existing tests still pass (`bun test`)
86
+
87
+ ## Implementation
88
+
89
+ ### Phase 1: Types
90
+
91
+ **Create `src/types/cursor.ts`**
92
+
93
+ ```typescript
94
+ export type CursorRule = {
95
+ name: string
96
+ content: string // Full .mdc file with YAML frontmatter
97
+ }
98
+
99
+ export type CursorCommand = {
100
+ name: string
101
+ content: string // Plain markdown (no frontmatter)
102
+ }
103
+
104
+ export type CursorSkillDir = {
105
+ name: string
106
+ sourceDir: string
107
+ }
108
+
109
+ export type CursorBundle = {
110
+ rules: CursorRule[]
111
+ commands: CursorCommand[]
112
+ skillDirs: CursorSkillDir[]
113
+ mcpServers?: Record<string, {
114
+ command?: string
115
+ args?: string[]
116
+ env?: Record<string, string>
117
+ url?: string
118
+ headers?: Record<string, string>
119
+ }>
120
+ }
121
+ ```
122
+
123
+ ### Phase 2: Converter
124
+
125
+ **Create `src/converters/claude-to-cursor.ts`**
126
+
127
+ Core functions:
128
+
129
+ 1. **`convertClaudeToCursor(plugin, options)`** -- main entry point
130
+ - Convert each agent to a `.mdc` rule via `convertAgentToRule()`
131
+ - Convert each command (including `disable-model-invocation` ones) via `convertCommand()`
132
+ - Pass skills through as directory references
133
+ - Convert MCP servers to JSON-compatible object
134
+ - Emit `console.warn` if `plugin.hooks` has entries
135
+
136
+ 2. **`convertAgentToRule(agent, usedNames)`** -- agent -> `.mdc` rule
137
+ - Frontmatter fields: `description` (from agent description), `globs: ""`, `alwaysApply: false`
138
+ - Body: agent body with content transformations applied
139
+ - Prepend capabilities section if present
140
+ - Deduplicate names via `uniqueName()`
141
+ - Silently drop `model` field (no Cursor equivalent)
142
+
143
+ 3. **`convertCommand(command, usedNames)`** -- command -> plain `.md`
144
+ - Flatten namespace: `workflows:plan` -> `plan`
145
+ - Deduplicate flattened names via `uniqueName()`
146
+ - Emit as plain markdown: description as `<!-- description -->` comment, then body
147
+ - Include `argument-hint` as a `## Arguments` section if present
148
+ - Body: apply `transformContentForCursor()` transformations
149
+ - Silently drop `allowedTools` (no Cursor equivalent)
150
+
151
+ 4. **`transformContentForCursor(body)`** -- content rewriting
152
+ - `.claude/` -> `.cursor/` and `~/.claude/` -> `~/.cursor/`
153
+ - `Task agent-name(args)` -> `Use the agent-name skill to: args` (same as codex)
154
+ - `/workflows:command` -> `/command` (flatten slash commands)
155
+ - `@agent-name` references -> `the agent-name rule` (use codex's suffix-matching pattern)
156
+ - Skip file paths (containing `/`) and common non-command patterns
157
+
158
+ 5. **`convertMcpServers(servers)`** -- MCP config
159
+ - Map each `ClaudeMcpServer` entry to Cursor-compatible JSON
160
+ - Pass through: `command`, `args`, `env`, `url`, `headers`
161
+ - Drop `type` field (Cursor infers transport from `command` vs `url`)
162
+
163
+ ### Phase 3: Writer
164
+
165
+ **Create `src/targets/cursor.ts`**
166
+
167
+ Output structure:
168
+
169
+ ```
170
+ .cursor/
171
+ ├── rules/
172
+ │ ├── agent-name-1.mdc
173
+ │ └── agent-name-2.mdc
174
+ ├── commands/
175
+ │ ├── command-1.md
176
+ │ └── command-2.md
177
+ ├── skills/
178
+ │ └── skill-name/
179
+ │ └── SKILL.md
180
+ └── mcp.json
181
+ ```
182
+
183
+ Core function: `writeCursorBundle(outputRoot, bundle)`
184
+
185
+ - `resolveCursorPaths(outputRoot)` -- detect if path already ends in `.cursor` to avoid double-nesting (follow droid writer pattern at `src/targets/droid.ts:31-50`)
186
+ - Write rules to `rules/` as `.mdc` files
187
+ - Write commands to `commands/` as `.md` files
188
+ - Copy skill directories to `skills/` via `copyDir()`
189
+ - Write `mcp.json` via `writeJson()` with `backupFile()` for existing files
190
+
191
+ ### Phase 4: Wire into CLI
192
+
193
+ **Modify `src/targets/index.ts`**
194
+
195
+ ```typescript
196
+ import { convertClaudeToCursor } from "../converters/claude-to-cursor"
197
+ import { writeCursorBundle } from "./cursor"
198
+ import type { CursorBundle } from "../types/cursor"
199
+
200
+ // Add to targets:
201
+ cursor: {
202
+ name: "cursor",
203
+ implemented: true,
204
+ convert: convertClaudeToCursor as TargetHandler<CursorBundle>["convert"],
205
+ write: writeCursorBundle as TargetHandler<CursorBundle>["write"],
206
+ },
207
+ ```
208
+
209
+ **Modify `src/commands/convert.ts`**
210
+
211
+ - Update `--to` description: `"Target format (opencode | codex | droid | cursor)"`
212
+ - Add to `resolveTargetOutputRoot`: `if (targetName === "cursor") return path.join(outputRoot, ".cursor")`
213
+
214
+ **Modify `src/commands/install.ts`**
215
+
216
+ - Same two changes as convert.ts
217
+
218
+ ### Phase 5: Tests
219
+
220
+ **Create `tests/cursor-converter.test.ts`**
221
+
222
+ Test cases (use inline `ClaudePlugin` fixtures, following codex converter test pattern):
223
+
224
+ - Agent converts to rule with `.mdc` frontmatter (`alwaysApply: false`, `description` populated)
225
+ - Agent with empty description gets default description text
226
+ - Agent with capabilities prepended to body
227
+ - Agent `model` field silently dropped
228
+ - Agent with empty body gets default body text
229
+ - Command converts with flattened name (`workflows:plan` -> `plan`)
230
+ - Command name collision after flattening is deduplicated (`plan`, `plan-2`)
231
+ - Command with `disable-model-invocation` is still included
232
+ - Command `allowedTools` silently dropped
233
+ - Command with `argument-hint` gets Arguments section
234
+ - Skills pass through as directory references
235
+ - MCP servers convert to JSON config (local and remote)
236
+ - MCP `headers` pass through for remote servers
237
+ - Content transformation: `.claude/` paths -> `.cursor/`
238
+ - Content transformation: `~/.claude/` paths -> `~/.cursor/`
239
+ - Content transformation: `Task agent(args)` -> natural language
240
+ - Content transformation: slash commands flattened
241
+ - Hooks present -> `console.warn` emitted
242
+ - Plugin with zero agents produces empty rules array
243
+ - Plugin with only skills works correctly
244
+
245
+ **Create `tests/cursor-writer.test.ts`**
246
+
247
+ Test cases (use temp directories, following droid writer test pattern):
248
+
249
+ - Full bundle writes rules, commands, skills, mcp.json
250
+ - Rules written as `.mdc` files in `rules/` directory
251
+ - Commands written as `.md` files in `commands/` directory
252
+ - Skills copied to `skills/` directory
253
+ - MCP config written as valid JSON `mcp.json`
254
+ - Existing `mcp.json` is backed up before overwrite
255
+ - Output root already ending in `.cursor` does NOT double-nest
256
+ - Empty bundle (no rules, commands, skills, or MCP) produces no output
257
+
258
+ ### Phase 6: Documentation
259
+
260
+ **Create `docs/specs/cursor.md`**
261
+
262
+ Document the Cursor CLI spec as a reference, following `docs/specs/codex.md` pattern:
263
+
264
+ - Rules format (`.mdc` with `description`, `globs`, `alwaysApply` frontmatter)
265
+ - Commands format (plain markdown, no frontmatter)
266
+ - Skills format (identical SKILL.md standard)
267
+ - MCP server configuration (`.cursor/mcp.json`)
268
+ - CLI permissions (`.cursor/cli.json` -- for reference, not converted)
269
+ - Config file locations (project-level vs global)
270
+
271
+ **Update `README.md`**
272
+
273
+ Add `cursor` to the supported targets in the CLI usage section.
274
+
275
+ ## What We're NOT Doing
276
+
277
+ - Not converting hooks (Cursor has no hook system -- warn and skip)
278
+ - Not generating `.cursor/cli.json` permissions (user-specific, not plugin-scoped)
279
+ - Not creating `AGENTS.md` (Cursor reads it natively, but not part of plugin conversion)
280
+ - Not using `globs` field intelligently (would require analyzing agent content to guess file patterns)
281
+ - Not adding sync support (follow-up task)
282
+ - Not transforming content inside copied SKILL.md files (known limitation -- skills may reference `.claude/` paths internally)
283
+ - Not clearing old output before writing (matches existing target behavior -- re-runs accumulate)
284
+
285
+ ## Complexity Assessment
286
+
287
+ This is a **medium change**. The converter architecture is well-established with three existing targets, so this is mostly pattern-following. The key novelties are:
288
+
289
+ 1. The `.mdc` frontmatter format (different from all other targets)
290
+ 2. Agents map to "rules" rather than a direct equivalent
291
+ 3. Commands are plain markdown (no frontmatter) unlike other targets
292
+ 4. Name deduplication needed for flattened command namespaces
293
+
294
+ Skills being identical across platforms simplifies things significantly. MCP config is nearly 1:1.
295
+
296
+ ## References
297
+
298
+ - Cursor Rules: `.cursor/rules/*.mdc` with `description`, `globs`, `alwaysApply` frontmatter
299
+ - Cursor Commands: `.cursor/commands/*.md` (plain markdown, no frontmatter)
300
+ - Cursor Skills: `.cursor/skills/*/SKILL.md` (open standard, identical to Claude Code)
301
+ - Cursor MCP: `.cursor/mcp.json` with `mcpServers` key
302
+ - Cursor CLI: `cursor-agent` command (launched August 2025)
303
+ - Existing codex converter: `src/converters/claude-to-codex.ts` (has `uniqueName()` deduplication pattern)
304
+ - Existing droid writer: `src/targets/droid.ts` (has double-nesting guard pattern)
305
+ - Existing codex plan: `docs/plans/2026-02-08-feat-convert-local-md-settings-for-opencode-codex-plan.md`
306
+ - Target provider checklist: `AGENTS.md` section "Adding a New Target Provider"
@@ -0,0 +1,85 @@
1
+ # Cursor Spec (Rules, Commands, Skills, MCP)
2
+
3
+ Last verified: 2026-02-12
4
+
5
+ ## Primary sources
6
+
7
+ ```
8
+ https://docs.cursor.com/context/rules
9
+ https://docs.cursor.com/context/rules-for-ai
10
+ https://docs.cursor.com/customize/model-context-protocol
11
+ ```
12
+
13
+ ## Config locations
14
+
15
+ | Scope | Path |
16
+ |-------|------|
17
+ | Project rules | `.cursor/rules/*.mdc` |
18
+ | Project commands | `.cursor/commands/*.md` |
19
+ | Project skills | `.cursor/skills/*/SKILL.md` |
20
+ | Project MCP | `.cursor/mcp.json` |
21
+ | Project CLI permissions | `.cursor/cli.json` |
22
+ | Global MCP | `~/.cursor/mcp.json` |
23
+ | Global CLI config | `~/.cursor/cli-config.json` |
24
+ | Legacy rules | `.cursorrules` (deprecated) |
25
+
26
+ ## Rules (.mdc files)
27
+
28
+ - Rules are Markdown files with the `.mdc` extension stored in `.cursor/rules/`.
29
+ - Each rule has YAML frontmatter with three fields: `description`, `globs`, `alwaysApply`.
30
+ - Rules have four activation types based on frontmatter configuration:
31
+
32
+ | Type | `alwaysApply` | `globs` | `description` | Behavior |
33
+ |------|:---:|:---:|:---:|---|
34
+ | Always | `true` | ignored | optional | Included in every conversation |
35
+ | Auto Attached | `false` | set | optional | Included when matching files are in context |
36
+ | Agent Requested | `false` | empty | set | AI decides based on description relevance |
37
+ | Manual | `false` | empty | empty | Only included via `@rule-name` mention |
38
+
39
+ - Precedence: Team Rules > Project Rules > User Rules > Legacy `.cursorrules` > `AGENTS.md`.
40
+
41
+ ## Commands (slash commands)
42
+
43
+ - Custom commands are Markdown files stored in `.cursor/commands/`.
44
+ - Commands are plain markdown with no YAML frontmatter support.
45
+ - The filename (without `.md`) becomes the command name.
46
+ - Commands are invoked by typing `/` in the chat UI.
47
+ - Commands support parameterized arguments via `$1`, `$2`, etc.
48
+
49
+ ## Skills (Agent Skills)
50
+
51
+ - Skills follow the open SKILL.md standard, identical to Claude Code and Codex.
52
+ - A skill is a folder containing `SKILL.md` plus optional `scripts/`, `references/`, and `assets/`.
53
+ - `SKILL.md` uses YAML frontmatter with required `name` and `description` fields.
54
+ - Skills can be repo-scoped in `.cursor/skills/` or user-scoped in `~/.cursor/skills/`.
55
+ - At startup, only each skill's name/description is loaded; full content is injected on invocation.
56
+
57
+ ## MCP (Model Context Protocol)
58
+
59
+ - MCP configuration lives in `.cursor/mcp.json` (project) or `~/.cursor/mcp.json` (global).
60
+ - Each server is configured under the `mcpServers` key.
61
+ - STDIO servers support `command` (required), `args`, and `env`.
62
+ - Remote servers support `url` (required) and optional `headers`.
63
+ - Cursor infers transport type from whether `command` or `url` is present.
64
+
65
+ Example:
66
+
67
+ ```json
68
+ {
69
+ "mcpServers": {
70
+ "server-name": {
71
+ "command": "npx",
72
+ "args": ["-y", "package-name"],
73
+ "env": { "KEY": "value" }
74
+ }
75
+ }
76
+ }
77
+ ```
78
+
79
+ ## CLI (cursor-agent)
80
+
81
+ - Cursor CLI launched August 2025 as `cursor-agent`.
82
+ - Supports interactive mode, headless mode (`-p`), and cloud agents.
83
+ - Reads `.cursor/rules/`, `.cursorrules`, and `AGENTS.md` for instructions.
84
+ - CLI permissions controlled via `.cursor/cli.json` with allow/deny lists.
85
+ - Permission tokens: `Shell(command)`, `Read(path)`, `Write(path)`, `Delete(path)`, `Grep(path)`, `LS(path)`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@every-env/compound-plugin",
3
- "version": "0.3.0",
3
+ "version": "0.5.1",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "compound-engineering",
3
- "version": "2.31.0",
4
- "description": "AI-powered development tools. 29 agents, 24 commands, 18 skills, 1 MCP server for code review, research, design, and workflow automation.",
3
+ "version": "2.33.0",
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",
7
7
  "email": "kieran@every.to",
@@ -5,6 +5,44 @@ All notable changes to the compound-engineering plugin will be documented in thi
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.33.0] - 2026-02-12
9
+
10
+ ### Added
11
+
12
+ - **`setup` skill** — Interactive configurator for review agents
13
+ - Auto-detects project type (Rails, Python, TypeScript, etc.)
14
+ - Two paths: "Auto-configure" (one click) or "Customize" (pick stack, focus areas, depth)
15
+ - Writes `compound-engineering.local.md` in project root (tool-agnostic — works for Claude, Codex, OpenCode)
16
+ - Invoked automatically by `/workflows:review` when no settings file exists
17
+ - **`learnings-researcher` in `/workflows:review`** — Always-run agent that searches `docs/solutions/` for past issues related to the PR
18
+ - **`schema-drift-detector` wired into `/workflows:review`** — Conditional agent for PRs with migrations
19
+
20
+ ### Changed
21
+
22
+ - **`/workflows:review`** — Now reads review agents from `compound-engineering.local.md` settings file. Falls back to invoking setup skill if no file exists.
23
+ - **`/workflows:work`** — Review agents now configurable via settings file
24
+ - **`/release-docs` command** — Moved from plugin to local `.claude/commands/` (repo maintenance, not distributed)
25
+
26
+ ### Removed
27
+
28
+ - **`/technical_review` command** — Superseded by configurable review agents
29
+
30
+ ---
31
+
32
+ ## [2.32.0] - 2026-02-11
33
+
34
+ ### Added
35
+
36
+ - **Factory Droid target** — New converter target for [Factory Droid](https://docs.factory.ai). Install with `--to droid` to output agents, commands, and skills to `~/.factory/`. Includes tool name mapping (Claude → Factory), namespace prefix stripping, Task syntax conversion, and agent reference rewriting. 13 new tests (9 converter + 4 writer). ([#174](https://github.com/EveryInc/compound-engineering-plugin/pull/174))
37
+
38
+ ---
39
+
40
+ ## [2.31.1] - 2026-02-09
41
+
42
+ ### Changed
43
+
44
+ - **`dspy-ruby` skill** — Complete rewrite to DSPy.rb v0.34.3 API: `.call()` / `result.field` patterns, `T::Enum` classes, `DSPy::Tools::Base` / `Toolset`. Added events system, lifecycle callbacks, fiber-local LM context, GEPA optimization, evaluation framework, typed context pattern, BAML/TOON schema formats, storage system, score reporting, RubyLLM adapter. 5 reference files (2 new: toolsets, observability), 3 asset templates rewritten.
45
+
8
46
  ## [2.31.0] - 2026-02-08
9
47
 
10
48
  ### Added
@@ -7,8 +7,8 @@ AI-powered development tools that get smarter with every use. Make each unit of
7
7
  | Component | Count |
8
8
  |-----------|-------|
9
9
  | Agents | 29 |
10
- | Commands | 25 |
11
- | Skills | 16 |
10
+ | Commands | 22 |
11
+ | Skills | 19 |
12
12
  | MCP Servers | 1 |
13
13
 
14
14
  ## Agents
@@ -94,7 +94,7 @@ Core workflow commands use `workflows:` prefix to avoid collisions with built-in
94
94
  | `/create-agent-skill` | Create or edit Claude Code skills |
95
95
  | `/generate_command` | Generate new slash commands |
96
96
  | `/heal-skill` | Fix skill documentation issues |
97
- | `/technical_review` | Multi-agent technical/architecture review in parallel |
97
+ | `/sync` | Sync Claude Code config across machines |
98
98
  | `/report-bug` | Report a bug in the plugin |
99
99
  | `/reproduce-bug` | Reproduce bugs using logs and console |
100
100
  | `/resolve_parallel` | Resolve TODO comments in parallel |
@@ -134,6 +134,8 @@ Core workflow commands use `workflows:` prefix to avoid collisions with built-in
134
134
  | `every-style-editor` | Review copy for Every's style guide compliance |
135
135
  | `file-todos` | File-based todo tracking system |
136
136
  | `git-worktree` | Manage Git worktrees for parallel development |
137
+ | `resolve-pr-parallel` | Resolve PR review comments in parallel |
138
+ | `setup` | Configure which review agents run for your project |
137
139
 
138
140
  ### Multi-Agent Orchestration
139
141
 
@@ -78,6 +78,8 @@ Write a brainstorm document to `docs/brainstorms/YYYY-MM-DD-<topic>-brainstorm.m
78
78
 
79
79
  Ensure `docs/brainstorms/` directory exists before writing.
80
80
 
81
+ **IMPORTANT:** Before proceeding to Phase 4, check if there are any Open Questions listed in the brainstorm document. If there are open questions, YOU MUST ask the user about each one using AskUserQuestion before offering to proceed to planning. Move resolved questions to a "Resolved Questions" section.
82
+
81
83
  ### Phase 4: Handoff
82
84
 
83
85
  Use **AskUserQuestion tool** to present next steps:
@@ -87,7 +89,10 @@ Use **AskUserQuestion tool** to present next steps:
87
89
  **Options:**
88
90
  1. **Review and refine** - Improve the document through structured self-review
89
91
  2. **Proceed to planning** - Run `/workflows:plan` (will auto-detect this brainstorm)
90
- 3. **Done for now** - Return later
92
+ 3. **Ask more questions** - I have more questions to clarify before moving on
93
+ 4. **Done for now** - Return later
94
+
95
+ **If user selects "Ask more questions":** YOU (Claude) return to Phase 1.2 (Collaborative Dialogue) and continue asking the USER questions one at a time to further refine the design. The user wants YOU to probe deeper - ask about edge cases, constraints, preferences, or areas not yet explored. Continue until the user is satisfied, then return to Phase 4.
91
96
 
92
97
  **If user selects "Review and refine":**
93
98
 
@@ -232,6 +232,7 @@ Based on problem type, these agents can enhance documentation:
232
232
  ### When to Invoke
233
233
  - **Auto-triggered** (optional): Agents can run post-documentation for enhancement
234
234
  - **Manual trigger**: User can invoke agents after /workflows:compound completes for deeper review
235
+ - **Customize agents**: Edit `compound-engineering.local.md` or invoke the `setup` skill to configure which review agents are used across all workflows
235
236
 
236
237
  ## Related Commands
237
238