🟢 入门

Codex CLI 怎么用

一个住在你终端里的 AI 编程代理:你说人话下指令,它读代码、改文件、跑命令——装完到用顺,一条能跑通的路。

📅 更新于 2026-09-13

本文校对于 OpenAI Codex CLI @ 0.154.0 · 官方源:learn.chatgpt.com/docs/codex/cli

4
种安装方式
3
档沙箱(能碰多少)
2
档审批(什么时候问你)
10
个常见坑

0030 秒速览:三句话、一张处境表、一条上手路径

读完这一篇,你能自己判断三件事:这个工具能不能替你干活、它干活时会被什么卡住、以及你什么时候必须自己看一眼再放行。它不教你怎么写代码,教的是怎么指挥一个会写代码的代理。

🔑 先记住三句话(后面全是细节)

① 它不是"你问我答给你一段代码",而是直接在你的项目里动手——读文件、改文件、跑命令,改完汇报给你(01)。② 管住它靠两个互相独立的开关:沙箱决定它技术上"能碰到哪",审批决定它什么时候"必须停下来问你";默认是"工作区内自己干、越界先敲门"(08)。③ 它没有"撤销键",回退能力来自你的 git——开工前 git commit 一次,比任何安全设置都管用(12)。

按你的处境,直接用这个

你现在的状态直接用这个为什么 / 看完你会知道
我只是想问几个问题,不想装东西用网页版 ChatGPT为一个小问题起一个带沙箱的本地代理不划算(04)
我有 ChatGPT 订阅,想在终端里干活codex login(用订阅登录)订阅额度直接复用,不用另外付 API 钱(05)
我要把它塞进脚本 / CIcodex exec + CODEX_API_KEY一次性跑完就退出,不等人按按钮(11)
我刚进一个陌生的开源仓库codex --sandbox read-only先让它只读侦察:它看得见、碰不动,翻车概率最低(10)
我要改一个重要文件,怕它乱动开工前 git commit,改完看 /diff沙箱不是撤销键;git 才是你的后悔药(12)
它老是不按我的项目规矩来在项目根写一份 AGENTS.md它每次开工前都会自动读这份说明书(09)
它每次改完我都得自己去跑测试把验证命令写进指令或 AGENTS.md让它"自证",而不是嘴上说改好了(10)
公司网络走内网证书 / 服务器没有浏览器codex login --device-auth设备码登录:终端给一个网址加一次性代码(05)
我想让它用别的模型(含本地模型)配置 [model_providers.xxx]把"干活的大脑"换成 OpenAI 兼容的后端(13)
我在只看不练,想一次读完按侧边栏顺序读,跳过 08 与 11 也只影响完整性08 与 11 是"边界"和"自动化",可以回头补

一条可执行的上手路径

1
装上并登录,只花 3 分钟,别多做(05)

curl -fsSL https://chatgpt.com/codex/install.sh | sh,然后 codex --version 确认装上了。登录直接 codex login,有订阅就用订阅;没有桌面浏览器就 codex login --device-auth。

2
建一个不怕坏的练习目录,跑通一次"只读侦察"(约 10 分钟,10)

mkdir ~/codex-practice && cd ~/codex-practice && git init,放一个几行的小文件,然后 codex --sandbox read-only,只让它解释这个目录里有什么。先建立"它看得见、碰不动"的体感。

3
做第一次真实改动,全程盯着 diff 和审批(约 20 分钟,06)

默认档位下让它给那个小文件加一个函数并跑一次验证。在每个"等你批"的节点停下来读一眼,不要一路按 y。

4
把项目规矩固化下来(长期,09)

在这个练习目录敲 /init 生成一份 AGENTS.md 草稿,补上"怎么跑测试、哪些目录别碰、提交前先给我看 diff",然后继续用它干活——你会发现它开始主动遵守你的约定。

📌 读完你应该能

用自己的话说清它和"网页聊天框"的区别;独立完成安装、登录、第一次带验证的改动;说得出沙箱与审批这两个开关分别管什么、默认档位是什么;并且知道什么时候该切到只读档、什么时候绝对不该开 --yolo。

本文讲的是跑在你自己终端里的 Codex CLI(0.154.0),不是网页里的云端 Codex,也不是编辑器插件。它迭代很快,命令与默认值以你本机 codex --help 输出为准。

01它到底是什么:一个会动手的代理,不是一块更长的聊天框

它是什么

Codex CLI 是 OpenAI 官方开源的一个"终端里的 AI 编程代理"。"代理(agent)"这个词的意思是:你说目标,它自己规划并按步骤执行——不是每步都等你说,而是在你给的边界内自己往前走。它的官方描述是一句话:a coding agent from OpenAI that runs locally on your computer(一个跑在你电脑本地的编程代理)。你在终端敲 codex 打开它,用自然语言说"把 src/login.js 里空密码抛错的 bug 修掉,改完跑 npm test 确认",它就会读文件、改文件、跑命令,最后把结果说给你听。

代码是开源的,用 Apache-2.0 协议发布,仓库在 github.com/openai/codex。新版主体是 Rust 写的原生程序,所以你看到的 npm、Homebrew、安装脚本这些入口,本质都在给你装同一个可执行文件。

它不像什么(先破四个错想)

❌ 错想一:它是"逐行猜我下一个字符"的补全

以为它像编辑器里的自动补全那样,只负责把这一行补完。

✅ 实际上:它整段理解一个任务,然后执行多步

补全(如 Copilot 那类)只预测"下一行写什么";代理是"理解这个任务 → 读相关文件 → 规划 → 改多处 → 跑命令验证"。它动的是你的文件,不只是你的光标位置。

❌ 错想二:它像网页聊天那样"给你代码让你复制"

以为拿到的是代码片段,装不装、跑不跑、对不对,全得你自己来。

✅ 实际上:它直接在你项目里落盘并验证

它写进文件、跑你的测试、把输出贴回来。你负责的是审阅和批准,而不是搬运。

❌ 错想三:它是"一条命令自动交付"的全自动流水线

以为开一个开关就从头跑到尾,中间不用管。

✅ 实际上:它是一个"提议 → 等你批 → 动手 → 汇报"的循环

默认档位下它改文件、跑命令前会停下给你看,你点头它才继续。

❌ 错想四:装了就等于"免费无限用"

以为开源软件就等于不要钱。

✅ 实际上:程序开源,但推理要钱

它开源的是客户端程序;写代码的"脑子"是云端模型,要么走你的 ChatGPT 订阅额度,要么走 API 按用量计费(03)。

它和网页版、IDE 插件是不是一回事

不是。OpenAI 的 Codex 有好几种形态,能力相近,但"跑在哪、钱给谁、怎么控制"完全不同。本文只讲第一行那个 CLI。

形态跑在哪你怎么用它什么时候选它
Codex CLI(本文)你自己的电脑,本地终端敲 codex,操作本地文件与命令深度改码、要看清每一步、要接脚本
IDE 扩展VS Code / Cursor / Windsurf 里在编辑器里对选区或打开的文件下指令你本来就在编辑器里,想让代理看得见你选中的代码
Codex 桌面应用macOS / Windows 图形界面终端敲 codex app 打开想要图形界面与会话管理,不想背命令
Codex Web / 云端OpenAI 托管的远程环境在 chatgpt.com/codex 里提交任务本机没环境、想临时用、想去开个 PR
⚠️ 一句容易搞混的话:登录是共享的,东西不是

CLI 与编辑器扩展共用同一份本地登录缓存(同一个账号,登一次两边都算登了),所以你可以"终端干重活、编辑器里随手问"。但它们是不同的程序、不同的边界:"我在网页版里用过 Codex"不等于"我会用 CLI"。本文所有命令只适用于本地 CLI。

它帮你干的是哪几类活

改代码 / 修 Bug(最主要的用途:你描述需求,它规划、跨文件修改、跑验证)· 读懂陌生项目(问它"这项目是干嘛的、模块怎么分工",适合刚接手别人代码的第一天)· 跑命令 / 自动化(跑测试、批处理、审 diff,还能用 codex exec 接进脚本和 CI)· 写文档 / 注释(几十个文件的重复文本劳动,它不改逻辑,风险最低、性价比最高)。

02没有它会怎样:一条断掉的链路

传统"用 AI 写代码"卡在哪

不用代理的时候,你大概是这样干的:在网页聊天框问 AI → 拿到一段代码 → 手动复制进编辑器 → 手动装依赖、跑测试 → 报错再贴回去问……问题不在"AI 写得不好",而在每一步之间都要你人工搬运一遍,而且 AI 看不见搬运后的结果。

❌ 断链的用法:五次人工搬运

1. 在网页问 AI
2. 复制代码贴进编辑器
3. 自己装包、跑测试
4. 报错复制回去重新问
5. 自己 git add / git commit

链路是断的:AI 看不到第 3 步的结果,也管不了第 5 步。

✅ 代理的用法:一条链路自己闭环

1. 在终端说"修这个 bug,改完跑测试确认"
2. 它读库、改文件、跑测试
3. 改动前把 diff 给你看、征求同意
4. 你审阅后说"好",它汇报结果

你只剩两件事:下指令、审阅。

它把哪些环节收进去

它收进去的是"看代码、改代码、验证、交给版本库"这一整条链路。注意最后一个环节:它并不替你决定"要不要提交",而是把"现在改了哪些文件"变成一份随时可查的 diff(改动差异,一行行告诉你加了什么、删了什么)。

为什么它要装"沙箱"这么重的东西

因为一个能自己跑命令的程序,风险也是自己跑出来的:它可能删掉你的文件、可能把密钥发到网络、可能在你不知情时改了别处的配置。官方的说法是——安全由两层共同构成:沙箱管"技术上能碰到哪",审批管"什么时候必须问你";两层配合带来的那句关键陈述是:你信任的不是代理的意图,而是它运行在被强制执行的边界之内(原文:You aren't just trusting the agent's intentions; you are trusting that the agent is operating inside enforced limits.)。这句话值得记住,它是理解后半篇文章的钥匙。

💡 一个能记住一辈子的类比

把它想成你雇来的装修工:沙箱 = "只许在这套房子里动",审批 = "动承重墙之前先问你"。这个类比到这里失效:装修工不会因为你不在就忘记你交代过的话,而这东西的记忆只有当前这次会话——换一次会话它就可能忘掉你早先说过的偏好。所以项目级的约定要写进文件(09),不能靠嘴说一次。

03钱、模型和"能不能离网":六个现实问题

它收费吗

程序本身免费(开源),但"写代码的脑子"在云端,所以一定有成本,两条路选一条:

维度ChatGPT 订阅登录(日常推荐)API Key 登录什么时候选哪条
计费方式走你的 ChatGPT 套餐额度(Plus / Pro / Business / Edu / Enterprise 等)按用量计费,走 OpenAI 平台标准费率天天在电脑前写代码 → 订阅;要在 CI 里跑 → API Key
登录命令codex login(浏览器)printenv OPENAI_API_KEY | codex login --with-api-key服务器无浏览器 → 加 --device-auth
团队 / 云端功能可用(部分工作区功能依赖订阅身份)部分受限或不可用要团队功能就老实用订阅登录
额度控制受套餐额度约束按密钥用量,可精确控成本给自动化单独发一把 Key,别用你的个人号

没有"完全免费无限用"这回事。官方原话是:用 API Key 登录时,按标准 API 价格计费,而不是用你套餐里包含的额度。

我的代码会被发到 OpenAI 吗

会,这是它"懂你项目"的前提:你让它读的文件内容、它跑出来的命令输出,都会送到云端模型做推理。官方在安全文档里也把这一点当成默认前提在写。所以:含密钥、含客户数据的文件,不要放它去读;确有合规要求的项目,先确认你们的数据处理条款再决定用不用。

断网能用吗

默认不能。有一个例外:你自己把模型供应方换成本地跑的模型(见 13 的 provider 配置),那才能离线干活——代价是本地模型能力普遍弱于云端旗舰模型,复杂改码更容易翻车。

它能连别的模型吗

能。默认连 OpenAI 自己的模型,也允许你配 OpenAI 兼容的后端(社区常用 Ollama、LM Studio 跑本地模型)。具体键名以你的版本与官方配置参考为准,别照抄网上某个旧版本的写法。

支持 Windows 吗

官方完整支持是 macOS 与 Linux;Windows 推荐走 WSL2(在 WSL2 里按 Linux 方式装)。原生 Windows 现在也有自己的沙箱实现,但需要额外设置,不是默认路径。Linux 侧还有一个前置条件:需要 bubblewrap(一个让程序在受限环境里运行的小工具),Ubuntu/Debian 用 sudo apt install bubblewrap,Fedora 用 sudo dnf install bubblewrap。

它和隔壁的 Claude Code / OpenCode 选哪个

维度Codex CLIClaude CodeOpenCode
出品方OpenAI 官方Anthropic 官方开源社区
默认模型OpenAI 模型(可自配后端)Claude 模型供应商可配
开源性Apache-2.0部分开源开源
招牌能力系统级沙箱 + 审批的双层边界生态丰富、指令文件约定深入人心自由、社区驱动
给你的选择信号已有 ChatGPT 订阅或 API 用量,几乎零额外成本本来就常用 Claude想自己接各种模型

三者玩法大同小异,方法论通用——学会一个,另外两个上手都很快。真要选,最靠谱的办法是拿同一个练习项目跑同一个任务,比手感,而不是比参数表。

04什么时候不该用它:四种诚实的例外

这一节不是客套。前面讲的是它擅长什么,这里讲它会让你后悔的四种情况。

你的情况为什么不该用它换个什么做法
只想问一句话,拿到一段现成代码为一个小问题起一个带沙箱的本地代理,又慢又贵直接用网页聊天
你打算完全不看改动,就让它大改它的价值来自你的审阅;不看 diff 的用法,只会不断给你留烂摊子先用只读档让它讲方案,确认方向再放权
代码属于高度敏感数据,不能出本机推理在云端,你让它读的内容就会传输用本地模型跑只读分析,或走你们合规的数据处理渠道
你完全不想碰终端,只想点鼠标它毕竟是命令行程序用它的桌面应用或编辑器扩展,那些是同一个代理的图形入口

一句话:它最适合"愿意下指令 + 愿意审阅"的人。它替你搬的是体力活(读库、改码、跑验证),判断力还得你自己出。

05从零到第一次改动:装、登、验

它要求什么环境

项目要求为什么是这条线
操作系统macOS 或 Linux(含 WSL2,即 Windows 里的 Linux 子系统);Windows 在 WSL2 内按 Linux 方式装;原生 Windows 有自己的沙箱但需额外设置沙箱依赖各系统的本地机制,官方支持范围跟着它走
终端会用"打开终端、粘贴、回车"就够你不需要会编程,只需要会下指令
网络需要能连上模型端点推理在云端,这是硬依赖
Linux 附加bubblewrapLinux 上的沙箱靠它实现;缺了会启动告警
Git建议提前装好codex exec 默认要求在 git 仓库里跑;回退也靠它
账号ChatGPT 订阅,或 OpenAI API Key二选一,见 03

装它的四种方式,选一种就好

下面每种都核对过官方文档。新手直接用第一种。

# 方式一:官方安装脚本(macOS / Linux,推荐)
curl -fsSL https://chatgpt.com/codex/install.sh | sh

# 方式二:Homebrew(macOS,你已经装了 brew 的话)
brew install --cask codex

# 方式三:npm(系统里已有 Node.js)
npm install -g @openai/codex

# 方式四:Windows(在 PowerShell 里)
powershell -ExecutionPolicy ByPass -c "irm https://chatgpt.com/codex/install.ps1 | iex"

安装脚本默认从 releases.openai.com/codex 下载;如果那边拿不到元数据或资源,会自动退回 GitHub Releases。想强制走 GitHub Releases,在命令前设一个环境变量:

curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_INSTALLER_USE_RELEASES_OPENAI_COM=false sh

也可以直接去 GitHub Releases 下压缩包,解压后把里面那个程序改名为 codex,放进 PATH(系统查找命令时依次搜索的那串目录清单)里的某个目录。Apple Silicon Mac 对应的文件名里带 aarch64-apple-darwin,Linux x86_64 对应 x86_64-unknown-linux-musl。

以后不想要了,怎么卸干净

按你当初的安装方式选一行:brew uninstall --cask codex(Homebrew 装的)或 npm uninstall -g @openai/codex(npm 装的)。如果连配置和登录态也不要了,再删掉主目录:rm -rf ~/.codex——这一步会一并删掉你的配置、AGENTS.md 与登录状态,只在确定不再用时执行。

装完先做三件事

1
确认命令在

codex --version。能打印出版本号(本文校对时是 0.154.0)就说明装上了。

2
看一眼你这个版本有什么

codex --help。这一步别省:Codex 迭代很快,网上旧教程里的子命令名可能已经变了,你本机的输出才是唯一权威。

3
登录

codex login 会打开浏览器让你用 ChatGPT 账号登录。登录信息会缓存在本地,CLI 和编辑器扩展共用这一份。

登录:三种情况分别怎么做

你的情况命令注意
有桌面浏览器codex login浏览器走完流程后凭据会回到终端
服务器上、没有图形界面codex login --device-auth设备码登录(beta):终端给你一个网址和一次性代码,在任意浏览器里输进去授权
要用 API Key(自动化 / 按量付费)printenv OPENAI_API_KEY | codex login --with-api-key用管道把 Key 喂进去,别让 Key 出现在终端历史里
企业自动化用 access tokenprintenv CODEX_ACCESS_TOKEN | codex login --with-access-token需要管理员在 ChatGPT Enterprise 工作区里授权
查看当前登录状态codex login status有凭据时退出码为 0,脚本里可以直接判断
退出登录codex logout清掉本地保存的凭据

公司环境要走内网证书的,在登录前设 CODEX_CA_CERTIFICATE 指向你们的根证书文件(没设时它会退回读 SSL_CERT_FILE):

export CODEX_CA_CERTIFICATE=/path/to/corporate-root-ca.pem
codex login

登录凭据存在哪

默认它是明文存在 ~/.codex/auth.json 这个文件里的——里面装的是你的访问令牌(access token,证明"你是你"的一串凭证)。官方给的建议原话级别就是:把它当密码对待。所以:不要提交进 git、不要贴进工单、不要在聊天里发给别人。

想不落明文,改配置用一个键就能切到系统钥匙串:cli_auth_credentials_store = "keyring"(写在 ~/.codex/config.toml 里)。四个取值的区别:file 写进 auth.json;keyring 存进系统凭据库(拿不到就直接报错);auto 能用系统凭据库就用、否则退回文件;ephemeral 只放在内存里、进程结束就没了(适合一次性环境)。

企业 / 受管环境才需要的开关

个人用户可以跳过这一小节,遇到公司 IT 提要求时再回来查:强制只用某一种登录方式用 forced_login_method = "chatgpt" 或 "api"(不匹配就登出并退出);限定只能登录某个工作区用 forced_chatgpt_workspace_id;凭据存储方式可以被管理员强制锁死,用户改不动。

06最小例子:从空目录到一段能跑的代码

下面这个练习大约三分钟,能一次验证四件事:装上了、登上了、它能读写你的文件、它能跑命令并把结果告诉你。全程只碰一个你自己建的练习目录。

第一步:准备一个能随便折腾的目录

# 建一个练习目录并进去
mkdir ~/codex-practice && cd ~/codex-practice

# 先变成一个 git 仓库 —— 这是你的后悔药,别跳
git init

# 放一个很小的起始文件
echo "console.log('hello')" > app.js

# 启动交互会话
codex

第一次启动它会让你登录。登录完你就看到交互界面了:下方是输入框,状态栏会显示当前模型、审批档位等信息。

第二步:下一条"能验证结果"的指令

关键是让它自己证明结果,而不是你手动去跑:

# 在 codex> 提示符后输入(这是你说的话,不是 shell 命令)
给 app.js 加一个 add(a, b) 函数并调用它打印结果,然后运行 node app.js 验证一下

你会看到一串动作:读 app.js → 给出打算怎么改 → 让你确认 → 写入文件 → 运行 node app.js → 把输出贴给你。如果这台机器没有 node,它会告诉你并且换个方式验证——观察它怎么面对失败,本身就是很好的第一次体验。

第三步:体验"不进会话、一句话出结果"

# 一次性问答,执行完自动退出(适合脚本化)
codex exec "app.js 是干什么的?逐行解释一下"

到这一步,最小闭环就走通了:听懂指令 → 读代码 → 动手改 → 跑验证 → 汇报。

💡 这个例子验证了什么

① 装成功了(不然没有 codex 命令);② 登录成功了(没登录会卡在认证);③ 它能读、能改你的文件,而且改之前会问你;④ 它能执行命令并把结果汇报给你。四条都通,它就能正式干活了。

如果它第一次就答非所问、越改越乱

这很正常,第一次跑偏不代表你装错了。用对指令把它扳回来,顺序别搞反:

  1. 立刻喊停,别等它改完再抱怨:"停。撤销刚才所有改动,回到我上一条指令之前的状态。"
  2. 重讲需求,这次带上"范围 + 不做清单":"我只重新说一遍:只改 src/app.js 的 add 函数,不要动其它文件,不要装新依赖,改完先给我看 diff,等我确认再继续。"
  3. 还是不行就退出重开,起一个更小的会话,只让它做其中一步。

它被你的指令引导,而不是你情绪的输出对象。模糊的需求 → 它自由发挥 → 你觉得离谱,这是这条链路的正常反应;把需求讲窄,它通常就回到正轨。

08安全边界:两个各自独立的开关

这一节是全文最该慢下来看的地方。新手最容易搞混的一点是:"它会问我"和"它碰得到"是两件不同的事,由两个不同的开关控制。

📖 官方对这两个词的定义

沙箱(sandbox):Codex 执行"模型生成的命令"时,技术上被允许做什么——比如能写哪些目录、能不能联网。
审批(approval policy):Codex 什么时候必须停下来问你——比如要越出沙箱、要联网、要跑一条不在可信清单里的命令。

先纠一个最常见的误解:沙箱不是"看不见你的代码"

不是。沙箱限制的是"它在你机器上能做什么",不是"你允许它读的内容会不会离开本机"。你让它读的文件、它跑出来的输出,都会送到云端模型。这两件事必须分开想:沙箱防的是"它在本地乱动",不防"数据出境"。敏感文件不要放它去读,这是唯一有效的做法。

"工作区"这个词指的是什么

工作区就是你启动 Codex 时所在的那个项目目录。默认档位下,这个目录里它可以自由读写,出了这个目录就要"敲门"。你可以用 -C 指定别的目录作为它的工作根,也可以额外放行几个目录:

# 指定工作根
codex -C ~/projects/myapp
# 除了工作区,再给某个目录写权限(推荐用这个,而不是直接开全权)
codex --add-dir ~/shared/lib

它管的命令比你想象的多

沙箱作用在它拉起的每一条子命令上——包括 git、包管理器、测试运行器,都继承同一套边界,不只是它内置的文件操作。这一点很多人没意识到:你让它跑 npm test,那条 npm 也一起被关进了同一个笼子里。

三档沙箱,一张表选完

沙箱档位(--sandbox)它技术上能干什么什么时候用别当什么用
read-only能读文件、能在只读沙箱里跑命令;不能改文件想先搞懂项目、让它讲方案;跑不熟的开源仓库别当成"它什么都不会做"——它仍然会读、会跑只读命令
workspace-write能在工作区内改文件、跑常规本地命令;默认不开网络日常开发(这是默认档)别以为工作区外它就碰不到——它只是会先问你
danger-full-access去掉沙箱限制,文件和网络全放开只在你确实需要全权、且环境隔离时别在真实本机上随手用

为什么工作区里也有"只读区"

因为有些文件一旦被代理改掉,你的回退能力就没了。所以即使在 workspace-write 下,下面这些路径仍然被强制只读(递归生效,它们下面的一切都只读):

工作区里的 .git(无论它是目录还是一个指向别处的指针文件,解析出来的真实路径也保护)、.agents 目录、.codex 目录——这三处在 workspace-write 下也是只读的,递归生效。这就是为什么你有时会看到"git commit 仍然需要审批":它在保护你的撤销能力,不是在找麻烦。

那谁来保护"文件内容"

沙箱只保护"能写哪些文件",不保护"文件里的内容对不对"。能回退你的东西只有 git。所以规矩很简单:让它在哪个目录干活,就先在那个目录 git init + git commit 一次干净基线;改坏了 git checkout . 一句话还原。你会在这篇里看到这句话重复出现,因为它比任何一个安全设置都实在。

审批档位有哪几种

审批档位(--ask-for-approval)含义什么时候用注意
on-request默认边界内它自己干,越界或需要问你的时候停下来问交互式使用(日常推荐)这是"低摩擦默认档",不是"什么都不问"
never从不弹窗,从头跑到尾非交互 / CI 等你已经控场的环境它不问你,不代表它不会做危险的事
{ granular = { ... } }按类别细调:沙箱升级、规则、MCP 提问、权限请求、技能脚本,各自可单独设想保留一部分提问、让另一部分直接失败关闭这是"中间档"的正规做法,比一刀切 never 安全得多
untrusted已停止支持——留着这个值可能导致客户端起不来不要再用。要同样的严格效果,改成项目信任设置(见下)这是旧版本写法,网上老教程里还有
on-failure已废弃,官方建议换成 on-request 或 never不要再用同上,属于过期写法

如果你想要的是"这个项目里的命令都要我批准"的那种严格效果,官方给的迁移做法是:不写 approval_policy,而是在用户级配置里把这个项目标成不可信:

# ~/.codex/config.toml
[projects."/path/to/project"]
trust_level = "untrusted"

这样这个项目里的命令默认都要批准,并且项目级的配置文件、hooks、规则也不会被加载。如果同时显式写了 on-request,它会覆盖这个"项目推导出来的策略"。

两个开关的推荐组合

场景命令它的实际行为
日常开发(默认档,官方叫 Auto 预设)不加参数,或 codex --sandbox workspace-write --ask-for-approval on-request工作区内自由读改跑;要改工作区外、要联网时来问你
只读侦察codex --sandbox read-only --ask-for-approval on-request能读、能在只读沙箱里跑命令,越界会问
无人值守、只读(CI)codex --sandbox read-only --ask-for-approval never只读沙箱内跑,全程不弹窗
自动审批(新的中间档)--approve-for-me,或配置 approvals_reviewer = "auto_review"沙箱边界不变,但"要不要批"交给自动审查来判,你少被打断
全权--dangerously-bypass-approvals-and-sandbox(别名 --yolo)无沙箱、无审批。官方标注"不推荐"
🚫 --yolo 是最后手段,不是"省事选项"

--dangerously-bypass-approvals-and-sandbox 会同时绕过审批和沙箱——官方对它的定位是"只应该用在外部已经隔离好的环境里"。在本机真实项目里随手用它,等于把家门钥匙交给一个会手滑的代理:它一旦跑出 rm、或者把密钥发到网络,没有任何兜底。顺带一个容易被忽略的连带后果:全权模式下网页搜索会默认切到"实时"档,它会真的去抓外网内容,而不只是查缓存。

联网默认是关的,要开怎么开

默认档位下 workspace-write 不开网络。需要联网(装依赖、抓接口文档)时显式打开:

# ~/.codex/config.toml
[sandbox_workspace_write]
network_access = true

只想给一次会话开:

codex -c 'sandbox_workspace_write.network_access=true'

再往后还有一层"网络白名单"([features.network_proxy]):只有当命令网络已经打开时它才起作用,可以按域名放行或拦截。这不属于新手必学,知道有这个东西就行。

网页搜索有四种档位

取值行为什么时候用
"cached"(默认)查 OpenAI 维护的网页索引缓存,不会真的去抓实时网页平时用它就够,且能降低被网页内容里藏着的恶意指令带偏的风险
"indexed"只有当请求被搜索索引放行时,才允许访问外部网页需要一点实时性、又想要闸门
"live"抓最新网页(等价于启动时加 --search)任务确实依赖最新发布、最新文档时
"disabled"关掉这个工具完全不需要它联网查资料

顺带一句:全权模式(--yolo 等)下,网页搜索默认就是 live。

13配置:把默认值固定下来

配置文件放哪、谁覆盖谁

两个最常临时改的参数:换模型、发截图

模型和图片这两件事通常不用写进配置,临时在命令行上给就行。直接抄这两条:

codex --model gpt-5.6 "把这个函数的命名统一一下"      # 只这一次用这个模型
codex --image "~/Desktop/报错截图.png" "这张报错是什么意思"  # 把一张图片一起交给它看

想固定下来就别每次敲——写进下面那张表里的用户级配置,或者在会话里用 /model 换。可用模型列表以 /model 弹出的为准,官方文档里给的只是示例。

想不用每次敲参数,就写进配置文件。Codex 会从多个位置读配置,优先级从高到低是这样:

层级路径说明
命令行参数(最高)codex -c key=value、启动时带的 flag只影响这一次运行
项目配置.codex/config.toml只在你信任该项目时才加载;从项目根往当前目录走,越近越优先
Profile 文件~/.codex/<名字>.config.toml用 --profile 名字 叠加的一整套预设
用户配置~/.codex/config.toml平时主要改这里(受 CODEX_HOME 影响)
云端下发的默认值随登录工作区下发公司统一配置
系统配置/etc/codex/config.toml(Unix)管理员统一配置
内置默认(最低)—出厂设置

项目级配置有一个安全前提:只有你信任的项目,它的 .codex/ 才会被加载——不信任时,项目里的配置、hooks、规则一起被跳过。所以别在随便 clone 来的仓库里无脑点"信任"。

最常改的那几个键

# ~/.codex/config.toml —— 按需增删,别照抄全量
model                  = "gpt-5.6"          # 默认模型;官方示例用 gpt-5.6,以你的可用列表为准
model_provider         = "openai"           # 用哪家供应商
approval_policy        = "on-request"       # 何时停下来问你
sandbox_mode           = "workspace-write"  # 文件/网络边界
web_search             = "cached"           # 联网搜索档位
model_reasoning_effort = "high"             # 推理努力程度:minimal | low | medium | high | xhigh
# 想用系统钥匙串存凭据,而不是明文文件
cli_auth_credentials_store = "keyring"
# 想给工作区多放行一个可写目录(不需要就别加)
# [sandbox_workspace_write]
# writable_roots = ["~/tools"]
⚠️ 模型名别照抄

不同账号、不同套餐、不同时期可用的模型不一样。把 model 写死成某个名字,可能某天突然失效。保险做法:先在会话里用 /model 看当前可用项,再把选中的落进配置。

一张表查常见配置键

键作用常见取值什么时候动它
model默认模型如 "gpt-5.6"你有明确偏好或某任务要用特定模型
model_provider用哪家供应商"openai" 或你自定义的名字要接本地模型时改
model_providers.<名>自定义供应商(OpenAI 兼容后端)见下一小节换大脑时
approval_policy何时停下来问你"on-request" / "never" / { granular = {...} }被审批打断太频繁、或要跑无人值守
sandbox_mode命令的文件/网络访问边界"read-only" / "workspace-write" / "danger-full-access"要收紧或放开权限时
default_permissions指定命名权限方案":read-only" / ":workspace" / ":danger-full-access" 或自定义名想复用一套配置好的方案时
sandbox_workspace_write.network_access工作区内是否允许联网true / false(默认 false)任务要装依赖、访问接口
web_search联网搜索档位"cached" / "indexed" / "live" / "disabled"需要最新资料,或想彻底关掉
model_reasoning_effort默认推理努力程度"minimal" / "low" / "medium" / "high" / "xhigh"任务变难时提高;简单活提高只是多花钱
cli_auth_credentials_store登录凭据存哪"file" / "keyring" / "auto" / "ephemeral"不想留明文凭据
project_doc_max_bytes指令文件最多读多少字节默认 32768(32 KiB)指令被截断时调大
project_doc_fallback_filenames除了 AGENTS.md 还认哪些文件名如 ["TEAM_GUIDE.md"]团队已有别的约定文件名
personality它说话的默认风格"friendly" / "pragmatic" / "none"嫌它太啰嗦或太冷,会话里也能用 /personality 临时改
review_model跑 /review 时单独用的模型不设则用当前会话模型想用更强(或更便宜)的模型专门做审查
trust_level(写在 [projects."路径"] 下)把这个项目标成可信 / 不可信"untrusted" 表示更严格不可信时项目级配置、hooks、规则全都不加载
log_dir日志写到哪(设了它才会生成明文 TUI 日志;TUI 就是你在终端里看到的那个交互界面)绝对路径要排查它到底读了哪些指令文件

命名权限方案不是"额外的沙箱"

较新的文档把文件与网络边界进一步抽象成可命名、可复用的权限方案,内置三档::read-only、:workspace、:danger-full-access,用 default_permissions 指过去。自定义方案写在 [permissions.<名>] 里,还可以 extends 内置档再叠加规则。同一个方案内部有一条让人安心的优先级:禁止 > 写 > 读,同优先级时更具体的路径压过更宽的路径——也就是说,禁止永远压过允许。

⚠️ 别把两套体系混着写

官方明确提醒:default_permissions 不要和 sandbox_mode 或 [sandbox_workspace_write] 混用。一次会话选一套体系配置,两套都写只会让你自己搞不清哪条生效。

换模型供应商(含本地模型)

Codex 允许把"干活的大脑"换成别的 OpenAI 兼容后端,通过 [model_providers.<名>] 定义。想试本地模型,最省事的路径是:先在本地把 Ollama 跑起来并拉一个模型,再在配置里加一段并切过去。

# ~/.codex/config.toml
model_provider = "ollama"   # 全局切到本地供应商
[model_providers.ollama]
name     = "Ollama"
base_url = "http://localhost:11434/v1"
wire_api = "chat"
认证方式配置什么时候用
走 OpenAI 认证requires_openai_auth = true你通过一个代理服务器访问 OpenAI 模型
环境变量里的 Keyenv_key = "某个环境变量名"供应商有自己的 API Key
不需要认证两个都不设本地模型,通常不需要 Key
⚠️ 本地模型的甜与苦

好处:代码数据不出本机、可离线、没有 API 计费。代价:能力普遍弱于云端旗舰模型,复杂改码的翻车率更高。比较务实的用法是把它当"第二大脑"做只读分析、简单生成,重活仍交回默认供应商。

临时改一次,不动配置文件

-c 是所有配置里优先级最高的,用完即走:

# 单次用某个模型跑一趟(模型名以你的可用列表为准)
codex -c model="gpt-5.6"
# 单次收紧审批 + 只读
codex -c approval_policy=never --sandbox read-only "只分析,不要改"
# 单次换供应商
codex -c model_provider=ollama -c model=qwen2.5-coder

Profile:给不同项目配不同默认值

Profile 就是"一整套配置的命名预设"。注意这是新版写法:--profile 不再从 config.toml 里读 [profiles.名字],而是读一个独立文件。

# 建一个 ~/.codex/deep-review.config.toml,里面写顶层键(不要嵌套在 [profiles.X] 下)
codex --profile deep-review
codex exec --profile deep-review "审查这个改动"

如果你是从老版本升上来的,官方给的迁移做法是:把原来 [profiles.名字] 里的设置搬到 ~/.codex/<名字>.config.toml,然后删掉 config.toml 里的那一段和顶层的 profile = "名字"。

09AGENTS.md:给它一本项目说明书

AGENTS.md 是一个纯文本的指令文件,Codex 在动手干活之前会自动读它。你想让它"一进项目就知道怎么装依赖、怎么跑测试、哪些目录不许碰",靠的就是这个文件——而不是每次重新叮嘱一遍。

它会去找哪些文件、按什么顺序

  1. 全局层:在你的 Codex 主目录(默认 ~/.codex,除非你设了 CODEX_HOME)里找。有 AGENTS.override.md 就只读它,否则读 AGENTS.md;这一层只取第一个非空文件。
  2. 项目层:从项目根(通常是 git 根)一路走到你当前所在目录,每个目录里按 AGENTS.override.md → AGENTS.md → 备选文件名的顺序找,每个目录最多取一个。
  3. 合并顺序:从根往下拼接,用空行隔开;越靠近你当前目录的内容越靠后,也越优先。

两个边界要知道:空文件会被跳过;拼起来的总大小超过 project_doc_max_bytes(默认 32 KiB)就截断——所以别把它写成百科全书。

💡 什么时候该用 AGENTS.override.md

同一个目录里如果存在 AGENTS.override.md,同目录的 AGENTS.md 就被整个忽略。适合"临时加严":比如支付服务子目录要额外规定"绝不真发支付请求",写进 override 文件,与仓库级规则分开维护。

一份够用的 AGENTS.md 长什么样

# AGENTS.md —— 放在项目根目录
## 这个项目是干嘛的
这是一个用 Node.js 写的命令行小工具,主入口是 bin/cli.js,代码在 src/ 下。
## 常用命令(改完要靠这些验证)
- 跑测试:npm test
- 跑类型检查:npm run typecheck
- 本地启动:npm start
## 代码约定
- 变量和函数名用英文,注释用中文
- 新逻辑尽量放进 src/lib/ 下的小模块,别都堆在主入口
## 边界
- 绝对不要动 .env 或任何含密钥的文件
- 提交前先给我看 git diff,不要直接 commit

这就是它最实用的形态:把"怎么验证"和"别碰什么"写死。前者让它可以自证,后者替你挡掉最危险的操作。

它什么时候生效

Codex 在每次运行开始时(TUI 里通常就是每个会话开头)重新构建这份指令链,没有需要你手动清的缓存。所以:改完 AGENTS.md 之后,在目标目录里重启一次 Codex 就生效;别指望正在进行的会话立刻用上你刚写的内容。这一点是新手上当最多的地方——改了没反应,往往只是没重启。

多目录布局:一个真实的 monorepo 例子

my-repo/
├── AGENTS.md                    # 仓库通用:跑 lint、改动要写文档、提交前过目
├── apps/
│   └── web/AGENTS.md            # 前端约定:用 pnpm、样式走 Tailwind
└── services/
    └── payments/
        ├── AGENTS.md            # 支付模块通用(同目录无 override 时生效)
        └── AGENTS.override.md   # 支付专项:跑 make test-payments;严禁碰密钥

从 services/payments/ 启动 Codex,它会拼出三层:全局文件 → 仓库根 AGENTS.md → 支付专项 override。这样团队能把规范写进代码树,每个新成员、每次 Codex 都自动遵守,而不是靠口头叮嘱。

我不想写,能自动生成吗

能。在会话里敲 /init,它会基于当前项目生成一份 AGENTS.md 草稿,你审一遍、改成符合你们约定的样子再提交。这是最快建立起点的方式。

个人也值得建一个全局文件

# ~/.codex/AGENTS.md —— 我个人的通用偏好
- 注释、commit message 用中文;变量/函数名用英文
- 每次改动前先说明计划,改动后给出 git diff 摘要
- 涉及删除文件、改配置、动密钥前必须征求我同意

不会出现"全局把项目规矩盖掉"的问题:同一目录下项目文件仍然优先,而全局文件只在没有更局部文件的层级上起替代作用。

10日常使用:怎么问才不跑偏

一次会话长什么样

先把心理预期建立起来。它不是一次性把整段"答案"甩给你,而是"提出 → 等你批 → 动手 → 汇报"的循环。示意(左边是你看到的,注释解释它在干什么):

$ codex                              # 在项目目录里启动
# 状态栏会显示当前模型、审批档位等(用 /status 可看全部)
codex> 给 src/add.js 的 add 函数补中文注释,并写 3 个测试用例,然后跑测试验证
# 它先读文件、思考,然后给出"打算怎么做"
# 接着贴出将要写入的 diff,类似:
#   + /** 两数相加 */
#   + export function add(a, b) { ... }
# 然后停下来问你:是否应用这些改动?
codex> 你同意就确认;不同意就直接打字纠正它
# 应用后它继续:跑测试、贴结果、总结改动与验证情况
codex> /quit                         # 退出(输入 / 会弹出命令面板)

你要做的就是在每个"等你批"的节点看一眼、点个头或说"改一下"。一路按 y 等于把沙箱和审批两层都浪费了。

说"先别改"是安全咒语

💡 新手最有效的防翻车姿势

想让 Codex 只出方案不动手,就在指令末尾加一句"先别改任何文件"。习惯性地先让它给方案、你点头后再让它执行——这一句话能挡掉绝大多数"它理解偏了还一路改到底"的情况。

会话内的斜杠命令:一个表看懂

在输入框里以 / 开头就能调出命令。下面是新手最常用的几个(不同小版本会有差异,以你本地弹出的清单为准):

命令作用什么时候用
/permissions改"不问我就能做什么"(切换 Auto / Read Only 等预设)一个会话里想临时收敛或放开权限
/model换模型和推理努力程度任务变难 / 变简单时
/plan切到计划模式,先出执行计划再动手改动面大、你想先看方案
/diff看当前的 git diff(含还没被 git 跟踪的新文件)提交前自己扫一遍
/review让它审查你的工作区改动它改完之后找问题
/status看当前会话配置与用量(模型、审批、可写目录、剩余上下文)不确定现在是什么档位时
/compact把可见对话压缩一下,释放上下文长会话快撑不住时
/init生成 AGENTS.md 草稿第一次给一个项目立规矩
/new / /clear开一段新对话(/clear 同时清屏)换任务时,别把上个任务的上下文带着
/resume / /fork恢复已保存的会话 / 从当前会话分叉出一支接着上次干 / 想试另一条路又不想丢现在的
/quit 或 /exit退出先把该提交的提交了再退
⚠️ 老教程的命令名不一定对得上

Codex 迭代很快:早先版本把权限拆成 /approval 和 /sandbox 分别管,后来统一收敛到 /permissions。如果你照着网上的老教程找不到某个斜杠命令,别慌——以你自己版本里 / 弹出来的清单为准,功能一般还在,只是换了入口。快捷键同理。

几个键盘上就能用的动作

按键 / 输入做什么什么时候用
@搜索工作区里的文件,把路径加进这次提问你想把它的注意力钉在某几个文件上
行首 !在当前审批和沙箱规则下跑一条本地命令你想自己查一下状态,又不想走出沙箱
Ctrl+O复制它最近一次完成的输出(等价 /copy)要把结果贴到别处
Esc打断它当前这一轮发现它跑偏了,立刻停
Ctrl+C关掉会话收工

指令的固定四件套

规律只有一句话:范围(哪里)+ 期望(做什么/不做什么)+ 验证(怎么算成功)+ 节奏(先方案还是直接改)。四件越明确,它越少自由发挥。

❌ 模糊的指令

"修一下登录的 bug"

"优化性能"

"帮我写点东西"

结果:它只能靠猜,然后你会觉得它离谱。

✅ 清晰的指令(四件套齐全)

"修复 src/login.js 中,当密码为空时抛 TypeError 的问题:先复现,再修,最后跑 npm test 里 login 相关用例确认通过。每一步给我看 diff。"

范围、期望、验证、节奏都在里面了。

五条能直接套用的提问模板

模板什么时候用它替你挡住什么
先别改文件:解释【某文件/某函数】是做什么的,哪里最容易出 bug?想先理解再动手在你还没看懂代码时被它改掉
只改【路径】,让它【期望行为】,改完跑【验证命令】确认通过,每一步给我看 diff明确的一次小改动顺手改了别的文件
跑【验证命令】把失败信息贴出来,定位根因后给出两种修法及各自风险,先别改出错先诊断它一上来就改,把线索改没了
按照 AGENTS.md 里的约定,把【目录】下的代码统一成【风格】,做完用【验证】检查批量统一 / 重构风格改一半、验证又没跑
给【任务】写一份可执行的 TODO 清单(细到文件级),我批准一项你执行一项大任务拆小步、步步审一次性大改之后你无从审起

怎么把它的"验证"变成真的

它说"改好了"和它证明"改好了"是两件事。差距就来自你有没有在指令里给出可执行的验证手段:把验证命令写进需求("改完跑 npm test 确认通过"远比"改一下"强)、要求它贴原始输出(不要接受"测试通过了"这句话)、给出可判定的成功标准("这个函数对空数组返回 0"比"让它更健壮"强一百倍)。

💡 给非程序员的三条守则

① 宁可让它说,别让它一次全干:每步小改 + 汇报,你看得懂再放行下一步。② 重要文件先备份:拿不准它会动什么时,先把那个文件复制成 xxx.bak,或者先 commit。③ 看不懂输出就原样贴回去问它:加一句"解释这个报错,并给出两种修法及各自风险",但不要让它直接改。

11codex exec:无人值守的那一半

交互会话适合"一边聊一边干"。可重复、要接进脚本或 CI 的任务,用非交互模式 codex exec(简写 codex e):一次执行、做完就退出,不需要人在旁边按按钮。它还有一个重要的默认差异——codex exec 默认在只读沙箱里跑,要它改文件必须显式加权限。

基本用法

# 一次性任务(先 cd 到项目目录再执行)
codex exec "检查仓库里未提交的改动,用中文总结风险点"

# 输出结构化 JSON,方便脚本解析
codex exec --json "把 todos.md 整理成清单"

# 要它改文件,显式给工作区写权限
codex exec --sandbox workspace-write "把仓库里的 console.log 调试语句删掉"

# 不要留下会话文件
codex exec --ephemeral "给这个仓库分级并给出下一步建议"

运行时进度走标准错误输出,只有最后那条消息走标准输出,所以你可以直接接管道:

codex exec "给最近 10 个提交写一段发布说明" | tee release-notes.md

它自己的子命令:resume 与 review

# 接着上一次非交互任务继续(两段式流水线常用)
codex exec "审查这个改动有没有竞态问题"
codex exec resume --last "把你找到的竞态问题修掉"
# 也可以按会话 ID 恢复
codex exec resume <会话ID>
# 专门做代码审查(不改你的工作区)
codex review --uncommitted
codex review --base main
codex review --commit <提交号>

让它产出机器能读的结果

两个 flag 是给下游自动化用的,值得记住:

flag作用什么时候用
--json把每个状态变化作为一行 JSON 输出(JSONL 事件流)脚本要解析过程而不只是最终结论
--output-schema <文件>用一个 JSON Schema 文件约束它最后回答的结构下游程序需要稳定字段(风险报告、发布元数据)
-o / --output-last-message <文件>把最后那条消息写进文件(同时仍打印到标准输出)CI 里想同时拿到人和机器能读的版本
--sandbox <档>指定沙箱档位自动化里常用只读或工作区写
--skip-git-repo-check允许在非 git 目录里运行只在临时环境确实安全时用
--ignore-user-config不加载你的 ~/.codex/config.tomlCI 想要一套与个人偏好无关的干净环境
--full-auto已废弃的兼容 flag,会打印告警新脚本请改用显式的 --sandbox workspace-write

用一个 schema 的完整例子:codex exec "提取项目元数据" --output-schema ./schema.json -o ./project-metadata.json——它按 schema.json 描述的结构回答,并把最终 JSON 写进 project-metadata.json。

密钥怎么给才安全

❌ 别这么做

把 Key 设成任务级 / 全局环境变量,然后在这个环境里跑仓库里的代码。

构建脚本、测试、依赖的安装钩子、任何一个被污染的动作,都能读到这个环境变量。

✅ 官方建议

只在需要它的那一次调用前面临时给:

CODEX_API_KEY=<你的key> codex exec --json "对最近的改动做审查"

用完即消失。

官方在非交互模式文档里的原话就是:不要在会检出或运行仓库代码的工作流里,把 OPENAI_API_KEY 或 CODEX_API_KEY 设成 job 级环境变量。GitHub Actions 里的推荐做法是直接用官方的 Codex GitHub Action(github.com/openai/codex-action),它会在内部起一个代理来转发 Key,避免把 Key 交给你的 shell 步骤。

把 exec 串进日常脚本

下面这段脚本演示了"新手可以照抄"的姿势:任务只读、Key 只在这一次调用里出现、结果落盘、缺 Key 就直接失败而不是默默跑一半:

#!/usr/bin/env bash
# review_diff.sh —— 让 Codex 审一遍当前未提交改动,结果存盘
set -euo pipefail
if [ -z "${CODEX_API_KEY:-}" ]; then
  echo "请在调用前临时提供 CODEX_API_KEY" >&2
  exit 1
fi
CODEX_API_KEY="$CODEX_API_KEY" codex exec \
  --sandbox read-only --json \
  "审查当前未提交改动:列问题清单(含文件行号),先不要改任何文件" \
  > review-$(date +%F).json
echo "审查结果已写入 review-$(date +%F).json"

什么时候别用 exec

⚠️ exec 不等人

需要多轮澄清、需要你边走边看结果、涉及多次危险操作的任务,别硬塞进 codex exec——它不等人,翻车率随复杂度上升。这类任务用交互会话 + 人工审批更稳。exec 擅长的是"一次性、可重复、结果能自动校验"的活。

Git 仓库这个前提

Codex 要求命令在 git 仓库里运行,这是为了防止破坏性改动。临时环境确实安全,才用 --skip-git-repo-check 放行。

12十个最常见的坑

坑你会看到什么为什么 / 怎么绕
不在 git 仓库里就开跑改坏了想回退,却没有基线至少 git init + 先 commit 一次;回退用 git checkout .(08)
在本机真实项目里随手 --yolo命令一路执行、没人问你那个 flag 只适合外部已隔离的环境。全权需求请放进一次性容器/虚拟机(08)
指令太模糊它自由发挥,你觉得离谱补齐四件套:范围 + 期望 + 验证 + 节奏(10)
把唯一那份密钥交给它凭据可能被写进日志、被提交、被发到网上~/.codex/auth.json 是明文;别提交、别贴工单、别在共享机器上用(05)
照抄过期命令某个斜杠命令/flag 找不到认准 codex --help 和会话里 / 弹出的清单。老版本的 /approval、untrusted、--full-auto 都已经变了(08)
改了 AGENTS.md 就说没生效它还是不按你的规矩来指令链是会话开始时读的,在目标目录重启一次(09)
把长会话当聊天用越聊越慢、越聊越贵上下文越长越烧额度。长任务拆小、做完就收尾;要接着干用 codex resume 找回(10)
在工作区里批量删文件,只靠沙箱兜底沙箱保护不了"文件内容被删"沙箱管的是"能写哪里",不是"写的内容对不对"。批量任务前务必 commit,改完抽查 diff(08)
以为工作区外它也碰不到它停下来问你要不要放开那是审批在按设计工作。要定向放权用 --add-dir,别一步跳到全权(08)
在陌生/公开仓库里盲目放权仓库里别人写的脚本被它执行先读它打算跑什么命令,优先只读或工作区档位;项目级配置在未信任时不会自动加载(13)

每种情况下"该多说哪一句"

你的担心在指令里补这一句它能换来什么
怕它改太多文件"只改 src/login.js,其它文件不要动"范围被钉死,越界你能一眼看出来
怕它自作主张装依赖"不要新增任何第三方依赖"避免包体积和供应链风险无声变大
怕它说"改好了"但没验证"改完跑 npm test,把原始输出贴给我"你拿到的是证据,不是承诺
怕它一次改太多、你审不过来"先给我方案,我说可以你再动手"审阅成本从"读一大段 diff"变成"读一段计划"
怕它碰密钥和配置"不要修改 .env、.codex/ 或任何配置文件"把最危险的操作显式排除
怕它把调试代码留在里面"改完检查有没有遗留的调试输出,有就一并清掉"补上它自己不会主动做的收尾

14排错:出问题先查这张表

现象原因怎么办
command not found: codex装完了但没进 PATHnpm 装的用 npm prefix -g 查到前缀,把里面的 bin 加进 shell 配置后重开终端
npm 安装报权限错误全局目录没写权限不要用 sudo;改用用户级前缀,或直接用官方安装脚本 / Homebrew
下载慢或卡住默认源不通设 CODEX_INSTALLER_USE_RELEASES_OPENAI_COM=false 退回 GitHub Releases,或换个网络环境重试
首次运行要登录,但浏览器打不开无图形界面 / 回调被挡用 codex login --device-auth 设备码登录;或按官方文档把 auth.json 安全地复制过去
提示"需要在 git 仓库里"当前目录不是 git 仓库先 git init;临时环境确实安全时 codex exec 可加 --skip-git-repo-check
启动时告警说找不到 bwrapLinux 上缺 bubblewrapsudo apt install bubblewrap 或 sudo dnf install bubblewrap;Ubuntu 24.04 可能还需要加载一个 AppArmor 配置
改了 AGENTS.md 没反应指令链是会话开始时构建的在目标目录重启 Codex;用 codex -c log_dir=./.codex-log 可以看它到底读了哪些文件
报错说配置里有它不认识的字段版本升级后老键被移除加 --strict-config 可以提前把这类问题暴露出来;按官方配置参考逐个清理
客户端起不来,配置里有 untrusted这个审批档位已被停止支持删掉 approval_policy = "untrusted";要严格效果改用项目信任设置(08)
它明明能看到文件却改不了档位是只读,或改的是被保护的 .git / .codex / .agents用 /status 确认当前档位;被保护路径本来就不允许写(08)

15一页纸速查:装完到用顺

装 / 验证 / 更新

curl -fsSL https://chatgpt.com/codex/install.sh | sh   # macOS/Linux 官方脚本
brew install --cask codex                            # Homebrew
npm install -g @openai/codex                         # npm
codex --version                                      # 验证(本文校对时是 0.154.0)
codex --help                                         # 本版命令总览(权威以这个为准)
codex update                                         # 自更新(安装方式支持时)
codex doctor                                         # 出问题时生成一份诊断报告

登录

codex login                                        # ChatGPT 账号(浏览器)
codex login --device-auth                          # 无浏览器:设备码
printenv OPENAI_API_KEY | codex login --with-api-key   # API Key(走管道,别进历史)
codex login status / codex logout                   # 状态 / 退出

日常使用

codex                                           # 交互会话
codex --sandbox read-only                       # 只读侦察
codex --add-dir ~/shared/lib                    # 额外放行一个可写目录
codex -C ~/projects/app                         # 指定工作根
codex resume                                    # 找回本仓库的旧对话
codex exec "一句话任务"                       # 非交互(一次性)
codex exec --json "任务"                     # 非交互 + JSON 事件流
codex exec resume --last                     # 继续上次 exec
codex review --uncommitted                    # 审查未提交的改动

安全相关

--sandbox workspace-write --ask-for-approval on-request   # 日常推荐组合
--sandbox read-only --ask-for-approval on-request         # 只读侦察
--sandbox read-only --ask-for-approval never              # CI:只读且不问
--dangerously-bypass-approvals-and-sandbox / --yolo       # 仅限隔离环境
/permissions                                  # 会话里改允许范围
/model  /plan  /diff  /review  /status        # 换模型/计划/看改动/审改动/看状态

其他常用子命令(都在你本机 codex --help 里能看到)

子命令做什么什么时候用
codex review非交互地做一次代码审查,不改你的工作区提交前 / 开 PR 前想要第二双眼睛
codex resume按 ID 或"最近一次"恢复交互会话上下文断了、想接着上次干
codex fork把一段旧会话分叉成新会话想试另一条路又不想丢现在这条
codex apply把它产出的 diff 以 git apply 打到你本地工作区在别处生成改动、想在本机应用
codex mcp管理 MCP 服务器(接外部工具)想让代理连数据库、浏览器等外部能力
codex completion生成 shell 补全脚本想少敲几个字
codex app打开桌面应用形态想要图形界面
codex cloud浏览云端任务并把结果应用到本地本机没环境、把活交给云端跑
codex update / codex doctor自更新 / 生成一份诊断报告升级、或出问题时交给支持
codex sandbox用同一套沙箱策略跑一条命令你想让某条命令也享受同样的边界

文件都落在哪

~/.codex/config.toml                  # 用户级配置(最常改)
.codex/config.toml                    # 项目级配置(仅信任的项目生效)
~/.codex/<名字>.config.toml           # Profile 文件(--profile 名字)
~/.codex/AGENTS.md                    # 全局指令
项目根/AGENTS.md                       # 项目指令
某目录/AGENTS.override.md              # 同目录 AGENTS.md 被它整个忽略
~/.codex/auth.json                    # 登录凭据(明文,当密码保管)

每次放它动手前,过一遍这五条

  1. □ 有没有 git 干净基线?改坏了能不能一句话回退?
  2. □ 我是不是说清了范围(哪个文件/哪个函数)和成功标准(怎么验证)?
  3. □ 当前沙箱/审批档位符合这次任务的风险吗?敏感目录有没有收敛权限?
  4. □ 这次任务会不会碰到密钥、生产数据、或工作区外的写操作?
  5. □ 我打算在每个"等你批"的节点看 diff,而不是一路同意?

打勾的时间成本大约十秒,返工的成本可能是一下午。

一周上手路线(给完全零基础的人)

第 1 天:只装不干

装好、登录;只跑 codex --version 和 codex --help,打开一次交互界面看看长相,什么都不改就退出。

第 2 天:只读玩陌生项目

找一个不怕坏的练习目录,用 --sandbox read-only 让它"讲一遍这个项目",练"问得具体"。

第 3 天:改第一个文件

在练习目录里 git init 并 commit,然后做"加注释 / 补个小函数"的小改,全程盯着它的 diff 和审批请求。

第 4 天:体验验证闭环

找一个自带测试的练习,让它"修一个失败的测试"并跑测试自证。学会分辨它是真的全绿,还是只是嘴上说绿。

第 5 天:写 AGENTS.md

用 /init 生成草稿,补上你的验证命令与禁区,观察之后它的行为是否更贴合你的约定。

第 6–7 天:上真实的小项目

挑一个你自己维护的小脚本或小网站,按"先只读 → 小步改 → 每步审 diff"的流程接活;报错就原样贴回去让它调整。

16术语对照表(回头查用)

术语一句话定义为什么重要 / 何时用 · 别当什么用
代理(agent)你说目标、它自己规划并分步执行的程序,而不是每步都等你发话这是它和"聊天框"的根本差别。别把它当成只会回话的问答机器人——它会动你的文件
TUI(终端用户界面)在终端里用键盘操作的交互界面,敲 codex 就进这个界面本文大多数斜杠命令都发生在这里。别把它和 shell 提示符搞混——在 TUI 里输的是给代理的话,不是系统命令
沙箱(sandbox)操作系统层面给它的活动范围:能写哪些目录、能不能联网它决定"它在本地能碰到什么"。别当成数据保护——它管不了"内容被发到云端"
审批(approval)它什么时候必须停下来问你和沙箱是两个独立开关,要分开想。别以为"它没问"就等于"它没做"
工作区(workspace)你启动 Codex 时所在的那个项目目录,默认可以被读写选对工作根很关键:"出了工作区才要敲门"这句话的基准线就是它
可写根目录(writable roots)在工作区之外额外允许写入的目录清单需要定向放权时用它,而不是直接开全权;比全权安全一个数量级
只读沙箱(read-only)能读、能在只读范围内跑命令,但不能改文件接手陌生仓库、只想听讲解时的默认选择。别以为在这个档位它就什么都不能做
全权模式(danger-full-access)去掉沙箱限制,文件与网络全放开官方标注"不推荐"。真要全权,去一次性容器或虚拟机
推理努力程度(reasoning effort)模型"想多久"的档位:minimal / low / medium / high / xhigh任务越难越值得开高;简单活开高档只是多花钱多等
上下文(context)这一次会话里它能"记得"的内容总量,有上限上下文越长越烧额度、越慢。为什么长任务要拆、要 /compact,根源就在这里
指令链(instruction chain)它每次开工前,把全局与沿途各层的 AGENTS.md 拼成的一份说明这是"项目规矩为什么能被自动遵守"的机制。每次运行重建,所以改完要重启会话才生效
AGENTS.override.md放在某目录里,用来覆盖同目录 AGENTS.md(不是叠加,是整个替换)适合"子目录要额外加严"。别以为它是合并——同目录那份会被完全忽略
Profile(命名预设)一整套配置的命名集合,用 --profile 名字 叠加给"这个项目偏保守、那个项目要快"做成可切换的档位。新版把它放在独立文件里,不再从 config.toml 读
权限方案(permission profile)把文件与网络边界命名并复用,内置 :read-only / :workspace / :danger-full-access想让一整套规则可复用时可上它。别和 sandbox_mode 混着写——一次会话只选一套体系
provider(模型供应方)真正提供"大脑"的服务,默认是 OpenAI,也可以换成兼容后端想用本地模型、或走代理服务器访问 OpenAI 时改它。换之前先想清楚本地模型的能力代价
MCPModel Context Protocol:让代理连接外部工具(数据库、浏览器等)的协议接上它等于给代理发新工具。只加你信得过的来源,别为了好玩随便接陌生人的服务
JSONL / JSON 事件流一行一个 JSON 对象的输出格式,方便程序逐条读codex exec --json 就是它。脚本要解析过程时用它;人看最终结论别用它
JSON Schema描述"一个 JSON 应该长什么样"的规范文件用 --output-schema 约束它的最终回答结构,下游程序才有稳定字段可读
凭据(credential / API Key)能证明"你是你"的一串字符,例如 API Key、访问令牌~/.codex/auth.json 里放的就是它,而且是明文。当密码保管:不提交、不粘贴、不在共享环境用
PATH系统查找可执行程序时依次搜索的目录清单command not found 十有八九是它没配对。装完第一步先验证,别等出问题才查
WSL2Windows 上的 Linux 子系统,让你在 Windows 里跑 Linux 环境Windows 用户的推荐路径:在 WSL2 里按 Linux 方式装,沙箱走 Linux 那套
bubblewrap(bwrap)Linux 上让程序在受限环境里运行的小工具它是 Linux 沙箱的实现基础;缺了会启动告警,所以它是 Linux 上的前置条件
SeatbeltmacOS 自带的沙箱机制macOS 开箱即用的原因就是它。你不需要配它,但知道它存在就不会对"Mac 上不用装沙箱工具"感到奇怪
diff(改动差异)逐行标出"加了什么、删了什么"的对照文本这是你审阅它的主要材料。不看 diff 就等于放弃了这层保护
基线(baseline)动手前的一次干净提交,出问题能整块退回它是你唯一可靠的撤销手段。开工前 commit 一次,成本十秒

99一句话总结

🎯 核心要点

Codex CLI 是 OpenAI 官方开源的终端 AI 编程代理——你用自然语言下指令,它读代码、改文件、跑命令,默认被"沙箱(能碰到哪)+ 审批(什么时候问你)"两道边界夹着干活。用得好的关键只有四条:在 git 仓库里开工、把验证命令写进指令、批准前先看 diff、把约定沉淀进 AGENTS.md 与 config.toml;以及记住那条底线——--yolo 只属于隔离环境。

98参考来源与证据边界

一手来源(全部逐字读取)

本文自己做的核对

除了读官方文档,本文还在本机实际跑了三条命令核实命令名与 flag:codex --version(→ codex-cli 0.154.0)、codex --help(核对子命令与全局 flag,如 --sandbox / --ask-for-approval / --add-dir / --worktree)、codex exec --help(核对 exec 专属 flag,如 --json / --output-schema / --ephemeral / --skip-git-repo-check)。

📖 证据边界与时效说明

以上事实于 2026-09-13 对照 OpenAI 官方文档与仓库核对。Codex CLI 属于演进很快的工具:版本号、默认模型名、斜杠命令、flag 名称都可能变化。本文已在相关处标注"以你本机 codex --help 与 / 面板为准"。与旧版相比,本文改掉了三类已过期的说法:① 审批档位里的 untrusted 已停止支持(改用项目信任设置表达同样的严格效果);② on-failure 已废弃;③ 全局旧写法的 Profile([profiles.名字])与 codex exec --full-auto 都已不再推荐,本文按新写法给出。若文内命令与你的版本不一致,以官方文档与 codex --help 输出为最终依据。

⌂