All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Relative path arguments containing
.or..now resolve consistently across overview, symbols, definition, and references.
- Objective-C support for
.mand.mmfiles, including classes, protocols, methods, and C functions.
- Markdown heading navigation:
.md,.markdown, and.mdownfiles are indexed by headings, anddefinitionreturns the selected heading section. - Line ranges in
overviewoutput for more precise navigation. cx symbols --kindsto list available symbol kinds with counts.- Directory paths in
--fileand--fromfilters. - C++ header declaration indexing.
- Windows ARM64 release support.
- References now default to the compact grouped summary; exact matching lines are available with
--context. - Overview includes test files and test symbols by default; use
--no-teststo exclude them. - Absolute path arguments now derive the project root from the provided path instead of only the current working directory.
- Full index crawling is parallelized.
- Query coverage expanded across TypeScript, Python, Go, Rust, Java, C++, C, Solidity, Ruby, Lua, Bash, and Zig.
SymbolKind::Methodwas collapsed intofnfor simpler output.
- Directory overview and symbol/definition filtering now handle current-working-directory and absolute-path resolution more consistently.
- C++ declaration-only headers at nested paths are indexed correctly.
CX_CACHE_DIRenv var to override the cache location (#14) — enables cx in sandboxed agents (Codex, Claude Code) that restrict writes outside the workspace
- Pagination (#15): Global
--limit,--offset,--allflags across all query commands- Default limits: definition (3), symbols (100), references (50)
- Compact stderr hint when truncated:
cx: 3/32 definitions for "X" | --from PATH to narrow | --offset 3 for more | --all - JSON uses
{total, offset, limit, results}envelope when paginated, bare array otherwise --alland--limitare mutually exclusive (enforced by clap)
- Definition results sorted by symbol priority (types first) before pagination
- Definition paginates before reading bodies from disk (avoids wasted I/O on large match sets)
- Skill prompt trimmed from ~1000 to ~350 tokens
- Dart language support (#9, requested by @evanscai): classes (sealed/base/interface/mixin), mixins, extensions, extension types, enums, functions, methods, getters/setters, constructors (named/factory), operators, type aliases
- Comprehensive Swift support (based on #11 by @upupc): actors, extensions, properties, subscripts, enum bodies, init/deinit (#10, #12)
- Elixir enhancements (#6 by @RamXX):
@type/@typep/@opaque,@callback,defimpl - Directory overview (#8, reported by @it-ony):
cx overview dir/— single-level table of contents with symbol names,--fullfor signatures - Test symbol filtering in directory overviews — excludes test files by path pattern and Rust
#[test]/#[cfg(test)]inline tests
- Language module refactored into focused files (
queries/*.rs,extract.rs,tests.rs) RwLock+ thread-localParserfor better parallel indexing performance- Symbol dedup now prefers later (more specific) query matches for same byte range
- Index version bumped to 6 (forces reindex)
--rootflag now correctly resolves relative paths against the project root instead of cwd
- Breaking: Index database moved from
.cx-index.dbin the repo root to~/.cache/cx/indexes/. No more repo pollution or.gitignoredance.
cx cache path— print the index cache path for the current projectcx cache clean— delete the cached index for the current project
.cx-index.dbrepo-local index file- Gitignore warning on first run
- Flaky incremental update tests on filesystems with coarse (1-second) mtime granularity
cx lang add <languages>— download and install language grammars on demandcx lang remove <languages>— remove installed grammarscx lang list— show supported languages and install status- Actionable warnings when grammars are missing during indexing
- First-run UX: shows detected languages with file counts and install command
- Grammars are now dynamically loaded via
tree-sitter-language-packinstead of statically linking 14tree-sitter-{lang}crates Languageenum replaced with string-based language identificationFileEntryserialized with bincode (index version bumped to 4, forces reindex)- tree-sitter upgraded from 0.25 to 0.26
- Zig and Python queries updated for newer grammar versions
find_referencesnow returnsResultand propagatesNotInstallederrors- Release binary reduced from ~25MB to ~7MB
- Static dependency on 14 individual
tree-sitter-{lang}crates
- Updated Cargo.lock for redb 3 upgrade
- x86_64 macOS build runner configuration
- Release workflow and install script
- Concurrent read access via redb 3 upgrade