关于 arbor
arbor 构建代码语义依赖图,为开发者和编码 Agent 查询影响范围、调用路径及 API 用法。它还支持 CI 风险检查,以及 Python 项目中的 AI 模型退役检查。
主要功能
- 01代码符号与依赖的语义图
- 02调用者、被调用者及路径遍历
- 03带置信度和风险的变更影响分析
- 04基于影响范围的 CI 门禁
- 05Python AI 模型用法与退役检查
适用场景
- 01修改函数前查找调用者
- 02评估拉取请求的变更风险
- 03定位使用退役 AI 模型的 Python 调用
MCP 相关
README 说明可通过 MCP 工具查询代码图,其中包括 `find_api_usages`。文档也提及 MCP 传输和 Apps。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
为人和 Agent 提供代码上下文。
找出调用某个函数的代码。追踪代码中的调用路径。
在你造成问题之前,就知道会有什么代码被破坏。
模拟回放 — arbor 命令及其输出均为真实内容(tokio @ 178k LOC)。方法说明:BENCHMARKS.md
v3.1.0 · 查找调用即将停用的 AI 模型的代码:
arbor retirements会列出 Python 项目中直接调用 OpenAI、Anthropic 和 Google SDK,且使用已停用或即将停用模型的代码,并给出替代模型和所需的更改;可在本地运行,也可作为 GitHub Action 运行。arbor usages和 MCP 工具find_api_usages会列出所有此类 SDK 调用及其路由和模型。发行说明
为什么选择 Arbor
大多数 AI 编码工具把代码视为文本。Arbor 会构建一个语义依赖图谱——以函数、类和模块为节点,以调用、导入和继承为边——然后以确定性精度回答考虑执行路径的问题:
| 问题 | Arbor 的回答 |
|---|---|
| 如果我更改这个符号,哪些代码会出问题? | 标明深度、置信度和风险级别的影响范围 |
| 哪些代码会直接或间接调用它? | 沿调用图遍历调用方和被调用方 |
| A 和 B 之间的最短路径是什么? | 通过实际依赖关系查找 A* 路径 |
| 这个 PR 的风险是否过高,不适合合并? | 根据影响范围阈值设置 CI 门禁 |
不靠关键词猜测。不产生嵌入式幻觉。一个图谱,支持所有接口。
如果图谱无法确定,它会如实说明——边带有置信度,存在歧义的解析结果会明确标记,而不是隐藏起来。坦诚承认未知,胜过自信地给出错误答案。
v3.1.0 新功能
本次功能版本为调用 AI 模型 API 的 Python 代码带来两条命令。两者都在本地运行, 无需账户、API 密钥或遥测。
| 新功能 | 功能说明 |
|---|---|
arbor retirements | 列出直接调用 openai、anthropic 和 Google SDK 的代码中,使用了提供商已弃用或即将弃用的模型的调用:包括日期、提供商列出的替代模型、随之变化的参数,以及代码库当前的选择。OpenAI 将于 2027 年 1 月 14 日停用 gpt-4o、gpt-4o-mini、gpt-4.1 和 gpt-4.1-mini。下文了解更多 |
GitHub Action mode: retirements | 在 CI 中执行相同检查:生成列出所有受影响调用的作业摘要,并对最紧急的条目发出警告。默认只发出警告;仅当设置 retirements-fail-on,或检查无法运行时,才会导致构建失败。 |
arbor usages 和 find_api_usages | 列出每个 OpenAI、Anthropic 和 Gemini SDK 调用及其文件和行号、客户端路由(直接调用、Azure、自定义 base_url、Bedrock、Vertex)和模型 ID,供人和 Agent 使用。只有符合一小部分受支持语法的值才会被确认;其他所有值都会附带带类型的缺口说明。报告确认的内容 |
目前仅支持 Python;图提取方式不变(保存的图会在首次使用时重建一次, 与每次升级后的行为相同)。上一版本的详情请参阅 3.0.5 版本说明。
v3.0.3(Rust 调用的路径和宏解析、按符号区分差异、--base)
这是一个修复版本。以下每一项都是错误结果,而非缺少功能,并且 都附带回归测试。
| 修复 | 原有问题 |
|---|---|
| 解析 Rust 调用 | crate::jobs::enqueue()、Type::new()、self.helper() 以及 assert!/format! 内的调用都没有生成边,因此大量使用的 Rust 函数会被报告为没有调用者。现在会通过模块树解析路径,并将宏参数作为代码读取。 |
按符号区分 arbor diff | 被修改文件中的每个符号都会被视为已更改,因此在繁忙文件中新增函数时,会报告该文件的整个影响范围。现在新符号不会被视为有影响;只有已修改的符号才会。调用变更的测试会列为值得运行的测试,但不会计入影响范围。 |
--base 和 --staged | 除非设置了 ARBOR_DIFF_BASE,否则 arbor diff、check 和 summary 只能看到未提交的更改。--base origin/main 会与合并基点比较,这与拉取请求所显示的结果一致;--staged 只检查已暂存的内容。 |
| 语言保持隔离 | TypeScript 的 enqueue 可能会被报告为 Rust 的 enqueue 的调用者。解析现在会限制在同一语言系列中,并且 callers/callees 会分别列出名称相同的定义。 |
| 不再使用过期图 | 切换分支后,如果没有剩余文件的时间戳晚于图的时间戳,查询结果会来自旧分支的图。现在图会记录生成时所基于的提交,并在 HEAD 移动时刷新。 |
| 继承边 | class Middle(Base) 不会生成边,因此更改基类时会显示影响范围为零。现在会生成 extends/implements 边,并且继承的方法仍可被访问。 |
| 调用环按一个处理 | 闭合的函数环占据了每个中心性排名的顶部。现在会在 PageRank 之前将环折叠处理。 |
| 加固 HTTP bridge | arbor bridge --http 会接受跨域和 DNS 重绑定请求。现在会检查 Origin/Host,并要求请求体为 JSON。 |
| 减少 bridge 噪声 | bridge 会在繁忙循环中反复为忽略的构建目录重新建立索引。 |
此外新增:arbor receipt。每轮编码 Agent 操作后,它会用通俗语言说明
发生了哪些更改,以及改动了哪些你未要求修改的内容;使用 arbor receipt undo 可还原这一轮操作。
3.0.0 的缓存图会在首次使用时自动重建。
v3.0.0 — 正确的节点(符号解析会参考导入文件)
一项经过验证的修复。
符号解析会参考导入文件。 当一个裸名称匹配多个模块中的定义时,resolve_ref 会退回到 SameDir,并将边关联到调用方所在目录中的某个定义——这不是丢弃边,而是自信地路由错误,置信度标记为 0.55。
GraphBuilder 已经为每个文件保留了导入映射,但只有 apply_import_validation 会读取它,而该函数是在边选定之后才为其评分。因此,它从未发现指向错误节点的引用。在同文件检查和同目录检查之间查询导入映射,既能让本地定义优先于导入,也能让显式写明的导入优先于单纯的目录相邻关系。Resolution::ViaImport 的评分为 0.93,高于 SameDir 的 0.55。
测量结果
一个包含 260 个模块、分为 10 层的测试样例,每层都定义了相同的 26 个函数名。真实值根据生成器自身的边列表得出,因此预期答案是精确值,而非估算值。
| 真实下游数量 | v2.6.0 | v3.0.0 |
|---|---|---|
| 179 | 0 | 163 |
| 178 | 0 | 161 |
| 161 | 0 | 133 |
| 143 | 22 | 133 |
| 122 | 22 | 119 |
| 36 | 22 | 61 |
| 16 | 22 | 46 |
此前无论真实答案是多少,结果都基本停留在 22 左右。现在结果与实际情况一致。最大枢纽的风险等级从 LOW 升至 CRITICAL。
边总数几乎没有变化(1335 → 1334)。这正是路由错误而非边丢失的特征:边一直都存在,只是指向了错误的节点。
破坏性变更
Resolution新增了一个ViaImport变体——穷尽匹配将无法通过编译- 边会落到不同节点上,因此缓存的图、存储的节点 ID 以及来自 2.6.0 的中心性基线都会有所不同
PageRank 计算前会先合并调用环。每个强连通分量只排名一次,并将该分量的权重分配给其成员,因此闭合环不会占据排名前列,而有外部调用的环也会让其成员保持在一起。CentralityScores 报告的数值仍是 v2.6.0 的百分位数,即 i / (n - 1)。
已知且仍待解决的问题
以下问题已明确记录,而非留待用户自行发现:
- 小型目标现在会出现高估(36 → 61,16 → 46)。这比完全不报更安全,但尚不准确。
- 动态和反射式导入(
importlib、__import__、import()、eval(require(...)))从设计上就无法解析;在测试样例中,它们被记录为预期的未命中,而非缺陷。
v2.6.0 — 真实值(保留名称冲突,确定性解析,边置信度,百分位中心性)
关注正确性,而非速度。此前这些情况都会被悄然错误处理。
| 修复 | 原因 |
|---|---|
| 保留重名符号 | SymbolTable 使用 HashMap::insert,因此第二个 handler、new 或 process 会替换第一个。同名符号中被替换的那个没有调用方,因此不会出现在影响范围中。 |
| 解析结果具有确定性 | 通过遍历 HashMap 来判断同目录局部性。Rust 会为每个进程设置不同的 RandomState 种子,因此同一个二进制文件处理相同输入时,每次运行都可能构建出不同的边。现在会在八个全新进程中断言结果一致。 |
| 边带有置信度 | 已确认的同文件调用和基于同目录的推测原本属于相同证据。现在每条边都会根据解析方式获得 [0,1] 范围内的分数。 |
| 导出的 TS 符号只索引一次 | export_statement 会递归处理其子项,随后通用循环又递归一次——每个导出符号因此变成共享同一节点 id 的两个顶点。一个包含 149 个文件的应用中产生了 133 个虚假节点,占图的 25%。 |
| 可解析未显式声明类型的接收者上的方法调用 | obj.method() 会被直接丢弃,导致 TS/JS 图几乎没有边——空图报告的影响范围为零,读起来像是“安全”,而不是“未知”。 |
| 中心性采用百分位排名 | 分数原本除以图中的最大值,因此排名最高的节点必定为 1.0,而 0.6 的阈值在不同代码库间毫无一致意义。新增一个枢纽节点就会重新缩放所有其他节点。 |
| 解析复杂度为 O(1),而非 O(refs × nodes × files) | 无法解析的引用——标准库和第三方调用,也就是实际代码中的大多数调用点——会触发最坏情况。现在已为后缀建立索引。 |
新增能力——概念搜索。 子串匹配无法通过 login 找到 get_authenticated;两者没有共同子串。现在会对标识符进行分词,并通过精选的概念集扩展搜索范围,同时将文档字符串、签名和路径与名称一起编入索引。确定性、离线运行,无需模型。该功能可通过库中的 ArborGraph::search_ranked 使用(arbor query 目前仍采用字面子串匹配)。
新增能力——代码块级影响分析。 changed_node_ids_for_ranges 只保留行实际发生变化的符号,而不是触及文件中的所有符号。
在节点集合相同的条件下,应用重复提取修复后测得:
| 代码库 | 修复前 | 修复后 |
|---|---|---|
| TypeScript(149 个文件) | 172 条边 | 196(+14%) |
| Rust(arbor-graph) | 116 条边 | 167(+44%) |
早期版本生成的图缓存会失效——现在的中心性含义已不同,因此读取过期缓存会导致错误结果。
v2.5.0 — 最后的借口(PageRank 提速 23 倍、并行索引、热启动中心性)
| 变更 | 测量结果 |
|---|---|
| 重写 PageRank — 使用扁平的调用图邻接结构替代逐轮遍历 | 在包含 10k 个节点的图上从 149.8ms 降至 6.6ms(23 倍),并与旧实现进行了并排验证 |
| 并行索引 — 解析任务分发至所有核心,组装结果具有确定性 | Arbor:253ms → 95ms · tokio(178k 行代码):2.7s → 1.6s |
| 热启动中心性 — 监视器根据之前的分数重新计算种子值 | 单文件补丁后约 2 轮即可收敛,而非耗尽完整的 20 轮迭代预算 |
| 收敛提前退出 | 最大增量达到 1e-9 时停止迭代——预算是上限,不是硬性要求 |
觉得某个数字不对?运行 cargo bench -p arbor-graph 来验证:BENCHMARKS.md。
v2.4.0 — 迈向 Agent 原生的飞跃(MCP 2026-07-28、HTTP 传输、Tasks、MCP Apps)
| 功能 | 作用 |
|---------|--------------|
| **MCP `2026-07-28`** | 无状态 `server/discover`、响应缓存(`ttlMs`/`cacheScope`),以及对 `2025-03-26` 客户端的双版本回退支持 |
| **Tasks 扩展** | `tasks/get` · `tasks/update` · `tasks/cancel` — 冷启动索引会返回任务句柄,而不是错误 |
| **MCP Apps** | 在 Agent 宿主中展示交互式影响范围图(`ui://arbor/blast-radius`)和架构图(`ui://arbor/architecture-map`) |
| **HTTP 传输** | `arbor bridge --http --port 3333` — 在负载均衡器后运行无状态 MCP |
| **真正的 `get_blast_radius`** | 通过共享的 `arbor-graph::compute_blast_radius`,基于 Git 差异进行影响分析 |
| **分页** | `search_symbols` 和 `get_map` 支持 `offset` / `limit` / `hasMore` |
| **基准测试** | Criterion 套件 + CI 回归检查门槛 — 参见 [BENCHMARKS.md](docs/BENCHMARKS.md) |
快速开始
# Install (crates.io can lag the latest release: see docs/INSTALL.md)
cargo install arbor-graph-cli
# Index your project (one command)
cd your-project && arbor setup
# Explore before you edit
arbor map . --exclude-test # ranked project skeleton (~1k tokens)
arbor refactor parse_file # blast radius of changing a symbol
arbor diff # impact of uncommitted git changes
arbor diff --base origin/main # impact of this branch, as its PR shows it
# Wire up your AI agent
claude mcp add --transport stdio --scope project arbor -- arbor bridge
每轮交互后: arbor hook claude 会让 Claude Code 显示一份回执,说明它更改了什么、动了哪些你没要求它动的内容,以及需要测试什么。查看回执 →
Agent 工作流: 先调用 get_map → 用 search_symbols / get_file_graph 定位代码 → 只读取目标文件。MCP 完整指南 →
查找调用即将停用的 AI 模型的代码
OpenAI 将于 2027 年 1 月 14 日停用 gpt-4o、gpt-4o-mini、gpt-4.1 和 gpt-4.1-mini;Anthropic 和 Google 也会在各自日期停用模型。arbor retirements 会列出使用已停用或即将停用模型的直接 openai、anthropic 和 Google SDK 调用。对于每个调用,它会显示服务提供商列出的替代模型、需要随之更改的参数,以及仓库优先采用的选项(例如 gpt-6-luna 是否应该进行推理)。目前尚未检查通过 LangChain、LiteLLM 或其他封装进行的调用。
npx @anandb71/arbor-cli retirements .
3 calls use models OpenAI shuts down on 14 Jan 2027 (88 days)
app/chat.py:12 gpt-4o (MODEL, line 8) → gpt-6-luna
also change: max_tokens → max_completion_tokens
decide: keep reasoning off (add reasoning_effort="none"; keep temperature) or let the model reason (remove temperature)
app/chat.py:21 gpt-4o-mini (line 22) → gpt-6-luna fallback of an environment or config lookup: confirm the deployed value
decide: keep reasoning off (add reasoning_effort="none") or let the model reason (no change)
check: stop and logit_bias are not supported on gpt-6-luna (400).
- 在本地运行。 无需账户或 API 密钥,也不进行遥测;代码不会离开你的设备。
- 如实说明置信度。 只有在用法扫描确认调用毫无疑问时,字面量才会被标记为已确认。
os.getenv("MODEL", "gpt-4o")这类回退值、参数默认值、可能被子类覆盖的类属性,以及路由情况不确定的调用,都会标记为请先确认并说明原因;只有使用--count-unconfirmed时,这些情况才会导致检查失败。通过 Azure、OpenRouter 或代理进行的调用会单独列出(--include-routed),因为服务提供商的停用日期可能不适用于这些调用;在服务提供商自有主机上设置base_url则属于直接调用。Arbor 无法读取的模型以及未分析的代码都会计入统计,不会被隐藏。 - 由你决定。 如果替代模型的行为本就有所不同(
gpt-6-luna默认使用中等推理强度,因此可以进行推理,而gpt-4o不会;claude-sonnet-5-5默认会进行思考,而它所替代的 Sonnet 模型不会),报告会展示两种选项及各自的成本,并且在你作出选择之前不会更改任何内容。 - 适用于 CI。 支持
--json、--markdown、--annotations、--markdown-out <file>和--fail-within <days>。退出代码为 1 表示已确认的调用使用了已停用模型,或使用了将在你设定的时间范围内停用的模型;停用当天也视为已停用(UTC)。 - 当前范围: 支持使用
openai、anthropic和 Google GenAI SDK 的 Python 代码。即将支持 TypeScript 和 JavaScript。
GitHub Action(默认发出警告;只有在你要求时才会导致构建失败):
- uses: Anandb71/[email protected]
with:
mode: retirements
retirements-fail-on: never # or: retired, or a number of days such as 90
面向 AI Agent(MCP)
Arbor 通过 arbor bridge 提供可用于生产环境的 MCP 服务。默认使用 Stdio;HTTP 为可选项,适用于远程/企业环境。
# Stdio (Claude, Cursor, VS Code)
arbor bridge
# HTTP (MCP 2026-07-28)
arbor bridge --http --port 3333
Cursor / VS Code
{
"mcpServers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
}
}
模板:templates/mcp/ · 设置脚本:scripts/setup-mcp.sh · scripts/setup-mcp.ps1
17 个 MCP 工具
| 层级 | 工具 | 适用场景 |
|---|---|---|
| 概览 | get_map | 首次调用 — 按 PageRank 排序、受令牌预算限制的项目骨架 |
| 精准查询 | list_entry_points · get_callers · get_callees · search_symbols · get_file_graph · get_node_detail | 导航至特定符号或文件 |
| 广度查询 | get_logic_path · analyze_impact · find_path · get_knowledge_path | 追踪依赖、影响范围和路径 |
| Agent 原生 | get_blast_radius · explain_symbol · audit_security · get_architecture_overview · batch_query | PR 影响分析、项目入门、安全审计、批量查询 |
| SDK 用法 | find_api_usages | 查找代码调用 OpenAI、Anthropic 或 Gemini SDK 的位置,以及路由和模型 ID(Python) |
每个工具都会返回 { ok, tool, data, meta: { suggested_next_tool, suggested_next_args } },让 Agent 无需再次提示即可链式调用。
注册信息: io.github.Anandb71/arbor · 官方 API 查询 · Glama 列表
CLI 参考
| 命令 | 说明 |
|---|---|
arbor setup | 一次性初始化并建立索引 |
arbor map | 按排名排序、受令牌预算限制的项目骨架 |
arbor query <term> | 模糊符号搜索(支持 | OR) |
arbor callers / callees <sym> | 单跳图遍历。同名符号按定义列出;可用 jobs::enqueue、Type.method 或 src/jobs.rs:enqueue 缩小范围 |
arbor entry-points | HTTP 处理程序、主入口、任务、Webhook |
arbor file-graph <path> | 单个文件中的符号和边 |
arbor inspect <sym> | 完整的符号详情 |
arbor path <a> <b> | 最短调用图路径 |
arbor refactor <sym> | 重构前分析影响范围 |
arbor usages | Python 中对 OpenAI、Anthropic 和 Gemini SDK 的调用:客户端路由(直接、Azure、自定义 base_url、Bedrock、Vertex)、模型 ID 和类型化缺口;绝不打印凭据。--sdk openai|anthropic|google、--json。没有缺口的值能确认什么:docs/SDK_USAGES.md |
arbor retirements | 直接调用其提供商已弃用或即将弃用的 AI 模型的 SDK(Python):日期和剩余天数、列出的替代项、所需参数变更及各代码库需要做出的选择。--fail-within <days>、--count-unconfirmed、--include-routed、--json、--markdown、--annotations(指南) |
arbor diff | 按符号生成 Git 变更影响报告:新符号不会产生影响范围。--base <ref> 与合并基准比较(即 PR 显示的内容),--staged 仅检查已暂存的变更 |
arbor check | CI 安全检查门禁(--max-blast-radius N、--base <ref>) |
arbor summary | 自动生成 PR 描述(--base <ref>) |
arbor agent review | 自主 PR 架构审查 |
arbor agent onboard | 代码库入门指南 |
arbor agent guard | 实时架构安全检查门禁 |
arbor bridge | MCP 服务(添加 --http 以使用 HTTP 传输) |
arbor watch | 文件变更时实时重新建立索引 |
arbor receipt list / show / undo | 用通俗语言记录每轮 Agent 操作所做的变更,并可撤销某一轮操作(指南) |
arbor hook claude | 将 Arbor 接入 Claude Code:添加指令,并在每轮操作后生成记录 |
arbor gui | 原生桌面 UI |
所有查询命令均支持 --json。map 还支持 --tokens N、--focus "pattern"、--focus-changed。
可视化介绍
安装
# macOS / Linux: prebuilt binary from the latest GitHub release
curl -fsSL https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.sh | bash
# Windows (PowerShell)
irm https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.ps1 | iex
# Scoop (Windows)
scoop install https://raw.githubusercontent.com/Anandb71/arbor/main/packaging/scoop/arbor.json
# Rust / Cargo (crates.io can lag the latest release)
cargo install arbor-graph-cli
# npm wrapper (cross-platform)
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:latest
固定版本安装:docs/INSTALL.md
语言支持
生产级解析器: Rust · TypeScript / JavaScript · Python · Go · Java · C / C++ · C# · Dart
备用解析器: Kotlin · Swift · Ruby · PHP · Shell
CI 与拉取请求
arbor diff --markdown
arbor check --max-blast-radius 30 --markdown
arbor summary
GitHub Action(预构建二进制文件,约 5 秒,而编译约需 3–5 分钟):
name: Arbor Check
on: [pull_request]
jobs:
arbor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: Anandb71/[email protected]
with:
command: check . --max-blast-radius 30 --markdown
comment-on-pr: true
github-token: ${{ secrets.GITHUB_TOKEN }}
mode: retirements 会改为运行 arbor retirements。它会生成一份作业摘要,列出所有调用即将退役模型的位置,并标注最紧急的 10 行,这是 GitHub 对每个步骤的数量限制(指南)。
架构
arbor-core (Tree-sitter parsing)
└── arbor-graph (petgraph + PageRank + impact analysis)
├── arbor-cli — CLI + MCP bridge
├── arbor-mcp — MCP protocol server
├── arbor-server — WebSocket JSON-RPC
├── arbor-watcher — incremental file watcher
└── arbor-gui — desktop UI
文档: 快速入门 · 架构 · 图谱架构 · MCP 集成 · 收据 · 基准测试 · 路线图 · 理念
发布渠道: GitHub Releases · crates.io · GHCR · npm · VS Code / Open VSX · Scoop — 发布指南
理念
- 消费者优先 — 美观、直观、即刻实用
- 无障碍性其次 — 兼容各种生态系统,可在任何地方运行
- 经济实惠再次 — 开销极低,从笔记本电脑到单体应用都适用
Arbor 本地优先:不强制外传数据,支持离线使用,且为开源软件。安全政策 →
贡献
cargo build --workspace
cargo test --workspace
cargo clippy --workspace --all-targets --all-features
CONTRIBUTING.md · 适合新手的议题 · 行为准则
Contributors
7 contributors | View all
License
MIT — see LICENSE.
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。