@veewo/gitnexus 1.5.0-rc.4 → 1.5.1
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/agent-context/runner.js +3 -0
- package/dist/benchmark/agent-context/runner.test.js +22 -0
- package/dist/benchmark/agent-context/tool-runner.d.ts +7 -6
- package/dist/benchmark/agent-safe-query-context/io.d.ts +2 -0
- package/dist/benchmark/agent-safe-query-context/io.js +86 -0
- package/dist/benchmark/agent-safe-query-context/io.test.d.ts +1 -0
- package/dist/benchmark/agent-safe-query-context/io.test.js +13 -0
- package/dist/benchmark/agent-safe-query-context/report.d.ts +57 -0
- package/dist/benchmark/agent-safe-query-context/report.js +159 -0
- package/dist/benchmark/agent-safe-query-context/report.test.d.ts +1 -0
- package/dist/benchmark/agent-safe-query-context/report.test.js +362 -0
- package/dist/benchmark/agent-safe-query-context/runner.d.ts +44 -0
- package/dist/benchmark/agent-safe-query-context/runner.js +406 -0
- package/dist/benchmark/agent-safe-query-context/runner.test.d.ts +1 -0
- package/dist/benchmark/agent-safe-query-context/runner.test.js +290 -0
- package/dist/benchmark/agent-safe-query-context/semantic-tuple.d.ts +20 -0
- package/dist/benchmark/agent-safe-query-context/semantic-tuple.js +225 -0
- package/dist/benchmark/agent-safe-query-context/semantic-tuple.test.d.ts +1 -0
- package/dist/benchmark/agent-safe-query-context/semantic-tuple.test.js +122 -0
- package/dist/benchmark/agent-safe-query-context/subagent-live.d.ts +47 -0
- package/dist/benchmark/agent-safe-query-context/subagent-live.js +128 -0
- package/dist/benchmark/agent-safe-query-context/subagent-live.test.d.ts +1 -0
- package/dist/benchmark/agent-safe-query-context/subagent-live.test.js +155 -0
- package/dist/benchmark/agent-safe-query-context/telemetry-tool.d.ts +9 -0
- package/dist/benchmark/agent-safe-query-context/telemetry-tool.js +77 -0
- package/dist/benchmark/agent-safe-query-context/types.d.ts +61 -0
- package/dist/benchmark/agent-safe-query-context/types.js +8 -0
- package/dist/benchmark/analyze-runner.d.ts +1 -1
- package/dist/benchmark/analyze-runner.js +4 -3
- package/dist/benchmark/analyze-runner.test.js +7 -0
- package/dist/benchmark/runtime-poc/provenance-artifact.d.ts +47 -0
- package/dist/benchmark/runtime-poc/provenance-artifact.js +89 -0
- package/dist/benchmark/runtime-poc/runner.d.ts +31 -0
- package/dist/benchmark/runtime-poc/runner.js +163 -0
- package/dist/benchmark/u2-e2e/hydration-policy-repeatability-runner.d.ts +8 -0
- package/dist/benchmark/u2-e2e/hydration-policy-repeatability-runner.js +21 -0
- package/dist/benchmark/u2-e2e/phase2-runtime-claim-acceptance-runner.d.ts +0 -1
- package/dist/benchmark/u2-e2e/phase2-runtime-claim-acceptance-runner.js +53 -51
- package/dist/benchmark/u2-e2e/phase2-runtime-claim-acceptance-runner.test.js +0 -1
- package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.d.ts +1 -1
- package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.js +82 -18
- package/dist/benchmark/u2-e2e/phase5-rule-lab-acceptance-runner.test.js +1 -2
- package/dist/benchmark/u2-e2e/retrieval-runner.js +15 -7
- package/dist/benchmark/u2-e2e/retrieval-runner.test.js +46 -0
- package/dist/cli/ai-context.d.ts +0 -1
- package/dist/cli/ai-context.js +5 -6
- package/dist/cli/ai-context.test.js +8 -0
- package/dist/cli/analyze-options.js +58 -34
- package/dist/cli/analyze-options.test.js +57 -0
- package/dist/cli/analyze-runtime-summary.js +2 -0
- package/dist/cli/analyze-runtime-summary.test.js +12 -0
- package/dist/cli/analyze-summary.d.ts +4 -0
- package/dist/cli/analyze-summary.js +43 -0
- package/dist/cli/analyze-summary.test.js +65 -1
- package/dist/cli/analyze.d.ts +11 -0
- package/dist/cli/analyze.js +34 -5
- package/dist/cli/analyze.test.d.ts +1 -0
- package/dist/cli/analyze.test.js +25 -0
- package/dist/cli/benchmark-agent-context.js +1 -1
- package/dist/cli/benchmark-agent-safe-query-context.d.ts +20 -0
- package/dist/cli/benchmark-agent-safe-query-context.js +39 -0
- package/dist/cli/benchmark-agent-safe-query-context.test.d.ts +1 -0
- package/dist/cli/benchmark-agent-safe-query-context.test.js +271 -0
- package/dist/cli/benchmark-unity.js +1 -1
- package/dist/cli/benchmark-unity.test.js +5 -1
- package/dist/cli/benchmark.d.ts +29 -0
- package/dist/cli/benchmark.js +55 -0
- package/dist/cli/index.js +27 -2
- package/dist/cli/rule-lab.d.ts +3 -7
- package/dist/cli/rule-lab.js +13 -22
- package/dist/cli/rule-lab.test.js +23 -3
- package/dist/cli/scope-manifest-config.d.ts +9 -0
- package/dist/cli/scope-manifest-config.js +37 -0
- package/dist/cli/setup.js +40 -41
- package/dist/cli/setup.test.js +14 -14
- package/dist/cli/sync-manifest.d.ts +27 -0
- package/dist/cli/sync-manifest.js +200 -0
- package/dist/cli/sync-manifest.test.d.ts +1 -0
- package/dist/cli/sync-manifest.test.js +88 -0
- package/dist/cli/tool.d.ts +2 -0
- package/dist/cli/tool.js +2 -0
- package/dist/core/config/unity-config.d.ts +1 -1
- package/dist/core/config/unity-config.js +1 -1
- package/dist/core/ingestion/call-processor.d.ts +2 -1
- package/dist/core/ingestion/call-processor.js +28 -6
- package/dist/core/ingestion/heritage-processor.d.ts +2 -1
- package/dist/core/ingestion/heritage-processor.js +30 -7
- package/dist/core/ingestion/import-processor.d.ts +2 -1
- package/dist/core/ingestion/import-processor.js +28 -6
- package/dist/core/ingestion/parsing-processor.d.ts +5 -3
- package/dist/core/ingestion/parsing-processor.js +46 -13
- package/dist/core/ingestion/pipeline.js +100 -19
- package/dist/core/ingestion/unity-lifecycle-synthetic-calls.test.js +18 -20
- package/dist/core/ingestion/unity-parity-seed.d.ts +2 -1
- package/dist/core/ingestion/unity-parity-seed.js +8 -0
- package/dist/core/ingestion/unity-resource-processor.d.ts +11 -0
- package/dist/core/ingestion/unity-resource-processor.js +102 -0
- package/dist/core/ingestion/unity-resource-processor.test.js +449 -0
- package/dist/core/ingestion/unity-runtime-binding-rules.d.ts +16 -1
- package/dist/core/ingestion/unity-runtime-binding-rules.js +193 -42
- package/dist/core/ingestion/workers/parse-worker.d.ts +2 -0
- package/dist/core/ingestion/workers/parse-worker.js +50 -6
- package/dist/core/lbug/csv-generator.test.js +2 -2
- package/dist/core/tree-sitter/csharp-define-profile.d.ts +6 -0
- package/dist/core/tree-sitter/csharp-define-profile.js +43 -0
- package/dist/core/tree-sitter/csharp-preproc-normalizer.d.ts +14 -0
- package/dist/core/tree-sitter/csharp-preproc-normalizer.js +261 -0
- package/dist/core/tree-sitter/parser-loader.d.ts +10 -0
- package/dist/core/tree-sitter/parser-loader.js +19 -0
- package/dist/core/unity/doc-contract.test.d.ts +1 -0
- package/dist/core/unity/doc-contract.test.js +30 -0
- package/dist/core/unity/prefab-source-scan.d.ts +25 -0
- package/dist/core/unity/prefab-source-scan.js +152 -0
- package/dist/core/unity/prefab-source-scan.test.d.ts +1 -0
- package/dist/core/unity/prefab-source-scan.test.js +70 -0
- package/dist/core/unity/scan-context.d.ts +12 -0
- package/dist/core/unity/scan-context.js +50 -2
- package/dist/core/unity/scan-context.test.js +74 -0
- package/dist/mcp/local/agent-safe-response.d.ts +10 -0
- package/dist/mcp/local/agent-safe-response.js +639 -0
- package/dist/mcp/local/derived-process-reader.js +1 -1
- package/dist/mcp/local/local-backend.d.ts +18 -1
- package/dist/mcp/local/local-backend.js +319 -125
- package/dist/mcp/local/process-confidence.d.ts +1 -2
- package/dist/mcp/local/process-confidence.js +0 -3
- package/dist/mcp/local/process-confidence.test.js +4 -2
- package/dist/mcp/local/process-evidence.d.ts +1 -8
- package/dist/mcp/local/process-evidence.js +1 -23
- package/dist/mcp/local/process-evidence.test.js +2 -16
- package/dist/mcp/local/process-ref.d.ts +1 -1
- package/dist/mcp/local/runtime-chain-closure-evaluator.d.ts +33 -0
- package/dist/mcp/local/runtime-chain-closure-evaluator.js +273 -0
- package/dist/mcp/local/runtime-chain-graph-candidates.d.ts +23 -0
- package/dist/mcp/local/runtime-chain-graph-candidates.js +131 -0
- package/dist/mcp/local/runtime-chain-verify.d.ts +1 -1
- package/dist/mcp/local/runtime-chain-verify.js +149 -138
- package/dist/mcp/local/runtime-chain-verify.test.js +126 -68
- package/dist/mcp/local/runtime-claim-rule-registry.d.ts +4 -0
- package/dist/mcp/local/runtime-claim-rule-registry.js +4 -0
- package/dist/mcp/local/runtime-claim-rule-registry.test.js +37 -4
- package/dist/mcp/local/runtime-claim.d.ts +11 -0
- package/dist/mcp/local/runtime-claim.js +28 -0
- package/dist/mcp/local/unity-evidence-view.d.ts +1 -1
- package/dist/mcp/local/unity-evidence-view.js +1 -1
- package/dist/mcp/local/unity-evidence-view.test.js +22 -0
- package/dist/mcp/tools.js +51 -21
- package/dist/rule-lab/analyze.d.ts +2 -1
- package/dist/rule-lab/analyze.js +94 -59
- package/dist/rule-lab/analyze.test.js +238 -20
- package/dist/rule-lab/curate.d.ts +2 -1
- package/dist/rule-lab/curate.js +24 -3
- package/dist/rule-lab/curate.test.js +65 -0
- package/dist/rule-lab/curation-input-builder.d.ts +45 -0
- package/dist/rule-lab/curation-input-builder.js +133 -0
- package/dist/rule-lab/promote.js +80 -7
- package/dist/rule-lab/promote.test.js +150 -0
- package/dist/rule-lab/review-pack.d.ts +3 -0
- package/dist/rule-lab/review-pack.js +41 -1
- package/dist/rule-lab/review-pack.test.js +67 -0
- package/dist/rule-lab/types.d.ts +29 -0
- package/dist/types/pipeline.d.ts +16 -0
- package/package.json +14 -13
- package/scripts/check-sync-manifest-traceability.mjs +203 -0
- package/scripts/run-node-tests.mjs +61 -0
- package/scripts/tree-sitter-audit-classify.mjs +172 -0
- package/skills/_shared/unity-rule-authoring-contract.md +64 -0
- package/skills/_shared/unity-runtime-process-contract.md +16 -0
- package/skills/gitnexus-cli.md +44 -4
- package/skills/gitnexus-debugging.md +9 -0
- package/skills/gitnexus-exploring.md +66 -18
- package/skills/gitnexus-guide.md +42 -3
- package/skills/gitnexus-impact-analysis.md +8 -0
- package/skills/gitnexus-pr-review.md +8 -0
- package/skills/gitnexus-refactoring.md +8 -0
- package/skills/gitnexus-unity-rule-gen.md +66 -312
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import readline from 'node:readline/promises';
|
|
4
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
5
|
+
import { parseScopeManifestConfig } from './scope-manifest-config.js';
|
|
6
|
+
import { normalizeRepoAlias, parseExtensionList } from './analyze-options.js';
|
|
7
|
+
export function resolveDefaultSyncManifestPath(repoPath) {
|
|
8
|
+
return path.join(repoPath, '.gitnexus', 'sync-manifest.txt');
|
|
9
|
+
}
|
|
10
|
+
export function shouldAutoUseSyncManifest(options) {
|
|
11
|
+
if (options?.scopeManifest)
|
|
12
|
+
return false;
|
|
13
|
+
return parseScopePrefixCount(options?.scopePrefix) === 0;
|
|
14
|
+
}
|
|
15
|
+
export async function resolveScopeManifestForAnalyze(repoPath, options, pathExists = fileExists) {
|
|
16
|
+
if (options?.scopeManifest) {
|
|
17
|
+
return options.scopeManifest;
|
|
18
|
+
}
|
|
19
|
+
if (!shouldAutoUseSyncManifest(options)) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
const defaultManifestPath = resolveDefaultSyncManifestPath(repoPath);
|
|
23
|
+
if (await pathExists(defaultManifestPath)) {
|
|
24
|
+
return defaultManifestPath;
|
|
25
|
+
}
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
export async function enforceSyncManifestConsistency(input) {
|
|
29
|
+
if (!input.manifestPath) {
|
|
30
|
+
return { decision: 'none', diff: [] };
|
|
31
|
+
}
|
|
32
|
+
ensureConcreteManifestPath(input.manifestPath);
|
|
33
|
+
const raw = await fs.readFile(input.manifestPath, 'utf-8');
|
|
34
|
+
const parsed = parseScopeManifestConfig(raw);
|
|
35
|
+
const normalizedDirectives = normalizeManifestDirectives(parsed.directives);
|
|
36
|
+
const diff = computeDiff(normalizedDirectives, input);
|
|
37
|
+
const policy = normalizePolicy(input.policy);
|
|
38
|
+
if (diff.length === 0) {
|
|
39
|
+
if (policy === 'update') {
|
|
40
|
+
throw new Error('Sync manifest rewrite requires non-empty diff entries.');
|
|
41
|
+
}
|
|
42
|
+
return { decision: 'none', diff };
|
|
43
|
+
}
|
|
44
|
+
const decision = await resolveDecision(policy, input.manifestPath, diff, input.stdinIsTTY, input.prompt);
|
|
45
|
+
if (decision === 'update') {
|
|
46
|
+
const nextDirectives = mergeDirectivesForUpdate(normalizedDirectives, input);
|
|
47
|
+
const rewritten = renderSyncManifest(parsed.scopeRules, nextDirectives);
|
|
48
|
+
await fs.writeFile(input.manifestPath, rewritten, 'utf-8');
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
decision,
|
|
52
|
+
diff,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
function parseScopePrefixCount(scopePrefix) {
|
|
56
|
+
if (Array.isArray(scopePrefix))
|
|
57
|
+
return scopePrefix.length;
|
|
58
|
+
if (typeof scopePrefix === 'string')
|
|
59
|
+
return scopePrefix.trim() ? 1 : 0;
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
async function fileExists(candidatePath) {
|
|
63
|
+
try {
|
|
64
|
+
await fs.stat(candidatePath);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function normalizePolicy(raw) {
|
|
72
|
+
if (!raw)
|
|
73
|
+
return 'ask';
|
|
74
|
+
if (raw === 'ask' || raw === 'update' || raw === 'keep' || raw === 'error')
|
|
75
|
+
return raw;
|
|
76
|
+
throw new Error(`Invalid --sync-manifest-policy value: ${raw}. Use ask|update|keep|error.`);
|
|
77
|
+
}
|
|
78
|
+
function normalizeManifestDirectives(directives) {
|
|
79
|
+
return {
|
|
80
|
+
extensions: normalizeExtensions(directives.extensions),
|
|
81
|
+
repoAlias: normalizeAlias(directives.repoAlias),
|
|
82
|
+
embeddings: normalizeEmbeddings(directives.embeddings),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function computeDiff(manifest, input) {
|
|
86
|
+
const diff = [];
|
|
87
|
+
if (input.extensions !== undefined) {
|
|
88
|
+
const cliValue = normalizeExtensions(input.extensions);
|
|
89
|
+
if (cliValue !== manifest.extensions) {
|
|
90
|
+
diff.push({ directive: 'extensions', manifestValue: manifest.extensions, cliValue: cliValue || '' });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (input.repoAlias !== undefined) {
|
|
94
|
+
const cliValue = normalizeAlias(input.repoAlias);
|
|
95
|
+
if (cliValue !== manifest.repoAlias) {
|
|
96
|
+
diff.push({ directive: 'repoAlias', manifestValue: manifest.repoAlias, cliValue: cliValue || '' });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (input.embeddings !== undefined) {
|
|
100
|
+
const cliValue = input.embeddings ? 'true' : 'false';
|
|
101
|
+
if (cliValue !== manifest.embeddings) {
|
|
102
|
+
diff.push({ directive: 'embeddings', manifestValue: manifest.embeddings, cliValue });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return diff;
|
|
106
|
+
}
|
|
107
|
+
async function resolveDecision(policy, manifestPath, diff, stdinIsTTY, prompt) {
|
|
108
|
+
if (policy === 'update' || policy === 'keep')
|
|
109
|
+
return policy;
|
|
110
|
+
if (policy === 'error') {
|
|
111
|
+
throw new Error(`${formatMismatchHeader(manifestPath)}\n${formatDiff(diff)}`);
|
|
112
|
+
}
|
|
113
|
+
if (stdinIsTTY === undefined) {
|
|
114
|
+
throw new Error('TTY prompt branch requires concrete stdin.isTTY evidence.');
|
|
115
|
+
}
|
|
116
|
+
const interactive = stdinIsTTY;
|
|
117
|
+
if (!interactive) {
|
|
118
|
+
throw new Error(`${formatMismatchHeader(manifestPath)}\n${formatDiff(diff)}\n` +
|
|
119
|
+
'Non-interactive mode requires --sync-manifest-policy ask|update|keep|error.');
|
|
120
|
+
}
|
|
121
|
+
const promptFn = prompt || defaultPrompt;
|
|
122
|
+
return promptFn([
|
|
123
|
+
formatMismatchHeader(manifestPath),
|
|
124
|
+
formatDiff(diff),
|
|
125
|
+
'Choose: update (rewrite sync-manifest) or keep (continue without rewrite).',
|
|
126
|
+
].join('\n'));
|
|
127
|
+
}
|
|
128
|
+
function mergeDirectivesForUpdate(manifest, input) {
|
|
129
|
+
const merged = { ...manifest };
|
|
130
|
+
if (input.extensions !== undefined) {
|
|
131
|
+
merged.extensions = normalizeExtensions(input.extensions);
|
|
132
|
+
}
|
|
133
|
+
if (input.repoAlias !== undefined) {
|
|
134
|
+
merged.repoAlias = normalizeAlias(input.repoAlias);
|
|
135
|
+
}
|
|
136
|
+
if (input.embeddings !== undefined) {
|
|
137
|
+
merged.embeddings = input.embeddings ? 'true' : 'false';
|
|
138
|
+
}
|
|
139
|
+
return merged;
|
|
140
|
+
}
|
|
141
|
+
function renderSyncManifest(scopeRules, directives) {
|
|
142
|
+
const lines = [...scopeRules];
|
|
143
|
+
if (directives.extensions)
|
|
144
|
+
lines.push(`@extensions=${directives.extensions}`);
|
|
145
|
+
if (directives.repoAlias)
|
|
146
|
+
lines.push(`@repoAlias=${directives.repoAlias}`);
|
|
147
|
+
if (directives.embeddings)
|
|
148
|
+
lines.push(`@embeddings=${directives.embeddings}`);
|
|
149
|
+
return `${lines.join('\n')}\n`;
|
|
150
|
+
}
|
|
151
|
+
function normalizeExtensions(raw) {
|
|
152
|
+
if (raw === undefined)
|
|
153
|
+
return undefined;
|
|
154
|
+
const parsed = parseExtensionList(raw);
|
|
155
|
+
return parsed.length > 0 ? parsed.join(',') : undefined;
|
|
156
|
+
}
|
|
157
|
+
function normalizeAlias(raw) {
|
|
158
|
+
if (raw === undefined)
|
|
159
|
+
return undefined;
|
|
160
|
+
return normalizeRepoAlias(raw);
|
|
161
|
+
}
|
|
162
|
+
function normalizeEmbeddings(raw) {
|
|
163
|
+
if (raw === undefined)
|
|
164
|
+
return undefined;
|
|
165
|
+
const normalized = raw.trim().toLowerCase();
|
|
166
|
+
if (normalized === 'true')
|
|
167
|
+
return 'true';
|
|
168
|
+
if (normalized === 'false')
|
|
169
|
+
return 'false';
|
|
170
|
+
throw new Error(`Invalid @embeddings directive value: ${raw}. Expected true or false.`);
|
|
171
|
+
}
|
|
172
|
+
function formatMismatchHeader(manifestPath) {
|
|
173
|
+
return `Explicit analyze options differ from sync manifest directives: ${manifestPath}`;
|
|
174
|
+
}
|
|
175
|
+
function formatDiff(diff) {
|
|
176
|
+
return diff
|
|
177
|
+
.map((entry) => `- @${entry.directive}: ${entry.manifestValue ?? '<unset>'} -> ${entry.cliValue}`)
|
|
178
|
+
.join('\n');
|
|
179
|
+
}
|
|
180
|
+
async function defaultPrompt(message) {
|
|
181
|
+
const rl = readline.createInterface({ input, output });
|
|
182
|
+
try {
|
|
183
|
+
const answer = await rl.question(`${message}\nUpdate sync-manifest now? [y/N] `);
|
|
184
|
+
return /^y(es)?$/i.test(answer.trim()) ? 'update' : 'keep';
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
rl.close();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function ensureConcreteManifestPath(manifestPath) {
|
|
191
|
+
const normalized = manifestPath.trim();
|
|
192
|
+
if (!normalized) {
|
|
193
|
+
throw new Error('Invalid placeholder manifest path: empty value.');
|
|
194
|
+
}
|
|
195
|
+
if (/placeholder/i.test(normalized) ||
|
|
196
|
+
/<\s*path\s*>/i.test(normalized) ||
|
|
197
|
+
/todo/i.test(normalized)) {
|
|
198
|
+
throw new Error(`Invalid placeholder manifest path: ${manifestPath}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import fs from 'node:fs/promises';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { enforceSyncManifestConsistency } from './sync-manifest.js';
|
|
7
|
+
async function writeManifest(filePath, content) {
|
|
8
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
9
|
+
await fs.writeFile(filePath, content, 'utf-8');
|
|
10
|
+
}
|
|
11
|
+
test('when explicit CLI values differ from manifest, TTY mode asks whether to update manifest', async () => {
|
|
12
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gitnexus-sync-manifest-'));
|
|
13
|
+
const manifestPath = path.join(tmpDir, '.gitnexus', 'sync-manifest.txt');
|
|
14
|
+
await writeManifest(manifestPath, ['Assets/', '@extensions=.cs,.meta', '@repoAlias=demo-repo', '@embeddings=false'].join('\n'));
|
|
15
|
+
let promptMessage = '';
|
|
16
|
+
const result = await enforceSyncManifestConsistency({
|
|
17
|
+
manifestPath,
|
|
18
|
+
extensions: '.ts',
|
|
19
|
+
policy: 'ask',
|
|
20
|
+
stdinIsTTY: true,
|
|
21
|
+
prompt: async (message) => {
|
|
22
|
+
promptMessage = message;
|
|
23
|
+
return 'keep';
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
assert.equal(result.decision, 'keep');
|
|
27
|
+
assert.match(promptMessage, /@extensions/i);
|
|
28
|
+
assert.match(promptMessage, /sync-manifest\.txt/i);
|
|
29
|
+
assert.match(promptMessage, /update/i);
|
|
30
|
+
assert.match(promptMessage, /keep/i);
|
|
31
|
+
});
|
|
32
|
+
test('non-TTY without explicit policy exits with actionable error', async () => {
|
|
33
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gitnexus-sync-manifest-'));
|
|
34
|
+
const manifestPath = path.join(tmpDir, '.gitnexus', 'sync-manifest.txt');
|
|
35
|
+
await writeManifest(manifestPath, ['Assets/', '@extensions=.cs,.meta', '@repoAlias=demo-repo', '@embeddings=false'].join('\n'));
|
|
36
|
+
await assert.rejects(enforceSyncManifestConsistency({
|
|
37
|
+
manifestPath,
|
|
38
|
+
extensions: '.ts',
|
|
39
|
+
stdinIsTTY: false,
|
|
40
|
+
}), /--sync-manifest-policy/i);
|
|
41
|
+
});
|
|
42
|
+
test('policy=update rewrites manifest with normalized directives', async () => {
|
|
43
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gitnexus-sync-manifest-'));
|
|
44
|
+
const manifestPath = path.join(tmpDir, '.gitnexus', 'sync-manifest.txt');
|
|
45
|
+
await writeManifest(manifestPath, ['Assets/', 'Packages/', '@extensions=.cs,.meta', '@repoAlias=demo-repo', '@embeddings=false'].join('\n'));
|
|
46
|
+
const result = await enforceSyncManifestConsistency({
|
|
47
|
+
manifestPath,
|
|
48
|
+
extensions: '.ts,.tsx',
|
|
49
|
+
embeddings: true,
|
|
50
|
+
policy: 'update',
|
|
51
|
+
});
|
|
52
|
+
const rewritten = await fs.readFile(manifestPath, 'utf-8');
|
|
53
|
+
assert.equal(result.decision, 'update');
|
|
54
|
+
assert.equal(rewritten, ['Assets', 'Packages', '@extensions=.ts,.tsx', '@repoAlias=demo-repo', '@embeddings=true', ''].join('\n'));
|
|
55
|
+
});
|
|
56
|
+
test('rejects placeholder manifest path values', async () => {
|
|
57
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gitnexus-sync-manifest-placeholder-'));
|
|
58
|
+
const manifestPath = path.join(tmpDir, '.gitnexus', 'sync-manifest-placeholder.txt');
|
|
59
|
+
await writeManifest(manifestPath, ['Assets/', '@extensions=.cs,.meta', '@repoAlias=demo-repo', '@embeddings=false'].join('\n'));
|
|
60
|
+
await assert.rejects(enforceSyncManifestConsistency({
|
|
61
|
+
manifestPath,
|
|
62
|
+
extensions: '.ts',
|
|
63
|
+
policy: 'keep',
|
|
64
|
+
}), /placeholder manifest path/i);
|
|
65
|
+
});
|
|
66
|
+
test('TTY prompt branch requires concrete stdin.isTTY evidence', async () => {
|
|
67
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gitnexus-sync-manifest-tty-evidence-'));
|
|
68
|
+
const manifestPath = path.join(tmpDir, '.gitnexus', 'sync-manifest.txt');
|
|
69
|
+
await writeManifest(manifestPath, ['Assets/', '@extensions=.cs,.meta', '@repoAlias=demo-repo', '@embeddings=false'].join('\n'));
|
|
70
|
+
await assert.rejects(enforceSyncManifestConsistency({
|
|
71
|
+
manifestPath,
|
|
72
|
+
extensions: '.ts',
|
|
73
|
+
policy: 'ask',
|
|
74
|
+
prompt: async () => 'keep',
|
|
75
|
+
}), /stdin\.isTTY evidence/i);
|
|
76
|
+
});
|
|
77
|
+
test('manifest rewrite requires non-empty diff entries', async () => {
|
|
78
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'gitnexus-sync-manifest-noop-'));
|
|
79
|
+
const manifestPath = path.join(tmpDir, '.gitnexus', 'sync-manifest.txt');
|
|
80
|
+
await writeManifest(manifestPath, ['Assets/', '@extensions=.cs,.meta', '@repoAlias=demo-repo', '@embeddings=false'].join('\n'));
|
|
81
|
+
await assert.rejects(enforceSyncManifestConsistency({
|
|
82
|
+
manifestPath,
|
|
83
|
+
extensions: '.cs,.meta',
|
|
84
|
+
repoAlias: 'demo-repo',
|
|
85
|
+
embeddings: false,
|
|
86
|
+
policy: 'update',
|
|
87
|
+
}), /non-empty diff/i);
|
|
88
|
+
});
|
package/dist/cli/tool.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export declare function queryCommand(queryText: string, options?: {
|
|
|
21
21
|
goal?: string;
|
|
22
22
|
limit?: string;
|
|
23
23
|
content?: boolean;
|
|
24
|
+
responseProfile?: 'slim' | 'full';
|
|
24
25
|
scopePreset?: 'unity-gameplay' | 'unity-all';
|
|
25
26
|
unityResources?: UnityResourcesMode;
|
|
26
27
|
unityHydration?: UnityHydrationMode;
|
|
@@ -34,6 +35,7 @@ export declare function contextCommand(name: string, options?: {
|
|
|
34
35
|
file?: string;
|
|
35
36
|
uid?: string;
|
|
36
37
|
content?: boolean;
|
|
38
|
+
responseProfile?: 'slim' | 'full';
|
|
37
39
|
unityResources?: UnityResourcesMode;
|
|
38
40
|
unityHydration?: UnityHydrationMode;
|
|
39
41
|
unityEvidence?: UnityEvidenceMode;
|
package/dist/cli/tool.js
CHANGED
|
@@ -91,6 +91,7 @@ export async function queryCommand(queryText, options) {
|
|
|
91
91
|
goal: options?.goal,
|
|
92
92
|
limit: options?.limit ? parseInt(options.limit) : undefined,
|
|
93
93
|
include_content: options?.content ?? false,
|
|
94
|
+
response_profile: options?.responseProfile,
|
|
94
95
|
scope_preset: options?.scopePreset,
|
|
95
96
|
unity_resources: options?.unityResources,
|
|
96
97
|
unity_hydration_mode: options?.unityHydration,
|
|
@@ -114,6 +115,7 @@ export async function contextCommand(name, options) {
|
|
|
114
115
|
uid: options?.uid,
|
|
115
116
|
file_path: options?.file,
|
|
116
117
|
include_content: options?.content ?? false,
|
|
118
|
+
response_profile: options?.responseProfile,
|
|
117
119
|
unity_resources: options?.unityResources,
|
|
118
120
|
unity_hydration_mode: options?.unityHydration,
|
|
119
121
|
unity_evidence_mode: options?.unityEvidence,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export interface UnityConfig {
|
|
2
2
|
maxSyntheticEdgesPerClass: number;
|
|
3
3
|
maxSyntheticEdgesTotal: number;
|
|
4
|
+
enableContainerNodes: boolean;
|
|
4
5
|
lazyMaxPaths: number;
|
|
5
6
|
lazyBatchSize: number;
|
|
6
7
|
lazyMaxMs: number;
|
|
7
8
|
payloadMode: 'compact' | 'full';
|
|
8
|
-
persistLifecycleProcessMetadata: boolean;
|
|
9
9
|
parityWarmup: boolean;
|
|
10
10
|
parityWarmupMaxParallel: number;
|
|
11
11
|
paritySeedCacheIdleMs: number;
|
|
@@ -3,11 +3,11 @@ import { join } from 'node:path';
|
|
|
3
3
|
const DEFAULTS = {
|
|
4
4
|
maxSyntheticEdgesPerClass: 12,
|
|
5
5
|
maxSyntheticEdgesTotal: 256,
|
|
6
|
+
enableContainerNodes: false,
|
|
6
7
|
lazyMaxPaths: 120,
|
|
7
8
|
lazyBatchSize: 30,
|
|
8
9
|
lazyMaxMs: 5000,
|
|
9
10
|
payloadMode: 'compact',
|
|
10
|
-
persistLifecycleProcessMetadata: false,
|
|
11
11
|
parityWarmup: false,
|
|
12
12
|
parityWarmupMaxParallel: 4,
|
|
13
13
|
paritySeedCacheIdleMs: 60000,
|
|
@@ -5,7 +5,8 @@ import type { ExtractedCall, ExtractedHeritage, ExtractedRoute, FileConstructorB
|
|
|
5
5
|
export declare const processCalls: (graph: KnowledgeGraph, files: {
|
|
6
6
|
path: string;
|
|
7
7
|
content: string;
|
|
8
|
-
|
|
8
|
+
rawContent?: string;
|
|
9
|
+
}[], astCache: ASTCache, ctx: ResolutionContext, onProgress?: (current: number, total: number) => void, onRawFallbackParse?: (count: number) => void) => Promise<ExtractedHeritage[]>;
|
|
9
10
|
/**
|
|
10
11
|
* Fast path: resolve pre-extracted call sites from workers.
|
|
11
12
|
* No AST parsing — workers already extracted calledName + sourceId.
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import Parser from 'tree-sitter';
|
|
2
2
|
import { TIER_CONFIDENCE } from './resolution-context.js';
|
|
3
|
-
import { isLanguageAvailable, loadParser, loadLanguage } from '../tree-sitter/parser-loader.js';
|
|
3
|
+
import { isLanguageAvailable, loadParser, loadLanguage, parseContent } from '../tree-sitter/parser-loader.js';
|
|
4
4
|
import { LANGUAGE_QUERIES } from './tree-sitter-queries.js';
|
|
5
5
|
import { generateId } from '../../lib/utils.js';
|
|
6
6
|
import { getLanguageFromFilename, isVerboseIngestionEnabled, yieldToEventLoop, FUNCTION_NODE_TYPES, extractFunctionName, isBuiltInOrNoise, countCallArguments, inferCallForm, extractReceiverName, extractReceiverNode, findEnclosingClassId, CALL_EXPRESSION_TYPES, extractCallChain, } from './utils.js';
|
|
7
7
|
import { buildTypeEnv } from './type-env.js';
|
|
8
|
-
import { getTreeSitterBufferSize } from './constants.js';
|
|
9
8
|
import { callRouters } from './call-routing.js';
|
|
10
9
|
import { extractReturnTypeName } from './type-extractors/shared.js';
|
|
11
10
|
/**
|
|
@@ -86,7 +85,7 @@ const verifyConstructorBindings = (bindings, filePath, ctx, graph) => {
|
|
|
86
85
|
}
|
|
87
86
|
return verified;
|
|
88
87
|
};
|
|
89
|
-
export const processCalls = async (graph, files, astCache, ctx, onProgress) => {
|
|
88
|
+
export const processCalls = async (graph, files, astCache, ctx, onProgress, onRawFallbackParse) => {
|
|
90
89
|
const parser = await loadParser();
|
|
91
90
|
const collectedHeritage = [];
|
|
92
91
|
const logSkipped = isVerboseIngestionEnabled();
|
|
@@ -112,10 +111,33 @@ export const processCalls = async (graph, files, astCache, ctx, onProgress) => {
|
|
|
112
111
|
let tree = astCache.get(file.path);
|
|
113
112
|
if (!tree) {
|
|
114
113
|
try {
|
|
115
|
-
tree =
|
|
114
|
+
tree = parseContent(file.content);
|
|
116
115
|
}
|
|
117
|
-
catch
|
|
118
|
-
|
|
116
|
+
catch {
|
|
117
|
+
if (file.rawContent && file.rawContent !== file.content) {
|
|
118
|
+
try {
|
|
119
|
+
tree = parseContent(file.rawContent);
|
|
120
|
+
onRawFallbackParse?.(1);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (file.rawContent && file.rawContent !== file.content && tree.rootNode?.hasError) {
|
|
131
|
+
try {
|
|
132
|
+
const rawTree = parseContent(file.rawContent);
|
|
133
|
+
if (!rawTree.rootNode?.hasError) {
|
|
134
|
+
tree = rawTree;
|
|
135
|
+
onRawFallbackParse?.(1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Keep normalized parse result when raw fallback fails
|
|
140
|
+
}
|
|
119
141
|
}
|
|
120
142
|
astCache.set(file.path, tree);
|
|
121
143
|
}
|
|
@@ -20,7 +20,8 @@ import type { ResolutionContext } from './resolution-context.js';
|
|
|
20
20
|
export declare const processHeritage: (graph: KnowledgeGraph, files: {
|
|
21
21
|
path: string;
|
|
22
22
|
content: string;
|
|
23
|
-
|
|
23
|
+
rawContent?: string;
|
|
24
|
+
}[], astCache: ASTCache, ctx: ResolutionContext, onProgress?: (current: number, total: number) => void, onRawFallbackParse?: (count: number) => void) => Promise<void>;
|
|
24
25
|
/**
|
|
25
26
|
* Fast path: resolve pre-extracted heritage from workers.
|
|
26
27
|
* No AST parsing — workers already extracted className + parentName + kind.
|
|
@@ -14,12 +14,11 @@
|
|
|
14
14
|
* - All other languages: default to EXTENDS
|
|
15
15
|
*/
|
|
16
16
|
import Parser from 'tree-sitter';
|
|
17
|
-
import { isLanguageAvailable, loadParser, loadLanguage } from '../tree-sitter/parser-loader.js';
|
|
17
|
+
import { isLanguageAvailable, loadParser, loadLanguage, parseContent } from '../tree-sitter/parser-loader.js';
|
|
18
18
|
import { LANGUAGE_QUERIES } from './tree-sitter-queries.js';
|
|
19
19
|
import { generateId } from '../../lib/utils.js';
|
|
20
20
|
import { getLanguageFromFilename, isVerboseIngestionEnabled, yieldToEventLoop } from './utils.js';
|
|
21
21
|
import { SupportedLanguages } from '../../config/supported-languages.js';
|
|
22
|
-
import { getTreeSitterBufferSize } from './constants.js';
|
|
23
22
|
/** C#/Java convention: interfaces start with I followed by an uppercase letter */
|
|
24
23
|
const INTERFACE_NAME_RE = /^I[A-Z]/;
|
|
25
24
|
/**
|
|
@@ -65,7 +64,7 @@ const resolveHeritageId = (name, filePath, ctx, fallbackLabel, fallbackKey) => {
|
|
|
65
64
|
}
|
|
66
65
|
return generateId(fallbackLabel, fallbackKey ?? name);
|
|
67
66
|
};
|
|
68
|
-
export const processHeritage = async (graph, files, astCache, ctx, onProgress) => {
|
|
67
|
+
export const processHeritage = async (graph, files, astCache, ctx, onProgress, onRawFallbackParse) => {
|
|
69
68
|
const parser = await loadParser();
|
|
70
69
|
const logSkipped = isVerboseIngestionEnabled();
|
|
71
70
|
const skippedByLang = logSkipped ? new Map() : null;
|
|
@@ -94,11 +93,35 @@ export const processHeritage = async (graph, files, astCache, ctx, onProgress) =
|
|
|
94
93
|
if (!tree) {
|
|
95
94
|
// Use larger bufferSize for files > 32KB
|
|
96
95
|
try {
|
|
97
|
-
tree =
|
|
96
|
+
tree = parseContent(file.content);
|
|
98
97
|
}
|
|
99
|
-
catch
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
catch {
|
|
99
|
+
if (file.rawContent && file.rawContent !== file.content) {
|
|
100
|
+
try {
|
|
101
|
+
tree = parseContent(file.rawContent);
|
|
102
|
+
onRawFallbackParse?.(1);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Skip files that can't be parsed
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Skip files that can't be parsed
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (file.rawContent && file.rawContent !== file.content && tree.rootNode?.hasError) {
|
|
115
|
+
try {
|
|
116
|
+
const rawTree = parseContent(file.rawContent);
|
|
117
|
+
if (!rawTree.rootNode?.hasError) {
|
|
118
|
+
tree = rawTree;
|
|
119
|
+
onRawFallbackParse?.(1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Keep normalized parse result when raw fallback fails
|
|
124
|
+
}
|
|
102
125
|
}
|
|
103
126
|
// Cache re-parsed tree for potential future use
|
|
104
127
|
astCache.set(file.path, tree);
|
|
@@ -28,7 +28,8 @@ export declare function buildImportResolutionContext(allPaths: string[]): Import
|
|
|
28
28
|
export declare const processImports: (graph: KnowledgeGraph, files: {
|
|
29
29
|
path: string;
|
|
30
30
|
content: string;
|
|
31
|
-
|
|
31
|
+
rawContent?: string;
|
|
32
|
+
}[], astCache: ASTCache, ctx: ResolutionContext, onProgress?: (current: number, total: number) => void, repoRoot?: string, allPaths?: string[], onRawFallbackParse?: (count: number) => void) => Promise<void>;
|
|
32
33
|
export declare const processImportsFromExtracted: (graph: KnowledgeGraph, files: {
|
|
33
34
|
path: string;
|
|
34
35
|
}[], extractedImports: ExtractedImport[], ctx: ResolutionContext, onProgress?: (current: number, total: number) => void, repoRoot?: string, prebuiltCtx?: ImportResolutionContext) => Promise<void>;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import Parser from 'tree-sitter';
|
|
2
|
-
import { isLanguageAvailable, loadParser, loadLanguage } from '../tree-sitter/parser-loader.js';
|
|
2
|
+
import { isLanguageAvailable, loadParser, loadLanguage, parseContent } from '../tree-sitter/parser-loader.js';
|
|
3
3
|
import { LANGUAGE_QUERIES } from './tree-sitter-queries.js';
|
|
4
4
|
import { generateId } from '../../lib/utils.js';
|
|
5
5
|
import { getLanguageFromFilename, isVerboseIngestionEnabled, yieldToEventLoop } from './utils.js';
|
|
6
6
|
import { SupportedLanguages } from '../../config/supported-languages.js';
|
|
7
7
|
import { extractNamedBindings } from './named-binding-extraction.js';
|
|
8
|
-
import { getTreeSitterBufferSize } from './constants.js';
|
|
9
8
|
import { loadTsconfigPaths, loadGoModulePath, loadComposerConfig, loadCSharpProjectConfig, loadSwiftPackageConfig, } from './language-config.js';
|
|
10
9
|
import { buildSuffixIndex, resolveImportPath, appendKotlinWildcard, KOTLIN_EXTENSIONS, resolveJvmWildcard, resolveJvmMemberImport, resolveGoPackageDir, resolveGoPackage, resolveCSharpImport, resolveCSharpNamespaceDir, resolvePhpImport, resolveRustImport, resolveRubyImport, resolvePythonImport, } from './resolvers/index.js';
|
|
11
10
|
import { callRouters } from './call-routing.js';
|
|
@@ -173,7 +172,7 @@ function applyImportResult(result, filePath, importMap, packageMap, addImportEdg
|
|
|
173
172
|
// ============================================================================
|
|
174
173
|
// MAIN IMPORT PROCESSOR
|
|
175
174
|
// ============================================================================
|
|
176
|
-
export const processImports = async (graph, files, astCache, ctx, onProgress, repoRoot, allPaths) => {
|
|
175
|
+
export const processImports = async (graph, files, astCache, ctx, onProgress, repoRoot, allPaths, onRawFallbackParse) => {
|
|
177
176
|
const importMap = ctx.importMap;
|
|
178
177
|
const packageMap = ctx.packageMap;
|
|
179
178
|
const namedImportMap = ctx.namedImportMap;
|
|
@@ -249,10 +248,33 @@ export const processImports = async (graph, files, astCache, ctx, onProgress, re
|
|
|
249
248
|
let wasReparsed = false;
|
|
250
249
|
if (!tree) {
|
|
251
250
|
try {
|
|
252
|
-
tree =
|
|
251
|
+
tree = parseContent(file.content);
|
|
253
252
|
}
|
|
254
|
-
catch
|
|
255
|
-
|
|
253
|
+
catch {
|
|
254
|
+
if (file.rawContent && file.rawContent !== file.content) {
|
|
255
|
+
try {
|
|
256
|
+
tree = parseContent(file.rawContent);
|
|
257
|
+
onRawFallbackParse?.(1);
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
if (file.rawContent && file.rawContent !== file.content && tree.rootNode?.hasError) {
|
|
268
|
+
try {
|
|
269
|
+
const rawTree = parseContent(file.rawContent);
|
|
270
|
+
if (!rawTree.rootNode?.hasError) {
|
|
271
|
+
tree = rawTree;
|
|
272
|
+
onRawFallbackParse?.(1);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Keep normalized parse result when raw fallback fails
|
|
277
|
+
}
|
|
256
278
|
}
|
|
257
279
|
wasReparsed = true;
|
|
258
280
|
// Cache re-parsed tree so call/heritage phases get hits
|
|
@@ -11,8 +11,10 @@ export interface WorkerExtractedData {
|
|
|
11
11
|
routes: ExtractedRoute[];
|
|
12
12
|
constructorBindings: FileConstructorBindings[];
|
|
13
13
|
}
|
|
14
|
-
export
|
|
15
|
-
export declare const processParsing: (graph: KnowledgeGraph, files: {
|
|
14
|
+
export interface ParsingFileInput {
|
|
16
15
|
path: string;
|
|
17
16
|
content: string;
|
|
18
|
-
|
|
17
|
+
rawContent?: string;
|
|
18
|
+
}
|
|
19
|
+
export { isNodeExported } from './export-detection.js';
|
|
20
|
+
export declare const processParsing: (graph: KnowledgeGraph, files: ParsingFileInput[], symbolTable: SymbolTable, astCache: ASTCache, onFileProgress?: FileProgressCallback, workerPool?: WorkerPool, onRawFallbackParse?: (count: number) => void) => Promise<WorkerExtractedData | null>;
|