gitnexus 1.6.11-rc.22 → 1.6.11-rc.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +24 -21
  2. package/dist/_shared/graph/types.d.ts +6 -0
  3. package/dist/_shared/graph/types.d.ts.map +1 -1
  4. package/dist/cli/ai-context.d.ts +4 -0
  5. package/dist/cli/ai-context.js +5 -2
  6. package/dist/cli/analyze-config.js +14 -0
  7. package/dist/cli/analyze-options.d.ts +5 -0
  8. package/dist/cli/analyze.js +2 -0
  9. package/dist/cli/index.js +2 -0
  10. package/dist/cli/watch.js +2 -0
  11. package/dist/core/ingestion/frameworks/spring/actuator-runtime.d.ts +26 -0
  12. package/dist/core/ingestion/frameworks/spring/actuator-runtime.js +843 -0
  13. package/dist/core/ingestion/language-provider.d.ts +23 -1
  14. package/dist/core/ingestion/languages/java/spring-actuator.d.ts +2 -0
  15. package/dist/core/ingestion/languages/java/spring-actuator.js +62 -0
  16. package/dist/core/ingestion/languages/java.js +2 -0
  17. package/dist/core/ingestion/languages/kotlin/spring-actuator.d.ts +4 -0
  18. package/dist/core/ingestion/languages/kotlin/spring-actuator.js +172 -0
  19. package/dist/core/ingestion/languages/kotlin.js +3 -0
  20. package/dist/core/ingestion/pipeline-phases/processes.d.ts +2 -1
  21. package/dist/core/ingestion/pipeline-phases/processes.js +39 -4
  22. package/dist/core/ingestion/pipeline-phases/scan.js +82 -1
  23. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.d.ts +2 -0
  24. package/dist/core/ingestion/pipeline-phases/spring-auto-configuration.js +8 -0
  25. package/dist/core/ingestion/pipeline.d.ts +8 -0
  26. package/dist/core/ingestion/workers/parse-worker.js +1 -0
  27. package/dist/core/lbug/csv-generator.js +4 -1
  28. package/dist/core/lbug/graph-emit-sink.d.ts +3 -2
  29. package/dist/core/lbug/graph-emit-sink.js +4 -2
  30. package/dist/core/lbug/lbug-adapter.js +1 -1
  31. package/dist/core/lbug/schema.d.ts +1 -1
  32. package/dist/core/lbug/schema.js +3 -0
  33. package/dist/core/run-analyze.d.ts +5 -0
  34. package/dist/core/run-analyze.js +56 -0
  35. package/dist/mcp/local/local-backend.js +35 -3
  36. package/dist/mcp/resources.js +1 -0
  37. package/dist/mcp/tools.js +3 -3
  38. package/dist/server/analyze-launch.d.ts +1 -0
  39. package/dist/server/analyze-launch.js +1 -0
  40. package/dist/server/api.d.ts +4 -0
  41. package/dist/server/api.js +46 -4
  42. package/dist/storage/repo-meta.d.ts +12 -0
  43. package/package.json +1 -1
  44. package/skills/gitnexus-cli.md +3 -0
package/README.md CHANGED
@@ -244,6 +244,7 @@ gitnexus analyze --skip-agents-md # Preserve custom AGENTS.md/CLAUDE.md gitnexu
244
244
  gitnexus analyze --skip-skills # Skip installing standard .claude/skills/gitnexus-* skill files
245
245
  gitnexus analyze --skip-git # Index folders that are not Git repositories
246
246
  gitnexus analyze --workers <n> # Parse worker pool size (>=1; default: cores-1, capped at 16)
247
+ gitnexus analyze --spring-actuator ./actuator # Enrich with local Spring Boot Actuator JSON snapshots
247
248
  gitnexus analyze --verbose # Log skipped files when parsers are unavailable
248
249
  gitnexus analyze --max-file-size 1024 # Skip files larger than N KB (default: 512, cap: 32768)
249
250
  gitnexus analyze --worker-timeout 60 # Increase worker idle timeout for slow parses
@@ -323,6 +324,8 @@ and root fields. Dynamic decorator names, anonymous operations, and ambiguous or
323
324
  anchors are deliberately omitted. Add common infrastructure fields such as `/health` to
324
325
  `matching.exclude_links_paths` to keep those GraphQL contracts visible without cross-linking them.
325
326
 
327
+ `--spring-actuator` is explicitly opt-in. The path may be a JSON bundle keyed by `mappings`, `beans`, `conditions`, `configprops`, and/or `env`, or a directory containing endpoint-named JSON files. Runtime mappings and beans confirm matching static nodes; conditions and configuration property keys enrich existing evidence, with conservative runtime-only nodes added when no match exists. The configured input is excluded from source scanning; only normalized repository-relative exclusions are retained for future scans, never absolute paths. Env/configprops values, origins, condition messages, and source names are never persisted or printed. Enabled runs always rebuild because runtime snapshots are external to git freshness; omitting the option later rebuilds once to remove runtime evidence. Project config can set the same path with `springActuator` in `.gitnexusrc`.
328
+
326
329
  > **`gitnexus uninstall`** reverses `gitnexus setup` — it removes the GitNexus MCP entries, hooks, and skill directories it added to each detected editor. Skill directories are identified **by bundled gitnexus skill name** (e.g. `gitnexus-cli/`), so if you customized files inside an installed skill directory, back them up first. It is a dry-run preview by default and prints the exact paths it would remove; pass `--force` to apply. Per-repo indexes (`gitnexus clean --all`) and the global npm package (`npm uninstall -g gitnexus`) are left for you to remove.
327
330
 
328
331
  ## Remote Embeddings
@@ -431,7 +434,7 @@ Installed automatically by both `gitnexus analyze` (per-repo) and `gitnexus setu
431
434
  LadybugDB native binary ships as a prebuild against that floor, so on an older host it cannot
432
435
  load and reinstalling does not help — see
433
436
  [Linux: `GLIBC_2.34' not found`](#linux-glibc_234-not-found).
434
- - **Windows, for full-text search:** the Microsoft Visual C++ 2015-2022 Redistributable (x64) *and*
437
+ - **Windows, for full-text search:** the Microsoft Visual C++ 2015-2022 Redistributable (x64) _and_
435
438
  OpenSSL 3 (`libssl-3-x64.dll`, `libcrypto-3-x64.dll`) resolvable on `PATH` — see
436
439
  [Windows: full-text search unavailable](#windows-full-text-search-unavailable).
437
440
 
@@ -708,17 +711,17 @@ For repositories with very large source files, `GITNEXUS_WORKER_SUB_BATCH_MAX_BY
708
711
 
709
712
  Four env vars expose the pool's resilience layers (respawn budget, cumulative-timeout cap, circuit breaker, startup handshake). Defaults are tuned for typical repos; bump them when an analyze legitimately needs more retries, or lower them to fail-fast on a known-bad shape.
710
713
 
711
- | Variable | Default | Effect |
712
- | ----------------------------------------------- | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
713
- | `GITNEXUS_WORKER_MAX_RESPAWNS_PER_SLOT` | `3` | Max replacement spawns per slot before the slot is dropped from the active rotation. |
714
- | `GITNEXUS_WORKER_MAX_CUMULATIVE_TIMEOUT_MS` | `5 × subBatchTimeoutMs` | Total retry wall-time budget per job before quarantining. Bounds exponentially-growing retry waits. |
715
- | `GITNEXUS_WORKER_CONSECUTIVE_FAILURE_THRESHOLD` | `max(3, poolSize)` | Per-slot consecutive deaths before the pool's circuit breaker trips. After tripping, dispatches require a fresh pool. |
716
- | `GITNEXUS_WORKER_SHUTDOWN_DRAIN_MS` | `30000` | Max wait at pool shutdown for a retired worker still inside native code — terminated at its next JS-safe point instead of mid-native-call, which would abort the process (`Napi::Error`, #2432). |
717
- | `GITNEXUS_WORKER_READY_TIMEOUT_MS` | `5000` | Startup budget for a parse worker to load its grammar bindings and report `{type:'ready'}`. Slots that miss it are treated as startup crashes. Raise it on a slow or heavily loaded host where a full pool cold-starting concurrently needs more than 5s. |
718
- | `GITNEXUS_MEMORY` | `off` | unset (autopilot on) | `off` declines GitNexus's memory autopilot: analyze will neither re-run itself with a RAM-aware heap cap nor abort the parse before V8 enters its ineffective-mark-compact death spiral. Use it when you want to drive memory manually; to simply pin a heap size, pass Node's own `--max-old-space-size`, which is already honoured as your decision. |
719
- | `GITNEXUS_WORKER_HEAP_MB` | `clamp(512, RAM/2/poolSize, 4096)` | Per-worker V8 old-generation heap cap (#2649). Bounds pool RSS on large repos; a worker exceeding it dies with a real heap error handled by quarantine/respawn. |
720
- | `GITNEXUS_SERVER_ANALYZE_HEAP_MB` | `min(8192, auto cap)` | Heap for the web/MCP server's forked analyze worker (#2649). Defaults to the historical 8192 MB bounded by the machine/container's RAM-aware auto cap; set an absolute MB value to override. |
721
- | `GITNEXUS_CPP_CAPTURE_BUDGET_MS` | `20000` | Per-file wall-clock budget for C++ capture extraction; on breach the file keeps partial captures with a warning (#2432). `0` expires immediately. |
714
+ | Variable | Default | Effect |
715
+ | ----------------------------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
716
+ | `GITNEXUS_WORKER_MAX_RESPAWNS_PER_SLOT` | `3` | Max replacement spawns per slot before the slot is dropped from the active rotation. |
717
+ | `GITNEXUS_WORKER_MAX_CUMULATIVE_TIMEOUT_MS` | `5 × subBatchTimeoutMs` | Total retry wall-time budget per job before quarantining. Bounds exponentially-growing retry waits. |
718
+ | `GITNEXUS_WORKER_CONSECUTIVE_FAILURE_THRESHOLD` | `max(3, poolSize)` | Per-slot consecutive deaths before the pool's circuit breaker trips. After tripping, dispatches require a fresh pool. |
719
+ | `GITNEXUS_WORKER_SHUTDOWN_DRAIN_MS` | `30000` | Max wait at pool shutdown for a retired worker still inside native code — terminated at its next JS-safe point instead of mid-native-call, which would abort the process (`Napi::Error`, #2432). |
720
+ | `GITNEXUS_WORKER_READY_TIMEOUT_MS` | `5000` | Startup budget for a parse worker to load its grammar bindings and report `{type:'ready'}`. Slots that miss it are treated as startup crashes. Raise it on a slow or heavily loaded host where a full pool cold-starting concurrently needs more than 5s. |
721
+ | `GITNEXUS_MEMORY` | `off` | unset (autopilot on) | `off` declines GitNexus's memory autopilot: analyze will neither re-run itself with a RAM-aware heap cap nor abort the parse before V8 enters its ineffective-mark-compact death spiral. Use it when you want to drive memory manually; to simply pin a heap size, pass Node's own `--max-old-space-size`, which is already honoured as your decision. |
722
+ | `GITNEXUS_WORKER_HEAP_MB` | `clamp(512, RAM/2/poolSize, 4096)` | Per-worker V8 old-generation heap cap (#2649). Bounds pool RSS on large repos; a worker exceeding it dies with a real heap error handled by quarantine/respawn. |
723
+ | `GITNEXUS_SERVER_ANALYZE_HEAP_MB` | `min(8192, auto cap)` | Heap for the web/MCP server's forked analyze worker (#2649). Defaults to the historical 8192 MB bounded by the machine/container's RAM-aware auto cap; set an absolute MB value to override. |
724
+ | `GITNEXUS_CPP_CAPTURE_BUDGET_MS` | `20000` | Per-file wall-clock budget for C++ capture extraction; on breach the file keeps partial captures with a warning (#2432). `0` expires immediately. |
722
725
 
723
726
  ### Graph cleanup tuning
724
727
 
@@ -732,8 +735,8 @@ Programmatic callers can pass `keepLocalValueSymbols: true` in `PipelineOptions`
732
735
 
733
736
  ### Scope-resolution property-key dispatch cap
734
737
 
735
- During scope resolution GitNexus synthesizes CALLS edges through *property-key
736
- dispatch* — call sites like `hooks.emitScopeCaptures()` where a property key is
738
+ During scope resolution GitNexus synthesizes CALLS edges through _property-key
739
+ dispatch_ — call sites like `hooks.emitScopeCaptures()` where a property key is
737
740
  registered by multiple definitions across the codebase. To keep this fan-in
738
741
  bounded, each property key is capped at **32 registrations**: a key registered
739
742
  by more than 32 distinct functions is skipped entirely (no CALLS are synthesized
@@ -741,8 +744,8 @@ through it), and the dropped key names are surfaced in the analyze log for
741
744
  operator visibility. The cap is calibrated at 2× this repo's own provider table
742
745
  (16 legitimate registrations, one per language provider).
743
746
 
744
- | Variable | Default | Effect |
745
- | --------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
747
+ | Variable | Default | Effect |
748
+ | --------------------------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
746
749
  | `GITNEXUS_MAX_PROPERTY_DISPATCH_FANOUT` | `32` | Per-property-key registration cap in the property-dispatch scope-resolution pass. Set to a positive integer to raise it for repositories whose provider/hook tables exceed the default and lose CALLS coverage on a legitimate key; non-integer or `< 1` values fall back to `32`. Lowering it tightens the overflow budget. |
747
750
 
748
751
  ```bash
@@ -755,11 +758,11 @@ npx gitnexus analyze --force
755
758
 
756
759
  ### Scope-resolution dispatch-target cap
757
760
 
758
- During scope resolution GitNexus resolves calls that flow through *callable
759
- values* — function/method references bound to variables, passed as arguments,
761
+ During scope resolution GitNexus resolves calls that flow through _callable
762
+ values_ — function/method references bound to variables, passed as arguments,
760
763
  or stored in maps/tables. To keep that inclusion-based resolution finite, each
761
764
  callable site is capped at **32 dispatch targets**. When a site gathers more
762
- candidates than the cap it is treated as **overflowed** and *all* of its call
765
+ candidates than the cap it is treated as **overflowed** and _all_ of its call
763
766
  edges are dropped — a cliff, not a tail, so a repository with a legitimately
764
767
  wide dispatch table (a single callable site resolving to 33+ targets) loses
765
768
  that site's whole call chain. In that case `analyze` logs
@@ -769,8 +772,8 @@ candidate count, and the cap (32).
769
772
 
770
773
  Raise the cap for such repositories:
771
774
 
772
- | Variable | Default | Effect |
773
- | ------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
775
+ | Variable | Default | Effect |
776
+ | ------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
774
777
  | `GITNEXUS_MAX_CALLABLE_VALUE_TARGETS` | `32` | Per-callable-site dispatch-target cap in the callable-value-flow scope-resolution pass. Set to a positive integer to raise it for repositories whose wide dispatch tables overflow the default and lose a whole call chain; non-integer or `< 1` values fall back to `32`. Lowering it tightens the overflow budget. |
775
778
 
776
779
  ```bash
@@ -48,6 +48,12 @@ export type NodeProperties = {
48
48
  responseKeys?: string[];
49
49
  errorKeys?: string[];
50
50
  middleware?: string[];
51
+ /** Route runtime evidence is authoritative only when this is exactly true. */
52
+ runtimeConfirmed?: boolean;
53
+ /** Provenance of runtime evidence; presence alone does not imply confirmation. */
54
+ runtimeSource?: string;
55
+ /** Runtime result such as runtime-confirmed or handler-conflict. */
56
+ runtimeStatus?: string;
51
57
  text?: string;
52
58
  /** BasicBlock: space-joined leaf callee names invoked in the block — the
53
59
  * statement-precise inter-procedural reach substrate for impact mode. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,8 @@ export interface AIContextOptions {
30
30
  * "no PDG layer" note, so advertising it on a non-`--pdg` index is noise.
31
31
  */
32
32
  hasPdg?: boolean;
33
+ /** Whether this index includes opt-in Spring Actuator runtime evidence. */
34
+ hasSpringActuator?: boolean;
33
35
  }
34
36
  /**
35
37
  * Strip backticks from a branch name before it is embedded in a Markdown
@@ -62,6 +64,8 @@ export interface GitNexusContentOptions {
62
64
  * line below — false (default) omits it, so a non-pdg index doesn't advertise
63
65
  * a tool that only returns a "no PDG layer" note. */
64
66
  hasPdg?: boolean;
67
+ /** Whether Route nodes may carry Spring Actuator runtime evidence. */
68
+ hasSpringActuator?: boolean;
65
69
  }
66
70
  export declare function generateGitNexusContent(projectName: string, stats: RepoStats, opts?: GitNexusContentOptions): string;
67
71
  /**
@@ -79,7 +79,7 @@ export function markdownSafeBranch(branch) {
79
79
  return branch.replace(/`/g, '');
80
80
  }
81
81
  export function generateGitNexusContent(projectName, stats, opts = {}) {
82
- const { generatedSkills, groupNames, noStats, skipSkills, runnerPath = '.gitnexus/run.cjs', defaultBranch = 'main', hasPdg = false, } = opts;
82
+ const { generatedSkills, groupNames, noStats, skipSkills, runnerPath = '.gitnexus/run.cjs', defaultBranch = 'main', hasPdg = false, hasSpringActuator = false, } = opts;
83
83
  const generatedRows = generatedSkills && generatedSkills.length > 0
84
84
  ? generatedSkills
85
85
  .map((s) =>
@@ -146,7 +146,9 @@ This project is indexed by GitNexus as **${projectName}**${noStats ? '' : ` (${s
146
146
  - MUST warn on HIGH/CRITICAL \`risk\` pre-edit; never use \`riskSharedAxes\` to waive a HIGH/CRITICAL \`risk\` warning. Compare File/symbol: MCP File omits axes; Graph-RAG expands File.
147
147
  - **MUST treat \`risk: UNKNOWN\` as unresolved, not as low.** An empty caller set is not evidence the symbol is unused — it can also mean the callers are not resolvable by the index (plain-object property access, dynamic dispatch, cross-language calls). \`impact\` pairs \`UNKNOWN\` with a \`riskNote\` saying so. Confirm with a text search before treating the symbol as safe to change or delete; do not proceed on the strength of a zero.
148
148
  - Explore with \`query({search_query: "concept"})\` for process-grouped flows.
149
- - Use \`context({name: "symbolName"})\` for callers, callees, and flows.
149
+ - Use \`context({name: "symbolName"})\` for callers, callees, and flows.${hasSpringActuator
150
+ ? '\n- Spring Actuator runtime evidence is enabled. A Route is authoritative only when `runtimeConfirmed === true`; `runtimeSource` is provenance and may also describe conflicts. Snapshot values are never persisted.'
151
+ : ''}
150
152
  - For security review, \`explain({target: "fileOrSymbol"})\` lists taint findings (source→sink flows; needs \`analyze --pdg\`).${hasPdg
151
153
  ? `\n- For control/data dependence, \`pdg_query({mode: "controls", target: "fileOrSymbol"})\` answers "under what condition does X run?" (CDG, incl. guard clauses) and \`pdg_query({mode: "flows", target, variable})\` traces "where does variable Y flow?" (REACHING_DEF). \`--pdg\` layer.`
152
154
  : ''}
@@ -414,6 +416,7 @@ export async function generateAIContextFiles(repoPath, storagePath, projectName,
414
416
  runnerPath,
415
417
  defaultBranch: options?.defaultBranch ?? 'main',
416
418
  hasPdg: options?.hasPdg ?? false,
419
+ hasSpringActuator: options?.hasSpringActuator ?? false,
417
420
  });
418
421
  const createdFiles = [];
419
422
  if (!options?.skipAgentsMd) {
@@ -86,6 +86,9 @@ const KEY_SPECS = {
86
86
  // built-in convention set, is otherwise invisible to route_map consumers.
87
87
  // Listing it here adds it to the cross-file consumer scan.
88
88
  fetchWrappers: { target: 'fetchWrappers', kind: 'string-array' },
89
+ // Explicit local Actuator snapshot input (#2418). The path itself is safe in
90
+ // project config; payload contents are never copied into the graph wholesale.
91
+ springActuator: { target: 'springActuator', kind: 'path' },
89
92
  // Auth token AND dims are intentionally CLI/env-only — no embeddingAuthToken
90
93
  // or embeddingDims key here:
91
94
  // - the token keeps secrets out of a committed .gitnexusrc;
@@ -192,6 +195,17 @@ const normalizeValue = (kind, value, key) => {
192
195
  throw new GitNexusRcError(`${source} must be a string branch name.`);
193
196
  }
194
197
  return validateBranchName(value, source);
198
+ case 'path': {
199
+ if (typeof value !== 'string') {
200
+ throw new GitNexusRcError(`${source} must be a file or directory path.`);
201
+ }
202
+ const trimmed = value.trim();
203
+ if (!trimmed) {
204
+ throw new GitNexusRcError(`${source} must not be empty.`);
205
+ }
206
+ assertNoHiddenChars(trimmed, source);
207
+ return trimmed;
208
+ }
195
209
  case 'string': {
196
210
  if (typeof value !== 'string') {
197
211
  throw new GitNexusRcError(`${source} must be a string.`);
@@ -124,6 +124,11 @@ export interface AnalyzeOptions {
124
124
  * outside the built-in convention still produces `route_map` consumers.
125
125
  */
126
126
  fetchWrappers?: string[];
127
+ /**
128
+ * Explicit local Spring Boot Actuator snapshot input (#2418). Accepts a JSON
129
+ * bundle or a directory containing endpoint JSON files. Disabled by default.
130
+ */
131
+ springActuator?: string;
127
132
  /** OpenAI-compatible embeddings base URL (incl. /v1). Overrides GITNEXUS_EMBEDDING_URL. */
128
133
  embeddingBaseUrl?: string;
129
134
  /** Embedding model name. Overrides GITNEXUS_EMBEDDING_MODEL. */
@@ -1112,6 +1112,7 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1112
1112
  // Extra fetch-wrapper names from `.gitnexusrc` (#1589/#1852 residual);
1113
1113
  // forwarded to the routes phase consumer scan.
1114
1114
  fetchWrappers: options.fetchWrappers,
1115
+ springActuatorPath: options.springActuator,
1115
1116
  // The CLI always process.exit()s after this returns (success path at the
1116
1117
  // end of analyzeCommandImpl, error/interrupt paths via process.exit too),
1117
1118
  // so the finalize close skips the native conn/db close — it can double-free
@@ -1250,6 +1251,7 @@ const analyzeCommandImpl = async (inputPath, cliOptions, runnerIdentityAtBootstr
1250
1251
  // exercised on the `--skills` path by analyze-no-stats-bridge.test.ts.
1251
1252
  noStats: options.stats === false,
1252
1253
  hasPdg: options.pdg === true,
1254
+ hasSpringActuator: options.springActuator !== undefined,
1253
1255
  });
1254
1256
  }
1255
1257
  }
package/dist/cli/index.js CHANGED
@@ -73,6 +73,8 @@ program
73
73
  .option('--wal-checkpoint-threshold <bytes>', 'LadybugDB WAL auto-checkpoint threshold in bytes during analyze ' +
74
74
  '(integer >= -1; default: 67108864 = 64 MiB; -1 keeps Ladybug stock ~16 MiB).')
75
75
  .option('--workers <n>', 'Parse worker pool size (>=1). Default: cores-1 capped at 16, auto-sized to the repo.')
76
+ .option('--spring-actuator <path>', 'Import local Spring Boot Actuator JSON snapshots (mappings, beans, conditions, ' +
77
+ 'configprops, env). Explicit opt-in; disabled by default.')
76
78
  .option('--embedding-threads <n>', 'Limit local ONNX embedding CPU threads')
77
79
  .option('--embedding-batch-size <n>', 'Number of nodes per embedding batch')
78
80
  .option('--embedding-sub-batch-size <n>', 'Number of chunks per embedding model call')
package/dist/cli/watch.js CHANGED
@@ -74,6 +74,7 @@ export async function resolveWatchOptions(repoPath, cli, baseline, reportIgnored
74
74
  ['--self-commit', cli.selfCommit],
75
75
  ['--index-only', cli.indexOnly],
76
76
  ['--skip-git', cli.skipGit],
77
+ ['--spring-actuator', cli.springActuator],
77
78
  ['walCheckpointThreshold', cli.walCheckpointThreshold],
78
79
  ['embeddingThreads', cli.embeddingThreads],
79
80
  ['embeddingBatchSize', cli.embeddingBatchSize],
@@ -94,6 +95,7 @@ export async function resolveWatchOptions(repoPath, cli, baseline, reportIgnored
94
95
  ['skipAgentsMd', config.skipAgentsMd !== undefined],
95
96
  ['skipSkills', config.skipSkills !== undefined],
96
97
  ['stats', config.stats !== undefined],
98
+ ['springActuator', config.springActuator],
97
99
  ['walCheckpointThreshold', config.walCheckpointThreshold],
98
100
  ['embeddingThreads', config.embeddingThreads],
99
101
  ['embeddingBatchSize', config.embeddingBatchSize],
@@ -0,0 +1,26 @@
1
+ import type { KnowledgeGraph } from '../../../graph/types.js';
2
+ export declare const ACTUATOR_ENDPOINTS: readonly ["mappings", "beans", "conditions", "configprops", "env"];
3
+ type ActuatorEndpoint = (typeof ACTUATOR_ENDPOINTS)[number];
4
+ export declare const MAX_RUNTIME_RECORDS = 50000;
5
+ export interface SpringActuatorImportStats {
6
+ readonly payloads: number;
7
+ readonly mappings: number;
8
+ readonly beans: number;
9
+ readonly conditions: number;
10
+ readonly configProperties: number;
11
+ readonly environmentProperties: number;
12
+ /** Endpoint categories that exceeded the bounded import size. */
13
+ readonly truncatedEndpoints: readonly ActuatorEndpoint[];
14
+ }
15
+ export declare class SpringActuatorImportError extends Error {
16
+ constructor(message: string);
17
+ }
18
+ /**
19
+ * Import explicitly supplied Spring Boot Actuator snapshots. Runtime evidence
20
+ * is additive: it confirms existing static nodes where possible and creates
21
+ * conservative synthetic Route/Bean/Property nodes otherwise. Raw payloads,
22
+ * condition messages, config values, env values, origins, and source names are
23
+ * never copied into graph properties or logs.
24
+ */
25
+ export declare function importSpringActuatorRuntime(graph: KnowledgeGraph, repoPath: string, configuredPath: string): Promise<SpringActuatorImportStats>;
26
+ export {};