@neurcode-ai/cli 0.17.0 → 0.19.0
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/README.md +3 -2
- package/dist/commands/brain.d.ts.map +1 -1
- package/dist/commands/brain.js +451 -0
- package/dist/commands/brain.js.map +1 -1
- package/dist/commands/policy.d.ts.map +1 -1
- package/dist/commands/policy.js +296 -0
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/runtime-adapter.d.ts +2 -1
- package/dist/commands/runtime-adapter.d.ts.map +1 -1
- package/dist/commands/runtime-adapter.js +51 -2
- package/dist/commands/runtime-adapter.js.map +1 -1
- package/dist/commands/session-hook.d.ts +17 -0
- package/dist/commands/session-hook.d.ts.map +1 -1
- package/dist/commands/session-hook.js +279 -14
- package/dist/commands/session-hook.js.map +1 -1
- package/dist/runtime-build.json +4 -4
- package/dist/utils/agent-adapter-setup.js +1 -1
- package/dist/utils/agent-adapter-setup.js.map +1 -1
- package/dist/utils/agent-guard.d.ts +1 -0
- package/dist/utils/agent-guard.d.ts.map +1 -1
- package/dist/utils/agent-guard.js +18 -6
- package/dist/utils/agent-guard.js.map +1 -1
- package/dist/utils/git-coverage.d.ts.map +1 -1
- package/dist/utils/git-coverage.js +1 -0
- package/dist/utils/git-coverage.js.map +1 -1
- package/dist/utils/local-repo-brain.d.ts +85 -0
- package/dist/utils/local-repo-brain.d.ts.map +1 -1
- package/dist/utils/local-repo-brain.js +259 -4
- package/dist/utils/local-repo-brain.js.map +1 -1
- package/dist/utils/proposed-change-analysis.d.ts +20 -0
- package/dist/utils/proposed-change-analysis.d.ts.map +1 -0
- package/dist/utils/proposed-change-analysis.js +448 -0
- package/dist/utils/proposed-change-analysis.js.map +1 -0
- package/dist/utils/repo-intelligence-v2.d.ts +28 -0
- package/dist/utils/repo-intelligence-v2.d.ts.map +1 -0
- package/dist/utils/repo-intelligence-v2.js +174 -0
- package/dist/utils/repo-intelligence-v2.js.map +1 -0
- package/dist/utils/v0-governance.d.ts +1 -1
- package/dist/utils/v0-governance.d.ts.map +1 -1
- package/dist/utils/v0-governance.js +86 -15
- package/dist/utils/v0-governance.js.map +1 -1
- package/package.json +12 -11
- package/LICENSE +0 -201
|
@@ -38,6 +38,7 @@ function isAdmissionSupportArtifactPath(path) {
|
|
|
38
38
|
|| normalized.startsWith('.neurcode/evidence/')
|
|
39
39
|
|| normalized.startsWith('.neurcode/executions/')
|
|
40
40
|
|| normalized.startsWith('.neurcode/runtime-events/')
|
|
41
|
+
|| normalized.startsWith('.neurcode/cache/')
|
|
41
42
|
|| normalized.startsWith('.neurcode/brain/cache/')
|
|
42
43
|
|| normalized === '.neurcode/profile.json'
|
|
43
44
|
|| normalized === '.neurcode/active-session.json'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-coverage.js","sourceRoot":"","sources":["../../src/utils/git-coverage.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;AAsBH,
|
|
1
|
+
{"version":3,"file":"git-coverage.js","sourceRoot":"","sources":["../../src/utils/git-coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@ export interface LocalRepoBrainFileFact {
|
|
|
9
9
|
bytes: number;
|
|
10
10
|
lineCount: number;
|
|
11
11
|
fileHash: string;
|
|
12
|
+
mtimeMs: number;
|
|
13
|
+
indexedAt: string;
|
|
12
14
|
symbolCount: number;
|
|
13
15
|
importCount: number;
|
|
14
16
|
sensitiveKinds: LocalRepoBrainSensitiveKind[];
|
|
@@ -20,11 +22,21 @@ export interface LocalRepoBrainSymbolFact {
|
|
|
20
22
|
file: string;
|
|
21
23
|
line: number;
|
|
22
24
|
exported: boolean;
|
|
25
|
+
local: boolean;
|
|
26
|
+
normalizedSignature: string | null;
|
|
27
|
+
normalizedSignatureHash: string | null;
|
|
23
28
|
signatureHash: string;
|
|
24
29
|
tokenFingerprintHash: string | null;
|
|
25
30
|
arity: number | null;
|
|
26
31
|
language: LocalRepoBrainLanguage;
|
|
27
32
|
}
|
|
33
|
+
export interface LocalRepoBrainFreshness {
|
|
34
|
+
generatedAt: string;
|
|
35
|
+
gitHead: string | null;
|
|
36
|
+
gitDirty: boolean | null;
|
|
37
|
+
workingTreeStatus: 'clean' | 'dirty' | 'unknown';
|
|
38
|
+
freshnessBasis: 'git-head-and-working-tree' | 'filesystem-scan';
|
|
39
|
+
}
|
|
28
40
|
export interface LocalRepoBrainImportEdge {
|
|
29
41
|
fromFile: string;
|
|
30
42
|
target: string;
|
|
@@ -69,6 +81,7 @@ export interface LocalRepoBrainArtifact {
|
|
|
69
81
|
generatedAt: string;
|
|
70
82
|
repoRootHash: string;
|
|
71
83
|
artifactHash: string;
|
|
84
|
+
freshness: LocalRepoBrainFreshness;
|
|
72
85
|
privacy: {
|
|
73
86
|
sourceUploaded: false;
|
|
74
87
|
sourceStored: false;
|
|
@@ -112,7 +125,72 @@ export interface LocalRepoBrainSearchResult {
|
|
|
112
125
|
file: string | null;
|
|
113
126
|
detail: string;
|
|
114
127
|
}
|
|
128
|
+
export type RepoSymbolDuplicateMode = 'off' | 'warn' | 'block';
|
|
129
|
+
export type RepoSymbolPolicyVerdict = 'ok' | 'warn' | 'block' | 'not_evaluated';
|
|
130
|
+
export interface RepoSymbolPolicySymbolRef {
|
|
131
|
+
file: string;
|
|
132
|
+
name: string;
|
|
133
|
+
kind: LocalRepoBrainSymbolKind;
|
|
134
|
+
language: LocalRepoBrainLanguage;
|
|
135
|
+
exported: boolean;
|
|
136
|
+
local: boolean;
|
|
137
|
+
line: number;
|
|
138
|
+
normalizedSignature: string | null;
|
|
139
|
+
normalizedSignatureHash: string | null;
|
|
140
|
+
signatureHash: string;
|
|
141
|
+
}
|
|
142
|
+
export interface RepoSymbolDuplicateFinding {
|
|
143
|
+
schemaVersion: 'neurcode.repo-symbol-duplicate.v1';
|
|
144
|
+
classification: 'deterministic_symbol_duplicate';
|
|
145
|
+
policyMode: RepoSymbolDuplicateMode;
|
|
146
|
+
verdict: 'warn' | 'block';
|
|
147
|
+
strength: 'exported_symbol' | 'same_function_name' | 'same_local_symbol_name';
|
|
148
|
+
changed: RepoSymbolPolicySymbolRef;
|
|
149
|
+
existing: RepoSymbolPolicySymbolRef[];
|
|
150
|
+
evidence: {
|
|
151
|
+
sourceFree: true;
|
|
152
|
+
repoBrainArtifactHash: string;
|
|
153
|
+
repoBrainGeneratedAt: string;
|
|
154
|
+
repoBrainGitHead: string | null;
|
|
155
|
+
repoBrainWorkingTreeStatus: LocalRepoBrainFreshness['workingTreeStatus'];
|
|
156
|
+
matchingFiles: string[];
|
|
157
|
+
existingSymbolCount: number;
|
|
158
|
+
reasonCodes: string[];
|
|
159
|
+
};
|
|
160
|
+
message: string;
|
|
161
|
+
provenance: 'repo-brain-index';
|
|
162
|
+
}
|
|
163
|
+
export interface RepoSymbolPolicyEvaluation {
|
|
164
|
+
schemaVersion: 'neurcode.repo-symbol-policy.v1';
|
|
165
|
+
evaluated: boolean;
|
|
166
|
+
verdict: RepoSymbolPolicyVerdict;
|
|
167
|
+
policyMode: RepoSymbolDuplicateMode;
|
|
168
|
+
classification: 'deterministic_symbol_duplicate' | 'not_evaluated' | 'clean';
|
|
169
|
+
reason: string;
|
|
170
|
+
artifactHash: string | null;
|
|
171
|
+
generatedAt: string | null;
|
|
172
|
+
freshness: LocalRepoBrainFreshness | null;
|
|
173
|
+
findings: RepoSymbolDuplicateFinding[];
|
|
174
|
+
advisorySimilarity: {
|
|
175
|
+
classification: 'advisory_similarity';
|
|
176
|
+
evaluated: false;
|
|
177
|
+
reason: string;
|
|
178
|
+
};
|
|
179
|
+
privacy: {
|
|
180
|
+
sourceUploaded: false;
|
|
181
|
+
sourceStored: false;
|
|
182
|
+
diffStored: false;
|
|
183
|
+
promptStored: false;
|
|
184
|
+
evaluatedInMemoryOnly: true;
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
export declare function localRepoBrainLanguageFor(filePath: string): LocalRepoBrainLanguage;
|
|
115
188
|
export declare function sensitiveKindsFor(filePath: string): LocalRepoBrainSensitiveKind[];
|
|
189
|
+
export declare function analyzeLocalProposedSource(filePath: string, source: string): {
|
|
190
|
+
language: LocalRepoBrainLanguage;
|
|
191
|
+
symbols: LocalRepoBrainSymbolFact[];
|
|
192
|
+
imports: LocalRepoBrainImportEdge[];
|
|
193
|
+
};
|
|
116
194
|
export declare function localRepoBrainPath(projectRoot: string): string;
|
|
117
195
|
export declare function localRepoBrainMarkdownPath(projectRoot: string): string;
|
|
118
196
|
export declare function buildLocalRepoBrain(projectRoot: string, options?: BuildLocalRepoBrainOptions): LocalRepoBrainArtifact;
|
|
@@ -122,6 +200,13 @@ export declare function writeLocalRepoBrain(projectRoot: string, artifact: Local
|
|
|
122
200
|
};
|
|
123
201
|
export declare function readLocalRepoBrain(projectRoot: string): LocalRepoBrainArtifact | null;
|
|
124
202
|
export declare function renderLocalRepoBrainMarkdown(artifact: LocalRepoBrainArtifact): string;
|
|
203
|
+
export declare function evaluateRepoSymbolDuplicatePolicy(input: {
|
|
204
|
+
projectRoot: string;
|
|
205
|
+
filePath: string;
|
|
206
|
+
proposedSource: string | null;
|
|
207
|
+
proposedSymbols?: LocalRepoBrainSymbolFact[];
|
|
208
|
+
policyMode?: RepoSymbolDuplicateMode;
|
|
209
|
+
}): RepoSymbolPolicyEvaluation;
|
|
125
210
|
export interface RepoBrainFileFacts {
|
|
126
211
|
filePath: string;
|
|
127
212
|
sensitiveKinds: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-repo-brain.d.ts","sourceRoot":"","sources":["../../src/utils/local-repo-brain.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"local-repo-brain.d.ts","sourceRoot":"","sources":["../../src/utils/local-repo-brain.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LOCAL_REPO_BRAIN_SCHEMA_VERSION = void 0;
|
|
4
|
+
exports.localRepoBrainLanguageFor = localRepoBrainLanguageFor;
|
|
4
5
|
exports.sensitiveKindsFor = sensitiveKindsFor;
|
|
6
|
+
exports.analyzeLocalProposedSource = analyzeLocalProposedSource;
|
|
5
7
|
exports.localRepoBrainPath = localRepoBrainPath;
|
|
6
8
|
exports.localRepoBrainMarkdownPath = localRepoBrainMarkdownPath;
|
|
7
9
|
exports.buildLocalRepoBrain = buildLocalRepoBrain;
|
|
8
10
|
exports.writeLocalRepoBrain = writeLocalRepoBrain;
|
|
9
11
|
exports.readLocalRepoBrain = readLocalRepoBrain;
|
|
10
12
|
exports.renderLocalRepoBrainMarkdown = renderLocalRepoBrainMarkdown;
|
|
13
|
+
exports.evaluateRepoSymbolDuplicatePolicy = evaluateRepoSymbolDuplicatePolicy;
|
|
11
14
|
exports.getRepoBrainContext = getRepoBrainContext;
|
|
12
15
|
exports.formatRepoBrainFactsForMessage = formatRepoBrainFactsForMessage;
|
|
13
16
|
exports.searchLocalRepoBrain = searchLocalRepoBrain;
|
|
@@ -99,7 +102,7 @@ function moduleKey(filePath) {
|
|
|
99
102
|
}
|
|
100
103
|
return parts[0] || 'root';
|
|
101
104
|
}
|
|
102
|
-
function
|
|
105
|
+
function localRepoBrainLanguageFor(filePath) {
|
|
103
106
|
const ext = (0, node_path_1.extname)(filePath).toLowerCase();
|
|
104
107
|
if (ext === '.ts' || ext === '.tsx')
|
|
105
108
|
return 'typescript';
|
|
@@ -214,6 +217,13 @@ function arityFrom(params) {
|
|
|
214
217
|
return 0;
|
|
215
218
|
return trimmed.split(',').map((part) => part.trim()).filter(Boolean).length;
|
|
216
219
|
}
|
|
220
|
+
function normalizedSignature(language, kind, arity) {
|
|
221
|
+
if (!['typescript', 'javascript', 'python'].includes(language))
|
|
222
|
+
return null;
|
|
223
|
+
if (!['function', 'class', 'interface', 'type', 'const'].includes(kind))
|
|
224
|
+
return null;
|
|
225
|
+
return `${language}:${kind}:arity=${arity == null ? 'unknown' : arity}`;
|
|
226
|
+
}
|
|
217
227
|
function lineNumberAt(source, index) {
|
|
218
228
|
return source.slice(0, index).split(/\r?\n/).length;
|
|
219
229
|
}
|
|
@@ -232,13 +242,18 @@ function extractSymbols(filePath, source, language) {
|
|
|
232
242
|
const line = lineNumberAt(source, match.index || 0);
|
|
233
243
|
const params = paramsIndex == null ? undefined : match[paramsIndex];
|
|
234
244
|
const exported = exportedByPattern || /^\s*export\b/.test(matchText);
|
|
245
|
+
const arity = arityFrom(params);
|
|
246
|
+
const normalized = normalizedSignature(language, kind, arity);
|
|
235
247
|
symbols.push({
|
|
236
248
|
name,
|
|
237
249
|
kind,
|
|
238
250
|
file: filePath,
|
|
239
251
|
line,
|
|
240
252
|
exported,
|
|
241
|
-
|
|
253
|
+
local: !exported,
|
|
254
|
+
arity,
|
|
255
|
+
normalizedSignature: normalized,
|
|
256
|
+
normalizedSignatureHash: normalized ? shortHash(normalized) : null,
|
|
242
257
|
signatureHash: shortHash(`${language}:${kind}:${name}:${params || ''}`),
|
|
243
258
|
tokenFingerprintHash: normalizeTokenFingerprint(matchText),
|
|
244
259
|
language,
|
|
@@ -317,6 +332,15 @@ function extractImports(filePath, source, language, fileSet) {
|
|
|
317
332
|
}
|
|
318
333
|
return imports;
|
|
319
334
|
}
|
|
335
|
+
function analyzeLocalProposedSource(filePath, source) {
|
|
336
|
+
const normalizedFilePath = normalizePath(filePath);
|
|
337
|
+
const language = localRepoBrainLanguageFor(normalizedFilePath);
|
|
338
|
+
return {
|
|
339
|
+
language,
|
|
340
|
+
symbols: extractSymbols(normalizedFilePath, source, language),
|
|
341
|
+
imports: extractImports(normalizedFilePath, source, language, new Set([normalizedFilePath])),
|
|
342
|
+
};
|
|
343
|
+
}
|
|
320
344
|
function discoverCodeownersFiles(projectRoot) {
|
|
321
345
|
try {
|
|
322
346
|
const output = (0, node_child_process_1.execFileSync)('git', ['ls-files', '-co', '--exclude-standard'], {
|
|
@@ -425,6 +449,44 @@ function buildReuseFindings(symbols, options = {}) {
|
|
|
425
449
|
})
|
|
426
450
|
.slice(0, 50);
|
|
427
451
|
}
|
|
452
|
+
function gitHead(projectRoot) {
|
|
453
|
+
try {
|
|
454
|
+
const out = (0, node_child_process_1.execFileSync)('git', ['rev-parse', 'HEAD'], {
|
|
455
|
+
cwd: projectRoot,
|
|
456
|
+
encoding: 'utf8',
|
|
457
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
458
|
+
}).trim();
|
|
459
|
+
return out || null;
|
|
460
|
+
}
|
|
461
|
+
catch {
|
|
462
|
+
return null;
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
function gitDirty(projectRoot) {
|
|
466
|
+
try {
|
|
467
|
+
const out = (0, node_child_process_1.execFileSync)('git', ['status', '--short'], {
|
|
468
|
+
cwd: projectRoot,
|
|
469
|
+
encoding: 'utf8',
|
|
470
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
471
|
+
maxBuffer: 1024 * 1024 * 4,
|
|
472
|
+
});
|
|
473
|
+
return out.trim().length > 0;
|
|
474
|
+
}
|
|
475
|
+
catch {
|
|
476
|
+
return null;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
function buildFreshness(projectRoot, generatedAt) {
|
|
480
|
+
const head = gitHead(projectRoot);
|
|
481
|
+
const dirty = gitDirty(projectRoot);
|
|
482
|
+
return {
|
|
483
|
+
generatedAt,
|
|
484
|
+
gitHead: head,
|
|
485
|
+
gitDirty: dirty,
|
|
486
|
+
workingTreeStatus: dirty === null ? 'unknown' : dirty ? 'dirty' : 'clean',
|
|
487
|
+
freshnessBasis: head ? 'git-head-and-working-tree' : 'filesystem-scan',
|
|
488
|
+
};
|
|
489
|
+
}
|
|
428
490
|
function buildModules(files) {
|
|
429
491
|
const map = new Map();
|
|
430
492
|
for (const file of files) {
|
|
@@ -490,7 +552,11 @@ function buildHotspots(files, imports) {
|
|
|
490
552
|
.slice(0, 40);
|
|
491
553
|
}
|
|
492
554
|
function artifactHashInput(artifact) {
|
|
493
|
-
return JSON.stringify(
|
|
555
|
+
return JSON.stringify({
|
|
556
|
+
...artifact,
|
|
557
|
+
freshness: artifact.freshness ? { ...artifact.freshness, generatedAt: null } : artifact.freshness,
|
|
558
|
+
files: artifact.files.map((file) => ({ ...file, indexedAt: null, mtimeMs: 0 })),
|
|
559
|
+
});
|
|
494
560
|
}
|
|
495
561
|
function localRepoBrainPath(projectRoot) {
|
|
496
562
|
return (0, node_path_1.join)(projectRoot, '.neurcode', 'repo-brain', 'index.json');
|
|
@@ -500,6 +566,7 @@ function localRepoBrainMarkdownPath(projectRoot) {
|
|
|
500
566
|
}
|
|
501
567
|
function buildLocalRepoBrain(projectRoot, options = {}) {
|
|
502
568
|
const generatedAt = options.generatedAt || new Date().toISOString();
|
|
569
|
+
const freshness = buildFreshness(projectRoot, generatedAt);
|
|
503
570
|
const maxFiles = Math.max(1, Math.min(50000, options.maxFiles || 8000));
|
|
504
571
|
const maxBytesPerFile = Math.max(2048, Math.min(2_000_000, options.maxBytesPerFile || 350_000));
|
|
505
572
|
const candidates = listRepoFiles(projectRoot, maxFiles);
|
|
@@ -535,7 +602,7 @@ function buildLocalRepoBrain(projectRoot, options = {}) {
|
|
|
535
602
|
filesSkipped += 1;
|
|
536
603
|
continue;
|
|
537
604
|
}
|
|
538
|
-
const language =
|
|
605
|
+
const language = localRepoBrainLanguageFor(filePath);
|
|
539
606
|
const fileSymbols = extractSymbols(filePath, source, language);
|
|
540
607
|
const fileImports = extractImports(filePath, source, language, fileSet);
|
|
541
608
|
bytesIndexed += stat.size;
|
|
@@ -548,6 +615,8 @@ function buildLocalRepoBrain(projectRoot, options = {}) {
|
|
|
548
615
|
bytes: stat.size,
|
|
549
616
|
lineCount: source.split(/\r?\n/).length,
|
|
550
617
|
fileHash: shortHash(source),
|
|
618
|
+
mtimeMs: Math.floor(stat.mtimeMs),
|
|
619
|
+
indexedAt: generatedAt,
|
|
551
620
|
symbolCount: fileSymbols.length,
|
|
552
621
|
importCount: fileImports.length,
|
|
553
622
|
sensitiveKinds: sensitiveKindsFor(filePath),
|
|
@@ -561,6 +630,7 @@ function buildLocalRepoBrain(projectRoot, options = {}) {
|
|
|
561
630
|
const core = {
|
|
562
631
|
schemaVersion: exports.LOCAL_REPO_BRAIN_SCHEMA_VERSION,
|
|
563
632
|
repoRootHash: hash(projectRoot),
|
|
633
|
+
freshness,
|
|
564
634
|
privacy: {
|
|
565
635
|
sourceUploaded: false,
|
|
566
636
|
sourceStored: false,
|
|
@@ -572,6 +642,7 @@ function buildLocalRepoBrain(projectRoot, options = {}) {
|
|
|
572
642
|
'symbol names and kinds',
|
|
573
643
|
'line numbers',
|
|
574
644
|
'counts',
|
|
645
|
+
'mtime and index freshness metadata',
|
|
575
646
|
'hashes and token fingerprints',
|
|
576
647
|
'import targets',
|
|
577
648
|
'CODEOWNERS owner tokens',
|
|
@@ -639,6 +710,9 @@ function renderLocalRepoBrainMarkdown(artifact) {
|
|
|
639
710
|
lines.push('');
|
|
640
711
|
lines.push(`Generated: ${artifact.generatedAt}`);
|
|
641
712
|
lines.push(`Artifact hash: ${artifact.artifactHash}`);
|
|
713
|
+
if (artifact.freshness) {
|
|
714
|
+
lines.push(`Freshness: ${artifact.freshness.workingTreeStatus} (${artifact.freshness.gitHead ? `HEAD ${artifact.freshness.gitHead.slice(0, 12)}` : 'no git HEAD'})`);
|
|
715
|
+
}
|
|
642
716
|
lines.push('');
|
|
643
717
|
lines.push('## Source-free guarantee');
|
|
644
718
|
lines.push('- No source code is uploaded.');
|
|
@@ -686,6 +760,187 @@ function renderLocalRepoBrainMarkdown(artifact) {
|
|
|
686
760
|
lines.push('');
|
|
687
761
|
return lines.join('\n');
|
|
688
762
|
}
|
|
763
|
+
function defaultAdvisorySimilarity() {
|
|
764
|
+
return {
|
|
765
|
+
classification: 'advisory_similarity',
|
|
766
|
+
evaluated: false,
|
|
767
|
+
reason: 'Semantic similarity, token-fingerprint resemblance, and architecture judgment are advisory only and do not participate in deterministic duplicate enforcement.',
|
|
768
|
+
};
|
|
769
|
+
}
|
|
770
|
+
function symbolPolicyPrivacy() {
|
|
771
|
+
return {
|
|
772
|
+
sourceUploaded: false,
|
|
773
|
+
sourceStored: false,
|
|
774
|
+
diffStored: false,
|
|
775
|
+
promptStored: false,
|
|
776
|
+
evaluatedInMemoryOnly: true,
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
function notEvaluatedSymbolPolicy(policyMode, reason, artifact = null) {
|
|
780
|
+
return {
|
|
781
|
+
schemaVersion: 'neurcode.repo-symbol-policy.v1',
|
|
782
|
+
evaluated: false,
|
|
783
|
+
verdict: 'not_evaluated',
|
|
784
|
+
policyMode,
|
|
785
|
+
classification: 'not_evaluated',
|
|
786
|
+
reason,
|
|
787
|
+
artifactHash: artifact?.artifactHash ?? null,
|
|
788
|
+
generatedAt: artifact?.generatedAt ?? null,
|
|
789
|
+
freshness: artifact?.freshness ?? null,
|
|
790
|
+
findings: [],
|
|
791
|
+
advisorySimilarity: defaultAdvisorySimilarity(),
|
|
792
|
+
privacy: symbolPolicyPrivacy(),
|
|
793
|
+
};
|
|
794
|
+
}
|
|
795
|
+
function cleanSymbolPolicy(policyMode, artifact) {
|
|
796
|
+
return {
|
|
797
|
+
schemaVersion: 'neurcode.repo-symbol-policy.v1',
|
|
798
|
+
evaluated: true,
|
|
799
|
+
verdict: 'ok',
|
|
800
|
+
policyMode,
|
|
801
|
+
classification: 'clean',
|
|
802
|
+
reason: 'No same-name symbols were found in the same repo language for the proposed write.',
|
|
803
|
+
artifactHash: artifact.artifactHash,
|
|
804
|
+
generatedAt: artifact.generatedAt,
|
|
805
|
+
freshness: artifact.freshness ?? null,
|
|
806
|
+
findings: [],
|
|
807
|
+
advisorySimilarity: defaultAdvisorySimilarity(),
|
|
808
|
+
privacy: symbolPolicyPrivacy(),
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
function symbolPolicyRef(symbol) {
|
|
812
|
+
return {
|
|
813
|
+
file: symbol.file,
|
|
814
|
+
name: symbol.name,
|
|
815
|
+
kind: symbol.kind,
|
|
816
|
+
language: symbol.language,
|
|
817
|
+
exported: symbol.exported,
|
|
818
|
+
local: symbol.local ?? !symbol.exported,
|
|
819
|
+
line: symbol.line,
|
|
820
|
+
normalizedSignature: symbol.normalizedSignature ?? null,
|
|
821
|
+
normalizedSignatureHash: symbol.normalizedSignatureHash ?? null,
|
|
822
|
+
signatureHash: symbol.signatureHash,
|
|
823
|
+
};
|
|
824
|
+
}
|
|
825
|
+
function policyCandidate(symbol) {
|
|
826
|
+
if (symbol.kind === 'method')
|
|
827
|
+
return false;
|
|
828
|
+
if (!['typescript', 'javascript', 'python'].includes(symbol.language))
|
|
829
|
+
return false;
|
|
830
|
+
if (!symbol.name || JS_TS_RESERVED_WORDS.has(symbol.name))
|
|
831
|
+
return false;
|
|
832
|
+
return !isTestPath(symbol.file);
|
|
833
|
+
}
|
|
834
|
+
function duplicateStrength(changed, existing) {
|
|
835
|
+
if (changed.exported && existing.some((symbol) => symbol.exported))
|
|
836
|
+
return 'exported_symbol';
|
|
837
|
+
if (changed.kind === 'function' || existing.some((symbol) => symbol.kind === 'function'))
|
|
838
|
+
return 'same_function_name';
|
|
839
|
+
return 'same_local_symbol_name';
|
|
840
|
+
}
|
|
841
|
+
function duplicateReasonCodes(strength) {
|
|
842
|
+
const base = ['same_symbol_name', 'same_repo_language', 'source_free_repo_brain'];
|
|
843
|
+
if (strength === 'exported_symbol')
|
|
844
|
+
return [...base, 'exported_symbol_name'];
|
|
845
|
+
if (strength === 'same_function_name')
|
|
846
|
+
return [...base, 'function_name'];
|
|
847
|
+
return [...base, 'local_symbol_name'];
|
|
848
|
+
}
|
|
849
|
+
function duplicateMessage(finding) {
|
|
850
|
+
const files = finding.evidence.matchingFiles.slice(0, 4).join(', ');
|
|
851
|
+
const subject = finding.strength === 'exported_symbol'
|
|
852
|
+
? 'exported symbol'
|
|
853
|
+
: finding.strength === 'same_function_name'
|
|
854
|
+
? 'function name'
|
|
855
|
+
: 'local symbol name';
|
|
856
|
+
return `Deterministic symbol duplicate: ${subject} ${finding.changed.name} already exists in ${finding.changed.language} file(s): ${files}.`;
|
|
857
|
+
}
|
|
858
|
+
function evaluateRepoSymbolDuplicatePolicy(input) {
|
|
859
|
+
const policyMode = input.policyMode || 'warn';
|
|
860
|
+
if (policyMode === 'off') {
|
|
861
|
+
return notEvaluatedSymbolPolicy(policyMode, 'repoSymbolDuplicateMode is off.');
|
|
862
|
+
}
|
|
863
|
+
const artifact = readLocalRepoBrain(input.projectRoot);
|
|
864
|
+
if (!artifact) {
|
|
865
|
+
return notEvaluatedSymbolPolicy(policyMode, 'Local repo brain is missing; run neurcode brain index.');
|
|
866
|
+
}
|
|
867
|
+
if ((!input.proposedSource || !input.proposedSource.trim()) &&
|
|
868
|
+
(!input.proposedSymbols || input.proposedSymbols.length === 0)) {
|
|
869
|
+
return notEvaluatedSymbolPolicy(policyMode, 'No proposed source text was available from the host hook payload.', artifact);
|
|
870
|
+
}
|
|
871
|
+
const language = localRepoBrainLanguageFor(input.filePath);
|
|
872
|
+
if (!['typescript', 'javascript', 'python'].includes(language)) {
|
|
873
|
+
return notEvaluatedSymbolPolicy(policyMode, `Unsupported language for deterministic symbol duplicate policy: ${language}.`, artifact);
|
|
874
|
+
}
|
|
875
|
+
const proposedSymbols = (input.proposedSymbols ??
|
|
876
|
+
extractSymbols(input.filePath, input.proposedSource ?? '', language)).filter(policyCandidate);
|
|
877
|
+
if (proposedSymbols.length === 0) {
|
|
878
|
+
return cleanSymbolPolicy(policyMode, artifact);
|
|
879
|
+
}
|
|
880
|
+
const existingSymbols = artifact.symbols.filter((symbol) => policyCandidate(symbol) &&
|
|
881
|
+
symbol.language === language &&
|
|
882
|
+
symbol.file !== input.filePath);
|
|
883
|
+
const findings = [];
|
|
884
|
+
const seen = new Set();
|
|
885
|
+
for (const changed of proposedSymbols) {
|
|
886
|
+
const matches = existingSymbols
|
|
887
|
+
.filter((symbol) => symbol.name === changed.name)
|
|
888
|
+
.sort((a, b) => a.file.localeCompare(b.file) || a.line - b.line);
|
|
889
|
+
if (matches.length === 0)
|
|
890
|
+
continue;
|
|
891
|
+
const strength = duplicateStrength(changed, matches);
|
|
892
|
+
const matchingFiles = [...new Set(matches.map((symbol) => symbol.file))].sort();
|
|
893
|
+
const key = `${changed.name}:${changed.kind}:${changed.language}:${matchingFiles.join('|')}`;
|
|
894
|
+
if (seen.has(key))
|
|
895
|
+
continue;
|
|
896
|
+
seen.add(key);
|
|
897
|
+
const partial = {
|
|
898
|
+
schemaVersion: 'neurcode.repo-symbol-duplicate.v1',
|
|
899
|
+
classification: 'deterministic_symbol_duplicate',
|
|
900
|
+
policyMode,
|
|
901
|
+
verdict: policyMode === 'block' ? 'block' : 'warn',
|
|
902
|
+
strength,
|
|
903
|
+
changed: symbolPolicyRef(changed),
|
|
904
|
+
existing: matches.slice(0, 12).map(symbolPolicyRef),
|
|
905
|
+
evidence: {
|
|
906
|
+
sourceFree: true,
|
|
907
|
+
repoBrainArtifactHash: artifact.artifactHash,
|
|
908
|
+
repoBrainGeneratedAt: artifact.generatedAt,
|
|
909
|
+
repoBrainGitHead: artifact.freshness?.gitHead ?? null,
|
|
910
|
+
repoBrainWorkingTreeStatus: artifact.freshness?.workingTreeStatus ?? 'unknown',
|
|
911
|
+
matchingFiles,
|
|
912
|
+
existingSymbolCount: matches.length,
|
|
913
|
+
reasonCodes: duplicateReasonCodes(strength),
|
|
914
|
+
},
|
|
915
|
+
provenance: 'repo-brain-index',
|
|
916
|
+
};
|
|
917
|
+
findings.push({ ...partial, message: duplicateMessage(partial) });
|
|
918
|
+
}
|
|
919
|
+
if (findings.length === 0)
|
|
920
|
+
return cleanSymbolPolicy(policyMode, artifact);
|
|
921
|
+
const verdict = policyMode === 'block' ? 'block' : 'warn';
|
|
922
|
+
const rank = (finding) => finding.strength === 'exported_symbol' ? 0 : finding.strength === 'same_function_name' ? 1 : 2;
|
|
923
|
+
return {
|
|
924
|
+
schemaVersion: 'neurcode.repo-symbol-policy.v1',
|
|
925
|
+
evaluated: true,
|
|
926
|
+
verdict,
|
|
927
|
+
policyMode,
|
|
928
|
+
classification: 'deterministic_symbol_duplicate',
|
|
929
|
+
reason: verdict === 'block'
|
|
930
|
+
? 'Deterministic same-name symbol duplicate policy is configured to block.'
|
|
931
|
+
: 'Deterministic same-name symbol duplicate policy is configured to warn.',
|
|
932
|
+
artifactHash: artifact.artifactHash,
|
|
933
|
+
generatedAt: artifact.generatedAt,
|
|
934
|
+
freshness: artifact.freshness ?? null,
|
|
935
|
+
findings: findings
|
|
936
|
+
.sort((a, b) => rank(a) - rank(b) ||
|
|
937
|
+
a.changed.name.localeCompare(b.changed.name) ||
|
|
938
|
+
a.changed.file.localeCompare(b.changed.file))
|
|
939
|
+
.slice(0, 20),
|
|
940
|
+
advisorySimilarity: defaultAdvisorySimilarity(),
|
|
941
|
+
privacy: symbolPolicyPrivacy(),
|
|
942
|
+
};
|
|
943
|
+
}
|
|
689
944
|
function queryTokens(query) {
|
|
690
945
|
return query.toLowerCase().match(/[a-z0-9_./-]+/g) || [];
|
|
691
946
|
}
|