再掲載にあたっての注記: 著者の許可を得て、abn.isの元の投稿(2026年7月24日公開)から再掲載しています。 ArunがGoogle Antigravityプラグインを構築し、Nowledge Labsに寄贈しました。 現在はnowledge-co/nowledge-mem-google-antigravityにあります。 技術的な内容、見出し、コード、スクリーンショットは彼のものです。 Nowledge Labsは4か所を変更しましたが、いずれも本質的な部分ではありません。 元の冒頭は「私たちがどのように設計し構築したかを説明します」となっていますが、私たち自身のブログでArunの署名の下に置くと、私たちが構築したかのように読めてしまうため、ここでは「私がプラグインがどのように設計され構築されたかを説明します」としています。 元の結びの段落は、読者にArunへの連絡を促し、私たちの投稿へ案内していますが、ここではその2つ目の案内が循環的になるため省略しています。 元のコールアウトボックスは、このブログが代わりにレンダリングする引用ブロックとして表示されます。 また、5つの図は元のMermaidソースからインラインでレンダリングされているため、そのラベルは画像の中に閉じ込められるのではなく、ページのテキスト内に配置されています。
AIコーディングアシスタントは高速で高性能ですが、初期状態では新しい会話はすべて空から始まります。 過去のバグ修正、アーキテクチャ上の選択、ドメイン固有の落とし穴、好みのワークフローは、あなたの頭の中にしか存在しないか、長いチャットログの中に消えていきます。
Nowledge Memは、AIエージェントに永続的な個人ナレッジベース(アトミックなメモリ、日々のワーキングメモリブリーフィング、常設ルール、証拠追跡付きの実行可能なスキルを保存する)を提供することで、これを解決します。
AI ツールは変わります。あなたのメモリは複利で積み上がるべきです。Mem は会話、意思決定、そしてあなたのエージェントがツールをまたいで発見したことを運びます。すべてのセッションはそれ以前のものの上に築かれ、次のセッションをより賢くします。
Google Antigravity 2.0で、Googleはエージェントのカスタマイズのためのプラグインアーキテクチャを導入しました。
この記事では、nowledge-mem-google-antigravityプラグインがどのように設計され構築されたかを説明します。
低レイテンシ、オフライン耐性、開発者の制御に焦点を当てたハイブリッド統合です。
プラグインのソースはnowledge-co/nowledge-mem-google-antigravityにあります。
1. Nowledge Memがもたらすもの
Nowledge Memは、受動的なログストアではなく、AIエージェントのための能動的な個人ナレッジエンジンです。
Nowledge Memが提供する主な機能:
- 状況コンテキストバンドル: 進行中の取り組み、注力領域、メモリ参照を起動時ブリーフィングにまとめます(
<nowledge_context_bundle>)。 - 常設ルール: グローバルおよびエージェント固有の行動制約(セキュリティの秘匿化、Flatpak D-Busルール、コード規約)をセッションをまたいで自動的に適用します。
- コンパイル済みエージェントスキル: 実際の過去の作業からコンパイルされ、テストケースに対して検証され、信頼バッジ(Checked対Proven)が割り当てられた反復可能な手順(
SKILL.mdバンドル)。 - Nowledge FS(
mem_fs): ナレッジツリーをクリーンに探索するための、統合されたパス優先の仮想ファイルシステム(/memories、/threads、/wiki、/skills)。
ナレッジ埋め込み推論のニーズにローカルモデルを使用する
Nowledge Memはローカルモデルをすぐに使える形でサポートしています。 GPUバウンドとCPUバウンドの両方の埋め込みモデル、およびバックグラウンドインテリジェンスタスクのためのオンデバイス推論をサポートしています。
私は個人的に、ローカルモデルの管理にLemonade Serverを使っており、埋め込みにはNPUも使用しています。 Nowledge MemはLemonadeをファーストクラスのLLM Providerとしてサポートしています。
2. Google Antigravity 2.0のプラグインアーキテクチャ
Google Antigravity 2.0は、プラグインを、すべてのエージェントカスタマイズタイプを単一の構造にバンドルする名前空間付きパッケージとして定義しています:
nowledge-mem-google-antigravity/
├── plugin.json # Required manifest
├── mcp_config.json # MCP Server definitions
├── hooks.json # PreInvocation, PreToolUse, and Stop lifecycle hooks
├── rules/ # Always-on system rules
│ └── nowledge-mem.md
└── skills/ # Bundled agent skills
├── nmem-memory-search/
├── nmem-skill-load/
└── nmem-thread-save/Antigravityが起動すると、2つのプラグイン配置場所をスキャンします:
- ワークスペースレベル:
<workspace-root>/.agents/plugins/(プロジェクト固有)。 - グローバルレベル:
~/.gemini/config/plugins/(すべてのプロジェクトで利用可能)。
3. 主要な設計上の決定とアーキテクチャの根拠
ローカルまたはリモートのナレッジベースを自律エージェントエンジンに接続するには、3つのエンジニアリング上の制約のバランスを取る必要があります:
- レイテンシ: フックの実行は、開発者をブロックすることなくミリ秒単位で完了しなければなりません。
- 耐性: ネットワークの瞬断やサンドボックス環境の制限によって、セッションがクラッシュしたりデータが失われたりしてはなりません。
- UX制御: 開発者は、繰り返しの確認プロンプトなしに、重要な状態変更を承認できるべきです。
以下は、私たちの中核的なアーキテクチャ上の決定の背後にある技術的根拠です。
A. 3つの起動チャネル(コンテキスト経済性の根拠)
モデルプロンプトを肥大化させることなくコールドスタートを排除するため、プラグインは3つの相補的なチャネルを通じてAntigravityを初期化します:
設計根拠(コンテキストのスライス 対 プロンプトの肥大化)
ナレッジグラフ全体をシステムプロンプトにインライン展開すると、深刻なコンテキストの肥大化と高コストなKVキャッシュのペナルティを引き起こします。 起動時のナレッジを3つの異なるレイヤーに分割することで:
- チャネル1(PreInvocationフック) は、今日のアクティブなブリーフィングと直接のメモリリンクのみを注入します(
nowledgemem://memory/<id>)。- チャネル2(常時オンのシステムルール) は、永続的な行動境界を設定します。
- チャネル3(利用可能なスキルインデックス) は、軽量なポインタを提供し、アクティブなタスクが明示的に必要とするまでスキル本体の完全な取得を遅延させます。
B. 階層化されたトランスポートアクセス(パフォーマンスとサンドボックス化の根拠)
バックグラウンドフックのためにCLIサブプロセスを起動すると、呼び出しごとに300〜500msのレイテンシが追加されます。
実行を30ms未満に保つため、hooks/nmem_shared.pyに3階層のハイブリッドトランスポート階層を実装しました:
設計根拠(階層化アクセスとサンドボックスセキュリティ)
- 階層1(ネイティブPython HTTP REST): Pythonのゼロ依存の
urllib.requestを使用して、/context、/working-memory、または/threads/importをHTTP経由で直接クエリします(30ms未満)。 リモートのMemエンドポイントに対しては、nmem_shared.pyがAuthorization: BearerおよびX-MEM-API-Keyヘッダーを自動的に注入します。なぜネイティブHTTPが最初なのか? サブプロセスのインスタンス化(subprocess.run)は重いOSオーバーヘッドを伴います。 直接のRESTクエリはフックのレイテンシを約400msから30ms未満に引き下げ、セッションの初期化が開発者の流れを妨げないようにします。- 階層2(マルチパスのシステムCLI): HTTPが失敗した場合、またはローカルCLIツールが必要な場合は、
nmemにフォールバックします。なぜマルチパス解決なのか? サンドボックス化されたツールサブシェル(BypassSandbox: false)では、ユーザーディレクトリ内のシンボリックリンク(~/.local/bin/nmem)が、アクティブなワークスペースの外を指している場合に隠されたりブロックされたりすることがよくあります。nmem_shared.pyはシンボリックリンクを逆参照し、正規のシステムパッケージパス(/usr/lib/nowledge-mem/nmem、/usr/lib64/nowledge-mem/nmem)をチェックすることで、厳格なサンドボックス内でのシェル実行の信頼性を保証します。- 階層3(ローカルバッファキュー): セッション終了時にバックエンドにまったく到達できない場合(オフラインのノートPCでの作業など)、
session-end.pyはセッショントランスクリプトのペイロードをファイルロックされたオフラインキュー(~/.nowledge-mem/antigravity_unsynced.json)に書き込みます。なぜオフラインキューイングなのか? セッションデータと学習提案は、ネットワークの瞬断によって失われてはなりません。 バックグラウンドの再試行ワーカーが、再接続時にキューに入ったセッションを自動的にフラッシュします。
C. 動的なMCP設定の同期(Git衛生の根拠)
Nowledge Memがリモートサーバー(またはhttps://mem.example.comのようなTailscaleネットワーク)で動作している場合、クライアントの~/.nowledge-mem/config.jsonはリモートのapiUrlとapiKeyを保存します。
しかし、AntigravityのMCPクライアントはmcp_config.jsonを読み取ります。
mcp_config.jsonがhttp://127.0.0.1:14242をハードコードしていると、MCPツールは403 Forbiddenで失敗します。
これをクリーンに解決するために:
- セッション開始時に、
session-start.pyがnmem_shared.sync_mcp_config_file()を呼び出します。 - 実効的なURL/Keyを解決します(
NMEM_*環境変数 →~/.nowledge-mem/config.json→127.0.0.1:14242)。 - リモートサーバーを指している場合、ディスク上の
mcp_config.jsonをリモートの/mcp/エンドポイントで自動的に更新し、Authorization: BearerおよびX-MEM-API-Keyヘッダーを注入します。
{
"mcpServers": {
"nowledge-mem": {
"serverUrl": "https://mem.example.com/mcp/",
"headers": {
"APP": "Google Antigravity",
"Authorization": "Bearer nmem_sec_...",
"X-MEM-API-Key": "nmem_sec_..."
}
}
}
}設計根拠(Git衛生)
mcp_config.jsonファイルは.gitignoreに記載されています。 開発者やコントリビューターは、プラグインリポジトリをgit cloneしたりシンボリックリンクしたりすることがよくあります。 セッション開始時にmcp_config.jsonを個人のリモートエンドポイントを指すように動的に更新すると、煩わしいgit statusの差分が生じます。mcp_config.jsonをGitで無視することで、ローカルのランタイム設定の同期が、作業ツリーを汚すことなくその場で行われます。
D. ゼロレイテンシのホストスキル接続と同期
Nowledge Memはサーバー上でスキルをコンパイルし結晶化します。 アクティブなスキルがAntigravityで自動的に接続され、最新の状態に保たれるようにするために:
セッション開始時に、session-start.pyがノンブロッキングのバックグラウンドデーモンスレッドを起動します:
def sync_host_skills_async():
# Connect host agent 'antigravity' & refresh client assets
run_nmem_command(["skills", "connect", "antigravity"])
run_nmem_command(["skills", "sync"])設計根拠(非同期実行と競合状態の処理)
- なぜバックグラウンド非同期なのか? 起動時に
nmem skills connectとnmem skills syncを同期的に実行すると、開発者はネットワークの往復のために1〜2秒待たされます。 バックグラウンドデーモンスレッドで実行すると、セッション起動に0msのオーバーヘッドしか追加されません。- 競合状態のフォールバック: バックグラウンド同期スレッドが完了する前に、エージェントがターン1で即座にスキルコマンドをトリガーした場合、プラグインはローカルの
.agents/skills/キャッシュを使用するか、直接REST APIの取得にフォールバックし、実行の停滞を防ぎます。
E. 楽観的なスレッド末尾の調整(データ整合性の根拠)
長時間実行されるAntigravityセッションが停止したとき、標準的な追記操作でトランスクリプトを保存すると、セッションログが以前に部分的に書き込まれていた場合に重複メッセージが作成される可能性があります。
これを解決するため、hooks/session-end.pyはNowledge MemのPOST /threads/{id}/reconcile-tailエンドポイントを利用します:
設計根拠(楽観的な末尾の調整)
素朴なトランスクリプトの追記は、長い会話が再開されたり部分的にフラッシュされたりすると破綻します。
reconcile-tailは楽観的な末尾マッチングを使用します。 既存のリモートメッセージと新しいログステップを比較し、matched_count(変更されていない先頭メッセージの数)を計算し、変更された末尾のみを安全に置き換えます。 オフラインセッションのペイロードが後でantigravity_unsynced.jsonからフラッシュされる場合、再試行ワーカーは再接続時に同じ末尾マッチングロジックを評価します。
F. 標準化されたドメイン名前空間(nmem-<domain>-<action>)
10個のプラグインスキルはすべて統一された命名パターン(nmem-<domain>-<action>)に従います:
skills/
├── nmem-fs-explore/ # Navigation & tree exploration
├── nmem-memory-distill/ # Atomic memory distillation
├── nmem-memory-search/ # Deep & semantic memory recall
├── nmem-memory-working/ # Daily working memory reader
├── nmem-skill-load/ # On-demand skill discovery & injection
├── nmem-skill-manage/ # Workspace skill manager & suggestion engine
├── nmem-skill-propose/ # Authoring & submitting new skills
├── nmem-status/ # Diagnostic connection status
├── nmem-thread-handoff/ # Resumable handoff summaries
└── nmem-thread-save/ # Full transcript importerこのレイアウトにより、スキルはIDEのオートコンプリート、ファイル一覧、プロンプトインデックスでクリーンにグループ化され、対応するスラッシュコマンドトリガー(例: /nmem-skill-load <query>、/nmem-thread-save)も提供されます。
4. 開発者が制御する: Antigravityの豊富なUXを活用する
開発者を繰り返しのテキストチャット確認ループに強いる代わりに、プラグインはAntigravityのネイティブで豊富なUI要素を活用します:
1. インタラクティブな複数選択プロンプト(ask_question)
スキルを発見またはインストールするとき(/nmem-skill-manage)、エージェントはis_multi_select: trueを伴うask_questionを使用して選択可能なチェックボックスを提示し、推奨オプションを最初に表示します。
インタラクティブな複数選択の質問の例
2. 続行プラン成果物(skills_installation_plan.md)
より大きなワークスペース更新やメモリの蒸留のために、プラグインはRequestFeedback: trueを伴う構造化されたMarkdown成果物を<appDataDir>/brain/<conversation-id>/に書き込みます:
# Skill Installation Plan
| Skill ID | Trust Badge | Description | Target Path | Git Strategy |
| :--- | :--- | :--- | :--- | :--- |
| `makefile-pattern` | **Proven** | Makefile standards | `.agents/skills/makefile-pattern/` | Git Exclude |
| `docker-build` | **Checked** | Multi-stage Docker | `.agents/skills/docker-build/` | Committed |設計根拠(ローカルのGit除外 対 コミットされるスキル)
ユーザーがワークスペースにスキルをインストールするとき(
.agents/skills/<name>/SKILL.md)、一部のスキルはチーム全体の手順を表し(Gitにコミットすべきもの)、他のスキルは個人の開発者の好みを表します。 個人のワークフロールールでチームリポジトリを汚染するのを防ぐため、インストーラスクリプトは--ignoreをサポートしており、.gitignoreを汚すのではなく.git/info/excludeにエントリを追記します。

続行ボタン付きのドラフトプラン
5. 実践: 動的なスキル読み込み(/nmem-skill-load)
実際のタスク中にオンデマンドのスキル発見がどのように機能するかを示します:
- エフェメラルモード(再起動ゼロ): 取得した
SKILL.md本体を、構造化されたコンテキストブロック(<skill_instruction>)としてアクティブなターンのコンテキストに直接取り込みます。 これにより、Antigravityはディスクにファイルを書き込んだりワークスペースの再起動を必要としたりすることなく、現在のタスクのために専門的な指示に即座に従うことができます。 - 永続モード: ユーザーがローカルのみの分離を好む場合、スキルを
.agents/skills/<name>/SKILL.mdに書き込み、.git/info/excludeに.agents/skills/<name>/を追記します。


新しいセッションへのカスタム Makefile スキルの動的注入
まとめと始め方
Google Antigravity 2.0のプラグインフックとNowledge Memのハイブリッドトランスポートおよび豊富なUIインターフェースを組み合わせることで、高速で耐性があり、開発者中心のナレッジ統合を作り上げました。
クイックセットアップ
プラグインをインストール:
mkdir -p ~/.gemini/config/plugins/nowledge-mem
curl -sSL https://github.com/nowledge-co/nowledge-mem-google-antigravity/releases/latest/download/nowledge-mem-google-antigravity.tar.gz \
| tar -xz -C ~/.gemini/config/plugins/nowledge-mem接続を確認: Antigravityを再起動し、/nmem-statusを実行するか、nmem statusを確認します。
ナレッジを探索: /nmem-memory-search、/nmem-skill-manage、または/nmem-skill-load <query>を使用して、個人のナレッジベースをコーディングワークフローに持ち込みます。
任意の Antigravity 会話で利用可能なグローバルプラグインスキル
インストール後、/nmem-status を使用してすべてが正しく設定され動作しているかを確認できます
これで完了です。 あなたの個人コンテキスト、エンジニアリングナレッジ、ルールがすべて、エージェント開発ワークフローにシームレスに統合され、使うほどに絶えず成長していきます。