Fix Ukrainian README typo, Unicode vocab regex, add migration note for Java extends->inherits

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Safi
2026-05-24 20:40:49 +01:00
co-authored by Claude Sonnet 4.6
parent 238702b697
commit a4a615da97
3 changed files with 14 additions and 3 deletions
+10
View File
@@ -2,6 +2,16 @@
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/safishamsi/graphify/releases)
## 0.8.18 (2026-05-24)
- Fix: post-commit hook now updates graph after delete-only commits — shrink-guard is bypassed when `changed_paths` contains explicit deletions, preventing stale nodes from accumulating indefinitely (#1000)
- Fix: `graphify export` (html/obsidian/wiki/svg/graphml/neo4j) no longer collapses to "Single community" when `.graphify_analysis.json` is absent — falls back to per-node `community` attribute already present in `graph.json` (#1001)
- Fix: Ukrainian README translation updated to v8 — all new sections, correct badges, 31 languages (#995)
- Feat: semantic context tags on `references` edges for Python/JS/TS/C#/Java — `parameter_type`, `return_type`, `generic_arg`, `attribute`, `field`; C#/Java split `inherits`/`implements`; dedup key now includes context (#996)
- **Breaking:** Java `extends` edges are now emitted as `inherits` — queries filtering on `relation="extends"` for Java nodes must be updated to `relation="inherits"`
- Feat: constrained query expansion in skill — Step 0 extracts actual graph vocab and forces LLM to pick expansion tokens only from that set, preventing hallucinated expansions; Unicode regex fix captures Cyrillic/CJK labels (#998)
- Docs: Ukrainian README updated to v8 with all new sections, correct badges, YC badge, 31 language count (#995)
## 0.8.17 (2026-05-23) ## 0.8.17 (2026-05-23)
- Fix: Case-sensitive call resolution for Go, Rust, and Elixir — resolvers previously lowercased both the label index and the callee name, causing `Authorize` to match `authorize` and produce phantom edges; Ruby/C#/Java/Kotlin/Scala/PHP use the same generic resolver which now splits into case-sensitive (all languages) and case-insensitive (PHP only, where function/class names are genuinely case-insensitive) dicts (#993) - Fix: Case-sensitive call resolution for Go, Rust, and Elixir — resolvers previously lowercased both the label index and the callee name, causing `Authorize` to match `authorize` and produce phantom edges; Ruby/C#/Java/Kotlin/Scala/PHP use the same generic resolver which now splits into case-sensitive (all languages) and case-insensitive (PHP only, where function/class names are genuinely case-insensitive) dicts (#993)
+1 -1
View File
@@ -155,7 +155,7 @@ graphify install --project --platform codex
| `openai` | OpenAI / OpenAI-сумісні API | `pip install "graphifyy[openai]"` | | `openai` | OpenAI / OpenAI-сумісні API | `pip install "graphifyy[openai]"` |
| `gemini` | Google Gemini API | `pip install "graphifyy[gemini]"` | | `gemini` | Google Gemini API | `pip install "graphifyy[gemini]"` |
| `bedrock` | AWS Bedrock (використовує IAM, без API-ключа) | `pip install "graphifyy[bedrock]"` | | `bedrock` | AWS Bedrock (використовує IAM, без API-ключа) | `pip install "graphifyy[bedrock]"` |
| `sql` | Вилучення SQL схеит | `pip install "graphifyy[sql]"` | | `sql` | Вилучення SQL схем | `pip install "graphifyy[sql]"` |
| `all` | Все вищезазначене | `pip install "graphifyy[all]"` | | `all` | Все вищезазначене | `pip install "graphifyy[all]"` |
--- ---
+3 -2
View File
@@ -979,8 +979,9 @@ from pathlib import Path
data = json.loads(Path('graphify-out/graph.json').read_text()) data = json.loads(Path('graphify-out/graph.json').read_text())
vocab = set() vocab = set()
for n in data['nodes']: for n in data['nodes']:
for c in re.findall(r'[A-Za-z]+', n.get('label','') or ''): for c in re.findall(r'[^\W\d_]+', n.get('label','') or '', re.UNICODE):
for p in re.findall(r'[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+', c): parts = re.findall(r'[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+', c) or [c]
for p in parts:
t = p.lower() t = p.lower()
if 3 <= len(t) <= 30: if 3 <= len(t) <= 30:
vocab.add(t) vocab.add(t)