Releases: Entelligentsia/grove
Release list
v0.3.1
v0.3.0
v0.2.0
v0.1.11
[0.1.11] - 2026-06-27
Changed
- Route-by-task steering (
grove initCLAUDE.md block and thegrove
skill'sSKILL.md). Both surfaces previously framed code navigation as an
"INVARIANT — grove or it's a steering violation", relegating
grep/rg/read/cat/sedto fallbacks allowed only after grove was
tried. With grove's current 7-tool surface (no text-search tool yet), that
over-rigid framing pushed the model into costly one-symbol-at-a-timesource
fan-outs for things the shell does cheaply, and gave no guidance for
text/non-code/quick-fact work or for combining grove with the shell. The
steering now routes by task: grove for named symbols and structural
relationships (where-defined, who-calls, what's-in-a-file, how-a-dir-connects,
post-edit check), the shell for text / non-code files / quick facts ("the
right tool, not a fallback"), and an explicit combine path (grep a
literal's line →definition --at;outline→ bounded read;map/symbols
→ grep a constant inside). The useful procedure (outline→source chains, stable
symbol-ids,mapbreadth control, the shape-slice, profile gate, recovery,
setup) is preserved.
Notes
- Validated in the
nav-3waytestbench: onL4-grove-redisthe reworked
steering cut context ~41% (560k → 329k tokens) with no loss of answer
completeness — the model combined 20 grove calls with 3 greps + 2 bounded
reads instead of 36sourcecalls.
v0.1.10
[0.1.10] - 2026-06-27
Fixed
- Supertype-guard no longer false-positives on
/in query comments. The
guard added in 0.1.9 (which disableslocals.scm/imports.scmusing
crash-prone tree-sitter supertype syntax(a/b)) skipped string literals but
not;comments, so a comment like; if/elseor; try/catchwrongly
disabled an otherwise-valid query. It now tracks;-to-end-of-line comments.
This unblocks scope-aware resolution for hostedlocals.scmwhose comments
contain/(e.g. java, c, cpp).
Notes
- With this fix, the hosted registry's newly added
locals.scmfor python,
go, java, c#, c, cpp, rust take effect (grove fetch+definition --at),
bringing scope-aware go-to-def to 11 languages total (with the existing ruby,
scala, julia, javascript). Each was verified to resolve a shadowed local
line-exact against the pinned grammar.
v0.1.9
[0.1.9] - 2026-06-27
Added
- Scope-aware
definition --at(ADR 0001, Step 1) — go-to-def from a usage
position now resolves a name to its nearest enclosing local binding
(parameter orlet/assignment) before falling back to the directory-wide name
lookup. A shadowing local correctly wins over a same-named global, so the
result is the one binding the cursor refers to instead of a candidate list of
every same-named symbol. Driven by an optionallocals.scm(tree-sitter's
standard@local.scope/@local.definition/@local.referencequery) added
per registry dir; grammars without one keep the previous behavior. Shipped for
the rust/python/javascript dev stub;ingest/index/fetchnow carry
locals.scmthrough to the hosted registry. - Import-edge cross-file
definition --at(ADR 0001, Step 2) — when a name
has no local binding, grove now follows an import statement to the target
file and returns the definition there, instead of a directory-wide list of
every same-named symbol. Aliases resolve to the original symbol
(from m import x as y/import { x as y } from …). No index: at most one
extra file is parsed, bounded by import depth, not repo size. Driven by an
optionalimports.scmquery plus animport_resolutionstrategy in the
manifest profile —dotted_package(Pythonfoo.bar→foo/bar.py,
__init__.py, and relative./..imports) andrelative_path(JS/TS
./util→./util.js,.jsx,/index.js; bare specifiers are left to the
directory-wide fallback). Shipped for python/javascript; carried through
ingest/index/fetch. Out of scope (degrades to the candidate list):
method/receiver typing, multi-hop re-exports, wildcard/dynamic imports.
Changed
- MCP/CLI/steering descriptions now advertise
definition --atas the
precise, scope-aware, cross-file mode (no tool signatures changed) so agents
reach for it from a usage position instead of a name lookup.
Robustness
- Optional registry queries (
locals.scm/imports.scm) compile non-fatally
and their captures are prefix-matched, so a query authored against a
different grammar version (or using subtyped captures like
@local.definition.function) degrades gracefully instead of breaking the
grammar's core tools. - grove now refuses tree-sitter supertype query syntax (
(a/b)) in optional
queries, which can otherwise hard-crash the wasm query engine at match time —
so a hosted registry file can no longer segfault grove.
v0.1.8
[0.1.8] - 2026-06-25
Added
grove init --as grammars— a fourth integration target that provisions
grammars and writesgrove.lock, but writes no harness glue: no
.mcp.json, no CLAUDE.md steering block. For embedding hosts (e.g. an editor
or agent runtime that registers grove's tools in-process and supplies its own
steering), this leaves the project's own files untouched. The existingmcp,
skill, andbothtargets are unchanged — they still write steering, since
for a cold agent availability isn't adoption (VISION §6.4.1).
Full changelog: https://github.com/Entelligentsia/grove/blob/v0.1.8/CHANGELOG.md
grove v0.1.7
What's new
Lines/columns are now 1-based across the whole surface (fixes #31)
The headline fix. Previously grove reported raw 0-based tree-sitter rows in
symbol-ids, outline, map, definition --at, and callers — so every citation
was one line low vs the grep -n / editor convention. v0.1.7 normalizes to
1-based everywhere (CLI, MCP, symbol-ids), so a grove-sourced file:line:col
round-trips straight into --at and matches what you see in your editor.
- Symbol-ids are now
<lang>:<relpath>#<name>@<line>(1-based). grove definition --at <file:line:col>takes 1-based input.
callers now returns real coverage (fixes #33)
- Includes all reference kinds (not just
call) — type references,
implementation references, etc. — so heavily-used class/type names return
results instead of[]. - Textual fallback: a whole-word grep pass finds references the tags query
misses (type annotations, imports, dynamic dispatch), each tagged with
provenance —structural(tree-sitter, high precision) ortextual(grep,
high recall). - CLI output now leads with
path:line:coland marks each site[S]/[T].
Generated declaration files are skipped (fixes #32)
symbols / definition / callers now skip generated .d.ts / .d.cts /
.d.mts declaration files during directory walks, so they answer from real
source instead of machine-generated decls.
Note on v0.1.6
The v0.1.6 release notes and CHANGELOG listed #32 and #33, but those fixes were
not in the v0.1.6 tag's code (git merge-base --is-ancestor confirms; the
released v0.1.6 binary fails the generated-decls and callers-recall probes).
They ship here in v0.1.7, alongside #31. map (from #34, in v0.1.6) now also
reports 1-based lines.
Verification (Tier-1, agent-free, zero-token)
| probe | v0.1.6 | v0.1.7 |
|---|---|---|
| line-accuracy (#31) | 0/9 | 9/9 |
| generated-decls (#32) | 0/2 | 2/2 |
| callers-recall (#33) | 1/3 | 3/3 (spring-boot 886, django 261, hugo 504) |
| map-graph (#34) | 2/2 | 2/2 |
cargo test: 100 unit + 13 CLI pass, 0 warnings.
What's Changed
- fix(engine): surface 1-based lines/cols, not raw tree-sitter rows (#31)
- fix(ops): skip generated .d.ts declaration files in directory walks (#32)
- fix(ops): broaden callers to all reference kinds + textual fallback (#33)
- release: v0.1.7
Full Changelog: v0.1.6...v0.1.7
grove v0.1.6
What's new
map tool — directory-level dependency graph (fixes #34)
A new map tool returns every definition in a directory grouped by file, each with its outgoing references (which other symbols it calls/uses). No source bodies — just the dependency graph. This replaces many symbols+source round-trips with a single call, preventing the over-read / non-convergence behavior where agents fan out across many candidates without breadth control.
grove map src --kind function --name parse[{"file": "src/parse.rs", "entries": [
{"id": "rust:src/parse.rs#parse_item@41", "kind": "function", "name": "parse_item",
"parent": "Parser", "row": 41, "signature": "fn parse_item(&mut self) -> Result<Node>",
"references": ["Result", "Node", "lex"]},
...]}]Breadth control steering
Tool descriptions, MCP instructions(), init-written CLAUDE.md, and SKILL.md now actively steer agents toward map for architectural questions and away from sequential source fan-out.
Fixes from included PRs
- callers: include all reference kinds (not just
call) — type references, implementation references, etc. now return results instead of[]for heavily-used class/type names (#33) - callers: textual fallback finds whole-word references the tags query misses (#33)
- symbols/definition/callers: skip generated
.d.ts/.d.cts/.d.mtsdeclaration files (#32)
What's Changed
- feat(ops,mcp): add
maptool for directory-level dependency graphs (#34) - fix(ops): broaden callers to all reference kinds + textual fallback (#33)
- fix(ops): skip generated .d.ts declaration files in directory walks (#32)
Full Changelog: v0.1.5...v0.1.6
v0.1.5
grove v0.1.5 C navigation fixes: full symbol bodies (#25,#26), file-scope variables (#26), callers with enclosing-function context (#27); definition file column; struct kind alias.