← 全部极客知识库

主流 Agent 入门教程 / Codex

5. 让Codex规划第一个完整功能

原文备份 · 第 6 / 27 篇 · 查看极客时间原知识库 ↗

本篇目录 · 23 节

来源:Codex

预计阅读时间:35 分钟
本篇目标:把一个模糊想法整理成明确需求,让 Codex 先调查、提问和规划,再决定如何实现。

上一篇我们创建了 PROJECT_BRIEF.md,里面只有几条简单信息:TaskFlow 是一个本地命令行任务管理工具,第一阶段支持添加、查看和完成任务。

这些信息足够表达方向,却不足以直接开发。我们还不知道用什么语言、任务保存在哪里、命令长什么样、出错时如何处理,以及怎样判断第一版已经完成。

如果现在直接说“帮我把 TaskFlow 写出来”,Codex 也许能做出一个能运行的版本,但它需要替你做很多决定。那些决定未必符合你的真实需求。

这一篇先不写代码。我们要做的是把想法变成一份可以执行和验收的计划。

一、确认项目仍处于正确状态

进入 taskflow 目录。

macOS、Linux 或 WSL2

cd ~/codex-course/taskflow
git status

Windows PowerShell

Set-Location "$HOME\codex-course\taskflow"
git status

如果上一篇创建了 Git 提交,工作区应该是干净的。如果没有提交,应该只看到 PROJECT_BRIEF.md。

确认文件存在:

ls

Windows PowerShell 也可以使用 ls,它是 Get-ChildItem 的别名。

你应该能看到:

PROJECT_BRIEF.md

二、检查 Python 环境

为了让示例在不同系统上尽量简单,TaskFlow 1.0 使用 Python 标准库开发,不安装第三方依赖。

macOS、Linux 或 WSL2

运行:

python3 --version

Windows

先运行:

py --version

如果 py 不存在,再尝试:

python --version

建议使用 Python 3.11 或更高版本。看到 Python 3.x.x 就说明命令可用。

如果系统没有 Python,请从 Python 官方网站 安装 Python 3。Windows 安装界面中要留意“Add Python to PATH”选项。安装完成后关闭并重新打开终端,再检查版本。

本教程后续命令约定如下:

  • macOS、Linux、WSL2 使用 python3;
  • Windows 优先使用 py,没有 py 时使用 python。

三、什么样的任务值得先规划

并不是所有任务都需要 Plan 模式。修改一个错别字、解释一个函数、调整一条错误提示,直接做通常更快。

下面这些任务更适合先规划:

  • 需求中存在多种合理实现;
  • 修改会跨越多个文件或模块;
  • 需要先理解现有项目;
  • 有兼容性、安全或数据迁移要求;
  • 任务会持续较长时间;
  • 你希望先审查方案,再决定是否允许修改。

TaskFlow 虽然不大,但这是我们第一次建立完整项目,正适合用 Plan 模式练习。

四、在只读模式下进入 Plan 模式

从项目目录启动 Codex:

codex --sandbox read-only --ask-for-approval on-request

进入后输入:

/plan

Codex 会进入 Plan 模式(在界面右下角可以看到 Plan mode)。在这个模式中,它可以调查现有上下文、提出问题并整理方案,但重点是规划,而不是直接实现。

你也可以把任务直接写在 /plan 后面。不过第一次练习时,先单独进入模式,更容易观察状态变化。

五、先给出一段故意不够完整的需求

输入:

我想把当前目录里的 TaskFlow 做成一个真正可以使用的命令行任务管理工具。
请先阅读 PROJECT_BRIEF.md,然后规划第一版怎么做。

这是一个很常见的需求表达,但仍然缺少大量信息。观察 Codex 的反应:

  • 它是否先读取了 PROJECT_BRIEF.md;
  • 它是否发现技术方案和验收标准尚未确定;
  • 它是否提出澄清问题;
  • 它是否直接假设了很多细节。

Codex 有可能会弹出一些选项让你选择,你可以根据下面的约束来针对性地答复它:

第一版按下面的要求规划:

1. 使用 Python 3.11 或更高版本,只使用标准库,不安装第三方依赖。
2. 程序入口为项目根目录下的 taskflow.py。
3. 任务保存在 JSON 文件中,默认路径为 data/tasks.json。
4. 命令格式统一为:
   python taskflow.py --data <数据文件> <子命令> [参数]
5. 第一版只支持三个子命令:
   - add <任务标题>
   - list
   - done <任务ID>
6. 每条任务至少包含整数 ID、标题、完成状态和创建时间。
7. 数据文件不存在时按空任务列表处理,并在第一次写入时自动创建父目录。
8. 测试统一放在 tests/,使用 unittest 和临时目录,不能读写用户真实的 data/tasks.json。
9. 暂时不要实现删除、修改、截止日期、标签、网络同步和图形界面。
10. 先输出计划,不要创建或修改文件。

如果 Codex 立刻给出实现方案,却没有询问关键问题,可以继续说:

先不要确定实现方案。请列出会明显影响项目结构、用户操作方式和验收结果的问题,
最多问我 6 个。不要询问无关紧要的偏好。

一个好的规划过程,不是问题越多越好,而是优先解决那些会改变方案的问题。

六、把关键选择明确下来

接下来,计划生成后,Codex 会询问你接下来怎么处理。当前界面通常有三个选项:

  • Yes, implement this plan:退出 Plan 模式,保留当前上下文,并开始执行刚刚确认的计划;
  • Yes, clear context and implement:先清理前面的对话上下文,再带着最终计划进入执行;
  • No, stay in Plan mode:暂不执行,继续留在 Plan 模式补充或修改计划。

如果计划中还有规则没说清楚,选择 No, stay in Plan mode,继续追问。

这里我们为了统一学习进度,建议选择“No,stay in plan mode”(在其他场景下,如果它给出的方案已经足够令你满意,你可以选择让它直接实施方案)。

然后请它按第五节十条约束确认尚未决定的接口:固定 taskflow.py 入口、全局 --data 参数、tests/ 目录和错误退出码。已有答案不再整段重发;有变动只提交差异,并要求计划同步更新。

七、定义“完成”是什么样子

功能列表只能说明“要做什么”,还不能说明“怎样算做完”。继续告诉 Codex:

请把下面这些验收条件加入计划:

- 添加任务后,JSON 文件中出现一条新任务;
- 连续添加任务时,ID 递增;
- list 能清楚区分未完成和已完成任务;
- done 能按 ID 将任务标记为完成;
- 对不存在的 ID 执行 done 时,程序给出明确错误并返回非零退出码;
- 空任务列表不会报错,而是显示友好提示;
- 所有自动测试通过;
- README 同时给出 macOS/Linux/WSL2 与 Windows 示例;
- 最后实际运行一遍 add、list、done,报告运行结果。

请根据现有目录和这些条件,给出分步骤实施计划。每一步都写明会修改哪些文件,以及如何验证。

现在,Codex 获得了四类关键信息:

信息 本次内容
目标 创建可以使用的 TaskFlow 1.0
上下文 PROJECT_BRIEF.md 和当前空项目
限制 Python 标准库、三个子命令、不做扩展功能
完成标准 测试、手动操作和文档全部通过

这是以后编写 Codex 任务描述时最值得保留的结构。

八、检查 Codex 给出的计划

一份适合执行的计划通常应该接近下面的结构:

  1. 检查现有项目和 Python 环境。
  2. 设计任务数据格式和存储函数。
  3. 实现 add、list、done 三个子命令。
  4. 使用临时目录编写测试。
  5. 编写 README 和运行示例。
  6. 执行自动测试。
  7. 完成一次端到端手动验证。
  8. 审查最终差异。

不要求 Codex 的表述与这里完全一致,但要检查几个问题。

1. 每一步能否独立验证

“实现整个项目”不是一个好步骤,因为失败后很难知道问题在哪里。“实现存储层并运行相关测试”更容易检查。

2. 有没有超出第一版范围

如果计划加入数据库、Web 界面、账号系统、插件架构或复杂打包流程,说明方案已经过度设计。

可以直接纠正:

第一版不需要扩展架构。请去掉数据库、插件系统、网络能力和打包发布,
保留能够完成三个命令的最小结构。

3. 有没有验证步骤

如果计划只写“完成代码”,却没有自动测试和手动运行,任务就缺少验收闭环。

4. 是否保护测试数据

测试必须使用临时目录,不能修改正式的 data/tasks.json。这是计划中需要明确写出的边界。

5. 是否明确了预计修改的文件

第一版预计产生:

taskflow.py
tests/test_taskflow.py
README.md
.gitignore
PLAN.md

data/tasks.json 会在手动运行时生成,不应该在测试过程中提前写入真实数据。

九、让 Codex 把最终计划整理成可保存版本

当计划已经满足要求,输入:

请把最终计划重新整理一遍,要求:

- 开头写清项目目标和本次范围;
- 列出最终预计产生的文件;
- 每个实施步骤包含“修改内容”和“验证方法”;
- 单独列出不在第一版范围内的功能;
- 最后给出完成检查清单;
- 仍然不要修改文件。

阅读最终计划。确认没有问题后,按“shift+tab”键退出 Plan 模式。

由于当前 Codex 仍然以只读沙箱启动,需要先输入:

/permissions

选择 Ask for approval。它允许 Codex 在当前工作区内写入,越过工作区或访问其他受限资源时会停下来请你确认。不要选择 Full access;本篇只需要写入 TaskFlow 项目目录。

然后输入:

请把刚才确认的最终计划写入项目根目录的 PLAN.md。
同时更新 PROJECT_BRIEF.md,使其包含已经确认的技术方案、命令格式、范围和验收条件。

只修改这两个 Markdown 文件,不要创建程序代码。完成后重新读取两个文件,并说明它们是否一致。

十、检查规划文件

任务完成后输入:

/diff

重点检查:

  • PLAN.md 是否完整记录实施顺序;
  • PROJECT_BRIEF.md 是否反映已经确认的需求;
  • 两个文件是否使用同样的命令格式;
  • 是否明确只使用 Python 标准库;
  • 是否明确测试不能读写真实数据;
  • 是否混入了尚未同意的功能;
  • 是否只修改了两个 Markdown 文件。

发现不一致时,不要自己默默记住,直接让 Codex 修改文档。例如:

PLAN.md 使用的是 tasks.json,PROJECT_BRIEF.md 写成了 task.json。
请统一为 data/tasks.json,并重新检查两个文件中的所有路径。

十一、如何把模糊想法交给 Codex

以后遇到类似需求,可以复用下面的任务模板:

我想实现:<目标>。

请先阅读:<相关文件或目录>。

在开始修改前:
1. 说明你对现状和目标的理解;
2. 找出会影响方案的缺失信息;
3. 最多向我提出 <数量> 个关键问题;
4. 根据我的回答给出分步骤计划;
5. 每一步说明涉及文件和验证方式。

限制条件:
- <不能改变的内容>
- <不在本次范围内的内容>
- <技术或安全约束>

完成标准:
- <测试要求>
- <行为要求>
- <最终交付物>

在我确认计划前,不要修改文件。

模板不需要每次逐字填写。任务越简单,提示词越可以缩短。它的价值在于提醒你:目标、上下文、边界和完成标准缺一不可。

十二、保存规划结果

退出 Codex:

/exit

回到终端后运行:

git status
git diff

你应该看到 PLAN.md 和 PROJECT_BRIEF.md 的变化,不应该看到 Python 程序文件。

确认无误后可以按 Q 退出,然后执行下面的提交命令:

git add PROJECT_BRIEF.md PLAN.md
git commit -m "docs: define TaskFlow 1.0 plan"

如果上一篇没有成功提交,可以把当前两个文档和之前的项目说明一起提交。提交信息不必与示例完全一致,但应能说明这一阶段完成了什么。

十三、本篇完成检查

继续下一篇之前,请确认:

  • Python 3 可以在终端中运行;
  • 你能进入和退出 Plan 模式;
  • Codex 在规划阶段没有创建程序代码;
  • PROJECT_BRIEF.md 已包含明确需求和验收条件;
  • PLAN.md 已列出分阶段步骤和验证方式;
  • 第一版只包含 add、list、done;
  • 测试必须使用临时目录;
  • 计划中没有数据库、网络同步或图形界面;
  • 你已经用 /diff 检查规划文件。

下一篇,我们会把这份计划交还给 Codex,让它逐步完成 TaskFlow 1.0,并亲自运行测试和三个核心命令。

参考资料