A large correctness, determinism, and portability release with fixes from many community contributors.
Extraction / resolution
- JS/TS
for...of/for...inloop bindings are shadowed, so they no longer fabricateindirect_calledges (#2685, @ousamabenyounes) — completes the loop/closure/catch shadow family (#2568/#2569/#2517). - Python relative subpackage imports (
from ..pkg.sub import x) resolve to the package__init__(#2688, @ousamabenyounes). - A non-regular file (FIFO/device) in the tree no longer hangs extraction; non-regular files are skipped (#2463, @itskaism).
- A
.sqlfile that fails to parse with tree-sitter-sql installed-but-broken now reports the real error instead of "not installed" (#2602, @ousamabenyounes).
Determinism / data integrity
graphify updateincremental runs re-queue a file rewritten to the same length within one mtime tick (#2466, @itskaism), complementing the 0.9.40 file-hash guard (#2612).- Graph provenance (
built_at_commit) is stamped from the analysed repo, not the shell cwd (#2699, @C0KERNEL). - Corrupt semantic-cache entries are surfaced and re-extracted instead of silently missed (#2683, @ousamabenyounes).
graph_has_legacy_idsno longer false-positives on a global MCP node id (#2408, @aryanbonigala).
Paths / Windows portability
source_fileand the model-facing paths are canonicalized to POSIX; atomic writes and installs are hardened for Windows, incl. a read-only packaged bundle (#2620/#2622, @rajarshidattapy; #2453, @bensleveritt).GRAPH_REPORT.mduses a portable basename, not an absolute host path (#2682, @ousamabenyounes).- The
apm.ymlfallback parser captures the package version (#2465, @itskaism).
CLI / export
affectedresolves a./-relative seed instead of silently returning nothing (#2707, @phudayyy).- Hyperedge regions in
graph.htmlare traced in convex-hull order, so the shaded polygon no longer self-intersects (#2449, @ysys143).
Test / docs