用 AI 改功能,有时候需求只写了一句话,token 已经陪它逛了半个仓库。
比如我想改一下导出功能,跟 Codex 说:"导出时加个空数据判断。"对我来说,目标很明确;对它来说,第一件事却是:导出功能住哪儿?按钮在哪,事件绑在哪,最后又调到了哪个文件?
于是它得搜关键词、读候选文件、顺着调用关系找实现。这些搜索、读取和判断都要消耗 token。功能还没开始改,找功能的位置先花了一笔。
问题是,有时候我已经在 VS Code 里找到那段实现了,光标就停在上面。可我只把功能描述发过去,没带代码和位置,它拿不到我眼前的线索,还得自己找一遍。
我这边都精确到门牌号了,发给它的地址却只有"本市有个人"。然后看着它挨家敲门,感慨 AI 办事真费 token。
这多少有点为难外卖小哥了。
当然,我也可以复制代码、补上文件路径,再切到桌面端发送。只是每次都这样,人又成了两个窗口之间的人肉 API:支持中文,手动传参,偶尔把路径落在上一个窗口。
我想省掉的,是让 AI 从功能描述重新定位已知代码的那段消耗;少搬几趟代码,也一起解决。 坑已经挖好了,坐标直接递过去,别再用我的 token 给考古队买铲子。
于是我决定让 Codex 搬进 VS Code:选中已定位的代码,连同位置和修改要求一起交过去,让它从这里接着分析。它在侧栏干活,我看进度,改完就地看 Diff。
于是有了 Codex Exec Chat,一个通过本机 Codex CLI 执行任务的 VS Code 插件。
起因:想让 token 多干点正事,少参加仓库一日游。
结果:多维护一个插件。
逻辑非常严密,建议不要细想。 
第一件事:就是这段。对,这段。铲子放下。
"改一下导出功能"说清了要改什么,却没告诉它实现在哪。既然我已经找到入口,就把这段代码一起给它:门牌号都拍你脸上了,导航可以结束了,师傅。
现在,选中目标代码,按一下快捷键就能加入聊天:
- Windows / Linux:
Ctrl + Alt + K - macOS:
Cmd + Alt + K
不想记快捷键,也可以右键选择 "Codex Exec: 将选中代码添加到聊天",或者在发送消息时自动附加当前选区。
代码交过去,要求也要说清楚。我通常会这样写:
检查选中异常分支的状态恢复是否完整,结合调用方确认影响范围。保留现有接口,本轮先分析,不修改。
最后六个字是重点。"先分析,不修改。"我只是请大夫看看片子,暂时还没同意推进手术室。
选区给位置,文字给任务。 把已知实现直接交过去,可以减少从功能描述反查代码的搜索和试探,让 token 更多用在分析和修改上。Codex 仍然可以按需读取调用方、确认影响范围;入口我标好了,该查的关系照样查,仓库观光项目就先取消了。
要是证据不止一段代码,也能一起递过去:
| 手头的证据 | 递过去的办法 |
|---|---|
| 几个相关文本文件 | 多选为附件,或从资源管理器右键添加 |
| 一张"你看它都歪成这样了"的截图 | 上传或粘贴 PNG、JPEG、WebP;最多 4 张,每张不超过 5 MiB |
| 其他目录里的代码 | 添加额外文件夹并授予访问权限;不会把整个目录塞进消息,工作区可写模式下也允许修改 |
| 另一个项目 | 在侧栏选择项目,下一条消息开启新的 Codex 对话 |
截图这个入口,主要挽救了我的语言能力。以前描述页面问题,写到最后经常是:"左边那个按钮右边的字再往左一点。"
读完我自己都想点"重新生成"。
具体能省多少 token,取决于任务和提供的上下文,我没做对照测试,"效率提升 300%"的海报先不印。诉求倒是很明确:我已经找过的路,尽量别再让它花 token 问一遍。预算有限,优先修 bug,暂不资助代码考古。

代码递过去了,还得教它下班
接下来是另一种熟悉的场面。
修一个小问题,跑完整回归。发现一个小问题,修掉,再跑完整回归。全部通过之后,气氛刚刚轻松,又出现一句:"为了确保......"
我现在看见这四个字,手就会往停止按钮上挪。
这事要是发生在家里,大概是我请人换个灯泡。灯亮了,师傅没走,开始查楼体抗震。问就是负责。
负责当然好。但灯泡已经换好了,隔壁楼先放过。
所以我把"什么时候算干完"写进了全局规则。侧栏顶部点 "全局规则",会直接在 VS Code 里打开 Codex 用户规则文件。我存的约定大致是:
- 开工先写完成标准。 这次要实现什么,跑什么命令算通过,先说好。别干到一半突然立志成为行业标杆。
- 改什么,验什么。 按影响范围跑相关测试和类型检查;纯文档修改不跑验证。改个逗号,CI 没必要全体起立。
- 已知问题攒齐,一起修、一起验。 新发现的问题按影响范围补验;范围外记后续项,别一边修水龙头一边给厨房量尺寸。
- 通过了,输入没变,就认账。 源码、配置、依赖没变,不因为"再确认一下"重跑。测试结果也需要一点基本的信任。
- 代码检查通过,就收工。 默认不构建、打包、安装、启动或验收应用;影响全仓库或我明确要求时,才跑全量测试。
边界条件、错误处理照样认真看。我的诉求只是让测试证明代码没问题,别让它证明电脑还通着电。
这份规则放在 CODEX_HOME 指定的目录,默认是 ~/.codex。非空的 AGENTS.override.md 优先,否则打开 AGENTS.md;缺文件会创建,有内容不会覆盖。保存后,新对话使用这份规则。 项目专属要求放项目规则,当前任务临时纠偏则用"补充要求"。
也得交代清楚:插件只提供规则编辑入口,不会强制拦截测试命令。 这相当于把下班制度贴墙上,能省去每天宣读,不能保证再也没人说"我最后再看一眼"。 
它开始干活了,我开始看它有没有给自己加活
任务一发出去,最怕界面只剩三个字:运行中。
一分钟,运行中。五分钟,运行中。
我也在运行中。我的焦虑。
所以侧栏会把 Codex 提供的计划、命令、工具调用,以及可用的输出和错误展示出来。同一步骤会更新状态,公开内容保留在当前会话记录里。我至少能看见:它进目标模块了吗,跑的是什么检查,刚才是哪条命令摔了。
CLI 和模型如果提供公开思考摘要,这里也会展示;没有就显示运行状态。这些是公开摘要和执行信息,不是完整内部推理。 我做了个侧栏,还没顺手攻克读心术。
看进度还有一个用处:及时发现"顺便"。
"顺便整理一下。"
"顺便重构一下。"
一个空数据异常,逐渐有了启动二期项目的气质。
这时候不用等它把二期规划写完,直接通过 "补充要求" 给当前任务传话:
保留现有函数签名和调用方,本轮只调整内部逻辑。如果无法在这个范围内解决,先说明原因。
服务端确认接收后,侧栏才会显示"已提交给当前任务"。收到不等于落实,后面怎么干还得看。毕竟工作群里的"收到",大家也都收到过。
传话有几个实际边界:运行中只能补文本,附件保持不变;提交失败、任务已结束或 CLI 不支持时,会说明原因并保留草稿,不自动另开一轮。
补充要求不会撤销已执行的改动。 真要立即中断,点 "停止"。要补新选区,也得先停止,检查已有改动,再整理上下文发后续消息。
喊"师傅等一下"有用,但已经钻出来的孔,不会因为师傅听见了就自动长回去。

"已经修好了。"好,现在请双方核对口供
我理想中的收尾:
它:已经修好了。
我:改了哪里?
它:这里。
我:好。
我担心的收尾:
它:已经修好了,顺便优化了整体架构。
我:我那个
if呢?
所以"完成"之后,我会打开 Diff。
插件按批次保留文件变更和状态。点击文件行,就在 VS Code 原生对比编辑器里看变更片段;也能打开当前文件,或者展开原始补丁。
看到某段修改不理解,直接在 Diff 里选中,右键有三个入口:
- 解释这段修改------先听听你的想法。
- 换一种写法------想法我听了,咱们换一个。
- 这里有问题------这次真有问题,别先帮我优化措辞。
修改前后的片段和追问会回到原对话草稿,由我确认后发送。默认先解释、讨论或检查。这样我问"为什么拆成三个函数",就不用担心下一轮回来已经变成六个。
这里展示的是变更片段,要看完整上下文得打开当前文件;没有差异会说明原因,已删除的文件不能打开。目前没有自定义的接受 / 拒绝界面,修改也可能已经落盘。 看 Diff 的时候,代码可能已经在工地上了,别当成售楼处样板间。
我会认真看这一眼。毕竟将来有人打开 Git 记录,看到的名字可能是我。
总不能在提交说明里写:"当时它语气特别肯定。" 
活可以分开聊,字得自己签,余额也得看
一个 bug 聊着聊着,总会想起另一个需求。这时候最方便的做法,是另开一个对话。最不方便的做法,是我经常做的那种:"对了,还有个事。"
然后上半段在保接口兼容,下半段在改按钮颜色,中间夹着一个没交代完的异常分支。上下文看起来像我的浏览器:每个标签页都很重要,没人知道先关哪个。
插件支持最多 3 个对话,可以新建、切换、删除。各自沿用各自的上下文,保留草稿、附件、执行进度和文件变更。接口问题和页面问题终于可以分桌吃饭,不必夹一筷子 CSS,再捞出来半个调用栈。
不过,会话只保留在当前 Extension Host 生命周期内,重载 VS Code 后开始新对话,聊天记录还没持久化。 重要的长期约定请写进规则文件。聊得再投缘,也先别把侧栏当档案馆。
干活过程中,需要批准的操作会弹出提示,让我选"允许本次"或"拒绝"。审批策略有按需、严格、不请求;沙箱提供只读、工作区可写两种模式。
这里的 "不请求"不等于"自动同意":需要批准的操作会被拒绝。 "别来问我"和"拿我的章随便盖",在人类公司里差得挺远,在这里也一样。
全局规则管工作约定,审批管操作授权。写一句"别重复回归",可没有顺带签下其他操作的同意书。
最后,还得看看额度。毕竟我负责热血,它负责干活,余额负责宣布散会。
侧栏显示周剩余额度百分比,以及本地时间的重置日期,与单次对话 token 用量分开记账。打开侧栏、任务结束、检查登录状态后会自动刷新;侧栏可见时每 5 分钟更新,也能手动刷新。
未登录、API Key 登录、缺少周额度数据或查询失败时,会显示对应提示。这里能查余额,不能变余额。点刷新之前,请放下对奇迹的期待。

真拿一个 bug 试试,别把流程也聊成连续剧
比如一个空数据异常,我会先在全局规则里存好验证纪律,再开对话。然后选中异常分支,附上调用方,把预期行为和兼容约束写清楚,先让它分析。
看完分析,沿当前对话确认修改。执行中看进度,范围偏了就补充要求,需要中断就停止。改完跑受影响范围的代码检查,再打开 Diff,有疑问就选中追问。
完成标准满足,这轮结束。
结束的意思是可以去干下一件事了。没有彩蛋,没有片尾第二轮全量回归,也没有"既然都改到这里了"。
我最想省掉的,就是每次修个小问题,都得给需求附赠一篇《论这次真的只改这里》。现在长期约定有地方放,具体代码能直接递,临时发现跑偏也能喊一声。终于有机会把这个论文系列停刊了。
想用的话,先把 CLI 请到岗
介绍了半天,负责干活的其实还是本机 Codex CLI。插件给它安排了侧栏工位,没有替它长出一个新脑子。
先准备好 CLI,确保终端能找到它,并完成 CLI 登录。Windows 可以用 codex.cmd login status 查看状态;显示 Logged in using ChatGPT 时,插件可以复用本机登录态。
认证交给 CLI。插件不读取、复制或保存 ~/.codex/auth.json,也不需要在插件设置中填写账号密码或 API Key。
目前通过 VSIX 安装,步骤很老实,没有整活:
- 获取插件 VSIX 安装包。
- 打开 VS Code 扩展视图,点击右上角
...。 - 选择 Install from VSIX...,选中安装包。
- 重载 VS Code,点击 Activity Bar 中的 Codex Exec 图标。
模型、推理强度和服务速度沿用 CLI 配置,插件暂不提供切换控件;恢复会话时的模型行为也由 CLI 决定。这几项要调,得去 CLI 那边,侧栏目前只负责接待。
Windows 下通过 cmd.exe 启动 codex.cmd,避开 codex.ps1 的 PowerShell 脚本执行策略问题。争取让今天遇到的第一个问题是业务 bug,别在上班之前先跟执行策略打一架。
还有几件事得在入职前交代:
- 权限有范围。 沙箱默认工作区可写,不提供绕过沙箱或完全访问选项;额外文件夹会扩大访问范围,在可写模式下也扩大可写范围。
- 工作区有边界。 只在受信任工作区启用,不跨多个工作区根目录混合发送选区。
- 本机运行不等于离线。 插件和 CLI 在本机运行,不代表模型离线运行。
- 部分功能还欠着。 会话持久化、Diff 接受 / 拒绝流程目前都没有。
先把选代码、聊任务、看修改做好。剩下的放待办里。待办很懂事,不用浇水也会自己长。
写到这里,我突然发现,这个插件的核心诉求其实就两句:
地方我找到了,你从这里开始。
事情做完了,咱们到这里结束。
为了让 AI 理解这两句话,我写了个插件,又写了这篇文章。
现在它可以帮我修业务代码,我还得抽空修它的工位。
这叫什么?这叫降本增效,降谁的本不知道,增加的活反正到我这了。
如果你也有让 Agent 按时收工的经验,欢迎交流。尤其是能让它听见"已经通过"就放下键盘的那种------我和我的测试命令,都想过个双休。