@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.
- package/{plugins/compound-engineering → .claude}/commands/release-docs.md +0 -1
- package/.claude-plugin/marketplace.json +2 -2
- package/.github/workflows/ci.yml +1 -1
- package/.github/workflows/deploy-docs.yml +3 -3
- package/.github/workflows/publish.yml +37 -0
- package/README.md +12 -3
- package/docs/index.html +13 -13
- package/docs/pages/changelog.html +39 -0
- package/docs/plans/2026-02-08-feat-convert-local-md-settings-for-opencode-codex-plan.md +143 -0
- package/docs/plans/2026-02-08-feat-simplify-plugin-settings-plan.md +195 -0
- package/docs/plans/2026-02-09-refactor-dspy-ruby-skill-update-plan.md +104 -0
- package/docs/plans/2026-02-12-feat-add-cursor-cli-target-provider-plan.md +306 -0
- package/docs/specs/cursor.md +85 -0
- package/package.json +1 -1
- package/plugins/compound-engineering/.claude-plugin/plugin.json +2 -2
- package/plugins/compound-engineering/CHANGELOG.md +38 -0
- package/plugins/compound-engineering/README.md +5 -3
- package/plugins/compound-engineering/commands/workflows/brainstorm.md +6 -1
- package/plugins/compound-engineering/commands/workflows/compound.md +1 -0
- package/plugins/compound-engineering/commands/workflows/review.md +23 -21
- package/plugins/compound-engineering/commands/workflows/work.md +29 -15
- package/plugins/compound-engineering/skills/dspy-ruby/SKILL.md +539 -396
- package/plugins/compound-engineering/skills/dspy-ruby/assets/config-template.rb +159 -331
- package/plugins/compound-engineering/skills/dspy-ruby/assets/module-template.rb +210 -236
- package/plugins/compound-engineering/skills/dspy-ruby/assets/signature-template.rb +173 -95
- package/plugins/compound-engineering/skills/dspy-ruby/references/core-concepts.md +552 -143
- package/plugins/compound-engineering/skills/dspy-ruby/references/observability.md +366 -0
- package/plugins/compound-engineering/skills/dspy-ruby/references/optimization.md +440 -460
- package/plugins/compound-engineering/skills/dspy-ruby/references/providers.md +305 -225
- package/plugins/compound-engineering/skills/dspy-ruby/references/toolsets.md +502 -0
- package/plugins/compound-engineering/skills/setup/SKILL.md +168 -0
- package/src/commands/convert.ts +10 -5
- package/src/commands/install.ts +18 -10
- package/src/converters/claude-to-codex.ts +7 -2
- package/src/converters/claude-to-cursor.ts +166 -0
- package/src/converters/claude-to-droid.ts +174 -0
- package/src/converters/claude-to-opencode.ts +8 -2
- package/src/targets/cursor.ts +48 -0
- package/src/targets/droid.ts +50 -0
- package/src/targets/index.ts +18 -0
- package/src/types/cursor.ts +29 -0
- package/src/types/droid.ts +20 -0
- package/tests/cli.test.ts +62 -0
- package/tests/codex-converter.test.ts +62 -0
- package/tests/converter.test.ts +61 -0
- package/tests/cursor-converter.test.ts +347 -0
- package/tests/cursor-writer.test.ts +137 -0
- package/tests/droid-converter.test.ts +277 -0
- package/tests/droid-writer.test.ts +100 -0
- 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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "compound-engineering",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "AI-powered development tools. 29 agents,
|
|
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 |
|
|
11
|
-
| Skills |
|
|
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
|
-
| `/
|
|
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. **
|
|
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
|
|