編碼任務

編碼看板把一件寫下來的任務變成已合併的程式碼,儀式感要多少就多少:寫下你需要的,然後選先規劃——和一個互動式規劃代理程式一起把它拆成可審查的階段——或直接啟動,看著代理程式在它自己的 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(並將它自差異中排除)。