Skip to main content

这页解决什么问题

如果你已经在使用 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 当前配置的只读副本。
Windows PowerShell 可以使用以下等价操作。路径按你的实际用户目录调整:
上面的备份命令只用于保留结构,不要把真实 token、私钥或客户数据提交到仓库。配置备份应放在仓库外,或者先去除敏感值。 盘点时记录以下内容:
  1. 所有层级的 CLAUDE.md 和 CLAUDE.local.md。
  2. settings.json 中的模型、权限、环境变量和 Hook。
  3. 项目使用的 Skills、Skill 触发条件和附带脚本。
  4. MCP server 的启动命令、URL、认证方式和实际使用工具。
  5. Hooks 的事件、matcher、脚本、超时和退出码。
  6. Plugins 的来源、版本、包含的 Skill、MCP、命令和 Hook。
  7. 常用斜杠命令、脚本调用方式和 CI 集成。
  8. 现有测试、格式化、构建和发布命令。
建议把盘点结果放在迁移清单中,而不是直接交给代理自由改写。每一项都要有“来源、目标、验证方式、回滚方式”。

阶段一:迁移项目规则

CLAUDE.md 到 AGENTS.md

Codex 读取的是 AGENTS.md。项目根目录通常放一份,子目录可以按模块添加更具体的规则。全局规则位于 Codex 主目录中的 AGENTS.md 或 AGENTS.override.md,默认主目录是 ~/.codex,也可能由 CODEX_HOME 改变。 Codex 构建项目指令时通常从 Git 根目录一路走到当前目录。每个目录最多选择一个指令文件,优先级一般是:
  1. AGENTS.override.md。
  2. AGENTS.md。
  3. project_doc_fallback_filenames 中配置的备选文件名。
找到的文件会从上到下拼接,越接近当前目录的内容越晚出现,冲突时通常由更近的规则主导。AGENTS.override.md 只替换同一目录中的 AGENTS.md,不会删除全局层或上级目录已经加载的指令。 这与 CLAUDE.local.md 的“附加本地内容”思路不同。迁移前先判断你原来的本地文件是补充规则,还是要在该层完全替换规则。如果只是个人偏好,优先使用用户级规则或单次提示;如果必须临时替换同级项目说明,再使用 AGENTS.override.md。

迁移内容的取舍

应保留每次任务都需要的事实:
  • 项目用途和主要入口。
  • 语言、框架、包管理器和关键运行时版本。
  • 测试、Lint、格式化、构建和启动命令。
  • 必须遵守的命名、目录和接口约定。
  • 禁止修改的目录或文件。
  • 删除数据、改依赖、迁移数据库、发布和外部写操作前的确认要求。
应删除或移出以下内容:
  • 公司历史、产品愿景和长篇背景故事。
  • 代码本身已经明确表达的目录说明。
  • 已经由 formatter、linter 或 CI 强制执行的重复规则。
  • 过期的命令、已经不存在的服务和旧版本信息。
  • 需要用户每次判断的动态信息。
Codex 的项目说明合并内容默认受 project_doc_max_bytes 限制,常见默认值是 32 KiB。这个限制按合并后的总大小计算,不是只看某一份文件的行数。超限时优先精简或按目录拆分,不要先无限增大上限。

推荐的 AGENTS.md 骨架

兼容过渡

如果团队暂时需要同时使用两种工具,不要立即删除 CLAUDE.md。可以把规范正文整理成一份中立的团队文档,然后分别生成 Claude Code 和 Codex 的入口文件。也可以在 ~/.codex/config.toml 配置:
这只是过渡机制。它让 Codex 在找不到 AGENTS.override.md 和 AGENTS.md 时尝试备选名称,不代表 Claude Code 与 Codex 的所有语义已经兼容。长期方案仍然是维护明确的 AGENTS.md,避免队友不知道哪份文件是 Codex 的权威入口。 验证规则是否加载,不要让代理直接修改代码。进入项目目录后执行:
核对输出是否包含项目命令、包管理器、禁区和验收要求。再从一个子目录启动,验证更近的规则是否按预期生效:

阶段二:迁移配置与权限

JSON 到 TOML

Claude Code 的 settings.json 不能直接改名为 config.toml。迁移时先列出你真正使用的意图,再逐项寻找 Codex 字段:默认模型、推理强度、沙箱、审批、MCP、Hooks、项目说明文件和功能开关。 一个最小 Codex 配置可以是:
TOML 使用 =,分组使用 [section],数组使用方括号,行末不写 JSON 风格的逗号。不要把 settings.json 中未知的字段原样塞进 TOML;未知键可能被忽略,也可能导致解析失败。 配置通常分为用户级和项目级: 项目级配置尤其要谨慎。陌生仓库中的配置可能声明外部 server 或 Hooks;只有在确认仓库可信、内容经过审查后才启用。

权限模型的迁移方式

Claude Code 常按 permission mode 决定整体行为,并用 allow、ask、deny 针对工具或命令细分。Codex 将两个问题分开:
  • 沙箱决定代理可以触及的范围。
  • 审批策略决定越过限制或执行敏感动作时是否询问。
常见的 Codex 沙箱是: 审批策略通常包括: 迁移时不要把“Claude Code 中不询问”直接翻译为“Codex 全面放权”。approval_policy = "never" 只是不询问,能力范围仍由沙箱决定。相反,danger-full-access 也不应作为日常默认值。 推荐的迁移起点是:
在没有 Git 的临时目录中尤其要谨慎。Codex 可能采用更保守的只读默认值;不要为了绕过提醒就直接使用完全访问。workspace-write 下网络通常默认关闭,确需访问网络时再显式启用,并说明访问目标。

Rules 的位置

如果你需要把 Claude Code 的某条 deny 规则迁移成命令级判断,可以研究 Codex Rules。Rules 使用 .rules 文件和 prefix_rule,常见用户级位置是 ~/.codex/rules/default.rules。它属于实验性能力,字段和行为以本机文档为准。
规则决策通常分为 allow、prompt 和 forbidden,更严格的结果优先。写完后先检查,不要直接在真实发布流程中试:
简单的命令前缀限制适合 Rules;按复杂输入、文件内容或事件上下文判断时才考虑 Hook。沙箱仍然是整体边界,Rules 不是沙箱的替代品。

阶段三:迁移 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 可以这样改写:
Codex 使用渐进式披露:会话初始主要看到 Skill 的名称、描述和路径,真正匹配后才读取完整正文。因此描述要把最重要的触发词放在前面。不要把所有项目背景都塞进描述;也不要使用模糊的“处理代码任务”这类描述。

显式与隐式调用

显式调用适合有副作用的工作流:
也可以在会话中使用:
隐式调用依赖 description 自动匹配。对“发版”“删除数据”“修改生产配置”这类高风险 Skill,建议关闭隐式调用,在 Skill 的 agents/openai.yaml 中使用当前版本支持的策略字段,例如:
这样只有用户明确 $release-check 时才会调用。请先用本机版本验证字段名称。 Skill 重名时不要假设近处的定义会覆盖远处的定义。不同层级可能同时出现在选择器中,因此团队命名要带清晰的作用域或用途。通过 /skills 检查实际发现结果,必要时禁用不再使用的 Skill。

Skills 的迁移验收

对每个 Skill 逐项执行:
  1. 在干净测试仓库中确认 /skills 能看到它。
  2. 用一条明确的人话验证隐式触发。
  3. 用 $name 验证显式触发。
  4. 检查脚本使用的路径、环境变量和命令在 Codex 中存在。
  5. 对副作用操作确认默认不会隐式执行。
  6. 保存一次运行日志和预期结果。

阶段四:迁移 MCP

协议相同,配置方式不同

MCP server 通常可以复用同一套 server 实现,但不能复用 Claude Code 的配置命令和作用域参数。Codex 主要支持两类连接:
  • STDIO:在本机通过命令启动进程。
  • Streamable HTTP:连接远程 URL,可使用 Bearer token 或 OAuth。
Claude Code 中类似下面的作用域参数:
不要直接照搬。Codex 用配置文件位置表达范围:用户配置放在 ~/.codex/config.toml,项目配置放在受信任项目的 .codex/config.toml。

添加 STDIO server

可以先用命令查看本机支持的参数:
典型添加方式如下:
注意 -- 后面才是 server 的启动命令。等价的 TOML 结构通常是:
本地 server 的运行前提要重新检查,例如 Node.js、Python、可执行文件路径和环境变量。不要把 token 写进 config.toml:

添加远程 HTTP server

远程 server 使用 URL,并让配置引用环境变量:
认证 token 留在环境变量或凭据管理器中。需要 OAuth 的 server 使用本机支持的登录命令,例如:

限制 server 的能力

迁移时不要因为 Claude Code 原来默认放行,就把整个 MCP server 自动批准。可以按当前版本支持的字段控制:
enabled_tools 和 disabled_tools 的具体优先级以本机文档为准;常见行为是先限制白名单,再应用黑名单。陌生 server 默认只读、逐次审批,确认来源和数据边界后再放宽。 在会话中使用以下命令检查 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 等事件中通常表示反馈、退回或要求继续。
  • 其他退出码:按当前版本的错误处理行为验证,不要依赖未定义语义。
需要精细控制时输出事件对应的 JSON,例如拒绝工具:
不要用 stdout 的普通文本假设所有事件都会理解它。不同事件对纯文本、stderr 和 JSON 的处理不同,应先用模拟 stdin 单独测试脚本,再连接到真实会话。

Codex 特有的信任步骤

非托管 Hook 默认可能不会执行。新增或修改 Hook 后,启动 Codex 并运行:
逐项查看来源、命令、路径和哈希,确认无误后再信任。改动脚本哪怕只有一个字符,也可能需要重新信任。不要在日常环境中使用绕过 Hook 信任的危险启动选项;CI 若确需非交互运行,应在隔离环境审查来源后再决定。 临时关闭全部 Hooks 时,当前版本可能使用:
这不是 Claude Code 的 disableAllHooks 直接替代,使用前必须查本机帮助。更好的回滚方式通常是禁用单个 Hook 或恢复备份,而不是全局关闭所有自动化。

Plugins 的迁移策略

Plugin 往往是 Skills、MCP、Hooks、命令或配置的打包与分发单元。不要把 Claude Code Plugin 的目录复制到 Codex 后就认为它可用。先列出插件包含的资源,再按 Codex 的资源类型逐项迁移。 推荐顺序如下:
  1. 只迁移一个最常用、风险最低的 Skill。
  2. 再迁移不含写操作的 MCP server。
  3. 最后审查 Hooks、命令和发布能力。
  4. 在测试仓库中安装,记录插件版本和来源。
  5. 检查插件是否带有隐藏的网络、文件写入或自动触发逻辑。
Skill 是工作流的编写格式,Plugin 更偏向打包和分发格式。团队插件应固定来源和版本,避免每台机器从不同地址安装出不同结果。安装器命令和目录以当前 Codex 版本为准,安装后用 /skills、/mcp 和 /hooks 分别验证,不要只看安装命令返回成功。

命令和工作流映射

交互命令

命令同名不代表输出和副作用相同。迁移脚本前逐条运行 codex <subcommand> --help。不要在 CI 中假设交互命令可用;优先使用 codex exec 和明确的退出码、输出格式。

工作流映射

Claude Code 中常见的“先探索再修改”流程在 Codex 中仍然适用:
  1. 进入正确的 Git 工作区。
  2. 查看 AGENTS.md 和项目 README。
  3. 让 Codex 总结现状并列出计划。
  4. 使用只读沙箱或保守审批开始探索。
  5. 确认范围后切换到工作区写入。
  6. 小步修改,每次查看 diff。
  7. 运行最小代表性测试,再运行完整验证。
  8. 检查密钥、生成物和无关文件。
  9. 由用户明确批准后提交、推送或发布。
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。
如果基线本身不通过,先记录它,不要在迁移过程中把旧问题误判成 Codex 造成的回归。

第 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 Code 配置保留一个发布周期,不要在首次成功后立刻删除。

兼容差异清单

不能直接假设的事项

  • 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 作为团队默认工具:
  1. 至少一个真实但低风险的任务在 Codex 中完成,并通过原有测试。
  2. AGENTS.md 能稳定加载,规则冲突有明确归属。
  3. 模型、沙箱、审批和网络配置经过审查。
  4. Skills、MCP、Hooks、Plugins 各自完成发现、调用、失败和回滚测试。
  5. codex exec 的自动化脚本能正确处理退出码和日志。
  6. 团队成员知道 Codex 与 Claude Code 的差异,而不是只收到一份新配置。
  7. 原有 Claude Code 配置至少保留到一个发布周期结束。
  8. 迁移文档记录了版本、日期、已验证范围和未解决风险。

小结

从 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。