0.9.46
- Fix: node-id normalization is now caseless-stable for combining-mark sequences —
casefoldand NFKC don't commute, so a single pass leftnormalize_id(s) != normalize_id(s.casefold())for inputs like Greek ypogegrammeni followed by a combining accent; normalization now iterates casefold+NFKC to a fixpoint. Letter/digit-bearing ids are unchanged, so existing graphs are not re-keyed. - Fix: Java annotations now emit
referencesedges to their type — including class-literal arguments (@Repeatable(Foo.class),@Uses({A.class, B.class})) and annotation-member return types — so a container annotation is no longer a disconnected island; string/enum arguments are not mistaken for type references (#2426, thanks @oleksii-tumanov). - Fix:
graphify querytreats_as a token separator (like-), so an underscore-spelled query (user_service) matches a hyphenated label (user-service); coverage-scaling keeps the broader tokenization from surfacing unrelated single-token noise (#2473, thanks @nadiadatepe-eng). - Fix: the
post-checkouthook skips its rebuild when HEAD is unchanged (e.g.git checkout -bwith no start point), so creating a branch no longer triggers a full graph rebuild (#2421, thanks @nothariharan). - Feature: Markdown nodes now carry a
node_kind(pagevsheading) attribute so a docs corpus can be filtered by kind, and leading YAML frontmatter is parsed onto the page node as bounded, sanitized attributes; a#comment inside frontmatter is no longer mis-extracted as a heading (thanks @evanthomasgelders). Node ids are unchanged, so existing markdown graphs are not re-keyed. - Feature: Common Lisp
.lisp/.cl/.lsp/.asdextraction via tree-sitter-commonlisp (optional[commonlisp]extra) — packages, classes, functions, methods, generics, macros, variable definers, and same-file calls;opened/:used packages resolve cross-file (thanks @fade). - Fix: a
graphify querywhose node set fits the budget but whose edges push the total over now prints an honest "complete answer over budget" notice with the real size, instead of silently returning a payload several times the requested budget (and no longer advises raising the budget, which was the exact trigger); edges are still never dropped from a complete answer (#2784, thanks @AromalBiju1). - Fix: a
.gitignore/.graphifyignoresaved in a non-UTF-8 encoding no longer silently drops its rules (which let an explicitly-excluded directory get scanned anyway); the file is decoded UTF-8-first, then by a UTF-16 BOM, then the host codepage/latin-1, so the rule survives intact with a warning instead of being truncated (#2798, thanks @abhay-codes07). - Fix: when node dedup merges two nodes, any hyperedge that listed the merged-away node as a member now rewires that member to the survivor instead of silently dropping it, so a grouping no longer loses participants on dedup (#2805, thanks @abhay-codes07).
- Fix: pruning a source file now also sweeps the external-import placeholder nodes it strands at degree 0, instead of leaving them to accumulate in the node count,
GRAPH_REPORT.md, and exports; genuinely-isolated real nodes (which carry asource_file) are never touched (#2807, thanks @abhay-codes07). - Fix: when two edges connect the same node pair with different relations, the graph builder now keeps the more specific relation (
calls,imports,inherits, ...) instead of letting a genericreferences/uses/mentionsoverwrite it; previously a realcallscould be downgraded toreferencesand then dropped from the call graph (#2803, thanks @abhay-codes07).