模型 / 資料集
redhat-et/ripwire avatar
redhat-et/ripwire

ripwire:把呼叫圖塞進 agent 的上下文預算裡

The ripgrep of AI context: a zero-dependency C++23 CLI + MCP server for coding agents. Find what you want without reading the repo, then check you built what you meant — blast radius, tests-to-run, quality deltas. Signatures at 74.7% fewer bytes than bodies; every guess labelled, every loss published. Paddle out with a map.

2,174 個 Star132 個 ForkC++Apache-2.0
GitHub

秒懂

它是什麼?
redhat-et/ripwire 是一個零執行期依賴的 C++23 命令列工具,同時提供 MCP server,替 coding agent 產生排序過的呼叫圖,回答「改這裡會炸到什麼、該跑哪些測試」。它的賣點不是準確度,而是把每一次猜測都標上標籤,把每一次截斷都寫出來。
適合誰用?
ripwire 適合已經在用 Claude Code、Codex、Cursor 這類能執行 shell 指令的 agent,且在意每次提問燒掉多少 token 的團隊;不適合需要跨語言型別推導、或要求精確呼叫關係的靜態分析場景,因為它的輸出本身承認自己是猜測。採用前先確認三件事:你主要語言是否落在它支援的清單內、ripwire . --for= 對你最常改的那個檔案給出的 blast radius 是否合理、以及在 ripwire.toml 裡調整 token 預算後,答案會不會直接變成「超出預算」而不是硬塞給你一份殘缺清單。
可以商用嗎?
可以。Apache-2.0 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
還在維護嗎?
有在維護。儲存庫最近一次提交在 1 天前。
用什麼語言寫的?
主要是 C++(依據 GitHub 的語言統計)。

以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。

開源專案深度解析

它解決的是 grep 迴圈,不是程式碼理解

coding agent 面對陌生 repo 的預設行為是 grep 加整檔讀取。找到符號定義,讀整檔;找到呼叫點,再讀整檔。README 把這件事講得很直白:一次呼叫後面接著三次 grep,等於同一次搜尋付了兩次錢,既沒省下 token,也沒讓改動變快。ripwire 的目標是讓一個問題在單次呼叫裡得到完整答案,這個目標它自己稱為 terminality。

對象很明確:手上有一台能跑 shell 指令的 agent,且每次對話都在跟上下文視窗搏鬥的人。README 列出的整合對象包括 Claude Code、Codex、Cursor、Windsurf、Gemini、opencode、aider。若你的工作流程是自己在編輯器裡跳轉定義,這個工具對你沒有增益,因為你不需要把地圖序列化成文字。

一個容易被忽略的定位細節:ripwire 宣稱的價值有一半建立在「不誠實的答案比沒有答案更貴」這個判斷上。計數無法保證是總數時標成 floor,零代表「沒找到」而非「不存在」,任何截斷都會揭露。這是產品設計上的取捨,不是行銷詞彙。

單一行程,沒有索引伺服器,也沒有 embedding

README 對架構的描述集中在「沒有什麼」:沒有 API key、沒有 embedding、沒有索引伺服器、沒有 daemon。執行方式是單一自包含的執行檔,在本機離線跑。

文件提供的量測數字是:在 django、webpack 與 ripwire 自身這三個 repo 上,索引時間落在 0.25 到 0.45 秒,記憶體 6.6 到 16.5 MB;對照的圖資料庫式 code-context MCP server 則是 23 到 52 秒、391 到 623 MB。熱查詢 197 ms 對 1,082 ms。這些數字來自 48 個配對問題,方法寫在 docs/EVALS.md。我沒有重跑這些測試,數字僅供你判斷量級,不構成對你 repo 的預測。

真正影響架構決策的是那條「MCP server 是選配的第二介面」。README 明講 CLI 是較便宜的介面,理由是 MCP 的 verb schema 每個 session 都會佔用 agent 的上下文,無論 agent 最後有沒有呼叫。這是一個少見的自我節制:專案同時提供 MCP 介面,卻在文件裡建議你先用 CLI。

解析層面,topics 列出 tree-sitter,語言清單涵蓋 Rust、C++、Objective-C/C++、C、Metal、CUDA、Python、Go、Swift、TypeScript、JavaScript、Java、Ruby、PHP、Lua、Elixir、Bash、C#,加上 JSON、TOML、YAML、Markdown。清單很長,但 README 自己指向 language support and limits 一節,代表各語言的支援深度不一致,這一點值得在採用前逐項確認。

安裝只有一行,但那行包含兩件事

README 給的安裝指令是:

RIPWIRE_REPO=redhat-et/ripwire bash -c "$(curl -fsSL https://raw.githubusercontent.com/redhat-et/ripwire/main/scripts/install.sh)"

安裝後執行檔落在 $HOME/.local/bin,安裝腳本會印出對應的 PATH 設定行。接著在目標 repo 裡執行:

ripwire . --for="<the change you are about to make, in words>"

--for 接受自然語言描述的變更意圖,輸出的是排序過的呼叫圖。README 強調這一行同時做兩件事:安裝,以及為機器上偵測到的每個 agent 啟用對應的 task-shaped skills。文件稱之為「教 agent 何時該伸手拿它,而不只是怎麼用」。

這裡有一個實際的信任問題:安裝腳本是從 main 分支的 raw 路徑直接 curl 進 shell 執行。文件沒有提供雜湊或簽章驗證步驟。在受管環境裡,這通常需要先下載、檢視、再執行,或改用 release 產物。README 沒有描述第二種安裝路徑,這是文件缺口。

設定檔層面,本文只確認 ripwire.toml 這個檔名出現在專案材料中作為設定入口,其餘鍵值在提供的材料裡看不到,我不推測。

「誠實標記」是設計約束,也是使用體驗的摩擦點

README 用一整段解釋兩個機制:答案對自身極限誠實,以及答案可以被指定 token 預算。前者表現為 floor 標記、零的語意限定、截斷揭露;後者表現為「完整答案塞不下時,它說它超了,而不是默默丟掉你需要的那一行」。

從工程角度看,這是把不確定性往外推的設計。傳統靜態分析工具傾向給出一個看起來完整的結果,使用者得自己判斷哪裡不可靠。ripwire 反過來,讓輸出本身攜帶可信度資訊。代價是輸出更囉唆,agent 需要多花一點推理去解讀那些標記。

README 自己的措辭也承認這不是終點:「two things make that reachable in practice, and neither is the destination」。單次呼叫完整回答才是目標,而文件承認這個目標「is not always trivial to reach」。這句話值得當成採用時的期待校準:你買到的是一個盡量不騙你的工具,不是一個保證一次到位的工具。

簽章與本體的位元組比例,README 標題給出 74.7% fewer bytes 這個數字。它出現在專案描述裡,但提供的 README 內文沒有附上該數字的計算方法或語料範圍。當成方向性指標可以,當成你 repo 的預期壓縮率不行。

它會在什麼情況下給你不該信的答案

最明確的失敗模式寫在 README 裡:計數無法保證是總數時標成 floor,零代表「沒找到」而非「不存在」。這意味著在動態呼叫密集的程式碼裡,例如反射、依賴注入容器、字串查表的 dispatch,ripwire 給你的 blast radius 會偏低,而且它會用 floor 標記告訴你偏低,但不會告訴你偏低多少。

第二個邊界是語言支援的深度差異。語言清單橫跨二十餘種,從 Metal、CUDA 到 Elixir、Lua,這種廣度通常伴隨解析品質的落差。README 把細節導向 language support and limits 一節,本身就暗示各語言不在同一水準。如果你的 repo 是 TypeScript 混 Python 再混一點 Bash,跨語言的呼叫鏈很可能在邊界斷掉。

第三個邊界與 MCP 介面有關。README 建議先用 CLI,因為 MCP 的 verb schema 常駐上下文。反過來說,如果你的 agent 環境根本無法執行 shell 指令,只能透過 MCP 溝通,那你就是在付那份固定成本,而 README 並沒有針對這個情境提供替代方案。這不是缺陷,是文件沒有覆蓋的部署形狀。

最後,README 提到 docs/LINEAGE.md 裡最新的一條研究結果「failed when it was tested here」。專案選擇把失敗的結果也寫進血統表,這在方法論上是加分項,但也提醒你:它的品質透鏡建立在 McCabe(1976)、Halstead(1977)、Spärck Jones(1972)、Nagappan & Ball 這些既有結果上,那些是幾十年前的模型,對現代非同步與泛型程式碼的解釋力有限。

跟圖資料庫式 MCP server 的差別在哪裡

README 直接點名對手是「leading graph-database code-context MCP server」,並在 docs/EVALS.md 給出方法。差異不在功能清單,在資料結構的持久化方式。

那一類工具把 repo 解析後寫進圖資料庫,查詢走資料庫。好處是查詢表達力強,可以問多跳關係、可以做跨 repo 聚合。代價是索引要付一次重成本(文件量測為 23 到 52 秒、391 到 623 MB),而且多了一個需要維運的服務。

ripwire 走的是相反路線:不持久化,單一行程,每次執行重新解析。0.25 到 0.45 秒的索引時間讓「不建索引」成為可行選項。這個取捨的結果是,ripwire 無法回答需要跨多次執行累積狀態的問題,也無法在超大型 monorepo 上維持固定成本,因為每次呼叫都要重掃。

兩者不是同一種工具的不同實作,是對「上下文該從哪裡來」的不同回答。圖資料庫派認為值得為表達力付索引成本;ripwire 認為 agent 的提問模式其實很窄,窄到不值得養一個服務。README 的立場很明確,但這個立場建立在「agent 提問模式很窄」這個假設上,而文件沒有提供驗證該假設的資料。

維護成本與授權

授權是 Apache-2.0,寬鬆授權,允許商業使用與修改,附帶專利授權條款。README 的 badge 區列了 THIRD_PARTY.md 與 runtime dependencies: none,代表執行期不拉入第三方函式庫。這對打包與稽核是實質好處,但 Apache-2.0 仍要求保留著作權聲明與 NOTICE 檔案(若上游提供),內部散布時要確認這一點。這不是法律意見。

版本節奏方面,release 清單顯示 v0.3.8 到 v0.4.0 間隔約三週,v0.4.0 到 v0.5.0 只隔一天。這種密度通常代表 0.x 階段仍在快速調整介面,CLI 旗標或輸出格式有變動的可能。提供的材料沒有 changelog 內容,無法判斷是否有破壞性變更,升級前應自行比對 release notes。

維護成本還有一項容易被低估:docs/LINEAGE.md 的血統表由 test/readmedriftcheck.sh 在每次執行時重新推導,若 README 與該文件的表格不一致就讓測試失敗。這是一個防止文件漂移的機制,也意味著貢獻者修改 README 數字時必須同步更新血統表,提高了 PR 的門檻。對使用者的好處是文件與實作不容易脫節;對想送 patch 的人是額外負擔。

編輯結論

ripwire 適合已經在用 Claude Code、Codex、Cursor 這類能執行 shell 指令的 agent,且在意每次提問燒掉多少 token 的團隊;不適合需要跨語言型別推導、或要求精確呼叫關係的靜態分析場景,因為它的輸出本身承認自己是猜測。採用前先確認三件事:你主要語言是否落在它支援的清單內、ripwire . --for= 對你最常改的那個檔案給出的 blast radius 是否合理、以及在 ripwire.toml 裡調整 token 預算後,答案會不會直接變成「超出預算」而不是硬塞給你一份殘缺清單。

官方來源

  1. Issues
  2. License: Apache-2.0
  3. README
  4. redhat-et/ripwire on GitHub
  5. Releases
社群筆記

社群筆記