专题篇章 · 拆开 OpenAI Codex

搬家只搬对得上的字段

换到 Codex 的第一周,最怕去年攒的 hook、MCP 和插件还在不在。检测会列出一份清单。导入只收下能映射的那一部分。

本页解决的问题

先给结论

「搬家只搬对得上的字段」要解决的关键问题是什么?

换到 Codex 的第一周,最怕去年攒的 hook、MCP 和插件还在不在。检测会列出一份清单。导入只收下能映射的那一部分。

判断标准

跟着交接处走,不要只看 Demo。 系统是否可靠,往往取决于模型、工具、状态、权限和人的交接处。把每次交接都当成可以观察、测试和恢复的地方。

下一步

为一个自动化步骤写清输入、负责人、审批和恢复动作。

常见误区

一次运行成功了,却说不清发生了什么,也无法安全重放。

课程目标读完能说清三件事。搬家源只有 Claude Code 和 Cursor。每条字段走原样搬走、改写、丢掉三条出口之一。插件只从用户级装,远程市场和会话要等后台。
先玩一遍 · 逐字段看搬走还是丢掉
一份家当过白名单:原样、改写、搬不了
memory
会话
点卡片可移出家当。切源、开关或会话年龄会重跑。Cursor 不支持 memory,仓库里的插件会被丢掉。
检测 映射 重写 导入
原样 0 改写 0 搬不了 0 后台 0
源字段
Codex 落点
逻辑轨迹 · 动画每一步对应源码里的哪一段
  1. 按字符串选择 Cla 或 Cur,对不上就落到 Claude Codemigration_source.rs L59
  2. 先扫用户级配置,仓库范围不跑插件检测detect/mod.rs L330
  3. 会话按 30 天和 50 条过滤,太旧的丢掉sessions/common.rs L43
  4. memory 要源支持,还要单独打开特性开关detect/mod.rs L59
  5. hook 只留同步 command,prompt 整条跳过hooks_cla.rs L135
  6. MCP 命令里出现 ${,整台 server 不要mcp.rs L208
  7. 市场来源只收 git 家族和本地目录,npm 丢掉source_cla.rs L270
  8. 说明文件改名,产品名按词边界改写成 Codexrewrite.rs L39
  9. 同步 import 对 Sessions 直接返回成功service.rs L437
  10. 后台再写 thread,远程插件后装;开关关则拒绝 memoryprocessor.rs L184
点播放,看每条字段走原样搬走、改写,还是丢掉。
三条出口对得上的字段走拷或改。prompt hook、npm 市场、带占位符的 MCP,不会出现在成功清单里。
插件只从 home 装仓库里的启用名单不能当安装权威。远程市场推进待装队列,不在同步阶段装完。
同步先回执会话可以出现在检测清单里。同步 import 什么都不写,thread 留给后台。
教学示意:家当为课程化样例,hook 与 MCP 只用无害命令。逻辑轨迹右侧行号对应 openai/codex 仓库 commit 4f39251a01。
思路一 · 三条出口:原样、改写、丢掉
它解决什么问题

有人告诉你会自动从 Claude Code 搬家。你以为是把整个配置目录拷过来。第二天 hook 少了一条,MCP 少了一台,memory 没出现在清单里。少掉的 hook 用了 type: prompt。少掉的 MCP 命令里写了 ${API_KEY}

再换一个同事。他用的是 Cursor。Codex 能看见他的 skill 和 hook,看不见他的 memory。仓库里的 Cursor 插件配置会被直接丢掉。

思路是什么

搬家 crate 只负责把外部配置读进来。插件怎么跑,在旁边的 core-plugins。源在类型上只有两个变体:Cla 是 Claude Code,Cur 是 Cursor。字符串对不上 cursor,就落到 Claude Code。调用方漏传源,检测会去翻 ~/.claude

出处:codex-rs/external-agent-migration/src/migration_source.rs 第 51 至 67 行

一次检测最多产出十种条目。每种后面的导入必须给一个去处。字段先过白名单。Codex 认 11 个 hook 事件,Claude Code 发出 27 个。名字对不上的组,整组消失。单条 hook 的 type 默认当 command,对不上就跳过。MCP 的 command 或 url 里出现 ${,整台不要。市场来源只收 github、git、本地目录。fileurlnpmsettings 直接丢掉。

出处:codex-rs/external-agent-migration/src/model.rs 第 53 至 64 行 · codex-rs/hooks/src/lib.rs 第 23 至 35 行 · restored-src/src/entrypoints/sdk/coreSchemas.ts 第 355 至 383 行 · codex-rs/external-agent-migration/src/hooks_cla.rs 第 131 至 137 行 · codex-rs/external-agent-migration/src/mcp.rs 第 204 至 210 行 · codex-rs/external-agent-migration/src/source_cla.rs 第 270 至 274 行

然后说明文件要改名。CLAUDE.md 变成 AGENTS.md。产品名按词边界改成 Codex。Cursor 只用大小写敏感的 Cursor,避免把普通英文 cursor 一起改掉。

出处:codex-rs/external-agent-migration/src/rewrite.rs 第 38 至 49 行

源字段 hook / MCP / 市场 白名单 名字、类型、来源 原样搬走 同步 command hook 改写 CLAUDE.md 改名,MCP 改成 TOML 丢掉 prompt hook、npm 市场、${} MCP 输入是一条竞品字段。发生的是白名单判定。输出是拷、改、丢之一。
教学化结构图:搬家不是整目录拷贝,每条字段单独走出口。
为什么长期成立

导入器的通用形状是白名单加三条出口。对不上的字段丢掉,不要改写成近似物。prompt hook 不会被塞进 command。带占位符的 MCP 不会被瞎展开。换个语言重写,这份表还用得上。

思路二 · 插件只从用户级装,慢活进后台
它解决什么问题

Claude Code 允许仓库 settings 带着启用插件名单,同事克隆之后自动有同一批插件。对 Codex 来说,仓库里的启用名单不能当安装权威。装上去会进用户配置。不可信仓库想在你机器上装可执行内容,这条路要先切断。

思路是什么

检测只在 home 扫插件。注释写死了:仓库控制的 settings 不能当安装权威。Cursor 只要看见仓库根,插件检测直接返回空。导入看见非空工作目录,报 repository-scoped plugin migration is not allowed

出处:codex-rs/external-agent-migration/src/detect/mod.rs 第 330 至 332 行 · codex-rs/external-agent-migration/src/migration_source.rs 第 116 至 125 行 · codex-rs/external-agent-migration/src/plugins.rs 第 26 至 36 行

本地插件当场装。远程市场推进待装队列。会话也是两截:检测清单里可以有,同步 import()Sessions 直接返回成功,什么都不写。真正写成 Codex thread 的,是 app-server 里的后台任务。调用方先拿到 import_id

出处:codex-rs/external-agent-migration/src/service.rs 第 437 行 · codex-rs/app-server/src/external_agent_migration/session_importer.rs 第 100 至 111 行

Codex 认市场清单时,按固定相对路径找第一个存在的文件。四条路径里两条是自己的,两条是竞品的。同一套查找同时服务「用户主动加市场」和「从竞品搬市场」。

出处:codex-rs/core-plugins/src/marketplace.rs 第 20 至 25 行

检测 home 加仓库 同步导入 配置、hook、本地插件 import_id 先回一张收据 后台写 thread Sessions 同步是空操作 后台装远程插件 git clone 可能要几十秒 输入是检测清单。发生的是能立刻落盘的先做完。输出是收据加后台任务。
教学化时序图:同步阶段承认「看见了」,慢活留给后台。
为什么长期成立

可执行内容的安装权威必须落在用户级。面向任意 git clone 的产品,home-only 更稳。同步先回执、慢活进后台,是长任务接口的通用形状。

思路三 · 目标非空不覆盖
它解决什么问题

换产品最怕把已经改过的新配置盖掉。目标 hooks.json 里已经有内容,整文件替换会把用户手写的 hook 冲掉。

思路是什么

目标 hook 文件非空,整项取消。已有 config.toml 只补缺失键。MCP 同名 server 保留旧的。第一次搬家像填空。第二次再点迁移,多数条目会因为已经有了而不出现。

出处:codex-rs/external-agent-migration/src/hooks_common.rs 第 13 至 19 行

memory 另有一道门。特性开关默认关,阶段是 UnderDevelopment。检测函数不看这个开关,导入前处理器会查。关着就回 external agent memory import is disabled。导入按字节拷贝,不脱敏。

出处:codex-rs/features/src/lib.rs 第 998 至 1003 行 · codex-rs/app-server/src/external_agent_migration/processor.rs 第 180 至 185 行

对得上的字段走拷或改,对不上的丢掉。
为什么长期成立

导入是填空。用户已经写过的文件,搬家碰不得。memory 默认关,是因为另一家 agent 的项目记忆会按明文进盘。

横向对比 · 同一批扩展,要不要读进来

DeepSeek Harness:不搬家,再装一次

DSH 的插件入口是 thin pnpm forwarder。初始化 profile,在 profile 目录里跑 pnpm,再按安装结果调和清单。插件是 npm 包。没有检测 Claude Code,没有导入 Cursor hook。换产品要自己重装。代价是用户税。好处是不用对一家不断加字段的 settings schema 做永久兼容。

已核对 apps/cli/src/plugin.ts 第 120 至 133 行 · 2026-08-22

Grok:自建市场,不搬竞品

Grok 从市场根加相对路径拷进自己的安装登记,并写下 provenance。相对路径禁止 ..、绝对路径和盘符。没有 plugin.json 但根上有 SKILL.md 时,它会补一份合成清单。市场对象是一份自己的目录加来源记录。它不读用户在另一家里启用过的插件。

已核对 crates/codegen/xai-grok-plugin-marketplace/src/installer.rs 第 36 至 45 行 · 2026-08-22 · Grok · 插件市场的发现与信任
课堂练习
01

哪些字段会进清单

桌上有四条 Claude Code 资产:PreToolUsetype: command hook、同事件的 type: prompt hook、一台 command 含 ${API_KEY} 的 MCP、一条 40 天前的会话。对照上面的白名单,列出检测清单里应出现和不应出现的条目。

再补一问:调用方何时收到 import_id,这条会话何时变成 thread。开关关着的 memory 若被送去导入,会在哪一扇门被挡回来。

Takeaway:搬家是检测加映射加重写。对得上的字段走拷或改,对不上的丢掉。插件只从用户级装,会话和远程市场进后台。目标非空不覆盖。

「先玩一遍 · 逐字段看搬走还是丢掉」的能力藏在每次交接里

「有人告诉你会自动从 Claude Code 搬家。你以为是把整个配置目录拷过来。第二天 hook 少了一条,MCP 少了一台,memory 没出现在清单里。少掉的 hook 用了 type: prompt 。少掉的 MCP 命令里写了 ${API_KEY}」说明,Agent 的表现不只由模型决定。模型、上下文、工具、状态、权限和人之间的每次交接,都会改变任务能否继续以及出了问题能否恢复。

先写清状态,再增加能力

从「再换一个同事。他用的是 Cursor。Codex 能看见他的 skill 和 hook,看不见他的 memory。仓库里的 Cursor 插件配置会被直接丢掉」出发,可以把流程拆成起始状态、下一步动作、工具返回、状态更新和停止条件。这样调试时找的是第一处丢失信息或权限的位置,而不是笼统地说“模型变笨了”。

  • 按字符串选择 Cla 或 Cur,对不上就落到 Claude Code migration_source.rs L59
  • 先扫用户级配置,仓库范围不跑插件检测 detect/mod.rs L330
  • 会话按 30 天和 50 条过滤,太旧的丢掉 sessions/common.rs L43

成功路径不能代表系统可靠

用「再补一问:调用方何时收到 import_id ,这条会话何时变成 thread。开关关着的 memory 若被送去导入,会在哪一扇门被挡回来」重放一次成功和一次失败,记录每一轮真正传入的上下文、工具结果和负责人;只要第二个人能复述这条链,系统才有可维护性。

从「先玩一遍 · 逐字段看搬走还是丢掉」走到「思路一 · 三条出口:原样、改写、丢掉」

「先玩一遍 · 逐字段看搬走还是丢掉」先把问题落在「一份家当过白名单:原样、改写、搬不了 播放 单步 重置 源 Claude Code Cursor memory 关 开 会话 10 天 40 天 点卡片可移出家当。切源、开关或会话年龄会重跑。Cursor 不支持 memory,仓库里的插件会被丢掉。 检测 映射 重写 导入 原样 0 改写 0 搬不了 0 后台 0 源字段 Codex 落点 逻辑轨迹 · 动画每一步对应源码里的哪一段 按字符串选择 Cla 或 Cur…」上;到了「思路一 · 三条出口:原样、改写、丢掉」,讨论继续推进到「有人告诉你会自动从 Claude Code 搬家。你以为是把整个配置目录拷过来。第二天 hook 少了一条,MCP 少了一台,memory 没出现在清单里。少掉的 hook 用了 type: prompt 。少掉的 MCP 命令里写了 ${API_KEY}」。两段连起来,重点就不只是记住一个结论,而是看清它成立所依赖的条件。

把这条判断带到下一个场景

分析 Agent 时,沿着状态、动作、工具结果和下一步的顺序走一遍;每次交接都要能说明信息从哪里来、由谁确认、失败时停在哪里。

  • 「先玩一遍 · 逐字段看搬走还是丢掉」:一份家当过白名单:原样、改写、搬不了 播放 单步 重置 源 Claude Code Cursor memory 关 开 会话 10 天 40 天 点卡片可移出家当。切源、开关或会话年龄会重跑。Cursor 不支持 memory,仓库里的插件会被丢掉。 检测 映射 重写 导入 原样 0 改写 0 搬不了 0 后台 0 源字段 Codex 落点 逻辑轨迹 · 动画每一步对应源码里的哪一段 按字符串选择 Cla 或 Cur…
  • 「思路一 · 三条出口:原样、改写、丢掉」:有人告诉你会自动从 Claude Code 搬家。你以为是把整个配置目录拷过来。第二天 hook 少了一条,MCP 少了一台,memory 没出现在清单里。少掉的 hook 用了 type: prompt 。少掉的 MCP 命令里写了 ${API_KEY}
  • 「最后的要点」:hook 只留同步 command,prompt 整条跳过 hooks_cla.rs L135

最后的「最后的要点」把讨论落到「hook 只留同步 command,prompt 整条跳过 hooks_cla.rs L135」。回看这条线索时,最值得保留的是:当输入、规模或风险改变,哪些判断需要重新做一遍。

标记为已学完 阅读进度会自动记录
← 上一篇下一篇 →

继续阅读

同一条线上的下一篇。

文章讨论

读到这里,留下一个判断。

把刚想明白的地方、还没想通的问题,留给下一位一起学习的人。

正在讨论 搬家只搬对得上的字段 拆开 OpenAI Codex
3条讨论文章讨论 · 与共学社区同步
在共学社区查看
AM
Asha Morgan内容编辑
观点实践记录

我把这篇文章里的一个判断改写成了今天可以验证的小实验。比记住结论更有用的是,知道下一步要观察什么。

文章讨论7 有帮助
LH
Lin Harper独立开发者
观点观点

读完以后我先回头找它成立的条件,而不是直接把方法搬进项目。这个顺序让后面的取舍清楚很多。

文章讨论5 有帮助
KM
Kiki Moore产品运营
问题问题

如果把这个判断放到真实工作里,最先需要补的约束是什么?我想知道从阅读到第一次实践之间,哪一步最值得先做。

文章讨论4 有帮助