随着 Claude Code、Codex、OpenCode 等 AI Coding Agent 的普及,开发者面临一个新的交互难题:当多个 Agent 会话并行运行时,如何在不打断心流的情况下及时感知 Agent 的状态变化?传统的 macOS 通知往往只显示 "Claude is waiting for your input",缺乏上下文信息;而终端内的多窗口管理又容易让标签标题被截断,难以快速定位需要关注的会话。
cmux 的出现正是为了解决这一痛点。它并非又一个 Electron 封装的终端包装器,而是基于 Ghostty 的 GPU 加速渲染核心、使用 Swift/AppKit 原生开发的 macOS 终端应用。其核心创新在于将垂直标签架构与 AI Agent 通知系统深度耦合,让终端界面成为 Agent 工作流的第一类参与者。
Ghostty 底层:GPU 加速的终端渲染基础
cmux 选择 Ghostty 作为底层终端引擎并非偶然。Ghostty 是用 Zig 语言编写的终端仿真器,采用多线程架构(分离的读取、写入、渲染线程)实现高性能终端模拟。在渲染层面,Ghostty 针对 macOS 使用 Metal、针对 Linux 使用 OpenGL,通过 GPU 加速实现流畅的字体渲染和 ligature 支持。
更重要的是,Ghostty 提供了可嵌入的核心库 libghostty 和 VT 序列解析库 libghostty-vt。这使得 cmux 能够在不重新实现终端仿真逻辑的前提下,获得高性能的终端渲染能力,同时保留扩展空间。cmux 直接读取用户现有的 ~/.config/ghostty/config 配置文件,继承主题、字体和颜色设置,降低了迁移成本。
垂直标签架构:信息密度的重新分配
cmux 的垂直标签栏(sidebar)是其最显著的视觉特征。与传统终端的水平标签不同,垂直布局允许每个标签展示更丰富的元数据:
- Git 分支名称:当前工作区的分支状态
- PR 状态 / 编号:与 GitHub/GitLab 的集成信息
- 工作目录路径:快速识别项目上下文
- 监听端口:显示当前运行的开发服务器端口
- 最新通知文本:Agent 的最后一条消息摘要
这种信息密度的提升,使得开发者无需切换标签即可掌握每个工作区的状态。当配合水平分割(split)使用时,垂直标签栏作为全局导航,分割面板作为局部工作区,形成了层次分明的空间组织模型。
OSC 终端序列:Agent 通知的协议层
cmux 的 Agent 通知系统建立在一个精巧的协议设计之上:OSC(Operating System Command)终端转义序列。当 Agent 需要用户关注时,它会通过标准输出发送特定的 OSC 序列(9/99/777),cmux 的终端解析器捕获这些序列后,触发相应的 UI 反馈。
具体而言,通知机制包含三个层次:
视觉反馈层:当 Agent 发送通知序列时,对应的 pane 会显示蓝色环状高亮,sidebar 中的标签会点亮。这种设计借鉴了消息应用的通知徽章模式,但在终端语境下进行了适配 —— 蓝色环表示 "需要关注",而非 "错误"。
聚合管理层:cmux 提供通知面板(Cmd+I),集中展示所有待处理的通知,支持按时间排序和快速跳转(Cmd+Shift+U 跳转到最新未读)。这解决了多 Agent 并行时的注意力分散问题。
CLI 集成层:cmux 提供 cmux notify 命令,允许 Agent 通过 hooks 主动发送通知。支持的 Agent 包括 Claude Code、Codex、OpenCode、Grok、Cursor CLI 等。安装 hooks 后,Agent 的原生通知会被自动转换为 cmux 的通知序列。
可编程浏览器:Agent 的延伸触手
cmux 内置的浏览器并非简单的网页查看器,而是基于 Vercel 的 agent-browser 项目移植的可编程浏览器。它提供 JavaScript API 供 Agent 调用,支持以下操作:
- 捕获页面的可访问性树(accessibility tree)
- 获取元素引用(element refs)
- 执行点击、表单填充等交互
- 运行 JavaScript 代码
这意味着 Agent 可以直接与开发服务器交互 —— 例如,在修改 React 组件后,Agent 可以打开浏览器面板、截图、分析渲染结果,然后将结论反馈给开发者。浏览器面板支持从 Chrome、Firefox、Arc 等 20+ 浏览器导入 cookies 和会话,确保 Agent 能够以已认证状态访问开发环境。
cmux.json:项目级工作流编排
cmux 的配置系统支持项目级和全局两级配置。在项目根目录创建 .cmux/cmux.json,可以定义项目特定的命令和工作区布局。
Action 注册表(Nightly 功能)允许将常用操作映射到命令面板和标签栏按钮。例如,可以配置 "Codex" 按钮,一键在新标签页启动 Codex Agent;或配置 "Web Dev" 工作区命令,自动创建水平分割布局,左侧运行前端开发服务器,右侧上方打开浏览器预览,下方保留 shell。
工作区命令支持复杂的布局定义,使用递归的 split/pane 树结构描述窗口排列。每个 pane 可以包含多个 surface(终端或浏览器标签),支持设置工作目录、环境变量、启动命令等参数。
会话恢复机制保存窗口 / 工作区 /pane 布局、工作目录、终端回滚缓冲区、浏览器历史等状态。对于支持的 Agent,cmux 会在 hooks 中保存原生会话 ID,重启后自动恢复 Agent 会话。
可落地的工程参数
基于 cmux 的架构设计,以下是可直接应用的配置参数和最佳实践:
通知阈值设置:在 ~/.config/cmux/cmux.json 中,可以通过 terminal.autoResumeAgentSessions 控制重启后是否自动恢复 Agent 会话。对于需要保持会话状态的长期任务,建议设为 true;对于一次性任务,设为 false 避免不必要的恢复。
快捷键映射:cmux 提供完整的快捷键自定义。关键映射包括:Cmd+Shift+U(跳转到最新未读通知)、Cmd+I(显示通知面板)、Cmd+Shift+L(在分割中打开浏览器)。建议将 Agent 启动命令映射到易达的快捷键,如 Cmd+Shift+C 启动 Claude Code。
多 Agent 编排策略:使用工作区命令预定义常见的工作流布局。例如,"Fullstack Dev" 工作区可以配置为:水平分割 0.5,左侧 pane 运行前端服务器,右侧垂直分割 0.6,上方打开浏览器预览,下方启动 Claude Code。通过 cmux hooks setup 安装各 Agent 的 hooks,确保通知机制正常工作。
SSH 工作区:cmux ssh user@remote 创建远程工作区,浏览器面板自动通过远程网络路由,使得 localhost 在远程上下文中正常工作。拖拽图片到远程会话可通过 scp 自动上传。
局限与权衡
cmux 的设计选择也带来一些限制。首先,它目前仅支持 macOS 14+,跨平台能力受限。其次,采用 GPL-3.0 许可证,商业使用需要额外授权。此外,作为原生 Swift/AppKit 应用,其扩展机制主要依赖 CLI 和 socket API,而非 Electron 应用的 JavaScript 插件生态。
这些限制反映了 cmux 的设计哲学:作为 "原语(primitive)" 而非 "解决方案(solution)"。它提供终端、浏览器、通知、工作区、分割、标签和 CLI 控制能力,但不强制规定如何使用这些能力。开发者需要根据自己的工作流,通过 cmux.json 和 hooks 构建个性化的 Agent 交互模式。
资料来源
- cmux GitHub 仓库与官方文档(cmux.com/docs)
- Ghostty 技术架构与 libghostty 嵌入方案
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。