Skip to content

Releases: escoffier-labs/graphtrail

v0.3.0

Choose a tag to compare

@solomonneas solomonneas released this 08 Jul 20:37

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 diff tool: the same before/after comparison over the MCP surface, taking explicit before/after database 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 previous block with the before-side signature and start line, and the diff summary adds added_edges_line_insensitive / removed_edges_line_insensitive so 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 refresh parameter 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 without refresh. (#18)

Changed

  • Sync respects .gitignore in 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 bare venv. 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

Choose a tag to compare

@solomonneas solomonneas released this 03 Jul 02:32

Added

  • Transitive impact: impact <symbol> --depth N (and a depth argument on the MCP tool) walks callers and callees breadth-first up to 5 hops. Edge rows carry a hops field, traversal is cycle-safe, and each direction caps at 500 edges with a self-describing kind: "truncated" marker row instead of silent loss. (#8)
  • Agent navigation tools: neighbors <path> / MCP file_neighbors return a file's structural neighborhood (symbols, import links, call-connected files with edge counts); search accepts a path filter (--path / MCP path) to scope results to a directory; a repos MCP tool reports the default database's freshness and discovers indexed repositories under caller-supplied roots. (#6)
  • MCP context tool accepts format: "json" | "markdown", so agents can pull the Brigade-ready markdown pack directly over MCP. (#4)
  • stats now reports synced_at, tool_version, and per-language file counts. (#6)
  • Dockerfile and .dockerignore for a containerized graphtrail-mcp, an AGENTS.md for coding agents, and a rust-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 with graphtrail 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_at meta key, making index freshness distinguishable from staleness. (#4)
  • Query commands (search, callers, callees, impact, context, stats) open the database read-only; only init and sync open it writable. (#4)
  • Context packs render one location contract everywhere: symbols as file:start-end, edges as source file:line -> target file. (#4)

Fixed

  • The MCP server returns proper JSON-RPC errors (-32700 parse, -32600 invalid request, -32602 invalid params, including non-string repo/db selectors that previously fell back to the default database silently) and clamps limits before SQLite integer binding. (#4)

GraphTrail v0.1.0

Choose a tag to compare

@solomonneas solomonneas released this 27 Jun 20:52

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.