@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.
- package/dist/benchmark/analyze-runner.d.ts +0 -2
- package/dist/benchmark/analyze-runner.js +0 -6
- package/dist/benchmark/analyze-runner.test.js +1 -10
- package/dist/benchmark/runner.d.ts +0 -2
- package/dist/benchmark/runner.js +0 -2
- package/dist/benchmark/u2-e2e/neonspark-full-e2e.js +0 -11
- package/dist/benchmark/u2-performance-sampler.js +3 -16
- package/dist/cli/ai-context.js +1 -7
- package/dist/cli/analyze-options.d.ts +19 -6
- package/dist/cli/analyze-options.js +76 -71
- package/dist/cli/analyze-options.test.js +78 -73
- package/dist/cli/analyze-runtime-summary.js +0 -1
- package/dist/cli/analyze-runtime-summary.test.js +0 -2
- package/dist/cli/analyze-summary.d.ts +0 -2
- package/dist/cli/analyze-summary.js +0 -24
- package/dist/cli/analyze-summary.test.js +1 -65
- package/dist/cli/analyze.d.ts +2 -4
- package/dist/cli/analyze.js +14 -30
- package/dist/cli/analyze.test.js +9 -15
- package/dist/cli/benchmark-agent-context.d.ts +0 -2
- package/dist/cli/benchmark-agent-context.js +0 -2
- package/dist/cli/benchmark-agent-safe-query-context.d.ts +0 -2
- package/dist/cli/benchmark-agent-safe-query-context.js +0 -2
- package/dist/cli/benchmark-unity.d.ts +0 -2
- package/dist/cli/benchmark-unity.js +0 -2
- package/dist/cli/clean.d.ts +2 -3
- package/dist/cli/clean.js +4 -25
- package/dist/cli/index.js +1 -12
- package/dist/core/ingestion/pipeline.js +1 -44
- package/dist/mcp/local/agent-safe-response.js +1 -1
- package/dist/mcp/local/local-backend.d.ts +0 -23
- package/dist/mcp/local/local-backend.js +69 -248
- package/dist/mcp/local/runtime-chain-verify.test.js +0 -49
- package/dist/mcp/local/runtime-claim-rule-registry.d.ts +0 -11
- package/dist/mcp/local/runtime-claim-rule-registry.js +0 -159
- package/dist/mcp/local/runtime-claim-rule-registry.test.js +67 -214
- package/dist/mcp/tools.js +0 -70
- package/dist/storage/repo-manager.d.ts +1 -0
- package/dist/types/pipeline.d.ts +0 -3
- package/package.json +1 -1
- package/skills/gitnexus-cli.md +62 -38
- package/vendor/node_modules/node-addon-api/node_addon_api.Makefile +6 -0
- package/vendor/node_modules/node-addon-api/node_addon_api.target.mk +122 -0
- package/vendor/node_modules/node-addon-api/node_addon_api_except.target.mk +126 -0
- package/vendor/node_modules/node-addon-api/node_addon_api_except_all.target.mk +122 -0
- package/vendor/node_modules/node-addon-api/node_addon_api_maybe.target.mk +122 -0
- package/vendor/tree-sitter-dart/build/Release/.deps/node_modules/node-addon-api/node_addon_api_except.stamp.d +1 -0
- package/vendor/tree-sitter-dart/build/node_modules/node-addon-api/node_addon_api_except.stamp +0 -0
- package/vendor/tree-sitter-proto/build/Release/.deps/node_modules/node-addon-api/node_addon_api_except.stamp.d +1 -0
- package/vendor/tree-sitter-proto/build/node_modules/node-addon-api/node_addon_api_except.stamp +0 -0
- package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.d.ts +0 -60
- package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.js +0 -395
- package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.test.d.ts +0 -1
- package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.test.js +0 -41
- package/dist/cli/rule-lab.d.ts +0 -38
- package/dist/cli/rule-lab.js +0 -148
- package/dist/cli/rule-lab.test.d.ts +0 -1
- package/dist/cli/rule-lab.test.js +0 -31
- package/dist/cli/scope-manifest-config.d.ts +0 -9
- package/dist/cli/scope-manifest-config.js +0 -37
- package/dist/cli/sync-manifest.d.ts +0 -27
- package/dist/cli/sync-manifest.js +0 -200
- package/dist/cli/sync-manifest.test.d.ts +0 -1
- package/dist/cli/sync-manifest.test.js +0 -88
- package/dist/core/ingestion/unity-runtime-binding-rules.d.ts +0 -26
- package/dist/core/ingestion/unity-runtime-binding-rules.js +0 -408
- package/dist/rule-lab/analyze.d.ts +0 -13
- package/dist/rule-lab/analyze.js +0 -125
- package/dist/rule-lab/analyze.test.d.ts +0 -1
- package/dist/rule-lab/analyze.test.js +0 -246
- package/dist/rule-lab/compile.d.ts +0 -5
- package/dist/rule-lab/compile.js +0 -51
- package/dist/rule-lab/compiled-bundles.d.ts +0 -30
- package/dist/rule-lab/compiled-bundles.js +0 -36
- package/dist/rule-lab/curate.d.ts +0 -33
- package/dist/rule-lab/curate.js +0 -155
- package/dist/rule-lab/curate.test.d.ts +0 -1
- package/dist/rule-lab/curate.test.js +0 -137
- package/dist/rule-lab/curation-input-builder.d.ts +0 -45
- package/dist/rule-lab/curation-input-builder.js +0 -133
- package/dist/rule-lab/discover.d.ts +0 -13
- package/dist/rule-lab/discover.js +0 -74
- package/dist/rule-lab/discover.test.d.ts +0 -1
- package/dist/rule-lab/discover.test.js +0 -42
- package/dist/rule-lab/paths.d.ts +0 -21
- package/dist/rule-lab/paths.js +0 -37
- package/dist/rule-lab/paths.test.d.ts +0 -1
- package/dist/rule-lab/paths.test.js +0 -46
- package/dist/rule-lab/promote.d.ts +0 -26
- package/dist/rule-lab/promote.js +0 -387
- package/dist/rule-lab/promote.test.d.ts +0 -1
- package/dist/rule-lab/promote.test.js +0 -314
- package/dist/rule-lab/regress.d.ts +0 -60
- package/dist/rule-lab/regress.js +0 -122
- package/dist/rule-lab/regress.test.d.ts +0 -1
- package/dist/rule-lab/regress.test.js +0 -68
- package/dist/rule-lab/review-pack.d.ts +0 -34
- package/dist/rule-lab/review-pack.js +0 -165
- package/dist/rule-lab/review-pack.test.d.ts +0 -1
- package/dist/rule-lab/review-pack.test.js +0 -116
- package/dist/rule-lab/types.d.ts +0 -135
- package/dist/rule-lab/types.js +0 -1
- package/skills/_shared/unity-rule-authoring-contract.md +0 -64
- 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,
|
|
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,
|
package/dist/cli/analyze.d.ts
CHANGED
|
@@ -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[];
|
package/dist/cli/analyze.js
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
-
|
|
130
|
-
scopePrefix: options?.scopePrefix,
|
|
118
|
+
scope: options?.scope,
|
|
131
119
|
repoAlias: options?.repoAlias,
|
|
132
120
|
embeddings: options?.embeddings,
|
|
133
121
|
reuseOptions: options?.reuseOptions,
|
|
134
|
-
|
|
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
|
-
|
|
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 }
|
|
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
|
-
...(
|
|
488
|
-
? { csharpDefineCsproj:
|
|
471
|
+
...(resolvedOptions.csharpDefineCsproj
|
|
472
|
+
? { csharpDefineCsproj: resolvedOptions.csharpDefineCsproj }
|
|
489
473
|
: {}),
|
|
490
474
|
};
|
|
491
475
|
}
|
package/dist/cli/analyze.test.js
CHANGED
|
@@ -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/**']
|
|
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));
|
|
@@ -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`);
|
package/dist/cli/clean.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Clean Command
|
|
3
3
|
*
|
|
4
|
-
* Removes the GitNexus index from the current repository
|
|
5
|
-
*
|
|
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
|
|
5
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
*
|