メインコンテンツへスキップ
kt-tech.blog

【環境構築】Ghostty・tmux・herdr・cmux をどう積むか — ターミナルを層で考える

設定・環境構築8分で読めます

この記事でわかること

  • Ghostty・tmux・herdr・cmux は競合ではなく積み木で、排他関係は2組だけだということ
  • タブも分割も持つ Ghostty に、それでもマルチプレクサを乗せる理由(足りないのは3つ)
  • 4つの構成それぞれの使いどころと、SSH 先で選択肢が一気に絞られること
  • Claude Code を herdr の中で起動する意味(HERDR_ENV=1)と、実際の画面構成

Claude Code を日常的に使っていること。前の記事「どの層で戦っているか」を読んでいると繋がりますが、本記事単体でも読めます。

前の記事で tmux・herdr・cmux がどの層で戦っているか を整理しましたが、実際に使い始めると次の問題が来ます。「で、どう組むの?」です。

しかもここに Ghostty が入ってくると、さらにこじれます。Ghostty はタブもペイン分割も持っているので、「じゃあマルチプレクサいらなくない?」となります。

結論から言うと、この4つは競合ではなく積み木です。そして排他関係は2組しかありません。

メモ

この記事でやること

  • 4つの排他関係をはっきりさせて、組み合わせを数えられる状態にする
  • タブも分割も持つ Ghostty に、それでもマルチプレクサを乗せる理由をはっきりさせる
  • 自分の使い方に合う構成を選ぶ
  • Claude Code をどこで起動するべきかまで落とす

排他関係は2組だけ

4つを並べて悩むとき、実は選択肢はそこまで多くありません。層が違うもの同士は一緒に使えるからです。

  • Ghostty ↔ cmux は同じ層(ターミナルエミュレータ)なので両立しない
  • tmux ↔ herdr も同じ層(マルチプレクサ)なので両立しない
  • それ以外の組み合わせは全部成立する

つまり「エミュレータをどちらにするか」と「マルチプレクサを乗せるか、乗せるならどちらか」を別々に決めればいいだけです。四つを同じ土俵で比べようとするから混乱します。

なお cmux は Ghostty の描画エンジン(libghostty)を内蔵しています。cmux を選んでも Ghostty の描画は使っていることになるので、捨てるのは設定と macOS アプリとしての体験のほうです。

Ghostty だけだと何が足りないのか

ここが一番誕いやすいところです。Ghostty はタブもペイン分割もネイティブに持っています。畫面を分けたいだけなら、本当にそれで十分です。

足りないのは次の3つだけです。

Ghostty が持っているもの Ghostty ・GPU による高速描画 ・タブ ・ペイン分割 ・フォント / テーマ / 設定 画面を分けるだけなら、これで足りる Ghostty の外にあるもの プロセスの永続化(閉じると中身も死ぬ) 外からの操作(入力を送る / 画面を読む) エージェントの状態を知る この3つを埋めるために tmux / herdr を乗せる (3つ目まで要るなら herdr、1つ目だけなら tmux で足りる)
Ghostty はタブも分割も持っているので、見た目の用途ではマルチプレクサが要らない。足りないのは「閉じても生き残ること」と「外から操作できること」の2つで、tmux と herdr はここを埋めるために乗せる。

1つ目の永続化は従来からの理由です。SSH が切れても、ウィンドウを閉じても中のプロセスが生き残る。

2つ目の外からの操作が、AI エージェント時代に重みを増した部分です。Claude Code の Bash ツールは対話的なプロンプトを扱えませんが、マルチプレクサを挟むとエージェントが「画面を見て、キーを打つ」ことができるようになります。REPL、ssh、認可コードの貼り付け待ち。これらを人間が代わりに打つ必要がなくなります。

3つ目の状態監視は herdr の固有機能で、複数のエージェントを並行で回すときに効いてきます。

この3つがどれも要らないなら、Ghostty 単体で終わりでいいです。余計な層を挟むとキーバインドが二重になって面倒が増えるだけです。

4つの構成と、それぞれの使いどころ

構成 向いている人 制約
Ghostty 単体 エージェントを1つしか回さず、SSH もしない 閉じたら中身も死ぬ
Ghostty + tmux SSH 先や Linux でも同じ操作をしたい エージェント状態は自分で作ることになる
Ghostty + herdr 複数エージェントの状態を見たい。ターミナルは今のまま まだ v0.8 系
cmux macOS で自分がエージェントを捌く体験を良くしたい macOS 専用。<strong>SSH 先では使えない</strong>

実際には、SSH を使うかどうかで一気に絞られます。リモートのサーバーで作業するなら cmux はこの時点で外れ、tmux か herdr の二択になります。

逆に macOS に閉じていて、自分が複数エージェントを目視で捌きたいのであれば cmux が強い。縦タブ・通知・埋め込みブラウザが標準装備で、設定ファイルもプレフィックスキーも要りません。

実際に積む

手元では Ghostty + herdr にしました。この形になります。

Ghostty のウィンドウ(描画だけを担当) herdr(この中身ぜんぶ。Ghostty を閉じても生きている) サイドバー ● working ● blocked ● idle 状態が一目で分かる claude HERDR_ENV=1 ここで起動するのが肝 npm run dev エージェントが自分で立てた shell / ログ 人が見る用 エージェントが自分でペインを割り、コマンドを流し、出力を文字列で待って読む → SSH 先など herdr が無い環境では、同じ役割を tmux が担う(send-keys / capture-pane)
Ghostty はウィンドウを描くだけで、中身は herdr が持つ。Claude Code を herdr のペイン内で起動すると HERDR_ENV=1 が入り、エージェント自身が隣のペインを作って開発サーバーを走らせたり、その出力を読んだりできるようになる。

ポイントは Claude Code を herdr のペイン内で起動することです。

Bash
# これまで
$ claude

# これから
$ herdr
  └─ (herdr のペイン内で) $ claude

herdr は管理下のペインに HERDR_ENV=1HERDR_PANE_ID を注入します。herdr の agent skill はこれを見ていて、エージェント自身が自分の居場所を認識できるときだけ有効になります。CLI 自体は外からでも叩けますが、skill は「外から操作するな」と明示しています。ユーザーがフォーカスしているセッションをエージェントが勝手に触らないためです。

導入は Homebrew で完結します。

Bash
brew install herdr
brew services start herdr          # 常駐サーバーとして起動
herdr integration install claude   # Claude Code 連携フック
herdr --skill > ~/.claude/skills/herdr/SKILL.md   # agent skill を配置

integration install~/.claude/settings.jsonSessionStart フックを追記します。既存のフックは壊れませんでしたが、心配なら先にバックアップを取って差分を見ると良いです。

あえて tmux も残している

herdr を入れた後も tmux は残してあります。SSH 先に herdr は入っていないからです。

手元の Claude Code には、こういう使い分けを覚えさせています。

状況 使うもの
手元(macOS・herdr 常駐中) herdr を優先
SSH 先・Linux・herdr が無い環境 tmux

同じ層のツールなので、同時に使うものではなく環境で切り替えるという使い方です。なお herdr は tmux 風のキーバインド(Ctrl-b プレフィックス)を踏襲しているので、手が覚えた操作はそのまま使えます。

運用の勘所

Ghostty は設定なしでもいい

手元の Ghostty(1.3.0)は config ファイルなしのデフォルト運用です。マルチプレクサを乗せるなら、タブや分割の設定を詰めても下の層と役割が重なるだけなので、入れ込む必要があまりありません。

秘匿情報はエージェントに打たせない

これは構成に関係なく共通です。パスワード・API キー・2FA コード・秘密鍵をエージェントに送信させると会話ログに残ります。その場面になったら手を止めさせ、自分でペインにアタッチして入力し、その後を読み取らせて再開させるのが安全です。

マルチプレクサを挟むとエージェントが何でも打てるようになるので、ここだけは意識的に線を引いておく必要があります。

後始末

セッションはターミナルを閉じても生き残ります。これが利点ですが、放置すると実行中のプロセスが気づかないうちに残ります。作業が終わったら片付けるようにしておきましょう。

落とし穴

実際に組んで踏んだものを、短くだけ。詳細は前の記事に書いています。

  • herdr の wait-output は自己マッチするpane run はコマンド文字列をペインに打ち込むので、待ち受ける語がコマンドに含まれていると実行前のエコーに当たって即座に返ります(実測 0.08 秒)。出力にしか現れない値で待つ
  • tmux の capture-pane は末尾が空行で埋まる| tail だと何も見えない
  • Ghostty + tmux では画像のインライン表示が効かなくなることがある。スクショ確認が多い作業なら素の端末のほうが快適

まとめ

  • 4つは競合ではなく積み木。排他なのは Ghostty↔cmux と tmux↔herdr の2組だけ
  • Ghostty に足りないのは「永続化」「外からの操作」「状態監視」の3つだけ。どれも要らなければ単体でいい
  • SSH を使うなら cmux は外れる。ここで大きく分かれる
  • Claude Code に代行させたいなら、マルチプレクサの中で起動するのが前提

参考リンク