by xhluca
Migrate coding agent sessions across 18 harnesses (Claude Code, Codex, Pi, OpenCode, Copilot, Antigravity, Vibe, Muse, Qwen, Kimi, Cursor, etc.)
# Add to your Claude Code skills
git clone https://github.com/xhluca/session-migrateGuides for using ai agents skills like session-migrate.
Last scanned: 8/27/2026
{
"issues": [
{
"file": "README.md",
"line": 32,
"type": "remote-install",
"message": "Install command (remote install script piped to a shell — review the source before running): \"curl -LsSf https://session-migrate.github.io/install.sh | sh\"",
"severity": "low"
}
],
"status": "PASSED",
"scannedAt": "2026-08-27T15:03:07.038Z",
"npmAuditRan": true,
"pipAuditRan": true,
"promptInjectionRan": true
}See how session-migrate compares with popular alternatives.
session-migrate is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by xhluca. Migrate coding agent sessions across 18 harnesses (Claude Code, Codex, Pi, OpenCode, Copilot, Antigravity, Vibe, Muse, Qwen, Kimi, Cursor, etc.). It has 97 GitHub stars.
Yes. session-migrate passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/xhluca/session-migrate" and add it to your Claude Code skills directory (see the Installation section above).
session-migrate is primarily written in Python. It is open-source under xhluca on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh session-migrate against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
See comparison
curl -LsSf https://session-migrate.github.io/install.sh | sh
Or install with uv:
uv tool install session-migrate
pipx install session-migrate works too. Python 3.11+ and Linux are currently
supported. The full command is session-migrate; smigrate is the shorthand.
Already installed? Run uv tool upgrade session-migrate.
Inspect any native transcript without printing its conversation:
smigrate inspect ~/.claude/projects/-work/SESSION.jsonl
Move a Claude session into Codex and resume it from the same project directory:
smigrate transfer SESSION_UUID --from claude --to codex --cwd "$PWD"
codex resume NEW_SESSION_UUID
Or find an older session by its native title/name first:
smigrate catalog refresh
smigrate catalog search "oauth refresh" --format claude
smigrate transfer --title "oauth refresh" --from claude --to pi
Search is case-insensitive and every word must match, in any order. It searches native titles, names, and IDs—not conversation bodies. A few useful patterns:
# “Fix flaky PostgreSQL timeout” also matches this reversed keyword order.
smigrate catalog search "timeout postgres"
# Find a release conversation among archived Codex sessions from this month.
smigrate catalog search "release notes" --format codex \
--lifecycle archived --since 2026-08-01T00:00:00Z
# Opt in to matching a project directory when the title is vague.
smigrate catalog search "checkout api" --include-paths
catalog refresh is exhaustive inside the default, environment-selected,
registered, and explicitly discovered roots. It does not crawl your whole disk.
Choose the route on the project website, or replace the three bracketed values yourself:
Follow https://session-migrate.github.io/llms.txt to migrate a session from
[SOURCE]to[TARGET]. Session:[UUID OR TITLE]
The linked procedure is sandbox-tested with both Claude Code and Codex. See the agent workflow and verification.
Every listed format can be a source or target: 324 ordered routes, including same-format portable rewrites. Cursor deliberately transfers only ordered user/assistant text and is pinned to one exact Linux build; it is not a vendor-supported import API. Same-format migration creates a new independent session—it is not a byte-for-byte clone or a live sync. The matrix is exercised from one exact native-produced source per harness.
| Session data | Result | Notes |
|---|---|---|
| User and assistant messages | ✓ | Preserved in order on every route |
| Tool calls and results | ✓ / partial | Preserved when both adapters support the native shape |
| Images | ✓ / partial | Supported image blocks move; other media is format-dependent |
| Compaction summaries | ✓ / partial | Recreated where the target has a portable equivalent |
| Readable reasoning | Vibe-only portable rewrite | Vibe keeps its explicit readable field when rewritten to Vibe; other/private/signed traces never move |
| Session name, ID, and picker entry | ✓ / partial | The target gets a new native identity; OpenHands derives its picker title from the first user turn |
| Branches, forks, and subagents | Not flattened | Cataloged separately where detectable; migrate the parent session |
| Private or signed thinking | No | Model/provider-bound traces are deliberately omitted |
| Auth, hooks, policies, MCP, and runtime config | No | These remain with the source client |
Every omission or transformation is counted in a content-free migration manifest. The source session is never modified. Cursor intentionally accepts text only. See [Pi thinking traces](https://github.com/xhluca/session-migr