aitm 1.0:AIをコパイロットに、ハンドルは自分で
目次
ターミナルの中で AI を使ってコーディングをしていたとき、ある問題に気づきました。AI がファイルを変更しても、同じウィンドウの中でその変更を確認する方法がなく、アプリを切り替えてまた戻る——その繰り返しがずっと気になっていました。
欲しかったのはシンプルなことです。ターミナルとAIとファイル、この3つが同じウィンドウの中にあること。コンテキストスイッチなしで作業できること。
それを作ったのが aitm です。

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 のツール呼び出しで、クローズドループで動きます。
- サイドバーでAIに質問する
- AI がコンテキストを必要と判断し、
list_files/read_file/get_terminal_history/search_historyを呼び出す - aitm が読み取り専用のツールを自動実行し、結果をAIに返す
- AIがコマンドを実行したい場合(
run_command)、そこで止まり、あなたを待つ - コマンドの全文を確認し、承認または拒否してから実行される
ステップ 1〜3 は中断なく流れます。ステップ 4 が黙って実行されることは絶対にありません。この境界——読み取りは自動で流れ、実行は人間を待つ——が、設計のすべてです。
AIは聞かれる前からコンテキストも受け取ります。現在の git ブランチ、作業ディレクトリ、変更状態、リッスン中のポート。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 の警告は出ません。


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 をご利用ください。
コメント