From 48d7c0e832cd2d67d86850e716ddea16df6238ea Mon Sep 17 00:00:00 2001 From: safishamsi Date: Sun, 4 Oct 2026 02:19:53 +0100 Subject: [PATCH] release: 0.9.75 Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 21 +++++++++++++++++++++ pyproject.toml | 2 +- uv.lock | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e7ef02ed3..ae95c619e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,27 @@ Full release notes with details on each version: [GitHub Releases](https://github.com/Graphify-Labs/graphify/releases) +## 0.9.75 (2026-10-04) + +Intra-class call binding across five languages, new language-structure coverage, and a batch of resolution/build/cache fixes. + +- Feature: `self`/`this`/`super` member calls now bind to the caller's own class chain instead of the file-wide last-definition, across **Python** (`self.`/`cls.`/`super()`, nearest ancestor in the in-file MRO) (#4011), **JavaScript/TypeScript** (`this.m()` to the caller's own class; `super.m()` fails closed since the `extends` chain is not known at that pass) (#4012), **Swift** (`self`/`super`, class vs struct/extension aware) (#4030), and **Ruby** (`self`-sends within the class chain, complementing the paren-less self-send extraction from 0.9.74) (#4031) — all thanks @Cintu07. Multiple-inheritance ties and unknown/external ancestors fail closed (no fabricated edge). +- Feature: four more language extractors gained structural coverage from @rajatnagda45 — **Zig** error-set declarations and their members (`case_of`) (#4025), **PHP** enum cases (pure and backed) with `case_of` edges (#4026), **Elixir** `defmacro`/`defmacrop`/`defguard`/`defguardp` definitions (#4027), and **Rust** `macro_rules!` definitions with local invocation resolution (std macros like `println!` fail closed, no fabrication) (#4028). +- Feature: three **Scala** type-reference fixes from @Faisal-Fayaz — file-scope `val`/`var` type annotations now emit `references` edges (#4036, #2054), `type` alias/definition right-hand sides are walked (including `opaque type` and match types) (#4037, #2049), and context bounds (`def f[A: Ordering]`) resolve to `references` edges (#4038, #2046). +- Feature: single-implementer interface dispatch was lifted into a language-agnostic core (#4034) and reused to dispatch a **Swift** protocol requirement to its sole conformer (INFERRED), failing closed on 2+ conformers (#4035) — thanks @GAURAV-1313. +- Feature: **Elixir** unqualified calls now resolve to functions brought in by `import`/`use`, scoped per module and fail-closed when no in-scope module defines the name (fixes a large god-node from corpus-wide bare-name binding) (#4015, thanks @Ayushraj06-bit). +- Feature: a **bash** script's invocation of another script through a non-shell interpreter (`python3 build.py`, `node build.js`, `"$PYTHON" stage.py`) is now recorded as an `invokes` edge; a `$VAR`/path command word is not mistaken for an interpreter (#4007, thanks @ayushcodes10). +- Feature: **Dart** `part` files keep their own file node linked to the library (#4013, #4008), and a configurable import/export (`import 'a.dart' if (...) 'b.dart';`) now links every URI branch, not just the default (#4003, #4002) — thanks @brlumen. +- Fix: C# partial-class merging no longer drops recursive/intra-class `calls` edges; one split `partial class` anywhere in a repo used to erase every recursive self-loop graph-wide (#4017, thanks @rohit-jsfreaky). +- Fix: `graphify path` (CLI and the MCP `shortest_path` tool) now routes through a `contains` edge back out to a symbol's file, so a cross-file dependency that must pass through a shared symbol is found instead of reporting no path (#4004, #3878, thanks @ayushcodes10). +- Fix: the AST cache rebinds its stat index when a later call names a different cache root, so a multi-project process writes each root's `stat-index.json` with only its own files instead of pooling them into the first root's file (#4005, #3989, thanks @ayushcodes10). +- Fix: `merge-graphs --previous ` restores the previous merged community assignment by node id, so cluster/label reuse stays stable across re-merges; a malformed `--previous` file now errors cleanly instead of crashing (#4006, #3858, thanks @ayushcodes10). +- Fix: `cluster-only`/`label` no longer drop parallel edges (two different relations between the same pair) when reloading and rewriting a graph; preserved links track node-id remaps so none are silently dropped on a legacy graph (#4010, #3999, thanks @ayushcodes10). +- Fix: the Ollama `num_ctx` setting is merged into `extra_body` instead of replacing it, so a `GRAPHIFY_DISABLE_THINKING` body set on the same backend is no longer silently clobbered (#4029, #3988, thanks @Agnik47). +- Fix: the hook-guard reminder names the effective `graph.json` path when `GRAPHIFY_OUT` is customized, instead of always naming the default `graphify-out/graph.json` (#4042, #4040, thanks @DeepanshuPal). +- Fix: `graphify extract` refuses to overwrite an existing graph with a dedup-shrunk one unless `--allow-dedup-shrink` is passed; the refusal reports the actual number of nodes dedup merged (#4014, #3774, thanks @SrijanSriv). +- Feature: extraction warns once when a cleanly-parsed code file yields no symbols beyond its own file node (often a data literal), while staying silent on empty/whitespace-only files, no-extractor languages, and intentionally-skipped data (#4009, #3946, thanks @ayushcodes10). + ## 0.9.74 (2026-10-02) - Feature: four more language extractors gained structural depth. **Ruby** paren-less self-sends (`do_thing` with no receiver or parens) are now captured as calls, with a local-variable/parameter/block-parameter in scope correctly suppressing the call (fail-closed, no fabrication) (#3960, thanks @rajatnagda45). **TypeScript** `abstract` method signatures in an abstract class are now extracted as callable method members and resolve as call targets (#3961, thanks @rajatnagda45). **Scala** deferred (abstract) method declarations in traits and abstract classes (`def foo: Int`, no body) are now extracted as methods (#3962, thanks @rajatnagda45). **C++** a member-function declaration inside a class (`void foo();`, defined out-of-line) is now classified as a method rather than a field, including pure-virtual, `const`, operator, and destructor forms; real data members stay fields (#3963, thanks @rajatnagda45). diff --git a/pyproject.toml b/pyproject.toml index 709c73818..89ee730b9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "graphifyy" -version = "0.9.74" +version = "0.9.75" description = "AI coding assistant skill (Claude Code, CodeBuddy, Codex, OpenCode, Kilo Code, Cursor, Gemini CLI, Aider, OpenClaw, Factory Droid, Trae, Hermes, Kiro, Pi, Devin CLI, Google Antigravity) - turn any folder of code, docs, papers, images, or videos into a queryable knowledge graph" readme = "README.md" license = "Apache-2.0" diff --git a/uv.lock b/uv.lock index 8ed6ea82c..a2c889465 100644 --- a/uv.lock +++ b/uv.lock @@ -1096,7 +1096,7 @@ wheels = [ [[package]] name = "graphifyy" -version = "0.9.74" +version = "0.9.75" source = { editable = "." } dependencies = [ { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" },