Releases: Graphify-Labs/graphify
Release list
v0.8.22
What's new
- BYOND DreamMaker support —
.dm/.dmefiles extracted via tree-sitter-dm (type definitions, proc declarations,#includeedges, in-file call resolution,new /type()instantiation edges);.dmiPNG icon files parsed for icon-state nodes;.dmmmap files parsed for type-pathusesedges from the tile dictionary section;.dmfinterface files parsed for window/elem/control-type hierarchy (#884) graphify extract --mode deep— enables richer semantic extraction using an extended system prompt; flag propagated through all four LLM backends (#1030)
Install / upgrade
pip install --upgrade graphifyyFull changelog: https://github.com/safishamsi/graphify/blob/v8/CHANGELOG.md
v0.8.21
What's new
Fixes
- Ghost nodes on
graphify update— full re-extraction now reconciles against disk state and evicts nodes from deleted files (no--changedflag needed) (#1007) - OpenCode
--projectpath — skill now written to.opencode/skills/graphify/SKILL.md(was incorrectly.config/opencode/skills/) (#1040) - Hook rebuild loop — post-commit hook skips when only
graphify-out/files changed;GRAPHIFY_SKIP_HOOK=1env var for one-off opt-out; rebuild log now appends instead of overwriting (#1018, #1037) - Deterministic output — edges sorted and
PYTHONHASHSEED=0in hooks sographify-out/no longer churns on re-run (#1010) - Search punctuation —
what calls extract?correctly finds theextractnode; punctuation stripped before matching (#994, #978) - Builtin god-nodes —
String(),Number(),Boolean(),print(),len()etc. no longer accumulate spurious call edges (#916, #726)
Features
- Amp platform —
graphify amp install/uninstallinstalls into.amp/skills/graphify/SKILL.md(#948) - SystemVerilog headers —
.svhfiles now extracted alongside.vand.sv(#1042)
Upgrade
pip install --upgrade graphifyy
# or
uv add graphifyy
v0.8.20
Bug fixes & security
Ghost nodes after file deletion fully fixed
graphify update on Windows no longer leaves stale nodes after moving/deleting files. Two root causes resolved:
_relativize_source_filesnow runs on the existing graph before eviction, not afterdeleted_paths/evict_sourcesnow use.as_posix()for consistent forward-slash paths on all platforms- Symlinked scan roots now handled correctly via
.resolve()inbuild_merge(#1007)
Security: XML DoS hardening
extract_csproj and extract_lazarus_package now pre-screen for <!DOCTYPE / <!ENTITY before parsing — blocks billion-laughs memory exhaustion on malicious project files. Zero false positives on real MSBuild/Lazarus files. extract_lpk also gains the previously missing 2 MiB size cap.
Dart node ID fix
Dart child node IDs no longer embed absolute paths — now uses _file_stem consistent with all other extractors. Existing Dart graphs should be rebuilt with graphify extract --force. (#999)
cluster-only label alignment
cluster-only now applies remap_communities_to_previous matching the behaviour of graphify update, so community labels stay stable across re-clusterings (#1028)
New features
MCP config extractor
.mcp.json, mcp.json, mcp_servers.json, claude_desktop_config.json are now extracted into the knowledge graph — captures server nodes, npm/pip package references, and env var requirements. Env values are discarded to prevent secret leakage.
Install / upgrade
pip install --upgrade graphifyy
v0.8.19
What's new
.NET project file support
.sln, .csproj, .fsproj, .vbproj, .razor, .cshtml files are now extracted into the knowledge graph. Captures NuGet package references, project-to-project dependencies, target frameworks, SDK attributes, Razor/Blazor directives (@using, @inject, @inherits, @model, @page), component references, and @code block methods. Closes #515.
Chinese query segmentation
Compound Chinese tokens like 页面路由 are now split into meaningful words using jieba when installed, with a character bigram fallback when it isn't. The original compound is preserved alongside segments so exact-match still works. Install with pip install "graphifyy[chinese]".
Bug fixes
- Wiki TypeError on null
source_file—G.nodes[n].get("source_file") or ""now handles explicitNonevalues that.get("source_file", "")missed (#1016) - Nested
.claude/worktrees/indexed —_is_noise_dirnow skipsworktrees/directories nested inside dotted dirs like.claude/(#1023) - Backup accumulation —
backup_if_protecteduses content-hash comparison to skip identical backups and overwrite in-place when content changes; one folder per day maximum - TypeScript 5.0 array-form
extends—_read_tsconfig_aliasesnormalizesextendsto a list before iteration (#1017)
Also in this release
- Devin CLI support —
graphify devin install/uninstall(#1020)
Install / upgrade
pip install --upgrade graphifyy
# or
uvx graphifyy
Optional extras:
pip install "graphifyy[chinese]" # Chinese query segmentation
pip install "graphifyy[sql]" # SQL schema extraction
pip install "graphifyy[all]" # Everything
0.8.18
Fixes & Features
- Fix: Post-commit hook updates graph after delete-only commits — shrink-guard now bypassed when changed paths include explicit deletions (#1000)
- Fix:
graphify exportno longer collapses to "Single community" when.graphify_analysis.jsonis absent — falls back to per-nodecommunityattribute ingraph.json(#1001) - Feat: Semantic context tags on
referencesedges for Python/JS/TS/C#/Java —parameter_type,return_type,generic_arg,attribute,field; C#/Java now splitinherits/implements(#996)- Breaking: Java
extendsedges renamed toinherits— update queries filtering onrelation="extends"for Java nodes
- Breaking: Java
- Feat: Constrained query expansion — Step 0 in skill extracts actual graph vocab and forces LLM to pick expansion tokens only from that set; Unicode regex fix captures Cyrillic/CJK labels (#998)
- Docs: Ukrainian README updated to v8 with all new sections, YC badge, 31 language count (#995)
0.8.17
Fixes
- Case-sensitive call resolution — Go, Rust, and Elixir resolvers previously lowercased both the label index and the callee name, causing
Authorizeto matchauthorizeand produce phantom edges. Ruby, C#, Java, Kotlin, Scala use the same generic resolver which now uses a case-sensitive dict. PHP retains a separate case-insensitive dict since PHP function/class names are genuinely case-insensitive (#993) - Cross-language phantom
callsedges — INFERREDcallsedges whose source and target nodes belong to different language families (py/js/go/rs/jvm/c/cpp/rb/php/cs/swift/lua) are now dropped at graph-build time. The skill prompt also now explicitly forbids emitting cross-language call edges (#991)
v0.8.16
What's Changed
- Fix: CJK/Unicode labels no longer silently stripped during dedup —
_norm()and_norm_label()now use Unicode-aware[\W_]+regex withcasefold()and NFKC normalization; previously道具処理クラスand any non-ASCII label collapsed to empty string and got falsely merged (#937) - Fix:
.ets(ArkTS/HarmonyOS) files now recognized as code and extracted via the TypeScript parser (#926) - Fix:
graphifynow exits non-zero when all semantic-extraction chunks fail — previously a silent empty graph was written with exit code 0, masking backend failures (#889) - Feat:
graphify install --projectinstalls the skill into the current repository (.claude/skills/,.agents/skills/, etc.) instead of the user home directory; per-platform subcommands support the same flag (#931) - Docs: Uzbek (uz-UZ) README translation (#982)
Install / Upgrade
```bash
uv tool install graphifyy # fresh install
uv tool upgrade graphifyy # upgrade
pip install --upgrade graphifyy # pip
```
Full changelog: https://github.com/safishamsi/graphify/blob/v8/CHANGELOG.md
0.8.14
What's fixed
- Wiki crash on stale node IDs —
to_wiki()no longer crashes withTypeErrorwhen community node IDs are stale after dedup or re-extract. Stale IDs are silently dropped with a stderr warning; raises a clear error only if every ID is stale (#936) - .gitignore fallback — when no
.graphifyignoreexists,.gitignorepatterns are now honoured..graphifyignorestill takes precedence when both are present (#945) --excludeflag — new CLI flag to pass extra gitignore-style exclusion patterns at runtime without modifying.graphifyignore(#947).worktrees/skipped — git worktree sibling checkouts inside.worktrees/are no longer indexed as duplicate source (#947)- NAT64 SSRF false-positive fixed — hosts like
arxiv.orgon IPv6-only networks that resolve via RFC 6052 NAT64 (64:ff9b::/96) were incorrectly blocked as reserved IPs
Upgrade
uv tool upgrade graphifyy
# or
pip install --upgrade graphifyy0.8.13
What's fixed
- Node ID collisions across same-named files in different directories — SQL extractor and Python import resolver now use directory-qualified stems (
dir_file_entity) instead of bare filename stems, preventing silent node merging on repos with duplicate filenames - Absolute
source_filepaths from semantic subagents no longer stored in graph —build_from_json,build, andbuild_mergenow accept arootparam and relativize paths at build time, fixing broken MCP traversal on mixed corpora (#932) - Failed semantic chunks permanently freezing files — only files that appear in extraction output get
semantic_hashstamped in the manifest; failed-chunk files keep an empty hash and are re-queued on the next run (#933)
What's improved
- Stat-based mtime fastpath for
file_hash— skips full SHA256 read when file size+mtime_ns are unchanged (same trade-off as make); index flushed atomically via atexit, making incremental re-runs significantly faster on large corpora - New CLI subcommands —
graphify cache-check,graphify merge-chunks,graphify merge-semanticexpose cache and merge logic as library-callable commands for skill pipelines
Upgrade
pip install --upgrade graphifyyv0.8.11
- Fix: LLM empty choices / None message guard — Gemini and other providers return
choices=[]on content-filtered HTTP 200 responses; now raises a clean error instead of crashing with IndexError (#924) - Fix: OpenCode skill removed invalid
general-purposeagent reference and headless-incompatible interactive halt (#911, closes #825) - Fix: Codex skill now uses graphify query/explain/path even when graph artifacts are dirty in worktree (#913, closes #860)
- Perf: precompute degrees once in surprise scoring — ~11x speedup per lookup on large graphs (#914)