Releases: escoffier-labs/graphtrail
Releases · escoffier-labs/graphtrail
Release list
v0.3.0
Added
- Before/after code-graph diff:
graphtrail diff --before <db> --after <db> [--json]compares two indexed databases into added/removed/changed symbols and added/removed call edges, opening both read-only. Nodes key on(file_path, qualified_name, kind), so a symbol that only moves lines is not a spurious remove+add. The compact JSON output is built for attaching structural deltas to CI or agent-run receipts. (#10) - MCP
difftool: the same before/after comparison over the MCP surface, taking explicitbefore/afterdatabase paths. (#12) - Per-symbol body hashes (schema v3): a body edit that keeps the same signature and line span is now reported as changed instead of slipping through invisibly. Changed nodes carry a
previousblock with the before-side signature and start line, and the diff summary addsadded_edges_line_insensitive/removed_edges_line_insensitiveso a pure line shift reads as zero structural churn alongside the exact raw counts. Existing v2 databases upgrade in place with a one-pass reindex on the next sync. (#15) - Extractor fingerprints (schema v4): each language extractor declares a version fingerprint recorded per file, and the incremental-sync skip check compares it alongside the content hash. Changing an extractor re-extracts exactly that language's files on the next sync, with no forced full-reindex migrations. (#17)
- MCP
refreshparameter on the query tools (search,callers,callees,impact,context,file_neighbors,stats): opt-in incremental sync before answering, fail-open with a note if the sync cannot run. Queries themselves stay on read-only connections. (#17) graphtrail doctor: the freshness contract. Reports tool and schema versions, last-sync age, pending change counts (new / changed / deleted / fingerprint-stale files), and ignored-entry counts, then verdicts FRESH, STALE, or NEEDS-MIGRATION with exit codes 0/1/2 for scripting. Also exposed as an MCP tool, deliberately withoutrefresh. (#18)
Changed
- Sync respects
.gitignorein git repositories (including nested and.git/info/exclude), and files that become ignored are removed from the index on the next sync, so polluted databases clean themselves. Non-git roots keep the hardcoded skip list, which now also covers barevenv. Hidden paths are still indexed. One real-world graph went from 2,955 files (2,803 of them site-packages noise) to 152. (#16) - First index of a git repository ensures
.graphtrail/is in.gitignore, idempotently. (#17)
Fixed
- The diff JSON contract, edge-identity behavior, and read-only guarantees are locked by regression fixtures: a full golden test for the JSON shape, a line-shift fixture for edge churn, a body-only fixture, and CLI tests asserting missing-database errors and unmutated inputs. (#14)
v0.2.0
Added
- Transitive impact:
impact <symbol> --depth N(and adepthargument on the MCP tool) walks callers and callees breadth-first up to 5 hops. Edge rows carry ahopsfield, traversal is cycle-safe, and each direction caps at 500 edges with a self-describingkind: "truncated"marker row instead of silent loss. (#8) - Agent navigation tools:
neighbors <path>/ MCPfile_neighborsreturn a file's structural neighborhood (symbols, import links, call-connected files with edge counts);searchaccepts a path filter (--path/ MCPpath) to scope results to a directory; areposMCP tool reports the default database's freshness and discovers indexed repositories under caller-supplied roots. (#6) - MCP
contexttool acceptsformat: "json" | "markdown", so agents can pull the Brigade-ready markdown pack directly over MCP. (#4) statsnow reportssynced_at,tool_version, and per-language file counts. (#6)Dockerfileand.dockerignorefor a containerizedgraphtrail-mcp, anAGENTS.mdfor coding agents, and arust-version = "1.85"MSRV pin. (#7)
Changed
- Call resolution is qualifier- and import-aware (schema v2): member and scoped calls (
a.save(),Type::new(),module.func()) resolve through the enclosing container or the importing file's imports, including relative Python modules and Rust crate paths, instead of fanning out to same-named symbols. Calls into stdlib or third-party modules no longer produce edges. On a ~4.6k-symbol repo this removed two-thirds of the edges (all false positives) while leaving files and symbols identical. Rebuild existing indexes withgraphtrail sync <repo> --force. (#5) - Ambiguous cross-file fallback resolution is deterministically ordered, so repeated syncs produce identical edge sets. (#4)
- A no-op incremental sync now updates the
synced_atmeta key, making index freshness distinguishable from staleness. (#4) - Query commands (
search,callers,callees,impact,context,stats) open the database read-only; onlyinitandsyncopen it writable. (#4) - Context packs render one location contract everywhere: symbols as
file:start-end, edges assource file:line -> target file. (#4)
Fixed
- The MCP server returns proper JSON-RPC errors (
-32700parse,-32600invalid request,-32602invalid params, including non-stringrepo/dbselectors that previously fell back to the default database silently) and clamps limits before SQLite integer binding. (#4)
GraphTrail v0.1.0
Added
- First GraphTrail release.
- Local SQLite code-graph indexer for Python, TypeScript/JavaScript, Rust, and Go.
- CLI commands for sync, search, callers, callees, impact, context, and stats.
- Read-only stdio MCP server with per-call repo/db overrides.
- Brigade-friendly markdown context packs plus optional Code Search and MiseLedger integrations.
Changed
- README now leads with a verified MCP tool table, quickstart, stats proof block, and recorded terminal demo.