mirror of
https://github.com/abhigyanpatwari/GitNexus.git
synced 2026-10-08 03:08:13 +00:00
Bumps gitnexus to v1.6.2 and adds the matching CHANGELOG entry. Highlights since v1.6.1 (61 commits): - Docker support (#848) - Language-agnostic heritage / call / variable extractors (config+factory pattern, #877 #878 #890) - AST-aware embedding chunking (#889) - jQuery / axios HTTP consumer detection (#887) - SemanticModel wired as first-class resolution input, SM-20 (#885) - ImportSemantics split into per-strategy hooks (#886) - Python dotted-import fix (#899); worker warnings non-terminal (#900 / #261); global-install ENOTEMPTY fixes (#843 #846); embeddings staleness fix (#831) See gitnexus/CHANGELOG.md for the full list. After merge, tag `v1.6.2` triggers publish.yml which runs CI, verifies tag↔package.json match, publishes to npm with provenance, and creates the GitHub Release using the extracted CHANGELOG body.
26 KiB
26 KiB
Changelog
All notable changes to GitNexus will be documented in this file.
[1.6.2] - 2026-04-18
Added
- Docker support — containerized ingestion and MCP serving for reproducible runs on CI and container platforms (#848)
- Language-agnostic heritage extractor — config+factory pattern for class-heritage extraction (EXTENDS / IMPLEMENTS), completing the extractor refactor alongside method/field/call/variable (#890)
- Language-agnostic call extractor — config+factory pattern that collapses ~225 lines of inline parse-worker logic into declarative per-language configs (#877)
- Language-agnostic variable extractor — structured metadata for
Const/Static/Variablenodes via config+factory pattern (#878) - AST-aware embedding chunking — offset-based splitting preserves symbol boundaries, improving semantic search precision on large files (#889)
- HTTP consumer detection for jQuery and axios object-form —
$.ajax/$.get/$.postandaxios({ url, method })now recognized as HTTP call sites (#887)
Fixed
- Python external dotted imports — avoid spurious same-file matches when an import path like
foo.bar.bazrefers to a third-party module (#899) - Worker warnings no longer terminate ingestion — non-fatal parser warnings keep the pipeline running instead of aborting the run (#900, #261)
- Global-install upgrade
ENOTEMPTY— devendoredtree-sitter-protoinstall lifecycle + preinstall cleanup sonpm i -g gitnexus@latestsucceeds on top of an older install (#843, #846) env.cacheDirnow defaults to a user-writable location, unblocking ingestion on systems where the install directory is read-only (#845)- Content-hash staleness detection for embeddings — zero-node rebuilds no longer skip vector-index creation, fixing semantic search after selective re-analysis (#831)
tree-sitter-c-sharpversion pin — locked to 0.23.1 to avoid a breaking change in a transitive prerelease (#834)release-drafterv7 CI — replaced the removeddisable-releaserflag withdry-runso release-note drafts still worknpm arboristcrash fromtree-sitter-dart— switched the dependency URL format sonpm installno longer crashes on clean installs- Service-group
ManifestExtractor—config.linksnow wires the manifest extractor properly, restoring cross-link discovery that had silently dropped to zero
Changed
- SemanticModel wired as a first-class resolution input (SM-20) —
call-processor,resolution-context,type-env, andheritage-mapnow consulttable.model.*directly; 37 internal call sites migrated off the SymbolTable wrapper (#885) - Per-strategy
ImportSemanticshooks —named/wildcard-transitive/wildcard-leaf/namespacestrategies split into composable hooks, replacing the monolithic conditional (Strategies 1–4 of #886) - Class extraction configs moved to
configs/subdirectory — per-language class configs now co-locate with the other extractor configs, completing the extractor layer's directory convention (#879) - CLI AI-context trimmed — duplicated CLAUDE.md block removed from the shipped context, reducing token usage in LLM-consuming workflows (#904)
- LLM context files optimized — AI-consumed documentation tuned for accuracy and token efficiency (#857)
- Workflow concurrency standardized — all CI workflows adopt the consistent concurrency key pattern documented in CONTRIBUTING.md; release-note labeling automated (#837)
- E2E status-ready timeout raised — 45s accommodates parallel-worker startup variance on CI (#908)
Chore / Dependencies
- tree-sitter 0.25 upgrade readiness — daily Dependabot monitor for the upcoming major-version bump (#847)
- Dependency bumps:
glob11.1.0 → 13.0.6 (#867),commander12.1.0 → 14.0.3 (#868),@huggingface/transformers(#869),@modelcontextprotocol/sdk(#866),lru-cache11.2.7 → 11.3.5 (#870),mnemonist0.39.8 → 0.40.3 (#871),@ladybugdb/core(#873) - gitnexus-web dependency bumps:
mermaid11.12.2 → 11.14.0 (#860),tailwindcss(#861),jsdom29.0.0 → 29.0.2 (#863),wait-on8.0.5 → 9.0.5 (#859),@vitest/coverage-v8(#864) - GitHub Actions bumps:
actions/checkout4.3.1 → 6.0.2 (#842),actions/upload-artifact4.6.2 → 7.0.1 (#838),actions/setup-node4.4.0 → 6.3.0 (#841),actions/cache5.0.4 → 5.0.5 (#840),actions/github-script7.0.1 → 9.0.0 (#850),dorny/paths-filter3.0.2 → 4.0.1 (#839),amannn/action-semantic-pull-request6.1.1 (#853),release-drafter/release-drafter6.0.0 → 7.2.0 (#852),marocchino/sticky-pull-request-comment3.0.4 (#851),softprops/action-gh-release2.5.0 → 3.0.0 (#849)
[1.6.1] - 2026-04-13
Added
- Service group extractor expansion — manifest extractor and broader extractor coverage (2/4 of #606 split) (#796)
- Dart call patterns for
await, cascade, lambda, and widget-tree contexts (#801)
Fixed
- Stack overflow and memory exhaustion on large repository analysis (#814)
tree-sitter-dartinstall crash — switched from git URL to npm tarball (#811)- Generic TypeScript awaited function calls missing from the call graph (#804)
- Runtime dependency on
file:../gitnexus-sharedremoved from the published package (#803) - Ruby
singleton_classcontext preserved during sequential parsing (#774)
Changed
- DAG-based ingestion pipeline architecture — pipeline phases now declare typed dependencies and run via a topologically sorted DAG; container-node logic extracted to
LanguageProvider. Includes hardened lifecycle (try/finally cleanup, error wrapping, cycle reporting), tightenedParseOutput.exportedTypeMapimmutability, and corrected phase dependencies (#809)
[1.6.0] - 2026-04-12
Added
- SemanticModel architecture refactor (SM-8 through SM-19) — extracted registries into
model/module with ISP-compliant interfaces: TypeRegistry, MethodRegistry, FieldRegistry, RegistrationTable, ResolutionContext (#786)- HeritageMap built from accumulated
ExtractedHeritage[]for MRO-aware resolution (#739) lookupMethodByOwnerWithMROusing HeritageMap for cross-class method dispatch (#740)- MRO fast path before D2 fuzzy widening in call resolution (#741)
- BindingAccumulator for cross-file return type propagation (#743, #763)
- Restructured
resolveUncachedreplacinglookupFuzzydata source for all tiers (#764) - Deleted
lookupFuzzy,lookupFuzzyCallable,globalIndex,callableIndex— replaced with structured lookups (#769) - Deleted
resolveCallTargetgod-method — replaced with thin dispatcher delegating toresolveMemberCall(#744),resolveStaticCall(#754),resolveFreeCall(#756) (#770)
- HeritageMap built from accumulated
- Service group infrastructure — service boundary detection, contract extractors, sync pipeline, CLI/MCP tools, monorepo fixture; bridge.lbug storage and contract matching expansion (#795)
- C# interface-to-interface heritage capture (#789)
- Vue SFC support with destructured call result tracking (#604)
- Java method reference resolution —
obj::methodas call sites (#622) - C/C++ MethodExtractor config with pure virtual detection (#617)
- MethodExtractor configs for Python, PHP, Swift, Dart, Rust, Ruby (#624)
- METHOD_IMPLEMENTS edges with overload disambiguation and MethodExtractor unification (#642)
- Same-arity overload disambiguation via type-hash suffix (#658)
GITNEXUS_HOMEenv var to customize global directory (#746)- Verbose analyze output prints skipped large file paths (#745)
- Class name lookup index for O(1) qualified lookups (#707, #716)
lookupMethodByOwnerindex for O(1) cross-class chain resolution (#665)- Fuzzy lookup counters for performance visibility (#708)
Fixed
- Stack overflow on large PHP files — iterative AST traversal (#783)
- Large repository graph loading failure (#732)
- Windows multi-repo switching — false 404 errors and stale repo context (#633)
detect_changesdiff mapping — map diff hunks to symbol line ranges (#779)- HTTP client vs Express route detection and Spring interface attribution (#780)
- VECTOR extension not loaded during DB init for semantic search (#782)
- tree-sitter-swift postinstall patch for macOS ARM64 (#788)
- tree-sitter-c peer dependency conflict pinned (#723)
- Constructor indexing in methodByOwner (#694, #753)
- Named binding processor —
lookupExactreplaced withlookupExactAll(#755) .gitnexusignorenegation patterns now respected (#654)- MCP setup prefers global gitnexus binary over npx (#653)
- CORS rejection returns clean error instead of 500 (#646)
- Array.push stack overflow — replaced spread with loop (#650)
- MCP stdout silencing prevents embedder/pool-adapter conflicts (#645)
- Web heartbeat — graceful reconnection replaces aggressive disconnect (#643)
- Web repo scoping — backend calls scoped to active repo (#644)
- OpenCode config path and FTS extension load order (#781)
- OnboardingGuide dev-mode serve command corrected (#725)
- Security issues and critical bugs from code review (#709)
Changed
- Replaced class-type fuzzy lookups with structured indices in type-env (#733, #734, #736)
- Extracted
CLASS_LIKE_TYPESconstant (#693)
[1.5.3] - 2026-04-01
Added
- TypeScript/JavaScript MethodExtractor config (#588)
Fixed
- Wiki Azure OpenAI compat and HTML viewer script injection (#618)
[1.5.2] - 2026-04-01
Fixed
gitnexus-sharedmodule not found —gitnexus-sharedwas afile:workspace dependency never published to npm, causingERR_MODULE_NOT_FOUNDwhen installinggitnexusglobally. The build now bundles shared code intodist/_shared/and rewrites imports to relative paths (#613)- v1.5.1 publish regression — npm's
preparelifecycle rantscafterprepack, overwriting the rewritten imports before packing; both scripts now run the full build so the final tarball is always correct
[1.5.1] - 2026-04-01 [YANKED]
Fixed
- Incomplete fix for
gitnexus-sharedbundling —preparescript overwrote rewritten imports during publish
[1.5.0] - 2026-04-01
Added
- Repo landing screen — when the backend detects indexed repositories, the web UI now shows a landing page with selectable repo cards (name, stats, indexed date) instead of auto-loading the first repo; users can also analyze new repos directly from the landing screen (#607)
- Unified web & CLI ingestion pipeline — complete architectural migration of the web app from a self-contained WASM browser app to a thin client backed by the CLI server; new
gitnexus-sharedpackage for cross-package type unification (#536)- New server endpoints:
/api/heartbeat(SSE liveness),/api/info,/api/repos,/api/file,/api/grep,/api/analyze(SSE progress),/api/embed,/api/mcp(MCP-over-StreamableHTTP) - Onboarding flow: auto-detect server → connect → repo landing or analyze
- Header repo dropdown: switch, re-analyze, or delete repos
- New server endpoints:
- Azure OpenAI support for wiki command — fixed broken Azure auth (
api-keyheader),api-versionURL parameter, reasoning model handling (max_completion_tokens, notemperature), content filter error messages; added interactive setup wizard,--api-versionand--reasoning-modelCLI flags (#562) - Java method references & interface dispatch —
obj::methodtreated as call sites, overload selection via typed variable args (not just literals), interface dispatch emits additional CALLS edges to implementing classes (#540) - MethodExtractor abstraction — structured method metadata extraction (isAbstract, isFinal, annotations, visibility, parameter types) with config-driven factory pattern (#576)
- Java and Kotlin configs with overload-safe
methodInfoCachekeyed byname:line - C# config with
sealed,params/out/ref/optional parameters,[Attribute]syntax,internalvisibility (#582)
- Java and Kotlin configs with overload-safe
--skip-agents-mdCLI flag — opt out of overwriting GitNexus-managed sections in AGENTS.md and CLAUDE.md duringgitnexus analyze(#517)- Prettier — monorepo-wide code formatter with lint-staged + Husky pre-commit hook,
.prettierrcconfig, Tailwind CSS v4 plugin,endOfLine: "lf"+.gitattributesfor Windows consistency (#563) - ESLint v9 — flat config with
unused-importsauto-removal,@typescript-eslintrules, React hooks rules, CIlintjob (#564)
Fixed
- OpenCode MCP configuration — corrected README MCP setup for OpenCode which requires
commandas an array containing both executable and arguments (#363) - litellm security — excluded vulnerable versions 1.82.7 and 1.82.8 in eval harness
pyproject.toml(#580)
Changed
- Reduced explicit
anytypes — 128no-explicit-anywarnings eliminated (689 → 561, 19% reduction) acrossNodePropertiesindex signature, ~80SyntaxNodesubstitutions, typed worker protocol, and graphology community detection (#566)
Docs
- Added
gitnexus-sharedbuild step to web UI quick start instructions (#585) - Added enterprise offering section to README (#579)
[1.4.10] - 2026-03-27
Fixed
- MCP server install via npx — resolve tree-sitter peer dependency conflicts that broke
npx -y gitnexus@latest mcp(#537, #538)- Downgrade tree-sitter from ^0.25.0 to ^0.21.1 (only npm version where all 14 parsers agree)
- Align all parser versions to their highest ^0.21.x-compatible releases
- Remove tree-sitter override (only applies to root packages, ignored by npx)
- Pin tree-sitter-dart to correct ABI-14-compatible commit
- Exact pins for tree-sitter-c (0.23.2), tree-sitter-python (0.23.4), tree-sitter-rust (0.23.1) where next patch requires ^0.22.x
[1.4.9] - 2026-03-26
Added
- COBOL language support — standalone regex processor for fixed-format and free-format COBOL, JCL, COPY/REPLACING with pseudotext (#498)
- 95% language feature coverage: CALL USING, EXEC SQL/CICS/DLI, DECLARATIVES, SET, INSPECT, INITIALIZE, STRING/UNSTRING, SORT/MERGE with INPUT/OUTPUT PROCEDURE, GO TO DEPENDING ON, MOVE CORRESPONDING, nested programs with per-program scoping
- 90+ review findings resolved across 20 review cycles with 241 tests (180 unit + 61 integration)
- Benchmarked: CardDemo 12,349 nodes / 9,773 edges in 7.4s; ACAS 14,017 nodes / 15,659 edges in 9.3s
- Dart language support — tree-sitter grammar, type extractors, import/call resolution, Flutter/Riverpod framework detection (#204)
- Field type extraction — Phase 8 & 9: per-language field extractors with generic table-driven factory + TypeScript hand-written extractor, return-type binding in call-processor (#494)
- 14 language configs (TS/JS, Python, Go, Rust, C/C++, C#, Java, Kotlin, PHP, Ruby, Swift, Dart)
FieldVisibilityunion type,extractNameshook for Ruby multi-attribute- 46 field extraction tests across 5 languages
- ORM dataflow detection for Prisma and Supabase (#511)
- Expo Router file-based route detection (#503)
- PHP response shape extraction for
json_encodepatterns (#502) - Next.js middleware.ts linked to routes at project level (#504)
- Filter panel — additional node types (#519)
Changed
- BUILT_IN_NAMES split into per-language provider fields (#523)
- tree-sitter upgraded to 0.25.0 with all grammar packages (#516)
- Impact tool — batched chunking and entry-point grouping for enrichment (#507)
Fixed
- COBOL CRLF — all
split('\n')calls use/\r?\n/for Windows compatibility - COBOL nested programs — all graph edges (CALL, CANCEL, CICS, ENTRY, SQL, SEARCH) use
owningModuleId()for correct attribution - COBOL callAccum — multi-line CALL USING with verb boundary detection, Area A paragraph guard, EXEC entry flush, division/END PROGRAM flush
- Dart language gaps closed (#524)
- Shape check false positives — quoted keys, DOM leaks, errorKeys (#501)
- Python alias gaps resolved (#505)
- Cypher write-detection regex false positive fixed (#507)
- CI — shape-check-regression test moved to lbug-db project (#518)
[1.4.8] - 2026-03-23
Added
- Type resolution Milestone D — Phases 10–13 consolidated into a single milestone with full integration test coverage across 11 languages (#387)
- Phase A/B/C: overload disambiguation via argument literal types, constructor-visible virtual dispatch via
constructorTypeMap,parameterTypesextraction inextractMethodSignature - Phase 14 enhancements: single-pass seeding, Tarjan's SCC for cyclic resolution, cross-file return types
- Optional parameter arity resolution
- Per-language cross-file binding tests and resolver fixes
- Store all overloads in
fileIndexinstead of last-write-wins
- Phase A/B/C: overload disambiguation via argument literal types, constructor-visible virtual dispatch via
- Cross-file binding propagation for multiple languages
- HTTP embedding backend for self-hosted/remote endpoints with dynamic dimensions, batch guards, and dimension mismatch handling (#395)
- Markdown file indexing — headings and cross-links as graph nodes (#399)
- MiniMax provider support (#224)
- Codex MCP and skills support with CLI setup flow and e2e tests
- HelpPanel UI — built-in help for the web interface (#465)
- Section node type registered in
NODE_TABLESandNODE_SCHEMA_QUERIES(#401) - Community and Process node properties documented in cypher tool description (#411)
- Server-mode hydration regression tests
- Pre-commit hooks via husky for typecheck + unit tests
Fixed
- Python import alias resolution —
import X as Ynow routes module aliases directly tomoduleAliasMapin import processor (#417, #461) - Python module-qualified calls resolved via
moduleAliasMap(#337) - Python module-qualified constructor calls (Issue #337)
- Heritage/MRO edges now calculate confidence per resolution tier (#412)
- LadybugDB lock — retry on DB lock with session-safe cleanup (#325)
- CORS — allow private/LAN network origins (#390)
- Analyze without git — allow indexing folders without a
.gitdirectory (#384) - Web: LadybugDB —
getAllRows,loadServerGraph, BM25, highlight clearing (#474) - Server-mode hydration — await server connect hydration flow (#398, #404)
- Embedding dimensions — validate on every vector, not just the first; hard-throw on mismatch
- Timeout detection — always-on dim validation, test hardening
- ONNX CUDA — prevent uncatchable native crash when CUDA libs present but ORT lacks CUDA provider; clarify linux/x64-only
- CLI — run codex mcp add via shell on Windows; write tool output to stdout via fd 1
- Stale progress, cross-platform prepare, DEV log fixes
- Import resolution API simplified per PR #409 review findings (P0–P3)
- Auto-labeling — switched from clustering to z-score method; multi-dim aware Mahalanobis threshold
- PR/issue filtering — fixed prop cutoff issue
- Sequential enrichment queries + stale data detection
- package-lock.json synced with
onnxruntime-node ^1.24.0
Changed
- Unified language dispatch with compile-time exhaustive tables
- Prepare script simplified — removed
scripts/prepare.cjs - Switched from .githooks to husky for pre-commit hooks
@claudeworkflow restricted to maintainers and above viaauthor_associationcheck
Performance
- O(1) per-chunk synthesis guard using
boolean[]instead of Set sizeBeforeoptimization in type resolution- Token truncation improvements
Chore
- Strengthened Python module-import tests, un-skipped match/case, added perf guard
- Added positive and negative tests for all 4 bug fixes
- E2e tests for stale detection, sequential enrichment, stability (#396)
- Integration tests for Milestone D across all 11 languages
gitnexus-stable-opsadded to community integrations.env.exampleadded for embedding backend configuration
[1.4.7] - 2026-03-19
Added
- Phase 8 field/property type resolution — ACCESSES edges with
declaredTypefor field reads/writes (#354) - Phase 9 return-type variable binding — call-result variable binding across 11 languages (#379)
extractPendingAssignmentin per-language type extractors captureslet x = getUser()patterns- Unified fixpoint loop resolves variable types from function return types after initial walk
- Field access on call-result variables:
user.nameresolvesnamevia return type's class definition - Method-call-result chaining:
user.getProfile().bioresolves through intermediate return types - 22 new test fixtures covering call-result and method-chain binding across all supported languages
- Integration tests added for all 10 language resolver suites
- ACCESSES edge type with read/write field access tracking (#372)
- Python
enumerate()for-loop support with nested tuple patterns (#356) - MCP tool/resource descriptions updated to reflect Phase 9 ACCESSES edge semantics and
declaredTypeproperty
Fixed
- mcp: server crashes under parallel tool calls (#326, #349)
- parsing: undefined error on languages missing from call routers (#364)
- web: add missing Kotlin entries to
Record<SupportedLanguages>maps - rust:
awaitexpression unwrapping inextractPendingAssignmentfor async call-result binding - tests: update property edge and write access expectations across multiple language tests
- docs: corrected stale "single-pass" claims in type-resolution-system.md to reflect walk+fixpoint architecture
Changed
- Upgrade
@ladybugdb/coreto 0.15.2 and remove segfault workarounds (#374) - type-resolution-roadmap.md overhauled — completed phases condensed to summaries, Phases 10–14 added with full engineering specs
[1.4.6] - 2026-03-18
Added
- Phase 7 type resolution — return-aware loop inference for call-expression iterables (#341)
ReturnTypeLookupinterface withlookupReturnType/lookupRawReturnTypesplitForLoopExtractorContextcontext object replacing positional(node, env)signature- Call-expression iterable resolution across 8 languages (TS/JS, Java, Kotlin, C#, Go, Rust, Python, PHP)
- PHP
$this->propertyforeach via@varclass property scan (Strategy C) - PHP
function_call_expressionandmember_call_expressionforeach paths extractElementTypeFromStringas canonical raw-string container unwrapper inshared.tsextractReturnTypeNamededuplicated fromcall-processor.tsintoshared.ts(137 lines removed)SKIP_SUBTREE_TYPESperformance optimization with documentedtemplate_stringexclusionpendingCallResultsinfrastructure (dormant — Phase 9 work)
Fixed
- impact: return structured error + partial results instead of crashing (#345)
- impact: add
HAS_METHODandOVERRIDEStoVALID_RELATION_TYPES(#350) - cli: write tool output to stdout via fd 1 instead of stderr (#346)
- postinstall: add permission fix for CLI and hook scripts (#348)
- workflow: use prefixed temporary branch name for fork PRs to prevent overwriting real branches
- test: add
--repoto CLI e2e tool tests for multi-repo environment - php: add
declaration_listtype guard onfindClassPropertyElementTypefallback - docs: correct
pendingCallResultsdescription in roadmap and system docs
Chore
- Add
.worktrees/to.gitignore
[1.4.5] - 2026-03-17
Added
- Ruby language support for CLI and web (#111)
- TypeEnvironment API with constructor inference, self/this/super resolution (#274)
- Return type inference with doc-comment parsing (JSDoc, PHPDoc, YARD) and per-language type extractors (#284)
- Phase 4 type resolution — nullable unwrapping, for-loop typing, assignment chain propagation (#310)
- Phase 5 type resolution — chained calls, pattern matching, class-as-receiver (#315)
- Phase 6 type resolution — for-loop Tier 1c, pattern matching, container descriptors, 10-language coverage (#318)
- Container descriptor table for generic type argument resolution (Map keys vs values)
- Method-aware for-loop extractors with integration tests for all languages
- Recursive pattern binding (C#
ispatterns, Kotlinwhen/issmart casts) - Class field declaration unwrapping for C#/Java
- PHP
$this->propertyforeach member access - C++ pointer dereference range-for
- Java
this.data.values()field access patterns - Position-indexed when/is bindings for branch-local narrowing
- Type resolution system documentation with architecture guide and roadmap
.gitignoreand.gitnexusignoresupport during file discovery (#231)- Codex MCP configuration documentation in README (#236)
skipGraphPhasespipeline option to skip MRO/community/process phases for faster test runshookTimeout: 120000in vitest config for CI beforeAll hooks
Changed
- Migrated from KuzuDB to LadybugDB v0.15 (#275)
- Dynamically discover and install agent skills in CLI (#270)
Performance
- Worker pool threshold — skip worker creation for small repos (<15 files or <512KB total)
- AST walk pruning via
SKIP_SUBTREE_TYPESfor leaf-only nodes (string, comment, number literals) - Pre-computed
interestingNodeTypesset — single Set.has() replaces 3 checks per AST node fastStripNullable— skip full nullable parsing for simple identifiers (90%+ case)- Replace
.children?.find()with manual for loops inextractFunctionNameto eliminate array allocations
Fixed
- Same-directory Python import resolution (#328)
- Ruby method-level call resolution, HAS_METHOD edges, and dispatch table (#278)
- C++ fixture file casing for case-sensitive CI
- Template string incorrectly included in AST pruning set (contains interpolated expressions)