把本教程一键复制给 Agent 即可

本文有一段关键内容上了锁,Agent 打开链接也看不到它。请先解锁,再一键复制完整内容给 Agent。

别再一轮一轮催了,OpenCode 的 /goal 让 AI Agent 盯着目标自己干到底

进阶教程:升级 OpenCode,把任务写成能验收的目标,用 /goal 启动,看状态、暂停和恢复,读懂它自己停下的原因,达成后再复查一遍。附 4 段可直接复制的提示词。

你会得到什么

OpenCode 的 /goal 命令让一个会话朝着你写下的目标连续干活。每干完一轮,一个"审查员"会检查目标有没有达成,没达成就自动接着干,直到达成、卡住,或者你叫停。它从 v2.2.1 起内置在终端界面和桌面版里,不用装插件。这篇带你从升级走到复查,文中有 4 段可以直接复制的提示词。

先把期望放对。/goal 不会无限跑下去,它有好几种自己停下的情况,后面有一张表逐个说明。它是真干完了才停,还是自以为干完了就停,取决于你的目标写得能不能被检查。

OpenCode /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. 什么情况下应该停下来问我
写完只把这段目标发给我,不要开始执行。

让它先起草,它会去翻项目,找到真实的测试命令和目录名,比你凭印象写的准。

下面是我们整理的目标模板,四个部分各占一句,直接替换方括号里的内容:

这段关键内容需要登录后解锁

新用户注册就送 10 积分,每天签到再领 1 积分。用 1 积分解锁,以后随时回来都能看。

第 3 步:启动,看状态

把写好的目标发出去。目标可以直接跟在 /goal 后面,也可以用引号括起来。会话还没有标题时,会自动用目标来命名。

终端界面里,对话顶部会出现一行 ◎ Goal: 你的目标,输入框下方右侧出现状态 ◎ goal。

终端界面启动目标后的样子:顶部是目标,右下角是 goal 状态

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

点击状态后的窗口:目标、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。

参考

读完了?标记一下,记录学习进度。登录
收藏起来,稍后再看登录
对这篇有疑问?向 Ask AI 提问

评论(0)

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

登录后参与讨论。登录