graphify 0.9.9 — reliability + honesty round on top of the 0.9.8 Windows-hooks release.
Highlights: explain resolves punctuated labels; code files with no AST extractor (R, .ejs, .ets) and unclassifiable files (Dockerfile/Makefile) are now surfaced instead of silently dropped; MATLAB .m no longer garbage-parses through the Objective-C grammar; GRAPH_REPORT.md no longer emits dangling Obsidian wikilinks by default.
Install: uv tool install "graphifyy==0.9.9" or pip install graphifyy==0.9.9
Changelog
- Fix:
graphify explainresolves an exactly-typed punctuated label symmetrically againstnorm_label(#1704). The search term tokenized on\w+("blockStream.ts" -> "blockstream ts", space where the '.' was) while a node's storednorm_labelkeeps punctuation ("blockstream.ts"). The verbatim case was already rescued by the tokenized-label tier, but that broke if a node'slabelandnorm_labeldiverged; a punctuation-preservingnorm_queryis now matched againstnorm_labelacross the exact/prefix/substring tiers (and fed to the trigram prefilter), so it is robust by construction. - Fix: code files with no AST extractor are surfaced instead of silently dropped (#1689, thanks for the precise root-cause).
.r/.R(also.ejs,.ets) are inCODE_EXTENSIONSso they are counted as code, but there is no extractor for them, so they produced zero nodes with no warning.extractnow prints a grouped warning ("N file(s) are classified as code but graphify has no AST extractor ...: .r (17)"). Adding a realtree-sitter-rextractor remains a follow-up. - Fix: the AST-extraction progress line keeps a consistent denominator to the end (#1693). Intermediate lines counted against
len(uncached_work)but the final line switched tototal_files(which includes cached hits and no-extractor files), so on a large corpus the count appeared to jump upward right after 99%. Both the parallel and sequential final lines now use theuncached_workdenominator. - Fix:
GRAPH_REPORT.mdno longer emits dangling[[_COMMUNITY_*]]Obsidian wikilinks by default (#1712). The_COMMUNITY_*.mdnotes those links target are only created by the opt-in--obsidianexport, and the report is written at build time before any export, so on a default run every link dangled (spawning phantom nodes in a vault's graph view, literal brackets elsewhere). The Community Hubs section now renders as plain text by default; the wikilink form is behind anobsidian=Trueopt-in. - Fix:
.mfiles are no longer force-parsed by the Objective-C grammar when they are MATLAB (#1702, thanks @catalystdream for the diagnosis)..mis shared by Objective-C and MATLAB, but the dispatch routed every.mtoextract_objc, which turned real MATLAB into garbage nodes/edges..mis now content-sniffed like.h: a genuine Objective-C.m(with@implementation/@interface/@import/#import) still routes toextract_objc; a MATLAB.mgets no extractor and is surfaced by the #1689 warning rather than mis-parsed..mmis unchanged (unambiguously Objective-C++). A realtree-sitter-matlabextractor remains a follow-up. - Fix: the
/graphifyusage comment in the skill files no longer claims a bare/graphifyproduces an Obsidian vault by default (#1681, thanks for the audit). It now reads "full pipeline on current directory (HTML viz; add--obsidianfor a vault)", matching Step 6. Fixed at the skillgen source so every generatedskill-*.mdvariant carries the corrected comment. - Feat: files graphify sees but cannot classify are surfaced instead of vanishing (#1692). Extensionless, non-shebang project files (Dockerfile, Gemfile, Makefile, Rakefile, LICENSE, ...) and unsupported extensions previously left no trace at all.
detectnow collects them into anunclassifiedlist, andgraphify extractreports "N file(s) not classified (no supported extension or shebang), skipped: ...". Actually extracting Dockerfile/Makefile-style content remains a follow-up.