@every-env/compound-plugin 0.12.0 → 2.34.2

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 (55) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.github/workflows/publish.yml +20 -10
  3. package/.releaserc.json +31 -0
  4. package/AGENTS.md +1 -0
  5. package/CHANGELOG.md +34 -0
  6. package/CLAUDE.md +13 -0
  7. package/README.md +35 -2
  8. package/bun.lock +977 -0
  9. package/docs/plans/2026-03-01-fix-setup-skill-non-claude-llm-fallback-plan.md +140 -0
  10. package/docs/plans/2026-03-03-feat-sync-claude-mcp-all-supported-providers-plan.md +639 -0
  11. package/docs/solutions/adding-converter-target-providers.md +2 -1
  12. package/docs/solutions/plugin-versioning-requirements.md +4 -0
  13. package/package.json +10 -4
  14. package/plugins/compound-engineering/.claude-plugin/plugin.json +1 -1
  15. package/plugins/compound-engineering/CHANGELOG.md +10 -0
  16. package/plugins/compound-engineering/CLAUDE.md +5 -0
  17. package/plugins/compound-engineering/skills/create-agent-skills/workflows/add-workflow.md +6 -0
  18. package/plugins/compound-engineering/skills/create-agent-skills/workflows/create-new-skill.md +6 -0
  19. package/plugins/compound-engineering/skills/setup/SKILL.md +6 -0
  20. package/src/commands/sync.ts +21 -60
  21. package/src/index.ts +2 -1
  22. package/src/parsers/claude-home.ts +55 -3
  23. package/src/sync/codex.ts +38 -62
  24. package/src/sync/commands.ts +198 -0
  25. package/src/sync/copilot.ts +14 -36
  26. package/src/sync/droid.ts +50 -9
  27. package/src/sync/gemini.ts +87 -28
  28. package/src/sync/json-config.ts +47 -0
  29. package/src/sync/kiro.ts +49 -0
  30. package/src/sync/mcp-transports.ts +19 -0
  31. package/src/sync/openclaw.ts +18 -0
  32. package/src/sync/opencode.ts +10 -30
  33. package/src/sync/pi.ts +12 -36
  34. package/src/sync/qwen.ts +66 -0
  35. package/src/sync/registry.ts +141 -0
  36. package/src/sync/skills.ts +21 -0
  37. package/src/sync/windsurf.ts +59 -0
  38. package/src/types/kiro.ts +3 -1
  39. package/src/types/qwen.ts +3 -0
  40. package/src/types/windsurf.ts +1 -0
  41. package/src/utils/codex-agents.ts +1 -1
  42. package/src/utils/detect-tools.ts +4 -13
  43. package/src/utils/files.ts +7 -0
  44. package/src/utils/symlink.ts +4 -6
  45. package/tests/claude-home.test.ts +46 -0
  46. package/tests/cli.test.ts +102 -0
  47. package/tests/detect-tools.test.ts +30 -7
  48. package/tests/sync-codex.test.ts +64 -0
  49. package/tests/sync-copilot.test.ts +60 -4
  50. package/tests/sync-droid.test.ts +44 -4
  51. package/tests/sync-gemini.test.ts +54 -0
  52. package/tests/sync-kiro.test.ts +83 -0
  53. package/tests/sync-openclaw.test.ts +51 -0
  54. package/tests/sync-qwen.test.ts +75 -0
  55. package/tests/sync-windsurf.test.ts +89 -0
@@ -0,0 +1,639 @@
1
+ ---
2
+ title: "feat: Sync Claude MCP servers to all supported providers"
3
+ type: feat
4
+ date: 2026-03-03
5
+ status: completed
6
+ deepened: 2026-03-03
7
+ ---
8
+
9
+ # feat: Sync Claude MCP servers to all supported providers
10
+
11
+ ## Overview
12
+
13
+ Expand the `sync` command so a user's local Claude Code MCP configuration can be propagated to every provider this CLI can reasonably support, instead of only the current partial set.
14
+
15
+ Today, `sync` already symlinks Claude skills and syncs MCP servers for a subset of targets. The gap is that install/convert support has grown much faster than sync support, so the product promise in `README.md` has drifted away from what `src/commands/sync.ts` can actually do.
16
+
17
+ This feature should close that parity gap without changing the core sync contract:
18
+
19
+ - Claude remains the source of truth for personal skills and MCP servers.
20
+ - Skills stay symlinked, not copied.
21
+ - Existing user config in the destination tool is preserved where possible.
22
+ - Target-specific MCP formats stay target-specific.
23
+
24
+ ## Problem Statement
25
+
26
+ The current implementation has three concrete problems:
27
+
28
+ 1. `sync` only knows about `opencode`, `codex`, `pi`, `droid`, `copilot`, and `gemini`, while install/convert now supports `kiro`, `windsurf`, `openclaw`, and `qwen` too.
29
+ 2. `sync --target all` relies on stale detection metadata that still includes `cursor`, but misses newer supported tools.
30
+ 3. Existing MCP sync support is incomplete even for some already-supported targets:
31
+ - `codex` only emits stdio servers and silently drops remote MCP servers.
32
+ - `droid` is still skills-only even though Factory now documents `mcp.json`.
33
+
34
+ User impact:
35
+
36
+ - A user can install the plugin to more providers than they can sync their personal Claude setup to.
37
+ - `sync --target all` does not mean "all supported tools" anymore.
38
+ - Users with remote MCP servers in Claude get partial results depending on target.
39
+
40
+ ## Research Summary
41
+
42
+ ### No Relevant Brainstorm
43
+
44
+ I checked recent brainstorms in `docs/brainstorms/` and found no relevant document for this feature within the last 14 days.
45
+
46
+ ### Internal Findings
47
+
48
+ - `src/commands/sync.ts:15-125` hardcodes the sync target list, output roots, and per-target dispatch. It omits `windsurf`, `kiro`, `openclaw`, and `qwen`.
49
+ - `src/utils/detect-tools.ts:15-22` still detects `cursor`, but not `windsurf`, `kiro`, `openclaw`, or `qwen`.
50
+ - `src/parsers/claude-home.ts:11-19` already gives sync exactly the right inputs: personal skills plus `settings.json` `mcpServers`.
51
+ - `src/sync/codex.ts:25-91` only serializes stdio MCP servers, even though Codex supports remote MCP config.
52
+ - `src/sync/droid.ts:6-21` symlinks skills but ignores MCP entirely.
53
+ - Target writers already encode several missing MCP formats and merge behaviors:
54
+ - `src/targets/windsurf.ts:65-92`
55
+ - `src/targets/kiro.ts:68-91`
56
+ - `src/targets/openclaw.ts:34-42`
57
+ - `src/targets/qwen.ts:9-15`
58
+ - `README.md:89-123` promises "Sync Personal Config" but only documents the old subset of targets.
59
+
60
+ ### Institutional Learnings
61
+
62
+ `docs/solutions/adding-converter-target-providers.md:20-32` and `docs/solutions/adding-converter-target-providers.md:208-214` reinforce the right pattern for this feature:
63
+
64
+ - keep target mappings explicit,
65
+ - treat MCP conversion as target-specific,
66
+ - warn on unsupported features instead of forcing fake parity,
67
+ - and add tests for each mapping.
68
+
69
+ Note: `docs/solutions/patterns/critical-patterns.md` does not exist in this repository, so there was no critical-patterns file to apply.
70
+
71
+ ### External Findings
72
+
73
+ Official docs confirm that the missing targets are not all equivalent, so this cannot be solved with a generic JSON pass-through.
74
+
75
+ | Target | Official MCP / skills location | Key notes |
76
+ | --- | --- | --- |
77
+ | Factory Droid | `~/.factory/mcp.json`, `.factory/mcp.json`, `~/.factory/skills/` | Supports `stdio` and `http`; user config overrides project config. |
78
+ | Windsurf | `~/.codeium/windsurf/mcp_config.json`, `~/.codeium/windsurf/skills/` | Supports `stdio`, Streamable HTTP, and SSE; remote config uses `serverUrl` or `url`. |
79
+ | Kiro | `~/.kiro/settings/mcp.json`, `.kiro/settings/mcp.json`, `~/.kiro/skills/` | Supports user and workspace config; remote MCP support was added after this repo's local Kiro spec was written. |
80
+ | Qwen Code | `~/.qwen/settings.json`, `.qwen/settings.json`, `~/.qwen/skills/`, `.qwen/skills/` | Supports `stdio`, `http`, and `sse`; official docs say prefer `http`, with `sse` treated as legacy/deprecated. |
81
+ | OpenClaw | `~/.openclaw/skills`, `<workspace>/skills`, `~/.openclaw/openclaw.json` | Skills are well-documented; a generic MCP server config surface is not clearly documented in official docs, so MCP sync needs validation before implementation is promised. |
82
+
83
+ Additional important findings:
84
+
85
+ - Kiro's current official behavior supersedes the local repo spec that says "workspace only" and "stdio only".
86
+ - Qwen's current docs explicitly distinguish `httpUrl` from legacy SSE `url`; blindly copying Claude's `url` is too lossy.
87
+ - Factory and Windsurf both support remote MCP, so `droid` should no longer be treated as skills-only.
88
+
89
+ ## Proposed Solution
90
+
91
+ ### Product Decision
92
+
93
+ Treat this as **sync parity for MCP-capable providers**, not as a one-off patch.
94
+
95
+ That means this feature should:
96
+
97
+ - add missing sync targets where the provider has a documented skills/MCP surface,
98
+ - upgrade partial implementations where existing sync support drops valid Claude MCP data,
99
+ - and replace stale detection metadata so `sync --target all` is truthful again.
100
+
101
+ ### Scope
102
+
103
+ #### In Scope
104
+
105
+ - Add MCP sync coverage for:
106
+ - `droid`
107
+ - `windsurf`
108
+ - `kiro`
109
+ - `qwen`
110
+ - Expand `codex` sync to support remote MCP servers.
111
+ - Add provider detection for newly supported sync targets.
112
+ - Keep skills syncing for all synced targets.
113
+ - Update CLI help text, README sync docs, and tests.
114
+
115
+ #### Conditional / Validation Gate
116
+
117
+ - `openclaw` skills sync is straightforward and should be included if the target is added to `sync`.
118
+ - `openclaw` MCP sync should only be implemented if its config surface is validated against current upstream docs or current upstream source. If that validation fails, the feature should explicitly skip OpenClaw MCP sync with a warning rather than inventing a format.
119
+
120
+ #### Out of Scope
121
+
122
+ - Standardizing all existing sync targets onto user-level paths only.
123
+ - Reworking install/convert output roots.
124
+ - Hook sync.
125
+ - A full rewrite of target writers.
126
+
127
+ ### Design Decisions
128
+
129
+ #### 0. Keep existing sync roots stable unless this feature is explicitly adding a new target
130
+
131
+ Do not use this feature to migrate existing `copilot` and `gemini` sync behavior.
132
+
133
+ Backward-compatibility rule:
134
+
135
+ - existing targets keep their current sync roots unless a correctness bug forces a change,
136
+ - newly added sync targets use the provider's documented personal/global config surface,
137
+ - and any future root migration belongs in a separate plan.
138
+
139
+ Planned sync roots after this feature:
140
+
141
+ | Target | Sync root | Notes |
142
+ | --- | --- | --- |
143
+ | `opencode` | `~/.config/opencode` | unchanged |
144
+ | `codex` | `~/.codex` | unchanged |
145
+ | `pi` | `~/.pi/agent` | unchanged |
146
+ | `droid` | `~/.factory` | unchanged root, new MCP file |
147
+ | `copilot` | `.github` | unchanged for backwards compatibility |
148
+ | `gemini` | `.gemini` | unchanged for backwards compatibility |
149
+ | `windsurf` | `~/.codeium/windsurf` | new |
150
+ | `kiro` | `~/.kiro` | new |
151
+ | `qwen` | `~/.qwen` | new |
152
+ | `openclaw` | `~/.openclaw` | new, MCP still validation-gated |
153
+
154
+ #### 1. Add a dedicated sync target registry
155
+
156
+ Do not keep growing `sync.ts` as a hand-maintained switch statement.
157
+
158
+ Create a dedicated sync registry, for example:
159
+
160
+ ### `src/sync/registry.ts`
161
+
162
+ ```ts
163
+ import os from "os"
164
+ import path from "path"
165
+ import type { ClaudeHomeConfig } from "../parsers/claude-home"
166
+
167
+ export type SyncTargetDefinition = {
168
+ name: string
169
+ detectPaths: (home: string, cwd: string) => string[]
170
+ resolveOutputRoot: (home: string, cwd: string) => string
171
+ sync: (config: ClaudeHomeConfig, outputRoot: string) => Promise<void>
172
+ }
173
+ ```
174
+
175
+ This registry becomes the single source of truth for:
176
+
177
+ - valid `sync` targets,
178
+ - `sync --target all` detection,
179
+ - output root resolution,
180
+ - and dispatch.
181
+
182
+ This avoids the current drift between:
183
+
184
+ - `src/commands/sync.ts`
185
+ - `src/utils/detect-tools.ts`
186
+ - `README.md`
187
+
188
+ #### 2. Preserve sync semantics, not writer semantics
189
+
190
+ Do not directly reuse install target writers for sync.
191
+
192
+ Reason:
193
+
194
+ - writers mostly copy skill directories,
195
+ - sync intentionally symlinks skills,
196
+ - writers often emit full plugin/install bundles,
197
+ - sync only needs personal skills plus MCP config.
198
+
199
+ However, provider-specific MCP conversion helpers should be extracted or reused where practical so sync and writer logic do not diverge again.
200
+
201
+ #### 3. Keep merge behavior additive, with Claude winning on same-name collisions
202
+
203
+ For JSON-based targets:
204
+
205
+ - preserve unrelated user keys,
206
+ - preserve unrelated user MCP servers,
207
+ - but if the same server name exists in Claude and the target config, Claude's value should overwrite that server entry during sync.
208
+
209
+ Codex remains the special case:
210
+
211
+ - continue using the managed marker block,
212
+ - remove the previous managed block,
213
+ - rewrite the managed block from Claude,
214
+ - leave the rest of `config.toml` untouched.
215
+
216
+ #### 4. Secure config writes where secrets may exist
217
+
218
+ Any config file that may contain MCP headers or env vars should be written with restrictive permissions where the platform already supports that pattern.
219
+
220
+ At minimum:
221
+
222
+ - `config.toml`
223
+ - `mcp.json`
224
+ - `mcp_config.json`
225
+ - `settings.json`
226
+
227
+ should follow the repo's existing "secure write" conventions where possible.
228
+
229
+ #### 5. Do not silently coerce ambiguous remote transports
230
+
231
+ Qwen and possibly future targets distinguish Streamable HTTP from legacy SSE.
232
+
233
+ Use this mapping rule:
234
+
235
+ - if Claude explicitly provides `type: "sse"` or an equivalent known signal, map to the target's SSE field,
236
+ - otherwise prefer the target's HTTP form for remote URLs,
237
+ - and log a warning when a target requires more specificity than Claude provides.
238
+
239
+ ## Provider Mapping Plan
240
+
241
+ ### Existing Targets to Upgrade
242
+
243
+ #### Codex
244
+
245
+ Current issue:
246
+
247
+ - only stdio servers are synced.
248
+
249
+ Implementation:
250
+
251
+ - extend `syncToCodex()` so remote MCP servers are serialized into the Codex TOML format, not dropped.
252
+ - keep the existing marker-based idempotent section handling.
253
+
254
+ Notes:
255
+
256
+ - This is a correctness fix, not a new target.
257
+
258
+ #### Droid / Factory
259
+
260
+ Current issue:
261
+
262
+ - skills-only sync despite current official MCP support.
263
+
264
+ Implementation:
265
+
266
+ - add `src/sync/droid.ts` MCP config writing to `~/.factory/mcp.json`.
267
+ - merge with existing `mcpServers`.
268
+ - support both `stdio` and `http`.
269
+
270
+ ### New Sync Targets
271
+
272
+ #### Windsurf
273
+
274
+ Add `src/sync/windsurf.ts`:
275
+
276
+ - symlink Claude skills into `~/.codeium/windsurf/skills/`
277
+ - merge MCP servers into `~/.codeium/windsurf/mcp_config.json`
278
+ - support `stdio`, Streamable HTTP, and SSE
279
+ - prefer `serverUrl` for remote HTTP config
280
+ - preserve unrelated existing servers
281
+ - write with secure permissions
282
+
283
+ Reference implementation:
284
+
285
+ - `src/targets/windsurf.ts:65-92`
286
+
287
+ #### Kiro
288
+
289
+ Add `src/sync/kiro.ts`:
290
+
291
+ - symlink Claude skills into `~/.kiro/skills/`
292
+ - merge MCP servers into `~/.kiro/settings/mcp.json`
293
+ - support both local and remote MCP servers
294
+ - preserve user config already present in `mcp.json`
295
+
296
+ Important:
297
+
298
+ - This feature must treat the repository's local Kiro spec as stale where it conflicts with official 2025-2026 Kiro docs/blog posts.
299
+
300
+ Reference implementation:
301
+
302
+ - `src/targets/kiro.ts:68-91`
303
+
304
+ #### Qwen
305
+
306
+ Add `src/sync/qwen.ts`:
307
+
308
+ - symlink Claude skills into `~/.qwen/skills/`
309
+ - merge MCP servers into `~/.qwen/settings.json`
310
+ - map stdio directly
311
+ - map remote URLs to `httpUrl` by default
312
+ - only emit legacy SSE `url` when Claude transport clearly indicates SSE
313
+
314
+ Important:
315
+
316
+ - capture the deprecation note in docs/comments: SSE is legacy, so HTTP is the default remote mapping.
317
+
318
+ #### OpenClaw
319
+
320
+ Add `src/sync/openclaw.ts` only if validated during implementation:
321
+
322
+ - symlink skills into `~/.openclaw/skills`
323
+ - optionally merge MCP config into `~/.openclaw/openclaw.json` if the official/current upstream contract is confirmed
324
+
325
+ Fallback behavior if MCP config cannot be validated:
326
+
327
+ - sync skills only,
328
+ - emit a warning that OpenClaw MCP sync is skipped because the official config surface is not documented clearly enough.
329
+
330
+ ## Implementation Phases
331
+
332
+ ### Phase 1: Registry and shared helpers
333
+
334
+ Files:
335
+
336
+ - `src/commands/sync.ts`
337
+ - `src/utils/detect-tools.ts`
338
+ - `src/sync/registry.ts` (new)
339
+ - `src/sync/skills.ts` or `src/utils/symlink.ts` extension
340
+ - optional `src/sync/mcp-merge.ts`
341
+
342
+ Tasks:
343
+
344
+ - move sync target metadata into a single registry
345
+ - make `validTargets` derive from the registry
346
+ - make `sync --target all` use the registry
347
+ - update detection to include supported sync targets instead of stale `cursor`
348
+ - extract a shared helper for validated skill symlinking
349
+
350
+ ### Phase 2: Upgrade existing partial targets
351
+
352
+ Files:
353
+
354
+ - `src/sync/codex.ts`
355
+ - `src/sync/droid.ts`
356
+ - `tests/sync-droid.test.ts`
357
+ - new or expanded `tests/sync-codex.test.ts`
358
+
359
+ Tasks:
360
+
361
+ - add remote MCP support to Codex sync
362
+ - add MCP config writing to Droid sync
363
+ - preserve current skill symlink behavior
364
+
365
+ ### Phase 3: Add missing sync targets
366
+
367
+ Files:
368
+
369
+ - `src/sync/windsurf.ts`
370
+ - `src/sync/kiro.ts`
371
+ - `src/sync/qwen.ts`
372
+ - optionally `src/sync/openclaw.ts`
373
+ - `tests/sync-windsurf.test.ts`
374
+ - `tests/sync-kiro.test.ts`
375
+ - `tests/sync-qwen.test.ts`
376
+ - optionally `tests/sync-openclaw.test.ts`
377
+
378
+ Tasks:
379
+
380
+ - implement skill symlink + MCP merge for each target
381
+ - align output paths with the target's documented personal config surface
382
+ - secure writes and corrupted-config fallbacks
383
+
384
+ ### Phase 4: CLI, docs, and detection parity
385
+
386
+ Files:
387
+
388
+ - `src/commands/sync.ts`
389
+ - `src/utils/detect-tools.ts`
390
+ - `tests/detect-tools.test.ts`
391
+ - `tests/cli.test.ts`
392
+ - `README.md`
393
+ - optionally `docs/specs/kiro.md`
394
+
395
+ Tasks:
396
+
397
+ - update `sync` help text and summary output
398
+ - ensure `sync --target all` only reports real sync-capable tools
399
+ - document newly supported sync targets
400
+ - fix stale Kiro assumptions if repository docs are updated in the same change
401
+
402
+ ## SpecFlow Analysis
403
+
404
+ ### Primary user flows
405
+
406
+ #### Flow 1: Explicit sync to one target
407
+
408
+ 1. User runs `bunx @every-env/compound-plugin sync --target <provider>`
409
+ 2. CLI loads `~/.claude/skills` and `~/.claude/settings.json`
410
+ 3. CLI resolves that provider's sync root
411
+ 4. Skills are symlinked
412
+ 5. MCP config is merged
413
+ 6. CLI prints the destination path and completion summary
414
+
415
+ #### Flow 2: Sync to all detected tools
416
+
417
+ 1. User runs `bunx @every-env/compound-plugin sync`
418
+ 2. CLI detects installed/supported tools
419
+ 3. CLI prints which tools were found and which were skipped
420
+ 4. CLI syncs each detected target in sequence
421
+ 5. CLI prints per-target success lines
422
+
423
+ #### Flow 3: Existing config already present
424
+
425
+ 1. User already has destination config file(s)
426
+ 2. Sync reads and parses the existing file
427
+ 3. Existing unrelated keys are preserved
428
+ 4. Claude MCP entries are merged in
429
+ 5. Corrupt config produces a warning and replacement behavior
430
+
431
+ ### Edge cases to account for
432
+
433
+ - Claude has zero MCP servers: skills still sync, no config file is written.
434
+ - Claude has remote MCP servers: targets that support remote config receive them; unsupported transports warn, not crash.
435
+ - Existing target config is invalid JSON/TOML: warn and replace the managed portion.
436
+ - Skill name contains path traversal characters: skip with warning, same as current behavior.
437
+ - Real directory already exists where a symlink would go: skip safely, do not delete user data.
438
+ - `sync --target all` detects a tool with skills support but unclear MCP support: sync only the documented subset and warn explicitly.
439
+
440
+ ### Critical product decisions already assumed
441
+
442
+ - `sync` remains additive and non-destructive.
443
+ - Sync roots may differ from install roots when the provider has a documented personal config location.
444
+ - OpenClaw MCP support is validation-gated rather than assumed.
445
+
446
+ ## Acceptance Criteria
447
+
448
+ ### Functional Requirements
449
+
450
+ - [x] `sync --target` accepts `windsurf`, `kiro`, and `qwen`, in addition to the existing targets.
451
+ - [x] `sync --target droid` writes MCP servers to Factory's documented `mcp.json` format instead of remaining skills-only.
452
+ - [x] `sync --target codex` syncs both stdio and remote MCP servers.
453
+ - [x] `sync --target all` detects only sync-capable supported tools and includes the new targets.
454
+ - [x] Claude personal skills continue to be symlinked, not copied.
455
+ - [x] Existing destination config keys unrelated to MCP are preserved during merge.
456
+ - [x] Existing same-named MCP entries are refreshed from Claude for sync-managed targets.
457
+ - [x] Unsafe skill names are skipped without deleting user content.
458
+ - [x] If OpenClaw MCP sync is not validated, the CLI warns and skips MCP sync for OpenClaw instead of writing an invented format.
459
+
460
+ ### Non-Functional Requirements
461
+
462
+ - [x] MCP config files that may contain secrets are written with restrictive permissions where supported.
463
+ - [x] Corrupt destination config files warn and recover cleanly.
464
+ - [x] New sync code does not duplicate target detection metadata in multiple places.
465
+ - [x] Remote transport mapping is explicit and tested, especially for Qwen and Codex.
466
+
467
+ ### Quality Gates
468
+
469
+ - [x] Add target-level sync tests for every new or upgraded provider.
470
+ - [x] Update `tests/detect-tools.test.ts` for new detection rules and remove stale cursor expectations.
471
+ - [x] Add or expand CLI coverage for `sync --target all`.
472
+ - [x] `bun test` passes.
473
+
474
+ ## Testing Plan
475
+
476
+ ### Unit / integration tests
477
+
478
+ Add or expand:
479
+
480
+ - `tests/sync-codex.test.ts`
481
+ - remote URL server is emitted
482
+ - existing non-managed TOML content is preserved
483
+ - `tests/sync-droid.test.ts`
484
+ - writes `mcp.json`
485
+ - merges with existing file
486
+ - `tests/sync-windsurf.test.ts`
487
+ - writes `mcp_config.json`
488
+ - merges existing servers
489
+ - preserves HTTP/SSE fields
490
+ - `tests/sync-kiro.test.ts`
491
+ - writes `settings/mcp.json`
492
+ - supports user-scope root
493
+ - preserves remote servers
494
+ - `tests/sync-qwen.test.ts`
495
+ - writes `settings.json`
496
+ - maps remote servers to `httpUrl`
497
+ - emits legacy SSE only when explicitly indicated
498
+ - `tests/sync-openclaw.test.ts` if implemented
499
+ - skills path
500
+ - MCP behavior or explicit skip warning
501
+
502
+ ### CLI tests
503
+
504
+ Expand `tests/cli.test.ts` or add focused sync CLI coverage for:
505
+
506
+ - `sync --target windsurf`
507
+ - `sync --target kiro`
508
+ - `sync --target qwen`
509
+ - `sync --target all` with detected new tool homes
510
+ - `sync --target all` no longer surfacing unsupported `cursor`
511
+
512
+ ## Risks and Mitigations
513
+
514
+ ### Risk: local specs are stale relative to current provider docs
515
+
516
+ Impact:
517
+
518
+ - implementing from local docs alone would produce incorrect paths and transport support.
519
+
520
+ Mitigation:
521
+
522
+ - treat official 2025-2026 docs/blog posts as source of truth where they supersede local specs
523
+ - update any obviously stale repo docs touched by this feature
524
+
525
+ ### Risk: transport ambiguity for remote MCP servers
526
+
527
+ Impact:
528
+
529
+ - a Claude `url` may map incorrectly for targets that distinguish HTTP vs SSE.
530
+
531
+ Mitigation:
532
+
533
+ - prefer HTTP where the target recommends it
534
+ - only emit legacy SSE when Claude transport is explicit
535
+ - warn when mapping is lossy
536
+
537
+ ### Risk: OpenClaw MCP surface is not sufficiently documented
538
+
539
+ Impact:
540
+
541
+ - writing a guessed MCP config could create a broken or misleading feature.
542
+
543
+ Mitigation:
544
+
545
+ - validation gate during implementation
546
+ - if validation fails, ship OpenClaw skills sync only and document MCP as a follow-up
547
+
548
+ ### Risk: `sync --target all` remains easy to drift out of sync again
549
+
550
+ Impact:
551
+
552
+ - future providers get added to install/convert but missed by sync.
553
+
554
+ Mitigation:
555
+
556
+ - derive sync valid targets and detection from a shared registry
557
+ - add tests that assert detection and sync target lists match expected supported names
558
+
559
+ ## Alternative Approaches Considered
560
+
561
+ ### 1. Just add more cases to `sync.ts`
562
+
563
+ Rejected:
564
+
565
+ - this is exactly how the current drift happened.
566
+
567
+ ### 2. Reuse target writers directly
568
+
569
+ Rejected:
570
+
571
+ - writers copy directories and emit install bundles;
572
+ - sync must symlink skills and only manage personal config subsets.
573
+
574
+ ### 3. Standardize every sync target on user-level output now
575
+
576
+ Rejected for this feature:
577
+
578
+ - it would change existing `gemini` and `copilot` behavior and broaden scope into a migration project.
579
+
580
+ ## Documentation Plan
581
+
582
+ - Update `README.md` sync section to list all supported sync targets and call out any exceptions.
583
+ - Update sync examples for `windsurf`, `kiro`, and `qwen`.
584
+ - If OpenClaw MCP is skipped, document that explicitly.
585
+ - If repository specs are corrected during implementation, update `docs/specs/kiro.md` to match official current behavior.
586
+
587
+ ## Success Metrics
588
+
589
+ - `sync --target all` covers the same provider surface users reasonably expect from the current CLI, excluding only targets that lack a validated MCP config contract.
590
+ - A Claude config with one stdio server and one remote server syncs correctly to every documented MCP-capable provider.
591
+ - No user data is deleted during sync.
592
+ - Documentation and CLI help no longer over-promise relative to actual behavior.
593
+
594
+ ## AI Pairing Notes
595
+
596
+ - Treat official provider docs as authoritative over older local notes, especially for Kiro and Qwen transport handling.
597
+ - Have a human review any AI-generated MCP mapping code before merge because these config files may contain secrets and lossy transport assumptions are easy to miss.
598
+ - When using an implementation agent, keep the work split by target so each provider's config contract can be tested independently.
599
+
600
+ ## References & Research
601
+
602
+ ### Internal References
603
+
604
+ - `src/commands/sync.ts:15-125`
605
+ - `src/utils/detect-tools.ts:11-46`
606
+ - `src/parsers/claude-home.ts:11-64`
607
+ - `src/sync/codex.ts:7-92`
608
+ - `src/sync/droid.ts:6-21`
609
+ - `src/targets/windsurf.ts:13-93`
610
+ - `src/targets/kiro.ts:5-93`
611
+ - `src/targets/openclaw.ts:6-95`
612
+ - `src/targets/qwen.ts:5-64`
613
+ - `docs/solutions/adding-converter-target-providers.md:20-32`
614
+ - `docs/solutions/adding-converter-target-providers.md:208-214`
615
+ - `README.md:89-123`
616
+
617
+ ### External References
618
+
619
+ - Factory MCP docs: https://docs.factory.ai/factory-cli/configuration/mcp
620
+ - Factory skills docs: https://docs.factory.ai/cli/configuration/skills
621
+ - Windsurf MCP docs: https://docs.windsurf.com/windsurf/cascade/mcp
622
+ - Kiro MCP overview: https://kiro.dev/blog/unlock-your-development-productivity-with-kiro-and-mcp/
623
+ - Kiro remote MCP support: https://kiro.dev/blog/introducing-remote-mcp/
624
+ - Kiro skills announcement: https://kiro.dev/blog/custom-subagents-skills-and-enterprise-controls/
625
+ - Qwen settings docs: https://qwenlm.github.io/qwen-code-docs/en/users/configuration/settings/
626
+ - Qwen MCP docs: https://qwenlm.github.io/qwen-code-docs/en/users/features/mcp/
627
+ - Qwen skills docs: https://qwenlm.github.io/qwen-code-docs/zh/users/features/skills/
628
+ - OpenClaw setup/config docs: https://docs.openclaw.ai/start/setup
629
+ - OpenClaw skills docs: https://docs.openclaw.ai/skills
630
+
631
+ ## Implementation Notes for the Follow-Up `/workflows-work` Step
632
+
633
+ Suggested implementation order:
634
+
635
+ 1. registry + detection cleanup
636
+ 2. codex remote MCP + droid MCP
637
+ 3. windsurf + kiro + qwen sync modules
638
+ 4. openclaw validation and implementation or explicit warning path
639
+ 5. docs + tests
@@ -653,7 +653,8 @@ Use this checklist when adding a new target provider:
653
653
  - [ ] Update `CHANGELOG.md` with new target
654
654
 
655
655
  ### Version Bumping
656
- - [ ] Bump version in `package.json` (minor for new target)
656
+ - [ ] Use a `feat(...)` conventional commit so semantic-release cuts the next minor root CLI release on `main`
657
+ - [ ] Do not hand-start a separate root CLI version line in `package.json`; the root package follows the repo `v*` tags and semantic-release writes that version back after release
657
658
  - [ ] Update plugin.json description if component counts changed
658
659
  - [ ] Verify CHANGELOG entry is clear
659
660
 
@@ -13,6 +13,8 @@ component: plugin-development
13
13
 
14
14
  When making changes to the compound-engineering plugin, documentation can get out of sync with the actual components (agents, commands, skills). This leads to confusion about what's included in each version and makes it difficult to track changes over time.
15
15
 
16
+ This document applies to the embedded marketplace plugin metadata, not the root CLI package release version. The root CLI package (`package.json`, root `CHANGELOG.md`, repo `v*` tags) is managed by semantic-release and follows the repository tag line.
17
+
16
18
  ## Solution
17
19
 
18
20
  **Every change to the plugin MUST include:**
@@ -75,3 +77,5 @@ This documentation serves as a reminder. When Claude Code works on this plugin,
75
77
  - `/Users/kieranklaassen/compound-engineering-plugin/plugins/compound-engineering/.claude-plugin/plugin.json`
76
78
  - `/Users/kieranklaassen/compound-engineering-plugin/plugins/compound-engineering/CHANGELOG.md`
77
79
  - `/Users/kieranklaassen/compound-engineering-plugin/plugins/compound-engineering/README.md`
80
+ - `/Users/kieranklaassen/compound-engineering-plugin/package.json`
81
+ - `/Users/kieranklaassen/compound-engineering-plugin/CHANGELOG.md`
package/package.json CHANGED
@@ -1,11 +1,13 @@
1
1
  {
2
2
  "name": "@every-env/compound-plugin",
3
- "version": "0.12.0",
3
+ "version": "2.34.2",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "bin": {
7
- "compound-plugin": "./src/index.ts"
7
+ "compound-plugin": "src/index.ts"
8
8
  },
9
+ "homepage": "https://github.com/EveryInc/compound-engineering-plugin",
10
+ "repository": "https://github.com/EveryInc/compound-engineering-plugin",
9
11
  "publishConfig": {
10
12
  "access": "public"
11
13
  },
@@ -14,13 +16,17 @@
14
16
  "convert": "bun run src/index.ts convert",
15
17
  "list": "bun run src/index.ts list",
16
18
  "cli:install": "bun run src/index.ts install",
17
- "test": "bun test"
19
+ "test": "bun test",
20
+ "release:dry-run": "semantic-release --dry-run"
18
21
  },
19
22
  "dependencies": {
20
23
  "citty": "^0.1.6",
21
24
  "js-yaml": "^4.1.0"
22
25
  },
23
26
  "devDependencies": {
24
- "bun-types": "^1.0.0"
27
+ "@semantic-release/changelog": "^6.0.3",
28
+ "@semantic-release/git": "^10.0.1",
29
+ "bun-types": "^1.0.0",
30
+ "semantic-release": "^25.0.3"
25
31
  }
26
32
  }