npx skills add https://github.com/0xbigboss/claude-code --skill tmux以下是硬性要求,而非建议:
tmux new-session 前检查 tmux has-sessiongit rev-parse --show-toplevel 派生会话名称,切勿硬编码send-keys 运行命令,切勿向 new-session 传递内联命令一个项目 = 一个 tmux 会话。多个进程 = 该会话中的多个窗口。
使用 send-keys 模式以确保可靠的 shell 初始化。 创建会话会自动生成一个交互式 shell。使用 send-keys 在该 shell 中运行命令,确保 PATH、direnv 和其他初始化正确运行。
# 错误 - 内联命令绕过 shell 初始化,破坏 PATH/direnv
tmux new-session -d -s "$SESSION" -n main 'tilt up'
# 正确 - 检查会话,然后在交互式 shell 中使用 send-keys
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n main
fi
tmux send-keys -t "$SESSION:main" 'tilt up' Enter
These are hard requirements , not suggestions:
tmux has-session before ever calling tmux new-sessiongit rev-parse --show-toplevel, never hardcodesend-keys to run commands, never pass inline commands to new-sessionOne project = one tmux session. Multiple processes = multiple windows within that session.
Use send-keys pattern for reliable shell initialization. Creating a session spawns an interactive shell automatically. Use to run commands within that shell, ensuring PATH, direnv, and other initialization runs properly.
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
始终从项目派生会话名称:
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
对于一个项目中的多个进程,使用窗口而非独立会话:
myappserver、tests、logsSESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n main
tmux send-keys -t "$SESSION:main" '<command>' Enter
else
echo "Session $SESSION already exists"
fi
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# 如果窗口不存在则添加新窗口
if ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
tmux new-window -t "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
else
echo "Window 'server' already exists"
fi
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# 如果需要则创建会话,然后添加窗口
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
fi
# 添加更多窗口(幂等操作)
for win in tests logs; do
if ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^${win}$"; then
tmux new-window -t "$SESSION" -n "$win"
fi
done
tmux send-keys -t "$SESSION:tests" 'npm run test:watch' Enter
tmux send-keys -t "$SESSION:logs" 'tail -f logs/app.log' Enter
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# 从第一个窗口获取最后 50 行
tmux capture-pane -p -t "$SESSION" -S -50
# 从特定窗口获取
tmux capture-pane -p -t "$SESSION:server" -S -50
# 检查错误
tmux capture-pane -p -t "$SESSION" -S -100 | rg -i "error|fail|exception"
# 检查就绪指示器
tmux capture-pane -p -t "$SESSION:server" -S -50 | rg -i "listening|ready|started"
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# 列出所有会话(查看现有会话)
tmux ls
# 列出当前会话中的窗口
tmux list-windows -t "$SESSION"
# 仅终止此项目的会话
tmux kill-session -t "$SESSION"
# 终止特定窗口
tmux kill-window -t "$SESSION:tests"
# 向窗口发送按键(例如,Ctrl+C 停止)
tmux send-keys -t "$SESSION:server" C-c
tmux kill-server| 场景 | 使用 tmux? |
|---|---|
tilt up | 是,始终使用 |
开发服务器(npm run dev、rails s) | 是 |
文件监视器(npm run watch) | 是 |
测试监视器(npm run test:watch) | 是 |
| 数据库服务器 | 是 |
一次性构建(npm run build) | 否 |
| 快速命令(<10 秒) | 否 |
| 需要在对话中直接获取 stdout | 否 |
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# 检查会话是否存在
tmux has-session -t "$SESSION" 2>/dev/null && echo "session exists" || echo "no session"
# 列出窗口及其状态
tmux list-windows -t "$SESSION" -F '#{window_name}: #{pane_current_command}'
# 检查特定窗口是否存在
tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$" && echo "server window exists"
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# 发送 Ctrl+C 然后重启命令
tmux send-keys -t "$SESSION:server" C-c
sleep 1
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
echo "Started dev server in tmux session: $SESSION"
elif ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
tmux new-window -t "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
echo "Added server window to session: $SESSION"
else
echo "Server already running in session: $SESSION"
fi
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# 轮询就绪消息
for i in {1..30}; do
if tmux capture-pane -p -t "$SESSION:server" -S -20 | rg -q "listening|ready"; then
echo "Server ready"
break
fi
sleep 1
done
每周安装次数
69
仓库
GitHub 星标数
36
首次出现
2026 年 2 月 10 日
安全审计
安装于
opencode59
gemini-cli59
github-copilot58
codex58
claude-code55
cursor54
send-keys# WRONG - inline command bypasses shell init, breaks PATH/direnv
tmux new-session -d -s "$SESSION" -n main 'tilt up'
# CORRECT - check for session, then use send-keys in interactive shell
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n main
fi
tmux send-keys -t "$SESSION:main" 'tilt up' Enter
Always derive session name from the project:
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
For multiple processes in one project, use windows not separate sessions:
myappserver, tests, logsSESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n main
tmux send-keys -t "$SESSION:main" '<command>' Enter
else
echo "Session $SESSION already exists"
fi
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# Add a new window if it doesn't exist
if ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
tmux new-window -t "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
else
echo "Window 'server' already exists"
fi
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# Create session if needed, then add windows
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
fi
# Add more windows (idempotent)
for win in tests logs; do
if ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^${win}$"; then
tmux new-window -t "$SESSION" -n "$win"
fi
done
tmux send-keys -t "$SESSION:tests" 'npm run test:watch' Enter
tmux send-keys -t "$SESSION:logs" 'tail -f logs/app.log' Enter
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# Last 50 lines from first window
tmux capture-pane -p -t "$SESSION" -S -50
# From specific window
tmux capture-pane -p -t "$SESSION:server" -S -50
# Check for errors
tmux capture-pane -p -t "$SESSION" -S -100 | rg -i "error|fail|exception"
# Check for ready indicators
tmux capture-pane -p -t "$SESSION:server" -S -50 | rg -i "listening|ready|started"
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# List all sessions (see what exists)
tmux ls
# List windows in current session
tmux list-windows -t "$SESSION"
# Kill only this project's session
tmux kill-session -t "$SESSION"
# Kill specific window
tmux kill-window -t "$SESSION:tests"
# Send keys to a window (e.g., Ctrl+C to stop)
tmux send-keys -t "$SESSION:server" C-c
tmux kill-server| Scenario | Use tmux? |
|---|---|
tilt up | Yes, always |
Dev server (npm run dev, rails s) | Yes |
File watcher (npm run watch) | Yes |
Test watcher (npm run test:watch) | Yes |
| Database server | Yes |
One-shot build (npm run build) | No |
| Quick command (<10s) | No |
| Need stdout directly in conversation | No |
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# Check session exists
tmux has-session -t "$SESSION" 2>/dev/null && echo "session exists" || echo "no session"
# List windows and their status
tmux list-windows -t "$SESSION" -F '#{window_name}: #{pane_current_command}'
# Check if specific window exists
tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$" && echo "server window exists"
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# Send Ctrl+C then restart command
tmux send-keys -t "$SESSION:server" C-c
sleep 1
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
tmux new-session -d -s "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
echo "Started dev server in tmux session: $SESSION"
elif ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -q "^server$"; then
tmux new-window -t "$SESSION" -n server
tmux send-keys -t "$SESSION:server" 'npm run dev' Enter
echo "Added server window to session: $SESSION"
else
echo "Server already running in session: $SESSION"
fi
SESSION=$(basename $(git rev-parse --show-toplevel 2>/dev/null) || basename $PWD)
# Poll for ready message
for i in {1..30}; do
if tmux capture-pane -p -t "$SESSION:server" -S -20 | rg -q "listening|ready"; then
echo "Server ready"
break
fi
sleep 1
done
Weekly Installs
69
Repository
GitHub Stars
36
First Seen
Feb 10, 2026
Security Audits
Installed on
opencode59
gemini-cli59
github-copilot58
codex58
claude-code55
cursor54
AI新闻播客制作技能:实时新闻转对话式播客脚本与音频生成
1,200 周安装