目次

ターミナルの中で AI を使ってコーディングをしていたとき、ある問題に気づきました。AI がファイルを変更しても、同じウィンドウの中でその変更を確認する方法がなく、アプリを切り替えてまた戻る——その繰り返しがずっと気になっていました。

欲しかったのはシンプルなことです。ターミナルとAIとファイル、この3つが同じウィンドウの中にあること。コンテキストスイッチなしで作業できること。

それを作ったのが aitm です。

メインインターフェース:左にファイルツリー、中央にターミナル、右にAIサイドバー

Tauri を選んだ理由

Electron は最初に評価しました。アイドル時に RAM 150MB 以上、起動に数秒——プロトタイプとしては許容範囲でも、常時起動するツールとしては受け入れられません。早い段階で除外しました。

最初から Tauri 2 + Rust を選択し、約2ヶ月で動くものができました。結果:バイナリ 5.3MB、コールドスタート 3–5ms、アイドル時 RAM 約30MB。数十のプロセスが走る環境で、これは「OSの一部のように感じられるツール」と「ゲストのように感じられるツール」の違いです。

React 19 フロントエンドは Tauri IPC 経由で Rust の PTY レイヤーと通信します。AIサイドバー、ツール実行パイプライン、セキュリティレイヤーはすべて Rust 側に実装されています。Webアプリをデスクトップアプリに見せかけたものではなく、OS レベルの処理は本当に OS レベルで動くコードが担っています。

ツールループ

aitm のコア機能は AI のツール呼び出しで、クローズドループで動きます。

  1. サイドバーでAIに質問する
  2. AI がコンテキストを必要と判断し、list_files / read_file / get_terminal_history / search_history を呼び出す
  3. aitm が読み取り専用のツールを自動実行し、結果をAIに返す
  4. AIがコマンドを実行したい場合(run_command)、そこで止まり、あなたを待つ
  5. コマンドの全文を確認し、承認または拒否してから実行される

ステップ 1〜3 は中断なく流れます。ステップ 4 が黙って実行されることは絶対にありません。この境界——読み取りは自動で流れ、実行は人間を待つ——が、設計のすべてです。

AIは聞かれる前からコンテキストも受け取ります。現在の git ブランチ、作業ディレクトリ、変更状態、リッスン中のポート。AIは最初の一言を発する前から、あなたの状況を把握しています。

AIサイドバー(プロジェクトコンテキストを認識して挨拶)

4層セキュリティモデル

AI のツール実行は、最も時間をかけた部分です。懸念は高度な攻撃ではなく、LLM がハルシネーションを起こすという現実です。ハルシネーションした rm -rf は、最悪な午後につながります。

すべての run_command 呼び出しは、シェルに近づく前に4つのゲートを通過します。

L1 — ブロックリスト regex:何があっても通過しないハードコードされたパターン。rm -rf /:(){ :|:& };:dd if=/dev/zero など約50件。高速で、設定不要で、ゼロトラスト。「ユーザーが承認した」としても通してはいけないコマンドです。

L2 — ヒューリスティックリスクスコアリング:コマンド文字列をシグナルのセットでスコアリング。/ に触れるか、リダイレクト(>)を使うか、sh にパイプするか、システムディレクトリを参照するか。出力は DESTRUCTIVE / HIGH / LOW の3段階で、確認ダイアログに可視表示されます。

L3 — プロジェクトスコープ allowlist:プロジェクトごとに globset を設定できます。AIが触れてよいパスとパターンを定義し、スコープ外はL4の前にフラグが立ちます。オプトインですが、強く推奨します。

L4 — ユーザー確認ダイアログ:すべての run_command 呼び出しはモーダルを表示します。コマンドの全文、リスクレベル、スコープチェック結果。承認するかしないか、あなたが決めます。自動承認モードはありません。

L1・L2 は Rust でゼロ非同期オーバーヘッドで動作。L3 は globset クレートを使用。L4 は IPC ハンドラのハードゲートで、AIレイヤーにはそのコードパスが存在しないため、バイパスは構造的に不可能です。

1.0 に含まれるもの

ツールループとセキュリティモデルが主な機能ですが、1.0 にはそれ以外にも多くが含まれています。

プロジェクトスコープ:セッションにプロジェクトディレクトリを持たせます。AIは作業スコープを把握し、ファイルツリーもツール呼び出しもその範囲に収まります。「ターミナルのAI」を「このプロジェクトのAI」に変えるのが、この機能です。

SQLite ローカル永続化:会話履歴、セッション状態、設定はすべてローカルのSQLiteデータベースに保存されます。データは端末の外に出ません。アカウント不要です。

6つのLLMプロバイダー:OpenAI、Anthropic、DeepSeek、通義千問(Qwen/DashScope)、智谱(Zhipu)、Moonshot(Kimi)。セッションごとに切り替え可能です。西側の主要プロバイダーに加え、中国の主要プロバイダーも対応しています。

8テーマ、中英 i18n:英語と中国語 UI、個性的なテーマ8種。特に気に入っているのは、ダークな水墨画テイストのテーマです。

CodeMirror エディタ・分割ペイン:ターミナルウィンドウに組み込まれたファイルエディタ。コンテキストを離れずに素早い編集が必要なときに使えます。

macOS Developer ID 公証.dmg は Apple のパイプラインで署名・公証済みです。Gatekeeper の警告は出ません。

3ペイン分割(ターミナル + ファイルプレビュー + ブラウザ)

設定画面(外観 / テーマ / レイアウト)

1.0 に含まれないもの

正直に言うと、いくつか間に合わなかったものがあります。

Windows サポートは存在しますが、macOS ほど十分にテストされていません。動作はします——CI でビルドし、実際に動かしました——ただ、私が毎日使っているのは macOS で、エッジケースが最もカバーされているのもそちらです。

ツール呼び出しループでの AIレスポンスのストリーミングは、まだ未実装です。AIはすべてのツール呼び出しが完了してから応答します。このレイテンシのトレードオフは 1.1 で再検討します。

プラグインシステムとユーザー定義ツールは、ロードマップにあります。1.0 には含まれていません。

ダウンロード

バイナリは GitHub Release から入手できます。

macOS Apple Silicon、Windows x86_64、Windows ARM64 に対応しています。

ソースコードは GitHub にて Apache 2.0 ライセンスで公開中です。バグ報告やセキュリティモデルについての議論は、Issues と Discussions をご利用ください。