@neurcode-ai/cli 0.20.1 → 0.20.3
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/brain.d.ts.map +1 -1
- package/dist/commands/brain.js +11 -2
- package/dist/commands/brain.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +1 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/session-hook.d.ts +1 -0
- package/dist/commands/session-hook.d.ts.map +1 -1
- package/dist/commands/session-hook.js +45 -2
- package/dist/commands/session-hook.js.map +1 -1
- package/dist/commands/session.d.ts +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +17 -4
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +106 -83
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +49 -8
- package/dist/index.js.map +1 -1
- package/dist/runtime-build.json +5 -5
- package/dist/utils/admission-artifact.d.ts.map +1 -1
- package/dist/utils/admission-artifact.js +10 -0
- package/dist/utils/admission-artifact.js.map +1 -1
- package/dist/utils/agent-session-launcher.d.ts +12 -0
- package/dist/utils/agent-session-launcher.d.ts.map +1 -1
- package/dist/utils/agent-session-launcher.js +74 -22
- package/dist/utils/agent-session-launcher.js.map +1 -1
- package/dist/utils/atomic-runtime-bootstrap.d.ts +24 -0
- package/dist/utils/atomic-runtime-bootstrap.d.ts.map +1 -0
- package/dist/utils/atomic-runtime-bootstrap.js +115 -0
- package/dist/utils/atomic-runtime-bootstrap.js.map +1 -0
- package/dist/utils/brain-lifecycle.d.ts.map +1 -1
- package/dist/utils/brain-lifecycle.js +14 -3
- package/dist/utils/brain-lifecycle.js.map +1 -1
- package/dist/utils/enterprise-eval-report.d.ts +2 -0
- package/dist/utils/enterprise-eval-report.d.ts.map +1 -1
- package/dist/utils/enterprise-eval-report.js.map +1 -1
- package/dist/utils/eval-demo.d.ts.map +1 -1
- package/dist/utils/eval-demo.js +16 -3
- package/dist/utils/eval-demo.js.map +1 -1
- package/dist/utils/gitignore.d.ts +12 -3
- package/dist/utils/gitignore.d.ts.map +1 -1
- package/dist/utils/gitignore.js +59 -22
- package/dist/utils/gitignore.js.map +1 -1
- package/dist/utils/guided-eval.d.ts +14 -0
- package/dist/utils/guided-eval.d.ts.map +1 -1
- package/dist/utils/guided-eval.js +84 -1
- package/dist/utils/guided-eval.js.map +1 -1
- package/dist/utils/operator-identity.d.ts +16 -0
- package/dist/utils/operator-identity.d.ts.map +1 -0
- package/dist/utils/operator-identity.js +37 -0
- package/dist/utils/operator-identity.js.map +1 -0
- package/dist/utils/replay-runtime.d.ts.map +1 -1
- package/dist/utils/replay-runtime.js +0 -1
- package/dist/utils/replay-runtime.js.map +1 -1
- package/dist/utils/repo-brain-impact.d.ts +10 -0
- package/dist/utils/repo-brain-impact.d.ts.map +1 -1
- package/dist/utils/repo-brain-impact.js +44 -0
- package/dist/utils/repo-brain-impact.js.map +1 -1
- package/dist/utils/repo-intelligence-v2.d.ts.map +1 -1
- package/dist/utils/repo-intelligence-v2.js +5 -0
- package/dist/utils/repo-intelligence-v2.js.map +1 -1
- package/dist/utils/runtime-companion.d.ts.map +1 -1
- package/dist/utils/runtime-companion.js +5 -1
- package/dist/utils/runtime-companion.js.map +1 -1
- package/dist/utils/runtime-live.d.ts.map +1 -1
- package/dist/utils/runtime-live.js +3 -1
- package/dist/utils/runtime-live.js.map +1 -1
- package/package.json +4 -4
package/dist/commands/verify.js
CHANGED
|
@@ -1047,6 +1047,9 @@ async function executePolicyOnlyMode(options, diffFiles, ignoreFilter, projectRo
|
|
|
1047
1047
|
console.log(chalk.cyan('🛡️ General Governance mode (policy only, no plan linked)\n'));
|
|
1048
1048
|
}
|
|
1049
1049
|
const diffFilesForPolicy = diffFiles.filter((f) => !ignoreFilter(f.path));
|
|
1050
|
+
const governanceArtifactOnlyDiff = diffFilesForPolicy.length > 0
|
|
1051
|
+
&& diffFilesForPolicy.every((file) => (file.path.startsWith('neurcode.')
|
|
1052
|
+
|| file.path.startsWith('.neurcode/')));
|
|
1050
1053
|
const expectedPolicyOnlyFiles = diffFilesForPolicy.map((file) => file.path);
|
|
1051
1054
|
const signedLogsRequired = isSignedAiLogsRequired(orgGovernanceSettings);
|
|
1052
1055
|
const activeEngineeringContext = (0, active_engineering_context_1.loadActiveEngineeringContext)(projectRoot);
|
|
@@ -1484,7 +1487,14 @@ async function executePolicyOnlyMode(options, diffFiles, ignoreFilter, projectRo
|
|
|
1484
1487
|
// a policy rule, but it cannot turn an unevaluated file into verified evidence.
|
|
1485
1488
|
policyViolations.push(...coverageViolations);
|
|
1486
1489
|
policyDecision = (0, policy_decision_1.resolvePolicyDecisionFromViolations)(policyViolations);
|
|
1487
|
-
const
|
|
1490
|
+
const hasExplicitDiffContext = options.head === true || Boolean(options.base) || options.staged === true;
|
|
1491
|
+
const unevaluatedOnly = hasExplicitDiffContext
|
|
1492
|
+
&& coverageNotEvaluated
|
|
1493
|
+
&& policyOnlyStructural.filesRequested > 0
|
|
1494
|
+
&& policyOnlyStructural.filesAnalyzed === 0
|
|
1495
|
+
&& suppressedViolations.length === 0
|
|
1496
|
+
&& !governanceArtifactOnlyDiff;
|
|
1497
|
+
const effectiveVerdict = policyDecision === 'block' || structuralBlockingCount > 0 || coverageIncomplete || unevaluatedOnly
|
|
1488
1498
|
? 'FAIL'
|
|
1489
1499
|
: policyDecision === 'warn' || structuralAdvisoryCount > 0
|
|
1490
1500
|
? 'WARN'
|
|
@@ -1706,8 +1716,9 @@ async function executePolicyOnlyMode(options, diffFiles, ignoreFilter, projectRo
|
|
|
1706
1716
|
jsonMode: Boolean(options.json),
|
|
1707
1717
|
governance: governancePayload,
|
|
1708
1718
|
});
|
|
1709
|
-
if (
|
|
1719
|
+
if (unevaluatedOnly) {
|
|
1710
1720
|
return 3;
|
|
1721
|
+
}
|
|
1711
1722
|
return effectiveVerdict === 'FAIL' ? 2 : effectiveVerdict === 'WARN' ? 1 : 0;
|
|
1712
1723
|
}
|
|
1713
1724
|
async function verifyCommand(options) {
|
|
@@ -2430,59 +2441,65 @@ async function verifyCommand(options) {
|
|
|
2430
2441
|
}
|
|
2431
2442
|
const untrackedDiffFiles = includeUntracked ? getUntrackedDiffFiles(projectRoot) : [];
|
|
2432
2443
|
if (!diffText.trim() && untrackedDiffFiles.length === 0) {
|
|
2433
|
-
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
|
|
2442
|
-
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
|
|
2446
|
-
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
2459
|
-
|
|
2460
|
-
|
|
2461
|
-
|
|
2462
|
-
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
2444
|
+
const allowPolicyOnlyWithoutDiff = options.policyOnly === true
|
|
2445
|
+
&& options.head !== true
|
|
2446
|
+
&& !options.base
|
|
2447
|
+
&& options.staged !== true;
|
|
2448
|
+
if (!allowPolicyOnlyWithoutDiff) {
|
|
2449
|
+
if (!options.json) {
|
|
2450
|
+
console.log(chalk.yellow('⚠️ Verification not evaluated: no files in the selected diff context.'));
|
|
2451
|
+
console.log(chalk.dim(` Selected context: ${diffContextLabel || 'unresolved'}. No PASS was produced.`));
|
|
2452
|
+
}
|
|
2453
|
+
else {
|
|
2454
|
+
// Surface runtime capabilities even on the empty-diff path so
|
|
2455
|
+
// CI gates that assert `runtimeCapabilities.intentRuntime` etc.
|
|
2456
|
+
// never receive a payload that omits the envelope. The intent
|
|
2457
|
+
// runtime is reported as `inactive` here regardless of whether
|
|
2458
|
+
// an intent-pack exists — there are no findings to govern.
|
|
2459
|
+
emitVerifyJson({
|
|
2460
|
+
grade: 'F',
|
|
2461
|
+
score: 0,
|
|
2462
|
+
verdict: 'FAIL',
|
|
2463
|
+
violations: [],
|
|
2464
|
+
adherenceScore: 0,
|
|
2465
|
+
bloatCount: 0,
|
|
2466
|
+
bloatFiles: [],
|
|
2467
|
+
plannedFilesModified: 0,
|
|
2468
|
+
totalPlannedFiles: 0,
|
|
2469
|
+
message: 'Verification not evaluated: no files in the selected diff context.',
|
|
2470
|
+
evaluationStatus: 'not_evaluated',
|
|
2471
|
+
verificationCoverage: {
|
|
2472
|
+
posture: 'not_evaluated',
|
|
2473
|
+
context: diffContextLabel,
|
|
2474
|
+
filesRequested: 0,
|
|
2475
|
+
filesAnalyzed: 0,
|
|
2476
|
+
filesSkipped: 0,
|
|
2477
|
+
filesUnsupported: 0,
|
|
2478
|
+
},
|
|
2479
|
+
scopeGuardPassed: false,
|
|
2480
|
+
runtimeCapabilities: {
|
|
2481
|
+
schemaVersion: 'neurcode.runtime-capabilities.v1',
|
|
2482
|
+
executionPath: localOnlyMode ? 'local-only' : 'unresolved',
|
|
2483
|
+
intentRuntime: 'inactive',
|
|
2484
|
+
intentContractSource: 'none',
|
|
2485
|
+
intentRuntimeRequired: options.requireIntentRuntime === true || isEnabledFlag(process.env.NEURCODE_REQUIRE_INTENT_RUNTIME),
|
|
2486
|
+
intentRuntimeRequirementSatisfied: true,
|
|
2487
|
+
driftIntelligence: 'inactive',
|
|
2488
|
+
scopeGuard: 'unenforced',
|
|
2489
|
+
forbiddenBoundaryEnforcement: 'unenforced',
|
|
2490
|
+
generatedCodeGovernance: 'pattern-deterministic',
|
|
2491
|
+
structuralRules: 'inactive',
|
|
2492
|
+
replayDeterminism: 'enforced',
|
|
2493
|
+
apiContractStatus: localOnlyMode ? 'offline' : 'unresolved',
|
|
2494
|
+
observedScopeCategories: [],
|
|
2495
|
+
observedBoundaryTypes: [],
|
|
2496
|
+
noChangesDetected: true,
|
|
2497
|
+
},
|
|
2498
|
+
});
|
|
2499
|
+
}
|
|
2500
|
+
recordVerifyEvent('NO_CHANGES', 'diff=empty');
|
|
2501
|
+
exitWithEvidence(3);
|
|
2483
2502
|
}
|
|
2484
|
-
recordVerifyEvent('NO_CHANGES', 'diff=empty');
|
|
2485
|
-
exitWithEvidence(3);
|
|
2486
2503
|
}
|
|
2487
2504
|
// Parse tracked/staged diff and merge untracked files so plan adherence
|
|
2488
2505
|
// correctly counts newly created files before they are git-added.
|
|
@@ -2965,36 +2982,42 @@ async function verifyCommand(options) {
|
|
|
2965
2982
|
}
|
|
2966
2983
|
const summary = (0, diff_parser_1.getDiffSummary)(diffFiles);
|
|
2967
2984
|
if (diffFiles.length === 0) {
|
|
2968
|
-
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
2974
|
-
|
|
2975
|
-
|
|
2976
|
-
|
|
2977
|
-
|
|
2978
|
-
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
2982
|
-
|
|
2983
|
-
|
|
2984
|
-
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2985
|
+
const allowPolicyOnlyWithoutDiff = options.policyOnly === true
|
|
2986
|
+
&& options.head !== true
|
|
2987
|
+
&& !options.base
|
|
2988
|
+
&& options.staged !== true;
|
|
2989
|
+
if (!allowPolicyOnlyWithoutDiff) {
|
|
2990
|
+
if (!options.json) {
|
|
2991
|
+
console.log(chalk.yellow('⚠️ Verification not evaluated: all files in the selected diff context were excluded.'));
|
|
2992
|
+
console.log(chalk.dim(' No PASS was produced. Review ignore rules or select a different diff context.'));
|
|
2993
|
+
}
|
|
2994
|
+
else {
|
|
2995
|
+
emitVerifyJson({
|
|
2996
|
+
grade: 'F',
|
|
2997
|
+
score: 0,
|
|
2998
|
+
verdict: 'FAIL',
|
|
2999
|
+
violations: [],
|
|
3000
|
+
adherenceScore: 0,
|
|
3001
|
+
bloatCount: 0,
|
|
3002
|
+
bloatFiles: [],
|
|
3003
|
+
plannedFilesModified: 0,
|
|
3004
|
+
totalPlannedFiles: 0,
|
|
3005
|
+
message: 'Verification not evaluated: all files in the selected diff context were excluded.',
|
|
3006
|
+
evaluationStatus: 'not_evaluated',
|
|
3007
|
+
verificationCoverage: {
|
|
3008
|
+
posture: 'not_evaluated',
|
|
3009
|
+
context: diffContextLabel,
|
|
3010
|
+
filesRequested: allDiffFiles.length,
|
|
3011
|
+
filesAnalyzed: 0,
|
|
3012
|
+
filesSkipped: allDiffFiles.length,
|
|
3013
|
+
filesUnsupported: 0,
|
|
3014
|
+
},
|
|
3015
|
+
scopeGuardPassed: false,
|
|
3016
|
+
});
|
|
3017
|
+
}
|
|
3018
|
+
recordVerifyEvent('NO_CHANGES', 'diff_files=0;status=not_evaluated');
|
|
3019
|
+
exitWithEvidence(3);
|
|
2995
3020
|
}
|
|
2996
|
-
recordVerifyEvent('NO_CHANGES', 'diff_files=0;status=not_evaluated');
|
|
2997
|
-
exitWithEvidence(3);
|
|
2998
3021
|
}
|
|
2999
3022
|
const ignoreFilter = (0, ignore_1.loadIgnore)(projectRoot);
|
|
3000
3023
|
const runtimeIgnoreSet = getRuntimeIgnoreSetFromEnv();
|