@neurcode-ai/cli 0.9.36 → 0.9.38
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/README.md +4 -2
- package/dist/api-client.d.ts +300 -1
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +225 -9
- package/dist/api-client.js.map +1 -1
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +133 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/contract.d.ts +3 -0
- package/dist/commands/contract.d.ts.map +1 -0
- package/dist/commands/contract.js +235 -0
- package/dist/commands/contract.js.map +1 -0
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +208 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +19 -3
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/policy.d.ts.map +1 -1
- package/dist/commands/policy.js +329 -6
- package/dist/commands/policy.js.map +1 -1
- package/dist/commands/remediate.d.ts +17 -0
- package/dist/commands/remediate.d.ts.map +1 -0
- package/dist/commands/remediate.js +252 -0
- package/dist/commands/remediate.js.map +1 -0
- package/dist/commands/ship.d.ts.map +1 -1
- package/dist/commands/ship.js +67 -14
- package/dist/commands/ship.js.map +1 -1
- package/dist/commands/verify.d.ts +12 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +477 -13
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/artifact-signature.d.ts +34 -0
- package/dist/utils/artifact-signature.d.ts.map +1 -0
- package/dist/utils/artifact-signature.js +229 -0
- package/dist/utils/artifact-signature.js.map +1 -0
- package/dist/utils/change-contract.d.ts +2 -0
- package/dist/utils/change-contract.d.ts.map +1 -1
- package/dist/utils/change-contract.js +21 -1
- package/dist/utils/change-contract.js.map +1 -1
- package/dist/utils/policy-compiler.d.ts +2 -0
- package/dist/utils/policy-compiler.d.ts.map +1 -1
- package/dist/utils/policy-compiler.js +15 -0
- package/dist/utils/policy-compiler.js.map +1 -1
- package/package.json +7 -7
|
@@ -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 @@
|
|
|
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":"
|
|
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"}
|
package/dist/commands/plan.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|