Maintenance release. Correctness fixes across Python call-graph inference, the git hook (Windows), and bash source resolution.
Fixes
graphify query/explainno longer fabricateindirect_calledges to class definitions (#2137, thanks @Rishet11). Passing a class as a value (select(Model),db.get(Model, id),except (ErrorA, ErrorB),getattr(obj, "Name", 0)) produced a false inferred call edge; classes are now excluded fromindirect_callin both the intra-file and cross-file paths, while direct instantiation still emits itscallsedge.- The post-commit hook's interpreter allowlist now accepts Windows backslash paths (#2126, thanks @Rishet11). The shell
caseglob silently emptied any interpreter path containing a backslash, so the hook failed on Windows uv/venv installs. Both allowlist sites use a verified character class that admits backslashes while still rejecting shell metacharacters. - The hook rebuild timeout is now armed on Windows (#2148, thanks @Rishet11). It relied on
signal.SIGALRM, which does not exist on Windows, soGRAPHIFY_REBUILD_TIMEOUTwas a silent no-op and a hung rebuild ran unbounded. Athreading.Timerfallback now terminates a runaway rebuild where SIGALRM is unavailable; the Unix path is unchanged. - Bash calls into functions defined in a
sourced file now getcallsedges (#2141, thanks @HerenderKumar). Resolution was gated on same-file definitions, so a call to a sourced-library function looked like an external command and produced no edge. Bothsource fileand. fileare handled; resolution is in-corpus and single-match only, so a genuine external command still fabricates nothing. - Bash
sourceedges built from a variable path now resolve (#2079, thanks @HerenderKumar).source "${BENCH_DIR}/lib/x.sh"baked the unexpanded${VAR}into a dead node id; the leading expansion is stripped and the literal suffix resolved against the script's directory, emitted as INFERRED only when it resolves to a real file. Calls into a${VAR}-sourced library resolve too. - Ignore files saved with a UTF-8 BOM are now honored (#2163).
.gitignore/.graphifyignore/info/excludewere read asutf-8, so a leading BOM stayed on the first line and silently dropped the first pattern. The ignore read sites now useutf-8-sig, matching git.