编程 Herdr:给 AI Agent 用的终端复用器,后台服务器 + 状态检测 + Agent 间 CLI 通信

2026-09-12 09:51:22

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 状态自动检测,它解决两个矛盾:

  1. 怎么让 Agent 在你断开后继续跑,并且重连后马上知道状态?
  2. 怎么让 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 都有明确的状态:

状态含义
workingAgent 正在运行
blockedAgent 需要你输入或确认
doneAgent 完成了,你还没看过
idleAgent 空闲,等待指令
unknown无法确定状态

检测方式不是简单看「有没有输出」,而是通过屏幕内容分析(Screen Detection):

  1. 前台进程检测:看 pane 里跑的是什么进程(claude、codex、cursor 等)
  2. 屏幕 Manifest 匹配:读取 pane 底部的屏幕内容,匹配已知 Agent 的 UI 模式
  3. 状态推断:根据匹配结果,判断 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 干活。举例:

  1. 你在 Claude Code 里说:「帮我重构这个模块,然后让 Codex 做 review」
  2. Claude Code 通过 herdr agent start 启动一个 Codex Agent
  3. Claude Code 通过 herdr agent prompt 让 Codex review 它的代码
  4. Claude Code 通过 herdr agent read 读取 Codex 的 review 结果
  5. 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+-
新建 Tabprefix+c
下一个 Tabprefix+n
上一个 Tabprefix+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 看准的正是这个被忽视的痛点:

  1. 后台服务器解决了 Agent 持久运行的问题
  2. Agent 状态检测解决了「哪个 Agent 卡住了」的可见性问题
  3. Agent 间 CLI 通信解决了多 Agent 协作的问题
  4. Workspace 模型解决了多项目多 Agent 的管理问题
  5. 鼠标 + 键盘双模解决了终端复用器学习曲线陡的问题

不需要一开始就搞一个 Herdr 这样的系统,但至少有三件事可以先做起来:

  1. 给 Agent 一个持久化的运行环境——tmux 也行,Herdr 更好
  2. 让 Agent 的状态可见——哪个在跑,哪个卡了
  3. 让 Agent 之间能通信——不要让它们各自为战

参考资料

  • herdrdev/herdr - GitHub
  • Herdr 官方文档
  • Herdr 快速开始
  • Herdr 概念详解
  • Herdr Agent Skill
复制全文 生成海报 tmux AI Agent 终端 Rust CLI 开发工具

推荐文章

程序员茄子在线接单