这页解决什么问题
如果你已经在使用 Claude Code,这次迁移不应该从“重新学习 AI 编程”开始,而应该从“逐项替换运行时约定”开始。两者都能在真实代码库中理解任务、读取文件、调用工具、修改代码并运行验证,但配置文件、权限模型、扩展目录和生命周期自动化并不完全兼容。 本页给出一条可审计的迁移路径:- 先区分能够直接复用的概念和必须重写的配置。
- 把
CLAUDE.md精简后迁移为AGENTS.md。 - 把 JSON 配置拆解为 Codex 的
config.toml、沙箱和审批策略。 - 迁移 Skills、MCP、Hooks 和 Plugins 时保留意图,不机械复制目录或字段。
- 用命令、测试、日志和最小权限逐项验证。
- 在迁移失败时只回滚迁移层,不破坏原有 Claude Code 工作流。
本页的命令、字段和默认行为以当前 Codex 版本的 codex --help、子命令帮助和官方文档为准。模型名称、实验性 Rules、Hooks 字段以及插件安装位置可能随版本变化;凡是与本机帮助输出不一致的内容,以本机输出为准。
先建立正确的心智模型
Claude Code 和 Codex 都属于终端中的代理式编程工具。你仍然可以采用“理解需求、读取项目、制定计划、执行变更、运行验证、检查差异、交付结果”的循环。真正需要迁移的是围绕这个循环的约束层。 可以把迁移拆成四层:
迁移时不要把“名称相同”误判为“行为相同”。例如,两边都有 Skills,但一个 Skill 的目录扫描和显式调用方式可能不同;两边都支持 MCP,但 Codex 主要通过
config.toml 管理 server,不使用 Claude Code 的 --scope 语义。
总体对照表
迁移前的冻结与盘点
先不要修改生产项目中的任何规则。选择一个测试仓库,建立迁移分支,并保存 Claude Code 当前配置的只读副本。- 所有层级的
CLAUDE.md和CLAUDE.local.md。 settings.json中的模型、权限、环境变量和 Hook。- 项目使用的 Skills、Skill 触发条件和附带脚本。
- MCP server 的启动命令、URL、认证方式和实际使用工具。
- Hooks 的事件、matcher、脚本、超时和退出码。
- Plugins 的来源、版本、包含的 Skill、MCP、命令和 Hook。
- 常用斜杠命令、脚本调用方式和 CI 集成。
- 现有测试、格式化、构建和发布命令。
阶段一:迁移项目规则
CLAUDE.md 到 AGENTS.md
Codex 读取的是 AGENTS.md。项目根目录通常放一份,子目录可以按模块添加更具体的规则。全局规则位于 Codex 主目录中的 AGENTS.md 或 AGENTS.override.md,默认主目录是 ~/.codex,也可能由 CODEX_HOME 改变。
Codex 构建项目指令时通常从 Git 根目录一路走到当前目录。每个目录最多选择一个指令文件,优先级一般是:
AGENTS.override.md。AGENTS.md。project_doc_fallback_filenames中配置的备选文件名。
AGENTS.override.md 只替换同一目录中的 AGENTS.md,不会删除全局层或上级目录已经加载的指令。
这与 CLAUDE.local.md 的“附加本地内容”思路不同。迁移前先判断你原来的本地文件是补充规则,还是要在该层完全替换规则。如果只是个人偏好,优先使用用户级规则或单次提示;如果必须临时替换同级项目说明,再使用 AGENTS.override.md。
迁移内容的取舍
应保留每次任务都需要的事实:- 项目用途和主要入口。
- 语言、框架、包管理器和关键运行时版本。
- 测试、Lint、格式化、构建和启动命令。
- 必须遵守的命名、目录和接口约定。
- 禁止修改的目录或文件。
- 删除数据、改依赖、迁移数据库、发布和外部写操作前的确认要求。
- 公司历史、产品愿景和长篇背景故事。
- 代码本身已经明确表达的目录说明。
- 已经由 formatter、linter 或 CI 强制执行的重复规则。
- 过期的命令、已经不存在的服务和旧版本信息。
- 需要用户每次判断的动态信息。
project_doc_max_bytes 限制,常见默认值是 32 KiB。这个限制按合并后的总大小计算,不是只看某一份文件的行数。超限时优先精简或按目录拆分,不要先无限增大上限。
推荐的 AGENTS.md 骨架
兼容过渡
如果团队暂时需要同时使用两种工具,不要立即删除CLAUDE.md。可以把规范正文整理成一份中立的团队文档,然后分别生成 Claude Code 和 Codex 的入口文件。也可以在 ~/.codex/config.toml 配置:
AGENTS.override.md 和 AGENTS.md 时尝试备选名称,不代表 Claude Code 与 Codex 的所有语义已经兼容。长期方案仍然是维护明确的 AGENTS.md,避免队友不知道哪份文件是 Codex 的权威入口。
验证规则是否加载,不要让代理直接修改代码。进入项目目录后执行:
阶段二:迁移配置与权限
JSON 到 TOML
Claude Code 的settings.json 不能直接改名为 config.toml。迁移时先列出你真正使用的意图,再逐项寻找 Codex 字段:默认模型、推理强度、沙箱、审批、MCP、Hooks、项目说明文件和功能开关。
一个最小 Codex 配置可以是:
=,分组使用 [section],数组使用方括号,行末不写 JSON 风格的逗号。不要把 settings.json 中未知的字段原样塞进 TOML;未知键可能被忽略,也可能导致解析失败。
配置通常分为用户级和项目级:
项目级配置尤其要谨慎。陌生仓库中的配置可能声明外部 server 或 Hooks;只有在确认仓库可信、内容经过审查后才启用。
权限模型的迁移方式
Claude Code 常按 permission mode 决定整体行为,并用allow、ask、deny 针对工具或命令细分。Codex 将两个问题分开:
- 沙箱决定代理可以触及的范围。
- 审批策略决定越过限制或执行敏感动作时是否询问。
审批策略通常包括:
迁移时不要把“Claude Code 中不询问”直接翻译为“Codex 全面放权”。
approval_policy = "never" 只是不询问,能力范围仍由沙箱决定。相反,danger-full-access 也不应作为日常默认值。
推荐的迁移起点是:
workspace-write 下网络通常默认关闭,确需访问网络时再显式启用,并说明访问目标。
Rules 的位置
如果你需要把 Claude Code 的某条deny 规则迁移成命令级判断,可以研究 Codex Rules。Rules 使用 .rules 文件和 prefix_rule,常见用户级位置是 ~/.codex/rules/default.rules。它属于实验性能力,字段和行为以本机文档为准。
allow、prompt 和 forbidden,更严格的结果优先。写完后先检查,不要直接在真实发布流程中试:
阶段三:迁移 Skills
概念可以保留,入口必须重写
两边的 Skill 都是在重复工作流上建立可复用能力。你原有 Skill 的目标、步骤、检查清单和参考资料大多可以保留,但要重新检查:SKILL.md的 frontmatter 是否包含name和description。description是否明确触发场景和不应触发的边界。- 显式调用方式是否改为 Codex 支持的
$skill-name或/skills。 - 仓库级 Skill 是否放在
.agents/skills,个人 Skill 是否放在$HOME/.agents/skills。 - 脚本是否依赖 Claude Code 专有环境变量或工具名。
- Skill 是否包含会发送数据、发布或修改生产系统的副作用。
SKILL.md 可以这样改写:
显式与隐式调用
显式调用适合有副作用的工作流:description 自动匹配。对“发版”“删除数据”“修改生产配置”这类高风险 Skill,建议关闭隐式调用,在 Skill 的 agents/openai.yaml 中使用当前版本支持的策略字段,例如:
$release-check 时才会调用。请先用本机版本验证字段名称。
Skill 重名时不要假设近处的定义会覆盖远处的定义。不同层级可能同时出现在选择器中,因此团队命名要带清晰的作用域或用途。通过 /skills 检查实际发现结果,必要时禁用不再使用的 Skill。
Skills 的迁移验收
对每个 Skill 逐项执行:- 在干净测试仓库中确认
/skills能看到它。 - 用一条明确的人话验证隐式触发。
- 用
$name验证显式触发。 - 检查脚本使用的路径、环境变量和命令在 Codex 中存在。
- 对副作用操作确认默认不会隐式执行。
- 保存一次运行日志和预期结果。
阶段四:迁移 MCP
协议相同,配置方式不同
MCP server 通常可以复用同一套 server 实现,但不能复用 Claude Code 的配置命令和作用域参数。Codex 主要支持两类连接:- STDIO:在本机通过命令启动进程。
- Streamable HTTP:连接远程 URL,可使用 Bearer token 或 OAuth。
~/.codex/config.toml,项目配置放在受信任项目的 .codex/config.toml。
添加 STDIO server
可以先用命令查看本机支持的参数:-- 后面才是 server 的启动命令。等价的 TOML 结构通常是:
config.toml:
添加远程 HTTP server
远程 server 使用 URL,并让配置引用环境变量:限制 server 的能力
迁移时不要因为 Claude Code 原来默认放行,就把整个 MCP server 自动批准。可以按当前版本支持的字段控制:enabled_tools 和 disabled_tools 的具体优先级以本机文档为准;常见行为是先限制白名单,再应用黑名单。陌生 server 默认只读、逐次审批,确认来源和数据边界后再放宽。
在会话中使用以下命令检查 server:
阶段五:迁移 Hooks
先区分请求和保证
AGENTS.md 中写“修改后记得格式化”是给代理的请求;Hook 才能在事件发生时运行确定性脚本。迁移 Hooks 前要重新设计,而不是把 Claude Code 的 JSON 原样复制。
Codex 常见事件包括:
PreToolUse 能在部分工具执行前阻止操作;PostToolUse 不能撤销已完成的副作用,只能反馈结果;Stop 中的阻止信号通常表示“不要结束,继续一轮”,不要套用 Claude Code 的直觉。
配置位置和格式
Hook 可以写在用户级~/.codex/hooks.json、用户级 config.toml,或项目 .codex/hooks.json、项目 .codex/config.toml。项目 Hook 可以提交给团队,但必须审查脚本来源。
项目级 hooks.json 的基本形态是:
matcher 是正则字符串,工具事件通常匹配工具名。修改文件时,Codex 实际工具名可能是 apply_patch;不要只按 Claude Code 中的 Edit 或 Write 判断。Hook 的 timeout 通常按秒计算,不要把 Claude Code 的毫秒配置原样带过来。
Codex 当前版本支持的处理器和异步行为可能有限。迁移前使用最小 Hook 验证,不要假设 prompt、agent 或异步处理器一定执行。
Hook 的输入输出
Hook 脚本通常从 stdin 读取 JSON。工具事件可能包含:0:正常继续。2:在PreToolUse等前置事件中表示拒绝或阻止;在PostToolUse、Stop等事件中通常表示反馈、退回或要求继续。- 其他退出码:按当前版本的错误处理行为验证,不要依赖未定义语义。
Codex 特有的信任步骤
非托管 Hook 默认可能不会执行。新增或修改 Hook 后,启动 Codex 并运行:disableAllHooks 直接替代,使用前必须查本机帮助。更好的回滚方式通常是禁用单个 Hook 或恢复备份,而不是全局关闭所有自动化。
Plugins 的迁移策略
Plugin 往往是 Skills、MCP、Hooks、命令或配置的打包与分发单元。不要把 Claude Code Plugin 的目录复制到 Codex 后就认为它可用。先列出插件包含的资源,再按 Codex 的资源类型逐项迁移。 推荐顺序如下:- 只迁移一个最常用、风险最低的 Skill。
- 再迁移不含写操作的 MCP server。
- 最后审查 Hooks、命令和发布能力。
- 在测试仓库中安装,记录插件版本和来源。
- 检查插件是否带有隐藏的网络、文件写入或自动触发逻辑。
/skills、/mcp 和 /hooks 分别验证,不要只看安装命令返回成功。
命令和工作流映射
交互命令
命令同名不代表输出和副作用相同。迁移脚本前逐条运行
codex <subcommand> --help。不要在 CI 中假设交互命令可用;优先使用 codex exec 和明确的退出码、输出格式。
工作流映射
Claude Code 中常见的“先探索再修改”流程在 Codex 中仍然适用:- 进入正确的 Git 工作区。
- 查看
AGENTS.md和项目 README。 - 让 Codex 总结现状并列出计划。
- 使用只读沙箱或保守审批开始探索。
- 确认范围后切换到工作区写入。
- 小步修改,每次查看 diff。
- 运行最小代表性测试,再运行完整验证。
- 检查密钥、生成物和无关文件。
- 由用户明确批准后提交、推送或发布。
claude -p 迁移到 codex exec 时,要同步迁移三件事:工作目录、审批策略和输出处理。脚本必须明确失败时退出,而不是把代理的一段自然语言当成成功信号。
示例:
codex exec --help。当命令涉及提交、推送、部署、外发消息或生产数据时,不要用 never 或 --yolo 作为默认自动化策略。
一个分阶段迁移案例
假设一个团队有 Node.js 单体仓库,原来使用:根目录CLAUDE.md、用户级 settings.json、两个 Skills、一个 Context7 MCP、一个格式化 Hook,以及一个发布 Plugin。
第 0 阶段:只读基线
在 Claude Code 中记录一次基线:当前分支、测试结果、格式化结果、MCP 列表、Skill 列表和 Hook 行为。保存命令输出,但不要保存 token。第 1 阶段:规则和只读配置
新建AGENTS.md,只放包管理器、测试命令、禁改目录和验收标准。Codex 使用 read-only 或保守审批,总结规则后退出。此时不安装 Plugin、不连接生产 MCP、不启用写操作 Hook。
通过后再把模型和推理强度写入用户级 config.toml。确认 TOML 可解析、启动无警告、当前项目仍识别为正确的 Git 根。
第 2 阶段:迁移低风险 Skill
先迁移“解释错误”或“总结 diff”这类无副作用 Skill。通过/skills 检查发现,分别测试隐式和显式调用。若描述太泛,缩小触发范围;若脚本依赖 Claude Code 变量,改为读取 Codex 提供的 cwd 或从 Git 根计算路径。
第 3 阶段:迁移只读 MCP
把 Context7 放在用户级配置,先用codex mcp add,再用 /mcp 检查。第一次调用保持 prompt,确认返回内容确实来自 server。对远程文档内容保持提示注入意识,不要让外部文本覆盖项目规则。
第 4 阶段:迁移 Hooks
先部署只记录命令或只运行格式化的 Hook。用测试仓库验证 stdin、退出码、路径和超时,之后在/hooks 中审查并信任。格式化 Hook 通过后,再迁移拦截危险命令的逻辑。简单前缀禁令优先写 Rules,复杂判断才使用脚本。
第 5 阶段:迁移发布 Plugin
最后才迁移发布相关 Plugin。把隐式触发关闭,要求$release-check 显式调用;将“检查”和“发布”拆成两个能力。发布动作使用 approval_policy = "on-request",并在测试环境验证拒绝、超时和回滚路径。
第 6 阶段:双跑和切换
同一组输入分别在 Claude Code 和 Codex 中执行,比较:- 读取的规则是否一致。
- 计划是否覆盖相同的验收条件。
- 修改文件范围是否一致。
- 测试和格式化结果是否一致。
- MCP 和 Hook 的副作用是否一致。
- 失败时是否能安全停止。
兼容差异清单
不能直接假设的事项
- Codex 不会因为仓库里有
CLAUDE.md就自动读它,除非配置备选文件名。 CLAUDE.local.md与AGENTS.override.md不是同一个语义。- JSON 不能直接复制到 TOML。
- 不询问审批不等于拥有更大文件或网络权限。
workspace-write不代表网络默认开放。- MCP 作用域不是通过 Claude Code 的
--scope迁移。 - Skill 的手写目录与安装器管理目录可能不同。
- Hook 的工具名、matcher、超时单位和输出协议需要重新检查。
- Codex Hook 的
block在不同事件中可能表示阻止、反馈或继续一轮。 - Rules 可能仍属于实验性功能,不应作为唯一安全边界。
- Plugin 安装成功不代表其中的每个资源都已经被信任或启用。
- 记忆功能不能替代
AGENTS.md中必须每次生效的团队规则。
安全边界差异
迁移完成后,用“沙箱、审批、Rules、Hooks、MCP 工具权限”五个问题重新审查,而不是沿用 Claude Code 的单一 permission mode。对以下动作始终保留人工确认:删除文件、修改数据库、读取密钥、发送外部请求、推送分支、创建或合并 PR、部署和外发消息。验证清单
文件和配置
- 当前项目只有预期的
AGENTS.md,没有重复或过时的规则冲突。 - 全局、项目和子目录规则的发现顺序已经实测。
-
AGENTS.override.md的使用范围已经确认。 -
config.toml可解析,未混入 JSON 逗号或未知字段。 - 配置和 Hook 中没有 token、密码、私钥或真实数据。
- 项目级
.codex/config.toml和.codex/hooks.json的来源已审查。
权限和外部能力
- 日常工作使用工作区写入和按需审批。
- 只读任务没有意外写入。
- 网络只对明确需要的任务启用。
- MCP server 的工具已限到最小集合。
- 陌生 MCP 工具默认逐次审批或禁用。
- Rules 已用
codex execpolicy check验证允许和拒绝案例。 - 新 Hook 已在
/hooks中审阅和信任。 - 副作用 Skill 和 Plugin 已关闭隐式触发。
行为和交付
-
/status显示了预期模型、目录和权限。 -
/skills能发现迁移的 Skill,并且显式调用成功。 -
/mcp显示的 server 与清单一致。 - Hook 的正向、拒绝、超时和脚本失败场景均已测试。
-
git diff --check通过。 - 测试、Lint、类型检查和构建结果已记录。
- 变更范围没有包含迁移之外的文件。
- 提交和推送仍然需要明确批准。
回滚和止损
迁移要分层回滚,避免为了恢复一个 Hook 而删掉整个 Codex 配置。规则回滚
保留原始CLAUDE.md 和新建的 AGENTS.md,发现规则不正确时先移除新增的 Codex 文件或恢复到迁移前版本。若只是在测试分支中修改,可以回退该分支;不要覆盖团队成员的未提交工作。
配置回滚
修改config.toml 前复制到仓库外的备份路径。出现解析错误时,先恢复最近一个能启动 Codex 的版本,再逐项加回配置。不要把整份 Claude Code settings.json 粘贴到 Codex 配置中,也不要用完全访问模式掩盖配置错误。
Skill 和 Plugin 回滚
优先禁用单个 Skill 或卸载单个 Plugin,保留目录以便审查。对自动发布、删除和写入生产的能力,先关闭隐式调用,再撤销凭据和 MCP 写工具权限。确认没有残留 Hook 后再删除文件。MCP 回滚
先禁用 server,再检查是否有正在运行的本地进程、缓存或凭据。撤销不再需要的 token;若 server 曾经接触真实数据,按该系统的审计和密钥轮换流程处理。删除配置前保留 server 名称、版本和失败日志,方便定位。Hook 回滚
在/hooks 中禁用或撤销信任,随后删除项目配置中新增的那一条。若 Hook 已产生副作用,不能靠删除 Hook 撤回结果;需要使用 Git、数据库备份、部署版本或外部系统自己的回退机制。
工作区回滚
迁移期间任何代码变更都先查看:最终切换标准
满足以下条件后,才适合把 Codex 作为团队默认工具:- 至少一个真实但低风险的任务在 Codex 中完成,并通过原有测试。
AGENTS.md能稳定加载,规则冲突有明确归属。- 模型、沙箱、审批和网络配置经过审查。
- Skills、MCP、Hooks、Plugins 各自完成发现、调用、失败和回滚测试。
codex exec的自动化脚本能正确处理退出码和日志。- 团队成员知道 Codex 与 Claude Code 的差异,而不是只收到一份新配置。
- 原有 Claude Code 配置至少保留到一个发布周期结束。
- 迁移文档记录了版本、日期、已验证范围和未解决风险。
小结
从 Claude Code 迁移到 Codex,最稳妥的方法不是寻找一份“一键转换器”,而是把每一项能力的意图重新落在 Codex 的边界上:项目知识进入AGENTS.md,行为配置重写为 config.toml,权限拆成沙箱和审批,命令级限制使用经过验证的 Rules,重复工作流迁移为 Skills,外部能力通过受限 MCP 接入,生命周期自动化改写为经过信任审查的 Hooks,Plugin 则最后安装并逐项验收。
记住四条底线:配置不要直接复制,权限不要只看是否询问,外部工具不要默认信任,迁移成功不要代替回滚准备。先只读、再低风险写入、最后接入有副作用的自动化,并用 Git 差异、测试结果、命令输出和日志证明每一步。这样即使某项兼容性在未来版本中变化,也能快速定位影响范围并恢复到已知可用状态。
参考资料:参考/codex/32-migrate-from-claude-code.md、参考/codex/11-agents-md.md、参考/codex/22-skills.md、参考/codex/20-mcp.md、参考/codex/24-hooks.md。