Files
codebase-memory-mcp/src
Andrew Hundt ec99ec27f7 mcp: fix get_code returning ambiguous with 1 match + cold-start project detection
Three bugs fixed in handle_get_code_snippet:

Bug A (root cause): Tiers 1-3 all use WHERE project = ?1 AND ... in SQL.
When project param is NULL, SQLite binds NULL and the comparison is always
false — all exact/suffix/name lookups silently return 0 rows.

Bug B: Tier 4 fuzzy search found 1 result but snippet_suggestions() always
sets status=ambiguous regardless of count.

Bug C: Dedup block with cand_count==1 after dedup fell through to ambiguous
instead of resolving.

Fixes:
1. extract_project_from_qn(): scans each dot-prefix of the QN and tests for
   a matching ~/.cache/codebase-memory-mcp/{prefix}.db file (O(n), ~5-15
   access() calls). Returns longest matching prefix — the QN is
   self-describing so this works even on cold start (no prior search call).
   Single malloc+memcpy pattern: best_end offset avoids repeated strdup.
2. handle_get_code_snippet: when project param is NULL, calls
   extract_project_from_qn(qn) and opens the correct DB via resolve_store.
   Falls back to srv->current_project if no DB found. Assigns result into
   project (was NULL) so all existing free(project) exit paths own the memory.
3. Tier 4 fuzzy: fuzzy_count==1 now resolves directly (build_snippet_response)
   instead of calling snippet_suggestions.
4. Dedup block: cand_count==1 after dedup now resolves directly.

Tests added (3 new, total 2190):
- get_code_no_project_uses_open_store_tier1: after search_graph opens a
  store, get_code without project resolves via Tier 1 exact QN + eff_project
- get_code_single_fuzzy_result_resolves_not_ambiguous: wrong-prefix QN forces
  Tier 4 fuzzy; single result must not return status=ambiguous
- get_code_cold_start_parses_project_from_qn: fresh server, no prior call,
  extract_project_from_qn finds the DB and resolves the symbol

Signed-off-by: Andrew Hundt <ATHundt@gmail.com>
2026-03-23 02:58:20 -04:00
..