Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
785c9f4
fix: detect correct Python interpreter for pipx installs in git hooks
Minidoracat Apr 8, 2026
8a0dd45
fix: suppress graspologic ANSI output that corrupts PowerShell scroll…
azizur100389 Apr 8, 2026
312ba0d
docs: add graph.json + LLM workflow example to README
gdesai23 Apr 8, 2026
74e192d
docs: add Japanese README
eltociear Apr 8, 2026
f4c3c55
feat: add Trae and Trae CN platform support
ljinshuan Apr 8, 2026
b64c231
fix: skill-droid.md missing from package-data, louvain kwargs version…
safishamsi Apr 8, 2026
1cc54b3
fix: XSS in legend innerHTML and shebang allowlist in hooks
safishamsi Apr 8, 2026
6a3b4bb
fix: shebang allowlist validation in all skill files
safishamsi Apr 8, 2026
0dc125d
release: 0.3.15 — Trae platform, security hardening, pipx hooks, Powe…
safishamsi Apr 8, 2026
30a66ec
fix: switch star history chart to starchart.cc (no auth required)
safishamsi Apr 8, 2026
23d88c5
v0.3.16: NetworkX <3.4 compat, .jsx support, pipx follow-up fix
safishamsi Apr 8, 2026
dd8235e
v0.3.17: Julia support, smarter chunking, tree-sitter pin, progress o…
safishamsi Apr 8, 2026
8dbf953
docs: add .jsx .tsx .jl to extensions table, bump to 20 languages
safishamsi Apr 8, 2026
1a50f2d
add Penpax link to README
safishamsi Apr 9, 2026
ec4f684
add Korean README and fix trae.com link across all READMEs
safishamsi Apr 9, 2026
11dff7e
release 0.3.18: fix watch .graphifyignore, codex hook, trae link, Kor…
safishamsi Apr 9, 2026
29c639d
Apply PRs #82 #93 #102 #109: extension drift, click detection, skill …
safishamsi Apr 9, 2026
4d8cffe
Update CHANGELOG for v0.3.18 with PR fixes (#82 #93 #102 #109)
safishamsi Apr 9, 2026
f140d47
Fix install step: try plain pip before --break-system-packages (#126)
safishamsi Apr 9, 2026
096a76f
Release v0.3.19
safishamsi Apr 9, 2026
3501605
Add OpenCode tool.execute.before plugin via graphify opencode install…
safishamsi Apr 9, 2026
e1864d7
Update README for OpenCode tool.execute.before plugin
safishamsi Apr 9, 2026
38255e7
Fix XSS in HTML viz: escape node labels, types, source files, and edg…
safishamsi Apr 9, 2026
b7fd5ac
Fix AST call edges confidence: INFERRED/0.8 -> EXTRACTED/1.0 (#127)
safishamsi Apr 9, 2026
b101a99
Pin tree-sitter>=0.23.0, add version guard, confidence=EXTRACTED for …
safishamsi Apr 9, 2026
6f9fc65
Fix Codex hook JSON schema (#138) and use #!/bin/sh for Windows git h…
safishamsi Apr 9, 2026
a104a0d
Add monthly PyPI downloads badge to README
safishamsi Apr 9, 2026
f770712
Add Cursor support, fix _rebuild_code KeyError and node_link_data cra…
safishamsi Apr 9, 2026
0b8067c
Add Cursor to description, README intro, and PyPI keywords
safishamsi Apr 9, 2026
dcc402e
Add Gemini CLI support and sponsor nudge at pipeline completion (#105)
safishamsi Apr 9, 2026
687fbc8
Update README: add Cursor and Gemini CLI to all platform sections
safishamsi Apr 9, 2026
54c6d04
Switch star history to star-history.com for faster updates
safishamsi Apr 9, 2026
ee43236
Fix codex/opencode install idempotency — always run hook step (#153)
safishamsi Apr 9, 2026
e440539
Add Trendshift badge to README
safishamsi Apr 9, 2026
cf39034
Remove Trendshift badge (API not available)
safishamsi Apr 9, 2026
1cbcee5
release 0.3.25: Aider + Copilot CLI, directed graphs, frontmatter cac…
safishamsi Apr 9, 2026
863100c
fix MCP server path validation security issue (0.3.26)
safishamsi Apr 10, 2026
a0a196e
update README to list all platforms including Aider, Copilot CLI, Cur…
safishamsi Apr 10, 2026
55964bc
fix gemini install missing skill file copy (0.3.27)
safishamsi Apr 10, 2026
af3a3d2
update README Gemini CLI description to mention skill file copy
safishamsi Apr 10, 2026
f7ee752
switch downloads badge to pepy.tech to avoid shields.io rate limit
safishamsi Apr 10, 2026
210243f
fix hook reinstall, CRLF labels, skill-windows missing commands (0.3.28)
safishamsi Apr 10, 2026
79acb7e
Add video/audio corpus support with yt-dlp download and Whisper trans…
safishamsi Apr 10, 2026
f758911
Update README and descriptions to mention video/audio and YouTube sup…
safishamsi Apr 10, 2026
a2872ca
Add YouTube URL example to README usage, update repo about with pip i…
safishamsi Apr 10, 2026
2c21bc0
Fix CI: mock lazy anthropic import via sys.modules instead of module …
safishamsi Apr 10, 2026
699e996
Remove Anthropic API call from transcribe.py - agent generates Whispe…
safishamsi Apr 10, 2026
68bb2bd
Bump to 0.4.0, set v4 as working branch, update CI badge and skill URL
safishamsi Apr 10, 2026
3ce9bda
Add v4 to CI branch triggers
safishamsi Apr 10, 2026
fa388c8
Security: fix YAML injection in ingest.py, </script> injection in exp…
safishamsi Apr 10, 2026
209224d
Add dedicated video and audio corpus section to README
safishamsi Apr 10, 2026
0e45308
Remove YouTube URL references from README, use generic <video-url> pl…
safishamsi Apr 10, 2026
271ee0a
Fix #188: collect_files() now respects .graphifyignore; fix #195: ski…
safishamsi Apr 10, 2026
625ca0e
Bump to 0.4.1
safishamsi Apr 10, 2026
3c50340
fix bugs #211, #216, #217, #222 and bump to 0.4.2
safishamsi Apr 11, 2026
62aac4f
cherry-pick PRs #212, #220, #204, #221 into 0.4.2
safishamsi Apr 11, 2026
b4d4ac8
add 0.4.2 CHANGELOG entry
safishamsi Apr 11, 2026
013313f
add LinkedIn badge to README
safishamsi Apr 11, 2026
4205ae8
fix bugs #256, #253, #244, #226, #254 and bump to 0.4.3
safishamsi Apr 12, 2026
efce74d
update README: 22 languages, add .vue and .svelte to file types table
safishamsi Apr 12, 2026
028f187
Add hierarchical clustering: L0 topics → L1 communities → L2 nodes
rongmiao926-hub Apr 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: CI

on:
push:
branches: ["v1", "v2", "v3", "main"]
branches: ["v1", "v2", "v3", "v4", "main"]
pull_request:
branches: ["v1", "v2", "v3", "main"]
branches: ["v1", "v2", "v3", "v4", "main"]

jobs:
test:
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,6 @@ graphify-out/
.claude/
skills/
docs/superpowers/
.vscode/
openspec/
uv.lock
141 changes: 141 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,147 @@

Full release notes with details on each version: [GitHub Releases](https://github.com/safishamsi/graphify/releases)

## 0.4.3 (2026-04-12)

- Fix: JS/TS relative imports now resolve to full-path node IDs — previously all `imports_from` edges 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_code` now merges fresh AST with existing semantic nodes from docs/papers instead of overwriting them (#253)
- Fix: Windows hooks now fall back to `python` if `python3` is not found; exits cleanly if neither has graphify installed (#244)
- Fix: `surprising_connections` / `suggest_questions` no longer crash with `KeyError` on stale `_src`/`_tgt` edge hints after node merges (#226)
- Add: `.vue` and `.svelte` files now recognized as code and included in extraction (#254)

## 0.4.2 (2026-04-11)

- Fix: same-basename files in different directories produced colliding node IDs — now uses full path (#211)
- Fix: edges using `from`/`to` keys instead of `source`/`target` were silently dropped (#216)
- Fix: empty graphs (no edges) crashed `to_html` with `ZeroDivisionError` (#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 alongside `edges` (#212)
- Fix: version warning fired during `install`/`uninstall` and 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 use `newline="\n"` to prevent CRLF shebang breakage (#204)
- Fix: Obsidian export — node labels ending in `.md` produced `.md.md` filenames; `GRAPH_REPORT.md` now links to community hub files so vault stays in one connected component (#221)

## 0.4.1 (2026-04-10)

- Fix: `collect_files()` in `extract.py` now 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"` — using `Explore` type 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

## 0.4.0 (2026-04-10)

- Branch: v4 — video and audio corpus support
- Add: drop `.mp4`, `.mp3`, `.wav`, `.mov`, `.webm`, `.m4a`, `.ogg`, `.mkv`, `.avi`, `.m4v` files 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

## 0.3.29 (2026-04-10)

- Add: video and audio corpus support — drop `.mp4`, `.mp3`, `.wav`, `.mov`, `.webm`, `.m4a`, `.ogg`, `.mkv`, `.avi`, `.m4v` files 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

## 0.3.28 (2026-04-10)

- 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 `\r` characters on Windows/WSL CRLF files — breaks Obsidian export was silently producing invalid filenames (#176)
- Fix: `skill-windows.md` now includes `--wiki`, `--obsidian-dir`, and `--directed` which were missing vs the main skill (#177)

## 0.3.27 (2026-04-10)

- 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)

## 0.3.26 (2026-04-10)

- Fix: MCP server no longer uses a circular path validation when loading a graph outside cwd — now validates the path exists and ends in `.json` instead of checking containment within its own parent directory (security fix)

## 0.3.25 (2026-04-09)

- Fix: `graphify install --platform gemini` now routes to `gemini_install()` instead of erroring — `gemini` was missing from `_PLATFORM_CONFIG` (#171)
- Fix: `graphify install --platform cursor` now routes to `_cursor_install()` the same way (#171)
- Fix: `serve.py` `validate_graph_path` now passes `base=Path(graph_path).resolve().parent` so 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_graphifyignore` now walks parent directories up to the `.git` boundary, matching `.gitignore` discovery behavior — subdirectory scans now inherit root ignore patterns (#168)
- Add: Aider platform support — `graphify install --platform aider` copies skill to `~/.aider/graphify/SKILL.md`; `graphify aider install/uninstall` writes AGENTS.md rules (#74)
- Add: GitHub Copilot CLI platform support — `graphify install --platform copilot` copies skill to `~/.copilot/skills/graphify/SKILL.md`; `graphify copilot install/uninstall` for skill management (#134)
- Add: `--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)
- Add: Frontmatter-aware cache for Markdown files — `.md` files hash only the body below YAML frontmatter, so metadata-only changes (reviewed, status, tags) no longer invalidate the cache (#131)

## 0.3.24 (2026-04-09)

- Fix: `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)

## 0.3.23 (2026-04-09)

- Add: Gemini CLI support — `graphify gemini install` writes a `GEMINI.md` section and a `BeforeTool` hook in `.gemini/settings.json` that 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 `--update` runs

## 0.3.22 (2026-04-09)

- Add: Cursor support — `graphify cursor install` writes `.cursor/rules/graphify.mdc` with `alwaysApply: true` so the graph context is always included; `graphify cursor uninstall` removes it (#137)
- Fix: `_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)
- Fix: `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)
- Fix: README clarifies `graphifyy` is the only official PyPI package — other `graphify*` packages are not affiliated (#129)

## 0.3.21 (2026-04-09)

- Fix: Codex PreToolUse hook now places `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)
- Fix: git hooks now use `#!/bin/sh` instead of `#!/bin/bash` — Git for Windows ships `sh.exe` not `bash`, so hooks were silently skipped on Windows (#140)

## 0.3.20 (2026-04-09)

- Fix: XSS in interactive HTML graph — node labels, file types, community names, source files, and edge relations now HTML-escaped before `innerHTML` injection; neighbor link `onclick` uses `JSON.stringify` instead of raw string interpolation
- Add: OpenCode `tool.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)
- Fix: AST-resolved call edges now carry `confidence=EXTRACTED, weight=1.0` instead of INFERRED/0.8 — tree-sitter call resolution is deterministic, not probabilistic (#127)
- Fix: `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)

## 0.3.19 (2026-04-09)

- Fix: install step now tries plain `pip install` before falling back to `--break-system-packages` — Homebrew and PEP 668 managed environments no longer risk environment corruption (#126)

## 0.3.18 (2026-04-09)

- Fix: `--watch` mode now respects `.graphifyignore` — `_rebuild_code` was calling `collect_files()` directly instead of `detect()`, bypassing ignore patterns (#120)
- Fix: Codex PreToolUse hook now uses `systemMessage` instead of `additionalContext` — Codex does not support `additionalContext` and was returning an error (#121)
- Fix: Trae link corrected from `trae.com` to `trae.ai` in 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_result` inline Python blocks in all 6 skill files replaced with `graphify save-result` CLI command — shorter, maintainable, less tokens for LLM (#114)
- Add: `graphify save-result` CLI 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-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)
- Fix: `skill-trae.md` added to `pyproject.toml` package-data — Trae users no longer hit `ModuleNotFoundError` after `pip install` (#102)
- Fix: `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)
- Refactor: dead `build_graph()` function removed from `cluster.py` (#109)

## 0.3.17 (2026-04-08)

- 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.21` now 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)

## 0.3.16 (2026-04-08)

- Fix: `graphify query`, `serve`, and `benchmark` now work on NetworkX < 3.4 — version-safe shim for `node_link_graph()` at all call sites (#95)
- Fix: `.jsx` files now detected and extracted via the JS extractor — added to `CODE_EXTENSIONS` and `_DISPATCH` (#94)
- Fix: `.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)

## 0.3.15 (2026-04-08)

- Feat: Trae and Trae CN platform support (`graphify install --platform trae` / `trae-cn`)
- Fix: `skill-droid.md` was missing from PyPI package data — Factory Droid users couldn't install the skill
- Fix: XSS in HTML legend — community labels now HTML-escaped before `innerHTML` injection
- Fix: Shebang allowlist validation in `hooks.py` and 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

## 0.3.14 (2026-04-08)

- Fix: `graphify codex install` now also writes a PreToolUse hook to `.codex/hooks.json` so the graph reminder fires before every Bash tool call (#86)
Expand Down
Loading