# Changelog All notable changes to GitNexus will be documented in this file. ## [Unreleased] ## [1.6.4] - 2026-05-10 ### Added - **`gitnexus publish`** — opt-in command to push your indexed graph to the understand-quickly registry for shareable browsing (#1425) - **`IncludeExtractor` for C++** — cross-repo include tracking joins the group contract pipeline (#1156) - **Unreal Engine C++ support** — strips reflection macros (`UCLASS`, `UFUNCTION`, `UPROPERTY`, etc.) before tree-sitter parses, so UE projects index cleanly (#1439) - **Thrift contracts extractor** — group-mode contract detection for Apache Thrift IDL (#1234) - **Workspace extractors for Node, Python, Go, Java, Elixir** — group-mode auto-discovery of cross-package boundaries (#1260) - **Rust workspace cross-crate contracts** — auto-discovery of `[workspace]` member crates and their cross-crate links (#1256) - **Go scope-resolution hooks** — Go joins Python / C# / TypeScript on the registry-primary RFC #909 path (#1302) - **TypeScript registry-primary scope resolution (Ring 3)** — TypeScript fully migrated to scope-based resolution (#1050) - **Configurable group cross-link path exclusions** — reduces false-positive contract links in vendored / monorepo trees (#1093) - **MCP tool safety annotations** — every MCP tool advertises read-only / mutating semantics so hosts can prompt appropriately (#1127) - **`--embeddings ` opt-in cap** — bound the embeddings pass on huge graphs (closes #382, #1375) - **Pino structured logger** — replaces ad-hoc console output across the core with structured JSON logs (with pretty-print for TTY) (#1336) - **Shared resilient-fetch helper** — single retries + circuit breaker module reused by HF / Docker / publish flows (#1448) - **`/autofix` ChatOps button** — fork-safe PR autofix pipeline replaces the inline reviewdog flow (#1446, #1458) - **Automated security & vulnerability scans** in CI (#1297, #1455) ### Fixed - **FTS read-only DB cluster** — hook resolves canonical repo root and guards read-only FTS ensure; missing-FTS warning is now surfaced. Closes #1255, #1287, #1170, #1449, #1440, #1216, #1438 (#1226, #1418, #1107, #1123) - **WAL corruption recovery** — quarantine corrupted `.wal` files instead of failing analyze; CHECKPOINT before close prevents recurrence; `safeClose` consolidates flush. Closes #1402, #1236, #1273, #1361 (#1417, #1314, #1377) - **Embedding download failures** — actionable HF_ENDPOINT guidance, retries, timeout, and circuit breaker; bridge `HF_ENDPOINT` to transformers.js; iterative DFS; HF cache via `os.homedir()`. Closes #1378, #1437, #1205 (#1419, #1252, #1078) - **Windows reliability** — pin tree-sitter-c/cpp to fix segfault, prefer `.cmd`/`.bat` from `where` output, robust LadybugDB lock acquisition for CI integration tests, surface silent finalize-skips so analyze cannot exit 0 without persisting. Closes #1242, #1427, #1447, #1468, #1400; partial #1218 (#1243, #1299, #1430, #1237, #1226, #1235) - **DuckDB / LadybugDB native** — bumped to 0.16.0 then 0.16.1; prevent extension install hangs; CHECKPOINT before close; WAL quarantine on corruption. Closes #1162, #1160, #273 (#1235, #1326, #1129, #1314, #1417) - **C# scope-resolution "Cannot add property" crashes** — generic typed properties included in context and impact, fixing crashes on Unity ECS partial structs and on properties whose name matches the class name. Closes #1426, #1465 (#1399) - **C# frozen-bucket regression** + scope-resolution I8 hardening — closes #1066 (#1082, #1085) - **Scope resolution** — same-range Module-as-parent for top-level scopes (closes #1086) (#1087); avoid variadic reference-site aggregation (#1112); skip empty scope extraction (#1100); classify Python class methods as Method (#1102) - **Python** — index repos with empty `__init__.py` and >32 KB files (#1163); walk ancestors for multi-segment dotted imports (#1241); deterministic multi-segment suffix fallback (#1253) - **TypeScript** — capture missed CALLS edges from HOF callbacks and JSX (#1175); name HOC-wrapped const declarations (`forwardRef` / `memo` / `useCallback` / `useMemo` / `observer`) (#1261); pair-with-arrow `@declaration.function` anchored on inner arrow - **Go** — loose equality for `Array.find()` null checks (#1384) - **Swift** — switched to the official prebuilt parser runtime (#1130) - **Server hardening cluster (U2–U8)** — JS path-injection on `/api/file` + docker-server (U2, #1322); git-clone path/CLI-injection / ReDoS hardening (U3, #1325); per-route rate limiting on FS-touching endpoints (U4, #1327); URL/regex/tag-filter sanitization (U7, #1330); ReDoS in cobol-preprocessor + rust-workspace + cross-impact resource exhaustion (U8, #1331); critical type-confusion + validation helper (#1317); rate-limit `/api/analyze` and `/api/embed` (closes #1328, #1339); IPv6 ipKeyGenerator (closes #1360, #1374); IPv4-compatible IPv6 / NAT64 SSRF bypasses in `validateGitUrl` (closes #1148, 95814847); predictable tempfile names → `crypto.randomBytes` (#1387); log-injection / http-to-file-access / client-side request forgery (#1456); pin Docker Node base images + Trivy verification + Dependabot policy (#1455) - **Group / contracts** — `runExactMatch` honours `.gitnexusignore` via shared `IgnoreService` (closes #1185, #1247); custom manifest links resolved against graph symbols (#1254); `IgnoreService` EACCES test under uid=0 (#1108) - **MCP** — close MCP server timeout via stdout discipline + cold-start friction (#1383); avoid `git` from non-repo cwd in sibling-cwd match (closes #1138, #1293); start MCP bridge correctly when using `npx` (#1114); project `tool_map` flows from handlers (#1113); parallelize staleness checks in `list_repos` (#1416) - **Storage / CLI** — derive registry name from canonical repo root, not worktree slug (closes #1259, #1296); `--skip-git` treats cwd as index root (#1245); keep GitNexus ignores inside `.gitnexus/` (#1248); surface silent finalize-skips so `analyze` cannot exit 0 without persisting (closes #1169, #1237); ignore global registry during staleness checks (#1141); use `os.homedir()` instead of `process.env.HOME` for HF cache dir (#1078); correct OpenCode skills install path in status message (#1386) - **Docker / server** — dedicated health endpoint for container healthcheck (closes #1147, #1355); HEAD probe so SSE heartbeat doesn't time out healthcheck (#1182); flush WAL after `/api/embed` so search sees new embeddings (closes #1149, #1359); platform-aware semantic fallback (#1150); skip vector index query on unsupported platforms (closes #1178, #1181); serve web UI at root path instead of 404 (#1048) - **Worker pool** — wait for replacement worker online before dispatch (#1324); prevent premature pool resolution in worker split-and-retry path (#1321); recover worker parse stalls (#1121); widened CI flake-tolerant timeouts (#1323, #1347, #1354) - **Embeddings storage** — CHECKPOINT before closing DB to prevent WAL corruption (#1314) - **Performance** — replace O(n³) C3 merge loop with O(n²) head-pointer algorithm (#1316) - **Install** — vendor tree-sitter-dart source (#1125) - **Git utils** — suppress stderr leak in `getCurrentCommit` and `getGitRoot` (closes #1172, #1341) - **Search** — load FTS during core DB init (#1123); create FTS indexes during `analyze` (#1107); surface warning when FTS indexes are missing (#1418) - **Hooks** — clarify `PostToolUse` hook is notification-only, not auto-reindex (#1070) - **Docs** — README Web UI section corrected (closes #1110, #1159, #2ff3e64f); Goliath capitalisation typo (#1126) - **CI** — fork-safe PR autofix pipeline (#1446); consolidated Claude review workflow (#1258); fine-grained PAT for RC tag push (#1407); handle expired artifacts in base coverage fetch (#1410, #1412); allow expected legacy parity failures (#1099); avoid duplicate main push checks; isolate native LadybugDB / CLI e2e flakes; seed e2e with a small fixture repo (#1249); configure e2e GitNexus home at runtime; widen rate-limit test window for Windows CI (#1347) ### Changed - **`gitnexus publish` artefact contract** — universal opt-in publish format introduced (#1425, #1458) - **Refactor: per-language patterns consolidated into `LanguageProvider`** (#1279) - **Refactor: `safeClose` helper** consolidates WAL flush across LadybugDB call sites (#1377) - **Quality: exclude `test/fixtures` from CodeQL, ESLint, and Prettier** (#1313) - **Regression coverage** for `.gitnexusignore` behaviour with `--skip-git` (#1450) ### Chore / Dependencies - `@ladybugdb/core` 0.16.0 → 0.16.1 (#1235, #1326) - `@anthropic-ai/sdk` (#1442), `@langchain/anthropic` (#1389), `@langchain/core` (#1394), `@langchain/openai` (#1215) - `hono` 4.12.9 → 4.12.18 + `@hono/node-server` (#1310, #1311, #1443) - `axios` (#1345), `fast-uri` 3.1.0 → 3.1.2 (#1441), `lru-cache` 11.3.5 → 11.3.6 (#1344), `mnemonist` 0.40.3 → 0.40.4 (#1239), `express-rate-limit` (#1343, #1397), `onnxruntime-node` (#1213, #1435), `uuid` 13 → 14 in /gitnexus-web (#1211, after revert #1222 / re-land #1250 + #1208) - `react`/`@types/react` (#1210), `react-dom` 19.2.5 → 19.2.6 (#1396), `react-zoom-pan-pinch` (#1214), `jsdom` 29.0.2 → 29.1.1 (#1395) - npm_and_yarn group bump (#1312), uv group bump (#1315), `python-dotenv` (#1320), `@types/node` (#1212, #1421, #1436) - GitHub Actions: `docker/build-push-action` 6.19.2 → 7.1.0 (#1391), `github/codeql-action` 3.35.3 → 4.35.3 (#1390) ## [1.6.3] - 2026-04-24 ### Added - **Cross-repo impact analysis** — `@repo` MCP routing plus group resources let impact queries span multiple indexed repositories in a group (#794, #984) - **Python scope-based call resolution** — registry-primary flip, performance, and generalization work from RFC #909 Ring 3 (#980) - **C# scope-resolution migration** — C# now runs on the registry-primary path alongside Python (#934, #1019) - **RFC #909 Ring 1 & Ring 2 scope-resolution infrastructure** — the shared foundation for language-agnostic scope resolution: - Scope-resolution types and constants, `LanguageProvider` hook extension (#910, #911, #949, #950) - `ScopeTree` + `PositionIndex` + `makeScopeId` (#912, #961) - `DefIndex` / `ModuleScopeIndex` / `QualifiedNameIndex` (#913, #958) - `MethodDispatchIndex` materialized view over `HeritageMap` (#914, #960) - `resolveTypeRef` strict single-return type resolver (#916, #959) - SCC-aware finalize with bounded fixpoint (#915, #962) - `ClassRegistry` / `MethodRegistry` / `FieldRegistry` + 7-step lookup (#917, #963) - Shadow-mode diff + aggregate, parity harness + static dashboard (#918, #923, #951, #972) - `ScopeExtractor` driver with 5-pass CaptureMatch → ParsedFile (#919, #965) - `ScopeExtractor` wired into parse-worker + processor (#920, #969) - `finalize-orchestrator` materializes `ScopeResolutionIndexes` (#921, #970) - Per-language `resolveImportTarget` adapter (#922, #971) - `REGISTRY_PRIMARY_` per-language flag reader (#924, #968) - `emit-references` drains `ReferenceIndex` to graph edges (#925, #973) - **`gitnexus analyze --name `** with duplicate-name guard in the repo registry (#955) - **`gitnexus remove `** unindexes a registered repo by name or path (#664, #1003) - **Auto-infer registry name** from `git remote.origin.url` when `--name` is omitted (#981) - **Sibling-clone drift detection** — indexed repos are fingerprinted by remote URL so duplicate registrations are caught before graph divergence (#982) - **Configurable large-file skip threshold** — the walker's 512 KB default is now overridable via `GITNEXUS_MAX_FILE_SIZE` (KB) or `gitnexus analyze --max-file-size `. Values are clamped to the 32 MB tree-sitter ceiling, invalid inputs fall back to the default with a one-time warning, and the CLI banner reports the effective post-clamp threshold when an override is active (#991, #1044, #1045) - **`GITNEXUS_INDEX_TEST_DIRS` opt-in** for `__tests__` / `__mocks__` traversal (#771, #1046) - **`analyze` embedding preservation** — existing embeddings are preserved by default, `--force` regenerates them, `--drop-embeddings` opts out entirely (CLI + HTTP API) (#1055) - **Structural embedding chunking** with data-driven `CHUNKING_RULES` dispatch, replacing the flat line-based split (#987) - **PHP HTTP consumer detection** for the extractor catalogue (#993) - **Per-phase search timing** instrumentation across the query pipeline (#953) - **MCP disambiguation ranking** — `context` / `impact` candidates are ranked and expose `kind` / `file_path` hints (#888) - **Docker images for UI + CLI/server** shipped via `docker-compose` with cosign signing (#967), RC image builds (#978), and GHCR → Docker Hub mirroring (#1029) ### Fixed - **Go CALLS edges for receiver methods** — worker source IDs now align with the main pipeline, restoring receiver-method call edges (#1043) - **Node 22 DEP0151 warning** from `tree-sitter-c-sharp` import silenced (#1013, #1049) - **FTS index bootstrap** tries a local `LOAD` before `INSTALL` so offline/air-gapped runs no longer fail on network errors (#726) - **FTS ensure failures** are no longer cached and are invalidated on pool teardown (#1006) - **`groupImpact` local-impact errors** now bubble to the caller instead of being swallowed (#1004, #1007) - **Friendly error** when a group name is not found, with regression test for #903 (#989) - **`bm25` results** return FTS-matched symbols instead of an arbitrary `LIMIT 3` slice (#806) - **Embedding AST traversal** switched from recursion to iterative DFS, fixing stack overflow on deeply nested files (#990) - **React component path detection** runs before lowercasing, so mixed-case `.jsx`/`.tsx` files are recognised (#260) - **`detect-changes` ENOBUFS** by setting `maxBuffer` on `git` / `rg` `execFileSync` invocations (#957) - **`detect-changes` in direct CLI** — command was wired to MCP only; now exposed on the CLI as well (#892) - **CLI gitnexus markers** — `` is only matched at section position, no longer inside code/prose (#1041, #1042) - **`opencode.json` setup** preserves existing comments and config during install (#998) - **Sequential parser logging** — skipped languages are now logged instead of silently dropped (#1021) - **`cli-e2e` fixture isolation** from the shared mini-repo, plus stabilised `rel-csv-split` stream teardown on Windows via `expect.poll` (#954, #1052) - **Docker** — RC build guarded against empty `vtag`, `inputs.tag` used to detect `workflow_call` context, web builder stage now copies `gitnexus/package.json`, base image switched from alpine to debian (#983, #996, #997, #1014) - **CI** — reusable `docker.yml` now inherits secrets from `release-candidate.yml` (#1054) ### Changed - **`setup` config I/O unified** on `mergeJsoncFile` across all writers (#1031) - **Docker CI** gains a retry wrapper for `build-push` with visibility and hardened shell ### Chore / Dependencies - Dependency bumps: `graphology` 0.25.4 → 0.26.0 (#1001), `uuid` 13 → 14 (#1000), `@huggingface/transformers` (#1035), `@types/node` (#1002), `@types/uuid` (#1016), `vitest` 4.1.4 → 4.1.5 (#1017), `@vitest/coverage-v8` (#1018) - gitnexus-web dependency bumps: `vite` 5.4.21 → 6.4.2 → 7.3.2 → 8.0.10 + `vitest` 4 (#1061, #1062, #1063), `lucide-react` 0.562.0 → 1.11.0 with local GitHub SVG fallback (#1038), `@langchain/anthropic` 1.3.10 → 1.3.27 (#1039), `@babel/types` (#1037) - gitnexus-shared dependency bumps: `typescript` (#1034) - GitHub Actions bumps: `actions/setup-node` 6.3.0 → 6.4.0 (#1033) - Documentation: repo-wide `DoD.md` Definition of Done (#1032), gRPC microservices group guide (#906, #994), `group add` / `group remove` README fixes (#1020), CLI docs include `--skip-git` (#750), README Discord link updated ## [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` / `Variable` nodes 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` / `$.post` and `axios({ 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.baz` refers 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`** — devendored `tree-sitter-proto` install lifecycle + preinstall cleanup so `npm i -g gitnexus@latest` succeeds on top of an older install (#843, #846) - **`env.cacheDir`** now 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-sharp` version pin** — locked to 0.23.1 to avoid a breaking change in a transitive prerelease (#834) - **`release-drafter` v7 CI** — replaced the removed `disable-releaser` flag with `dry-run` so release-note drafts still work - **`npm arborist` crash from `tree-sitter-dart`** — switched the dependency URL format so `npm install` no longer crashes on clean installs - **Service-group `ManifestExtractor`** — `config.links` now 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`, and `heritage-map` now consult `table.model.*` directly; 37 internal call sites migrated off the SymbolTable wrapper (#885) - **Per-strategy `ImportSemantics` hooks** — `named` / `wildcard-transitive` / `wildcard-leaf` / `namespace` strategies 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: `glob` 11.1.0 → 13.0.6 (#867), `commander` 12.1.0 → 14.0.3 (#868), `@huggingface/transformers` (#869), `@modelcontextprotocol/sdk` (#866), `lru-cache` 11.2.7 → 11.3.5 (#870), `mnemonist` 0.39.8 → 0.40.3 (#871), `@ladybugdb/core` (#873) - gitnexus-web dependency bumps: `mermaid` 11.12.2 → 11.14.0 (#860), `tailwindcss` (#861), `jsdom` 29.0.0 → 29.0.2 (#863), `wait-on` 8.0.5 → 9.0.5 (#859), `@vitest/coverage-v8` (#864) - GitHub Actions bumps: `actions/checkout` 4.3.1 → 6.0.2 (#842), `actions/upload-artifact` 4.6.2 → 7.0.1 (#838), `actions/setup-node` 4.4.0 → 6.3.0 (#841), `actions/cache` 5.0.4 → 5.0.5 (#840), `actions/github-script` 7.0.1 → 9.0.0 (#850), `dorny/paths-filter` 3.0.2 → 4.0.1 (#839), `amannn/action-semantic-pull-request` 6.1.1 (#853), `release-drafter/release-drafter` 6.0.0 → 7.2.0 (#852), `marocchino/sticky-pull-request-comment` 3.0.4 (#851), `softprops/action-gh-release` 2.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-dart` install 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-shared`** removed from the published package (#803) - **Ruby `singleton_class` context** 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), tightened `ParseOutput.exportedTypeMap` immutability, 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) - `lookupMethodByOwnerWithMRO` using 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 `resolveUncached` replacing `lookupFuzzy` data source for all tiers (#764) - Deleted `lookupFuzzy`, `lookupFuzzyCallable`, `globalIndex`, `callableIndex` — replaced with structured lookups (#769) - Deleted `resolveCallTarget` god-method — replaced with thin dispatcher delegating to `resolveMemberCall` (#744), `resolveStaticCall` (#754), `resolveFreeCall` (#756) (#770) - **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::method` as 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_HOME` env 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) - **`lookupMethodByOwner` index** 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_changes` diff 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** — `lookupExact` replaced with `lookupExactAll` (#755) - **`.gitnexusignore` negation 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_TYPES` constant (#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-shared` module not found** — `gitnexus-shared` was a `file:` workspace dependency never published to npm, causing `ERR_MODULE_NOT_FOUND` when installing `gitnexus` globally. The build now bundles shared code into `dist/_shared/` and rewrites imports to relative paths (#613) - **v1.5.1 publish regression** — npm's `prepare` lifecycle ran `tsc` after `prepack`, 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-shared` bundling — `prepare` script 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-shared` package 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 - **Azure OpenAI support for wiki command** — fixed broken Azure auth (`api-key` header), `api-version` URL parameter, reasoning model handling (`max_completion_tokens`, no `temperature`), content filter error messages; added interactive setup wizard, `--api-version` and `--reasoning-model` CLI flags (#562) - **Java method references & interface dispatch** — `obj::method` treated 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 `methodInfoCache` keyed by `name:line` - C# config with `sealed`, `params`/`out`/`ref`/optional parameters, `[Attribute]` syntax, `internal` visibility (#582) - **`--skip-agents-md` CLI flag** — opt out of overwriting GitNexus-managed sections in AGENTS.md and CLAUDE.md during `gitnexus analyze` (#517) - **Prettier** — monorepo-wide code formatter with lint-staged + Husky pre-commit hook, `.prettierrc` config, Tailwind CSS v4 plugin, `endOfLine: "lf"` + `.gitattributes` for Windows consistency (#563) - **ESLint v9** — flat config with `unused-imports` auto-removal, `@typescript-eslint` rules, React hooks rules, CI `lint` job (#564) ### Fixed - **OpenCode MCP configuration** — corrected README MCP setup for OpenCode which requires `command` as 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 `any` types** — 128 `no-explicit-any` warnings eliminated (689 → 561, 19% reduction) across `NodeProperties` index signature, ~80 `SyntaxNode` substitutions, typed worker protocol, and graphology community detection (#566) ### Docs - Added `gitnexus-shared` build 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) - `FieldVisibility` union type, `extractNames` hook 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_encode` patterns (#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`, `parameterTypes` extraction in `extractMethodSignature` - 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 `fileIndex` instead of last-write-wins - **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_TABLES` and `NODE_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 Y` now routes module aliases directly to `moduleAliasMap` in 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 `.git` directory (#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 - **`@claude` workflow** restricted to maintainers and above via `author_association` check ### Performance - **O(1) per-chunk synthesis guard** using `boolean[]` instead of Set - **`sizeBefore` optimization** 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-ops` added to community integrations - `.env.example` added for embedding backend configuration ## [1.4.7] - 2026-03-19 ### Added - **Phase 8 field/property type resolution** — ACCESSES edges with `declaredType` for field reads/writes (#354) - **Phase 9 return-type variable binding** — call-result variable binding across 11 languages (#379) - `extractPendingAssignment` in per-language type extractors captures `let x = getUser()` patterns - Unified fixpoint loop resolves variable types from function return types after initial walk - Field access on call-result variables: `user.name` resolves `name` via return type's class definition - Method-call-result chaining: `user.getProfile().bio` resolves 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 `declaredType` property ### 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` maps - **rust**: `await` expression unwrapping in `extractPendingAssignment` for 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/core` to 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) - `ReturnTypeLookup` interface with `lookupReturnType` / `lookupRawReturnType` split - `ForLoopExtractorContext` context object replacing positional `(node, env)` signature - Call-expression iterable resolution across 8 languages (TS/JS, Java, Kotlin, C#, Go, Rust, Python, PHP) - PHP `$this->property` foreach via `@var` class property scan (Strategy C) - PHP `function_call_expression` and `member_call_expression` foreach paths - `extractElementTypeFromString` as canonical raw-string container unwrapper in `shared.ts` - `extractReturnTypeName` deduplicated from `call-processor.ts` into `shared.ts` (137 lines removed) - `SKIP_SUBTREE_TYPES` performance optimization with documented `template_string` exclusion - `pendingCallResults` infrastructure (dormant — Phase 9 work) ### Fixed - **impact**: return structured error + partial results instead of crashing (#345) - **impact**: add `HAS_METHOD` and `OVERRIDES` to `VALID_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 `--repo` to CLI e2e tool tests for multi-repo environment - **php**: add `declaration_list` type guard on `findClassPropertyElementType` fallback - **docs**: correct `pendingCallResults` description 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# `is` patterns, Kotlin `when/is` smart casts) - Class field declaration unwrapping for C#/Java - PHP `$this->property` foreach 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 - `.gitignore` and `.gitnexusignore` support during file discovery (#231) - Codex MCP configuration documentation in README (#236) - `skipGraphPhases` pipeline option to skip MRO/community/process phases for faster test runs - `hookTimeout: 120000` in 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_TYPES` for leaf-only nodes (string, comment, number literals) - Pre-computed `interestingNodeTypes` set — 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 in `extractFunctionName` to 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) ## [1.4.0] - Previous release