全域文件建图,一站式代码数据检索
116.7k
11.3k
394
1.7k
1.6k
203
为graphify打分
给出您宝贵的评分:
graphify
多类型文件知识图谱技能
GitHub Trend · Star / Watch / Fork
趋势分享图
手机端可长按上方图片保存到相册,或点击「下载/分享」分享到微信
使用 graphify,你可以:
适配多款AI编码工具的辅助技能,可将代码、数据库脚本、文档、图片、视频等各类文件构建可检索知识图谱,统一整合应用、数据库与基础设施信息。
用户评论 (0)
0.0
(0 评分)
5星
0
0%
4星
0
0%
3星
0
0%
2星
0
0%
1星
0
0%
Github热门的Issue
2026年05月02日
2026年04月07日
2026年04月21日
Github最新的讨论区
2026年08月16日
2026年07月15日
2026年07月14日
2026年07月13日
Github最新Release版本
最新版本
v0.9.53
2026年08月30日
- Fix: a batch of cross-language inheritance-edge corrections (thanks @Synvoya): JavaScript
class X extends Ynow emits aninheritsedge (#1790); PHP interfaces, enums, and traits are captured as class-like nodes with their heritage (#1791); Scalatraitdeclarations become class-like nodes (#1792) and qualifiedextends/withbases resolve to the tail type (#1794); a qualified Kotlin supertype resolves to its tail type instead of the package head (#1793); a C# interface extending an interface is classified asinherits, notimplements(#1817); and a Go interface type-set constraint no longer emits a spuriousembedsedge (#1818). - Feature: Robot Framework
.robot/.resourcefiles are now extracted (optional[robot]extra) — suites, test cases, user keywords, keyword-call edges, and resource/library imports, with case/space/underscore-insensitive keyword resolution (#3192, thanks @nshiveg). - Fix: chat-template control tokens are now defanged by form (
<|…|>,[INST]/[SYSTEM]) rather than an enumerated few, closing a prompt-injection gap for attacker-chosen tokens (e.g.<|eot_id|>); legitimate content is untouched (#3183, thanks @abhay-codes07). - Fix:
graphify watch/updatenow preserves an authored markdown link whose target node is still live under a different spelling, extending the #3190 reconcile without loosening the deleted-target gate (#3190, thanks @logan683). - Fix: a semantic node is no longer silently dropped when a run did not actually re-extract the semantic tier — an unverified per-source shrink arms the shrink guard and re-queues the source next run (#3203, thanks @hopstreax).
- Fix: the git hook-guard now detects a search command only in an executed position, not when it merely appears in a comment or a quoted message, eliminating false read-nudges (#3121, thanks @abhay-codes07).
- Fix:
graphify installnow backs up a divergedSKILL.mdbefore overwriting and prints an actionable warning, instead of silently clobbering user edits (#3144, thanks @abhay-codes07). - Fix: the
GRAPH_REPORTheadline community counts now reconcile with what is actually rendered, and the knowledge-gaps threshold matches its own label (#3148, thanks @abhay-codes07). - Fix: the wiki export now notes when a god-node relation group was truncated instead of silently showing a capped list (#3127, thanks @abhay-codes07).
v0.9.52
2026年08月30日
- Fix:
graphify watch/updateno longer silently drops a Markdown link to a semantic-backed document during a code-only rebuild — authored[[wikilink]]references are repointed onto the target file's representative node, preserving links to the semantic tier without resurrecting a deleted target (#3190, thanks @logan683). - Fix: T-SQL routines that parse to tree-sitter ERROR nodes —
CREATE OR ALTER, thePROCshorthand, and bracket-delimited names like[dbo].[Get Widgets]— are now recovered by name over a comment/string-masked copy, so they appear in the graph without commented-out or dynamic SQL fabricating nodes (#3164, thanks @egarcia74). - Fix:
graphify --helpnow lists theprsandprovidercommands and the export formats it actually supports (thanks @SyedFahad7). - Fix: corrected the
deepseek-v4-flashpricing entry and thebuild_mergedocstring (which wrongly claimed it saved the graph; callers persist) (thanks @adrianengkh). - Fix: Razor
@inject/@usingin.razor/.cshtmlfiles now flow through the scope-aware C# type resolver, so an injected service type resolves to its cross-file definition; an external/undeclared type fabricates nothing (partially addresses #3187 — a bare inject of a file-scoped-namespace type still dangles, follow-up) (thanks @hopstreax). - Fix: the MCP
prstools (list_prs,triage_prs,get_pr_impact) now surface a genuine failure as an MCP error (isError) instead of success text, while an empty-but-successful result is unaffected (thanks @noQbot). - Fix: the MCP
get_nodetool now resolves a node through the same tiered resolver asget_neighbors, so the two agree deterministically instead ofget_nodereturning an iteration-order substring match (thanks @noQbot). - Fix: a
graphify install --project(committed/shared) install now emits a baregraphifyhook command resolved at run time instead of pinning the absolute interpreter path, so the committed hook no longer churns across machines; the global install still pins the absolute path (thanks @davidbhoward). - Fix: a PHP
new Foo()now emits acallsedge to the constructed class (namespaced names resolve to the last segment), completing the object-creation modeling across C# (#2998), TypeScript (#3135), and now PHP; dynamic (new $var()),self/static/parent, and unknown external constructions fabricate nothing (#3115, thanks @abhay-codes07). - Fix: a method call through a field whose type is declared on an ancestor class now resolves from a subclass — the field-type lookup walks the inheritance chain (per-file for Java/C#, cross-file for Java/Objective-C), cycle-safe and without fabricating edges (#3151, thanks @abhay-codes07).
- Fix: the Objective-C field-to-type table is now re-keyed alongside the node-id rewrites, so
self.field/obj.fieldmethod calls still resolve aftergraphify updatenormalizes ids (#3150, thanks @abhay-codes07). - Fix: TypeScript type-only imports (
import type { T } from './m') no longer manufacture false import cycles; the type-only edge is marked and excluded from cycle detection while a mixedimport { type A, B }keeps its real value-import edge (#3123, thanks @abhay-codes07). - Fix: an
import(...)used as a call type-argument (f<typeof import('mod')>()) no longer causes declarations after it to be dropped; the construct is normalized before parsing with source locations preserved (#3185, thanks @hopstreax).
v0.9.51
2026年08月28日
- Fix: the incomplete-build shrink guard now stays armed when a chunk came back hollow, unparseable, or omitting files, so a run that silently lost content can no longer overwrite the existing graph with a smaller one; a complete run and a retry-recovered chunk are unaffected, and
--allow-partialstill overrides (#3105, thanks @abhay-codes07). - Fix:
graphify extract --force --code-onlynow fully rescans code (instead of skipping unchanged files and keeping stale import/alias resolution) while still carrying the existing document/semantic tier forward (#3125, thanks @hopstreax). - Fix: a hyperedge carried from a prior
graph.jsonnow has its members routed through the dedup survivor remap, so it no longer dangles when one of its members is merged away; an unresolvable member is dropped gracefully (#3102, thanks @abhay-codes07). - Fix: the cache's atexit stat-index flush no longer recreates a
graphify-out/tree that was deleted during the run, so a removed corpus stays removed (#2974, thanks @abhay-codes07). - Fix: Leiden clustering canonicalizes undirected edge endpoints before sorting, so community assignments no longer drift across builds or machines from networkx yielding an edge's endpoints in a different order (thanks @ErichKinuya).
- Fix: a TypeScript/JavaScript
new Foo()now emits acallsedge to the constructed class (member, chained, and generic forms), so constructor usage is visible; built-in globals likenew Map()/new Promise()are not fabricated (#3116, thanks @hopstreax). - Fix: an Elixir function whose only clause carries a
whenguard (def foo(x) when is_integer(x), do: ...) is now extracted, not dropped; multi-clause, multi-condition guards, anddefpare handled (#3111, thanks @santhiprakash). - Fix: Common Lisp node ids are now derived from the full path stem like every other extractor, so two same-basename
.lispfiles in different directories no longer collide on merge (thanks @guitelesc). - Perf: Leiden clustering now calls the
graspologic_nativebinding directly instead of importing the fullgraspologicpackage, avoiding its heavy import chain (umap / pynndescent / numba JIT); clustering output is unchanged, and it falls back to thegraspologicwrapper and then NetworkX Louvain when the native binding is absent (#3104, thanks @Mohammad-Palla). - Docs: the README now documents the git workflow for keeping the graph in sync — commits and branch switches rebuild automatically via the installed hooks, while
git pull/git mergeneed a manualgraphify update .(thanks @Mohammad-Palla).
v0.9.50
2026年08月26日
- Fix: Ruby methods whose names end in
!,?, or=now keep distinct node ids, sosaveandsave!(orfooandfoo=) no longer collide into one node; the label keeps the raw spelling and member-call resolution still matches (#3077, thanks @hopstreax). - Fix: a Ruby call on a qualified constant receiver (
ActiveRecord::Base.transaction) now matches the receiver's full constant path, so it no longer binds to an unrelated lone class namedBase; an edge is emitted only on a single unambiguous match (#3078, thanks @rohit-jsfreaky). - Fix: a CommonJS member export wrapped in a higher-order function (
exports.x = wrap(fn),module.exports.y = onCall({...}, handler)) is now captured, reaching through the wrapper to the function it wraps without fabricating the wrapper as the export's identity (#3035, thanks @hopstreax). - Fix:
graphify merge-graphsnow offsets each input's community ids so community 0 of one repo no longer fuses with community 0 of another; within-input structure is preserved and the original id is kept inlocal_community(#3014, thanks @santhiprakash). - Fix: a
.graphify_rootmarker written by Windows PowerShell (which prepends a UTF-8 BOM) no longer breaks hook rebuilds or silently mis-roots a scan; PowerShell now writes the marker BOM-less and every reader decodes BOM-tolerantly (#3028, thanks @rohit-jsfreaky). - Perf: ignore-pattern evaluation no longer builds a
Pathand callsrelative_toper pattern per file — it computes the relative path lexically in string space, parses each pattern once into a bounded process cache, and memoizes per-entry work; ignore decisions are unchanged (differential-fuzz verified) and a pattern-heavy monorepo scans dramatically faster (#2226, thanks @Azeem1985). The**-aware matcher was also lifted out of a per-call cache closure that leaked a reference cycle each call. - Feature: C# and TypeScript enum members now each emit a graph node with a
case_ofedge to their enum (matching the existing Java/Kotlin/Swift enum handling), so an enum case is visible as a member; explicit and implicit values,const enum, and quoted TypeScript member names are all handled and no built-in types are fabricated (#3063, #3064, thanks @durmazoguzhan). - Fix:
graphify watchno longer re-triggers on its own reads — read-only inotify events (opened,closed_no_write, emitted by the watcher's own AST rebuild) are dropped, while close-after-write and create/modify/move/delete still trigger; a no-op on the macOS/Windows backends that never emit them (thanks @Azeem1985). - Fix:
pip install graphifyy[postgres]now carries thetree-sitter-sqlgrammar the introspection path needs, and a missing or ABI-incompatible grammar raises an actionable error instead of silently returning zero nodes (thanks @Azeem1985).
v0.9.49
2026年08月24日
- Feature:
graphify merge-graphsnow links a type declaration that two repos share — same fully-qualified namespace and name, from different repos — with asame_type_asedge, so a shared contract type is navigable across the repo boundary; two unrelated types that merely share a short name are not linked (#3007, thanks @durmazoguzhan). - Feature: C# properties now emit a member node per property, so a property is visible as a class member alongside fields and methods; the property's type still emits its references edge and no built-in types are fabricated (#3006, thanks @durmazoguzhan).
- Fix: when a C/C++/Objective-C declaration and its definition merge into one node, the node now points at the definition site (the implementation body) instead of the header prototype; the pick is deterministic regardless of file order, and a declaration with no definition keeps its own site (#2990, thanks @winesoft-namjin-yun).
- Fix: a bash command substitution on the right of an assignment (
x=$(fn)) now emits acallsedge like a bare$(fn), while argument-position and process substitutions stay suppressed (#2978, thanks @akshitj11). - Fix: a SQL
CREATE TABLEwrapped in aBEGIN/COMMITtransaction is now extracted, not just top-level DDL (#2953, thanks @akshitj11). - Feature: C# object-creation expressions (
new Foo()) now emit acallsedge to the constructed type, so constructor usage is visible in the graph; built-in and out-of-corpus types are not fabricated and a qualified construction resolves against declared namespaces (#2997, thanks @durmazoguzhan). - Feature: when a C# interface has exactly one implementing class, its methods are now linked to that implementation with a
dispatches_toedge, so a call through an injected dependency reaches the implementation; guarded against false links (single implementer, single case-sensitively same-named method, both ends C#) (#3003, thanks @durmazoguzhan). - Fix: Zig methods declared on enums and unions (not just structs) are now extracted, along with the calls in their bodies (#2999, thanks @rajatnagda45).
- Fix: a Julia abstract type declared with a supertype (
abstract type Dog <: Animal end) is now extracted with itsinheritsedge instead of being dropped (#3000, thanks @rajatnagda45). - Fix: a Common Lisp
defclasswhose superclass lives in another file now keeps itsinheritsedge — the cross-file base is a sourceless stub that the corpus rewire collapses onto the real definition (#3001, thanks @rajatnagda45). - Fix: PowerShell
enumdefinitions and their members are now extracted as a real sourced node, so a[Color]type reference resolves to the enum instead of a phantom stub (#3002, thanks @rajatnagda45). - Fix: a semantic result with no nodes and no hyperedges is no longer cached and stamped into the manifest, so an empty or degenerate LLM reply for a file no longer freezes it out of future re-dispatch; an existing manifest carrying such a stamp is healed by re-queueing those files (#2927, thanks @hopstreax).
- Fix: fresh semantic results are now scoped to the files actually dispatched before they reach the graph merge, so a stray fragment the model misattributes to a non-dispatched file can no longer replace that file's prior contribution (this also silences the "skipped out-of-scope source_file" warning) (#2926, thanks @SinghAman21).
- Fix:
graphify extract --code-only --forceover an existing graph now preserves the document/paper/image semantic layer instead of dropping it; files deleted from disk are still pruned (#2923, thanks @santhiprakash). - Fix: a class that inherits from a built-in base (e.g. PHP
extends \Exception) no longer collapses onto a same-named class in another language, so a PHP+TypeScript monorepo stops growing a phantom cross-language inheritance edge / god node; same-language inheritance and user classes named like a built-in still link (#2812, thanks @ousamabenyounes). - Fix: the git post-commit hook now resolves graphify when it is installed as a
uv tool, by scanning the uv tool locations after the pin and launcher probes miss and verifying graphify is importable before adopting an interpreter, so the hook stops silently no-opping under that install (#2852, thanks @santhiprakash). - Fix: re-exporting into an Obsidian vault created before the ownership manifest existed now adopts graphify's own notes (recognized by their
graphify/frontmatter tag or community markers) instead of orphaning them beside a fresh generation (#2863, thanks @abhay-codes07). - Fix: the tsconfig/jsconfig alias and
baseUrlcaches are now cleared per extraction run, so an edit tocompilerOptions.pathsorbaseUrlis picked up on the nextgraphify watch/ MCP rebuild instead of resolving imports through a stale alias map for the life of the process (#2917, thanks @sashankh). - Fix: the C# extractor now emits
referencesedges for types used as generic arguments — both at call sites (repo.Get<User>(),services.AddSingleton<IFoo, Foo>()) and in field declarations (private List<Order> _orders) — so generic calls and field-injected dependencies are no longer invisible; built-in and type-parameter types are not fabricated (#2911, thanks @santhiprakash and @brobl2008). - Fix: oversized PDFs are now sliced through their text converter and their token count is estimated from the extracted text rather than the raw container, so a large paper no longer loses everything past the character cap or gets mis-sized by its binary bytes; slicing (including the adaptive-retry bisection) indexes the same extracted text the prompt carries (#2903, #2906, thanks @abhay-codes07).
- Fix: every text document type is now sliced when oversized, not just five suffixes, so a large
.qmd/.skill/.html/.yaml/.ymlis no longer silently truncated at the character cap (#2900, thanks @abhay-codes07).
v0.9.48
2026年08月21日
- Fix: a control character in a node label or id no longer aborts the whole export; the GraphML and Obsidian exporters scrub only the characters those formats forbid (tab, newline, and non-ASCII letters are preserved), and
graph.jsonand its byte-identity round-trip are untouched (#2897, thanks @abhay-codes07). - Fix:
graphify update/label/cluster-onlyno longer leave a large graph without agraph.html; the aggregated community view renders instead of raising, a failed render preserves the previous file, and a missinggraph.htmlis regenerated on the no-change fast path without reclustering (#2853, thanks @oleksii-tumanov). - Feature:
graphify extract --no-dedupskips the fuzzy near-duplicate merge on build and incremental merge, for operators who would rather keep distinct symbols that fuzzy-matched; exact-id uniqueness is unaffected and the flag arms the shrink guard so a surprising node drop is refused loudly (#2881, thanks @rajarshidattapy). - Fix: a response that parses but carries no symbols (a "hollow" reply) is now retried on the same chunk with backoff instead of being bisected like a truncated one, so an overwhelmed backend no longer wastes calls re-splitting a chunk it already answered emptily; on persistent hollow the files are marked partial and retried next run, and
GRAPHIFY_MAX_RETRY_DEPTH=0disables the hollow retry too so a chunk costs exactly one call (#2880, thanks @rajarshidattapy). - Fix: reasoning-first models that narrate before emitting JSON (or fence the answer) no longer have their chunk dropped; the parser recovers the JSON fragment from mixed text, preferring an object that carries the extraction keys so narration braces or a schema restatement cannot shadow the real answer, and gating on the sanitized content so a bare-string id sketch cannot either (#2882, thanks @rajarshidattapy).
- Fix: a data-shaped JSON that the extractor deliberately declines is no longer counted as a failed extraction, so it is recorded in the incremental manifest and stops being re-processed on every run; genuine failures are still reported (#2879, thanks @rajarshidattapy).
- Fix: C++ nested class/struct types and their members are now kept in the graph instead of being silently dropped, and C++/CLI sources (
ref class,gcnew,^/%handles) are normalized to plain C++ before parsing so tree-sitter no longer fabricates phantom symbols from the ERROR nodes it would otherwise produce (#2876, thanks @rajarshidattapy). - Fix: Obsidian-style
[[wikilinks]]now resolve vault-wide by basename when sibling resolution misses, so cross-folder links are no longer silently lost; resolution stays deterministic on ambiguous basenames (shallowest then lexicographic path) and sibling matches keep priority (#2875, thanks @BaeHyunJae).
v0.9.47
2026年08月19日
- Fix: extraction now bisects a file chunk on timeout instead of failing the whole chunk, so one slow file no longer drops its chunk-mates from the graph; recognized timeouts (subprocess, SDK, and botocore read/connect) route through the same bounded split-and-merge path as context-window-exceeded errors, and a single unsplittable file that times out is left unstamped and retried next run (#2866, thanks @hopstreax).
- Fix: the cache no longer collapses symlinks when keying files, so a symlink alias and its target get distinct identities and one no longer displaces the other from the graph on a warm cache; the detect-layer containment guard that resolves paths to block symlink escape is unchanged (#2832, thanks @oleksii-tumanov).
- Fix:
graphify extract --out <dir>no longer writes converted Office/Google-Workspace sidecars back into the scanned source tree; sidecar writes go through the cache root while the content hash stays anchored to the scan root, so a read-only or pinned checkout stays clean (#2787, thanks @hopstreax). - Fix: the git-hook out-of-project read guard no longer misclassifies a rooted-but-driveless path (
\foo\bar) as cwd-relative on Windows, where such a path resolves against the current drive root and is actually outside the project; POSIX behaviour is unchanged (#2795, thanks @abhay-codes07). - Fix: the partial-parse warning no longer ends with a hardcoded citation to the closed Kotlin-specific issue #2551 (which misdirected reporters of unrelated failures); it now reports the surviving symbol count so a total-loss file reads differently from a partially-recovered one (#2788, thanks @abhay-codes07).
- Fix: Obsidian export now keeps non-ASCII letters (Hangul, CJK, Cyrillic, accented Latin) in community tags instead of collapsing every non-Latin community to the same underscore tag, and the graph-view colour groups query the identical tag so colours match again (#2862, thanks @josh-leung-KR).
- Feature: JavaScript/TypeScript factory functions that assign callable members to a local object literal (
const api = {}; api.foo = fn) now keep those members in the graph — the API object is modeled beneath its factory and the assigned functions attach as methods, including arrow-function assignments and their intra-factory call edges. The owner is minted only for identifiers proven to be object-literal bindings in the enclosing function, so arbitrary receivers do not reintroduce the phantom-owner flood, and the factory'scontainsedge is emitted once no matter how many methods hang off the object (#2745, thanks @rajanpanth). - Fix:
graph.jsonfield order is now stable across a read-rebuild round-trip, so re-runninggraphify updateon an unchanged graph produces a byte-identical file instead of reshuffling node and link keys (#2582, thanks @C0KERNEL). - Fix:
graphify querynow names the graph it opened and its node count at the head of the answer (relative to the CWD when the graph is underneath it, absolute otherwise), so a query run from a parent project no longer silently answers from the wrong corpus with no indication which graph was used (#2789, thanks @abhay-codes07). - Fix: the
claudebackend no longer crashes withAttributeError: 'ThinkingBlock'when an extended-thinking response leads with a thinking block; the first text block is read instead (#2697, thanks @mdshzb04). - Fix:
graphify update/save_manifestno longer rewritesmanifest.jsontimestamps on a no-op run, sographify-out/stops showing as dirty (and stops producing a trailing graph commit) when nothing changed; a genuine change still updates and persists (#2838, thanks @hopstreax). - Fix: a C# 12 primary constructor's parameters are now walked, so
class Svc(IRepo repo)emits thereferencesedge toIRepoand calls throughreporesolve — previously the class silently dropped its dependency; built-in and type-parameter types are not fabricated (#2829, thanks @brobl2008). - Fix: AST-derived INFERRED edges now carry a rubric
confidence_scorekeyed to the relation (uses0.95,indirect_call/unresolved cross-filecalls0.85) instead of landing at the rubric-forbidden 0.5 or a flat 0.8; the INFERRED default moves 0.5→0.55 so every score-less INFERRED edge is on the discrete rubric set (#2813, thanks @abhay-codes07). - Fix: a legacy
graph.jsonthat stored a numeric edgeconfidence(from a pre-enum version) no longer warns once per edge on every incremental reload; the numeric value is normalized to theINFERREDtag with the original float preserved inconfidence_score(thanks @Trantor-develops).
v0.9.46
2026年08月18日
0.9.46
- Fix: node-id normalization is now caseless-stable for combining-mark sequences —
casefoldand NFKC don't commute, so a single pass leftnormalize_id(s) != normalize_id(s.casefold())for inputs like Greek ypogegrammeni followed by a combining accent; normalization now iterates casefold+NFKC to a fixpoint. Letter/digit-bearing ids are unchanged, so existing graphs are not re-keyed. - Fix: Java annotations now emit
referencesedges to their type — including class-literal arguments (@Repeatable(Foo.class),@Uses({A.class, B.class})) and annotation-member return types — so a container annotation is no longer a disconnected island; string/enum arguments are not mistaken for type references (#2426, thanks @oleksii-tumanov). - Fix:
graphify querytreats_as a token separator (like-), so an underscore-spelled query (user_service) matches a hyphenated label (user-service); coverage-scaling keeps the broader tokenization from surfacing unrelated single-token noise (#2473, thanks @nadiadatepe-eng). - Fix: the
post-checkouthook skips its rebuild when HEAD is unchanged (e.g.git checkout -bwith no start point), so creating a branch no longer triggers a full graph rebuild (#2421, thanks @nothariharan). - Feature: Markdown nodes now carry a
node_kind(pagevsheading) attribute so a docs corpus can be filtered by kind, and leading YAML frontmatter is parsed onto the page node as bounded, sanitized attributes; a#comment inside frontmatter is no longer mis-extracted as a heading (thanks @evanthomasgelders). Node ids are unchanged, so existing markdown graphs are not re-keyed. - Feature: Common Lisp
.lisp/.cl/.lsp/.asdextraction via tree-sitter-commonlisp (optional[commonlisp]extra) — packages, classes, functions, methods, generics, macros, variable definers, and same-file calls;opened/:used packages resolve cross-file (thanks @fade). - Fix: a
graphify querywhose node set fits the budget but whose edges push the total over now prints an honest "complete answer over budget" notice with the real size, instead of silently returning a payload several times the requested budget (and no longer advises raising the budget, which was the exact trigger); edges are still never dropped from a complete answer (#2784, thanks @AromalBiju1). - Fix: a
.gitignore/.graphifyignoresaved in a non-UTF-8 encoding no longer silently drops its rules (which let an explicitly-excluded directory get scanned anyway); the file is decoded UTF-8-first, then by a UTF-16 BOM, then the host codepage/latin-1, so the rule survives intact with a warning instead of being truncated (#2798, thanks @abhay-codes07). - Fix: when node dedup merges two nodes, any hyperedge that listed the merged-away node as a member now rewires that member to the survivor instead of silently dropping it, so a grouping no longer loses participants on dedup (#2805, thanks @abhay-codes07).
- Fix: pruning a source file now also sweeps the external-import placeholder nodes it strands at degree 0, instead of leaving them to accumulate in the node count,
GRAPH_REPORT.md, and exports; genuinely-isolated real nodes (which carry asource_file) are never touched (#2807, thanks @abhay-codes07). - Fix: when two edges connect the same node pair with different relations, the graph builder now keeps the more specific relation (
calls,imports,inherits, ...) instead of letting a genericreferences/uses/mentionsoverwrite it; previously a realcallscould be downgraded toreferencesand then dropped from the call graph (#2803, thanks @abhay-codes07).
v0.9.45
2026年08月17日
0.9.45
- Fix:
graphify install <platform>now advances the.graphify_versionstamp only for the platform it actually (re)writes, instead of stamping every installed platform as current; a platform whose skill content was left untouched keeps its old stamp so its staleness warning stays truthful (#2694, thanks @ousamabenyounes). This completes #2694 (the CLAUDE_CONFIG_DIR half shipped in 0.9.44). - Fix: an incremental rebuild no longer collapses the whole graph when the
.graphify_rootmarker records a subfolder while storedsource_filepaths are relative to the repo root; the marker is validated against the stored paths before it is trusted as their anchor, so a mismatched marker can't make every unchanged source look deleted (#2603, thanks @catpotd). A genuinely deleted source is still evicted, and incremental ids stay identical to a cold build. - Fix: a Go file that declares both an exported and an unexported symbol differing only by case (e.g.
Runandrun, which are distinct in Go's case-sensitive visibility rules) no longer collapses them onto one node id and drops one; the exported symbol keeps its stable id and the unexported one is disambiguated, so an intra-file call to the unexported symbol resolves locally instead of phantoming to another package (#2779, thanks @catpotd). Only the Go extractor's id assignment is affected; the shared id normalization is unchanged, so no other language's ids move. - Fix: loading a
graph.jsonthat contains a hyperedge with noidfield (the semantic extractor emits them and they persist verbatim) no longer crashes the incremental re-extract withKeyError: 'id'; id-less hyperedges are tolerated and retained (#2775, thanks @ousamabenyounes).
v0.9.44
2026年08月16日
0.9.44
- Feature:
graphify hook installreads a committed.graphifyrc(viz_node_limit=<int>) and bakes the visualization node limit into the generated git hooks, so a project-wide limit is shared via version control and survives hook regeneration;hook statusreports it (#2760, thanks @hopstreax). The baked value uses a${GRAPHIFY_VIZ_NODE_LIMIT:-<n>}default so an explicit per-run env var still wins, andhook statusdegrades gracefully on a malformed.graphifyrc. - Fix:
graphify install(Claude always-on) now writes the CLAUDE.md registration into$CLAUDE_CONFIG_DIRwhen that env var relocates the Claude profile, instead of always mutating the default~/.claude/CLAUDE.md(part of #2694, thanks @AromalBiju1). - Fix: a JS/TS inline or nested function expression — including a generator function expression (
function*(k){…}) — no longer fabricates an INFERREDindirect_callwhen one of its parameters/locals shares a name with an unrelated callable; the expression's own bindings now shadow the name (#2752, thanks @imagineers-tyler), completing the shadow family alongside catch/arrow/loop/external-import (#2757). - Fix: a git-tracked file that also matches a
.gitignorepattern (a committed file later added to.gitignore, or a force-added one) is no longer dropped from the corpus, matching git's own behavior of never un-tracking such a file;.graphifyignore/--excludestay authoritative and a non-git corpus is unaffected (#2759, thanks @NithishKumar04). Thegit ls-filesprobe is skipped entirely when no.gitignoreis in play, so ordinary corpora pay nothing for it. - Fix: doctest/Catch2 string-named test cases (
TEST_CASE("..."),SCENARIO,TEST_CASE_TEMPLATE), which tree-sitter-cpp drops as ERROR nodes, are recovered as callable nodes contained by the file (#2594, thanks @ousamabenyounes); a punctuation-only test name gets a distinct line-positional id instead of collapsing onto the file-stem id. - Fix:
graphify affectedresolves an absolute-path seed against the repo root derived from the graph's own location instead of the current working directory, so a blast-radius query with an absolute seed run from anywhere (an editor, a script) no longer silently returns nothing; a seed outside the root still misses cleanly (#2706, thanks @ousamabenyounes). - Fix: a lazy CommonJS
require(...)inside a function body (the idiom for breaking circular dependencies) now emits the sameimports_from/importsdependency edges as a top-level require, attributed to the enclosing function, instead of being silently dropped; a dynamicrequire(variable)is still skipped (#2700, thanks @rajanpanth). - Fix: a JS/TS identifier bound by an import whose target resolves outside the scanned corpus (e.g. a
lucide-reacticon) is now shadowed, so using it as a value no longer fabricates an INFERREDindirect_callonto an unrelated same-named callable elsewhere in the corpus; a relative/in-corpus import still resolves to its real target (#2757, thanks @phudayyy). - Fix: an OCaml qualified call
M.fto an external module (one not defined in the same file, e.g. Hardcaml'sReg_spec.create) no longer binds to a same-named locallet f— which produced a falsecallsedge and, when the caller was that localf, af -> fself-loop. External qualified calls are kept as a distinct target labelled by the full path; unqualified calls and calls into a locally-defined module still resolve locally, and cross-fileGeo.areastill collapses onto another file'sarea.