Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
1b63921
Add GitHub Actions workflow for Python application
FolatheDuckofDuckingburg Jun 6, 2026
b16aae0
Fix flake8 errors: remove unused global _stat_index_dirty declaration…
FolatheDuckofDuckingburg Jun 6, 2026
59ce00c
Merge branch 'safishamsi:v8' into v8
FolatheDuckofDuckingburg Jun 6, 2026
9e348ca
Merge branch 'safishamsi:v8' into v8
FolatheDuckofDuckingburg Jun 19, 2026
e726450
Add bug fix benchmark tasks
FolatheDuckofDuckingburg Jul 4, 2026
66dfe67
Add task evaluator for success criteria
FolatheDuckofDuckingburg Jul 4, 2026
bcb4fe0
Add feature addition benchmark tasks
FolatheDuckofDuckingburg Jul 4, 2026
140d63b
Add benchmark test runner script
FolatheDuckofDuckingburg Jul 4, 2026
576eaaa
Add detailed statistical methodology for benchmarks
FolatheDuckofDuckingburg Jul 4, 2026
43a70e4
Add benchmark framework README with methodology and metrics
FolatheDuckofDuckingburg Jul 4, 2026
22d5871
Complete benchmark framework: add architecture Q&A tasks and .gitignore
FolatheDuckofDuckingburg Jul 4, 2026
bfa3df1
Merge branch 'Graphify-Labs:v8' into v8
FolatheDuckofDuckingburg Jul 5, 2026
cfbc0c7
fix: resolve explain-ambiguity and stat resolution cache test failure
google-labs-jules[bot] Jul 27, 2026
4d5f741
fix: resolve explain-ambiguity, cache prune test failure, and pass fl…
google-labs-jules[bot] Jul 27, 2026
0a80bfe
fix: resolve explain-ambiguity, cache prune test failure, and pass fl…
google-labs-jules[bot] Jul 27, 2026
447298a
fix: resolve explain-ambiguity, cache prune test failure, and pass fl…
google-labs-jules[bot] Jul 27, 2026
edbd81b
fix: resolve explain-ambiguity, cache prune test failure, and pass fl…
google-labs-jules[bot] Jul 27, 2026
70c7319
fix: resolve explain-ambiguity, cache prune test failure, and pass fl…
google-labs-jules[bot] Jul 27, 2026
12fe660
fix: resolve explain-ambiguity, cache prune test failure, and pass fl…
google-labs-jules[bot] Jul 27, 2026
1031b57
Merge pull request #3 from FolatheDuckofDuckingburg/jules-86284768064…
FolatheDuckofDuckingburg Jul 27, 2026
9efe6aa
merge: resolve conflicts in cache.py, __main__.py, and uv.lock
google-labs-jules[bot] Jul 28, 2026
5dfe97a
Merge pull request #4 from FolatheDuckofDuckingburg/jules-16036579719…
FolatheDuckofDuckingburg Jul 28, 2026
df16adc
feat(install): add native windsurf configuration management
google-labs-jules[bot] Jul 28, 2026
7a2c840
Merge pull request #5 from FolatheDuckofDuckingburg/jules-12051165530…
FolatheDuckofDuckingburg Jul 28, 2026
92f0115
fix(ruby): resolve compact syntax mixin targets and prevent phantom c…
google-labs-jules[bot] Jul 29, 2026
2e20842
Merge pull request #7 from FolatheDuckofDuckingburg/jules-14987189988…
FolatheDuckofDuckingburg Jul 29, 2026
179c464
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Jul 29, 2026
cb3583a
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Jul 30, 2026
de35187
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Aug 1, 2026
b5dccb2
fix(fork): sync fork with upstream/v8 to resolve unrelated histories …
google-labs-jules[bot] Aug 1, 2026
96ed616
Merge branch 'v8' into jules-sync-fork-v8-568248997009349138
FolatheDuckofDuckingburg Aug 1, 2026
736ebda
fix(fork): remove duplicate version declarations in uv.lock causing T…
google-labs-jules[bot] Aug 1, 2026
43b5c59
Merge pull request #8 from FolatheDuckofDuckingburg/jules-sync-fork-v…
FolatheDuckofDuckingburg Aug 1, 2026
5845206
Merge remote-tracking branch 'upstream/v8' into local fork branch
google-labs-jules[bot] Aug 2, 2026
21d9fc4
Merge pull request #9 from FolatheDuckofDuckingburg/jules-15646829505…
FolatheDuckofDuckingburg Aug 2, 2026
cc3ec4d
Merge upstream/v8 and PR 2235 (3D WebGL renderer) into fork and resol…
google-labs-jules[bot] Aug 7, 2026
92aa0c2
Merge pull request #10 from FolatheDuckofDuckingburg/jules-2972794777…
FolatheDuckofDuckingburg Aug 7, 2026
d1b936f
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Aug 7, 2026
76a2944
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Aug 8, 2026
aa6d106
Update graphify/extractors/engine.py
FolatheDuckofDuckingburg Aug 8, 2026
587290a
Update pyproject.toml
FolatheDuckofDuckingburg Aug 8, 2026
94f0233
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Aug 10, 2026
eccc61c
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Aug 11, 2026
2852b2b
Merge branch 'v8' into v8
FolatheDuckofDuckingburg Aug 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
# Changelog

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

## 0.9.32 (unreleased)
## 0.9.35 (unreleased)
## 0.9.36 (unreleased)
## 0.9.38 (unreleased)
## 0.9.40 (unreleased)
## 0.9.42 (unreleased)

- Fix: a JS/TS `for...of` / `for...in` loop binding is now shadowed, so passing it as a call argument no longer fabricates an `indirect_call` edge to an unrelated same-named callable (#2685, thanks @ousamabenyounes); completes the loop/closure/catch shadow family (#2568/#2569/#2517).
Expand Down
20 changes: 20 additions & 0 deletions graphify/extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -2289,6 +2289,9 @@ def _merge_csharp_partial_class_nodes(
per_file: list[dict],
all_nodes: list[dict],
all_edges: list[dict],
) -> None:
"""Collapse C# `partial class Foo` halves split across files into ONE node
(#2332).
paths: list[Path],
root: Path,
) -> None:
Expand All @@ -2299,6 +2302,13 @@ def _merge_csharp_partial_class_nodes(
declaring `partial class Foo` produces its own `Foo` node: members split
across the halves and cross-half calls don't resolve (two candidate types
make every receiver-typed lookup bail as ambiguous). Group partial-stamped
type nodes by (namespace, label) — same-named types in different namespaces
are distinct types, non-partial same-named types are separate declarations,
and nested partials are excluded (their ids omit the enclosing type, so a
same-named nested pair under different outers would falsely merge). The
canonical node is the sorted-first half by (source_file, source_location,
id); every edge endpoint and raw-call caller is remapped onto it. Member
node ids are left untouched — only the class-level nodes collapse.
type nodes by (assembly, namespace, label) — same-named types in different
namespaces are distinct types, non-partial same-named types are separate
declarations, and nested partials are excluded (their ids omit the
Expand Down Expand Up @@ -2402,6 +2412,15 @@ def _assembly_of_node(nid: str) -> str:
for members in groups.values():
if len(members) < 2:
continue
members.sort(key=lambda n: (
str(n.get("source_file", "")),
str(n.get("source_location", "")),
str(n.get("id", "")),
))
canonical_nid = members[0]["id"]
for other in members[1:]:
if other["id"] != canonical_nid:
remap[other["id"]] = canonical_nid
by_assembly: dict[str, list[dict]] = {}
for n in members:
Comment on lines +2415 to 2425

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial-class remap keyed only by (namespace,label) ignores assembly — agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review

Graphify suggests a fix:

Suggested change
members.sort(key=lambda n: (
str(n.get("source_file", "")),
str(n.get("source_location", "")),
str(n.get("id", "")),
))
canonical_nid = members[0]["id"]
for other in members[1:]:
if other["id"] != canonical_nid:
remap[other["id"]] = canonical_nid
by_assembly: dict[str, list[dict]] = {}
for n in members:
by_assembly: dict[str, list[dict]] = {}
for n in members:

by_assembly.setdefault(_assembly_of_node(n["id"]), []).append(n)
Expand Down Expand Up @@ -5964,6 +5983,7 @@ def _learn(e: dict) -> None:
# graph is identical regardless of scan root (#2072).
_repoint_python_package_imports(paths, all_nodes, all_edges, root)
_merge_swift_extensions(per_file, all_nodes, all_edges)
_merge_csharp_partial_class_nodes(per_file, all_nodes, all_edges)
_merge_csharp_partial_class_nodes(per_file, all_nodes, all_edges, paths, root)
_disambiguate_colliding_node_ids(all_nodes, all_edges, all_raw_calls, root)
_canonicalize_csharp_namespace_nodes(all_nodes, all_edges)
Expand Down
6 changes: 6 additions & 0 deletions graphify/extractors/engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -1661,6 +1661,10 @@ def bind_parameter(param, scope_node) -> None:
# declaration_expression; `is Leaf lf`, `is not Node nd`,
# `case Twig tw:` and a switch-arm `Stem st =>` are
# declaration_patterns — all carry `type` + `name` fields and
# bind the name for the rest of the method. `out var v`
# (implicit_type) yields None from _csharp_receiver_type_name
# and poisons the name method-locally, matching the
# untypable-local rule above (no guess).
# bind the name for the enclosing block. `out var v`
# (implicit_type) yields None from _csharp_receiver_type_name
# and stays untypable inside that block only — no guess at its
Expand All @@ -1672,6 +1676,8 @@ def bind_parameter(param, scope_node) -> None:
_csharp_receiver_type_name(
node.child_by_field_name("type"), source
),
)
stack.extend(node.children)
scope,
)
child_scope = (
Comment on lines 1676 to 1683

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Stray stack.extend/scope fragments break engine loop control flow — agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review

Graphify suggests a fix:

Suggested change
_csharp_receiver_type_name(
node.child_by_field_name("type"), source
),
)
stack.extend(node.children)
scope,
)
child_scope = (
_csharp_receiver_type_name(
node.child_by_field_name("type"), source
),
scope,
)
child_scope = (

Expand Down
2 changes: 2 additions & 0 deletions graphify/watch.py
Original file line number Diff line number Diff line change
Expand Up @@ -1235,6 +1235,8 @@ def _add_deleted_source(path: Path) -> None:
# AST heading layer intact alongside the semantic layer.
extract_targets = [p for p in code_files if p not in semantic_doc_files]

commit = _git_head(cwd=watch_root)
result = extract(extract_targets, cache_root=watch_root) if extract_targets else {
# #2406: an incremental rebuild parses only the changed files, so the
# cross-file resolvers could not see a callee living in an unchanged
# file and every changed->unchanged `calls` edge disappeared (reconcile
Expand Down
4 changes: 4 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ build-backend = "setuptools.build_meta"

[project]
name = "graphifyy"
version = "0.9.32"
version = "0.9.35"
version = "0.9.38"
version = "0.9.40"
version = "0.9.42"
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"
Comment thread
FolatheDuckofDuckingburg marked this conversation as resolved.
Comment thread
FolatheDuckofDuckingburg marked this conversation as resolved.
Comment on lines +7 to 12

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate/conflicting project version in pyproject.toml — agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review

Graphify suggests a fix:

Suggested change
version = "0.9.32"
version = "0.9.35"
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"
version = "0.9.36"
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"

Comment on lines +7 to 12

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate/conflicting version keys in pyproject.toml — agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review

Graphify suggests a fix:

Suggested change
version = "0.9.32"
version = "0.9.35"
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"
version = "0.9.35"
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"
Comment thread
FolatheDuckofDuckingburg marked this conversation as resolved.
Comment on lines +7 to 13

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate version keys in pyproject.toml — agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review

Graphify suggests a fix:

Suggested change
version = "0.9.32"
version = "0.9.35"
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"
version = "0.9.36"
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"

Expand Down
2 changes: 1 addition & 1 deletion tests/test_cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -693,7 +693,7 @@ def test_semantic_prune_removes_orphan_entries(tmp_path):
h_a = file_hash(f, tmp_path)
save_cached(f, {"nodes": [{"id": "a"}], "edges": []}, root=tmp_path, kind="semantic")

f.write_text("# B\n\nContent B.\n")
f.write_text("# B\n\nContent B is significantly longer.\n")
h_b = file_hash(f, tmp_path)
save_cached(f, {"nodes": [{"id": "b"}], "edges": []}, root=tmp_path, kind="semantic")

Expand Down
2 changes: 2 additions & 0 deletions tests/test_csharp_partial_classes.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
carries the per-file stem), so the type's members split across the halves and
every receiver-typed lookup on `Foo` bailed as ambiguous — cross-half calls
never resolved. `_merge_csharp_partial_class_nodes` collapses the halves onto
one canonical node, keyed by (namespace, label); same-named types in other
namespaces, non-partial declarations, and nested partial types are left alone.
one canonical node, keyed by (assembly, namespace, label); same-named types in
other namespaces, non-partial declarations, and nested partial types are left
alone. The assembly key is the nearest ancestor dir holding a `*.csproj`/
Expand Down
2 changes: 2 additions & 0 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.