GitNexus/CHANGELOG.md
Minidoracat 10d1e47df3
fix(hooks): bound db-lock probe subprocesses and gate probe behind hook slot (#2163) (#2165)
* fix(hooks): bound db-lock probe subprocesses and gate probe behind hook slot (#2163)

The Claude PreToolUse db-lock probe leaks orphaned lsof processes when
the hook process is hard-killed mid-probe (e.g. Claude Code's 10s hook
timeout under load). Orphans accumulate, raise load, slow the next
probe, and snowball to sustained 100% CPU.

- Wrap the unix lsof/ps fallback in coreutils timeout (-k 1 2 / -k 1 1),
  resolved via a lazy self-test, so probe children self-destruct within
  ~3s even if the hook is SIGKILLed. GITNEXUS_HOOK_TIMEOUT_PATH
  overrides the guard binary; the sentinel value 'disabled' turns the
  guard off; hosts without a usable guard keep the previous behavior.
- Acquire the per-repo hook slot before probing (all three adapters),
  bounding concurrent probes to 3 per .gitnexus, with probe and augment
  inside try/finally so the slot is always released.
- Tests: source-order contract, slot-gating behavior, orphan reaping
  with a SIGTERM-immune fake lsof and a SIGKILLed parent (red on base),
  probe-copy byte parity, no-guard equivalence, broken-guard rejection.

Note: pre-commit typecheck skipped; the 62 tsc errors are pre-existing
on main (all in src/core/** and src/server/, none in files touched
here; base==head invariant verified).

* fix(hooks): address tri-review P3 findings (#2165)

- Map guard signal-death (status null + signal, no spawnSync error) to
  fail-closed at both the lsof and ps call sites, closing the freeze
  window (SIGSTOP / laptop sleep > 2s) that previously landed fail-open.
  Rewrite the exit-code comments: coreutils surfaces the -k kill as
  signal death, 124 is budget expiry (live arm), 137 covers only
  exit-code-propagating wrappers or an externally SIGKILLed child.
- Add a debug-gated 'augment skipped: hook slots saturated' stderr line
  on the slot-starved early return in all three adapters, restoring
  observability under GITNEXUS_DEBUG=1.
- GITNEXUS_HOOK_TIMEOUT_PATH now participates in candidate fall-through:
  the env candidate is tried first, then the built-ins, each behind the
  lazy self-test — an existing-but-unusable env path (directory,
  non-executable) can no longer silently disable orphan containment.
- Tests: +6 — guard exit 124 pins the live arm (CJS+Plugin), guard
  signal-death pins the new mapping (CJS+Plugin, red before the fix),
  antigravity behavioral slot-gate, env-dir fall-through still reaps a
  SIGTERM-immune orphan via a built-in guard.

Note: pre-commit typecheck skipped; the 62 tsc errors are pre-existing
on main (none in files touched here).
2026-06-11 15:38:13 +01:00

8.4 KiB

Changelog

All notable changes to GitNexus will be documented in this file.

[Unreleased]

Fixed

  • Hook db-lock probe no longer strands unkillable lsof/ps orphans — the probe's lsof/ps subprocesses are now wrapped in a self-tested coreutils timeout/gtimeout (timeout -k 1 …), so a hook SIGKILLed by the runner's 10s timeout can no longer leave lsof running forever (orphan lifetime bounded at ~3s); acquireHookSlot now also gates the probe itself, capping concurrent probes at 3 per repo. Opt out with GITNEXUS_HOOK_TIMEOUT_PATH=disabled. (#2163)

Changed

  • Migrated from KuzuDB to LadybugDB v0.15 (@ladybugdb/core, @ladybugdb/wasm-core)
  • Renamed all internal paths from kuzu to lbug (storage: .gitnexus/kuzu.gitnexus/lbug)
  • Added automatic cleanup of stale KuzuDB index files
  • LadybugDB v0.15 requires explicit VECTOR extension loading for semantic search

[1.5.3] - 2026-04-01

Added

  • TypeScript/JavaScript MethodExtractor config — shared extraction config covering abstract methods, visibility modifiers, async/override keywords, decorators, rest/optional/destructured parameters, and return types (#588) — @compound-ai

Fixed

  • Azure OpenAI compatibility — use max_completion_tokens instead of deprecated max_tokens (newer models reject max_tokens); skip temperature for Azure provider (some models reject non-default values) (#618)
  • Simplified Azure interactive setup — 3 prompts (endpoint, deployment, key) instead of 7 (#618)
  • Wiki HTML viewer script injection — escape </script> in embedded JSON so LLM-generated markdown no longer breaks the viewer (#618)
  • Ensure import rewrites survive npm publish lifecycle

[1.4.0] - 2026-03-13

Added

  • Language-aware symbol resolution engine with 3-tier resolver: exact FQN → scope-walk → guarded fuzzy fallback that refuses ambiguous matches (#238) — @magyargergo
  • Method Resolution Order (MRO) with 5 language-specific strategies: C++ leftmost-base, C#/Java class-over-interface, Python C3 linearization, Rust qualified syntax, default BFS (#238) — @magyargergo
  • Constructor & struct literal resolution across all languages — new Foo(), User{...}, C# primary constructors, target-typed new (#238) — @magyargergo
  • Receiver-constrained resolution using per-file TypeEnv — disambiguates user.save() vs repo.save() via ownerId matching (#238) — @magyargergo
  • Heritage & ownership edges — HAS_METHOD, OVERRIDES, Go struct embedding, Swift extension heritage, method signatures (parameterCount, returnType) (#238) — @magyargergo
  • Language-specific resolver directory (resolvers/) — extracted JVM, Go, C#, PHP, Rust resolvers from monolithic import-processor (#238) — @magyargergo
  • Type extractor directory (type-extractors/) — per-language type binding extraction with Record<SupportedLanguages, Handler> + satisfies dispatch (#238) — @magyargergo
  • Export detection dispatch table — compile-time exhaustive Record + satisfies pattern replacing switch/if chains (#238) — @magyargergo
  • Language config module (language-config.ts) — centralized tsconfig, go.mod, composer.json, .csproj, Swift package config loaders (#238) — @magyargergo
  • Optional skill generation via npx gitnexus analyze --skills — generates AI agent skills from KuzuDB knowledge graph (#171) — @zander-raycraft
  • First-class C# support — sibling-based modifier scanning, record/delegate/property/field/event declaration types (#163, #170, #178 via #237) — @Alice523, @benny-yamagata, @jnMetaCode
  • C/C++ support fixes.h → C++ mapping, static-linkage export detection, qualified/parenthesized declarators, 48 entry point patterns (#163, #227 via #237) — @Alice523, @bitgineer
  • Rust support fixes — sibling-based visibility_modifier scanning for pub detection (#227 via #237) — @bitgineer
  • Adaptive tree-sitter buffer sizingMath.min(Math.max(contentLength * 2, 512KB), 32MB) (#216 via #237) — @JasonOA888
  • Call expression matching in tree-sitter queries (#234 via #237) — @ex-nihilo-jg
  • DeepSeek model configurations (#217) — @JasonOA888
  • 282+ new unit tests, 178 integration resolver tests across 9 languages, 53 test files, 1146 total tests passing

Fixed

  • Skip unavailable native Swift parsers in sequential ingestion (#188) — @Gujiassh
  • Heritage heuristic language-gated — no longer applies class/interface rules to wrong languages (#238) — @magyargergo
  • C# base_list distinguishes EXTENDS vs IMPLEMENTS via symbol table + I[A-Z] heuristic (#238) — @magyargergo
  • Go qualified_type (models.User) correctly unwrapped in TypeEnv (#238) — @magyargergo
  • Global tier no longer blocks resolution when kind/arity filtering can narrow to 1 candidate (#238) — @magyargergo

Changed

  • import-processor.ts reduced from 1412 → 711 lines (50% reduction) via resolver and config extraction (#238) — @magyargergo
  • type-env.ts reduced from 635 → ~125 lines via type-extractor extraction (#238) — @magyargergo
  • CI/CD workflows hardened with security fixes and fork PR support (#222, #225) — @magyargergo

[1.3.11] - 2026-03-08

Security

  • Fix FTS Cypher injection by escaping backslashes in search queries (#209) — @magyargergo

Added

  • Auto-reindex hook that runs gitnexus analyze after commits and merges, with automatic embeddings preservation (#205) — @L1nusB
  • 968 integration tests (up from ~840) covering unhappy paths across search, enrichment, CLI, pipeline, worker pool, and KuzuDB (#209) — @magyargergo
  • Coverage auto-ratcheting so thresholds bump automatically on CI (#209) — @magyargergo
  • Rich CI PR report with coverage bars, test counts, and threshold tracking (#209) — @magyargergo
  • Modular CI workflow architecture with separate unit-test, integration-test, and orchestrator jobs (#209) — @magyargergo

Fixed

  • KuzuDB native addon crashes on Linux/macOS by running integration tests in isolated vitest processes with --pool=forks (#209) — @magyargergo
  • Worker pool MODULE_NOT_FOUND crash when script path is invalid (#209) — @magyargergo

Changed

  • Added macOS to the cross-platform CI test matrix (#208) — @magyargergo

[1.3.10] - 2026-03-07

Security

  • MCP transport buffer cap: Added 10 MB MAX_BUFFER_SIZE limit to prevent out-of-memory attacks via oversized Content-Length headers or unbounded newline-delimited input
  • Content-Length validation: Reject Content-Length values exceeding the buffer cap before allocating memory
  • Stack overflow prevention: Replaced recursive readNewlineMessage with iterative loop to prevent stack overflow from consecutive empty lines
  • Ambiguous prefix hardening: Tightened looksLikeContentLength to require 14+ bytes before matching, preventing false framing detection on short input
  • Closed transport guard: send() now rejects with a clear error when called after close(), with proper write-error propagation

Added

  • Dual-framing MCP transport (CompatibleStdioServerTransport): Auto-detects Content-Length (Codex/OpenCode) and newline-delimited JSON (Cursor/Claude Code) framing on the first message, responds in the same format (#207)
  • Lazy CLI module loading: All CLI subcommands now use createLazyAction() to defer heavy imports (tree-sitter, ONNX, KuzuDB) until invocation, significantly improving gitnexus mcp startup time (#207)
  • Type-safe lazy actions: createLazyAction uses constrained generics to validate export names against module types at compile time
  • Regression test suite: 13 unit tests covering transport framing, security hardening, buffer limits, and lazy action loading

Fixed

  • CALLS edge sourceId alignment: findEnclosingFunctionId now generates IDs with :startLine suffix matching node creation format, fixing process detector finding 0 entry points (#194)
  • LRU cache zero maxSize crash: Guard createASTCache against maxSize=0 when repos have no parseable files (#144)

Changed

  • Transport constructor accepts NodeJS.ReadableStream / NodeJS.WritableStream (widened from concrete ReadStream/WriteStream)
  • processReadBuffer simplified to break on first error instead of stale-buffer retry loop

[1.3.9] - 2026-03-06

Fixed

  • Aligned CALLS edge sourceId with node ID format in parse worker (#194)

[1.3.8] - 2026-03-05

Fixed

  • Force-exit after analyze to prevent KuzuDB native cleanup hang (#192)