GitNexus v1.6.10
The resolution-correctness release. Receiver chains are now typed from AST structure in all 14 languages, imports resolve against declared module configuration instead of path-suffix guesses, and interface dispatch understands generic instantiation — while analyze itself gained a single-writer lock, an atomic index swap and a bounded buffer pool. 396 commits since v1.6.9.
✨ Highlights
- 🧬 Receiver chains are typed from AST structure across all 14 languages, with an explicit lower bound on what the graph is willing to claim. Inline constructors, closure-valued bindings, generic-typed fields and named receivers all resolve now. (#2708, #2744, #2747, #2833, #2855)
- 📦 Imports resolve against real module configuration — tsconfig paths, Java/Kotlin declared packages, Go module paths, PHP Composer autoload maps, Python
__init__.pyre-exports — instead of guessing from path suffixes. (#2953, #2955, #2984, #2987, #2990, #2864) - 🍃 Spring modeling goes deep — AOP transactions, caching and security,
@Beanfactories,@Resourceand constructor injection, profiles, conditions and auto-configuration, plus a full bean candidate inventory. (#2783, #2740, #2678, #2632, #2494) - 🛡️ Analyze got much harder to break — a single-writer lock on the index write path, atomic index swap with read-pool invalidation, a bounded buffer pool sized to the graph, the large-repo OOM cascade fixed, and schema versions derived from a DDL fingerprint instead of a hand-incremented constant. (#2658, #2614, #2560, #2649, #2798)
- 🔒 MCP hardening — a repository allowlist, fail-closed read-only mode, deterministic ordering on every capped query, and bounded output budgets, so
impactandcontextare reproducible run to run. (#2787, #2796) - 🧭 New surfaces — NestJS decorator routes so
api_impactstops calling live endpoints non-existent, full Codex support with hooks and a plugin marketplace, CodeBuddy and Qoder integrations, abunxlane for bun-only machines, and one-click Render deploy. (#3017, #2369, #2368, #2765, #2804)
⚠️ Breaking changes
- Node
^22.18.0 || >=24.11.0is now the supported floor; the@types/uuidstub is dropped - The non-functional
groupmatching knobs are gone —matching.bm25_threshold,matching.embedding_threshold,detect.embedding_fallbackingroup.yaml, thegitnexus group sync --skip-embeddingsflag, and the MCPgroup_syncskipEmbeddingsargument (#3020)
🚀 Added
- Spring framework modeling expanded end to end — AOP transactions, caching and security (#2783),
@Beanfactories and@Resourceinjection (#2740), profiles/conditions/auto-configuration (#2678), constructor and standard injection (#2632), bean candidate inventory (#2494), configuration-property consumers, and non-HTTP handler entry points (#2891) - Receiver chains typed from AST structure across all 14 languages, with an explicit epistemic lower bound on what the graph can claim (#2708, #2744, #2747)
- Java enum constant bodies modeled as first-class instances, with JLS 13.1 anonymous-class naming (#2558)
- More route surfaces indexed — Java constant-based route paths such as
@PostMapping(ApiPathConstants.X)(#2980) and JavaScript data route tables (#2972) - MCP server hardening — repository allowlist, fail-closed read-only mode, deterministic output budgets, and normalized
impact/contextaliases bunxlane so bun-only machines can run GitNexus (#2765)- Codex support — hooks, plugin marketplace and setup (#2328, #2369) — plus CodeBuddy and Qoder coding-agent integrations (#2368)
- Skills mirrored to
.agents/skills/when an.agents/directory exists - One-click Render deploy (#2804)
serveorigin/proxy configuration is validated and port-scoped (#2820)- Expanded TypeScript/JavaScript taint sink model (#2490)
- Wiki generation accepts explicit HTTP LLM hosts (#2491)
- Embedding request-body dimensions configurable via
GITNEXUS_EMBEDDING_REQUEST_DIMS(#2574) - Refreshed MiniMax model and endpoint configuration (#2780)
MAX_CALLABLE_VALUE_TARGETSandMAX_PROPERTY_DISPATCH_FANOUTconfigurable via env (#2725, #2726)- Opt-in
analyze --self-commitfor AGENTS.md/CLAUDE.md churn (#2640) - Buffer pool sized to the graph before the database opens, with an adaptive size hint
- CI review agent runs as a coordinated reviewer swarm on Sonnet 5 with structured, linked reviews (#2570, #2572), alongside the GitNexus Engineering Tool Kit skills (#2566) and an online skill-evolution loop (#2571)
- Icebug community-engine prototype behind a gate (#2376)
🐛 Fixed
group syncstops claiming matching it never did — the advertised BM25/embedding cascade was config, help text and MCP schema with no matcher behind it; the unreadmatching.bm25_threshold,matching.embedding_threshold,detect.embedding_fallbackand--skip-embeddingssurfaces are removed (#3020)- Emitted Next.js build output is ignored during ingestion, and the inert
public/buildentry is deleted (#3018) - NestJS decorator routes are indexed so
api_impactandroute_mapstop reporting live endpoints as non-existent (#3017) - Import resolution gated by real module configuration instead of path-suffix guessing — TypeScript config (#2953, #2956), Java and Kotlin declared packages (#2955, #2990), Go module paths (#2984), PHP Composer autoload maps (#2987), Python
__init__.pyre-exports (#2864) and unaliased dotted namespace imports (#2826, #2828), and JavaScript module extensions (#3034) - Interface dispatch is generic-instantiation aware (#2912, #2939), fans out from Case 3b receivers (#2832, #2842) and from C# record interface calls (#2904), and resolves through generic-typed field receivers in every language (#2833, #2855)
- Go method sets modeled exactly so interface satisfaction is decidable (#2813, #2829), out-of-repo package qualifiers resolve, and an undecided interface check is no longer reported as a decided negative (#2873, #2921)
- Go pointer-receiver calls resolve, reporting the program boundary instead of hedging (#2766, #2782)
- Java record support — graph nodes for
record_declaration, component accessors, enum and record interface heritage (#2564, #2916, #2935, #2936), plusE.CONST.method()enum-constant receiver dispatch (#2561) and JLS binary-name identities for local classes, enums, records and interfaces (#2562, #2653) - Rust module-qualified calls resolve against the module tree (#2730, #2741), items are qualified by their enclosing
modchain (#2742, #2745), duplicate type names stay ambiguous in range binding (#2514, #2652), andBox<dyn Trait>names normalize - Closure bindings are call sources in every language, and function-local values carry their own identity (#2693, #2695, #2699, #2718)
- A named receiver's member never resolves lexically (#2714), platform builtins stop resolving to unrelated same-file symbols (#2549), and inline constructor receivers are typed in every spelling (#2708, #2737)
- Python calls resolve through constructor-injected fields (#2628) and module-imported classes (#2770)
- Package directories that repeat higher in the path resolve correctly (#2881, #2929)
checkstops reporting erased and deferred imports as initialization cycles (#2934)detect_changesno longer scales its query with the diff's hunk count (#2915, #2930), and CR-only line-ending diffs are ignored (#2839)groupstops reporting what could not be measured as a measurement of zero (#3012), resolves HTTP consumers through configured clients and constant route tables (#3008), and preserves manifest-only impact crossings (#2784)impactandcontextare reproducible — deterministic ordering on every capped query (#2787, #2796) — and Convex caller results are marked incomplete rather than empty (#3044)- Object handler identity is preserved during ingestion (#3046), nested source directories are discovered (#3043), and parse-node insertion is canonicalized
- Large-repo analyze OOM and the false worker-timeout cascade are fixed (#2649, #2679)
- Single-writer lock on the index write path (#2658, #2677), atomic index swap with read-pool staleness invalidation (#2614), and reliable large incremental writeback commits (#2409, #2425)
- Remote URLs are stripped of credentials before they are persisted (#2914, #2928), and every registry write gets its own tmp path (#2888, #2920)
- Schema version derived from a DDL fingerprint instead of a hand-incremented constant (#2798, #2808), and the scope-resolution relation cross product is fully declared (#2792, #2793)
- FTS reliability — binary payloads stay out of the description column and an unbuildable index is confined to its own table (#2919), FTS-indexed DML is gated before the incremental writeback (#2841, #2854), analyze degrades instead of aborting on index-build failure (#2548), real LOAD errors surface and broken extension files self-heal (#2374, #2375), and Windows missing-dependency load failures are diagnosed (#2383)
VECTORis loaded only when needed (#3045) and before the incremental writeback touches embedding rows (#2623, #2624)- Buffer pool bounded instead of taking the native 80%-of-RAM default (#2560), scaled by the OS page-size granule ratio (#2631, #2636), with a COPY-safe floor and actionable diagnostics for non-4K page sizes (#2424)
Napi::ErrorSIGABRT on analyze eliminated — C++ type lookups are indexed and workers terminate only at JS-safe points (#2432, #2436)- Native-load failures fail closed, including truncated-binary SIGBUS (#2441, #2651), and glibc-too-old loads are no longer misdiagnosed (#2672, #2689)
- Index staleness reporting fixed — no false-stale status after analyze, with inline staleness in
query/context/impact/cypher(#2655, #2668, #2683) - Windows path handling — the
\\?\long-path prefix no longer breaks repo path matching (#2667, #2700),partsnegation is honored (#2720), and missing-shadow errors letserverepo-switch recover (#2382, #2387) - Embeddings survive partial failures — unparseable 200 responses are retried (#2790, #2795), batch inserts are retry-safe (#2453), HTTP generation is resumable, resume checkpoints bind to their provider, and proxy-blocked installs self-heal (#2370, #2372)
- Custom HTTP embedding endpoint failures are reported as themselves, not as Hugging Face download errors (#2385, #2386)
- Exact symbol content with 0-based line storage and 1-based MCP display (#2377, #2379, #2380)
renamereports every edit that apply writes and reconciles its report on partial failure (#2605)- Global registry transactions serialized across processes (#2716)
- Swift indented conditional directives are preprocessed so class bodies survive parsing (#2771), and Swift member-containment pairs are declared in the
CONTAINSDDL (#2769) - JavaScript
exports.foo = function () {}CommonJS exports are indexed (#2723, #2729), andconst X = () => {}is no longer double-indexed as a Function plus an edgeless Const twin (#2687, #2691) - JVM sibling injection is proximity-bounded (#2732), and C#/Kotlin free calls are gated by instance ownership (#2563, #2654)
- Dart extension type symbols are extracted (#2539), and declarations recover after embedded NUL bytes (#2430)
- CLI and hooks fail loudly on backend error payloads, with an MCP query hint when the server owns the DB lock (#2396, #2397)
- Committed agent guides stop churning, with an
--index-onlynudge (#2907, #2927), andgitnexus-planartifacts publish on macOS without an interpreter (#2905, #2922) - The 300-flows cap is removed for large repositories (#2198)
🔧 Changed
- Structural relationships are held out of the JS heap by default during analyze (#2680, #2685)
- Global ignore support —
core.excludesFile,.git/info/exclude, and a user-level global ignore file are honored (#2606) - Plugin manifests sync on every version bump (#2445), and planning output under
docs/plansis no longer tracked
⚡ Performance
- Import resolution indexed instead of scanned — every scanning resolver with a consolidated memo (#2911), a per-run workspace index for Go/C#/Dart/Ruby (#2898), and Kotlin import resolution (#2872)
- MCP server startup drops the analyze-only language-provider closure (#2802, #2806)
- C++ qualified namespace members indexed once per pipeline run (#2788, #2794)
- Vendored Leiden O(communities × N) copy removed, with Icebug wired to its real API (#2337, #2692)
core.excludesFile/info/excluderesolution memoized (#2606)
📦 Chore / Dependencies — 132 dependency & CI-action bumps
- Security overrides —
sharppinned to >=0.35.0 for the libvips vulnerabilities (#2993) andadm-zipto >=0.6.0 for a memory-allocation vulnerability (#2992) - gitnexus runtime (53 bumps) —
@ladybugdb/corethrough 0.18.3 (#2473, #2634, #2863, #2924),js-yaml4.3.0 → 5.3.0 (#2618, #2710, #2831, #3024, plus the 5.0.0 revert in #2596),tsx×7,@types/node×5,express-rate-limit×3,@modelcontextprotocol/sdk(#2815),node-addon-api8.9.0 → 8.9.2 (#2816, #3002),uuid14.0.2 (#3025),vitest4.1.11 (#3027), the Babel 8 toolchain,hono,fast-uri,brace-expansion,ip-address,body-parser - gitnexus-web (43 bumps) —
vite×3,@vitejs/plugin-react×3,@vercel/node×4,react-i18next×3,lucide-react×3,@langchain/core,@langchain/langgraph,@langchain/anthropic,axios,@tailwindcss/vite,wait-on,@testing-library/jest-dom - CI actions (34 bumps) — the CodeQL action group, the Docker build/login/metadata/buildx/qemu suite,
actions/setup-nodev6→v7,actions/setup-python,actions/attest-build-provenance,release-drafter×3,dorny/paths-filter×2,ossf/scorecard-action,raven-actions/actionlint,softprops/action-gh-release, plustar,mermaidanddompurify - CI hardening — Windows shard watchdog widened with exit diagnostics (#2449), the platform-sensitive matrix sharded to fix the Windows cross-platform timeout (#2394), and CI Report no longer dies silently when the tests job fails (#2728)
📥 Upgrade
npm install -g gitnexus@1.6.10Then re-index — this release changes how receivers, imports and interface dispatch resolve, so an existing index will not carry the new edges:
gitnexus analyzeFull changelog: v1.6.9...v1.6.10