Codex 新功能 /goal:AI 编程助手终于能"记住"任务了
Codex 刚刚更新了一个很多人还没发现的新功能——/goal。
一句话说清楚它是什么:你告诉 Codex 一个目标,它会记住这个目标,跨对话持续推进,直到完成为止。
之前的 Codex,每次对话都是独立的,你说”帮我重构这个模块”,下一次对话它就忘了。现在用 /goal,它可以一直盯着这件事,不管中间被打断多少次。
/goal 是用来解决什么问题的
做过大型项目的人都知道,有些任务不是一次对话能搞完的:
- 重构一个几千行的老代码库
- 把测试覆盖率从 30% 提到 80%
- 系统性地修掉某一类 bug
- 把一整套 API 从 v1 迁移到 v2
过去用 Codex 做这类任务,你得自己记进度:哪些文件改了、哪些还没改、做到哪一步了。下次打开 Codex,你要重新把背景交代一遍。
/goal 解决的就是这个问题——让 Codex 自己记住自己在干什么。
基本用法:四个命令就够了
1. 创建目标
/goal 把 src/utils/ 下所有函数
添加 TypeScript 类型注解
输入这个之后,Codex 会把这个目标持久化保存到当前会话线程里,并开始执行第一步。
2. 暂停目标
/goal pause
有紧急事情要先处理?暂停之后 Codex 停止推进,但目标还在,没有丢失。
3. 恢复目标
/goal resume
回来之后继续推进,它记得上次做到哪了。
4. 清除目标
/goal clear
任务完成,或者想换个方向,彻底清掉当前目标。

目标会经历哪些状态
/goal 设计了一套完整的生命周期,有五种状态:
pursuing(追踪中)
目标正在被 Codex 主动推进,每次对话都会往前走一步。
paused(已暂停)
用 /goal pause 之后进入这个状态。目标保留,Codex 停止行动。
achieved(已达成)
Codex 判断目标已经完成,自动变为这个状态,会告诉你完成了什么。
unmet(未完成)
Codex 遇到了无法绕过的阻碍,比如依赖缺失、权限不足,目标无法继续推进。
budget-limited(预算受限)
Token 或时间消耗到了上限,Codex 会暂停并告知当前进度。
实际用起来,大多数情况下你只会看到前三种。
一个具体的例子:跨会话重构
假设你有一个 Node.js 项目,services/ 目录下有 20 多个文件,全是 CommonJS 的老写法,你想统一改成 ES Module。
第一天,设定目标:
/goal 把 services/ 目录下的
所有文件从 CommonJS
改成 ES Module 写法
Codex 开始从第一个文件着手,分析、修改、验证。你看它工作了一会儿,要去开会了——
中途暂停:
/goal pause
关掉 Codex,去开会。
下午回来:
打开 Codex,输入:
/goal resume
它接着从第 7 个文件继续,不需要你重新解释任何背景。
几个注意事项
每个会话线程只能有一个 /goal。
如果当前线程已经有目标,再设新目标会覆盖旧的,注意不要误操作。
/goal 是线程级的,不跨会话。
关掉当前 TUI 再重新打开,是新会话、新线程,之前的 goal 不会自动带过来。如果想继续,用 codex resume 打开上次的会话,再执行 /goal resume。
还在测试阶段。
这是 0.128.0 新加的功能,官方文档还没正式补全(GitHub 上已有 issue 追踪文档补充工作)。遇到奇怪行为,可以先 /goal clear 再重新设定目标。
先升级到最新版本:
npm install -g @openai/codex@latest
/goal 底层是怎么实现的
理解 /goal 为什么能做到”跨对话持续”,需要先搞清楚 Codex 的工作方式。

Codex 的每次对话本质上是一个 rollout(展开过程):
- 用户给出指令
- Codex 将指令 + 上下文打包进 prompt
- LLM 生成”下一步行动”(写代码、执行命令、读文件……)
- 执行行动,观察结果,重新打包 prompt
- 循环,直到判断任务完成
这个循环在单次会话内没问题。但会话结束,上下文就消失了——这是所有 LLM 的基本限制,无一例外。
/goal 用了什么方法绕过这个限制?
翻开 Codex 源码(packages/codex-cli/src/),核心在两个地方:
1. 目标持久化(goal.ts)
GoalState 结构大致如下:
interface GoalState {
goal: string // 目标描述原文
status: GoalStatus // pursuing / paused / achieved / unmet / budget-limited
progress: string[] // 已完成步骤列表
blockers: string[] // 阻碍项记录
createdAt: number
updatedAt: number
}
GoalState 被写入当前 session 文件(~/.codex/sessions/)。每完成一步,progress 数组就追加一条记录——”auth.js 已迁移”、”db.js 已迁移”……进度不存在 LLM 脑子里,存在本地磁盘上。
2. 目标注入机制(agent-loop.ts)
每次新的 rollout 开始前,agent loop 会检查当前 session 是否有活跃 goal。如果有,会在 system prompt 里注入一段结构化上下文:
[ACTIVE GOAL]
Goal: 把 services/ 目录从 CommonJS 改成 ES Module
Status: pursuing
Progress:
✓ services/auth.js – 已完成
✓ services/db.js – 已完成
→ services/cache.js – 进行中
○ services/mailer.js – 待处理
…(共 23 个文件)
[/ACTIVE GOAL]
LLM 每次对话都是”新的”,但 Codex 在对话开始时把这份进度表塞给它,LLM 就能接着干,不需要用户重新交代背景。
核心思路其实很朴素:没有依赖什么神奇的”长期记忆”,就是把进度写到本地文件,每次对话前读进来,再注入 prompt。
Goal 的状态流转

几个细节:
achieved由 Codex 自主判断,不需要用户确认。它会检查 progress 列表里是否所有任务项都已打上 ✓unmet触发时,Codex 输出一份阻碍报告,说清楚是哪步卡住了budget-limited状态下进度保留,/goal resume可以继续推进
progress 列表是怎么生成的
很多人好奇:Codex 怎么知道”这个任务分几步”?
答案是:第一次 /goal 执行时,Codex 会先做任务分解(task decomposition),而不是直接动手。
流程大致这样:
- 接收到
/goal <描述> - LLM 分析目标范围(比如扫描目录里有多少文件、有哪些类型)
- 生成结构化任务清单,写入
GoalState.progress - 从第一项开始执行
这个”先分解再执行”的设计,让进度追踪有了真正的粒度——你能看到 23 个文件做完了几个,而不是一个模糊的转圈圈。
为什么这个功能重要
之前的 AI 编程工具,本质上都是”一次性帮手”——你问一个问题,它回答一个问题,没有持续性。
/goal 改变的是工作方式:从”提问-回答”变成了”目标-追踪”。
更值得关注的是它背后的实现思路:解决”LLM 没有持久记忆”这个根本问题,不是靠复杂的向量数据库或跨会话同步,而是靠最简单的”写文件 + 读文件 + 注入 prompt”。有时候,最实用的架构就是最直接的那个。
小结
回顾一下这篇讲了什么:
- /goal 是什么:让 Codex 记住一个目标,跨对话持续推进,直到完成
- 四个核心命令:创建、暂停、恢复、清除
- 底层原理:进度写本地文件,每次对话注入 prompt,朴素但有效
- 适合什么场景:大规模重构、批量迁移、系统性修 bug 等跨会话任务
如果你还没装 Codex,两步搞定:
npm install -g @openai/codex
codex
看到这里了,说明你是真爱👀
点个赞和在看支持一下。
搜索公众号「AI小白笔记本」,每周都有 AI 实用干货,不整虚的。
夜雨聆风