🐑

AIエージェント時代のターミナルマルチプレクサ「herdr」にtmuxから乗り換えた

に公開

https://x.com/Tocyuki/status/2072240028596748445

はじめに

スタディポケットで執行役員 CTO をしている@Tocyukiです。

自分は長らく tmux をターミナルマルチプレクサとして使ってきました。Zellij や WezTerm のマルチプレクサ機能など、乗り換え候補は何度か検討したものの、tmux を育ててきたので愛着心もあり、そもそも tmux で困っていないという理由で移行には至りませんでした。

状況が変わったのは、AI コーディングエージェントを複数並列で動かすようになってからです。自分は Claude Code を中心に、Codex や Cursor、Kiro といった複数のエージェントを用途に応じて使い分けています。tmux のペインでエージェントを並べていると「どのエージェントが承認待ちで止まっているのか」を把握するために、全ペインを順番に見て回る必要がありました。

エージェント管理に特化したツールとして cmux も乗り換え候補に挙がりましたが、tmux から乗り換えるほどの強いモチベーションは湧かず、見送りました。

そんなときに出会ったのが herdr です。実際に使ってみて「AI エージェント時代のターミナルマルチプレクサはこれだ」と感じ、tmux から乗り換えました。この記事では herdr の主要な機能を、乗り換えて良かったポイントとあわせて紹介します。

herdr とは

https://herdr.dev/

herdrは "one terminal for the whole herd" を掲げる、Rust 製のエージェントマルチプレクサです。herd(群れ)という名前のとおり、複数の AI コーディングエージェントを 1 つのターミナルから管理することに特化しています。

https://github.com/ogulcancelik/herdr

2026 年 3 月に公開された比較的新しいプロジェクトですが、GitHub のスター数は執筆時点で約 9,800 に達しており、活発に開発が続いています。シングルバイナリで配布されているため、導入も手軽です。

tmux との違いを整理すると次のようになります。

観点 tmux herdr
セッションの永続化
既存のターミナルエミュレータをそのまま使える
エージェント状態の検知・可視化 ×
エージェント自身によるマルチプレクサ操作 send-keys 等を自分で組み合わせる CLI・Socket API を標準提供
プラグイン機構 TPM + シェルスクリプト CLI・Socket API ベース(言語不問)

tmux の強みだった永続セッションや既存環境の維持はそのままに、エージェント管理の機能が上乗せされている構図です。

個人的には普段 Ghostty を気に入って使っているので、ターミナルエミュレータ自体を変えずに Ghostty 上でそのまま動く点も大きな安心材料でした。見た目や普段のシェル体験を保ったまま、エージェント管理だけを herdr に任せられます。

プラグインの作り方も対照的で、tmux がシェルスクリプトでオプションやコマンドをフックするのに対し、herdr は CLI とソケット API そのものをプラグインのインタフェースとして公開しています。ソケットに話せる言語であれば何でもプラグインを書けるわけです。cmux のような GUI ツールと違ってターミナルの中で完結するため、tmux ユーザーにとっては「tmux ライクな操作感のまま cmux のようなエージェント統合環境が手に入る」立ち位置だと言えます。

インストールと基本操作

Linux と macOS ではインストールスクリプトを実行するだけです。

curl -fsSL https://herdr.dev/install.sh | sh

macOS なら Homebrew でもインストールできます。

brew install herdr

起動はターミナルで herdr を実行します。tmux と同じくサーバー・クライアント分離のアーキテクチャを採用しているため、ターミナルを閉じてもセッションは裏で生き続けます。SSH 経由でサーバー上の herdr へのリモートアタッチにも対応しています。

Workspace > Tab > Pane の 3 階層構造

herdr の画面は次の 3 階層で構成されます。

  • Workspace: プロジェクト単位のコンテキスト。リポジトリごとに分けるのが基本
  • Tab: Workspace 内のサブコンテキスト
  • Pane: Tab 内のターミナル分割。シェル、エージェント、サーバーなどをそれぞれ実行

tmux の Session > Window > Pane に対応する概念なので、tmux ユーザーであれば迷わず使い始められます。git worktree と組み合わせて、1 リポジトリの複数ブランチを Workspace で並べる使い方とも相性が良いです。

セッション永続化とリモート接続

https://herdr.dev/docs/persistence-remote/

herdr はペインやエージェントをバックグラウンドサーバー上で動かします。そのため、prefixq(デフォルトでは Ctrl+Bq)でクライアントをデタッチしても、シェルやエージェント、開発サーバー、テストなどのプロセスは動き続けます。あとで同じマシンから herdr を実行すれば、そのまま再接続できます。

複数の独立した環境を持ちたい場合は名前付きセッションも使えます。たとえば herdr session attach workherdr session attach side-project を分ければ、それぞれ別の Workspace・Tab・Pane・ソケット・ランタイム状態を持つ herdr サーバーとして扱えます。グローバル設定ファイルは共有されるため、普段のキーバインドやテーマは保ったままコンテキストだけを分離できます。

リモート接続の選択肢が複数あるのも便利です。SSH 先でそのまま herdr を起動する tmux ライクな使い方に加えて、ローカルから herdr --remote workboxherdr --remote ssh://you@server:2222 のように接続する方法もあります。後者ではローカルの herdr が薄いクライアントとして動き、SSH 越しにリモートの herdr サーバーへ接続します。ローカル側のキーバインドを使えるうえ、画像クリップボードの貼り付けなどローカルデスクトップ側の機能をリモートセッションへ橋渡しできるのが特徴です。

エージェント状態の自動検知と通知

herdr に乗り換えた最大の理由がこの機能です。サイドバーに各エージェントの状態が色付きで一覧表示され、次の 5 つの状態を自動で判別してくれます。

状態 意味
🔴 Blocked 承認や入力待ちで停止中
🟡 Working 作業中
🔵 Done 完了したがまだ確認していない
🟢 Idle プロンプトで待機中
⚪ Unknown 通常のシェルなど、エージェント以外

重要なのは、この検知に特別な設定やプラグインが一切不要という点です。herdr はプロセステーブルの監視とターミナル画面出力のパターンマッチを組み合わせたヒューリスティック検知を裏側で常に行っており、Claude Code や OpenCode、Codex、Cursor などのエージェントをインストール直後から認識します。

さらに各エージェント向けの公式インテグレーションを追加すると、エージェント自身がフックやプラグイン経由でライフサイクルイベントを herdr へ直接報告するようになります。インテグレーションが有効な間はこちらが優先され、より正確な状態が反映される仕組みです。

https://herdr.dev/docs/integrations/

インテグレーションの導入と削除はそれぞれ 1 コマンドで行えます。

# Claude Code のインテグレーションをインストール
herdr integration install claude

# アンインストール
herdr integration uninstall claude

対応エージェントは Claude Code・Codex・Copilot・Cursor・Devin・OpenCode など、執筆時点で 13 種類です。エージェントごとに次のどちらか、または両方が追加されます。

  • ライフサイクル状態の直接報告: 画面出力のパターンマッチによる推定ではなく、エージェントのフックからの報告になるため、Idle・Working・Blocked の検知精度が上がる
  • セッション ID の連携によるネイティブなセッション復元: herdr がエージェントのセッション ID を把握し、サーバー再起動後もエージェントの会話を復元して継続できる

特にセッション復元は tmux にはなかった体験です。サーバー再起動時も、対応エージェントで公式インテグレーションが現在のセッション参照を報告していれば、保存されたレイアウトに加えてエージェント側の会話セッションを再開できます(自動レジュームの挙動は後述の config.toml の [session] で制御できます)。

検知の仕組みをもう少し詳しく

herdr の状態検知は二段構えになっています。

  1. ヒューリスティック検知: OS のプロセステーブルからペイン内のフォアグラウンドプロセスを特定し、画面出力を既知のエージェントパターンと照合して状態を推定する。設定不要で動くのはこちら
  2. インテグレーション: Claude Code はシェルフック、OpenCode は JavaScript プラグインといった形で、エージェントのライフサイクルフックから herdr のソケット API へ状態を報告する。インテグレーションが有効な場合はこちらが権威的な情報源として優先される

インテグレーションがないエージェントでもヒューリスティック検知にフォールバックするため、状態表示が完全に失われることはありません。

tmux 時代は「そろそろ終わったかな」と全ペインを巡回していましたが、herdr ではサイドバーを見るだけで Blocked のエージェントに直行できます。エージェントの並列数が増えるほど、この差は大きく効いてきます。状態の変化はトースト通知や通知音でも受け取れて、通知の配送先は後述の config.toml で変更できます。

tmux ライクなキーバインド

herdr のプレフィックスキーはデフォルトで Ctrl+B です。そう、tmux とまったく同じです。乗り換えの学習コストが低いのは、このデフォルト設定によるところが大きいと感じます。

主なデフォルトキーバインドは次のとおりです。

操作 キーバインド
プレフィックス Ctrl+B
縦分割 prefixv
横分割 prefix-
ペインを閉じる prefixx
ペインのフォーカス移動 prefixh / j / k / l
ズーム prefixz
リサイズモード prefixr
サイドバー表示切り替え prefixb
セッションナビゲーター(ペイン検索) prefixg
新規タブ作成 prefixc
次のタブへ移動 prefixn
前のタブへ移動 prefixp
タブ番号で切り替え prefix19
Workspace ピッカー prefixw
新規 Workspace prefixShift+N
Workspace 名の変更 prefixShift+W
デタッチ prefixq

prefixg で開くセッションナビゲーターでは、Workspace・Tab・Pane をインクリメンタル検索して目的のペインへ直接ジャンプできます。ペインが増えてきたときの移動手段として重宝します。また prefixw で Workspace ピッカーがアクティブになり、矢印キーで Workspace を切り替えられます。

マウス操作もデフォルトで有効なので、ペインのクリック移動やリサイズはマウスでも行えます。

config.toml による設定

設定は ~/.config/herdr/config.toml に TOML 形式で記述します(環境変数 HERDR_CONFIG_PATH でパスの上書きも可能)。herdr --default-config でデフォルト設定の全体を出力できるので、これを眺めれば、何を変えられるかをひととおり把握できます。設定項目の全体像は公式のリファレンスにまとまっています。

https://herdr.dev/docs/configuration/

主なカスタマイズポイントは次のとおりです。

  • [keys]: プレフィックスキーの変更や各アクションのキーバインド定義。"" を割り当てるとそのバインドを無効化できる
  • [theme]: catppuccintokyo-nightdraculanordgruvboxkanagawarose-pine など豊富なビルトインテーマから選択。custom テーブルで個別の色の上書きにも対応
  • [terminal]: デフォルトシェルの指定や、新規ペインの作業ディレクトリ(followhomecurrent・固定パス)の制御
  • [ui]: サイドバーの幅や起動時に折りたたむか、ペインのボーダー表示、マウスキャプチャといった画面まわりの調整。mobile_width_threshold(デフォルト 64 桁)以下の幅ではモバイル向けの単一列レイアウトに自動で切り替わる
  • [ui.toast]: トースト通知の配送先(offherdrterminalsystem)に加えて、表示位置や表示までの遅延秒数も調整できる
  • [ui.sound]: 通知音の有効化と音声ファイルの指定。エージェント別のミュートにも対応
  • [session]: セッション復元時にエージェントを自動レジュームするかの制御
  • [update]: アップデートチャンネル(stablepreview)や自動バージョンチェックの制御
  • [advanced] / [experimental]: スクロールバックの上限バイト数や、ペイン履歴の永続化などの実験的機能

[theme] で面白いのは name = "terminal" を指定すると、WezTerm や Ghostty など端末エミュレータの配色をそのまま継承できる点です。auto_switch を有効にすれば、端末のライト・ダーク切替に追従して dark_namelight_name で指定したテーマを自動で切り替えることもできます。

設定例をいくつか挙げます。

[theme]
name = "terminal"        # 端末エミュレータの配色をそのまま継承
auto_switch = true       # 端末のライト・ダーク切替に追従
dark_name = "catppuccin"
light_name = "catppuccin-latte"

[ui.toast]
delivery = "system"      # エージェントの通知を OS のシステム通知で受け取る

[keys]
prefix = "ctrl+a"        # tmux で Ctrl+A 派だった人もすぐ移行できる

さらに [[keys.command]] で独自コマンドをキーに割り当てられます。type = "pane" を指定すると一時ペインでコマンドを起動できるため、tmux の display-popuplazygit を開くような使い方を herdr でも再現できます。

[[keys.command]]
key = "prefix+shift+l"
type = "pane"            # "pane"(一時ペイン)/ "shell"(バックグラウンド)
command = "lazygit"
description = "run lazygit"

キーバインドは prefix+n のように「プレフィックスを押してから n」という明示的なシーケンスで記述します。設定の反映は herdr server reload-config コマンド、またはデフォルトで prefixShift+R に割り当てられたリロードキーで行えます。UI まわりの設定はペインを再起動せずに反映され、起動時のみ読まれる一部の設定だけ herdr の再起動が必要です。

CLI と UNIX ソケット API

herdr が「AI エージェント時代の」マルチプレクサだと感じるもう 1 つの理由が、CLI と UNIX ドメインソケット API の存在です。Workspace・Tab・Pane の操作や出力の読み取り、状態変化の待機まで、herdr 上のあらゆる操作をコマンドで実行できます。

# ペインの一覧を表示
herdr pane list

# ペインを右に分割してコマンドを実行
herdr pane split 1-2 --direction right --no-focus
herdr pane run 1-3 "npm run dev"

# 特定の出力が現れるまで待機
herdr wait output 1-3 --match "ready on port 3000" --timeout 30000

# 別のエージェントが完了するまで待機
herdr wait agent-status 1-1 --status done --timeout 60000

これらのコマンドはローカルの UNIX ソケット経由で稼働中の herdr インスタンスと通信し、結果を JSON で返します。つまり、エージェント自身が herdr を操作できるわけです。

公式 skill でエージェントが herdr を使いこなす

公式リポジトリにはエージェント向けの skill(herdr の操作方法をまとめたドキュメント)が用意されています。これを Claude Code などに読み込ませると、エージェントが自律的に herdr を操作するようになります。

https://herdr.dev/docs/agent-skill/

たとえば「開発サーバーを起動してからテストを実行して」と依頼すると、エージェントは次のような動きをします。

# エージェントが自分でペインを分割し、サーバーを起動して ready を待つ
herdr pane split 1-2 --direction right --no-focus
herdr pane run 1-3 "npm run dev"
herdr wait output 1-3 --match "ready" --timeout 30000

# 別ペインでテストを実行し、結果を読み取る
herdr pane split 1-2 --direction down --no-focus
herdr pane run 1-4 "npm test"
herdr wait output 1-4 --match "test result" --timeout 60000
herdr pane read 1-4 --source recent --lines 30

エージェントが別のエージェントを新しいペインに spawn してタスクを渡す、といったマルチエージェントのオーケストレーションもコマンドの組み合わせで実現できます。tmux でも send-keys を駆使すれば似たことは可能ですが、状態待機まで含めて標準の CLI として整備されている点が決定的に違います。

プラグインによる拡張

herdr のプラグインは「共有可能で実行可能なワークフローパッケージ」と定義されています。公式ドキュメントに "the entire Herdr CLI is the plugin API" とあるとおり、ここまで紹介してきた CLI とソケット API がそのままプラグインの API になっています。

https://herdr.dev/docs/plugins/

このため実装言語を問いません。Bash スクリプトでも JavaScript でも Lua でも Rust バイナリでも、コマンドとして実行できるものなら何でもプラグインにできます。最小構成は herdr-plugin.toml というマニフェストファイルと実行可能なスクリプトの 2 つだけです。プラグインでできることも幅広く、次の 4 種類の拡張ポイントが用意されています。

  • アクション: Workspace 上で実行できる操作をマニフェストで宣言
  • イベントフック: worktree.created などのイベント発火時に処理を実行
  • ペイン: ターミナル内に独立した UI 領域を持つ
  • リンクハンドラー: ターミナル上の URL への Ctrl+クリックを処理

インストールは GitHub リポジトリを指定して 1 コマンドで行えます。ローカル開発中のプラグインは link で試せます。

# GitHub からインストール
herdr plugin install owner/repo

# ローカルのプラグインをリンクして開発
herdr plugin link /path/to/plugin

# インストール済みの一覧
herdr plugin list

マーケットプレイス

https://herdr.dev/plugins/

公開されているプラグインはマーケットプレイスで探せます。名前・作者・説明・言語で検索でき、人気順や更新順でのソートにも対応しています。執筆時点で 50 を超えるプラグインが公開されています。代表的なものを見ると、プラグインで何ができるのかが具体的にイメージできます。

プラグイン できること
herdr-remote SSH なしでスマホやメニューバー、Telegram からエージェントを監視し、承認操作まで行える
herdr-reviewr エージェントの変更をサイドバーでコードレビューし、行単位のコメントをエージェントのチャットへ送り返せる
vim-herdr-navigation vim-tmux-navigator の herdr 移植。herdr のペインと Vim の分割を同じキーでシームレスに行き来できる
herdr-sessionizer プロジェクトや worktree をあいまい検索で開き、TOML で宣言したレイアウトどおりに Workspace を一括構築できる。tmuxinator 相当の使い方が可能
herdr-plugin-github-start GitHub の Issue や PR を起点に Claude Code や Codex を起動できる
herdr-token-dashboard エージェントペインごとのトークン消費をライブ表示できる

通知・レビュー・レイアウト・ナビゲーションと、tmux プラグインでカバーしていた領域はひととおり揃いつつあり、さらにエージェントの遠隔承認やトークン可視化といった herdr ならではの拡張も生まれています。

プラグインの公開方法もユニークで、パブリックリポジトリに GitHub トピック herdr-plugin を付けてマニフェストを置けば完了です。インデックスは 30 分ごとに自動更新されるため、中央への申請や登録作業は必要ありません。

tmux の TPM(Tmux Plugin Manager)に慣れていた身としては、拡張の受け皿があることは乗り換えの安心材料でした。CLI がそのままプラグイン API という設計のおかげで、自分のワークフローに合わせた拡張を普段使いのシェルスクリプトの延長で書けるのも良い点です。

まとめ

tmux から herdr に乗り換えて感じた良かったポイントを整理します。

  • tmux ライクなキーバインド: プレフィックスが同じ Ctrl+B で、学習コストがほぼゼロだった
  • Ghostty 上でそのまま使える: 気に入っているターミナルエミュレータを変えず、普段のシェル体験を保ったまま移行できた
  • 設定不要のエージェント状態検知: ヒューリスティック検知が裏側で動き、インストール直後から Blocked・Working・Done・Idle を可視化してくれる
  • セッション永続化とリモート接続: デタッチしてもプロセスが動き続け、名前付きセッションや SSH 越しの remote attach も使える
  • CLI と UNIX ソケット API: 公式 skill をエージェントに読み込ませるだけで、エージェント自身が herdr を使いこなしてくれる
  • プラグインによる柔軟な拡張: マーケットプレイスからコミュニティ製プラグインを導入でき、CLI の延長で自作もできる
  • Rust 製で安定している: シングルバイナリで導入が楽なうえ、日常利用で不安定さを感じたことがない

「tmux で困っていないから」と移行を先延ばしにしてきた自分でも、AI エージェントの並列運用という新しい課題の前では乗り換える理由が十分にありました。複数のエージェントを tmux のペインで管理してつらさを感じている方は、一度試してみてください。

GitHubで編集を提案

Discussion