
当你同时开着多个 AI 编码代理会话,问题很快会从“模型会不会写代码”变成“我怎么知道哪个会话正在等我”。cmux 作者在介绍里说,自己会并行跑很多 Claude Code 和 Codex 会话,过去用 Ghostty 分屏配合 macOS 原生通知;但通知正文常常只有“Claude is waiting for your input”,没有分支、端口、文件上下文。标签页一多,标题也挤到看不清,只能逐个切换确认。cmux 的创始人正是被这个痛点逼到亲手写了一个终端,用 Swift/AppKit 和 libghostty 绕开了 Electron 和 Tauri 的框架性能包袱。它解决的不是“再造一个 AI IDE”,而是一个很窄但很痛的问题:多个代理同时跑,哪个现在需要你,一眼就该看清。
▎TL;DR
痛点驱动:同时运行多个 Claude Code/Codex 会话时,终端通知无上下文、标签难区分,cmux 原生解决了这一核心问题。
视觉调度:垂直标签搭配蓝色光晕和集中通知面板,让代理等待状态可视可跳转。
完整工作台:内嵌可脚本化浏览器、智能会话恢复、SSH(Secure Shell,安全外壳协议)远程工作区和支持一行命令启动代理的队友模式。
原语哲学:提供终端、浏览器、通知、分割等可组合原语,不锁定工作流,开发者自己决定如何调度 AI 代理。
▎01 当"Claude 在等你"再也没有上下文
并行运行多个 AI 编码代理在今天已经不是新鲜事。但如果你实际用过 Claude Code 和 Codex 同时工作,很快就会撞上终端工具的局限性。Claude Code 的通知正文常常只有一句:“Claude is waiting for your input”——但它在等哪个分支、哪个端口、哪个 workspace?这些信息全被统一抹掉了。标签页一多,连标题都读不全,你只能逐个切换、手动确认。本来代理节省的时间,花在了"刚才到底是哪个在等我"这件事上。
cmux 的创始人 lawrencecchen 在 Hacker News 上详细描述了这段经历。他原来用 Ghostty 配多窗格,依赖 macOS 原生通知来感知代理状态,但每次都是那一条无正文的高频重复。他试了市面上几个编排工具,认为 Electron 和 Tauri 的性能不符合他的预期。更重要的是,他觉得很多 GUI 编排器会锁定用户的工作流,而他更倾向在终端里自由操作。
所以,他决定自己动手 - 用 Swift/AppKit 写了一个原生 macOS 应用,底层用 libghostty 做终端渲染,兼容 Ghostty 的配置格式。cmux 的起点来自开发者被痛点逼迫后的动手实现,没有产品规划。
▎02 垂直标签+蓝色光晕:等待变成可视信号
cmux 的核心差异化功能全部扎在一个诉求上:让等待变成可视信号。打开 cmux,侧边栏以垂直标签列出了所有 workspace,每个标签上包括 git 分支、工作目录、监听端口,以及最新的通知文本。这是一个信息密度极高的迷你状态面板,包含 git 分支、工作目录、监听端口和最新通知文本。如果你在跑 Claude Code,它正在哪个仓库工作、本地起了什么服务、它刚才向你发了一条什么消息 - 所有都在侧边栏一行之内。
当前端代理需要你输入时,pane 边缘会浮现一圈蓝色光晕,同时侧边栏中的对应标签高亮。这种视觉模式的用意很直接:不是所有通知都有同样的优先级,不是所有等待都值得你停下手中的事情去响应。蓝色光晕充当了一种被动注意力信号 - 你不用去 alert 弹窗里逐条扫,目光自然就会被发光的那一格吸引过去。
通知系统本身很开放。它支持三种终端序列:OSC 9/99/777(操作系统命令行序列,常用于终端与程序间传递状态信息和通知),还有一个专属的 CLI(Command Line Interface,命令行接口)命令`cmux notify`,你可以把它挂接到 Claude Code、Codex、OpenCode 等任何代理的 hook 上。快捷键 Cmd+Shift+U 直接从当前位置跳到最新的未读通知,所有未读集中在一个面板管理,不必在标签页间迷路。通知不只局限于等待 - 它能承载文件变更、服务状态、代码审查请求等任意你需要从代理那里获取的上下文片段。
▎03 不只是终端:浏览器、会话恢复与代理集成
cmux 在终端基础上叠加了真正有价值的能力 - 内嵌一个可脚本化的浏览器。这个浏览器从 agent-browser 项目移植了 API,可以导入 Chrome、Firefox、Arc 等 20 多种浏览器的 cookie、历史记录和会话,启动时直接是已认证状态。
更关键的是,代理可以通过无障碍树对浏览器进行自动化操作:截图、取元素引用、点击、填表、执行 JavaScript。这意味着在 cmux 中,你完全可以分出一个浏览器 pane 放在终端旁边,让 Claude Code 直接与你的开发服务器交互。填写登录表单、检查页面元素、观察控制台输出。这种边做边看的循环,比"写代码-切回浏览器-手动刷新-切回终端"要流畅得多。
会话恢复是另一个实用得多的功能。cmux 退出时会保存窗口布局、workspace/pane 分布、工作目录、终端滚动内容和浏览器导航历史。重新打开时,cmux 自动恢复布局,并且 - 如果代理插件的 hook 记录了会话 ID - Claude Code、Codex、OpenCode、Pi、Amp、Cursor CLI、Gemini、Rovo Dev、Copilot、CodeBuddy、Factory、Qoder 等十几个支持的代理会话都能自动 resume。不需要手动执行`claude`再切换目录。你关闭 cmux 时项目是什么状态,恢复后它直接接上运行。
SSH(Secure Shell,安全外壳协议)远程工作区也有值得一提的设计。`cmux ssh user@remote`创建一个远程机器的 workspace,浏览器 pane 通过网络路由穿透过去,本机地址(localhost)在远程 session 里直接工作。拖拽一张图片到远程会话中,cmux 自动通过 scp 上传。对于需要多个终端 pane 同时操作本地和服务器的人,这些细节意味着大量"小事的摩擦"被去掉。
对 Claude Code 重度用户还有一个贴心命令。`cmux claude-teams`一行启动 Claude Code 的 teammate mode,每个队友作为 native split pane 出现,附带侧边栏元数据和通知,不需要 tmux 临时拼凑多人协作。
▎04 原生性能+开放哲学:cmux 是原语,不是方案
cmux 的技术选型很直白。原生 Swift/AppKit 保证了启动速度和低内存占用,libghostty 提供 GPU 加速的渲染,而它直接读取`~/.config/ghostty/config`文件来获取你的主题、字体和颜色。如果你本来就用 Ghostty,迁移成本几乎为零。
但更值得注意的或许是它的设计哲学。cmux 的文档里写得很清楚:cmux 提供终端、浏览器、通知、workspace、分割窗格和一个控制所有这些的 CLI 与 Socket API,但不强迫任何人跟随特定的工作流。你想要怎么编排 AI 代理、浏览器交互和本地开发,完全留给你自己去组合。它不预设"你应该这样用 AI 编码",而是给你一组拆开的积木,你自己搭。CLI 和 Socket API 可以控制一切 - 创建 workspace、分割 pane、发送按键、打开 URL - 你完全可以在自己的脚本或工作流里接管 cmux 的行为。
▎05 最好的工具是自己建的
读完整个项目的 GitHub README,最触动人的是末尾一段话给出的开放哲学。作者 lawrencecchen 认为,最好的开发者一向自己造工具,最接近代码库的开发者才会最先找到最优工作流。
cmux 选择以 GPL-3.0 开源,并且声明永远免费。它同时提供了赞助层级,赞助者可以获得早期访问权限 - 包括一个能对每个 workspace 和 pane 提供上下文的 cmux AI、一个桌面与手机同步终端的 iOS 版本、云端虚拟机、以及语音模式。但基础功能对所有开发者完全开放。作者相信,给一百万个开发者可组合的原语,他们会集体找到最高效的工作流,比任何产品团队自上而下设计都快得多。这既是对开源哲学的自信,也是那个"Claude 在等你所以我写了个新终端"的故事的自然延续。
如果你也被同一个痛点折磨过 - 多个代理同时运行、通知无区别、标签页看不清 - cmux 值得试用。下载 dmg 拖进 Applications 文件夹,或者通过 Homebrew 一键安装,它直接读你已有的 Ghostty 配置。它不一定是你最后的终端工具,但你会在用它十几分钟后,理解"当代理在等你时,能否一眼看清全局"这件事,本身就是巨大的效率差距。
▎参考链接
01 cmux GitHub 仓库(核心 README 与特性描述)
https://github.com/manaflow-ai/cmux
02 Hacker News 上的 Show HN 帖(创始人自述与社区讨论)
https://news.ycombinator.com/item?id=47079718
03 agent-browser(cmux 浏览器 API 的灵感来源)
https://github.com/vercel-labs/agent-browser
夜雨聆风