Graphify C# 0.1 版本發布 – 為 C# 編碼代理提供編譯器準確的「尋找使用位置」功能
簡要說明 – Graphify C# 的功能與重要性
Graphify C# 是一款免費、無頭的 Roslyn/MSBuild 索引工具,可為任何 C# 解決方案輸出由編譯器解析的符號、呼叫、參考、繼承與覆寫關係的確定性 JSON 圖形。透過提供此語意證據,編碼代理(例如 Claude Code、Codex 或自訂的 LLM 機器人)能以編譯器準確性回答「尋找使用位置」類型的問題,而非依賴不可靠的文字搜尋啟發式方法。
編碼代理的立即價值
- 精確的重載解析 – 圖形儲存已繫結的簽名,因此代理能區分
Foo(int)與Foo(string)。 - 專案感知的關係 – 每個邊都記錄來源專案與目標框架,支援如「僅在測試專案中使用的方法」等查詢。
- 完整的語言覆蓋 – 支援 C# 14(Roslyn 5.9)與 C# 15 預覽版(透過 .NET 11 SDK),包含泛型、模式比對、非同步與集合表示式。
- 零執行時依賴 – 無需 IDE、無需編譯後的 DLL,也無需外部資料庫;輸出為單一 JSON 檔案,任何消費者皆可讀取。
工具運作方式
- 安裝 – 安裝 .NET 全域工具:
dotnet tool install --global Graphify.CSharp --framework net10.0 - 索引 – 對解決方案、專案或 SDK 風格的原始碼資料夾執行 CLI:
此命令會產生包含三個頂層陣列的 JSON 文件:graphify-csharp \ --input ./src/MyProduct.sln \ --root . \ --configuration Release \ --output ./graphify-out/csharp.jsonnodes、edges與hyperedges。 - 使用 – 代理可直接讀取 JSON,使用
jq進行查詢,或將其輸入更廣泛的 Graphify 工作流程以進行路徑尋找、群集分析與解釋。 - 增量更新 – 加入
--watch可保持 Roslyn 工作區活躍,並在檔案變更時更新 JSON;--rebuild強制進行完整重新整理。
語意證據 vs. 純文字搜尋
| 無 Graphify | 使用 Graphify C# |
|---|---|
| 文字比對僅找到名稱字串。 | Roslyn 解析每個使用位置的確切宣告。 |
| 重載與泛型具有模糊性。 | 保留已繫結的簽名與專案/TFM 身份。 |
| 僅測試使用需手動檢視。 | 每個呼叫者皆攜帶專案、命名空間與原始碼位置。 |
| 類型關係需從文字推論。 | inherits、implements 與 overrides 以明確的邊呈現。 |
範例:方法 DeclarationCatalogBuilder.ForTesting 在圖形中僅有一個來自測試專案的入邊呼叫,讓代理能可靠地判斷為「僅在測試中使用」。
快速整合至 LLM 代理
此儲存庫提供可立即使用的 技能,適用於 Codex 相容代理與 Claude Code。安裝技能僅需一行指令:
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
此技能指示代理在回答 C# 相關問題前,先刷新 JSON,並在 traversing calls 與 references 邊時使用 symbol_key 識別碼。
若不願使用技能,只需在提示範本中加入以下指示:
針對 C# 結構與使用問題,請在回答前使用
graphify-csharp刷新graphify-out/csharp.json。以symbol_key識別宣告,並檢視入邊的calls與references。零入邊代表觀察到的靜態證據,而非執行時不可達的證明。
有了此上下文,代理可回答如下的問題:
- 呼叫了建構函式的哪個重載?
- 哪些類別實作了給定的介面?
- 哪些成員覆寫了虛擬方法?
- 哪些宣告沒有觀察到任何入邊參考?
Graphify C# 在生態系中的定位
| 工具 | 主要用途 | 與 Graphify C# 的重疊 |
|---|---|---|
| Rider / ReSharper | 互動式 IDE 導航、重構、檢查。 | 提供相同的語意邊,但僅限於 IDE UI 內。 |
| NDepend | 架構分析、指標、基準、視覺化。 | 提供類似的呼叫者/依賴資料,但為商業性、重量級套件。 |
| Graphify C# | 無頭、語言層級的語意索引,供代理使用。 | 以開放的 JSON 格式提供原始、編譯器準確的邊;無 UI、無授權限制。 |
Graphify C# 故意專注:它 不 試圖取代 NDepend 的報表或 Rider 的 UI,而是彌補自動化代理所需可靠靜態證據的缺失缺口。
性能與可擴展性考量
- JSON 大小 – 對於數百萬行程式碼的解決方案,輸出可能龐大。使用者曾詢問 SQLite 儲存是否更具可擴展性。目前工具輸出 JSON;下游消費者可依需求匯入資料庫。
- 執行時開銷 – Roslyn 僅在索引期間載入。
--watch模式保持工作區活躍,但索引仍是按需操作,非持續背景服務。 - 靜態分析限制 – 圖形僅反映 Roslyn 可靜態檢視的內容。反射、DI 容器、原生互操作與動態呼叫不會以邊呈現。因此,零入邊代表 零觀察到的靜態參考,而非保證執行時無用程式碼。
社群反饋(Hacker News)
bob1029:「我的 VS Copilot 已經會寫一次性 Roslyn 指令碼;Graphify C# 顯示出社群仍未充分運用 Roslyn 來支援 LLM 代理。」
spicyusername:「對即將推出的 C# 15 併集感到興奮;Graphify C# 已支援預覽編譯器。」
JFuzz:「已將技能調整用於 Unity 套件開發;CLI + JSON 工作流程讓語意資料可在 IDE 外取得。」
Merad:「擔心數百萬行程式碼下的 JSON 可擴展性;建議採用 SQLite 後端。" coverband:「詢問輸出格式是否與更廣泛的 Graphify‑Labs 生態系一致。」
quietraster:「想知道索引是在儲存時還是按需進行;工具是按需索引(或透過
--watch)。」
這些評論突顯了對此方法的熱情,以及對可擴展性與整合的實際疑問。
開始使用清單
- 安裝適當的執行時間 – 選擇
net10.0用於 Roslyn 5.9(C# 14)或net11.0用於 .NET 11 SDK(C# 15 預覽版)。 - 執行索引器 – 將
graphify-csharp指向你的解決方案;確認產生的csharp.json包含nodes與edges。 - 與你的代理整合 – 加入提供的技能,或將刷新與查詢指示嵌入提示中。
- 迭代 – 在開發期間使用
--watch,或在 CI 管道中排程定期刷新。
授權與貢獻
Graphify C# 以 MIT 授權釋出。儲存庫包含建置指令碼(dotnet restore、dotnet build、dotnet test、dotnet pack)與 docs/ 資料夾中的完整文件,涵蓋使用方式、相容性、增量索引與發行程序。
Sources
相關
- 專案