Appearance
Codex 入门实战:从安装登录到修好第一个 Bug
购物车里有 10 元商品,使用 15 元优惠券后,应付金额变成了 -5 元。你希望 Codex 把它修成 0 元,同时保留普通优惠的计算方式。
这篇就用这个小问题,带你完成一次完整协作:准备代码 → 重现错误 → 交代任务 → Codex 修改 → 自己检查结果。你不需要先掌握 JavaScript,但需要会创建文件夹、复制命令,并愿意看测试输出。
Codex CLI 是在终端中使用的编程助手,可以读取工作目录中的文件、修改代码和运行命令。官方 CLI 文档提供安装入口。本文选择 macOS + CLI + ChatGPT 登录,让每一步的输入和结果都能直接对照;Windows 用户请先按官方对应平台说明准备环境。
完成练习后,你会得到一份修复后的 cart.mjs,并能解释为什么接受这次修改。示例是教学用的金额计算函数,不连接支付系统。

1. 安装并确认登录
打开 macOS 的“终端”,先输入:
bash
node --version
npm --version两条命令都应显示版本号。没有 Node.js 时,先从 Node.js 官网安装当前 LTS 版本,重新打开终端后再检查。Node.js 用来运行本题的 JavaScript 文件,npm 用来安装 Codex。
接着检查 Codex:
bash
codex --version如果已经输出 codex-cli 和版本号,直接进入登录。只有提示找不到命令时,才按官方 npm 方式安装:
bash
npm install -g @openai/codex
codex --version安装后仍找不到命令,先重开终端。若出现权限错误,保留完整错误与安装路径,参照安装排障处理,不要重复叠加多种安装方式。
在终端执行:
bash
codex login
codex login status第一条会引导你完成浏览器登录,完成后再执行第二条。状态应显示已登录及使用的身份方式;若仍是 Not logged in,先完成授权。账号需要具有 Codex 访问权限,组织策略和额度也可能影响任务运行。
本文使用自己的 ChatGPT 账号。API key 是另一条按 API 用量计费的路线,ChatGPT 订阅不自动抵扣 API 费用;本题不需要为了跟教程操作而切换登录方式。详见官方身份说明。
2. 准备三个文件,先看见错误
在 Finder 新建空文件夹 codex-cart-practice,把下面三个文件保存到里面:
如果浏览器直接显示文件内容,用“另存为”保存原文件名,不要保存成网页或加上 .txt。这三个文件必须在同一层:
text
codex-cart-practice/
├── cart.mjs
├── cart.test.mjs
└── TASK.md在终端输入 cd ,注意末尾有一个空格,然后把文件夹从 Finder 拖入终端,按回车。执行:
bash
pwd
ls
node --test cart.test.mjspwd 显示当前目录,ls 列出文件。确认目录是刚创建的练习目录,再看测试结果:3 项通过,2 项失败。本题不需要 npm install、package.json 或其他依赖。
这里的失败正是要修的 Bug:
| 情况 | 当前结果 | 题目要求 |
|---|---|---|
1000 分商品,优惠 1500 分 | -500 | 0 |
空购物车,优惠 100 分 | -100 | 0 |
金额单位是分,-500 分就是 -5 元。不同 Node.js 版本的输出排版可能不同,但失败项和数值应一致。如果一开始全通过,检查是否误用了文末的修复答案。
现在在 Finder 中复制整个文件夹,把副本命名为 codex-cart-original,让两个文件夹位于同一个上级目录。保留副本,用于最后比较和重来;后续继续在 codex-cart-practice 中操作。
3. 把任务交给 Codex
在练习目录的终端运行:
bash
codex --sandbox workspace-write --ask-for-approval on-request进入 Codex 后,把下面的文字发送到它的对话输入区。这是任务描述,不是终端命令。 后面要手动运行 node 时,请另开一个系统终端,并用同样方法进入练习目录。
text
请读取 TASK.md 和购物车源码,先运行 node --test cart.test.mjs 复现问题。
解释失败原因,仅修改 cart.mjs 修复优惠导致负金额的问题,不修改测试。
重新运行全部测试,输出实际测试结果、修复 diff 和没有覆盖的边界。这几句话给了 Codex 四样必要信息:读哪些文件、哪个行为不对、允许改哪里、用什么判断完成。相比“帮我优化购物车”,它减少了猜测业务规则的空间。
workspace-write 允许在工作区内写入,on-request 允许模型在需要时提出审批。工作区内的修改可能直接落盘,并非每次都先弹出确认。 这也是刚才保存原始副本的原因。审批时检查实际命令和目标路径;组织管理策略可能进一步限制执行。参数含义见官方权限说明。
这个练习不需要接入 MCP、不需要安装 Skill,也不需要修改全局配置。先让 Codex 用现有文件和本地 Node.js 完成任务。
4. 执行中看什么,跑偏了怎么说
你要观察的是动作和证据:它读到了 TASK.md,运行测试看到了负数,再修改计算函数,最后重新测试。回答措辞和代码写法可能不同,不必要求它与本文逐字一致。
| 看到的情况 | 可以继续发送的消息 |
|---|---|
| 只解释了原因,没有修改 | “请把修复写入当前目录的 cart.mjs,再运行测试;若无法执行,说明具体阻碍。” |
| 修改了测试文件 | “停止修改测试。说明刚才改了哪里,按原测试验证源码修复。”随后从原始副本恢复固定测试 |
| 新增依赖或重构多个文件 | “这次只修金额下限。请先列出额外改动,让我确认保留哪些。” |
| 说测试通过,却没有执行记录 | “请实际运行 node --test cart.test.mjs,报告通过和失败数量;不要根据代码推测。” |
“测试通过”是一项可以复核的结果。即使 Codex 说已经完成,你仍要做下一步。
5. 亲自验收:测试通过,改动也符合题意
另开系统终端,进入 codex-cart-practice,运行:
bash
node --test cart.test.mjs这次应是 5 项通过,0 项失败。原来失败的两种情况现在应为零;普通汇总、正常扣优惠、优惠等于小计这三种情况也要继续通过。
- ① 原始输入出现负金额
3 通过 / 2 失败 - ② 修改计算函数守住金额下限
只改 cart.mjs - ③ 独立检查普通优惠仍正确
5 通过 / 0 失败
再比较工作目录与原始副本。在终端进入 codex-cart-practice 后,逐条执行:
bash
diff -u ../codex-cart-original/cart.test.mjs cart.test.mjs
diff -u ../codex-cart-original/TASK.md TASK.md
diff -u ../codex-cart-original/cart.mjs cart.mjs前两条应没有输出,表示测试和规则未变。第三条应展示源码差异:- 开头是旧内容,+ 开头是新内容。diff 检测到差异时返回非零状态是正常现象,不代表测试又失败。
也可以用编辑器的文件比较功能。检查目录里是否新增了无关文件;仅看这三条 diff,不会自动发现新增文件。
参考修复:为什么是零,而不是把负数变正数?
原函数直接返回“小计减优惠”,所以优惠大于小计时会得到负数。符合本题的参考修改为:
diff
- return items.reduce((sum, item) => sum + item.priceCents * item.quantity, 0) - discountCents;
+ const subtotal = items.reduce((sum, item) => sum + item.priceCents * item.quantity, 0);
+ return Math.max(0, subtotal - discountCents);Math.max 取两个数中较大的一个:正数不变,负数变零。用 Math.abs 把 -500 变成 500,反而会要求顾客再付钱,不符合规则。
代码不一定要长得一样,只要满足题意并通过固定测试即可。下载参考实现时请单独保存;需要手动运行答案时,将它复制为另一练习目录中的 cart.mjs,保持测试的导入文件名。
五项测试只能证明这些案例符合要求。本题输入限定为合法的非负整数,未覆盖非法输入、退款、税费、多币种等真实支付问题,因此不要把它直接当成生产金额库。
6. 卡住时,从现象找到下一步
| 现象 | 先检查什么 |
|---|---|
找不到 node 或 npm | 是否完成 Node.js 安装、重新打开终端后能否显示版本 |
找不到 cart.test.mjs | 用 pwd、ls 核对目录;检查是否多了 .txt 后缀 |
| 登录成功,但任务报额度或工作区限制 | 根据报错检查账号权益和组织策略;本地写权限不能解决额度问题 |
| 提示只读、无法修改 | 核对本节的启动命令;退出旧只读会话,再从练习目录启动写入会话 |
| 修复后仍有两项失败 | 确认修改保存到了当前目录;把实际失败输出发回同一对话继续定位 |
| 改动太多,想重来 | 先保留当前目录以便比较;从原始副本再复制一个新练习目录,在新目录重试 |
首次复现失败是预期;修复后失败才需要继续排查。不要为了获得绿色结果删测试,也不要让模型在已有真实项目中一口气恢复所有文件。
换成自己的任务,保留这张任务卡
例如你的网站“点击保存后,刷新内容丢失”,下一次可以这样描述:
text
目标:修复点击保存后刷新页面,内容丢失的问题。
复现:在 [页面] 输入 [脱敏样例],点击保存,刷新页面。
实际结果:[你看到什么];预期结果:[应该看到什么]。
范围:先查 [相关目录];不要改 [必须保持不变的接口或文件]。
验收:用相同步骤复查,并运行 [项目现有测试命令]。
交付:说明原因、修改的文件、实际验证结果和仍未验证的部分。把方括号替换成真实信息。没有测试时,就写清可重复的操作步骤,先让 Codex 帮你固定复现方法。日后反复使用的项目规则,再整理进 AGENTS.md。
参考资料
- Codex CLI:安装与在项目目录中使用。
- Authentication:登录方法与计费身份。
- Agent approvals & security:沙箱与审批的分工。
- Prompting:用目标、上下文和边界描述任务。