@veewo/gitnexus 1.5.6 → 1.5.8

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 (104) hide show
  1. package/dist/benchmark/analyze-runner.d.ts +0 -2
  2. package/dist/benchmark/analyze-runner.js +0 -6
  3. package/dist/benchmark/analyze-runner.test.js +1 -10
  4. package/dist/benchmark/runner.d.ts +0 -2
  5. package/dist/benchmark/runner.js +0 -2
  6. package/dist/benchmark/u2-e2e/neonspark-full-e2e.js +0 -11
  7. package/dist/benchmark/u2-performance-sampler.js +3 -16
  8. package/dist/cli/ai-context.js +1 -7
  9. package/dist/cli/analyze-options.d.ts +19 -6
  10. package/dist/cli/analyze-options.js +76 -71
  11. package/dist/cli/analyze-options.test.js +78 -73
  12. package/dist/cli/analyze-runtime-summary.js +0 -1
  13. package/dist/cli/analyze-runtime-summary.test.js +0 -2
  14. package/dist/cli/analyze-summary.d.ts +0 -2
  15. package/dist/cli/analyze-summary.js +0 -24
  16. package/dist/cli/analyze-summary.test.js +1 -65
  17. package/dist/cli/analyze.d.ts +2 -4
  18. package/dist/cli/analyze.js +14 -30
  19. package/dist/cli/analyze.test.js +9 -15
  20. package/dist/cli/benchmark-agent-context.d.ts +0 -2
  21. package/dist/cli/benchmark-agent-context.js +0 -2
  22. package/dist/cli/benchmark-agent-safe-query-context.d.ts +0 -2
  23. package/dist/cli/benchmark-agent-safe-query-context.js +0 -2
  24. package/dist/cli/benchmark-unity.d.ts +0 -2
  25. package/dist/cli/benchmark-unity.js +0 -2
  26. package/dist/cli/clean.d.ts +2 -3
  27. package/dist/cli/clean.js +4 -25
  28. package/dist/cli/index.js +1 -12
  29. package/dist/core/ingestion/pipeline.js +1 -44
  30. package/dist/mcp/local/agent-safe-response.js +1 -1
  31. package/dist/mcp/local/local-backend.d.ts +0 -23
  32. package/dist/mcp/local/local-backend.js +69 -248
  33. package/dist/mcp/local/runtime-chain-verify.test.js +0 -49
  34. package/dist/mcp/local/runtime-claim-rule-registry.d.ts +0 -11
  35. package/dist/mcp/local/runtime-claim-rule-registry.js +0 -159
  36. package/dist/mcp/local/runtime-claim-rule-registry.test.js +67 -214
  37. package/dist/mcp/tools.js +0 -70
  38. package/dist/storage/repo-manager.d.ts +1 -0
  39. package/dist/types/pipeline.d.ts +0 -3
  40. package/package.json +1 -1
  41. package/skills/gitnexus-cli.md +62 -38
  42. package/vendor/node_modules/node-addon-api/node_addon_api.Makefile +6 -0
  43. package/vendor/node_modules/node-addon-api/node_addon_api.target.mk +122 -0
  44. package/vendor/node_modules/node-addon-api/node_addon_api_except.target.mk +126 -0
  45. package/vendor/node_modules/node-addon-api/node_addon_api_except_all.target.mk +122 -0
  46. package/vendor/node_modules/node-addon-api/node_addon_api_maybe.target.mk +122 -0
  47. package/vendor/tree-sitter-dart/build/Release/.deps/node_modules/node-addon-api/node_addon_api_except.stamp.d +1 -0
  48. package/vendor/tree-sitter-dart/build/node_modules/node-addon-api/node_addon_api_except.stamp +0 -0
  49. package/vendor/tree-sitter-proto/build/Release/.deps/node_modules/node-addon-api/node_addon_api_except.stamp.d +1 -0
  50. package/vendor/tree-sitter-proto/build/node_modules/node-addon-api/node_addon_api_except.stamp +0 -0
  51. package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.d.ts +0 -60
  52. package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.js +0 -395
  53. package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.test.d.ts +0 -1
  54. package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.test.js +0 -41
  55. package/dist/cli/rule-lab.d.ts +0 -38
  56. package/dist/cli/rule-lab.js +0 -148
  57. package/dist/cli/rule-lab.test.d.ts +0 -1
  58. package/dist/cli/rule-lab.test.js +0 -31
  59. package/dist/cli/scope-manifest-config.d.ts +0 -9
  60. package/dist/cli/scope-manifest-config.js +0 -37
  61. package/dist/cli/sync-manifest.d.ts +0 -27
  62. package/dist/cli/sync-manifest.js +0 -200
  63. package/dist/cli/sync-manifest.test.d.ts +0 -1
  64. package/dist/cli/sync-manifest.test.js +0 -88
  65. package/dist/core/ingestion/unity-runtime-binding-rules.d.ts +0 -26
  66. package/dist/core/ingestion/unity-runtime-binding-rules.js +0 -408
  67. package/dist/rule-lab/analyze.d.ts +0 -13
  68. package/dist/rule-lab/analyze.js +0 -125
  69. package/dist/rule-lab/analyze.test.d.ts +0 -1
  70. package/dist/rule-lab/analyze.test.js +0 -246
  71. package/dist/rule-lab/compile.d.ts +0 -5
  72. package/dist/rule-lab/compile.js +0 -51
  73. package/dist/rule-lab/compiled-bundles.d.ts +0 -30
  74. package/dist/rule-lab/compiled-bundles.js +0 -36
  75. package/dist/rule-lab/curate.d.ts +0 -33
  76. package/dist/rule-lab/curate.js +0 -155
  77. package/dist/rule-lab/curate.test.d.ts +0 -1
  78. package/dist/rule-lab/curate.test.js +0 -137
  79. package/dist/rule-lab/curation-input-builder.d.ts +0 -45
  80. package/dist/rule-lab/curation-input-builder.js +0 -133
  81. package/dist/rule-lab/discover.d.ts +0 -13
  82. package/dist/rule-lab/discover.js +0 -74
  83. package/dist/rule-lab/discover.test.d.ts +0 -1
  84. package/dist/rule-lab/discover.test.js +0 -42
  85. package/dist/rule-lab/paths.d.ts +0 -21
  86. package/dist/rule-lab/paths.js +0 -37
  87. package/dist/rule-lab/paths.test.d.ts +0 -1
  88. package/dist/rule-lab/paths.test.js +0 -46
  89. package/dist/rule-lab/promote.d.ts +0 -26
  90. package/dist/rule-lab/promote.js +0 -387
  91. package/dist/rule-lab/promote.test.d.ts +0 -1
  92. package/dist/rule-lab/promote.test.js +0 -314
  93. package/dist/rule-lab/regress.d.ts +0 -60
  94. package/dist/rule-lab/regress.js +0 -122
  95. package/dist/rule-lab/regress.test.d.ts +0 -1
  96. package/dist/rule-lab/regress.test.js +0 -68
  97. package/dist/rule-lab/review-pack.d.ts +0 -34
  98. package/dist/rule-lab/review-pack.js +0 -165
  99. package/dist/rule-lab/review-pack.test.d.ts +0 -1
  100. package/dist/rule-lab/review-pack.test.js +0 -116
  101. package/dist/rule-lab/types.d.ts +0 -135
  102. package/dist/rule-lab/types.js +0 -1
  103. package/skills/_shared/unity-rule-authoring-contract.md +0 -64
  104. package/skills/gitnexus-unity-rule-gen.md +0 -107
@@ -1,5 +1,4 @@
1
1
  import type { CSharpPreprocDiagnostics } from '../types/pipeline.js';
2
- import type { UnityRuntimeBindingResult } from '../core/ingestion/unity-runtime-binding-rules.js';
3
2
  export interface FallbackInsertStats {
4
3
  attempted: number;
5
4
  succeeded: number;
@@ -7,6 +6,5 @@ export interface FallbackInsertStats {
7
6
  }
8
7
  export declare function formatCSharpPreprocDiagnosticsSummary(diagnostics: CSharpPreprocDiagnostics | undefined, previewLimit?: number): string[];
9
8
  export declare function formatUnityDiagnosticsSummary(diagnostics: string[] | undefined, previewLimit?: number): string[];
10
- export declare function formatUnityRuleBindingSummary(result: UnityRuntimeBindingResult | undefined, previewLimit?: number): string[];
11
9
  export declare function formatFallbackSummary(warnings: string[] | undefined, stats: FallbackInsertStats | undefined, previewLimit?: number): string[];
12
10
  export declare function resolveFallbackStats(warnings: string[] | undefined, stats: FallbackInsertStats | undefined): FallbackInsertStats;
@@ -32,30 +32,6 @@ export function formatUnityDiagnosticsSummary(diagnostics, previewLimit = 3) {
32
32
  }
33
33
  return lines;
34
34
  }
35
- export function formatUnityRuleBindingSummary(result, previewLimit = 3) {
36
- if (!result)
37
- return [];
38
- const diagnostics = result.diagnostics;
39
- const lines = ['Unity Rule Binding Diagnostics:'];
40
- for (const message of diagnostics.summary) {
41
- if (!message.startsWith('rule_binding.anomaly:')) {
42
- lines.push(`- ${message}`);
43
- }
44
- }
45
- const anomalies = diagnostics.anomalies;
46
- if (anomalies.length === 0) {
47
- return lines;
48
- }
49
- lines.push(`- rule_binding.anomalies: count=${anomalies.length}`);
50
- const limit = previewLimit > 0 ? previewLimit : anomalies.length;
51
- for (const message of anomalies.slice(0, limit)) {
52
- lines.push(`- rule_binding.anomaly: ${message}`);
53
- }
54
- if (anomalies.length > limit) {
55
- lines.push(`- rule_binding.anomaly: ... ${anomalies.length - limit} more`);
56
- }
57
- return lines;
58
- }
59
35
  export function formatFallbackSummary(warnings, stats, previewLimit = 5) {
60
36
  if (!warnings || warnings.length === 0) {
61
37
  return [];
@@ -1,6 +1,6 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { formatFallbackSummary, formatUnityDiagnosticsSummary, formatUnityRuleBindingSummary, resolveFallbackStats, } from './analyze-summary.js';
3
+ import { formatFallbackSummary, formatUnityDiagnosticsSummary, resolveFallbackStats, } from './analyze-summary.js';
4
4
  test('formatUnityDiagnosticsSummary returns empty when diagnostics are missing', () => {
5
5
  const lines = formatUnityDiagnosticsSummary([]);
6
6
  assert.deepEqual(lines, []);
@@ -29,70 +29,6 @@ test('formatUnityDiagnosticsSummary truncates output after max preview items', (
29
29
  '... 1 more',
30
30
  ]);
31
31
  });
32
- test('formatUnityRuleBindingSummary renders diagnostics and agent report status', () => {
33
- const lines = formatUnityRuleBindingSummary({
34
- edgesInjected: 3,
35
- ruleResults: [{ ruleId: 'unity.global-init', edgesInjected: 3 }],
36
- diagnostics: {
37
- rulesEvaluated: 1,
38
- bindingsEvaluated: 1,
39
- bindingsByKind: { method_triggers_scene_load: 1 },
40
- methodLookupCalls: 5,
41
- methodLookupCacheHits: 4,
42
- sceneRuntimeTraversalCalls: 3,
43
- sceneRuntimeTraversalCacheHits: 2,
44
- sceneRuntimeResourcesVisited: 6,
45
- anomalies: [],
46
- shouldAgentReport: false,
47
- agentReportReason: 'no anomalies detected',
48
- summary: [
49
- 'rule_binding.summary: rules=1, bindings=1, edges=3',
50
- 'rule_binding.lookup: method_calls=5, cache_hits=4',
51
- 'rule_binding.agent_report: should_report=false reason="no anomalies detected"',
52
- ],
53
- },
54
- });
55
- assert.deepEqual(lines, [
56
- 'Unity Rule Binding Diagnostics:',
57
- '- rule_binding.summary: rules=1, bindings=1, edges=3',
58
- '- rule_binding.lookup: method_calls=5, cache_hits=4',
59
- '- rule_binding.agent_report: should_report=false reason="no anomalies detected"',
60
- ]);
61
- });
62
- test('formatUnityRuleBindingSummary renders anomaly preview', () => {
63
- const lines = formatUnityRuleBindingSummary({
64
- edgesInjected: 0,
65
- ruleResults: [],
66
- diagnostics: {
67
- rulesEvaluated: 1,
68
- bindingsEvaluated: 1,
69
- bindingsByKind: { method_triggers_scene_load: 1 },
70
- methodLookupCalls: 0,
71
- methodLookupCacheHits: 0,
72
- sceneRuntimeTraversalCalls: 0,
73
- sceneRuntimeTraversalCacheHits: 0,
74
- sceneRuntimeResourcesVisited: 0,
75
- anomalies: [
76
- 'rule=unity.global-init: scene "Global" not found in File(.unity) index',
77
- 'rule=unity.global-init: method_triggers_scene_load missing host_class_pattern, loader_methods, or scene_name',
78
- ],
79
- shouldAgentReport: true,
80
- agentReportReason: 'rule-binding anomalies detected',
81
- summary: [
82
- 'rule_binding.summary: rules=1, bindings=1, edges=0',
83
- 'rule_binding.agent_report: should_report=true reason="rule-binding anomalies detected"',
84
- ],
85
- },
86
- }, 1);
87
- assert.deepEqual(lines, [
88
- 'Unity Rule Binding Diagnostics:',
89
- '- rule_binding.summary: rules=1, bindings=1, edges=0',
90
- '- rule_binding.agent_report: should_report=true reason="rule-binding anomalies detected"',
91
- '- rule_binding.anomalies: count=2',
92
- '- rule_binding.anomaly: rule=unity.global-init: scene "Global" not found in File(.unity) index',
93
- '- rule_binding.anomaly: ... 1 more',
94
- ]);
95
- });
96
32
  test('formatFallbackSummary returns empty when no warnings exist', () => {
97
33
  const lines = formatFallbackSummary([], {
98
34
  attempted: 0,
@@ -3,16 +3,13 @@
3
3
  *
4
4
  * Indexes a repository and stores the knowledge graph in .gitnexus/
5
5
  */
6
- import { type SyncManifestPolicy } from './sync-manifest.js';
7
6
  export interface AnalyzeOptions {
8
7
  force?: boolean;
9
8
  embeddings?: boolean;
10
9
  extensions?: string;
10
+ scope?: string;
11
11
  repoAlias?: string;
12
12
  csharpDefineCsproj?: string;
13
- scopeManifest?: string;
14
- scopePrefix?: string[];
15
- syncManifestPolicy?: SyncManifestPolicy;
16
13
  reuseOptions?: boolean;
17
14
  skills?: boolean;
18
15
  verbose?: boolean;
@@ -21,6 +18,7 @@ export declare const analyzeCommand: (inputPath?: string, options?: AnalyzeOptio
21
18
  export declare function buildPipelineRunOptionsForAnalyze(resolvedOptions: {
22
19
  includeExtensions: string[];
23
20
  scopeRules: string[];
21
+ csharpDefineCsproj?: string;
24
22
  }, options?: AnalyzeOptions): {
25
23
  includeExtensions: string[];
26
24
  scopeRules: string[];
@@ -18,11 +18,10 @@ import { getCurrentCommit, isGitRepo, getGitRoot } from '../storage/git.js';
18
18
  import { generateAIContextFiles } from './ai-context.js';
19
19
  import { generateSkillFiles } from './skill-gen.js';
20
20
  import fs from 'fs/promises';
21
- import { resolveEffectiveAnalyzeOptions } from './analyze-options.js';
22
- import { formatCSharpPreprocDiagnosticsSummary, formatFallbackSummary, formatUnityDiagnosticsSummary, formatUnityRuleBindingSummary, resolveFallbackStats, } from './analyze-summary.js';
21
+ import { resolveEffectiveAnalyzeOptions, validateStoredOptions } from './analyze-options.js';
22
+ import { formatCSharpPreprocDiagnosticsSummary, formatFallbackSummary, formatUnityDiagnosticsSummary, resolveFallbackStats, } from './analyze-summary.js';
23
23
  import { resolveChildProcessExit } from './exit-code.js';
24
24
  import { toPipelineRuntimeSummary } from './analyze-runtime-summary.js';
25
- import { enforceSyncManifestConsistency, resolveScopeManifestForAnalyze } from './sync-manifest.js';
26
25
  const HEAP_MB = 8192;
27
26
  const HEAP_FLAG = `--max-old-space-size=${HEAP_MB}`;
28
27
  /** Re-exec the process with an 8GB heap if we're currently below that. */
@@ -111,31 +110,22 @@ export const analyzeCommand = async (inputPath, options) => {
111
110
  let scopeRules = [];
112
111
  let repoAlias;
113
112
  let embeddingsEnabled = false;
113
+ let csharpDefineCsproj;
114
114
  try {
115
- const scopeManifest = await resolveScopeManifestForAnalyze(repoPath, {
116
- scopeManifest: options?.scopeManifest,
117
- scopePrefix: options?.scopePrefix,
118
- });
119
- await enforceSyncManifestConsistency({
120
- manifestPath: scopeManifest,
121
- extensions: options?.extensions,
122
- repoAlias: options?.repoAlias,
123
- embeddings: options?.embeddings,
124
- policy: options?.syncManifestPolicy,
125
- stdinIsTTY: Boolean(process.stdin.isTTY),
126
- });
115
+ const validatedStored = await validateStoredOptions(options?.reuseOptions !== false ? existingMeta?.analyzeOptions : undefined, repoPath);
127
116
  const effectiveOptions = await resolveEffectiveAnalyzeOptions({
128
117
  extensions: options?.extensions,
129
- scopeManifest,
130
- scopePrefix: options?.scopePrefix,
118
+ scope: options?.scope,
131
119
  repoAlias: options?.repoAlias,
132
120
  embeddings: options?.embeddings,
133
121
  reuseOptions: options?.reuseOptions,
134
- }, existingMeta?.analyzeOptions);
122
+ csharpDefineCsproj: options?.csharpDefineCsproj,
123
+ }, validatedStored);
135
124
  includeExtensions = effectiveOptions.includeExtensions;
136
125
  scopeRules = effectiveOptions.scopeRules;
137
126
  repoAlias = effectiveOptions.repoAlias;
138
127
  embeddingsEnabled = effectiveOptions.embeddings;
128
+ csharpDefineCsproj = effectiveOptions.csharpDefineCsproj;
139
129
  }
140
130
  catch (error) {
141
131
  console.log(` ${error?.message || String(error)}\n`);
@@ -146,13 +136,10 @@ export const analyzeCommand = async (inputPath, options) => {
146
136
  console.log(' Existing metadata found, but LadybugDB index file is missing — rebuilding index...\n');
147
137
  }
148
138
  if (existingMeta && hasLbugIndex && !options?.force && existingMeta.lastCommit === currentCommit && !options?.skills) {
149
- const hasScopePrefixInput = Array.isArray(options?.scopePrefix)
150
- ? options.scopePrefix.length > 0
151
- : Boolean(options?.scopePrefix);
152
139
  const hasCliOverrides = options?.extensions !== undefined ||
153
- Boolean(options?.scopeManifest) ||
154
- hasScopePrefixInput ||
140
+ options?.scope !== undefined ||
155
141
  options?.repoAlias !== undefined ||
142
+ options?.csharpDefineCsproj !== undefined ||
156
143
  options?.embeddings !== undefined ||
157
144
  options?.reuseOptions === false;
158
145
  if (!hasCliOverrides) {
@@ -253,7 +240,7 @@ export const analyzeCommand = async (inputPath, options) => {
253
240
  // ── Phase 1: Full Pipeline (0–60%) ─────────────────────────────────
254
241
  let pipelineResult;
255
242
  try {
256
- const pipelineRunOptions = buildPipelineRunOptionsForAnalyze({ includeExtensions, scopeRules }, options);
243
+ const pipelineRunOptions = buildPipelineRunOptionsForAnalyze({ includeExtensions, scopeRules, csharpDefineCsproj });
257
244
  pipelineResult = await runPipelineFromRepo(repoPath, (progress) => {
258
245
  const phaseLabel = PHASE_LABELS[progress.phase] || progress.phase;
259
246
  const scaled = Math.round(progress.percent * 0.6);
@@ -363,6 +350,7 @@ export const analyzeCommand = async (inputPath, options) => {
363
350
  scopeRules,
364
351
  repoAlias,
365
352
  embeddings: embeddingsEnabled,
353
+ ...(csharpDefineCsproj ? { csharpDefineCsproj } : {}),
366
354
  },
367
355
  stats: {
368
356
  files: pipelineRuntime.totalFileCount,
@@ -444,10 +432,6 @@ export const analyzeCommand = async (inputPath, options) => {
444
432
  for (const line of unitySummaryLines) {
445
433
  console.log(` ${line}`);
446
434
  }
447
- const unityRuleBindingSummaryLines = formatUnityRuleBindingSummary(pipelineRuntime.unityRuleBindingResult);
448
- for (const line of unityRuleBindingSummaryLines) {
449
- console.log(` ${line}`);
450
- }
451
435
  const csharpPreprocSummaryLines = formatCSharpPreprocDiagnosticsSummary(pipelineRuntime.csharpPreprocDiagnostics);
452
436
  for (const line of csharpPreprocSummaryLines) {
453
437
  console.log(` ${line}`);
@@ -484,8 +468,8 @@ export function buildPipelineRunOptionsForAnalyze(resolvedOptions, options) {
484
468
  return {
485
469
  includeExtensions: resolvedOptions.includeExtensions,
486
470
  scopeRules: resolvedOptions.scopeRules,
487
- ...(options?.csharpDefineCsproj
488
- ? { csharpDefineCsproj: options.csharpDefineCsproj }
471
+ ...(resolvedOptions.csharpDefineCsproj
472
+ ? { csharpDefineCsproj: resolvedOptions.csharpDefineCsproj }
489
473
  : {}),
490
474
  };
491
475
  }
@@ -1,25 +1,19 @@
1
1
  import test from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import path from 'node:path';
4
3
  import { buildPipelineRunOptionsForAnalyze } from './analyze.js';
5
- import { resolveScopeManifestForAnalyze } from './sync-manifest.js';
6
- test('analyze auto-loads .gitnexus/sync-manifest.txt when CLI scope options are omitted', async () => {
7
- const repoPath = path.join('/tmp', 'demo-repo');
8
- const expectedManifest = path.join(repoPath, '.gitnexus', 'sync-manifest.txt');
9
- const resolved = await resolveScopeManifestForAnalyze(repoPath, {}, async (candidate) => candidate === expectedManifest);
10
- assert.equal(resolved, expectedManifest);
11
- });
12
- test('explicit --scope-manifest still wins over auto-detected default file', async () => {
13
- const repoPath = path.join('/tmp', 'demo-repo');
14
- const explicitManifest = path.join(repoPath, 'custom-manifest.txt');
15
- const resolved = await resolveScopeManifestForAnalyze(repoPath, { scopeManifest: explicitManifest }, async () => true);
16
- assert.equal(resolved, explicitManifest);
17
- });
18
4
  test('buildPipelineRunOptionsForAnalyze passes csharp define csproj option through to pipeline', () => {
19
- const out = buildPipelineRunOptionsForAnalyze({ includeExtensions: ['.cs'], scopeRules: ['Assets/**'] }, { csharpDefineCsproj: '/tmp/Assembly-CSharp.csproj' });
5
+ const out = buildPipelineRunOptionsForAnalyze({ includeExtensions: ['.cs'], scopeRules: ['Assets/**'], csharpDefineCsproj: '/tmp/Assembly-CSharp.csproj' });
20
6
  assert.deepEqual(out, {
21
7
  includeExtensions: ['.cs'],
22
8
  scopeRules: ['Assets/**'],
23
9
  csharpDefineCsproj: '/tmp/Assembly-CSharp.csproj',
24
10
  });
25
11
  });
12
+ test('buildPipelineRunOptionsForAnalyze omits csharpDefineCsproj when not provided', () => {
13
+ const out = buildPipelineRunOptionsForAnalyze({ includeExtensions: ['.cs'], scopeRules: ['Assets/**'] });
14
+ assert.deepEqual(out, {
15
+ includeExtensions: ['.cs'],
16
+ scopeRules: ['Assets/**'],
17
+ });
18
+ assert.equal(Object.keys(out).includes('csharpDefineCsproj'), false);
19
+ });
@@ -17,8 +17,6 @@ export declare function benchmarkAgentContextCommand(dataset: string, options: {
17
17
  targetPath?: string;
18
18
  reportDir?: string;
19
19
  extensions?: string;
20
- scopeManifest?: string;
21
- scopePrefix?: string[];
22
20
  skipAnalyze?: boolean;
23
21
  }, deps?: {
24
22
  loadDataset?: (root: string) => Promise<AgentContextDataset>;
@@ -29,8 +29,6 @@ export async function benchmarkAgentContextCommand(dataset, options, deps) {
29
29
  const analyzeOptions = {
30
30
  extensions: options.extensions,
31
31
  repoAlias: options.repoAlias,
32
- scopeManifest: options.scopeManifest,
33
- scopePrefix: options.scopePrefix,
34
32
  };
35
33
  try {
36
34
  await analyze(analyzePath, analyzeOptions);
@@ -8,8 +8,6 @@ export declare function benchmarkAgentSafeQueryContextCommand(dataset: string, o
8
8
  reportDir?: string;
9
9
  subagentRunsDir?: string;
10
10
  extensions?: string;
11
- scopeManifest?: string;
12
- scopePrefix?: string[];
13
11
  skipAnalyze?: boolean;
14
12
  }, deps?: {
15
13
  loadSuite?: (root: string) => Promise<AgentSafeBenchmarkSuite>;
@@ -16,8 +16,6 @@ export async function benchmarkAgentSafeQueryContextCommand(dataset, options, de
16
16
  await analyze(path.resolve(options.targetPath), {
17
17
  extensions: options.extensions,
18
18
  repoAlias: options.repoAlias,
19
- scopeManifest: options.scopeManifest,
20
- scopePrefix: options.scopePrefix,
21
19
  });
22
20
  }
23
21
  const suite = await loadSuite(path.resolve(dataset));
@@ -9,7 +9,5 @@ export declare function benchmarkUnityCommand(dataset: string, options: {
9
9
  targetPath?: string;
10
10
  reportDir?: string;
11
11
  extensions?: string;
12
- scopeManifest?: string;
13
- scopePrefix?: string[];
14
12
  skipAnalyze?: boolean;
15
13
  }): Promise<void>;
@@ -19,8 +19,6 @@ export async function benchmarkUnityCommand(dataset, options) {
19
19
  profile: profileConfig,
20
20
  reportDir: options.reportDir,
21
21
  extensions: options.extensions,
22
- scopeManifest: options.scopeManifest,
23
- scopePrefix: options.scopePrefix,
24
22
  skipAnalyze: options.skipAnalyze ?? false,
25
23
  });
26
24
  process.stderr.write(`${result.pass ? 'PASS' : 'FAIL'}\n`);
@@ -1,9 +1,8 @@
1
1
  /**
2
2
  * Clean Command
3
3
  *
4
- * Removes the GitNexus index from the current repository while preserving
5
- * configuration files (e.g. sync-manifest.txt). Also unregisters the repo
6
- * from the global registry.
4
+ * Removes the GitNexus index from the current repository.
5
+ * Also unregisters the repo from the global registry.
7
6
  */
8
7
  export declare const cleanCommand: (options?: {
9
8
  force?: boolean;
package/dist/cli/clean.js CHANGED
@@ -1,32 +1,11 @@
1
1
  /**
2
2
  * Clean Command
3
3
  *
4
- * Removes the GitNexus index from the current repository while preserving
5
- * configuration files (e.g. sync-manifest.txt). Also unregisters the repo
6
- * from the global registry.
4
+ * Removes the GitNexus index from the current repository.
5
+ * Also unregisters the repo from the global registry.
7
6
  */
8
7
  import fs from 'fs/promises';
9
- import path from 'path';
10
8
  import { findRepo, unregisterRepo, listRegisteredRepos } from '../storage/repo-manager.js';
11
- /** Files under .gitnexus/ that are configuration, not index data. */
12
- const PRESERVE_FILES = new Set(['sync-manifest.txt']);
13
- async function cleanStoragePath(storagePath) {
14
- let entries;
15
- try {
16
- entries = await fs.readdir(storagePath);
17
- }
18
- catch (err) {
19
- if (err.code === 'ENOENT')
20
- return;
21
- throw err;
22
- }
23
- for (const entry of entries) {
24
- if (PRESERVE_FILES.has(entry))
25
- continue;
26
- const fullPath = path.join(storagePath, entry);
27
- await fs.rm(fullPath, { recursive: true, force: true });
28
- }
29
- }
30
9
  export const cleanCommand = async (options) => {
31
10
  // --all flag: clean all indexed repos
32
11
  if (options?.all) {
@@ -46,7 +25,7 @@ export const cleanCommand = async (options) => {
46
25
  const entries = await listRegisteredRepos();
47
26
  for (const entry of entries) {
48
27
  try {
49
- await cleanStoragePath(entry.storagePath);
28
+ await fs.rm(entry.storagePath, { recursive: true, force: true });
50
29
  await unregisterRepo(entry.path);
51
30
  console.log(`Cleaned: ${entry.name} (${entry.storagePath})`);
52
31
  }
@@ -71,7 +50,7 @@ export const cleanCommand = async (options) => {
71
50
  return;
72
51
  }
73
52
  try {
74
- await cleanStoragePath(repo.storagePath);
53
+ await fs.rm(repo.storagePath, { recursive: true, force: true });
75
54
  await unregisterRepo(repo.repoPath);
76
55
  console.log(`Cleaned: ${repo.storagePath}`);
77
56
  }
package/dist/cli/index.js CHANGED
@@ -4,11 +4,9 @@
4
4
  import { Command } from 'commander';
5
5
  import { createRequire } from 'node:module';
6
6
  import { createLazyAction } from './lazy-action.js';
7
- import { attachRuleLabCommands } from './rule-lab.js';
8
7
  const _require = createRequire(import.meta.url);
9
8
  const pkg = _require('../../package.json');
10
9
  const program = new Command();
11
- const collectValues = (value, previous) => [...previous, value];
12
10
  program
13
11
  .name('gitnexus')
14
12
  .description('GitNexus local CLI and MCP server')
@@ -29,12 +27,10 @@ program
29
27
  .option('--embeddings', 'Enable embedding generation for semantic search (off by default)')
30
28
  .option('--extensions <list>', 'Comma-separated file extensions to include (e.g. .cs,.ts)')
31
29
  .option('--repo-alias <name>', 'Override indexed repository name with a stable alias')
30
+ .option('--scope <rules>', 'Comma-separated scope path-prefix rules (e.g. Assets/,Packages/com.veewo.*)')
32
31
  .option('--csharp-define-csproj <path>', 'Load C# DefineConstants from the specified .csproj and normalize conditional-compilation blocks before parsing')
33
- .option('--sync-manifest-policy <policy>', 'When CLI options differ from sync manifest directives: ask|update|keep|error (default: ask)')
34
32
  .option('--skills', 'Generate repo-specific skill files from detected communities')
35
33
  .option('-v, --verbose', 'Enable verbose ingestion warnings (default: false)')
36
- .option('--scope-manifest <path>', 'Manifest file with scope rules (supports comments and * wildcard; recommended: .gitnexus/sync-manifest.txt)')
37
- .option('--scope-prefix <pathPrefix>', 'Add a scope path prefix rule (repeatable)', collectValues, [])
38
34
  .addHelpText('after', '\nEnvironment variables:\n GITNEXUS_NO_GITIGNORE=1 Skip .gitignore parsing (still reads .gitnexusignore)')
39
35
  .action(createLazyAction(() => import('./analyze.js'), 'analyzeCommand'));
40
36
  program
@@ -61,7 +57,6 @@ program
61
57
  .option('-f, --force', 'Skip confirmation prompt')
62
58
  .option('--all', 'Clean all indexed repos')
63
59
  .action(createLazyAction(() => import('./clean.js'), 'cleanCommand'));
64
- attachRuleLabCommands(program, (handlerName) => createLazyAction(() => import('./rule-lab.js'), handlerName));
65
60
  program
66
61
  .command('wiki [path]')
67
62
  .description('Generate repository wiki from knowledge graph')
@@ -155,8 +150,6 @@ program
155
150
  .option('--target-path <path>', 'Path to analyze before evaluation (required unless --skip-analyze)')
156
151
  .option('--report-dir <path>', 'Output directory for benchmark-report.json and benchmark-summary.md', '.gitnexus/benchmark')
157
152
  .option('--extensions <list>', 'Analyze extension filter (comma-separated, optional)')
158
- .option('--scope-manifest <path>', 'Analyze scope manifest file')
159
- .option('--scope-prefix <pathPrefix>', 'Analyze scope path prefix (repeatable)', collectValues, [])
160
153
  .option('--skip-analyze', 'Skip analyze stage and evaluate current index only')
161
154
  .action(createLazyAction(() => import('./benchmark-unity.js'), 'benchmarkUnityCommand'));
162
155
  program
@@ -168,8 +161,6 @@ program
168
161
  .option('--target-path <path>', 'Path to analyze before evaluation (required unless --skip-analyze)')
169
162
  .option('--report-dir <path>', 'Output directory for benchmark-report.json and benchmark-summary.md', '.gitnexus/benchmark-agent-context')
170
163
  .option('--extensions <list>', 'Analyze extension filter (comma-separated, optional)')
171
- .option('--scope-manifest <path>', 'Analyze scope manifest file')
172
- .option('--scope-prefix <pathPrefix>', 'Analyze scope path prefix (repeatable)', collectValues, [])
173
164
  .option('--skip-analyze', 'Skip analyze stage and evaluate current index only')
174
165
  .action(createLazyAction(() => import('./benchmark-agent-context.js'), 'benchmarkAgentContextCommand'));
175
166
  program
@@ -181,8 +172,6 @@ program
181
172
  .option('--subagent-runs-dir <path>', 'Directory containing session-generated subagent run artifacts')
182
173
  .option('--report-dir <path>', 'Output directory for benchmark-report.json and benchmark-summary.md', '.gitnexus/benchmark-agent-safe-query-context')
183
174
  .option('--extensions <list>', 'Analyze extension filter (comma-separated, optional)')
184
- .option('--scope-manifest <path>', 'Analyze scope manifest file')
185
- .option('--scope-prefix <pathPrefix>', 'Analyze scope path prefix (repeatable)', collectValues, [])
186
175
  .option('--skip-analyze', 'Skip analyze stage and evaluate current index only')
187
176
  .action(createLazyAction(() => import('./benchmark-agent-safe-query-context.js'), 'benchmarkAgentSafeQueryContextCommand'));
188
177
  program
@@ -9,11 +9,9 @@ import { processCommunities } from './community-processor.js';
9
9
  import { processProcesses } from './process-processor.js';
10
10
  import { processUnityResources } from './unity-resource-processor.js';
11
11
  import { applyUnityLifecycleSyntheticCalls } from './unity-lifecycle-synthetic-calls.js';
12
- import { applyUnityRuntimeBindingRules } from './unity-runtime-binding-rules.js';
13
12
  import { resolveUnityConfig } from '../config/unity-config.js';
14
13
  import { loadCSharpDefineProfileFromCsproj } from '../tree-sitter/csharp-define-profile.js';
15
14
  import { normalizeCSharpPreprocessorBranches } from '../tree-sitter/csharp-preproc-normalizer.js';
16
- import { loadAnalyzeRules } from '../../mcp/local/runtime-claim-rule-registry.js';
17
15
  import { createResolutionContext } from './resolution-context.js';
18
16
  import { createASTCache } from './ast-cache.js';
19
17
  import { walkRepositoryPaths, readFileContents, walkUnityResourcePaths } from './filesystem-walker.js';
@@ -79,7 +77,7 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
79
77
  const scopeSelection = selectEntriesByScopeRules(scannedFiles, options?.scopeRules || []);
80
78
  const scopedFiles = scopeSelection.selected;
81
79
  if (scopeSelection.diagnostics.appliedRuleCount > 0 && scopedFiles.length === 0) {
82
- throw new Error('Scope filters matched zero files. Check --scope-manifest/--scope-prefix.');
80
+ throw new Error('Scope filters matched zero files. Check your scope rules and extensions.');
83
81
  }
84
82
  const includeExtensions = new Set((options?.includeExtensions || [])
85
83
  .map(ext => ext.trim().toLowerCase())
@@ -341,7 +339,6 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
341
339
  let communityResult;
342
340
  let processResult;
343
341
  let unityResult;
344
- let unityRuleBindingResult;
345
342
  if (!options?.skipGraphPhases) {
346
343
  // ── Phase 4.5: Method Resolution Order ──────────────────────────────
347
344
  onProgress({
@@ -422,45 +419,6 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
422
419
  if (isDev && isUnityProject) {
423
420
  console.log(`[UnityLifecycle] auto-detected hosts=${unityLifecycleSyntheticResult.hostCount} syntheticEdges=${unityLifecycleSyntheticResult.syntheticEdgeCount} rejectedHosts=${unityLifecycleSyntheticResult.rejectedHostCount}`);
424
421
  }
425
- // Phase 5.7: rule-driven binding injection (Phase 3)
426
- try {
427
- const analyzeRules = await loadAnalyzeRules(repoPath);
428
- const bindingResult = applyUnityRuntimeBindingRules(graph, analyzeRules, unityConfig.config);
429
- unityRuleBindingResult = bindingResult;
430
- if (isDev && bindingResult.edgesInjected > 0) {
431
- console.log(`[UnityRuleBinding] injected ${bindingResult.edgesInjected} edges from ${analyzeRules.length} rule(s)`);
432
- }
433
- }
434
- catch (err) {
435
- // rule catalog missing or invalid — skip silently
436
- console.warn(`[UnityRuleBinding] failed to load or apply analyze rules: ${err instanceof Error ? err.message : String(err)}`);
437
- const reason = err instanceof Error ? err.message : String(err);
438
- unityRuleBindingResult = {
439
- edgesInjected: 0,
440
- ruleResults: [],
441
- diagnostics: {
442
- rulesEvaluated: 0,
443
- bindingsEvaluated: 0,
444
- bindingsByKind: {},
445
- methodLookupCalls: 0,
446
- methodLookupCacheHits: 0,
447
- sceneRuntimeTraversalCalls: 0,
448
- sceneRuntimeTraversalCacheHits: 0,
449
- sceneRuntimeResourcesVisited: 0,
450
- anomalies: [`failed to load/apply analyze rules: ${reason}`],
451
- shouldAgentReport: true,
452
- agentReportReason: 'failed to load/apply analyze rules',
453
- summary: [
454
- 'rule_binding.summary: rules=0, bindings=0, edges=0',
455
- 'rule_binding.bindings_by_kind: none',
456
- 'rule_binding.lookup: method_calls=0, cache_hits=0',
457
- 'rule_binding.scene_closure: traversals=0, cache_hits=0, visited_resources=0',
458
- 'rule_binding.agent_report: should_report=true reason="failed to load/apply analyze rules"',
459
- `rule_binding.anomaly: failed to load/apply analyze rules: ${reason}`,
460
- ],
461
- },
462
- };
463
- }
464
422
  // ── Phase 6: Processes ─────────────────────────────────────────────
465
423
  onProgress({
466
424
  phase: 'processes',
@@ -545,7 +503,6 @@ export const runPipelineFromRepo = async (repoPath, onProgress, options) => {
545
503
  communityResult,
546
504
  processResult,
547
505
  unityResult,
548
- unityRuleBindingResult,
549
506
  scopeDiagnostics: scopeSelection.diagnostics,
550
507
  csharpPreprocDiagnostics,
551
508
  };
@@ -416,7 +416,7 @@ function buildResourceChains(resourceChains) {
416
416
  }
417
417
  : undefined,
418
418
  }))
419
- .filter((chain) => Boolean(chain.sourceResourcePath && chain.intermediateResourcePath && chain.targetSymbol));
419
+ .filter((chain) => Boolean(chain.sourceResourcePath && chain.targetSymbol));
420
420
  }
421
421
  function buildUpgradeHints(input) {
422
422
  const repoArg = input.repoName ? ` --repo "${input.repoName}"` : '';
@@ -46,11 +46,6 @@ interface NextHopPayload {
46
46
  why: string;
47
47
  next_command: string;
48
48
  }
49
- interface RetrievalRuleHint {
50
- id: string;
51
- next_action: string;
52
- host_base_type?: string[];
53
- }
54
49
  export declare function pickVerificationTarget(input: {
55
50
  seedMode: ResourceSeedMode;
56
51
  seedPath?: string;
@@ -71,23 +66,10 @@ export declare function buildNextHops(input: {
71
66
  mappedSeedTargets: string[];
72
67
  resourceBindings: ResolvedUnityBinding[];
73
68
  verificationHint?: VerificationHint;
74
- retrievalRule?: RetrievalRuleHint;
75
69
  repoName?: string;
76
70
  symbolName: string;
77
71
  queryForSymbol: string;
78
72
  }): NextHopPayload[];
79
- export declare function pickRetrievalRuleHintFromBundle(input: {
80
- queryText?: string;
81
- symbolName?: string;
82
- seedPath?: string;
83
- rules: Array<{
84
- id: string;
85
- trigger_tokens?: string[];
86
- host_base_type?: string[];
87
- resource_types?: string[];
88
- next_action: string;
89
- }>;
90
- }): RetrievalRuleHint | undefined;
91
73
  export declare function resolveSeedTargetsFromResourceFile(repoPath: string, seedPath: string): Promise<string[]>;
92
74
  export declare function filterBm25ResultsByScopePreset<T extends {
93
75
  filePath?: string;
@@ -178,11 +160,6 @@ export declare class LocalBackend {
178
160
  }>>;
179
161
  callTool(method: string, params: any): Promise<any>;
180
162
  private unityUiTrace;
181
- private ruleLabAnalyze;
182
- private ruleLabReviewPack;
183
- private ruleLabCurate;
184
- private ruleLabPromote;
185
- private ruleLabRegress;
186
163
  /**
187
164
  * Query tool — process-grouped search.
188
165
  *