@neurcode-ai/cli 0.9.35 → 0.9.37

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 (62) hide show
  1. package/README.md +4 -2
  2. package/dist/api-client.d.ts +345 -1
  3. package/dist/api-client.d.ts.map +1 -1
  4. package/dist/api-client.js +237 -9
  5. package/dist/api-client.js.map +1 -1
  6. package/dist/commands/audit.d.ts +3 -0
  7. package/dist/commands/audit.d.ts.map +1 -0
  8. package/dist/commands/audit.js +133 -0
  9. package/dist/commands/audit.js.map +1 -0
  10. package/dist/commands/contract.d.ts +3 -0
  11. package/dist/commands/contract.d.ts.map +1 -0
  12. package/dist/commands/contract.js +235 -0
  13. package/dist/commands/contract.js.map +1 -0
  14. package/dist/commands/feedback.d.ts +3 -0
  15. package/dist/commands/feedback.d.ts.map +1 -0
  16. package/dist/commands/feedback.js +208 -0
  17. package/dist/commands/feedback.js.map +1 -0
  18. package/dist/commands/plan.d.ts.map +1 -1
  19. package/dist/commands/plan.js +19 -3
  20. package/dist/commands/plan.js.map +1 -1
  21. package/dist/commands/policy.d.ts.map +1 -1
  22. package/dist/commands/policy.js +611 -26
  23. package/dist/commands/policy.js.map +1 -1
  24. package/dist/commands/remediate.d.ts +17 -0
  25. package/dist/commands/remediate.d.ts.map +1 -0
  26. package/dist/commands/remediate.js +252 -0
  27. package/dist/commands/remediate.js.map +1 -0
  28. package/dist/commands/ship.d.ts.map +1 -1
  29. package/dist/commands/ship.js +67 -14
  30. package/dist/commands/ship.js.map +1 -1
  31. package/dist/commands/verify.d.ts +14 -0
  32. package/dist/commands/verify.d.ts.map +1 -1
  33. package/dist/commands/verify.js +564 -14
  34. package/dist/commands/verify.js.map +1 -1
  35. package/dist/index.js +94 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/utils/artifact-signature.d.ts +34 -0
  38. package/dist/utils/artifact-signature.d.ts.map +1 -0
  39. package/dist/utils/artifact-signature.js +229 -0
  40. package/dist/utils/artifact-signature.js.map +1 -0
  41. package/dist/utils/change-contract.d.ts +2 -0
  42. package/dist/utils/change-contract.d.ts.map +1 -1
  43. package/dist/utils/change-contract.js +21 -1
  44. package/dist/utils/change-contract.js.map +1 -1
  45. package/dist/utils/policy-compiler.d.ts +2 -0
  46. package/dist/utils/policy-compiler.d.ts.map +1 -1
  47. package/dist/utils/policy-compiler.js +15 -0
  48. package/dist/utils/policy-compiler.js.map +1 -1
  49. package/dist/utils/policy-exceptions.d.ts +11 -1
  50. package/dist/utils/policy-exceptions.d.ts.map +1 -1
  51. package/dist/utils/policy-exceptions.js +94 -6
  52. package/dist/utils/policy-exceptions.js.map +1 -1
  53. package/dist/utils/policy-governance.d.ts +22 -1
  54. package/dist/utils/policy-governance.d.ts.map +1 -1
  55. package/dist/utils/policy-governance.js +178 -14
  56. package/dist/utils/policy-governance.js.map +1 -1
  57. package/dist/utils/policy-packs.d.ts +1 -1
  58. package/dist/utils/policy-packs.d.ts.map +1 -1
  59. package/dist/utils/policy-packs.js +185 -0
  60. package/dist/utils/policy-packs.js.map +1 -1
  61. package/package.json +15 -13
  62. package/LICENSE +0 -201
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.contractCommand = contractCommand;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const api_client_1 = require("../api-client");
7
+ const config_1 = require("../config");
8
+ const project_root_1 = require("../utils/project-root");
9
+ const state_1 = require("../utils/state");
10
+ const policy_packs_1 = require("../utils/policy-packs");
11
+ const policy_compiler_1 = require("../utils/policy-compiler");
12
+ const change_contract_1 = require("../utils/change-contract");
13
+ const artifact_signature_1 = require("../utils/artifact-signature");
14
+ let chalk;
15
+ try {
16
+ chalk = require('chalk');
17
+ }
18
+ catch {
19
+ chalk = {
20
+ green: (value) => value,
21
+ yellow: (value) => value,
22
+ red: (value) => value,
23
+ bold: (value) => value,
24
+ dim: (value) => value,
25
+ cyan: (value) => value,
26
+ };
27
+ }
28
+ function emitJson(payload) {
29
+ console.log(JSON.stringify(payload, null, 2));
30
+ }
31
+ function hasPersistedPlanId(planId) {
32
+ return typeof planId === 'string' && planId.trim().length > 0 && planId !== 'unknown';
33
+ }
34
+ async function readStdinText() {
35
+ return new Promise((resolvePromise, reject) => {
36
+ const chunks = [];
37
+ process.stdin.setEncoding('utf-8');
38
+ process.stdin.on('data', (chunk) => {
39
+ chunks.push(String(chunk));
40
+ });
41
+ process.stdin.on('error', reject);
42
+ process.stdin.on('end', () => {
43
+ resolvePromise(chunks.join(''));
44
+ });
45
+ process.stdin.resume();
46
+ });
47
+ }
48
+ function parseAsJsonIfPossible(raw) {
49
+ const trimmed = raw.trim();
50
+ if (!trimmed)
51
+ return null;
52
+ try {
53
+ return JSON.parse(trimmed);
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ async function resolveImportPayload(projectRoot, options) {
60
+ if (options.text && options.text.trim()) {
61
+ return {
62
+ source: 'inline',
63
+ planText: options.text.trim(),
64
+ };
65
+ }
66
+ if (options.input && options.input.trim()) {
67
+ const inputPath = (0, path_1.resolve)(projectRoot, options.input.trim());
68
+ if (!(0, fs_1.existsSync)(inputPath)) {
69
+ throw new Error(`Input file not found: ${inputPath}`);
70
+ }
71
+ const raw = (0, fs_1.readFileSync)(inputPath, 'utf-8');
72
+ const parsed = parseAsJsonIfPossible(raw);
73
+ if (parsed !== null) {
74
+ return {
75
+ source: 'file',
76
+ planJson: parsed,
77
+ };
78
+ }
79
+ return {
80
+ source: 'file',
81
+ planText: raw,
82
+ };
83
+ }
84
+ const shouldReadStdin = options.stdin === true || !process.stdin.isTTY;
85
+ if (shouldReadStdin) {
86
+ const raw = await readStdinText();
87
+ if (!raw.trim()) {
88
+ throw new Error('Stdin was empty. Provide plan text or JSON via stdin.');
89
+ }
90
+ const parsed = parseAsJsonIfPossible(raw);
91
+ if (parsed !== null) {
92
+ return {
93
+ source: 'stdin',
94
+ planJson: parsed,
95
+ };
96
+ }
97
+ return {
98
+ source: 'stdin',
99
+ planText: raw,
100
+ };
101
+ }
102
+ throw new Error('Provide one of --text, --input <path>, or --stdin to import an external plan.');
103
+ }
104
+ function contractCommand(program) {
105
+ const contract = program
106
+ .command('contract')
107
+ .description('Manage imported intent/change contracts from external AI planners');
108
+ contract
109
+ .command('import')
110
+ .description('Import an external AI-generated implementation plan and bind it to Neurcode verify flow')
111
+ .option('--provider <provider>', 'Plan source provider (claude | cursor | codex | chatgpt | generic)', 'generic')
112
+ .option('--project-id <id>', 'Project ID override')
113
+ .option('--intent <text>', 'Intent override for imported plan')
114
+ .option('--title <text>', 'Title override for imported plan')
115
+ .option('--input <path>', 'Read plan payload from file (JSON or markdown/text)')
116
+ .option('--text <payload>', 'Inline plan payload (JSON or plain text)')
117
+ .option('--stdin', 'Read plan payload from stdin')
118
+ .option('--no-write-change-contract', 'Skip writing .neurcode/change-contract.json')
119
+ .option('--json', 'Output machine-readable JSON')
120
+ .action(async (options) => {
121
+ const projectRoot = (0, project_root_1.resolveNeurcodeProjectRoot)(process.cwd());
122
+ const startedAt = Date.now();
123
+ try {
124
+ const config = (0, config_1.loadConfig)();
125
+ if (!config.apiKey) {
126
+ config.apiKey = (0, config_1.requireApiKey)();
127
+ }
128
+ const client = new api_client_1.ApiClient(config);
129
+ const payload = await resolveImportPayload(projectRoot, options);
130
+ const response = await client.importExternalPlan({
131
+ provider: options.provider,
132
+ projectId: options.projectId,
133
+ intent: options.intent,
134
+ title: options.title,
135
+ planText: payload.planText,
136
+ planJson: payload.planJson,
137
+ });
138
+ let changeContractPayload = null;
139
+ if (options.writeChangeContract !== false && hasPersistedPlanId(response.planId)) {
140
+ const expectedFiles = response.plan.files
141
+ .filter((file) => file.action !== 'BLOCK')
142
+ .map((file) => file.path);
143
+ const policyLock = (0, policy_packs_1.readPolicyLockFile)(projectRoot);
144
+ const compiledPolicy = (0, policy_compiler_1.readCompiledPolicyArtifact)(projectRoot);
145
+ const unsignedContract = (0, change_contract_1.createChangeContract)({
146
+ planId: response.planId,
147
+ sessionId: response.sessionId || null,
148
+ projectId: options.projectId || null,
149
+ intent: options.intent || response.plan.summary || 'imported-plan',
150
+ expectedFiles,
151
+ policyLockFingerprint: policyLock.lock?.effective.fingerprint || null,
152
+ compiledPolicyFingerprint: compiledPolicy.artifact?.fingerprint || null,
153
+ });
154
+ const signedContract = (0, artifact_signature_1.signGovernanceArtifact)(unsignedContract, (0, artifact_signature_1.resolveGovernanceArtifactSigningConfigFromEnv)());
155
+ const contractPath = (0, change_contract_1.writeChangeContract)(projectRoot, signedContract);
156
+ changeContractPayload = {
157
+ id: signedContract.contractId,
158
+ path: contractPath,
159
+ };
160
+ }
161
+ if (hasPersistedPlanId(response.planId)) {
162
+ (0, state_1.setActivePlanId)(response.planId);
163
+ (0, state_1.setLastPlanGeneratedAt)(new Date().toISOString());
164
+ }
165
+ if (response.sessionId && typeof response.sessionId === 'string') {
166
+ (0, state_1.setSessionId)(response.sessionId);
167
+ }
168
+ if (options.json) {
169
+ emitJson({
170
+ success: true,
171
+ provider: response.provider,
172
+ planId: response.planId,
173
+ sessionId: response.sessionId || null,
174
+ projectId: options.projectId || null,
175
+ parseMode: response.parseMode,
176
+ importedFiles: response.importedFiles,
177
+ warnings: response.warnings || [],
178
+ changeContract: changeContractPayload,
179
+ message: response.message,
180
+ timestamp: response.timestamp,
181
+ plan: response.plan,
182
+ });
183
+ return;
184
+ }
185
+ console.log(chalk.bold.cyan('\n📥 Neurcode Contract Import\n'));
186
+ console.log(chalk.dim(`Provider: ${response.provider}`));
187
+ console.log(chalk.dim(`Parse mode: ${response.parseMode}`));
188
+ console.log(chalk.dim(`Imported files: ${response.importedFiles}`));
189
+ if (response.planId) {
190
+ console.log(chalk.green(`Plan ID: ${response.planId}`));
191
+ }
192
+ if (response.sessionId) {
193
+ console.log(chalk.dim(`Session ID: ${response.sessionId}`));
194
+ }
195
+ if (changeContractPayload) {
196
+ console.log(chalk.dim(`Change contract: ${changeContractPayload.path}`));
197
+ }
198
+ if ((response.warnings || []).length > 0) {
199
+ console.log(chalk.yellow('\nWarnings:'));
200
+ for (const warning of response.warnings) {
201
+ console.log(chalk.yellow(` • ${warning}`));
202
+ }
203
+ }
204
+ console.log(chalk.green(`\n✅ ${response.message}`));
205
+ console.log(chalk.dim(`Completed in ${Date.now() - startedAt}ms\n`));
206
+ console.log(chalk.dim('Next: run `neurcode verify --record --enforce-change-contract`'));
207
+ }
208
+ catch (error) {
209
+ const message = error instanceof Error ? error.message : 'Unknown error';
210
+ if (options.json) {
211
+ emitJson({
212
+ success: false,
213
+ provider: options.provider || null,
214
+ planId: null,
215
+ sessionId: null,
216
+ projectId: options.projectId || null,
217
+ parseMode: null,
218
+ importedFiles: 0,
219
+ warnings: [],
220
+ changeContract: null,
221
+ message,
222
+ timestamp: new Date().toISOString(),
223
+ });
224
+ process.exit(1);
225
+ }
226
+ console.error(chalk.red(`\n❌ Contract import failed: ${message}\n`));
227
+ console.log(chalk.dim('Provide one of: --text, --input <path>, or --stdin'));
228
+ console.log(chalk.dim('Examples:'));
229
+ console.log(chalk.dim(' neurcode contract import --provider claude --input ./plan.md'));
230
+ console.log(chalk.dim(' cat plan.json | neurcode contract import --provider cursor --stdin\n'));
231
+ process.exit(1);
232
+ }
233
+ });
234
+ }
235
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/commands/contract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function feedbackCommand(program: Command): void;
3
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8JtD"}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.feedbackCommand = feedbackCommand;
4
+ const api_client_1 = require("../api-client");
5
+ const config_1 = require("../config");
6
+ let chalk;
7
+ try {
8
+ chalk = require('chalk');
9
+ }
10
+ catch {
11
+ chalk = {
12
+ green: (value) => value,
13
+ yellow: (value) => value,
14
+ red: (value) => value,
15
+ bold: (value) => value,
16
+ dim: (value) => value,
17
+ cyan: (value) => value,
18
+ };
19
+ }
20
+ function normalizeFeedbackType(value) {
21
+ if (!value)
22
+ return null;
23
+ const normalized = value.trim().toLowerCase();
24
+ if (normalized === 'false_positive'
25
+ || normalized === 'false_negative'
26
+ || normalized === 'true_positive'
27
+ || normalized === 'accepted_risk') {
28
+ return normalized;
29
+ }
30
+ return null;
31
+ }
32
+ function normalizeReviewDecision(value) {
33
+ if (!value)
34
+ return null;
35
+ const normalized = value.trim().toLowerCase();
36
+ if (normalized === 'approved' || normalized === 'rejected') {
37
+ return normalized;
38
+ }
39
+ return null;
40
+ }
41
+ function normalizeReviewStatus(value) {
42
+ if (!value)
43
+ return null;
44
+ const normalized = value.trim().toLowerCase();
45
+ if (normalized === 'pending' || normalized === 'approved' || normalized === 'rejected') {
46
+ return normalized;
47
+ }
48
+ return null;
49
+ }
50
+ function createClient() {
51
+ const config = (0, config_1.loadConfig)();
52
+ if (!config.apiKey) {
53
+ config.apiKey = (0, config_1.requireApiKey)();
54
+ }
55
+ return new api_client_1.ApiClient(config);
56
+ }
57
+ function feedbackCommand(program) {
58
+ const feedback = program
59
+ .command('feedback')
60
+ .description('Submit and review verification finding feedback (FP/FN governance loop)');
61
+ feedback
62
+ .command('submit')
63
+ .description('Submit feedback for a verification finding')
64
+ .argument('<verification-id>', 'Verification ID from action verifications')
65
+ .requiredOption('--type <feedback-type>', 'false_positive | false_negative | true_positive | accepted_risk')
66
+ .requiredOption('--reason <text>', 'Reason for feedback (what was wrong/right)')
67
+ .option('--finding-key <key>', 'Optional deterministic finding key')
68
+ .option('--rule <rule>', 'Rule identifier')
69
+ .option('--file <path>', 'File path for this finding')
70
+ .option('--severity <level>', 'Severity label')
71
+ .option('--suggested-adjustment <text>', 'Suggested policy/rule adjustment')
72
+ .option('--json', 'Output machine-readable JSON')
73
+ .action(async (verificationId, options) => {
74
+ try {
75
+ const feedbackType = normalizeFeedbackType(options.type);
76
+ const reason = typeof options.reason === 'string' ? options.reason.trim() : '';
77
+ if (!feedbackType) {
78
+ throw new Error('Invalid --type. Use: false_positive, false_negative, true_positive, accepted_risk');
79
+ }
80
+ if (!reason || reason.length < 8) {
81
+ throw new Error('reason must be at least 8 characters');
82
+ }
83
+ const client = createClient();
84
+ const created = await client.submitVerificationFeedback(verificationId, {
85
+ feedbackType,
86
+ reason,
87
+ findingKey: typeof options.findingKey === 'string' ? options.findingKey : undefined,
88
+ rule: typeof options.rule === 'string' ? options.rule : undefined,
89
+ filePath: typeof options.file === 'string' ? options.file : undefined,
90
+ severity: typeof options.severity === 'string' ? options.severity : undefined,
91
+ suggestedAdjustment: typeof options.suggestedAdjustment === 'string' ? options.suggestedAdjustment : undefined,
92
+ });
93
+ if (options.json === true) {
94
+ console.log(JSON.stringify({ success: true, feedback: created }, null, 2));
95
+ return;
96
+ }
97
+ console.log(chalk.bold.cyan('\n🧾 Feedback Submitted\n'));
98
+ console.log(chalk.green(`ID: ${created.id}`));
99
+ console.log(chalk.dim(`Type: ${created.feedbackType}`));
100
+ console.log(chalk.dim(`Review status: ${created.reviewStatus}`));
101
+ console.log(chalk.dim(`Created at: ${new Date(created.createdAt).toLocaleString()}\n`));
102
+ }
103
+ catch (error) {
104
+ const message = error instanceof Error ? error.message : 'Unknown error';
105
+ if (options.json === true) {
106
+ console.log(JSON.stringify({ success: false, message }, null, 2));
107
+ }
108
+ else {
109
+ console.error(chalk.red(`\n❌ Feedback submit failed: ${message}\n`));
110
+ }
111
+ process.exit(1);
112
+ }
113
+ });
114
+ feedback
115
+ .command('list')
116
+ .description('List submitted feedback for a verification')
117
+ .argument('<verification-id>', 'Verification ID from action verifications')
118
+ .option('--status <status>', 'pending | approved | rejected')
119
+ .option('--limit <n>', 'Maximum feedback rows (default: 100)', (value) => parseInt(value, 10))
120
+ .option('--json', 'Output machine-readable JSON')
121
+ .action(async (verificationId, options) => {
122
+ try {
123
+ const reviewStatus = normalizeReviewStatus(options.status);
124
+ if (options.status && !reviewStatus) {
125
+ throw new Error('Invalid --status. Use: pending, approved, rejected');
126
+ }
127
+ const client = createClient();
128
+ const rows = await client.listVerificationFeedback(verificationId, {
129
+ reviewStatus: reviewStatus || undefined,
130
+ limit: Number.isFinite(options.limit) ? options.limit : undefined,
131
+ });
132
+ if (options.json === true) {
133
+ console.log(JSON.stringify({ success: true, count: rows.length, feedback: rows }, null, 2));
134
+ return;
135
+ }
136
+ console.log(chalk.bold.cyan('\n🧾 Verification Feedback\n'));
137
+ if (rows.length === 0) {
138
+ console.log(chalk.yellow('No feedback entries found for this verification.\n'));
139
+ return;
140
+ }
141
+ for (const row of rows) {
142
+ console.log(chalk.white(`• ${row.id}`));
143
+ console.log(chalk.dim(` Type: ${row.feedbackType} | Status: ${row.reviewStatus}`));
144
+ if (row.rule)
145
+ console.log(chalk.dim(` Rule: ${row.rule}`));
146
+ if (row.filePath)
147
+ console.log(chalk.dim(` File: ${row.filePath}`));
148
+ console.log(chalk.dim(` Reason: ${row.reason}`));
149
+ console.log(chalk.dim(` Submitted: ${new Date(row.createdAt).toLocaleString()}`));
150
+ if (row.reviewedAt) {
151
+ console.log(chalk.dim(` Reviewed: ${new Date(row.reviewedAt).toLocaleString()}`));
152
+ }
153
+ console.log('');
154
+ }
155
+ }
156
+ catch (error) {
157
+ const message = error instanceof Error ? error.message : 'Unknown error';
158
+ if (options.json === true) {
159
+ console.log(JSON.stringify({ success: false, message }, null, 2));
160
+ }
161
+ else {
162
+ console.error(chalk.red(`\n❌ Feedback list failed: ${message}\n`));
163
+ }
164
+ process.exit(1);
165
+ }
166
+ });
167
+ feedback
168
+ .command('review')
169
+ .description('Admin/owner review decision on submitted feedback')
170
+ .argument('<verification-id>', 'Verification ID from action verifications')
171
+ .argument('<feedback-id>', 'Feedback entry ID')
172
+ .requiredOption('--decision <decision>', 'approved | rejected')
173
+ .option('--note <text>', 'Optional review note')
174
+ .option('--json', 'Output machine-readable JSON')
175
+ .action(async (verificationId, feedbackId, options) => {
176
+ try {
177
+ const decision = normalizeReviewDecision(options.decision);
178
+ if (!decision) {
179
+ throw new Error('Invalid --decision. Use: approved or rejected');
180
+ }
181
+ const client = createClient();
182
+ const reviewed = await client.reviewVerificationFeedback(verificationId, feedbackId, {
183
+ decision,
184
+ reviewNote: typeof options.note === 'string' ? options.note : undefined,
185
+ });
186
+ if (options.json === true) {
187
+ console.log(JSON.stringify({ success: true, feedback: reviewed }, null, 2));
188
+ return;
189
+ }
190
+ console.log(chalk.bold.cyan('\n✅ Feedback Reviewed\n'));
191
+ console.log(chalk.green(`ID: ${reviewed.id}`));
192
+ console.log(chalk.dim(`Decision: ${reviewed.reviewStatus}`));
193
+ console.log(chalk.dim(`Reviewer: ${reviewed.reviewerUserId || 'n/a'}`));
194
+ console.log(chalk.dim(`Reviewed at: ${reviewed.reviewedAt ? new Date(reviewed.reviewedAt).toLocaleString() : 'n/a'}\n`));
195
+ }
196
+ catch (error) {
197
+ const message = error instanceof Error ? error.message : 'Unknown error';
198
+ if (options.json === true) {
199
+ console.log(JSON.stringify({ success: false, message }, null, 2));
200
+ }
201
+ else {
202
+ console.error(chalk.red(`\n❌ Feedback review failed: ${message}\n`));
203
+ }
204
+ process.exit(1);
205
+ }
206
+ });
207
+ }
208
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAoEA,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6kBD,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,UAAU,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAwB3D;AA0cD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,iBAglDrE"}
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAwEA,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IACvC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6kBD,MAAM,MAAM,UAAU,GAAG,gBAAgB,GAAG,UAAU,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAwB3D;AA8cD,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,iBAimDrE"}
@@ -54,6 +54,7 @@ const plan_slo_1 = require("../utils/plan-slo");
54
54
  const change_contract_1 = require("../utils/change-contract");
55
55
  const policy_packs_1 = require("../utils/policy-packs");
56
56
  const policy_compiler_1 = require("../utils/policy-compiler");
57
+ const artifact_signature_1 = require("../utils/artifact-signature");
57
58
  // Import chalk with fallback for plain strings if not available
58
59
  let chalk;
59
60
  try {
@@ -820,7 +821,7 @@ function emitPlanJson(payload) {
820
821
  const merged = activePlanScopeTelemetry
821
822
  ? { ...payload, scope: activePlanScopeTelemetry }
822
823
  : payload;
823
- console.log(JSON.stringify(merged, null, 2));
824
+ process.stdout.write(`${JSON.stringify(merged, null, 2)}\n`);
824
825
  }
825
826
  function emitCachedPlanHit(input) {
826
827
  if (input.touchKey) {
@@ -847,7 +848,7 @@ function emitCachedPlanHit(input) {
847
848
  .map((file) => file.path);
848
849
  const lockRead = (0, policy_packs_1.readPolicyLockFile)(input.cwd);
849
850
  const compiledPolicyRead = (0, policy_compiler_1.readCompiledPolicyArtifact)(input.cwd);
850
- const changeContract = (0, change_contract_1.createChangeContract)({
851
+ const unsignedChangeContract = (0, change_contract_1.createChangeContract)({
851
852
  planId: input.response.planId,
852
853
  sessionId: input.response.sessionId || null,
853
854
  projectId: input.projectId || null,
@@ -856,6 +857,7 @@ function emitCachedPlanHit(input) {
856
857
  policyLockFingerprint: lockRead.lock?.effective.fingerprint || null,
857
858
  compiledPolicyFingerprint: compiledPolicyRead.artifact?.fingerprint || null,
858
859
  });
860
+ const changeContract = (0, artifact_signature_1.signGovernanceArtifact)(unsignedChangeContract, (0, artifact_signature_1.resolveGovernanceArtifactSigningConfigFromEnv)());
859
861
  const contractPath = (0, change_contract_1.writeChangeContract)(input.cwd, changeContract);
860
862
  changeContractPayload = {
861
863
  id: changeContract.contractId,
@@ -919,6 +921,13 @@ function emitCachedPlanHit(input) {
919
921
  return persistedPlan;
920
922
  }
921
923
  async function planCommand(intent, options) {
924
+ const suppressHumanLogs = options.json === true;
925
+ const originalConsoleLog = console.log;
926
+ const originalConsoleWarn = console.warn;
927
+ if (suppressHumanLogs) {
928
+ console.log = (() => undefined);
929
+ console.warn = (() => undefined);
930
+ }
922
931
  const planStartedAtMs = Date.now();
923
932
  let planRootForSlo = (0, path_1.resolve)(process.cwd());
924
933
  try {
@@ -2269,7 +2278,7 @@ async function planCommand(intent, options) {
2269
2278
  .map((file) => file.path);
2270
2279
  const lockRead = (0, policy_packs_1.readPolicyLockFile)(cwd);
2271
2280
  const compiledPolicyRead = (0, policy_compiler_1.readCompiledPolicyArtifact)(cwd);
2272
- const changeContract = (0, change_contract_1.createChangeContract)({
2281
+ const unsignedChangeContract = (0, change_contract_1.createChangeContract)({
2273
2282
  planId: response.planId,
2274
2283
  sessionId: response.sessionId || null,
2275
2284
  projectId: finalProjectId || null,
@@ -2278,6 +2287,7 @@ async function planCommand(intent, options) {
2278
2287
  policyLockFingerprint: lockRead.lock?.effective.fingerprint || null,
2279
2288
  compiledPolicyFingerprint: compiledPolicyRead.artifact?.fingerprint || null,
2280
2289
  });
2290
+ const changeContract = (0, artifact_signature_1.signGovernanceArtifact)(unsignedChangeContract, (0, artifact_signature_1.resolveGovernanceArtifactSigningConfigFromEnv)());
2281
2291
  const path = (0, change_contract_1.writeChangeContract)(cwd, changeContract);
2282
2292
  generatedChangeContract = {
2283
2293
  id: changeContract.contractId,
@@ -2343,5 +2353,11 @@ async function planCommand(intent, options) {
2343
2353
  }
2344
2354
  process.exit(1);
2345
2355
  }
2356
+ finally {
2357
+ if (suppressHumanLogs) {
2358
+ console.log = originalConsoleLog;
2359
+ console.warn = originalConsoleWarn;
2360
+ }
2361
+ }
2346
2362
  }
2347
2363
  //# sourceMappingURL=plan.js.map