開発環境

「次に手が必要なエージェント」に飛べる端末に移った — VSCode のターミナルをやめて herdr へ

herdr の画面。上部にワークスペースのタブが並び、左側にエージェント一覧のサイドバーがある
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 statusls をちょっと叩きたいだけ、という場面は多いのですが、そのたびにペインを分割するとレイアウトが崩れます。ポップアップで開いて閉じれば、タブ構成はそのままです。

ハマった: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どの層まで届いているかを確定させる

日本語の情報がまだ少ないツールですが、複数のエージェントを抱えて作業する人には向いていると思います。アカウント登録もテレメトリもないので、試すだけなら気軽です。

参照リンク