DAY 233 · 2026-08-20

關掉終端機,agent 還在跑

SLIDES · 7
Day 233 關掉終端機,agent 還在跑 — 投影片 1Day 233 關掉終端機,agent 還在跑 — 投影片 2Day 233 關掉終端機,agent 還在跑 — 投影片 3Day 233 關掉終端機,agent 還在跑 — 投影片 4Day 233 關掉終端機,agent 還在跑 — 投影片 5Day 233 關掉終端機,agent 還在跑 — 投影片 6Day 233 關掉終端機,agent 還在跑 — 投影片 7
1 / 7

我平常會同時開好幾個 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 裡面直接跑 claudecodexopencode 這些指令就好,不用包一層 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/


來源:

延伸閱讀
看完整 242 篇 →