關於這個 mod
dispatch-board
同時開好幾個 Claude Code session 分工時用的派工看板。你寫一份 mission 檔,列出有哪些節點、各由哪個 session 負責、怎樣算做完;看板在終端機顯示誰完成、誰在跑、誰在等你,狀態一轉換就跳 toast。
⧉ shop-redesign 1/3 · 1 需要你 · 4s 前
/dispatch 打開側邊面板:
mission 目錄 ~/.claude/missions
需要你(1)
shop-redesign ▓▓▓░░░░░░░ 1/3 商店改版
✓ api 後端 API · 閒置 shop-api
⏸ web 前端頁面 · 等你 3m · blocked shop-web
○ e2e 端對端測試 · 等依賴 web · 不在名冊 shop-e2e
上次更新:2s 前
[ 立即更新 ][ 關閉 ]
用法
- 建立
~/.claude/missions/,放一份 mission 檔(*.json,格式見下)。 - 照 mission 檔裡寫的名字開 session,例如
claude --bg --name shop-api(名字要和claude agents列出的一樣,不分大小寫)。 - 在任何一個 session 打
/dispatch開面板。
| 指令 | 作用 |
|---|---|
| /dispatch | 開關面板 |
| /dispatch off | 本 session 停止讀 mission、停止執行完成條件;再打 /dispatch 恢復 |
| /dispatch demo | 用假資料試看(不讀目錄、不執行任何指令);再打一次結束 |
也可以用環境變數 DISPATCH_BOARD_DEMO=1 啟動 demo 模式,方便錄影。
mission 檔
一個 JSON 檔一個 mission,放在 mission 目錄的第一層(子目錄不讀,所以做完的檔可以搬到 done/)。
{
"mission_id": "shop-redesign",
"title": "商店改版",
"nodes": [
{
"id": "api",
"title": "後端 API",
"session": "shop-api",
"done": "git -C ~/code/shop log --oneline origin/feature/api | grep -q '\\[api-done\\]'"
},
{
"id": "web",
"title": "前端頁面",
"session": "shop-web",
"done": "test -f ~/code/shop/web/dist/index.html"
},
{
"id": "e2e",
"title": "端對端測試",
"session": "shop-e2e",
"done": "grep -q 'ALL PASSED' ~/code/shop/e2e-report.txt",
"depends_on": ["api", "web"]
}
]
}
| 欄位 | 必填 | 說明 |
|---|---|---|
| mission_id | 否 | 英數、_ . -;省略時用檔名 |
| title | 否 | 顯示用 |
| nodes[].id | 是 | 英數、_ . -,同一份 mission 內不重複 |
| nodes[].title | 否 | 顯示用 |
| nodes[].session | 否 | 負責的 session 名稱;省略=不對名冊 |
| nodes[].done | 是 | 完成條件:一行 shell 指令,退出碼 0=完成 |
| nodes[].depends_on | 否 | 依賴的節點 id |
examples/shop-redesign.json 是同一份範例,可以複製過去改。
完成條件怎麼求值
- 用
/bin/sh -c執行,工作目錄是家目錄,每條 5 秒逾時,最多同時跑 4 條。 - 退出碼 0=完成;其他退出碼=還沒完成。
- 逾時、指令跑不起來(shell 回 126/127)=無法判定,顯示 ✗ 並歸到「需要你」,不會畫成「還在跑」。壞掉的條件如果被當成還沒完成,你會一直等下去。
- 面板開著時每 5 秒求值一次,關著時每 30 秒一次。目錄裡沒有 mission 檔時只列目錄,不執行任何指令、不讀名冊。
- 完成條件不會被快取:條件之後又不成立(例如分支被刪),節點會回到未完成。
建議用「工作產出」當完成條件(commit 訊息、檔案存在、測試報告),而不是 session 自己說做完了。
session 狀態
來自 claude agents --json:
| 顯示 | 意思 |
|---|---|
| 工作中/閒置/blocked | session 在名冊上;blocked 代表它在等你回覆 |
| 已結束 | 看板啟動後看過它,現在名冊上沒有了 |
| 不在名冊 | 名冊上沒有,也沒看過(還沒開,或在看板啟動前就結束了) |
| 名冊不可用 | claude agents --json 跑不起來或輸出看不懂;不會顯示成已結束 |
面板分組
- 需要你:有 session blocked、有條件無法判定、或 session 已結束但條件沒達成
- 跑著:其餘還沒完成的
- 做完待收斂:所有節點都完成。附一顆按鈕,把「把 mission 檔搬到
done/」的指令複製到剪貼簿;mod 自己不搬檔
狀態轉換時跳 toast:節點完成、條件變成無法判定、session 開始等你、session 結束但沒完成、整份 mission 完成、新出現讀不了的 mission 檔。看板啟動後的第一份快照只作基準,不跳 toast。
安全邊界
mission 檔裡的完成條件是 shell 指令,看板會以你的身分執行它。 所以 mission 檔只從使用者層級的目錄讀,絕不讀專案目錄或 repo 裡的檔案,否則 clone 一個陌生 repo 就等於執行對方寫的指令。具體規則:
- 預設目錄
~/.claude/missions/。可以在/plugin的設定改missions_dir(~/…或絕對路徑),但只認~/.claude/settings.json裡的值;專案的.claude/settings.json、settings.local.json或--settings給的值一律不採用。 - 目錄解析符號連結後必須在家目錄底下(不能是家目錄本身),不能在本 session 的專案目錄內,也不能在任何 git 工作樹內(從該目錄往上到家目錄之間任一層有
.git就拒讀)。 - 個別 mission 檔經符號連結指到目錄外的,拒讀並列在「讀不了的 mission 檔」。
- 讀不到家目錄(
HOME未設定)就整個停用。 - 任何一條不符合都直接拒讀並在 band 顯示原因,不會退而求其次改讀別處。
除此之外 mod 是唯讀的:不寫檔、不送 prompt、不碰其他 session。
安裝前看看它會做什麼
claude plugin validate ./plugins/dispatch-board
結果(v0.1.0):
hooks: session.start, command.run{command=dispatch}, ui.close,
ui.render{component=AbovePrompt}, ui.render{component=Pane, requestId=dispatch-board}
calls: $.clock.every, $.clock.now, $.command.register, $.env.get,
$.fs.exists, $.fs.list, $.fs.read, $.fs.stat,
$.process.run, $.session.cwd, $.session.root, $.settings.read,
$.state.get, $.state.set, $.ui.close, $.ui.copy, $.ui.open,
$.ui.resolve, $.ui.toast
env reads: DISPATCH_BOARD_DEMO, HOME
env writes: nothing
$.process.run:執行 mission 檔的完成條件(/bin/sh -c),以及claude agents --json$.fs.*:只讀 mission 目錄與檢查安全邊界(解析路徑、找.git);沒有寫檔$.settings.read:只讀使用者層級設定,確認自訂的missions_dir從哪裡來- 不連網、不呼叫模型
限制
- 只在終端機與 Claude Desktop 的 Code 分頁畫;
claude -p不輪詢。 - 每個開著的互動 session 各自輪詢;session 開得多,完成條件就會被多個 session 重複執行,條件請保持便宜、沒有副作用。
- 完成條件依賴
/bin/sh,Windows 未測試。
開發
claude --plugin-dir ./plugins/dispatch-board # 單次載入
claude plugin test ./plugins/dispatch-board # 跑測試
English
dispatch-board is a dispatch board for running several Claude Code sessions in parallel. You write a mission file (~/.claude/missions/*.json) listing nodes, the session responsible for each, and a completion check (a shell command; exit 0 means done). The board shows a one-line band above the prompt and a /dispatch side pane grouped into needs you / running / done, ready to wrap up, and toasts on state transitions. Session state comes from claude agents --json; an unreadable roster is shown as "roster unavailable", never as "ended". A check that times out (5 s) or cannot run is shown as undetermined and grouped under needs you, never as still running. /dispatch demo shows fake data without reading anything or running any command.
Security: completion checks are executed as you, so mission files are read only from a user-level directory: under your home directory, outside the session's project, outside any git work tree, with symlinks resolved. A custom missions_dir is honoured only from ~/.claude/settings.json. Anything else is refused with the reason shown. The mod writes no files, sends no prompts, makes no network requests and calls no model.
Showcase: 【實用工具】Claude Mod 真的是太好用了! 因為 Claude Mod 可以解決「派工 skill」的一個大痛點!
之前的「派工 skill」可以在一個「主對話」規劃任務後, 派出多個「子對話」去工作,最後再回報結果整合回「主對話」。
但是會遇到需要頻繁到主畫面查看「子對話」進度 甚至有指令被 guard 擋住,或是有問題要回答時 還要切進「子對話」處理。 ❗這樣的操作其實認知負荷很重,常常切進去要回想才能繼續回答
所以我用 Claude Mod 做了一個「派工儀表板」dispatch mod ❇️ 可以在主對話看到所有子對話的運行狀況 ❇️ 所以可以不用切來切去就可以知道所有狀況了~ 而且是「依照派工任務分類」的(Claude Code 目前無法自動分類)!!!
另外一件事就是常常有一些收尾動作容易被 guard 擋下 比如說 git push, git merge 等操作,也要切進子任務下指令。 所以我也做了一個 handoff mod ❇️ 可以直接在主對話審核通過後,直接背景執行相關指令 ❇️
現在可以專心在「主對話」討論策略和規劃之後的實作計劃了~ Dispatch / Handoff mods; repo in author reply



