Changelog
All notable changes to cymbal are documented here.
[0.9.0] - 2026-04-09
Changed
- Library-ready package layout — moved all four
internal/packages to top-level importable packages:symbols/,parser/,index/,walker/. External Go projects can now import cymbal as a library (e.g.,import "github.com/1broseidon/cymbal/index"). The CLI (cmd/) continues to work unchanged. This is a breaking change for any code that importedinternal/paths directly (which was not possible for external consumers, but affects forks).
Added
- MIT license file.
- README badges — GitHub stars, Go Reference, Go Report Card, latest release.
[0.8.8] - 2026-04-08
Added
- Multi-language benchmark corpus and regression detection for the bench harness.
Removed
- Deprecated unused LLM summarization feature — removed
--summarize,--backend, and--modelflags fromcymbal index. The feature was underdeveloped (summaries only surfaced inoutline, not insearch,investigate, or other commands) and added significant indexing latency for minimal value. Removed upstream dependency ononeagent.
[0.8.7] - 2026-04-07
Added
- Salesforce Apex language support — classes, methods, fields, constructors, interfaces, and enums via
classifyJavaLikereuse (PR #6, @lynxbat). - Dart language support — classes, enums, mixins, extensions, type aliases, functions, methods, getters, setters, constructors, imports, and refs (PR #11, @Phototonic).
Fixed
- investigate member bleed across files —
investigateno longer mixes members from different symbols that share the same parent name across files or languages. Member lookup is now scoped to the resolved symbol's file. Fixes #9.
[0.8.6] - 2026-04-06
Added
- Elixir language support — modules (
defmodule), functions (def/defp), macros (defmacro), protocols (defprotocol), imports (alias/import/use/require), and cross-module refs. - HCL/Terraform language support — resources, variables, outputs, data sources, modules, providers, and locals blocks with synthesized names (e.g.,
aws_instance.web). - Protobuf language support — messages, enums, services, RPCs, and proto imports.
- Kotlin language support — proper symbol extraction for classes, interfaces, objects, enums, methods, and companion objects (merged PR #7).
- CI workflows — build, lint, test, security (
govulncheck), and dependency review checks on PRs and main branch. - PR template — required structure with summary, testing checklist, security notes, and rollout risk.
- PR body validation — CI check that enforces template usage and completed checklist items on non-draft PRs.
Changed
- Go version — bumped from 1.25.7 to 1.25.8 to resolve stdlib vulnerability flagged by new security check.
- Makefile — added
build-check,vulncheck, andcitargets.
[0.8.5] - 2026-04-05
Changed
- Smart truncation for type symbols —
showandinvestigatenow cap class/struct/interface/enum output at 60 lines instead of dumping the entire body (e.g., FastAPI class went from 170KB to 1.8KB). Full source remains available viacymbal show file:L1-L2. Members are listed separately ininvestigate. - Truncated member signatures — multi-line signatures in
investigatemember listings are collapsed to the first line, preventing huge docstring-heavy parameter lists from bloating output.
Fixed
- README accuracy — removed unsupported languages (HCL, Dockerfile, TOML, HTML, CSS) from supported list, corrected benchmark numbers to match actual RESULTS.md, fixed "Go, Python, and TypeScript" to "Go and Python" (no TS corpus repo).
- Benchmark token efficiency —
showandinvestigatefor large types now dramatically outperform ripgrep instead of losing badly (FastAPI show: -1413% → 84% savings; APIRouter agent workflow: -248% → 95% savings).
[0.8.4] - 2026-04-04
Added
- Auto-index on first query — no more manual
cymbal index .step. The first command in a repo automatically builds the index, with a progress indicator for large repos. Subsequent queries continue to refresh incrementally. Closes #3. (@Ismael) - Git worktree support —
FindGitRootnow detects.gitfiles (used by worktrees) in addition to.gitdirectories, so all commands work correctly insidegit worktreecheckouts. - Intel Mac builds — release pipeline now produces
darwin_amd64binaries and the Homebrew formula includes Intel Mac support. Closes #4. (@alec-pinson)
Fixed
- Correct index path documentation — README now documents the actual OS cache directory paths (
~/.cache/cymbal/on Linux,~/Library/Caches/cymbal/on macOS,%LOCALAPPDATA%\cymbal\on Windows) instead of the stale~/.cymbal/reference. Closes #5. (@candiesdoodle) - Proper error propagation — commands no longer call
os.Exit(1)on "not found" or "ambiguous" results. Errors now flow through cobra's error handling for consistentError:prefixed output and proper exit codes. - Non-git-repo warning — running cymbal outside a git repository now prints a clear warning (
not inside a git repository — results may be empty) instead of silently returning empty results.
[0.8.3] - 2026-04-02
Added
- GHCR container — pre-built multi-arch Docker image (linux/amd64, linux/arm64) published to
ghcr.io/1broseidon/cymbalon every release, tagged with version andlatest.
[0.8.2] - 2026-04-02
Added
- Docker support — Dockerfile, docker-compose.yml, and
CYMBAL_DBenvironment variable for running cymbal from a container with no local Go/CGO setup. Index stored at.cymbal/index.dbin the repo root. (@VertigoOne1) - PowerShell uninstall script (
uninstall.ps1) with optional-Purgeflag to remove index data. (@VertigoOne1)
Fixed
- Windows binary no longer requires MinGW DLLs (
libgcc_s_seh-1.dll,libstdc++-6.dll). Release workflow now statically links the C runtime on Windows. Fixes #1. - Quoted
$(pwd)in all Docker documentation examples to handle paths with spaces.
[0.8.1] - 2026-03-27
Fixed
cymbal structure"Try" suggestions now deduplicated by symbol name — no more repeated suggestions when the same symbol appears in multiple files.
[0.8.0] - 2026-03-27
Added
cymbal structure— structural overview of an indexed codebase. Shows entry points, most-referenced symbols (by call-site count), largest packages, and most-imported files. All derived from existing index data — no AI, no guessing. Answers "I've never seen this repo, where do I start?" Supports--json.- Batch mode for symbol commands —
investigate,show,refs,context, andimpactnow accept multiple symbols:cymbal investigate Foo Bar Baz. One invocation, one JIT freshness check, multiple results. Reduces agent round-trips. - Benchmark harness v2 —
go run ./bench runnow measures speed, accuracy (37/37 ground-truth checks), token efficiency vs ripgrep, JIT freshness overhead, and agent workflow savings across gin, kubectl, and fastapi.
[0.7.3] - 2026-03-27
Added
- JIT freshness — every query command (search, show, investigate, refs, importers, impact, trace, context, outline, diff, ls --stats) now automatically checks for changed files and reindexes them before returning results. No manual
cymbal indexneeded between edits. The index is always correct.- Hot path (nothing changed): ~2ms overhead on small repos, ~14ms on 3000-file repos
- Dirty path (files edited): only changed files are reparsed — 5 touched files on a 770-file repo adds ~40ms
- Deleted files are automatically pruned from the index
- No watch daemons, no hooks, no flags — it just works
index.EnsureFresh(dbPath)public API for programmatic use.
[0.7.2] - 2026-03-26
Added
- PowerShell install script for Windows (
install.ps1) —irm .../install.ps1 | iexfetches the latest release, extracts to%LOCALAPPDATA%\cymbal, and adds to PATH.
Fixed
- Database file created inside the project directory on Windows when
%USERPROFILE%is unset. Now usesos.UserCacheDir()(%LOCALAPPDATA%on Windows) as the primary data directory, with safe fallbacks that never produce a relative path.
[0.7.1] - 2026-03-26
Added
- Windows (amd64) binary in release pipeline — builds with Cgo on
windows-latest, packaged as.zip.
[0.7.0] - 2026-03-25
Added
- Flexible symbol resolution pipeline (
flexResolve) — shared byshow,investigate, andcontext:- Ambiguity auto-resolve: picks best match by path proximity and kind priority, notes alternatives in frontmatter (
matches: 2 (also: path:line)) - Dot-qualified names:
config.Loadresolves by filtering parent/path. Works forpkg.FunctionandClass.methodpatterns. - Fuzzy fallback: exact → case-insensitive (
COLLATE NOCASE) → FTS prefix match. Marks results withfuzzy: true.
- Ambiguity auto-resolve: picks best match by path proximity and kind priority, notes alternatives in frontmatter (
SearchSymbolsCIstore method for case-insensitive exact name match.InvestigateResolvedfor investigating pre-resolved symbols.
Changed
showandinvestigateno longer error on ambiguous symbols — they auto-resolve and return the best match with disambiguation hints in frontmatter.
[0.6.0] - 2026-03-25
Added
cymbal trace <symbol>— downward call graph traversal. Follows what a symbol calls, what those call, etc. (BFS, depth 3 default, max 5). Filters stdlib noise to surface project-defined symbols. Complementary toimpact(upward) andinvestigate(adaptive).
Changed
- Agent integration guide (README, CLAUDE.md, AGENTS.md) restructured around three core commands:
investigate(understand),trace(downward),impact(upward). Based on real-world observation of an agent making 22 sequential calls that trace + investigate handled in 4.
[0.5.1] - 2026-03-25
Fixed
showandinvestigatenow acceptfile:Symbolsyntax to disambiguate when multiple symbols share a name (e.g.,cymbal show config.go:Config,cymbal investigate internal/config/config.go:Config).showline range parser acceptsL-prefixed ranges (file.go:L119-L132) — was advertised in README but broken.
[0.5.0] - 2026-03-25
Added
cymbal investigate <symbol>— kind-adaptive symbol exploration. Returns the right shape of information based on what a symbol is: functions get source + callers + shallow impact; types get source + members + references; ambiguous names get ranked candidates. Eliminates the agent's decision loop of choosing between search/show/refs/impact.ChildSymbolsstore method for querying methods/fields by parent type name.- Benchmark suite now tracks output size (bytes + approximate tokens) and includes ripgrep refs/show equivalents for fair token efficiency comparison.
Fixed
- TypeScript/JavaScript
exportstatement dedup — exported functions, classes, interfaces, types, and enums no longer appear twice in the index (same pattern as the Python decorator fix in v0.4.1).
Changed
- README rewritten with workflow-centric agent integration guide.
investigateis the recommended default, specific commands are escape hatches.
[0.4.1] - 2026-03-24
Added
- Benchmark suite now tracks output size (bytes + approximate tokens) per query, comparing token efficiency across tools. Ripgrep refs and show equivalents added for fair comparison.
Fixed
- Python decorated functions and classes no longer appear twice in outline/search/show. Tree-sitter's
decorated_definitionwrapper was causing double emission — innerfunction_definition/class_definitionnodes are now skipped when their parent already emitted them.
[0.4.0] - 2026-03-24
Changed
- Indexing 2x faster — separated parse workers (parallel, CPU-bound) from serial writer with batched transactions, eliminating goroutine contention on SQLite's writer lock. Cold index dropped from 2.4s to 1.05s on cli/cli (729 files).
- Reindex 4x faster — mtime_ns + file size skip check with pre-loaded map avoids reading files or querying DB per-file. Reindex dropped from 57ms to 14ms on cli/cli.
- Prepared statement reuse — statements prepared once per batch (5 per batch vs 5 per file), reducing cgo overhead on large repos.
- Read-once parse+hash — workers read each file once and pass bytes to both parser and hasher, eliminating duplicate I/O.
- Row-based batch flushing — flush at 100 files OR 50k rows (symbols+imports+refs), preventing pathological batches from symbol-dense repos.
- Robust change detection — mtime stored as nanosecond integer + file size; skip only when both match exactly. Catches coarse FS timestamps and tools that preserve mtime.
- Walker language filtering — unsupported languages (.json, .md, .toml) filtered before stat, reducing channel traffic and allocations.
Added
- Benchmark suite (
bench/) comparing cymbal vs ripgrep vs ctags across Go, Python, and TypeScript repos with reproducible pinned corpus. - Progress indicator on stderr after 10s for large repos (e.g., kubernetes at 16k files).
ParseBytesfunction for parsing from pre-read byte slices.
Fixed
- Stale file pruning — deleted/renamed files are removed from the index on reindex by diffing walker paths against stored paths.
- Savepoint-per-file in batch writer — a single file write failure no longer corrupts the entire batch; partial data is rolled back cleanly.
- Accurate stats after commit — indexed/found counts published only after successful tx.Commit(), preventing inflation on commit failure.
- Split error types — skip reasons separated into unchanged, unsupported, parse_error, write_error; CLI shows non-zero counts conditionally.
[0.3.0] - 2026-03-24
Changed
- Per-repo databases — each repo gets its own SQLite DB at
~/.cymbal/repos/<hash>/index.db, eliminating cross-repo symbol bleed. Searching in repo A no longer returns results from repo B. - Removed
repostable andrepo_idcolumn — no longer needed since each DB is one repo - Added
metatable storingrepo_rootpath per database cymbal ls --reposlists all indexed repos with file/symbol counts--repoflag removed (repo identity comes from DB path now)--dbflag still works as override for all commands
Added
refsandimpactnow show surrounding call-site context (1 line above/below by default, adjustable with-C)- VitePress docs site at chain.sh/cymbal with chain.sh design language
Fixed
- Stale symbol entries from moved/deleted repos no longer pollute search results
[0.2.0] - 2026-03-23
Changed
- All commands now output agent-native frontmatter+content format by default (YAML metadata + content body, optimized for LLM token efficiency)
refsandimpactdeduplicate identical call sites — grouped by file with site countcontextcallers section uses the same dedupsearchresults ranked by relevance: exact name match first, then prefix, then contains- Default limits lowered: refs 50→20, impact 100→50, search 50→20
refs,impact, andcontextnow show actual source lines at call sites, not just line numbers
[0.1.0] - 2026-03-23
Added
- Core indexing engine with tree-sitter parsing, SQLite FTS5 storage, and AI summaries via oneagent
- Batched summarization with diff tracking and model selection
cymbal index— index a codebasecymbal ls— list files and repo statscymbal outline— show file structurecymbal search— symbol and text searchcymbal show— display symbol sourcecymbal refs— find references to a symbolcymbal importers— reverse import lookupcymbal impact— transitive caller analysiscymbal diff— git diff scoped to a symbolcymbal context— bundled source, callers, and imports in one call
Fixed
- Overlapping sub-repo detection prevents duplicate symbol indexing