OpenCode 目标模式插件
为 OpenCode 注入 Codex 风格的长时目标模式,让 AI 编码代理围绕一个明确目标持续推进,直到完成、受阻或被清除。
证据显示:状态文件 0600 权限、UUID 独占临时文件的原子写入(有测试断言)、Plan 模式目标默认暂停、codemode:false、可配置 restricted_agents。扣分点:auto_continue 默认为 true(自动续跑默认开启,虽有预算/暂停护栏);主源码(src/server.ts、state.ts)未在证据中提供,权限与模式隔离的实际实现只能由测试间接佐证,故 least_privilege 只给 2。用户确认方面:从 plan 代理创建目标即暂停、恢复需用户显式操作(2),但代理可自行 set_goal。依赖仅有版本范围与 frozen lockfile,无审计/锁定策略证据,dependency_security 给 1。状态持久化路径透明、无遥测迹象,数据流与敏感数据处理各给 2。外部效果限于 OpenCode 会话内续跑并有预算上限(2);损坏状态隔离(corrupt-* 备份)、暂停/恢复、原子回退旧文件构成基本回滚(2)。致谢明确引用 William Ricchiuti 的 willytop8/OpenCode-goal-plugin,来源归属完整(3)。
原子写入失败路径的测试覆盖非常细致(sync/rename/close 失败均保留旧状态并清理临时文件),错误处理诚实(目录 fsync 不支持时降级、真实 I/O 错误如实上报),failure_messages 给 3。依赖经 lockfile 固定并有 CI 验证,dependency_availability 给 2。自洽性扣分明显:README 称 'Plugin release 0.1.30 and newer supports OpenCode 2',但 package. 版本为 0.1.1,且 README 描述的大量行为无法在 0.1.1 中核对,self_consistency 仅给 1。
README 明确目标用户(长重构/迁移/测试修复会话)、V1/V2 双版本支持路径、V2 beta 局限逐项列出,audience_and_scenarios 给 3。能力边界极其详尽:max_objective_chars、预算、max_task_block_seconds、续跑触发/抑制条件、watchdog 与预算不计费规则均有说明,capability_boundaries 给 3。续跑触发精确(V2 execution.succeeded、legacy idle、Task 子会话延迟、去重、暂停先行持久化),trigger_precision 给 3。跨平台处理(Windows rename 重试与 EPERM/EACCES/EBUSY、目录 fsync 平台差异、APFS fsync 诚实说明)有测试佐证,environment_fit 给 3。
README 结构清晰(安装、选项、工作流、Plan 安全、状态、开发、发布),information_architecture 给 3;安装说明区分 OpenCode 1/2 且给出手动配置,install_notes 给 3。命名稳定性:作用域包名、command_name 可配置且保留 pause_goal/resume_goal 回退,但存在与 README 描述版本脱节的风险,给 2。示例有(/goal 用例、配置示例),但无 FAQ 或故障排查节,examples_and_faq 给 2。已知限制诚实且具体(V2 缺 compaction 上下文与子会话恢复、fsync 局限),known_limitations 给 3。LICENSE 文件与 package. 一致,license 给 3。无 CHANGELOG 文件,且版本自洽性问题(0.1.30 vs 0.1.1)使 versioning_changelog 仅给 1。维护责任有 SECURITY.md(5 工作日响应、私有上报渠道)与自动发布 CI,但发布者身份未经验证、支持策略仅覆盖最新版本,maintenance_responsibility 给 2。
工具输出为结构化 JSON content,侧边栏展示状态/耗时/token/检查点,goal 关闭需证据或 blocker,output_usability 给 2;主源码不可见故不评满。填补 OpenCode 长期目标模式空白、与 Codex 语义对齐,marginal_value 给 2。预算、wrap-up 提示、无进展暂停防止无限续跑,成本控制设计合理但实际消耗未经执行验证,cost_benefit 给 2。
README 做了大量行为承诺(续跑去重、暂停时序、V2 事件驱动),但核心 src 文件不在证据中,多数声明无法静态溯源,claim_traceability 仅给 1。README、package.、CI、SECURITY.md 与测试在原子写入、工具注册、命令注册、恢复行为上互相印证,cross_source_corroboration 给 2。README 区分了事实与限制(如明确说明 fsync 非绝对持久保证、V2 为 beta),事实与推断分离尚可但宣传性关键词段落偏多,fact_inference_separation 给 2。
- 仓库版本自洽性存疑:README 提及 0.1.30+ 支持 OpenCode 2,而 package. 为 0.1.1,安装前请核对 npm 上实际版本与文档是否匹配。
- auto_continue 默认开启:目标会自动续跑并消费模型额度,敏感环境建议显式设为 false 或设置 token/时长预算。
- 发布者身份未经企业注册表验证;本仓库未包含核心 src 源码证据,安装前建议自行审计 dist 产物与依赖。
- 依赖无审计证据,建议运行 npm audit / lockfile 审查后再引入。
- 状态文件 goals. 包含目标与用量元数据,位于用户数据目录,多用户主机上注意本地隐私。
这个 Agent 能做什么,适合哪些场景?
OpenCode 目标模式插件是 prevalentWare 在 GitHub 上发布的 npm 包(@prevalentware/opencode-goal-plugin),为 OpenCode 添加 Codex 风格的长时目标模式。它通过 /goal、/pause_goal、/resume_goal 斜杠命令以及 get_goal、set_goal、update_goal 等代理工具,维护每个会话的持久目标状态。目标只有在提供验证证据后才能标记为 complete,或给出具体阻塞原因后标记为 unmet;插件还支持 session.idle 上的自动续跑、token 与时长预算、无进展暂停以及 Plan 模式安全边界。状态以原子写入方式存储在本地 goals. 文件中,TUI 侧边栏实时显示目标状态、耗时与目标内容。该插件面向已在使用 OpenCode 的开发者,而非独立代理产品。
安装后,插件向 OpenCode 注册 /goal <objective>(还有 /goal pause、/goal resume、/goal history、/goal clear 及别名),并通过 create_goal、set_goal、update_goal、update_goal_status、update_goal_objective、get_goal、get_goal_history、list_all_goals、clear_goal 等工具让代理读写目标。update_goal 以 status: complete + evidence 或 status: unmet + blocker 关闭目标。安全状态包括 budgetLimited、usageLimited 和 paused。自动续跑由 V2 session.execution.succeeded 和旧版 session.idle/session.status 事件驱动,并受 max_auto_turns、default_token_budget、max_goal_duration_seconds、max_no_progress_turns 等选项约束;达到限制时发送一次收尾交接提示而非无限继续。目标状态原子写入 $XDG_DATA_HOME/opencode-goal-plugin/goals.(可用 OPENCODE_GOAL_STATE_PATH 覆盖),损坏文件会隔离为 goals..corrupt-<时间戳>-<uuid>。TUI 侧边栏显示状态、耗时、token 用量、续跑次数、检查点与停止原因。
- 开发者执行长时间重构、迁移或代码审查,希望代理跨多次空闲轮次持续围绕同一目标工作。
- 团队要求目标关闭必须有真实文件、测试或 PR 状态的验证证据,而不是代理口头宣称完成。
- 用户在长会话被 OpenCode 摘要压缩时,仍需当前目标与预算信息完整保留。
- 安全敏感团队依赖 Plan 模式:plan 代理创建的目标自动暂停,且无法从 Plan 模式自我恢复执行。
- 远程集成(桌面、Web)通过 OpenCode 服务端命令目录发现并调用 /pause_goal、/resume_goal 控制目标。
- 需要为长期任务设置 token 或时长预算,超限后自动进入安全的收尾交接。
这个 Agent 有哪些优点和局限?
- 目标关闭强制要求 evidence(complete)或具体 blocker(unmet),抑制代理虚假宣布完成。
- 目标状态跨会话压缩持久保留,并在 session.idle 上自动续跑,无需用户反复提示。
- 多层 Plan 模式安全:plan 代理创建的目标自动暂停,续跑提示固定绑定原代理,防止提示注入把规划会话升级为执行。
- 细粒度安全选项:token/时长预算、max_auto_turns、无进展暂停、任务子会话让路(defer_while_tasks_active)及 max_task_block_seconds 上限。
- 状态文件原子写入、owner-only 权限、损坏自动隔离,并从磁盘恢复完整目标与历史。
- 深度绑定 OpenCode 生态:离开 OpenCode CLI 即不可用,不支持 Claude Code、ChatGPT 等其他代理运行时。
- OpenCode 2 处于 beta,插件将 V2 契约锁定到特定 preview(0.0.0-next-17055),后续 preview 可能需要插件更新;V2 缺少目标压缩上下文与子会话恢复(仅 V1 支持)。
- 自动续跑可能产生额外 token 消耗,预算类选项(default_token_budget、max_goal_duration_seconds)默认未启用,需自行配置以防失控。
- macOS/APFS 上 fsync 并非 F_FULLFSYNC,突然断电时持久性不提供绝对保证(README 明确说明)。
- 文档中未见发布版本标签或测试通过截图之外的可审计运行证据;实际稳定性取决于 OpenCode 插件 API 的演进。
如何安装或部署这个 Agent?
OpenCode 1 稳定版:运行 opencode plugin @prevalentware/opencode-goal-plugin(全局加 -g),或手动在 opencode. 和 tui. 中加入 {"plugin": ["@prevalentware/opencode-goal-plugin"]}。OpenCode 2 beta(opencode2):插件 0.1.30 及以上支持,在 opencode. 和 ~/.config/opencode/cli. 中分别加入 {"plugins": ["@prevalentware/opencode-goal-plugin"]}(V2 不读取 tui.)。两种格式不可混用。npm 包名为 @prevalentware/opencode-goal-plugin。
如何使用这个 Agent?
在新的 OpenCode 会话中输入 /goal <目标描述> 创建目标,例如:/goal review the frontend and translate visible English UI text to Spanish。裸 /goal 查看状态,/goal history 查看历史与检查点,/goal edit 更新目标,/goal pause / /goal resume 暂停恢复,/goal clear(或 stop/off/reset/none/cancel)清除。也可直接让代理调用 set_goal 自行设定目标。编写目标时建议包含范围、非目标和验证路径。通过 TUI 命令面板的 Goal 条目可查看、刷新、暂停、恢复或清除当前目标。可通过 opencode. 的插件选项配置 auto_continue、max_auto_turns、default_token_budget、max_goal_duration_seconds、restricted_agents 等。