@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.
Files changed (57) hide show
  1. package/dist/commands/fix.d.ts +1 -0
  2. package/dist/commands/fix.d.ts.map +1 -1
  3. package/dist/commands/fix.js +408 -3
  4. package/dist/commands/fix.js.map +1 -1
  5. package/dist/commands/generate.d.ts.map +1 -1
  6. package/dist/commands/generate.js +16 -1
  7. package/dist/commands/generate.js.map +1 -1
  8. package/dist/commands/patch-apply.d.ts +7 -0
  9. package/dist/commands/patch-apply.d.ts.map +1 -0
  10. package/dist/commands/patch-apply.js +85 -0
  11. package/dist/commands/patch-apply.js.map +1 -0
  12. package/dist/commands/start-intent.d.ts.map +1 -1
  13. package/dist/commands/start-intent.js +17 -2
  14. package/dist/commands/start-intent.js.map +1 -1
  15. package/dist/commands/verify.d.ts.map +1 -1
  16. package/dist/commands/verify.js +110 -60
  17. package/dist/commands/verify.js.map +1 -1
  18. package/dist/context-engine/graph.d.ts +6 -0
  19. package/dist/context-engine/graph.d.ts.map +1 -0
  20. package/dist/context-engine/graph.js +55 -0
  21. package/dist/context-engine/graph.js.map +1 -0
  22. package/dist/context-engine/index.d.ts +14 -0
  23. package/dist/context-engine/index.d.ts.map +1 -0
  24. package/dist/context-engine/index.js +26 -0
  25. package/dist/context-engine/index.js.map +1 -0
  26. package/dist/context-engine/scanner.d.ts +6 -0
  27. package/dist/context-engine/scanner.d.ts.map +1 -0
  28. package/dist/context-engine/scanner.js +62 -0
  29. package/dist/context-engine/scanner.js.map +1 -0
  30. package/dist/context-engine/scorer.d.ts +9 -0
  31. package/dist/context-engine/scorer.d.ts.map +1 -0
  32. package/dist/context-engine/scorer.js +112 -0
  33. package/dist/context-engine/scorer.js.map +1 -0
  34. package/dist/context-engine/suggestions.d.ts +12 -0
  35. package/dist/context-engine/suggestions.d.ts.map +1 -0
  36. package/dist/context-engine/suggestions.js +22 -0
  37. package/dist/context-engine/suggestions.js.map +1 -0
  38. package/dist/index.js +14 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/patch-engine/diff.d.ts +12 -0
  41. package/dist/patch-engine/diff.d.ts.map +1 -0
  42. package/dist/patch-engine/diff.js +74 -0
  43. package/dist/patch-engine/diff.js.map +1 -0
  44. package/dist/patch-engine/generator.d.ts +13 -0
  45. package/dist/patch-engine/generator.d.ts.map +1 -0
  46. package/dist/patch-engine/generator.js +51 -0
  47. package/dist/patch-engine/generator.js.map +1 -0
  48. package/dist/patch-engine/index.d.ts +47 -0
  49. package/dist/patch-engine/index.d.ts.map +1 -0
  50. package/dist/patch-engine/index.js +182 -0
  51. package/dist/patch-engine/index.js.map +1 -0
  52. package/dist/patch-engine/patterns.d.ts +4 -0
  53. package/dist/patch-engine/patterns.d.ts.map +1 -0
  54. package/dist/patch-engine/patterns.js +99 -0
  55. package/dist/patch-engine/patterns.js.map +1 -0
  56. package/package.json +8 -7
  57. 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(plan.expectedFiles.map((file) => normalizeRepoPath(file).toLowerCase()));
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":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface PatchApplyOptions {
2
+ file: string;
3
+ json?: boolean;
4
+ }
5
+ export declare function patchApplyCommand(options: PatchApplyOptions): void;
6
+ export {};
7
+ //# sourceMappingURL=patch-apply.d.ts.map
@@ -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":"AAMA,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CA0D9F"}
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: initialized.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
- initialized.expectedFiles.forEach((file) => {
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":"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"}
1
+ {"version":3,"file":"start-intent.js","sourceRoot":"","sources":["../../src/commands/start-intent.ts"],"names":[],"mappings":"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"}
@@ -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;AAktED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,iBA8hFzD"}
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"}
@@ -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
- const ciEnterpriseDefaultStrict = process.env.CI === 'true'
1934
- && !isEnabledFlag(process.env.NEURCODE_VERIFY_ALLOW_NON_STRICT_CI)
1935
- && Boolean(options.apiKey || process.env.NEURCODE_API_KEY);
1936
- const strictArtifactMode = explicitStrictArtifactMode || ciEnterpriseDefaultStrict;
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
- strictErrors.push(compiledPolicyRead.error
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
- strictErrors.push(changeContractRead.error
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 (compiledPolicySignatureStatus
2015
- && !compiledPolicySignatureStatus.valid
2016
- && (requireSignedArtifacts || compiledPolicySignatureStatus.present)) {
2017
- strictErrors.push(`Compiled policy artifact signature validation failed (${compiledPolicySignatureStatus.issues.join('; ') || 'unknown issue'})`);
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 (changeContractSignatureStatus
2020
- && !changeContractSignatureStatus.valid
2021
- && (requireSignedArtifacts || changeContractSignatureStatus.present)) {
2022
- strictErrors.push(`Change contract artifact signature validation failed (${changeContractSignatureStatus.issues.join('; ') || 'unknown issue'})`);
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 (strictErrors.length > 0) {
2025
- const message = `Strict artifact mode requires deterministic compiled-policy + change-contract artifacts.\n- ${strictErrors.join('\n- ')}`;
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: strictErrors.map((entry) => ({
2063
+ violations: signatureBlockErrors.map((entry) => ({
2032
2064
  file: entry.toLowerCase().includes('compiled policy') ? compiledPolicyRead.path : changeContractRead.path,
2033
- rule: 'deterministic_artifacts_required',
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: 'strict_artifacts_required',
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
- includeBlockedWarning: true,
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('\nSet --compiled-policy and --change-contract with valid artifacts before verify.'));
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
- const verdictLabel = result.verdict === 'PASS'
4519
- ? chalk.green('PASS')
4548
+ // ── Header ────────────────────────────────────────────────────────────────
4549
+ const headerLabel = result.verdict === 'PASS'
4550
+ ? chalk.bold.green('\n✅ VERIFICATION PASSED')
4520
4551
  : result.verdict === 'WARN'
4521
- ? chalk.yellow('WARN ⚠️')
4522
- : chalk.red('FAIL ');
4523
- const plannedText = `${result.plannedFilesModified}/${result.totalPlannedFiles}`;
4524
- console.log(`\n${verdictLabel}`);
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 drift detected.'));
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
- else {
4627
- console.log(chalk.dim(`\nSummary: ${blockingItems.length} blocking issues, ${advisoryItems.length} advisory issues across ${filesTouched} files`));
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(`Details: ${result.message}\n`));
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'));