Migrate conversation history between AI coding agents
Project description
agent-migrator
A CLI tool for migrating conversation history between AI coding tools.
Supported Coding Agents
- Claude Code (Anthropic)
- Codex (OpenAI)
- Gemini CLI (Google)
- Cursor
All pairs are supported bidirectionally.
Setup
Requires uv.
Install globally (recommended):
uv tool install agent-migrator
Or run without installing:
uvx agent-migrator
Usage
Interactive
Run from inside a project directory:
agent-migrator
The CLI walks you through:
- Tool selection — choose source and destination.
- Conversation selection — pick conversations to migrate, sorted most-recent-first.
- Migration progress — each conversation is processed in sequence;
Ctrl+Ccancels and rolls back. - Summary — a results table shows successes and errors.
Cursor: the project path must be a directory that has been opened as a workspace in Cursor at least once.
Non-interactive
Two subcommands expose the same engine for scripting and agentic use. Both accept --dir <path> (defaults to cwd) and print JSON to stdout; errors go to stderr as {"error": "..."} with exit 1.
List conversations:
agent-migrator list --from claude-code --dir /path/to/project
[{"id": "63ec7bb1-...", "name": "pwa-capabilities-demo", "updated_at": "2026-05-21T23:23:00", ...}]
Migrate a conversation:
agent-migrator move --from claude-code --to codex --id 63ec7bb1-... --dir /path/to/project
[{"source_id": "63ec7bb1-...", "destination_id": "019e51f7-...", "name": "pwa-capabilities-demo"}]
Omit --id to migrate all conversations for the project. Run agent-migrator list --help or agent-migrator move --help for full options.
What gets migrated
All pairs support:
| Feature | Status |
|---|---|
| Text messages (user and assistant) | ✓ |
| Tool calls (Read, Write, Edit, Bash, Glob, and equivalents) | ✓ |
| Plan (presented natively in the destination tool's plan UI) | ✓ |
(Any) → Cursor is the one exception: plans are migrated as context documents but are not surfaced in Cursor's native plan mode UI.
(Any) → Cursor also requires a server upload to Cursor's ConvertOALToNAL endpoint to make all models available. If that fails (e.g. not logged in), the CLI offers a local fallback that provides full context but restricts model selection to Anthropic models.
How it works
Conversations are read into a tool-agnostic normalized format (TextMessage and ToolCallMessage turns) and written out in the destination format. Each tool is implemented as a AgentAdapter subclass in agent_migrator/agents/. This decouples all source/destination pairs — adding a new tool requires only a new adapter; all existing migration paths continue to work unchanged.
Extensibility
To add support for a new coding agent, implement the AgentAdapter interface in agent_migrator/agents/ and register it in cli.py:
class MyAgentAdapter(AgentAdapter):
name = "My Agent"
tool_id = "myagent"
def is_available(self) -> bool: ...
def list_conversations(self, project_path: Path) -> list[ConversationInfo]: ...
def read_conversation(self, conv_id: str, project_path: Path) -> Conversation: ...
def write_conversation(self, conv: Conversation, project_path: Path, *, use_local_backend: bool = False) -> str: ...
def delete_conversation(self, conv_id: str, project_path: Path) -> None: ...
Storage locations
| Tool | Location |
|---|---|
| Claude Code | ~/.claude/projects/<encoded-path>/<session>.jsonl |
| Codex | ~/.codex/sessions/YYYY/MM/DD/rollout-<timestamp>-<id>.jsonl |
| Gemini CLI | ~/.gemini/tmp/<project-slug>/chats/session-<timestamp>-<id>.jsonl |
| Cursor | %APPDATA%/Cursor/User/globalStorage/state.vscdb (SQLite) |
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agent_migrator-0.1.1.tar.gz.
File metadata
- Download URL: agent_migrator-0.1.1.tar.gz
- Upload date:
- Size: 73.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70bf7221a97f0489fa5f7698b2dca942975e94afc352fcf787554253f48bed42
|
|
| MD5 |
b6ed030623e4b0ed73d15bb9519bbfc1
|
|
| BLAKE2b-256 |
566a370396892d297e5aff89d06360c04d7a483898a3f44d6f5e4e293af8cbad
|
File details
Details for the file agent_migrator-0.1.1-py3-none-any.whl.
File metadata
- Download URL: agent_migrator-0.1.1-py3-none-any.whl
- Upload date:
- Size: 65.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.11 {"installer":{"name":"uv","version":"0.9.11"},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ac9fa5bc5980057bde3387b2b3ee3730ac3456901df13fe9f001dfc8d8778fc8
|
|
| MD5 |
3d2a109b6014d1c03e3da3487865f0b8
|
|
| BLAKE2b-256 |
111646cb1eab6d3b407465b5c03eb2f76ec58c771794dd17288f13e5312c3915
|