@neurcode-ai/cli 0.9.38 → 0.9.40

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.
@@ -0,0 +1,390 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runtimeGuardCommand = runtimeGuardCommand;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const diff_parser_1 = require("@neurcode-ai/diff-parser");
7
+ const project_root_1 = require("../utils/project-root");
8
+ const state_1 = require("../utils/state");
9
+ const git_1 = require("../utils/git");
10
+ const runtime_guard_1 = require("../utils/runtime-guard");
11
+ const change_contract_1 = require("../utils/change-contract");
12
+ const policy_compiler_1 = require("../utils/policy-compiler");
13
+ let chalk;
14
+ try {
15
+ chalk = require('chalk');
16
+ }
17
+ catch {
18
+ chalk = {
19
+ bold: (value) => value,
20
+ cyan: (value) => value,
21
+ dim: (value) => value,
22
+ green: (value) => value,
23
+ yellow: (value) => value,
24
+ red: (value) => value,
25
+ };
26
+ }
27
+ function normalizeRepoPath(value) {
28
+ return value.replace(/\\/g, '/').replace(/^\.\//, '').trim();
29
+ }
30
+ function emitJson(payload) {
31
+ console.log(JSON.stringify(payload, null, 2));
32
+ }
33
+ function resolveDiffText(options) {
34
+ if (options.staged) {
35
+ return (0, git_1.execGitCommand)('git diff --cached');
36
+ }
37
+ if (options.head) {
38
+ return (0, git_1.getDiffFromBase)('HEAD');
39
+ }
40
+ if (typeof options.base === 'string' && options.base.trim()) {
41
+ return (0, git_1.getDiffFromBase)(options.base.trim());
42
+ }
43
+ return (0, git_1.getDiffFromBase)('HEAD~1');
44
+ }
45
+ function buildStartFailurePayload(errors) {
46
+ return {
47
+ success: false,
48
+ message: `Runtime guard start failed: ${errors.join('; ')}`,
49
+ errors,
50
+ };
51
+ }
52
+ function evaluateSourceDrift(projectRoot, artifact) {
53
+ const violations = [];
54
+ if (artifact.source.changeContractPath) {
55
+ const contractRead = (0, change_contract_1.readChangeContract)(projectRoot, artifact.source.changeContractPath);
56
+ if (!contractRead.contract) {
57
+ violations.push({
58
+ code: 'RUNTIME_GUARD_CHANGE_CONTRACT_DRIFT',
59
+ message: contractRead.error
60
+ ? `Runtime guard change contract invalid (${contractRead.error})`
61
+ : `Runtime guard change contract missing (${contractRead.path})`,
62
+ });
63
+ }
64
+ else if (artifact.source.changeContractExpectedFilesFingerprint &&
65
+ contractRead.contract.expectedFilesFingerprint !== artifact.source.changeContractExpectedFilesFingerprint) {
66
+ violations.push({
67
+ code: 'RUNTIME_GUARD_CHANGE_CONTRACT_DRIFT',
68
+ message: `Runtime guard change contract drift detected (expected files fingerprint changed: ` +
69
+ `${artifact.source.changeContractExpectedFilesFingerprint} -> ${contractRead.contract.expectedFilesFingerprint})`,
70
+ });
71
+ }
72
+ }
73
+ if (artifact.source.compiledPolicyPath) {
74
+ const compiledRead = (0, policy_compiler_1.readCompiledPolicyArtifact)(projectRoot, artifact.source.compiledPolicyPath);
75
+ if (!compiledRead.artifact) {
76
+ violations.push({
77
+ code: 'RUNTIME_GUARD_COMPILED_POLICY_DRIFT',
78
+ message: compiledRead.error
79
+ ? `Runtime guard compiled policy invalid (${compiledRead.error})`
80
+ : `Runtime guard compiled policy missing (${compiledRead.path})`,
81
+ });
82
+ }
83
+ else if (artifact.source.compiledPolicyFingerprint &&
84
+ compiledRead.artifact.fingerprint !== artifact.source.compiledPolicyFingerprint) {
85
+ violations.push({
86
+ code: 'RUNTIME_GUARD_COMPILED_POLICY_DRIFT',
87
+ message: `Runtime guard compiled policy drift detected (fingerprint changed: ` +
88
+ `${artifact.source.compiledPolicyFingerprint} -> ${compiledRead.artifact.fingerprint})`,
89
+ });
90
+ }
91
+ }
92
+ return violations;
93
+ }
94
+ function printStatus(path, artifact) {
95
+ console.log(chalk.bold.cyan('\n🧱 Runtime Guard Status\n'));
96
+ console.log(chalk.dim(`Path: ${path}`));
97
+ console.log(chalk.dim(`Guard ID: ${artifact.guardId}`));
98
+ console.log(chalk.dim(`Mode: ${artifact.mode}`));
99
+ console.log(chalk.dim(`Active: ${artifact.active ? 'yes' : 'no'}`));
100
+ console.log(chalk.dim(`Created: ${artifact.createdAt}`));
101
+ if (artifact.archivedAt) {
102
+ console.log(chalk.dim(`Archived: ${artifact.archivedAt}`));
103
+ }
104
+ console.log(chalk.dim(`Plan ID: ${artifact.source.planId || '(none)'}`));
105
+ console.log(chalk.dim(`Expected files: ${artifact.expectedFiles.length}`));
106
+ console.log(chalk.dim(`Deterministic rules: ${artifact.deterministic.ruleCount}`));
107
+ console.log(chalk.dim(`Unmatched statements: ${artifact.deterministic.unmatchedStatements.length}`));
108
+ console.log(chalk.dim(`Checks run: ${artifact.stats.checksRun} (blocked ${artifact.stats.blockedChecks})`));
109
+ if (artifact.stats.lastCheckedAt) {
110
+ console.log(chalk.dim(`Last check: ${artifact.stats.lastCheckedAt}`));
111
+ }
112
+ console.log('');
113
+ }
114
+ function runtimeGuardCommand(program) {
115
+ const guard = program
116
+ .command('guard')
117
+ .description('Pre-generation runtime guardrail enforcement for deterministic governance');
118
+ guard
119
+ .command('start')
120
+ .description('Start runtime guard session from deterministic artifacts')
121
+ .option('--plan-id <id>', 'Plan ID override for runtime guard scope')
122
+ .option('--runtime-guard <path>', 'Runtime guard artifact path (default: .neurcode/runtime-guard.json)')
123
+ .option('--change-contract <path>', 'Change contract path (default: .neurcode/change-contract.json)')
124
+ .option('--compiled-policy <path>', 'Compiled policy path (default: neurcode.policy.compiled.json)')
125
+ .option('--strict', 'Require change contract + compiled policy artifacts (default)', true)
126
+ .option('--no-strict', 'Allow advisory runtime guard start without full deterministic artifacts')
127
+ .option('--json', 'Output machine-readable JSON')
128
+ .action((options) => {
129
+ const projectRoot = (0, project_root_1.resolveNeurcodeProjectRoot)(process.cwd());
130
+ const strict = options.strict !== false;
131
+ const changeContractRead = (0, change_contract_1.readChangeContract)(projectRoot, options.changeContract);
132
+ const compiledPolicyRead = (0, policy_compiler_1.readCompiledPolicyArtifact)(projectRoot, options.compiledPolicy);
133
+ const planId = (typeof options.planId === 'string' && options.planId.trim() ? options.planId.trim() : null)
134
+ || changeContractRead.contract?.planId
135
+ || (0, state_1.getActivePlanId)();
136
+ const errors = [];
137
+ if (strict && !changeContractRead.contract) {
138
+ errors.push(changeContractRead.error
139
+ ? `change contract invalid (${changeContractRead.error})`
140
+ : `change contract missing (${changeContractRead.path})`);
141
+ }
142
+ if (strict && !compiledPolicyRead.artifact) {
143
+ errors.push(compiledPolicyRead.error
144
+ ? `compiled policy invalid (${compiledPolicyRead.error})`
145
+ : `compiled policy missing (${compiledPolicyRead.path})`);
146
+ }
147
+ if (planId &&
148
+ changeContractRead.contract?.planId &&
149
+ planId !== changeContractRead.contract.planId) {
150
+ errors.push(`plan mismatch: requested ${planId}, change contract is ${changeContractRead.contract.planId}`);
151
+ }
152
+ const expectedFiles = changeContractRead.contract?.expectedFiles || [];
153
+ if (strict && expectedFiles.length === 0) {
154
+ errors.push('change contract has empty expected file scope');
155
+ }
156
+ if (strict && !planId) {
157
+ errors.push('planId missing (pass --plan-id or generate/import a plan contract first)');
158
+ }
159
+ if (errors.length > 0) {
160
+ if (options.json) {
161
+ emitJson(buildStartFailurePayload(errors));
162
+ }
163
+ else {
164
+ console.error(chalk.red('\n❌ Runtime guard start failed\n'));
165
+ for (const entry of errors) {
166
+ console.error(chalk.red(`• ${entry}`));
167
+ }
168
+ console.error('');
169
+ }
170
+ process.exit(1);
171
+ }
172
+ const deterministicRules = compiledPolicyRead.artifact
173
+ ? (0, policy_compiler_1.hydrateCompiledPolicyRules)(compiledPolicyRead.artifact)
174
+ : [];
175
+ const artifact = (0, runtime_guard_1.createRuntimeGuardArtifact)({
176
+ mode: strict ? 'strict' : 'advisory',
177
+ planId,
178
+ sessionId: (0, state_1.getSessionId)(),
179
+ projectId: (0, state_1.getProjectId)(),
180
+ changeContractPath: changeContractRead.contract ? changeContractRead.path : null,
181
+ changeContractId: changeContractRead.contract?.contractId || null,
182
+ changeContractExpectedFilesFingerprint: changeContractRead.contract?.expectedFilesFingerprint || null,
183
+ compiledPolicyPath: compiledPolicyRead.artifact ? compiledPolicyRead.path : null,
184
+ compiledPolicyFingerprint: compiledPolicyRead.artifact?.fingerprint || null,
185
+ expectedFiles,
186
+ deterministicRules,
187
+ unmatchedStatements: compiledPolicyRead.artifact?.compilation.unmatchedStatements || [],
188
+ });
189
+ const writtenPath = (0, runtime_guard_1.writeRuntimeGuardArtifact)(projectRoot, artifact, options.runtimeGuard);
190
+ if (options.json) {
191
+ emitJson({
192
+ success: true,
193
+ message: 'Runtime guard started.',
194
+ path: writtenPath,
195
+ guard: {
196
+ guardId: artifact.guardId,
197
+ mode: artifact.mode,
198
+ active: artifact.active,
199
+ planId: artifact.source.planId,
200
+ expectedFiles: artifact.expectedFiles.length,
201
+ deterministicRules: artifact.deterministic.ruleCount,
202
+ unmatchedStatements: artifact.deterministic.unmatchedStatements.length,
203
+ },
204
+ });
205
+ return;
206
+ }
207
+ console.log(chalk.bold.cyan('\n🧱 Runtime Guard Started\n'));
208
+ console.log(chalk.green(`Path: ${writtenPath}`));
209
+ console.log(chalk.dim(`Guard ID: ${artifact.guardId}`));
210
+ console.log(chalk.dim(`Mode: ${artifact.mode}`));
211
+ console.log(chalk.dim(`Plan ID: ${artifact.source.planId || '(none)'}`));
212
+ console.log(chalk.dim(`Expected files: ${artifact.expectedFiles.length}`));
213
+ console.log(chalk.dim(`Deterministic rules: ${artifact.deterministic.ruleCount}`));
214
+ if (artifact.deterministic.unmatchedStatements.length > 0) {
215
+ console.log(chalk.yellow(`Unmatched deterministic statements: ${artifact.deterministic.unmatchedStatements.length}`));
216
+ }
217
+ console.log(chalk.dim('\nRun `neurcode guard check --staged` before commit to enforce runtime scope.\n'));
218
+ });
219
+ guard
220
+ .command('check')
221
+ .description('Check current diff against active runtime guard session')
222
+ .option('--runtime-guard <path>', 'Runtime guard artifact path (default: .neurcode/runtime-guard.json)')
223
+ .option('--staged', 'Check staged changes only')
224
+ .option('--head', 'Check working tree against HEAD')
225
+ .option('--base <ref>', 'Check working tree against specific git ref')
226
+ .option('--json', 'Output machine-readable JSON')
227
+ .action((options) => {
228
+ const projectRoot = (0, project_root_1.resolveNeurcodeProjectRoot)(process.cwd());
229
+ const guardRead = (0, runtime_guard_1.readRuntimeGuardArtifact)(projectRoot, options.runtimeGuard);
230
+ if (!guardRead.artifact) {
231
+ const message = guardRead.error
232
+ ? `Runtime guard invalid (${guardRead.error})`
233
+ : `Runtime guard not found (${guardRead.path})`;
234
+ if (options.json) {
235
+ emitJson({
236
+ success: false,
237
+ message,
238
+ path: guardRead.path,
239
+ });
240
+ }
241
+ else {
242
+ console.error(chalk.red(`\n❌ ${message}\n`));
243
+ }
244
+ process.exit(1);
245
+ }
246
+ const diffText = resolveDiffText(options);
247
+ const parsed = (0, diff_parser_1.parseDiff)(diffText);
248
+ const filtered = parsed.map((file) => ({
249
+ ...file,
250
+ path: normalizeRepoPath(file.path),
251
+ }));
252
+ const fileContents = {};
253
+ for (const file of filtered) {
254
+ const absolutePath = (0, path_1.resolve)(projectRoot, file.path);
255
+ if ((0, fs_1.existsSync)(absolutePath)) {
256
+ try {
257
+ fileContents[file.path] = (0, fs_1.readFileSync)(absolutePath, 'utf-8');
258
+ }
259
+ catch {
260
+ // Best-effort file content loading.
261
+ }
262
+ }
263
+ }
264
+ const baseEvaluation = (0, runtime_guard_1.evaluateRuntimeGuardArtifact)(guardRead.artifact, filtered, fileContents);
265
+ const sourceDriftViolations = evaluateSourceDrift(projectRoot, guardRead.artifact);
266
+ const violations = [...baseEvaluation.violations, ...sourceDriftViolations];
267
+ const pass = violations.length === 0;
268
+ const updatedArtifact = (0, runtime_guard_1.withRuntimeGuardCheckStats)(guardRead.artifact, {
269
+ blocked: !pass,
270
+ });
271
+ (0, runtime_guard_1.writeRuntimeGuardArtifact)(projectRoot, updatedArtifact, options.runtimeGuard);
272
+ if (options.json) {
273
+ emitJson({
274
+ success: pass,
275
+ pass,
276
+ guardId: updatedArtifact.guardId,
277
+ mode: updatedArtifact.mode,
278
+ path: guardRead.path,
279
+ changedFiles: baseEvaluation.changedFiles,
280
+ outOfScopeFiles: baseEvaluation.outOfScopeFiles,
281
+ constraintViolations: baseEvaluation.constraintViolations,
282
+ violations,
283
+ adherenceScore: baseEvaluation.adherenceScore,
284
+ plannedFilesModified: baseEvaluation.plannedFilesModified,
285
+ totalPlannedFiles: baseEvaluation.totalPlannedFiles,
286
+ stats: updatedArtifact.stats,
287
+ message: pass
288
+ ? 'Runtime guard check passed.'
289
+ : `Runtime guard blocked ${violations.length} violation(s).`,
290
+ });
291
+ }
292
+ else if (pass) {
293
+ console.log(chalk.bold.cyan('\n🧱 Runtime Guard Check\n'));
294
+ console.log(chalk.green('✅ Pass'));
295
+ console.log(chalk.dim(`Changed files: ${baseEvaluation.changedFiles.length}`));
296
+ console.log(chalk.dim(`Scope adherence: ${baseEvaluation.adherenceScore}%`));
297
+ console.log('');
298
+ }
299
+ else {
300
+ console.log(chalk.bold.cyan('\n🧱 Runtime Guard Check\n'));
301
+ console.log(chalk.red(`⛔ Blocked (${violations.length} violation(s))`));
302
+ for (const violation of violations) {
303
+ const prefix = violation.file ? `${violation.file}: ` : '';
304
+ console.log(chalk.red(`• [${violation.code}] ${prefix}${violation.message}`));
305
+ }
306
+ console.log('');
307
+ }
308
+ process.exit(pass ? 0 : 1);
309
+ });
310
+ guard
311
+ .command('status')
312
+ .description('Show runtime guard session status')
313
+ .option('--runtime-guard <path>', 'Runtime guard artifact path (default: .neurcode/runtime-guard.json)')
314
+ .option('--json', 'Output machine-readable JSON')
315
+ .action((options) => {
316
+ const projectRoot = (0, project_root_1.resolveNeurcodeProjectRoot)(process.cwd());
317
+ const guardRead = (0, runtime_guard_1.readRuntimeGuardArtifact)(projectRoot, options.runtimeGuard);
318
+ if (!guardRead.artifact) {
319
+ const message = guardRead.error
320
+ ? `Runtime guard invalid (${guardRead.error})`
321
+ : `Runtime guard not found (${guardRead.path})`;
322
+ if (options.json) {
323
+ emitJson({
324
+ success: false,
325
+ path: guardRead.path,
326
+ message,
327
+ });
328
+ }
329
+ else {
330
+ console.error(chalk.red(`\n❌ ${message}\n`));
331
+ }
332
+ process.exit(1);
333
+ }
334
+ if (options.json) {
335
+ emitJson({
336
+ success: true,
337
+ path: guardRead.path,
338
+ guard: guardRead.artifact,
339
+ });
340
+ return;
341
+ }
342
+ printStatus(guardRead.path, guardRead.artifact);
343
+ });
344
+ guard
345
+ .command('stop')
346
+ .description('Stop the active runtime guard session')
347
+ .option('--runtime-guard <path>', 'Runtime guard artifact path (default: .neurcode/runtime-guard.json)')
348
+ .option('--json', 'Output machine-readable JSON')
349
+ .action((options) => {
350
+ const projectRoot = (0, project_root_1.resolveNeurcodeProjectRoot)(process.cwd());
351
+ const guardRead = (0, runtime_guard_1.readRuntimeGuardArtifact)(projectRoot, options.runtimeGuard);
352
+ if (!guardRead.artifact) {
353
+ const message = guardRead.error
354
+ ? `Runtime guard invalid (${guardRead.error})`
355
+ : `Runtime guard not found (${guardRead.path})`;
356
+ if (options.json) {
357
+ emitJson({
358
+ success: false,
359
+ path: guardRead.path,
360
+ message,
361
+ });
362
+ }
363
+ else {
364
+ console.error(chalk.red(`\n❌ ${message}\n`));
365
+ }
366
+ process.exit(1);
367
+ }
368
+ const stopped = (0, runtime_guard_1.markRuntimeGuardStopped)(guardRead.artifact);
369
+ const writtenPath = (0, runtime_guard_1.writeRuntimeGuardArtifact)(projectRoot, stopped, options.runtimeGuard);
370
+ if (options.json) {
371
+ emitJson({
372
+ success: true,
373
+ path: writtenPath,
374
+ guardId: stopped.guardId,
375
+ active: stopped.active,
376
+ archivedAt: stopped.archivedAt,
377
+ message: 'Runtime guard stopped.',
378
+ });
379
+ return;
380
+ }
381
+ console.log(chalk.bold.cyan('\n🧱 Runtime Guard Stopped\n'));
382
+ console.log(chalk.green(`Path: ${writtenPath}`));
383
+ console.log(chalk.dim(`Guard ID: ${stopped.guardId}`));
384
+ if (stopped.archivedAt) {
385
+ console.log(chalk.dim(`Archived at: ${stopped.archivedAt}`));
386
+ }
387
+ console.log('');
388
+ });
389
+ }
390
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/commands/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0KpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAknDpD"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/commands/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsLpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0vDpD"}
@@ -36,6 +36,16 @@ function toJsonPack(pack) {
36
36
  ruleCount: Array.isArray(pack.rules) ? pack.rules.length : 0,
37
37
  };
38
38
  }
39
+ const BOOTSTRAP_INTENT_BY_PACK = {
40
+ fintech: 'No payment bypass, no secret literals, and no unsafe migration shortcuts.',
41
+ hipaa: 'No PHI leakage in logs, no auth bypass, and no plaintext sensitive data handling.',
42
+ soc2: 'No auth bypass, no secret literals, and no CI/workflow integrity regressions.',
43
+ 'startup-fast': 'No secret literals, no unsafe debug backdoors, and keep changes scoped.',
44
+ node: 'No auth bypass, no secret literals, and no unsafe child_process shell execution.',
45
+ python: 'No credential leakage, no unsafe eval/exec patterns, and protect dependency boundaries.',
46
+ java: 'No auth bypass, no credential literals, and no insecure security-configuration drift.',
47
+ frontend: 'No client-side secret leakage, no unsafe DOM injection, and no auth-route bypass.',
48
+ };
39
49
  function loadPolicyRuntimeConfig() {
40
50
  const config = (0, config_1.loadConfig)();
41
51
  if (process.env.NEURCODE_API_KEY) {
@@ -108,7 +118,7 @@ async function resolveCustomPolicies(client, includeDashboardPolicies, requireDa
108
118
  function policyCommand(program) {
109
119
  const policy = program
110
120
  .command('policy')
111
- .description('Install and manage enterprise policy packs (fintech, hipaa, soc2, startup-fast)');
121
+ .description('Install and manage enterprise policy packs (fintech, hipaa, soc2, startup-fast, node, python, java, frontend)');
112
122
  policy
113
123
  .command('list')
114
124
  .description('List available policy packs')
@@ -204,6 +214,101 @@ function policyCommand(program) {
204
214
  process.exit(1);
205
215
  }
206
216
  });
217
+ policy
218
+ .command('bootstrap')
219
+ .description('Install a stack policy pack and generate lock + compiled artifact in one deterministic step')
220
+ .argument('<pack-id>', 'Policy pack ID')
221
+ .option('--force', 'Replace any existing installed policy pack')
222
+ .option('--intent <text>', 'Optional deterministic intent constraints for compilation')
223
+ .option('--include-dashboard', 'Include dashboard custom policies in lock + compile')
224
+ .option('--require-dashboard', 'Fail if dashboard custom policies cannot be loaded')
225
+ .option('--require-deterministic-match', 'Fail if any intent statement cannot be compiled into deterministic enforcement rules')
226
+ .option('--output <path>', 'Output file path (default: neurcode.policy.compiled.json)')
227
+ .option('--json', 'Output as JSON')
228
+ .action(async (packId, options) => {
229
+ const cwd = (0, project_root_1.resolveNeurcodeProjectRoot)(process.cwd());
230
+ const config = loadPolicyRuntimeConfig();
231
+ const client = new api_client_1.ApiClient(config);
232
+ try {
233
+ const installed = (0, policy_packs_1.installPolicyPack)(cwd, packId, options.force === true);
234
+ const includeDashboard = options.includeDashboard === true;
235
+ const customPolicyResolution = await resolveCustomPolicies(client, includeDashboard, options.requireDashboard === true);
236
+ const customRules = customPolicyResolution.includeDashboardPolicies
237
+ ? (0, custom_policy_rules_1.mapActiveCustomPoliciesToRules)(customPolicyResolution.customPolicies)
238
+ : [];
239
+ const snapshot = (0, policy_packs_1.buildPolicyStateSnapshot)({
240
+ policyPack: (0, policy_packs_1.getInstalledPolicyPackRules)(cwd),
241
+ policyPackRules: installed.rules,
242
+ customPolicies: customPolicyResolution.customPolicies,
243
+ customRules,
244
+ includeDashboardPolicies: customPolicyResolution.includeDashboardPolicies,
245
+ });
246
+ const lockPath = (0, policy_packs_1.writePolicyLockFile)(cwd, snapshot);
247
+ const resolvedIntent = (options.intent && options.intent.trim())
248
+ || BOOTSTRAP_INTENT_BY_PACK[installed.packId]
249
+ || '';
250
+ const compiledUnsigned = (0, policy_compiler_1.buildCompiledPolicyArtifact)({
251
+ includeDashboardPolicies: customPolicyResolution.includeDashboardPolicies,
252
+ policyLockPath: (0, policy_packs_1.getPolicyLockPath)(cwd),
253
+ policyLockFingerprint: snapshot.effective.fingerprint,
254
+ policyPack: {
255
+ id: installed.packId,
256
+ name: installed.packName,
257
+ version: installed.version,
258
+ },
259
+ defaultRuleCount: snapshot.defaultRules.count,
260
+ policyPackRuleCount: installed.rules.length,
261
+ customRuleCount: customRules.length,
262
+ effectiveRuleCount: snapshot.effective.ruleCount,
263
+ intentConstraints: resolvedIntent,
264
+ policyRules: customPolicyResolution.customPolicies.map((policy) => policy.rule_text),
265
+ });
266
+ const artifactSigningConfig = (0, artifact_signature_1.resolveGovernanceArtifactSigningConfigFromEnv)();
267
+ const compiled = (0, artifact_signature_1.signGovernanceArtifact)(compiledUnsigned, artifactSigningConfig);
268
+ if (options.requireDeterministicMatch === true
269
+ && compiled.compilation.unmatchedStatements.length > 0) {
270
+ throw new Error(`Deterministic policy compilation blocked: ${compiled.compilation.unmatchedStatements.length} intent statement(s) could not be converted into enforceable rules.`);
271
+ }
272
+ const artifactPath = (0, policy_compiler_1.writeCompiledPolicyArtifact)(cwd, compiled, options.output);
273
+ if (options.json) {
274
+ console.log(JSON.stringify({
275
+ bootstrap: {
276
+ packId: installed.packId,
277
+ packName: installed.packName,
278
+ version: installed.version,
279
+ lockPath,
280
+ compiledPolicyPath: artifactPath,
281
+ dashboardMode: compiled.source.includeDashboardPolicies ? 'dashboard' : 'disabled',
282
+ deterministicRuleCount: compiled.compilation.deterministicRuleCount,
283
+ unmatchedStatements: compiled.compilation.unmatchedStatements,
284
+ effectiveRuleCount: snapshot.effective.ruleCount,
285
+ },
286
+ warning: customPolicyResolution.dashboardWarning || null,
287
+ }, null, 2));
288
+ return;
289
+ }
290
+ console.log(chalk.green('\n✅ Policy bootstrap complete\n'));
291
+ console.log(chalk.cyan(`Pack: ${installed.packName}`) + chalk.dim(` (${installed.packId}@${installed.version})`));
292
+ console.log(chalk.dim(`Lock baseline: ${lockPath}`));
293
+ console.log(chalk.dim(`Compiled artifact: ${artifactPath}`));
294
+ console.log(chalk.dim(`Effective rules: ${snapshot.effective.ruleCount}`));
295
+ console.log(chalk.dim(`Deterministic compiled rules: ${compiled.compilation.deterministicRuleCount}`));
296
+ console.log(chalk.dim(`Unmatched intent statements: ${compiled.compilation.unmatchedStatements.length}`));
297
+ if (customPolicyResolution.dashboardWarning) {
298
+ console.log(chalk.yellow(`\n⚠️ ${customPolicyResolution.dashboardWarning}`));
299
+ }
300
+ console.log(chalk.dim('\nNext: run `neurcode verify --record --compiled-policy neurcode.policy.compiled.json --enforce-change-contract --strict-artifacts`.\n'));
301
+ }
302
+ catch (error) {
303
+ const message = error instanceof Error ? error.message : 'Unknown error';
304
+ if (options.json) {
305
+ console.log(JSON.stringify({ error: message }, null, 2));
306
+ process.exit(1);
307
+ }
308
+ console.error(chalk.red(`\n❌ ${message}\n`));
309
+ process.exit(1);
310
+ }
311
+ });
207
312
  policy
208
313
  .command('uninstall')
209
314
  .description('Remove the installed policy pack from this repository')