cmux
基于 Ghostty 的 macOS 原生终端,专为 AI coding agent 工作流优化,支持垂直标签、通知环和内置浏览器。亮点是原生 Swift/AppKit 构建(非 Electron),性能出色;内置可编程浏览器让 agent 直接操作 UI;一键启动 Claude Code Teams 并以原生分屏运行;通知系统可区分不同 agent 的等待状态。适合同时管理多个 AI agent 会话的开发者。
README
cmux
一款基于 Ghostty 的 macOS 终端,具有垂直标签和通知功能,专为 AI 编码代理设计
English | 日本語 | Tiếng Việt | 简体中文 | 繁體中文 | 한국어 | Deutsch | Español | Français | Italiano | Dansk | Polski | Русский | Bosanski | العربية | Norsk | Português (Brasil) | ไทย | Türkçe | ភាសាខ្មែរ | Українська
特性
通知环当编码代理需要你关注时,面板会显示蓝色环,标签会亮起 |
|
通知面板在一个地方查看所有待处理通知,跳转到最新的未读消息 |
|
内置浏览器在终端旁分屏打开浏览器,内置可脚本化的 API(移植自 agent-browser) |
|
垂直 + 水平标签侧边栏显示 git 分支、关联的 PR 状态/编号、工作目录、监听端口以及最新通知文本。支持水平和垂直分屏。 |
|
SSHcmux ssh user@remote 为远程机器创建工作区。浏览器面板通过远程网络路由,因此 localhost 可正常运行。将图片拖入远程会话即可通过 scp 上传。
|
|
Claude Code Teamscmux claude-teams 通过一条命令运行 Claude Code 的队友模式。队友作为原生分屏启动,带有侧边栏元数据和通知。无需 tmux。
|
|
- 浏览器导入 — 从 Chrome、Firefox、Arc 等 20 多种浏览器导入 Cookie、历史记录和会话,使浏览器面板启动时即已认证
- 自定义命令 — 在
cmux.json中定义项目特定操作,可从命令面板启动 - 可脚本化 — CLI 和 socket API 可创建工作区、分屏、发送按键和自动化浏览器
- 原生 macOS 应用 — 使用 Swift 和 AppKit 构建,非 Electron。启动快,内存占用低。
- Ghostty 兼容 — 读取你现有的
~/.config/ghostty/config以获取主题、字体和颜色 - GPU 加速 — 基于 libghostty 实现流畅渲染
安装
DMG(推荐)
打开 .dmg 并将 cmux 拖入应用程序文件夹。cmux 通过 Sparkle 自动更新,因此只需下载一次。
Homebrew
brew tap manaflow-ai/cmux
brew install --cask cmux
稍后更新:
brew upgrade --cask cmux
首次启动时,macOS 可能会要求你确认打开来自已识别开发者的应用。点击 打开 继续。
为什么选择 cmux?
我并行运行了大量 Claude Code 和 Codex 会话。当时使用 Ghostty 并开了一堆分屏面板,依赖原生 macOS 通知来了解代理何时需要我。但 Claude Code 的通知内容始终只是“Claude 正在等待你的输入”,毫无上下文,而且标签页开多了连标题都看不清。
我尝试过一些编码编排工具,但大多数都是 Electron/Tauri 应用,性能让我困扰。而且我更喜欢终端,因为 GUI 编排工具会把你锁死在它们的工作流里。所以我用 Swift/AppKit 构建了 cmux 这个原生 macOS 应用。它使用 libghostty 进行终端渲染,并读取你现有的 Ghostty 配置以获取主题、字体和颜色。
主要新增功能是侧边栏和通知系统。侧边栏包含垂直标签,显示每个工作区的 git 分支、关联的 PR 状态/编号、工作目录、监听端口以及最新通知文本。通知系统可以捕获终端序列(OSC 9/99/777),并提供一个 CLI(cmux notify),你可以将其接入代理钩子(如 Claude Code、OpenCode 等)。当代理正在等待时,它的面板会显示蓝色环,侧边栏中的标签也会亮起,这样我就能在多个分屏和标签页中知道哪个需要我。按 Cmd+Shift+U 可跳转到最新的未读消息。
内置浏览器包含一个可脚本化的 API,移植自 agent-browser。代理可以获取无障碍树、获取元素引用、点击、填写表单和评估 JS。你可以将浏览器面板与终端并排分屏,让 Claude Code 直接与你的开发服务器交互。
所有功能都可通过 CLI 和 socket API 脚本化 — 创建工作区/标签、分屏、发送按键、在浏览器中打开 URL。
cmux 之道
cmux 不规定开发者如何掌握自己的工具。它是一个带有 CLI 的终端和浏览器,其余由你决定。
cmux 是原语,而非解决方案。它为你提供终端、浏览器、通知、工作区、分屏、标签以及控制所有这一切的 CLI。cmux 不会强迫你接受某种固化的编码代理使用方式。你利用这些原语构建的东西属于你自己。
最优秀的开发者始终自己构建工具。目前还没有人找到与代理协作的最佳方式,而那些构建封闭产品的团队也肯定没找到。最接近自己代码库的开发者将率先找到答案。
给一百万个开发者可组合的原语,他们会集体找到最高效的工作流,速度远超任何产品团队自上而下的设计。
文档
有关如何配置 cmux 的更多信息,请访问我们的文档。
键盘快捷键
工作区
| 快捷键 | 操作 |
|---|---|
| ⌘ N | 新建工作区 |
| ⌘ 1–8 | 跳转到工作区 1–8 |
| ⌘ 9 | 跳转到最后一个工作区 |
| ⌃ ⌘ ] | 下一个工作区 |
| ⌃ ⌘ [ | 上一个工作区 |
| ⌘ ⇧ W | 关闭工作区 |
| ⌘ ⇧ R | 重命名工作区 |
| ⌥ ⌘ E | 编辑工作区描述 |
| ⌘ B | 切换侧边栏 |
| ⌥ ⌘ B | 切换右侧边栏 |
| ⌘ ⇧ E | 切换右侧边栏焦点 |
表面(Surface)
| 快捷键 | 操作 |
|---|---|
| ⌘ T | 新建表面 |
| ⌘ ⇧ ] | 下一个表面 |
| ⌘ ⇧ [ | 上一个表面 |
| ⌃ Tab | 下一个表面 |
| ⌃ ⇧ Tab | 上一个表面 |
| ⌃ 1–8 | 跳转到表面 1–8 |
| ⌃ 9 | 跳转到最后一个表面 |
| ⌘ W | 关闭表面 |
分屏面板
| 快捷键 | 操作 |
|---|---|
| ⌘ D | 向右分屏 |
| ⌘ ⇧ D | 向下分屏 |
| ⌥ ⌘ ← → ↑ ↓ | 按方向聚焦面板 |
| ⌘ ⇧ H | 高亮聚焦的面板 |
浏览器
浏览器开发者工具快捷键遵循 Safari 默认值,可在设置 > 键盘快捷键中自定义。命令面板导航快捷键(包括 ⌃ P)也可自定义,并可清除以使按键传递到活动终端。
| 快捷键 | 操作 |
|---|---|
| ⌘ ⇧ L | 在分屏中打开浏览器 |
| ⌘ L | 聚焦地址栏 |
| ⌘ [ | 后退 |
| ⌘ ] | 前进 |
| ⌘ R | 刷新页面 |
| ⌥ ⌘ I | 切换开发者工具(Safari 默认) |
| ⌥ ⌘ C | 显示 JavaScript 控制台(Safari 默认) |
通知
| 快捷键 | 操作 |
|---|---|
| ⌘ I | 显示通知面板 |
| ⌘ ⇧ U | 跳转到最新未读 |
| ⌥ ⌘ U | 切换当前项未读状态 |
| ⌃ ⌘ U | 将当前项标记为最早未读,并跳转到下一个最新未读 |
查找
| 快捷键 | 操作 |
|---|---|
| ⌘ F | 查找 |
| ⌘ ⇧ F | 在目录中查找 |
| ⌘ G / ⌥ ⌘ G | 查找下一个/上一个 |
| ⌥ ⌘ ⇧ F | 隐藏查找栏 |
| ⌘ E | 使用选中的内容查找 |
终端
| 快捷键 | 操作 |
|---|---|
| ⌘ K | 清除回滚 |
| ⌘ C | 复制(选中时) |
| ⌘ V | 粘贴 |
| ⌘ + / ⌘ - | 增大/减小字体大小 |
| ⌘ 0 | 重置字体大小 |
窗口
| 快捷键 | 操作 |
|---|---|
| ⌘ ⇧ N | 新建窗口 |
| ⌘ ⇧ O | 重新打开上一个会话 |
| ⌘ , | 设置 |
| ⌘ ⇧ , | 重新加载配置 |
| ⌘ Q | 退出 |
每夜构建
cmux NIGHTLY 是一个独立的应用,拥有自己的 bundle ID,因此可与稳定版本同时运行。它自动从最新的 main 提交构建,并通过自己的 Sparkle 源自动更新。
在 GitHub Issues 或 Discord 的 #nightly-bugs 中报告每夜构建的 bug。
会话恢复
退出 cmux 会保存当前会话。重新启动时,cmux 会恢复应用拥有的状态:
- 窗口/工作区/面板布局
- 工作目录
- 终端回滚(尽力而为)
- 浏览器 URL 和导航历史
cmux 不会检查任意活动进程状态。tmux、vim、shell 以及不支持的终端应用会以正常终端的形式重新打开。
受支持的代理会话可以在钩子保存了原生会话 ID 后恢复。在安装代理 CLI 后安装钩子,以便其二进制文件位于 PATH 中:
cmux hooks setup
cmux hooks setup codex
cmux hooks setup --agent opencode
cmux hooks setup 会安装它能找到的受支持代理,并打印被跳过的代理的摘要。支持的恢复集成包括:Claude Code、Codex、Grok、OpenCode、Pi、Amp、Cursor CLI、Gemini、Rovo Dev、Copilot、CodeBuddy、Factory 和 Qoder。当 Claude 集成在设置中启用时,Claude Code 由 cmux Claude 包装器处理。
高级用户和集成可以将自定义恢复命令附加到当前终端表面。这对于具有自身持久状态的工具(如 tmux 会话或自定义代理 CLI)很有用:
cmux surface resume set --kind tmux --checkpoint work --shell "tmux attach -t work"
cmux surface resume show --json
cmux surface resume clear --checkpoint work
绑定会保持附加到 cmux 表面。除非你批准一个用于自动恢复的签名命令前缀,否则公开的 CLI 或 socket 创建的绑定会存储以供检查和手动恢复。已批准的前缀还会绑定到工作目录和精确的环境值(如果存在)。在 设置 > 终端 > 恢复命令 中查看或编辑批准。cmux 仅自动运行它标记为受信任的恢复绑定,例如实时进程检测到的 tmux 绑定或用户批准的前缀。在存储恢复绑定之前,会丢弃令牌、密码、密钥和 API 密钥等敏感环境键。
要恢复的代理终端保持空闲而不自动运行其恢复命令,请关闭 设置 > 终端 > 重新打开时恢复代理会话,或在 ~/.config/cmux/cmux.json 中设置:
{
"terminal": {
"autoResumeAgentSessions": false
}
}
这仅禁用自动代理恢复命令。cmux 仍然恢复保存的布局、工作目录、回滚和浏览器历史记录。
如果需要手动重新应用上次保存的快照,请使用:
文件 > 重新打开上一个会话⌘ ⇧ Ocmux restore-session
在底层,cmux 将版本化的快照写入 ~/Library/Application Support/cmux/,代理钩子将会话映射写入 ~/.cmuxterm/。恢复时,cmux 首先重建布局,然后在启用自动代理恢复时运行受支持代理的原生恢复命令。
阅读完整指南:https://cmux.com/docs/session-restore。
星标历史
贡献
参与方式:
- 在 X 上关注我们获取更新:@manaflowai、@lawrencecchen、@austinywang
- 加入 Discord 上的讨论
- 创建并参与 GitHub issues 和 讨论
- 告诉我们你用 cmux 构建了什么
社区
创始人版
cmux 是免费、开源的,并且将永远如此。如果你想支持开发并抢先体验未来的功能:
- 优先处理功能请求/Bug 修复
- 抢先体验:cmux AI,为你提供每个工作区、标签和面板的上下文
- 抢先体验:iOS 应用,桌面和手机之间同步终端
- 抢先体验:云虚拟机
- 抢先体验:语音模式
- 我的个人 iMessage/WhatsApp
许可证
cmux 根据 GPL-3.0-or-later 开源。
如果你的组织无法遵守 GPL,可提供商业许可证。联系 founders@manaflow.com 了解详情。