Claude Code のための実践 tmux ワークフロー
tmux と Claude Code は驚くほど相性が良い組み合わせです。長時間走るエージェントのターンには 切断に耐えるターミナルが欲しく、並列セッションには名前のついた安定した居場所が欲しい。 このガイドは、エージェント作業のための最小限の tmux セットアップです — 4 セッションを 管理可能に保つ命名・レイアウト・監視の習慣と、tmux 単体では分からないことの正直な整理まで。
なぜエージェントセッションに tmux か
- セッションがあなたより長生きする。 ターミナルアプリを閉じても、SSH が切れても、
リモートマシンが動いている間にノート PC を再起動しても —
tmux attachすれば、 あなたの不在に気づきもしなかった Claude Code セッションの前に戻れます。 - 名前付きウィンドウは無料のセッション一覧。 ステータスバーには全ウィンドウの 名前が常時表示されます — ターミナルが持てるダッシュボードに最も近いものです。
- レイアウトをスクリプト化できる。 ウィンドウを作り、正しいディレクトリに cd し、
claudeを起動する — そこまでをシェル関数 1 つで毎回同じ形にできます。
レイアウト: 1 セッション 1 ウィンドウ
最もスケールする構成は退屈なものです: Claude Code セッションごとに 1 つの tmux ウィンドウをタスク名で作り、マシンまたはプロジェクト単位の 1 つの tmux セッションに まとめる。
# タスクごとにウィンドウを作る。ステータスバーがタスク一覧として読めるよう名前を付ける
tmux new-window -n fix-auth -c ~/code/myapp-fix-auth
tmux new-window -n onboarding -c ~/code/myapp-new-onboarding
# それぞれで claude を起動(スクリプト化も可):
tmux send-keys -t fix-auth 'claude' Enter
セッション本体にはペインよりウィンドウを使います。ペイン分割は各セッションの出力を画面の
数分の一に押し込みますが、Claude Code のプロンプト・diff・プラン出力は全幅を使いたい。
ペインが活きるのはタスクの内側です: ウィンドウを分割して、片側にセッション、
もう片側に手動テスト用のシェルを置く(tmux split-window -h)。
効果の大半は 2 つの習慣から来ます。タスクが変わったらウィンドウ名を変えること
(tmux rename-window review-pr)— zsh、zsh、zsh
が並ぶステータスバーは何も教えてくれません。そしてウィンドウを worktree 単位にしているなら
(その構成は git worktree ガイドで扱っています)、
worktree のディレクトリ名をそのままウィンドウ名にして、すべての一覧の表記を一致させることです。
リモートマシン: tmux が本領を発揮する場所
リモートマシンで素の SSH のまま Claude Code を動かすと、接続が 1 回切れただけでタスクの途中で セッションが死にます。tmux の中なら、セッションは走り続けます。再接続して、離席中に何が 起きたかをスクロールバックで確認するだけです:
ssh devbox
tmux new -A -s agents # あれば attach、なければ作成
# ... 名前付きウィンドウで claude セッションを起動 ...
# 接続断・ノート PC のスリープ、何が起きても —
ssh devbox
tmux attach -t agents # 全部動き続けている
new -A はこのコマンドを冪等にします — 初回接続でも再接続でも同じ 1 行で済むため、
SSH のエイリアスに向いています。
tmux が教えてくれること・くれないこと
ウィンドウが複数走り出すと、問題は「どれが自分を必要としているか」になります。 tmux には組み込みのシグナルが 2 つありますが、どちらも見た目より弱い:
# 新しい出力のあったウィンドウに印を付ける(ステータスバーに # が付く)
setw -g monitor-activity on
set -g visual-activity off # 印だけ。メッセージポップアップは出さない
# あるいはターミナルベルで強調する
setw -g monitor-bell on
monitor-activity はあらゆる出力で発火します — 進行中のスピナーも
カウントされるため、動いているエージェント相手ではほぼノイズです。ベルはそれより近い:
Claude Code は完了時や注意が必要なときにターミナルベルを鳴らせて(/config 参照)、
tmux がそのウィンドウに印を付けます。しかしステータスバーの印が言えるのは
「何かが起きた」まで。許可プロンプトでブロックしているのか、プラン承認待ちなのか、
質問しているのか — それとも単に終わったのか、は分かりません。結局ウィンドウを切り替えて
確かめることになります。
アクティビティの印ではなく、本当の状態を
プッシュ型のシグナルには Claude Code の
hooks が使えます。
ライフサイクルイベント — Notification(Claude が入力を必要としている)と
Stop(Claude が完了した)— で発火し、どの tmux ウィンドウが表示されていようと
本物の macOS 通知を出せます。そして集約ビューの
ために作ったのが AgentManager です。macOS のメニューバーアプリで、
全 Claude Code セッション — tmux の全ウィンドウ含む — をステータスランプつきの行として表示します:
入力待ち、
実行中、
完了、
アイドル。
入力待ちの行にはどんな種類の回答が必要か — yes/no の承認、プランレビュー、選択式の質問 —
が表示されます。正直な注記を 1 つ: 行クリックでのジャンプ(iTerm2・Terminal.app・Ghostty・
VS Code 系エディタでは該当ペインへ直接切り替わります)は、tmux ペインには現状非対応です。
tmux のセッションも検出・追跡はされますが、切り替えは tmux 自身のキー操作で行います。
違いは、「どのウィンドウが・なぜ自分を待っているか」を分かった上で切り替えられることです。
入力待ちが発生するとフローティングウィンドウが自動で現れ、全て解消すると引っ込むので、
ステータスバーの印はオプションになります。
エージェント向け最小 .tmux.conf
# ~/.tmux.conf — エージェント作業に関係する部分だけ
set -g history-limit 100000 # エージェントのターンは大量のスクロールバックを生む
setw -g monitor-bell on # ベルの鳴ったウィンドウに印
set -g visual-activity off # ポップアップなし。印はステータスバーだけ
set -g renumber-windows on # 閉じたウィンドウの番号に穴を残さない
setw -g automatic-rename off # 付けたタスク名を勝手にリネームさせない
凝ったものは何もありません — 要点は、エージェントの作業を後から確認できる深さの スクロールバックと、自分で付けた名前のまま維持されるウィンドウ名です。
どのウィンドウがあなたを待っているか
AgentManager は tmux のウィンドウ・ペイン・普通のターミナルタブを横断して、全 Claude Code セッションにステータスランプを付け、あなたを待っているセッションを浮かび上がらせます。 ウィンドウを巡回して確かめる作業はもう不要です。無料で使えます。アカウント不要。