Skip to content
 
 

Latest commit

 

History

81 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Codex Session Toolkit

Codex Session Toolkit 是一个 TUI 优先的 Codex 工具箱。它围绕本地 ./codex_bundles/ 工作区,把 Codex Desktop / CLI 会话和自定义 Skills 组织成可浏览、可导出、可导入、可修复、可同步的 Bundle。

这个项目要解决的,是会话管理、Skills 管理、跨设备迁移和 GitHub 同步这些实际需求。它把分散在 ~/.codex/、Desktop 索引、CLI rollout、history、项目路径和 Skills 里的内容,统一整理成一套可落地的工作流:先在本地形成 Bundle,再按需要导入、修复、备份,或同步到一个独立的 GitHub Bundle 仓库。

Codex Session Toolkit 界面预览

解决什么问题

Codex 的会话数据、Desktop 索引、CLI rollout、history、项目路径、自定义 Skills 和跨设备文件,天然分散在不同位置。这个工具把这些分散内容变成一套围绕实际需求的工作流:

  • 会话管理:在 TUI 中浏览、搜索和筛选 Desktop / CLI 会话,查看标题、provider、cwd、rollout 路径、history 和详情,不需要手动翻 ~/.codex/
  • Skills 管理:把自定义 Skills 独立打包、导出、导入、恢复和清理,避免和会话数据混在一起。
  • 跨设备迁移:把会话导出为 Bundle,按机器、分类、项目和时间归档;目标机器再从 Bundle 导入,而不是直接复制散落的原始状态文件。
  • 项目级会话迁移:支持按项目路径筛选,按当前、勾选或全部匹配范围导出,导入时可以把源机器 cwd 映射到当前机器的项目路径。
  • GitHub 同步./codex_bundles/ 可以连接到一个独立 GitHub Bundle 仓库,支持状态检查、Pull、Push、远端更新时间检测和冲突保护。
  • 导入后修复:导入和修复流程会维护 session_index.jsonl、Desktop threads 表、workspace roots、侧栏顺序、provider 和线程标题,并把目标线程提升到最近线程池前部。
  • 清理和回退:可以在 TUI 中预览、勾选并删除归档会话;删除时会保护同 ID 的 active 会话索引和 Desktop 线程记录。导出、导入、修复、清理、GitHub 同步等关键动作支持 Dry-run;导入覆盖前会备份,备份可在 TUI 中恢复。

项目定位

围绕这些问题,工具当前提供 5 个功能域:

  1. Session / Browse:查看、搜索、筛选和按项目导出本机会话。
  2. Bundle / Transfer:浏览、校验、导出和导入会话 Bundle。
  3. Skills / Transfer:独立导出、导入和管理自定义 Skills。
  4. Repair / Maintenance:修复 Desktop 可见性、迁移 Provider、管理备份和清理旧副本。
  5. GitHub / Sync:把 ./codex_bundles/ 作为一个可同步工作区,连接独立 GitHub Bundle 仓库后进行 Pull / Push。

快速开始

macOS / Linux

chmod +x ./install.sh ./install.command ./codex-session-toolkit ./codex-session-toolkit.command
./install.sh
./codex-session-toolkit

macOS 可双击:

  • install.command
  • codex-session-toolkit.command

Windows

.\install.ps1
.\codex-session-toolkit.cmd

也可以双击 install.bat

安装脚本会在项目根目录创建隔离的 .venv/,不会写入系统 Python 环境。

查看版本:

./codex-session-toolkit --version

查看脚本和兼容 CLI 命令:

./codex-session-toolkit --advanced-help

TUI 主菜单

无参数启动进入 TUI。这是项目的主入口:

codex-session-toolkit

主菜单按功能域组织:

  1. Session / Browse
  2. Bundle / Transfer
  3. Skills / Transfer
  4. Repair / Maintenance
  5. GitHub / Sync

Session / Browse

用于查看、搜索、筛选和导出会话。

  • 浏览并导出最近会话
  • 搜索 session id、标题、预览、provider、cwd
  • 查看会话详情
  • 支持当前会话、勾选多条导出;按 a 选中全部匹配项后再按 e 导出
  • 按项目路径查看该项目下的会话
  • 支持按项目导出当前、勾选多条会话;按 a 选中全部匹配项后再按 e 导出

项目导出路径:

./codex_bundles/<machine>/sessions/project/<project>/<timestamp>/<session_id>/

Bundle / Transfer

用于管理会话 Bundle。

  • 浏览 ./codex_bundles/ 中的会话 Bundle,并可在浏览页勾选后删除本地 Bundle
  • 校验 Bundle manifest、session JSONL、history JSONL
  • 导出全部 Desktop 会话
  • 导出全部 active Desktop 会话
  • 导出全部 CLI 会话
  • 导入 Bundle 为会话使用单独入口,支持当前、勾选多条导入;按 a 选中全部匹配项后再按 i 导入
  • 导入 project 分类时,把源机器 cwd 映射到当前机器项目目录
  • 导入时维护 session_index.jsonl、Desktop threads 表、workspace roots 和侧栏状态
  • 多选/全部导入会把导入线程写入 Desktop 侧栏顺序和 workspace hint,并提升到 Desktop 最近线程池前部
  • 导入到 Desktop 时会提升导入线程的最近排序,但不会自动置顶,避免把多选或全选导入的会话全部变成 pinned
  • 选择显示到 Desktop 时,归档来源的 Bundle 会导入为 active 会话,避免只在 TUI 可见而不出现在 Desktop 主线程栏

导入如果会覆盖本地 rollout,会先生成 .bak.<timestamp> 备份。

Skills / Transfer

用于独立迁移自定义 Skills。

  • 浏览本机 Skills,默认只显示自定义 Skills
  • 在同一个 Skills 列表中导出当前、勾选多条自定义 Skills;按 a 选中全部匹配项后再按 e 导出
  • 浏览 standalone Skills Bundle
  • 在同一个 Skills Bundle 列表中导入当前、勾选多条 Bundle;按 a 选中全部匹配项后再按 i 导入
  • 删除本机自定义 Skills,删除前确认
  • 删除 Skills 列表支持 Space 多选、a 选中全部匹配自定义 Skills、x 删除选中/当前

.agents/skills/foo.codex/skills/foo 会按同一个相对 Skill 识别,避免重复导入。

Repair / Maintenance

用于 Provider 复制/迁移、Desktop 显示修复和安全清理。

  • 复制会话到当前 Provider:保留旧会话,创建一份带 cloned_from 关系的新 Provider 副本
  • 迁移会话到当前 Provider:直接修正现有会话的 Provider,并修复 Codex Desktop 显示
  • 修复 Desktop 有限最近线程池被旧记录占满、侧栏筛选/折叠状态遮挡、空 thread_source 和失效 threads
  • 删除归档会话
  • 删除已复制的旧 Provider 会话
  • 管理会话备份
  • 清理旧版重复副本
  • 可选把未登记 CLI 会话纳入 Desktop
  • 支持 Dry-run 预演

Desktop 修复默认只处理 active 会话;需要 archived 会话时,从 Repair / Maintenance 的修复入口中选择对应范围。修复会备份被改动的 Desktop state、SQLite 和索引文件。

删除已复制的旧 Provider 会话会先进入列表页。它只列出能通过新 Provider 副本里的 cloned_from 字段确认迁移关系的旧会话;没有对应新副本的旧会话不会被列出,也不会被删除。

删除归档会话会先进入列表页:

  • Enter / d 预览当前归档会话
  • Space 勾选或取消勾选
  • x 删除选中项;未勾选时删除当前项
  • a 选中全部匹配归档会话;随后按 x 删除选中项

删除只针对 ~/.codex/archived_sessions/ 下的归档 rollout。若同一个 session id 同时还有 active rollout,工具会保留 session_index.jsonl 中的 active 索引,并把 Desktop threads 记录指回 active 文件,避免误删后左侧线程栏丢失。

GitHub / Sync

用于同步 ./codex_bundles/,不用于同步项目源码。

菜单顺序:

  1. 连接独立 GitHub 仓库
  2. 连接/断开代理
  3. 查看 GitHub 同步状态
  4. 从 GitHub 拉取更新
  5. 推送本机更新到 GitHub

同步内容:

  • 会话 Bundle:sessions/
  • standalone Skills Bundle:skills/

同步方式:

  • 连接:连接一个独立 Bundle 仓库,可选择连接后首次推送。
  • 代理:配置本机代理接口;状态检查、拉取、推送都会使用它。
  • 拉取:从已连接仓库拉取远端 Bundle 更新。
  • 推送:提交本机 Bundle 变更,检查远端更新,必要时合并,再推送。

GitHub 同步规则

GitHub 同步按“用户先建仓库,再连接”的方式设计。

用户需要先在 GitHub 创建一个独立仓库,例如:

git@github.com:you/codex-bundles.git

然后在 TUI 中进入 GitHub / Sync -> 连接独立 GitHub 仓库 填写仓库地址。工具会拒绝连接到当前项目源码仓库 remote。

同步对象是 ./codex_bundles/ 工作区,范围包含会话 Bundle 和 standalone Skills Bundle。它不会把 ~/.codex/ 原始会话目录直接提交到 GitHub,也不会把 Bundle 混进本项目源码仓库。 工具会在 bundle 仓库自身的 git 命令里归一 credential helper,例如 Windows 记录的 gh.exe auth git-credential 会在 macOS/Linux 上转成可执行的 gh auth git-credential 或当前平台可用的 helper。

状态页

查看 GitHub 同步状态 会:

  • 先快速读取本地连接状态
  • 再用进度 UI 检查远端更新时间
  • 显示本地提交时间、远端提交时间、本地领先提交数、远端领先提交数
  • 显示本地待同步文件数量

这里的“领先”表示当前目标分支上的提交差异,不是远端分支数量。

普通首页、Bundle 页面、Skills 页面只读本地缓存状态,不会自动联网检查远端。

代理

连接/断开代理 用于 GitHub 同步链路。常见输入:

http://127.0.0.1:7890
socks5://127.0.0.1:7890
127.0.0.1:7890

未写协议时默认按 http:// 处理。配置后,状态检查、拉取和推送都会在执行 git 操作时注入代理环境;断开后停止注入。代理配置只保存在 ./codex_bundles/ 自己的 git 配置里,不会修改本项目源码仓库的 git remote,也不会写全局 git 配置。

拉取

从 GitHub 拉取更新 只使用已经连接好的 remote 和分支。TUI 中不会再要求用户重新输入仓库地址或分支。

拉取页只保留一个选择:

  • 从当前 remote/branch 拉取
  • Dry-run 预览
  • 返回

如果远端有新提交,同时本地 ./codex_bundles/ 还有未提交 Bundle 变更,拉取会保护性停止并提示先推送或清理本地变更。

推送

推送本机更新到 GitHub 会显示:

  • 推送目标 remote/branch
  • 同步范围
  • 待同步变更数量
  • 会话变更数量
  • Skills 变更数量

推送前会检查远端更新。可自动合并时自动合并;发生文件冲突时停止并列出冲突文件。

Dry-run 返回逻辑

支持预演的 TUI 动作都遵循同一个交互规则:

  1. 用户进入选择页。
  2. 选择 Dry-run。
  3. 查看预演结果。
  4. 按 Enter 回到刚才的选择页。
  5. 用户可以继续选择直接执行或返回。

这个逻辑覆盖 GitHub 拉取、GitHub 推送、GitHub 连接、项目导出、Desktop 修复、Provider 迁移和清理旧副本等流程。

常见流程

导出某个项目的会话

  1. 进入 Session / Browse
  2. 选择 按项目路径查看并导出会话
  3. 粘贴项目根目录。
  4. 查看匹配到的会话。
  5. e 导出当前会话;需要导出全部匹配会话时,先按 a 选中全部匹配项,再按 e 导出。
  6. 第一次可先 Dry-run。

从另一台机器导入项目会话

  1. 把另一台机器的 ./codex_bundles/ 拷贝过来,或从独立 GitHub Bundle 仓库拉取。
  2. 进入 Bundle / Transfer
  3. 选择 导入 Bundle 为会话
  4. s/m/l 筛选到 project Bundle,按 Space 勾选,或按 a 选中全部匹配项后再按 i 导入。
  5. 查看工具识别出的当前机器项目路径,必要时修改目标项目路径。
  6. 选择是否自动创建缺失目录。
  7. 执行导入。

导入不会强制进入 GitHub 拉取流程。用户手动拷贝 Bundle 后,可以直接导入。

同步自定义 Skills

源机器:

  1. 进入 Skills / Transfer
  2. 选择 浏览并导出本机 Skills
  3. Space 勾选后按 e 导出,或按 a 选中全部匹配自定义 Skills 后再按 e 导出。
  4. 得到 ./codex_bundles/<machine>/skills/<single|selected|all>/<timestamp>/

目标机器:

  1. 进入 Skills / Transfer
  2. 选择 浏览并导入 Skills Bundle
  3. Space 勾选后按 i 导入,或按 a 选中全部匹配 Skills Bundle 后再按 i 导入。
  4. 内容一致的 Skill 会直接复用。
  5. 内容冲突默认跳过,不覆盖本机版本。

找回导入覆盖前的会话

  1. 进入 Repair / Maintenance
  2. 选择 管理会话备份
  3. / 搜索 session id、provider、cwd 或路径。
  4. d 查看详情。
  5. r 恢复当前备份。
  6. x 删除不再需要的备份。
  7. 输入 DELETE 二次确认。

恢复前如果当前 rollout 仍存在,工具会再生成一份 rollout-xxx.jsonl.bak.restore.<timestamp>

清理归档会话

  1. 进入 Repair / Maintenance
  2. 选择 删除归档会话
  3. Enterd 预览当前会话。
  4. Space 勾选多条,或直接停在某条上按 x 删除当前条。
  5. 需要清空归档时按 a 选中全部匹配项,再按 x 确认删除选中归档会话。

这个功能用来减轻跨设备同步和搬运负担。它只删除归档 rollout;如果本机还有同 ID 的 active rollout,会保留 active 索引和 Desktop 可见性。

清理已复制的旧 Provider 会话

  1. 进入 Repair / Maintenance
  2. 选择 删除已复制的旧 Provider 会话
  3. Enterd 预览旧会话和对应的新 Provider 副本。
  4. Space 勾选多条,或直接停在某条上按 x 删除当前条。
  5. 需要清空匹配项时按 a 选中全部匹配项,再按 x 确认删除。

这个功能用于“复制会话到当前 Provider”之后,只保留新 Provider 记录。它不会根据 provider 名称粗暴删除旧记录,而是必须找到明确的 cloned_from 关系。

Bundle 目录策略

所有新版 Bundle 动作都围绕当前项目目录下的 ./codex_bundles/ 工作区进行。

默认目录:

  • Codex 数据目录:~/.codex/
  • Bundle 工作区:./codex_bundles/

默认结构:

./codex_bundles/<machine>/sessions/single/<timestamp>/<session_id>/
./codex_bundles/<machine>/sessions/desktop/<timestamp>/<session_id>/
./codex_bundles/<machine>/sessions/active/<timestamp>/<session_id>/
./codex_bundles/<machine>/sessions/cli/<timestamp>/<session_id>/
./codex_bundles/<machine>/sessions/project/<project>/<timestamp>/<session_id>/
./codex_bundles/<machine>/skills/single/<timestamp>/
./codex_bundles/<machine>/skills/all/<timestamp>/

<machine> 默认来自当前电脑主机名。需要手动指定时,可在导出前设置:

export CST_MACHINE_LABEL=My-MacBook

兼容旧布局:

  • ./codex_sessions/
  • ./codex_sessions/bundles/
  • ./codex_sessions/desktop_bundles/

新导出默认只写入 ./codex_bundles/

Bundle 内容

会话 Bundle 默认包含:

  • codex/<relative rollout path>.jsonl
  • history.jsonl
  • manifest.env
  • thread_history_1.sqlite,可选,只包含当前 rollout 的投影数据
  • history_lineage.json、父 rollout JSONL 和 thread_history/,仅 paginated revert/fork 会话存在,用于恢复继承历史链

会话 Bundle 不再携带或恢复 Skill。这样可以避免当前 Codex 的 Skill root alias、插件和运行时目录被误判为可跨机器复制的本地文件。

standalone Skills Bundle 默认包含:

  • manifest.env
  • skills_manifest.json
  • skills/

project 分类额外记录:

  • 导出项目名
  • 导出项目原路径
  • 每个会话的原始 cwd

Skills 搬运规则

Skills 只通过 standalone Skills Bundle 搬运,与会话导入导出解耦。export-skillsimport-skill-bundle 和 TUI 的 Skills 区仍支持 best-effortstrictskipoverwrite 模式。

SQLite 状态位置

工具读取 ~/.codex/config.toml 顶层的 sqlite_home,并用它定位 state_*.sqlitethread_history_*.sqlite。如果未配置,则按官方优先级读取 CODEX_SQLITE_HOME,最后回退到 ~/.codex/。相对路径按当前工作目录解析。

导出投影数据时只选择当前 rollout 及其 history_base 祖先对应的 thread_history_projection_statethread_turnsthread_items 行,不会把无关会话的 SQLite 数据带入 Bundle。导入已有数据库时也只替换这些 rollout 的投影行。stable thread id 与物理 rollout id 会分别记录,revert 后仍注册为原 thread。目标机已有内容不同的父 rollout 时保留本地文件,并跳过对应投影,避免 JSONL 与 SQLite 混用不同版本。

Provider 和 Desktop 标题

工具会尽量保留用户在 Desktop 中看到的真实标题和 provider 语义。

  • 导出时优先读取源机器 Desktop state_*.sqlite 中的 threads.title
  • 如果 SQLite 标题缺失,会读取 rollout 中的 thread_name_updated 事件作为真实短标题
  • THREAD_NAME 保存左侧线程短标题
  • FIRST_USER_MESSAGE 保存第一条用户消息,作为兜底预览
  • 导入时优先使用 THREAD_NAME
  • 旧 Bundle 没有标题时,才从现有 Desktop 标题、thread_name_updatedsession_index.jsonl 或 rollout 首条用户消息恢复
  • 标题比较会折叠换行和多余空白,避免把同一条长提示误判成短标题
  • AGENTS.md 注入上下文、系统技能上下文等元信息不会被当成标题
  • 账号登录模式下,如果 ~/.codex/config.toml 没有 model_provider,会从 Desktop threads 表和最新 rollout 中推断
  • Desktop 修复会保留已有 Desktop 短标题;当旧标题明显是第一条提示或注入上下文时,会用 thread_name_updated 恢复真实短标题

如果旧会话既没有 Desktop SQLite 标题、Bundle THREAD_NAME,也没有 thread_name_updated 事件,工具只能退回到第一条有意义的用户消息或工作区/时间兜底名。这是源数据限制,不会伪造不存在的短标题。

Desktop 侧栏可见性

Codex Desktop 左侧线程栏不只是读取 rollout 文件。它还依赖 Desktop SQLite 的 threads 表、全局 state 中的 workspace roots、线程到 workspace 的 hint、项目内线程顺序、pin 列表和当前侧栏筛选/折叠状态。历史记录很多时,Desktop 还会优先显示最近线程;旧的归档或失效 threads 行可能占住这个有限列表。

因此,本工具在导入和 repair-desktop 中会同时处理这些状态:

  • 写入或修复 threads 行,并清理指向缺失/归档 managed rollout 的失效行
  • 写入 workspace roots、thread-workspace-root-hintssidebar-project-thread-orders
  • 展开 chats / pinned / threads 分区,清除会挡住目标项目的折叠组,并把 workspace filter 切回全部
  • 将导入或修复的线程提升到 Desktop 最近线程池前部
  • 导入或修复不会自动写入 pinned 列表,已有置顶会话会保持原样

Provider 识别顺序:

  1. 命令显式参数
  2. ~/.codex/config.toml
  3. 最新 Desktop threads
  4. 最新 rollout 会话文件

常用按键

主界面和功能页:

按键 作用
↑/↓j/k 移动
Enter 进入功能页或执行当前动作
←/→ 切换功能页
PgUp/PgDn 切换功能页
h 打开帮助
q 返回或退出
0 直接退出

二级选择页:

按键 作用
↑/↓j/k 选择执行方式、修复范围或同步方式
Enter 确认当前选项
q / / Esc 返回上一步

浏览器页面:

按键 作用
/ 搜索会话、Bundle、Skill 或备份
Enter 打开当前条目详情,选择模式下直接确认
d 查看详情
e 在会话/Skills 列表中导出当前或已勾选条目
i 在 Bundle / Skills Bundle 导入页导入当前或已勾选条目
x 在删除类浏览器或 Bundle 浏览页删除当前或已勾选条目
p 在项目会话浏览器中重新输入项目路径
Space 在可批量操作的列表中勾选或取消勾选
a 在支持多选的功能页选中当前筛选结果的全部匹配项
s 按 Bundle 类别筛选
m 按来源机器筛选 Bundle
l 切换历史范围:全部历史 / 仅最新
g 在 Skills 列表切换是否显示系统/运行时 Skills
r 在备份列表恢复当前备份

操作键语义保持统一:a 只表示选中当前筛选结果的全部匹配项,e 只表示导出,i 只表示导入,x 只表示删除。

自动化与兼容 CLI

本项目的主产品界面是 TUI。普通迁移、导入、导出、修复、Skills 管理和 GitHub 同步都应优先从 TUI 完成,不要求用户记忆命令。

CLI 只公开少量稳定入口,用于版本检查、只读检查、Bundle 健康检查和已连接仓库后的同步脚本。旧命令仍保留兼容,但不再作为用户工作流文档化;导出、导入、Skills、修复、拉取和冲突处理都走 TUI。

codex-session-toolkit --advanced-help

稳定入口

codex-session-toolkit
codex-session-toolkit --version
codex-session-toolkit --advanced-help
codex-session-toolkit list-bundles
codex-session-toolkit validate-bundles
codex-session-toolkit sync-github --dry-run
codex-session-toolkit sync-github

安全性说明

  • 不修改对话正文内容
  • 不会悄悄覆盖原始 session
  • 导入覆盖前会自动备份旧 rollout
  • 清理旧版重复副本只针对旧版无标记 clone
  • 删除已复制的旧 Provider 会话只处理带 cloned_from 关系的新旧会话对
  • 删除归档会话只处理 ~/.codex/archived_sessions/
  • 删除归档会话时,如果同 ID active 会话仍存在,会保留 active 索引和 Desktop 线程记录
  • 删除 Skill 和删除备份都需要确认
  • 导入前会校验 manifest、路径和 JSONL
  • GitHub 同步只处理 ./codex_bundles/
  • 父项目源码仓库通过 .gitignore 忽略 codex_bundles/
  • GitHub 代理只作用于 Bundle 同步链路,不写全局 git 配置
  • 建议写入型动作第一次都先 Dry-run

运行环境

  • Python >= 3.8
  • 无第三方运行时依赖
  • 支持 macOS / Windows / Linux
  • GitHub 同步需要本机可用的 git

环境变量

变量 作用
NO_COLOR=1 禁用颜色
CST_ASCII_UI=1 使用 ASCII UI
CST_TUI_MAX_WIDTH=120 限制 TUI 最大宽度
CST_MACHINE_LABEL=My-MacBook 指定导出时的机器标签
`CST_LAUNCH_MODE=auto source

开发验证

python3 -m ruff check src tests
python3 -m compileall -q src tests
python3 -m unittest discover -s tests -v

社区支持

学 AI,上 L 站

LINUX DO 社区支持

本项目在 LINUX DO 社区发布与交流,感谢佬友们的支持与反馈。

许可证

MIT License. See LICENSE.

About

一个可以管理、跨设备协同codex sessions的小工具

Resources

Stars

113 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages