Skip to content
文档预览图

与开源社区同类方案的对比

相关阅读:Scanning Strategy 介绍 scan-reviewer 如何判定和抽取可复用代码。

核心问题收敛

AI 编码代理的上下文窗口有限,如何让代理"知道"项目中已有哪些可复用代码,是以下所有方案要解决的核心问题。scan-reviewer 在其中选择了持久化目录 + 子代理审查的路径,以下分析各方案的取舍。


方案对比总表

项目索引方法排序策略持久化方式核心创新
Aider Repo Maptree-sitter AST 解析PageRank 图排序动态(每轮生成)完整签名的标注级上下文
Cursor自定义嵌入向量 + Grep代理自主多策略选择本地向量库(5分钟同步)代理行为训练的嵌入模型
Sourcegraph Cody服务端代码图谱Search API + @ 引用持久(服务端)跨仓库远程上下文
Continue.dev可插拔上下文提供者 + LanceDB语义搜索(嵌入)混合(本地索引)Provider 插件架构
Cline / Roo CodeAST + 正则 + grep代理自主探索静态(.clinerules)工具调用循环
TabbyRAG + LSPRank Fusion 多信号融合持久(服务端)LSP 实时感知
SWE-agentFilemap + shell 工具代理通过工具探索动态(每任务)ACI:工具优于索引
Qodo/Codium覆盖率报告解析覆盖缺口优先级动态(每次运行)覆盖驱动的上下文选择
scan-reviewergrep + 正则PageRank 加权 + 多信号评分持久(catalog.md, git 提交)子代理分离 + 持久可共享目录

逐项深度分析

Aider Repo Map

索引方式:对所有源文件运行 tree-sitter AST 解析,通过语言特定的 tags.scm 提取所有符号定义(类、函数、方法、类型签名、变量),支持 ~15 种语言。输出一份"仓库地图"随每次请求一起发送给 LLM。

排序方式:构建依赖图(文件为节点,导入/引用为边),用 PageRank 算法计算每个标识符的重要性。高 PageRank(被广泛引用)的标识符保留,低排名的裁剪掉。

差异化设计

  • --map-tokens 参数(默认 1K tokens)控制地图大小。地图在不需要理解整个仓库时自动缩小,在需要时动态扩展。
  • 签名级精度:地图中包含完整的参数列表和类型签名,LLM 可以"使用" API 而无需读取完整源文件

与 scan-reviewer 的差异

  • Aider 的地图是临时、每轮刷新的;scan-reviewer 的目录是持久、可提交 git、团队共享
  • Aider 依赖 tree-sitter 原生依赖;scan-reviewer 依赖 grep,零依赖
  • scan-reviewer 借鉴了 Aider 的 PageRank 思想增强自身的层级分类(加权评分取代纯计数)

Cursor

索引方式:将代码拆分为有意义的块(函数、类、逻辑块),通过自训练嵌入模型转化为向量,存入本地向量数据库。同时有 Instant Grep(自定义正则引擎,在大代码库上性能优于 ripgrep)。索引在打开工作区时开始构建,80% 完成度时可用,每 5 分钟同步变更文件。

排序方式多策略代理选择——代理根据提示类型自主选工具:

  • 具体符号名 → grep
  • 概念/行为 → 语义搜索,再用 grep 补全细节
  • 复杂探索 → 串联多次搜索 + 文件读取 + 引用追踪

差异化设计

  • 代理行为训练的嵌入模型:用历史会话轨迹训练嵌入模型——LLM 评判在每个步骤中什么内容最有用,然后把嵌入模型训练成对齐这种"有用性"分数,而非通用的代码相似度

与 scan-reviewer 的差异

  • Cursor 的多策略检索可以直接借鉴到 review 阶段:审查时不应只用 grep 查目录,还应做"目标功能"的语义联想
  • scan-reviewer 的增强启发式中的"语义近似度"正是受此启发

Sourcegraph Cody

索引方式:利用 Sourcegraph 已有的 Code Search 基础设施——一个预构建的服务端代码图谱,索引所有符号、引用和跨仓库依赖。

差异化设计

  • 远程上下文:Cody 可以从你没有克隆到本地的仓库中拉取上下文。这使它在多微服务组织里特别有优势
  • 用户或代理可以 @ 引用特定文件、符号或远程仓库

与 scan-reviewer 的差异

  • scan-reviewer 目前仅限单仓库。跨仓库/跨服务端复用检测是未来的增强方向

Continue.dev

索引方式:可插拔的上下文提供者系统:

  • @codebase:将整个代码库嵌入为向量做语义检索
  • @file / @folder / @terminal / @diff / @docs

排序方式:嵌入向量的语义搜索(本地 LanceDB)

差异化设计

  • Provider 插件架构是最干净的抽象:每个上下文源是一个自包含的 Provider,有标准接口 getContext()。这让 scan-reviewer 的 catalog.md 天然成为一个 "ScanReviewer Provider"

与 scan-reviewer 的差异

  • scan-reviewer 如果暴露为 "ReusableComponentProvider",就可以被 Continue.dev 等平台作为上下文源消费

Tabby

RAG 管道 + LSP 实时感知。最值得借鉴的是 Rank Fusion 多信号融合——同时考虑词法匹配、语义相似度、文件最近修改时间、LSP 声明信息,融合为一个综合相关度分数。scan-reviewer 的多信号评分(引用加权 + 修改热度 + 测试覆盖)直接受此理念启发。

SWE-agent / OpenHands

"工具优于索引"的设计哲学。给代理 grep + find + python 等工具,让代理自己决定需要什么上下文。scan-reviewer 的关键差异在于:预建索引避免了 agent 在搜索上浪费 token。但 SWE-agent 的"更好的工具设计"理念反过来提醒 scan-reviewer:目录应该作为工具可查询的产物,而非必须全量加载。

Qodo/Codium

覆盖驱动的上下文选择——只把未覆盖的代码路径展现给 LLM。这对 scan-reviewer 的启发是测试覆盖可以作为重要性评分的一个维度(有测试 = 更可靠的复用目标)。


scan-reviewer 的定位

经过社区调研,scan-reviewer 的差异化价值有了更清晰的定义:

维度社区主流做法scan-reviewer
索引持久化多为临时/内存索引持久 catalog.md,git 可提交
审查时机生成前注入上下文生成后审查 + 修复,与上下文注入互补
审查主体主代理自行判断专属子代理,独立上下文窗口
索引方法AST / 嵌入 / LSPgrep(零依赖),适合快速迁移
排序粒度按文件/符号导出符号 + 完整签名 + 多维度加权评分
团队共享大多不共享catalog.md 随 git 协作

核心洞察:scan-reviewer 不是要替代 Aider/Cursor/Tabby 的上下文注入——它填补的是生成后审查这个缺失环节。上下文注入帮你"少写重复",生成后审查帮你"写了也能及时发现和修复"。