graphify 0.9.103
A broad correctness, performance and robustness release across the extractors, resolution, hooks, the query and update paths, install and the skill runbook.
Extractors
- C#: preprocessor directives and
#ifbranches that derail tree-sitter are blanked before parsing (byte-length preserving), so a directive no longer closes a class early and drops later members or calls. - Solidity: library calls (
Lib.f(), including aliased imports) andemit/revert/requirenaming a declared event or error now link to the member they name, gated to a unique visible type and member. - YAML: a
<<merge sequence gives the earlier anchor precedence for a duplicated key, matching the spec and PyYAML. - Markdown: a code span written as a backslash namespace (
\Foo\Bar) or a type-qualified member (Type::member) resolves to the real node; a dotted mention whose method name is a language builtin is no longer dropped. - Python: a bare builtin-named call (
raise NotImplementedError(...)) no longer binds to a same-named class in another module unless imported.
Resolution
- A call inside a top-level
def _main()is attributed to_main, not the publicmainit collides with after id normalization, without misattributing a class member's type reference.
Hooks
- A file unchanged in content is not re-flagged stale by mtime (the extraction hash is checked against the manifest).
- A dedicated Grep is held to the strict orientation gate; a Bash file read (
cat/head/sed -n) of an in-project code file gets the read nudge; a search whose every target is outside the project emits no project hint; the nudge budget is restored after a Claude Code compaction; and the toplevel anchor keeps working whenCDPATHis exported.
Performance
- Lower peak memory in load, resolution and extraction; a faster
#3252cross-file repoint; and the watch reconcile pass resolves AST ownership once per file instead of re-reading each header per node — all with identical graph output.
Update / build / cache
graphify updatere-extracts only the files whose content changed (identical to a full rebuild); a contended incremental request is recorded instead of dropped. The build write guard no longer counts intentional ghost/dedup folds as drops; cache keys keep their written case.
Query / tree
- Source nodes rank above tests and docs (a soft weight) with file-first answers;
queryreadsquery_budget/query_depthfrom.graphifyrcand gains--depth.export treecaps directory children while reporting full totals.
Install / thread-safety
- The Pi project skill is written to
.pi/skills; uninstall removes the global skill registration it wrote. The ambient scan root is held in aContextVarso concurrent library callers extracting different roots do not clobber each other.
The AST cache schema is bumped to 39; warm caches re-run the affected extractions.
Thanks to @rohit-jsfreaky, @Deepjyoti-Sarmah, @xiongjianxu, @nothariharan, @andrebrait, @ajbmachon, @Shubham-Padkonde, @madhusudanpatnaik, @pei711, @Mpasha17, @ayushcodes10, @gitmotion, @briascoi, @oleksii-tumanov, @rohit-jsfreaky, @viwe-monai, @WyattAu, @Vivek1898, @wanjinhao1, @PratikDhanave, @HhH666-ux, @sunhouy, @mathewgeejo, @jinsoo and @AndresDiagoM.