Skip to content
目录

05 — apply_patch 与文件编辑路径

为何需要专用 patch 语言

大模型编辑文件时,若直接传「全文替换」,易超长上下文、易冲突。结构化 patch(带路径与上下文)更利于审查与回滚,也与 Unix patch 心智对齐。Codex 在 codex-apply-patch crate 中实现解析与应用,并把 给模型的说明 放进 apply_patch_tool_instructions.md(常量 APPLY_PATCH_TOOL_INSTRUCTIONS)。

进程内契约:--codex-run-as-apply-patch

apply-patcharg0 之间存在 刻意拆分 的常量契约,避免依赖倒置:

28:35:codex-rs/apply-patch/src/lib.rs
/// Special argv[1] flag used when the Codex executable self-invokes to run the
/// internal `apply_patch` path.
///
/// Although this constant lives in the `codex-apply-patch` crate (to avoid forcing
/// `codex-arg0` to depend on `codex-core`), it is part of the "codex core"
/// process-invocation contract between the apply-patch runtime and the arg0
/// dispatcher.
pub const CODEX_CORE_APPLY_PATCH_ARG1: &str = "--codex-run-as-apply-patch";

codex-arg0 在解析 argv1 后进入 apply_patch 逻辑;codex-core README 亦要求:包含 codex-core 的二进制在 arg1 为该标志时 模拟虚拟 apply_patch CLI

原因归纳

  1. 沙箱内执行:子进程可能是「最小权限」视图下的 codex 重入,而非 shell 里随便一个脚本。
  2. 单二进制分发:用户只装一个 codex,通过 argv 切换角色,减少 PATH 劫持面。
  3. crate 依赖卫生:常量放在 apply-patcharg0 不必依赖臃肿的 core

apply_patch / applypatch argv0

arg0 同时识别 apply_patch 与常见拼写错误 applypatch,提升 CLI 人因工程(模型或用户输错仍可能命中帮助路径)。

错误类型:ImplicitInvocation

ApplyPatchError::ImplicitInvocation 表示 检测到 patch 体但没有显式 apply_patch 调用。强制显式调用可保证:

  • 审计链上有 工具调用边界
  • UI 可做 针对性审批applyPatchApproval);
  • 避免「模型在普通文本里夹带可执行补丁」的模糊地带。

与审批流的衔接

App-Server / MCP 文档描述服务端向客户端发 applyPatchApproval,携带 callIdfileChanges 等。patch 应用是 高危操作,与 exec 审批对称设计。

延伸阅读

MIT License.