[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81488":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":12,"contributorsCount":12,"subscribersCount":12,"size":12,"stars1d":12,"stars7d":12,"stars30d":14,"stars90d":12,"forks30d":12,"starsTrendScore":12,"compositeScore":12,"rankGlobal":9,"rankLanguage":9,"license":15,"archived":16,"fork":16,"defaultBranch":17,"hasWiki":18,"hasPages":16,"topics":19,"createdAt":9,"pushedAt":9,"updatedAt":20,"readmeContent":21,"aiSummary":22,"trendingCount":12,"starSnapshotCount":12,"syncStatus":23,"lastSyncTime":24,"discoverSource":25},81488,"session-porter","liwala\u002Fsession-porter","liwala","Move AI coding sessions between Claude Code and Codex CLI",null,"TypeScript",30,0,29,1,"MIT License",false,"master",true,[],"2026-06-12 02:04:15","\u003Cp align=\"center\">\n  \u003Cimg src=\"assets\u002Fsession-porter-hero.svg\" alt=\"session-porter — move AI coding sessions between Claude Code and Codex CLI\" width=\"100%\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">session-porter\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>Move AI coding sessions between Claude Code and Codex CLI without losing context.\u003C\u002Fstrong>\u003Cbr \u002F>\n  Local-only JSONL conversion. No cloud service. No API keys.\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@liwala\u002Fsession-porter\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fv\u002F@liwala\u002Fsession-porter?style=flat-square&color=111111\" alt=\"npm version\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@liwala\u002Fsession-porter\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fnpm\u002Fdm\u002F@liwala\u002Fsession-porter?style=flat-square&color=111111\" alt=\"npm downloads\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fliwala\u002Fsession-porter\u002Fstargazers\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fliwala\u002Fsession-porter?style=flat-square&color=111111\" alt=\"GitHub stars\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002Fliwala\u002Fsession-porter?style=flat-square&color=111111\" alt=\"MIT license\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#install\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnpm_i--g-%40liwala%2Fsession--porter-111111?style=for-the-badge&logo=npm&logoColor=white\" alt=\"Install with npm\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"#commands\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fcommands-list_%7C_transfer_%7C_handoff_%7C_doctor-111111?style=for-the-badge\" alt=\"Commands\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"#package-safety\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flocal--only-no_keys-111111?style=for-the-badge\" alt=\"Local only, no keys\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#install\">Install\u003C\u002Fa> &bull;\n  \u003Ca href=\"#quick-start\">Quick Start\u003C\u002Fa> &bull;\n  \u003Ca href=\"#commands\">Commands\u003C\u002Fa> &bull;\n  \u003Ca href=\"#architecture\">Architecture\u003C\u002Fa> &bull;\n  \u003Ca href=\"#package-safety\">Safety\u003C\u002Fa>\n\u003C\u002Fp>\n\n---\n\nBoth tools store sessions as JSONL files on disk. session-porter reads, normalizes, and converts between them — so you can start a conversation in Claude Code and continue it in Codex (or vice versa).\n\n## Install\n\n```bash\nnpm install -g @liwala\u002Fsession-porter\n```\n\nOr clone and link:\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fliwala\u002Fsession-porter.git\ncd session-porter\nnpm install && npm run build && npm link\n```\n\n## Quick Start\n\n```bash\n# See what can be moved\nsession-porter list --claude -n 10\nsession-porter list --codex -n 10\n\n# Inspect one session before moving it\nsession-porter summary \u003Csession-id>\n\n# Move a Claude Code session into Codex\nsession-porter transfer \u003Csession-id> --from claude --to codex --mode compact\n\n# Continue the moved session\ncodex resume \u003Csession-id>\n```\n\n## Commands\n\n### list — Browse sessions\n\n```bash\nsession-porter list              # All sessions (Claude + Codex), sorted by date\nsession-porter list --claude     # Claude Code sessions only\nsession-porter list --codex      # Codex CLI sessions only\nsession-porter list -n 10        # Limit results\n```\n\n### show — Read a session transcript\n\n```bash\nsession-porter show \u003Csession-id>          # User\u002Fassistant pairs\nsession-porter show \u003Csession-id> --tools  # Include tool calls\n```\n\nSession IDs are prefix-matched — first 8 characters are enough.\n\n### summary — Quick session overview\n\n```bash\nsession-porter summary \u003Csession-id>\n```\n\nShows turn counts, tool operations, files touched, and token usage.\n\n### export — Convert to a file format\n\n```bash\nsession-porter export \u003Cid> -f json       # Clean user\u002Fassistant JSON\nsession-porter export \u003Cid> -f markdown   # Readable markdown\nsession-porter export \u003Cid> -f codex     # Codex CLI native JSONL\nsession-porter export \u003Cid> -f claude    # Claude Code native JSONL\nsession-porter export \u003Cid> -f json -o out.json  # Write to file\n```\n\n### transfer — Move a session to another agent\n\n```bash\n# Claude Code → Codex CLI\nsession-porter transfer \u003Csession-id> --to codex\n\n# Codex CLI → Claude Code\nsession-porter transfer \u003Csession-id> --to claude\n\n# Transfer modes:\nsession-porter transfer \u003Cid> --to codex --mode raw          # Exact chat (default)\nsession-porter transfer \u003Cid> --to codex --mode full         # Chat + handoff context\nsession-porter transfer \u003Cid> --to codex --mode compact      # Handoff + user\u002Fassistant only\nsession-porter transfer \u003Cid> --to codex --mode resume-only  # Just a context brief\n```\n\nTransfer writes the converted session directly into the target tool's session directory and registers it in the Codex SQLite database (for `codex resume`).\n\n### continue — Transfer and launch the target agent\n\n```bash\nsession-porter continue \u003Csession-id> --in codex\nsession-porter continue \u003Csession-id> --in claude --mode full\n```\n\nTransfers the session, then spawns the target CLI so you can keep working immediately.\n\n### fork — Copy part of a session to another agent\n\n```bash\nsession-porter fork \u003Csession-id> --to codex              # Full fork\nsession-porter fork \u003Csession-id> --to codex --last-n 3   # Last 3 user turns only\nsession-porter fork \u003Csession-id> --to claude --from-turn 5  # From turn 5 onwards\n```\n\nOriginal session stays untouched.\n\n### handoff — Generate a context summary\n\n```bash\nsession-porter handoff \u003Csession-id>              # Print handoff JSON + resume prompt\nsession-porter handoff \u003Csession-id> -o handoff.md  # Save to file\n```\n\nProduces a compressed context brief you can paste into any agent (including ones without adapters).\n\n### search — Full-text search across all sessions\n\n```bash\nsession-porter search \"database migration\"       # Text search\nsession-porter search \"fn\\s+\\w+\" --regex         # Regex search\nsession-porter search \"bug\" --agent codex        # Filter by agent\nsession-porter search \"deploy\" -n 5              # Limit results\n```\n\n### stats — Aggregate statistics\n\n```bash\nsession-porter stats\n```\n\nShows session counts per agent, date range, total messages, and models used.\n\n### doctor — Health check\n\n```bash\nsession-porter doctor\nsession-porter doctor --cwd \u002Fpath\u002Fto\u002Fproject\n```\n\nChecks for broken SKILL.md files, missing CLAUDE.md, MCP server configs, and CLI availability.\n\n### adapters — List registered agents\n\n```bash\nsession-porter adapters\n```\n\n## Architecture\n\n### Universal Tool Taxonomy\n\nEvery tool call from any agent maps to a universal operation:\n\n| Op | Claude Code | Codex CLI |\n|----|-------------|-----------|\n| `file.read` | Read | `cat` via exec_command |\n| `file.write` | Write | `cat >` via exec_command |\n| `file.edit` | Edit | apply_patch \u002F sed |\n| `file.glob` | Glob | `rg --files -g` |\n| `search.content` | Grep | `rg` |\n| `shell.exec` | Bash | exec_command |\n| `web.search` | WebSearch | — |\n| `agent.spawn` | Agent | — |\n\n### Adapter Pattern\n\nAdding a new agent requires implementing the `AgentAdapter` interface:\n\n```typescript\ninterface AgentAdapter {\n  name: AgentType;\n  displayName: string;\n  hasSessions(): boolean;\n  listSessions(): SessionInfo[];\n  loadSession(sessionId: string): PortableSession | null;\n  writeSession(session: PortableSession): WriteResult;\n  mapToolToNative(tool: UniversalToolCall): { name: string; input: unknown };\n  mapToolFromNative(nativeName: string, input?: unknown): UniversalToolOp;\n}\n```\n\nRegister it in `src\u002Fadapters.ts` and it works with all commands automatically.\n\n### Session Storage\n\n| Tool | Path | Format |\n|------|------|--------|\n| Claude Code | `~\u002F.claude\u002Fprojects\u002F\u003Cslug>\u002F\u003Csession-id>.jsonl` | JSONL envelope: `{type, message, uuid, timestamp}` |\n| Codex CLI | `~\u002F.codex\u002Fsessions\u002FYYYY\u002FMM\u002FDD\u002Frollout-*.jsonl` | JSONL: `session_meta` + `response_item` + `event_msg` |\n\n### What transfers\n\n- User prompts (full text)\n- Assistant responses (full text)\n- Tool calls (name, input, output) — mapped to universal ops\n- Timestamps\n- Session metadata (model, cwd, title)\n\n### What doesn't transfer\n\n- Thinking blocks (Claude-specific, contains signatures)\n- Token usage \u002F billing data\n- System prompts and injected context\n- File history snapshots\n\n## Development\n\n```bash\nnpm install\nnpm run build    # Compile TypeScript\nnpm test         # Compile and run node:test tests\nnpm run pack:check  # Verify npm tarball contents\nnpm run dev      # Watch mode\nnode dist\u002Findex.js list  # Run directly\n```\n\n## Package safety\n\nThe published npm package includes only compiled files under `dist\u002F`, this\nREADME, and npm's required package metadata. It does not include local Claude or\nCodex session files, `.env` files, setup screenshots, generated archives, or\nproject planning folders.\n\n## Publishing\n\nBefore publishing, run:\n\n```bash\nnpm test\nnpm run pack:check\nnpm whoami\nnpm publish --access public\n```\n\nThe package does not require API keys. Do not commit npm tokens; authenticate\nlocally with `npm login` or publish through the GitHub release workflow using an\nnpm automation token stored only as the `NPM_TOKEN` repository secret.\n\n## License\n\nMIT\n","session-porter 是一个用于在 Claude Code 和 Codex CLI 之间迁移 AI 编码会话的工具，确保不会丢失上下文。该项目使用 TypeScript 编写，支持本地 JSONL 文件转换，无需云服务和 API 密钥，保障了数据的安全性和隐私性。其核心功能包括列出、查看、转移和继续会话，通过简单的命令行操作即可实现跨平台的会话管理。适用于需要在不同 AI 编程工具间切换工作环境的开发者，特别是在希望保留历史对话记录的情况下。",2,"2026-06-11 04:05:15","CREATED_QUERY"]