amux - 面向人和 AI 代理的终端 multiplexer
AI 编码代理越来越擅长读仓库、改代码和跑测试,但它们和人类仍然常常不在同一个操作界面里。人看的是终端窗口,agent 读取的是日志片段、截图、临时文件或聊天上下文。中间一旦需要等待命令结束、识别当前 pane、读取滚动历史、把输出交给另一个 agent,就会退回到脆弱的脚本和文本解析。
今天推荐的 weill-labs/amux 正好切在这个问题上。它是一个 Go 写的终端 multiplexer,目标不是完整复刻 tmux,而是给人和 agent 一个共享的 TUI 网格:人可以用快捷键看和操作 pane,agent 可以用 CLI 命令读结构化状态、发送按键、等待条件和订阅事件。GitHub 当前页面显示项目约有 29 stars、3 forks,主要语言是 Go,许可为 MIT;最新 release 是 v0.5.0,发布于 2026 年 4 月 15 日。
项目概览
| 属性 | 详情 |
|---|---|
| 仓库 | weill-labs/amux |
| Stars | 约 29 |
| Forks | 3 |
| 主要语言 | Go |
| 许可 | MIT |
| 创建时间 | 2026 年 3 月 13 日 |
| 最近更新 | 2026 年 5 月 24 日 |
| 最新 Release | v0.5.0 |
为什么不是再写一个普通终端分屏工具
amux 的有趣之处在于,它把终端 pane 的解析状态当成系统里的真实状态。PTY 输出先进入 VT emulator,随后同一份状态可以渲染成人能看的 ANSI 画面,也可以导出成 agent 能读的结构化数据。
这和“让 agent 截屏看终端”是两条路。截图需要视觉模型理解布局,成本高,也很容易受字体、主题、窗口大小影响。普通文本 capture 又经常丢掉 cursor、pane、foreground process、idle 状态和颜色等上下文。amux 试图把这层状态显式化,让 agent 直接拿到 JSON。
README 里最能说明定位的一组命令是:
amux capture --format json
amux send-keys pane-1 "make test" Enter
amux wait exited pane-1
amux events --filter idle
这不是单纯“远程控制终端”,而是把终端会话变成可观察、可等待、可组合的工作区。
Agent API:capture、wait、events
amux 的 agent API 是普通 CLI,不要求调用方使用特定 SDK 或语言。最基础的是 capture:它可以抓取整个 session,也可以抓取某个 pane;可以返回纯文本,也可以返回 JSON;可以读取当前可见屏幕,也可以带上 retained scrollback history。
JSON capture 里包含 session、window、pane 位置、cursor、terminal 元数据、pane 内容、是否 idle、是否 exited、最近输出时间、当前命令等字段。对 agent 来说,这些字段比一大段终端文本更容易判断下一步。
第二类能力是 wait。常见条件包括:
amux wait idle pane-1 --timeout 30s
amux wait ready pane-1
amux wait exited pane-1
amux wait content pane-1 "PASS"
这解决了 agent 脚本里非常常见的轮询问题。以前可能要 sleep、grep 输出、猜命令是否结束;现在可以让 multiplexer 自己根据 pane 状态阻塞到条件满足。
第三类是 events。它会以 NDJSON 形式推送 layout、output、terminal、idle、busy、exited、client connect/disconnect 等事件。长跑 agent 可以订阅事件,而不是不停 capture;也可以把事件流接到自己的调度逻辑里。
同一个 pane,人和 agent 都能看见
amux 的设计没有把人类排除在外。它仍然是一个 TUI:有 pane、window、split、zoom、copy mode、快捷键和 attach/detach。默认 prefix 是 Ctrl-a,可以分屏、切换 pane、缩放、进入 copy mode、创建 window、重载 server。
这点对 AI 工作流很重要。很多 headless 自动化工具的问题不是不能跑命令,而是人看不到现场,或者 agent 的操作状态很难接管。amux 让人和 agent 共用同一组 pane:人可以观察 agent 正在跑什么,agent 也可以读取人刚刚操作后的状态。
README 还提到,pane history 由 server 保留。客户端 attach 时会恢复历史,各个 viewer 可以维护自己的 copy-mode 状态。这样 detach、reattach、hot reload 和 crash recovery 后,滚动历史仍然比较可恢复。
远程主机和多 agent 工作流
amux 支持配置 remote hosts,并把远端 session 的 pane 映射到本地视图里。当前可用传输主要是 SSH,配置里也预留了 transport preference;mosh 被识别但还不是已实现路径。
这让它不只是本机分屏工具。你可以把本地 shell、远端 GPU 机器、构建环境或另一个开发机放进同一个 session 视角里。agent 通过 pane 名称或 ID 发送命令,人则通过 TUI 看整体状态。
README 里还给了更高层的工作流例子:给 pane 打 task 或 issue metadata,检查 worker PR 的 CI 状态,找到哪个 pane 负责哪个任务,再把消息发回对应 pane。这些脚本不是 amux 的核心协议,但说明了它想服务的使用场景:多个终端 worker、多个 agent、一个人类监督者,以及可恢复的状态层。
和 tmux 脚本的差异
如果只是分屏,tmux 已经足够成熟。amux 的差异在于它把 agent 所需的几个动作做成一等能力。
tmux 可以 capture-pane,但拿到的是偏向人类阅读的文本,ANSI、换行、pane 宽度和应用状态都可能让解析变复杂。amux 则直接提供结构化 JSON 和 retained history。
tmux control mode 能做集成,但仍然需要调用方处理大量原始 pane 内容。amux 的 wait idle、wait content、events 更像是给自动化脚本准备的同步原语。
headless 的 expect/pexpect 适合独占式自动化,但人类很难自然介入。amux 的取舍是把共享屏幕保留下来,只是在同一份状态上增加 agent 可读写接口。
当然,它也明确不是 tmux 的完整替代。README 说它实现的是人和 agent 配对最需要的一组功能:splits、windows、zoom、remote hosts、searchable choosers 和 agent API。如果你依赖 tmux 的复杂 hooks、session groups 或成熟插件生态,amux 现在还不是替换品。
安装方式和当前边界
amux 提供几种安装方式:
curl -fsSL https://raw.githubusercontent.com/weill-labs/amux/main/scripts/install-release.sh | bash
brew install weill-labs/tap/amux
go install github.com/weill-labs/amux@latest
首次启动 server 时,它会安装自己的 terminfo entry,需要系统里有 ncurses 的 tic。如果自动安装不合适,也可以显式运行:
amux install-terminfo
当前还需要注意几个边界。
- 项目很新,2026 年 3 月才创建,接口和行为仍可能快速变化。
- stars 只有几十个,社区反馈和跨平台边角案例还需要时间积累。
- 它不是 tmux 兼容层,迁移 tmux 配置和插件不能直接照搬。
- 远程传输目前主要看 SSH,mosh 还只是规划中的方向。
- 让 agent 控制真实 shell 本身就有风险,适合先在受控仓库和受控命令范围内试用。
适合谁试
amux 适合几类开发者:
- 经常同时运行多个 AI coding agent、希望人能随时观察和接管的人;
- 想让 agent 可靠等待测试、构建、部署命令结束,而不是靠 sleep 的人;
- 需要把终端输出变成结构化 JSON,交给脚本或 agent 后续处理的人;
- 有本地和远端混合开发环境,希望在同一 TUI 中监督多个 worker 的人;
- 对 tmux 很熟,但正在寻找更 agent-friendly 的实验性替代方案的人。
如果你的自动化只是偶尔跑一个命令,普通 shell 脚本就够了。如果你的工作流已经深度绑定 tmux,也没有 agent 读写 pane 的需求,amux 目前不会带来足够收益。但如果你每天都在让多个 agent session 排队处理任务,终端状态的结构化会立刻变得有价值。
总结
weill-labs/amux 把终端 multiplexer 重新放进 AI agent 语境里思考。它不是只给人类看的分屏,也不是把人排除出去的 headless 自动化,而是试图让同一组 pane 同时服务人和 agent。
我最看重的是它的同步原语:结构化 capture、阻塞 wait、事件流和 retained history。它们解决的不是炫技问题,而是 agent 在真实终端里经常卡住的细节。项目还早,但方向很清楚,值得关注。