乐于分享
好东西不私藏

Codex 新功能 /goal:AI 编程助手终于能"记住"任务了

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(展开过程):

  1. 用户给出指令
  2. Codex 将指令 + 上下文打包进 prompt
  3. LLM 生成”下一步行动”(写代码、执行命令、读文件……)
  4. 执行行动,观察结果,重新打包 prompt
  5. 循环,直到判断任务完成

这个循环在单次会话内没问题。但会话结束,上下文就消失了——这是所有 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/.json)。每完成一步,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),而不是直接动手。

流程大致这样:

  1. 接收到 /goal <描述>
  2. LLM 分析目标范围(比如扫描目录里有多少文件、有哪些类型)
  3. 生成结构化任务清单,写入 GoalState.progress
  4. 从第一项开始执行

这个”先分解再执行”的设计,让进度追踪有了真正的粒度——你能看到 23 个文件做完了几个,而不是一个模糊的转圈圈。


为什么这个功能重要

之前的 AI 编程工具,本质上都是”一次性帮手”——你问一个问题,它回答一个问题,没有持续性。

/goal 改变的是工作方式:从”提问-回答”变成了”目标-追踪”。

更值得关注的是它背后的实现思路:解决”LLM 没有持久记忆”这个根本问题,不是靠复杂的向量数据库或跨会话同步,而是靠最简单的”写文件 + 读文件 + 注入 prompt”。有时候,最实用的架构就是最直接的那个。

小结

回顾一下这篇讲了什么:

  • /goal 是什么:让 Codex 记住一个目标,跨对话持续推进,直到完成
  • 四个核心命令:创建、暂停、恢复、清除
  • 底层原理:进度写本地文件,每次对话注入 prompt,朴素但有效
  • 适合什么场景:大规模重构、批量迁移、系统性修 bug 等跨会话任务

如果你还没装 Codex,两步搞定:

npm install -g @openai/codex

codex


看到这里了,说明你是真爱👀

点个赞和在看支持一下。

搜索公众号「AI小白笔记本」,每周都有 AI 实用干货,不整虚的。