Releases: optave/ops-codegraph-tool
Dev build 3.11.3-dev.48
Dev build from commit ddfc14cd19888b922d2bdf76dd5483d4c3e74406 on main.
Dev build 3.11.3-dev.47
Dev build from commit be346955a3e48213dd601694574a7a686f48cac1 on main.
Dev build 3.11.3-dev.45
Dev build from commit ef54c124356320251449cb575b729aecb111f61d on main.
Dev build 3.11.3-dev.44
Dev build from commit 732def42b8d42adf233833282049c7e17d6a8290 on main.
Dev build 3.11.3-dev.43
Dev build from commit bce33f07c6b7ab6050d35f3fedd20f6bf926d4fa on main.
v3.11.2
Watch mode correctness sweep. Five independent bugs in the incremental rebuild path are fixed: the call resolver had drifted from the full-build authoritative version, causing inflated calls edges on any watch rebuild touching a widely-imported file; a missing dedup set let the same (caller, target) pair be inserted multiple times; receiver, extends, implements, and dynamic-import edges were silently absent from watch-mode rebuilds; top-level Ruby constants and program-level Python assignments were dropped by the native extractor while WASM captured them; and 10 native grammar crate versions had drifted from their WASM npm counterparts. A new shared call-resolver.ts module now backs both the full-build and incremental paths, closing the structural gap that let these bugs accumulate.
Bug Fixes
- watch: align incremental call resolver with full build — the watcher's
resolveCallTargets/buildCallEdgeshad drifted from the authoritative full-build resolver inbuild-edges.ts; on a comment-only rebuild of a widely-imported file,callsedges inflated by ~700 (#1261) - watcher: eliminate calls-edge inflation in incremental cascade — adds the missing
seenCallEdgesdedup set tobuildCallEdgesin the incremental path, and tightens the global name fallback inresolveCallTargetsto match the full-build resolver (#1264) - extract: eliminate WASM/native node divergence — native Ruby extractor now handles top-level
assignmentnodes (program-level constants); native Python extractor extracts program-level function and class definitions that were previously dropped; eliminates the persistent full-build node count gap between engines (#1266) - watcher: add missing receiver/extends/implements/dynamic-import edges —
receiveredges (method call receiver resolution),extends/implementsclass hierarchy edges, anddynamic-importedges were silently absent from watch-mode incremental rebuilds; now parity-aligned with the full build (#1267) - engine: align native grammar crate versions with WASM npm packages — upgrades 10 Rust tree-sitter grammar crates in
Cargo.tomlto match the npm devDependency versions, eliminating grammar-version drift identified as the structural source of native/WASM call-edge divergence (#1268)
Refactors
- engine: extract shared call-resolver, eliminate build/watch duplication —
findCaller,resolveByMethodOrGlobal,resolveCallTargets, andresolveReceiverEdgeextracted intosrc/domain/graph/builder/call-resolver.ts; both the full-build and incremental paths share a single implementation via aCallNodeLookupinterface (#1272)
Chores
- ci: add grammar version parity check between npm devDeps and Cargo.toml — new
scripts/check-grammar-versions.mjscompares grammar major versions across both package managers; wired as a lightweight CI job to catch future drift early (#1270) - deps: bump commander from 14.0.3 to 15.0.0 (#1251), tree-sitter-erlang to 0.18 (#1252), @biomejs/biome to 2.4.16 (#1250), @commitlint to 21.0.2 (#1253, #1254)
v3.11.1
Four new embedding models, sticky model resolution, and a large internal refactor. codegraph embed adds mxbai-large, mxbai-xsmall, bge-m3, and modernbert to the model registry — all publicly accessible without an HF token, covering multilingual, high-quality large, tiny-with-long-context, and ModernBERT-architecture use cases. Sticky model resolution ensures that subsequent codegraph embed runs on an existing graph reuse the model it was originally built with rather than the global default; the default for fresh graphs shifts from nomic-v1.5 to nomic (same dimensions and context window, but the public Xenova mirror instead of the occasionally-gated nomic-ai org). Watch mode delta reporting is corrected — the rebuild log now shows the net edge change instead of an inflated gross re-insertion count. Under the hood, a 10-PR refactor (Titan Grind) decomposed the largest modules — ast-analysis, domain, graph, presentation, extractors, and core-rs — into focused, independently-testable units with no user-visible behavioral changes.
Features
- embed: add
mxbai-large,mxbai-xsmall,bge-m3, andmodernbertembedding models — all Apache-2.0/MIT licensed, noHF_TOKENrequired;bge-m3is multilingual (100+ languages, 8192 ctx),mxbai-largetops the MTEB BERT-large leaderboard,mxbai-xsmallis tiny with 4096-token context,modernbertuses the ModernBERT architecture (#1229) - embed: sticky model resolution —
codegraph embedon an existing graph now reuses the model stored inembedding_metarather than falling back to the global default; the default for fresh graphs changes fromnomic-v1.5tonomic(same dim/context, public Xenova mirror avoids occasional HF gating) (#1228)
Bug Fixes
- watch: report net edge delta in rebuild log — previously the count was inflated by re-inserted edges that cancel out; now shows only the true net change (#1245, #1220)
Refactors
- ast-analysis: decompose engine and visitors, break visitor-utils cycle (#1231)
- extractors: shared helpers across language extractors (TS+Rust); adopt shared child-iteration helpers (#1230, #1238)
- core-rs: decompose pipeline, read_queries, edge_builders; collapse walker recursion (#1232)
- graph: decompose Leiden optimiser and roles classifier (#1233)
- presentation: extract shared rendering helpers in cfg and flow (#1234)
- domain: decompose parser, analysis, and search modules (#1236)
- features: decompose complexity/structure/owners; reduce cfg/cochange/feature-warnings complexity (#1237)
- parity: render orchestrator-drop summary as a per-extension table (#1225, #1240)
v3.11.0
Native engine reaches feature parity with WASM, plus an engine-parity sweep across 14 languages. The final 11 extractors (Clojure, CUDA, Julia, Solidity, Erlang, R, Groovy, Gleam, Objective-C, F#, Verilog) are now ported to Rust, so every supported language extracts symbols natively when the prebuilt binary is available — no more silent fallback to WASM for these. In parallel, a multi-PR parity sweep aligned the contains/parameter/inheritance edges that the two engines disagreed on across Java/Kotlin/CUDA/Ruby/Objective-C/HCL/Dart/Scala/Elixir/Haskell/Python/C#/Groovy/C++, so the native engine no longer drops parameters, function-pointer fields, default-value arguments, or interface inheritance edges that WASM was already emitting. F# .fsi signature files now route through a dedicated grammar instead of being parsed as .fs source. On the CLI, -n is now the short form of --limit on every limit-accepting command (previously only on five), build accepts -d/--db, and MCP semantic_search accepts file_pattern to scope hybrid/semantic/keyword searches to a subtree. Watch mode no longer crashes on rebuild when embeddings exist for the file, and barrel-chain re-parse discovery iterates until stable so chained re-exports stop dropping edges.
Features
- cli: unify
-nshort flag across all--limit-accepting commands —roles,structure,communities,audit,check,children,diff-impact,ast,brief,cfg,context,dataflow,deps,exports,flow,fn-impact,impact,implementations,interfaces,query,sequence, andwherenow all accept-nin addition to--limit(#1184) - cli: accept
-d/--dbonbuildto match every other DB-scoped command — pre-built graphs can now be re-targeted at build time withoutcd-ing into the project root (#1183) - mcp: forward
file_pattern(string or string[]) insemantic_searchto scope hybrid/semantic/keyword results — closes a silent-drop where MCP callers passingfile_patterngot unscoped global hits back with no error (#1149) - fsharp: route
.fsifiles through a dedicated signature grammar — newfsharp-signaturelanguage id with aval foo : typehandler that distinguishes signature declarations fromlet foo = ...source bindings (#1162)
Performance
- native: port Clojure extractor to Rust (#1097)
- native: port CUDA extractor to Rust (#1099)
- native: port Julia extractor to Rust (#1098)
- native: port Solidity extractor to Rust (#1100)
- native: port Erlang extractor to Rust (#1103)
- native: port R extractor to Rust (#1102)
- native: port Groovy extractor to Rust (#1101)
- native: port Gleam extractor to Rust (#1105)
- native: port Objective-C extractor to Rust (#1106)
- native: port F# extractor to Rust (#1104)
- native: port Verilog extractor to Rust (#1107)
- native: skip backfill on incrementals when orchestrator preserved files — avoids redundant WASM-side backfill work on clean incremental rebuilds (#1082)
- native: skip backfill on clean incrementals + bench guard tuning — removes the residual cost when nothing actually changed (#1085)
- bench: exclude resolution-benchmark fixtures from dogfooding and incremental-benchmark sweeps so per-file timings reflect real source code, not pinned-precision fixture corpora (#1131, #1134)
Bug Fixes
- extractors: drill through
function_declaratorfor parameter names — restores parameter extraction for C-family pointer-to-function declarations across all engines (#1213) - extractors: recursively walk Haskell pattern parameters so destructured arguments emit edges (#1203)
- extractors/cuda: keep function-pointer class fields that were previously dropped at parity-align time (#1207)
- native/kotlin: strip
navigation_suffixwrapper from call name so qualified calls resolve to the correct callee instead of the suffix node (#1205) - extractors/elixir: extract default-value and pattern-match parameters that were silently dropped on multi-clause functions (#1202)
- extractors: align Ruby/Objective-C
containsparity across engines (#1201) - extractors: align Java/Kotlin/CUDA
containsparity across engines (#1199) - extractors: align HCL/Dart/Scala
containsparity across engines (#1196) - extractors: align Elixir/Haskell/Python
containsparity across engines (#1195) - native/csharp: align extractor with WASM on three engine-parity divergences (#1194)
- db: stop
findDbPathwalk at cwd when there is no git ceiling, socodegraphinvoked outside a repo no longer climbs to the filesystem root (#1193) - native/cpp: strip reference modifier from parameter names so
T& fooextractsfoo, not& foo(#1192) - native: apply WASM callback-callee gating in JS extractor so
member_expressioncallback args no longer create false-positive edges (#1191) - watch: purge embeddings before nodes to stop FK crash in
rebuildFile— incremental rebuilds on watched files with embeddings no longer crash with a foreign-key constraint violation (#1182) - builder: iterate barrel re-parse discovery to stop dropping chained-barrel edges — the WASM builder now loops until the dirty-barrel set is stable, so
a → b → c → dchained re-exports no longer leave edges on the floor (#1179) - embed: install
@huggingface/transformersinto codegraph's host node_modules —codegraph embedno longer fails when invoked from a project that hasn't installed transformers itself (#1178) - hooks: use POSIX
[[:space:]]inguard-git.shgrep patterns so the hook works under BSD grep on macOS (#1170) - hooks:
guard-git.shsed patterns work on macOS BSD sed — closes a silent no-op where the hook ran but matched nothing under BSD (#1146) - groovy: emit
ClassRelationfor interface inheritance in both engines soimplementsedges no longer go missing on Groovy classes (#1158) - builder: remove duplicate early-return in
backfillNativeDroppedFiles(#1148) - julia: port parameterized-type / qualified-def / qualified-import fixes to WASM so Julia parity matches between engines (#1128)
- gleam: extract parameters for external functions so cross-module Gleam calls resolve (#1127)
- native: purge stale rows when WASM-only files are deleted (#1122)
- native: backfill new dropped-language files on quiet incrementals so newly-added Solidity/Erlang/Verilog files appear on the next rebuild even when the file system signal looks quiet (#1123)
- r:
setMethodemits a call edge, not a duplicate definition (#1125) - groovy: dispatch
juxt_function_callin both engines so Groovy DSL-style calls (task { ... }) emit edges (#1124) - bench: warmup + median for
queryTimeMsto remove cold-start noise from the publish gate (#1133) - scripts: trend annotations fall back to nearest non-null prior release so a missing run no longer breaks the trend chart (#1120)
- scripts: preserve manual NOTES block in incremental report generator (#1119)
Refactors
- objc: use
if let Somein for-loop instead of?to fail-...
v3.10.0
Selective MCP tool filtering, WASM build-speed regression fix, and Haskell parity restoration. A new mcp.disabledTools config field lets you remove specific MCP tools from the schema entirely — useful for smaller-context models that don't need all 33 tools competing for the initial prompt budget. The 3.9.6 expansion of AST_TYPE_MAPS to 23 languages had a side effect of making WASM full builds re-parse every WASM-parseable file in the corpus; the per-file needsFn filter now scopes the re-parse correctly, dropping the 744-file dogfooding build from 14.0s back to 7.8s (matching the 3.9.5 baseline). A second parity fix gates astTypeMap lookups with Object.hasOwn so Haskell's constructor node type no longer walks the prototype chain to Object.prototype.constructor — restoring the Haskell resolver from 0%/0% precision/recall in 3.9.6 to 100%/33% (matching the 3.9.4 baseline). The release benchmark workflow has also been restructured: regression guards now run inside publish.yml before npm publishes, instead of after the docs PR lands, so a regression can no longer ship to npm and then fire on unrelated dev commits.
Features
- mcp: add
mcp.disabledToolsconfig to remove specific tools from the MCP schema — drops disabled tools entirely from the schema (not just rejected at runtime) so smaller-context models save initial-prompt tokens; tool names are normalized for matching (#1035)
Bug Fixes
- parity: gate
astTypeMaplookup withObject.hasOwn— Haskellconstructornodes (Left,Right,Just, …) no longer fall through toObject.prototype.constructor, which was dropping the non-cloneableObject()function intoastNodes.kindand crashing the worker boundary withfunction Object() { [native code] } could not be cloned; Haskell resolver returns to v3.9.4 baseline (precision=1.0, recall=0.333) (#1041)
Performance
- wasm: scope
ensureWasmTreesre-parse to files that actually need it —wasm-worker-entry.tsnow serializes emptyastNodesarrays (empty ≠ undefined) andensureWasmTreesaccepts an optionalneedsFnfilter so only files genuinely lacking data are re-parsed; WASM full build on the 744-file dogfooding corpus drops from 14.0s back to 7.8s, restoring the 3.9.5 baseline (#1038)
CI
- release: gate npm publish on benchmark regressions — moves the regression guard into a
pre-publish-benchmarkjob inpublish.ymlso a regression fails the publish workflow before npm sees the new version, instead of firing on unrelated dev commits after the post-publish benchmark PR lands (#1040) - bench: rename auto-generated benchmark branch prefix from
benchmark/tochore/— aligns with the localguard-git.shallow-list so post-publish benchmark PRs no longer require hook bypass when pushed from a Claude Code session (#1044)
v3.9.6
Native engine parity and incremental-build performance. Native single-file incremental rebuilds drop from 876ms to 43ms (95% faster, 0.78× WASM) by adopting the WASM save-and-reconnect strategy so reverse-dep files no longer get re-parsed when they didn't change. Native full-build edge construction now beats WASM (119ms vs 184ms) by replacing per-row query_row lookups with one-shot HashMap pre-loads and chunked multi-row inserts. AST-node extraction is now within 0.12% parity between engines after fixing three independent divergences (missing language coverage in WASM, await_expression recursion, UTF-8 byte-length gating). The release-triggered benchmark workflow that silently hung at 600s on v3.9.5 is fixed — workers now dispose the WASM parser pool and embedding progress writes to stderr instead of corrupting stdout JSON. A new CI parity gate runs after every release benchmark and fails loudly when any of five engine-parity thresholds regress, so silent drift can no longer ship.
Bug Fixes
- parity: align WASM and native
ast_nodesextraction — registered 19 missing languages in WASM'sAST_TYPE_MAPS, removedawait_expressionskipChildrenquirk, and fixed UTF-8 byte-length gating in native; total AST-node parity now within 0.12% across self-build (was ~7,200 row delta) (#1016) - parity: log per-file reasons for native orchestrator drops — bucket dropped files by
unsupported-by-native(info) vsnative-extractor-failure(warn) with sample paths so legitimate parser limits no longer mask real Rust extractor bugs (#1024) - bench: dispose WASM worker pool and keep progress off stdout — release-triggered benchmark workflow no longer hangs at 600s; embedding progress writes to stderr so JSON-consuming workers stop parsing
Unexpected token 'E'(#1009)
Performance
- native: scope incremental rebuild to truly-changed files — 1-file incremental drops from 876ms to 43ms (95% faster, 0.78× WASM) by saving reverse-dep edges before purge and reconnecting them post-rebuild instead of re-parsing the full reverse-dep cone (#1027)
- native: batch-load file/symbol IDs in edges phase — replaces per-import
query_rowlookups with one-shot HashMap pre-loads and chunks import-edge inserts into 199-rowVALUESbatches; full-buildedgesphase now 119ms vs WASM's 184ms (0.65×) (#1028)
CI
- bench: gate release benchmark on engine parity thresholds — five thresholds (file-set gap, DB size ratio, edges/roles ratios, 1-file incremental ratio) fail the release benchmark workflow when engine parity regresses, with a markdown summary linking each breach to its tracking issue (#1014)
Chores
- deps-dev: bump @vitest/coverage-v8 from 4.1.4 to 4.1.5 (#1021)
- deps-dev: bump @biomejs/biome from 2.4.11 to 2.4.13 (#1019)
- deps-dev: bump @commitlint/cli from 20.5.0 to 20.5.2 (#1018)
- deps-dev: bump tree-sitter-erlang from 0.0.0 to 0.16 (#1017)
- deps-dev: bump tree-sitter-gleam from
0153f8bto1627dc5(#1020)