find_dead_symbols previously re-scanned every candidate file's lines once
per unique symbol name (O(names × lines)). Replace with a per-file
word → line-number index built once per file and shared across all names,
bounded to tokens that are actual symbol names.
Also add unit coverage for code_only_line's string/comment blanking,
including Rust raw strings with multi-hash delimiters.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Agent-workflow tooling and search quality improvements:
- find_callers / find_references (by id or exact name), with caller
attribution to the innermost enclosing symbol and import-graph narrowing
- index file (single-file re-index) and workspace glob member resolution
- search symbols: exact > prefix > fulltext > substring fallback, inline
source and line numbers, --limit on all search paths
- search text: reads live from disk (no stale FTS snapshot), collapses
duplicate snippets, correct multi-word phrase matching
- find dead-symbols: excludes framework-wired entry points (pytest test_*,
#[test] tests, FastAPI/Flask routes, Celery tasks, click/typer commands)
- find references: filters the definition line and string/comment
occurrences (incl. Rust raw strings)
- C# import edges via new extract_csharp (using directives)
- richer MCP tool descriptions; brace-in-string tokenizer fix
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- pipeline: fail index create/update with a clear error when the project root
is not a directory instead of building a misleading zero-file index
- config: single LANGUAGE_BY_EXT table as source of truth; language_for and
resolver code_extensions both derive from it (no more duplicated ext list)
- imports: resolver probes code_extensions() instead of a local RESOLVE_EXTS
- tests: regression for nonexistent-root rejection
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- pipeline: re-resolve imports for every file on update (not just changed),
so add/remove/rename of a target fixes unchanged importers; propagate hash
and read errors instead of treating unreadable files as empty
- discovery: report unreadable walk entries to stderr instead of dropping them
- imports: strip `pub` visibility so `pub use` re-exports resolve; share
extension/module-entry probe lists (adds cc,cxx,hpp,hh,hxx,mts,cts,jsx,mjs,cjs)
- store: DISTINCT + ORDER in importers_of to dedup repeated edges
- mcp: validate required tool args (explicit isError), emit JSON-RPC -32700
parse errors and -32600 invalid-request instead of silently skipping
- README: document the 13-tool surface vs toktoken's 27 and known gaps
- tests: regression coverage for update re-resolution, pub-use re-exports,
importer dedup, and MCP error reporting
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Register the Cargo package name (normalized - -> _) as an alias for
src/lib.rs in the resolver, so 'use <crate>::{...}' in src/main.rs
resolves to src/lib.rs. Adds rustdemo/Cargo.toml fixture and test
coverage; updates blast-radius test for the new transitive edge.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>