Skip to content

v0.14.1 — semantic search UX + find_references type hint

Latest

Choose a tag to compare

@sdsrss sdsrss released this 20 Apr 16:21

Patch release. Six targeted accuracy/UX fixes to MCP tool responses surfaced by a 3-round smoke test covering the full tool matrix (7 visible + 5 hidden + 4 management + 2 alias names). All changes are additive or remove false-positive warnings; no schema changes, no behavior regressions.

Fixes

semantic_code_search — compression estimator aligned to actual output

The compression trigger estimated token cost from context_string (often 2k+ chars) but the actual result JSON only carries code_content capped at 500 chars. Small top_k queries (3, 5) were being forced into compressed_nodes mode unnecessarily, losing relevance and signature fields. Estimator now mirrors the output; small top_k responses return full arrays again.

semantic_code_searchmatch_confidence + low_confidence_warning

Compressed responses (compressed_nodes / compressed_files / compressed_directories) now include a rounded match_confidence float. When < 0.5, a low_confidence_warning explains the results are likely vector-similarity noise and advises using concrete identifiers or ast_search.

FTS sparsity and source-intersection penalties previously over-fired on precision queries (single-identifier FTS hits). The penalty now requires fts_search.len() >= 5; below that, the query is treated as precision-mode and not penalized. When any top-5 candidate's name or qualified_name equals the query (case-insensitive), the warning is suppressed.

find_referencestype_definition_note for type symbols

When the target is a struct / enum / trait / type / interface / class, the response now includes a type_definition_note explaining that the edge index captures explicit imports/inherits/implements and struct-literal instantiation, but NOT method-qualified calls (Type::method()), field access, or type annotations. Guides callers to audit each method via module_overview for complete rename coverage.

get_index_statusembedding_coverage_pct floor

When embedding is in progress with a small fraction done (e.g. 2/1052), the integer percent rounded to 0 and looked stuck. Now floors to 1 whenever vectors_done > 0.

get_ast_node(node_id) — explanatory not-found error

Node N not found replaced with a message that explains node_ids are rebuild-scoped and suggests re-resolving via get_ast_node(symbol_name, file_path) or semantic_code_search.

Validated

  • 43 mcp::server unit tests green
  • Routing bench P@1 = 19/20 = 95.0% (threshold 70%) via OpenRouter anthropic/claude-sonnet-4.5; single miss is a semantic-neighbor pick, unrelated to this release
  • cargo +1.95.0 clippy --no-default-features clean
  • cargo +1.95.0 clippy --all-targets clean
  • CI baseline green (last 3 main runs all success)

Upgrade

# Claude Code plugin: auto-updates on next SessionStart via plugin-auto-update

# Manual via npm
npm install -g @sdsrs/code-graph@0.14.1
# or npx
npx @sdsrs/code-graph@0.14.1 serve