Herdr:给 AI Agent 用的终端复用器,后台服务器 + 状态检测 + Agent 间 CLI 通信
开 4 个终端 Tab:第一个跑 Claude Code 重构 API,第二个跑 Codex 写测试,第三个跑 Cursor 改前端,第四个跑 Kimi 做代码审查。每个 Agent 都在闷头干活,你不知道谁写完了,谁卡住了,谁在等你确认。
切到第一个 Tab,Claude Code 已经写完,等你 review;切到第二个,Codex 还在跑;切到第三个,Cursor 弹了权限确认等你点 Allow;切到第四个,Kimi 不知道什么时候结束了,输出被前面的日志淹没。
一天下来不是在写代码,是在打地鼠——Agent 轮流举手,你挨个处理。
更麻烦的是合上笔记本去吃个饭,回来发现所有 Agent 都因为终端断开而停了,上下文丢了,得从头再来。
Agent 已经能写代码了,但管理 Agent 的方式还停留在开多个终端 Tab 的阶段。
Herdr 今年 3 月开源,Rust 写的一个二进制文件,不用 Electron。它不是又一个 AI Agent,而是一个终端工作空间管理器——专门为 AI 编程 Agent 设计的 tmux。Agent 在里面跑,你随时断开、随时重连,哪个 Agent 卡住了 sidebar 一眼看到,Agent 之间还能互相通信。
下面从这个项目出发,看怎么给 AI Agent 做一个真正的运行时。
1. 为什么 Agent 需要专属的终端复用器
已经有 tmux 了,为什么还需要一个专门的终端复用器?理由很具体:
tmux 不知道谁是 Agent。在 tmux 眼里所有 pane 都一样,都是一个终端进程。它不知道哪个 pane 跑的是 Claude Code,哪个是普通 shell,哪个是测试脚本。你没法问 tmux「哪个 Agent 卡住了」。
tmux 没有 Agent 状态。tmux 只能告诉你一个 pane 里有没有输出。但 Agent 的状态不是「有没有输出」这么简单:它可能是正在工作、等待确认、已经写完、遇到错误。这些状态 tmux 识别不了。
tmux 不支持 Agent 协作。想让 Claude Code 写完代码后让 Codex 做 review,在 tmux 里你得手动复制粘贴上下文、手动切 pane、手动触发。tmux 的 pane 之间是隔离的,不能互相通信。
tmux 断开后 Agent 还在,但你不知道它们的状态。tmux 确实能保持进程运行,但重连之后面对一堆终端输出,你得一个个 pane 检查,才知道谁完了、谁卡了。
这些问题 tmux 解决不了,因为它设计的时候根本没有 AI Agent 这个概念。Herdr 解决的正是这个问题:它是一个知道 Agent 是什么的终端复用器。
落到实际项目上:一个后端项目、一个前端项目、一个基础设施项目,每个项目里都有 Agent 在跑。用 tmux,你得自己记住哪个 pane 是哪个 Agent,自己检查状态,自己协调;用 Herdr,每个项目一个 Workspace,每个 Agent 的 state 自动显示在 sidebar 里,卡住的(blocked)直接标红,不用一个个 pane 翻。
2. 核心设计:后台服务器 + Agent 状态检测
Herdr 最有意思的设计是客户端-服务器分离加 Agent 状态自动检测,它解决两个矛盾:
- 怎么让 Agent 在你断开后继续跑,并且重连后马上知道状态?
- 怎么让 Agent 的「卡住了」变得可见?
后台服务器:Agent 永不停机
架构分两层:
Server(后台运行) ←→ Client(你的终端 UI)
↓
管理所有 Pane、Agent、进程
Server 是一个后台进程,管理所有的 workspace、tab、pane 和 Agent;Client 是你连接的终端 UI。
打开终端输入 herdr,Client 连上 Server。合上笔记本,Client 断开,Server 继续运行,Agent 继续干活。重新打开终端再输入 herdr,Client 重新连上 Server,所有 Agent 的状态原样恢复。
# 启动 Herdr(自动连接或创建默认 session)
herdr
# 断开客户端(Agent 继续运行)
# 按 ctrl+b q
# 重新连接
herdr
# 查看所有 session
herdr session list
# 连接指定 session
herdr session attach work
herdr session attach side-project
# 结束 session,停止所有 Agent
herdr server stop
这个设计带来三件事:
- Agent 永不停机:断开、断网、关机,Agent 在 Server 里继续跑
- 状态保持:重连后所有 pane 的输出、Agent 的状态原样恢复
- 多设备接入:可以从笔记本连上去看看,再从台式机连上去操作
Agent 状态检测:一眼看到谁卡了
在 Herdr 里每个 Agent 都有明确的状态:
| 状态 | 含义 |
|---|---|
working | Agent 正在运行 |
blocked | Agent 需要你输入或确认 |
done | Agent 完成了,你还没看过 |
idle | Agent 空闲,等待指令 |
unknown | 无法确定状态 |
检测方式不是简单看「有没有输出」,而是通过屏幕内容分析(Screen Detection):
- 前台进程检测:看 pane 里跑的是什么进程(claude、codex、cursor 等)
- 屏幕 Manifest 匹配:读取 pane 底部的屏幕内容,匹配已知 Agent 的 UI 模式
- 状态推断:根据匹配结果,判断 Agent 是 working、blocked 还是 idle
# 列出所有 Agent 及其状态
herdr agent list
# 查看某个 Agent 的详细信息
herdr agent get claude-code
# 读取 Agent 的屏幕输出
herdr agent read claude-code --source recent-unwrapped --lines 120
比如 Claude Code 在等你确认权限时,屏幕上会出现 Allow? (y/n) 这样的提示,Herdr 的 manifest 能识别这个模式,把状态设为 blocked。
好处是:不用一个个 pane 翻,sidebar 直接显示所有 Agent 状态,blocked 的标红;阻塞不会被漏掉;Agent 做了什么输出都在,可以随时查看。
在团队场景里,每个人一个 named session,成员可以通过 herdr session attach 连上去查看 Agent 状态,谁卡了谁完了一目了然。blocked 状态还可以触发通知,Agent 等你确认时通过 Slack、飞书、钉钉收到一条消息,不用一直盯着终端。
3. Agent 协作:让 Agent 互相通信
第二个核心设计是 Agent 间的 CLI 通信,解决的是「怎么让多个 Agent 协作,而不是各自为战」。
传统做法是人工中转:Claude Code 写完代码,你复制 diff,粘贴到 Codex 里让它 review。Herdr 的解法是让 Agent 通过 CLI 直接操作其他 Agent。
Agent 的 CLI API
每个 Agent 在 Herdr 里都可以通过 herdr CLI 操作其他 Agent:
# 在另一个 pane 里启动一个 Agent
herdr agent start reviewer --kind codex --pane w1:p2
# 给另一个 Agent 发送指令
herdr agent prompt reviewer "Review the current diff and report findings." --wait --timeout 120000
# 等待另一个 Agent 完成
herdr agent wait reviewer --until idle --timeout 120000
# 读取另一个 Agent 的输出
herdr agent read reviewer --source recent-unwrapped --lines 120
# 给另一个 Agent 发送按键(比如 Esc 取消)
herdr agent send-keys reviewer esc
也就是说,一个 Agent 可以指挥另一个 Agent 干活。举例:
- 你在 Claude Code 里说:「帮我重构这个模块,然后让 Codex 做 review」
- Claude Code 通过
herdr agent start启动一个 Codex Agent - Claude Code 通过
herdr agent prompt让 Codex review 它的代码 - Claude Code 通过
herdr agent read读取 Codex 的 review 结果 - Claude Code 根据 review 结果自动修改代码
整个过程不需要手动复制粘贴,不需要切换 pane,Agent 自己协调:
# Claude Code 在 pane w1:p1 里,它想让 Codex 在 pane w1:p2 里做 review
# 1. 创建新 pane
herdr pane split --current --direction right --cwd "$PWD" --no-focus
# 2. 在新 pane 里启动 Codex
herdr agent start reviewer --kind codex --pane w1:p2
# 3. 发送 review 任务
herdr agent prompt reviewer "Review the git diff and report actionable findings." --wait
# 4. 读取结果
herdr agent read reviewer --source recent-unwrapped --lines 120
带来的变化是:Agent 可以编排(启动、指挥、读取其他 Agent);上下文不丢失(通过 Herdr 的 API 通信);复杂流程可以自动化,比如编码 → review → 测试 → 修复。
典型的可编排流程:
- 编码 + Review:Claude Code 写代码 → Codex 做 review → Claude Code 根据 review 修改
- 编码 + 测试:Claude Code 写代码 → Kimi 写测试 → 运行测试 → 失败自动修复
- 调研 + 实现:Kimi 调研方案 → Claude Code 根据调研结果实现
你只需要告诉第一个 Agent 你的意图,它会自动编排后面的流程。
4. Workspace 模型:项目级别的 Agent 管理
第三个核心设计是 Workspace > Tab > Pane > Agent 的层级模型,解决「怎么在多个项目之间管理不同的 Agent 集合」。
单个项目一个终端就够,但现实中通常同时做后端、前端、基础设施、文档等多个项目,每个项目都有自己的一组 Agent。Herdr 用 Workspace 隔离来解决。
Workspace 是什么
Workspace 是顶层容器,每个项目一个。Workspace 里可以有多个 Tab(不同的视图布局),Tab 里可以有多个 Pane(终端),Pane 里跑着 Agent。
# 列出所有 Workspace
herdr workspace list
# 创建新 Workspace
herdr workspace create
# 切换 Workspace(通过导航模式)
# 按 ctrl+b w
每个 Workspace 的 sidebar 会自动汇总里面所有 Agent 的状态,一眼就能看到这个项目的 Agent 都怎么样了。
Tab 是视图布局
Tab 是 Workspace 内的布局分隔。可以用一个 Tab 跑 Agent,一个 Tab 看日志,一个 Tab 跑服务器。
# 创建新 Tab
herdr tab create
# 切换 Tab
# 按 ctrl+b n (下一个) / ctrl+b p (上一个)
Pane 是真实终端
Pane 就是一个真实的终端进程,可以左右分割、上下分割。每个 Pane 里可以跑 Agent,也可以跑普通命令。
# 分割 Pane
herdr pane split --current --direction right
# 在 Pane 里运行命令
herdr pane run w1:p2 "go test ./..."
# 读取 Pane 输出
herdr pane read w1:p2 --source recent-unwrapped --lines 120
好处是项目隔离(每个项目的 Agent 在自己的 Workspace 里互不干扰)、视图灵活(Agent、日志、服务器放不同 Tab)、状态汇总(每个 Workspace 的 sidebar 自动汇总 Agent 状态)。
假设你同时在做一个 SaaS 产品的后端、前端和移动端:
- Workspace: backend → Tab: agents(Claude Code + Codex)→ Tab: server(本地开发服务器)→ Tab: logs
- Workspace: frontend → Tab: agents(Cursor + Kimi)→ Tab: dev-server(Vite)
- Workspace: mobile → Tab: agents(Claude Code)→ Tab: simulator
每个 Workspace 独立管理,ctrl+b w 切换,一眼看到哪个项目需要关注。
5. 鼠标和键盘,都是一等公民
第四个设计细节值得单独说:鼠标和键盘都是一等公民。
传统终端复用器是纯键盘的,分割 pane、切换 pane 都得记快捷键,对很多人学习曲线太陡。Herdr 的做法是鼠标能做一切,键盘也能做一切。
鼠标操作
- 点击 pane 切换焦点
- 点击 tab 切换视图
- 拖拽 分割线调整大小
- 右键 打开上下文菜单
- 拖选 文本直接复制(不需要 Ctrl+C)
- 双击 一个词直接复制
键盘操作
Herdr 用 tmux 风格的 prefix 键(默认 ctrl+b):
| 操作 | 快捷键 |
|---|---|
| 向右分割 | prefix+v |
| 向下分割 | prefix+- |
| 新建 Tab | prefix+c |
| 下一个 Tab | prefix+n |
| 上一个 Tab | prefix+p |
| Workspace 导航 | prefix+w |
| 断开客户端 | prefix+q |
如果不喜欢 prefix 键,也可以禁用:
# ~/.config/herdr/config.toml
[keys]
prefix = "" # 禁用 prefix,所有快捷键直接生效
从 tmux 迁移过来的话,ctrl+b 风格的快捷键几乎零学习成本;终端新手则直接用鼠标点击、拖拽、右键就能管理所有 Agent。
6. 实战清单:你的 AI Agent 运行时应该怎么搭
如果要给 AI Agent 搭一个运行时环境,可以按这份清单对照:
会话持久化
- 后台服务器模式:断开后 Agent 继续运行
- 自动重连:重连后状态恢复
- Named session:不同项目不同 session
Agent 可见性
- Agent 状态检测:working / blocked / idle / done
- Sidebar 状态汇总:一眼看到哪个 Agent 需要关注
- Blocked 通知:Agent 卡住了能收到提醒
Agent 协作
- Agent 间 CLI 通信:一个 Agent 可以操作另一个
- 状态等待:可以等另一个 Agent 完成
- 输出读取:可以读取另一个 Agent 的屏幕内容
工作空间管理
- Workspace 隔离:每个项目独立管理
- Tab 视图:同一项目不同视图(Agent、日志、服务器)
- Pane 分割:灵活布局
用户体验
- 鼠标支持:点击、拖拽、右键菜单
- 键盘快捷键:tmux 风格 prefix 键
- 跨平台:macOS / Linux / Windows
安装部署
- 单一二进制:不用 Electron,不用 Node.js
- 包管理器支持:Homebrew / mise / curl
- 自动更新
7. 总结
AI Agent 赛道大家都在关注 Agent 本身的能力——谁能写出更好的代码,谁的理解力更强。但有个问题被忽视了:Agent 的运行时环境。
Agent 不是活在真空里的。它需要一个终端,需要持续运行,需要被管理,需要和其他 Agent 协作。这个运行时的质量,直接决定了你用 Agent 的效率。
Herdr 看准的正是这个被忽视的痛点:
- 后台服务器解决了 Agent 持久运行的问题
- Agent 状态检测解决了「哪个 Agent 卡住了」的可见性问题
- Agent 间 CLI 通信解决了多 Agent 协作的问题
- Workspace 模型解决了多项目多 Agent 的管理问题
- 鼠标 + 键盘双模解决了终端复用器学习曲线陡的问题
不需要一开始就搞一个 Herdr 这样的系统,但至少有三件事可以先做起来:
- 给 Agent 一个持久化的运行环境——tmux 也行,Herdr 更好
- 让 Agent 的状态可见——哪个在跑,哪个卡了
- 让 Agent 之间能通信——不要让它们各自为战
参考资料:
- herdrdev/herdr - GitHub
- Herdr 官方文档
- Herdr 快速开始
- Herdr 概念详解
- Herdr Agent Skill