sync-agents-settings 0.4.1 → 0.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,8 +7,8 @@
7
7
  {
8
8
  "name": "sync-agents-settings",
9
9
  "source": "./",
10
- "description": "Sync MCP server configs and instructions from Claude Code to other AI agents (Gemini, Codex, Cursor, Kiro, OpenCode, Kimi, Aider)",
11
- "version": "0.4.1",
10
+ "description": "Sync MCP server configs and instructions from Claude Code to other AI agents (Gemini, Codex, Cursor, Kiro, OpenCode, Kimi, Vibe, Aider)",
11
+ "version": "0.4.3",
12
12
  "author": {
13
13
  "name": "Leoyang183"
14
14
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sync-agents-settings",
3
- "version": "0.4.1",
4
- "description": "Sync MCP server configs and instructions from Claude Code to other AI agents (Gemini, Codex, Cursor, Kiro, OpenCode)",
3
+ "version": "0.4.3",
4
+ "description": "Sync MCP server configs and instructions from Claude Code to other AI agents (Gemini, Codex, Cursor, Kiro, OpenCode, Kimi, Vibe)",
5
5
  "repository": "https://github.com/Leoyang183/sync-agents-settings",
6
6
  "author": {
7
7
  "name": "Leoyang183"
package/README.md CHANGED
@@ -11,14 +11,14 @@
11
11
  [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?logo=prettier)](https://prettier.io/)
12
12
  [![CI](https://github.com/Leoyang183/sync-agents-settings/actions/workflows/ci.yml/badge.svg)](https://github.com/Leoyang183/sync-agents-settings/actions/workflows/ci.yml)
13
13
 
14
- Sync MCP server configurations and instruction files (CLAUDE.md) from **Claude Code** to **Gemini CLI**, **Codex CLI**, **OpenCode**, **Kiro CLI**, **Cursor**, **Kimi CLI**, and **Aider CLI**.
14
+ Sync MCP server configurations and instruction files (CLAUDE.md) from **Claude Code** to **Gemini CLI**, **Codex CLI**, **OpenCode**, **Kiro CLI**, **Cursor**, **Kimi CLI**, **Vibe CLI** (Mistral), and **Aider CLI**.
15
15
 
16
16
  **README translations:** [🇹đŸ‡ŧ įšéĢ”ä¸­æ–‡](docs/i18n/README.zh-tw.md) | [đŸ‡¨đŸ‡ŗ įŽ€äŊ“中文](docs/i18n/README.zh-cn.md) | [đŸ‡¯đŸ‡ĩ æ—ĨæœŦčĒž](docs/i18n/README.ja.md) | [🇰🇷 한ęĩ­ė–´](docs/i18n/README.ko.md)
17
17
  **Support matrix:** [CLI compatibility matrix](docs/compatibility-matrix.md)
18
18
 
19
19
  ## Why
20
20
 
21
- If you use Claude Code as your primary AI coding agent but also switch between other agents (Gemini CLI, Codex CLI, OpenCode, Kiro, Cursor, Kimi CLI) to take advantage of their free tiers or different models, you know the pain — every tool has its own MCP config format, and setting them up one by one is tedious. Same goes for instruction files — CLAUDE.md, GEMINI.md, AGENTS.md all need the same content but in different formats.
21
+ If you use Claude Code as your primary AI coding agent but also switch between other agents (Gemini CLI, Codex CLI, OpenCode, Kiro, Cursor, Kimi CLI, Vibe CLI) to take advantage of their free tiers or different models, you know the pain — every tool has its own MCP config format, and setting them up one by one is tedious. Same goes for instruction files — CLAUDE.md, GEMINI.md, AGENTS.md all need the same content but in different formats.
22
22
 
23
23
  This tool lets you configure MCP servers and write instructions once in Claude Code, then sync everywhere with a single command.
24
24
 
@@ -87,6 +87,7 @@ sync-agents sync --target opencode
87
87
  sync-agents sync --target kiro
88
88
  sync-agents sync --target cursor
89
89
  sync-agents sync --target kimi
90
+ sync-agents sync --target vibe
90
91
 
91
92
  # Sync to Codex project-level config
92
93
  sync-agents sync --target codex --codex-home ./my-project/.codex
@@ -175,7 +176,7 @@ sync-agents sync-instructions --global
175
176
  sync-agents sync-instructions --local
176
177
 
177
178
  # Sync to specific targets
178
- sync-agents sync-instructions --target gemini codex kimi aider
179
+ sync-agents sync-instructions --target gemini codex kimi vibe aider
179
180
 
180
181
  # Auto-overwrite without prompts (for CI)
181
182
  sync-agents sync-instructions --on-conflict overwrite
@@ -212,7 +213,8 @@ pnpm test # Run tests
212
213
  ~/.claude/plugins/ ──┘ │
213
214
  ├─→ Kiro Writer ─→ ~/.kiro/settings/mcp.json
214
215
  ├─→ Cursor Writer ─→ ~/.cursor/mcp.json
215
- └─→ Kimi Writer ─→ ~/.kimi/mcp.json
216
+ ├─→ Kimi Writer ─→ ~/.kimi/mcp.json
217
+ └─→ Vibe Writer ─→ ~/.vibe/config.toml
216
218
  ```
217
219
 
218
220
  | Stage | Description |
@@ -224,6 +226,7 @@ pnpm test # Run tests
224
226
  | **Kiro Writer** | Same format as Claude, `${VAR:-default}` → expanded |
225
227
  | **Cursor Writer** | Same format as Claude, `${VAR:-default}` → expanded |
226
228
  | **Kimi Writer** | Same format as Claude, `${VAR:-default}` → expanded |
229
+ | **Vibe Writer** | JSON → TOML `[[mcp_servers]]` array-of-tables, explicit `transport` field, `${VAR:-default}` → expanded |
227
230
 
228
231
  ### Instruction Sync (`sync-instructions`)
229
232
 
@@ -234,11 +237,12 @@ Syncs CLAUDE.md instruction files to each target's native format:
234
237
  ├─→ ~/.codex/AGENTS.md (plain copy)
235
238
  ~/.claude/CLAUDE.md (+ ~/.claude/rules/*.md) ─→ expand @imports ──â”ŧ─→ ~/.config/opencode/AGENTS.md (plain copy)
236
239
  ├─→ ~/.kimi/AGENTS.md (plain copy)
240
+ ├─→ ~/.vibe/AGENTS.md (plain copy)
237
241
  ├─→ ~/.kiro/steering/claude-instructions.md (+ inclusion: always)
238
242
  └─→ ⚠ Cursor global not supported (SQLite)
239
243
 
240
244
  ┌─→ ./GEMINI.md (plain copy)
241
- ├─→ ./AGENTS.md (Codex + OpenCode + Kimi share)
245
+ ├─→ ./AGENTS.md (Codex + OpenCode + Kimi + Vibe share)
242
246
  ./.claude/CLAUDE.md (fallback: ./CLAUDE.md) + ./.claude/rules/*.md ─→ expand @imports ──â”ŧ─→ .kiro/steering/claude-instructions.md (+ inclusion: always)
243
247
  └─→ .cursor/rules/claude-instructions.mdc (+ alwaysApply: true)
244
248
  ```
@@ -248,7 +252,8 @@ Syncs CLAUDE.md instruction files to each target's native format:
248
252
  | Gemini | `~/.gemini/GEMINI.md` | `./GEMINI.md` | Plain copy (expand standalone `@import` lines) |
249
253
  | Codex | `~/.codex/AGENTS.md` | `./AGENTS.md` | Plain copy (expand standalone `@import` lines) |
250
254
  | OpenCode | `~/.config/opencode/AGENTS.md` | `./AGENTS.md` (shared with Codex) | Plain copy (expand standalone `@import` lines) |
251
- | Kimi | `~/.kimi/AGENTS.md` | `./AGENTS.md` (shared with Codex/OpenCode) | Plain copy (expand standalone `@import` lines) |
255
+ | Kimi | `~/.kimi/AGENTS.md` | `./AGENTS.md` (shared with Codex/OpenCode/Vibe) | Plain copy (expand standalone `@import` lines) |
256
+ | Vibe | `~/.vibe/AGENTS.md` | `./AGENTS.md` (shared with Codex/OpenCode/Kimi) | Plain copy (expand standalone `@import` lines) |
252
257
  | Aider | `~/.aider/CONVENTIONS.md` | `.aider/CONVENTIONS.md` | Plain copy + upsert `read` entry in `.aider.conf.yml` |
253
258
  | Kiro | `~/.kiro/steering/claude-instructions.md` | `.kiro/steering/claude-instructions.md` | Add `inclusion: always` frontmatter |
254
259
  | Cursor | Not supported (SQLite) | `.cursor/rules/claude-instructions.mdc` | Add `alwaysApply: true` frontmatter |
@@ -394,15 +399,38 @@ Writes to **`~/.kimi/mcp.json`** by default. Use `--kimi-home <path>` to sync to
394
399
 
395
400
  Same format as Claude Code. `${VAR:-default}` syntax in URLs is auto-expanded during sync.
396
401
 
402
+ ### Target: Vibe CLI (Mistral)
403
+
404
+ Writes to **`~/.vibe/config.toml`** by default. Use `--vibe-home <path>` to sync to a custom base directory (for example, project-level `.vibe/`).
405
+
406
+ Key format differences:
407
+ - Uses TOML `[[mcp_servers]]` (array of tables) — each entry has a `name` and explicit `transport` field
408
+ - Claude `"http"` → Vibe `"streamable-http"`, Claude `"sse"` → Vibe `"http"`
409
+ - `command` is a string (not array), `env` is a TOML sub-table
410
+ - `${VAR:-default}` syntax in URLs is auto-expanded during sync
411
+
412
+ ```toml
413
+ [[mcp_servers]]
414
+ name = "context7"
415
+ transport = "stdio"
416
+ command = "npx"
417
+ args = ["-y", "@upstash/context7-mcp"]
418
+
419
+ [[mcp_servers]]
420
+ name = "supabase"
421
+ transport = "streamable-http"
422
+ url = "https://mcp.supabase.com/mcp"
423
+ ```
424
+
397
425
  ## Transport Type Mapping
398
426
 
399
- | Claude Code | Gemini CLI | Codex CLI | OpenCode | Kiro CLI | Cursor | Kimi CLI |
400
- |------------|-----------|----------|----------|----------|--------|----------|
401
- | `command` + `args` (stdio) | `command` + `args` | `command` + `args` | `type: "local"`, `command: [cmd, ...args]` | same as Claude | same as Claude | same as Claude |
402
- | `type: "http"` + `url` | `httpUrl` | `url` | `type: "remote"`, `url` | same as Claude | same as Claude | same as Claude |
403
- | `type: "sse"` + `url` | `url` | `url` | `type: "remote"`, `url` | same as Claude | same as Claude | same as Claude |
404
- | `env` | `env` | `env` | `environment` | `env` | `env` | `env` |
405
- | `oauth` | skipped | skipped | skipped | skipped | skipped | skipped |
427
+ | Claude Code | Gemini CLI | Codex CLI | OpenCode | Kiro CLI | Cursor | Kimi CLI | Vibe CLI |
428
+ |------------|-----------|----------|----------|----------|--------|----------|----------|
429
+ | `command` + `args` (stdio) | `command` + `args` | `command` + `args` | `type: "local"`, `command: [cmd, ...args]` | same as Claude | same as Claude | same as Claude | `transport: "stdio"`, `command` + `args` + `name` |
430
+ | `type: "http"` + `url` | `httpUrl` | `url` | `type: "remote"`, `url` | same as Claude | same as Claude | same as Claude | `transport: "streamable-http"`, `url` + `name` |
431
+ | `type: "sse"` + `url` | `url` | `url` | `type: "remote"`, `url` | same as Claude | same as Claude | same as Claude | `transport: "http"`, `url` + `name` |
432
+ | `env` | `env` | `env` | `environment` | `env` | `env` | `env` | `env` |
433
+ | `oauth` | skipped | skipped | skipped | skipped | skipped | skipped | skipped |
406
434
 
407
435
  ## Backup
408
436
 
@@ -425,8 +453,10 @@ Every sync automatically backs up all affected config files to `~/.sync-agents-b
425
453
  │ └── mcp.json # ← ~/.kiro/settings/mcp.json
426
454
  ├── .cursor/
427
455
  │ └── mcp.json # ← ~/.cursor/mcp.json
428
- └── .kimi/
429
- └── mcp.json # ← ~/.kimi/mcp.json
456
+ ├── .kimi/
457
+ │ └── mcp.json # ← ~/.kimi/mcp.json
458
+ └── .vibe/
459
+ └── config.toml # ← ~/.vibe/config.toml
430
460
  ```
431
461
 
432
462
  Use `--no-backup` to skip. Target directories that don't exist (CLI not installed) will be skipped with a warning, not created.
@@ -451,6 +481,8 @@ Use `--no-backup` to skip. Target directories that don't exist (CLI not installe
451
481
  | Cursor (project) | `.cursor/mcp.json` in project root | JSON |
452
482
  | Kimi CLI (global) | `~/.kimi/mcp.json` | JSON |
453
483
  | Kimi CLI (project) | `.kimi/mcp.json` (use `--kimi-home ./.kimi`) | JSON |
484
+ | Vibe CLI (global) | `~/.vibe/config.toml` | TOML |
485
+ | Vibe CLI (project) | `.vibe/config.toml` (use `--vibe-home ./.vibe`) | TOML |
454
486
 
455
487
  ### Instruction Files
456
488
 
@@ -461,6 +493,7 @@ Use `--no-backup` to skip. Target directories that don't exist (CLI not installe
461
493
  | Codex CLI | `~/.codex/AGENTS.md` | `./AGENTS.md` | Markdown |
462
494
  | OpenCode | `~/.config/opencode/AGENTS.md` | `./AGENTS.md` | Markdown |
463
495
  | Kimi CLI | `~/.kimi/AGENTS.md` | `./AGENTS.md` | Markdown |
496
+ | Vibe CLI | `~/.vibe/AGENTS.md` | `./AGENTS.md` | Markdown |
464
497
  | Kiro CLI | `~/.kiro/steering/claude-instructions.md` | `.kiro/steering/claude-instructions.md` | Markdown + frontmatter |
465
498
  | Cursor | Not supported (SQLite) | `.cursor/rules/claude-instructions.mdc` | MDC (Markdown + frontmatter) |
466
499
 
@@ -8,7 +8,7 @@ Compare which MCP servers exist in Claude Code vs other AI agents.
8
8
  ## Arguments
9
9
 
10
10
  The user may pass target names: `/sync-diff gemini`
11
- If no targets specified, compare all targets (gemini, codex, opencode, kiro, cursor, kimi).
11
+ If no targets specified, compare all targets (gemini, codex, opencode, kiro, cursor, kimi, vibe).
12
12
 
13
13
  Optional flags:
14
14
  - `--report json` — output machine-readable JSON summary (CI-friendly)
@@ -29,4 +29,4 @@ Optional flags:
29
29
  ## Error Handling
30
30
 
31
31
  - If `npx` fails: suggest `npm install -g sync-agents-settings` as fallback.
32
- - Note: Codex diff shows a message to use `codex mcp list` instead (CLI limitation).
32
+ - Note: Codex and Vibe diff show a note instead of actual comparison (TOML format limitation).
@@ -8,12 +8,13 @@ Check whether target MCP configs are in sync with Claude Code, without writing a
8
8
  ## Arguments
9
9
 
10
10
  The user may pass target names: `/sync-doctor gemini codex`
11
- If no targets specified, check all targets (gemini, codex, opencode, kiro, cursor, kimi).
11
+ If no targets specified, check all targets (gemini, codex, opencode, kiro, cursor, kimi, vibe).
12
12
 
13
13
  Optional flags:
14
14
  - `--skip-oauth` — ignore OAuth-only servers from Claude source
15
15
  - `--codex-home <path>` — check project-level Codex config (e.g. `./.codex`)
16
16
  - `--kimi-home <path>` — check project-level Kimi config (e.g. `./.kimi`)
17
+ - `--vibe-home <path>` — check project-level Vibe config (e.g. `./.vibe`)
17
18
  - `--fix` — if drift exists, auto-run reconcile to add missing servers
18
19
  - `--dry-run` — with `--fix`, preview only
19
20
  - `--no-backup` — with `--fix`, skip backup before writing
@@ -24,7 +25,7 @@ Optional flags:
24
25
  1. Parse targets and flags from user arguments.
25
26
  2. Run:
26
27
  `npx sync-agents-settings doctor --target <targets>`
27
- Add `--skip-oauth` / `--codex-home` / `--kimi-home` when specified.
28
+ Add `--skip-oauth` / `--codex-home` / `--kimi-home` / `--vibe-home` when specified.
28
29
  3. Present results per target:
29
30
  - `No drift` when fully in sync
30
31
  - `Missing in <target>` when Claude has servers not present in target
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sync-instructions
3
- description: Sync CLAUDE.md instruction files to other AI agents (Gemini, Codex, OpenCode, Kiro, Cursor, Kimi)
3
+ description: Sync CLAUDE.md instruction files to other AI agents (Gemini, Codex, OpenCode, Kiro, Cursor, Kimi, Vibe)
4
4
  ---
5
5
 
6
6
  Sync CLAUDE.md instruction files from Claude Code format to other AI agent formats.
@@ -14,11 +14,13 @@ The user may pass target names: `/sync-reconcile gemini codex`
14
14
  If no targets are specified, reconcile all targets.
15
15
 
16
16
  Optional flags:
17
+ - `--server <names...>` or `-s <names...>` — reconcile only specified MCP servers by name
17
18
  - `--dry-run` — preview only, no writes
18
19
  - `--no-backup` — skip backup before write
19
20
  - `--skip-oauth` — ignore OAuth-only servers
20
21
  - `--codex-home <path>` — custom Codex config directory
21
22
  - `--kimi-home <path>` — custom Kimi config directory
23
+ - `--vibe-home <path>` — custom Vibe config directory
22
24
  - `--report json` — emit machine-readable JSON only (for CI)
23
25
 
24
26
  ## Execution Flow
@@ -8,7 +8,7 @@ Validate MCP server definitions from Claude Code against target agent capabiliti
8
8
  ## Arguments
9
9
 
10
10
  The user may pass target names: `/sync-validate codex opencode`
11
- If no targets are specified, validate all targets (gemini, codex, opencode, kiro, cursor, kimi).
11
+ If no targets are specified, validate all targets (gemini, codex, opencode, kiro, cursor, kimi, vibe).
12
12
 
13
13
  Optional flags:
14
14
  - `--skip-oauth` — ignore OAuth-only servers from validation
package/commands/sync.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sync
3
- description: Sync MCP server configurations from Claude Code to other AI agents (Gemini, Codex, OpenCode, Kiro, Cursor, Kimi)
3
+ description: Sync MCP server configurations from Claude Code to other AI agents (Gemini, Codex, OpenCode, Kiro, Cursor, Kimi, Vibe)
4
4
  ---
5
5
 
6
6
  Sync MCP server settings from Claude Code to other AI coding agents.
@@ -8,19 +8,24 @@ Sync MCP server settings from Claude Code to other AI coding agents.
8
8
  ## Arguments
9
9
 
10
10
  The user may pass target names after the command: `/sync gemini codex`
11
- If no targets specified, sync to all targets (gemini, codex, opencode, kiro, cursor, kimi).
11
+ If no targets specified, sync to all targets (gemini, codex, opencode, kiro, cursor, kimi, vibe).
12
+
13
+ The user may also pass server names to sync only specific servers: `/sync --server context7 supabase`
12
14
 
13
15
  The user may also pass flags:
16
+ - `--server <names...>` or `-s <names...>` — sync only specified MCP servers by name
14
17
  - `--skip-oauth` — skip MCP servers that require OAuth authentication
15
18
  - `--no-backup` — skip creating backup of target config files
16
19
  - `--codex-home <path>` — custom Codex config directory
17
20
  - `--kimi-home <path>` — custom Kimi config directory
21
+ - `--vibe-home <path>` — custom Vibe config directory
18
22
  - `--report json` — output machine-readable JSON summary (CI-friendly)
19
23
 
20
24
  ## Execution Flow
21
25
 
22
- 1. Parse targets from user arguments. Build the command:
26
+ 1. Parse targets and server names from user arguments. Build the command:
23
27
  `npx sync-agents-settings sync --dry-run --target <targets>`
28
+ Add `--server <names>` if the user specified specific servers.
24
29
  Add `--skip-oauth` or `--no-backup` if the user specified them.
25
30
 
26
31
  2. Run the dry-run command using bash. This previews what will change without writing files.
package/dist/backup.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export declare function createBackup(filePaths: string[]): string;
2
- export declare function getFilesToBackup(targets: string[], codexConfigPath?: string, kimiConfigPath?: string): string[];
2
+ export declare function getFilesToBackup(targets: string[], codexConfigPath?: string, kimiConfigPath?: string, vibeConfigPath?: string): string[];
package/dist/backup.js CHANGED
@@ -1,4 +1,4 @@
1
- import { existsSync, mkdirSync, copyFileSync } from "node:fs";
1
+ import { existsSync, mkdirSync, copyFileSync, chmodSync } from "node:fs";
2
2
  import { join, dirname } from "node:path";
3
3
  import { homedir } from "node:os";
4
4
  import { PATHS } from "./paths.js";
@@ -12,8 +12,9 @@ export function createBackup(filePaths) {
12
12
  // Preserve original path structure relative to home
13
13
  const relativePath = filePath.startsWith(home) ? filePath.slice(home.length + 1) : filePath;
14
14
  const dest = join(backupDir, relativePath);
15
- mkdirSync(dirname(dest), { recursive: true });
15
+ mkdirSync(dirname(dest), { recursive: true, mode: 0o700 });
16
16
  copyFileSync(filePath, dest);
17
+ chmodSync(dest, 0o600);
17
18
  backedUp++;
18
19
  console.log(` Backed up: ${filePath}`);
19
20
  }
@@ -23,7 +24,7 @@ export function createBackup(filePaths) {
23
24
  }
24
25
  return backupDir;
25
26
  }
26
- export function getFilesToBackup(targets, codexConfigPath, kimiConfigPath) {
27
+ export function getFilesToBackup(targets, codexConfigPath, kimiConfigPath, vibeConfigPath) {
27
28
  const files = [PATHS.claudeJson, PATHS.claudeSettings];
28
29
  if (targets.includes("gemini")) {
29
30
  files.push(PATHS.geminiSettings);
@@ -43,6 +44,9 @@ export function getFilesToBackup(targets, codexConfigPath, kimiConfigPath) {
43
44
  if (targets.includes("cursor")) {
44
45
  files.push(PATHS.cursorMcpConfig);
45
46
  }
47
+ if (targets.includes("vibe")) {
48
+ files.push(vibeConfigPath ?? PATHS.vibeConfig);
49
+ }
46
50
  return files;
47
51
  }
48
52
  //# sourceMappingURL=backup.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backup.js","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,UAAU,YAAY,CAAC,SAAmB;IAC9C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IAEvB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,oDAAoD;YACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAC3C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7B,QAAQ,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAiB,EACjB,eAAwB,EACxB,cAAuB;IAEvB,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IAEvD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../src/backup.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -9,6 +9,7 @@ import { writeToOpenCode } from "./writers/opencode.js";
9
9
  import { writeToKiro } from "./writers/kiro.js";
10
10
  import { writeToCursor } from "./writers/cursor.js";
11
11
  import { writeToKimi, resolveKimiMcpConfigPath } from "./writers/kimi.js";
12
+ import { writeToVibe, resolveVibeConfigPath } from "./writers/vibe.js";
12
13
  import { createBackup, getFilesToBackup } from "./backup.js";
13
14
  import { PATHS } from "./paths.js";
14
15
  import { runDoctor } from "./doctor.js";
@@ -24,17 +25,19 @@ import { syncInstructions, getGlobalSyncPairs, getLocalSyncPairs, getUnsupported
24
25
  const program = new Command();
25
26
  program
26
27
  .name("sync-agents")
27
- .description("Sync Claude Code MCP settings to Gemini CLI / Codex CLI / OpenCode / Kiro CLI")
28
- .version("0.4.1");
28
+ .description("Sync Claude Code MCP settings to Gemini CLI / Codex CLI / OpenCode / Kiro CLI / Vibe CLI")
29
+ .version("0.4.3");
29
30
  program
30
31
  .command("sync")
31
32
  .description("Sync MCP settings from Claude Code to other CLIs")
32
- .option("-t, --target <targets...>", "sync targets (gemini, codex, opencode, kiro, cursor, kimi, aider)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi", "aider"])
33
+ .option("-t, --target <targets...>", "sync targets (gemini, codex, opencode, kiro, cursor, kimi, vibe, aider)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi", "vibe", "aider"])
33
34
  .option("--dry-run", "preview mode, no files will be written", false)
34
35
  .option("--no-backup", "skip backup")
35
36
  .option("--skip-oauth", "skip MCP servers that require OAuth", false)
37
+ .option("-s, --server <names...>", "sync only specified MCP servers by name")
36
38
  .option("--codex-home <path>", "Codex config directory (default: ~/.codex, or specify project-level .codex/)")
37
39
  .option("--kimi-home <path>", "Kimi config directory (default: ~/.kimi, or specify project-level .kimi/)")
40
+ .option("--vibe-home <path>", "Vibe config directory (default: ~/.vibe, or specify project-level .vibe/)")
38
41
  .option("--report <format>", "output format: text or json", "text")
39
42
  .option("-v, --verbose", "show detailed output", false)
40
43
  .action(async (opts) => {
@@ -43,8 +46,10 @@ program
43
46
  const skipBackup = !opts.backup;
44
47
  const verbose = opts.verbose;
45
48
  const skipOAuth = opts.skipOauth;
49
+ const serverFilter = opts.server;
46
50
  const codexHome = opts.codexHome;
47
51
  const kimiHome = opts.kimiHome;
52
+ const vibeHome = opts.vibeHome;
48
53
  const reportFormat = opts.report;
49
54
  const jsonReport = reportFormat === "json";
50
55
  if (reportFormat !== "text" && reportFormat !== "json") {
@@ -62,6 +67,10 @@ program
62
67
  if (skipOAuth) {
63
68
  servers = servers.filter((s) => !isOAuthOnlyServer(s));
64
69
  }
70
+ if (serverFilter && serverFilter.length > 0) {
71
+ const filterSet = new Set(serverFilter);
72
+ servers = servers.filter((s) => filterSet.has(s.name));
73
+ }
65
74
  if (!jsonReport) {
66
75
  console.log(` Found ${servers.length} MCP server(s)\n`);
67
76
  }
@@ -85,11 +94,12 @@ program
85
94
  // 2. Backup
86
95
  const codexConfigPath = resolveCodexConfigPath(codexHome);
87
96
  const kimiConfigPath = resolveKimiMcpConfigPath(kimiHome);
97
+ const vibeConfigPath = resolveVibeConfigPath(vibeHome);
88
98
  if (!skipBackup && !dryRun) {
89
99
  if (!jsonReport) {
90
100
  console.log("💾 Backing up config files...");
91
101
  }
92
- const backupDir = createBackup(getFilesToBackup(targets, codexConfigPath, kimiConfigPath));
102
+ const backupDir = createBackup(getFilesToBackup(targets, codexConfigPath, kimiConfigPath, vibeConfigPath));
93
103
  if (!jsonReport) {
94
104
  console.log(` Backup directory: ${backupDir}\n`);
95
105
  }
@@ -154,6 +164,19 @@ program
154
164
  printResult(result.added, result.skipped);
155
165
  }
156
166
  }
167
+ else if (target === "vibe") {
168
+ const result = writeToVibe(servers, dryRun, vibeHome);
169
+ targetReports.push({
170
+ target,
171
+ added: result.added,
172
+ skipped: result.skipped,
173
+ configPath: result.configPath,
174
+ });
175
+ if (!jsonReport) {
176
+ console.log(` Target: ${result.configPath}`);
177
+ printResult(result.added, result.skipped);
178
+ }
179
+ }
157
180
  if (!jsonReport) {
158
181
  console.log();
159
182
  }
@@ -214,7 +237,7 @@ program
214
237
  program
215
238
  .command("diff")
216
239
  .description("Compare MCP settings between Claude Code and other CLIs")
217
- .option("-t, --target <targets...>", "comparison targets (gemini, codex, opencode, kiro, cursor, kimi)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi"])
240
+ .option("-t, --target <targets...>", "comparison targets (gemini, codex, opencode, kiro, cursor, kimi, vibe)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi", "vibe"])
218
241
  .option("--kimi-home <path>", "Kimi config directory (default: ~/.kimi, or specify project-level .kimi/)")
219
242
  .option("--report <format>", "output format: text or json", "text")
220
243
  .action((opts) => {
@@ -254,6 +277,19 @@ program
254
277
  note: codexNote,
255
278
  });
256
279
  }
280
+ else if (target === "vibe") {
281
+ const vibeNote = "use 'vibe' to view (TOML array format)";
282
+ if (!jsonReport) {
283
+ console.log(` Vibe: ${vibeNote}`);
284
+ }
285
+ targetReports.push({
286
+ target: "vibe",
287
+ shared: [],
288
+ onlyInSource: [],
289
+ onlyInTarget: [],
290
+ note: vibeNote,
291
+ });
292
+ }
257
293
  else if (Object.hasOwn(diffConfigs, target)) {
258
294
  const { path, key } = diffConfigs[target];
259
295
  const names = readExistingServerNames(path, key);
@@ -280,7 +316,7 @@ program
280
316
  program
281
317
  .command("doctor")
282
318
  .description("Detect MCP config drift between Claude Code and target CLIs")
283
- .option("-t, --target <targets...>", "doctor targets (gemini, codex, opencode, kiro, cursor, kimi)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi"])
319
+ .option("-t, --target <targets...>", "doctor targets (gemini, codex, opencode, kiro, cursor, kimi, vibe)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi", "vibe"])
284
320
  .option("--skip-oauth", "ignore OAuth-only Claude servers", false)
285
321
  .option("--fix", "auto-run reconcile when drift is detected", false)
286
322
  .option("--dry-run", "when used with --fix, preview without writing", false)
@@ -288,6 +324,7 @@ program
288
324
  .option("--report <format>", "output format: text or json", "text")
289
325
  .option("--codex-home <path>", "Codex config directory (default: ~/.codex, or specify project-level .codex/)")
290
326
  .option("--kimi-home <path>", "Kimi config directory (default: ~/.kimi, or specify project-level .kimi/)")
327
+ .option("--vibe-home <path>", "Vibe config directory (default: ~/.vibe, or specify project-level .vibe/)")
291
328
  .action((opts) => {
292
329
  const targets = opts.target;
293
330
  const skipOAuth = opts.skipOauth;
@@ -297,6 +334,7 @@ program
297
334
  const reportFormat = opts.report;
298
335
  const codexHome = opts.codexHome;
299
336
  const kimiHome = opts.kimiHome;
337
+ const vibeHome = opts.vibeHome;
300
338
  const jsonReport = reportFormat === "json";
301
339
  if (reportFormat !== "text" && reportFormat !== "json") {
302
340
  console.error(`Invalid --report: ${reportFormat}. Use "text" or "json".`);
@@ -315,6 +353,7 @@ program
315
353
  skipOAuth,
316
354
  codexHome,
317
355
  kimiHome,
356
+ vibeHome,
318
357
  });
319
358
  if (fixed.status === "failed") {
320
359
  if (fixed.reason === "doctor_parse") {
@@ -335,7 +374,7 @@ program
335
374
  console.log("✅ Auto-fix completed via reconcile.");
336
375
  return;
337
376
  }
338
- const report = runDoctor(targets, { skipOAuth, codexHome, kimiHome });
377
+ const report = runDoctor(targets, { skipOAuth, codexHome, kimiHome, vibeHome });
339
378
  if (jsonReport) {
340
379
  console.log(formatDoctorReport(report));
341
380
  if (report.hasErrors)
@@ -381,7 +420,7 @@ program
381
420
  program
382
421
  .command("validate")
383
422
  .description("Validate MCP schema and target capability compatibility")
384
- .option("-t, --target <targets...>", "validation targets (gemini, codex, opencode, kiro, cursor, kimi)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi"])
423
+ .option("-t, --target <targets...>", "validation targets (gemini, codex, opencode, kiro, cursor, kimi, vibe)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi", "vibe"])
385
424
  .option("--skip-oauth", "ignore OAuth-only Claude servers", false)
386
425
  .option("--fix", "auto-run reconcile after validation passes", false)
387
426
  .option("--dry-run", "when used with --fix, preview without writing", false)
@@ -389,6 +428,7 @@ program
389
428
  .option("--report <format>", "output format: text or json", "text")
390
429
  .option("--codex-home <path>", "Codex config directory (used by --fix for reconcile)")
391
430
  .option("--kimi-home <path>", "Kimi config directory (used by --fix for reconcile)")
431
+ .option("--vibe-home <path>", "Vibe config directory (used by --fix for reconcile)")
392
432
  .action((opts) => {
393
433
  const targets = opts.target;
394
434
  const skipOAuth = opts.skipOauth;
@@ -398,6 +438,7 @@ program
398
438
  const reportFormat = opts.report;
399
439
  const codexHome = opts.codexHome;
400
440
  const kimiHome = opts.kimiHome;
441
+ const vibeHome = opts.vibeHome;
401
442
  const jsonReport = reportFormat === "json";
402
443
  if (reportFormat !== "text" && reportFormat !== "json") {
403
444
  console.error(`Invalid --report: ${reportFormat}. Use "text" or "json".`);
@@ -453,6 +494,7 @@ program
453
494
  skipOAuth,
454
495
  codexHome,
455
496
  kimiHome,
497
+ vibeHome,
456
498
  });
457
499
  if (fixed.status === "failed") {
458
500
  if (fixed.reason === "doctor_parse") {
@@ -476,20 +518,24 @@ program
476
518
  program
477
519
  .command("reconcile")
478
520
  .description("Validate + detect drift + sync only missing MCP servers")
479
- .option("-t, --target <targets...>", "reconcile targets (gemini, codex, opencode, kiro, cursor, kimi)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi"])
521
+ .option("-t, --target <targets...>", "reconcile targets (gemini, codex, opencode, kiro, cursor, kimi, vibe)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi", "vibe"])
480
522
  .option("--dry-run", "preview mode, no files will be written", false)
481
523
  .option("--no-backup", "skip backup")
482
524
  .option("--skip-oauth", "ignore OAuth-only Claude servers", false)
525
+ .option("-s, --server <names...>", "reconcile only specified MCP servers by name")
483
526
  .option("--codex-home <path>", "Codex config directory (default: ~/.codex, or specify project-level .codex/)")
484
527
  .option("--kimi-home <path>", "Kimi config directory (default: ~/.kimi, or specify project-level .kimi/)")
528
+ .option("--vibe-home <path>", "Vibe config directory (default: ~/.vibe, or specify project-level .vibe/)")
485
529
  .option("--report <format>", "output format: text or json", "text")
486
530
  .action((opts) => {
487
531
  const targets = opts.target;
488
532
  const dryRun = opts.dryRun;
489
533
  const skipBackup = !opts.backup;
490
534
  const skipOAuth = opts.skipOauth;
535
+ const serverFilter = opts.server;
491
536
  const codexHome = opts.codexHome;
492
537
  const kimiHome = opts.kimiHome;
538
+ const vibeHome = opts.vibeHome;
493
539
  const reportFormat = opts.report;
494
540
  const jsonReport = reportFormat === "json";
495
541
  if (reportFormat !== "text" && reportFormat !== "json") {
@@ -503,8 +549,10 @@ program
503
549
  dryRun,
504
550
  skipBackup,
505
551
  skipOAuth,
552
+ serverFilter,
506
553
  codexHome,
507
554
  kimiHome,
555
+ vibeHome,
508
556
  });
509
557
  if (jsonReport) {
510
558
  console.log(formatReconcileReport(result));
@@ -560,7 +608,7 @@ program
560
608
  program
561
609
  .command("sync-instructions")
562
610
  .description("Sync CLAUDE.md instruction files to other AI agent formats")
563
- .option("-t, --target <targets...>", "sync targets (gemini, codex, opencode, kiro, cursor, kimi)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi"])
611
+ .option("-t, --target <targets...>", "sync targets (gemini, codex, opencode, kiro, cursor, kimi, vibe)", ["gemini", "codex", "opencode", "kiro", "cursor", "kimi", "vibe"])
564
612
  .option("--global", "sync global config (~/.claude/CLAUDE.md)", false)
565
613
  .option("--local", "sync project-level CLAUDE.md in current directory (prefers ./.claude/CLAUDE.md, falls back to ./CLAUDE.md)", false)
566
614
  .option("--dry-run", "preview mode, no files will be written", false)
@@ -732,6 +780,8 @@ function getTargetLabel(target) {
732
780
  return "OpenCode";
733
781
  if (target === "kimi")
734
782
  return "Kimi";
783
+ if (target === "vibe")
784
+ return "Vibe";
735
785
  return target.toUpperCase();
736
786
  }
737
787
  program.parse();