Skip to content

f1974939505/tmuxes

Repository files navigation

🖥️ tmuxes

简体中文English

一个浏览器标签页,掌控一整群 CLI coding agent。

Claude Code · Codex · OpenCode · Hermes —— 每个 agent 独占一个 tmux 会话, 横跨 本地 · SSH · WSL,还自带每个 agent 工作目录的文件浏览器。

🔔 Claude Code / Codex 结束运行、异常停止或需要决策时,浏览器会自动提醒你 —— 侧边栏红/绿状态点 +「结束 / 决策 / 错误」提示 + 提示音 + 后台标签页标题闪烁。再也不用挨个窗格去盯「它还在跑吗」。

npm version platform React TypeScript Node.js Vite tmux xterm.js

🔒 仅本机 · ⚡ 一键启动 · 🔔 agent hook 提醒 · 🪟 Windows 上直通 WSL · 🧩 零配置


为什么做这个? 现代编码 agent 都是常驻的终端进程。同时跑好几个,你就开始在一堆窗格、SSH 窗口之间手忙脚乱: 「等等,刚那个是在哪台机器上来着?」tmuxes 把它们全塞进一个清爽的网页 UI: 开一个会话、丢进文件夹、看它干活、顺手瞄一眼它正在改的文件 —— 本地还是远程,都是同一个视图。

✨ 特性亮点

🧠 为 agent 而生 每个 agent 独占一个 tmux 会话。新建时可带初始命令(比如 claudecodex),选中后右侧就是一个完全可交互的实时终端
🔔 结束 / 决策 / 错误提醒 新建会话时初始命令是 claudecodex 会自动接入官方 lifecycle hooks。也可以先进入空 session cd 到目标目录,再点终端右上角的 claude / codex 按钮启动带 hook 的 agent。已展开目标每 5 秒同步一次:红点表示 agent 正在运行,绿点表示已结束、异常停止或正在等你决策;结束运行、需要决策和异常停止会显示不同提示。
🌐 本地 · SSH · WSL · 原生 Windows 一个侧边栏同时列出你的本机、~/.ssh/config 里的主机、(Windows 上)你的 WSL 发行版,以及(Windows)原生 PowerShell / cmd 会话 —— 全部并排排开。
🗂️ 文件夹树 像资源管理器一样,把会话拖进可拖拽的文件夹里整理。按目标分别持久化到本地。
📂 实时文件浏览 + 编辑 侧边栏底部跟随每个会话的工作目录 —— 点一个代码文件就能把终端一分为二,在下面直接读和改(可保存、撤销/重做)。
🔁 真·多端同步 基于原生 tmux attach:同一个会话开两个标签页,逐键同步、互为镜像。
⚙️ 可调 侧边栏、终端、文件查看器的字号都能调,实时生效、刷新后仍保留。
🚀 一键启动 双击 start.cmd / start.command / start.sh → 自动构建、启动、打开浏览器。

🖼️ 长这样

tmuxes 截图 —— 一个标签页掌控一群 CLI agent

🏗️ 架构

                          REST  (create · list · rename · kill · cwd · files)
  ┌────────────┐   ┌──────────────────────┐        ┌──────────────────────────────────┐
  │  Browser   │──▶│  Node · Express · ws │──pty──▶│ tmux                  (Linux/macOS)│
  │  xterm.js  │◀──│        node-pty      │──pty──▶│ ssh -tt user@host → tmux   (remote)│
  └────────────┘   └──────────────────────┘──pty──▶│ wsl.exe -d <distro> → tmux (Windows)│
        ▲   binary bytes ⇄ WebSocket ⇄ JSON control └──────────────────────────────────┘
  • client/ —— React + Vite + TypeScript,终端基于 @xterm/xterm
  • server/ —— Node + Express + ws + node-pty。一个小型 REST API 跑短命的 tmux 管理命令;单个 WebSocket 端点负责交互式 attach 的流式传输。

Windows 上没有原生 tmux? 没问题。服务端原生运行(node-pty 用 ConPTY),通过 wsl.exe 直通你 WSL 发行版里的 tmux。Linux/macOS 上则直接和本地 tmux 通信。远程主机用系统 ssh 二进制,复用你已有的 ~/.ssh 密钥 / ssh-agent —— 绝不存储任何密码。

📦 用 npm 安装

建议直接用 @latest,这样能拿到最新的修复包。tmuxes 是单用户本机工具,启动后只监听 127.0.0.1

# 先验证 npm 包入口:
npx --yes tmuxes@latest --help

# 一键运行(无需克隆,默认自动开浏览器):
npx --yes tmuxes@latest

# 或全局安装后用 tmuxes 命令:
npm install -g tmuxes
tmuxes                       # → http://127.0.0.1:7420

# 常用参数:
tmuxes --port 8080 --no-open

如果 Windows 上 npx 失败,先确认:

  • node -v22.12+ 且 <23npm -v10+
  • 使用的是官方 npm registry,且没有旧缓存污染;必要时先跑 npm cache verify 再重试。
  • 你要连接的机器/主机上已经装好 tmux。Linux 上 node-pty 需要现场编译,先装 build-essential + python3;Windows / macOS 使用预编译二进制。

🚀 从源码一键启动(开发用)

系统怎么做
🪟 Windows 11双击 start.cmd(或在 Windows Terminal 里运行)。自动装依赖、构建、启动服务,并打开 http://127.0.0.1:7420。你的 WSL 发行版会出现在侧边栏。
🍎 macOS在访达里双击 start.command (首次:右键 → 打开,绕过 Gatekeeper)
🐧 Linux运行 ./start.sh

🔧 手动运行

npm install            # node-pty:Win/macOS 有预编译,Linux 从源码编译

# 开发 —— Vite 开发服务器 + API,带热更新:
npm run dev            # → http://localhost:5173

# 生产 —— 构建客户端,由单进程统一服务:
npm run build
npm start              # → http://localhost:7420   (设 TMUXES_OPEN=1 可自动打开浏览器)

🔔 启动带 hook 的 Claude Code / Codex

tmuxes 目前会给 Claude Code (claude)Codex (codex) 自动接入官方 lifecycle hooks,用来判断 agent 是正在运行、已经结束、异常停止,还是正在等你做决策。

两种用法:

  1. 新建 session 时,在初始命令里直接填 claudecodex
  2. 先新建空 session,进入后在终端里 cd /你的目标目录,再点终端右上角的 claude / codex 按钮。

状态含义:

  • 红点:agent 正在运行。
  • 绿点:agent 已结束、异常停止、正在等你决策,或这个 session 没接入 agent hook。
  • 结束 badge:本轮运行结束。
  • 决策 badge:agent 正在等待权限确认或用户输入。Codex 开启 approvals_reviewer = "auto_review" / Approve for me 时,普通审批请求会交给 Codex 自动 reviewer,不会被误判成需要你手动决策。
  • 错误 badge:agent 异常停止,例如 Codex 断流但没有触发 stop hook。tmuxes 会在已展开目标的 5 秒同步里扫描 running agent 的 pane 尾部并把这类错误纠正为提醒状态。

注意:右上角按钮本质上是向当前 tmux pane 发送一条带 hook 的 claude / codex 命令。不要在当前 pane 里已有程序正在接收输入时点击它。裸 cc 常常是系统 C 编译器,tmuxes 不会默认把它当作 Claude Code。原生 Windows shell 没有 tmux session option,因此不支持这套 hook 状态。

🧩 目标(Targets)

  • 本地 (Linux/macOS) —— 你机器上的 tmux。Windows 上不显示。

  • Windows 本机终端 (Windows) —— 服务端用 ConPTY 直接开 PowerShell / cmd 等本机 shell(自动探测 pwshpowershellcmd → Git Bash),新建时可在下拉里选 shell。会话随服务端进程存活(刷新 / 重连 / 多标签都不丢,重启服务端会丢);这类会话没有 tmux 工作目录,故隐藏底部文件浏览器。

  • WSL 发行版 (Windows) —— 通过 wsl.exe -l -q 自动发现;每个发行版一个目标。发行版里必须装了 tmux。

  • SSH 主机 —— 从你的 ~/.ssh/configHost 条目里发现(跳过通配符)。也可显式添加:

    TMUXES_HOSTS="alice@web1,bob@db2:2222" npm run dev      # Linux / macOS
    set TMUXES_HOSTS=alice@web1,bob@db2:2222 && npm run dev # Windows cmd

    密钥 / agent 认证必须在普通 shell 里已经能用。全新主机请先在普通终端里接受一次它的 host key。为避免短命管理命令反复新建 SSH 连接,类 Unix 平台会通过 OpenSSH ControlMaster / ControlPersist 长期复用同一条 SSH 连接;原生 Windows 则由 tmuxes 维护一条应用层 SSH 管理长连接,不使用 Windows OpenSSH mux socket,避免 getsockname failed: Not a socket。tmuxes 不再强制设置 ServerAliveInterval,如需保活请按所在平台规则写进你自己的 ~/.ssh/config。如果复用 / 管理连接中断,tmuxes 会自动重建并重试一次;仍失败时会在前端页面提示并暂停该 SSH 目标的自动轮询,点击 Reconnect 可手动再试一次。

💻 环境要求

所有平台都需要 Node 22.12+(项目版本文件固定为 22.22.2)和 npm 10+。其余:

🪟 Windows 11
  • WSL2 且至少一个发行版,并在其中装好 tmuxsudo apt install tmux)。
  • 内置的 OpenSSH 客户端覆盖 SSH 目标。
  • node-pty 提供预编译 Windows 二进制 —— 不需要编译器。
🍎 macOS
  • tmuxPATH 上(brew install tmux)。
  • node-pty 提供预编译 darwin 二进制
  • 从访达启动却找不到 tmux?确保 Homebrew 的 bin 目录在 GUI 的 PATH 里。
🐧 Linux
  • tmux,外加给 node-pty 的 C/C++ 工具链 + Python 3(没有 Linux 预编译 —— 安装时现场编译):
    sudo apt-get install -y build-essential python3 tmux
  • WSL 小坑:node-gyp 会用 PATH 上的任意 python3。如果坏掉的 conda Python 把构建搞挂了:
    npm config set python /usr/bin/python3
(备选)把服务端跑在 WSL 内部

在 Windows 上,你也可以把整个服务端跑在 WSL 内部(像 Linux 一样),然后在 Windows 上开浏览器 —— WSL2 会转发 localhost。一键启动脚本用的是「原生 Windows + wsl.exe」方案,这样能在一个地方同时覆盖 SSH 目标和多个发行版。

🔒 安全

⚠️ tmuxes 会把完整的 shell 访问权交给任何能连上它的人。 它是一个单用户、仅本机的开发工具。

设计上它:

  • 只绑定 127.0.0.1 —— 绑定地址在运行时不可配置,
  • 没有任何认证
  • 从不起 shell(argv 数组 + shell:false),并对每个输入做白名单校验,
  • 拒绝 Origin 非 localhost 的 WebSocket 升级(防 DNS-rebind),
  • 把文件浏览器 / 编辑器限制在所选 tmux 会话的当前工作目录之内。

请勿对它做反向代理、隧道、端口转发,或暴露到 0.0.0.0。机器上任何本地用户都能用它。

🧪 测试

npm test   # vitest:输入校验、列表解析、ssh/tmux/wsl 的 argv 形状

🐧 tmux 速查表

tmux 的「前缀键」默认是 Ctrl+b(下面记作 C-b)—— 先按它,松开,再按后面的键。 在网页终端里最常用的是滚动 / 复制模式(往上看历史输出、复制文字)。

滚动 & 复制(最常用)

操作 按键
进入复制 / 滚动模式 C-b 然后 [
在模式里上下翻 ↑ ↓PageUp / PageDown
开始选择 → 复制 Space 定起点 → 移动光标选中 → Enter 复制
把复制的内容粘回来 C-b 然后 ]
在模式里搜索 C-s 向前 / C-r 向后(默认 emacs 风格)
退出复制 / 滚动模式 q
开鼠标滚轮(直接滚轮翻 + 鼠标选) 执行 tmux set -g mouse on,或写进 ~/.tmux.conf
按住 Shift 用鼠标(绕过 tmux 鼠标模式) 按住 Shift 拖动选中文字 → 浏览器右键「复制」;右键「粘贴」

提示:开了 mouse on 后鼠标归 tmux 管;想用浏览器原生的框选 + 右键复制粘贴,按住 Shift 再拖动 / 右键即可。

提示:在 tmuxes 里新建 / 选择 / 重命名 / 杀会话直接点 UI 就行,不用记命令;但往上滚看历史、复制文字、拆面板这些是 tmux 自己的功能,得用上面的快捷键。

❓ 常见问题

某个集群里 tmux 的中文(或其它非 ASCII 字符)全变成了下划线 _?

那台机器的登录 locale 不是 UTF-8(HPC 登录节点很常见,LANG=C / POSIX),于是 tmux 进入非 UTF-8 模式,把每个多字节字符用 _ 占位。在那台机器上修:

  1. 设一个 UTF-8 locale —— 先看哪些可用,再写进 ~/.bashrc / ~/.zshrc:
    locale -a | grep -i utf          # 看有哪些(C.UTF-8 / en_US.UTF-8 / zh_CN.UTF-8 …)
    echo 'export LANG=C.UTF-8' >> ~/.bashrc   # 换成上面真实存在的那个
  2. 重启该机器上的 tmux 服务,让会话以 UTF-8 重新创建:
    tmux kill-server
  3. 回到 tmuxes 重新连接 / 新建会话即可。

⚠️ pane 的 UTF-8 模式在创建时就定死了 —— 只改 locale 不重启 server 的话,已经变成下划线的旧会话不会自动恢复,必须重建。

📋 更新日志

0.1.12

  • Codex auto-review 提醒修复:Codex 开启 approvals_reviewer = "auto_review" / Approve for me 时,审批请求会保持 running 状态,不再误触发 决策 badge、提示音或后台标签页闪烁;人工审批配置仍会正常提醒。

0.1.11

  • 文档 / 发布规范:补齐 npm 发布检查流程,明确只发布 server workspace,发布前后都要验证 npx / npm exec 入口和本机启动 smoke test。
  • 安全约束:发布流程不得提交或粘贴 .npmrc token、NPM_TOKEN、SSH 私钥、一次性验证码或任何个人凭据。
  • README 重整:安装说明加入 npx --help 验证、Windows 排错提示,并压缩早期版本更新。

0.1.10

  • 发布修正:重新发布 npm latest 包,确认线上 tmuxes bin、前端 public 资源和 npx tmuxes@latest 入口可用。

0.1.9

  • 修复: Windows SSH 原生管理命令改用应用层长连接。避免 Windows OpenSSH ControlMaster mux socket 的 getsockname failed: Not a socket,同时避免短命管理命令反复新建 SSH 连接。
  • 改进: 文件浏览器合并远端目录刷新。一次远端调用同时读取 pane 工作目录、校验路径并列目录,减少 SSH 管理流量。

0.1.0 - 0.1.8

  • 早期功能成型:完成本地 / SSH / WSL / Windows shell 目标、tmux attach 多端同步、拖拽文件夹树、工作目录文件浏览与编辑。
  • agent 提醒演进:从活动转静止提醒升级到 Claude Code / Codex 官方 lifecycle hooks,支持结束、决策和异常停止状态。
  • Windows / SSH 稳定性:修复 ConPTY 下 Ctrl+C 退出、恢复浏览器原生右键,并将 SSH 管理命令改为长期复用连接且中断后只自动重试一次。
用 React、TypeScript、node-pty & xterm.js 打造 —— 外加大量 tmux。盯娃愉快。🤖

🧑‍🔬 关于作者

嗨,我是这个项目的作者 👋

中国科学技术大学(USTC)理论物理在读博士,白天的日常是和多体场论可解释的费米超流理论(这玩意是用来研究和解释高温超导的),还有一大坨高性能数值计算代码贴身肉搏 ⚛️。

这个小工具其实是被一堆 agent 终端搞到头大之后的「自救产物」—— 既然每天都要盯一群 CLI agent 干活,那干脆给它们造个顺手的指挥台 😎。

如果你也对这些感兴趣(物理也好、代码也好),或者想一起折腾这个开源项目,随时来找我玩 📮

📧 junruwu@mail.ustc.edu.cn

About

Local-first web command center for Claude Code, Codex, OpenCode and other CLI coding agents. Run agents in tmux across local, SSH and WSL, with notifications and file view.

Topics

Resources

License

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages