GitNexus/gitnexus/test/integration
Gergő Magyar 89ea233e10
fix(js): index CommonJS exports.foo = function () {} exports (#2723) (#2729)
* fix(js): index CommonJS `exports.foo = function () {}` exports (#2723)

Functions assigned to an `exports` / `module.exports` property were not
indexed at all. On a CommonJS codebase — the dominant pre-ESM Node style
(Express, Firebase Functions) — the graph held every internal helper and
missed the entire public API: `impact({target: 'areVariablesValid'})`
answered `Target not found` for the one symbol whose blast radius mattered.

The gap had two halves, and fixing either alone leaves the feature broken:

1. `tree-sitter-queries.ts` carried `@definition.function` rules for every
   declaration form and every variable-binding closure form, but none for
   `assignment_expression` — so no `Function` node was created.

2. The scope-resolution queries (`languages/{javascript,typescript}/query.ts`)
   likewise had no `@declaration.function` for the shape. Adding only (1)
   moves `impact` from "not found" to "found, zero callers", because call
   resolution reaches a definition through the scope declaration, not
   through the graph node.

Both layers now carry the rule, for `function` / `async function` / arrow /
async arrow / generator right-hand sides, in JavaScript and TypeScript. The
receiver is pinned to `exports` / `module.exports` with `#eq?` predicates:
the general `X.foo = function () {}` shape also covers `Foo.prototype.bar`
and `this.handler`, which are member constructs with their own ownership
questions, and a broader rule would emit ownerless top-level Functions for
them. The declaration binds the bare property name into the module scope,
which is what importers see, so `const { foo } = require('./m')` matches by
name and a namespace `m.foo()` walks the module's defs.

Verified end to end: node emission for every listed form plus TS parity, and
CALLS edges for same-file `exports.foo()`, cross-file namespace `m.foo()`,
and cross-file destructured `require()`. The generator call-resolution case
was confirmed to fail against the pre-fix build before the rule landed.

Fixes #2723

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(js): stop the CJS export rule from shadowing a declared function (#2723)

Review of the previous commit caught a regression it introduced. The CJS
`@declaration.function` rules bind the exported property name into the module
scope — which is the point, since that is what importers resolve against. But
when the file ALSO declares that name lexically:

    function dup(v) { return v; }
    exports.dup = function (v) { return !v; };
    function callIt(v) { return dup(v); }

the module scope ends up holding two declarations named `dup`, the name is
ambiguous, and the resolver drops `callIt -> dup` entirely — an edge that
resolved fine before #2723. Confirmed by rebuilding both states: present at
ff86ccf1e, missing at f302916c. A silently missing caller is worse than the
gap #2723 set out to close; it is the impact-under-reporting class this repo
has been bitten by before.

The emitter now drops the CJS `@declaration.function` in exactly that case.
The lexical declaration already supplies the module-scope name, so importers
still resolve through it and intra-module resolution returns to its pre-#2723
behavior — verified by re-running the probe that found the regression.

Implemented at the established seam: a shared pure helper both capture
emitters import and apply at the existing `@declaration.function` filter,
mirroring `array-callback.ts` (#1876), which solves the same
"drop a spurious declaration emit-side" problem.

The module-scope name set is computed once per file and memoized per program
root in a WeakMap, rather than walked per export — a 1000-export CommonJS
module is precisely the shape #2723 was reported against, and the per-export
walk would be quadratic there. `tree.rootNode` was probed to confirm it
returns a stable object identity, so the memo actually hits; measured scaling
across 250/500/1000/2000 exports is linear.

Only the scope declaration is suppressed. The graph node comes from a
separate query and collapses onto the lexical declaration's node by name, so
no node is lost.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* perf(js): fold the CJS export RHS forms into one pattern per receiver

Benchmarking the #2723 rules found the only reproducible cost is tree-sitter
query COMPILE, paid once per worker process when the lazy Query singleton is
built. Steady-state per-file emit cost and memory proved to sit below the
measurement noise floor, so there is nothing to win there.

The six CJS scope-query patterns per language (3 right-hand-side forms x 2
receiver forms) collapse to two, folding the RHS forms into an inner leaf
alternation. Measured over 5 runs per build, variance under 1ms:

    query compile   base      before     after
    JavaScript      42.2ms    50.6ms     45.1ms
    TypeScript     116.5ms   136.4ms    123.3ms

That recovers ~65% of the added compile cost in both grammars — about 19ms
per worker process, so ~75ms on a 4-worker analyze — and removes 45 lines of
duplicated query text.

The alternation is deliberately the INNER LEAF form. tree-sitter 0.21.1 has a
known hazard where a top-level `[...]` alternation makes sibling branches
share a single predicate bucket, silently dropping matches with no compile
error (it has bitten this repo twice: #1904, #1912). Here every predicate
sits on a capture OUTSIDE the alternation — `@_cjs.exports` / `@_cjs.module`
are on the left-hand side and bound in every branch — which is the documented
safe shape. Verified rather than assumed: a probe asserts all six receiver x
RHS combinations still bind both `@declaration.function` and
`@declaration.name` in both grammars, and that `exportz.x` / `module.other` /
`Foo.prototype.bar` / `this.handler` / aliased `exports` are still rejected —
26/26 checks, so the predicate bucket is intact.

No behavior change: the graph output on a 600-file corpus is identical
node-for-node and edge-for-edge, and the 142 JS/TS integration tests plus
1299 scope-resolution unit tests are unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(js): index prototype and `this` member assignments as Methods (#2723)

Follow-up on the known limitations listed with the CJS export fix. Three of
them close here; the rest are recorded below with what they actually cost.

`Foo.prototype.bar = function () {}` is the dominant pre-ES6 method form — the
same population as the CJS exports this PR started with — and it was equally
invisible: no node at all, so `impact` could not reach a single prototype
method. `this.handler = function () {}` inside a constructor is its sibling,
and the pre-ES6 form of the closure-valued class field #2693 already models as
a Method.

Both now emit a `Method` with an owner edge:

    function Foo() {}
    Foo.prototype.bar = function (v) { return v; };
    // Method:f.js:Foo.bar,  HAS_METHOD Function:f.js:Foo -> Method:f.js:Foo.bar

The label comes from `provider.labelOverride` (Function -> Method) and the
owner from a sibling of `findObjectLiteralBindingInfo` — the helper that
already answers "this Method's owner is named by syntax, not by an enclosing
container" for object-literal methods. No new shared-code seam was invented.

Ownership resolves to what the file actually declares, so the edge points at a
node that exists: `function Foo` gives a `Function` owner, `class Foo` a
`Class` owner, and an owner the file does not declare
(`External.prototype.x = …`) claims NO owner edge rather than one pointing at
a fabricated node. A `this.x = fn` inside a class constructor needs none of
this — parse-worker resolves its owner from the enclosing class first.

Member ids qualify by owner (`Method:f.js:Foo.bar`). Without that, two
constructors in one file that each define `bar` collapse onto a single
`Method:f.js:bar` — the same identity collapse #2699 fixed for function-local
callables. Only the new prototype/`this` path qualifies, so object-literal
method ids are byte-identical to before.

Third fix, the orphan twin: `class Dup {}` plus `exports.Dup = function () {}`
emitted `Class:f:Dup` AND an unreachable `Function:f:Dup`. The scope
declaration for a shadowed CJS export is suppressed (previous commit), so the
node had nothing that could resolve to it; with a `function` of that name the
node collapsed by id anyway, but with a `class` the labels differ so it
lingered. `labelOverride` now returns null for that case and no node is
emitted.

## Still open, with measured cost

- Receiver-typed CALLS to a prototype method (`f.bar()`) do not resolve yet. A
  class method resolves because the class owns a scope the resolver attaches
  members to; a prototype assignment has no such scope, so this needs the
  scope layer to associate members with the constructor's type. Verified as a
  control that `new KlassC().meth()` does resolve, so this is specifically the
  missing half, not a general gap.
- `exports.fwd = lib.imported` still does not forward to the original
  definition — resolution/finalize-layer aliasing, reachable by no query rule.
  Note `exports.localFn = localFn` (declare-then-export, by far the more
  common idiom) ALREADY resolves and needed no work.
- Aliased `const e = exports; e.foo = fn` and module-top-level `this.x = fn`
  remain unindexed. The latter is only an export under CommonJS semantics; in
  ESM top-level `this` is undefined, so it needs a CJS gate rather than being
  applied to every `.js` file.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(js): index CJS exports assigned through an alias (#2723)

`const e = exports; e.foo = function () {}` exports `foo` exactly as
`exports.foo = fn` does, but no query can express "an identifier that happens
to alias the exports object" — the receiver is only knowable per file.

So the member-assignment rules now match ANY identifier receiver and the
emitters classify. A file's module-scope aliases (`const e = exports`,
`const m = module.exports`) are collected once per program root and memoized
beside the declared-name set, so the answer costs one top-level pass no matter
how many assignments ask.

The widening is only safe because the pruning is exact, and that is the risk
worth stating plainly: without it every `obj.handler = function () {}` in every
JS/TS file would emit a spurious top-level `Function` named `handler`. Both
layers prune:

  - graph nodes, in `labelOverride`: an assignment-anchored capture that is not
    a recognised shape returns null, so no node is emitted at all;
  - scope declarations, in both capture emitters: a receiver that is not the
    exports object declares nothing at module scope.

Verified on both sides. `obj.notAnExport`, `self.alsoNot` and
`localThing.nope` produce no node and no declaration, while an aliased export
resolves cross-file through both the namespace and destructured `require()`
forms.

## Cost

Re-benchmarked, because this widens a query the previous commit had just
optimized. Query compile over 3 runs: JavaScript 46.5ms, TypeScript 123.8ms —
+1.4ms and +0.5ms against the optimized state, since dropping the `#eq?`
predicates offsets the added patterns. Steady state on the assignment-heavy
corpus (200 files x 30 member assignments, the worst case for a widened
receiver) stays inside the +-4% noise band established earlier. Heap unchanged.

One measurement artifact worth recording so it is not mistaken for a
regression later: the real-repo TS corpus went 93,586 -> 93,748 captures across
these commits. That is corpus drift, not over-matching — the benchmark walks a
sorted file list and takes the first 400, and this work added a new source file
to that tree. The repo's own TypeScript contains zero occurrences of the
`identifier.property = function` shape, so the widened rule contributes nothing
there.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(js): treat module-level `this.X = fn` as a CommonJS export (#2723)

In CommonJS, module-level `this` IS `module.exports`, so

    this.handler = function (data) { … };

at the top of a `.js` file exports `handler` exactly as `exports.handler`
does. It previously produced an ownerless `Method` that no importer could
reach.

The CommonJS gate is the whole point of the change, not a detail. Top-level
`this` is `undefined` in ESM, so the same line exports nothing there — treating
it as an export would mis-index every `.mjs`, every `"type": "module"` package,
and every `.ts` that compiles to ESM. Detection is deliberately asymmetric: an
`import`/`export` statement settles the file as ESM immediately, a `require()`
call or an `exports`/`module` reference marks it CommonJS, and a file carrying
NEITHER signal is left alone — silence is not evidence of CommonJS.

`this` nesting follows the receiver rule the scope queries already encode
(#2701): an arrow does not bind `this`, so a top-level arrow's `this` is still
the module's and passes through the walk, while every other function form binds
its own receiver and stops it — that is an instance member, which keeps the
Method-plus-owner treatment from the previous commit.

Verified across all three cases rather than just the happy path: a CJS file
exports both the `function` and arrow forms and they resolve through a
cross-file destructured `require()`; an ESM file's identical line produces no
export; and a file with no module-system signal produces none either.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(js): forward CJS re-exports to the original definition (#2723)

Last of the known limitations. `exports.fwd = lib.imported` assigns an
EXISTING symbol rather than a function literal, so no definition rule reaches
it and importers of `fwd` resolved to nothing:

    const lib = require('./lib');
    exports.forwarded = lib.imported;      // via a namespace binding
    const { second } = require('./lib');
    exports.alsoForwarded = second;        // via a named binding

Both forms are now synthesized as re-export markers in the same post-query
pass that already decomposes `require()`, reusing the decomposer's existing
vocabulary rather than adding a case to it.

The kind is the whole fix, and it was established by measurement, not by
reading. Emitted first as `named-alias` — the shape the destructured
`require()` form uses — the forwarding still did not resolve: an import
binding is PRIVATE to its module, exactly as in ESM, where `import { X }`
does not re-export X. `reexport-alias` (`export { X as Y } from './m'`) is
what a CJS forwarding assignment actually is, and with it the call resolves
through the forwarding module to the original definition.

`exports.foo = localFn`, where the right-hand side is a locally DECLARED
function, is deliberately not handled here: the module scope already binds
`localFn`, importers already resolve through it (verified before writing any
code), and synthesizing a second binding would re-create the ambiguity the
shadow guard exists to prevent.

JavaScript only, matching where CJS `require()` decomposition already lives —
`typescript/captures.ts` has no require pass at all, since a `.ts` file using
CJS forwarding is vanishingly rare next to the cost of a second
implementation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(js): document the CommonJS export surface now that #2723 closed it

The known-limitation note still described `exports.X` as unmodeled and listed
the re-export edge as missing. Both are stale: the note now states which forms
declare a module-scope name, which two cases are deliberate non-cases (a
locally declared value needs no second binding; a name the module also declares
lexically is suppressed rather than made ambiguous), and that member
assignments through a receiver are Methods with an owner edge.

`module.exports = fn` — an anonymous default with no name to bind — remains
the one genuine limitation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* feat(js): index the CommonJS default export `module.exports = fn` (#2723)

The last documented limitation. `module.exports = function () {}` exports the
whole module as a callable, so there is no property to take a name from and
nothing declared it.

Named after the file by `deriveDefaultExportHocName` — the convention this
repo already applies to anonymous default exports — so `index.js` takes its
parent directory. A NAMED function expression keeps its own name instead,
which is more informative than the file.

Two traps, both found by probing rather than reading:

  - The widened member-assignment rule already matches this shape, capturing
    the LEFT property as the name — the literal `exports`. Left alone it
    produced `Function:<file>:exports`, and for a named function expression a
    SECOND node beside the real one. The worker now overrides the captured
    name for this shape, which is why it takes precedence over `nameNode`.
  - `labelOverride` was suppressing the node entirely. That is the widening's
    safety net working as designed — an assignment-anchored capture that is
    not a recognised shape emits nothing — and this was simply a shape it had
    not been taught.

The scope declaration is synthesized in the capture emitter rather than the
query, because a tree-sitter pattern has no access to the file path the
anonymous name derives from. Without it the node would exist with nothing
resolving to it, the half-fixed state this issue already had to correct once.

`exports = fn` is deliberately NOT indexed, and there is a test pinning that:
reassigning the `exports` binding does not export anything in CommonJS, it
only breaks the alias to `module.exports`, so indexing it would invent an
export that does not exist.

## Limit worth knowing

`const m = require('./mod'); m()` resolves only when the local binding name
matches the derived name — a naming coincidence, not a mechanism. Resolving a
renamed binding (`const renamed = require('./mod'); renamed()`) needs the
finalize layer to treat a called namespace binding as the target module's
default export, which is separate work. The node itself is always emitted, so
`impact` / `context` / `rename` reach it either way — which is what #2723
asked for.

Adjacent gap found while measuring, NOT addressed here: ESM
`export default function () {}` (anonymous) is equally unindexed. Same class,
different construct, and widening to it would change behaviour for files this
issue never touched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* docs(js): record module.exports = fn and the two remaining default-export gaps

The note still listed `module.exports = fn` as unmodeled. It is indexed now;
what remains is narrower and worth stating precisely: resolving a CALL through
a RENAMED default-export binding needs finalize-layer work, and anonymous ESM
`export default function () {}` is unindexed for the same underlying reason
but is a different construct.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* fix(js): close every finding from the #2729 tri-review

A 15-lane review (Claude swarm + ce personas, Codex gpt-5.6-sol swarm + ce +
adversarial) ran the real pipeline against both this branch and its base and
diffed the graphs. On canonical CommonJS shapes the branch was DELETING call
edges that existed at base and FABRICATING edges present in no source. A
fabricated edge is worse than the gap #2723 set out to close: it hands
`impact` a caller that does not exist.

Almost all of it reduced to two root causes.

**1. The exports receiver was identified by TEXT, with no scope lookup.**
The canonical UMD wrapper takes the exports object as a PARAMETER:

    (function (exports) { exports.publicApi = function () {}; })(this);

A text match called that a module export, invented a symbol, and — because the
invented name then collided with module scope — deleted the factory's real call
edges. The same blindness made `const helper = require('./helper');
exports.helper = fn` resolve an importer into a DIFFERENT module's function.
Receivers (and aliases) are now rejected where a parameter or enclosing local
shadows them.

**2. The shadow guard reached one of four export forms.**
It was wrong in four distinct ways: it never fired for an aliased receiver
(`root` was not forwarded), for module-level `this`, or for the default export
— each dropping a real edge, and the default-export case merging two functions
onto one node so the inner call resolved to itself. And it fired when it should
NOT have, deleting a genuine export whose name merely collided with a
non-callable variable:

    let cache = null;
    exports.cache = function (v) { cache = v; return cache; };

There is now one entry point (`cjsExportedName`) covering direct, alias, `this`
and default forms, comparing against CALLABLE declarations only.

Also fixed:

- Prototype owners bound to variables. `var Foo = function () {}` is the
  dominant pre-ES6 constructor — the population this work targets — and owner
  lookup handled only declarations, so two same-named members collapsed onto
  one unqualified node with no owner edges at all.
- TypeScript parity: the default/re-export declaration synthesis lived only in
  the JavaScript emitter, so a `.ts` file emitted the node with nothing
  declaring it. Extracted to a shared module used by both.
- Module-level `this.X = fn` in ESM or a no-signal file no longer mints an
  ownerless `Method`; `.cjs`/`.cts` and `.mjs`/`.mts` are now positive
  module-system signals where the file path is available.
- The MCP graph-schema resource documented HAS_METHOD as Class-owned only,
  while this work adds Function (constructor) owners.
- Two dead exports removed; an orphaned JSDoc reattached to the function it
  describes.
- Tests: the `exports = fn` negative test passed trivially (no JS/TS query
  matches a bare-identifier LHS at all, so it would pass with every guard
  deleted) — it now carries a positive control in the same fixture. A
  bounds-y `.some(...)` assertion was replaced per DoD.md:82. Six regressions
  added, each confirmed failing against the pre-fix build.

**Schema constants bumped LAST, deliberately.** `INCREMENTAL_SCHEMA_VERSION`
20->21 and parse-cache `SCHEMA_BUMP` 28->29, with the pin and reuse-gate tests
updated. This change alters what is emitted for source whose content has not
changed, so without the bump an existing index keeps serving the pre-fix graph
for every unchanged CommonJS file — breaching DoD.md:61. Bumping it BEFORE the
correctness fixes would have been worse: it would have propagated the fabricated
and deleted edges to every index on upgrade.

One review finding was withdrawn rather than fixed: a claimed O(n^2) memo
failure did not survive verification. Clean production-shaped measurement
(fresh parse per file, no instrumentation) shows linear scaling — 0.355, 0.221,
0.216, 0.212 ms/declaration at N=500/1000/2000/4000. The earlier
"reproduction" was an artifact of replacing `globalThis.WeakMap` to count
misses, which perturbs the identity semantics under test.

Verified: 1469 tests across 89 files, including the full scope-resolution unit
suite, the JS/TS resolver suites, closure-binding labels, const-function-twin
and the pipeline golden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Gergo Magyar <gergomagyar0@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 19:45:01 +01:00
..
cfg fix(scope-resolution): a named receiver's member never resolves lexically, + two #2695 follow-ups (#2714) 2026-07-27 17:56:38 +01:00
cli feat(core): adopt pino structured logger (#1336) 2026-05-07 20:56:25 +01:00
group fix(ci): shard platform-sensitive matrix + spawn built CLI to fix Windows cross-platform timeout (#2394) 2026-07-08 09:09:11 +01:00
mcp feat(mcp): paginate list_repos to avoid client token truncation (#2119) (#2120) 2026-06-09 19:59:54 +01:00
optional-grammars feat(install): toolchain-free tree-sitter via vendored prebuilds (#2113) 2026-06-09 18:16:24 +01:00
resolvers fix(scope-resolution): resolve calls through a closure-valued binding across languages (#2693) (#2695) 2026-07-27 07:52:18 +01:00
analyze-atomic-swap.test.ts fix(analyze): single-writer lock for the index write path (#2658) (#2677) 2026-07-25 05:08:13 +01:00
analyze-embedding-flags-e2e.test.ts fix(ci): shard platform-sensitive matrix + spawn built CLI to fix Windows cross-platform timeout (#2394) 2026-07-08 09:09:11 +01:00
analyze-heap-oom-e2e.test.ts fix: large-repo analyze OOM and false worker-timeout cascade (#2649) (#2679) 2026-07-25 09:16:17 +01:00
analyze-index-lock-concurrency.test.ts fix(analyze): single-writer lock for the index write path (#2658) (#2677) 2026-07-25 05:08:13 +01:00
analyze-wal-checkpoint-failure.test.ts fix(analyze): single-writer lock for the index write path (#2658) (#2677) 2026-07-25 05:08:13 +01:00
analyzer-identity-cli.test.ts feat(skills): GitNexus Engineering Tool Kits (#2566) 2026-07-19 15:07:24 +01:00
antigravity-hook-e2e.test.ts fix(hook): emit MCP query hint when server owns DB lock (#2396) (#2397) 2026-07-08 18:34:05 +01:00
api-impact-e2e.test.ts feat(cli): Fingerprint indexed repos by remote URL to detect sibling-clone graph drift (#982) 2026-04-21 21:58:54 +01:00
api-impact-method-e2e.test.ts fix(mcp): stabilize api_impact response shape for same-URL multi-verb routes (#2308) (#2309) 2026-06-26 19:50:10 +01:00
api-query.test.ts fix: Use Ladybug native read-only enforcement and prepared statement execution for Cypher query paths (#1655) 2026-05-18 06:54:24 +01:00
ast-helpers-object-literal-binding.test.ts feat(ingestion): Link object literal methods to exported bindings (#1718) 2026-05-21 17:18:27 +01:00
augmentation.test.ts fix(core): ensure path prefix and traversal guards support root directories (#2559) 2026-07-20 08:12:15 +01:00
basicblock-roundtrip.test.ts feat(pdg): control dependence — post-dominators + CDG (Ferrante) [M5 #2085] (#2188) 2026-06-13 18:49:03 +01:00
block-scope-shadowing.test.ts fix(scope-resolution): a named receiver's member never resolves lexically, + two #2695 follow-ups (#2714) 2026-07-27 17:56:38 +01:00
c-cpp-typedef-legacy-parse.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
callable-capture-options-literal-gate.test.ts fix(scope-resolution): resolve callable reference flows (#2437) (#2522) 2026-07-17 17:20:02 +01:00
caller-identity-regression.test.ts fix(deps): bump @ladybugdb/core to ^0.18.3 — rel-property IN-predicate fix (#2508) (#2634) 2026-07-22 16:31:56 +01:00
cjs-exports-assignment.test.ts fix(js): index CommonJS exports.foo = function () {} exports (#2723) (#2729) 2026-07-28 19:45:01 +01:00
class-impact-all-languages.test.ts feat(cli): Fingerprint indexed repos by remote URL to detect sibling-clone graph drift (#982) 2026-04-21 21:58:54 +01:00
cli-e2e.test.ts feat(eval): require bearer auth for remote binding 2026-07-14 01:45:28 +07:00
cli-limit-e2e.test.ts fix(ci): shard platform-sensitive matrix + spawn built CLI to fix Windows cross-platform timeout (#2394) 2026-07-08 09:09:11 +01:00
closure-binding-labels.test.ts fix(scope-resolution): a closure binding is a call SOURCE in every language, and function-local values carry their own identity (closes #2699) (#2718) 2026-07-28 18:25:19 +01:00
closure-review-findings.test.ts fix(scope-resolution): a closure binding is a call SOURCE in every language, and function-local values carry their own identity (closes #2699) (#2718) 2026-07-28 18:25:19 +01:00
cobol-pipeline-benchmark.test.ts refactor(ingestion): delete legacy call-resolution DAG + heritage processor (RING4-1, #942) (#2023) 2026-06-04 11:07:37 +01:00
const-function-twin.test.ts fix(scope-resolution): resolve calls through a closure-valued binding across languages (#2693) (#2695) 2026-07-27 07:52:18 +01:00
context-resource-staleness.test.ts fix(mcp): context resource reads stale lastCommit/stats after out-of-process analyze (#2438) (#2439) 2026-07-16 09:20:18 +01:00
context-typed-property.test.ts fix(csharp): include generic typed properties in context and impact (#1399) 2026-05-09 09:07:24 +01:00
copy-parallel-invariant.test.ts perf(lbug): overlap node COPY with relationship emit (#2203) (#2226) 2026-06-16 10:57:26 +01:00
cpp-adl-benchmark.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
cpp-captures-typeclass-benchmark.test.ts fix: stop Napi::Error SIGABRT on analyze — index C++ type lookups, terminate workers only at JS-safe points (#2432) (#2436) 2026-07-11 18:07:08 +01:00
cpp-pipeline-benchmark.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
cross-file-binding.test.ts fix(ingestion): classify Python class methods as Method (#1102) 2026-04-27 09:04:50 +01:00
csharp-pipeline-benchmark.test.ts fix(csharp): eliminate global-namespace typeBindings O(files²) OOM (#1871) (#1954) 2026-05-31 18:21:07 +01:00
csharp-scope-capture-tripwire.test.ts perf(ingestion): linearize scope-capture across all languages + Python import resolution (O(n²)→O(n)) (#1918) 2026-05-30 19:44:22 +01:00
csv-pipeline.test.ts fix(lbug/mcp): exact symbol content + 0-based line storage with 1-based MCP display (#2377, #2379) (#2380) 2026-07-06 16:16:45 +01:00
django-route-extraction-e2e.test.ts feat(group): Support Django route extraction for multi-repo (#1836) 2026-06-21 20:11:30 +01:00
doc-comment-description-e2e.test.ts feat(ingestion): make doc comments searchable across all languages (#2286) 2026-06-24 08:36:55 +01:00
enrichment.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
expo-routes.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
extension-binary-real.test.ts fix(test): harden findInstalledFtsExtension for cross-OS filesystem quirks 2026-07-21 06:14:58 +00:00
fastapi-composed-route-constants.test.ts fix: resolve imported/composed FastAPI route path constants (#2391) (#2393) 2026-07-07 13:23:05 +01:00
fastapi-prefix-pipeline.test.ts fix(fastapi): apply APIRouter constructor prefixes (#2312) 2026-06-28 13:37:31 +01:00
filesystem-walker.test.ts fix(analyze): prevent cache-hit native workers from aborting (#1751) 2026-05-21 16:17:02 +01:00
fts-cjk-segmentation-search.test.ts feat(search): add opt-in CJK bigram segmentation for FTS search (#2339) 2026-07-01 16:41:41 +01:00
fts-description-search.test.ts fix(search): index description field for FTS so doc comments are keyword-searchable (#2300) 2026-06-25 14:21:44 +01:00
fts-extension-e2e.test.ts fix(test): discover the installed FTS extension version dir instead of assuming it equals lbug.VERSION 2026-07-21 06:06:42 +00:00
fts-fullfile-search.test.ts fix(indexing): keep full text file content searchable (#2323) 2026-07-01 08:27:09 +01:00
fts-stemmer-sweep.test.ts fix(deps): pin Ladybug 0.18.0, validate the multi-writer deadlock fix (#2340) 2026-07-01 18:35:57 +01:00
function-local-identity.test.ts fix(scope-resolution): a closure binding is a call SOURCE in every language, and function-local values carry their own identity (closes #2699) (#2718) 2026-07-28 18:25:19 +01:00
go-multi-name-worker-metadata.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
go-pipeline-benchmark.test.ts fix(go): generic composite literal constructor inference (F33) (#1976) 2026-06-03 05:24:31 +01:00
grammar-introspection.test.ts feat(ingestion): tree-sitter node-type/field validation gate + remove dead literals (#1937) 2026-05-31 10:29:41 +01:00
grammar-literal-validation.test.ts feat(ingestion): tree-sitter node-type/field validation gate + remove dead literals (#1937) 2026-05-31 10:29:41 +01:00
graph-emit-streaming-roundtrip.test.ts feat(spring): model profiles, conditions, and auto-configuration (#2678) 2026-07-28 07:05:41 +01:00
has-method.test.ts feat(cpp): C/C++ MethodExtractor config with pure virtual detection (#617) 2026-04-01 18:07:11 +01:00
hooks-e2e.test.ts fix(hooks): resolve gitnexus on PATH with a pure-Node scan, all-OS (#1938) (#1980) 2026-06-03 03:19:49 +01:00
http-inline-handler-symbol-roundtrip.test.ts fix(test): stabilize local Windows gate baselines (#2314) 2026-06-29 22:27:50 +01:00
ignore-and-skip-e2e.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
impact-ambiguous-blast-radius.test.ts fix(ingestion): stop double-indexing const X = () => {} as Function + edgeless Const twin (#2687) (#2691) 2026-07-25 16:56:17 +01:00
impact-epistemic-lower-bound.test.ts fix: stop impact()/route_map under-reporting blast radius (#2129, #1858, #1589/#1852) (#2136) 2026-06-10 11:25:48 +01:00
impact-pdg-callsummary-degradation.test.ts fix(lbug/mcp): exact symbol content + 0-based line storage with 1-based MCP display (#2377, #2379) (#2380) 2026-07-06 16:16:45 +01:00
impact-pdg-degradation.test.ts fix(storage): rename index metadata to gitnexus.json with dual-write compatibility (#2363) 2026-07-03 19:32:59 +01:00
impact-pdg-e2e.test.ts feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
impact-pdg-fixtures.test.ts feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
impact-pdg-fullchain-e2e.test.ts feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
impact-pdg-id-degradation.test.ts fix(storage): rename index metadata to gitnexus.json with dual-write compatibility (#2363) 2026-07-03 19:32:59 +01:00
impact-pdg-interproc.test.ts feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
impact-pdg-shape.test.ts feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
impact-pdg-statement-precise.test.ts feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
impact-pdg-traversal.test.ts feat(impact): opt-in PDG-backed impact mode - statement + inter-procedural slicing, resolved-callee-id soundness, mutation-oracle validated (#2227) 2026-06-20 12:04:32 +01:00
instance-ownership-pipeline-benchmark.test.ts fix(scope-resolution): gate C#/Kotlin free calls by instance ownership (#2563) (#2654) 2026-07-24 13:31:56 +01:00
java-class-impact.test.ts feat(cli): Fingerprint indexed repos by remote URL to detect sibling-clone graph drift (#982) 2026-04-21 21:58:54 +01:00
js-array-method-callback-attribution.test.ts refactor(ingestion): delete legacy call-resolution DAG + heritage processor (RING4-1, #942) (#2023) 2026-06-04 11:07:37 +01:00
lbug-close-handle-release.test.ts fix(lbug): drain checkpoint result before close (#1506) 2026-05-12 14:03:45 +01:00
lbug-conn-serialization.test.ts fix(lbug): stop --pdg analyze double-free (skip LadybugDB close-destructor crash) + harden connection serialization (#2264) 2026-06-21 15:25:56 +01:00
lbug-core-adapter.test.ts feat(spring): model profiles, conditions, and auto-configuration (#2678) 2026-07-28 07:05:41 +01:00
lbug-delete-nodes-for-files.test.ts fix(analyze): load VECTOR before the incremental writeback touches embedding rows (#2623) (#2624) 2026-07-22 12:27:00 +01:00
lbug-load-overlap-errors.test.ts perf(lbug): overlap node COPY with relationship emit (#2203) (#2226) 2026-06-16 10:57:26 +01:00
lbug-load-overlap.test.ts fix(indexing): keep full text file content searchable (#2323) 2026-07-01 08:27:09 +01:00
lbug-load-prof.test.ts perf(lbug): overlap node COPY with relationship emit (#2203) (#2226) 2026-06-16 10:57:26 +01:00
lbug-lock-retry.test.ts fix(lbug): retry single-writer transaction contention (#2342) 2026-07-02 06:17:12 +01:00
lbug-multiwriter-deadlock.test.ts feat: gate Icebug community engine prototype (#2376) 2026-07-09 05:43:49 +01:00
lbug-non-ascii-path.test.ts fix(lbug): resolve non-ASCII paths for KuzuDB on Windows (#1811) (#1817) 2026-05-25 21:28:12 +01:00
lbug-open-retry.test.ts fix(lbug): robust Windows lock acquisition for CI integration tests (#1430) 2026-05-08 11:58:01 +01:00
lbug-orphan-sidecar-recovery.test.ts fix(lbug): reclaim missing-shadow WAL quarantine files on write-path init (#2638) 2026-07-22 21:30:52 +01:00
lbug-pool-stability.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
lbug-pool.test.ts fix(analyze): load VECTOR before the incremental writeback touches embedding rows (#2623) (#2624) 2026-07-22 12:27:00 +01:00
lbug-query-importers-batch.test.ts fix: make large incremental writebacks commit reliably (#2409) (#2425) 2026-07-10 14:05:23 +01:00
lbug-readonly-init.test.ts fix(lbug): skip init lock and filesystem mutations for read-only opens (#1783) (#1784) 2026-05-24 08:05:27 +01:00
lbug-vector-extension.test.ts fix(analyze): load VECTOR before the incremental writeback touches embedding rows (#2623) (#2624) 2026-07-22 12:27:00 +01:00
literal-collectors.test.ts fix(test): stabilize local Windows gate baselines (#2314) 2026-06-29 22:27:50 +01:00
local-backend-calltool.test.ts feat(mcp): normalize impact and context aliases 2026-07-14 01:54:49 +07:00
local-backend.test.ts fix: Use Ladybug native read-only enforcement and prepared statement execution for Cypher query paths (#1655) 2026-05-18 06:54:24 +01:00
local-symbol-pruner-pipeline.test.ts fix(ingestion): stop double-indexing const X = () => {} as Function + edgeless Const twin (#2687) (#2691) 2026-07-25 16:56:17 +01:00
markdown-processor-crlf.test.ts fix(lbug/mcp): exact symbol content + 0-based line storage with 1-based MCP display (#2377, #2379) (#2380) 2026-07-06 16:16:45 +01:00
mcp-line-display.test.ts fix(lbug/mcp): exact symbol content + 0-based line storage with 1-based MCP display (#2377, #2379) (#2380) 2026-07-06 16:16:45 +01:00
multi-branch-analyze.test.ts feat: flat workspace index follows the checked-out branch (#2364) 2026-07-03 20:55:27 +01:00
multi-verb-route-identity.test.ts feat(ingestion/routes): give Route nodes a (method, url) identity (#2289) (#2302) 2026-06-26 07:59:46 +01:00
object-literal-method-exports.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
object-literal-owner-resolution.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
orm-dataflow.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
parse-impl-chunk-concurrency.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
parse-impl-clone-skip.test.ts fix(parse): survive non-cloneable worker results so large-repo analyze doesn't crash (#2112) (#2135) 2026-06-10 13:47:22 +01:00
parse-impl-env-reads.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
parse-impl-large-fixture.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
parse-impl-progress-monotonic.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
parse-impl-quarantine-cache-skip.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
parsing.test.ts feat(ingestion): tree-sitter node-type/field validation gate + remove dead literals (#1937) 2026-05-31 10:29:41 +01:00
pdg-emit-streaming-roundtrip.test.ts perf(lbug): overlap node COPY with relationship emit (#2203) (#2226) 2026-06-16 10:57:26 +01:00
pdg-query.test.ts fix(lbug/mcp): exact symbol content + 0-based line storage with 1-based MCP display (#2377, #2379) (#2380) 2026-07-06 16:16:45 +01:00
php-pipeline-benchmark.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
php-scope-capture-tripwire.test.ts perf(ingestion): linearize scope-capture across all languages + Python import resolution (O(n²)→O(n)) (#1918) 2026-05-30 19:44:22 +01:00
pipeline-graph-golden.test.ts fix(test): isolate cli-e2e from shared mini-repo fixture (#954) 2026-04-18 12:54:59 +01:00
pipeline.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
python-import-index-reuse.test.ts perf(ingestion): linearize scope-capture across all languages + Python import resolution (O(n²)→O(n)) (#1918) 2026-05-30 19:44:22 +01:00
python-scope-capture-tripwire.test.ts perf(ingestion): linearize scope-capture across all languages + Python import resolution (O(n²)→O(n)) (#1918) 2026-05-30 19:44:22 +01:00
qualified-class-lookups.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
query-compilation.test.ts [dart] Add call patterns for await, cascade, lambda, and widget-tree contexts (#801) 2026-04-13 11:21:11 +01:00
route-handler-symbol-roundtrip.test.ts feat(ingestion/routes): give Route nodes a (method, url) identity (#2289) (#2302) 2026-06-26 07:59:46 +01:00
route-method-roundtrip.test.ts feat(ingestion/routes): give Route nodes a (method, url) identity (#2289) (#2302) 2026-06-26 07:59:46 +01:00
route-parse-skip.test.ts fix(ingestion/routes): recognise Spring method-level array-form route mappings (#2281) 2026-06-24 07:10:37 +01:00
ruby-pipeline-benchmark.test.ts perf(ingestion): Linux-kernel-scale analysis — worker-pool parse + finalize O(n²) + scope-resolution memory wall (#1983) (#2038) 2026-06-06 22:46:34 +01:00
ruby-scope-capture-tripwire.test.ts perf(ingestion): linearize scope-capture across all languages + Python import resolution (O(n²)→O(n)) (#1918) 2026-05-30 19:44:22 +01:00
run-analyze-adopt-failure.test.ts feat: flat workspace index follows the checked-out branch (#2364) 2026-07-03 20:55:27 +01:00
rust-pipeline-benchmark.test.ts feat(rust): Migrate Rust to scope-based resolution (RFC #909 Ring 3) (#1639) 2026-05-25 13:20:08 +01:00
rust-scope-capture-tripwire.test.ts perf(ingestion): linearize scope-capture across all languages + Python import resolution (O(n²)→O(n)) (#1918) 2026-05-30 19:44:22 +01:00
search-core.test.ts fix: Use Ladybug native read-only enforcement and prepared statement execution for Cypher query paths (#1655) 2026-05-18 06:54:24 +01:00
search-pool.test.ts fix(search): surface warning when FTS indexes are missing (#1418) 2026-05-08 17:05:18 +01:00
server-analyze-token-validation.test.ts feat(analyze): private GitHub repos via PAT + Azure DevOps Server support (#2076, #2210) (#2223) 2026-06-16 05:49:02 +01:00
server-analyze.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
server-http-startup.test.ts fix(server): restore gitnexus serve startup under Express 5 (#1749) 2026-05-21 10:18:09 +01:00
setup-antigravity.test.ts feat(setup): implement antigravity integration setup and hook adapter… (#1730) 2026-05-25 14:46:17 +01:00
setup-skills.test.ts feat(skills): GitNexus Engineering Tool Kits (#2566) 2026-07-19 15:07:24 +01:00
setup-uninstall-roundtrip.test.ts feat(setup): add CodeBuddy and Qoder coding-agent integrations (#2368) 2026-07-04 10:54:50 +01:00
shape-check-regression.test.ts feat(cli): Fingerprint indexed repos by remote URL to detect sibling-clone graph drift (#982) 2026-04-21 21:58:54 +01:00
skills-e2e.test.ts test(skills-e2e): give the Idempotency setup hook the 120s budget its siblings use (#2583) 2026-07-20 19:54:54 +01:00
spring-bean-mcp.test.ts feat(spring): build bean candidate inventory (#2494) 2026-07-20 09:28:23 +01:00
spring-bean-metadata-roundtrip.test.ts feat(spring): build bean candidate inventory (#2494) 2026-07-20 09:28:23 +01:00
spring-bean-pipeline.test.ts feat(spring): build bean candidate inventory (#2494) 2026-07-20 09:28:23 +01:00
spring-conditionals-pipeline.test.ts feat(spring): model profiles, conditions, and auto-configuration (#2678) 2026-07-28 07:05:41 +01:00
spring-config-mcp.test.ts feat(spring): bind configuration consumers 2026-07-21 10:07:20 +08:00
spring-config-pipeline.test.ts fix(spring): harden configuration bindings 2026-07-21 13:44:43 +08:00
spring-di-benchmark.test.ts feat(spring): resolve constructor and standard injection (#2632) 2026-07-24 08:25:38 +01:00
spring-di-pipeline.test.ts feat(spring): resolve constructor and standard injection (#2632) 2026-07-24 08:25:38 +01:00
spring-inheritance-benchmark.test.ts fix(ingestion/routes): resolve Spring interface-inherited routes (#2288) (#2290) 2026-06-25 09:22:20 +01:00
spring-interface-inheritance-pipeline.test.ts fix(ingestion/routes): resolve Spring interface-inherited routes (#2288) (#2290) 2026-06-25 09:22:20 +01:00
spring-route-pipeline.test.ts perf(group/http): skip source parse for graph-covered route files (#2138 Part 2) (#2265) 2026-06-23 07:22:43 +01:00
staleness-and-stability.test.ts fix(storage): rename index metadata to gitnexus.json with dual-write compatibility (#2363) 2026-07-03 19:32:59 +01:00
swift-scope-capture-tripwire.test.ts feat(swift): migrate Swift to scope-based registry resolution (#937) (#1948) 2026-05-31 16:56:47 +01:00
taint-explain.test.ts feat(taint): expand TS/JS sink model (#2490) 2026-07-16 13:11:57 +01:00
this-boundary.test.ts fix(scope-resolution): a closure binding is a call SOURCE in every language, and function-local values carry their own identity (closes #2699) (#2718) 2026-07-28 18:25:19 +01:00
tree-sitter-languages.test.ts feat(cpp): parse CUDA source extensions (#2213) 2026-06-16 07:32:53 +01:00
typescript-async-generator-functions.test.ts fix(ingestion): index generator function declarations (#2305) 2026-06-26 13:37:02 +01:00
vue-pipeline-benchmark.test.ts feat(vue): migrate Vue SFC to scope-based resolution (RFC #909 Ring 3, closes #940) (#1950) 2026-06-03 21:48:38 +01:00
worker-pool.test.ts fix(tree-sitter): recover declarations after embedded NUL bytes (#2430) 2026-07-11 08:33:50 +01:00