刚开始使用 Codex 时,很容易把它理解成“另一个 Claude Code CLI”。它们都运行在终端里,都能读取项目、执行命令和修改文件,但真正使用一段时间后会发现:两者更像是两套不同的工程工作台,而不只是换了一个模型。
本文记录我从 Claude Code CLI 迁移到 Codex 时最值得掌握的概念、命令和工作方式。
一、Codex 适合做什么
Codex 的核心定位是工程代理。它不只是输出代码片段,而是可以围绕一个目标完成一段完整的工程工作流:
- 理解陌生项目;
- 找到相关代码和配置;
- 修改实现;
- 运行构建、测试或检查;
- 根据失败结果继续修复;
- 查看最终差异并汇报风险。
因此,下面两种提问方式的效果通常不同:
| |
| |
第一种是在描述操作步骤,第二种是在描述工程目标。第二种方式给 Codex 留出了定位根因和选择实现方案的空间,也更容易在项目结构变化后继续工作。
二、一次任务的推荐流程
一个稳定的 Codex 任务通常可以分为五个阶段:
1. 先说目标和边界
明确希望改变什么,同时说明哪些东西不能改变:
| |
2. 让它先检查现状
对于陌生项目,先使用只读请求:
| |
这样可以先发现项目约定、已有未提交修改和环境限制,避免一开始就进入错误目录或覆盖现有工作。
3. 让它实施最小修改
实现阶段应该明确兼容性和范围:
| |
4. 要求验证
“文件已经修改”不等于“功能已经完成”。应该明确要求运行相关测试、构建或静态检查:
| |
5. 查看最终差异
交付前至少检查:
- 是否只改了任务相关文件;
- 是否误改了配置、日期或公开接口;
- 是否留下生成文件;
- 测试和构建是否真的执行过;
- 是否有未解决的环境限制。
三、Codex CLI 常用命令
先查看当前安装版本和完整帮助:
| |
Windows PowerShell 如果因为执行策略阻止 codex.ps1,可以使用对应的命令文件:
| |
启动和恢复会话
| |
非交互任务和审查
| |
配置和扩展
| |
常用启动参数
| |
--dangerously-bypass-approvals-and-sandbox 会绕过授权和沙箱。普通开发机不应该使用它;只有在外部环境已经完成隔离的自动化任务中,才有理由考虑这个选项。
四、交互中的斜杠命令
在 Codex 输入框中输入 /,可以打开当前版本支持的命令菜单。命令会随 CLI 版本、模型和启用的功能变化,所以菜单是最可靠的参考。
最常用的命令包括:
| |
/compact 和 Claude Code 中的同名命令概念接近:在长会话中压缩上下文并保留关键摘要。使用它之前,最好确认重要的约束已经写入 AGENTS.md,或者在后续请求中重新强调。
部分环境还会提供 /fast、/personality、/hooks、/vim、/keymap、/goal、/cloud 和 /local。如果菜单中没有显示,说明当前版本或配置不支持对应功能。
五、值得记住的快捷键
Enter 和 Tab 的区别
这是 Codex 与普通命令行交互很不一样的地方:
Enter:发送当前输入;Codex 工作时可以向当前轮次注入新指令;Tab:Codex 工作时把输入排队到下一轮;Esc两次:在输入框为空时,编辑上一条用户消息,并从那里创建分支;Ctrl+C:中断或退出当前会话;↑/↓:浏览输入历史或菜单项目;Page Up/Page Down:在较长界面中翻页。
简单来说:发现当前方向马上错了,用 Enter 纠正;想让它做完当前步骤后再处理另一件事,用 Tab 排队;想保留现有路线并尝试另一种方案,用双击 Esc 分叉。
如果当前版本支持 /keymap,可以检查和修改 TUI 快捷键;支持 /vim 时,可以把输入框切换为 Vim 编辑模式。
六、AGENTS.md 是 Codex 的项目说明书
Claude Code 常用 CLAUDE.md,Codex 使用 AGENTS.md 作为项目级持久说明。它适合保存每次工作都应该遵守的内容:
- 项目架构和关键目录;
- 构建、测试和格式化命令;
- 编码规范;
- 不应该直接修改的区域;
- 验证要求;
- 部署和 Git 约定。
例如,一个 Hugo 项目的 AGENTS.md 可以写成:
| |
一次性的要求不要写进 AGENTS.md。例如“这次只修改一个文件”属于当前任务的约束,直接在对话中说明即可。
七、权限和沙箱
Codex 不是在一个完全不受限制的 shell 中工作。常见边界包括:
- 工作区内文件可以读取和修改;
- 工作区外写入需要授权;
- 网络访问可能需要授权;
.git等目录可能具有单独权限;- 删除、大范围移动和绕过安全策略的操作会受到更严格限制。
需要额外权限时,Codex 通常会说明命令和用途。授权前应该看清楚具体目标,而不是把所有命令都当成同一种风险。
权限问题和代码问题要分开判断。一个命令因为没有权限执行,不代表实现本身错误;一个命令执行成功,也不代表结果已经验证。
八、自动模式、沙箱和审批策略
Codex 里经常被称为“自动模式”的能力,实际上由两层配置共同决定:沙箱决定命令能访问和修改什么,审批策略决定什么时候需要用户确认。两者不是同一个开关。
1. 交互中切换权限模式
在会话中输入:
| |
通常可以选择:
Auto:在当前安全边界内自动执行,适合日常开发;Read Only:只读分析,不修改文件;- 自定义权限配置:按当前环境使用已有的审批配置。
权限模式会影响后续操作,直到再次切换。需要审查代码时可以临时切换到 Read Only;开始实现功能时再切回 Auto。
2. 启动时指定沙箱和审批
日常本地开发可以使用:
| |
它允许 Codex 在当前工作区内修改文件,遇到需要越界或高风险的操作时再请求授权。
只读理解项目:
| |
完全关闭沙箱和审批:
| |
这个组合风险很高,不适合普通开发机。--dangerously-bypass-approvals-and-sandbox(也常见于旧资料中的 --yolo)会同时绕过审批和沙箱,只应在已经由外部环境隔离的自动化运行器中使用。
--full-auto 是旧的兼容参数,当前版本建议使用 --sandbox workspace-write,不要把旧参数当成首选配置。
3. 三种策略怎么选
| |
自动模式并不意味着“允许一切”。即便选择 Auto,Codex 仍可能因为工作区边界、操作系统权限、企业加密策略或网络策略而无法完成操作。
4. 常见误解
/plan是规划模式,不是自动执行模式;/fast是速度服务档位,不是权限模式;/permissions只改变 Codex 的审批行为,不能让它绕过企业透明加密;--add-dir适合增加某个明确目录的权限,不应直接把整个磁盘设为可写;danger-full-access和--ask-for-approval never叠加后,撤销错误操作会非常困难。
九、会话控制和长任务
1. 让会话保持可控
长任务最好分成几个可以验证的阶段:
| |
发现方向不对时:
- 用
Enter立即注入纠正信息; - 用
Tab把新任务排到当前轮次之后; - 双击
Esc编辑上一条消息,并从那里创建分支; - 用
/status查看上下文和会话状态; - 用
/compact压缩已经很长的上下文。
2. 目标和计划
复杂任务可以使用:
| |
它适合先拆解多步骤任务、记录验证点,再开始实际修改。对于简单的单文件修改,不必为了形式强行使用计划模式。
如果当前版本支持持久目标,也可以使用:
| |
目标适合跨多轮持续推进的工作,但仍然需要在每个阶段查看 diff 和验证结果。
3. 并行和分支
不确定两种实现方案时,可以使用 /fork 保留当前对话,再在分支中尝试另一种方案。涉及不同模块的独立任务,也可以使用 /agent 或 /subagents 查看子代理线程。
并行工作并不自动解决冲突。多个线程同时修改同一文件时,仍需要人工审查最终 diff。
十、配置文件和项目规则
除了 AGENTS.md,Codex 还可以通过用户级配置文件保存默认行为。常见的使用层级是:
| |
临时覆盖配置可以使用:
| |
不要把某一次任务的特殊要求写入全局配置或 AGENTS.md。例如“这次只读审查”属于当前任务;“这个仓库永远不能直接修改主题文件”才适合放入项目规则。
项目规则应该描述可验证的约定,例如构建命令、目录边界和测试要求,不要写成无法判断的泛泛要求。
十一、从 Claude Code CLI 迁移时的实际差异
1. 不要假设工具环境相同
两者虽然都在终端中运行,但启动进程、shell、沙箱、配置文件和工具实现可能不同。同一个 Get-Content 或 git 命令,在两个客户端中读到的内容可能不一样。
2. 规则文件不同
可以同时保留:
| |
两者可以共享项目事实,但不要假设某个客户端会自动读取另一个客户端的专属规则文件。
3. 任务描述可以更偏向结果
以前如果习惯给 Claude Code 拆解很多 shell 步骤,在 Codex 中通常可以把提示改成最终目标,再补充边界和验收条件:
| |
4. 验证要求要明确写出
无论使用哪个客户端,都不要默认“代码生成成功”就是“任务完成”。明确要求测试、构建和 diff 检查,结果会稳定很多。
十二、透明加密环境中的一个陷阱
如果电脑安装了企业透明加密软件,文件在磁盘上可能是密文,而被列入白名单的编辑器可以在进程内看到明文。
这会导致一个很容易误判的现象:
- IDE 中打开文件是正常中文;
- Claude Code 读取文件也是明文;
- Codex 或命令行工具读取到
%TSD-Header-###%和乱码。
这不是 UTF-8 编码问题,而是不同进程拿到的磁盘视图不同。
遇到这种情况,先确认文件头和读取进程,不要尝试手动把 %TSD-Header-###% 替换回 Markdown 头部,也不要对密文执行格式化、批量替换或重新编码。正确做法是使用管理员批准的明文工作流,或让企业加密软件管理员将实际使用的进程加入可信范围。
一个有趣但需要谨慎理解的现象是:新建文件不一定自动加密。加密策略可能依赖文件类型、目录、创建进程和受控程序,不能因为某一个新文件是明文,就断定整台机器没有加密客户端。
十三、常见故障排查
Codex 读到乱码或 %TSD-Header-###%
优先判断为透明加密或进程白名单问题,而不是 UTF-8 编码问题。检查文件头、读取进程和文件所在目录,不要直接改文件头或批量重新编码。
命令提示没有权限
先确认命令的目标是否在工作区内,再决定是否通过 /permissions 或一次性授权放行。需要访问工作区外的单个目录时,优先使用 --add-dir,不要直接打开完全访问。
Codex 修改了文件但没有真正完成
检查它是否执行了构建和测试。可以继续发送:
| |
上下文太长,回答开始重复
使用 /compact,然后重新强调不可违反的约束、当前失败点和验收标准。长期规则应移动到 AGENTS.md,不要依赖模型记住几十轮之前的对话。
Windows 上 codex 不能运行
如果 PowerShell 阻止 codex.ps1,尝试:
| |
Git 子模块或外部目录无法写入
这通常是 Git 配置目录或沙箱边界的权限问题。先确认目标路径,再请求精确的写入授权;不要用完全访问模式掩盖路径配置错误。
十四、以 Hugo 博客为例的推荐工作方式
对一个 Hugo 博客,我会把一次内容任务写成这样:
| |
如果文章已经确定要发布,还需要同步维护文章索引:
- 更新
posts-index.md的文章列表; - 重新编号;
- 刷新总数、日期范围、分类统计和系列统计;
- 确保 Tags 列与 front matter 一致。
内容工作也应该遵守 Git 工作流:先看 git status,修改后看 git diff,确认无误后再提交和推送。
十五、最后的使用建议
刚开始使用 Codex 时,不必记住所有命令。先掌握下面几个就足够覆盖大部分工作:
| |
真正影响结果的,通常不是记住更多快捷键,而是把目标、范围、约束和验收标准说清楚,并要求 Codex 给出验证证据。
可以把 Codex 当成一个能够操作工程环境的协作者,而不是只会输出代码片段的聊天机器人:让它先理解真实项目,再进行小范围修改,最后用构建、测试和 diff 证明工作确实完成。
参考: