Full release notes with details on each version: GitHub Releases
- Fix:
graphify queryno longer crashes withValueErroron MultiGraph graphs —G.edges[u, v]replaced withG[u][v]+ MultiGraph guard (#305) - Fix:
graphify queryno longer crashes withAttributeError: 'NoneType' has no attribute 'lower'when a node has a nullsource_file(#307) - Fix: MCP server launched from a different directory now correctly derives the
graphify-outbase from the absolute path provided, instead of CWD (#309) - Fix:
.graphifyignorepatterns from a parent directory now fire correctly when graphify is run on a subfolder — patterns are matched against paths relative to both the scan root and the.graphifyignore's anchor directory (#303)
- Fix:
graphify install --platform cursorno longer crashes — passesPath(".")to_cursor_install(#281) - Fix:
_agents_uninstallnow only removes the OpenCode plugin when uninstalling theopencodeplatform — other platforms were incorrectly having their OpenCode plugin stripped (#276) - Fix: misleading comment in query
--graphpath handler removed (#278) - Fix:
skill-codex.md—wait→wait_agent(correct Codex tool name) (#273) - Add:
svg = ["matplotlib"]optional extra in pyproject.toml;matplotlibadded to[all]extra (#288) - Fix:
graspologicdependency now haspython_version < '3.13'env marker inleidenandallextras — prevents install failures on Python 3.13+ (#290) - Add: Dart/Flutter support —
.dartfiles extracted via regex (classes, mixins, functions, imports); added toCODE_EXTENSIONS(#292) - Add:
norm_labelfield written at build time into_json()for diacritic-insensitive search;_score_nodesand_find_nodeinserve.pyusenorm_labelwith Unicode NFKD normalization fallback (#293) - Add: Hermes Agent platform support —
graphify hermes installwrites skill to~/.hermes/skills/graphify/SKILL.mdand AGENTS.md (#251) - Add: PHP extractor now captures static property access (
Foo::$bar) asuses_static_propedges (#234) - Add: PHP extractor now captures
config()helper calls asuses_configedges pointing to the first config key segment (#236) - Add: PHP extractor now captures service container bindings (
bind,singleton,scoped,instance) asbound_toedges (#238) - Add: PHP extractor now captures
$listen/$subscribeevent listener arrays aslistened_byedges (#240) - Add:
prune_dangling_edges()utility inexport.py— removes edges whose source/target is not in the node set (#294) - Fix: Antigravity install injects YAML frontmatter into skill file for native tool discovery; rules now include MCP navigation hint; prints MCP config snippet (#268)
- Fix: Windows hook tests now use platform-aware assertions instead of POSIX executable bit checks (#279)
- Add: CLI commands
path,explain,add,watch,update,cluster-onlynow work as bare terminal commands (not just AI skill invocations) — documented in--helpoutput (#277)
- Fix: platform skill files (aider, codex, opencode, claw, droid, copilot, windows) no longer contain Claude-specific language — references to "Claude" as the AI model replaced with platform-agnostic wording (#272)
- Fix:
watchsemantic edge preservation was always empty —graph.jsonuseslinkskey but code readedges(#269) - Fix:
graphify claw installnow writes to.openclaw/(correct OpenClaw directory) instead of.claw/(#208) - Add: Blade template support —
@include,<livewire:>components, andwire:clickbindings extracted from.blade.phpfiles (#242) - Docs: WSL/Linux MCP setup note — package name is
graphifyy, use.venv/bin/python3in.mcp.json(#250)
- Add: Google Antigravity support —
graphify antigravity installwrites.agent/rules/graphify.md(always-on rules) and.agent/workflows/graphify.md(/graphifyslash command) (#203, #199, #53)
- Fix: MCP server no longer crashes with
ValidationErroron blank lines sent between JSON messages by some clients (#201)
- Fix:
watchnow preserves INFERRED/AMBIGUOUS edges (code↔doc rationale links) across rebuilds — previously all cross-type edges were dropped (#261) - Fix: Codex hook no longer emits
permissionDecision:allowwhich codex-cli 0.120.0 rejects (#249) - Fix: Common lockfiles (
package-lock.json,yarn.lock,Cargo.lock, etc.) are now skipped during detection, preventing token drain on large JS/Rust/Python projects (#266)
- Fix: JS/TS relative imports now resolve to full-path node IDs — previously all
imports_fromedges were silently dropped on large TypeScript codebases (#256) - Fix: Python relative imports (
from .foo import bar) now resolve correctly to full-path node IDs (#256) - Fix:
watch --rebuild_codenow merges fresh AST with existing semantic nodes from docs/papers instead of overwriting them (#253) - Fix: Windows hooks now fall back to
pythonifpython3is not found; exits cleanly if neither has graphify installed (#244) - Fix:
surprising_connections/suggest_questionsno longer crash withKeyErroron stale_src/_tgtedge hints after node merges (#226) - Add:
.vueand.sveltefiles now recognized as code and included in extraction (#254)
- Fix: same-basename files in different directories produced colliding node IDs — now uses full path (#211)
- Fix: edges using
from/tokeys instead ofsource/targetwere silently dropped (#216) - Fix: empty graphs (no edges) crashed
to_htmlwithZeroDivisionError(#217) - Fix: post-commit hook skipped
.tsx,.jsx, and other valid code extensions due to stale allowlist (#222) - Fix: NetworkX ≤3.1 serialises edges as
links— now accepted alongsideedges(#212) - Fix: version warning fired during
install/uninstalland duplicated on shared paths (#220) - Fix: all file IO now uses
encoding="utf-8"— prevents crashes on Windows with CJK or emoji labels; hook writes usenewline="\n"to prevent CRLF shebang breakage (#204) - Fix: Obsidian export — node labels ending in
.mdproduced.md.mdfilenames;GRAPH_REPORT.mdnow links to community hub files so vault stays in one connected component (#221)
- Fix:
collect_files()inextract.pynow respects.graphifyignore— previously ignored patterns, causing thousands of unwanted files (e.g.node_modules/) to be scanned (#188) - Fix: skill.md Step B2 now explicitly requires
subagent_type="general-purpose"— usingExploretype silently dropped extraction results since it is read-only and cannot write chunk files (#195) - Fix: Step B3 now warns when chunk files are missing from disk instead of silently skipping them
- Branch: v4 — video and audio corpus support
- Add: drop
.mp4,.mp3,.wav,.mov,.webm,.m4a,.ogg,.mkv,.avi,.m4vfiles into any corpus and graphify transcribes them locally with faster-whisper before extraction - Add: YouTube and URL download via yt-dlp —
/graphify add https://youtube.com/...downloads audio-only and feeds it through the same Whisper pipeline - Add: domain-aware Whisper prompts — the coding agent reads god nodes from the corpus and writes a one-sentence domain hint for Whisper itself, no separate API call
- Add:
graphify-out/transcripts/cache — transcripts cached by filename; YouTube URLs cached by hash so re-runs skip already-transcribed files - Requires:
pip install 'graphifyy[video]'for faster-whisper and yt-dlp
- Add: video and audio corpus support — drop
.mp4,.mp3,.wav,.mov,.webm,.m4a,.ogg,.mkv,.avi,.m4vfiles into any corpus and graphify transcribes them with faster-whisper before extraction - Add: YouTube and URL video download — pass a YouTube link (or any video URL) to
/graphify add <url>and yt-dlp downloads audio-only, which is then transcribed and added to the corpus automatically - Add: domain-aware Whisper prompts — god nodes from non-video files are used to build a one-sentence domain hint for Whisper via a cheap Haiku call, improving transcript accuracy on technical content
- Add:
graphify-out/transcripts/cache — transcripts are cached by filename so re-runs skip already-transcribed files; URLs cached by hash - Requires:
pip install 'graphifyy[video]'for faster-whisper + yt-dlp
- Fix: hook installers (Claude Code, Codex, Gemini CLI) now always remove and reinstall the hook on re-run — users upgrading from old versions no longer get stuck with a broken hook format (#182)
- Fix: rationale node labels no longer contain bare
\rcharacters on Windows/WSL CRLF files — breaks Obsidian export was silently producing invalid filenames (#176) - Fix:
skill-windows.mdnow includes--wiki,--obsidian-dir, and--directedwhich were missing vs the main skill (#177)
- Fix: graphify install --platform gemini now also copies the skill file to ~/.gemini/skills/graphify/SKILL.md so the /graphify trigger works in Gemini CLI (#174)
- Fix: MCP server no longer uses a circular path validation when loading a graph outside cwd — now validates the path exists and ends in
.jsoninstead of checking containment within its own parent directory (security fix)
- Fix:
graphify install --platform gemininow routes togemini_install()instead of erroring —geminiwas missing from_PLATFORM_CONFIG(#171) - Fix:
graphify install --platform cursornow routes to_cursor_install()the same way (#171) - Fix:
serve.pyvalidate_graph_pathnow passesbase=Path(graph_path).resolve().parentso MCP server works when graph is outside cwd (#170) - Fix: MCP
call_tool()handler now wraps dispatch in try/except — exceptions in tool handlers return graceful error strings instead of crashing the stdio loop (#163) - Fix:
_load_graphifyignorenow walks parent directories up to the.gitboundary, matching.gitignorediscovery behavior — subdirectory scans now inherit root ignore patterns (#168) - Add: Aider platform support —
graphify install --platform aidercopies skill to~/.aider/graphify/SKILL.md;graphify aider install/uninstallwrites AGENTS.md rules (#74) - Add: GitHub Copilot CLI platform support —
graphify install --platform copilotcopies skill to~/.copilot/skills/graphify/SKILL.md;graphify copilot install/uninstallfor skill management (#134) - Add:
--directedflag —build_from_json()andbuild()now acceptdirected=Trueto produce aDiGraphpreserving edge direction (source→target);cluster()converts to undirected internally for Leiden;graph_diffedge key handles directed graphs correctly (#125) - Add: Frontmatter-aware cache for Markdown files —
.mdfiles hash only the body below YAML frontmatter, so metadata-only changes (reviewed, status, tags) no longer invalidate the cache (#131)
- Fix:
graphify codex install(and opencode) no longer exits early whenAGENTS.mdalready has the graphify section — partial installs with a missing.codex/hooks.jsoncan now recover on re-run (#153)
- Add: Gemini CLI support —
graphify gemini installwrites aGEMINI.mdsection and aBeforeToolhook in.gemini/settings.jsonthat fires before file-read tool calls (#105) - Add: sponsor nudge at pipeline completion — all skill files now print a one-line sponsor link after a fresh build, not on
--updateruns
- Add: Cursor support —
graphify cursor installwrites.cursor/rules/graphify.mdcwithalwaysApply: trueso the graph context is always included;graphify cursor uninstallremoves it (#137) - Fix:
_rebuild_code()KeyError —detected[FileType.CODE]corrected todetected['files']['code']matchingdetect()'s actual return shape; was silently breaking git hooks on every commit (#148) - Fix:
to_json()crash on NetworkX 3.2.x —node_link_data(G, edges="links")now falls back tonode_link_data(G)on older NetworkX, same shim already used fornode_link_graph(#149) - Fix: README clarifies
graphifyyis the only official PyPI package — othergraphify*packages are not affiliated (#129)
- Fix: Codex PreToolUse hook now places
systemMessageat the top level of the output JSON instead of insidehookSpecificOutput— matches the strict schema enforced by codex-cli 0.118.0+ which usesadditionalProperties: false(#138) - Fix: git hooks now use
#!/bin/shinstead of#!/bin/bash— Git for Windows shipssh.exenotbash, so hooks were silently skipped on Windows (#140)
- Fix: XSS in interactive HTML graph — node labels, file types, community names, source files, and edge relations now HTML-escaped before
innerHTMLinjection; neighbor linkonclickusesJSON.stringifyinstead of raw string interpolation - Add: OpenCode
tool.execute.beforeplugin —graphify opencode installnow writes.opencode/plugins/graphify.jsand registers it inopencode.json, firing the graph reminder before bash calls (equivalent to Claude Code's PreToolUse hook) (#71) - Fix: AST-resolved call edges now carry
confidence=EXTRACTED, weight=1.0instead of INFERRED/0.8 — tree-sitter call resolution is deterministic, not probabilistic (#127) - Fix:
tree-sitter>=0.23.0now pinned in dependencies and_check_tree_sitter_version()guard added — stale environments now get a clearRuntimeErrorwith upgrade instructions instead of a crypticTypeErrordeep in the AST pipeline (#89)
- Fix: install step now tries plain
pip installbefore falling back to--break-system-packages— Homebrew and PEP 668 managed environments no longer risk environment corruption (#126)
- Fix:
--watchmode now respects.graphifyignore—_rebuild_codewas callingcollect_files()directly instead ofdetect(), bypassing ignore patterns (#120) - Fix: Codex PreToolUse hook now uses
systemMessageinstead ofadditionalContext— Codex does not supportadditionalContextand was returning an error (#121) - Fix: Trae link corrected from
trae.comtotrae.aiin README, README.zh-CN.md, README.ja-JP.md, README.ko-KR.md (#122) - Docs: Korean README added (README.ko-KR.md) (#112)
- Refactor:
save_query_resultinline Python blocks in all 6 skill files replaced withgraphify save-resultCLI command — shorter, maintainable, less tokens for LLM (#114) - Add:
graphify save-resultCLI subcommand — saves Q&A results to memory dir without inline Python - Fix: HTML graph click detection now uses hover-tracking (
hoveredNodeId) — more reliable than vis.js click params on small/dense nodes (#82) - Fix:
mkdir -p graphify-outnow runs before writing.graphify_pythoninskill.md— prevents write failure on first run;.graphify_pythonno longer deleted in Step 9 cleanup across all skill files so follow-up commands keep their interpreter (#93) - Fix:
skill-trae.mdadded topyproject.tomlpackage-data — Trae users no longer hitModuleNotFoundErrorafterpip install(#102) - Fix:
analyze.pyandwatch.pynow import extension sets fromdetect.pyinstead of local copies — Swift, Lua, Zig, PowerShell, Elixir, JSX, Julia, Objective-C files no longer misclassified as documents (#109) - Refactor: dead
build_graph()function removed fromcluster.py(#109)
- Add: Julia (.jl) support — modules, structs, abstract types, functions, short functions, using/import, call edges, inherits edges via tree-sitter-julia (#98)
- Fix: Semantic extraction chunks now group files by directory so related artifacts land in the same chunk, reducing missed cross-chunk relationships (#65)
- Fix:
tree-sitter>=0.21now pinned in dependencies — prevents silent empty AST output when older tree-sitter is installed with newer language bindings (#52) - Add: Progress output every 100 files during AST extraction so large projects don't appear to hang (#52)
- Fix:
graphify query,serve, andbenchmarknow work on NetworkX < 3.4 — version-safe shim fornode_link_graph()at all call sites (#95) - Fix:
.jsxfiles now detected and extracted via the JS extractor — added toCODE_EXTENSIONSand_DISPATCH(#94) - Fix:
.graphify_pythonno longer deleted in Step 9 cleanup across all 6 skill files — pipx users no longer hitModuleNotFoundErroron follow-up commands (#92)
- Feat: Trae and Trae CN platform support (
graphify install --platform trae/trae-cn) - Fix:
skill-droid.mdwas missing from PyPI package data — Factory Droid users couldn't install the skill - Fix: XSS in HTML legend — community labels now HTML-escaped before
innerHTMLinjection - Fix: Shebang allowlist validation in
hooks.pyand all 6 skill files — prevents metacharacter injection from malicious binaries - Fix:
louvain_communities()kwargs now inspected at runtime for cross-version NetworkX compatibility - Fix: pipx installs now detected correctly in git hooks (reads shebang from graphify binary)
- Fix: graspologic ANSI escape codes no longer corrupt PowerShell 5.1 scroll buffer
- Docs: Japanese README added
- Docs:
graph.json+ LLM workflow example added to README - Docs: Codex PreToolUse hook now documented in platform table
- Fix:
graphify codex installnow also writes a PreToolUse hook to.codex/hooks.jsonso the graph reminder fires before every Bash tool call (#86) - Fix:
--updatenow prunes ghost nodes from deleted files before merging new extraction (#51)
- Fix: PreToolUse hook now outputs
additionalContextJSON so Claude actually sees the graph reminder before Glob/Grep calls (#83) - Fix: Go AST method receivers and type declarations now use package directory scope, eliminating disconnected duplicate type nodes across files in the same package (#85)
- Fix: PDFs inside Xcode asset catalogs (
.imageset,.xcassets) are no longer misclassified as academic papers (#52) - Fix:
_resolve_cross_file_importsis now guarded withif py_pathsand wrapped in try/except so a Python parser crash can't abort extraction for non-Python files (#52) - Fix: Skill intermediate files (
.graphify_*.json) now live ingraphify-out/instead of project root, preventing git pollution (#81)
- Fix:
sanitize_labelwas double-encoding HTML entities in the interactive graph (&lt;instead of<) — removedhtml.escape()fromsanitize_label; callers that inject directly into HTML now callhtml.escape()themselves (#66) - Fix:
--wikiflag missing fromskill.mdusage table (#55)
- Fix: Louvain fallback hangs indefinitely on large sparse graphs — added
max_level=10, threshold=1e-4to prevent infinite loops while preserving community quality (#48)
- Fix: Windows UnicodeEncodeError during
graphify install— replaced arrow character with->in all print statements (#47) - Add: skill version staleness check — warns when installed skill is older than the current package, across all platforms (#46)
- Add:
follow_symlinksparameter todetect()andcollect_files()— opt-in symlink following with circular symlink cycle detection (#33) - Fix:
watch.pynow usescollect_files()instead of manual rglob loop for consistency - Docs: Codex uses
$graphify .not/graphify .(#36) - Test: 5 new symlink tests (367 total)
- Add: C# inheritance and interface implementation extraction —
base_listnow emitsinheritsedges for both simple (identifier) and generic (generic_name) base types (#45) - Add:
graphify query "<question>"CLI command — BFS/DFS traversal ofgraph.jsonwithout needing Claude Code skill (--dfs,--budget N,--graph <path>flags) - Test: 2 new C# inheritance tests (362 total)
- Add: Objective-C support (
.m,.mm) —@interface,@implementation,@protocol, method declarations,#importdirectives, message-expression call edges - Add:
--obsidian-dir <path>flag — write Obsidian vault to a custom directory instead ofgraphify-out/obsidian - Fix: semantic cache was only saving 4/17 files — relative paths from subagents now resolved against corpus root before existence check
- Fix: 75 validation warnings per run for
file_type: "rationale"— added"rationale"toVALID_FILE_TYPES - Test: 6 Objective-C tests;
.m/.mmadded totest_collect_files_from_dirsupported set (360 total)
- Add: multi-platform support — Codex (
skill-codex.md), OpenCode (skill-opencode.md), OpenClaw (skill-claw.md) - Add:
graphify install --platform <codex|opencode|claw>routes skill to correct config directory - Add:
graphify codex install/opencode install/claw install— writes AGENTS.md for always-on graph-first behaviour - Add:
graphify claude uninstall/codex uninstall/opencode uninstall/claw uninstall - Add: MIT license
- Fix:
build()was silently dropping hyperedges when merging multiple extractions - Refactor:
extract.py2527 → 1588 lines — replaced 12 copy-pasted language extractors withLanguageConfigdataclass +_extract_generic() - Docs: clustering is graph-topology-based (no embeddings) — explained in README
- Docs: all missing flags documented (
--cluster-only,--no-viz,--neo4j-push,query --dfs,query --budget,add --author,add --contributor)
- Add:
graphify claude install— writes graphify section to local CLAUDE.md + PreToolUse hook in.claude/settings.json - Add:
graphify claude uninstall— removes section and hook - Add:
graphify hook install— installs post-commit and post-checkout git hooks (platform-agnostic) - Add:
graphify hook uninstall/hook status - Add:
graphify benchmarkCLI command - Fix: node deduplication documented at all three layers
- Fix: follow-up questions now check for wiki first (graphify-out/wiki/index.md) before falling back to graph.json
- Fix: --update now auto-regenerates wiki if graphify-out/wiki/ exists
- Fix: community articles show truncation notice ("... and N more nodes") when > 25 nodes
- UX: pipeline completion message now lists all available flags and commands so users know what graphify can do
- Add:
--wikiflag — generates Wikipedia-style agent-crawlable wiki from the graph (index.md + community articles + god node articles) - Add:
graphify/wiki.pymodule withto_wiki()— cross-community wikilinks, cohesion scores, audit trail, navigation footer - Add: 14 wiki tests (245 total)
- Fix: follow-up question example code now correctly splits node labels by
_to extract verb prefixes (previous version useddef/fnprefix matching which always returned zero results)
- Fix: follow-up questions after pipeline now answered from graph.json, not by re-exploring the directory (was 25 tool calls / 1m30s; now instant)
- Skill: added "Answering Follow-up Questions" section with graph query patterns
- Perf: semantic extraction chunks 12-15 → 20-25 files (fewer subagent round trips)
- Perf: code-only corpora skip semantic dispatch entirely (AST handles it)
- Perf: print timing estimate before extraction so the wait feels intentional
- Fix: 5 skill gaps - --graphml in Usage table, --update manifest timing, query/path/explain graph existence check, --no-viz clarity
- Refactor: dead imports removed (shutil, sys, inline os); _node_community_map() helper replaces 8 copy-pasted dict comprehensions; to_html() split into _html_styles() + _html_script(); serve.py call_tool() if/elif chain replaced with dispatch table
- Test: end-to-end pipeline integration test (detect → extract → build → cluster → analyze → report → export)
- Replace pyvis with custom vis.js HTML renderer - node size by degree, click-to-inspect panel with clickable neighbors, search box, community filter, physics clustering
- HTML graph generated by default on every run (no flag needed)
- Token reduction benchmark auto-runs after every pipeline on corpora over 5,000 words
- Fix: 292 edge warnings per run eliminated - stdlib/external edges now silently skipped
- Fix:
build()cross-extraction edges were silently dropped - now merged before assembly - Fix:
pip install graphify→pip install graphifyyin skill Step 1 (critical install bug) - Add:
--graphmlflag implemented in skill pipeline (was documented but not wired up) - Remove: pyvis dependency, dead lib/ folder, misplaced eval reports from tests/
- Add: 5 HTML renderer tests (223 total)
- Fix:
pyproject.tomlstructure -requires-pythonanddependencieswere incorrectly placed under[project.urls] - Add: GitHub repository and issues URLs to PyPI page
- Add:
keywordsfor PyPI search discoverability - Docs: README clarifies Claude Code requirement, temporary PyPI name, worked examples footnote
- Add: CI badge to README (GitHub Actions, Python 3.10 + 3.12)
- Add: ARCHITECTURE.md - pipeline overview, module table, extraction schema, how to add a language
- Add: SECURITY.md - threat model, mitigations, vulnerability reporting
- Add:
worked/directory with eval reports (karpathy-repos 71.5x benchmark, httpx, mixed-corpus) - Fix: pytest not found in CI - added explicit
pip install pyteststep - Fix: README test count (163 → 212), language table, worked examples links
- Docs: README reframed as Claude Code skill; Karpathy problem → graphify answer framing
Initial release.
- 13-language AST extraction via tree-sitter (Python, JS, TS, Go, Rust, Java, C, C++, Ruby, C#, Kotlin, Scala, PHP)
- Leiden community detection via graspologic with oversized community splitting
- SHA256 semantic cache - warm re-runs skip unchanged files
- MCP stdio server -
query_graph,get_node,get_neighbors,shortest_path,god_nodes - Memory feedback loop - Q&A results saved to
graphify-out/memory/, extracted on--update - Obsidian vault export with wikilinks, community tags, Canvas layout
- Security module - URL validation, safe fetch with size cap, path guards, label sanitisation
graphify installCLI - copies skill to~/.claude/skills/and registers inCLAUDE.md- Parallel subagent extraction for docs, papers, and images