GitNexus/gitnexus/test/unit
Gergő Magyar 96dc368d96
Some checks are pending
CodeQL / Analyze (javascript-typescript) (push) Waiting to run
CodeQL / Analyze (python) (push) Waiting to run
Gitleaks / gitleaks (push) Waiting to run
Publish / Classify release event (push) Waiting to run
Publish / RC guard (marker + release-PR skip) (push) Blocked by required conditions
Publish / ci (push) Blocked by required conditions
Publish / Publish to npm (push) Blocked by required conditions
Publish / Build & Push RC Docker images (push) Blocked by required conditions
Scorecard / Scorecard analysis (push) Waiting to run
Trivy Image Scan / Trivy (gitnexus-cli) (push) Waiting to run
Trivy Image Scan / Trivy (gitnexus-web) (push) Waiting to run
fix(ci): align tree-sitter readiness + grammar-update workflows on a shared manifest (#858) (#2187)
* chore(ci): add shared vendored-grammars manifest; monitor reads it

.github/vendored-grammars.json is the single source of truth for the vendored
tree-sitter grammars (c/swift/kotlin/dart/proto): name, upstream coords, and
policy holds. update-vendored-grammars.mjs now builds its GRAMMARS map from the
manifest (behavior-preserving — same exported shape). Adds manifest-agreement
tests so the loader can't silently skew from the file.

* fix(ci): classify vendored grammars from manifest, drop bare "?" (#858)

The readiness report decided "is this vendored?" via is_vendored_pin (a file:
package.json spec) — but the 5 vendored grammars aren't in package.json, so they
were misrouted through the npm path and rendered bare "?" for ABI (read from an
empty node_modules), plus a spurious "? (fetch failed)" for github-only proto.

Now vendored grammars are classified by membership in the shared manifest and
their ABI is read from gitnexus/vendor/<name>/src/parser.c (always in a
checkout). github-only vendored grammars skip the npm peer-dep fetch; the
tree-sitter-c hold is surfaced from the manifest (held, not plain "Ready"); and
every remaining unintrospectable value renders a labeled token, never a bare
"?". --assert-current now covers the vendored grammars too instead of skipping
them. Adds a stdlib unittest suite incl. a manifest⇄vendor-dir consistency
guard.

* docs(ci): document the shared vendored-grammars manifest

Both tree-sitter workflow headers now point at .github/vendored-grammars.json as
the shared source of truth; the readiness workflow gains a PR-path trigger on the
manifest + test, and runs the readiness unit tests on validation events.
CONTRIBUTING.md documents the manifest contract under CI automation contracts.

* fix(review): apply autofix feedback

- Guard manifest reads in both scripts with a clear error (was an opaque
  module-import traceback that crashed the script and test collection).
- Never render a bare "?": relabel the npm-path ABI/version/peer sentinels and
  the vendored upstream-ABI miss to labeled tokens; the report is now ?-free
  regardless of node_modules/network, and the test is hermetic.
- Add a VENDORED_NAMES ⊆ GRAMMARS guard + manifest-missing error test.
- Drop now-dead is_vendored_pin/is_vendored/_(vendored)_.
- Compose held + out-of-range vendored blocker reasons instead of overwriting.
- Reword the shared-manifest docs to not over-claim shared upstream coords.

* fix(ci): apply root prettier formatting to mjs + ts test

The quality/format gate runs root `prettier --check .` (printWidth 100, the
gitnexus-local config differs and falsely passed locally).

* test(ci): make both tree-sitter scripts testable offline

The scripts hit live npm/GitHub, which makes the report run flaky and the
monitor's detect/apply logic untestable. Add hermetic seams:

- readiness: --offline flag (+ GITNEXUS_TS_READINESS_OFFLINE env) no-ops the npm
  registry + upstream fetches; the report renders deterministically (vendored
  ABIs from the repo, npm columns marked 'offline', no bare '?'). 3 tests assert
  an offline run touches ZERO network (urlopen patched to raise).
- monitor: detect() and apply() accept injected deps (vendoredVersion/
  resolveUpstream/fetchSource/readAbi) so the newer/ABI/hold gating runs offline
  with fixtures; apply gains --dry-run (validates but writes nothing). 6 tests
  cover newer/same-version/held-c/ABI-15/applicable + a no-mutation dry-run.

* fix(review): keep --assert-current hermetic + harden the no-bare-? invariant

Tri-review findings (PR #2187):
- P2 REGRESSION: --assert-current (documented 'hermetic and offline', run in CI
  without --offline) routed the 5 vendored grammars through vendored_drift_summary,
  which fetches upstream parser.c + commit sha — 10 discarded network calls per run.
  Fix: read the vendored ABI locally via a new vendored_abi_from_repo() helper (also
  used by vendored_drift_summary). Now verifiably network-free.
- Unify the upstream-ABI miss sentinel: prose said 'n/a (generated at build)' while
  the matrix said 'n/a' — and 'generated at build' is a wrong cause (swift HAS a
  committed parser.c). Both now render neutral 'n/a'.
- Fix the stale assert_current docstring claiming swift is prebuilt-only/no parser.c.
- Guard the last latent bare-? path (vendor package.json missing 'version').

Tests: AssertCurrent (network-free guard + out-of-range via the new injection
point), malformed-JSON manifest, detect() error-path, explicit npm/github
undefined assertions. 17 Python + 15 vitest, all hermetic.

* fix(review): use a single unittest import style (CodeQL 753)

CodeQL py/import-and-import-from flagged `import unittest` + `from unittest
import mock`. Collapse to `from unittest import TestCase, main, mock`.

* fix(review): explicit raise in _matrix_row (CodeQL 754)

CodeQL py/mixed-returns flagged the implicit fall-through after self.fail()
(which it doesn't model as NoReturn). End with an explicit raise AssertionError.

* test(review): replace non-null assertions with a must() guard

@typescript-eslint/no-non-null-assertion flagged 4 `!` operators. Add a
narrowing must<T>(value, message) helper (throws on undefined) and a named
baseResolveUpstream, removing every non-null assertion.

* fix(review): unguessable heredoc delimiter for the report output

The report embeds the manifest `hold` field (fork-PR-editable); a fixed
DRIFT_EOF delimiter in a hold value could close the $GITHUB_OUTPUT heredoc
early and inject output keys. Use DRIFT_EOF_$(openssl rand -hex 16) — a value
the report cannot contain. (Randomized delimiter over base64: keeps REPORT raw
markdown, no consumer-side decode.)

* fix(review): scope issues:write to scheduled runs (two-job split)

GitHub Actions has no step-level permissions, so the only way to keep PR runs
(incl. forks) from receiving `issues: write` is to split the job. A `report`
job (contents:read, all events) renders the report + the PR `:⚠️:` and
exposes report/exit_code as job outputs; a schedule-only `upsert-issue` job
(needs: report, issues:write, no checkout) consumes them for the issue upsert +
close. The 'Check upgrade readiness' check name is preserved.

* fix(review): launder npm-version '?' in disposition prose

The disposition bucket prose interpolated r['npm_version'] raw, so a successful
200 npm /latest response lacking a 'version' key would render a bare '?' (the
matrix cell already laundered it). Add npm_version_label ('unknown' for '?') and
use it in all five bucket renderers. Test a version-less npm response.

* refactor(review): load_vendored_manifest returns only the consumed 'hold'

The readiness script reads only the grammar names + 'hold'; the 'key' and
'upstream' fields were phantom data (upstream-drift coords live in the script's
own GRAMMARS map). Narrow the return to {hold}.

* fix(review): unify detect()/apply() 'newer' check for github grammars

detect() compared the bare sha7 while apply() compared up.version (the full
<base>-g<sha7> provenance string apply() also writes). After the bot re-vendored
a github grammar once, detect() reported a perpetual false 'update available'
while apply() correctly saw 'already current' — a noisy job summary + wasted
--apply subprocess (the PR-exists guard absorbed it before any duplicate PR).
Extract a shared isNewer(up, have) helper used by both. Tests cover equal-
provenance (false), first-vendoring plain-version (true, not suppressed), and
sha-advanced (true). Coupled with U12 (the detect⇄apply agreement assertion
lives there once apply()'s not-newer path returns instead of process.exit).

* test(review): cover main()'s out-of-range + prebuilt-only vendored ABI branches

main()'s vendored-ABI classification reads through vendored_abi_from_repo (the
local-read seam --assert-current uses), so patching it drives the
'Vendored (ABI out of range)' blocker branch and the prebuilt-only (vendored_abi
None → 'prebuilt' cell, not '?') branch — neither reachable today since all 5
vendor dirs ship parser.c at ABI 14.

* test(review): monitor-side manifest⇄vendor-dir consistency guard

Mirror the Python consistency guard on the monitor side — the monitor consumes
the same manifest and is the side that WRITES files from manifest `name`, so
manifest/vendor-dir drift must fail CI here too.

* fix(review): validate grammar names at manifest load (path-traversal guard)

The manifest `name` is joined into gitnexus/vendor/<name> paths in both scripts
(and apply() WRITES there), so reject any name not matching tree-sitter-[a-z0-9-]+
at the single load chokepoint — defense-in-depth even though the live trust
boundary already prevents exploitation. loadManifestGrammars gains an injectable
`raw` arg + export for testing; tests reject a '../etc' name in both scripts.

* refactor(review): apply() throws ApplyExit; CLI maps to exit codes

apply()'s 4 process.exit calls killed the vitest worker, blocking in-process
tests of its error branches. Replace them with a thrown ApplyExit{code}; the
not-newer (already-current) path returns `have` instead of exit(0). The isMain
CLI block try/catches and maps ApplyExit.code → process.exit, so the monitor's
subprocess contract (exit 0/2/3) is byte-identical (verified via subprocess
smoke). Tests cover unknown-key=2, held=3, ABI-reject=3, and not-newer (returns
current, no throw, no write).

* refactor(review): extract vendored render helper; trim docstrings (<1000 lines)

Extract the 'Vendored parsers' prose render into _render_vendored_section() so
main() coordinates named phases rather than inlining a ~450-line monolith, and
condense the most verbose docstrings/comments. The script drops from 1092 to 999
lines (under the 1000 bar the maintainability review flagged). Behavior-preserving:
the deterministic --offline render is byte-identical before/after (verified
in-place), --assert-current still passes, and the full unit suite is green.

* fix(review): row-diff regex captures only the Status cell

The change-detection regex captured the whole row tail as group 2, so any
non-status cell drift (e.g. an upstream-ABI bump) emitted a false-positive
'change' line. Capture only the Status cell ([^|]+? before the final |$).
The workflow parseRows regex and the Python _ROW_DIFF_RE stay byte-identical;
the stability test now asserts group 2 is the status string (e.g. c →
'Vendored — held') and contains no pipe.

* fix(ci): hoist intro string out of the list literal (CodeQL 755)

The U13 extraction moved the 'Vendored parsers' intro paragraph (implicitly
concatenated string literals) INTO a list literal, tripping CodeQL
py/implicit-string-concatenation-in-list (reads as a possibly-missing comma
between elements). Hoist it into a parenthesized `intro` variable. Render is
byte-identical.
2026-06-13 16:15:49 +01:00
..
call-routing refactor(ingestion): delete legacy call-resolution DAG + heritage processor (RING4-1, #942) (#2023) 2026-06-04 11:07:37 +01:00
cfg feat(taint): intra-procedural taint analysis (#2083) (#2164) 2026-06-12 07:35:09 +01:00
group fix(java): dedupe inherited RequestMapping prefixes (#2057) 2026-06-07 05:28:10 +01:00
ingestion feat(taint): interprocedural taint via function summaries over resolved CALLS (#2084) (#2179) 2026-06-13 07:04:14 +01:00
integrations feat: shared resilient-fetch (retries + circuit breaker) (#1448) 2026-05-09 15:18:09 +01:00
mcp fix(search): surface warning when FTS indexes are missing (#1418) 2026-05-08 17:05:18 +01:00
model feat(ingestion): M0 — taint/PDG substrate (schema + seams + spikes) (#2080) (#2092) 2026-06-08 18:56:10 +01:00
scope-resolution fix(cpp): suppress deleted overload winners (#2094) 2026-06-10 18:41:30 +01:00
taint feat(taint): interprocedural taint via function summaries over resolved CALLS (#2084) (#2179) 2026-06-13 07:04:14 +01:00
workers fix(workers): resilient + zero-copy ingestion worker pool — prevent analyze hangs on TS-root-scale loads (#1693) 2026-05-20 20:39:35 +01:00
ai-context.test.ts fix(mcp): rename query/cypher params so Claude Code can call them (#2186) 2026-06-13 10:24:16 +01:00
analyze-api.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
analyze-community-skills-gate.test.ts feat(cli): add --skip-skills and --index-only flags to analyze (resubmit of #742) (#1485) 2026-05-11 15:00:58 +01:00
analyze-config.test.ts feat(cli): add --embeddings-baseurl/-model/-auth-token/-dims flags to analyze (#2140) 2026-06-13 14:01:12 +01:00
analyze-embedding-endpoint-flags.test.ts feat(cli): add --embeddings-baseurl/-model/-auth-token/-dims flags to analyze (#2140) 2026-06-13 14:01:12 +01:00
analyze-embeddings-limit.test.ts feat(core): adopt pino structured logger (#1336) 2026-05-07 20:56:25 +01:00
analyze-gitnexusrc.test.ts feat(cli): add .gitnexusrc config and --default-branch for analyze (#243) (#1996) 2026-06-04 06:48:55 +01:00
analyze-heap-respawn.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
analyze-job.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
analyze-lbug-checkpoint-threshold.test.ts fix(lbug): add WAL checkpoint-threshold control (#1772) 2026-05-22 14:46:49 +01:00
analyze-local-embedding-error.test.ts fix(embeddings): guard local ONNX runtime on macOS Intel before transformers.js import (#1987) 2026-06-03 09:46:16 +01:00
analyze-no-stats-bridge.test.ts feat(cli): add .gitnexusrc config and --default-branch for analyze (#243) (#1996) 2026-06-04 06:48:55 +01:00
analyze-respawn-progress-terminal.test.ts fix(analyze): prevent cache-hit native workers from aborting (#1751) 2026-05-21 16:17:02 +01:00
analyze-wal-error.test.ts fix(lbug): add WAL checkpoint-threshold control (#1772) 2026-05-22 14:46:49 +01:00
analyze-worker-ipc.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
analyze-worker-pool-size.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
analyze-worker-timeout.test.ts fix(workers): resilient + zero-copy ingestion worker pool — prevent analyze hangs on TS-root-scale loads (#1693) 2026-05-20 20:39:35 +01:00
api-analyze-upload.test.ts fix(ip): Scope write-route origin guard to server's own bound host (#2172) 2026-06-13 09:24:03 +01:00
api-file-route.test.ts fix(server): close js/path-injection cluster — /api/file + docker-server.mjs (U2) (#1322) 2026-05-04 12:28:02 +01:00
api-graph-streaming.test.ts feat(ingestion): M0 — taint/PDG substrate (schema + seams + spikes) (#2080) (#2092) 2026-06-08 18:56:10 +01:00
api-query-readonly-wiring.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
api-readonly-wiring.test.ts fix(api): open lbug read-only for /api/graph, /api/search, /api/grep (#1686) 2026-05-18 19:57:35 +01:00
assert-publish-grammar-coverage.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
ast-utils.test.ts fix(windows): 32767-char tree-sitter crash + VECTOR extension SIGSEGV (#1433) 2026-05-10 16:00:36 +01:00
binding-accumulator.test.ts refactor(pipeline): DAG-based phase architecture + container-logic extraction to LanguageProvider (#809) 2026-04-13 20:31:05 +01:00
blade-template-routes.test.ts fix(php): avoid Blade templates entering PHP analysis (#1790) 2026-05-23 23:37:40 +01:00
bm25-search.test.ts feat: Add analyze --repair-fts, enforce FTS verification, and harden repair safeguards (#1720) 2026-05-20 13:37:04 +01:00
build-tree-sitter-grammars-probe.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
c-static-linkage-side-channel.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
call-attribution-issue-1166.test.ts fix(typescript): fix HOC pattern false positives and add export default HOC support (#1943) 2026-05-31 15:40:17 +01:00
call-extraction.test.ts feat(ingestion): language-agnostic call extractor with config+factory pattern (#877) 2026-04-16 11:45:30 +01:00
call-form.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
call-processor-routes.test.ts refactor(ingestion): delete legacy resolution context + tiered-lookup plumbing (RING4-2, #943) (#2033) 2026-06-04 17:51:28 +01:00
calltool-dispatch.test.ts fix(mcp): rename query/cypher params so Claude Code can call them (#2186) 2026-06-13 10:24:16 +01:00
chunker.test.ts feat(embeddings): structural chunking with data-driven CHUNKING_RULES dispatch (#987) 2026-04-20 08:25:31 +01:00
cli-commands.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
cli-i18n.test.ts feat(i18n): make web and CLI language-aware (#1748) 2026-05-23 06:14:24 +01:00
cli-impact-disambiguation.test.ts feat(cli): add --uid/--file/--kind disambiguation flags to impact (#1907) (#1914) 2026-05-30 11:03:13 +01:00
cli-index-help.test.ts feat(setup): select coding agent integrations (#2168) 2026-06-13 08:06:50 +01:00
cli-message.test.ts feat(i18n): make web and CLI language-aware (#1748) 2026-05-23 06:14:24 +01:00
clone-safety-cloneable.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
clone-safety-payloads.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
clone-safety.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
cobol-copy-expander.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
cobol-preprocessor.test.ts feat: configure eslint with unused import removal (#564) 2026-03-28 15:28:09 +00:00
cohesion-consistency.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
community-processor.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
compatible-stdio-transport.test.ts fix(mcp): prevent orphan processes by handling stdin close/end and startup race condition (#2049) 2026-06-05 08:36:28 +01:00
cors.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
cpp-ue-preprocessor.test.ts feat(extractors): strip Unreal Engine reflection macros before C++ parsing (#1439) 2026-05-09 12:28:32 +01:00
csharp-namespace-extraction.test.ts fix(csharp): stop spurious IMPORTS edges from ungated using-resolution (#1881) (#1908) 2026-05-30 09:56:26 +01:00
csv-escaping.test.ts refactor: migrate from KuzuDB to LadybugDB v0.15 (#275) 2026-03-15 15:53:01 +00:00
cursor-hook.test.ts fix(hooks): cap concurrent augment subprocesses (#1486) (#1510) 2026-05-13 08:56:27 +01:00
dart-import-resolver.test.ts refactor(ingestion): split ImportSemantics into per-strategy hooks (Strategies 1-4) (#886) 2026-04-16 19:31:44 +01:00
dart-type-extractor.test.ts feat: configure eslint with unused import removal (#564) 2026-03-28 15:28:09 +00:00
deferred-resolution-profile.test.ts feat(workers): self-healing worker pool + deferred-resolution observability (#1741) (#1947) 2026-05-31 13:52:04 +01:00
detect-changes-worktree.test.ts fix(detect-changes): guard resolveWorktreeCwd against overriding a separately-indexed worktree (#1691) 2026-05-20 06:46:16 +01:00
dockerfile-runtime-asset-parity.test.ts fix(docker): ship runtime-needed published assets (hooks/, skills/) into the image (#2130) (#2132) 2026-06-10 08:38:37 +01:00
doctor-format.test.ts fix(embeddings): guard local ONNX runtime on macOS Intel before transformers.js import (#1987) 2026-06-03 09:46:16 +01:00
embedder.test.ts test: add test suite with vitest (unit + integration + fixtures) 2026-03-01 20:07:02 +05:30
embedding-chunking.test.ts feat(embeddings): structural chunking with data-driven CHUNKING_RULES dispatch (#987) 2026-04-20 08:25:31 +01:00
embedding-config.test.ts fix: add platform-aware semantic fallback (#1150) 2026-04-28 12:21:25 +01:00
embedding-dims.test.ts feat(cli): add --embeddings-baseurl/-model/-auth-token/-dims flags to analyze (#2140) 2026-06-13 14:01:12 +01:00
embedding-pipeline.test.ts fix(embeddings): create VECTOR index via conn.query, not the prepared path (#2114) 2026-06-10 07:59:37 +01:00
embedding-runtime-support.test.ts fix(embeddings): guard local ONNX runtime on macOS Intel before transformers.js import (#1987) 2026-06-03 09:46:16 +01:00
entry-point-scoring.test.ts refactor(ingestion): consolidate per-language patterns into LanguageProvider (#1279) 2026-05-03 10:34:00 +01:00
env.test.ts feat(ingestion): log deferred resolution progress when verbose (#1741) (#1773) 2026-05-22 12:37:30 +01:00
esm-extension-resolution.test.ts fix: apply ESM .js extension fallback to tsconfig path alias resolution (#1530) 2026-05-14 16:15:17 +01:00
eval-formatters.test.ts fix: stop impact()/route_map under-reporting blast radius (#2129, #1858, #1589/#1852) (#2136) 2026-06-10 11:25:48 +01:00
eval-server-bind-restriction.test.ts test(cli): stabilize eval-server host checks (#1786) 2026-05-23 16:45:35 +01:00
exact-search.test.ts fix: add platform-aware semantic fallback (#1150) 2026-04-28 12:21:25 +01:00
expo-routes.test.ts feat: add Expo Router file-based route detection (#503) 2026-03-25 11:05:55 +00:00
extract-element-type-from-string.test.ts feat: Phase 6 type resolution — for-loop Tier 1c, pattern matching, container descriptors, 10-language coverage (#318) 2026-03-17 17:10:22 +00:00
extract-generic-type-args.test.ts feat(ingestion): tree-sitter node-type/field validation gate + remove dead literals (#1937) 2026-05-31 10:29:41 +01:00
fastapi-router-bindings.test.ts feat(ingestion): resolve FastAPI include_router(prefix=...) cross-file routes (#1877) 2026-05-28 19:04:19 +01:00
fetch-reason-parsing.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
field-extraction.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
format-elapsed.test.ts feat(progress): add per-language progress reporting to scope-resolution phase (#1813) 2026-05-25 11:53:54 +01:00
framework-detection.test.ts refactor(ingestion): consolidate per-language patterns into LanguageProvider (#1279) 2026-05-03 10:34:00 +01:00
fts-rss-verdict.test.ts fix: batch query enrichment, bake FTS extension into CLI image, add FTS memory repro (#2108) 2026-06-09 08:46:46 +01:00
git-clone.test.ts fix(server): sanitize repo name to prevent argument injection (#1305) 2026-05-11 09:38:07 +01:00
git-utils.test.ts fix(git): suppress stderr leak in getCurrentCommit and getGitRoot (#1172) (#1341) 2026-05-05 14:29:42 +01:00
git.test.ts feat: multi-branch indexing and branch-scoped querying (#2106) (#2137) 2026-06-10 10:24:40 +01:00
grammar-update-monitor.test.ts fix(ci): align tree-sitter readiness + grammar-update workflows on a shared manifest (#858) (#2187) 2026-06-13 16:15:49 +01:00
graph.test.ts feat(python): scope-based call resolution + registry-primary flip + perf + generalization (RFC #909 Ring 3) (#980) 2026-04-21 15:50:00 +01:00
group-service-not-found.test.ts fix(group): surface friendly error when group name not found (#903 regression test) (#989) 2026-04-21 15:52:36 +01:00
has-method.test.ts feat: MethodExtractor configs for Python, PHP, Swift, Dart, Rust, Ruby (#624) 2026-04-03 16:11:31 +01:00
hf-env.test.ts feat: shared resilient-fetch (retries + circuit breaker) (#1448) 2026-05-09 15:18:09 +01:00
hook-db-lock-probe.test.ts perf(hooks): cmdline-first Linux db-lock scan, drop the lsof fallback (#2180) (#2183) 2026-06-13 11:52:14 +01:00
hooks.test.ts perf(hooks): cmdline-first Linux db-lock scan, drop the lsof fallback (#2180) (#2183) 2026-06-13 11:52:14 +01:00
http-client-safe-url.test.ts feat(cli): add --embeddings-baseurl/-model/-auth-token/-dims flags to analyze (#2140) 2026-06-13 14:01:12 +01:00
http-embedder.test.ts fix(ci): stabilize gitleaks after #2024 (#2027) 2026-06-04 12:28:59 +01:00
hybrid-search.test.ts fix(search): guard against undefined bm25Results when FTS unavailable (#1489) (#1540) 2026-05-13 12:30:21 +01:00
ignore-service.test.ts fix(worker): analyze native worker aborts (#1833) 2026-05-26 17:28:39 +01:00
impact-batching-grouping.test.ts feat(cli): add --uid/--file/--kind disambiguation flags to impact (#1907) (#1914) 2026-05-30 11:03:13 +01:00
impact-confidence.test.ts feat: METHOD_IMPLEMENTS edges, overload disambiguation, MethodExtractor unification (#574) (#642) 2026-04-04 18:41:47 +01:00
impact-pagination.test.ts fix: stop impact()/route_map under-reporting blast radius (#2129, #1858, #1589/#1852) (#2136) 2026-06-10 11:25:48 +01:00
import-cycles.test.ts feat(cli): add circular import cycle check (#2166) 2026-06-12 04:53:17 +01:00
import-resolver-factory.test.ts fix(csharp): stop spurious IMPORTS edges from ungated using-resolution (#1881) (#1908) 2026-05-30 09:56:26 +01:00
incremental-file-hash.test.ts feat(analyze): incremental indexing (parse cache + DB writeback + scope-res short-circuit) (#1479) 2026-05-12 13:14:56 +01:00
incremental-orchestration.test.ts feat(ingestion): add control-flow-graph layer for TS/JS (#2081) (#2099) 2026-06-10 19:26:45 +01:00
incremental-parse-cache.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
incremental-shadow-candidates.test.ts feat(analyze): incremental indexing (parse cache + DB writeback + scope-res short-circuit) (#1479) 2026-05-12 13:14:56 +01:00
incremental-subgraph-extract.test.ts feat(taint): interprocedural taint via function summaries over resolved CALLS (#2084) (#2179) 2026-06-13 07:04:14 +01:00
index-repo-command.test.ts fix(cli): keep GitNexus ignores inside .gitnexus (#1248) 2026-05-01 16:46:05 +01:00
ingestion-utils.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
java-call-arity.test.ts feat(ingestion): tree-sitter node-type/field validation gate + remove dead literals (#1937) 2026-05-31 10:29:41 +01:00
java-spring-route-ingestion.test.ts feat(ingestion): Java Spring route annotation → Route node extraction (#2078) 2026-06-10 09:44:56 +01:00
jcl-parser.test.ts feat: configure eslint with unused import removal (#564) 2026-03-28 15:28:09 +00:00
kotlin-scope-captures.test.ts fix(kotlin): detect default parameter arity (#2034) 2026-06-04 17:28:04 +01:00
kotlin-static-marker.test.ts feat(lang-kotlin): flip Kotlin to MIGRATED_LANGUAGES + close #1756 / #1757 (refs #1746) (#1782) 2026-05-23 07:24:35 +01:00
language-availability-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
language-skip.test.ts fix(swift): use official prebuilt parser runtime (#1130) 2026-04-28 09:57:42 +01:00
laravel-route-extraction.test.ts refactor(ingestion): delete legacy resolution context + tiered-lookup plumbing (RING4-2, #943) (#2033) 2026-06-04 17:51:28 +01:00
lazy-action.test.ts Improve MCP startup compatibility and lazy-load CLI commands (#207) 2026-03-07 07:47:09 +00:00
lbug-adapter-wal-schema.test.ts fix(lbug): keep serve stable when sidecars are missing (#1747) 2026-05-21 12:35:43 +01:00
lbug-checkpoint-lifecycle.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
lbug-checkpoint.test.ts fix(lbug): add WAL checkpoint-threshold control (#1772) 2026-05-22 14:46:49 +01:00
lbug-config-wal.test.ts fix(lbug): add WAL checkpoint-threshold control (#1772) 2026-05-22 14:46:49 +01:00
lbug-embedding-hashes.test.ts feat(embeddings): AST-aware chunking with offset-based splitting (#889) 2026-04-16 22:55:04 +01:00
lbug-extension-loader.test.ts fix: make extension installs offline-first (#1161) 2026-05-29 20:04:41 +01:00
lbug-native-check.test.ts fix: actionable error + docs for pnpm dlx / pnpx native-load crash (#307) (#1967) 2026-06-02 05:54:25 +01:00
lbug-native-safe-path.test.ts fix(lbug): resolve non-ASCII paths for KuzuDB on Windows (#1811) (#1817) 2026-05-25 21:28:12 +01:00
lbug-pool-fts-load.test.ts fix(lbug): load FTS in Windows read pool (#2040) 2026-06-05 04:23:21 +01:00
lbug-query-result-utils.test.ts fix(parse): correct worker-pool docs drift + surface worker-side stack on crash (#2068) (#2070) 2026-06-08 07:20:12 +01:00
lbug-readonly-error.test.ts fix(parse): correct worker-pool docs drift + surface worker-side stack on crash (#2068) (#2070) 2026-06-08 07:20:12 +01:00
list-status-branch.test.ts feat: multi-branch indexing and branch-scoped querying (#2106) (#2137) 2026-06-10 10:24:40 +01:00
local-backend-maxbuffer.test.ts fix: ENOBUFS in detect_changes by setting maxBuffer on git/rg execFileSync (#957) 2026-04-18 15:58:31 +01:00
local-cli-subprocess.test.ts feat(wiki): support local Claude and Codex providers (#1769) 2026-05-25 12:59:48 +01:00
local-symbol-pruner.test.ts perf(ingestion): prune inert local value symbols (#2065) 2026-06-07 14:47:51 +01:00
logger.test.ts feat(core): adopt pino structured logger (#1336) 2026-05-07 20:56:25 +01:00
max-file-size.test.ts feat(core): adopt pino structured logger (#1336) 2026-05-07 20:56:25 +01:00
mcp-http-transport.test.ts feat(mcp): add gitnexus mcp --http server with Streamable HTTP and legacy SSE transports (#2141) 2026-06-13 09:58:49 +01:00
mcp-stdout-sentinel.test.ts fix(mcp): close MCP server timeout — stdout discipline + cold-start friction (#1383) 2026-05-07 09:14:33 +01:00
mcp-wal-feedback.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
method-extraction.test.ts fix(cpp): suppress deleted overload winners (#2094) 2026-06-10 18:41:30 +01:00
method-props.test.ts feat: same-arity overload disambiguation via type-hash suffix (#651) (#658) 2026-04-05 21:51:55 +01:00
mro-processor.test.ts perf(mro): replace O(n³) C3 merge loop with O(n²) head-pointer algorithm (#1316) 2026-05-04 10:49:24 +01:00
noise-filter.test.ts refactor: split global BUILT_IN_NAMES into per-language provider fields (#523) 2026-03-26 12:15:29 +00:00
onnxruntime-common-resolver.test.ts fix(embeddings): resolve onnxruntime-common under pnpm-strict / pnpm dlx (#307) (#2139) 2026-06-10 12:00:43 +01:00
parse-diff-hunks.test.ts fix: map diff hunks to symbol line ranges in detect_changes (#779) 2026-04-11 11:29:52 +01:00
parse-impl-warm-cache-parsedfile-coverage.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-worker-lazy-cache.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-worker-startup-gating.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
parsedfile-store.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
parser-loader-abi.test.ts fix(audit): Centralize heritage supertype matching (#1921/#1922) (#1940) 2026-06-01 13:16:17 +01:00
parser-loader-skip-optional.test.ts fix(ingestion): lazy-load optional grammars so analyze never crashes when one is missing (#2091, #2093) (#2101) 2026-06-09 04:58:01 +01:00
parser-loader.test.ts fix(deps): pin tree-sitter-c/cpp to fix Windows segfault (#1242) (#1243) 2026-05-01 08:02:16 +01:00
parsing-worker-fallback.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
pdg-mode-flip.test.ts feat(taint): interprocedural taint via function summaries over resolved CALLS (#2084) (#2179) 2026-06-13 07:04:14 +01:00
phase-timer.test.ts feat(search): per-phase timing instrumentation for the query pipeline (#953) 2026-04-18 16:30:07 +01:00
php-namespace-extraction.test.ts fix(php): reduce memory during deferred-call accumulation and scope-resolution (#1800) 2026-05-24 15:53:20 +01:00
php-template-scope.test.ts fix(php): avoid Blade templates entering PHP analysis (#1790) 2026-05-23 23:37:40 +01:00
pipeline-exports.test.ts test: add test suite with vitest (unit + integration + fixtures) 2026-03-01 20:07:02 +05:30
pipeline-runner.test.ts refactor(pipeline): DAG-based phase architecture + container-logic extraction to LanguageProvider (#809) 2026-04-13 20:31:05 +01:00
platform-capabilities.test.ts fix: add platform-aware semantic fallback (#1150) 2026-04-28 12:21:25 +01:00
pool-wal-recovery.test.ts fix(lbug): resolve non-ASCII paths for KuzuDB on Windows (#1811) (#1817) 2026-05-25 21:28:12 +01:00
prebuild-coverage.test.ts feat(install): toolchain-free tree-sitter via vendored prebuilds (#2113) 2026-06-09 18:16:24 +01:00
private-ip.test.ts fix(ip): Scope write-route origin guard to server's own bound host (#2172) 2026-06-13 09:24:03 +01:00
process-processor.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
publish.test.ts feat(cli): add gitnexus publish for opt-in understand-quickly registry (#1425) 2026-05-09 09:52:26 +01:00
query-degraded-signal.test.ts fix: batch query enrichment, bake FTS extension into CLI image, add FTS memory repro (#2108) 2026-06-09 08:46:46 +01:00
query-fts-parameterization.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
query-params.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
range-binding-parse-timeout.test.ts fix(audit): Centralize heritage supertype matching (#1921/#1922) (#1940) 2026-06-01 13:16:17 +01:00
rate-limit.test.ts fix(ip): Scope write-route origin guard to server's own bound host (#2172) 2026-06-13 09:24:03 +01:00
receiver-extraction.test.ts Fix HTTP client vs Express route detection and Spring interface attribution (#780) 2026-04-11 11:24:47 +01:00
rel-csv-split.test.ts test(gitnexus): stabilize rel-csv-split stream teardown on Windows (expect.poll) (#1052) 2026-04-23 20:11:54 +01:00
repo-manager-ensure-ignore-readonly.test.ts fix(cli): tolerate read-only workspace in ensureGitNexusIgnored (#1549) (#1550) 2026-05-14 17:26:34 +01:00
repo-manager-finalize-invariant.test.ts fix(cli): surface silent finalize-skips so analyze cannot exit 0 without persisting (#1169) (#1237) 2026-04-30 21:36:28 +01:00
repo-manager-transient-error.test.ts fix(storage): prevent registry wipe on transient I/O errors (#2124) 2026-06-10 16:50:08 +01:00
repo-manager.test.ts feat: multi-branch indexing and branch-scoped querying (#2106) (#2137) 2026-06-10 10:24:40 +01:00
resolve-enclosing-owner.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
resolve-invocation.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
resources.test.ts fix(mcp): rename query/cypher params so Claude Code can call them (#2186) 2026-06-13 10:24:16 +01:00
result-merge.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
route-tool-detection.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
run-analyze-fts-repair.test.ts fix: make extension installs offline-first (#1161) 2026-05-29 20:04:41 +01:00
run-analyze.test.ts feat(taint): interprocedural taint via function summaries over resolved CALLS (#2084) (#2179) 2026-06-13 07:04:14 +01:00
runner-exec-tail.test.ts fix(cli): steer docs, skills, and hooks through a CLI-neutral project-local runner (#1939) (#1945) 2026-06-02 09:00:34 +01:00
safe-parse.test.ts fix(audit): Centralize heritage supertype matching (#1921/#1922) (#1940) 2026-06-01 13:16:17 +01:00
schema.test.ts feat(ingestion): M0 — taint/PDG substrate (schema + seams + spikes) (#2080) (#2092) 2026-06-08 18:56:10 +01:00
scope-index-store.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
security.test.ts feat(taint): interprocedural taint via function summaries over resolved CALLS (#2084) (#2179) 2026-06-13 07:04:14 +01:00
semantic-chunk-search.test.ts feat(embeddings): AST-aware chunking with offset-based splitting (#889) 2026-04-16 22:55:04 +01:00
server-cors-stack.test.ts fix(server): restore gitnexus serve startup under Express 5 (#1749) 2026-05-21 10:18:09 +01:00
server-validation.test.ts fix(server): close critical type-confusion + add validation helper module (#1317) 2026-05-04 10:50:00 +01:00
server.test.ts fix(mcp): prevent orphan processes by handling stdin close/end and startup race condition (#2049) 2026-06-05 08:36:28 +01:00
setup-antigravity.test.ts fix(hooks): silence MCP-owned-DB augment skip for strict hook runners (#1913) (#2134) 2026-06-10 09:09:41 +01:00
setup-codex.test.ts fix(windows): pass windowsHide:true to every child_process spawn-family call (#1794) 2026-05-24 09:51:21 +01:00
setup-jsonc.test.ts fix(mcp): setup fallback on Windows when global gitnexus resolves to a non-spawnable shim (#1694) 2026-05-19 08:17:26 +01:00
setup-selection.test.ts feat(setup): select coding agent integrations (#2168) 2026-06-13 08:06:50 +01:00
setup.test.ts fix(cli): steer docs, skills, and hooks through a CLI-neutral project-local runner (#1939) (#1945) 2026-06-02 09:00:34 +01:00
shape-check.test.ts fix: shape_check false positives — quoted keys, DOM leaks, errorKeys (#501) 2026-03-26 05:43:37 +00:00
shared-type-extractors.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
sibling-clone-drift.test.ts fix(mcp): avoid git from non-repo cwd in sibling cwd match (#1138) (#1293) 2026-05-03 09:17:12 +01:00
sidecar-recovery.test.ts fix(lbug): keep serve stable when sidecars are missing (#1747) 2026-05-21 12:35:43 +01:00
skill-gen.test.ts fix(mcp): rename query/cypher params so Claude Code can call them (#2186) 2026-06-13 10:24:16 +01:00
skills-steering.test.ts fix(cli): steer docs, skills, and hooks through a CLI-neutral project-local runner (#1939) (#1945) 2026-06-02 09:00:34 +01:00
skip-git-cli.test.ts feat: Add analyze --repair-fts, enforce FTS verification, and harden repair safeguards (#1720) 2026-05-20 13:37:04 +01:00
spring-route-extractor-parity.test.ts feat(ingestion): Java Spring route annotation → Route node extraction (#2078) 2026-06-10 09:44:56 +01:00
staleness.test.ts perf(mcp): parallelize staleness checks in list_repos (#1416) 2026-05-08 10:36:20 +01:00
stdout-silence.test.ts fix(mcp): unify stdout silencing to prevent embedder/pool-adapter conflicts (#645) 2026-04-04 11:56:49 +01:00
structure-processor.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
suffix-index-ambiguity.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
symbol-table.test.ts fix(cpp): suppress deleted overload winners (#2094) 2026-06-10 18:41:30 +01:00
text-generator.test.ts feat(embeddings): structural chunking with data-driven CHUNKING_RULES dispatch (#987) 2026-04-20 08:25:31 +01:00
tool-direct-cli.test.ts feat(cli): add circular import cycle check (#2166) 2026-06-12 04:53:17 +01:00
tool-process-linking.test.ts fix(mcp): project tool_map flows from handlers (#1113) 2026-04-27 17:13:02 +01:00
tools.test.ts fix(mcp): rename query/cypher params so Claude Code can call them (#2186) 2026-06-13 10:24:16 +01:00
topological-sort.test.ts refactor(pipeline): DAG-based phase architecture + container-logic extraction to LanguageProvider (#809) 2026-04-13 20:31:05 +01:00
tree-sitter-queries.test.ts refactor(ingestion): delete legacy call-resolution DAG + heritage processor (RING4-1, #942) (#2023) 2026-06-04 11:07:37 +01:00
type-env.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
uninstall.test.ts feat(cli): add gitnexus uninstall to reverse setup (#2060) (#2062) 2026-06-09 10:50:18 +01:00
upload-ingest.test.ts fix(web): replace broken Browse-for-folder with upload directory picker (#1850) 2026-06-10 20:50:59 +01:00
upload-sweep.test.ts fix(web): replace broken Browse-for-folder with upload directory picker (#1850) 2026-06-10 20:50:59 +01:00
utils.test.ts feat: configure prettier with pre-commit hook (#563) 2026-03-28 14:58:04 +00:00
variable-extraction.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
vendored-grammars.test.ts fix(grammars): load vendored tree-sitter grammars from vendor/ by absolute path (#2111) (#2144) 2026-06-10 14:20:42 +01:00
vue-sfc-extractor.test.ts fix(vue): F89 JSDoc fix, F90 dual-script merge, F92 lang plumbing (#1936) (#2050) 2026-06-07 06:02:30 +01:00
wal-checkpoint-driver.test.ts fix(lbug): add WAL checkpoint-threshold control (#1772) 2026-05-22 14:46:49 +01:00
web-ui-serving.test.ts fix(lbug): keep serve stable when sidecars are missing (#1747) 2026-05-21 12:35:43 +01:00
wiki-flags.test.ts feat(wiki): add opencode local provider (#2039) 2026-06-05 09:24:00 +01:00
wiki-grouping-batch.test.ts fix(wiki): add budget-aware grouping to prevent context overflow on large repos (#627) (#1832) 2026-05-26 12:32:07 +01:00
wiki-llm-client.test.ts fix(wiki): Remove the hidden 60s default timeout, validate gitnexus wiki timeout/retry flags, and surface timeout errors (#1651) 2026-05-17 12:03:54 +01:00
wiki-mermaid-sanitizer.test.ts fix(wiki): sanitize generated mermaid diagrams (#1539) 2026-05-13 11:53:09 +01:00
worker-pool-cumulative-timeout.test.ts fix(workers): resilient + zero-copy ingestion worker pool — prevent analyze hangs on TS-root-scale loads (#1693) 2026-05-20 20:39:35 +01:00
worker-pool-error-stack.test.ts fix(parse): correct worker-pool docs drift + surface worker-side stack on crash (#2068) (#2070) 2026-06-08 07:20:12 +01:00
worker-pool-options.test.ts fix: recover worker parse stalls (#1121) 2026-04-27 20:07:03 +01:00
worker-pool-resilience.test.ts feat(workers): self-healing worker pool + deferred-resolution observability (#1741) (#1947) 2026-05-31 13:52:04 +01:00
worker-pool-slot-generation.test.ts fix(workers): resilient + zero-copy ingestion worker pool — prevent analyze hangs on TS-root-scale loads (#1693) 2026-05-20 20:39:35 +01:00
worker-pool-startup-stderr.test.ts feat(workers): self-healing worker pool + deferred-resolution observability (#1741) (#1947) 2026-05-31 13:52:04 +01:00
worker-pool-timeout-retire.test.ts fix(worker): analyze native worker aborts (#1833) 2026-05-26 17:28:39 +01:00
worker-pool-transferlist.test.ts fix(workers): resilient + zero-copy ingestion worker pool — prevent analyze hangs on TS-root-scale loads (#1693) 2026-05-20 20:39:35 +01:00
worker-pool-windows-quarantine.test.ts fix(workers): resilient + zero-copy ingestion worker pool — prevent analyze hangs on TS-root-scale loads (#1693) 2026-05-20 20:39:35 +01:00