@neurcode-ai/cli 0.9.49 → 0.9.50
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/commands/fix.d.ts +1 -0
- package/dist/commands/fix.d.ts.map +1 -1
- package/dist/commands/fix.js +408 -3
- package/dist/commands/fix.js.map +1 -1
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +16 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/patch-apply.d.ts +7 -0
- package/dist/commands/patch-apply.d.ts.map +1 -0
- package/dist/commands/patch-apply.js +85 -0
- package/dist/commands/patch-apply.js.map +1 -0
- package/dist/commands/start-intent.d.ts.map +1 -1
- package/dist/commands/start-intent.js +17 -2
- package/dist/commands/start-intent.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +110 -60
- package/dist/commands/verify.js.map +1 -1
- package/dist/context-engine/graph.d.ts +6 -0
- package/dist/context-engine/graph.d.ts.map +1 -0
- package/dist/context-engine/graph.js +55 -0
- package/dist/context-engine/graph.js.map +1 -0
- package/dist/context-engine/index.d.ts +14 -0
- package/dist/context-engine/index.d.ts.map +1 -0
- package/dist/context-engine/index.js +26 -0
- package/dist/context-engine/index.js.map +1 -0
- package/dist/context-engine/scanner.d.ts +6 -0
- package/dist/context-engine/scanner.d.ts.map +1 -0
- package/dist/context-engine/scanner.js +62 -0
- package/dist/context-engine/scanner.js.map +1 -0
- package/dist/context-engine/scorer.d.ts +9 -0
- package/dist/context-engine/scorer.d.ts.map +1 -0
- package/dist/context-engine/scorer.js +112 -0
- package/dist/context-engine/scorer.js.map +1 -0
- package/dist/context-engine/suggestions.d.ts +12 -0
- package/dist/context-engine/suggestions.d.ts.map +1 -0
- package/dist/context-engine/suggestions.js +22 -0
- package/dist/context-engine/suggestions.js.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/patch-engine/diff.d.ts +12 -0
- package/dist/patch-engine/diff.d.ts.map +1 -0
- package/dist/patch-engine/diff.js +74 -0
- package/dist/patch-engine/diff.js.map +1 -0
- package/dist/patch-engine/generator.d.ts +13 -0
- package/dist/patch-engine/generator.d.ts.map +1 -0
- package/dist/patch-engine/generator.js +51 -0
- package/dist/patch-engine/generator.js.map +1 -0
- package/dist/patch-engine/index.d.ts +47 -0
- package/dist/patch-engine/index.d.ts.map +1 -0
- package/dist/patch-engine/index.js +182 -0
- package/dist/patch-engine/index.js.map +1 -0
- package/dist/patch-engine/patterns.d.ts +4 -0
- package/dist/patch-engine/patterns.d.ts.map +1 -0
- package/dist/patch-engine/patterns.js +99 -0
- package/dist/patch-engine/patterns.js.map +1 -0
- package/package.json +8 -7
- package/LICENSE +0 -201
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.generateCommand = generateCommand;
|
|
4
4
|
const project_root_1 = require("../utils/project-root");
|
|
5
5
|
const plan_sync_1 = require("../utils/plan-sync");
|
|
6
|
+
const context_engine_1 = require("../context-engine");
|
|
6
7
|
const cli_json_1 = require("../utils/cli-json");
|
|
7
8
|
const proximity_1 = require("../mcp/proximity");
|
|
8
9
|
const context_injector_1 = require("../mcp/context-injector");
|
|
@@ -70,8 +71,11 @@ function generateCommand(userPrompt, options = {}) {
|
|
|
70
71
|
policies,
|
|
71
72
|
projectContext,
|
|
72
73
|
});
|
|
74
|
+
const contextAnalysis = (0, context_engine_1.analyzeContext)(projectRoot, normalizedPrompt);
|
|
75
|
+
const contextSuggestedFiles = contextAnalysis.suggestedFiles.filter((f) => !plan.expectedFiles.some((e) => normalizeRepoPath(e).toLowerCase() === normalizeRepoPath(f).toLowerCase()));
|
|
76
|
+
const mergedExpectedFiles = [...plan.expectedFiles, ...contextSuggestedFiles];
|
|
73
77
|
const requestedFiles = (0, proximity_1.extractRequestedFilePathsFromPrompt)(normalizedPrompt, 3);
|
|
74
|
-
const allowedSet = new Set(
|
|
78
|
+
const allowedSet = new Set(mergedExpectedFiles.map((file) => normalizeRepoPath(file).toLowerCase()));
|
|
75
79
|
const requestedOutOfScopeFiles = requestedFiles.filter((file) => !allowedSet.has(normalizeRepoPath(file).toLowerCase()));
|
|
76
80
|
const strictScopeMode = isStrictScopeModeEnabled(normalizedPrompt);
|
|
77
81
|
const planSyncUpdate = (!strictScopeMode && requestedOutOfScopeFiles.length > 0)
|
|
@@ -96,6 +100,10 @@ function generateCommand(userPrompt, options = {}) {
|
|
|
96
100
|
updated: planSyncUpdated,
|
|
97
101
|
addedFiles: planSyncAddedFiles,
|
|
98
102
|
},
|
|
103
|
+
contextEngine: {
|
|
104
|
+
suggestedFiles: contextAnalysis.suggestedFiles,
|
|
105
|
+
confidence: contextAnalysis.confidence,
|
|
106
|
+
},
|
|
99
107
|
},
|
|
100
108
|
message: 'Governed prompt generated (no LLM call executed).',
|
|
101
109
|
});
|
|
@@ -112,6 +120,13 @@ function generateCommand(userPrompt, options = {}) {
|
|
|
112
120
|
console.log(chalk.dim('\nPlan Sync refreshed .neurcode/plan.json (files already present).'));
|
|
113
121
|
}
|
|
114
122
|
}
|
|
123
|
+
if (contextAnalysis.suggestedFiles.length > 0) {
|
|
124
|
+
console.log(chalk.bold('\nSuggested files based on your codebase:'));
|
|
125
|
+
contextAnalysis.suggestedFiles.forEach((file) => {
|
|
126
|
+
console.log(` * ${file}`);
|
|
127
|
+
});
|
|
128
|
+
console.log(chalk.dim(`Confidence: ${contextAnalysis.confidence}`));
|
|
129
|
+
}
|
|
115
130
|
console.log(chalk.dim('\nGoverned prompt prepared locally. No LLM call executed.\n'));
|
|
116
131
|
}
|
|
117
132
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-apply.d.ts","sourceRoot":"","sources":["../../src/commands/patch-apply.ts"],"names":[],"mappings":"AAOA,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAMD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAuElE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.patchApplyCommand = patchApplyCommand;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const patch_engine_1 = require("../patch-engine");
|
|
7
|
+
const cli_json_1 = require("../utils/cli-json");
|
|
8
|
+
const chalk = (0, cli_json_1.loadChalk)();
|
|
9
|
+
function emitJson(payload) {
|
|
10
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
11
|
+
}
|
|
12
|
+
function patchApplyCommand(options) {
|
|
13
|
+
const filePath = (0, path_1.resolve)(process.cwd(), options.file);
|
|
14
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
15
|
+
if (options.json) {
|
|
16
|
+
emitJson({ success: false, message: `File not found: ${options.file}` });
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
console.log(chalk.red(`File not found: ${options.file}`));
|
|
20
|
+
}
|
|
21
|
+
process.exit(1);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
let content;
|
|
25
|
+
try {
|
|
26
|
+
content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const message = error instanceof Error ? error.message : 'Could not read file';
|
|
30
|
+
if (options.json) {
|
|
31
|
+
emitJson({ success: false, message });
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
console.log(chalk.red(`Could not read ${options.file}: ${message}`));
|
|
35
|
+
}
|
|
36
|
+
process.exit(1);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const result = (0, patch_engine_1.applyFirstMatchingPatch)(options.file, content);
|
|
40
|
+
if (!result) {
|
|
41
|
+
if (options.json) {
|
|
42
|
+
emitJson({
|
|
43
|
+
success: false,
|
|
44
|
+
file: options.file,
|
|
45
|
+
message: `No applicable patch found for ${options.file}`,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
console.log(chalk.yellow(`No applicable patch found for ${options.file}.`));
|
|
50
|
+
console.log(chalk.dim('Tip: run `neurcode fix` to see which violations exist.'));
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
(0, fs_1.writeFileSync)(filePath, result.updatedContent, 'utf-8');
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
const message = error instanceof Error ? error.message : 'Could not write file';
|
|
59
|
+
if (options.json) {
|
|
60
|
+
emitJson({ success: false, message });
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log(chalk.red(`Could not write ${options.file}: ${message}`));
|
|
64
|
+
}
|
|
65
|
+
process.exit(1);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (options.json) {
|
|
69
|
+
emitJson({
|
|
70
|
+
success: true,
|
|
71
|
+
file: options.file,
|
|
72
|
+
patternKind: result.patternKind,
|
|
73
|
+
patchConfidence: result.patchConfidence,
|
|
74
|
+
message: 'Patch applied successfully',
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.log(chalk.green('Patch applied successfully'));
|
|
79
|
+
console.log(chalk.dim(` File: ${options.file}`));
|
|
80
|
+
console.log(chalk.dim(` Pattern: ${result.patternKind}`));
|
|
81
|
+
console.log(chalk.dim(` Confidence: ${result.patchConfidence}`));
|
|
82
|
+
console.log(chalk.dim(' Run `neurcode verify` to confirm the fix.'));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=patch-apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch-apply.js","sourceRoot":"","sources":["../../src/commands/patch-apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-intent.d.ts","sourceRoot":"","sources":["../../src/commands/start-intent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start-intent.d.ts","sourceRoot":"","sources":["../../src/commands/start-intent.ts"],"names":[],"mappings":"AAOA,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CA2E9F"}
|
|
@@ -4,6 +4,7 @@ exports.startIntentCommand = startIntentCommand;
|
|
|
4
4
|
const cli_json_1 = require("../utils/cli-json");
|
|
5
5
|
const project_root_1 = require("../utils/project-root");
|
|
6
6
|
const plan_sync_1 = require("../utils/plan-sync");
|
|
7
|
+
const context_engine_1 = require("../context-engine");
|
|
7
8
|
const chalk = (0, cli_json_1.loadChalk)();
|
|
8
9
|
function startIntentCommand(intentInput, options = {}) {
|
|
9
10
|
const intent = intentInput.trim();
|
|
@@ -23,6 +24,9 @@ function startIntentCommand(intentInput, options = {}) {
|
|
|
23
24
|
}
|
|
24
25
|
const projectRoot = (0, project_root_1.resolveNeurcodeProjectRoot)(process.cwd());
|
|
25
26
|
const initialized = (0, plan_sync_1.initializeLocalPlanFromIntent)(projectRoot, intent);
|
|
27
|
+
const contextAnalysis = (0, context_engine_1.analyzeContext)(projectRoot, intent);
|
|
28
|
+
const contextFiles = contextAnalysis.suggestedFiles.filter((f) => !initialized.expectedFiles.includes(f));
|
|
29
|
+
const allExpectedFiles = [...initialized.expectedFiles, ...contextFiles];
|
|
26
30
|
if (options.json) {
|
|
27
31
|
const nextSteps = [
|
|
28
32
|
'Run `neurcode generate "<what you want to implement>"`',
|
|
@@ -33,11 +37,15 @@ function startIntentCommand(intentInput, options = {}) {
|
|
|
33
37
|
success: true,
|
|
34
38
|
intent: initialized.intent,
|
|
35
39
|
detectedSignals: initialized.detectedSignals,
|
|
36
|
-
expectedFiles:
|
|
40
|
+
expectedFiles: allExpectedFiles,
|
|
37
41
|
constraints: initialized.constraints,
|
|
38
42
|
planPath: initialized.path,
|
|
39
43
|
createdAt: initialized.createdAt,
|
|
40
44
|
lastUpdated: initialized.lastUpdated,
|
|
45
|
+
contextEngine: {
|
|
46
|
+
suggestedFiles: contextAnalysis.suggestedFiles,
|
|
47
|
+
confidence: contextAnalysis.confidence,
|
|
48
|
+
},
|
|
41
49
|
nextSteps,
|
|
42
50
|
message: 'Neurcode intent-based plan initialized.',
|
|
43
51
|
}, null, 2));
|
|
@@ -52,9 +60,16 @@ function startIntentCommand(intentInput, options = {}) {
|
|
|
52
60
|
console.log('Detected areas: general');
|
|
53
61
|
}
|
|
54
62
|
console.log(chalk.bold('\nInitial expected files:'));
|
|
55
|
-
|
|
63
|
+
allExpectedFiles.forEach((file) => {
|
|
56
64
|
console.log(` - ${file}`);
|
|
57
65
|
});
|
|
66
|
+
if (contextAnalysis.suggestedFiles.length > 0) {
|
|
67
|
+
console.log(chalk.bold('\nSuggested files based on your codebase:'));
|
|
68
|
+
contextAnalysis.suggestedFiles.forEach((file) => {
|
|
69
|
+
console.log(` * ${file}`);
|
|
70
|
+
});
|
|
71
|
+
console.log(chalk.dim(`Confidence: ${contextAnalysis.confidence}`));
|
|
72
|
+
}
|
|
58
73
|
console.log(chalk.dim(`\nPlan saved: ${initialized.path}`));
|
|
59
74
|
console.log(chalk.green('✅ Plan initialized. Plan Sync will keep expected files updated.'));
|
|
60
75
|
console.log(chalk.bold('\nNext steps:'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start-intent.js","sourceRoot":"","sources":["../../src/commands/start-intent.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"start-intent.js","sourceRoot":"","sources":["../../src/commands/start-intent.ts"],"names":[],"mappings":";;AAWA,gDA2EC;AAtFD,gDAA8C;AAC9C,wDAAmE;AACnE,kDAAmE;AACnE,sDAAmD;AAEnD,MAAM,KAAK,GAAG,IAAA,oBAAS,GAAE,CAAC;AAM1B,SAAgB,kBAAkB,CAAC,WAAmB,EAAE,UAA8B,EAAE;IACtF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,sDAAsD,CAAC;QACvE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzB,OAAO,EAAE,KAAK;gBACd,OAAO;aACR,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,yCAA0B,EAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAA,yCAA6B,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEvE,MAAM,eAAe,GAAG,IAAA,+BAAc,EAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,eAAe,CAAC,cAAc,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC9C,CAAC;IACF,MAAM,gBAAgB,GAAG,CAAC,GAAG,WAAW,CAAC,aAAa,EAAE,GAAG,YAAY,CAAC,CAAC;IAEzE,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG;YAChB,wDAAwD;YACxD,sCAAsC;YACtC,wCAAwC;SACzC,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;YACzB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,aAAa,EAAE,gBAAgB;YAC/B,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,QAAQ,EAAE,WAAW,CAAC,IAAI;YAC1B,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,aAAa,EAAE;gBACb,cAAc,EAAE,eAAe,CAAC,cAAc;gBAC9C,UAAU,EAAE,eAAe,CAAC,UAAU;aACvC;YACD,SAAS;YACT,OAAO,EAAE,yCAAyC;SACnD,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACb,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,WAAW,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACrD,gBAAgB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAChC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,IAAI,eAAe,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACrE,eAAe,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9C,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IACzE,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;AAC7D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqHH,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mGAAmG;IACnG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kGAAkG;IAClG,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAqHH,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kFAAkF;IAClF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mGAAmG;IACnG,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,kGAAkG;IAClG,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mEAAmE;IACnE,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,2DAA2D;IAC3D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,+DAA+D;IAC/D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAguED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,iBAyiFzD"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -847,6 +847,16 @@ function toCanonicalVerifyOutput(payload) {
|
|
|
847
847
|
addScopeIssue(file, message);
|
|
848
848
|
continue;
|
|
849
849
|
}
|
|
850
|
+
// Artifact presence/signature checks are advisory — they must never block a PR.
|
|
851
|
+
// Real governance signal (policy violations, scope drift) should not be obscured
|
|
852
|
+
// by infrastructure setup state.
|
|
853
|
+
const policyStr = String(policy || '').toLowerCase();
|
|
854
|
+
const isArtifactCheck = policyStr === 'deterministic_artifacts_required'
|
|
855
|
+
|| policyStr === 'signed_artifacts_required';
|
|
856
|
+
if (isArtifactCheck) {
|
|
857
|
+
addWarning(file, message, policy);
|
|
858
|
+
continue;
|
|
859
|
+
}
|
|
850
860
|
if (severity === 'warning' || severity === 'info') {
|
|
851
861
|
addWarning(file, message, policy);
|
|
852
862
|
continue;
|
|
@@ -1649,6 +1659,9 @@ async function executePolicyOnlyMode(options, diffFiles, ignoreFilter, projectRo
|
|
|
1649
1659
|
if (!options.json && effectiveRules.policyPack && effectiveRules.policyPackRules.length > 0) {
|
|
1650
1660
|
console.log(chalk.dim(` Evaluating policy pack: ${effectiveRules.policyPack.packName} (${effectiveRules.policyPack.packId}@${effectiveRules.policyPack.version}, ${effectiveRules.policyPackRules.length} rule(s))`));
|
|
1651
1661
|
}
|
|
1662
|
+
else if (!options.json && !effectiveRules.policyPack) {
|
|
1663
|
+
console.log(chalk.dim(' No policy pack installed — run `neurcode policy install <pack>` to add governance rules'));
|
|
1664
|
+
}
|
|
1652
1665
|
const policyResult = (0, policy_engine_1.evaluateRules)(diffFilesForPolicy, effectiveRules.allRules);
|
|
1653
1666
|
policyViolations = (policyResult.violations || []);
|
|
1654
1667
|
policyViolations = policyViolations.filter((v) => !ignoreFilter(v.file));
|
|
@@ -1930,10 +1943,10 @@ async function verifyCommand(options) {
|
|
|
1930
1943
|
const explicitStrictArtifactMode = options.strictArtifacts === true ||
|
|
1931
1944
|
isEnabledFlag(process.env.NEURCODE_VERIFY_STRICT_ARTIFACTS) ||
|
|
1932
1945
|
isEnabledFlag(process.env.NEURCODE_ENTERPRISE_MODE);
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
const strictArtifactMode = explicitStrictArtifactMode
|
|
1946
|
+
// Strict artifact mode is only engaged when explicitly requested.
|
|
1947
|
+
// Auto-enabling it in CI based on API key presence masked real violations
|
|
1948
|
+
// by blocking early on missing artifacts before policy checks could run.
|
|
1949
|
+
const strictArtifactMode = explicitStrictArtifactMode;
|
|
1937
1950
|
const runtimeGuardArtifactPath = (0, runtime_guard_1.resolveRuntimeGuardPath)(projectRoot, options.runtimeGuard);
|
|
1938
1951
|
const autoRuntimeGuardInStrict = strictArtifactMode
|
|
1939
1952
|
&& (0, fs_1.existsSync)(runtimeGuardArtifactPath)
|
|
@@ -1999,38 +2012,57 @@ async function verifyCommand(options) {
|
|
|
1999
2012
|
]
|
|
2000
2013
|
: [],
|
|
2001
2014
|
};
|
|
2015
|
+
// Artifact presence warnings (advisory — missing artifacts fall back to runtime compilation).
|
|
2016
|
+
// These must never cause an early exit; real governance signal should always be evaluated.
|
|
2017
|
+
const artifactPresenceWarnings = [];
|
|
2002
2018
|
if (strictArtifactMode) {
|
|
2003
|
-
const strictErrors = [];
|
|
2004
2019
|
if (!compiledPolicyRead.artifact) {
|
|
2005
|
-
|
|
2020
|
+
artifactPresenceWarnings.push(compiledPolicyRead.error
|
|
2006
2021
|
? `Compiled policy artifact invalid (${compiledPolicyRead.error})`
|
|
2007
2022
|
: `Compiled policy artifact missing (${compiledPolicyRead.path})`);
|
|
2008
2023
|
}
|
|
2009
2024
|
if (!changeContractRead.contract) {
|
|
2010
|
-
|
|
2025
|
+
artifactPresenceWarnings.push(changeContractRead.error
|
|
2011
2026
|
? `Change contract artifact invalid (${changeContractRead.error})`
|
|
2012
2027
|
: `Change contract artifact missing (${changeContractRead.path})`);
|
|
2013
2028
|
}
|
|
2014
|
-
if (
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2029
|
+
if (!options.json && artifactPresenceWarnings.length > 0) {
|
|
2030
|
+
console.log(chalk.yellow('\n⚠️ Deterministic artifact(s) unavailable — falling back to runtime compilation'));
|
|
2031
|
+
artifactPresenceWarnings.forEach((entry) => {
|
|
2032
|
+
console.log(chalk.yellow(` • ${entry}`));
|
|
2033
|
+
});
|
|
2034
|
+
console.log(chalk.dim(' Governance will continue using runtime compilation. Artifact checks are advisory.\n'));
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
// Signature blocking distinguishes two cases:
|
|
2038
|
+
// - Artifact has a signature that is INVALID (present=true, valid=false): this is a tamper
|
|
2039
|
+
// indicator and blocks when requireSignedArtifacts is set.
|
|
2040
|
+
// - Artifact has NO signature (present=false): this is an unsigned artifact; advisory only,
|
|
2041
|
+
// never blocks — an unsigned artifact cannot be "tampered", only "not signed yet".
|
|
2042
|
+
if (strictArtifactMode) {
|
|
2043
|
+
const signatureBlockErrors = [];
|
|
2044
|
+
if (requireSignedArtifacts
|
|
2045
|
+
&& compiledPolicySignatureStatus
|
|
2046
|
+
&& compiledPolicySignatureStatus.present
|
|
2047
|
+
&& !compiledPolicySignatureStatus.valid) {
|
|
2048
|
+
signatureBlockErrors.push(`Compiled policy artifact signature validation failed (${compiledPolicySignatureStatus.issues.join('; ') || 'unknown issue'})`);
|
|
2018
2049
|
}
|
|
2019
|
-
if (
|
|
2020
|
-
&&
|
|
2021
|
-
&&
|
|
2022
|
-
|
|
2050
|
+
if (requireSignedArtifacts
|
|
2051
|
+
&& changeContractSignatureStatus
|
|
2052
|
+
&& changeContractSignatureStatus.present
|
|
2053
|
+
&& !changeContractSignatureStatus.valid) {
|
|
2054
|
+
signatureBlockErrors.push(`Change contract artifact signature validation failed (${changeContractSignatureStatus.issues.join('; ') || 'unknown issue'})`);
|
|
2023
2055
|
}
|
|
2024
|
-
if (
|
|
2025
|
-
const message = `
|
|
2056
|
+
if (signatureBlockErrors.length > 0) {
|
|
2057
|
+
const message = `Signed artifact enforcement failed — tampered or invalid signatures detected.\n- ${signatureBlockErrors.join('\n- ')}`;
|
|
2026
2058
|
if (options.json) {
|
|
2027
2059
|
emitVerifyJson({
|
|
2028
2060
|
grade: 'F',
|
|
2029
2061
|
score: 0,
|
|
2030
2062
|
verdict: 'FAIL',
|
|
2031
|
-
violations:
|
|
2063
|
+
violations: signatureBlockErrors.map((entry) => ({
|
|
2032
2064
|
file: entry.toLowerCase().includes('compiled policy') ? compiledPolicyRead.path : changeContractRead.path,
|
|
2033
|
-
rule: '
|
|
2065
|
+
rule: 'signed_artifacts_required',
|
|
2034
2066
|
severity: 'block',
|
|
2035
2067
|
message: entry,
|
|
2036
2068
|
})),
|
|
@@ -2041,32 +2073,34 @@ async function verifyCommand(options) {
|
|
|
2041
2073
|
totalPlannedFiles: 0,
|
|
2042
2074
|
message,
|
|
2043
2075
|
scopeGuardPassed: false,
|
|
2044
|
-
mode: '
|
|
2076
|
+
mode: 'signed_artifacts_required',
|
|
2045
2077
|
policyOnly: options.policyOnly === true,
|
|
2046
2078
|
changeContract: changeContractSummary,
|
|
2047
2079
|
...(compiledPolicyMetadata ? { policyCompilation: compiledPolicyMetadata } : {}),
|
|
2048
2080
|
});
|
|
2049
2081
|
}
|
|
2050
2082
|
else {
|
|
2051
|
-
(0, scope_telemetry_1.printScopeTelemetry)(chalk, scopeTelemetry, {
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
console.log(chalk.red('\n⛔ Deterministic Artifact Requirements Failed'));
|
|
2055
|
-
strictErrors.forEach((entry) => {
|
|
2083
|
+
(0, scope_telemetry_1.printScopeTelemetry)(chalk, scopeTelemetry, { includeBlockedWarning: true });
|
|
2084
|
+
console.log(chalk.red('\n⛔ Signed Artifact Validation Failed'));
|
|
2085
|
+
signatureBlockErrors.forEach((entry) => {
|
|
2056
2086
|
console.log(chalk.red(` • ${entry}`));
|
|
2057
2087
|
});
|
|
2058
|
-
console.log(chalk.dim('\
|
|
2059
|
-
if (requireSignedArtifacts) {
|
|
2060
|
-
console.log(chalk.dim('Enable signing keys via NEURCODE_GOVERNANCE_SIGNING_KEY or NEURCODE_GOVERNANCE_SIGNING_KEYS to generate signed artifacts.\n'));
|
|
2061
|
-
}
|
|
2062
|
-
else {
|
|
2063
|
-
console.log('');
|
|
2064
|
-
}
|
|
2088
|
+
console.log(chalk.dim('\nRegenerate artifacts with valid signing keys: NEURCODE_GOVERNANCE_SIGNING_KEY or NEURCODE_GOVERNANCE_SIGNING_KEYS.\n'));
|
|
2065
2089
|
}
|
|
2066
2090
|
process.exit(2);
|
|
2067
2091
|
}
|
|
2092
|
+
// Advisory notice when artifact has a signature but signing is not required in this context.
|
|
2093
|
+
if (!options.json) {
|
|
2094
|
+
if (compiledPolicySignatureStatus && !compiledPolicySignatureStatus.valid && !requireSignedArtifacts) {
|
|
2095
|
+
console.log(chalk.yellow(` ⚠️ Compiled policy signature could not be verified (${compiledPolicySignatureStatus.issues.join('; ') || 'key unavailable'}) — advisory only`));
|
|
2096
|
+
}
|
|
2097
|
+
if (changeContractSignatureStatus && !changeContractSignatureStatus.valid && !requireSignedArtifacts) {
|
|
2098
|
+
console.log(chalk.yellow(` ⚠️ Change contract signature could not be verified (${changeContractSignatureStatus.issues.join('; ') || 'key unavailable'}) — advisory only`));
|
|
2099
|
+
}
|
|
2100
|
+
}
|
|
2068
2101
|
}
|
|
2069
2102
|
if (!strictArtifactMode && requireSignedArtifacts) {
|
|
2103
|
+
// Non-strict mode with signing required: same signature gate applies.
|
|
2070
2104
|
const signatureErrors = [];
|
|
2071
2105
|
if (compiledPolicyRead.artifact && compiledPolicySignatureStatus && !compiledPolicySignatureStatus.valid) {
|
|
2072
2106
|
signatureErrors.push(`Compiled policy artifact signature validation failed (${compiledPolicySignatureStatus.issues.join('; ') || 'unknown issue'})`);
|
|
@@ -2101,13 +2135,9 @@ async function verifyCommand(options) {
|
|
|
2101
2135
|
});
|
|
2102
2136
|
}
|
|
2103
2137
|
else {
|
|
2104
|
-
(0, scope_telemetry_1.printScopeTelemetry)(chalk, scopeTelemetry, {
|
|
2105
|
-
includeBlockedWarning: true,
|
|
2106
|
-
});
|
|
2138
|
+
(0, scope_telemetry_1.printScopeTelemetry)(chalk, scopeTelemetry, { includeBlockedWarning: true });
|
|
2107
2139
|
console.log(chalk.red('\n⛔ Signed Artifact Requirements Failed'));
|
|
2108
|
-
signatureErrors.forEach((entry) => {
|
|
2109
|
-
console.log(chalk.red(` • ${entry}`));
|
|
2110
|
-
});
|
|
2140
|
+
signatureErrors.forEach((entry) => console.log(chalk.red(` • ${entry}`)));
|
|
2111
2141
|
console.log(chalk.dim('\nEnable signing keys via NEURCODE_GOVERNANCE_SIGNING_KEY or NEURCODE_GOVERNANCE_SIGNING_KEYS and regenerate artifacts.\n'));
|
|
2112
2142
|
}
|
|
2113
2143
|
process.exit(2);
|
|
@@ -2145,9 +2175,6 @@ async function verifyCommand(options) {
|
|
|
2145
2175
|
console.log(chalk.yellow(` Change contract signature: invalid (${changeContractSignatureStatus.issues.join('; ') || 'unknown issue'})`));
|
|
2146
2176
|
}
|
|
2147
2177
|
}
|
|
2148
|
-
if (ciEnterpriseDefaultStrict && !explicitStrictArtifactMode) {
|
|
2149
|
-
console.log(chalk.dim(' CI enterprise mode detected: strict deterministic artifact enforcement is auto-enabled (set NEURCODE_VERIFY_ALLOW_NON_STRICT_CI=1 to opt out).'));
|
|
2150
|
-
}
|
|
2151
2178
|
if (autoRuntimeGuardInStrict && !options.requireRuntimeGuard && !isEnabledFlag(process.env.NEURCODE_VERIFY_REQUIRE_RUNTIME_GUARD)) {
|
|
2152
2179
|
console.log(chalk.dim(` Strict mode detected runtime guard artifact: auto-enforcing runtime guard (${runtimeGuardArtifactPath}).`));
|
|
2153
2180
|
}
|
|
@@ -3523,6 +3550,9 @@ async function verifyCommand(options) {
|
|
|
3523
3550
|
if (!options.json && effectiveRules.policyPack && effectiveRules.policyPackRules.length > 0) {
|
|
3524
3551
|
console.log(chalk.dim(` Evaluating policy pack: ${effectiveRules.policyPack.packName} (${effectiveRules.policyPack.packId}@${effectiveRules.policyPack.version}, ${effectiveRules.policyPackRules.length} rule(s))`));
|
|
3525
3552
|
}
|
|
3553
|
+
else if (!options.json && !effectiveRules.policyPack) {
|
|
3554
|
+
console.log(chalk.dim(' No policy pack installed — run `neurcode policy install <pack>` to add governance rules'));
|
|
3555
|
+
}
|
|
3526
3556
|
// Prepare diff stats and changed files for API
|
|
3527
3557
|
const diffStats = {
|
|
3528
3558
|
totalAdded: summary.totalAdded,
|
|
@@ -4515,14 +4545,14 @@ function displayChangeContractDrift(summary, options = { advisory: false }) {
|
|
|
4515
4545
|
* Display verification results in a formatted report card
|
|
4516
4546
|
*/
|
|
4517
4547
|
function displayVerifyResults(result, policyViolations, expediteModeUsed = false) {
|
|
4518
|
-
|
|
4519
|
-
|
|
4548
|
+
// ── Header ────────────────────────────────────────────────────────────────
|
|
4549
|
+
const headerLabel = result.verdict === 'PASS'
|
|
4550
|
+
? chalk.bold.green('\n✅ VERIFICATION PASSED')
|
|
4520
4551
|
: result.verdict === 'WARN'
|
|
4521
|
-
? chalk.yellow('
|
|
4522
|
-
: chalk.red('
|
|
4523
|
-
|
|
4524
|
-
|
|
4525
|
-
console.log(chalk.dim(`Plan adherence: ${plannedText} files (${result.adherenceScore}%)`));
|
|
4552
|
+
? chalk.bold.yellow('\n⚠️ VERIFICATION PASSED WITH WARNINGS')
|
|
4553
|
+
: chalk.bold.red('\n❌ VERIFICATION FAILED');
|
|
4554
|
+
console.log(headerLabel);
|
|
4555
|
+
// ── Triage items ──────────────────────────────────────────────────────────
|
|
4526
4556
|
const maxBlockingItems = 20;
|
|
4527
4557
|
const maxAdvisoryItems = 8;
|
|
4528
4558
|
const maxExpediteItems = 12;
|
|
@@ -4580,6 +4610,31 @@ function displayVerifyResults(result, policyViolations, expediteModeUsed = false
|
|
|
4580
4610
|
];
|
|
4581
4611
|
advisoryItems = [];
|
|
4582
4612
|
}
|
|
4613
|
+
// ── Counts ────────────────────────────────────────────────────────────────
|
|
4614
|
+
console.log(blockingItems.length > 0
|
|
4615
|
+
? chalk.red(`Blocking Issues: ${blockingItems.length}`)
|
|
4616
|
+
: chalk.dim('Blocking Issues: 0'));
|
|
4617
|
+
if (expediteModeUsed) {
|
|
4618
|
+
console.log(chalk.yellow(`Expedite Issues: ${expediteItems.length}`));
|
|
4619
|
+
}
|
|
4620
|
+
else {
|
|
4621
|
+
console.log(advisoryItems.length > 0
|
|
4622
|
+
? chalk.yellow(`Advisory Issues: ${advisoryItems.length}`)
|
|
4623
|
+
: chalk.dim('Advisory Issues: 0'));
|
|
4624
|
+
}
|
|
4625
|
+
console.log(chalk.dim(`Plan adherence: ${result.plannedFilesModified}/${result.totalPlannedFiles} files (${result.adherenceScore}%)`));
|
|
4626
|
+
// ── Top issues ────────────────────────────────────────────────────────────
|
|
4627
|
+
const topIssues = [
|
|
4628
|
+
...blockingItems,
|
|
4629
|
+
...(expediteModeUsed ? expediteItems : advisoryItems),
|
|
4630
|
+
].slice(0, 2);
|
|
4631
|
+
if (topIssues.length > 0) {
|
|
4632
|
+
console.log(chalk.bold('\nTop Issues:'));
|
|
4633
|
+
topIssues.forEach((item, i) => {
|
|
4634
|
+
console.log(` ${i + 1}. ${item.message} → ${chalk.cyan(item.file)}`);
|
|
4635
|
+
});
|
|
4636
|
+
}
|
|
4637
|
+
// ── Detailed lists ────────────────────────────────────────────────────────
|
|
4583
4638
|
if (blockingItems.length > 0) {
|
|
4584
4639
|
console.log(chalk.red(`\nBLOCKING (${blockingItems.length})`));
|
|
4585
4640
|
blockingItems.slice(0, maxBlockingItems).forEach((item) => {
|
|
@@ -4613,20 +4668,15 @@ function displayVerifyResults(result, policyViolations, expediteModeUsed = false
|
|
|
4613
4668
|
console.log(chalk.dim(' Note: Expedite Mode used'));
|
|
4614
4669
|
}
|
|
4615
4670
|
if (blockingItems.length === 0 && advisoryItems.length === 0 && expediteItems.length === 0) {
|
|
4616
|
-
console.log(chalk.green('\nNo
|
|
4617
|
-
}
|
|
4618
|
-
const filesTouched = new Set([
|
|
4619
|
-
...blockingItems.map((item) => item.file),
|
|
4620
|
-
...advisoryItems.map((item) => item.file),
|
|
4621
|
-
...expediteItems.map((item) => item.file),
|
|
4622
|
-
]).size;
|
|
4623
|
-
if (expediteModeUsed) {
|
|
4624
|
-
console.log(chalk.dim(`\nSummary: ${blockingItems.length} blocking issues, ${expediteItems.length} expedite issues across ${filesTouched} files`));
|
|
4671
|
+
console.log(chalk.green('\nNo issues detected.'));
|
|
4625
4672
|
}
|
|
4626
|
-
|
|
4627
|
-
|
|
4673
|
+
// ── Next step ─────────────────────────────────────────────────────────────
|
|
4674
|
+
if (blockingItems.length > 0 || advisoryItems.length > 0 || expediteItems.length > 0) {
|
|
4675
|
+
console.log(chalk.bold('\nNext step:'));
|
|
4676
|
+
console.log(` ${chalk.cyan('neurcode fix')}`);
|
|
4677
|
+
console.log(chalk.dim(' or: neurcode fix --apply-safe (auto-apply high-confidence patches)'));
|
|
4628
4678
|
}
|
|
4629
|
-
console.log(chalk.dim(
|
|
4679
|
+
console.log(chalk.dim(`\nDetails: ${result.message}\n`));
|
|
4630
4680
|
}
|
|
4631
4681
|
function printFirstRunAdvisoryMessage(demoMode) {
|
|
4632
4682
|
console.log(chalk.cyan('\nNeurcode first-run advisory mode'));
|