NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #3097 most downloaded on PyPI
AI coding assistant skill (Claude Code, CodeBuddy, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, Aider, OpenClaw, Factory Droid, Trae, Hermes, Kiro, Pi, Devin CLI, Google Antigravity) - turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph
Last release today
04 Oct 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
6 months old
244 releases · first in 2026
One column per month.
`bash pip install --upgrade graphifyy `
imports_from edges silently dropped for files using ../subdir/file.mjs style imports. Path.parent / raw left .." segments unnormalized so the target ID didn't match the actual file node. Fixed with os.path.normpath`.graphify update . and graphify cluster-only now generate graph.html alongside graph.json and GRAPH_REPORT.md. Previously only the skill generated the interactive HTML viewer.graphify vscode install returning unknown command 'vscode' is fixed as of v0.4.19 (command was missing from the published wheel). Upgrade to resolve.pip install --upgrade graphifyy
imports_from edges were silently dropped for files that use ../subdir/file.mjs style imports — Path.parent / raw left .. segments unnormalized, so the generated target ID didn't match the actual file node ID. Fixed with os.path.normpath (#414)graphify update . and graphify cluster-only now generate graph.html alongside graph.json and GRAPH_REPORT.md — previously only the skill generated the interactive HTML (#418)Windows PATH tip and macOS pipx ensurepath tip added to install section
build_from_json now normalises IDs before dropping edges.raw_calls and resolved globally in a post-pass.graphify-out/graphify-out nesting bug. cache_dir and _rebuild_code now call .resolve() on the root path.graphify hook install now respects core.hooksPath git config (Husky and similar tools).description field now quoted — fixes parse error in Kiro's YAML loader.pipx ensurepath tip added to install section (#413)graphify-out/, .graphifyignore usage, recommended .gitignore additions (#369)pip install --upgrade graphifyy
build_from_json now normalises IDs before dropping edges, so edges survive when the LLM generates slightly different casing or punctuation than the AST extractor (#390)raw_calls and resolved globally in a post-pass, matching existing behaviour for Python, Swift, Java, C#, Kotlin, Scala, Ruby, and PHP (#298)graphify-out/graphify-out nesting bug — cache_dir and _rebuild_code in watch.py now call .resolve() on the root path, preventing a nested output directory when graphify is run from a subdirectory (#410)graphify hook install now respects core.hooksPath git config (used by Husky and similar tools) — hooks are written to the configured path instead of always .git/hooks (#401)description value is now quoted and colons replaced with dashes, preventing a parse error in Kiro's YAML loader (#385)%APPDATA%\Python\PythonXY\Scripts) and macOS pipx tip (pipx ensurepath) to the install section (#413)graphify-out/, .graphifyignore usage, and recommended .gitignore additions (#369)Cross-file call resolution for Go, Rust, Zig, PowerShell, and Elixir (raw_calls saved and resolved globally)
Move llm.py out of graphify package into scripts/ so it is not shipped in the PyPI wheel
Fix NameError: name 'sys' is not defined in graphify watch (v0.4.15 regression)
VS Code Copilot Chat — graphify vscode install configures VS Code Copilot Chat with a Python-only skill (works on Windows PowerShell) and writes .gith
graphify vscode install configures VS Code Copilot Chat with a Python-only skill (works on Windows PowerShell) and writes .github/copilot-instructions.md for always-on graph context (#206)opencode.json entries — fixed via .as_posix() (#378)~/.agents/skills/ (correct higher-priority path) instead of ~/.gemini/skills/ (#368).mjs and .ejs files now recognised by the AST extractor as JavaScript (#365)god_nodes() return field renamed edges → degree for claritygraphify watch on macOS now uses PollingObserver by default to avoid missed events with FSEvents (#373)pip install --upgrade graphifyy
graphify vscode install installs a Python-only skill (works on Windows PowerShell) and writes .github/copilot-instructions.md for always-on graph context (#206)opencode.json — now uses forward slashes via .as_posix() (#378)~/.agents/skills/ (higher priority) instead of ~/.gemini/skills/ (#368).mjs and .ejs files now recognised by the AST extractor as JavaScript (#365, #372)god_nodes() field renamed from edges to degree for clarity — updated in report, wiki, serve, and all tests (#375)graphify watch now uses PollingObserver by default to avoid missed events with FSEvents (#373)AST extraction now emits cross-file calls edges for Swift, Go, Rust, Java, C#, Kotlin, Scala, Ruby, PHP, and every other supported language. Previousl
AST extraction now emits cross-file calls edges for Swift, Go, Rust, Java, C#, Kotlin, Scala, Ruby, PHP, and every other supported language. Previously only Python had this. Unresolved call sites are saved per file and resolved against a global label map after all files are processed. Cross-file edges are marked INFERRED with confidence 0.8.
Two node types were missing from the PHP extractor. scoped_call_expression (static calls like Helper::format()) now emits calls edges. class_constant_access_expression (enum and constant references like Status::ACTIVE) now emits references_constant edges.
--wiki now actually runs. Step 6b added to the skill pipeline (before the cleanup step so community labels are still available). Calls to_wiki() and writes graphify-out/wiki/ with index.md and one article per community and god node.
edge_betweenness_centrality now returns early for graphs over 5000 nodes. betweenness_centrality in suggest_questions uses k=100 approximate sampling for graphs over 1000 nodes. Eliminates hangs on large repos.
graphify install --platform opencode now also writes .opencode/plugins/graphify.js and registers it in opencode.json. Previously only graphify opencode install did this.
extract() accepts an explicit cache_root parameter. When graphify narrows to a subdirectory on a large repo, the cache stays at ./graphify-out/cache/ instead of <subdir>/graphify-out/cache/.
os.replace in the cache writer falls back to shutil.copy2 on PermissionError (WinError 5). graphify update exits with code 1 when rebuild fails instead of silently returning. All generated config files now use graphify update . instead of a hardcoded python3 invocation.
skill-kiro.md was missing from pyproject.toml package-data, causing graphify kiro install to fail on fresh pip installs. Fixed.
pip install -U graphifyy
scoped_call_expression (static method calls like Helper::format()) and class_constant_access_expression (enum/constant references like Status::ACTIVE) — both were silently dropped before (#230, #232)--wiki flag now runs to_wiki() as Step 6b in the skill pipeline before the cleanup step — community labels are available and the wiki is written to graphify-out/wiki/ (#229, #354)graphify install --platform opencode now also installs the .opencode/plugins/graphify.js plugin, matching what graphify opencode install does (#356)extract() accepts explicit cache_root parameter so subdirectory runs no longer write cache to <subdir>/graphify-out/cache/ (#350)os.replace in cache writer falls back to shutil.copy2 on PermissionError (Windows WinError 5) (#287)graphify update exits with code 1 on rebuild failure instead of silently returning (#287)CLAUDE.md, Cursor, and Antigravity templates now use graphify update . instead of hardcoded python3 -c invocation (#287)skill-kiro.md added to pyproject.toml package-data — graphify kiro install was failing on fresh pip installs (#352)betweenness_centrality in suggest_questions uses k=100 approximate sampling for graphs over 1000 nodes; edge_betweenness_centrality returns early for graphs over 5000 nodes (#341).v and .sv files now extracted via tree-sitter-verilog
.v and .sv files now extracted via tree-sitter-verilogpip install -U graphifyy
.v and .sv files extracted via tree-sitter-verilog (modules, functions, tasks, package imports, module instantiations with instantiates edges) (#325)afterDrawing callback ctx is now used directly (already in network coordinate space), removing the double-applied transform and incorrect canvas.width/2 DPR anchor (#334)graphify update . instead of hardcoded python3 -c "..." — correct Python is resolved through the graphify binary, no more interpreter mismatches in Nix/pipx/uv environments (#324)graphify query and graphify explain no longer crash with AttributeError when a node has label: null — all .get("label", "") calls guarded with or "" to handle explicit null values (#323)> Note: this is a cache-breaking change. Delete graphify-out/cache/ once after upgrading — it will be rebuilt on the next run.
graphify kiro install writes:
.kiro/skills/graphify/SKILL.md — the /graphify slash command skill.kiro/steering/graphify.md — always-on steering with inclusion: always, injected into every Kiro conversation automaticallyfile_hash() now uses the path relative to the project root instead of the absolute path. Cache entries are now portable across machines, CI runners, and different checkout directories.
Note: this is a cache-breaking change. Delete
graphify-out/cache/once after upgrading — it will be rebuilt on the next run.
pip install --upgrade graphifyy
rm -rf graphify-out/cache/ # one-time after upgrading
graphify kiro install writes .kiro/skills/graphify/SKILL.md (invoked via /graphify) and .kiro/steering/graphify.md (inclusion: always — always-on context before every conversation) (#319, #321)file_hash() now uses the path relative to project root instead of the resolved absolute path — cache entries are now portable across machines, CI runners, and different checkout directories (#311)`graphify query` crashes with ValueError on MultiGraph — G.edges[u, v] replaced with G[u][v] + MultiGraph guard
graphify query crashes with ValueError on MultiGraph — G.edges[u, v] replaced with G[u][v] + MultiGraph guard (#305)source_file (#307)graphify-out base from the absolute path, not CWD (#309).graphifyignore patterns from a parent directory now fire correctly when graphify is run on a subfolder (#303)pip install --upgrade graphifyy
graphify query no longer crashes with ValueError on MultiGraph graphs — G.edges[u, v] replaced with G[u][v] + MultiGraph guard (#305)graphify query no longer crashes with AttributeError: 'NoneType' has no attribute 'lower' when a node has a null source_file (#307)graphify-out base from the absolute path provided, instead of CWD (#309).graphifyignore patterns 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).dart files extracted via regex — classes, mixins, functions, imports. graphify now supports 23 languages.
.dart files extracted via regex — classes, mixins, functions, imports. graphify now supports 23 languages.
graphify install --platform hermes writes the skill to ~/.hermes/skills/graphify/SKILL.md.
graphify path "AuthModule" "Database" # shortest path between two nodes
graphify explain "SwinTransformer" # plain-language node explanation
graphify add https://... # fetch URL, save to ./raw, update graph
graphify watch ./src # rebuild on code changes, no LLM needed
graphify update ./src # re-extract code files only
graphify cluster-only . # rerun clustering on existing graph.json
Static property access, config() helper calls, service container bindings, event listener arrays.
python_version < '3.13' marker (#290)[svg] extra (#288)norm_label in graph.json for diacritic-insensitive search (#293)prune_dangling_edges() utility (#294)wait → wait_agent (#273)pip install --upgrade graphifyy
graphify install --platform cursor no longer crashes — passes Path(".") to _cursor_install (#281)_agents_uninstall now only removes the OpenCode plugin when uninstalling the opencode platform — other platforms were incorrectly having their OpenCode plugin stripped (#276)--graph path handler removed (#278)skill-codex.md — wait → wait_agent (correct Codex tool name) (#273)svg = ["matplotlib"] optional extra in pyproject.toml; matplotlib added to [all] extra (#288)graspologic dependency now has python_version < '3.13' env marker in leiden and all extras — prevents install failures on Python 3.13+ (#290).dart files extracted via regex (classes, mixins, functions, imports); added to CODE_EXTENSIONS (#292)norm_label field written at build time in to_json() for diacritic-insensitive search; _score_nodes and _find_node in serve.py use norm_label with Unicode NFKD normalization fallback (#293)graphify hermes install writes skill to ~/.hermes/skills/graphify/SKILL.md and AGENTS.md (#251)Foo::$bar) as uses_static_prop edges (#234)config() helper calls as uses_config edges pointing to the first config key segment (#236)bind, singleton, scoped, instance) as bound_to edges (#238)$listen / $subscribe event listener arrays as listened_by edges (#240)prune_dangling_edges() utility in export.py — removes edges whose source/target is not in the node set (#294)path, explain, add, watch, update, cluster-only now work as bare terminal commands (not just AI skill invocations) — documented in --help output (#277)graphify install --platform cursor no longer crashes
graphify install --platform cursor no longer crashes (#281)_agents_uninstall now only removes the OpenCode plugin for the opencode platform (#276)--graph handler (#278)skill-codex.md: wait → wait_agent (correct Codex tool name) (#273)graspologic now has python_version < '3.13' env marker — fixes install on Python 3.13+ (#290).dart files extracted via regex (classes, mixins, functions, imports) (#292)Foo::$bar) → uses_static_prop edges (#234)config() helper calls → uses_config edges (#236)bind, singleton, scoped, instance) → bound_to edges (#238)$listen, $subscribe) → listened_by edges (#240)norm_label written at build time via Unicode NFKD normalization; query, get_node, shortest_path all benefit (#293)graphify hermes install writes skill to ~/.hermes/skills/graphify/SKILL.md + AGENTS.md (#251)svg = ["matplotlib"] optional extra; matplotlib added to [all] (#288)prune_dangling_edges() utility in export.py — removes edges with missing source/target nodes (#294)433 tests passing.
Platform skill files (aider, codex, opencode, claw, droid, copilot, windows) no longer contain Claude-specific language. References to 'Claude' as the
Platform skill files (aider, codex, opencode, claw, droid, copilot, windows) no longer contain Claude-specific language. References to 'Claude' as the AI model are replaced with platform-agnostic wording so they work correctly on any agent. (#272)
PyPI: https://pypi.org/project/graphifyy/0.4.8/
Watch semantic edge loss — watch was silently dropping all semantic edges on every rebuild because graph.json uses the links key but code read edges.
watch was silently dropping all semantic edges on every rebuild because graph.json uses the links key but code read edges. Now reads both (#269)graphify claw install now correctly writes to .openclaw/skills/graphify/ (#208).blade.php files now extracted: @include, <livewire:\> components, and wire:click bindings (#242)graphifyy package name, venv setup, and full path in .mcp.json (#250)PyPI: https://pypi.org/project/graphifyy/0.4.7/
watch semantic edge preservation was always empty — graph.json uses links key but code read edges (#269)graphify claw install now writes to .openclaw/ (correct OpenClaw directory) instead of .claw/ (#208)@include, <livewire:> components, and wire:click bindings extracted from .blade.php files (#242)graphifyy, use .venv/bin/python3 in .mcp.json (#250)graphify now works with Google Antigravity — the agent-first IDE built on Gemini.
graphify now works with Google Antigravity — the agent-first IDE built on Gemini.
pip install --upgrade graphifyy
graphify antigravity install
This writes:
.agent/rules/graphify.md — always-on rules (Antigravity reads these every session).agent/workflows/graphify.md — registers /graphify as a slash commandThen open Antigravity and type /graphify .
Full changelog: https://github.com/safishamsi/graphify/blob/v4/CHANGELOG.md
PyPI: https://pypi.org/project/graphifyy/0.4.6/
If graphify has been useful, consider sponsoring — we're closing in on 100k PyPI downloads and every bit of support helps keep the project moving.
graphify antigravity install writes .agent/rules/graphify.md (always-on rules) and .agent/workflows/graphify.md (/graphify slash command) (#203, #199, #53)`bash pip install --upgrade graphifyy `
Bug fix for #201.
Fix
ValidationError when an MCP client sends blank lines between JSON messages. A background thread now filters blank-only lines from stdin before the MCP stdio transport reads them.Upgrade
pip install --upgrade graphifyy
ValidationError on blank lines sent between JSON messages by some clients (#201)Bug fixes for #249, #261, #266.
Bug fixes for #249, #261, #266.
Fixes
graphify watch now preserves INFERRED/AMBIGUOUS edges (e.g. code↔doc rationale links) across AST rebuilds — previously any edge with one code-node endpoint was dropped, losing ~95 cross-type edges in mixed repospermissionDecision:allow which codex-cli 0.120.0 rejects — switched to additionalContext (run graphify codex install to update your hook)package-lock.json, yarn.lock, pnpm-lock.yaml, Cargo.lock, poetry.lock, go.sum, etc.) are now skipped during file detection — prevents token drain on large JS/Rust/Python projectsUpgrade
pip install --upgrade graphifyy
watch now preserves INFERRED/AMBIGUOUS edges (code↔doc rationale links) across rebuilds — previously all cross-type edges were dropped (#261)permissionDecision:allow which codex-cli 0.120.0 rejects (#249)package-lock.json, yarn.lock, Cargo.lock, etc.) are now skipped during detection, preventing token drain on large JS/Rust/Python projects (#266)Bug fixes for issues #226, #244, #253, #254, #256.
Bug fixes for issues #226, #244, #253, #254, #256.
Fixes
./foo) now resolve to full-path node IDs — previously all imports_from edges were silently dropped on large TypeScript codebases. Python relative imports fixed the same way.graphify watch now merges fresh AST nodes with existing semantic nodes (docs/papers) from the last full run — previously every code save wiped the semantic layer.python if python3 is not on PATH; exits cleanly (no error) if neither has graphify installed.surprising_connections / suggest_questions no longer crash with KeyError on stale _src/_tgt edge hints after a custom node merge or canonicalization pass..vue and .svelte files are now recognized as code and included in extraction.Upgrade
pip install --upgrade graphifyy
imports_from edges were silently dropped on large TypeScript codebases (#256)from .foo import bar) now resolve correctly to full-path node IDs (#256)watch --rebuild_code now merges fresh AST with existing semantic nodes from docs/papers instead of overwriting them (#253)python if python3 is not found; exits cleanly if neither has graphify installed (#244)surprising_connections / suggest_questions no longer crash with KeyError on stale _src/_tgt edge hints after node merges (#226).vue and .svelte files now recognized as code and included in extraction (#254)Bug fixes — 8 issues addressed.
Bug fixes — 8 issues addressed.
Bug fixes (our commits)
from/to keys were silently dropped — now normalizedZeroDivisionError during visualization — guarded.tsx, .jsx etc — removed stale CODE_EXTS filterCommunity fixes (cherry-picked)
links — now accepted alongside edgesinstall/uninstall and duplicated on shared paths — fixedencoding="utf-8" — prevents crashes on Windows CJK/emoji corpora; hook writes use newline="\n" to prevent CRLF shebang breakage.md produced .md.md filenames; GRAPH_REPORT.md now links to community hub files so the vault stays in one connected componentUpgrade
pip install --upgrade graphifyy
from/to keys instead of source/target were silently dropped (#216)to_html with ZeroDivisionError (#217).tsx, .jsx, and other valid code extensions due to stale allowlist (#222)links — now accepted alongside edges (#212)install/uninstall and duplicated on shared paths (#220)encoding="utf-8" — prevents crashes on Windows with CJK or emoji labels; hook writes use newline="\n" to prevent CRLF shebang breakage (#204).md produced .md.md filenames; GRAPH_REPORT.md now links to community hub files so vault stays in one connected component (#221)`.graphifyignore` not respected by `collect_files()` (#188) — collect_files() in extract.py was ignoring .graphifyignore patterns entirely. On project
Two bug fixes:
.graphifyignore not respected by collect_files() (#188) — collect_files() in extract.py was ignoring .graphifyignore patterns entirely. On projects with node_modules/ ignored, this caused 40k+ files to be scanned instead of ~200. Fixed by loading and applying ignore patterns the same way detect() does.
Semantic extraction silently dropped with Explore subagent (#195) — if Claude Code dispatched extraction subagents using subagent_type="Explore", chunk files were never written to disk (Explore is read-only), causing up to 2.4x fewer nodes extracted with no warning. skill.md now explicitly requires general-purpose subagent type and Step B3 warns when chunk files are missing instead of silently skipping.
Run pip install --upgrade graphifyy then graphify install to get both fixes.
collect_files() in extract.py now respects .graphifyignore — previously ignored patterns, causing thousands of unwanted files (e.g. node_modules/) to be scanned (#188)subagent_type="general-purpose" — using Explore type silently dropped extraction results since it is read-only and cannot write chunk files (#195)Video and audio files are now first-class corpus inputs.
Video and audio files are now first-class corpus inputs.
Drop .mp4, .mp3, .wav, .mov, .webm, .m4a, .ogg, .mkv, .avi, or .m4v files into any folder and graphify transcribes them locally with faster-whisper before extraction. Transcripts are cached in graphify-out/transcripts/ so re-runs skip already-transcribed files.
You can also add YouTube links directly:
/graphify add https://www.youtube.com/watch?v=...
yt-dlp downloads audio-only (no video stream, much smaller) and the same Whisper pipeline picks it up from there.
The Whisper prompt is built from your corpus automatically. The coding agent reads the top god nodes from your non-video files and writes a one-sentence domain hint for Whisper itself. No separate API call, no configuration needed.
To use:
pip install 'graphifyy[video]'
This installs faster-whisper and yt-dlp. The default Whisper model is base. Pass --whisper-model medium or --whisper-model large-v3 for higher accuracy.
Audio never leaves your machine. Transcription runs fully locally.
.mp4, .mp3, .wav, .mov, .webm, .m4a, .ogg, .mkv, .avi, .m4v files into any corpus and graphify transcribes them locally with faster-whisper before extraction/graphify add https://youtube.com/... downloads audio-only and feeds it through the same Whisper pipelinegraphify-out/transcripts/ cache — transcripts cached by filename; YouTube URLs cached by hash so re-runs skip already-transcribed filespip install 'graphifyy[video]' for faster-whisper and yt-dlpAdd: video and audio corpus support — drop .mp4, .mp3, .wav, .mov, .webm, .m4a, .ogg, .mkv, .avi, .m4v files into any corpus and graphify transcribes
.mp4, .mp3, .wav, .mov, .webm, .m4a, .ogg, .mkv, .avi, .m4v files into any corpus and graphify transcribes them with faster-whisper before extraction/graphify add <url> and yt-dlp downloads audio-only, which is then transcribed and added to the corpus automaticallygraphify-out/transcripts/ cache — transcripts are cached by filename so re-runs skip already-transcribed files; URLs cached by hashpip install 'graphifyy[video]' for faster-whisper + yt-dlpHook reinstall: Claude Code, Codex, and Gemini CLI hook installers now always remove and reinstall the hook. Users upgrading from older graphify versi
Three bug fixes:
Upgrade with pip install --upgrade graphifyy
\r characters on Windows/WSL CRLF files — breaks Obsidian export was silently producing invalid filenames (#176)skill-windows.md now includes --wiki, --obsidian-dir, and --directed which were missing vs the main skill (#177)Fixed graphify install --platform gemini not copying the skill file to ~/.gemini/skills/graphify/SKILL.md. The /graphify trigger was not working witho
Fixed graphify install --platform gemini not copying the skill file to ~/.gemini/skills/graphify/SKILL.md. The /graphify trigger was not working without it. Upgrade with pip install --upgrade graphifyy
Security fix for the MCP server path validation introduced in 0.3.25. The previous fix for #170 used the graph file's own parent directory as the vali…
Security fix for the MCP server path validation introduced in 0.3.25. The previous fix for #170 used the graph file's own parent directory as the validation base, which meant any path would pass validation against itself. The MCP server now checks that the path exists and ends in .json instead. Upgrade with pip install --upgrade graphifyy
.json instead of checking containment within its own parent directory (security fix)graphify install --platform gemini and --platform cursor no longer error — both now route to their correct install functions
Fixes
graphify install --platform gemini and --platform cursor no longer error — both now route to their correct install functions (#171)serve.py) now works when graph is outside cwd — validate_graph_path receives the correct base (#170)call_tool() handler catches exceptions and returns graceful error strings instead of crashing the stdio loop (#163).graphifyignore discovery now walks parent directories up to the .git boundary, matching .gitignore behavior — subdirectory scans inherit root patterns (#168)New platforms
graphify install --platform aider + graphify aider install/uninstall (#74)graphify install --platform copilot + graphify copilot install/uninstall (#134)New features
--directed flag — builds a DiGraph preserving edge direction (source→target); cluster() converts to undirected internally for Leiden (#125).md files hash only the body, so metadata-only changes (reviewed, status, tags) no longer invalidate the cache (#131)graphify install --platform gemini now routes to gemini_install() instead of erroring — gemini was missing from _PLATFORM_CONFIG (#171)graphify install --platform cursor now routes to _cursor_install() the same way (#171)serve.py validate_graph_path now passes base=Path(graph_path).resolve().parent so MCP server works when graph is outside cwd (#170)call_tool() handler now wraps dispatch in try/except — exceptions in tool handlers return graceful error strings instead of crashing the stdio loop (#163)_load_graphifyignore now walks parent directories up to the .git boundary, matching .gitignore discovery behavior — subdirectory scans now inherit root ignore patterns (#168)graphify install --platform aider copies skill to ~/.aider/graphify/SKILL.md; graphify aider install/uninstall writes AGENTS.md rules (#74)graphify install --platform copilot copies skill to ~/.copilot/skills/graphify/SKILL.md; graphify copilot install/uninstall for skill management (#134)--directed flag — build_from_json() and build() now accept directed=True to produce a DiGraph preserving edge direction (source→target); cluster() converts to undirected internally for Leiden; graph_diff edge key handles directed graphs correctly (#125).md files hash only the body below YAML frontmatter, so metadata-only changes (reviewed, status, tags) no longer invalidate the cache (#131)Fix: codex/opencode install idempotency — graphify codex install no longer exits early when AGENTS.md already has the graphify section. Partial instal
graphify codex install no longer exits early when AGENTS.md already has the graphify section. Partial installs with a missing .codex/hooks.json now recover on re-run (#153)pip install --upgrade graphifyy
graphify codex install (and opencode) no longer exits early when AGENTS.md already has the graphify section — partial installs with a missing .codex/hooks.json can now recover on re-run (#153)Add: Gemini CLI support — graphify gemini install writes a GEMINI.md section and a BeforeTool hook in .gemini/settings.json that fires before file-rea
graphify gemini install writes a GEMINI.md section and a BeforeTool hook in .gemini/settings.json that fires before file-read tool calls (#105)--update runs)pip install --upgrade graphifyy
graphify gemini install # Gemini CLI users
Full changelog: CHANGELOG.md
Add: Cursor support — graphify cursor install writes .cursor/rules/graphify.mdc with alwaysApply: true; graphify cursor uninstall removes it
graphify cursor install writes .cursor/rules/graphify.mdc with alwaysApply: true; graphify cursor uninstall removes it (#137)_rebuild_code() KeyError — git hooks were silently failing on every commit because detected[FileType.CODE] didn't match detect()'s actual return shape (#148)node_link_data() now falls back gracefully on older NetworkX, same shim already used everywhere else (#149)graphifyy is the only official PyPI package (#129)pip install --upgrade graphifyy
Re-run graphify hook install to get the fixed git hooks.
Full changelog: CHANGELOG.md
graphify cursor install writes .cursor/rules/graphify.mdc with alwaysApply: true so the graph context is always included; graphify cursor uninstall removes it (#137)_rebuild_code() KeyError — detected[FileType.CODE] corrected to detected['files']['code'] matching detect()'s actual return shape; was silently breaking git hooks on every commit (#148)to_json() crash on NetworkX 3.2.x — node_link_data(G, edges="links") now falls back to node_link_data(G) on older NetworkX, same shim already used for node_link_graph (#149)graphifyy is the only official PyPI package — other graphify* packages are not affiliated (#129)Fix: Codex hook JSON schema — systemMessage now placed at the top level of the hook output, not inside hookSpecificOutput. codex-cli 0.118.0+ uses add
systemMessage now placed at the top level of the hook output, not inside hookSpecificOutput. codex-cli 0.118.0+ uses additionalProperties: false on the inner object so the old placement caused a validation error (#138)#!/bin/sh instead of #!/bin/bash — Git for Windows ships sh.exe, not bash, so hooks were silently skipped after every commit on Windows (#140)pip install --upgrade graphifyy
Then re-run graphify codex install to get the fixed hook, and graphify hook install to get the fixed git hook.
Full changelog: CHANGELOG.md
systemMessage at the top level of the output JSON instead of inside hookSpecificOutput — matches the strict schema enforced by codex-cli 0.118.0+ which uses additionalProperties: false (#138)#!/bin/sh instead of #!/bin/bash — Git for Windows ships sh.exe not bash, 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 innerHTML inje
innerHTML injection; neighbor link onclick uses JSON.stringify instead of raw string interpolationtool.execute.before plugin — graphify opencode install now writes .opencode/plugins/graphify.js and registers it in opencode.json, firing the graph reminder before bash calls (equivalent to Claude Code's PreToolUse hook) (#71)EXTRACTED/1.0 instead of INFERRED/0.8 — tree-sitter call resolution is deterministic, not probabilistic (#127)tree-sitter>=0.23.0 pinned and _check_tree_sitter_version() guard added — stale environments now get a clear error with upgrade instructions instead of a cryptic TypeError (#89)pip install --upgrade graphifyy
Full changelog: CHANGELOG.md
innerHTML injection; neighbor link onclick uses JSON.stringify instead of raw string interpolationtool.execute.before plugin — graphify opencode install now writes .opencode/plugins/graphify.js and registers it in opencode.json, firing the graph reminder before bash calls (equivalent to Claude Code's PreToolUse hook) (#71)confidence=EXTRACTED, weight=1.0 instead of INFERRED/0.8 — tree-sitter call resolution is deterministic, not probabilistic (#127)tree-sitter>=0.23.0 now pinned in dependencies and _check_tree_sitter_version() guard added — stale environments now get a clear RuntimeError with upgrade instructions instead of a cryptic TypeError deep in the AST pipeline (#89)Install step now tries a plain pip install first and only falls back to --break-system-packages if that fails. Homebrew and PEP 668 managed environmen
pip install first and only falls back to --break-system-packages if that fails. Homebrew and PEP 668 managed environments will use the clean path and never see the flag in most cases (#126)pip install graphifyy==0.3.19 && graphify install
pip install before falling back to --break-system-packages — Homebrew and PEP 668 managed environments no longer risk environment corruption (#126)Watch + .graphifyignore: --watch mode now respects .graphifyignore — _rebuild_code was calling collect_files() directly instead of detect(), bypassing
--watch mode now respects .graphifyignore — _rebuild_code was calling collect_files() directly instead of detect(), bypassing ignore patterns (#120)systemMessage instead of additionalContext — Codex does not support additionalContext and was returning an error (#121)trae.com to trae.ai across all READMEs (#122)hoveredNodeId) replaces unreliable vis.js click params — small/dense nodes now reliably selectable (#82).graphify_python persistence: mkdir -p graphify-out runs before writing .graphify_python; file no longer deleted in Step 9 cleanup — pipx users no longer hit ModuleNotFoundError on follow-up commands (#93)skill-trae.md added to pyproject.toml package-data — Trae users were getting ModuleNotFoundError after pip install (#102)analyze.py and watch.py now import extension sets from detect.py instead of local copies — Swift, Lua, Zig, PowerShell, Elixir, JSX, Julia, Objective-C files were being misclassified as documents (#109)graphify save-result CLI subcommand — saves Q&A results to memory dir; replaces inline Python blocks in all 6 skill files (#114)skill.md for when graphify-out/ is deleted before follow-up commands (#93)build_graph() function removed from cluster.py (#109)pip install graphifyy==0.3.18 && graphify install
--watch mode now respects .graphifyignore — _rebuild_code was calling collect_files() directly instead of detect(), bypassing ignore patterns (#120)systemMessage instead of additionalContext — Codex does not support additionalContext and was returning an error (#121)trae.com to trae.ai in README, README.zh-CN.md, README.ja-JP.md, README.ko-KR.md (#122)save_query_result inline Python blocks in all 6 skill files replaced with graphify save-result CLI command — shorter, maintainable, less tokens for LLM (#114)graphify save-result CLI subcommand — saves Q&A results to memory dir without inline PythonhoveredNodeId) — more reliable than vis.js click params on small/dense nodes (#82)mkdir -p graphify-out now runs before writing .graphify_python in skill.md — prevents write failure on first run; .graphify_python no longer deleted in Step 9 cleanup across all skill files so follow-up commands keep their interpreter (#93)skill-trae.md added to pyproject.toml package-data — Trae users no longer hit ModuleNotFoundError after pip install (#102)analyze.py and watch.py now import extension sets from detect.py instead of local copies — Swift, Lua, Zig, PowerShell, Elixir, JSX, Julia, Objective-C files no longer misclassified as documents (#109)build_graph() function removed from cluster.py (#109)Add: Julia (.jl) support — modules, structs, abstract types, functions, short functions, using/import, call edges, inherits edges
tree-sitter>=0.21 now pinned in dependencies — prevents silent empty AST output when older tree-sitter is installed with newer language bindings (#52)Fix: \graphify query\, \serve\, and \benchmark\ now work on NetworkX < 3.4 — version-safe shim for \node_link_graph()\ at all call sites
graphify query, serve, and benchmark now work on NetworkX < 3.4 — version-safe shim for node_link_graph() at all call sites (#95).jsx files now detected and extracted via the JS extractor — added to CODE_EXTENSIONS and _DISPATCH (#94).graphify_python no longer deleted in Step 9 cleanup across all 6 skill files — pipx users no longer hit ModuleNotFoundError on follow-up commands (#92)Feat: Trae and Trae CN platform support (graphify install --platform trae / trae-cn)
graphify install --platform trae / trae-cn)skill-droid.md was missing from PyPI package data — Factory Droid users couldn't install the skillinnerHTML injectionhooks.py and all skill files — prevents metacharacter injectionlouvain_communities() kwargs now inspected at runtime for cross-version NetworkX compatibilitygraph.json + LLM workflow example added to READMEgraphify install --platform trae / trae-cn)skill-droid.md was missing from PyPI package data — Factory Droid users couldn't install the skillinnerHTML injectionhooks.py and all 6 skill files — prevents metacharacter injection from malicious binarieslouvain_communities() kwargs now inspected at runtime for cross-version NetworkX compatibilitygraph.json + LLM workflow example added to READMEFix: graphify codex install now also writes a PreToolUse hook to .codex/hooks.json so the graph reminder fires before every Bash tool call
graphify codex install now also writes a PreToolUse hook to .codex/hooks.json so the graph reminder fires before every Bash tool call (#86)--update now prunes ghost nodes from deleted files before merging new extraction (#51)Fix: PreToolUse hook now outputs additionalContext JSON so Claude actually sees the graph reminder before Glob/Grep calls
additionalContext JSON so Claude actually sees the graph reminder before Glob/Grep calls (#83).imageset, .xcassets) are no longer misclassified as academic papers (#52)_resolve_cross_file_imports is now guarded with if py_paths and wrapped in try/except so a Python parser crash can't abort extraction for non-Python files (#52).graphify_*.json) now live in graphify-out/ instead of project root, preventing git pollution (#81)Fix: sanitize_label was double-encoding HTML entities in the interactive graph (< instead of <) — removed html.escape() from sanitize_label; caller
sanitize_label was double-encoding HTML entities in the interactive graph (&lt; instead of <) — removed html.escape() from sanitize_label; callers that inject directly into HTML now call html.escape() themselves (#66)--wiki flag missing from skill.md usage table (#55)Added max_level=10, threshold=1e-4 to NetworkX Louvain fallback
max_level=10, threshold=1e-4 to NetworkX Louvain fallbackmax_level=10, threshold=1e-4 to prevent infinite loops while preserving community quality (#48)Replaced arrow character with -> in all print statements — fixes UnicodeEncodeError on cp1252/Windows consoles
-> in all print statements — fixes UnicodeEncodeError on cp1252/Windows consolesgraphify install now writes a version stamp alongside the skill filegraphify command checks all platform skill locations and warns if the installed skill is from an older versiongraphify install — replaced arrow character with -> in all print statements (#47)detect() and collect_files() now accept follow_symlinks=True to traverse symlinked files and directories
detect() and collect_files() now accept follow_symlinks=True to traverse symlinked files and directorieswatch.py now uses collect_files() for consistency$graphify . not /graphify . (#36)follow_symlinks parameter to detect() and collect_files() — opt-in symlink following with circular symlink cycle detection (#33)watch.py now uses collect_files() instead of manual rglob loop for consistency$graphify . not /graphify . (#36)DataProcessor : IProcessor now emits inherits edges
DataProcessor : IProcessor now emits inherits edgesidentifier) and generic bases (IList<T> → generic_name)graphify query CLI command (#43)graphify query "what connects attention to the optimizer?"
graphify query "what is CfgNode?" --dfs
graphify query "show auth flow" --budget 500 --graph path/to/graph.json
--dfs for path tracing, --budget N to cap output tokensbase_list now emits inherits edges for both simple (identifier) and generic (generic_name) base types (#45)graphify query "<question>" CLI command — BFS/DFS traversal of graph.json without needing Claude Code skill (--dfs, --budget N, --graph <path> flags).m and .mm files now extracted via tree-sitter
.m and .mm files now extracted via tree-sitter@interface, @implementation, @protocol → class/protocol nodesmethod edges#import directives → imports edgesinherits edgescalls edges (INFERRED)--obsidian-dir flag (#37)/graphify ./raw --obsidian --obsidian-dir ~/vaults/myprojectfile_type: "rationale" no longer triggers 75 warnings per run.m, .mm) — @interface, @implementation, @protocol, method declarations, #import directives, message-expression call edges--obsidian-dir <path> flag — write Obsidian vault to a custom directory instead of graphify-out/obsidianfile_type: "rationale" — added "rationale" to VALID_FILE_TYPES.m/.mm added to test_collect_files_from_dir supported set (360 total)Elixir language support — .ex and .exs files now go through AST extraction. Extracts defmodule, def/defp, alias/import/require/use, and the call graph
.ex and .exs files now go through AST extraction. Extracts defmodule, def/defp, alias/import/require/use, and the call graph between functions. Same EXTRACTED/INFERRED tagging as every other language..docx and .xlsx support — Office documents now work in graphify. Install the optional extra: ` pip install graphifyy[office] `
pip install graphifyy[office]
.docx: converted to markdown via python-docx (headings, lists, tables preserved).xlsx: each sheet converted to a markdown table via openpyxlgraphify-out/converted/ as .md sidecars — Claude reads them as normal documents[office] is not installed: file is skipped with an install hintFix UnicodeDecodeError on Windows GBK locale — all read_text() and write_text() calls in graphify/__main__.py now explicitly pass encoding="utf-8". Wi
read_text() and write_text() calls in graphify/__main__.py now explicitly pass encoding="utf-8". Windows systems with non-UTF-8 default locales (e.g. GBK in Chinese Windows) no longer crash on graphify install.Windows support — graphify install now auto-detects Windows and installs a PowerShell-compatible skill variant (skill-windows.md). All bash-specific c
graphify install now auto-detects Windows and installs a PowerShell-compatible skill variant (skill-windows.md). All bash-specific commands replaced: which/head/tr → Python detection, rm -f → Remove-Item, mkdir -p → New-Item, python3 → pythongraphify install --platform windows on any platformZig and PowerShell are now supported. Functions, structs, enums, unions, and imports for Zig. Functions, classes, methods, and using statements for Po
Zig and PowerShell are now supported. Functions, structs, enums, unions, and imports for Zig. Functions, classes, methods, and using statements for PowerShell.
Factory Droid is now a supported platform. graphify install --platform droid and graphify droid install work the same as the other platforms.
.graphifyignore — add a file to exclude folders and files from the graph. Same syntax as .gitignore. Useful for keeping node_modules, vendor, dist, and generated files out of the graph.
What is next
v0.4.0 brings local embeddings via quantized Gemma 4, no API cost for semantic similarity. Also planned: more /graphify add sources, graph diff across runs, and worked examples for Codex and OpenCode.
Neo4j Cypher export was vulnerable to injection via backslash sequences in node labels. Escaping is now correct.
Fourteen bugs fixed across two community code reviews.
Git hooks now exit with a non-zero code when a rebuild fails. Previously the hook caught the exception and exited 0, so git assumed everything was fine and your graph would go stale with no warning.
The /graphify query token budget was overshooting by about 3x. The character-to-token ratio has been corrected.
Deleted files are now tracked in incremental mode. If you remove a file and run /graphify --update, its nodes are flagged for cleanup instead of staying in the graph as ghost nodes.
Cache writes are now atomic. A crash mid-write no longer leaves a corrupt cache entry that silently causes a full re-extraction on the next run.
/graphify add tweet fetching was bypassing SSRF protections and making raw HTTP requests. It now routes through the same safe fetch layer as everything else.
Neo4j Cypher export was vulnerable to injection via backslash sequences in node labels. Escaping is now correct.
The HTML visualization was embedding AI-generated community labels directly into innerHTML without sanitization. Labels are now sanitized before rendering.
Graph diff was reporting phantom additions and removals on undirected graphs because edge key ordering was non-deterministic. Edge keys are now normalized.
The file cache was keyed only on content hash, so two files with identical content would share a cache entry with wrong source metadata baked in. The file path is now included in the key.
Hook uninstall used a naive string split that could corrupt other hooks sharing the same file. Uninstall now uses paired start and end markers.
What is next
v0.4.0 brings local embeddings via quantized Gemma 4, no API cost for semantic similarity. Also planned: more /graphify add sources, graph diff across runs, and worked examples for Codex and OpenCode.
graphify now works on Claude Code, Codex, OpenCode, and OpenClaw.
graphify now works on Claude Code, Codex, OpenCode, and OpenClaw.
| Platform | Skill install | Always-on |
|---|---|---|
| Claude Code | graphify install |
graphify claude install |
| Codex | graphify install --platform codex |
graphify codex install |
| OpenCode | graphify install --platform opencode |
graphify opencode install |
| OpenClaw | graphify install --platform claw |
graphify claw install |
Each platform gets its own optimized skill file. Codex uses spawn_agent, OpenCode uses @mention, OpenClaw uses sequential extraction.
graphify claude install adds CLAUDE.md rules and a PreToolUse hook so Claude checks the graph before every file search (Claude Code only)graphify codex install / opencode install / claw install writes the same rules to AGENTS.md for always-on graph-first behaviour on those platformsgraphify is now open source under the MIT license.
pip install graphifyy[embeddings]/graphify add including YouTube transcripts, GitHub issues, and Notion pagespip install graphifyy==0.3.0
graphify install # Claude Code
graphify install --platform codex # Codex
graphify install --platform opencode # OpenCode
graphify install --platform claw # OpenClaw
skill-codex.md), OpenCode (skill-opencode.md), OpenClaw (skill-claw.md)graphify install --platform <codex|opencode|claw> routes skill to correct config directorygraphify codex install / opencode install / claw install — writes AGENTS.md for always-on graph-first behaviourgraphify claude uninstall / codex uninstall / opencode uninstall / claw uninstallbuild() was silently dropping hyperedges when merging multiple extractionsextract.py 2527 → 1588 lines — replaced 12 copy-pasted language extractors with LanguageConfig dataclass + _extract_generic()--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
graphify claude install — writes graphify section to local CLAUDE.md + PreToolUse hook in .claude/settings.jsongraphify claude uninstall — removes section and hookgraphify hook install — installs post-commit and post-checkout git hooks (platform-agnostic)graphify hook uninstall / hook statusgraphify benchmark CLI commandNothing published for this version
Code comments and docstrings are now first-class graph nodes. Module, class, and function docstrings are extracted automatically. Inline comments tagg
Code comments and docstrings are now first-class graph nodes. Module, class, and function docstrings are extracted automatically. Inline comments tagged # NOTE:, # IMPORTANT:, # HACK:, # WHY:, # RATIONALE:, # TODO:, # FIXME: become rationale_for nodes connected to the code entity they explain. Doc files now extract design rationale and architectural decisions too - not just structure, but why things were built that way.
Every INFERRED edge now carries a confidence_score (0.0-1.0). EXTRACTED edges are always 1.0. INFERRED edges score 0.4-0.9 based on how certain the model was. AMBIGUOUS edges score 0.1-0.3. You know not just what was guessed but how confident.
Cross-file conceptual links with no structural connection. Two functions solving the same problem without calling each other, a class in code and a concept in a paper describing the same algorithm. Tagged semantically_similar_to with a confidence score.
Group relationships connecting 3+ nodes that pairwise edges cannot express. All classes implementing a shared protocol, all functions in an auth flow, all concepts from a paper section forming one coherent idea. Stored in a top-level hyperedges array in graph.json.
graphify hook install now installs both post-commit (existing) and post-checkout (new). The graph rebuilds automatically when you switch branches, not just when you commit.
graphify claude install now also writes a .claude/settings.json hook that fires before every Glob and Grep call. If a graphify knowledge graph exists, Claude is reminded to check it before searching raw files. Ensures the graph is actually used during research, not bypassed.
Obsidian vault generation (--obsidian) is now opt-in. Default output is graph.html + graph.json + GRAPH_REPORT.md. Large repos were generating thousands of files by default.
pip install --upgrade graphifyy
graphify install
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →