Claude Codeを大規模プロジェクトで使うとき、設計文書・アーキテクチャガイドライン・ADR(Architecture Decision Record)などをどう渡すかが大きな課題になります。よく取られるのが「エージェントにfindやgrepで探させる」方法ですが、これは思った以上に問題があります。
この記事では、RAGではなくDAG(有向非巡回グラフ)の依存関係に基づいて設計文書を“コンパイル”して渡すアプローチと、それを実現するMCPツールAegisを紹介します。Laravelプロジェクト(17モジュール・140超のUseCase)での実測では、消費トークン12分の1・応答速度3.5倍を達成しています。
MCPの基礎はMCP完全ガイドを、大規模コードベースでの一般的な戦略は大規模コードベースガイドを参照してください。
コーディングエージェントのコンテキスト問題
AI開発が進むと、AGENTS.md・設計書・仕様書・ADRといった文書が増えていきます。エージェントはコードを書く前にこれらを参照すべきですが、現状は以下の問題が起きがちです。
| 方法 | 問題点 |
|---|---|
| エージェントにfind/grepで探させる | ツール呼び出しが増え(55回など)、大量トークンを探索コストとして消費 |
| RAGで意味検索 | 実装キーワードと必要な設計ルールの間にセマンティックギャップがあり、本当に必要な文書を安定して引けない |
| 全文書をコンテキストに詰める | 関係ない文書まで入り、コンテキスト圧迫・コスト増大 |
特にRAGの問題は、「UseCase を実装するときに必要なガイドライン」を「UseCase」という単語で検索しても、本当に必要な文書に辿り着けないことです。設計意図は命名規則やUseCase命名に含まれているとは限りません。
「検索」ではなく「コンパイル」という発想転換
Aegisの基本アイデアはシンプルです。「どのファイルを編集するか」がわかれば、「そのファイルを正しく書くために必要な文書」も事前に定義できるという考え方です。
たとえばapp/UseCases/配下のファイルを編集するなら:
usecase_guidelines.md(UseCase実装のガイドライン)entity_guidelines.md(UseCaseが依存するEntityのルール)exception_guidelines.md(例外処理方針)
この「usecase_guidelines.mdはさらにentity_guidelines.mdとexception_guidelines.mdに依存する」という関係をDAG(有向非巡回グラフ)として定義し、ファイルパスを渡すだけで必要な文書群を芋づる式に取得できます。
| 比較軸 | RAG(検索) | Aegis(コンパイル) |
|---|---|---|
| 仕組み | ベクトル類似度でランキング | DAG依存関係を再帰的に解決 |
| 再現性 | 非決定論的(同じ入力でも結果が変わる) | 決定論的(同じ入力→常に同じ文書) |
| 設計意図 | セマンティックギャップで落ちやすい | ADRも依存関係に含めれば確実に届く |
| トークン効率 | 関連度の低い文書も混入 | 必要最小限の文書だけ取得 |
実測パフォーマンス比較
Laravelプロジェクト(17モジュール・140超のUseCase)で「UseCase を実装する上での注意点は?」という同じ質問をClaude Codeに投げた結果です。
| 指標 | Aegisなし | Aegisあり | 改善 |
|---|---|---|---|
| 応答時間 | 2分32秒 | 43秒 | 約3.5倍高速化 |
| 出力トークン | 10.3Kトークン | 1.8Kトークン | 約82%削減 |
| ツール呼び出し | 55回 | 約6回 | 約89%削減 |
| 探索コスト | 65.4Kトークン | 最小限 | 約12倍削減 |
| 回答の質 | 既存パターンの列挙 | ADRを含む設計意図まで踏まえた回答 | 質的改善 |
数値の改善だけでなく、設計意図(ADR)まで届く回答品質の向上が大きなポイントです。コスト管理の観点はコスト管理完全ガイドも参照してください。
AegisのDAGアーキテクチャ
Aegisは内部でSQLiteにドキュメントとファイルの依存関係を保持し、再帰CTE(Common Table Expressions)で依存を解決します。
4段階のルーティングで必要な文書を決定します:
- パスマッチング:グロブパターンでターゲットファイルと照合
- レイヤー解決:ファイルパスからアーキテクチャレイヤーを推論
- コマンド依存:scaffold/refactor/reviewなど操作タイプ別の依存を処理
- 推移閉包:doc_depends_onエッジを再帰的にたどる
重要な設計原則としてAgent Surface(読み取り専用)とAdmin Surface(管理専用)の完全分離があります。エージェントは知識ベースを直接変更できず、変更は人間が承認して初めて反映されます。
| サーフェス | 役割 | 主なツール |
|---|---|---|
| Agent Surface(読み取り専用) | コンテキスト取得・観察記録 | aegis_compile_context, aegis_observe |
| Admin Surface(管理操作) | 文書管理・提案の承認/却下 | aegis_import_doc, aegis_approve_proposal, aegis_reject_proposal |
Claude Codeへの導入手順
ステップ1:MCPサーバーを追加する
# Agent サーフェス(読み取り専用・エージェント用) claude mcp add aegis -- npx -y @fuwasegu/aegis --surface agent # Admin サーフェス(管理用・ドキュメント登録や提案承認に使う) claude mcp add aegis-admin -- npx -y @fuwasegu/aegis --surface admin
ステップ2:プロジェクトを初期化する
# プロジェクトをスキャンして初期化状態を検出 aegis_init_detect # 検出結果を確認して初期化 aegis_init_confirm
ステップ3:IDE固有のアダプタを生成する
npx @fuwasegu/aegis deploy-adapters # → CLAUDE.md に Aegis 使用指示が追記される # → .aegis/aegis.db (SQLite) が作成される
ステップ4:設計文書をインポートする
Admin Surfaceから設計文書を取り込み、ファイルパスとの対応関係を定義します。
# aegis-admin ツールとして呼び出す
aegis_import_doc({
"path": "docs/usecase_guidelines.md",
"layer": "application",
"glob_patterns": ["app/UseCases/**/*.php"]
})
# 依存関係の定義(usecase_guidelinesはentity_guidelinesに依存)
aegis_import_doc({
"path": "docs/entity_guidelines.md",
"layer": "domain"
})
使い方:aegis_compile_contextで文書を取得する
セットアップが完了したら、コードを書く前にaegis_compile_contextを呼ぶだけです。CLAUDE.mdにdeploy-adaptersで指示が追記されるため、以後Claude Codeは自動的にこのツールを呼ぶようになります。
# 編集予定のファイルを渡すと、必要な設計文書を返す
aegis_compile_context({
"target_files": [
"app/UseCases/Order/CreateOrderUseCase.php"
],
"command": "scaffold",
"plan": "注文作成のUseCaseを新規実装する"
})
# → usecase_guidelines.md
# → entity_guidelines.md(UseCaseが依存するEntityのルール)
# → exception_guidelines.md(例外処理方針)
# が自動的に返ってくる
引数のcommandはscaffold・refactor・review・bugfixなど操作タイプで、コマンドによって異なる依存文書が返ります。planは自然言語の実装予定説明で、より精度の高い文書選択に使われます。
Observationサイクル──エージェントが知識ベースを育てる
Aegisには「エージェントが自分で知識ベースの改善提案をできる」仕組みがあります。ただし、知識ベースへの書き込み権限はエージェントに与えず、人間の承認が必須です。
# ステップ1: エージェントがコードを書いたあとにセルフレビュー
# 「entity_guidelinesが足りなかった」と判断したら観察を記録
aegis_observe({
"event_type": "compile_miss",
"related_compile_id": "compile_abc123",
"payload": {
"missing": "entity_guidelines.md",
"context": "Entityの不変条件チェックを見落とした"
}
})
# ステップ2: 観察から提案を生成(Admin Surface)
aegis_process_observations()
# → Proposal が生成される
# ステップ3: 人間が提案を確認・承認
aegis_list_proposals() # 提案一覧を確認
aegis_approve_proposal({ "proposal_id": "prop_xyz" }) # 承認
# → 知識ベースに反映される
| event_type | 意味 |
|---|---|
| compile_miss | 必要なガイドラインが不足していた |
| review_correction | エージェントの提案を人間が修正した |
| pr_merged | 変更が正常にマージされた(成功シグナル) |
| manual_note | 人間がキュレーションしたコンテキスト |
| document_import | 文書インポートイベント |
このサイクルにより、使い続けるほどAegisの知識ベースが精度を増していきます。「エージェントが学習を提案し、人間が承認する」という人間起点のフィードバックループが設計の核心です。
どんなプロジェクトに向いているか
| 向いている | 向いていない |
|---|---|
| 設計文書・ADRが多いプロジェクト | 設計文書が少ないシンプルなプロジェクト |
| アーキテクチャが明確に分層されているコードベース | まだ設計が固まっていない初期フェーズ |
| チームでClaude Codeを使っている | 個人の単一ファイル編集が中心 |
| 代替エージェント(Cursor/Codex)も使うチーム | Claude Code専用で文書量が少ない |
AegisはClaude Code・Cursor・Codexの3つに対応しています。チームで複数のAIエージェントを使い、かつ設計文書を一貫して参照させたいケースで特に効果を発揮します。
コンテキスト設計の全体論はコンテキストエンジニアリングガイドも参照してください。
よくある質問
aegis_import_docでMarkdownファイルのパスを渡すと取り込めます。初回はaegis_init_detectがプロジェクトをスキャンしてスタック(Laravel/Next.js等)を検出し、テンプレートを提案してくれます。ファイルパスのグロブパターンと文書の対応関係は、最初に手動で定義する必要があります。量が多い場合は徐々に追加していくのが現実的です。.cursor/mcp.jsonに設定を追加し、npx @fuwasegu/aegis deploy-adaptersでCursor用ルールファイル(.cursor/rules/aegis-process.mdc)が自動生成されます。チームで複数のエージェントを使っている場合でも、同じAegisの知識ベースを共有できます。

