之前写过 Agent Orchestrator 和 Claude Squad,它们解决的都是同一个问题:同时跑多个 Coding Agent 时怎么管理。前者用 git worktree 做隔离,后者用 tmux + worktree 做分屏。但这两个方案有一个共同的局限——它们是在终端之上加了一层编排逻辑。
cmux 换了个思路:直接造一个为 AI Agent 设计的终端。不是 tmux 套壳,不是 Electron 应用,而是用 Swift + AppKit 写的原生 macOS 应用,底层用 libghostty 做终端渲染。当你同时跑 5 个 Claude Code、2 个 Codex、1 个 Gemini CLI 的时候,每个 Agent 需要你关注的瞬间,对应标签会亮蓝光、pane 边框出现通知环。Cmd+Shift+U 直接跳到最紧急的那个。
24.7K Star,半年做到的。
它到底解决了什么问题
用 Claude Code 或 Codex 的人都有过这种体验:你在窗口 A 跑着一个 Agent 改后端,窗口 B 跑另一个 Agent 写前端测试,窗口 C 还有一个在查 bug。突然窗口 B 的 Agent 停了——它在等你确认一个文件覆盖。但你不知道,因为你在看窗口 A。
macOS 的原生通知能告诉你"Claude is waiting for your input",但不告诉你是哪个窗口、哪个项目、在做什么。标签栏太窄的时候,标题也看不见。
cmux 的通知系统解决了这个信息断层:
- 通知环——需要关注的 pane 边框出现蓝色光圈,在任何分屏布局下都能一眼看到
- 标签高亮——竖向标签栏里对应标签变亮,附带最新通知文字
- 通知面板——Cmd+I 打开,列出所有待处理通知,Cmd+Shift+U 跳到最近一条未读
- macOS 桌面通知——切到其他应用时也不会错过
通知的触发机制是标准终端转义序列(OSC 9/99/777),也支持 CLI 命令 cmux notify 手动触发。Claude Code、Codex、OpenCode、Gemini CLI 这些主流 Agent 都已经兼容。
竖向标签栏:不只是换个方向
横标签栏能显示 8-10 个 tab 的标题,竖标签栏能显示 3-4 个。看起来竖标签更浪费空间?实际上 cmux 的竖标签显示的信息密度远超横标签:
| 信息 | 横标签 | cmux 竖标签 |
|---|---|---|
| 标题 | 截断到 15 字符 | 完整显示 |
| Git 分支 | ❌ | ✅ |
| 关联 PR 状态 | ❌ | ✅(open/merged/conflict) |
| 工作目录 | ❌ | ✅ |
| 监听端口 | ❌ | ✅ |
| 最新通知 | ❌ | ✅ |
这意味着你扫一眼侧边栏就知道:Agent A 在 feature/auth 分支上,PR #142 已经 merge 了;Agent B 在 fix/timeout 上,PR #156 有冲突;Agent C 跑着 dev server 在 3000 端口。不需要切过去看。
内置浏览器:Agent 能直接操作网页
这是 cmux 最让我意外的功能。它内置了一个浏览器 pane,可以跟终端并排分屏,而且这个浏览器是可编程的——通过 socket API,Agent 可以:
- 截取 DOM 的 accessibility tree
- 获取元素引用、点击、填写表单
- 执行 JavaScript
- 读取 console 和 network 日志
这个 API 是从 Vercel Labs 的 agent-browser 项目移植过来的。实际场景:你让 Claude Code 写一个登录页面,它写完之后可以直接在旁边的浏览器 pane 里打开 localhost:3000,自己填表单、点按钮、验证功能是否正常。不需要你手动去浏览器里看。
浏览器 pane 还支持从 Chrome、Firefox、Arc 等 20+ 浏览器导入 cookie、历史和会话,所以你的 Agent 打开需要登录的页面时,不需要重新认证。
SSH 和远程工作
cmux ssh user@remote 会在远程机器上创建工作区,浏览器 pane 自动通过远程网络路由(localhost 直接可用)。拖拽图片到远程会话会自动通过 SCP 上传。
更实用的是远程 tmux 附加:cmux 可以直接 attach 到远程 tmux session,这意味着你可以在服务器上跑 Agent,从 cmux 里操控,享受 cmux 的通知和标签系统。
Session Restore:重启不丢上下文
退出 cmux 会保存当前 session 布局。重新打开时恢复:窗口、工作区、pane 布局、工作目录、终端 scrollback、浏览器 URL 和导航历史。甚至支持 Claude Code、Codex、OpenCode 等 Agent 的 session 恢复——前提是安装了对应的 hooks:
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
支持 resume 的 Agent 包括:Claude Code、Codex、Grok、OpenCode、Pi、Amp、Cursor CLI、Gemini、Rovo Dev、Copilot、CodeBuddy、Factory、Qoder。Claude Code 的 resume 由 cmux 的 Claude wrapper 处理(需要在 Settings 里启用 Claude 集成)。
跟 tmux、iTerm2、Warp 比
| cmux | tmux | iTerm2 | Warp | |
|---|---|---|---|---|
| 类型 | 原生 macOS 应用 | 终端复用器(CLI) | 终端模拟器 | 终端 + AI |
| 渲染引擎 | libghostty (GPU) | 无(依赖宿主终端) | Metal | GPU |
| Agent 通知 | ✅ 通知环 + 面板 + 桌面 | ❌ 需要自己配 | ❌ | ❌ |
| 竖向标签 + 元数据 | ✅ git/PR/端口/通知 | ❌ | ❌ | ❌ |
| 内置浏览器 | ✅ 可编程 | ❌ | ❌ | ❌ |
| Agent Session 恢复 | ✅ 14 种 Agent | ❌ | ❌ | ❌ |
| SSH + 远程 tmux | ✅ | ✅ | ✅ | ✅ |
| Ghostty 配置兼容 | ✅ | ❌ | ❌ | ❌ |
| CLI/Socket API | ✅ | ✅ | ❌ | ❌ |
| 平台 | macOS(iOS beta) | 全平台 | macOS | macOS/Linux |
| 开源协议 | GPL-3.0 | ISC | GPL-2.0 | 闭源 |
cmux 的定位不是替代 tmux,而是替代"Ghostty + tmux + 手动配通知"这套组合。如果你已经用 Ghostty 作为主力终端,cmux 几乎是零迁移成本——它直接读你的 ~/.config/ghostty/config,主题、字体、颜色全部继承。
可编程性:CLI + Socket API
cmux 的每个操作都有 CLI 和 Unix socket 对应:
# 创建工作区
cmux workspace create "auth-refactor"
# 分屏
cmux pane split-right
# 发送按键
cmux pane send-keys "claude" Enter
# 读取屏幕内容
cmux pane read
# 截图
cmux pane screenshot
# 浏览器操作
cmux browser navigate "http://localhost:3000"
cmux browser snapshot
cmux browser click "#submit-btn"
这意味着你可以写 shell 脚本来自动化多 Agent 工作流。比如:启动 3 个 Agent,分别指向前端、后端、测试三个目录,等它们各自完成后汇总结果。
Claude Code Teams 集成
cmux claude-teams 一条命令启动 Claude Code 的 teammate 模式。teammate 进程自动变成 cmux 的原生分屏,侧边栏显示元数据和通知。不需要 tmux,不需要手动分屏。
上手
Homebrew 安装:
brew tap manaflow-ai/cmux
brew install --cask cmux
或者直接下载 DMG:
# https://github.com/manaflow-ai/cmux/releases/latest/download/cmux-macos.dmg
安装 hooks(让 Agent session 支持恢复):
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
首次启动,macOS 会问你要不要打开来自已识别开发者的应用,点 Open 即可。cmux 通过 Sparkle 自动更新,装一次就行。
踩坑提醒
macOS Only——目前只有 macOS 版本,Swift + AppKit 原生开发。Linux 和 Windows 用户没戏。不过 iOS 版本在 beta 中,可以通过 TestFlight 用 iPhone 远程连接到 Mac 上的 cmux session。
GPL-3.0——如果你的公司对 GPL 敏感,需要联系他们拿商业许可。不过对于个人开发者来说完全不是问题。
需要 Ghostty 思维——cmux 的快捷键体系跟 Ghostty 一致,跟 iTerm2/Terminal.app 差别较大。Cmd+D 是分屏向右(不是关闭标签),Cmd+T 是新 surface(不是新标签)。有学习曲线。
浏览器 pane 还是 beta——可编程浏览器 API 虽然强大,但跟真实 Chrome 比还是有差距。复杂的 SPA 页面可能渲染不完整。目前更适合验证 dev server 的简单页面。
内存占用——虽然是原生应用比 Electron 省资源,但开 10+ 个 pane 每个跑 Agent 的时候,内存占用还是会涨不少。官方没有给具体数据,但建议 16GB+ 内存的机器用。
值得关注的点
cmux 的"primitive, not solution"哲学很有意思。作者在 README 里明确说:cmux 不教你应该怎么用 Agent,它给你终端、浏览器、通知、工作区、分屏、CLI 这些原语,剩下的你自己组合。这跟 tmux 的精神一脉相承,但多了 Agent 时代的特有原语(通知环、Agent session 恢复、可编程浏览器)。
另一个值得关注的是 cmux Skills(cmux-skills)——这是 cmux 的可复用工作流集合,类似 Claude Code 的 skills。但因为 cmux 有浏览器和完整的 CLI API,它的 skills 能做的事情比纯终端 Agent 的 skills 多得多,比如"自动在浏览器里验证修改"、"截图发到 Slack"。
项目状态:活跃开发中,GPL-3.0 协议,24.7K Star,有 Discord 社区和 Nightly 构建。