關掉終端機,agent 還在跑







我平常會同時開好幾個 Claude Code 和 Codex 的 session。最麻煩的不是它們跑得慢,是我不知道哪一個已經停下來在等我點同意——只能一個視窗一個視窗點過去看。
herdr 這個開源專案的 slogan 寫著「the runtime your coding agents live on」,直接把自己定位成 coding agent 的常駐 runtime。它其實是兩個東西:一個不會因為你關掉終端機就跟著停掉的背景 server,加上一套專門給 agent 用的終端機多工器。終端機多工器(terminal multiplexer)就是把一個終端機切成好幾格來用的工具,tmux 是最有名的那個。
我跑了幾天。這篇分享:上手要花的力氣、真正花我時間適應的地方,還有一個我裝之前沒想到的用法——你可以直接在 session 裡叫它多開兩格去做事。
上手就這三行
curl -fsSL https://herdr.dev/install.sh | sh # 或 brew install herdr
herdr # 開 server,你的工作從此住在這裡面
# ctrl+b 之後按 q 離開,或直接把 terminal 關掉
herdr # 從任何一個 terminal 再接回來
pane 裡面直接跑 claude、codex、opencode 這些指令就好,不用包一層 wrapper,herdr 自己會認出跑在前景的是哪一隻 agent。
Rust 寫的單一 binary,沒有 Electron,Apache-2.0 授權。
有點麻煩的是快捷鍵要重記一次
裝完最花我時間的不是設定,是手指。
herdr 跟 tmux 一樣走 prefix 機制:預設的鍵盤操作都要先按 ctrl+b,放開,再按第二個鍵。這個設計是有理由的——終端機裡面能按的組合早就被佔光了,前面多一個 prefix,herdr 的鍵才不會跟你正在跑的程式或系統本身撞在一起。文件也留了 prefix-free 的設定方式,能把常用動作綁成不用 prefix 的直接組合鍵。
代價是常用的那幾組要重新練到不用想:
| 做什麼 | 按什麼 |
|---|---|
| 往右切一格 | prefix+v |
| 往下切一格 | prefix+minus |
| 開新分頁 | prefix+c |
| 離開(server 繼續跑) | prefix+q |
| 忘記了,全部叫出來看 | prefix+? |
用過 tmux 的人 prefix 這層是熟的,要重記的只有 prefix 之後的第二個鍵。沒用過的,會有一段時間一直按錯。滑鼠點選跟拖曳也照樣能用,不想背快捷鍵的話,全程用滑鼠操作也是一種用法。
關掉終端機不會死,但重開機沒有想像中那麼神
這裡跟我原本想的不一樣。「不會斷」其實要分兩種狀況看:
| 發生什麼 | 回得來的 | 回不來的 |
|---|---|---|
| 關掉終端機、斷網、SSH 掉線 | 全部——那些 process 從頭到尾沒有停過 | 沒有 |
| server 或機器重開 | 版面配置、每個 pane 的工作目錄、agent 對話(靠 session restore) | 跑到一半的 shell、server、測試 |
官方文件講得很直白:snapshot restore 不保留正在跑的 shell、server、測試或任何其他 process。如果那個 pane 沒有更強的還原方式可以接,herdr 就用它原本的目錄幫你開一個新的 shell。
重開之後想把 agent 的對話接回去,靠的是另一條路:native agent session restore——herdr 記下 agent 自己回報的 session id,重開時叫它 resume。畫面內容則要另外打開 pane history replay,這個預設是關的,為的是安全。
所以精確的說法是:關終端機、斷線這一類,herdr 完全免疫;重開機這一類,它救回來的是工作區的骨架和對話,不是跑到一半的 process。
blocked 是怎麼判斷的,這裡比我預期的嚴謹
每個 pane 會標成 working、blocked、idle 三種狀態之一,blocked 就是「這隻在等人回答」。它標得準不準,等於決定了這個工具對我有沒有用,所以我去看了它是怎麼偵測的。
它有兩層:
- Lifecycle hooks:agent 那邊裝好 hook 的話,狀態由 agent 自己回報,這層說了算——不過 Claude Code 目前在官方支援表上標的是 screen manifest,所以我自己的 pane 其實都吃第二層
- Screen manifest:沒有 hook 就退回這層——herdr 認出前景的 process,讀 pane 最底下那塊畫面的即時快照,拿去比對 TOML 寫的偵測規則
關鍵在於 blocked 的判定是刻意從嚴的:只有當那塊畫面快照比對到「已知的核准、提問或權限畫面」,才會標成 blocked。新出現、還沒被寫進規則的提問畫面,會先被當成 idle。
這個取捨我認同——寧可漏標,也不要亂標。一個會亂亮的燈,看兩次就沒人信了。但漏標對我的代價其實不低,因為我要的就是「誰在等我」這件事本身。偵測規則可以自己改,寫一份放在 ~/.config/herdr/agent-detection/<agent>.toml 蓋過原本的,所以真的漏了也不是沒得救。
自動偵測支援的 agent 列了一長串:Claude Code、Codex、Cursor Agent CLI、Amp、OpenCode、Grok CLI、GitHub Copilot CLI、Droid、Qwen Code 等等;Gemini CLI 和 Cline 則被標成測試較少。
它打破第四面牆
這是我裝之前沒想到的,也是它跟一般終端機多工器真正不一樣的地方。
一般來說,agent 是住在窗格裡面的房客,窗格怎麼開是外面的人的事。herdr 不是這樣。你在 session 裡直接跟 agent 說「spin up 2 panes 去做某某事」,它就真的另外開兩個窗格出來,自己把任務丟進去。它看得到自己住的這棟房子,手也伸得進去。
底下靠的是 herdr 開給 agent 的 CLI 和 socket API:
herdr agent wait w1:p1 --until blocked # 等到那隻 agent 停下來在等人
herdr pane run w1:p2 "npm test"
herdr pane read w1:p1 --source recent --lines 50
agent.prompt 送指令的時候可以帶等待條件,例如 {"wait": {"until": "blocked", "timeout_ms": 5000}};API 回報的狀態一共五種:idle、working、blocked、done、unknown——比 pane 上顯示的那三種多了 done 和 unknown。
所以一隻 agent 可以自己切一個新的 pane 出來、把任務丟進去,然後停在那裡等對方變成 blocked 或 done 再往下做。原本要人坐在中間傳話的那段,變成 API。
再往下一層是 plugin。既然狀態和窗格都能用程式操作,那「哪一隻停下來在等你決定」也可以交給 plugin 接手——它幫你把下一個要你做決定的 session 準備好,而不是等你自己掃過去發現。
它墊在 Claude Code 下面那一層
herdr 不改你手上的 agent,agent 就照原本的樣子跑在 pane 裡。它管的是「agent 跑在哪裡、還活著沒、現在是什麼狀態」。
所以它不是拿來取代 Claude Code 或 Codex 的選項,你不用在它們之間挑一個。你原本用什麼就繼續用什麼,只是從此跑在一個關掉終端機也不會停的地方。
跟我原本的做法比
原本:好幾個 terminal 分頁,每個裡面一隻 agent,哪個在做什麼靠我自己記;要知道誰在等我,只能一個個點過去看。
現在:pane 上直接標 working / blocked / idle,一眼掃過去就知道哪一隻停住了;process 跑在背景 server 上,terminal 關掉、SSH 掉線都不影響。代價就是前面講的,快捷鍵得重記一次。
遠端這條我還沒試。我兩台 Mac 本來就在同一個 Tailscale 網段,理論上從另一台 SSH 進來再打一次 herdr,接回的就是同一個 session——README 寫的是「從任何 terminal 或 SSH 連線接回來」。文件有一頁專門講 remote(herdr.dev/docs/persistence-remote/):除了上面這條 SSH 進去再打一次的路,還可以直接 herdr --remote ssh://you@server,讓本機當 thin client;只是 Tailscale 沒被點名,這個要我自己試過才敢講。
這個專案現在多成熟
- 30,793 顆星(今天查的)、2,197 個 fork
- repo 是今年 3 月 27 日開的,五個月不到
- 最新版 v0.8.2 今天凌晨發的;過去兩週有 97 個 commit
- open issue 177 個(另外還有 33 個 PR 開著)
- plugin marketplace 是自動的:公開 repo 裡放一份
herdr-plugin.toml,再標上herdr-plugin這個 topic,就會被收進去,今天查有 705 個 plugin、來自 694 個 repo
star 數和 commit 的頻率是真的,但版本號還在 0.x,issue 也還開著快一百八十個。所以我沒有一次把所有專案都搬上去。
我想要的其實不是多一個終端機工具,是打開電腦的時候,有人告訴我哪一隻在等我。
最近開始做免費的一對一諮詢,幫你把 AI 接進自己的工作流——有需要的話可以約:https://www.dawsonwang.com/
來源:
- herdr GitHub repo:https://github.com/herdrdev/herdr
- 安裝與快速上手:https://herdr.dev/docs/install/ / https://herdr.dev/docs/quick-start/
- agent 偵測與 blocked 判定:https://herdr.dev/docs/agents/
- session 還原範圍:https://herdr.dev/docs/session-state/
- socket API:https://herdr.dev/docs/socket-api/
- plugin marketplace:https://herdr.dev/plugins/