2026/04/23
openclaw + tmux 参考

次はOpenclaw + tmuxの参考文です。

https://tmuxcheatsheet.com/tmux-plugins-tools/

https://tmuxcheatsheet.com/openclaw-tmux-setup/

https://github.com/gpakosz/.tmux

https://github.com/powerline/powerline

https://github.com/asheshgoplani/agent-deck

https://github.com/artemave/tmux_capture_last_command_output

はい、tmux の基本的な使い方について、セッション (session)、ウィンドウ (window)、インデックス (index)、出力キャプチャ (output catch) の観点から説明します。

1. セッション (Session)

tmux は複数の「セッション」を管理できます。各セッションは独立した作業環境であり、それぞれに名前をつけることができます。これにより、異なるプロジェクトやタスクごとに作業環境を分け、いつでも切り替えられるようになります。
主なコマンド:

  • 新しいセッションの作成:
tmux new-session -s <session-name>

例: tmux new-session -s myproject
(セッション名が指定されない場合は、自動で名前が付けられます。)

  • 既存のセッションにアタッチ (接続):
tmux attach-session -t <session-name>
# または略して
tmux a -t <session-name>

例: tmux a -t myproject

  • セッションの一覧表示:
tmux list-sessions
# または略して
tmux ls
  • セッションのデタッチ (切断):
    セッション内で作業中に、セッションを終了せずにバックグラウンドに移行させたい場合に使います。tmux のプレフィックスキー (デフォルトは Ctrl+b) の後に d を押します。
    例: Ctrl+b -> d
  • セッションのキル (終了):
    セッションを完全に終了させます。
tmux kill-session -t <session-name>

例: tmux kill-session -t myproject

2. ウィンドウ (Window)

1つの tmux セッション内には、複数の「ウィンドウ」を作成できます。ウィンドウは、ターミナルエミュレータのタブのようなものです。各ウィンドウは、独立した作業スペースを提供します。
主なコマンド (tmux のプレフィックスキー (Ctrl+b) の後に入力):

  • 新しいウィンドウの作成:
    c
    (新しいウィンドウが作成され、自動的にそのウィンドウに切り替わります。)
  • ウィンドウの一覧表示と切り替え:
    w
    (画面上部にウィンドウの一覧が表示され、矢印キーやマウスで選択して切り替えられます。)
  • 次のウィンドウに移動:
    n
  • 前のウィンドウに移動:
    p
  • ウィンドウの番号で直接移動:
    0 から 9 までの数字キーを押すと、対応する番号のウィンドウに直接移動します。
  • ウィンドウのリネーム:
    ( または ) (キーボードレイアウトによります)
    (現在のウィンドウに新しい名前を付けられます。)

3. ペイン (Pane) とインデックス (Index)

1つの tmux ウィンドウは、さらに「ペイン」と呼ばれる複数の領域に分割できます。これにより、1つのウィンドウ内で複数のコマンドラインを同時に表示・操作できます。
主なコマンド (tmux のプレフィックスキー (Ctrl+b) の後に入力):

  • ペインを縦に分割:
    %
    (現在のペインを縦に分割し、新しいペインを作成します。右側に新しいペインができます。)
  • ペインを横に分割:
    " (ダブルクォート)
    (現在のペインを横に分割し、新しいペインを作成します。下側に新しいペインができます。)
  • ペイン間の移動:
    矢印キー (例: Ctrl+b -> →)
    (カーソルを移動させたい方向の矢印キーを押します。)
  • ペインの削除 (閉じる):
    x
    (現在のペインを閉じます。確認メッセージが表示されるので、y で確定します。)
  • ペインを最大化 (ズーム):
    z
    (現在のペインを一時的に最大化し、他のペインを隠します。もう一度 z を押すと元に戻ります。)
  • ペインのインデックス:
    各ペインやウィンドウには、0 から始まるインデックス番号が割り当てられています。w コマンドでウィンドウ一覧を表示した際や、ペイン間の移動時に、これらのインデックスが利用されます。コマンドラインから特定のペインやウィンドウを指定する際に使われることがあります。

4. 出力キャプチャ (Output Catch)

tmux では、ペインの出力をコピーしたり、ファイルに保存したりする機能があります。
主なコマンド (tmux のプレフィックスキー (Ctrl+b) の後に入力):

  • コピーモードに入る:
    [ または ] (キーボードレイアウトによります)
    (コピーモードに入ると、矢印キーで移動したり、スペースキーで選択範囲を開始・終了したりできます。)
  • コピーモードでの操作:
  1. [ を押してコピーモードに入る。
  2. 移動キー (矢印キー、Ctrl+f (Forward), Ctrl+b (Backward) など) で、コピーしたい内容の開始位置に移動する。
  3. Space キーを押して、選択を開始する。
  4. 移動キーで、コピーしたい範囲を選択する。
  5. 再度 Space キーを押して、選択範囲をコピーバッファにコピーする。
  6. コピーモードを抜けるには、q を押します。
  • ペースト:
    コピーモードでコピーした内容は、tmux のバッファに保存されています。
    ]
    (現在のカーソル位置に、バッファの内容をペーストします。)
  • 出力のファイルへの保存 (リダイレクト):
    tmux のコマンドライン機能を使って、ペインの出力をファイルにリダイレクトすることも可能です。
    これは tmux のコマンドモード (Ctrl+b -> :) から実行します。
    例: 現在アクティブなペインの出力を output.log というファイルに保存したい場合。
:pipe-pane "cat > output.log"

このコマンドを実行すると、そのペインで実行されるコマンドの標準出力が output.log に追記されていきます。
終了するには、Ctrl+c でコマンドモードをキャンセルするか、tmux のセッションを終了します。

まとめと実践的な例

  1. プロジェクトごとにセッションを作成:
tmux new-session -s my_web_app
  1. ウィンドウを分ける (例: フロントエンドとバックエンド):
  • Ctrl+b -> c (新しいウィンドウ作成) -> Ctrl+b -> ( -> frontend と入力してリネーム。
  • Ctrl+b -> w でウィンドウ一覧を表示し、frontend ウィンドウを選択。
  • Ctrl+b -> c (新しいウィンドウ作成) -> Ctrl+b -> ( -> backend と入力してリネーム。
  1. ウィンドウ内でペインを分割 (例: コード編集と実行):
  • backend ウィンドウにいる状態で:
  • Ctrl+b -> % (縦分割) -> 左ペインでサーバー起動コマンド実行。
  • Ctrl+b -> → (右ペインに移動) -> Ctrl+b -> " (横分割) -> 右下のペインでテスト実行コマンド入力。
  1. 出力の確認とコピー:
  • サーバー起動ログなどが流れるペインで、Ctrl+b -> [ -> 移動キーで範囲選択 -> Space でコピー。
  • 別のペインで Ctrl+b -> ] でペースト。
    これらの基本コマンドを使いこなすことで、tmux を効率的に活用できるようになります。最初は少し複雑に感じるかもしれませんが、実際に手を動かして試してみるのが一番の近道です。

tmuxで次のようなコマンドを実行して、実行後の出力をファイルに保存することを一つShellScriptに纏めてください。

codex
次のPlanとタスクを確認して教えてください。

tmux のコマンドを実行し、その出力をファイルに保存する ShellScript を作成します。
tmux のコマンドを実行し、その標準出力をキャプチャしてファイルに保存するには、いくつか方法がありますが、ここでは tmux pipe-pane コマンドを使用する方法と、tmux セッションを起動・実行・デタッチして後からログファイルを確認する方法の2パターンを提示します。

方法1: tmux pipe-pane を使用する (リアルタイムでファイルへ出力)

この方法は、tmux セッション内でコマンドを実行し、その出力をリアルタイムで指定したファイルにパイプ(リダイレクト)します。

#!/bin/bash
# --- 設定 ---
SESSION_NAME="codex_session"  # tmux セッション名
TARGET_WINDOW_INDEX=0         # コマンドを実行するウィンドウのインデックス (通常は 0)
TARGET_PANE_INDEX=0           # コマンドを実行するペインのインデックス (通常は 0)
OUTPUT_FILE="codex_output.log" # 出力を保存するファイル名
# --- tmux セッションとペインの準備 ---
# セッションが存在しない場合は作成
tmux has-session -t "$SESSION_NAME" 2>/dev/null || tmux new-session -d -s "$SESSION_NAME"
# 指定したウィンドウとペインが存在しない場合 (または新規作成時) のための基本的な準備
# 必要に応じて、ウィンドウやペインの分割・リネームなどのコマンドを追加してください。
# 例: tmux select-window -t $SESSION_NAME:$TARGET_WINDOW_INDEX
# 例: tmux split-window -v -t $SESSION_NAME:$TARGET_WINDOW_INDEX.$TARGET_PANE_INDEX
echo "tmuxセッション \"$SESSION_NAME\" のペイン $TARGET_WINDOW_INDEX.$TARGET_PANE_INDEX にコマンドを実行します。"
echo "出力は \"$OUTPUT_FILE\" に保存されます。"
# --- コマンドの実行と出力のパイプ ---
# tmux send-keys でコマンドを送信し、pipe-pane でその出力をファイルにリダイレクトします。
# 注意: "codex" コマンドが tmux セッション内の PATH に通っている必要があります。
# codex コマンドと、それに続く対話的な入力を送信します。
# shift+enter の挙動が 'C-m' でなく 'S-C-m' であった場合、send-keys の引数を調整してください。
# まず、codex コマンドを実行します。
tmux send-keys -t "$SESSION_NAME:$TARGET_WINDOW_INDEX.$TARGET_PANE_INDEX" "codex" C-m
# codex コマンドへの入力 (Planとタスクの確認) を送信します。
# ここでの 'C-m' は Enter キーとして送信されます。
# もし Shift+Enter が必要なら、'S-C-m' などに変更してください。
# 実際には、codex が対話的に入力を求める場合、その応答を送信する必要があります。
# 例として、要求されたテキストをそのまま送信します。
# codex が入力を待っている状態であることを前提とします。
sleep 2 # codex が起動するのを待つための短いスリープ
tmux send-keys -t "$SESSION_NAME:$TARGET_WINDOW_INDEX.$TARGET_PANE_INDEX" "次のPlanとタスクを確認して教えてください。" C-m
# 上記の send-keys コマンドの出力をファイルに保存するには、
# pipe-pane を使って、send-keys が実行されるペインの出力をキャプチャします。
# ただし、send-keys 自体のコマンド実行結果ではなく、send-keys によって実行された
# プロセス (codex) の標準出力をキャプチャしたい場合、少し工夫が必要です。
# より直接的な方法は、codex コマンド自体を tmux の中で実行し、その出力をキャプチャすることです。
# 以下のコマンドは、codex コマンドを実行し、その標準出力を output.log に保存します。
# codex が対話的な入力を求める場合、この方法では自動応答が難しいため、
# 事前に応答内容を準備しておくか、手動で対話する必要があります。
# codex コマンドを実行し、その出力をファイルにリダイレクトする tmux コマンド
# (これは codex が対話的でない場合、または事前に応答が決まっている場合に有効)
# 以下のコマンドは、tmux セッションの指定ペインで codex コマンドを実行し、
# その出力をファイルにリダイレクトします。
tmux pipe-pane -o "cat >> $OUTPUT_FILE" \; send-keys -t "$SESSION_NAME:$TARGET_WINDOW_INDEX.$TARGET_PANE_INDEX" "codex" C-m
sleep 2 # codex の起動を待つ
tmux send-keys -t "$SESSION_NAME:$TARGET_WINDOW_INDEX.$TARGET_PANE_INDEX" "次のPlanとタスクを確認して教えてください。" C-m
# codex が実行を終えるのを待つための十分な時間 (必要に応じて調整)
echo "codex の実行を待っています..."
sleep 10 # codex の実行時間に合わせて調整してください
echo "コマンドの実行が完了しました。出力は \"$OUTPUT_FILE\" に保存されています。"
# --- オプション: セッションのデタッチ ---
# tmux detach -t "$SESSION_NAME"
# echo "セッション \"$SESSION_NAME\" をデタッチしました。"
exit 0

解説:

  • SESSION_NAME: 管理したい tmux セッションの名前です。
  • TARGET_WINDOW_INDEX, TARGET_PANE_INDEX: コマンドを実行したいウィンドウとペインのインデックスです。通常、新しく作成されたセッションでは 0.0 (ウィンドウ0のペイン0) がデフォルトです。
  • OUTPUT_FILE: codex コマンドの出力を保存するファイル名です。
  • tmux has-session ... || tmux new-session -d ...: 指定したセッションが存在しない場合にのみ、バックグラウンド (-d) で新しいセッションを作成します。
  • tmux send-keys -t ... "command" C-m: 指定した tmux ペインにコマンド文字列を送信し、C-m (Enter キー) で実行します。
  • codex コマンドとその後の入力 (次のPlanとタスクを確認して教えてください。) を送信しています。
  • 重要: codex が対話的に入力を求める場合、send-keys で送信する入力は、codex が期待する応答である必要があります。もし codex がさらに追加の入力を求めてくる場合は、send-keys コマンドを複数回使用するか、応答内容を事前に準備しておく必要があります。
  • sleep コマンドは、codex が起動したり、次の入力待ち状態になるまで待機するために挿入しています。実行時間に合わせて調整してください。
  • tmux pipe-pane -o "cat >> $OUTPUT_FILE": これが指定したペインの標準出力を cat >> $OUTPUT_FILE コマンドにパイプする部分です。cat >> $OUTPUT_FILE は、標準入力を受け取って output.log ファイルの末尾に追記します。
  • tmux send-keys ... C-m の後に pipe-pane を実行することで、codex の実行結果が output.log に追記されていきます。
  • sleep 10: codex が実行を完了するのを待つための時間です。codex の処理内容に応じて、この秒数を調整してください。
  • tmux detach: スクリプトの実行後、セッションをバックグラウンドに移行させたい場合にコメントアウトを外してください。
    実行方法:
  1. 上記のコードを run_codex.sh のようなファイル名で保存します。
  2. 実行権限を付与します: chmod +x run_codex.sh
  3. 実行します: ./run_codex.sh
  4. 実行後、codex_output.log ファイルに結果が保存されていることを確認してください。

方法2: tmux セッションを起動・実行・デタッチし、後からログを確認

この方法は、tmux セッションを起動し、コマンドを実行させ、セッションをデタッチした後、tmux のログ機能やリダイレクト機能を使って結果を取得します。

#!/bin/bash
# --- 設定 ---
SESSION_NAME="codex_session_log"
OUTPUT_DIR="./logs" # ログファイルを保存するディレクトリ
OUTPUT_FILE="$OUTPUT_DIR/codex_output_$(date +%Y%m%d_%H%M%S).log"
# --- ディレクトリの準備 ---
mkdir -p "$OUTPUT_DIR"
# --- tmux セッションの作成とコマンド実行 ---
# -d でバックグラウンドでセッションを作成し、コマンドを実行します。
# -c でコマンドを実行するディレクトリを指定します (必要であれば)。
# tmux new-session -d -s "$SESSION_NAME" -c "/path/to/your/project" "codex '次のPlanとタスクを確認して教えてください。' > $OUTPUT_FILE 2>&1"
# 上記は codex が単純なコマンドライン引数で動作する場合。
# 対話的な場合、以下のように send-keys を使う方が一般的です。
# 新しいセッションを作成し、デフォルトのコマンドとしてシェルを起動
tmux new-session -d -s "$SESSION_NAME"
# codex コマンドとその入力を送信
sleep 2 # codex が起動するのを待つ
tmux send-keys -t "$SESSION_NAME" "codex" C-m
sleep 2 # codex 起動待機
tmux send-keys -t "$SESSION_NAME" "次のPlanとタスクを確認して教えてください。" C-m
# codex が実行を終えるのを待つ (十分な時間を確保)
echo "codex の実行を待っています..."
sleep 10 # 実行時間に合わせて調整してください
# --- セッションのデタッチとログのキャプチャ ---
# セッションをデタッチします。
tmux detach -t "$SESSION_NAME"
# セッションをキルして、そのセッションの履歴ログを取得する (tmux.conf の設定による)
# または、セッション内のペインの出力をファイルに保存します。
# より確実なのは、send-keys で実行するコマンド自体をリダイレクトすることです。
#tmux capture-pane -t "$SESSION_NAME" > "$OUTPUT_FILE" # これはセッション全体の表示内容を取得する
# より正確には、codex プロセスの出力をキャプチャしたい。
# tmux の history log 機能を使うか、send-keys で実行したコマンドの出力をリダイレクトします。
# 以下のコマンドは、セッション全体(または指定ペイン)の出力をキャプチャしますが、
# リアルタイムではなく、セッション終了後やデタッチ後の状態を取得するのに近いです。
# tmux capture-pane -t "$SESSION_NAME:$TARGET_WINDOW_INDEX.$TARGET_PANE_INDEX" > "$OUTPUT_FILE"
# より堅牢な方法として、codex コマンド自体を tmux の中で実行し、
# その標準出力をリダイレクトする方法が一般的です。
# ただし、対話的な入力が必要な場合は、上記の方法1の pipe-pane が適しています。
# ここでは、セッションをデタッチ後、そのセッションのウィンドウ/ペインの出力を
# capture-pane で取得する例を示します。(これはデタッチ後なので、実行中のプロセス出力ではない可能性あり)
# セッションが終了またはデタッチされた後、そのペインの出力をキャプチャしてみます。
# (tmux.conf で history-size が適切に設定されている必要があります)
tmux capture-pane -p -t "$SESSION_NAME" > "$OUTPUT_FILE" 2>/dev/null
# -p オプションは、ペインの出力を標準出力に表示します。
# 2>/dev/null は、エラーメッセージを非表示にします。
# セッションをクリーンアップする場合
# tmux kill-session -t "$SESSION_NAME"
echo "コマンドの実行が完了しました。出力は \"$OUTPUT_FILE\" に保存されています。"
exit 0

解説 (方法2):

  • OUTPUT_DIR: ログファイルを保存するディレクトリを作成します。
  • OUTPUT_FILE: タイムスタンプ付きのファイル名でログファイルを生成します。
  • tmux new-session -d -s "$SESSION_NAME": バックグラウンドでセッションを作成します。
  • tmux send-keys ... C-m: 方法1と同様に、コマンドと入力を送信します。
  • sleep 10: 実行完了を待ちます。
  • tmux detach -t "$SESSION_NAME": セッションをデタッチします。
  • tmux capture-pane -p -t "$SESSION_NAME" > "$OUTPUT_FILE" 2>/dev/null: デタッチされたセッション(または指定したペイン)の現在の表示内容をキャプチャし、ファイルに保存します。
  • 注意点: この方法は、セッションがデタッチされた時点でのペインの表示内容を取得します。もし codex が非同期で処理を続けており、セッションデタッチ後に完了する場合、この方法ではその完了した出力を取得できない可能性があります。
  • より確実なのは、codex コマンド自体を tmux の中で実行する際に、標準出力と標準エラー出力を直接ファイルにリダイレクトしてしまうことです。例: tmux send-keys -t "$SESSION_NAME" "codex '...' > $OUTPUT_FILE 2>&1" C-m のようにします。ただし、この場合、codex が対話的な入力を複数回要求してくる場合は、スクリプトで自動応答するのが難しくなります。

どちらの方法が良いか:

  • リアルタイムで出力を確認・保存したい、または対話的な入力が複数回必要な場合: 方法1 (pipe-pane) が適しています。
  • 単純なコマンド実行で、セッション終了後にまとめてログを確認したい場合: 方法2 のように、コマンド実行自体をリダイレクトする方がシンプルで確実な場合があります。
    ご自身の codex コマンドの挙動(対話的かどうか、実行時間など)に合わせて、適切な方法を選択し、sleep の秒数などを調整してください。

---
name: tmux-agent-teams
description: Create Claude Code agent teams when users ask to "Create an agent team ..." or "Spawn an agent team ...", or list Claude Code agent teams when users ask to "List agent teams ..." or "Show agent teams ...".
metadata:
  { "openclaw": { "emoji": "🧵", "os": ["darwin", "linux"], "requires": { "bins": ["tmux", "claude"] } } }
---

# Agent Teams Workflow

## When to use this skill
Use this skill when the user wants to create a Claude Code agent team, or list Claude Code agent teams already running in tmux, and the request is expressed as an outcome rather than raw tmux commands.

## Preconditions
- Claude Code credentials are configured.
- Claude Code Agent teams are enabled.

## Intent detection
1. Infer whether the request is for `listing` or `creation`.
2. Treat create, spawn, start, and build intents as `creation`.
3. Treat list, show, inspect, what-is-running, and status intents as `listing`.
4. Infer the work dir as `work_dir`, and team name as `team`, from the user's request when provided.
5. If the team name is not provided for creation, infer it based on the teammates' tasks.

## Tmux session naming
`dir_hash`: `printf "$work_dir"|sha256sum | cut -c1-6`
`tmux_session`: `claude-<dir_hash>-<team>`

### Creation
1. Read tmux skill before proceeding.
2. If the work dir is not provided, ask for it before creating a tmux session.
3. If the request includes multiple possible directories, ask the user which work dir to use.
4. If an existing managed tmux session with the same `dir_hash` already exists, ask the user whether to reuse it. Reuse only after user confirmation.
5. Create `tmux_session` if it does not exist, and attach to `tmux_session`.
6. In the session, execute the exact command `claude`.
7. If Claude Code shows a confirmation prompt, ask the user for the choice.
8. Send the user's original request without rephrasing to the Claude Code lead.
9. Capture the lead pane to verify that the pane reads "❯ <request>" before submitting the request. If not, report the mismatch and ask the user whether to proceed anyway.
10. Hit Enter/Return key to submit the request.
11. Wait for Claude Code to output acknowledgment (poll for 30 seconds with 1-second intervals).
12. Capture the tmux pane output, report it back to the user without rephrasing.

### Listing
1. Read tmux skill before proceeding.
2. Keep listing read-only: do not create, attach, rename, kill, or otherwise modify tmux sessions when the request is only to list, show, or inspect teams.
3. Run tmux session listing.
4. Filter sessions that match the managed naming convention `claude-<dir_hash>-<team>`.
5. If the user provides `work_dir`, compute `dir_hash` from it and use that to narrow matches. Report whether each returned session matches the requested work dir.
6. For each matching session, inspect the first 10 lines of the lead pane to infer work-dir.
7. For each matching session, inspect the last 30 lines of the lead pane to infer a high-level status such as `waiting for input`, `still working`, `idle`, or `unknown`.
8. Report the session name, optional work-dir, and inferred status for each match.
9. If no matching sessions exist, report that clearly.

## Boundaries
- Do not rely on ACP. 
- Only use tmux skills to interact with Claude Code in tmux sessions.
- Do not use `agents_list` tool, as we are using only tmux skills to manage the teams.
- Do not assume dangerous permission bypass flags unless the user or policy explicitly allows them.
- Ask for clarification if the work dir or repository is ambiguous.