断线不丢、任务一目了然、脱离 IDE 的远程开发驾驶舱 —— mosh + tmux + 一个换肤的 fzf 任务控制台。
把 SSH 进开发机的日常收敛成几条直觉命令,并解决三个老痛点:
- 断线丢窗口 ——
mosh抗断网 +tmux常驻会话,合盖、换网、断 Wi-Fi 回来原样还在。 - 并行任务记不清 —— 一个任务 = 一个 tmux 会话;
Ctrl-b空格 弹出可视化任务选择器(选/建/删/实时预览),状态栏常驻当前任务名。 - 离不开 IDE —— 端口转发做成命令 + 可视化控制台(
devport),不再依赖 IDE 的转发面板。
外加一套 8 款主题(EVA MAGI / 赛博朋克2077 / 攻壳机动队 / 黑客帝国 / 阿基拉 / 银翼杀手 / TRON / 辐射 Pip-Boy),状态栏带按主题渲染的动画进度条与额度条,一键预览切换。
装之前先确认这 4 条——它们是你的环境要提供的,devdeck 不负责(也搬不过来):
- 本机已经能
ssh <开发机>连上。 这是最大前提。认证方式(密钥 / 密码 / Kerberos / 跳板机)是你自己的事,devdeck 不掺和——只要ssh <开发机> echo ok能通就行。连不上请先解决登录。 - 依赖装好。 开发机:
tmux≥3.3、fzf≥0.38、bash、python3(额度条用)、ss(列端口用)。本机:mosh、fzf、ssh、lsof。安装脚本会检查并报缺;macOS 上能自动brew install,Linux 上需你用包管理器装。 - 终端够格。 用支持真彩色 + OSC52 的终端(Ghostty / iTerm2 / WezTerm 等),否则主题配色和复制会不正常。
devall默认找 Ghostty,用别的终端改devcmds.zsh里一行即可。 - 这是两台机器的事。 开发机跑
install-server.sh,本机跑install-client.sh,不是单机一键。
一句话:有一台能 ssh 上去的开发机 + 一个像样的终端,就能装;连 ssh 都没通的话先弄登录。
开发机(server) 本机/笔记本(client)
───────────────── ────────────────────
~/.local/bin/devtheme 主题引擎(8套) ~/.devcmds.zsh dev/devall/fwd/devport/devsync...
~/.local/bin/tpick 任务选择器 ~/.devport 端口转发控制台
~/.local/bin/rlbar 额度进度条 ~/.devdeck.conf 开发机地址(DEVHOST)
~/.tmux.conf tmux + 主题挂载
~/.claude/statusline.sh 写额度数据(可选)
~/devcmds.zsh ~/devport.sh 命令源(供客户端 devsync 拉取)
连接层用 mosh(抗断线);端口转发单独走一条 SSH ControlMaster(mosh 不支持转发)。
- 开发机:
tmux≥ 3.3、fzf≥ 0.38、bash、常规 coreutils;ss(iproute2,给 devport 列端口用);python3(仅 statusline 额度条需要)。 - 本机:
mosh、fzf、ssh、lsof(devport 用;macOS 自带)。终端推荐能透传真彩 + OSC52 的(Ghostty / iTerm2 / WezTerm 等)。
前提:本机已经能
ssh <开发机>连上。认证方式是你自己的事(密钥 / 密码 / Kerberos / 跳板…),devdeck 不掺和认证,只要 ssh 能通即可。
# 在两台机器上都把仓库拿到(或至少开发机)
git clone <this-repo> devdeck
# ① 开发机上
cd devdeck && bash install-server.sh
# ② 本机上(会问你开发机地址,写进 ~/.devdeck.conf)
cd devdeck && bash install-client.sh装完开个新终端:
dev # 连开发机 + 弹任务选择器没法在开发机上 clone?把仓库
server/内容手动拷过去也行;或在本机 clone 后用scp -r devdeck/server <开发机>:再到开发机跑install-server.sh。
| 命令 | 作用 |
|---|---|
dev |
连开发机并弹任务选择器(fzf) |
dev <名字> |
直达 / 新建名为 <名字> 的任务会话 |
devall |
为每个任务各开一个本机终端窗口(默认 Ghostty) |
fwd <端口> [本机端口] |
转发开发机端口到本机(会记住,断线/重开窗口自动恢复) |
unfwd <端口> |
取消某条转发(并从记录里删除) |
fwdstop |
断开转发连接(保留记录,可恢复) |
fwdrestore |
手动重连所有记住的转发 |
fwdclear |
清空转发记录(以后不再自动恢复) |
devport |
端口转发可视化控制台(空格 开/关) |
devtheme |
弹主题预览选择器;devtheme <名> 直接切 |
devsync |
从开发机同步最新命令文件 |
端口转发自动恢复:转发走的是独立 SSH 隧道(mosh 不支持转发),断网/休眠会断开。devdeck 把开过的转发记到
~/.devfwd,新开窗口时若隧道已断会后台静默重连,不用手动重开。
tmux 内:Ctrl-b 然后 空格 = 任务选择器;Ctrl-b T = 主题选择器;Ctrl-b m = 临时开关鼠标。
复制:按住 Shift 拖选(走终端原生选择 → 系统剪贴板)。
devtheme # 预览选择器,↑↓ 看效果,Enter 应用
devtheme cyber # 直接切
devtheme show # 列出全部8 款:magi(EVA)· cyber(2077)· ghost(攻壳)· matrix(黑客帝国)· akira(阿基拉)· blade(银翼杀手)· tron · pipboy(辐射)。每套都有自己的配色、fzf 边框、状态栏徽标,以及一条按主题做花活的动画进度条(八级子格 / 故障闪烁 / 代码雨 / 能量搏动 / 光扫 / 光迹 / CRT 扫描线…),靠 tmux 每秒刷新驱动。
进度条的数据来自 Claude Code 的 statusline。把它挂上即可,在开发机 ~/.claude/settings.json:
{ "statusLine": { "type": "command", "command": "~/.claude/statusline.sh" } }statusline.sh 会把 5h/7d 额度写到 /tmp/claude_ratelimit,tmux 状态栏右侧的 rlbar 据此按当前主题渲染进度条 + 刷新倒计时。不挂也不影响其它功能,只是状态栏没有额度条。
让每个终端 tab 的标题显示当前对话状态,扫一眼就知道哪个在跑、哪个等你:
| 灯 | 含义 |
|---|---|
| ⏳ | 正在跑 |
| ✅ | 答完了,轮到你 |
| 卡住,待你确认/授权 | |
| 💤 | 就绪 |
原理:tmux set-titles(已在 tmux.conf)把会话变量 @claude_status 透传成终端标题;Claude Code 的 hooks 在状态切换时调用 ~/.local/bin/claude-tmux-status 写入。启用:把 server/claude-hooks.example.json 里的 4 个 hooks 合并进 ~/.claude/settings.json(已有 hooks 就并入,别整体覆盖)。tab 标题即变成 ✅ 任务名。想换图标改 claude-tmux-status 里那张表。
mosh 会给标题加
[mosh]前缀;dev/devall已用MOSH_TITLE_NOPREFIX=1去掉。
- 开发机地址:
~/.devdeck.conf里的DEVHOST。 - 隐藏会话:名字以
_开头的 tmux 会话不会出现在选择器 /devall里(适合放后台杂活)。 devall的终端:默认找ghostty;改devcmds.zsh里devall()的gh=...换成 iTerm/WezTerm 等。- UI 语言:界面文案是中文,集中在
server/bin/devtheme(主题文案)、tpick、devport.sh、statusline.sh,按需替换。
mosh不支持端口转发,所以转发单独走 SSH ControlMaster(socket~/.ssh/cm-dev)——首次转发会单独认证一次。- OSC52 剪贴板不经
mosh透传,所以复制用终端原生Shift+拖。 tpick/devport的 fzf 用了--border=sharp、--border-label等;fzf < 0.38 可能不支持部分参数。
devdeck/
├── install-server.sh # 开发机安装
├── install-client.sh # 本机安装
├── devdeck.conf.example # 客户端配置样例
├── server/
│ ├── bin/{devtheme,rlbar,tpick,claude-tmux-status}
│ ├── tmux.conf
│ ├── claude-hooks.example.json
│ └── statusline.sh
└── client/
├── devcmds.zsh
└── devport.sh
MIT,见 LICENSE。