{"_id":"@dmxiaoshubao/faden","_rev":"5-6ed28a127de31b6697f9fa801663a3f0","name":"@dmxiaoshubao/faden","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@dmxiaoshubao/faden","version":"0.1.0","keywords":["codex","claude","cli","session","terminal","productivity"],"license":"MIT","_id":"@dmxiaoshubao/faden@0.1.0","maintainers":[{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"}],"homepage":"https://github.com/dmxiaoshubao/faden#readme","bugs":{"url":"https://github.com/dmxiaoshubao/faden/issues"},"bin":{"faden":"dist/cli.js"},"dist":{"shasum":"22cc1223ba5a7374a37c61c186b6bcfcf11a5026","tarball":"https://registry.npmjs.org/@dmxiaoshubao/faden/-/faden-0.1.0.tgz","fileCount":19,"integrity":"sha512-JAmuhm53UsjjziegxwePRRZ4eF09DAB1ede0PvcDVw/GPawP3WizW0PXQ9BV5dOPaV24xiEUxaLHeuc22wbl2w==","signatures":[{"sig":"MEQCIDr0sTOh1Sv65ZQXa0aoR02d6EaXE/phKdlkHzhu5j/7AiAjeRzg/xSrjjFByC1QgObGLaHCM2JbNGJ2Rqnl4o4veQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":81768},"engines":{"node":">=18"},"gitHead":"bdc788621f8ca6a08640b6ba61188e73567daa60","scripts":{"test":"npm run build && node --test dist/test/*.test.js","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm test"},"_npmUser":{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"},"repository":{"url":"git+https://github.com/dmxiaoshubao/faden.git","type":"git"},"_npmVersion":"10.9.4","description":"Local Codex / Claude session management CLI","directories":{},"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/faden_0.1.0_1774497362086_0.9437132751743298","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dmxiaoshubao/faden","version":"0.2.0","keywords":["codex","claude","cli","session","terminal","productivity"],"license":"MIT","_id":"@dmxiaoshubao/faden@0.2.0","maintainers":[{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"}],"homepage":"https://github.com/dmxiaoshubao/faden#readme","bugs":{"url":"https://github.com/dmxiaoshubao/faden/issues"},"bin":{"faden":"dist/cli.js"},"dist":{"shasum":"44bde9d0b558ccbe27b2e8eb857f56b1fb74eed7","tarball":"https://registry.npmjs.org/@dmxiaoshubao/faden/-/faden-0.2.0.tgz","fileCount":20,"integrity":"sha512-au0nnGq5dbaeGw7SI7qh3sCRFyMZVcBLXyhbNVG83sSXZButvNid5mF21TAw/orhKMHZWEOS8kaDa7LNjz2xxA==","signatures":[{"sig":"MEQCIGwroanLUNpjXOn97WtfsR1Mt6P+KXYrFAHMaofem4u8AiAWH6rhffdJAf/ot/5pauKlDOIxXuTV/mZwDdqIc2/BMA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":93980},"engines":{"node":">=22"},"gitHead":"5e46b08413ab53459dd9ba4c832ae14345d5e561","scripts":{"test":"npm run build && node --test dist/test/*.test.js","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm test"},"_npmUser":{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"},"repository":{"url":"git+https://github.com/dmxiaoshubao/faden.git","type":"git"},"_npmVersion":"10.9.4","description":"Local Codex / Claude session management CLI","directories":{},"_nodeVersion":"22.21.1","dependencies":{"ink":"^7.0.1","react":"^19.2.0","@types/react":"^19.2.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/faden_0.2.0_1776914772606_0.40359624639400105","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@dmxiaoshubao/faden","version":"0.2.1","keywords":["codex","claude","cli","session","terminal","productivity"],"license":"MIT","_id":"@dmxiaoshubao/faden@0.2.1","maintainers":[{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"}],"homepage":"https://github.com/dmxiaoshubao/faden#readme","bugs":{"url":"https://github.com/dmxiaoshubao/faden/issues"},"bin":{"faden":"dist/cli.js"},"dist":{"shasum":"5e4a2005fbf826dfd7379899e58dfe68db59d9b9","tarball":"https://registry.npmjs.org/@dmxiaoshubao/faden/-/faden-0.2.1.tgz","fileCount":20,"integrity":"sha512-3NJH/8u6k81NlNzsBiAr9/ZwWbBIhB4Z7Yr0ikTj6j6NapUO4FZDNvAy7xaMtDw2O5I078mLDEswTyqvfbqMDw==","signatures":[{"sig":"MEUCIBAE23Q8VeHuKWOgX7QjuxIdfmFf18B5WygstGrIf6HzAiEAxTyp4D4+4o6pJ6evGYWfnfN1S2ipcxVKI3MDa+mxPdo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97396},"engines":{"node":">=22"},"gitHead":"2833e8fd3aec520933e18f6fbdb44861e0ef4571","scripts":{"test":"npm run build && node --test dist/test/*.test.js","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm test"},"_npmUser":{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"},"repository":{"url":"git+https://github.com/dmxiaoshubao/faden.git","type":"git"},"_npmVersion":"10.9.4","description":"Local Codex / Claude session management CLI","directories":{},"_nodeVersion":"22.21.1","dependencies":{"ink":"^7.0.1","react":"^19.2.0","@types/react":"^19.2.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/faden_0.2.1_1777261421364_0.2503474757014894","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@dmxiaoshubao/faden","version":"0.3.0","keywords":["codex","claude","cli","session","terminal","productivity"],"license":"MIT","_id":"@dmxiaoshubao/faden@0.3.0","maintainers":[{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"}],"homepage":"https://github.com/dmxiaoshubao/faden#readme","bugs":{"url":"https://github.com/dmxiaoshubao/faden/issues"},"bin":{"faden":"dist/cli.js"},"dist":{"shasum":"9ee505289aae0d795e02e8f8d0e47e996b2988a0","tarball":"https://registry.npmjs.org/@dmxiaoshubao/faden/-/faden-0.3.0.tgz","fileCount":21,"integrity":"sha512-t6i9C/D8W1IfaRGsr6ZVPMLLxlaC0vGm8eLieOMyvm46Y4NUmDvqpD6cs/tOXQBzJGqXZKHA2xa4wDeoyErrmQ==","signatures":[{"sig":"MEUCIQDWiMVpnrp6yW1OV7tNTECt+9fFUE2YySf0Bi6hoLiaGwIgIKaAHz9jdsLeO4HXLVd59wKy58dYggwQ0inaqcmT0SI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":112428},"engines":{"node":">=22"},"gitHead":"a1032cd0e89d0b026bb691d7196143e48bff0fe9","scripts":{"test":"npm run build && node --test dist/test/*.test.js","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm test"},"_npmUser":{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"},"repository":{"url":"git+https://github.com/dmxiaoshubao/faden.git","type":"git"},"_npmVersion":"10.9.4","description":"Local Codex / Claude session management CLI","directories":{},"_nodeVersion":"22.21.1","dependencies":{"ink":"^7.0.1","react":"^19.2.0","@types/react":"^19.2.2"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.9.3","@types/node":"^25.5.0"},"_npmOperationalInternal":{"tmp":"tmp/faden_0.3.0_1777544300050_0.8881195868250578","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@dmxiaoshubao/faden","version":"0.3.1","description":"Local Codex / Claude session management CLI","license":"MIT","repository":{"type":"git","url":"git+https://github.com/dmxiaoshubao/faden.git"},"homepage":"https://github.com/dmxiaoshubao/faden#readme","bugs":{"url":"https://github.com/dmxiaoshubao/faden/issues"},"bin":{"faden":"dist/cli.js"},"keywords":["codex","claude","cli","session","terminal","productivity"],"engines":{"node":">=22"},"scripts":{"build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","prepublishOnly":"npm test","test":"npm run build && node --test dist/test/*.test.js"},"devDependencies":{"@types/node":"^25.5.0","typescript":"^5.9.3"},"dependencies":{"@types/react":"^19.2.2","ink":"^7.0.1","react":"^19.2.0"},"_id":"@dmxiaoshubao/faden@0.3.1","gitHead":"546f2ca7efbff9f8111aba76723c2ad446a0ee2e","_nodeVersion":"22.21.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-nMKPa+xUoLm+xvLjNAiKWPoOV3Z3EwpFLLRJj7ptzgADs4fCox8O6d1MOTR0u3EwEKbzR57v4A2IlN3G7qSe5g==","shasum":"9c0f845eebf4b7fafc603d28fb16163046cbab27","tarball":"https://registry.npmjs.org/@dmxiaoshubao/faden/-/faden-0.3.1.tgz","fileCount":21,"unpackedSize":113940,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDEr+JfmPzt94COrsw+SjU/r6RWap3UVAFPQClVRA3DZAIgVWUw+ySQvPYFNoP394r2Jo2fAJ0rHZDK5qB/LMs1ALc="}]},"_npmUser":{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"},"directories":{},"maintainers":[{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/faden_0.3.1_1777559214318_0.30366375503043064"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-26T03:56:01.924Z","modified":"2026-04-30T14:26:54.583Z","0.1.0":"2026-03-26T03:56:02.222Z","0.2.0":"2026-04-23T03:26:12.744Z","0.2.1":"2026-04-27T03:43:41.507Z","0.3.0":"2026-04-30T10:18:20.202Z","0.3.1":"2026-04-30T14:26:54.485Z"},"bugs":{"url":"https://github.com/dmxiaoshubao/faden/issues"},"license":"MIT","homepage":"https://github.com/dmxiaoshubao/faden#readme","keywords":["codex","claude","cli","session","terminal","productivity"],"repository":{"type":"git","url":"git+https://github.com/dmxiaoshubao/faden.git"},"description":"Local Codex / Claude session management CLI","maintainers":[{"name":"dmxiaoshubao","email":"dmxiaoshubao@126.com"}],"readme":"# faden\n\n`faden` 是一个面向 `codex` 和 `claude` 的本地会话管理命令行工具，支持在 Windows、macOS 和 Linux 上统一完成会话新建、恢复、删除和别名绑定。\n\n英文说明见 [docs/README.en.md](./docs/README.en.md)。\n\n## 适用场景\n\n- 切换 `codex` key、账号或运行环境之后，仍希望回到原来的会话上下文继续工作\n- 想按项目目录快速找回历史会话，而不是手动翻找原始会话文件\n- 希望给会话补设、修改或清除一个更易记的本地别名\n- 同时支持 `codex` 和 `claude` 会话\n\n## 功能概览\n\n- 支持新建 `codex` / `claude` 会话\n- 支持在 IDE 中直接恢复历史会话\n- 支持在 macOS 上将 Codex 会话恢复到 Codex App\n- 支持按当前目录、指定目录或全部目录筛选会话\n- 支持按别名、原生标题、会话 ID 和工作目录做模糊搜索\n- 支持恢复会话并自动切换到原工作目录\n- 支持删除会话并同步维护上游索引文件\n- 支持为已有会话补设、修改或清除本地别名\n- 支持本地缓存会话摘要，降低重复解析 JSONL 的开销\n\n## 安装\n\n### 前置条件\n\n- Node.js `>= 22`\n- 已安装并可直接调用 `codex`\n- 如果要管理 Claude 会话，还需要已安装并可直接调用 `claude`\n\n### 使用 npm 安装\n\n```bash\nnpm install -g @dmxiaoshubao/faden\n```\n\n安装完成后可直接运行：\n\n```bash\nfaden --help\n```\n\n### 从源码运行\n\n```bash\nnpm install\nnpm run build\nnode dist/cli.js --help\n```\n\n## 命令说明\n\n### 新建会话\n\n```bash\nfaden add [codex|claude] [-p path] [-n name] [-- <agent args...>]\n```\n\n- 不传 `codex|claude` 时，会弹出交互选择器\n- `-p` / `--path` 用于指定工作目录，默认当前目录\n- `-n` / `--name` 用于给会话绑定本地别名，不会修改上游原生标题\n- `--` 之后的参数会原样透传给底层 CLI\n\n示例：\n\n```bash\nfaden add codex -p . -n 修复导入 -- --sandbox read-only --ask-for-approval on-request\nfaden add claude -n 继续实现 -- --permission-mode plan\n```\n\n别名绑定策略：\n\n- `claude` 在带 `-n` 时会预生成 `--session-id`，待会话真正落盘后再绑定别名\n- `codex` 会在退出后比较同目录前后的会话差集，只有唯一识别到新会话时才绑定别名\n\n### 恢复会话\n\n```bash\nfaden resume [codex|claude] [-a] [-k key] [-p path] [-- <agent args...>]\n```\n\n如果你更习惯在 IDE 或 Codex App 里继续工作，这个命令在选中会话后，可以直接选择打开方式，而不是只能回到终端。\n\n- 默认仅列出当前工作目录下的会话\n- `-a` / `--all` 用于列出所有目录的会话\n- `-p` / `--path` 用于只查看指定目录下的会话\n- `-k` / `--key` 用于按别名、标题、会话 ID 或目录做模糊过滤\n- 交互操作支持上下方向键选择，按 `Enter` 确认，按 `q` 或 `Ctrl+C` 取消\n- 选中会话后会再次选择打开方式，默认是终端恢复\n- macOS 上的 Codex 会话可选择 `Codex App 恢复`\n- 当前支持的 IDE 预设：`VS Code`、`Cursor`、`Trae`、`Windsurf`、`Antigravity`\n\n恢复方式：\n\n- `IDE 打开`\n- `codex` 会先用所选 IDE 打开会话原始项目，再通过 `${scheme}://openai.chatgpt/local/<sessionId>` 进入对应会话\n- `claude` 会先用所选 IDE 打开会话原始项目，再通过 `${scheme}://anthropic.claude-code/open?session=<sessionId>` 在插件标签页中打开对应会话\n- IDE 打开依赖对应 shell 命令和对应官方插件都已安装\n  当前内置 URI scheme：\n- `VS Code` -> `vscode://`\n- `Cursor` -> `cursor://`\n- `Trae` -> `trae://`\n- `Windsurf` -> `windsurf://`\n- `Antigravity` -> `antigravity://`\n- `Codex App 恢复`（仅 macOS 上的 Codex 会话）\n- 会先检测 Codex App 是否存在；未安装时会提示改用终端或 IDE 恢复\n- 若会话已存在于 Codex App 可见列表中（例如 App 直接创建或 IDE 来源的 Codex 会话），会跳过本地状态迁移；如果 App 已运行则直接跳转，如果未运行则先打开 App、等待 3 秒后再跳转\n- 若旧会话需要修正本地状态，会先备份 `~/.codex/state_5.sqlite` 和 rollout JSONL，再同步 `source`、`model_provider` 与 `session_meta`\n- 若迁移时 Codex App 正在运行，会提示确认是否由 faden 先关闭 App，避免 App 回写覆盖本地状态\n- 对需要启动 App 的场景，打开顺序为 `open -a \"Codex\"`，等待 3 秒，再触发 `codex://threads/<sessionId>`\n- `终端恢复（默认）`\n- `codex` 使用 `codex resume <sessionId> -C <session.cwd>`，默认沿用会话记录的工作目录并跳过 Codex 的 cwd 二次确认\n- `claude` 使用 `claude --resume <sessionId>`\n- 终端恢复前会先切换到会话原始工作目录\n- `-- <agent args...>` 仅在“终端恢复”模式下生效，IDE 打开不支持透传参数\n\n### 删除会话\n\n```bash\nfaden remove [codex|claude] [-a] [-k key] [-p path]\n```\n\n- 列表筛选逻辑与 `resume` 一致\n- 删除前会进行二次确认\n- 当前实现为硬删除，删除后不可恢复\n\n删除方式：\n\n- `codex` 会删除对应 `rollout-*.jsonl`，并从 `session_index.jsonl` 移除索引项\n- `claude` 会删除对应 `<sessionId>.jsonl`，并从 `sessions-index.json` 移除索引项\n- 删除过程采用“两阶段”处理，先重命名会话文件，再重写索引；若失败则回滚\n\n### 管理本地别名\n\n```bash\nfaden alias set [codex|claude] [-a] [-k key] [-p path] <name>\nfaden alias clear [codex|claude] [-a] [-k key] [-p path]\n```\n\n- `alias set` 用于为已有会话补设或更新本地别名\n- `alias clear` 用于清除已有本地别名\n- 会话筛选逻辑与 `resume` / `remove` 一致\n- 这里修改的是 `faden` 本地维护的 alias，不会修改上游原生会话标题\n\n## 本地数据说明\n\n`faden` 只维护自己的少量元数据，不复制上游完整会话内容。\n\n### 历史会话来源路径\n\n| 来源   | macOS                | Linux                | Windows                            | 可覆盖环境变量      | 实际读取的文件                   | 用途                                                       |\n| ------ | -------------------- | -------------------- | ---------------------------------- | ------------------- | -------------------------------- | ---------------------------------------------------------- |\n| Codex  | `~/.codex`           | `~/.codex`           | `%USERPROFILE%\\\\.codex`            | `CODEX_HOME`        | `sessions/**/rollout-*.jsonl`    | 读取会话正文、`sessionId`、`cwd`、时间、消息数、分支等信息 |\n| Codex  | `~/.codex`           | `~/.codex`           | `%USERPROFILE%\\\\.codex`            | `CODEX_HOME`        | `session_index.jsonl`            | 读取索引标题和索引时间，用于补全会话列表展示               |\n| Claude | `~/.claude/projects` | `~/.claude/projects` | `%USERPROFILE%\\\\.claude\\\\projects` | `CLAUDE_CONFIG_DIR` | `projects/*/*.jsonl`             | 读取会话正文、`sessionId`、`cwd`、时间、消息数、分支等信息 |\n| Claude | `~/.claude/projects` | `~/.claude/projects` | `%USERPROFILE%\\\\.claude\\\\projects` | `CLAUDE_CONFIG_DIR` | `projects/*/sessions-index.json` | 读取索引摘要、首条提示、修改时间、消息数、项目路径等信息   |\n\n说明：\n\n- 当设置 `CODEX_HOME` 时，Codex 的读取根目录会变成 `${CODEX_HOME}`\n- 当设置 `CLAUDE_CONFIG_DIR` 时，Claude 的读取根目录会变成 `${CLAUDE_CONFIG_DIR}`\n- `faden` 会同时结合原始会话文件和索引文件来生成最终的会话列表\n- 上面这几项是 `codex` / `claude` 当前默认使用的历史目录，`faden` 只是按这些位置读取\n\n别名元数据位置：\n\n- macOS: `~/Library/Application Support/faden/state.json`\n- Linux: `${XDG_CONFIG_HOME:-~/.config}/faden/state.json`\n- Windows: `%AppData%/faden/state.json`\n\n另外，`resume` 和 `remove` 会维护一份本地 `session-cache.json`，只缓存会话列表展示所需的关键信息。只有当会话文件或对应索引文件的 `mtime` 或 `size` 变化时，才会重新解析原始 JSONL。\n\n## 许可证\n\n本项目使用 MIT 协议，详见 `LICENSE`。\n","readmeFilename":"README.md"}