「次に手が必要なエージェント」に飛べる端末に移った — VSCode のターミナルをやめて herdr へ
タブが全部同じ顔をしている
AIエージェントに作業を任せるようになってから、端末の使い方が変わりました。
以前は「1つのターミナルで自分が作業する」だけだったのが、いまは複数のエージェントを同時に走らせて、それぞれの進み具合を見ながら手を入れる、という形になっています。片方が調べ物をしている間にもう片方のレビューを読む、みたいな並行の仕方ですね。
これを VSCode の内蔵ターミナルでやっていて、3つのことに困っていました。
セッションが増えると見失う。 タブが並んでいても、どれがどの作業なのかが分かりません。名前は全部同じような見た目で、開いて中身を読むまで判別できない。「さっき何か聞かれていたタブ」を探して端から開く、みたいなことをやっていました。
閉じると復帰できない。 ウィンドウを閉じたりエディタが落ちたりすると、走っていたセッションがまとめて消えます。長時間かけていた作業ほど痛い。
複数プロジェクトの並行がしづらい。 プロジェクトごとにウィンドウを開くことになるので、行き来が面倒で、全体像も見えません。
3つとも「1つの画面で複数のエージェントを回す」ことで生じる問題で、エディタに付属するターミナルの守備範囲を超えていました。
エンジニア仲間に教えてもらった
こういうときの定番は tmux ですが、実は tmux を検討していたわけではありませんでした。エンジニア仲間に「こういうのがある」と教えてもらったのが herdr です。
触ってみたら、まさに困っていたところに手が届く作りだったので、そのまま乗り換えました。バージョンは 0.7.5 を使っています。
herdr は「エージェント認識型」の多重化ツール
herdr は Rust で書かれたターミナルワークスペースマネージャで、公式の説明でも tmux と対比されています。違いは一点に集約されます。
tmux が永続化するのは「端末」ですが、herdr が扱うのは「エージェントの状態」です。
各ペインで何のエージェントが動いているかを検出して、そのペインが稼働中なのか、こちらの入力を待ってブロックしているのか、終わっているのかを判別します。tmux はセッション管理としては優秀ですが、そこで動いているプロセスが「いま人間の返事を待っている」かどうかまでは分かりません。
そのほかの特徴はこのあたりです。
- 各エージェントは本物の PTY の中で動く(エミュレーションではない)
- 端末を閉じてもセッションは残る
- SSH 経由でリモートのセッションに繋げる
- JSON Socket API と CLI で外から操作できる
- アカウント登録なし・テレメトリなし
インストールはワンライナーです。
curl -fsSL https://herdr.dev/install.sh | sh
安定版は Linux と macOS で、Windows はベータという位置づけです。今回は WSL2 の中で動かしているので Linux 版を使っています。
構成は4層の入れ子
構成はこうなっています。
Windows Terminal
└── WSL2 (Ubuntu 24.04)
└── herdr (prefix = ctrl+b)
└── Claude Code
この入れ子構造が、後で出てくるキー入力の問題に繋がります。先に頭の片隅に置いておいてください。
並行運用のための設定
キーバインドの prefix は tmux と同じ ctrl+b にしました。指が覚えている人はそのまま移れます。
その上で、複数エージェントを回すための設定をいくつか足しています。
次に手が必要なエージェントへ飛ぶ
一番ありがたいのがこれです。
[keys]
# 「次に手が必要なエージェント」へ飛ぶ
next_agent = "prefix+a"
previous_agent = "prefix+shift+a"
エージェントの状態を検出できるからこそ成立する機能で、「返事待ちで止まっているペイン」に直接ジャンプできます。冒頭に書いた「さっき何か聞かれていたタブを端から開いて探す」がまるごと消えました。
ワークスペースを番号で切り替える
switch_workspace = "prefix+shift+1..9"
focus_agent = "prefix+alt+1..9"
next_workspace = "prefix+ctrl+n"
previous_workspace = "prefix+ctrl+p"
プロジェクト単位でワークスペースを分けて、番号で直接飛べるようにしています。ウィンドウを行き来する必要がなくなりました。
使い捨てシェルをポップアップで開く
[[keys.command]]
key = "prefix+alt+t"
type = "popup"
command = "bash -l"
description = "scratch shell popup"
width = "80%"
height = "70%"
git status や ls をちょっと叩きたいだけ、という場面は多いのですが、そのたびにペインを分割するとレイアウトが崩れます。ポップアップで開いて閉じれば、タブ構成はそのままです。
ハマった:Shift+Enter で改行できない
導入して最初に困ったのがこれでした。Claude Code に複数行を入力しようとして Shift+Enter を押しても、改行されずにそのまま送信されてしまう。
原因を探すときに考えたのは、4層のどこでキーが落ちているのかでした。Windows Terminal が拾っていないのか、WSL まで来ていないのか、herdr が食べているのか、Claude Code が解釈できていないのか。層が多いぶん、当てずっぽうで設定を変えても切り分けになりません。
やったのは、herdr の別ペインで cat -v を起動して、実際に届いているバイトを目で見ることです。
cat -v
# ここで Shift+Enter を押す
ここで ^[^M(ESC + CR)が表示されれば、Windows Terminal から herdr までは到達していると分かります。何も出なければ、もっと手前で落ちている。
この環境では何も出ませんでした。つまり Windows Terminal がそもそも送っていない。そこで WT 側に「Shift+Enter を押したら ESC+CR を送る」というバインドを足しました。
// actions
{ "command": { "action": "sendInput", "input": "\u001b\r" },
"id": "User.sendInput.shiftEnterNewline" }
// keybindings
{ "id": "User.sendInput.shiftEnterNewline", "keys": "shift+enter" }
\u001b が ESC、\r が CR です。合わせて Alt+Enter 相当のシーケンスになります。herdr はこれを素通しするので、Claude Code まで届いて改行として解釈されます。
設定をいじりたくない場合は Ctrl+J、あるいは行末に \ を置いてから Enter でも改行できます。
この手の問題は「どの層まで届いているか」を先に確定させると早いです。層をまたぐ構成では、設定ファイルを触る前にバイトを見るのがおすすめです。
タブ名にセッションの中身を出す
「タブが全部同じ顔をしている」という最初の不満は、herdr に移っただけでは完全には解決しませんでした。タブ名は自分で付けるものだからです。
そこで、Claude Code のフック(プロンプト送信時とセッション終了時)から herdr のソケット API を叩いてタブ名を書き換えるスクリプトを入れました。pane.get で自分のペインを特定し、tab.rename で名前を差し替えるだけのものです。
会話の概要がそのままタブ名になるので、一覧を見れば「どのタブが何をやっているか」が分かります。herdr の外(VSCode のターミナルなど)で動いたときは何もせずに終了し、失敗しても終了コード 0 で抜けるようにして、セッションを止めないようにしてあります。
使ってみてどうか
最初に挙げた3つの不満は解消されました。
復帰できるのが一番大きいです。ウィンドウを閉じた程度なら、繋ぎ直せば元のセッションがそのまま残っています。長い作業の途中でも端末を気軽に閉じられるようになりました。
なお、WSL が丸ごと落ちるような場面では完全に元通りとはいきません。復帰時にセッションが勝手に選択されて起動する、といった挙動になります。ただ、そこまでの障害でなければ普通に戻れるので、実用上はほとんど困っていません。
不満らしい不満は今のところありません。強いて挙げるなら、エージェントが生成したファイルを実際に見るときは、結局べつのウィンドウを開くことになる点でしょうか。端末側の体験は良くなったぶん、ファイルを見る動線だけが外に残っている感覚があります。
まとめ
- AIエージェントを並行で走らせるなら、エディタ内蔵のターミナルは早めに限界が来る
- herdr は「端末」ではなく「エージェントの状態」を扱う多重化ツール。稼働中/ブロック中を検出できる
prefix+aで返事待ちのエージェントに直接飛べるのが実運用でありがたい- prefix は tmux 互換(
ctrl+b)なので移りやすい - 入れ子構成でキー入力が届かないときは、設定を触る前に
cat -vでどの層まで届いているかを確定させる
日本語の情報がまだ少ないツールですが、複数のエージェントを抱えて作業する人には向いていると思います。アカウント登録もテレメトリもないので、試すだけなら気軽です。
参照リンク
- herdr — 公式サイト(インストール手順もここ)
- Compare — herdr — tmux などとの比較
- Windows Terminal の sendInput アクション — キーバインドで任意のシーケンスを送る設定