NEW Live Mode: your TUI shows what matters right now. Read the blog post
EN | JA | ZH | PT | ES | KO

ブログ

initechプロジェクトの技術記事。

---

2026年4月1日

Claude Code、Codex、OpenCodeを同じTUIで動かす

initechは最初、すべてのペインがClaude Codeだと仮定していました。

実際の運用ではその前提はすぐ崩れます。広い変更はClaude Code。閉じた作業はCodexのfull-auto。別の操作感が欲しいときはOpenCode。面倒なのは起動ではなく、それらを1つの監視画面で扱うことです。

いまのinitechは、Claude Code、OpenAI Codex、OpenCodeを同じTUIに並べて動かせます。

Claude Code、Codex、OpenCodeのペインが並ぶinitechのグリッド
1つのTUIの中で、役割ごとに違うエージェントを同時に監視できます。

問題

多くのmulti-agentツールは、全ペインが同じCLIを動かすことを暗黙に前提にしています。その前提は起動方法、入力方法、プロンプト判定、送信キーにまで漏れます。

ツールを混ぜるとすぐに差が出ます。bracketed pasteを前提にするCLIもあれば、それを嫌うCLIもある。単純な>で入力可能なツールもあれば、まだサービス起動中やtrust画面にいるツールもある。権限確認が1つ出るだけで、そのロール全体が止まります。

仕組み

見える変更はinitech.yamlrole_overridesです。デフォルトの起動コマンドから外れるロールだけが独自のコマンド配列を持ち、agent_typeがそのペインに使うハーネスを決めます。

project: myproject
root: ~/src/myproject

claude_command: ["claude"]
claude_args: ["--continue"]

roles:
  - super
  - eng1
  - eng2
  - qa1

role_overrides:
  eng2:
    command: ["codex", "resume", "--last", "--full-auto"]
    agent_type: codex

  qa1:
    command: ["opencode", "--continue"]
    agent_type: opencode

commandは追記ではなく完全置換です。Claude向けのフラグがCodexに混ざることはありません。さらにagent_typeは単なるラベルではなく、ready判定、bracketed paste、submit key、CLI固有の自動化を切り替えます。

CodexとOpenCodeのrole_overridesを示すinitech.yaml
デフォルトはClaude Codeのままです。overrideは違うCLIを使うロールだけに置きます。

エージェントごとのauto-submit

ターミナルマルチプレクサで地味に重要なのがsubmitです。ここがずれると、見た目だけ動いて実際には何も送れていません。

Claude Codeは従来どおりbracketed pasteを使います。Codex系のペインでは、プロンプトが本当に戻るまで待ち、本文をPTYへ直接書き込み、paste burstの判定が落ち着いてからsubmit keyを送ります。

Working表示が見えるCodexペイン
CodexにはCodex向けの入力ハーネスがあります。prompt検出とsubmit timingも含みます。

Codexの権限auto-approve

Codexの自律実行で面倒なのが権限確認です。確認が1つ出るだけで、そのペインは人間待ちになります。

agent_type: codexでは、initechはauto_approveをデフォルトで有効にします。terminal下部の既知パターンを見つけたら、pを送って承認と記憶を行います。

向かっている先

大事なのは「Codexが動くようになった」こと自体ではありません。initechがagent-agnosticなterminal multiplexerに近づいていることです。

オペレーターが見る面は1つ。TUIも1つ。監視場所も1つ。その中で、役割に合うエージェントを選べばいい。そこが今回の変化です。

インストール: initech.sh/install.sh
ソースコード: github.com/nmelo/initech

---

2026年3月31日

ロール別コマンドオーバーライド:Codex、Amp、Claude Codeを並行実行

initechはClaude Code専用ではなくなりました。initech.yamlのrole_overridesで、任意のロールに異なるCLIを指定できます。あるエージェントにはCodex、別のエージェントにはAmp、残りにはClaude Code。同じIPC、同じアクティビティ検出、同じTUI。

変更点

initech.yamlの新しいrole_overridesブロックで、ロールごとにデフォルトコマンドをオーバーライドできます:

# initech.yaml
role_overrides:
  codex-eng:
    command: ['codex', '--full-auto', '--no-alt-screen']
  amp-design:
    command: ['amp']

各オーバーライドはロール名をコマンド配列にマッピングします。ロールは引き続き独自のPTY、TUI内の独自のペイン、initech send / initech peekへの完全なアクセスを持ちます。ランタイムはPTY内で何が動いているかを気にしません。

なぜ重要か

「エージェントランタイム」というフレーミングは、これまで構想段階にとどまっていました。initechはあらゆる場所でClaude Codeを前提としていました。アクティビティ検出はClaudeのスピナーに依存し、イベントシステムはClaudeのJSONLログを解析し、ロールテンプレートはCLAUDE.mdファイルでした。

コマンドオーバーライドにより、コアプリミティブは引き続き機能します。PTYバイトフローは、どのCLIが出力を生成しても活動を検出します。IPCメッセージングはターミナルレベルで動作し、Claude固有ではありません。CLAUDE.mdテンプレートはClaude Codeを実行するロールにのみ適用されます。他のCLIは独自の設定を持ち込みます。

Claude以外のCLIで失われるもの:JSONLベースのイベント解析(ビーズ完了検出、停滞検出)とセッションログ対応のトースト通知。アクティビティ検出とIPCは引き続き機能します。混合フリートの場合、Claude Codeエージェントはフル機能セットを利用でき、それ以外は信頼性の高いPTY管理とメッセージングを利用できます。

ユースケース

明白なもの:同じコードベースでエージェントCLIを比較したい場合。engロールをClaude Codeで実行し、並列のengロールをCodexで実行。同じタスク、異なるエージェント、並べて表示。

実用的なもの:タスクによって適したツールが異なります。単純なリファクタリングにはフルオートモードのCodexエージェント。より多くのガイダンスが必要な複雑なマルチファイル変更にはClaude Code。どちらも1つのターミナルから可視化・アドレス指定可能。

試してみる

$ curl -fsSL https://initech.sh/install.sh | bash

ソースコードとオペレーターガイド: github.com/nmelo/initech

---

2026年3月30日

クロスマシン連携:複数マシンでエージェントフリートを実行する

initechがクロスマシン連携に対応しました。ワークステーション、リモートGPUマシン、クラウドVMなど、任意のマシンで initech serve を実行すると、ローカルTUIがそのエージェントペインをリアルタイムでストリーミング表示します。1つのターミナル。すべてのエージェント。どのマシンでも。

リモートマシンの設定

リモートマシンの initech.yamlmode: headlesspeer_namelistentoken を追加します:

project: myproject
root: /home/user/myproject
mode: headless
peer_name: workbench
listen: ":7391"
token: "shared-secret"

roles:
  - eng1
  - eng2
  - eng3

デーモンを起動:

$ initech serve

ローカルマシンの設定

ローカルの initech.yamlremotes: ブロックを追加します:

project: myproject
root: /Users/you/myproject
token: "shared-secret"

roles:
  - super
  - pm
  - qa1

remotes:
  workbench:
    addr: "192.168.1.100:7391"

通常通りTUIを起動:

$ initech

リモートエージェントのアドレス指定

$ initech send workbench:eng1 "APIリファクタを開始"
$ initech peek workbench:eng2 -n 30
$ initech peers
---

March 28, 2026

なぜAIエージェント用のターミナルマルチプレクサを構築したのか

複数のClaude Codeエージェントを並列管理するGo TUIを構築しました。セッションランタイムとしてtmuxを置き換えました。

うまくいくパターン

各エージェントにロール固有の指示を持つClaude Codeターミナルを与えます。supervisorエージェントが調整。エンジニアエージェントが実装。QAエージェントが検証。shipperエージェントがリリース。各エージェントは、アイデンティティ、制約、ワークフロー、通信プロトコルをエンコードするCLAUDE.mdを持ちます。

initechを構築する前に、4つのプロジェクトでこのパターンを実行しました。並列エンジニアリング、独立したQA、リリースゲーティング、セッション間の組織記憶を備えた実際のソフトウェアをシップしました。

スケールしない問題

tmuxはエージェントを追加するほど悪化する3つの問題を抱えています。

メッセージがサイレントに失敗する

tmux send-keysには配信保証がありません。エージェントのペインにメッセージを送り、届くことを祈ります。届かなくてもエラーは出ません。engからsuperへの完了報告がドロップすると、superはengの完了を知らず、QAはディスパッチされず、ビーズは1時間停滞します。

エージェントの状態が見えない

ハングしたエージェントと生産的なエージェントは、tmuxでは同じに見えます。完了と作業中も同じに見えます。確認する唯一の方法は各ペインを覗くこと。9エージェントなら、10-15分ごとに9回の手動チェックです。

ランタイムから作業が見えない

tmuxはどんな作業があるか、誰が何に割り当てられているか、エージェントがタスクをready for QAにしたことも知りません。全てのオーケストレーションはsuperのコンテキストウィンドウに存在します。コンテキストはコンパクトされ、メッセージは失われ、supervisorエージェントはengの完了を忘れ、ディスパッチチェーンが停滞します。

tmuxは汎用ターミナルマルチプレクサであり、アプリケーションレベルのインテリジェンスが必要な仕事をしています。

initechの違い

配信保証付きIPC

各セッションはUnixドメインソケットを実行します。initech sendはエミュレータを通じてエージェントのPTYにテキストを書き込み、配信を確認します。送信者は数秒以内に明示的なOKまたはエラーを受け取ります。

$ initech send eng1 "fix the auth bug in middleware.go"
$ initech peek eng1 -n 20

PTYバイトフローからのアクティビティ検出

最初にJSONLセッションログのテーリングを試しました。信頼性なし:Claudeは会話の境界でJSONLに書き込みますが、予測不能です。45秒の思考中の停止で、エントリはゼロ。タイムアウトのどんな値も、何かのケースでは不正解です。

正解:PTYが最後に出力を生成した時間を追跡。Claude Codeのスピナーは思考中に10-30 fpsでアニメーション。出力ゼロの唯一の状態はプロンプトでのアイドル。2秒の閾値でクリーンなバイナリ検出が可能。

緑は稼働中。グレーはアイドル。黄色はタスク待ちでアイドル。オーバーレイでペインを開かずに全エージェントの状態を表示。

JSONLセマンティックパーシングによるイベントシステム

JSONLはアクティビティ検出には失敗しましたが、セマンティックイベントには機能します。セッションログにはツール使用結果、アシスタントメッセージ、エラーシーケンスが含まれます。イベントシステムはこれらを解析して:

* ビーズ完了:エージェントが実行 bd update --status ready_for_qa
* 停滞:ビーズ割り当て中に10分以上出力なし
* エラーループ:3回以上連続のツール失敗
* ビーズクレーム:bdコマンドから自動検出、追加のCLIコール不要

イベントはトースト通知として表示。superが報告する前に「eng1 completed ini-bhk.3」が緑色で表示されます。

TUIが作業を認識

各エージェントのリボンに現在のビーズを表示。オーバーレイで全エージェントの状態を一覧。エージェントがビーズを保持したままアイドルになると、TUIがsupervisorエージェントに直接通知:「[from initech] eng1 is now idle (bead: ini-bhk.3). Check if work is complete.」

数字で見る実績

トラッキングしたビーズ(イシュー)247
クローズしたビーズ246
Gitコミット199
リリース25
ソースコード12,239行(Go)
テストコード17,669行
テストカバレッジ72%
CLIコマンド15
エージェントロールテンプレート11
バグハント完了3回(72件のバグを発見、整理、修正)
開発期間約4日

上記の全ての数字はツール自体が生成したものです。initechはinitechを構築したエージェントを管理しました。

学んだこと

エージェントロールテンプレートこそがプロダクト

TUIはランタイム。テンプレートがインテリジェンス。悪いCLAUDE.mdはTUIがどんなに良くても悪い出力を生みます。11のテンプレートを3回書き直し、実際の失敗からの教訓をコード化:エンジニアエージェントがPLANコメントをスキップ、QAエージェントがラバースタンプ、supervisorエージェントがディスパッチせずに作業を実施。

アクティビティ検出は見た目より難しい

PTYバイトリーセンシーが機能するまで3つのアプローチを試しました。JSONLテーリング:遅すぎ。ターミナル出力レート:SIGWINCHの偽陽性。プロンプト検出:UI変更に脆弱。スピナーアプローチはClaude Codeが作業時に常に出力するから機能します。静的な「thinking...」表示では壊れます。

最大の失敗モードは自分で作業すること

supervisorエージェントの最大の失敗:ディスパッチせずに実装すること。ディスパッチは遅く感じます。しかし、マルチエージェントの要点は専門化です。「エージェントを使わない」がsuperテンプレートの最初のクリティカル失敗モードになりました。

エージェントはプロセスステップを忘れる

全てのエージェントは最終的にコーディング前のPLANコメント、ready_for_qa前のpush、ビーズ表示のクリアを忘れます。auto-notifyはエージェントが完了報告を忘れるために存在します。ガードレールは助けになりますが、完全には排除できません。プロセス遵守はバイナリではなく、グラデーションです。

正直なギャップ

セッション移植性 は未着手。マシン間(MacBookからワークベンチへ)のセッション移動は手動rsyncが必要。PRDには initech migrate コマンドが記述されていますが、まだ存在しません。

リソース管理 はフラグの後ろにあります。メモリプレッシャー下でのオートサスペンド/レジューム(36GBノートPCで有効なエージェント容量を倍増させる機能)は実装済みですが、 --auto-suspend の後ろにゲートされています。ポリシーが実セッションで十分にテストされていないためです。

オンボーディング は荒削りです。初めて initech を実行した新規ユーザーは、ガイダンスなしで7つのペインを見ます。ステータスバーのヒントが下部に表示されますが、完全なワークフローを文書化したオペレーターガイドはありません。このツールは自身のユーザーによって構築されたもので、それが表れています。

初期段階。 initechは現在、複数のプロジェクトで使用されていますが、ユーザーベースはまだ小さいです。より多くの実際の使用がドッグフーディングでは見つからなかったギャップを明らかにするでしょう。

試してみる

curl -fsSL https://initech.sh/install.sh | bash
mkdir myproject && cd myproject
initech init
initech

ソース: github.com/nmelo/initech