プログラミング
Show HN: Graphify C# – コーディングエージェント向けのコンパイラ精度での「使用箇所の検索」
Show HN: Graphify C# – Compiler-accurate Find Usages for coding agents (github.com)
要約
Graphify C#は、C#コードベースをコンパイラレベルで正確に解析し、シンボルの参照関係(呼び出し元、実装、継承など)をグラフ構造で抽出するツールです。これにより、AIコーディングエージェントはコードの意味を推測するのではなく、確実な情報に基づいてコードのナビゲーションや分析を行えるようになります。IDE不要で、MITライセンスで提供されています。
全文翻訳
graphify-csharp 🚀 コーディングエージェント向けに、コンパイラ精度での「使用箇所の検索」機能を提供します。
graphify-csharp は、C#ソースコードを決定論的でクエリ可能なセマンティック証拠に変換する、無料のヘッドレス Roslyn/MSBuild インデクサーです。これには、オーバーロード、ジェネリック、プロジェクトをまたぐ呼び出し元、参照、実装、継承、オーバーライドが含まれます。
Rider/ReSharper のセマンティックナビゲーション部分を、Codex、Claude Code などのコーディングエージェント向けにエクスポートしたものと考えてください。
MITライセンス · IDE不要 · コンパイル済みプロジェクトDLL不要 · データベース不要 · Graphifyはオプション
エージェントに推測させるのはやめましょう
例えば、次のような質問をするとします。「テストのみで使用されているメソッドはどれか?」
テキスト検索では、一致するスペルを見つけることはできます。しかし、どのオーバーロードがバインドされたか、呼び出し元がどのプロジェクトに属するか、インターフェイスの実装が意図したシンボルであるかなどを確実に特定することはできません。
Graphify C# は MSBuild を通じてプロジェクトをロードし、Roslyn に各シンボルが実際に何を意味するかを問い合わせます。これにより、エージェントが推測するのではなく検査できる、安定したIDと有向関係が出力されます。
セマンティックインデックスなしの場合
Graphify C# の場合
名前の一致が使用箇所のように見える
Roslyn が正確な宣言を解決する
オーバーロードとジェネリックは曖昧
バインドされたシグネチャとプロジェクト/TFMのIDが保持される
テストのみの使用は手動検査が必要
すべての呼び出し元にプロジェクト、名前空間、ソースの場所が含まれる
型関係はテキストから再構築される
継承、実装、オーバーライドが明示的なエッジになる
例えば、このリポジトリには内部の DeclarationCatalogBuilder.ForTesting(...) メソッドが含まれています。
抽出されたグラフから、エージェントは1つのコンパイラ解決済みの着信呼び出しを確認できます。
Graphify.CSharp.Roslyn.DeclarationCatalogBuilder.ForTesting(...)
└── Graphify.CSharp.Tests.Roslyn.CSharp14FeatureTests (tests/Graphify.CSharp.Tests/Roslyn/CSharp14FeatureTests.cs:143) によって呼び出される
これはセマンティック証拠であり、テキスト一致のカウントではありません。
コンシューマーは、プロジェクトや名前空間の規約によって呼び出し元を分類し、人間によるレビューのためにメソッドをテスト専用として報告できます。
クイックスタート
1. dotnet ツールをインストールする
install --global Graphify.CSharp --framework net10.0
2. コードベースをインデックス化する
graphify-csharp \
--input ./src/MyProduct.sln \
--root . \
--configuration Release \
--output ./graphify-out/csharp.json
結果は、ノード、エッジ、ハイパーエッジを含む1つの完全なJSONドキュメントになります。これはエージェントによって直接読み取られたり、jqでクエリされたり、独自のコードから消費されたり、Graphifyに渡されたりできます。
サポートされる入力は、.sln、.slnx、.csproj、およびSDKファイルベースの.csアプリです。
リポジトリのSDK、パッケージ、MSBuildの入力はローカルで利用可能である必要があります。
3. エージェントに使い方を教える
付属の graphify-csharp スキルは、エージェントにインデックスをいつリフレッシュするか、セマンティックエッジをどのようにたどるか、静的分析がどこで終わるかを教えます。
Codex互換プロジェクトにインストールします。
mkdir -p .agents/skills/graphify-csharp
curl -fsSL \
https://raw.githubusercontent.com/zachsaw/graphify-csharp/main/.agents/skills/graphify-csharp/SKILL.md \
-o .agents/skills/graphify-csharp/SKILL.md
Claude Code の場合は、代わりに .claude/skills/graphify-csharp/SKILL.md を使用してください。
スキルをインストールまたは更新した後は、エージェントセッションをリロードしてください。
スキルを使用しない場合は、プロジェクトの指示に次を追加してください。
C# の構造と使用に関する質問については、回答する前に graphify-out/csharp.json を graphify-csharp でリフレッシュしてください。シンボルキーで宣言を識別し、着信呼び出しと参照エッジを検査してください。ゼロの着信エッジを、実行時到達不可能性の証拠ではなく、観測された静的証拠として扱ってください。
これでエージェントに次のように質問できます。
この正確なオーバーロードまたはコンストラクタを呼び出すものは何ですか?
このフィールド、プロパティ、イベント、または型を参照するソース宣言は何ですか?
どのクラスがこのインターフェイスを実装していますか?
どのメンバーがこの仮想メンバーまたはインターフェイスメンバーをオーバーライドしていますか?
観測された着信参照がゼロの宣言は何ですか?
テストプロジェクトからのみ参照されているメソッドは何ですか?
IDEナビゲーションからエージェントの証拠へ
Rider で開発者が行うこと
Graphify C# がエージェントに提供するもの
使用箇所の検索
有向でコンパイラ解決済みの呼び出しおよび参照エッジ
実装へのジャンプ
正確なインターフェイス契約への実装エッジ
基本型および派生型を区別する
継承およびオーバーライドエッジ
オーバーロードとジェネリックの区別
バインドされたシグネチャ情報を持つ安定したシンボルID
大規模ソリューションの検査
プロジェクト、ターゲットフレームワーク、ソース場所、およびプロビナンスメタデータ
編集しながらナビゲーションを維持
オプションのウォームウォッチャーによる増分インデックス作成
抽出プログラムが事実を提供します。エージェントまたはダウンストリームコンシューマーが、それらの事実の意味を決定します。テスト専用の使用、観測された参照ゼロ、削除候補、または人間によるレビューが必要なものなどです。
どこに位置づけられるか
Graphify C# は、意図的に焦点を絞ったレイヤーをカバーしています。
Rider と ReSharper は、IDE 内の開発者向けにインタラクティブなナビゲーション、インスペクション、リファクタリング、クイックフィックスを提供します。
NDepend は、依存関係分析、メトリクス、ルール、レポート、ベースライン、および視覚化を中心に構築された、広範な商用アーキテクチャおよびコード品質スイートを提供します。
Graphify C# は、コーディングエージェント向けに、ソースレベルの C# セマンティック証拠を、ヘッドレスでオープンな形式で提供します。
NDepend との間には、呼び出し元、依存関係、継承、デッドコード調査に関して実際の重複があります。
違いは製品の境界です。Graphify C# は無料の NDepend クローンでも IDE の代替でもありません。他のツールやエージェントが構築できる、Roslyn ネイティブのセマンティックインデックスです。
Graphify と一緒に使う — または使わずに
Graphify C# はスタンドアロンです。Graphify を呼び出したり、ロードしたり、必要としたりしません。
Graphify なしでは、エージェント、jq、C#、Python、またはその他のコンシューマーで JSON をクエリします。
例えば、インデックス化されたすべてのメソッドをリストします。
jq '.nodes[] | select(.properties.node_kind == "method")' \
graphify-out/csharp.json
Graphify を使用すると、C# の証拠をリフレッシュし、より高レベルのクエリ、パス、説明、クラスタリング、エクスポートワークフローを使用できます。
graphify query "Which methods call the order service?" \
--graph ./graphify-out/csharp.json
Graphify は一般的なグラフワークフローのままです。graphify-csharp は、コンパイラバインディングが重要な C# レイヤーに貢献します。
何がインデックス化されるか
ソース宣言
名前空間、クラス、構造体、インターフェイス、レコード、列挙型、デリゲート
コンストラクタ、メソッド、演算子、ローカル関数
プロパティ、インデクサ、フィールド、列挙メンバー、イベント
パラメータ、ローカル変数、型パラメータ、エイリアス、ラベル、クエリ範囲変数
コンパイラ解決済みの関係
直接呼び出し、コンストラクタ呼び出し、メソッドグループ、メンバーアクセス
フィールド、型、属性、ジェネリック、typeof、宣言ヘッダー参照
継承、実装、オーバーライド
コンパイラ選択の演算子、変換、デコンストラクション、foreach、await、using、パターン、範囲、コレクション式
ソースの形式パラメータにバインドされた呼び出しおよびコンストラクタ引数
オーバーロードを認識し、プロジェクト/TFMを認識するIDを持つクロスプロジェクト関係
すべてのエッジは、関係が観測された宣言から、Roslyn が解決した宣言へと向かいます。
ソースの場所とプロビナンスは保持されます。
サポートされていないセマンティック形状は、サイレントに消えたり、抽出全体をクラッシュさせたりするのではなく、診断として報告されます。
完全な言語およびコンパイラ機能マトリックスについては、互換性を参照してください。
インデックスをウォームに保つ
繰り返しエージェント作業を行う場合は、ウォッチャーを開始します。
graphify-csharp \
--input ./src/MyProduct.sln \
--root . \
--configuration Release \
--output ./graphify-out/csharp.json \
--watch
ウォッチャーは Roslyn ワークスペースをウォームに保ち、変更されたプロジェクトをバックグラウンドで準備します。
通常の graphify-csharp 呼び出しは、明示的なリフレッシュバリアとして機能し、完全な JSON スナップショットが最新になった後にのみ返されます。
一致するウォッチャーが実行されていない場合、同じコマンドはワンショットリフレッシュを実行します。
増分キャッシュを無効にするには --rebuild を使用します。
ウォッチャーの所有権、フィルタリング、リカバリ、キャッシュ動作については、使用法と増分インデックス作成を参照してください。
ランタイムおよび言語サポート
パッケージには2つのツールアセットが含まれています。
ツールアセット
ランタイム
コンパイラサーフェス
net10.0
.NET 1