Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1225 commits
Select commit Hold shift + click to select a range
1288a55
fix(extract): don't cache zero-node results; warn on empty source fil…
safishamsi Jul 5, 2026
5ffa921
Fix invalid virtual postgres source_file URI backslashes on Windows (…
raman118 Jul 4, 2026
94392de
fix(extract): don't report deferred import() as a file cycle (#1241)
Synvoya Jul 5, 2026
aa1bbda
Fix case-sensitive file suffix filtering silently skipping capitalize…
raman118 Jul 4, 2026
d9f97b9
docs: changelog credit for #1671, #1672, #1241
safishamsi Jul 5, 2026
6631af7
feat(ruby/affected): mixes_in edges for include/extend/prepend + meth…
safishamsi Jul 5, 2026
21b52e1
docs(readme): new Graphify logo (cropped icon + wordmark)
safishamsi Jul 5, 2026
b06c55e
docs(readme): add graph.html hero image + benchmark table
safishamsi Jul 5, 2026
d7aafb0
docs(readme): collapse platform picker and optional extras into <deta…
safishamsi Jul 5, 2026
2ab0867
fix(extract): route extensionless shebang scripts to their AST extractor
Stashub Jul 5, 2026
5cfd7d9
docs: changelog credit for #1683
safishamsi Jul 5, 2026
6d3a6f1
feat: extract rationale comments + ADR/RFC doc references from JS/TS
niltonmourafilho-arch Jul 1, 2026
a4d4533
docs: changelog credit for #1599
safishamsi Jul 5, 2026
7d463c9
feat: add `pascal` optional extra for tree-sitter-pascal
vinicius-l-machado Jul 2, 2026
f2b81a9
docs: changelog credit for #1616
safishamsi Jul 5, 2026
92edf78
feat(java): suppress java stdlib types from references edges (#1603)
Jul 6, 2026
dd8c24c
docs: add .claudeignore tip for prompt cache (#1539); changelog for #…
guyoron1 Jul 6, 2026
b699182
release: 0.9.7
safishamsi Jul 6, 2026
31211a0
docs(readme): visual overhaul (hero, capability table, query demo, ho…
safishamsi Jul 6, 2026
97a1371
Fix: exact-match section heading in _replace_or_append_section to pre…
safishamsi Jul 6, 2026
0ff584f
Fix: tolerate tiktoken special-token text in token estimation (#1685)
safishamsi Jul 6, 2026
b78248f
Fix: cap Ollama client-side retries so a hung request cannot multiply…
safishamsi Jul 6, 2026
21b851b
Fix: salvage truncated labeling replies and account for labeling toke…
safishamsi Jul 6, 2026
e801196
docs: add Hebrew (he-IL) README translation (#1639)
AdirBuskila Jul 6, 2026
bbc3be2
docs(readme): add animated "path lights up" demo to See it in action
safishamsi Jul 6, 2026
912d832
Fix: stop silently dropping source files during discovery via two ove…
safishamsi Jul 6, 2026
5d01373
Feat: opt-in GRAPHIFY_DISABLE_THINKING; correct deepseek thinking def…
safishamsi Jul 6, 2026
f7911fd
Fix: make Claude Code / Codebuddy PreToolUse graph-nudge hooks work o…
safishamsi Jul 6, 2026
85f9fac
Fix: port the Gemini CLI BeforeTool graph-nudge hook to be shell-agno…
safishamsi Jul 6, 2026
737a0b8
test: rigorous edge cases for the hook-guard subcommand (#522)
safishamsi Jul 6, 2026
80e199d
Release 0.9.8
safishamsi Jul 6, 2026
aba1232
docs(readme): stronger front door — badge reorder, accurate hero, 30-…
safishamsi Jul 6, 2026
d1d1f41
fix(serve): match a punctuated label against norm_label symmetrically…
safishamsi Jul 6, 2026
377dc7f
fix(extract): warn when code files have no AST extractor instead of s…
safishamsi Jul 6, 2026
f5d50ad
fix(extract): keep AST progress denominator consistent to the end (#1…
safishamsi Jul 6, 2026
f84a0af
fix(report): don't emit dangling [[_COMMUNITY_*]] wikilinks by defaul…
safishamsi Jul 7, 2026
23457d1
feat(detect): surface unclassified files instead of dropping them sil…
safishamsi Jul 7, 2026
ac6bb27
docs(skill): fix stale /graphify usage comment that claimed an Obsidi…
safishamsi Jul 7, 2026
733ad08
fix(extract): don't force-parse MATLAB .m through the Objective-C gra…
safishamsi Jul 7, 2026
53efaf8
Release 0.9.9
safishamsi Jul 7, 2026
cf36d10
fix(extract): emit Java enum constants as nodes with case_of edges
ivanzhl Jul 7, 2026
0ce8ea0
docs(security): clarify stdio-only claim now that HTTP transport exists
Thizeidler Jul 7, 2026
6c33e3a
test(security): cover GRAPHIFY_MAX_GRAPH_BYTES parsing; clarify unit …
Cekaru Jul 7, 2026
e5044c3
Fix rebuilds from deleted hook cwd
FranciscoJSBarragan Jul 6, 2026
2ea3773
Checkpoint semantic cache per chunk so interrupted runs resume
A-Levin Jul 7, 2026
27b523e
test(cache): cover save_semantic_cache merge_existing union + default…
safishamsi Jul 8, 2026
bf7fa50
fix(extract): never bind a cross-file call to a definition in another…
edinaldoof Jul 7, 2026
9557bf6
fix(extract): tag inline base-class stubs with origin_file
mallyskies Jul 7, 2026
3b2ca2e
fix(build): don't let an ambiguous legacy-stem alias silently merge f…
mallyskies Jul 7, 2026
96db75c
fix(build): recognize a salted file node as its own alias claimant
mallyskies Jul 7, 2026
67f4f83
fix(extract): skip builtin-global receiver types in TS/JS member-call…
safishamsi Jul 8, 2026
781d1cd
Release 0.9.10
safishamsi Jul 8, 2026
5c6f727
test(extract): cover builtin static-call shape (Date.now()) for #1726
safishamsi Jul 8, 2026
4be0f7b
fix(merge-graphs): give each input a distinct repo tag so same-stem n…
safishamsi Jul 8, 2026
0d206cb
fix(uninstall): remove graphify hook/section from Claude local-only f…
TPAteeq Jul 8, 2026
20bfdf6
feat(extract): add --code-only to index code without an LLM key on a …
safishamsi Jul 8, 2026
cc2d3c1
refactor(main): extract install/uninstall subsystem into graphify/ins…
TPAteeq Jul 8, 2026
9fc30e6
refactor(extract): migrate 18 bespoke language extractors to extracto…
TPAteeq Jul 8, 2026
4859f98
refactor(export): split HTML and graph-DB exporters into graphify/exp…
TPAteeq Jul 8, 2026
e8a2289
refactor(extract): migrate verilog and markdown extractors to extract…
TPAteeq Jul 8, 2026
4561da2
refactor(extract): extract symbol-resolution subsystem into extractors/
TPAteeq Jul 8, 2026
97a289c
refactor(main): move install/platform CLI dispatch into install.dispa…
TPAteeq Jul 8, 2026
9b4ffda
build: package the new graphify.exporters subpackage
TPAteeq Jul 8, 2026
5015212
refactor(extract): extract the _extract_generic tree-sitter engine in…
TPAteeq Jul 8, 2026
563bb59
refactor(extract): migrate pascal, objc, and julia extractors to extr…
TPAteeq Jul 8, 2026
247b2ae
refactor(main): move the command dispatch into graphify/cli.py
TPAteeq Jul 8, 2026
87b330c
Release 0.9.11
safishamsi Jul 8, 2026
00dd978
fix(extract): emit Kotlin enum entries as nodes with case_of edges (#…
ivanzhl Jul 8, 2026
ea8b804
Fix uv interpreter detection falling back to graphify-less python (#1…
mohammedMsgm Jul 8, 2026
e2d4753
Changelog: fold #1700 (Kotlin enums) and #1735 (uv probe) into 0.9.11
safishamsi Jul 8, 2026
2f9deae
fix(serve): scale per-term exact/prefix score tiers by squared term c…
fkhawajagh Jul 8, 2026
d89efbf
fix(extract): scope Pascal/Delphi call resolution + resolve inherited…
richtext Jul 8, 2026
d2d1f68
fix: surface silently-skipped dirs in enumeration + dedup Pascal edges
safishamsi Jul 9, 2026
ee1ff3d
fix(extract): resolve Java cross-module type references by import (#1…
safishamsi Jul 9, 2026
9c27a52
test(extractors): guard facade + registry identity for the per-langua…
Cekaru Jul 9, 2026
29a6954
fix(build): make ghost-node merge deterministic across process runs (…
erasmust-dotcom Jul 9, 2026
8b7ffc5
fix(extract): warn when files skip extraction for a missing optional …
rithyKabir Jul 9, 2026
bdc6e53
fix(build): don't bind imports/references across a language boundary …
philberndt Jul 9, 2026
c5db9ff
fix(cli): keep outputs/cache with --out / --graph, not the corpus or …
bbqboogiedwonsen Jul 10, 2026
dae602c
fix(extract): resolve Java member calls by receiver type (#1696)
oleksii-tumanov Jul 10, 2026
51b15a9
fix(update): preserve surviving hyperedges on AST-only rebuild (#1755)
oleksii-tumanov Jul 10, 2026
d68bf28
fix(extract): create json_config reference target nodes (#1764)
oleksii-tumanov Jul 10, 2026
35665a7
fix(pg_introspect): read FKs from pg_constraint so read-only roles ge…
rithyKabir Jul 10, 2026
4c075f9
docs(readme): unlink YC S26 badge until the public company page is live
safishamsi Jul 10, 2026
ce5af6f
test: guard to_html/sanitize_label against null source_file/label (#1…
safishamsi Jul 10, 2026
3c3b655
fix(extract): rewire cross-module function references to their defini…
EmilNyg Jul 10, 2026
df74ab4
test(csharp): chained call off new X(...) resolves (#1770)
safishamsi Jul 10, 2026
5777fec
fix(extract): route .rake files to the Ruby extractor + resolution (#…
krishnateja7 Jul 11, 2026
a646d66
fix(bash): link executed scripts across files (#1756)
balloon72 Jul 11, 2026
15a8653
fix(analyze): exclude rationale nodes from suggested-question gap cou…
balloon72 Jul 11, 2026
b688a26
fix(path): prefer full-token label matches when resolving path endpoi…
CJNA Jul 11, 2026
0d0e578
test(cli): graph.json node ids are portable across checkout paths (#1…
safishamsi Jul 11, 2026
091f609
fix(build): never prune a re-extracted source in build_merge (#1796)
erichkusuki Jul 11, 2026
0efb2a4
docs: point all website links at graphify.com
safishamsi Jul 11, 2026
591da76
fix(watch): require deletion evidence before evicting a missing sourc…
CJNA Jul 11, 2026
71d7ab9
fix(build): merge markdown quick-scan doc node into its semantic _doc…
jerp86 Jul 12, 2026
da71f82
fix(querylog): make the query log opt-in, off by default (#1797)
adam-pond-agent Jul 12, 2026
eec7a01
docs(changelog): finalize 0.9.13 notes and 0.9.12 section
safishamsi Jul 12, 2026
373bc8e
fix(sln): keep Visual Studio solution-folder node ids relative (#1789)
safishamsi Jul 12, 2026
90b545c
fix(cli): survive early pipe close (#1807); skip .nox venvs (#1804)
safishamsi Jul 12, 2026
5f57c46
fix(detect,hooks): honor .git/info/exclude; guard worktrees (#1810, #…
safishamsi Jul 12, 2026
a46eee4
fix(export): coerce non-scalar attrs in graphml; harden pipe-close flush
safishamsi Jul 12, 2026
579ba1d
fix(cache): scope semantic cache writes to extracted files (#1757)
TPAteeq Jul 12, 2026
da9616d
fix(cache): scope the incremental checkpoint write too (#1757 followup)
safishamsi Jul 12, 2026
6ca8604
fix(query): dedup seeds by label to stop generic-symbol flooding (#1766)
safishamsi Jul 13, 2026
c3a42a3
fix(extract): write AST cache to CWD, decoupled from the key anchor (…
safishamsi Jul 13, 2026
94d3099
fix(cache): stat-index must follow the cache location, not the key an…
safishamsi Jul 13, 2026
98c7ec0
fix(export): close stored XSS + broken neighbor links in graph.html (…
safishamsi Jul 13, 2026
8a5287a
fix(detect): honor nested .gitignore/.graphifyignore files below the …
Mohak-Agrawal Jul 13, 2026
7ca43ab
test(detect): harden nested-ignore tests (#1847 followup)
safishamsi Jul 13, 2026
6eb5923
fix(watch): forward community_labels to to_json in _rebuild_code
Jul 13, 2026
961b78e
test(watch): assert update writes community_name (#1855 followup); ch…
safishamsi Jul 13, 2026
cfc7cf2
fix(cache): resolve FileSlice via unit_path in checkpoint allowlist (…
safishamsi Jul 13, 2026
20405a8
fix(dedup): report fuzzy count in summary when exact_merges is 0 (#1857)
thejesh23 Jul 13, 2026
e32be08
fix(detect): legacy-manifest branch must `!=`-compare mtime to catch …
thejesh23 Jul 13, 2026
3684078
docs(changelog): record #1862 and #1860 in the unreleased 0.9.16 section
safishamsi Jul 13, 2026
fb4d452
fix(detect): scope nested ignore patterns to their own subtree (#1873)
Alwyn93 Jul 14, 2026
40eae3c
test(watch): pin update-with-nested-gitignore (#1880); changelog for …
safishamsi Jul 14, 2026
1aca158
fix(cargo): honor `package = "..."` rename when resolving internal de…
thejesh23 Jul 13, 2026
4ac5f07
fix(watch): preserve semantic edges of re-extracted sources (#1865)
xor-xe Jul 13, 2026
2210d69
docs(changelog): record #1865 and #1858 in the unreleased 0.9.16 section
safishamsi Jul 14, 2026
70bc9ca
fix(dedup): let the defining file win an ID collision, and warn only …
bchan84x Jul 13, 2026
fd54f0e
fix(dedup): deterministic collision survivor + bare-file definer (#18…
safishamsi Jul 14, 2026
2795a18
fix(exclude): persist --exclude so rebuilds re-apply it (#1886)
safishamsi Jul 14, 2026
060dd63
fix(extract): resolve Python module-qualified calls to calls edges (#…
safishamsi Jul 14, 2026
f80e4fa
test(watch): pin update discovers newly-added files/dirs (#1837)
safishamsi Jul 14, 2026
4f6106a
fix(cli): send missing-skill warning to stderr
Mzt00 Jul 14, 2026
8361a81
fix(extract): recognize uppercase TypeScript
xkam7ar Jul 14, 2026
5c0a04c
fix(extract): filter Kotlin builtin/stdlib types from references graph
kebwlmbhee Jul 14, 2026
e1b8a17
docs(changelog): record #1881, #1876, #1893 in the unreleased 0.9.16 …
safishamsi Jul 14, 2026
b3dc15b
fix(extract): close residual absolute-path/username leaks (#1899)
safishamsi Jul 14, 2026
a4ab6ed
fix(llm): reconcile dispatched vs returned files in semantic extract …
safishamsi Jul 14, 2026
a0e4a1c
docs(changelog): date 0.9.16 for release
safishamsi Jul 14, 2026
75b7279
docs(readme): point star-history at Graphify-Labs org; X handle to @g…
safishamsi Jul 14, 2026
ef8771e
fix: correct postgres install hint to graphifyy (#1906); classify .sk…
safishamsi Jul 14, 2026
107cea0
fix(serve): drop German and Romance question stopwords from query ter…
safishamsi Jul 14, 2026
876c043
fix(export): prune orphaned Obsidian notes on re-export (#1896)
safishamsi Jul 14, 2026
f2a6139
Fix spurious hooksPath warning and register graph.json merge driver
safishamsi Jul 14, 2026
0cacd70
fix(llm): drop out-of-scope nodes from the merged extraction result (…
safishamsi Jul 14, 2026
b1e313c
fix(cli): stamp freshly-extracted semantic docs in the manifest (#1897)
safishamsi Jul 14, 2026
43b2aff
chore: open 0.9.17 with 8 batch fixes (#1895 #1897 #1902 #1907 #1896 …
safishamsi Jul 14, 2026
75cf56b
fix(detect,cli): excluded files are pruned from graph and manifest, n…
safishamsi Jul 15, 2026
49df466
fix(sql): recover CREATE FUNCTION/PROCEDURE from tree-sitter ERROR no…
safishamsi Jul 15, 2026
0d78391
docs(changelog): record #1908/#1909 and #1910 in unreleased 0.9.17
safishamsi Jul 15, 2026
2851f31
fix: treat .cjs (explicit CommonJS) as a code extension
Kookwater Jul 15, 2026
76f5bc9
fix(watch): stop AST-quick-scanning docs that already have semantic n…
safishamsi Jul 15, 2026
d916c61
fix(cache): stop persisting dangling edges/hyperedges in the semantic…
safishamsi Jul 15, 2026
b7ddee3
fix(extract): make --mode deep effective over a warm cache; add --for…
safishamsi Jul 15, 2026
1c280e4
docs(changelog): record #1894(PR-1) #1916 #1915 #1912 in unreleased 0…
safishamsi Jul 15, 2026
ff999a9
perf(serve): collapse T+1 per-term scoring passes into one traversal
Sirhan1 Jul 14, 2026
c0875cc
test(serve): rebase #1900 test onto #1918 _score_query API; bench new…
safishamsi Jul 15, 2026
19c496d
fix(build): make _semantic_id_remap idempotent to stop id accretion (…
safishamsi Jul 15, 2026
cb96bda
fix: preserve semantic layer, stamp hyperedges, PHP namespaces, ignor…
safishamsi Jul 15, 2026
ecf1416
docs: cut 0.9.17 changelog and credit @zuwasi for Amp platform suppor…
safishamsi Jul 16, 2026
5840d0b
fix(pg_introspect): emit FK DDL before function stubs so unparseable …
sekmur Jul 15, 2026
0d018b4
fix(cache): key semantic cache on the extraction prompt (#1939)
SinghAman21 Jul 16, 2026
84638cb
chore: begin 0.9.18 development cycle
safishamsi Jul 16, 2026
ee74d80
fix(merge-chunks): validate untrusted subagent chunk JSON before merging
TPAteeq Jul 16, 2026
3305ef1
fix(merge-chunks): coerce non-numeric chunk token counts (follow-up t…
safishamsi Jul 16, 2026
fcc01db
fix(extract): don't force-write a partial graph over a complete one
TPAteeq Jul 16, 2026
0f93685
fix(extract): extend the incomplete-build shrink guard to the --no-cl…
TPAteeq Jul 16, 2026
7d53a02
fix(extract): fail closed on malformed existing graph + honor walk_er…
safishamsi Jul 16, 2026
f38e980
fix(io): write graph.json and manifest.json atomically
TPAteeq Jul 16, 2026
16fe8f3
fix(io): route the remaining graph/manifest writers through the atomi…
safishamsi Jul 16, 2026
90dcb6a
fix(cache): don't promote truncated LLM chunks to the semantic cache …
TPAteeq Jul 16, 2026
479f1af
fix(cache): mark files partial on empty-parse truncation (follow-up t…
safishamsi Jul 16, 2026
741876b
fix(llm): downgrade unverifiable code-typed semantic nodes to UNVERIFIED
TPAteeq Jul 16, 2026
8bc477f
fix(llm): move the unverifiable-node flag to a real, consumed field (…
safishamsi Jul 16, 2026
b193607
docs: record the #1949-#1953 integrity-cluster fixes in the 0.9.18 ch…
safishamsi Jul 16, 2026
dea6ec0
fix(extract): remove dangling alias import edges
oleksii-tumanov Jul 17, 2026
5a480a8
fix(merge-chunks): fail when no chunk validates
oleksii-tumanov Jul 16, 2026
5163a62
fix(watch): widen semantic-doc gate to the doc-shaped file_type subse…
alphanury Jul 16, 2026
dd0f8ec
fix(build): coerce null/malformed edge weight to the 1.0 default (#1960)
safishamsi Jul 17, 2026
9ee151d
fix(detect): spare genuine source from the Stage 1 sensitive-dir drop…
alphanury Jul 16, 2026
431dd18
fix(detect): keep .tfvars out of the graph under the sensitive-dir ca…
safishamsi Jul 17, 2026
824cac7
fix(detect): clear stale semantic_hash for dispatched-but-omitted fil…
alphanury Jul 16, 2026
709b208
test(cache): pin the #1948 x #1950 interaction (truncated doc's hash …
safishamsi Jul 17, 2026
be80ee8
fix(extract): anchor source_file on the scan root, not the --out dir …
SinghAman21 Jul 16, 2026
8cee776
docs: cut 0.9.18 changelog and document the incomplete-build refusal …
safishamsi Jul 17, 2026
689dd6c
feat(hook): opt-in strict PreToolUse guard + stop crying wolf (#1840)
safishamsi Jul 17, 2026
995508c
fix(cache): key file_hash stat-index memo by salt, not absolute path …
safishamsi Jul 18, 2026
a038684
Fix DreamMaker parent-relative #include paths (lstrip charset misuse)
Osamaali313 Jul 17, 2026
a86666a
fix(prs): decode gh/git/claude output as UTF-8, not the Windows cp125…
LukeTheoJohnson Jul 17, 2026
d56b70a
fix(resolution): repoint cross-extension re-exports without leaking a…
alphanury Jul 17, 2026
aad5955
fix(detect): keep ignore globs within path segments
oleksii-tumanov Jul 17, 2026
f17e2c5
fix: add --no-gitignore extraction opt-out
Mzt00 Jul 17, 2026
704e687
test: update watch ignore loader mock
Mzt00 Jul 17, 2026
caa6f9e
fix(extract): persist --no-gitignore instead of clobbering it (follow…
safishamsi Jul 18, 2026
5b8480a
docs: changelog entries for the #1989/#1971/#1975/#1978/#1980 fixes
safishamsi Jul 18, 2026
fb992ce
docs: cut 0.9.19, document install --strict, fix #1814 credit
safishamsi Jul 18, 2026
b77a01e
docs: correct #1971 credit (@Mzt00 fix, @JensD-git report; not @mzt006)
safishamsi Jul 18, 2026
9bf14a4
docs: rebrand the built-on-graphify section to graphify Enterprise + …
safishamsi Jul 18, 2026
e5a4b51
fix(extract): rewrite alias re-export targets
oleksii-tumanov Jul 17, 2026
faa0ac2
fix(install): emit hook exe paths with forward slashes so Git Bash do…
varuntej07 Jul 18, 2026
0224bca
fix(install): fire the search nudge on Claude Code's Grep tool, not j…
mdshzb04 Jul 18, 2026
0816630
fix(cache): anchor semantic cache writes to cache_root so --out round…
mdshzb04 Jul 18, 2026
a30e933
chore: begin 0.9.20 cycle + changelog for #1986/#1987/#1990/#1991/#1983
safishamsi Jul 18, 2026
4f9752c
chore: point project URLs at the canonical Graphify-Labs/graphify repo
safishamsi Jul 18, 2026
6534a87
ci: add PyPI trusted-publishing workflow (publish.yml)
safishamsi Jul 18, 2026
edec9ea
docs: date 0.9.20 for release
safishamsi Jul 18, 2026
c105633
fix: drop collapsed import self-loops
Endogen Jul 19, 2026
220a675
fix(llm): fall back to OLLAMA_HOST when OLLAMA_BASE_URL is unset
kimdzhekhon Jul 19, 2026
b35898a
fix(extract): initialize detection for pathless Postgres
oleksii-tumanov Jul 19, 2026
c57d571
fix(extract): honor persisted excludes on re-extract
oleksii-tumanov Jul 19, 2026
fab28ab
fix(extract): resolve alias re-exports and imports through barrels to…
HerenderKumar Jul 19, 2026
868f75d
fix(llm): OLLAMA_HOST fallback in detect_backend + default port (foll…
safishamsi Jul 20, 2026
e7ad693
fix(extract): don't guess an ambiguous barrel re-export (follow-up to…
safishamsi Jul 20, 2026
78a1b80
chore: begin 0.9.21 cycle + changelog for #1940/#2027/#2030/#2037/#1983
safishamsi Jul 20, 2026
94189ba
fix(watch): correct semantic-node eviction/preservation on update
safishamsi Jul 20, 2026
6a56763
fix(build): form-insensitive prune + scan-root marker (#2012)
safishamsi Jul 20, 2026
9c2e0fc
fix(skillgen): stamp only produced-output files in the update runbook…
safishamsi Jul 20, 2026
86fd1e4
chore: changelog for 0.9.21 data-integrity fixes (#2051/#2056/#2014/#…
safishamsi Jul 20, 2026
f6974ea
fix(watch): don't evict remote-source nodes after URL slash-collapse …
safishamsi Jul 20, 2026
6bbc9d1
chore: bump to 0.9.22; date 0.9.21 changelog
safishamsi Jul 20, 2026
b890ca6
fix(serve): reorder except clauses so the corrupted-graph message is …
kimdzhekhon Jul 19, 2026
67608c2
test(serve): pin generic ValueError message against clause-order regr…
kimdzhekhon Jul 19, 2026
db410d0
fix(detect): stop silent data loss from env-dir pruning and absolute-…
safishamsi Jul 20, 2026
1f4e3b2
fix(cli): wire god-nodes subcommand + accept --output alias on extrac…
safishamsi Jul 20, 2026
f1405dd
fix(extract): nested types get a contains edge from the enclosing typ…
safishamsi Jul 20, 2026
fecf9aa
fix(build): disambiguate colliding file-node labels for discovery (#2…
safishamsi Jul 20, 2026
8ce9f6b
docs: changelog for the 0.9.22 data-integrity/correctness batch
safishamsi Jul 20, 2026
5b05f0d
fix(cli): disambiguate file labels on the --no-cluster extract path t…
safishamsi Jul 20, 2026
abff1b1
docs(readme): surface the graphify.com waitlist above the fold
safishamsi Jul 20, 2026
b96effd
fix(install): uninstall must not delete a user's ### graphify H3 sect…
safishamsi Jul 21, 2026
b194301
fix(path): deterministic route + honest edge relation, not fabricated…
safishamsi Jul 21, 2026
87c8704
fix(label): --no-label placeholders no longer permanently suppress re…
safishamsi Jul 21, 2026
cdeba1d
fix(build): ghost-merge keys on full source_file, not bare basename (…
safishamsi Jul 21, 2026
bb46763
fix(extract): resolve Python imports regardless of scan root (src-lay…
safishamsi Jul 21, 2026
afa7c0d
chore: bump to 0.9.23; changelog for #2062/#2074/#2073/#2068/#2072; d…
safishamsi Jul 21, 2026
10b7105
fix(extract): harden #2072 src-layout resolution (adversarial-review …
safishamsi Jul 21, 2026
1fbc623
fix(query): report real call-site lines + stop silent query truncatio…
safishamsi Jul 21, 2026
c83085c
docs: date 0.9.23 for release
safishamsi Jul 21, 2026
abb85cc
docs(readme): troubleshoot an older graphifyy shadowing `uv run` (#1540)
HerenderKumar Jul 21, 2026
bb8f5bd
docs(cli): surface --code-only in the extract usage and README (#2071)
HerenderKumar Jul 21, 2026
a59abaf
docs: --code-only is an extract flag, not a skill flag (follow-up to …
safishamsi Jul 21, 2026
fef9dbb
feat(serve): honor a token_budget on get_neighbors/get_community
ojmucianski Jul 21, 2026
deb2620
feat(serve): announce get_neighbors/get_community truncation at the t…
safishamsi Jul 21, 2026
4ace951
fix: preserve calls edge direction in graphify query output
Yyunozor Jul 21, 2026
53d0f88
test(serve): guard + direction tests for dangling _src/_tgt (follow-u…
safishamsi Jul 21, 2026
e32c9f4
chore: bump to 0.9.24; changelog for #2080/#2069/#2075/#2085
safishamsi Jul 21, 2026
0ef452c
fix: group cut connections by file on explain for high-degree nodes
Yyunozor Jul 21, 2026
4c759b6
fix(cli): deterministic tie-break for grouped explain tail (follow-up…
safishamsi Jul 22, 2026
cc70085
fix(extract): resolve calls edges through an aliased Python import (#…
Yyunozor Jul 21, 2026
8c5f585
test(extract): external-alias negative + warm-cache coverage for #208…
safishamsi Jul 22, 2026
7116a6f
fix(llm): pin claude-cli output to a JSON schema when supported (#2076)
Yyunozor Jul 21, 2026
16315f1
fix(llm): parse claude-cli structured_output, not the prose result fi…
safishamsi Jul 22, 2026
5a4b207
fix(dedup): preserve same-source node attributes
Synvoya Jul 22, 2026
866d503
fix(dedup): order-independent gap-fill, source_file gate, _origin/Non…
safishamsi Jul 22, 2026
82c46e5
docs: changelog for #2093/#2102/#2095/#2094 (0.9.24)
safishamsi Jul 22, 2026
56c3d94
fix: TS/JS object-literal repository methods get their own graph node
nn-tmg Jul 22, 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
106 changes: 106 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
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
security-scan:
# The dev deps include bandit and pip-audit. Run them in CI so a new
# HIGH-severity finding or vulnerable dependency is caught on the PR that
# introduces it, rather than at the next manual audit.
# Non-blocking for now (continue-on-error) to avoid breaking CI on
# pre-existing findings; remove continue-on-error after the initial
# cleanup pass.
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6

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

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

- name: bandit (static security analysis)
continue-on-error: true
run: uv run --frozen bandit -r graphify -ll

- name: pip-audit (dependency vulnerabilities)
continue-on-error: true
run: uv run --frozen pip-audit --strict
55 changes: 55 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Publish to PyPI

# Publishes graphifyy to PyPI via OpenID Connect (trusted publishing) — no API
# token or password. Fires when a GitHub Release is published (i.e. after
# `gh release create ... --latest`), builds the sdist + wheel, guards that the
# package version matches the release tag, then uploads with an OIDC token.
#
# One-time PyPI setup (Manage project -> Publishing -> Add a GitHub publisher):
# Owner: Graphify-Labs
# Repository: graphify
# Workflow name: publish.yml
# Environment name: pypi
on:
release:
types: [published]
# Manual re-run escape hatch (still requires the release tag to be checked out).
workflow_dispatch:

permissions:
contents: read

jobs:
publish:
name: Build and publish graphifyy
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/project/graphifyy/
permissions:
id-token: write # REQUIRED: mint the OIDC token PyPI verifies. Nothing else.
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v6

- name: Build sdist + wheel
run: uv build --sdist --wheel

- name: Guard — package version must match the release tag
if: github.event_name == 'release'
run: |
VERSION=$(grep -m1 '^version = ' pyproject.toml | sed -E 's/^version = "(.*)"/\1/')
TAG="${GITHUB_REF_NAME#v}"
echo "pyproject version: $VERSION | release tag: $TAG"
if [ "$VERSION" != "$TAG" ]; then
echo "::error::pyproject version ($VERSION) does not match release tag ($TAG); refusing to publish."
exit 1
fi

- name: Twine metadata check
run: uvx twine check dist/*

- name: Publish to PyPI (trusted publishing)
uses: pypa/gh-action-pypi-publish@release/v1
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
27 changes: 27 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,30 @@ 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/

# macOS Finder metadata
.DS_Store
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)
Loading