ターミナルマルチプレクサ
報告を読むより、その場で見たほうがよい run もあります。attended run と take-over は、どちらも ライブの claude セッション — 自分で読んで steer できるもの — を目の前に置きます。ターミナル マルチプレクサの pane に開くことで、それを実現します。loopkeep が動かせるのは 4 つ、 herdr・tmux・zellij・cmux です。pane の中でも policy のゲートは変わりません。 マルチプレクサはセッションをどこに出すかを決めるだけで、何をしてよいかには関与しません。
マルチプレクサを選ぶ
run をどこに開くかは 1 つのルールで決まります。開く場所が決まっているなら開く、決まって いないなら聞く。 決められる場所は 3 つあり、最初にマルチプレクサを名指ししたものが勝ちます。
- workflow の
x-loopkeepの下のmux、 - この project の
.loopkeep/config.yamlのmultiplexer.id、 config.yamlのmultiplexer.id。
# .loopkeep/config.yaml(この project)または config.yaml(全体)
multiplexer:
id: tmux # herdr | tmux | zellij | cmux — 省略で未設定、"none" で無効
名指ししたマルチプレクサは、あらかじめ起動しておく必要はありません。インストールされていれば loopkeep が起動して、そこに pane を開きます。夜中に走る attended run のために tmux を立てたまま にしておく、といったことは要りません。
none は空欄ではなく 1 つの決定です。loopkeep は pane をまったく開きません。take-over は現在の
ターミナルを引き継ぎ、attended run は下の「開けるマルチプレクサが無いとき」の経路に乗ります —
attended を名指しした workflow なら、黙って headless に落ちるのではなく、あなたに聞きます。
3 つのどれも名指ししていないときは、実際に起動しているものを見ます。見るのはそれだけです — loopkeep がマルチプレクサを起動するのは、どれを使うか名指しされたときだけだからです。1 つだけ 起動していれば場所は決まっているので、そこに開きます。複数起動しているときは、あなた抜きには 決められないので、run を保留して受信箱でどれを使うか聞きます。答えた内容はこの project の 既定として保存されるので、聞かれるのは一度だけです。あとから変えるときは、プロジェクト設定の ターミナルから変更します。
インストールされていないマルチプレクサを名指ししても、黙って別のものに開いたりはしません。その
run はターミナルが無い場合と同じ扱いになり、下の on_no_host の経路に乗ります。
pane が開く場所
attended run の pane は決まった場所に開きます。space(マルチプレクサのセッションまたは
workspace)、tab(その中の window)、そして run id で名づけられた pane です。だから
run run_000123 を名前で見つけられます。その run の take-over は同じ場所に来ます。
space と tab はそれぞれ独立に解決し、最初に一致したものを採ります。
- workflow の
x-loopkeepの下のmux.space/.tab、 - この project の
.loopkeep/config.yamlのmultiplexer.options.space/.tab、 config.yamlの同じキー、- 組み込み既定の
loopkeepとautomation。
# config.yaml — すべての attended pane の既定
multiplexer:
options:
space: loopkeep
tab: automation
どちらのレイヤーもアプリから編集できます。全体は設定、project 単位はプロジェクト設定のターミナルです。
pane がどのセッションに開くか
herdr は名前付きのセッションを同時にいくつも動かせて、それぞれが自分の window を持ちます。pane が どのセッションに開くかは、次の順で決まります。
- workflow の
x-loopkeepの下のmux.session、 config.yamlのmultiplexer.options.session、- 起動しているセッション — 1 つだけならそれ、複数あれば最後に使ったもの、
- 1 つも起動していなければ herdr の既定セッション。
# config.yaml — すべての attended pane が開くセッション
multiplexer:
options:
session: work
space や tab と違って、組み込みの既定名はありません。何も書かなければ pane は作業中の場所について きます。名指しすると常にそこへ開きます。そのセッションが動いていなければ、黙って別のセッションを 使わずに loopkeep が起動します。他のマルチプレクサには名前付きセッションが無いので、このキーは 無視されます。
アプリからも設定できます — 全体の既定は 設定、project ごとは プロジェクト設定 で、 セッションの一覧から選ぶか、新しい名前を入力します。
開けるマルチプレクサが無いとき
attended run の開ける先が無くなるのは 2 つの場合です。1 つも起動しておらず名指しもされていない (loopkeep が起動すべき相手が無い)ときと、名指しされたマルチプレクサを起こせない(インストール されていない、サーバが起動しない)ときです。どちらもターミナルが無い run として扱います。
そのあとどうなるかは on_no_host が決めます。attended を
名指しした場合の既定は ask なので、loopkeep は run を保留して受信箱で聞きます。今すぐ headless
で走らせるか、ターミナルを待つか。待つほうは本当に待ちます — run は並列スロットを占有せずに保留の
まま残り、マルチプレクサが起動した時点で自分から attended で始まります。黙って headless に落ちるのは
on_no_host: headless を書いたときと、そもそも聞かない auto のときだけです。
モードごとに必要なもの
マルチプレクサによって、loopkeep が頼めることが違います。attended run には、pane を 開き、そこへテキストを注入し、まだ生きているかを報告できるもの — フルセット — が要ります。 take-over は pane を開ければ十分です。そこから先は自分の手で運転するからです。attended run の 要件を満たせないマルチプレクサは、その run にとってターミナルとして数えないので、run は上の 「開けるマルチプレクサが無いとき」の経路に乗ります。要件の少ない take-over は、現在のターミナルに 落ちます。
関連
- Execution mode —
headless・attended・auto。 - Take-over & hand-back — run のセッションを自分で運転する。