模型 / 数据集
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

秒懂

它是什么?
ripwire 是一个零依赖的 C++23 CLI 与 MCP 服务器,为编码 agent 生成确定性的调用图、影响范围和待跑测试清单。它的真正卖点不是速度数字,而是把「答案不完整」这件事写在输出里。
适合谁用?
如果你的 agent 已经能跑 shell 命令,而且你被「一次调用加三次 grep」的循环拖累,ripwire 值得先装 CLI 试一次,因为 README 明确说 CLI 比 MCP 便宜,MCP 的 verb schema 会常驻上下文。不要采用的情况同样清楚:如果你的仓库以 README 未列出的语言为主,或者你需要的不是调用关系而是类型级语义,这个工具帮不上忙。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 1 天前。
用什么语言写的?
主要是 C++(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月15日)和我们的分析,不构成法律意见。

开源项目深度解析

它要解决的是 agent 的搜索税,不是搜索本身

编码 agent 在仓库里找东西的典型路径是:一次调用,然后三次 grep,再读几个整文件补上缺的部分。README 把这称为「同一次搜索付两遍钱」,它既不省 token,也不让编码变快。ripwire 的目标被写成 terminality:问代码库一个问题,答案本身就该带齐你需要的东西,不需要后续 grep。

这个目标决定了它的定位。它不是给人类用的代码浏览器,也不是通用静态分析平台,而是给那些能执行 shell 命令的 agent 用的取数工具。README 列出的适配对象包括 Claude Code、Codex、Cursor、Windsurf、Gemini、opencode、aider,判断标准只有一条:agent 能不能跑 shell。

真正值得留意的是它承认目标未必总能达到。README 说「一次调用完整回答」并不总是容易做到,做不到的时候输出会说明,而不是假装做到。这句话是理解整个项目的钥匙。

两个诚实机制:floor 标签与 token 预算

README 把可用性建立在两个机制上,而不是建立在速度上。

第一个是标注。无法确定总数的计数会被标成 floor,也就是下限;零的含义是「没找到」,永远不是「不存在」;任何截断都会被披露。这意味着输出不会看起来比实际更完整。对于一个要喂给模型的工具,这个设计取舍相当关键:模型不会区分「没有依赖」和「没查到依赖」,除非工具自己说清楚。

第二个是预算。答案可以给定 token 预算,成本变成你主动要的参数,而不是事后发现的意外。当完整答案放不下时,输出报告超支,而不是静默丢掉你可能需要的那一行。

这两点都不是终点,README 自己把它们称为 stair-steps。但它们是可验证的工程承诺,比任何速度宣称都更容易在采用前检查。

单进程、无服务:索引与查询的形态

README 明确列出四个「没有」:没有 API key,没有 embeddings,没有索引服务器,没有 daemon。整个工具是一个自包含的二进制文件,在本机离线运行。

从仓库描述和 README 的表述看,它的数据流是:指向一个仓库,解析源码,构建带排名的确定性调用图,然后回答「该改哪里、会破坏什么、该跑哪些测试」。README 给出的安装示例是一行脚本加一条命令:

RIPWIRE_REPO=redhat-et/ripwire bash -c "$(curl -fsSL https://raw.githubusercontent.com/redhat-et/ripwire/main/scripts/install.sh)" export PATH="$HOME/.local/bin:$PATH" cd your-repo ripwire . --for="<the change you are about to make, in words>"

--for 接收的是自然语言的变更意图,这一点和纯符号查询工具不同。安装脚本会打印 PATH 那一行,README 说如果安装器认为你需要,它会自己提示。

关于性能,README 给出一组对比:在 django、webpack 和本仓库上的 48 个匹配问题上,ripwire 索引耗时 0.25 到 0.45 秒、占用 6.6 到 16.5 MB,对照的图数据库 MCP 服务器是 23 到 52 秒、391 到 623 MB;热查询 197 ms 对 1,082 ms。这些数字来自项目自己的评测文档 docs/EVALS.md,我没有独立复现,采用前应把它当作待验证的宣称而不是既成事实。

CLI 是主入口,MCP 是要付上下文租金的第二入口

这是 README 里少数带明确取舍的建议:优先用 CLI,因为它是更便宜的接口。MCP 服务器是可选入口,它的便利有代价,代价是 verb schema 会常驻 agent 的上下文,无论 agent 当次是否调用。

换句话说,装上 MCP 之后,每个会话都要为「可能用到」付费。对于上下文预算紧张的 agent,这笔固定开销可能比它省下的搜索开销更大。README 没有给出这笔开销的具体 token 数,只说「有代价」,所以这个数字需要你自己在你的 agent 上量。

安装脚本会同时安装并激活 task-shaped skills,README 说这些 skills 教 agent 什么时候该用它,而不只是怎么用,并且对机器上找到的每个 agent 都生效。这是一个容易被忽略的设计:工具本身不解决「agent 不知道何时该调用」的问题,skills 解决。

语言覆盖是一个明确的边界

README 列出的语言包括 Rust、C++、Objective-C/C++、C、Metal、CUDA、Python、Go、Swift、TypeScript、JavaScript、Java、Ruby、PHP、Lua、Elixir、Bash、C#,以及 JSON、TOML、YAML、Markdown。

这份列表的构成值得注意:它混合了通用编程语言和配置文件格式,也包含 Metal 和 CUDA 这类领域语言。但 README 同时写了一句「see language support and limits」,指向正文的语言章节,说明每种语言的支持程度并不一致。这一点在采用前必须查清,因为调用图分析的质量高度依赖语言解析的完整度,而 README 没有在首页给出按语言划分的覆盖率。

如果你的主力语言不在这份列表里,或者落在支持程度较低的那一档,那么「确定性调用图」这个承诺对你就打了折扣。这是判断是否采用的第一道门槛。

质量透镜与它的文献来源

除了导航,ripwire 还提供质量增量,README 提到 blast radius、tests-to-run、quality deltas 三类输出。质量部分的依据是一份文献清单 docs/LINEAGE.md,README 说它折入了 46 个仓库和 69 篇论文,从 McCabe 1976 年的复杂度度量到最近两个月发表的七篇论文,每一行都注明取用了哪条结论、落在哪个文件里。

README 特意强调两半各司其职:成熟结论让质量透镜可信,因为 McCabe 的复杂度、Halstead 的 volume、Spärck Jones 的 term specificity、Nagappan 与 Ball 的 churn 都经过长期复现;近期文献让工具保持当前,因为面向编码 agent 的检索、上下文压缩成本这类研究只有几个月历史。README 还提到最新折入的一行是一个在本项目测试中失败的结论,并且照样写了下来。

另外有一份 237 个工具的调查,README 说这些工具没有贡献任何可用的结论,并且明确标注了这一点。两份集合按构造互斥,所以是相加而不是嵌套。这种记账方式在开源项目里不常见,它的价值在于可检验:README 说这些计数由 test/readmedriftcheck.sh 在每次运行时从文档自身的表格重新推导,如果首页和表格不一致就会失败。

什么时候它不该出现在你的工具链里

第一个失败模式是语言边界。前面已经说过,README 的语言列表附带 limits 说明,支持程度并不统一。用不支持或支持较弱的语言写成的仓库,拿到的调用图可能既不完整也不可靠,而调用图一旦不可靠,blast radius 和 tests-to-run 就都失去了意义。

第二个是目标本身可能达不到。README 直说「一次调用完整回答」并不总是容易达到,达不到时输出会说明。这意味着你会遇到需要追问的情况,而追问就是它想消除的那种成本。它诚实,但不等于它总能省下 token。

第三个是接口成本。MCP 的 verb schema 常驻上下文这件事,对上下文本来就紧张的 agent 是净负担。README 自己建议优先用 CLI,这个建议反过来就是:如果你没有能力让 agent 走 shell,而是只能走 MCP,那么你付的是更贵的那条路径。

第四个是问题类型。ripwire 回答的是调用关系、影响范围、测试选择这类结构性问题。如果你的问题是类型级语义、运行时行为或者跨服务的依赖,README 没有给出任何相关承诺。

与图数据库型代码上下文 MCP 服务器的差别

README 用一整节做对比,对象是「领先的图数据库代码上下文 MCP 服务器」,但没有在给出的材料里点名具体是哪一个。可确认的差别在架构层面:对方需要索引服务和图数据库,启动成本是秒到几十秒、内存是几百 MB 量级;ripwire 是单进程二进制,README 给出的数字是 0.25 到 0.45 秒、6.6 到 16.5 MB。

这个差别的实际含义是部署形态不同。图数据库方案适合把索引长期驻留、跨多个仓库或跨会话复用的场景,它的启动开销可以被摊薄;ripwire 的定位是每次指向一个仓库、快速拿到答案,没有 daemon 也就没有常驻状态可以复用。

选择取决于你的使用频率和仓库数量。频繁在几十个仓库间切换、每次都要冷启动索引,ripwire 的形态更合适;需要长期维护一张跨仓库的全局图,并且愿意为此维护一个服务,那么图数据库方案的固定成本反而更低。README 的对比只覆盖了索引时间和内存,没有覆盖跨仓库查询能力,这一项需要你自己判断。

维护成本与许可

ripwire 采用 Apache-2.0 许可,README 的徽章和 LICENSE 文件都指向它。Apache-2.0 包含明确的专利授权条款,对商业采用通常比 MIT 更清晰,但具体到你所在组织的合规要求,需要由法务判断,这里不做法律意见。

维护成本方面,可确认的是:运行时零依赖,README 用徽章标注 runtime dependencies 为 none,并指向 THIRD_PARTY.md。这降低了供应链审查的负担,也意味着升级时不需要协调依赖版本。项目要求 C++23,从 CONTRIBUTING.md 的徽章可以看出这是贡献门槛;如果你要自己编译而不是用安装脚本,编译器版本会是第一个障碍。

发布节奏上,从 v0.3.8 到 v0.4.0 到 v0.5.0 集中在 2026 年 8 月中旬到 9 月上旬,间隔很短。这对使用者意味着两件事:功能在快速变化,锁版本比追最新更稳妥;同时 README 里那些数字和文档表格会随版本变动,test/readmedriftcheck.sh 的存在说明项目自己在防这类漂移,但你没有理由假设它永远不漂。

一个具体的下一步:装完之后,先用 ripwire . --for="..." 在你最熟悉的一个仓库上跑一次,然后拿输出和你自己已知的调用关系对照。如果 floor 标签和截断披露频繁出现,说明这个仓库超出了工具当前能完整回答的范围,此时 MCP 那笔常驻上下文开销就更不值得付。

编辑结论

如果你的 agent 已经能跑 shell 命令,而且你被「一次调用加三次 grep」的循环拖累,ripwire 值得先装 CLI 试一次,因为 README 明确说 CLI 比 MCP 便宜,MCP 的 verb schema 会常驻上下文。不要采用的情况同样清楚:如果你的仓库以 README 未列出的语言为主,或者你需要的不是调用关系而是类型级语义,这个工具帮不上忙。动手之前先确认三件事:你所用语言是否在支持列表里;ripwire . --for="..." 的输出里有没有被标成 floor 或截断的字段;以及 ripwire --budget 在你仓库上的实际表现,因为 README 承认完整答案有时放不下,会直接报告超支而不是悄悄丢行。

官方来源

  1. Issues
  2. License: Apache-2.0
  3. README
  4. redhat-et/ripwire on GitHub
  5. Releases
社区笔记

社区笔记