跳到主要内容

创建日期:2026-09-14 | 最近更新:2026-09-14 事实核对基于 npm cmux@0.11.0(本机实测:下载包、读启动器源码、跑 --help/--version)。说明:cmux 的 TUI 需要真实终端,本机沙箱无法启动会话(实测报 Operation not permitted),所以「使用」部分是真实抓取的命令帮助,未逐条执行——本文不含编造的运行结果。

cmux 入门与使用:不只是 tmux 替代,而是「给 Agent 的资源客户端」

一句话:cmux 是一个终端复用器(TUI),但它的野心不止于此——它把自己定位成 terminal multiplexer and resource client:把「工作区 / 面板 / 终端 / 浏览器 / 通知 / Agent 状态」都抽象成可寻址、可 JSON 化的资源,让你(或一个 Agent)用命令行去读写它们。

它用 Rust 写成、底层是 libghostty-vt(Ghostty 的终端 VT 库),通过 npm 分发。如果你做过「让 AI 操作终端/浏览器」的事(本站 frontend-agent 手写过工具循环),cmux 提供的是现成的资源层 + CLI 接口

1. 它到底是什么

三个层次,从广告词开始理解:

层次说明
TUI 复用器像 tmux 一样:会话、工作区、面板、标签页;cmux 直接进交互界面
资源客户端(重点)cmux <scope> <action> 把终端/浏览器/通知等当资源操作;支持 --json / --jsonl
Agent 基础设施agent scope(状态上报 + hook 安装)、remote rpc(跑 workspace 里的 coding-agent 请求)、session journal(带过滤的事件日志)

和 tmux 的关键差别

tmuxcmux
主要给谁用+ Agent/脚本
输出终端画面终端画面 + JSON/JSONL
资源类型窗口/面板工作区/浏览器/标签/通知/Agent 状态
事件session journal subscribe(可按 kind/敏感度/正则过滤)

2. 安装与运行

npx cmux # 直接跑(会下载对应平台的二进制)
npm i -g cmux # 或全局安装,之后用 cmux 命令

实测版本输出(真实):

$ npx cmux --version
cmux 0.1.0 (35cbaa63ce5c2768a0f64af2cf1eeb06d719232d; ghostty 3da10da73ae848c0310e3e0f0cb29e509c2f6963)

注意这个「版本差」:npm 包版本是 0.11.0,二进制自报的是 cmux 0.1.0(后面跟 git 哈希与 ghostty 哈希)。npm 版本号是发布节奏,二进制版本是程序自身——排查问题时报 --version 的完整串即可。

它是怎么分发的(读了启动器源码)

npm 包本体很小,只有一个启动器 bin/cmux.jsNode ≥ 18):

// 平台 → 二进制包的映射(摘自 bin/cmux.js)
const PACKAGE_BY_PLATFORM = {
"darwin-arm64": "cmux-tui-darwin-arm64",
"darwin-x64": "cmux-tui-darwin-x64",
"linux-x64": "cmux-tui-linux-x64",
"linux-arm64": "cmux-tui-linux-arm64",
// win32-x64 pending: ghostty vt headers fail bindgen under mingw clang.
};

真正的程序是预编译 Rust 二进制,放在按平台拆分的 optionalDependencies 里;npm 只装匹配当前 os+cpu 的那一个,启动器负责 spawnSync 并转发 argv/stdio/退出码与信号。

由此得到两个实用结论

  • 目前只支持 macOS(arm64/x64) 与 Linux(x64/arm64)Windows 还没有(源码注释里写了原因:mingw clang 下 ghostty vt 头文件 bindgen 失败);
  • 如果你的 npm 配置跳过了可选依赖,运行会提示:platform package … is not installed. Reinstall cmux, or set npm to install optional dependencies (--include=optional)。 —— 这正是我实测时会遇到的报错文本。

3. 前提:它需要「真实终端」

这点必须先讲,否则你会以为它坏了。cmux 的 TUI 要一个真正的 TTY,我的两次实测:

# 直接在无 TTY 的环境里跑
$ npx cmux
cmux-tui: Device not configured (os error 6)

# 想在沙箱里起一个无头会话
$ npx cmux --socket /tmp/cmux-lab.sock server start
cmux-tui: Operation not permitted (os error 1)

所以你要用它,请在本地终端(iTerm/Terminal/VS Code 内置终端)里跑;本文的「使用」清单来自 --help,不是沙箱里的运行结果——这一点我不含糊。

4. 概念模型:会话 → 工作区 → 面板 → 标签

cmux 的层级(官方 --help 里的 RESOURCE SCOPES):

session(会话,默认 main;决定 socket 路径)
└─ workspace(工作区)
└─ screen(屏幕)
└─ pane(面板,可 split --right / --down)
└─ tab(标签页):terminal 或 browser

围绕它还有几个运行单元:

scope作用
server本地「durable 会话 owner」:start/status/stop/reload-config
remote远程守护进程:connect/ssh/forward/rpc/enroll/known-daemons/stop
relay通过 stdio 转发协议字节(便于被别的进程托管)
machine-agent把本地会话通过配置的 host 共享出去
client / machine看客户端与机器/路由信息

5. 使用:命令速查(摘自真实 --help

5.1 启动与连接

cmux # 起一个会话(默认 session=main)
cmux --session dev # 指定会话名(决定 socket 路径)
cmux --socket /tmp/cmux.sock # 显式指定 socket
cmux attach [OPTIONS] # 附着到会话/某个终端
cmux server start|status|stop|reload-config # 本地会话服务

5.2 把「终端」当资源操作(terminal

cmux terminal list
cmux terminal <selector> screen read # 读屏
cmux terminal <selector> screen wait --pattern <regex> --timeout-ms N # 等某个输出出现
cmux terminal <selector> write --text "ls -al" # 写入
cmux terminal <selector> keys <key...> # 发按键
cmux terminal <selector> history read | copy | process wait

screen read + screen wait --pattern 这对组合,几乎是「让 Agent 等命令跑完」的标准动作——等价于你手写循环里的「读输出、判断完成」。

5.3 工作区 / 面板 / 标签

cmux workspace list
cmux workspace create --name demo
cmux workspace <selector> run -- npm run dev # 在工作区里跑命令
cmux workspace <selector> run shell 'echo hi && pwd'
cmux pane <selector> split --right --ratio 0.3
cmux pane <selector> focus direction left
cmux tab create terminal
cmux tab create browser --url https://example.com # ★ 内置浏览器标签

5.4 浏览器也是资源(browser

cmux browser list
cmux browser <selector> navigate <url>
cmux browser <selector> back|forward|reload|activate
cmux browser <selector> key|text [OPTIONS] # 输入
cmux browser <selector> mouse|wheel --pointer-frame-seq <decimal>
cmux browser <selector> attach | close

这是 cmux 最不像 tmux 的地方:浏览器标签与终端面板是同级的「可寻址资源」,所以「让 Agent 开个网页、点一下、读结果」是原生能力。

5.5 给 Agent 用:agent scope 与 JSON 输出

cmux agent list
cmux agent report --terminal <selector> --state <value> --source <value>
cmux agent hook install|uninstall|status [provider...]
cmux agent hook emit --source <agent> --event <native-event> [--terminal <id>]

# 全局开关:让一切可编程
cmux --json workspace list # 一条 JSON 结果
cmux --jsonl session <sel> journal subscribe # 每行一个事件
cmux --quiet ... # 只关心退出码/副作用时

再加 session journal subscribe(支持 --kinds/--classes/--subjects/--regex/--max-sensitivity 过滤)——一个带过滤能力的事件流,适合做「Agent 行为审计/回放」。

6. 什么时候值得用它

  • 你在做「会操作终端/浏览器」的 Agent:与其自己 child_process + Playwright 拼,不如把 cmux 当资源层,用 --json 编排;
  • 你想让远程/多机会话统一管理remote connect/ssh/forward + server 的 durable session;
  • 你只想要一个好用的 TUI 复用器:也能用,但要接受它「概念比 tmux 多」。

什么时候不必:只想要最简单终端复用 → tmux/zellij 更成熟;只做浏览器自动化 → Playwright 更直接。

7. 坑与注意(实测/源码得来)

  1. 必须有 TTY:无 TTY 报 Device not configured (os error 6);受限环境报 Operation not permitted (os error 1)
  2. 平台限制:仅 macOS/Linux(Windows pending);跳过 optionalDependencies 会启动失败;
  3. npm 版本 ≠ 二进制版本(0.11.0 vs 0.1.0),报版本时给完整串;
  4. 概念比 tmux 多:workspace/screen/pane/tab 四层 + 资源 scope,建议先 cmux --helpcmux <scope> --help 逐步探索(本文的清单就是这么来的)。

关联

  • 自己做 Agent 工具循环的对照:frontend-agent 系列screen wait --pattern 对应的就是「读输出判断完成」)
  • 工具协议视角:MCP 入门(cmux 的 relay/stdio 转发也是同类思路)

参考