v0.9.54

Graphify-Labs/graphifyv0.9.54Sep 5, 2026by safishamsi

AI Summary

This release focuses on improving type resolution, cross-repo graph merging capabilities, and file handling stability. It addresses several edge cases regarding Python imports, cross-repo method calls, and atomic file operations to ensure robust graph extraction and export.

Key Highlights

  • Cross-repo member call resolution in `graphify merge-graphs` now links calls to unambiguous type and method matches.
  • Query scorer now ranks matches based on a node's `rationale` attribute as a distinct tier.
  • Improved Python type reference resolution ensures imported symbols bind correctly across modules.
  • Enhanced stability with atomic file writing for version stamps, Obsidian canvas exports, and `graph.json` handling.
  • Fixed handling of the `tomli` dependency on Python 3.10 to prevent silent parsing failures.

New Features

  • `graphify merge-graphs` now resolves a member call whose receiver type is defined in another repo.
  • The query scorer now ranks a match on a node's `rationale` attribute as its own tier.

Full Release Notes

- Fix: a Python type reference to a name imported from another module now resolves to that module's definition — the sourceless stub is repointed onto the exact imported symbol (not a bare-name match), so two same-named types in different modules bind to their own (#3252, thanks @hopstreax).
- Feature: `graphify merge-graphs` now resolves a member call whose receiver type is defined in another repo — the call is parked at extraction and linked at merge time only on a single unambiguous cross-repo type + method match, composing with the cross-repo type link (#3152, thanks @xiongjianxu).
- Fix: the `definition_file` node attribute (the merged decl/def implementation site) is now stored portably — relative to the scan root with canonical separators, matching `source_file` — across graph.json, the AST cache, the watch/incremental path, and direct extract, so a graph is byte-stable across machines (#3223, thanks @abhay-codes07 and @hopstreax).
- Fix: `god_nodes` now honours `exclude_hubs_percentile`, so `--exclude-hubs` actually affects god-node ranking (not just clustering); the default output is unchanged (#3205, thanks @abhay-codes07).
- Fix: byte-identical duplicate reference edges are now collapsed when the extractor emits them, so the graph-health diagnostic no longer flags duplicates that the build was already discarding (#3251, thanks @abhay-codes07).
- Fix: two query results saved in the same second whose questions share a 50-character prefix no longer overwrite each other — saved memory-doc filenames now carry a short unique suffix (#3301, thanks @daichiyasunami-vottia).
- Fix: a graph.json carrying top-level hyperedges keeps them on export — the loader re-attaches the top-level `hyperedges` slot that `node_link_graph` otherwise drops, so hand-edited or externally written hyperedges survive re-export (#3321, thanks @yiheng-kkk).
- Feature: the query scorer now ranks a match on a node's `rationale` attribute as its own tier, between an exact label match and a source-path match — adding recall for rationale-only hits without inflating the exact-match coverage score (#2293, thanks @andytsai821201-spec).
- Fix: `graphify install` now writes the `.graphify_version` stamp atomically (temp file + `os.replace`), so a crash mid-write cannot leave a truncated version file (#3286, thanks @drmikecrypto).
- Fix: the Obsidian/canvas export now writes `graph.canvas` and vault notes atomically, preventing a concurrent reader (or a git mmap hash) from seeing a half-written file (#3282, thanks @drmikecrypto).
- Fix: on Python 3.10 a missing `tomli` no longer silently drops every `pyproject.toml`/`Cargo.toml` from the graph — `tomli` is now a runtime dependency for pre-3.11, and the manifest parser surfaces a visible per-file error if it is ever absent (#3283, thanks @drmikecrypto).