6 个终端挤一个窗口:umux 1.0.4 试了三天

痛点比工具先到

我桌面上常年挂着 5-6 个终端窗口:一个跑 dev server、一个挂着 SSH 进 NAS、一个丢着本地模型、两个分给不同项目的 AI Agent 干活。任务栏图标点开找半天,偶尔一个 agent 跑完了,我过了二十分钟才发现它在等确认。

tmux 能解决前半个问题,但它有自己的 prefix 键和配置语法,组里要带新人熟悉这套东西成本不低;我也用过几个图形化的终端分屏工具,要么是 macOS only、要么作者已经半年没动过。看到 umux 的描述——”一个窗口里管所有终端,AI Agent 跑完自动弹通知”——就直接装了。

devto

它干了什么

umux 是 Crystal Studio 这个月才开源的项目(GitHub: CrystalPlatforms/umux,MIT,v1.0.4,2026-08-31 发布),跨 Linux / Windows / macOS 三个平台原生构建,技术栈是 Tauri v2 —— Rust 后端 + React/TypeScript 前端,终端渲染用 xterm.js。布局模型很直白:

  • Workspace(工作空间):一个项目一个窗口,关掉重开能恢复
  • Tab(标签页):工作空间里的子窗口
  • Panel(面板):tab 里再切分屏,无限分,有最小尺寸兜底防止压成 0

本地面板和 SSH 面板在程序里是同一种东西——都是 PTY,只不过一个跑本地 shell、一个连远端机。这个抽象很干净,不用为远程会话单独建一套 UI。

github

真正让我留下来的,是 AI 完成通知

Claude Code、Codex、Gemini CLI、Aider 这类工具跑长任务时,会往终端输出里塞标准的 OSC 转义序列(OSC 9、OSC 99、OSC 777),用特定的字节流告诉外部”我干完了”。umux 在 PTY 输出流里塞了个小解析器,认到这些序列就触发两件事:

  1. 系统级桌面通知弹出来(哪怕窗口被遮住、我在看别的屏幕也能看到)
  2. 面板上的状态指示从 working 切到 needs-attention,agent 空闲后变 idle

判断状态靠 escape 序列和进程名,不读终端内容——这点我挺在意,工具不应该去解析我 shell 里打的字。实测一个 agent 跑了 12 分钟,期间我切去干别的,回来通知已经弹过;点回面板看到状态是 idle,确认任务完成。整个流程没让我”等”过。

几个让我惊喜的小设计

从 cmux 一键导入:cmux 是 macOS only 的同类工具,做得不错但被平台锁死。umux 提供 umux import cmux 命令,--dry-run 先打印预览计划再执行;命名冲突自动加 from cmux 后缀,不覆盖 cmux 自己的状态文件。herdr 的导入在 roadmap 里。

CLI 装到 ~/.local/bin:装桌面应用的同时顺带把 umux 命令塞到 PATH,能用命令行直接 listnewrenamesplitexport 工作空间。cron 任务想发通知也能调 umux notify。不过 CLI 当前不能控制正在运行的桌面 app,这个限制 v1.0.4 的文档明确写了。

应用内自更新:启动时检查 GitHub Releases,下载、minisign 验签、重启,一气呵成。整个项目预算 0 美元——build 用 GitHub Actions、landing page 放 Cloudflare Pages、CDN 用 GitHub 自带的分发。作者说代码签名证书要钱所以 installer 故意留成未签名(macOS 第一次要右键打开,Windows 走 SmartScreen 的”仍要运行”),但 update bundle 带 minisign 签名防中间人篡改。

install.sh 写得相当认真:213 行 POSIX sh,自带 Vitest 测试套件——102 行测试用 --dry-run 在沙箱里反复跑,验证它在不同平台上的解析逻辑(GitHub API 返回里 release tag 带 v 前缀、asset 文件名不带,这种细节都有 case 守护)。我在 macOS 上跑了一遍实际安装路径,.dmg mount 出来把二进制拷到 /Applications 是 OK 的。

三个不太行的地方

Agent 状态判断还很粗糙。完成通知这一块做得扎实(OSC 序列识别是稳的),但面板上的 working / needs-attention / idle 状态切换有边缘 case——比如某些 agent 在等用户输入时也会被识别成 idle,需要肉眼二次确认。作者在 v1.0.4 的 release notes 里也承认这是 app 里”最毛糙”的功能。

Wayland 是参考平台,X11 没测过。Linux 发行版如果还在用 X11(比如某些老的远程桌面环境),可能会有渲染怪问题。Wayland 用户暂时没碰到坑。

cmux 导入在 Windows 上还没实现,只通了 macOS 和 Linux。Windows 用户想从 cmux 迁过来还得等。

数字和定位

v1.0.4 跑 722 个自动化测试(540 前端 + 178 Rust,后端测试在 v1.0.2 时只有 115 个,可见这一个月的迭代密度)。TypeScript 占 63.5%、Rust 30.8%,代码量不小但组织清晰。仓库目前还很小(提交 70 多、主要贡献者就一人),没有大社区背书,属于”个人作者认真做”的形态。下一个目标 v1.3.0 会加 TUI 终端界面——终端里嵌终端,纯键盘党狂喜。

如果你已经被一堆终端窗口和一个永远在后台转的 agent 折腾过,可以装一个试试。macOS 第一次会弹”未签名应用”的提示,右键打开一次就解锁了;Linux 直接装 .deb.AppImage 都行。

项目主页:https://umux.pages.dev
GitHub:https://github.com/CrystalPlatforms/umux

发表评论