0.9.100 (2026-11-01)
- Fix: ids a type and a function whose names differ only in case (
Foothe class,foothe function) get distinct node ids instead of colliding (which dropped one node and minted a bogus self-loop) (#4904, #4908, thanks @bercedev). - Fix: php a
Scope::MEMBERaccess in a class-level initializer (a const value, a property default, or a parameter/promoted-constructor default) emits areferences_constantedge;self::/static::/parent::are skipped and unknown scopes mint no stub (#4648, #4895, thanks @Jitendarmahara). - Fix: hooks
git rev-parseoutput is decoded as UTF-8, so a linked worktree under a non-ASCII path resolves correctly on Windows instead of mojibake (#4903, thanks @LukeTheoJohnson). - Fix: analyze on a code-only graph the isolated-node question reason says "possible missing edges" rather than referencing documentation gaps that cannot apply (#4887, thanks @oleksii-tumanov).
- Perf: resolve reference edges are indexed by source once, so JS/TS import resolution no longer re-walks every edge per import (output unchanged) (#4909, #4913, thanks @Deepjyoti-Sarmah).
- Docs: skill the skill now says when a graph is worth building, across all generated hosts, while preserving the "if the user invoked /graphify, do it as asked" invariant (#4829, #4906, thanks @TanmayShah29).
- Fix: deps the
videoextra caps PyAV below 19 (av>=11,<19), because PyAV 19 removed themetadata_errorsargument that faster-whisper passes unconditionally when opening audio; without the cap a fresh install on Python 3.12+ failed to transcribe (#4842, thanks @SyedFahad7). - Fix: r
setClass/setRefClassS4/R5 inheritance declared withcontains=now emits an inherits edge (previously only R6Class'sinherit=was recognised) (#4902, thanks @ayushcodes10). - Fix: elixir a bare function call resolves to a function in the caller's own module before other modules, instead of binding to the last-walked same-named definition (#4900, thanks @ayushcodes10).
- Fix: dart a mixin
on A, Bclause resolves every superclass constraint, not just the first (#4899, thanks @ayushcodes10). - Fix: fortran a derived type's
extends(base)emits an inherits edge, bringing Fortran in line with the other OOP extractors (#4897, thanks @ayushcodes10). - Fix: scala an
extension (x: T) def mis scoped to its receiver typeT(amethodedge toT) instead of leaking to file scope (#2044, #4856, thanks @divakantpandey). - Fix: terraform a node carries its original scope so ids stay stable when a cached project directory is moved, instead of re-deriving the scope from the new path (#4858, #4861, thanks @yUm1k4).
- Fix: extract (JVM) Java and Kotlin imports,
extends/implementsand member calls resolve across files and across the two languages when a written FQN names exactly one sourced type (#4874, #4879, thanks @Deepjyoti-Sarmah). - Fix: export a path/explain/wiki rendering lists every parallel relation between two nodes (via
edge_datas), and a raw--no-clusterwrite marks the graphmultigraphso parallel edges survive reload (#4794, thanks @ensell-yes). - Fix: export a partial or failed backup is reported as no backup and retried on the next run, instead of being recorded as a false success (#3769, #4834, thanks @barlowa124).
- Fix: affected
graphify affected(andquery --seed) resolve the samepath::Symboland dotted reference formsexplainaccepts, reusing explain's resolver, and exit non-zero (3 ambiguous / 4 not-found) on a seed that does not resolve (#4792, #4797, thanks @dupeisen). - Fix: install
graphify uninstallremoves every platform's user-scope skill (13 were left behind) and the kilo global command; andgraphify kilo uninstallremoves the kilo skill'sreferences/sidecar (#4782, #4789, thanks @bercedev). - Feat: llm the Claude backend caches its (stable, large) system prompt with
cache_control, counting the cached tokens back intoinput_tokens, andGRAPHIFY_CLAUDE_PROMPT_CACHE=0disables it for gateways that rejectcache_control(#4835, #4855, #4880, thanks @Jvxoq and @1akashkalita). - Fix: prompt the node-id format description in the extraction prompt matches what
ids.pyactually produces (word characters kept, non-ASCII letters/digits preserved, ASCII lowercased) instead of the stale "[a-z0-9_]only" wording (#4432, #4799, thanks @dupeisen). - Docs: how-it-works the supported-language count is updated (about 40: 33 tree-sitter grammars plus 7 built-in parsers) and Pass 3 is described as running the configured LLM backend, not Claude only (#4873, thanks @SyedFahad7).