More clone-identical determinism, a large MCP retrieval speedup, and a batch of extractor and resolution fixes.
- Fix: more node ids and manifest keys stop leaking the local checkout path or OS username, so a clone keeps producing the same graph — a re-clone no longer keeps a previous checkout's absolute manifest keys (#4175, thanks @SrijanSriv), an AST cache hit whose import target has since been deleted is re-extracted instead of replaying the stale absolute-path id (#4185, #4184, thanks @rohit-jsfreaky), and
--no-clustergraph.json no longer shipsextract()'s run-only absolute source paths or undeclared/dangling endpoints (#4189, #4183, thanks @rohit-jsfreaky). - Fix: cross-drive scans no longer abort on a syntax-error warning — the remaining unguarded
os.path.relpathin the partial-extraction warning path falls back to a portable display path on Windows cross-drive files, completing the 0.9.78 #4106 fix (#4149, thanks @xiehuanyi). - Fix: an external import stub whose last referencing edge is gone is dropped on incremental rebuild instead of lingering as a zero-degree ghost a fresh build never has (#4181, thanks @rohit-jsfreaky).
- Fix: Python
self.<attr>.<method>()calls now resolve through the attribute's constructor/annotation type to the owning class, fail-closed on ambiguity (#4176, #2860, thanks @Mpasha17). - Fix: Python
obj.method()on a local or parameter whose class is known from an annotation (c: Client, includingOptional/union/string forms) or a constructor/withbinding now resolves to the owning class's method, fail-closed to a single in-file-or-imported class that owns it (#4198, thanks @rohit-jsfreaky). - Fix: Python imports under
if TYPE_CHECKING:are marked type-only so they no longer form impossible runtime import cycles (#4179, #3159, thanks @Yyunozor). - Fix: Java methods and the calls inside anonymous class bodies (
new Runnable() { public void run() {...} }) are now captured, mirroring the Kotlin object-literal handling (#4140, thanks @rajatnagda45). - Fix: markdown links to file names containing spaces or percent-encoding (
[x](<My Note.md>),[x](My%20Note.md)) resolve to the real file instead of a ghost target; wikilinks stay verbatim and external links stay excluded (#4178, thanks @Yyunozor). - Fix: a
re_exportsedge is kept for both files whose ids collide after separator normalization (a-b/x.tsanda/b/x.ts), removing an order-dependent dropped edge (#4143, thanks @Cintu07). - Fix: the Windows
graphifyconsole script now uses the multi-core extraction pool instead of silently falling back to single-core, since a non-file__main__.__file__no longer disables it (#4187, #4186, thanks @rohit-jsfreaky). - Perf: the MCP server builds the traversal view and shortest-path graphs once per loaded graph instead of rebuilding them on every call, keyed to the existing graph cache (~1.6x on
query_graph, up to ~300x onshortest_path); the two cached path graphs add a bounded, LRU-capped memory cost (#4192, #4191, thanks @rohit-jsfreaky). - Perf: the extraction id-remap and call tie-break resolve and parse each path once per run instead of recomputing it for every node and candidate (tens of thousands of redundant
Path.resolve()calls eliminated), with byte-identical graph.json output (#4195, thanks @rohit-jsfreaky). - Feature:
graph_stats(CLI and MCP) now reports the graph's build commit and whether it is behind the current HEAD (#4144, thanks @Mpasha17). - Chore: raise the
tree-sitterruntime floor to>=0.25so a resolver cannot pair a 0.23/0.24 runtime (ABI 14) with the ABI-15 grammars pinned here and fail every parse (#4148, thanks @JFWaskin). - Test: optional-extra tests now skip cleanly when the extra is not installed, so a default
uv syncno longer reports failures for grammars and SDKs it never pulled (#4193, #4190, thanks @yatharth1706).