一個 project 一個 Workspace
拿來對應 repo、任務或 investigation。每個 workspace 擁有自己的 tabs 與 panes。
把它想成「更懂 AI coding agents 的 tmux」:保留真正的 terminal、支援 detach / reattach,同時用 workspace、tab、pane 與 agent 狀態幫你管理多個開發工作。
Herdr 是 terminal workspace manager,也是 agent-aware multiplexer。背景 server 擁有真正的 terminal process,所以你關掉 terminal 或 SSH 斷線後,pane 裡的 agent 仍能繼續跑。
拿來對應 repo、任務或 investigation。每個 workspace 擁有自己的 tabs 與 panes。
Pane 就是真正的 terminal,可左右或上下分割;Tab 則把不同 layout 分開,例如 agents、logs、server。
Herdr 能辨識支援的 coding agents,sidebar 會顯示 working、blocked、done、idle,方便知道哪個工作需要你。
兩者核心模型很接近,但 Herdr 把「管理多個 AI agents」當成一級需求。
| Herdr | tmux | |
|---|---|---|
| Process persistence | ✅ detach 後繼續執行 | ✅ detach 後繼續執行 |
| Pane / split | ✅ 支援,且 mouse-native | ✅ 成熟、鍵盤導向 |
| AI Agent 狀態 | ✅ working / blocked / done / idle | ❌ 不理解 agent lifecycle |
| Workspace 概念 | ✅ project-level container | 主要以 session / window 組織 |
| 滑鼠操作 | ✅ 點選、拖曳、右鍵、resize 都是一級操作 | 可開 mouse mode,但不是核心 UX |
| Automation | ✅ CLI + local socket API,可讓 agent 控制 Herdr | ✅ CLI / scripting 很成熟 |
第一次用其實不用先背快捷鍵,滑鼠就能完成大部分操作。
Herdr 會啟動或接回預設 background session;沒有 workspace 時會自動建立一個。
例如 Claude Code 或 Codex。Herdr 會在 sidebar 顯示偵測到的 agent 與狀態。
按 prefix + q 或直接關 terminal。再次執行 herdr 就會 reattach;真的要全部停掉才用 herdr server stop。
預設 prefix 是 Ctrl+B。做法是先按 Ctrl+B、放開,再按後面的 action key。
Herdr 的背景 server 和 client 是分離的,所以「關畫面」和「真的停止工作」是兩件事。
Herdr 的行為可用 TOML 自訂。這裡從存放路徑、Dracula theme、Sidebar 格式,到 Agent 狀態通知與快捷鍵,附可直接複製的完整範例。
Linux / macOS:~/.config/herdr/config.toml
Windows:%APPDATA%\herdr\config.toml
herdr --default-config 可以印出完整帶註解的預設設定,再依自己的需求修改。
herdr server reload-config。大部分 UI 設定可立即套用,僅部分啟動時設定需要重新啟動。
mkdir -p ~/.config/herdr # 已有 config 時先備份,避免覆蓋現有設定 if [ -f ~/.config/herdr/config.toml ]; then cp ~/.config/herdr/config.toml ~/.config/herdr/config.toml.bak fi # 想從官方預設值重新開始,才執行下一行 herdr --default-config > ~/.config/herdr/config.toml # 編輯後重載 herdr server reload-config
只有已存在 config.toml 時才會備份。注意:> 會覆蓋原始檔,請先備份。
這個版本特別設計給同時跑 Claude Code / Codex 等多個 Agent 的情境:Sidebar 不顯示冗餘的 Local、保留 Tab 名稱與 Agent 名稱,若有動態摘要就多一列 cyan 文字。
# ~/.config/herdr/config.toml
# Dracula + 緊湊 Sidebar 範例
onboarding = false
[ui]
status_indicators = "symbols"
pane_borders = "always"
pane_outer_borders = true
pane_scrollbars = false
pane_gaps = true
show_agent_labels_on_pane_borders = true
sidebar_width = 30
sidebar_min_width = 20
sidebar_max_width = 50
tab_bar_position = "top"
copy_on_select = true
[ui.sidebar.agents]
row_gap = 0
rows = [
["state_icon", { token = "tab", fg = "#f8f8f2", bold = true, dim = false }, { token = "machine", rules = [{ equals = "Local", hide = true }] }],
["agent"],
[{ token = "$summary", fg = "#8be9fd", dim = true }]
]
[ui.sidebar.spaces]
row_gap = 0
rows = [
["state_icon", "workspace"],
["branch", "git_status"]
]
[ui.toast]
delivery = "terminal"
delay_seconds = 2
[ui.sound]
enabled = false
[theme]
name = "dracula"
auto_switch = false
[theme.custom]
accent = "#bd93f9"
sidebar_bg = "#282a36"
active_row_bg = "#44475a"
selection_bg = "#44475a"
[keys]
prefix = "ctrl+b"
new_tab = "prefix+c"
goto = "prefix+g"
focus_pane_left = "prefix+h"
| 設定 | 作用與建議 |
|---|---|
| ui.status_indicators | symbols 用不同形狀區分 working / blocked / done;dots 是精簡圓點。 |
| ui.pane_borders | auto 只在分割時顯示、always 單一 Pane 也畫框、off 隱藏。 |
| ui.pane_outer_borders | 決定是否畫最外框;如果用 always 想讓單一 Pane 也有邊框,就要設 true。 |
| ui.pane_scrollbars / pane_gaps | 關閉 scrollbar 可多一欄寬度;gaps 控制分割 pane 的間距。 |
| ui.show_agent_labels_on_pane_borders | 當 Pane 沒有手動標籤時,分割 Pane 邊框可顯示 Agent 名稱。 |
| ui.sidebar_width / min / max | 調整 Sidebar 欄寬;空間較小可改成 24 / 18 / 36。 |
| ui.sidebar.agents.rows | 控制 Agent 清單每行有哪些 token,順序就是渲染順序。 |
| ui.sidebar.spaces.rows | 控制 Workspace 區塊顯示名稱、branch 和 Git 狀態。 |
| ui.toast.delivery | off、herdr、terminal 或 system;terminal 取決於外層終端機的通知支援。 |
| ui.sound.enabled | false 可完全關掉 Agent 狀態變更音效。 |
| theme.name / theme.custom | 選擇內建 Dracula 主題,再選擇性覆蓋 accent、sidebar 背景、選取列背景。 |
| keys.prefix | 預設 ctrl+b。若和 tmux 衝突,可改為其他按鍵,但需注意終端機能否送出組合鍵。 |
每一個陣列就是一行;token 不存在時不會硬畫空字串。可以用 fg、bold、dim 指定單一 token 的樣式,或用 rules 判斷內容並隱藏。例如:
state_icon:狀態符號workspace:專案空間tab:分頁名稱machine:主機標籤agent:偵測到的 Agentstate_text:狀態文字branch / git_status:Git 資訊
$summary 不會自動出現$summary 是自訂 metadata token。必須由 script / integration 主動 report 值才有內容;它不是內建的 description。
Pane 框線上顯示 Agent 標籤,也不代表 Sidebar 就有摘要。
herdr pane report-metadata <pane_id> \ --source my-agent-hook \ --token summary="reviewing authentication"
實際使用時把 <pane_id> 替換成有效 Pane ID;內容會顯示在對應 Agent 的 $summary 那一行。
如果只想讓 Claude 顯示較多細節,而其他 Agent 維持預設,可以加以下段落。這份設定是取代 Claude 的 rows,不是附加在一般 rows 後面。
[ui.sidebar.agents.rows_by_agent]
claude = [
["state_icon", "agent", "state_text"],
[{ token = "$summary", fg = "#8be9fd" }],
["workspace", "tab"]
]
這個 override 使用 canonical ID claude;Codex 則是 codex。如果你的設定檔中已經有 [ui.sidebar.agents.rows_by_agent],把內容合併進同一個 table,避免 TOML 重複宣告。
這三段是獨立片段,不要把多個 [ui] 或 [ui.toast] table 原封不動重複貼進同一份 TOML。請把 key 加到已存在的區塊即可。
# 把以下 key 合併到現有 [ui] 區塊
tab_bar_right = [
{ type = "zoom" },
{ type = "hostname" },
{ type = "datetime", format = "%H:%M" }
]
tab_bar_right_separator = " · "
window_title = "{hostname}: {workspace}"
# 加到現有 [ui.toast] 內:
# delivery = "herdr"
# delay_seconds = 1
# 加到現有 [ui.sound] 內:
# enabled = true
這通常不是排版錯誤:$summary 需要 metadata reporter 寫入資料。先確認 plugin / script 有送出 summary token,再看 rows 裡是否包含 $summary。
show_agent_labels_on_pane_borders 影響的是 Pane border 標籤;Sidebar 要由 rows 決定顯示欄位。兩者互不等價。
先執行 herdr server reload-config,或從 Herdr 選單選 reload config。部分 startup-only 選項需要重開;如果值無效,Herdr 會顯示警告並採用安全預設值。
Theme、Sidebar、複製等 presentation 由本機 client 設定決定;Pane defaults、Worktrees、Integrations、Custom commands 由遠端 server 的設定決定。
先執行 herdr --default-config 查看本機版本的完整預設;官方 Config reference ↗ 可查所有設定的型別、預設值和可用值。
prefix + q,agent 並沒有被停掉。這就是 Herdr 適合長時間跑 Claude Code / Codex、多 project 並行工作的地方。