# graphify v0.9.44 - Product: graphify (https://whatsnew.fyi/product/graphify) - Vendor: graphify - Date: 2026-08-15 - Version: v0.9.44 - Original notes: https://github.com/Graphify-Labs/graphify/releases/tag/v0.9.44 - Permalink: https://whatsnew.fyi/product/graphify/releases/v0.9.44 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **added** — graphify hook install reads a committed .graphifyrc (viz_node_limit=) and bakes the visualization node limit into the generated git hooks, so a project-wide limit is shared via version control and survives hook regeneration - **added** — hook status reports the baked visualization node limit from .graphifyrc with support for ${GRAPHIFY_VIZ_NODE_LIMIT:-} default and graceful degradation on malformed .graphifyrc - **fixed** — graphify install now writes the CLAUDE.md registration into $CLAUDE_CONFIG_DIR when that env var relocates the Claude profile, instead of always mutating the default ~/.claude/CLAUDE.md - **fixed** — JS/TS inline or nested function expressions including generator function expressions no longer fabricate an INFERRED indirect_call when one of their parameters or locals shares a name with an unrelated callable - **fixed** — a git-tracked file that also matches a .gitignore pattern is no longer dropped from the corpus, matching git's behavior of never un-tracking such a file - **fixed** — git ls-files probe is skipped entirely when no .gitignore is in play to avoid overhead for ordinary corpora - **fixed** — doctest and Catch2 string-named test cases are recovered as callable nodes contained by the file instead of being dropped as ERROR nodes - **fixed** — a punctuation-only test name gets a distinct line-positional id instead of collapsing onto the file-stem id - **fixed** — graphify affected resolves an absolute-path seed against the repo root derived from the graph's own location instead of the current working directory - **fixed** — a lazy CommonJS require inside a function body now emits the same imports_from and imports dependency edges as a top-level require, attributed to the enclosing function - **fixed** — a JS/TS identifier bound by an import whose target resolves outside the scanned corpus is now shadowed, so using it as a value no longer fabricates an INFERRED indirect_call onto an unrelated same-named callable elsewhere in the corpus - **fixed** — an OCaml qualified call to an external module no longer binds to a same-named local let binding, which produced a false calls edge and self-loops ##### 0.9.44 - Feature: `graphify hook install` reads a committed `.graphifyrc` (`viz_node_limit=`) and bakes the visualization node limit into the generated git hooks, so a project-wide limit is shared via version control and survives hook regeneration; `hook status` reports it (#2760, thanks @hopstreax). The baked value uses a `${GRAPHIFY_VIZ_NODE_LIMIT:-}` default so an explicit per-run env var still wins, and `hook status` degrades gracefully on a malformed `.graphifyrc`. - Fix: `graphify install` (Claude always-on) now writes the CLAUDE.md registration into `$CLAUDE_CONFIG_DIR` when that env var relocates the Claude profile, instead of always mutating the default `~/.claude/CLAUDE.md` (part of #2694, thanks @AromalBiju1). - Fix: a JS/TS inline or nested function expression — including a generator function expression (`function*(k){…}`) — no longer fabricates an INFERRED `indirect_call` when one of its parameters/locals shares a name with an unrelated callable; the expression's own bindings now shadow the name (#2752, thanks @imagineers-tyler), completing the shadow family alongside catch/arrow/loop/external-import (#2757). - Fix: a git-tracked file that also matches a `.gitignore` pattern (a committed file later added to `.gitignore`, or a force-added one) is no longer dropped from the corpus, matching git's own behavior of never un-tracking such a file; `.graphifyignore`/`--exclude` stay authoritative and a non-git corpus is unaffected (#2759, thanks @NithishKumar04). The `git ls-files` probe is skipped entirely when no `.gitignore` is in play, so ordinary corpora pay nothing for it. - Fix: doctest/Catch2 string-named test cases (`TEST_CASE("...")`, `SCENARIO`, `TEST_CASE_TEMPLATE`), which tree-sitter-cpp drops as ERROR nodes, are recovered as callable nodes contained by the file (#2594, thanks @ousamabenyounes); a punctuation-only test name gets a distinct line-positional id instead of collapsing onto the file-stem id. - Fix: `graphify affected` resolves an absolute-path seed against the repo root derived from the graph's own location instead of the current working directory, so a blast-radius query with an absolute seed run from anywhere (an editor, a script) no longer silently returns nothing; a seed outside the root still misses cleanly (#2706, thanks @ousamabenyounes). - Fix: a lazy CommonJS `require(...)` inside a function body (the idiom for breaking circular dependencies) now emits the same `imports_from`/`imports` dependency edges as a top-level require, attributed to the enclosing function, instead of being silently dropped; a dynamic `require(variable)` is still skipped (#2700, thanks @rajanpanth). - Fix: a JS/TS identifier bound by an import whose target resolves outside the scanned corpus (e.g. a `lucide-react` icon) is now shadowed, so using it as a value no longer fabricates an INFERRED `indirect_call` onto an unrelated same-named callable elsewhere in the corpus; a relative/in-corpus import still resolves to its real target (#2757, thanks @phudayyy). - Fix: an OCaml qualified call `M.f` to an external module (one not defined in the same file, e.g. Hardcaml's `Reg_spec.create`) no longer binds to a same-named local `let f` — which produced a false `calls` edge and, when the caller was that local `f`, a `f -> f` self-loop. External qualified calls are kept as a distinct target labelled by the full path; unqualified calls and calls into a locally-defined module still resolve locally, and cross-file `Geo.area` still collapses onto another file's `area`.