Migrate your AI coding agent configuration between 14 agents: Claude Code, OpenCode, Kilo Code, Cursor, Gemini CLI, Codex, Copilot CLI, Crush, Grok, omp, Muse Code, Pi, Cline, and Windsurf.
A local-first CLI tool that discovers, compares, and migrates coding agent environments with backup and rollback.
# From npm (installs the `agent-migrate` binary)
npm install -g @superdev2347832/agent-bridge
# From source
git clone https://github.com/ATLAS-DEV78423/AgentBridge.git
cd AgentBridge
npm install
npm linkRequires Node.js >= 22.
# See what's in your project
agent-migrate scan
# Preview a migration
agent-migrate plan claude-code opencode
# Do it
agent-migrate migrate claude-code opencode
# Undo if needed
agent-migrate rollback . <migration-id>
# Check configs for schema problems (exit 1 on errors — CI-friendly)
agent-migrate doctor
# Apply the safe auto-fixes (commented strict-JSON, divergent instructions)
agent-migrate fix
# Any direction works — e.g. back to Claude Code
agent-migrate migrate opencode claude-code
# Or sync one agent's config to every other agent in the project
agent-migrate migrate-all claude-code .| Command | Description |
|---|---|
scan [path] |
Detect every agent config present (all of them, not just the first) |
plan <source> <target> [path] |
Show what maps to what |
diff <source> <target> [path] |
Preview file changes |
migrate <source> <target> [path] [--dry-run] |
Scan + write in one step; --dry-run previews without writing |
migrate-all <source> [path] |
Sync to every other detected agent |
doctor [path] |
Validate detected agent configs against their documented schemas (exit 1 on errors) |
fix [path] [--dry-run] |
Apply safe auto-fixes with backup — e.g. strip comments from a strict-JSON config. --dry-run previews before/after without writing |
rollback <path> <migration-id> |
Restore from backup |
| Agent | ID | Project config | Instructions file |
|---|---|---|---|
| Claude Code | claude-code |
.claude/settings.json |
AGENTS.md |
| OpenCode | opencode |
opencode.json[c] |
AGENTS.md |
| Kilo Code | kilo |
.kilo/kilo.jsonc |
AGENTS.md |
| Cursor | cursor |
.cursor/mcp.json |
AGENTS.md |
| Gemini CLI | gemini |
.gemini/settings.json |
GEMINI.md |
| Codex | codex |
.codex/config.toml (TOML) |
AGENTS.md |
| Copilot CLI | copilot |
.copilot/mcp-config.json |
.github/copilot-instructions.md |
| Crush | crush |
.crush.json |
AGENTS.md |
| Grok | grok |
.mcp.json |
AGENTS.md |
| omp (Oh My Pi) | omp |
.pi/mcp.json |
AGENTS.md |
| Muse Code | muse-code |
— (instructions only) | MUSE_CODE.md |
| Pi | pi |
— (instructions only) | AGENTS.md |
| Cline | cline |
— (instructions only) | AGENTS.md |
| Windsurf | windsurf |
.codeium/windsurf/mcp_config.json |
AGENTS.md |
Honest caveats:
- Copilot CLI primarily reads MCP config from user-level
~/.copilot/mcp-config.json; project-level support varies by CLI version. Project files are migrated as-is — verify your install picks them up. - Muse Code and Pi document no project-scoped MCP config, so only instructions migrate for them.
- Cline reads workspace rules from
.clinerules/or.cline/rules/(either marks the project as Cline's) and fromAGENTS.md, so migrations into Cline writeAGENTS.md. Its MCP settings are user-level (~/.cline/data/settings/cline_mcp_settings.json, CLI:~/.cline/mcp.json) with no documented project-scoped equivalent — MCP servers are not migrated. Rule files inside.clinerules/are not scanned: a directory of rule files has no single-file equivalent to carry into another agent. - Hermes (Nous Research) and OpenClaw are intentionally unsupported: their configuration lives in global/gateway state with no repo-scoped files to migrate.
- Scan — finds
AGENTS.md,.claude/,opencode.json[c],.kilo/,.cursor/,.gemini/,.codex/,.copilot/,.crush.json,.mcp.json,.pi/,.clinerules/etc. - Plan — maps each resource via compatibility rules (DIRECT / ADAPTED / UNSUPPORTED)
- Migrate — writes target files, backing up originals; existing JSON/JSONC/TOML configs are merged, so your hand-added keys survive
- Rollback — restores everything from backup
MCP server configs are translated between formats (e.g. Claude's implicit stdio → OpenCode's explicit type: "stdio" → Kilo's array-form command → Codex's TOML tables).
| Direction | Instructions | MCP servers | Model settings |
|---|---|---|---|
| claude-code → opencode | ✓ | ✓ | ✓ |
| claude-code → kilo | ✓ | ✓ | ✓ |
| claude-code → cursor | ✓ | ✓ | ✗ |
| claude-code → gemini | ✓ | ✓ | ✗ |
| claude-code → codex | ✓ | ✓ | ✓ |
| claude-code → copilot | ✓ | ✓ | ✗ |
| claude-code → crush | ✓ | ✓ | ✗ |
| claude-code → grok | ✓ | ✓ | ✗ |
| claude-code → omp | ✓ | ✓ | ✗ |
| claude-code → muse-code | ✓ | ✗ | ✗ |
| claude-code → pi | ✓ | ✗ | ✗ |
| claude-code → cline | ✓ | ✗ | ✗ |
| claude-code → windsurf | ✓ | ✓ | ✗ |
| opencode → claude-code | ✓ | ✓ | ✓ |
| opencode → kilo | ✓ | ✓ | ✓ |
| opencode → cursor | ✓ | ✓ | ✗ |
| opencode → gemini | ✓ | ✓ | ✗ |
| opencode → codex | ✓ | ✓ | ✓ |
| opencode → copilot | ✓ | ✓ | ✗ |
| opencode → crush | ✓ | ✓ | ✗ |
| opencode → grok | ✓ | ✓ | ✗ |
| opencode → omp | ✓ | ✓ | ✗ |
| opencode → muse-code | ✓ | ✗ | ✗ |
| opencode → pi | ✓ | ✗ | ✗ |
| opencode → cline | ✓ | ✗ | ✗ |
| opencode → windsurf | ✓ | ✓ | ✗ |
| kilo → claude-code | ✓ | ✓ | ✓ |
| kilo → opencode | ✓ | ✓ | ✓ |
| kilo → cursor | ✓ | ✓ | ✗ |
| kilo → gemini | ✓ | ✓ | ✗ |
| kilo → codex | ✓ | ✓ | ✓ |
| kilo → copilot | ✓ | ✓ | ✗ |
| kilo → crush | ✓ | ✓ | ✗ |
| kilo → grok | ✓ | ✓ | ✗ |
| kilo → omp | ✓ | ✓ | ✗ |
| kilo → muse-code | ✓ | ✗ | ✗ |
| kilo → pi | ✓ | ✗ | ✗ |
| kilo → cline | ✓ | ✗ | ✗ |
| kilo → windsurf | ✓ | ✓ | ✗ |
| cursor → claude-code | ✓ | ✓ | ✗ |
| cursor → opencode | ✓ | ✓ | ✗ |
| cursor → kilo | ✓ | ✓ | ✗ |
| cursor → gemini | ✓ | ✓ | ✗ |
| cursor → codex | ✓ | ✓ | ✗ |
| cursor → copilot | ✓ | ✓ | ✗ |
| cursor → crush | ✓ | ✓ | ✗ |
| cursor → grok | ✓ | ✓ | ✗ |
| cursor → omp | ✓ | ✓ | ✗ |
| cursor → muse-code | ✓ | ✗ | ✗ |
| cursor → pi | ✓ | ✗ | ✗ |
| cursor → cline | ✓ | ✗ | ✗ |
| cursor → windsurf | ✓ | ✓ | ✗ |
| gemini → claude-code | ✓ | ✓ | ✗ |
| gemini → opencode | ✓ | ✓ | ✗ |
| gemini → kilo | ✓ | ✓ | ✗ |
| gemini → cursor | ✓ | ✓ | ✗ |
| gemini → codex | ✓ | ✓ | ✗ |
| gemini → copilot | ✓ | ✓ | ✗ |
| gemini → crush | ✓ | ✓ | ✗ |
| gemini → grok | ✓ | ✓ | ✗ |
| gemini → omp | ✓ | ✓ | ✗ |
| gemini → muse-code | ✓ | ✗ | ✗ |
| gemini → pi | ✓ | ✗ | ✗ |
| gemini → cline | ✓ | ✗ | ✗ |
| gemini → windsurf | ✓ | ✓ | ✗ |
| codex → claude-code | ✓ | ✓ | ✓ |
| codex → opencode | ✓ | ✓ | ✓ |
| codex → kilo | ✓ | ✓ | ✓ |
| codex → cursor | ✓ | ✓ | ✗ |
| codex → gemini | ✓ | ✓ | ✗ |
| codex → copilot | ✓ | ✓ | ✗ |
| codex → crush | ✓ | ✓ | ✗ |
| codex → grok | ✓ | ✓ | ✗ |
| codex → omp | ✓ | ✓ | ✗ |
| codex → muse-code | ✓ | ✗ | ✗ |
| codex → pi | ✓ | ✗ | ✗ |
| codex → cline | ✓ | ✗ | ✗ |
| codex → windsurf | ✓ | ✓ | ✗ |
| copilot → claude-code | ✓ | ✓ | ✗ |
| copilot → opencode | ✓ | ✓ | ✗ |
| copilot → kilo | ✓ | ✓ | ✗ |
| copilot → cursor | ✓ | ✓ | ✗ |
| copilot → gemini | ✓ | ✓ | ✗ |
| copilot → codex | ✓ | ✓ | ✗ |
| copilot → crush | ✓ | ✓ | ✗ |
| copilot → grok | ✓ | ✓ | ✗ |
| copilot → omp | ✓ | ✓ | ✗ |
| copilot → muse-code | ✓ | ✗ | ✗ |
| copilot → pi | ✓ | ✗ | ✗ |
| copilot → cline | ✓ | ✗ | ✗ |
| copilot → windsurf | ✓ | ✓ | ✗ |
| crush → claude-code | ✓ | ✓ | ✗ |
| crush → opencode | ✓ | ✓ | ✗ |
| crush → kilo | ✓ | ✓ | ✗ |
| crush → cursor | ✓ | ✓ | ✗ |
| crush → gemini | ✓ | ✓ | ✗ |
| crush → codex | ✓ | ✓ | ✗ |
| crush → copilot | ✓ | ✓ | ✗ |
| crush → grok | ✓ | ✓ | ✗ |
| crush → omp | ✓ | ✓ | ✗ |
| crush → muse-code | ✓ | ✗ | ✗ |
| crush → pi | ✓ | ✗ | ✗ |
| crush → cline | ✓ | ✗ | ✗ |
| crush → windsurf | ✓ | ✓ | ✗ |
| grok → claude-code | ✓ | ✓ | ✗ |
| grok → opencode | ✓ | ✓ | ✗ |
| grok → kilo | ✓ | ✓ | ✗ |
| grok → cursor | ✓ | ✓ | ✗ |
| grok → gemini | ✓ | ✓ | ✗ |
| grok → codex | ✓ | ✓ | ✗ |
| grok → copilot | ✓ | ✓ | ✗ |
| grok → crush | ✓ | ✓ | ✗ |
| grok → omp | ✓ | ✓ | ✗ |
| grok → muse-code | ✓ | ✗ | ✗ |
| grok → pi | ✓ | ✗ | ✗ |
| grok → cline | ✓ | ✗ | ✗ |
| grok → windsurf | ✓ | ✓ | ✗ |
| omp → claude-code | ✓ | ✓ | ✗ |
| omp → opencode | ✓ | ✓ | ✗ |
| omp → kilo | ✓ | ✓ | ✗ |
| omp → cursor | ✓ | ✓ | ✗ |
| omp → gemini | ✓ | ✓ | ✗ |
| omp → codex | ✓ | ✓ | ✗ |
| omp → copilot | ✓ | ✓ | ✗ |
| omp → crush | ✓ | ✓ | ✗ |
| omp → grok | ✓ | ✓ | ✗ |
| omp → muse-code | ✓ | ✗ | ✗ |
| omp → pi | ✓ | ✗ | ✗ |
| omp → cline | ✓ | ✗ | ✗ |
| omp → windsurf | ✓ | ✓ | ✗ |
| muse-code → claude-code | ✓ | ✓ | ✗ |
| muse-code → opencode | ✓ | ✓ | ✗ |
| muse-code → kilo | ✓ | ✓ | ✗ |
| muse-code → cursor | ✓ | ✓ | ✗ |
| muse-code → gemini | ✓ | ✓ | ✗ |
| muse-code → codex | ✓ | ✓ | ✗ |
| muse-code → copilot | ✓ | ✓ | ✗ |
| muse-code → crush | ✓ | ✓ | ✗ |
| muse-code → grok | ✓ | ✓ | ✗ |
| muse-code → omp | ✓ | ✓ | ✗ |
| muse-code → pi | ✓ | ✗ | ✗ |
| muse-code → cline | ✓ | ✗ | ✗ |
| muse-code → windsurf | ✓ | ✓ | ✗ |
| pi → claude-code | ✓ | ✓ | ✗ |
| pi → opencode | ✓ | ✓ | ✗ |
| pi → kilo | ✓ | ✓ | ✗ |
| pi → cursor | ✓ | ✓ | ✗ |
| pi → gemini | ✓ | ✓ | ✗ |
| pi → codex | ✓ | ✓ | ✗ |
| pi → copilot | ✓ | ✓ | ✗ |
| pi → crush | ✓ | ✓ | ✗ |
| pi → grok | ✓ | ✓ | ✗ |
| pi → omp | ✓ | ✓ | ✗ |
| pi → muse-code | ✓ | ✗ | ✗ |
| pi → cline | ✓ | ✗ | ✗ |
| pi → windsurf | ✓ | ✓ | ✗ |
| cline → claude-code | ✓ | ✓ | ✗ |
| cline → opencode | ✓ | ✓ | ✗ |
| cline → kilo | ✓ | ✓ | ✗ |
| cline → cursor | ✓ | ✓ | ✗ |
| cline → gemini | ✓ | ✓ | ✗ |
| cline → codex | ✓ | ✓ | ✗ |
| cline → copilot | ✓ | ✓ | ✗ |
| cline → crush | ✓ | ✓ | ✗ |
| cline → grok | ✓ | ✓ | ✗ |
| cline → omp | ✓ | ✓ | ✗ |
| cline → muse-code | ✓ | ✗ | ✗ |
| cline → pi | ✓ | ✗ | ✗ |
| cline → windsurf | ✓ | ✓ | ✗ |
| windsurf → claude-code | ✓ | ✓ | ✗ |
| windsurf → opencode | ✓ | ✓ | ✗ |
| windsurf → kilo | ✓ | ✓ | ✗ |
| windsurf → cursor | ✓ | ✓ | ✗ |
| windsurf → gemini | ✓ | ✓ | ✗ |
| windsurf → codex | ✓ | ✓ | ✗ |
| windsurf → copilot | ✓ | ✓ | ✗ |
| windsurf → crush | ✓ | ✓ | ✗ |
| windsurf → grok | ✓ | ✓ | ✗ |
| windsurf → omp | ✓ | ✓ | ✗ |
| windsurf → muse-code | ✓ | ✗ | ✗ |
| windsurf → pi | ✓ | ✗ | ✗ |
| windsurf → cline | ✓ | ✗ | ✗ |
Notes:
- Instructions land at the target's own filename —
AGENTS.mdfor most,GEMINI.mdfor Gemini CLI,MUSE_CODE.mdfor Muse Code,.github/copilot-instructions.mdfor Copilot CLI. Agent-specific names never leak into other targets. - MCP servers are translated to each target's dialect: explicit vs inferred
type(Cursor requirestype: "stdio", Gemini and Codex infer from shape, Kilo wants array-formcommandwithenvironment, Crush defaults stdio but tags remote ashttp). Agents without a project MCP config (muse-code, pi, cline) are honest ✗. - Model settings flow only where the target has a real field:
model(+permissionsfor claude-code,maxTokensfor kilo) in JSON/JSONC configs,modelin Codex's TOML. The other targets store no model-equivalent fields — those ✗s are by design, not gaps.
npm test # run tests
npm run typecheck # type check
npm run build # compile to dist/
bash scripts/smoke.sh # smoke-test the compiled CLI (run npm run build first)Maintainers: see RELEASING.md for the release flow and
NPM_TOKEN setup. Contributions welcome — see CONTRIBUTING.md.
MIT