Repository navigation
Releases: Anandb71/arbor
Release list
v3.1.0
Arbor v3.1.0
Installation
# macOS / Linux (prebuilt binary)
curl -fsSL https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.sh | bash -s -- --version v3.1.0
# Windows (PowerShell)
iwr https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.ps1 -OutFile install.ps1; .\install.ps1 -Version v3.1.0
# Cargo (builds from this tag)
cargo install --git https://github.com/Anandb71/arbor --tag v3.1.0 arbor-graph-cli
# npm
npx @anandb71/arbor-cli@3.1.0
# Docker
docker pull ghcr.io/anandb71/arbor:v3.1.0Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
Verify a download
sha256sum -c SHA256SUMS --ignore-missing
# Check that an archive was built by this repository's release workflow
gh attestation verify arbor-linux-x86_64.tar.gz --repo Anandb71/arborWhat's Changed
- chore: Homebrew and Scoop manifests for v3.0.5 by @Anandb71 in #269
- feat: find OpenAI, Anthropic and Gemini SDK usages in Python (arbor usages) by @Anandb71 in #276
- feat: arbor retirements — find code that calls retiring AI models by @Anandb71 in #277
- release: v3.1.0 — arbor usages and arbor retirements by @Anandb71 in #279
Full Changelog: v3.0.5...v3.1.0
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
v3.0.5
Arbor v3.0.5
Installation
# macOS / Linux (prebuilt binary)
curl -fsSL https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.sh | bash -s -- --version v3.0.5
# Windows (PowerShell)
iwr https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.ps1 -OutFile install.ps1; .\install.ps1 -Version v3.0.5
# Cargo (builds from this tag)
cargo install --git https://github.com/Anandb71/arbor --tag v3.0.5 arbor-graph-cli
# npm
npx @anandb71/arbor-cli@3.0.5
# Docker
docker pull ghcr.io/anandb71/arbor:v3.0.5Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
Verify a download
sha256sum -c SHA256SUMS --ignore-missing
# Check that an archive was built by this repository's release workflow
gh attestation verify arbor-linux-x86_64.tar.gz --repo Anandb71/arborWhat's Changed
- fix(mcp): relative paths in tool output + namespaced protocol _meta by @Anandb71 in #261
- Eval corpus: controlled-change states, real-repo slice, second language by @Anandb71 in #262
- Eval corpus: record per-fixture index timing by @Anandb71 in #264
- CI: npm install smoke on clean runners by @Anandb71 in #265
- fix(ts): attribute calls in test callbacks to the test (#235) by @Anandb71 in #267
- Release 3.0.5: tests in TypeScript and JavaScript count by @Anandb71 in #268
Full Changelog: v3.0.4...v3.0.5
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
v3.0.4
Arbor v3.0.4
Installation
# macOS / Linux (prebuilt binary)
curl -fsSL https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.sh | bash -s -- --version v3.0.4
# Windows (PowerShell)
iwr https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.ps1 -OutFile install.ps1; .\install.ps1 -Version v3.0.4
# Cargo (builds from this tag)
cargo install --git https://github.com/Anandb71/arbor --tag v3.0.4 arbor-graph-cli
# npm
npx @anandb71/arbor-cli@3.0.4
# Docker
docker pull ghcr.io/anandb71/arbor:v3.0.4Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
Verify a download
sha256sum -c SHA256SUMS --ignore-missing
# Check that an archive was built by this repository's release workflow
gh attestation verify arbor-linux-x86_64.tar.gz --repo Anandb71/arborWhat's Changed
- chore: update package manifests for v3.0.3 by @Anandb71 in #228
- ci: target the right release for MCP notes; fail crates.io on an empty token by @Anandb71 in #229
- fix(cli): explain first-run failures: no git, no repository, no write access by @Anandb71 in #230
- ci(release): build Linux against glibc 2.28 and smoke-test every binary before publishing by @Anandb71 in #243
- fix(receipt): keep git's racy-clean check when seeding the snapshot index by @Anandb71 in #246
- ci: publish npm with provenance and attest the GHCR image by @Anandb71 in #247
- fix(server): refuse WebSocket handshakes from foreign origins by @Anandb71 in #249
- test(mcp): pin one request per connection and ambiguous framing on the HTTP transport by @Anandb71 in #248
- fix(graph): re-open the graph store safely after a handle is dropped by @Anandb71 in #251
- fix(cli): keep .arbor out of git by @Anandb71 in #253
- fix(mcp): explicit version rejection, stateless HTTP negotiation, stdio parse errors by @Anandb71 in #254
- ci: exercise the installers per-OS against a local release fixture by @Anandb71 in #255
- test: versioned evaluation corpus for graph accuracy by @Anandb71 in #257
- Extension narrowing + transport-level protocol tests by @Anandb71 in #256
- fix: precise arbor diff, typed Rust receivers, quiet logs and shadowed-install checks by @Anandb71 in #259
- Release 3.0.4: precise arbor diff, typed Rust receivers, shadowed-install checks by @Anandb71 in #260
Full Changelog: v3.0.3...v3.0.4
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
v3.0.3
Every item below was a wrong answer rather than a missing feature, and each ships with a regression test. No breaking API changes.
Most of it came from running v3.0.0 on a mixed Rust and TypeScript codebase
and checking its answers by hand (#225).
Rust calls were invisible
The Rust extractor recorded only bare name() calls. These produced no edge:
crate::jobs::enqueue()andjobs::enqueue()Type::new()and other associated functionsself.method()- any call inside a macro argument, which includes every
assert!(...)and
format!(...)
So a function called from dozens of places could report a handful of callers,
all of them wrong. Paths now resolve through the module tree
(SymbolTable::resolve_path): jobs::enqueue means the enqueue defined in
jobs.rs or jobs/mod.rs, a crate-name prefix is skipped, and a path into an
external crate stays unresolved instead of binding to a local function that
happens to share its last segment. Macro token trees are read as code.
arbor diff blamed new code for old callers
A change was mapped to every symbol in each touched file. Adding one function
to a busy file reported the blast radius of everything already in it, so an
additive branch could come out Critical.
arbor diff now works per symbol. It compares each changed file against its
previous version: modified symbols carry a blast radius and new ones don't.
Tests that call the change are listed as worth running, not counted as impact
or as entry points.
It also gained scopes:
arbor diff --base origin/main # this branch, as its pull request shows it
arbor diff --staged # only what is stagedcheck and summary take the same flags. Whitespace-only edits and
generated files are ignored.
Same name, different language
arbor callers enqueue could list TypeScript callers for a Rust function.
Resolution now stays within a language family, and when a name matches several
definitions callers/callees answer for each one separately. Narrow a query
with jobs::enqueue, Type.method or src/jobs.rs:enqueue. An empty answer
now says what the graph cannot see (trait objects, callbacks, reflection)
rather than implying the symbol is unused.
Answers from the wrong branch
The graph was treated as fresh when no source file was newer than it. After
switching branches, the files that remained were older, so the graph built on
the other branch answered. It also survived upgrades: a graph built by an older
Arbor kept giving that version's answers until some file changed.
Saved graphs now record the commit and the extractor that built them. A moved
HEAD or a different Arbor version triggers a refresh through the per-file
cache. A running arbor bridge still owns its graph; the CLI tells you when
the bridge is behind HEAD rather than racing it.
Also fixed
- Inheritance (#191):
class Middle(Base)now produces anextends
edge, and methods a subclass inherits stay reachable. Changing a base class
used to report zero blast radius. - Call cycles (#190): a closed ring of functions no longer fills the top
of the centrality ranking. Each cycle is ranked once, as a component. - Vendor assets (#189):
vendor/and minified files are not indexed. - HTTP bridge (#222):
arbor bridge --httprejects cross-origin and
DNS-rebinding requests, requires JSON, and bounds request size, time and
connections. - Bridge busy loop (#174): ignored build directories no longer trigger
re-indexing. - GitHub Action: the prebuilt download looked for asset names that were
never published, so every run compiled from crates.io instead. Pin
Anandb71/arbor@v3.0.3to get the fix.
New: receipts
arbor receipt explains, after each coding-agent turn, what changed in plain
English and flags anything touched that you didn't ask for.
arbor receipt undo puts a turn back. arbor hook claude wires it into
Claude Code. See RECEIPTS.md.
Upgrading
Cached graphs from 3.0.0 are rebuilt automatically on first use. JSON output
only gained fields: arbor diff --json adds compared, modified_symbols,
added_symbols, new_symbols, deleted_files and impact.tests_exercising,
and arbor callers --json adds matches when a name is ambiguous and note
when the answer is empty.
Installation
# macOS / Linux (prebuilt binary)
curl -fsSL https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.sh | bash -s -- --version v3.0.3
# Windows (PowerShell)
iwr https://raw.githubusercontent.com/Anandb71/arbor/main/scripts/install.ps1 -OutFile install.ps1; .\install.ps1 -Version v3.0.3
# Cargo (builds from this tag)
cargo install --git https://github.com/Anandb71/arbor --tag v3.0.3 arbor-graph-cli
# npm
npx @anandb71/arbor-cli@3.0.3
# Docker
docker pull ghcr.io/anandb71/arbor:v3.0.3Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
What's Changed
- fix(server,watcher): stop bridge busy-looping on ignored build dirs by @w0wl0lxd in #174
- fix(packaging): correct v3.0.0 checksums and point at the current org by @Anandb71 in #186
- fix(graph): exclude vendor assets and compute hotspot centrality by @Anandb71 in #189
- fix(graph): resolve PageRank closed-cycle rank sink and balance score distribution by @JunaidAhamed-7777 in #190
- docs: adopt the new brand mark and correct the Action reference by @Anandb71 in #219
- ci: add cargo-deny for licences, duplicates and advisories by @Anandb71 in #220
- fix(graph): emit class inheritance edges and reach inherited methods by @JunaidAhamed-7777 in #191
- fix(mcp): refuse cross-origin and rebinding requests on the HTTP transport by @Anandb71 in #222
- feat(cli): plain-English receipts after every agent turn by @Anandb71 in #223
- examples: centrality distribution, max-norm vs percentile by @Anandb71 in #170
- fix(cli): let Claude read receipts unprompted, but ask before undo by @Anandb71 in #224
- Fix #225: Rust call edges, per-symbol diffs with --base, grouped callers, fresh graphs by @Anandb71 in #226
- Release 3.0.3: upgrade-safe graphs, working Action downloads, release pipeline and docs by @Anandb71 in #227
New Contributors
- @w0wl0lxd made their first contribution in #174
- @JunaidAhamed-7777 made their first contribution in #190
Full Changelog: v3.0.0...v3.0.3
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
v3.0.0 — The Right Node
v2.6.0 stopped dropping colliding symbols. It did not stop resolving them to the wrong one.
What was wrong
When a bare name matched definitions in several modules, resolve_ref fell through to SameDir and attached the edge to whichever definition happened to sit in the caller's own directory. Not a dropped edge — a confidently misrouted one, stamped at 0.55 confidence.
On a fixture with ten layers each defining value_m14, every caller in l1/ resolved to l1/m14.py rather than the l0/m14.py it had actually imported. The intended target ended with no callers at all while an unrelated sibling inherited its centrality.
Measured
260 modules across 10 layers, each layer reusing the same 26 function names. Ground truth is derived from the generator's own edge list, so the expected answer is exact rather than estimated.
| True downstream | 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 |
Previously flat at about 22 regardless of the real answer. Now it tracks. Risk on the largest hub moves from LOW to CRITICAL.
Total edge count barely moves (1335 → 1334) — the signature of misrouting rather than loss. The edges were always there, pointing at the wrong nodes.
Fixture: getArbor-dev/arbor-torture
The change
GraphBuilder already kept a per-file import map, but only apply_import_validation read it, and that scores an edge after one has been chosen — so it never saw the references going to the wrong node.
Consulting it between the same-file and same-directory checks keeps a local definition shadowing an import, while letting a written import beat mere adjacency. Resolution::ViaImport scores 0.93, above SameDir's 0.55.
Breaking
Resolutiongains aViaImportvariant — an exhaustive match will not compile- Edges land on different nodes, so cached graphs, stored node ids, and centrality baselines from 2.6.0 will differ
Known and still open
- Small targets now over-report (36 → 61, 16 → 46). Safer direction than silence, but not correct.
- PageRank has no escape from a closed cycle. All 500 members of a 500-function ring score above 90% centrality on one caller each, so mutually recursive clusters crowd the top of any ranking.
- Inheritance produces no edges.
class Middle(Base)is invisible, so changing a base class shows zero blast radius. - Dynamic and reflective imports are unresolvable by construction and are documented as expected misses in the fixture rather than counted as defects.
Full workspace tests green on Linux, macOS and Windows. 149 tests in arbor-graph, four of them new — including one that pins the misrouting itself, so a regression fails loudly instead of quietly returning a wrong number.
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
v2.6.0 — Telling the truth about the graph
Nine correctness defects in the analysis core. Every one was found by running
Arbor against real codebases — honojs/hono, psf/requests — rather than
fixtures, and every one ships with a regression test.
Zero breaking API changes. cargo install arbor-graph-cli --force and the
answers get more accurate.
The graph was lying in six ways
Determinism was not deterministic. Symbol resolution decided
same-directory locality by iterating a HashMap and taking the first hit.
Rust seeds RandomState per process, so the same binary on the same input
could build different edges between runs. A test now indexes a fixture eight
times in separate processes and asserts one identical graph — the only way
to catch this, since a single process shares one hash seed.
Colliding symbols were silently dropped. The FQN map used
HashMap::insert, so a second definition of handler, new, or process
replaced the first. The loser became unreachable — zero callers, zero
centrality, invisible to blast radius. Every definition is now kept.
Ambiguous lookups answered confidently and wrongly. On hono,
arbor inspect getPath reported "unreachable, 0 callers, may be dead code"
about a function called from ten places, because eleven call sites across the
CLI and MCP bridge resolved names with find_by_name(..).first() — whichever
file parsed first. There is now one ranked resolution policy, and the CLI
tells you which definition it picked and what else matched.
TypeScript symbols were extracted twice. The export_statement handler
recursed into its children, then the generic loop recursed into the same
children again. Every exported symbol became two vertices sharing one node id.
On a 149-file Next.js app: 133 phantom nodes, 25% of the graph, each halving
its symbol's centrality and double-counting it in blast radius.
Prose was indexed as code. Markdown headings became graph nodes, so a
# fetch benchmark heading in a README competed with real fetch definitions
during resolution. Shell comments became functions — # Compare app.fetch() between refs yielded a function literally named "# Compare app.fetch". 59
phantom nodes on hono, every one a false resolution candidate.
Centrality was not comparable between repositories. Scores were divided by
the graph maximum, so the top node was 1.0 by construction whether it had
four callers or four hundred. A 0.6 threshold selected nearly everything in
a flat repo and nothing in one with a god object, and adding a single hub
rescaled every other node. Centrality is now a percentile rank.
Recall on TypeScript
obj.method() was discarded outright, on the reasoning that typing the
receiver needs inference we do not have. That is the dominant call shape in
real TS/JS, so the graph came out nearly edgeless on the largest ecosystem
Arbor supports — and an empty graph reports a blast radius of zero, which
reads as safe rather than unknown. Those calls now resolve by method name
under a fan-out cap, at reduced confidence.
Measured on identical node sets, after the duplicate fix:
| before | after | |
|---|---|---|
| TypeScript (149 files) | 172 edges | 196 (+14%) |
| Rust (arbor-graph) | 116 edges | 167 (+44%) |
New
Edge confidence. Every edge carries a value in [0,1] derived from how it
resolved, so traversal no longer treats a proven same-file call and a
heuristic suffix guess as identical evidence. confident_edge_count() reports
how much of a graph rests on inference.
Hunk-level impact. changed_node_ids_for_ranges maps diff line ranges to
the symbols that actually overlap them, and parse_unified_diff_ranges reads
them from a patch. File granularity treats a one-line edit in a 60-symbol file
as changing all 60.
Concept search. Identifiers are tokenized — snake, camel, Pascal, acronym
runs — and expanded through curated concept clusters, so login finds
get_authenticated, which shares no substring with it and was previously
unfindable. Docstrings, signatures, and file paths are indexed too; they were
parsed into every node and then ignored. Results carry the match kind, so an
exact hit stays distinguishable from a concept guess.
Upgrading
Graph caches are invalidated automatically — the serialized format gained edge
confidence and raw centrality, and CACHE_VERSION tracks the package version.
The first index after upgrading rebuilds from source.
320 tests, clippy clean at -D warnings, verified end to end through the CLI
and the MCP bridge.
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
Arbor v2.6.0
Installation
# Cargo
cargo install arbor-graph-cli --version 2.6.0
# Homebrew (macOS/Linux)
brew install Anandb71/tap/arbor
# Scoop (Windows)
scoop bucket add arbor https://github.com/Anandb71/arbor
scoop install arbor
# npm
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:v2.6.0Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
What's Changed
- docs: replace hero GIF with grep-vs-arbor side-by-side demo by @Anandb71 in #159
- chore: v2.5.0 Homebrew/Scoop checksums by @Anandb71 in #161
- Fix/graph truth layer by @Anandb71 in #162
- fix(graph): correct symbol resolution, centrality, and edge recall (v2.6.0) by @Anandb71 in #163
Full Changelog: v2.5.0...v2.6.0
Arbor v2.6.0
Installation
# Cargo
cargo install arbor-graph-cli --version 2.6.0
# Homebrew (macOS/Linux)
brew install Anandb71/tap/arbor
# Scoop (Windows)
scoop bucket add arbor https://github.com/Anandb71/arbor
scoop install arbor
# npm
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:v2.6.0Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
What's Changed
- docs: replace hero GIF with grep-vs-arbor side-by-side demo by @Anandb71 in #159
- chore: v2.5.0 Homebrew/Scoop checksums by @Anandb71 in #161
- Fix/graph truth layer by @Anandb71 in #162
- fix(graph): correct symbol resolution, centrality, and edge recall (v2.6.0) by @Anandb71 in #163
- chore(release): sync packaging manifests to 2.6.0 by @Anandb71 in #164
Full Changelog: v2.5.0...v2.6.0
Arbor v2.6.0
Installation
# Cargo
cargo install arbor-graph-cli --version 2.6.0
# Homebrew (macOS/Linux)
brew install Anandb71/tap/arbor
# Scoop (Windows)
scoop bucket add arbor https://github.com/Anandb71/arbor
scoop install arbor
# npm
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:v2.6.0Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
What's Changed
- docs: replace hero GIF with grep-vs-arbor side-by-side demo by @Anandb71 in #159
- chore: v2.5.0 Homebrew/Scoop checksums by @Anandb71 in #161
- Fix/graph truth layer by @Anandb71 in #162
- fix(graph): correct symbol resolution, centrality, and edge recall (v2.6.0) by @Anandb71 in #163
- chore(release): sync packaging manifests to 2.6.0 by @Anandb71 in #164
Full Changelog: v2.5.0...v2.6.0
v2.5.0 — The Last Excuse ⚡ 23x faster PageRank, parallel indexing
"Indexing is slow" was the last argument for letting your coding agent navigate with
grep -r.
It's gone.
⚡ TL;DR — every number measured, every number reproducible
| Measurement | v2.4.0 | v2.5.0 | Delta |
|---|---|---|---|
| PageRank, 10k-node call graph (20 iter) | 149.8ms | 6.6ms | 23x 🔥 |
| Cold index, tokio (815 files, 178k LOC) | 2.7s | 1.6s | 1.7x |
| Cold index, Arbor itself (123 files) | 253ms | 95ms | 2.7x |
| Watcher recompute after a 1-file patch | full 20 iterations | ~2 rounds | warm-start |
Think a number is wrong? cargo bench -p arbor-graph and prove it → BENCHMARKS.md
🚀 What's new
Parallel indexing
The parse phase now fans out across every core (rayon). Per-task tree-sitter parsers, no locks in the hot path, and results assemble in walk order — the graph you get is byte-for-byte identical to the sequential build, just sooner.
arbor index . --no-cache # all cores, default
RAYON_NUM_THREADS=4 arbor index . # or pin itPageRank, rewritten
The old hot loop paid for graph traversal and string-ID lookups on every node, every iteration. It now builds a flat call-graph adjacency once and iterates dense vectors. Identical semantics (Calls edges only, 10% test-caller weight) — benchmarked side-by-side against the old implementation in the same Criterion run. 23x.
Warm-start centrality
Watcher-driven recomputes now seed from the previous scores instead of starting cold. Stored scores are max-normalized, so a naive warm start converges no faster — v2.5.0 rescales them back to fixed-point scale analytically in one edge pass. A one-file change converges in ~2 rounds.
Convergence early-exit
Iteration stops at a 1e-9 max delta. The budget is a ceiling, not a sentence.
🤖 Why agents care
arbor map (the recommended first MCP call) = index cost + rank cost — both just dropped. Cold-starting an agent on a 178k-LOC codebase it has never seen: 1.6 seconds. The token argument for graph-navigation over grep-and-read was never close (~95% reduction); now the latency argument is gone too.
🔍 The limit we haven't beaten (yes, we're publishing it)
Stress-tested against VS Code: 12,406 files → 366k extracted nodes, completes in ~405s cold. At that graph size single-threaded assembly dominates and parallel parsing can't save it. It's documented in BENCHMARKS.md as a known limit and it's the #1 target for v2.6.0. Receipts or it didn't happen.
📦 Upgrade
Zero breaking changes. Zero config changes.
cargo install arbor-graph-cli --forceMCP clients: nothing to do. v2.4.0 graph.bin caches load fine and their scores warm-start the first recompute.
🔭 Deferred to v2.6.0
- Large-graph assembly optimization (the VS Code bottleneck above)
- Unified parser pipelines
- Process-level graph daemon
- Incremental PageRank over graph deltas
Full changelog: v2.4.0...v2.5.0.
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
Arbor v2.5.0
Installation
# Cargo
cargo install arbor-graph-cli --version 2.5.0
# Homebrew (macOS/Linux)
brew install Anandb71/tap/arbor
# Scoop (Windows)
scoop bucket add arbor https://github.com/Anandb71/arbor
scoop install arbor
# npm
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:v2.5.0Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
What's Changed
- fix(ci): retry apt installs and skip release QA gate on tag push by @Anandb71 in #156
- fix(ci): make Open VSX publish non-blocking on release by @Anandb71 in #157
- v2.5.0 "The Last Excuse": parallel indexing + 23x faster PageRank by @Anandb71 in #158
- fix(release): sync remaining manifests to 2.5.0 + hero GIF by @Anandb71 in #160
Full Changelog: v2.4.0...v2.5.0
Arbor v2.4.0 — "The Agent-Native Leap"
Arbor v2.4.0 — The Agent-Native Leap
Release date: July 2026
First code-graph MCP server built for MCP 2026-07-28.
What's New
MCP 2026-07-28 Protocol
- Protocol version
2026-07-28with dual-version fallback for2025-03-26clients - Stateless
server/discoverendpoint - Response caching metadata (
ttlMs,cacheScope) on list/read operations - Extensions capability map for Tasks and MCP Apps
Tasks Extension
tasks/get,tasks/update,tasks/cancelfor long-running operations- Background indexing returns task handles instead of errors during cold start
- Agents poll task progress while the graph builds
MCP Apps (SEP-1865)
- Interactive blast-radius graph UI (
ui://arbor/blast-radius) - Interactive architecture map UI (
ui://arbor/architecture-map) analyze_impactandget_architecture_overviewdeclare_meta.uiresource URIs
Streamable HTTP Transport
arbor bridge --http --port 3333- Stateless HTTP alongside stdio
Mcp-Method/Mcp-Nameheader routing- Deploy behind load balancers for remote/enterprise use
Tool Quality
get_blast_radius— real git-diff blast radius analysis (replaces stub)- Pagination on
search_symbolsandget_map(offset,limit,hasMore) - Async tokio stdio (replaces blocking stdin loop)
Benchmarks
- Criterion suite:
cargo bench -p arbor-graph - CI regression gate via
.github/workflows/benchmarks.yml - Updated
docs/BENCHMARKS.mdwith token-savings methodology
Upgrade Guide
MCP clients (Claude / Cursor) — no changes required for stdio:
claude mcp add --transport stdio --scope project arbor -- arbor bridgeHTTP clients (new):
arbor bridge --http --port 3333
# POST http://127.0.0.1:3333/mcp
# Headers: Mcp-Method: tools/call, Mcp-Name: analyze_impactClients on 2025-03-26 keep working. Clients on 2026-07-28 get Tasks, Apps, caching, and pagination.
Full Changelog
Added
- MCP 2026-07-28 protocol:
server/discover,_metaparsing, response caching, dual-version fallback - Tasks extension:
tasks/get,tasks/update,tasks/cancel - MCP Apps: blast-radius graph + architecture map HTML templates
- Streamable HTTP:
arbor bridge --http [--port 3333] - Real
get_blast_radiusvia sharedarbor-graph::compute_blast_radius - Pagination on
search_symbolsandget_map - Criterion benchmarks + CI workflow
Changed
- Async MCP stdio (tokio replaces blocking stdin loop)
- MCP tool annotations:
_meta.uionanalyze_impactandget_architecture_overview - Workspace version bumped to 2.4.0
Deferred to v2.5.0
- Parallel (rayon) indexing
- Incremental PageRank
- Unified parser pipelines
- Process-level graph daemon
Install: cargo install arbor-graph-cli · GitHub · MCP Registry
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
Arbor v2.4.0
Installation
# Cargo
cargo install arbor-graph-cli --version 2.4.0
# Homebrew (macOS/Linux)
brew install Anandb71/tap/arbor
# Scoop (Windows)
scoop bucket add arbor https://github.com/Anandb71/arbor
scoop install arbor
# npm
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:v2.4.0Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
What's Changed
Full Changelog: v2.3.0...v2.4.0
Arbor v2.3.0 — The AI Agent Brain
Arbor v2.3.0 is a major release designed to turn Arbor into the semantic memory and reasoning engine for autonomous AI coding agents (Claude, Cursor, Cline, Aider).
🧠 Agent-Native MCP Server (15 Tools)
- Added 5 new agentic MCP tools raising the total to 15:
get_blast_radius: Performs diff-aware impact and risk prediction for pending changes.explain_symbol: Context-bounded slices explaining a symbol's role, callers, and significance.audit_security: Downstream call-graph tracing to detect data and security sinks.get_architecture_overview: orienting tool summarizing hotspots, modules, and entry points.batch_query: Multi-symbol single round-trip lookups.
- Added standard spec-compliant annotations (
readOnlyHint, etc.) and graph resources (arbor://graph/stats,arbor://graph/entry-points,arbor://graph/hotspots) for zero-reprompt agent tool chaining.
🌳 Built-in Local Agent Workflows (arbor agent)
arbor agent review: Automatically flags high-centrality hub changes, entry points, and architectural violations on PRs.arbor agent onboard: Generates a structured markdown codebase guide for new contributors.arbor agent guard: Enforces blast-radius thresholds and public API checks in local development.
🚀 Platform & Performance Enhancements
- 10x Faster CI Setup: Upgraded GitHub Action to fetch pre-compiled platform binaries from Releases (~5s action runs).
- A2A Discovery: Added standard
agent-card.jsonfor agent-to-agent capability negotiations.
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
-
v2.2.0 - PR Intelligence
- PR Blast Radius Reports: Color-coded Markdown outputs for pull requests via
arbor diff/check --markdown. - Auto-Generated PR Descriptions: Instantly draft structured PR descriptions using
arbor summary. - Upgraded GitHub Action: Automatic comment deduplication and in-place updating using the GitHub CLI.
- GitHub Sponsors Integration: Enabled official repository sponsor button via
.github/FUNDING.yml. - Shell-less Extension Execution: Hardened VS Code command execution using secure
execFileSyncarguments. - Atomic Cache Writes: Prevented concurrent cache corruption via
.tmpfile renames. - Dependency Cleanups: Pruned yanked
core2crate by disablingimagedefault features. - Workspace Sync: Clean inheritance of crate metadata across all packages.
- Cargo:
cargo install arbor-graph-cli --version 2.2.0 - npm:
npx @anandb71/arbor-cli@2.2.0
🤖 Arbor MCP Quick Install
Use Arbor as a local MCP server in your AI client:
Claude Code (project-scoped)
claude mcp add --transport stdio --scope project arbor -- arbor bridge
claude mcp listIn Claude Code, run:
/mcp
Cursor MCP config (.cursor/mcp.json)
{
"mcpServers": {
"arbor": {
"command": "arbor",
"args": ["bridge"]
}
}
}VS Code MCP config (.vscode/mcp.json)
{
"servers": {
"arbor": {
"type": "stdio",
"command": "arbor",
"args": ["bridge"]
}
},
"inputs": []
}MCP Directories
- Glama: https://glama.ai/mcp/servers/@Anandb71/arbor
- Skills Playground: https://skillsplayground.com/mcps/nandb71-arbor/
Arbor v2.2.0
Installation
# Cargo
cargo install arbor-graph-cli --version 2.2.0
# Homebrew (macOS/Linux)
brew install Anandb71/tap/arbor
# Scoop (Windows)
scoop bucket add arbor https://github.com/Anandb71/arbor
scoop install arbor
# npm
npx @anandb71/arbor-cli
# Docker
docker pull ghcr.io/anandb71/arbor:v2.2.0Assets
| Platform | Architecture | File |
|---|---|---|
| Linux | x86_64 | arbor-linux-x86_64.tar.gz |
| Linux | aarch64 | arbor-linux-aarch64.tar.gz |
| macOS | x86_64 | arbor-macos-x86_64.tar.gz |
| macOS | Apple Silicon | arbor-macos-aarch64.tar.gz |
| Windows | x86_64 | arbor-windows-x86_64.zip |
What's Changed
- Fix init/setup to use nearest workspace root by @Anandb71 in #143
- feat: Arbor v2.2.0 - PR Intelligence & Sponsorships (Mermaid diagrams… by @Anandb71 in #145
- chore: align sponsorship configuration to use standard .github/FUNDIN… by @Anandb71 in #146
- feat: CLI/MCP parity, map command, and concurrency fixes by @zacwolfe in #147
- chore: implement release hardening plan v2.2.0 by @Anandb71 in #148
New Contributors
Full Changelog: v2.1.0...v2.2.0