Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
678 commits
Select commit Hold shift + click to select a range
6c78a74
docs(skill): clarify no provider API key is read for semantic extract…
safishamsi May 14, 2026
fcafec7
feat(extract): add .astro support (#850, PR #852, spindle79)
safishamsi May 14, 2026
cfe18ea
fix(watch): unlink .rebuild.lock on release, rewrite single PID line …
safishamsi May 14, 2026
3baedc5
bump version to 0.7.19
safishamsi May 14, 2026
a9b0ddb
add .astro to supported extensions in README
safishamsi May 14, 2026
972fdc1
fix #862 #861 #857: skill-windows.md path prefix, sidecar graphifyign…
safishamsi May 14, 2026
4e7648b
fix #865: use git rev-parse --git-path hooks so hook install works in…
safishamsi May 14, 2026
7c561e6
Skip coverage/visual-test/snapshot/storybook-static noise dirs in det…
safishamsi May 14, 2026
40b9b84
Add tree-sitter bash and JSON extractors (#866)
safishamsi May 14, 2026
03dd794
Add v8 to CI branch list
safishamsi May 14, 2026
4d68181
Fix detect.py missing .sh/.json extensions and security harden extrac…
safishamsi May 14, 2026
914a32d
Bump version to 0.8.1
safishamsi May 14, 2026
daafec2
Update README for v0.8.1: CI badge, file types, branch references
safishamsi May 14, 2026
5f5b70f
Add 0.8.1 to CHANGELOG
safishamsi May 14, 2026
d172650
Note callflow-html auto-regeneration in README
safishamsi May 14, 2026
df40e4d
fix #873 index dot dirs, fix #874 MCP hot-reload on graph change
safishamsi May 15, 2026
1ac3b96
Fix Windows skill Python detection for uv tool installs (#831)
safishamsi May 15, 2026
da4ec1d
Bump version to 0.8.2
safishamsi May 15, 2026
ac9587b
Fix antigravity Windows skill and Python detection for uv/pipx (#831)
safishamsi May 15, 2026
5f2c55b
Bump version to 0.8.3
safishamsi May 15, 2026
1b3296a
Fix Windows skill temp files polluting project root
safishamsi May 15, 2026
299b6ba
v0.8.4: SQL FK/trigger extraction, deletion pruning fixes, community …
safishamsi May 15, 2026
6f8e6c5
fix gitignore parent-exclusion rule (#882) and dedup false merges on …
safishamsi May 15, 2026
8076687
worked(case-study): add rsl-siege-manager (Python + TypeScript monorepo)
safishamsi May 15, 2026
aaf66f1
Bump version to 0.8.5
safishamsi May 15, 2026
9ca27aa
Update CHANGELOG for 0.8.2 through 0.8.5
safishamsi May 15, 2026
63926c5
Add rsl-siege-manager case study to 0.8.5 CHANGELOG
safishamsi May 15, 2026
fa70449
Suppress autogenerated module docstrings from rationale extraction (#…
safishamsi May 15, 2026
d14e8a7
Suppress cross-language INFERRED calls/uses edges in surprising conne…
safishamsi May 15, 2026
0b54974
chore: commit uv.lock for reproducible installs
kanya-approve May 15, 2026
5e178b9
feat(detect): auto-detect symlinked children when follow_symlinks is …
alphanury May 16, 2026
246f400
build: add dev deps for Nuitka onefile binary builds
kanya-approve May 16, 2026
d1a2c3f
Stop telling assistants to read GRAPH_REPORT.md first (#580)
jattree May 16, 2026
31a9f13
Merge pull request #886 from kanya-approve/chore/commit-uv-lock
safishamsi May 16, 2026
1ba3e37
Merge pull request #887 from alphanury/feat/auto-detect-symlinks-default
safishamsi May 16, 2026
c74b95c
Merge pull request #888 from kanya-approve/feat/nuitka-build
safishamsi May 16, 2026
f86b030
Merge pull request #891 from jattree/fix/install-guidance-query-first
safishamsi May 16, 2026
8105266
Add .gitattributes to fix GitHub language detection showing HTML inst…
safishamsi May 16, 2026
aa541a6
Suppress code-doc INFERRED edges and filter JSON key nodes from god_n…
safishamsi May 16, 2026
766566f
Fill test gaps from PR #890 and fix case-insensitive path in _is_json…
safishamsi May 16, 2026
0157d5f
Add pytest testpaths to stop crawling external repos in subdirs
safishamsi May 16, 2026
b1ade00
Bump version to 0.8.6, update CHANGELOG
safishamsi May 16, 2026
a316590
Fix query seed scoring: IDF weighting, dynamic K seeds, actionable tr…
safishamsi May 16, 2026
500e4a7
fix #898 #895 #899: C++ header extraction, dedup cross-file merge, in…
safishamsi May 16, 2026
b82d5d1
fix review findings from #898 #895 #899 corrections
safishamsi May 16, 2026
d717415
Bump version to 0.8.7, update CHANGELOG
safishamsi May 16, 2026
cc9e581
add graphify prs: graph-aware PR dashboard with triage, worktrees, co…
safishamsi May 16, 2026
6d54b25
stop tracking uv.lock (library, not app)
safishamsi May 16, 2026
b4c0f01
update README and CHANGELOG for graphify prs (0.8.8)
safishamsi May 16, 2026
0ca8d3d
bump version to 0.8.8
safishamsi May 16, 2026
6018831
fix(llm): force UTF-8 encoding on _call_claude_cli subprocess + loud …
cbeaulieu-gt May 17, 2026
2aaa216
fix(analyze): exclude npm dep-block keys from god-node selection (#905)
cbeaulieu-gt May 17, 2026
ec4c87c
fix(export): accept edges-only graph JSON for wiki export (#909)
shoveller May 17, 2026
9b884f7
add deepseek backend (deepseek-v4-flash, DEEPSEEK_API_KEY)
safishamsi May 17, 2026
46738a1
add DeepSeek to README privacy section
safishamsi May 17, 2026
96e17ad
bump version to 0.8.9
safishamsi May 17, 2026
f7160c8
fix Rust cross-crate spurious INFERRED edges: skip scoped_identifier …
safishamsi May 17, 2026
2d783e5
fix hooks phantom dir on git < 2.31, save_manifest incremental data l…
safishamsi May 17, 2026
596d800
bump version to 0.8.10
safishamsi May 17, 2026
f5fea13
fix: guard against empty choices and None message in LLM responses (#…
qizwiz May 18, 2026
44638dd
test(hooks): cover old git hook path output (#910)
balloon72 May 18, 2026
4aa04dd
fix(opencode): remove invalid general-purpose agent guidance (#911)
balloon72 May 18, 2026
f0d29a1
fix(codex): keep graph-first guidance with dirty graph output (#913)
balloon72 May 18, 2026
a4a475c
perf(analyze): reuse degrees for surprise scoring (#914)
balloon72 May 18, 2026
a5eb15b
bump version to 0.8.11
safishamsi May 18, 2026
2209a9c
treat graphify <path> as graphify extract <path> — fix unknown comman…
safishamsi May 18, 2026
47e6565
bump version to 0.8.12 — security and wiki fixes
safishamsi May 18, 2026
850c545
skill: fast path for existing graphs, fix large-corpus gate, fix subf…
safishamsi May 18, 2026
a234c52
fix skill large-corpus path and detect output
safishamsi May 18, 2026
9f8b8b0
docs: clarify code-only corpora skip semantic extraction (closes #836)
safishamsi May 18, 2026
edb6e3c
update CHANGELOG for 0.8.12 with all post-bump fixes
safishamsi May 18, 2026
d84f07c
fix node ID collisions, cache fastpath, absolute source_file paths, a…
safishamsi May 18, 2026
4c95d02
bump version to 0.8.13
safishamsi May 18, 2026
6939494
add backup_if_protected to snapshot graph before overwrite when seman…
safishamsi May 18, 2026
9e6192a
fix stale wiki nodes (#936), gitignore fallback and --exclude flag (#…
safishamsi May 20, 2026
f4da176
bump version to 0.8.14
safishamsi May 20, 2026
076e6b7
fix cluster-only crash when graphify-out/ absent, add regression test…
safishamsi May 20, 2026
06a9b72
fix(llm): honor GRAPHIFY_MAX_OUTPUT_TOKENS for OpenAI-compatible back…
dkramer-sevenbelow May 22, 2026
406bea4
fix swift extension nodes duplicating across files (#969)
alexanderuv May 22, 2026
020cca2
Keep non-English query terms searchable (#964)
candy-Tong May 22, 2026
b6127aa
feat(multigraph): add runtime compatibility probe (#956)
hypnwtykvmpr May 22, 2026
e44e6e9
feat: add v8 affected and import-resolution support
TheFedaikin May 20, 2026
1494874
feat: track JS/TS barrel re-exports as explicit graph edges
deXterbed May 21, 2026
ff14ad5
bump version to 0.8.15
safishamsi May 22, 2026
6efd06c
add YC S26 badge to README
safishamsi May 22, 2026
86109e9
fix: CJK/Unicode labels silently skipped in _norm/_norm_label dedup (…
szgnewGh May 22, 2026
38cebd3
docs: add Uzbek (uz-UZ) README translation (#982)
sherbaev May 22, 2026
52d75bd
fix: add .ets (ArkTS) extension to CODE_EXTENSIONS (#926)
yyautumn330 May 22, 2026
3238b32
Exit non-zero when all semantic-extraction chunks fail (#889)
jattree May 22, 2026
b347492
feat(install): add project-scoped skill installs (#931)
balloon72 May 22, 2026
990ac70
bump version to 0.8.16
safishamsi May 22, 2026
461e346
fix Windows cp1252 crash, str.parent crash, mcp error message, god_no…
safishamsi May 23, 2026
71b4e57
fix Husky 9 hook path, skill.md INPUT_PATH literal, per-worker except…
safishamsi May 23, 2026
4dce16f
Fix case-sensitive call resolution and cross-language phantom calls (…
safishamsi May 23, 2026
73c3c33
Bump version to 0.8.17
safishamsi May 23, 2026
6fba4e4
fix(watch): bypass shrink-guard when caller declared explicit deletio…
mohamadkattan12 May 24, 2026
d778e2c
fix(cli): reconstruct communities from per-node attribute when sideca…
mohamadkattan12 May 24, 2026
32effb1
docs: update Ukrainian README translation to v8 (#995)
ivandzz May 24, 2026
ab4e542
feat: add cross-language semantic contexts for Python, JS/TS, C#, and…
TheFedaikin May 24, 2026
238702b
Constrained query expansion (#998)
eugene-krivosheyev May 24, 2026
a4a615d
Fix Ukrainian README typo, Unicode vocab regex, add migration note fo…
safishamsi May 24, 2026
98100f3
Bump version to 0.8.18
safishamsi May 24, 2026
3efae38
Rate-limit backup_if_protected to one folder per day via content hash
safishamsi May 25, 2026
4e80d86
Fix wiki TypeError on null source_file and skip nested worktrees/ dir…
safishamsi May 26, 2026
3366527
Fix: support array form of tsconfig `extends` (TypeScript 5.0) (#1017)
msotnikov May 26, 2026
065a621
feat: add Devin CLI support (graphify devin install/uninstall) (#1020)
ivishalgandhi May 26, 2026
68863a7
Remove unused _DEVIN_RULES_MARKER constant
safishamsi May 26, 2026
c7a05d6
Clarify Chinese query segmentation scope (#1026)
candy-Tong May 26, 2026
8bcfffd
add .NET project file support (.sln, .csproj, .fsproj, .vbproj, .razo…
safishamsi May 26, 2026
903fa9c
add chinese extra to README optional extras table
safishamsi May 26, 2026
d9debdf
bump version to 0.8.19
safishamsi May 26, 2026
a26f24e
fix stale nodes persisting after file deletion when manifest uses abs…
safishamsi May 26, 2026
eef623a
improve #1007 fix: use _norm_source_file with resolve() for symlink s…
safishamsi May 26, 2026
3f8efae
fix graphify update ghost nodes: as_posix() and relativize existing g…
safishamsi May 26, 2026
9abaa77
fix(cli): apply remap_communities_to_previous in cluster-only path (#…
bgmbgm94 May 26, 2026
2c01a89
feat: MCP config extractor (.mcp.json, claude_desktop_config.json, mc…
safishamsi May 26, 2026
baaab5f
fix(extract_dart): use _file_stem instead of str(path) for child node…
Overman775 May 26, 2026
e5313e7
add MCP config files to README file types table
safishamsi May 26, 2026
ad3f3b2
harden XML parsing against billion-laughs DoS in extract_csproj and e…
safishamsi May 26, 2026
b07f0eb
bump version to 0.8.20
safishamsi May 26, 2026
d1d5751
fix(watch): evict stale nodes in full re-extraction path when changed…
safishamsi May 27, 2026
a54a542
fix: make graph output deterministic (stop graphify-out churn) (#1010)
atarutin May 27, 2026
80301a0
fix: OpenCode project path, hook loop guard, deterministic output, Am…
safishamsi May 27, 2026
740382a
docs: add Amp platform, .svh extension, fix opencode uninstall in README
safishamsi May 27, 2026
9f73400
fix: memory-dir gitignore leak, Pass 2 dedup cross-file identical mer…
safishamsi May 27, 2026
c09fbef
fix: remap hyperedges in community-aggregated meta-graph view (#1006)
aadi-novice May 27, 2026
dacbdb5
feat: BYOND DreamMaker support, --mode deep flag, changelog fixes (#8…
safishamsi May 27, 2026
cfc945a
fix: cap zlib decompression in extract_dmi, add size guard in extract…
safishamsi May 27, 2026
43bf3c2
release 0.8.22
safishamsi May 27, 2026
a1706ff
docs: add --mode deep to graphify extract CLI reference
safishamsi May 27, 2026
244a266
chore: switch CI to uv, remove uv.lock from gitignore (#885)
kanya-approve May 28, 2026
cddf47d
chore: commit uv.lock (regenerated for 0.8.22 with tree-sitter-dm)
safishamsi May 28, 2026
32aa053
feat: semantic type-reference edges for Swift, Kotlin, PHP, Rust, and…
TheFedaikin May 28, 2026
ffbe425
release 0.8.23
safishamsi May 28, 2026
7c12499
chore: install all extras in CI to catch test gaps
safishamsi May 28, 2026
379d35e
fix(claude-cli): eliminate hollow-response loop from system-prompt co…
christophepub May 28, 2026
8e17973
fix .graphify_python path missing graphify-out/ prefix in skill files
safishamsi May 28, 2026
c2de9fa
add uv-aware install detection to all skill files
safishamsi May 28, 2026
66acfd8
fix calls edge direction flipping on bidirectional pairs in undirecte…
safishamsi May 28, 2026
0080fbd
feat: add objc, julia, c, c++, scala, fortran, powershell semantic co…
TheFedaikin May 28, 2026
aae027f
Merge pull request #1071 from TheFedaikin/v8
safishamsi May 29, 2026
8a30851
Merge pull request #1063 from christophepub/fix/claude-cli-hollow-res…
safishamsi May 29, 2026
fd1aca4
release 0.8.24: cross-language semantics, claude-cli fix, edge direct…
safishamsi May 29, 2026
f0badd9
fix Windows claude-cli WinError 2 and post-commit hook silent drop on…
safishamsi May 29, 2026
5642c1b
fix Lua require() import edges lost due to wrong target ID resolution…
safishamsi May 29, 2026
925eb81
fix JS/TS phantom god-nodes from arrow-fn locals and drop markdown co…
safishamsi May 29, 2026
282afaa
add missing test coverage for #1077 scope guard and markdown fence fixes
safishamsi May 29, 2026
9db8694
warn against pip install on Mac/Windows due to env path mismatch (#1074)
safishamsi May 29, 2026
9985940
fix antigravity global install path to ~/.gemini/config/skills/ and u…
safishamsi May 29, 2026
a7a7322
release 0.8.25: JS/TS phantom nodes, Lua imports, Windows cli, hook l…
safishamsi May 29, 2026
5056c72
docs: add Filipino (fil-PH) README translation
alexisvalentino May 29, 2026
d4e1d4b
fix pnpm-workspace.yaml packages:'.' crash on Python 3.10 (closes #1083)
safishamsi May 30, 2026
006e159
fix extract_files_direct backend default: auto-detect instead of kimi…
safishamsi May 30, 2026
a9d6be6
add custom LLM provider registry via providers.json (closes #1084)
safishamsi May 30, 2026
cca13aa
fix anchored gitignore pattern leaking basename match into subtree (c…
safishamsi May 30, 2026
c066511
feat: detect circular import dependencies at file level (#961)
deXterbed May 30, 2026
55d7dad
bump to 0.8.26
safishamsi May 30, 2026
31a608f
fix Windows Unicode crash on non-UTF-8 consoles (issue #992)
safishamsi May 30, 2026
0cf596a
fix test_no_incremental_without_manifest false positive
safishamsi May 30, 2026
8db19d6
sort file list lexicographically in detect() for deterministic graph …
safishamsi May 31, 2026
c898dc6
match AST file-level node IDs to the skill.md spec (fixes #1033)
safishamsi May 31, 2026
690b4e5
cap obsidian/canvas filenames to avoid ENAMETOOLONG on long labels (f…
safishamsi May 31, 2026
88a8e3b
capture TS interface-extends and same-file class heritage (fixes #1095)
safishamsi May 31, 2026
ad0c8c0
relativize symbol node IDs for root-level files to match spec (fixes …
safishamsi May 31, 2026
c8b329d
auto-name communities with the configured backend in standalone CLI (…
safishamsi May 31, 2026
3922235
release 0.8.27
safishamsi May 31, 2026
1dc5048
fold community labeling into llm.py instead of a standalone module
safishamsi May 31, 2026
4b17f19
drop redundant labels-file write in cluster-only
safishamsi May 31, 2026
a8005c2
feat: add Kilo Code support (#512)
alacasse Jun 1, 2026
ec3cb5e
feat(dart): modernize AST parser, support nested generics and part-of…
Overman775 Jun 1, 2026
1d4e112
make tree-sitter-dm an optional extra to fix default install (fixes #…
safishamsi Jun 1, 2026
f5f3a1c
stabilize community IDs so identical groupings get identical labels (…
safishamsi Jun 1, 2026
efda79a
add community-ID stability fix to 0.8.28 changelog
safishamsi Jun 1, 2026
6a3b9e1
switch downloads badge to pepy.tech
safishamsi Jun 1, 2026
47042be
use shields.io pepy badge so downloads show 1.2M not rounded 1M
safishamsi Jun 1, 2026
fbe1e99
feat(skills): progressive-disclosure split for all platforms (generat…
yaanfpv Jun 2, 2026
6137cdb
harden _always_on against missing blocks and pin skillgen baselines
safishamsi Jun 2, 2026
adfe8f0
make skillgen's toml import work on Python 3.10
safishamsi Jun 2, 2026
097b50a
give the test job full git history and lock tomli for 3.10
safishamsi Jun 2, 2026
4806c1e
guard the last tomllib import in test_install_references for Python 3.10
safishamsi Jun 2, 2026
e35b0ac
remove the claude skill tree on uninstall, not just the CLAUDE.md sec…
safishamsi Jun 2, 2026
4a20015
ship the references sidecar for gemini installs
safishamsi Jun 2, 2026
e3993e4
validate custom-provider base_url and gate project-local providers (F1)
safishamsi Jun 2, 2026
c50ffc2
cap untrusted office/PDF parsing to stop zip-bomb DoS (F2)
safishamsi Jun 2, 2026
46a1d4c
harden ollama metadata egress and cpp path handling (F3, F5)
safishamsi Jun 2, 2026
763b673
tighten F2 and F3 from review: bounded decompression, ollama DNS + cl…
safishamsi Jun 2, 2026
d5d49f3
add end-to-end test that gemini install leaves no dead reference pointer
safishamsi Jun 2, 2026
90286ab
document the progressive-disclosure split and security fixes in CHANG…
safishamsi Jun 2, 2026
345e112
release 0.8.29
safishamsi Jun 2, 2026
9a298c5
write antigravity rules and workflows on project-scoped install
safishamsi Jun 2, 2026
5cc7ec8
close the Read-tool graph bypass with a Read/Glob PreToolUse hook
safishamsi Jun 2, 2026
250834a
add anthropic extra and fix backend-missing hints for uv tool installs
safishamsi Jun 2, 2026
631a6d4
document the anthropic extra in the README and changelog the unreleas…
safishamsi Jun 2, 2026
cb5e701
make incremental extract tests deterministic under a real LLM env key
safishamsi Jun 2, 2026
724f1e3
release 0.8.30
safishamsi Jun 2, 2026
1b21368
update .gitignore: exclude paper/ - keep local only
safishamsi Jun 3, 2026
88bb186
fix hook install silent no-op for uv tool and pipx installs (#1127)
safishamsi Jun 3, 2026
2d5a10c
also probe graphify-out/.graphify_python in hook interpreter detection
safishamsi Jun 3, 2026
0fdfded
harden hook interpreter detection against injection and unquoted exec
safishamsi Jun 3, 2026
25df580
fix: relativize manifest, .graphify_root, and cache source_file field…
cornwe19 Jun 3, 2026
3a90ac2
add query logging to ~/.cache/graphify-queries.log (#1128)
safishamsi Jun 3, 2026
b7a9b81
document query logging and hook interpreter pinning in README
safishamsi Jun 3, 2026
7a588fb
release 0.8.31
safishamsi Jun 3, 2026
863f0c1
update README: manifest.json is now portable, safe to commit
safishamsi Jun 3, 2026
830f039
build: add version floors to networkx, datasketch, rapidfuzz
LJMStark Jun 5, 2026
75c4de7
honour GRAPHIFY_API_TIMEOUT in claude-cli and Anthropic SDK backends …
safishamsi Jun 5, 2026
fff1c98
fix: correct language grammar count to 27 tree-sitter grammars in README
safishamsi Jun 5, 2026
200edec
feat(extract): add Terraform/HCL AST extraction via tree-sitter-hcl (…
safishamsi Jun 5, 2026
30f6f6f
fix(tests): skip Terraform tests when tree-sitter-hcl not installed
safishamsi Jun 5, 2026
78e70ea
chore: update uv.lock with tree-sitter-hcl in all and terraform extras
safishamsi Jun 5, 2026
b368c0e
revert: remove importorskip now that uv.lock includes tree-sitter-hcl
safishamsi Jun 5, 2026
6e860e0
docs: clarify .graphifyignore vs .gitignore fallback behaviour (#1137)
safishamsi Jun 5, 2026
3a4bdf5
fix(install): route kiro install/uninstall through shared progressive…
safishamsi Jun 5, 2026
f85339b
fix(extract): don't require LLM API key for code-only corpus (#1122)
safishamsi Jun 5, 2026
9c2f2f5
docs: clarify code-only extract needs no API key (#1122)
safishamsi Jun 5, 2026
e3499e0
docs: add Terraform/HCL to file types table and optional extras (#1129)
safishamsi Jun 5, 2026
23acb41
docs: bump grammar count to 28 (tree-sitter-hcl added in #1129)
safishamsi Jun 5, 2026
ec1a3bc
release 0.8.32
safishamsi Jun 5, 2026
3405c1f
feat(install): add amber brain banner on graphify install
safishamsi Jun 5, 2026
a380b34
fix(extract): three graph quality fixes (#1145 #1146 #1147)
safishamsi Jun 6, 2026
4b06fd7
release 0.8.33
safishamsi Jun 6, 2026
2a683aa
feat(serve): add Streamable HTTP transport to MCP server (#1143)
safishamsi Jun 6, 2026
7b4c8df
docs: add Streamable HTTP transport section to README (#1155)
safishamsi Jun 6, 2026
7467c1b
feat/fix: land PRs #1118 #1110 #1159 #1107 #1103 (graph quality + new…
safishamsi Jun 7, 2026
079b34d
docs: update README for Apex, Azure, and PostgreSQL additions
safishamsi Jun 7, 2026
f146be3
fix: numpy Python 3.13 pin + codex skill dir (#1154 #1160)
safishamsi Jun 7, 2026
a8dbbe5
fix: land PRs #1170 #1169 #1165 (hooks, sensitive filter, score_nodes)
safishamsi Jun 7, 2026
6a549e4
fix: four bugs — affected direction, hook root, glob fish/zsh, manife…
safishamsi Jun 7, 2026
3744e6e
release 0.8.34
safishamsi Jun 7, 2026
12a9b5e
fix: prevent fuzzy dedup from collapsing distinct same-named symbols …
safishamsi Jun 7, 2026
9e1ad42
feat: add CodeBuddy platform support (#1136)
safishamsi Jun 7, 2026
660d2d3
fix(codebuddy): install SKILL.md in codebuddy install subcommand + fi…
safishamsi Jun 7, 2026
6dbcb89
release 0.8.35
safishamsi Jun 7, 2026
8a04560
fix: remove non-spec trigger: field from skill frontmatter (#1180)
safishamsi Jun 7, 2026
42d1b8d
feat: add graphify-mcp console script entry point (#1190)
jr2804 Jun 8, 2026
29e57cd
feat: add .slnx solution file support (#1189)
bakgaard Jun 8, 2026
7477b46
feat: extra_body for custom providers + multi-batch label_communities…
EirikWolf Jun 8, 2026
3602c80
fix: guard label/text normalizers against None node labels (#1195)
freiit Jun 8, 2026
e477825
fix: three correctness bugs — cycle hang, label token budget, fuzzy d…
safishamsi Jun 8, 2026
137bc2d
release 0.8.36
safishamsi Jun 8, 2026
6695f0a
fix: security hardening, dedup correctness, and large-graph support
safishamsi Jun 10, 2026
5504c84
perf/fix: replace datasketch with pure-numpy MinHash; memoize detect …
safishamsi Jun 10, 2026
a37672f
fix: obsidian crash, NFC/NFD dedup, JSON data nodes, OpenAI temperatu…
safishamsi Jun 10, 2026
7182b18
ci: add release-graph workflow to ship self-graph as release asset
safishamsi Jun 10, 2026
1513e62
fix(ci): correct three bugs in release-graph workflow
safishamsi Jun 10, 2026
e6d2dc4
release 0.8.37
safishamsi Jun 10, 2026
ba1921f
fix(ci): skip .md/.txt files in release-graph to avoid LLM API key re…
safishamsi Jun 10, 2026
565026d
fix(ci): add cluster-only step to generate GRAPH_REPORT.md in release…
safishamsi Jun 10, 2026
cce2673
fix: LLM calls-edge direction reversal and ghost-node merge
safishamsi Jun 11, 2026
50a4651
perf(skill): build the graph once across Steps 4-5
Echolord Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
25 changes: 25 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
.git
.github
.venv
venv
__pycache__
*.pyc
.pytest_cache
.ruff_cache
.mypy_cache
dist
build
*.egg-info
graphify-out
graphify-benchmark
graphify_eval
graphify_test
worked
llm-stack-corpus
llm-stack-demo
product-site
ebook
tests
docs
*.md
!README.md
6 changes: 6 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Tell GitHub Linguist to ignore generated/example HTML files when calculating
# the repo's primary language. Without this, large graph.html artifacts in
# worked/ dominate the byte count and the repo shows as HTML instead of Python.
worked/**/*.html linguist-vendored=true
graphify-out/**/*.html linguist-vendored=true
*.html linguist-detectable=false
1 change: 1 addition & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
github: safishamsi
79 changes: 79 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: CI

on:
push:
branches: ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "main"]
pull_request:
branches: ["v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "main"]
workflow_dispatch:

jobs:
skillgen-check:
# Fast lint-style guard: the skill files under graphify/ are generated from
# the fragments in tools/skillgen/. This fails if someone hand-edited a
# generated file or forgot to re-run the generator and bless expected/, and it
# runs the build-time validators that guard per-host coverage, the file_type
# enum, the monolith round-trips, and the always-on round-trips.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
with:
# The audit-coverage, monolith-roundtrip, and always-on-roundtrip
# validators read blobs from origin/v8. A shallow checkout omits that
# ref, so fetch the full history here and the validators run for real
# (rather than skipping). The other jobs stay shallow.
fetch-depth: 0

- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
python-version: "3.12"

# --frozen keeps uv from re-resolving and rewriting uv.lock as a side
# effect of `uv run`; the lock is committed and must not churn in CI.
- name: Check generated skill artifacts are up to date
run: uv run --frozen python -m tools.skillgen --check

- name: Audit per-host v8 coverage
run: uv run --frozen python -m tools.skillgen --audit-coverage

- name: Check the file_type enum is a singleton
run: uv run --frozen python -m tools.skillgen --schema-singleton

- name: Round-trip the monoliths against v8
run: uv run --frozen python -m tools.skillgen --monolith-roundtrip

- name: Round-trip the always-on blocks against v8
run: uv run --frozen python -m tools.skillgen --always-on-roundtrip

test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.12"]

steps:
- uses: actions/checkout@v6
with:
# test_skillgen.py reads pre-split skill bodies from the immutable
# baseline commit via `git show`; a shallow checkout omits that history
# and the baseline tests fail. Full history mirrors the skillgen-check job.
fetch-depth: 0

- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
python-version: ${{ matrix.python-version }}

# --frozen installs straight from the committed uv.lock without re-resolving
# or rewriting it, so CI never churns the lock.
- name: Install dependencies
run: uv sync --all-extras --frozen

- name: Run tests
run: uv run --frozen pytest tests/ -q --tb=short

- name: Verify install works end-to-end
run: |
uv run --frozen graphify --help
uv run --frozen graphify install
64 changes: 64 additions & 0 deletions .github/workflows/release-graph.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Release graph asset

on:
release:
types: [published]
workflow_dispatch:

jobs:
build-graph:
runs-on: ubuntu-latest
permissions:
contents: write # needed to upload release assets

steps:
- uses: actions/checkout@v6

- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
with:
python-version: "3.12"

- name: Install graphify
run: uv sync --frozen

- name: Build graph of graphify source (AST-only, no API cost)
# graphify/skills/ contains 126+ .md files that trigger the LLM pass.
# Temporarily ignore all .md files so extraction stays pure AST (no API key needed).
run: |
echo "*.md" >> .graphifyignore
echo "*.txt" >> .graphifyignore
uv run --frozen graphify extract graphify/ --out .
git checkout .graphifyignore 2>/dev/null || rm -f .graphifyignore

- name: Cluster, label communities and generate GRAPH_REPORT.md
# cluster-only writes GRAPH_REPORT.md and names communities (no LLM needed
# for basic numeric labels; --no-label skips LLM labeling entirely).
run: uv run --frozen graphify cluster-only . --no-label

- name: Generate HTML viewer
run: uv run --frozen graphify export html --graph graphify-out/graph.json

- name: Bundle release asset
run: |
mkdir -p dist-graph
cp graphify-out/graph.json dist-graph/
cp graphify-out/graph.html dist-graph/
[ -f graphify-out/GRAPH_REPORT.md ] && cp graphify-out/GRAPH_REPORT.md dist-graph/ || true
tar -czf graphify-self-graph.tar.gz -C dist-graph .
echo "Asset contents:"
tar -tzf graphify-self-graph.tar.gz

- name: Upload to GitHub release
if: github.event_name == 'release'
uses: softprops/action-gh-release@v2
with:
files: graphify-self-graph.tar.gz

- name: Upload as workflow artifact (for workflow_dispatch runs)
if: github.event_name == 'workflow_dispatch'
uses: actions/upload-artifact@v4
with:
name: graphify-self-graph
path: graphify-self-graph.tar.gz
retention-days: 7
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,27 @@ build/
*.so
*.egg
.graphify/
graphify-out/
.graphify_*.json
.graphify_python
.claude/
skills/
# The packaged skill bundles under graphify/skills/ are generated, committed
# artifacts (rendered by tools/skillgen). Keep them tracked even though the
# broad skills/ rule above ignores install-target skill dirs elsewhere.
!graphify/skills/
!graphify/skills/**
# The skillgen core fragments are the human-edited source of the lean SKILL.md.
# A global "core" ignore (for core dumps) would otherwise drop them.
!tools/skillgen/fragments/core/
!tools/skillgen/fragments/core/**
docs/superpowers/
.vscode/
.kilo
openspec/
# Local benchmark scripts — never commit
scripts/run_k2_*.py
scripts/llm.py
scripts/benchmark_kimi*.json
scripts/benchmark_kimi*.py
paper/
22 changes: 22 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Run with: uv run pre-commit install (pre-commit is already a dev dependency)
# One-off across the tree: uv run pre-commit run --all-files
#
# The skillgen hook is the local anti-drift guard. The skill files under
# graphify/ are generated from the fragments in tools/skillgen/; a hand-edit to
# a generated file fails this check the same way CI does. Run
# `python -m tools.skillgen` then `--bless` to regenerate after a fragment edit.
repos:
- repo: local
hooks:
- id: skillgen-check
name: skillgen --check (generated skill artifacts are up to date)
entry: python -m tools.skillgen --check
language: system
pass_filenames: false
always_run: true

- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.14
hooks:
- id: ruff
args: ["--config", "pyproject.toml"]
8 changes: 8 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
## graphify

This project has a graphify knowledge graph at graphify-out/.

Rules:
- Before answering architecture or codebase questions, read graphify-out/GRAPH_REPORT.md for god nodes and community structure
- If graphify-out/wiki/index.md exists, navigate it instead of reading raw files
- After modifying code files in this session, run `graphify update .` to keep the graph current (AST-only, no API cost)
85 changes: 85 additions & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Architecture

graphify is a Claude Code skill backed by a Python library. The skill orchestrates the library; the library can be used standalone.

## Pipeline

```
detect() → extract() → build_graph() → cluster() → analyze() → report() → export()
```

Each stage is a single function in its own module. They communicate through plain Python dicts and NetworkX graphs - no shared state, no side effects outside `graphify-out/`.

## Module responsibilities

| Module | Function | Input → Output |
|--------|----------|----------------|
| `detect.py` | `collect_files(root)` | directory → `[Path]` filtered list |
| `extract.py` | `extract(path)` | file path → `{nodes, edges}` dict |
| `build.py` | `build_graph(extractions)` | list of extraction dicts → `nx.Graph` |
| `cluster.py` | `cluster(G)` | graph → graph with `community` attr on each node |
| `analyze.py` | `analyze(G)` | graph → analysis dict (god nodes, surprises, questions) |
| `report.py` | `render_report(G, analysis)` | graph + analysis → GRAPH_REPORT.md string |
| `export.py` | `export(G, out_dir, ...)` | graph → Obsidian vault, graph.json, graph.html, graph.svg |
| `callflow_html.py` | `write_callflow_html(...)` | graphify-out files → Mermaid architecture/call-flow HTML |
| `ingest.py` | `ingest(url, ...)` | URL → file saved to corpus dir |
| `cache.py` | `check_semantic_cache / save_semantic_cache` | files → (cached, uncached) split |
| `security.py` | validation helpers | URL / path / label → validated or raises |
| `validate.py` | `validate_extraction(data)` | extraction dict → raises on schema errors |
| `serve.py` | `start_server(graph_path)` | graph file path → MCP stdio server |
| `watch.py` | `watch(root, flag_path)` | directory → writes flag file on change |
| `benchmark.py` | `run_benchmark(graph_path)` | graph file → corpus vs subgraph token comparison |

## Extraction output schema

Every extractor returns:

```json
{
"nodes": [
{"id": "unique_string", "label": "human name", "source_file": "path", "source_location": "L42"}
],
"edges": [
{"source": "id_a", "target": "id_b", "relation": "calls|imports|uses|...", "confidence": "EXTRACTED|INFERRED|AMBIGUOUS"}
]
}
```

`validate.py` enforces this schema before `build_graph()` consumes it.

## Confidence labels

| Label | Meaning |
|-------|---------|
| `EXTRACTED` | Relationship is explicitly stated in the source (e.g., an import statement, a direct call) |
| `INFERRED` | Relationship is a reasonable deduction (e.g., call-graph second pass, co-occurrence in context) |
| `AMBIGUOUS` | Relationship is uncertain; flagged for human review in GRAPH_REPORT.md |

## Adding a new language extractor

1. Add a `extract_<lang>(path: Path) -> dict` function in `extract.py` following the existing pattern (tree-sitter parse → walk nodes → collect `nodes` and `edges` → call-graph second pass for INFERRED `calls` edges).
2. Register the file suffix in `extract()` dispatch and `collect_files()`.
3. Add the suffix to `CODE_EXTENSIONS` in `detect.py` and `_WATCHED_EXTENSIONS` in `watch.py`.
4. Add the tree-sitter package to `pyproject.toml` dependencies.
5. Add a fixture file to `tests/fixtures/` and tests to `tests/test_languages.py`.

## Security

All external input passes through `graphify/security.py` before use:

- URLs → `validate_url()` (http/https only) + `_NoFileRedirectHandler` (blocks file:// redirects)
- Fetched content → `safe_fetch()` / `safe_fetch_text()` (size cap, timeout)
- Graph file paths → `validate_graph_path()` (must resolve inside `graphify-out/`)
- Node labels → `sanitize_label()` (strips control chars, caps 256 chars, HTML-escapes)

See `SECURITY.md` for the full threat model.

## Testing

One test file per module under `tests/`. Run with:

```bash
pytest tests/ -q
```

All tests are pure unit tests - no network calls, no file system side effects outside `tmp_path`.
Loading