ターミナルの逆襲:Rust と Go でエージェントループをクロスプラットフォームへ
Agent! は Mac アプリですが、コーディングエージェントは開発者が働くあらゆる場所にあるべきです。エージェントループが Rust 版と Go 版の 2 つの CLI となり、macOS・Windows・Linux でフルスクリーン TUI を備えるまでの道のりを紹介します。
これまでの大半の期間、Agent! は誇り高き Mac アプリでした。ネイティブの Swift と SwiftUI、AppleScript やアクセシビリティ(Accessibility)との深い連携、そして root 権限のための Launch Daemon。それは今も変わらずフラッグシップです。しかしここ数日で、コーディングエージェントに対する私たちの考え方に変化が起き、今日それをリリースします。
エージェントループが、macOS・Windows・Linux のターミナルで動くようになりました。同じ機能を持つ 2 つのエディションがあります。Rust で書かれた AgentiLoopCLI と、Go で書かれた AgentiLoopGo です。そう、この小さな弟たちのコードの多くは、Mac 版 Agent! 自身が書きました。
パラダイムシフト:ターミナルへの回帰
AI コーディングツールの第一波は、エディタやチャットウィンドウの中にありました。今勝ちつつある波は、ターミナルの中にあります。それには十分な理由があります。
- ターミナルはもともと作業の現場です。ビルド、テスト、git、パッケージマネージャ、SSH セッションはすべてそこにあります。ターミナルのエージェントは、それぞれに個別の連携を用意する必要がありません。
bashがあるのですから。 - どこでも動きます。CLI は Linux のビルドマシンでも、コンテナの中でも、SSH 越しの Raspberry Pi でも、Windows の開発用 VM でも動きます。Mac アプリが動くのは Mac の上だけです。
- 組み合わせられます。ワンショットモード(
agentiloop "explain this project")は、そのままスクリプトや CI に組み込めます。 - やっていることに正直です。すべてのツール呼び出し、diff、権限の確認がプレーンテキストで流れていきます。
アクセシビリティ経由で Photo Booth を操作したり、ScriptingBridge で Mail をスクリプト化したりといった Mac アプリの超能力は、本当に Mac 専用です。しかしエージェントループはそうではありません。推論し、ツールを呼び出し、実際の結果を読み、修正し、繰り返す。これはシェルとファイルシステムがあればどの OS でも機能します。だから私たちはループを切り出しました。
なぜ 2 つの言語なのか?
1 つに絞ることもできました。しかし私たちは、あえて同じ設計を 2 回移植しました。
Rust (AgentiLoopCLI) が先でした。ワークスペースは 9 月 20 日に、コアループ、Anthropic プロバイダ、組み込みツール、CLI とともに立ち上げられました。5 つの crate に分かれています。agentiloop-core(ループ、メッセージ、セッション、権限)、agentiloop-provider、agentiloop-tools、agentiloop-mcp、agentiloop-cli です。tokio 上で動作し、rustls を使った reqwest を採用しているため Windows で OpenSSL と格闘する必要がなく、TUI は ratatui で描画します。Markdown は pulldown-cmark で処理し、コードのシンタックスハイライトは syntect が担います。
Go (AgentiLoopGo) は 9 月 23 日、怒涛のコミットで登場しました。まずテスト付きのコア(メッセージ、エージェントループ、コンパクション、セッション、権限)、次にプロバイダ、続いて MCP クライアント、そして REPL、TUI、Markdown、シンタックスハイライト、セッション、スラッシュコマンドを備えた CLI です。TUI は tcell で描画し、Markdown は goldmark でレンダリングし、ハイライトは chroma、行編集は liner で処理します。リリースワークフローは Rust 版と同じ 5 つのプラットフォームを対象としています。
2 回実装することは、最高の設計レビューです。本当は Rust 特有、あるいは Go 特有だったものはすぐに浮かび上がり、残ったものこそが本当のアーキテクチャです。実用的なメリットもあります。チームがすでに信頼しているツールチェーンを選べばいいのです。そして、どちらが優れているか教えてください。🦀 vs 🐹
同じループ、より小さな表面
どちらの CLI も、意図的に小さく鋭いツールセットから始めています。
| ツール | 機能 | 事前に確認? |
|---|---|---|
read_file | 行番号付きでファイルを読み込む | いいえ |
list_dir | フォルダの一覧を表示する | いいえ |
write_file | ファイルを作成または上書きする | はい |
edit_file | 完全一致するテキストを置換する | はい |
bash | コマンドを実行する(Mac と Linux では sh -c、Windows では cmd /C) | はい |
もっと欲しいですか?どちらのエディションにも、Agent! 自身の AgentMCP から移植した MCP クライアントが含まれており、stdio、Streamable HTTP、従来の HTTP+SSE に対応しているので、どんな MCP サーバーのツールもそのまま接続できます。
権限はコアの一部であり、UI に後付けされたものではありません。Rust では、PermissionPolicy トレイトが、ツール名、変更を伴うかどうか、そして入力に基づいて、各呼び出しを実行してよいかを判断します。答えは Allow、Deny、Cancel のいずれかです。3 つ目の選択肢は、実際の不満から生まれました。権限の確認で Esc を押したときは、タスク全体を終了するのではなく、その 1 回の呼び出しだけをスキップすべきです。CLI は対話型のポリシーを提供し、テストと CI では AllowAll を使います。
クロスプラットフォームは細部に宿る
「Windows で動く」と言うのは簡単ですが、本当にそうするのは大変です。そのために必要だったことをいくつか紹介します。
- 暴走したコマンドを確実に止める。
bashがタイムアウトしたとき、シェルが子プロセスを生成していれば、シェルを終了するだけでは不十分です。Go 版はプロセスツリー全体を終了します。Unix ではプロセスグループ、Windows ではtaskkill /Tを使います。コードはproc_unix.goとproc_windows.goに分かれています。 - 3 つの OS すべてで CI。Go リポジトリは macOS、Linux、Windows で CI を実行し、Rust のリリースワークフローは 5 つのバイナリをビルドします。macOS arm64 と x86_64、Linux x86_64 と arm64、そして Windows x86_64 です。
- 署名済みの Mac バイナリ。リリースワークフローで macOS ビルドの署名と公証ができるため、Gatekeeper にブロックされません。
- 設定ファイルの発掘作業は不要。CLI は起動方法を覚えています。プロバイダ、モデル、TUI モード、セッションです。初回実行以降は、
agentiloopとだけ打てば、前回中断したところから正確に再開できます。
アプリのような使い心地の TUI
実行方法は 3 つあります。フルスクリーンの TUI(agentiloop --tui)、シンプルなターミナル向けの 1 行ずつのチャットモード、そしてスクリプト向けのワンショットモードです。TUI はここ数日で大忙しでした。
- プロンプトボックス内のアニメーション付きビジーインジケーター(スピナー、現在のアクティビティ、経過時間を表示)
- 1 秒あたりのトークン数の計測
- クリック可能なリンク
- 起動をまたいで保持されるプロンプト履歴
- 再開したセッションで以前の会話を表示し、真っ白な画面を見つめずに済む
- プロバイダのライブなモデル一覧に基づく
/model
そして API キーがない、または間違っているときは、401 をそのまま吐き出すのではなく、平易な言葉でそう伝え、実際のプロバイダ名を示します。
プロバイダ
初日から、Claude(API キーまたは Claude Code の OAuth トークンを同じ認証情報に入れられ、認証方式は自動判別)、OpenAI および OpenAI 互換の任意のサーバー、Ollama や LM Studio 経由のローカルモデル、そして Apple Silicon 上の oMLX に対応しています。oMLX のアドレスとキーは ~/.omlx/settings.json から自動的に読み込みます。
リリースを試す
本日、v0.0.4 を正式リリースとして公開しました。まだ初期段階で動きも速いので、変更のコストが低い今のうちにフィードバックをいただきたいと考えています。Rust releases からバイナリを入手するか、ソースから Go 版をビルドしてください。
Mac アプリがなくなることはありません。Mac をお使いなら、Agent! はどんなターミナルにもできないことを今もやってのけます。しかし、Linux サーバーでも、Windows ノートでも、Raspberry Pi でも同じエージェントを使いたいと思ったことがあるなら、それがここにあります。