Skip to content

Releases: bartolli/codanna

v0.9.23

Choose a tag to compare

@github-actions github-actions released this 04 Jul 02:46
v0.9.23
c49cf6f

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 duplicate symbol_ids. Rebuilding with 0.9.23 corrects existing duplicate ids; the atomic counter commit prevents recurrence. Also rebuild-not-migrate: scope_context values 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 an INVALID_QUERY envelope with the candidate list and exit 2, replacing aggregation across same-named symbols; backend query failures return INDEX_ERROR and exit 2 instead of an empty result.
  • LanguageBehavior::resolve_method_call removed (no remaining call path). External implementors drop their overrides.
  • indexing.project_root config 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 emits Extends edges (previously mis-emitted as Implements); methods index under bare names, with Class.method dotted lookup now a query-layer feature across all languages.
  • super() calls resolve to the parent class's directly-declared member: single hop through the Extends edge in base-list order; no parent declaring the member yields no edge rather than a guess.
  • dump_edges example binary: full edge dumps for run-to-run diffing; --dups lists every symbol_id with more than one indexed doc.
  • Deletion-only indexing runs report Removed N deleted file(s), M symbol(s) from index; Index up to date now 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, MCP find_symbol, retrieve_symbol, retrieve_search. extends/extended_by/uses previously 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 SymbolKind vocabulary, and receiver formatting are a shared service (src/mcp/service.rs).
  • Module decomposition: src/indexing/pipeline/ split by responsibility with run_phase1 as the single Phase 1 orchestrator; tantivy.rs split into schema/codec/writer/query; config.rs and mcp/mod.rs split likewise.
  • Hot paths move and borrow instead of cloning; CompactString backs its alias with Arc<str>.
  • rmcp 1.7 -> 2.1: model types align with the MCP 2025-11-25 spec revision; tool results carry spec ContentBlock values (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-http 0.6 -> 0.7; patch/minor bumps across anyhow, 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::widgets no longer matches crate::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_symbol and analyze_impact headers render from the name-matched doc, keeping each row self-consistent even against an index carrying duplicate ids.
  • scope_context persists 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 PoolExhausted error) 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 serve lock acquisition race closed; the lock releases before process::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

Choose a tag to compare

@github-actions github-actions released this 20 May 03:24
v0.9.22
cb2c095

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, and get_calls will see fewer (but more accurate) edges; cached resolution counts will not match.
  • Re-index recommended. The new Tantivy fields relation_receiver and relation_static_call drive 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() }, bar resolves against Foo's methods.
  • PHP parent::method() resolves cross-file via per-language inheritance resolver built from Extends relationships; self:: and static:: 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_static heuristics (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_hosts and allowed_origins config; unset flows to rmcp defaults.

Changed

  • Tantivy relationship schema gains relation_receiver and relation_static_call fields (additive; see Breaking Changes).
  • tantivy 0.24 -> 0.26, sha2 0.10 -> 0.11 (hex = "0.4" added as runtime dep), rmcp -> 1.7 (consume-self StreamableHttpServerConfig builder).
  • reqwest pinned to 0.12 / rustls-tls -> ring (0.13's rustls feature 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

Choose a tag to compare

@github-actions github-actions released this 16 May 01:17
v0.9.21
b95537f

Fixed

  • documents stats <collection> returns per-collection file count. collection_stats filters file_states by state.collection == name; prior count summed all collections (#103).

Removed

  • gpu-* feature scaffolding (gpu-cuda, gpu-tensorrt, gpu-coreml, gpu-directml, gpu-openvino, gpu-rocm): commented Cargo.toml entries, matching [lints.rust] unexpected_cfgs check-cfg, tests/semantic/gpu_*.rs, tests/semantic_tests.rs gateway. Upstream fastembed = "=5.6.0" exposes none of these features.
  • [lints.clippy] table. CI runs cargo clippy --all-targets --all-features -- -D warnings; uninlined_format_args is a default clippy lint at warn, so -D warnings denies it without a table entry. clippy.toml header references the CI command.

v0.9.20

Choose a tag to compare

@github-actions github-actions released this 01 May 18:04
v0.9.20
bc21dc7

Fixed

  • documents index --collection X no longer wipes chunks belonging to other collections in the same index. detect_changes scopes its removed-files scan by state.collection so cross-collection paths in file_states are not classified as removed (#100).
  • codanna serve (stdio) acquires .codanna/index/serve.lock on startup; a duplicate invocation against the same index exits 1 with guidance to use HTTP mode for shared access. Stale lockfiles are reclaimed via sysinfo PID-liveness check (#101).

Changed

  • Clippy lint pass: unnecessary_sort_by to sort_by_key with Reverse (php behavior, vector engine), explicit_counter_loop to (1..).zip (python parser), collapsible_match arm guards (kotlin/php/typescript parsers), redundant .into_iter() after .zip() removed (embed pipeline, embedding pool).

v0.9.19

Choose a tag to compare

@github-actions github-actions released this 03 Apr 22:14
v0.9.19
afc342e

Fixed

  • mcp get_index_info reports 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-parallel persists index.meta so 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-parallel command retired; index uses the same pipeline path
  • format_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-release v1 to v2 (Node 20, no Node 24 release yet)
  • Swatinem/rust-cache@v2 in 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-parallel CLI command and save_document_index_metadata from IndexPersistence

v0.9.18

Choose a tag to compare

@github-actions github-actions released this 25 Mar 16:11
v0.9.18
236b402

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 init output
  • Nix flake for reproducible builds and nix run support (PR #94)
  • GetIndexInfoRequest manual JsonSchema impl for OpenAI function-calling compatibility (PR #96)

Fixed

  • Dimension mismatch detection: enable_semantic_search no longer overrides semantic_incompatible flag
  • --force with CLI paths warns about configured roots that will not be rebuilt
  • --force suppresses misleading "Already indexed" message
  • process::exit removed from create_semantic_search in 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_languages helper (deduplicated load/load_remote)
  • API keys env-var only: secrets not stored in config files

v0.9.17

Choose a tag to compare

@github-actions github-actions released this 15 Mar 19:36
v0.9.17
3be859b

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

Choose a tag to compare

@github-actions github-actions released this 15 Mar 16:34
v0.9.16
05c32bb

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

Choose a tag to compare

@github-actions github-actions released this 15 Mar 15:20
v0.9.15
37076cd

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

Choose a tag to compare

@github-actions github-actions released this 30 Jan 04:11
v0.9.14
04b5266

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