编码任务

编码看板把一件写下来的任务变成已合并的代码,仪式感要多少就多少:写下你需要的,然后选先规划——和一个交互式规划代理一起把它拆成可审查的阶段——或直接启动,看着代理在它自己的 git worktree 里工作,用锚定到行的注释审查差异,再把它合入——一旦你批准,写下这项更改的代理就会合并它(或创建拉取请求)。每个阶段是一列;每件任务都在其中一列里。

在边栏中,编码任务分区就在会话正下方、自动化与虚拟机之上。它的标头显示有几件未完成的任务、一个计算在审查中等待之任务的橙色标章、一个在代理需要你输入时出现的红色标章,以及一个用来新建任务的 +。在它下面,一行字概括整个看板(2 件已规划 · 1 件进行中 · 1 件待审查),看板为空时则显示没有未完成的任务。点分区标题(打开编码任务 (⇧⌘T))或那一行,就会打开标题为编码任务的看板;你也可以按 ⇧⌘T(工作区 › 任务),或在 ⌘K 命令面板中选编码任务。

编码任务看板就在边栏旁边,边栏的任务分区被选取:待办清单中有“为 API 加上速率限制”这件任务,提供“先规划”与“启动”;规划列有两个编号的阶段,第二个被锁在阶段 1 之后;进行中有“修好不稳定的 websocket 测试”,正在启动;审查中有位于分支 wt/settings-sqlite-0719 上的“把设置迁移到 SQLite”,带一则注释、待审查;完成列有一件已合并进 main 的任务。右上角有个“新建任务”按钮。
列放在那里的东西
待办清单你写好但还没开始的任务。每一件都提供先规划与启动,也可以分配给某个会话或房间。
规划规划代理从一件任务归档出来的阶段——有编号、顾及依赖关系、可以多选。
进行中代理正在着手的任务与阶段,各自在自己的 worktree 里,也各自以一个会话的形式出现在边栏。
审查等着你的完工成果:点一件任务就会打开审查窗口,里面是该分支的差异。正在合入的任务会留在这里,直到更改进去为止。
完成每件任务都会说明它是怎么来到这里的:已合并到 分支、已创建 PR #N、已由你标记为完成或未合并即关闭。

本页的一切从远程的富客户端操作也完全相同——看板、规划窗口与审查窗口全都透过控制 API 镜像过去。

写一件任务

看板顶端的新建任务、边栏编码任务标头上的 +,或点击某件待办任务,都会打开编辑器:

  • 一个标题与一份以 Markdown 写成的描述,带着撰写 / 预览切换。这份描述会成为代理的提示,所以请照提示那样写。
  • 工作区与代理——这件任务会在你所选的机器(在设置编辑器中即工作区)上,用那台机器上可用的其中一个代理运行。
  • 在哪里启动代理——机器里的某个文件夹。当它本身就是一个 git 仓库时,这件任务会在那里的一个新 worktree 与新分支中运行。
  • 必要时创建文件夹与 git 仓库——为从零开始的工作准备:若那个文件夹还不是它自己的仓库,启动或规划会先执行 mkdir 与 git init(带一个空的根提交)。如果那是既有仓库里的一个文件夹,就把它关着。
  • 批准后——任务如何离开审查:工作区默认(机器的选择,而它本身默认跟随“设置”——见常规)、合并到分支,或创建拉取请求。

新任务会沿用你上一次使用的工作区与文件夹。

待办清单中的任务提供两个按钮:

  • 启动把任务送进进行中:一个新的代理会在一个新的 worktree 里自主把整件事做完,并把差异交到审查给你。(任务正在规划时无法使用。)
  • 先规划会先打开一个规划会话。

启动在任何东西移动之前先做检查:必要时先启动这台机器,接着文件夹必须存在并且本身就是一个 git 仓库(或必须开启必要时创建文件夹与 git 仓库)。检查期间,任务会带着**正在启动…**的转圈留在原本那一列;只有在代理真的能启动时,它才会移到进行中。无法启动的任务会留在原处,并以红字说明原因——缺少文件夹、文件夹不是仓库——所以看板(以及 GET /tasks)绝不会把一件没在运行的任务显示为进行中。

每件待办任务也会显示由谁来接手:分配会打开选项(一个新的代理、总机、某个会话或某个房间),之后任务会显示已分配给 名称;取消分配会把它从那个队列中拿掉。看板顶端的新任务:未指派设置你创建新任务时要分配给谁。

规划

先规划会启动一个看得见、可交互的规划会话并打开它的窗口——原生的对话视图,不需要终端。会话以你的任务开场;代理以只读方式探索仓库、讲述它找到的东西,并在任务留下真正的抉择时提问。

问题以分页卡的形式抵达——每个问题一个分页,恰好映照代理在它自己会话里显示的那个选择器。答案在本机被收拢,而且在你按下送出之前都还能改;一按就把整组一起送出。点错从来不会是定局。你也可以在窗口底部的输入区打自由格式的回答,或按打开终端去看原始的会话。

当代理拿到它需要的东西,就会把计划归档到看板上——在规划列中排好顺序的阶段,每一个大约相当于一个可审查的拉取请求的工作量,彼此之间有依赖关系——并记下一份计划总览。接着窗口会显示计划已就绪、阶段数,以及一个关闭按钮;规划会话的标签页会自行关闭、其会话会被归档,而任务会离开待办清单(它的各阶段取代了它;把它们全部移除,它就会回来)。

规划是被看着的:如果机器重启、代理被退出,或会话在阶段归档之前就死掉,任务的转圈会带着一个具体的原因结束——点先规划重试——而不是永远转下去。

规划列

阶段依计划顺序编号,并带着:

  • 一个依赖标章(一个带阶段编号的锁),当这个阶段需要先前的阶段先变成完成时出现。
  • 一个排队中标章,若你在它的依赖关系还没完成之前就把它启动了——一旦它们全部完成,它就会自动开始。
  • 它们母任务的名称。

用复选框选取多个阶段,选取栏就会出现:开始所选的 N 项会把它们各自启动(被依赖关系挡住的阶段会排队),清空放掉选取,而移除在一次确认之后把整个选取移除。编辑某个阶段会显示它的依赖于清单——每一个同层阶段都带一个复选框,所以依赖关系可以手动重整。

各阶段是完全自主运行的——一旦开始,就不预期任何交互输入。

进行中

一件启动的任务会在必要时启动这台机器、创建一个新的仓库 worktree,并以任务的描述作为提示启动代理。代理会像其他会话一样出现在边栏,所以你可以在聊天中跟着它。任务会用与边栏中会话那一行相同的字眼显示它的代理状态——工作中、代理卡在某个问题上时以红字显示需要你、代理停在提示处等待却还没交出任务时显示就绪、它的会话在休眠时显示已暂停——再加上它何时开始。点它(打开此任务的实时会话)会把那个会话放上舞台;已经不在的会话会提供重启会话,而仓库或分支已消失的任务会提供重新开始(在新分支上重新运行一次)。在启动时就死掉的代理——缺少命令、标志错误——会在几秒内被抓到:任务会以红字说明,附上代理的退出状态,并提供重启会话。当要给代理的消息发现它的输入框里已经有文字时,Bromure 不会叠着打上去:消息会等输入框清空,如果一直没清空,任务就会以红字说明。边栏的任务标章会把这些算进去,让你一件都不会漏掉。

把光标移到进行中的任务上会出现一个 ✓ 完成按钮(确认后标记为完成:什么都不会合并,分支会保留)。右键点击可选打开会话、重启会话、移到审查、标记为完成、停止并退回待办(代理停止;它的 worktree 与分支留在工作区,任务回到待办清单)、停止并丢弃分支与仅移除任务。把一件待办任务或一个阶段拖到进行中就会启动它。交给某个会话或房间的任务则改为提供打开会话与停止并退回待办。

当代理报告完成,任务就会移到审查。它的会话会保持打开:你退回的审查注释会送到同一段对话,而当你批准这件任务时,由同一个代理把它合入。会话会在任务合入、被标记为完成或被丢弃时归档——或在审查中约两小时都没有动静之后归档,这种情况下,退回或合入会在一个新标签页中恢复代理的对话。如果代理反倒崩溃了,任务会变红,而不是假装还在工作。

审查

审查中的任务会显示它的分支、它的审查注释,以及它目前的状态:准备合入、合入中 — 代理 正在合并到 分支…(附上代理最新的一行),或以红字显示的需要你处理 — 原因(卡片上两行,光标移上去可看全部),并附重试与打开会话按钮。没有产生代码的任务会显示无代码更改 — 阅读报告。把光标移到任务上可看到 ✓ 完成;把它拖到完成列就能标记为完成。点它会打开审查窗口——也就是用来审查某个会话之变更的同一个窗口,标题为审查 — <任务>,带着这件任务专属的按钮。

在窗口标头下方,一段摘要说明分支的状况:Kimi Code 在 Web app · ~/app 的 wt/fix-login 上工作 · 3 个提交 · 相对 main 4 个文件 (+120 −7) · 此后 main 前进了 2 个提交 · main 的签出是干净的 · 远程:origin。

窗口显示该分支的差异,是从那台机器即时读取的(所以机器必须在运行中),带有逐文件的展开、增加与删除的行数、各提交与工作树状态,以及代理所记下的计划(若有)。顶端的一个选择器决定差异要跟什么比:

选择显示
自 <母分支> 起(默认)这个分支离开它的母分支以来改动的一切,不论是否已提交。
未提交只有还没提交的编辑,新文件也算。
最后一次提交只有最后那一次提交。

把它当 pull request 来审查:

  • 把文件标记为看过。 每个文件都有一个已看过的标记(标记为看过——它会折起来,直到再次变动)。看过的文件会折起来,若它的差异变了就会自己再展开。
  • 加注释。 把光标移到某一行并点侧边的对话泡(为这一行加注释)就能为那确切的一行加注释,在文件标头上用为这个文件加注释,或在底部的输入区打字就是为整份变更加注释。在输入区里,⏎ 加上该注释、⌥⏎ 插入新行、⇧⌘⏎ 把一切送回去。草稿注释在你送出之前都可以移除。
  • 退回。 送出按钮显示退回(N)。它把每一则草稿注释用一条消息交给代理——格式像 在 foo.js 第 196 行:改用别的方法——并把任务送回进行中再跑一轮,沿用同一段对话、同一个 worktree 与分支(⇧⌘⏎)。
  • 合入它。 主按钮跟随任务的批准后选择:合并到 分支或创建拉取请求(只有在仓库有远程时才提供)。它的菜单里有另一个选项、压缩合并到 分支、合并到其他分支…,以及保留分支 — 标记为完成。每一项都会打开一个确认,确切说明将会发生什么(见合入),并附一个保留分支选项。
  • 标记为完成——不合并即完成,会先确认分支将被保留。
  • 更多——打开会话、查看转录与丢弃分支…(删除该分支与它的签出;任务以未合并即关闭的状态进入完成,保留它的转录)。
  • 打开终端会跳到这件任务在机器上的会话。

没有产生代码的任务——没有分支、分支相对目标没有任何更改,或没有 worktree 的委派交付——会显示代理的最终报告而不是 git:它的主按钮是标记为完成,旁边是查看转录与退回。

由已经创建拉取请求的会话或房间完成的任务,会提供查看拉取请求 #N与标记为已合并(在 forge 上合并之后)。

在审查中的任务上右键点击可选查看更改、打开会话、重试合入(需要你处理时)、标记为完成、合并到 分支…(在合并确认处打开审查)、退回“进行中”、丢弃分支…与仅移除任务。丢弃任务或将它标记为完成时,会说明有几则从未送到代理的审查注释会随之一起消失。

在完成的任务上右键点击可选阅读转录、在其会话仍存活时的打开会话、有拉取请求时的创建拉取请求,以及移除任务。每张卡片的菜单也是它的 VoiceOver 菜单(VO-Shift-M)与操作列表;VoiceOver 会把卡片读成它的标题与状态。

合入

批准合并就会合入更改,不需要你手动解决任何事:

  • 快速路径。 当分支严格领先它的目标、它的签出没有任何未提交的东西,且目标的签出是干净的,Bromure 会自己合并——在目标被签出的地方做快进,或在它没有在任何地方被签出时直接更新分支。它绝不会合并到位于其他分支上的签出。
  • 由代理合入。 否则就由写下这项更改的代理在它自己的会话里处理——打进它实时的对话,或恢复那段对话:它会提交剩下的东西、rebase 到最新的目标上(解决冲突时保留双方的意图)、运行项目的快速检查并修好它的更改弄坏的东西、把目标快进,然后报告。它绝不碰目标签出中未提交的更改。以拉取请求合入时,则改为推送分支并运行 gh pr create,附上摘要与测试计划。
  • 已验证。 只有在 Bromure 于目标的历史中看到这项更改后,任务才会进入完成。代理报告但 Bromure 无法检查的合入(一台它无法连上的机器)会被记为由代理报告,未验证。
  • 需要你处理。 如果代理报告它卡住了、没有合入就停下,或 20 分钟后仍未完成,任务会带着原因变红;审查窗口会提供打开会话、重试与取消合入。

之后,分支与它的签出会被移除(除非你选择保留),会话会被归档。交给某个会话或房间的任务也以同样方式合入:受分配者会在同一个委派上收到合入请求,并以 deliver 报告。

提示: 你不需要一件任务才能审查代理的成果。每一个有文件夹的会话,其菜单与 ⌘K 中都有审查变更,而聊天中的变更了 N 个文件那一行也会为那个回合打开同一个窗口。见分支与审查。

移除任务

每件任务在光标移上去时都会长出一个 ✕(移除任务),背后有一道确认。对进行中的任务,对话框会提供把一切拆掉的停止并丢弃分支,或让机器上的会话与签出原封不动的仅移除任务;对审查中的任务,则提供丢弃分支或仅移除任务。待办任务的菜单里有移除任务。

存储与 API

任务保存在机器存储区旁边的单一文件中,采原子写入与 ISO-8601 日期:

~/Library/Application Support/BromureAC/tasks.json

整个看板都镜像在应用程序的控制套接字上,供富客户端与脚本使用:

端点用途
GET /tasks列出每一件任务。
POST /tasks创建或更新(upsert)一份任务文档。
POST /tasks/<id>/start启动它(worktree + 代理)。检查会先运行:任务带着设置好的 startingAt 留在原本那一列,然后移到 inProgress——无法启动时则带着设置好的 lastError 留在原列。
POST /tasks/<id>/plan启动规划会话。
POST /tasks/<id>/comment加一则审查注释(text,可选 file 与 line)。
POST /tasks/<id>/send-back交付尚未送出的注释,并把任务送回进行中。
POST /tasks/<id>/land合入它:mode(merge、squash 或 pr),可选 target 与 keepBranch。/merge 与 /open-pr 是别名。
POST /tasks/<id>/retry-landing、/cancel-landing重试卡住的合入,或放弃它。
POST /tasks/<id>/mark-done按现状完成(什么都不合并,保留分支)。
POST /tasks/<id>/mark-merged以已在别处合并的状态完成(在 forge 上已合并的拉取请求)。
POST /tasks/<id>/close-no-merge丢弃:删除分支与它的签出,以未合并即关闭的状态完成。
POST /tasks/<id>/stop停止代理并把任务退回待办清单(保留 worktree)。
POST /tasks/<id>/to-testing、/to-in-progress手动把它移到审查或进行中。
POST /tasks/<id>/destroy停止代理、删除 worktree 与分支、移除任务。
DELETE /tasks/<id>只移除任务。

在幕后,规划与任务的代理透过一个逐会话的看板 MCP 服务器(vsock,主机端)跟看板说话:board_get_task、board_set_plan、board_create_subtasks、board_ready_for_review 与 board_report_landing 就是阶段被归档、一件完工的任务自报,以及合入报告 merged、pr_opened 或 blocked 的方式——不轮询、不刮取。这些工具会为每一个受支持的代理自动接好:Claude Code 载入一份逐分支的 MCP 配置、Codex 取得逐次调用的 mcp_servers 覆盖,而 Grok 读取写进该会话签出中的一份项目范围 .grok/settings.json(并将它自差异中排除)。