Releases: bartolli/codanna
Releases · bartolli/codanna
Release list
v0.9.23
Resolver precision release. Resolved-relationship counts drop across the board, and the drop is the fix: method-call edges that resolve now target the call site's actual receiver, method calls whose receiver type cannot be named return nothing instead of a guess, and resolution output is deterministic run to run. On the recall side, Python imports resolve across package boundaries and re-exports, and super() calls resolve to the parent's method instead of the caller's own override.
Breaking Changes
- Resolved-relationship counts drop across indexed codebases. The resolver previously picked the first same-name candidate for method calls with unknown receiver types; those calls now return unresolved. Import, inheritance, and function-call edges keep their semantics. Cached counts will not match.
- Full rebuild required (
rm -rf .codanna && codanna init && codanna index <root>, or--force). Mandatory for watcher-served indexes: through 0.9.22 the watcher's single-file path never persisted id counters, so each watch-triggered reindex could mint duplicatesymbol_ids. Rebuilding with 0.9.23 corrects existing duplicate ids; the atomic counter commit prevents recurrence. Also rebuild-not-migrate:scope_contextvalues written by older versions read as no-scope-info, and Python imports and method names index differently (see Added). - CLI
--json: ambiguous symbol names return anINVALID_QUERYenvelope with the candidate list and exit 2, replacing aggregation across same-named symbols; backend query failures returnINDEX_ERRORand exit 2 instead of an empty result. LanguageBehavior::resolve_method_callremoved (no remaining call path). External implementors drop their overrides.indexing.project_rootconfig field removed; it was never read.
Added
- Python package-level import graph: relative imports normalize to absolute form at parse time; re-exports (explicit, aliased,
import *) resolve through__init__to the definition site; class inheritance emitsExtendsedges (previously mis-emitted asImplements); methods index under bare names, withClass.methoddotted lookup now a query-layer feature across all languages. super()calls resolve to the parent class's directly-declared member: single hop through theExtendsedge in base-list order; no parent declaring the member yields no edge rather than a guess.dump_edgesexample binary: full edge dumps for run-to-run diffing;--dupslists everysymbol_idwith more than one indexed doc.- Deletion-only indexing runs report
Removed N deleted file(s), M symbol(s) from index;Index up to datenow means no changes in either direction.
Changed
- Symbol cards request one context set on every surface (implementations, definitions, callers, extends, uses): CLI
find_symbol --json,semantic_search_with_context, MCPfind_symbol,retrieve_symbol,retrieve_search.extends/extended_by/usespreviously rendered null on the CLI and retrieve paths. - Resolution is order-independent: candidate lists sort by identity (file path, line, id), not session insertion order; repeated runs over the same tree produce identical edge sets.
- One resolution policy for MCP text and CLI JSON: symbol lookup (refuse-and-list on ambiguity), the
SymbolKindvocabulary, and receiver formatting are a shared service (src/mcp/service.rs). - Module decomposition:
src/indexing/pipeline/split by responsibility withrun_phase1as the single Phase 1 orchestrator;tantivy.rssplit into schema/codec/writer/query;config.rsandmcp/mod.rssplit likewise. - Hot paths move and borrow instead of cloning;
CompactStringbacks its alias withArc<str>. rmcp1.7 -> 2.1: model types align with the MCP 2025-11-25 spec revision; tool results carry specContentBlockvalues (wire format for text content unchanged; MCP text and CLI outputs byte-identical). Logging notifications keep emitting for client compatibility; the spec deprecates them under SEP-2577.tower-http0.6 -> 0.7; patch/minor bumps acrossanyhow,bitflags,chrono,console,ignore,indicatif,memmap2,rand,regex,rustls,sysinfo,tree-sitter,tree-sitter-swift.
Fixed
- Method calls on receivers whose type is neither inferred nor indexed fail closed instead of resolving by insertion order.
- Call sites attribute to the enclosing same-name symbol, so a test stub no longer absorbs the real function's callers.
- Import-path matching respects segment boundaries (
crate::widgetsno longer matchescrate::widget); same-module checks bound their prefix match to the caller language's separator, closing private-symbol leaks across string-prefix sibling modules. - Batch-incremental indexing resolves against the persisted index; edges through an unchanged re-export survive consumer-only changes.
- Module paths resolve for out-of-tree indexed roots; TS/JS resolver-provider config lookup keys on absolute file path.
- Id counters commit atomically with their docs on rolling commits, final commits, and the watcher single-file path.
find_symbolandanalyze_impactheaders render from the name-matched doc, keeping each row self-consistent even against an index carrying duplicate ids.scope_contextpersists as JSON via serde, replacing a Debug-string scrape that silently decoded most parent kinds to none.- Embedding pool acquire is bounded (60s, then a
PoolExhaustederror) instead of blocking forever; checked-out instances release on drop, panic-safe; the embed fan-out runs on a dedicated rayon pool. - Semantic saves stage to a temp path and rename into place; vector storage drops its mmap before writing the backing file; Tantivy rolls back on cleanup errors instead of half-committing.
codanna servelock acquisition race closed; the lock releases beforeprocess::exit.- Panicked read workers and failed symbol writes surface as indexing errors instead of being swallowed.
- Profile rollback failures propagate instead of being discarded.
- Config guidance templates and variables serialize in insertion order.
Removed
- Dead code with no callers:
SymbolStore,IndexTransaction,ResolutionMemo, unused vector wiring.
v0.9.22
Method-call resolution accuracy: static calls disambiguate by receiver type, instance calls infer the receiver from caller-parameter types, and inheritance-aware resolution lands for PHP.
Breaking Changes
- Method-call resolution is stricter. Calls that previously resolved to a wrong-class same-name method now return unresolved. Downstream consumers of
find_callers,analyze_impact, andget_callswill see fewer (but more accurate) edges; cached resolution counts will not match. - Re-index recommended. The new Tantivy fields
relation_receiverandrelation_static_calldrive receiver disambiguation; existing indexes load with defaults (receiver=none,static=false) and skip the new filtering until re-indexed. The on-disk format itself is additive — no migration step required.
Added
- Static method calls disambiguate by receiver type.
Foo::bar()(Rust),Foo.bar()(Python/TS/Java/Go), and equivalents now resolve to the candidate whose containing type matches the receiver. No-match returns unresolved instead of silently selecting an unrelated same-name method. - Instance method calls resolve via caller-parameter type inference for Rust, Python, TypeScript, Go, Java. In
fn f(x: Foo) { x.bar() },barresolves againstFoo's methods. - PHP
parent::method()resolves cross-file via per-language inheritance resolver built fromExtendsrelationships;self::andstatic::resolve to the caller's class. - Method calls across 12 parsers (TypeScript, JavaScript, Java, Go, Kotlin, Swift, C++, PHP, C, Lua, GDScript, Python) carry receiver name and static-call flag; per-language
is_staticheuristics (Pascal-leading receiver, imported-package match,::token, etc.). - Clojure interop:
(.method obj)resolves as instance call;(Class/staticMethod)resolves as static call. - Kind-compatibility filter rejects resolutions where the (source-kind, target-kind, relationship-kind) triple is invalid - e.g. a method-call relationship cannot resolve to a field.
- MCP server:
allowed_hostsandallowed_originsconfig; unset flows to rmcp defaults.
Changed
- Tantivy relationship schema gains
relation_receiverandrelation_static_callfields (additive; see Breaking Changes). tantivy0.24 -> 0.26,sha20.10 -> 0.11 (hex = "0.4"added as runtime dep),rmcp-> 1.7 (consume-selfStreamableHttpServerConfigbuilder).reqwestpinned to 0.12 /rustls-tls-> ring (0.13'srustlsfeature pulls aws-lc-rs + bindgen).
Fixed
- Receiver-compatibility suffix matching now uses each language's module separator (Python
., Go/, Java.) instead of hardcoded::. Previously matched only Rust and PHP path conventions. - Broken compare links in CHANGELOG.md.
v0.9.21
Fixed
documents stats <collection>returns per-collection file count.collection_statsfiltersfile_statesbystate.collection == name; prior count summed all collections (#103).
Removed
gpu-*feature scaffolding (gpu-cuda,gpu-tensorrt,gpu-coreml,gpu-directml,gpu-openvino,gpu-rocm): commentedCargo.tomlentries, matching[lints.rust] unexpected_cfgscheck-cfg,tests/semantic/gpu_*.rs,tests/semantic_tests.rsgateway. Upstreamfastembed = "=5.6.0"exposes none of these features.[lints.clippy]table. CI runscargo clippy --all-targets --all-features -- -D warnings;uninlined_format_argsis a default clippy lint atwarn, so-D warningsdenies it without a table entry.clippy.tomlheader references the CI command.
v0.9.20
Fixed
documents index --collection Xno longer wipes chunks belonging to other collections in the same index.detect_changesscopes its removed-files scan bystate.collectionso cross-collection paths infile_statesare not classified as removed (#100).codanna serve(stdio) acquires.codanna/index/serve.lockon startup; a duplicate invocation against the same index exits 1 with guidance to use HTTP mode for shared access. Stale lockfiles are reclaimed viasysinfoPID-liveness check (#101).
Changed
- Clippy lint pass:
unnecessary_sort_bytosort_by_keywithReverse(php behavior, vector engine),explicit_counter_loopto(1..).zip(python parser),collapsible_matcharm guards (kotlin/php/typescript parsers), redundant.into_iter()after.zip()removed (embed pipeline, embedding pool).
v0.9.19
Fixed
mcp get_index_inforeports persisted remote semantic metadata in lite facade loads (PR #98)- Remote embedding model name shown instead of local default in status messages (PR #98)
index-parallelpersistsindex.metaso MCP status reads do not trigger unnecessary sync (PR #98)- Windows test portability: Java, Lua, and path tests use TempDir instead of hardcoded Unix paths (PR #98)
Changed
index-parallelcommand retired;indexuses the same pipeline pathformat_semantic_status()shared helper for remote/local status formatting- GitHub Actions upgraded to Node 24: checkout v6, upload-artifact v7, download-artifact v8, github-script v8
softprops/action-gh-releasev1 to v2 (Node 20, no Node 24 release yet)Swatinem/rust-cache@v2in full-test, quick-check, and autofix workflows- full-test.yml: redundant build steps removed, release build conditional on tags only
- Local CI scripts synced with updated workflows
Removed
index-parallelCLI command andsave_document_index_metadatafrom IndexPersistence
v0.9.18
Added
- Remote embedding backend: OpenAI-compatible HTTP endpoint as alternative to local fastembed (PR #97)
- CODANNA_EMBED_API_KEY env var for Bearer auth on remote embedding servers
- CODANNA_EMBED_URL, CODANNA_EMBED_MODEL, CODANNA_EMBED_DIM env var overrides
- Remote embedding config documentation in
codanna initoutput - Nix flake for reproducible builds and
nix runsupport (PR #94) - GetIndexInfoRequest manual JsonSchema impl for OpenAI function-calling compatibility (PR #96)
Fixed
- Dimension mismatch detection:
enable_semantic_searchno longer overridessemantic_incompatibleflag --forcewith CLI paths warns about configured roots that will not be rebuilt--forcesuppresses misleading "Already indexed" messageprocess::exitremoved fromcreate_semantic_searchin index_parallel (returns gracefully)- Highlight range overlap panic in document search
- DimensionMismatch propagated through persistence and hot-reload paths
Changed
- EmbeddingBackend enum wraps local fastembed pool and remote HTTP embedder
- Shared
load_symbol_languageshelper (deduplicated load/load_remote) - API keys env-var only: secrets not stored in config files
v0.9.17
Added
- Clojure language support: parser, behavior, definition, resolution modules (PR #80)
- Clojure test fixtures, examples, grammar analysis, and audit report
Changed
- Grammar audit tests split into per-language modules under abi15_grammar_audit/
v0.9.16
Fixed
- Embedding pool initialized on incremental index when loaded from disk (#88)
- Semantic save errors logged instead of silently discarded
- get_index_info reports live embedding count instead of stale metadata
- Debug printlns removed from semantic search
v0.9.15
Changed
- rmcp 1.2.0, rand 0.10.0, and 18 other dependency updates
Fixed
- System git backend for SSH config support
- Profile install for symlinked directories
- Windows installer script and rustls enablement
Removed
- git2 crate (system git backend)
v0.9.14
Added
- Lua language support: parser, behavior, definition, resolution modules
- Lua test fixtures and comprehensive examples
- Lua grammar analysis and audit report documentation
Changed
- Updated rmcp to 0.14.0 (CallToolRequestParams, InitializeRequestParams, StreamableHttpServerConfig API)
- Updated clap to 4.5.56, chrono to 0.4.43, thiserror to 2.0.18, rcgen to 0.14.7, sysinfo to 0.38.0
Fixed
- Vector storage clippy panicking_unwrap false positive