GitNexus/AGENTS.md
BlackOvOoo 263ca353a6
fix: shard parse cache persistence on large repos (#1580)
* fix: shard parse cache persistence on large repos

* fix(parse-cache): validate shard keys, docs, and sharded-cache tests

- Reject non-sha256-hex keys from index.json before path.join (path traversal).

- saveParseCache: skip invalid keys defensively; try/catch per-shard JSON.stringify.

- Clarify save comment (tmp dir + rename vs atomic).

- Tests: hex keys throughout, traversal keys, multi-shard, version-mismatch+legacy, second save, legacy removal.

- AGENTS.md / GUARDRAILS.md: document .gitnexus/parse-cache/ vs legacy parse-cache.json.

Co-authored-by: Cursor <cursoragent@cursor.com>

* chore(autofix): apply prettier + eslint fixes via /autofix command

---------

Co-authored-by: Gergő Magyar <gergomagyar@icloud.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2026-05-16 07:19:06 +01:00

15 KiB

Last reviewed: 2026-04-23

Project: GitNexus · Environment: dev · Maintainer: repository maintainers (see GitHub)

Scope

Boundary Rule
Reads gitnexus/, gitnexus-web/, eval/, plugin packages, .github/, .gitnexus/, docs.
Writes Only paths required for the change; keep diffs minimal. Update lockfiles when deps change.
Executes npm, npx, node under gitnexus/ and gitnexus-web/; uv run for Python under eval/; documented CI/dev workflows.
Off-limits Real .env / secrets, production credentials, unrelated repos, destructive git ops without confirmation.

Model Configuration

  • Primary: Use a named model (e.g. Claude Sonnet 4.x). Avoid Auto or unversioned latest when reproducibility matters.
  • Notes: The GitNexus CLI indexer does not call an LLM.

Execution Sequence (complex tasks)

For multi-step work, state up front:

  1. Which rules in this file and GUARDRAILS.md apply (and any relevant Signs).
  2. Current Scope boundaries.
  3. Which validation commands you will run (cd gitnexus && npm test, npx tsc --noEmit).

On long threads, "Remember: apply all AGENTS.md rules" re-weights these instructions against context dilution.

Claude Code hooks

PreToolUse hooks can block tools (e.g. git_commit) until checks pass. Adapt to this repo: cd gitnexus && npm test before commit.

Context budget

Commands and gotchas live under Repo reference below and in CONTRIBUTING.md. If always-on rules grow, split into .cursor/rules/*.mdc (globs). Cursor: project-wide rules in .cursor/index.mdc. Claude Code: load STANDARDS.md only when needed.

Reference docs

  • ARCHITECTURE.md, CONTRIBUTING.md, GUARDRAILS.md
  • Call-resolution DAG (legacy path): See ARCHITECTURE.md § Call-Resolution DAG. Typed 6-stage DAG inside the parse phase; language-specific behavior behind inferImplicitReceiver / selectDispatch hooks on LanguageProvider. Shared code in gitnexus/src/core/ingestion/ must not name languages. Types: gitnexus/src/core/ingestion/call-types.ts.
  • Scope-resolution pipeline (RFC #909 Ring 3): See ARCHITECTURE.md § Scope-Resolution Pipeline. Replaces the legacy DAG for languages in MIGRATED_LANGUAGES (see registry-primary-flag.ts). A language plugs in by implementing ScopeResolver (scope-resolution/contract/scope-resolver.ts) and registering it in SCOPE_RESOLVERS. CI parity gate runs BOTH paths per migrated language on every PR.
  • Cursor: .cursor/index.mdc (always-on); .cursor/rules/*.mdc (glob-scoped). Legacy .cursorrules deprecated.
  • GitNexus: skills in .claude/skills/gitnexus/; MCP rules in gitnexus:start block below.

Changelog

Date Version Change
2026-04-23 1.7.0 TypeScript added to MIGRATED_LANGUAGES (registry-primary call resolution by default).
2026-04-20 1.6.0 Added scope-resolution pipeline pointer (RFC #909 Ring 3); Python migrated to registry-primary.
2026-04-19 1.5.0 Cross-repo impact (#794): impact/query/context accept repo: "@<group>" + service. Removed group_query/group_contracts/group_status MCP tools; added gitnexus://group/{name}/contracts and gitnexus://group/{name}/status resources.
2026-04-16 1.4.0 Fixed: web UI description, pre-commit behavior, MCP tools (7->16), added gitnexus-shared, removed stale vite-plugin-wasm gotcha.
2026-04-13 1.3.0 Updated GitNexus index stats after DAG refactor.
2026-03-24 1.2.0 Fixed gitnexus:start block duplication.
2026-03-23 1.1.0 Updated agent instructions, references, Cursor layout.
2026-03-22 1.0.0 Initial structured header and changelog.

GitNexus — Code Intelligence

Indexed as GitNexus (4325 symbols, 10556 relationships, 300 execution flows). Use MCP tools to understand code, assess impact, and navigate safely.

If any tool warns the index is stale, run npx gitnexus analyze first.

Always Do

  • MUST run impact analysis before editing any symbol. gitnexus_impact({target: "symbolName", direction: "upstream"}) — report blast radius to the user.
  • MUST run gitnexus_detect_changes() before committing — verify only expected symbols and flows are affected.
  • MUST warn the user if impact returns HIGH or CRITICAL risk.
  • Explore unfamiliar code with gitnexus_query({query: "concept"}) (process-grouped, ranked) instead of grepping.
  • Full context on a symbol: gitnexus_context({name: "symbolName"}).

When Debugging

  1. gitnexus_query({query: "<error or symptom>"}) — find related execution flows
  2. gitnexus_context({name: "<suspect function>"}) — callers, callees, process participation
  3. READ gitnexus://repo/GitNexus/process/{processName} — trace flow step by step
  4. Regressions: gitnexus_detect_changes({scope: "compare", base_ref: "main"})

When Refactoring

  • Rename: gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true}) first. Graph edits are safe; text_search edits need manual review.
  • Extract/Split: gitnexus_context (incoming/outgoing refs) then gitnexus_impact (upstream callers) before moving code.
  • After any refactor: gitnexus_detect_changes({scope: "all"}) to verify scope.

Never Do

  • Edit a symbol without running gitnexus_impact first.
  • Ignore HIGH/CRITICAL risk warnings.
  • Rename with find-and-replace — use gitnexus_rename.
  • Commit without gitnexus_detect_changes().
  • Add language-specific behavior to shared ingestion code (gitnexus/src/core/ingestion/) — use a LanguageProvider hook. Seeing provider.mroStrategy === 'xxx' or an import from languages/xxx.ts in shared code means stop and add a hook.

Tools Quick Reference

Tool When to use Example
list_repos Discover indexed repos gitnexus_list_repos({})
query Find code by concept gitnexus_query({query: "auth validation"})
context 360-degree view of one symbol gitnexus_context({name: "validateUser"})
impact Blast radius before editing gitnexus_impact({target: "X", direction: "upstream"})
detect_changes Pre-commit scope check gitnexus_detect_changes({scope: "staged"})
rename Safe multi-file rename gitnexus_rename({symbol_name: "old", new_name: "new", dry_run: true})
cypher Custom graph queries gitnexus_cypher({query: "MATCH ..."})
api_impact Pre-change API route impact gitnexus_api_impact({route: "/api/users", method: "GET"})
route_map Route → handler → consumer map gitnexus_route_map({})
tool_map MCP/RPC tool definitions gitnexus_tool_map({})
shape_check Response shape vs consumer access gitnexus_shape_check({route: "/api/users"})
group_list List repo groups gitnexus_group_list({})
group_sync Rebuild group Contract Registry gitnexus_group_sync({name: "myGroup"})
query (group mode) Cross-repo search in a group (RRF-merged) gitnexus_query({repo: "@myGroup", query: "auth"})
context (group mode) 360° view across all member repos gitnexus_context({repo: "@myGroup", name: "validateUser"})
impact (group mode) Cross-repo blast radius via Contract Bridge gitnexus_impact({repo: "@myGroup", target: "X", direction: "upstream"})

Group mode: pass repo: "@<groupName>" to fan out across all member repos, or repo: "@<groupName>/<memberPath>" to target a single member (path keys from group.yaml). Optional service: "<monorepo/path>" filters by service root. Group-level state (contracts, staleness) lives in the resources table below — there are no group_query / group_context / group_impact / group_contracts / group_status MCP tools.

For a full walkthrough of setting up a group across multiple repos that communicate over gRPC, see docs/guides/microservices-grpc.md.

Impact Risk Levels

Depth Meaning Action
d=1 WILL BREAK — direct callers/importers MUST update
d=2 LIKELY AFFECTED — indirect deps Should test
d=3 MAY NEED TESTING — transitive Test if critical path

Resources

Resource Use for
gitnexus://repo/GitNexus/context Codebase overview, index freshness
gitnexus://repo/GitNexus/clusters All functional areas
gitnexus://repo/GitNexus/processes All execution flows
gitnexus://repo/GitNexus/process/{name} Step-by-step execution trace
gitnexus://group/{name}/contracts Group Contract Registry (provider/consumer rows + cross-links)
gitnexus://group/{name}/status Per-member index + Contract Registry staleness report

Self-Check Before Finishing

  1. gitnexus_impact was run for all modified symbols
  2. No HIGH/CRITICAL warnings were ignored
  3. gitnexus_detect_changes() confirms expected scope
  4. All d=1 dependents were updated

Keeping the Index Fresh

npx gitnexus analyze                 # incremental by default; preserves embeddings
npx gitnexus analyze --force         # full rebuild from scratch (opt out of incremental)
npx gitnexus analyze --embeddings    # also generate embeddings for new/changed nodes
npx gitnexus analyze --drop-embeddings  # explicit opt-in to wipe existing embeddings

analyze runs incrementally by default. The pipeline still parses every file every run (cross-file resolution requires it), but tree-sitter parsing is served from a content-addressed cache under .gitnexus/parse-cache/ (per-chunk JSON shards plus index.json) for chunks whose file contents haven't changed since the last run. Older installs may still have a legacy single file .gitnexus/parse-cache.json, which is read for backward compatibility but no longer written. Only changed-file rows (and their importers) are rewritten in LadybugDB; unchanged-file rows are preserved. Output is byte-equivalent to a full rebuild. Pass --force to wipe and re-index from scratch (e.g., to recover from a corrupt index, or after upgrading GitNexus).

The parse cache key is content-addressed and version-tagged: it survives --force runs, and is automatically invalidated by a gitnexus package upgrade (so a new tree-sitter grammar doesn't silently replay stale parse output). Safe to delete the whole .gitnexus/parse-cache/ directory (and remove any legacy .gitnexus/parse-cache.json if present) at any time — it'll be rebuilt on the next analyze.

Check .gitnexus/meta.json stats.embeddings (0 = none). A plain analyze no longer drops existing vectors — pass --drop-embeddings to wipe.

Claude Code: PostToolUse hook detects a stale index after git commit and git merge and prompts the agent to run analyze. The hook does not invoke analyze itself.

CLI Skills

Task Skill file
Architecture / "How does X work?" .claude/skills/gitnexus/gitnexus-exploring/SKILL.md
Blast radius / "What breaks?" .claude/skills/gitnexus/gitnexus-impact-analysis/SKILL.md
Debugging / "Why is X failing?" .claude/skills/gitnexus/gitnexus-debugging/SKILL.md
Refactoring .claude/skills/gitnexus/gitnexus-refactoring/SKILL.md
Tools/resources/schema reference .claude/skills/gitnexus/gitnexus-guide/SKILL.md
CLI commands (index, status, clean, wiki) .claude/skills/gitnexus/gitnexus-cli/SKILL.md

Hook env knobs

The Claude Code hook (gitnexus/hooks/claude/gitnexus-hook.cjs and the mirrored plugin copy under gitnexus-claude-plugin/hooks/) honours these env vars. Defaults work for normal installations; set them only to override resolution. All path overrides ignore values that do not exist on disk and fall through to the standard resolution chain.

Env var Type Default Purpose
GITNEXUS_HOOK_CLI_PATH path resolved via package layout / require.resolve Override path to the gitnexus CLI entry the hook spawns for augment.
GITNEXUS_HOOK_LSOF_PATH path lsof on PATH (with /usr/bin/lsof, /usr/sbin/lsof, /sbin/lsof fallbacks) Override POSIX lsof location for the DB-lock probe.
GITNEXUS_HOOK_PS_PATH path ps on PATH (with /bin/ps, /usr/bin/ps fallbacks) Override POSIX ps location.
GITNEXUS_HOOK_POWERSHELL_PATH path %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe (then SysWOW64, then powershell.exe on PATH) Override Windows PowerShell location used by the Restart-Manager probe.
GITNEXUS_HOOK_LINUX_PROC_BUDGET_MS integer ms 1200 Max wall-clock for the Linux /proc fd scan before bailing out to the lsof fallback.
GITNEXUS_HOOK_RM_TARGET path derived Restart-Manager target file (the LadybugDB path under .gitnexus/). Set internally by the hook; rarely overridden manually.
GITNEXUS_DEBUG boolean (1/true) unset Verbose stderr from the hook: prints discarded augment-stderr prefixes and one-shot .ps1 load-failure warnings.

Repo reference

Packages

Package Path Purpose
CLI/Core gitnexus/ TypeScript CLI, indexing pipeline, MCP server. Published to npm.
Web UI gitnexus-web/ React/Vite thin client. All queries via gitnexus serve HTTP API.
Shared gitnexus-shared/ Shared TypeScript types and constants.
Claude Plugin gitnexus-claude-plugin/ Static config for Claude marketplace.
Cursor Integration gitnexus-cursor-integration/ Static config for Cursor editor.
Eval eval/ Python evaluation harness (Docker + LLM API keys).

Running services

cd gitnexus && npm run dev                 # CLI: tsx watch mode
cd gitnexus-web && npm run dev             # Web UI: Vite on port 5173
npx gitnexus serve                         # HTTP API on port 4747 (from any indexed repo)

Testing

CLI / Core (gitnexus/)

  • npm test — full vitest suite (~2000 tests)
  • npm run test:unit — unit tests only
  • npm run test:integration — integration (~1850 tests). LadybugDB file-locking tests may fail in containers (known env issue).
  • npx tsc --noEmit — typecheck

Web UI (gitnexus-web/)

  • npm test — vitest (~200 tests)
  • npm run test:e2e — Playwright (7 spec files; requires gitnexus serve + npm run dev)
  • npx tsc -b --noEmit — typecheck

Pre-commit hook (.husky/pre-commit): formatting (prettier via lint-staged) + typecheck for staged packages. Tests do not run in pre-commit — CI only.

Gotchas

  • npm install in gitnexus/ triggers prepare (builds via tsc) and postinstall (patches tree-sitter-swift, builds tree-sitter-proto). Native bindings need python3, make, g++.
  • tree-sitter-kotlin and tree-sitter-swift are optional — install warnings expected.
  • ESLint configured via eslint.config.mjs (TS, React Hooks, unused-imports). No npm run lint script; use npx eslint .. Prettier runs via lint-staged. CI checks both in ci-quality.yml.