with one click
tmux-serv
使用全局 ~/.tmux.services 管理多个项目的常驻服务。支持注册、启动、精确重启、停止、查看状态与日志
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
使用全局 ~/.tmux.services 管理多个项目的常驻服务。支持注册、启动、精确重启、停止、查看状态与日志
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
启动 mock-ollama,将 OpenAI Chat Completions、Anthropic Messages、OpenAI Responses 三种协议代理到真实 LLM,并为 Claude Code、Codex/GPT-5.6 与 Cursor 提供本地接入和协议桥接。触发词:mock-ollama、启动 ollama mock、Claude 接第三方模型、Codex 接第三方模型、GPT-5.6 代理、Cursor BYOK、监控 LLM 请求
将回复生成 MP3 语音并通过 QQ 发送。用户要求语音回复、音频回复、朗读、“语音回复”、“发语音”、“读给我听”,或希望答案以语音形式交付时使用
用 Playwright 将网页或本地 HTML 渲染为高清 PNG 截图,支持全页、视口、分辨率和加载等待控制。用户提到 html-cut、cut-html、网页截图、HTML 截图、网页转 PNG、全页长截图时使用。
创建、定制并运行零依赖的临时局域网聊天室,支持浏览器聊天、文件传输、粘贴图片与桌面/移动端响应式布局。用户需要局域网聊天页、临时 Wi-Fi 文件共享,或修改内置聊天 UI 时使用。
把 Markdown 文件渲染成手机友好的 HTML,再调用 html-cut 截图为高清 PNG。用户提到 md-to-png、md 转 png、md 截图、把 md 发到手机看时使用。
当用户需要切换会话并交接任务时使用,生成可视化交接文档,确保新会话能无缝继承工作目标
| name | tmux-serv |
| description | 使用全局 ~/.tmux.services 管理多个项目的常驻服务。支持注册、启动、精确重启、停止、查看状态与日志 |
| version | 1.0.0 |
| dependencies | ["tmux"] |
| repository | https://github.com/gitByEOS/open-part-skills |
用一个可执行的 ~/.tmux.services 管理多项目服务;每个项目只维护自己的前台 launcher。
~/.tmux.services # 全局清单与 tmux 生命周期
~/dev/project-a/tools/start_ocr_server.sh
~/dev/project-b/tools/start_chat_server.sh
服务名全局唯一时直接用 <name>,session 为 serv-<name>;只有重名时才用 <project>/<name>,session 为 serv-<project>-<name>。
需要 Bash 3.2+ 与 tmux:
brew install tmux # macOS
# apt install tmux # Debian / Ubuntu
先将本 skill 的绝对目录记为 SKILL_ROOT:
SKILL_ROOT="<tmux-serv skill 的绝对路径>"
bash "$SKILL_ROOT/scripts/install.sh"
首次安装写入 ~/.tmux.services 并设为 0700。目标已存在时安装器拒绝覆盖。
隔离/测试场景可指定自定义目标路径,不写入 ~/.tmux.services,目标已存在时同样拒绝覆盖:
bash "$SKILL_ROOT/scripts/install.sh" --target /path/to/.tmux.services
升级模板:
bash "$SKILL_ROOT/scripts/install.sh" --upgrade
升级只保留以下标记之间的用户服务区,用新版替换其余引擎,且先创建带时间戳的 .bak 备份:
# >>> tmux-serv user services >>>
# <<< tmux-serv user services <<<
如果标记缺失、重复,或合并结果校验失败,安装器拒绝修改。安装器只清理自身临时合并文件,不删除用户配置或备份。不要手工改标记之外的引擎;复杂定制应保留自己的 fork。
每个服务一个项目内脚本,直接放在项目根的 tools/ 下:
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT_DIR"
exec env PORT="${API_PORT:-3000}" node server.js
Python 服务示例:
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT_DIR"
# 优先用项目内 venv,没有则回落到系统 python
if [[ -x ".venv/bin/python" ]]; then
PY=".venv/bin/python"
else
PY="python3"
fi
exec env \
PORT="${API_PORT:-8000}" \
HOST="${API_HOST:-127.0.0.1}" \
"$PY" -m app.main
若是 uv 管理的项目,可简化为:
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
cd "$ROOT_DIR"
exec env PORT="${API_PORT:-8000}" uv run python -m app.main
必须满足:
<project>/tools/,存在且可执行nohup、尾随 & 或自身 daemonizeexec 前台主进程;依赖、端口、参数与环境默认值归项目维护~/.tmux.services;由项目的安全配置或进程环境提供只编辑 ~/.tmux.services 的用户服务区:
configure_services() {
start_service "project-a" "ocr" \
"$HOME/dev/project-a/tools/start_ocr_server.sh"
start_service "project-b" "chat-room" \
"$HOME/dev/project-b/tools/start_chat_server.sh"
}
start_service 恰好接收三个参数:
| 参数 | 规则 |
|---|---|
project | 1–40 位小写字母、数字、单连字符;禁止首尾连字符与 -- |
service | 同上;只需在项目内唯一 |
launcher | 绝对路径或 ~/ 路径;允许空格,必须直接位于项目 tools/ |
project/service 复合键必须唯一。若 service 在全表唯一,CLI 直接用 service,session 为 serv-<name>;若重名,则必须用 project/service,session 为 serv-<project>-<name>。新增第二个同名服务会改变原服务的派生 session,旧 serv-<name> 不会被自动停止;应先确认归属并精确停止,再逐项启动新 session。注册表是可执行 Shell,只能安装和编辑自己信任的内容;包括 --check、--status 在内的调用都会执行配置区来加载条目,但只有启动或重启才执行 launcher。
注册后先校验,不启动服务:
~/.tmux.services --check
# 仅补启动全部缺失服务;已有 session 不动
~/.tmux.services
# service 唯一时直接使用短名
~/.tmux.services chat-room
~/.tmux.services --restart chat-room
# 只有重名时才带项目名
~/.tmux.services project-a/api
~/.tmux.services --restart project-a/api
# 明确要求时才重启全部;非事务操作,失败不会回滚前项
~/.tmux.services --restart-all
# 查看全部或单项状态
~/.tmux.services --status
~/.tmux.services --status chat-room
# 最近 200 行、附着、精确停止
~/.tmux.services --logs chat-room
~/.tmux.services --attach chat-room
~/.tmux.services --stop chat-room
所有存在性检查、停止和操作目标都使用 tmux 的 =<session> 精确匹配。启动后的 1 秒稳定窗口内若 session 消失,命令返回 70 并提示直接运行 launcher 排查;这不是端口或 HTTP 健康检查。
--restart-all 才全量重启source 外部配置,不 eval 服务命令;总脚本直接执行已注册 launchertools/ 外入口--status 只列注册服务,不扫描或操作其他 serv- sessionTMUX_SERV_SOCKET_NAME 可切换独立 tmux server;日常不要设置。该变量需在调用 ~/.tmux.services 前 export,写入配置文件无效;所有 tmux 验收命令必须带 -L "$TMUX_SERV_SOCKET_NAME" 才能命中隔离 server| 退出码 | 含义 |
|---|---|
0 | 操作完成,含“已运行/未运行所以跳过” |
64 | 参数、名称或注册配置错误 |
66 | launcher 缺失、不可执行或路径不合规 |
69 | tmux 缺失,或日志/附着目标未运行 |
70 | tmux 启停失败,或服务启动后立即退出 |
--restart-all 逐项执行且不是事务;前项成功、后项失败时不会回滚。
bash -n ~/.tmux.services
~/.tmux.services --check
~/.tmux.services <name>
tmux has-session -t '=serv-<name>'
tmux display-message -p -t '=serv-<name>:' '#{pane_current_path}'
~/.tmux.services --status <name>
# 仅重名服务改用 project/service 与 serv-<project>-<name>
~/.tmux.services <project>/<name>
tmux has-session -t '=serv-<project>-<name>'
测试专用,日常无需设置
export TMUX_SERV_SOCKET_NAME=tmuxserv-sandbox
~/.tmux.services <name>
tmux -L "$TMUX_SERV_SOCKET_NAME" has-session -t '=serv-<name>'
tmux -L "$TMUX_SERV_SOCKET_NAME" display-message -p -t '=serv-<name>:' '#{pane_current_path}'
~/.tmux.services --status <name>
unset TMUX_SERV_SOCKET_NAME
再按服务协议检查端口、健康接口和日志。