你会得到什么
OpenCode 的 /goal 命令让一个会话朝着你写下的目标连续干活。每干完一轮,一个"审查员"会检查目标有没有达成,没达成就自动接着干,直到达成、卡住,或者你叫停。它从 v2.2.1 起内置在终端界面和桌面版里,不用装插件。这篇带你从升级走到复查,文中有 4 段可以直接复制的提示词。
先把期望放对。/goal 不会无限跑下去,它有好几种自己停下的情况,后面有一张表逐个说明。它是真干完了才停,还是自以为干完了就停,取决于你的目标写得能不能被检查。

写一条能验收的目标,用 /goal 启动,模型干一轮,审查员判一次,结果要么继续下一轮,要么达成,要么暂停等你。
为什么它知道什么时候停
以前让 OpenCode 做大一点的事,它干一轮就停下来汇报,你回一句"继续",它再干一轮。/goal 把你回的那句"继续"交给了审查员。
审查员用的就是当前会话的模型。它读完整的对话记录,包括每次工具调用的结果,然后只回答一个判断。判断有五种:
| 审查员的判断 | 意思 | 接下来 |
|---|---|---|
done |
目标达成 | 状态变成"已达成",停下 |
continue |
还没做完 | 带着理由和下一步,自动开始下一轮 |
blocked |
卡住了,需要你 | 暂停 |
paused |
你在对话里说过要停 | 暂停 |
wait |
会话自己的后台命令还在跑 | 先等着,不开新一轮 |
要盯的有两点:
- 审查员只看得到对话里有的东西。 测试跑没跑、输出是什么,记录里有,它就能判;"代码质量更好了"这种话,记录里没有证据,它只能猜。
- 整个目标算一次执行。 中间每一轮不会各响一次提示音,全部结束才通知你一次。
第 1 步:升级到带 /goal 的版本
/goal 是 v2.2.1 加进来的。在终端里运行:
opencode upgrade
桌面版更新到最新版即可。升级后打开一个会话,输入 /goal 直接回车。不带内容的 /goal 会返回当前状态和用法,看到用法说明就表示这个版本有它。
之前装过社区做的 goal 插件的,建议先停用,免得两套逻辑同时接管同一个会话。
第 2 步:把目标写成能验收的
目标最长 4,000 个字符,足够写清楚做成什么,怎么算完成,哪些不能碰,卡住了怎么办。
不确定怎么写时,先让 OpenCode 帮你起草。在普通对话里发这段:
先别动手。我想做的事是:[用一两句话描述]。
请把它改写成一条给 /goal 用的目标,写成一段话,包含:
1. 要做成什么(一句话)
2. 完成标准:2 到 3 条,每条都能靠运行命令或查看文件来确认
3. 边界:只能改哪些目录,哪些事不能做
4. 什么情况下应该停下来问我
写完只把这段目标发给我,不要开始执行。
让它先起草,它会去翻项目,找到真实的测试命令和目录名,比你凭印象写的准。
下面是我们整理的目标模板,四个部分各占一句,直接替换方括号里的内容:
第 3 步:启动,看状态
把写好的目标发出去。目标可以直接跟在 /goal 后面,也可以用引号括起来。会话还没有标题时,会自动用目标来命名。
终端界面里,对话顶部会出现一行 ◎ Goal: 你的目标,输入框下方右侧出现状态 ◎ goal。

状态只有三种:◎ goal(进行中)、◎ goal paused(已暂停)、◎ goal met(已达成)。它不显示轮数。点一下状态会打开一个小窗口,里面是目标原文、当前状态和审查员最近一次给的理由。

两张图来自这个功能的官方合并请求(PR #59437)。
桌面版里,同样的信息是输入框旁的一个小标签,文字是 Goal、Goal paused 或 Goal met,点开有菜单。桌面版菜单不显示审查员的理由,想看就发一个不带内容的 /goal。
第 4 步:中途暂停或换目标
这几个命令随时能用,模型正在干活时发出去也会立刻生效。
| 想做的事 | 终端界面 | 桌面版 |
|---|---|---|
| 暂停 | /goal pause,或在状态窗口按 p |
标签菜单里点 Pause |
| 恢复 | /goal resume,或按 r |
点 Resume |
| 取消目标 | /goal clear,或按 x |
点 Clear |
| 换一个目标 | 直接发新的 /goal …,旧目标被替换 |
同左 |
| 看状态和理由 | 只发 /goal |
同左 |
按 Esc 中断会话,目标也会跟着暂停。
想中途补充要求,不用清掉重来。先暂停,把新要求当普通消息发出去,再恢复:
补充一条要求:[新的要求]。之前的目标和完成标准不变。
我接下来会恢复目标,你继续做,先说一下这条要求会影响哪些已经做完的部分。
它为什么自己停了
暂停后先发一个不带内容的 /goal,看审查员留下的理由,再对照下面的表。
| 看到的情况 | 原因 | 怎么办 |
|---|---|---|
| 理由是 "Not making progress: …" | 连续三轮没有进展。一轮里模型没调用任何工具,或者审查员给出的理由和上一轮一样,这一轮就算没进展 | 目标多半太空或太大。改写得更具体,或拆成小目标 |
| 理由说缺某样东西 | 审查员判了 blocked |
把它要的东西给它,再 /goal resume |
| 你按过 Esc,或对它说过"停" | 你停了会话,或审查员判了 paused |
/goal resume |
| 重启 OpenCode 之后变成暂停 | 重启前的目标不会自动续跑 | 确认还想继续,再恢复 |
| 很久没动静后暂停 | 一轮结束后 30 分钟什么都没发生,常见于后台任务卡死 | 先处理卡住的后台任务,再恢复 |
| 跑了很久后暂停 | 碰到了 50 轮的兜底上限 | 恢复后轮数重新计,但先想想目标是不是该拆 |
| 出错后暂停 | 执行失败,或审查员连续两次没给出可用的判断 | 看报错,处理后恢复 |
三轮和 50 轮这两个数字在界面上都不显示,所以暂停时别以为是出了故障。每次 /goal resume 都会重新开始计数。
达成之后自己再查一遍
◎ goal met 代表审查员认为达成了。审查员和干活的是同一个模型,会犯同一类错。状态变绿后发这段:
目标显示已达成。现在只做检查,不要修改任何文件:
1. 把完成标准逐条列出来
2. 每一条重新运行对应的检查,贴出真实输出
3. 列出这次改过的所有文件,各用一句话说明改了什么
4. 有没有为了通过检查而跳过、删除或放宽的地方,有就照实说
第 4 条最要紧。删掉一个失败的测试也能让"测试全部通过"成立,这种事只有专门问才会被说出来。
常见问题
OpenCode 的 /goal 怎么用?
在终端界面或桌面版的会话里输入 /goal 加上你的目标,回车。之后它会一轮接一轮地做,每轮结束由审查员判断是否达成。需要 v2.2.1 或更新的版本。
怎么取消或暂停一个目标?
/goal pause 暂停,/goal resume 恢复,/goal clear 彻底取消。按 Esc 中断会话也会让目标暂停。发一条新的 /goal 会直接替换旧目标。
opencode run 里能用 /goal 吗?
目前不能。opencode run 不支持斜杠命令,所以脚本和 CI 里暂时用不上,只能在终端界面和桌面版里用。
还需要另外装 goal 插件吗? 不需要。它是内置功能,升级后就有。以前靠社区插件实现类似效果的,现在可以换成内置的。
审查员用哪个模型,会多花钱吗? 用的是当前会话的模型,目前不能单独指定。每一轮结束都多一次审查请求,读的是完整对话记录。它目前没有费用上限这个设置,长目标开跑前自己留意用量。
注意
- 一个会话同一时间只有一个目标,新目标会顶掉旧的。
- 子 Agent 和分叉出来的会话不会继承目标,目标只对设置它的那个会话起作用。
- 后台子 Agent 还在跑时,审查员不会被叫出来,要等它交回结果。后台开着的开发服务器不会卡住目标。
- 对话太长被压缩后,系统会自动补一句目标提醒,不用你重发。
- 别拿它跑会动真东西的任务,比如部署上线或删数据。这类事把"停下来等我确认"写进目标里。
同名命令在 Claude Code 里也有,思路相通,见 用带团队的老规矩管好 Claude Code。


评论(0)
还没有评论,来说第一句。