v0.8.38
fixie-ai/ultravoxv0.8.38Jun 11, 2026by safishamsi
AI Summary
A major correctness and performance update addressing LLM call direction, TypeScript import resolution, and file collection efficiency. It also fixes cache issues and Windows compatibility.
Key Highlights
- LLM 'calls' edges now have correct direction (100% precision)
- JS/TS default imports now produce symbol-level edges
- TSConfig 'paths' aliases resolved relative to 'baseUrl'
- collect_files optimized to a single pruned os.walk
- AST cache namespaced by graphify version
New Features
- Cargo workspace dependency extraction
- Improved SystemVerilog class-level extraction
Full Release Notes
## What's changed **13 fixes and improvements merged in this release.** ### Correctness - **Fix: LLM `calls` edges now have correct direction.** The extraction prompt never stated source = caller / target = callee — the LLM systematically emitted callee→caller. Explicit direction rule added to prompt. Ghost-node merge extended to collapse LLM bare-stem duplicates onto AST canonical nodes even when the LLM node has a `source_location`. Post-fix annotation: `calls` precision 100% (n=6), overall INFERRED precision 94% (n=16). - **Fix: JS/TS default imports/exports now produce symbol-level edges.** `export default class Foo` imported as `import Foo from './foo'` previously got only a file→file edge. The class node now receives a proper `imports` edge and call resolution through renamed bindings works correctly. - **Fix: tsconfig `paths` aliases resolved relative to `baseUrl`.** NestJS, monorepo, and similar layouts using `baseUrl: "./src"` now resolve `@/*` aliases correctly. - **Fix: dedup pass 2 picks winner only from the verified pair.** Unrelated same-named nodes from different files were being dragged into merges and supplanting the correct winner. - **Fix: global-graph edges rewired to deduplicated external nodes.** Dangling edge references after external node dedup are now remapped before insertion. - **Fix: ghost-merge skips ambiguous `(basename, label)` keys.** Two same-named symbols in different files (e.g. two `render` functions) no longer get mis-merged. - **Fix: `resolve_seed` matches bare names against callable-decorated labels.** A query for `render` now finds nodes labelled `.render()`. ### Performance - **Fix: `collect_files` is now a single pruned `os.walk`.** Replaces ~85 redundant `rglob` passes; noise directories are pruned before descent. ### Cache - **Fix: AST cache namespaced by graphify version.** Stale cache from previous releases no longer silently produces wrong output after upgrade. - **Fix: extraction cache anchored at `--out` root.** `graphify extract ./src --out /tmp/out` no longer leaks `graphify-out/` into the scanned project. - **Fix: frontmatter delimiter requires whole `---` line.** Thematic breaks (`----`) and YAML title lines (`--- title: foo`) no longer trigger false frontmatter parsing. ### Platform - **Fix: `claude-cli` spawns `claude.cmd` on Windows headless installs.** Adds `CREATE_NO_WINDOW` to both subprocess spawn sites. - **Fix: `claude-cli` handles JSON-array envelope from Claude Code CLI ≥ 2.1.** ### Features - **Feat: Cargo workspace dependency extraction.** `graphify extract ./my-workspace --cargo` maps Rust workspace crates and internal `crate_depends_on` edges. - **Fix: SystemVerilog class-level extraction improved.** Dart `with MyMixin` now correctly emits `mixes_in` (not `implements`). ### Docs - README grammar count updated: 28 → 36 tree-sitter grammars. --- Install: `uv tool install graphifyy` · [PyPI](https://pypi.org/project/graphifyy/0.8.38/) · [CHANGELOG](https://github.com/safishamsi/graphify/blob/v8/CHANGELOG.md)