@formigio/fazemos-cli 0.10.74 → 0.10.75
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/approvals.d.ts +1 -1
- package/dist/approvals.js +50 -19
- package/dist/approvals.js.map +1 -1
- package/dist/index.js +37 -5
- package/dist/index.js.map +1 -1
- package/dist/pause.js +42 -11
- package/dist/pause.js.map +1 -1
- package/package.json +1 -1
package/dist/approvals.d.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* → GET /api/control-plane/approvals
|
|
10
10
|
* Returns pending approval gates for the active org.
|
|
11
11
|
*
|
|
12
|
-
* fazemos approvals resolve <id> --decision
|
|
12
|
+
* fazemos approvals resolve <id> --decision approved|rejected --reason <text> [--json]
|
|
13
13
|
* → POST /api/control-plane/approvals/:id/resolve
|
|
14
14
|
* Resolves an approval gate; sends surface='cli' for audit trail.
|
|
15
15
|
* --reason is mandatory (min 4 chars) — this is the CLI typed-token
|
package/dist/approvals.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* → GET /api/control-plane/approvals
|
|
10
10
|
* Returns pending approval gates for the active org.
|
|
11
11
|
*
|
|
12
|
-
* fazemos approvals resolve <id> --decision
|
|
12
|
+
* fazemos approvals resolve <id> --decision approved|rejected --reason <text> [--json]
|
|
13
13
|
* → POST /api/control-plane/approvals/:id/resolve
|
|
14
14
|
* Resolves an approval gate; sends surface='cli' for audit trail.
|
|
15
15
|
* --reason is mandatory (min 4 chars) — this is the CLI typed-token
|
|
@@ -33,10 +33,15 @@ import { api, ApiError, resolveProjectIdBySlug } from './api.js';
|
|
|
33
33
|
* Throws a user-facing error otherwise.
|
|
34
34
|
*/
|
|
35
35
|
function validateDecision(value) {
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
// Accept the natural verbs as aliases so existing muscle memory and scripts
|
|
37
|
+
// keep working, but send what the API validates.
|
|
38
|
+
const normalized = value === 'approve' || value === 'approved' ? 'approved' :
|
|
39
|
+
value === 'reject' || value === 'rejected' ? 'rejected' :
|
|
40
|
+
null;
|
|
41
|
+
if (!normalized) {
|
|
42
|
+
throw new Error(`--decision must be 'approved' or 'rejected', got: ${value}`);
|
|
38
43
|
}
|
|
39
|
-
return
|
|
44
|
+
return normalized;
|
|
40
45
|
}
|
|
41
46
|
/**
|
|
42
47
|
* Validate that --reason meets the minimum length requirement (4 chars).
|
|
@@ -212,7 +217,7 @@ export function registerApprovalsCommands(program) {
|
|
|
212
217
|
' 0 — resolved successfully\n' +
|
|
213
218
|
' 1 — validation error (missing/invalid flag) or API error (see error message)')
|
|
214
219
|
.argument('<id>', 'Approval gate ID (UUID)')
|
|
215
|
-
.requiredOption('--decision <
|
|
220
|
+
.requiredOption('--decision <approved|rejected>', "Decision: 'approved' or 'rejected' ('approve'/'reject' accepted as aliases)")
|
|
216
221
|
.requiredOption('--reason <text>', 'Reason for the decision (min 4 chars; recorded in audit trail)')
|
|
217
222
|
.option('--json', 'output machine-readable JSON (raw API response)')
|
|
218
223
|
.action(async (id, opts) => {
|
|
@@ -223,12 +228,13 @@ export function registerApprovalsCommands(program) {
|
|
|
223
228
|
const decision = validateDecision(opts.decision);
|
|
224
229
|
const reason = validateReason(opts.reason);
|
|
225
230
|
// ── POST /api/control-plane/approvals/:id/resolve ──────────────────
|
|
226
|
-
// Body
|
|
227
|
-
//
|
|
231
|
+
// Body keys must match what the route destructures: it reads
|
|
232
|
+
// `body.reason` (NOT reason_note), so the mandatory audit reason was
|
|
233
|
+
// being silently dropped and a reject 400'd with REASON_REQUIRED.
|
|
228
234
|
// surface='cli' propagates to via='cli' in the audit trail.
|
|
229
235
|
const body = {
|
|
230
236
|
decision,
|
|
231
|
-
|
|
237
|
+
reason,
|
|
232
238
|
surface: 'cli',
|
|
233
239
|
};
|
|
234
240
|
const data = await api('POST', `/api/control-plane/approvals/${encodeURIComponent(id)}/resolve`, body, { noProjectHeader: true });
|
|
@@ -237,18 +243,36 @@ export function registerApprovalsCommands(program) {
|
|
|
237
243
|
return;
|
|
238
244
|
}
|
|
239
245
|
// ── Human output ───────────────────────────────────────────────────
|
|
240
|
-
const decisionLabel = decision === '
|
|
246
|
+
const decisionLabel = decision === 'approved'
|
|
241
247
|
? chalk.green('approved')
|
|
242
248
|
: chalk.red('rejected');
|
|
249
|
+
const req = data.request;
|
|
250
|
+
// already_resolved is a 200, not an error — the API is idempotent here.
|
|
251
|
+
if (data.already_resolved) {
|
|
252
|
+
console.log(chalk.yellow('Gate was already resolved — nothing changed.'));
|
|
253
|
+
console.log();
|
|
254
|
+
console.log(` id: ${chalk.dim(req?.id ?? id)}`);
|
|
255
|
+
console.log(` status: ${chalk.dim(req?.status ?? '?')}`);
|
|
256
|
+
if (req?.resolved_at) {
|
|
257
|
+
console.log(` resolved_at: ${chalk.dim(new Date(req.resolved_at).toLocaleString())}`);
|
|
258
|
+
}
|
|
259
|
+
if (req?.resolved_via)
|
|
260
|
+
console.log(` via: ${chalk.dim(req.resolved_via)}`);
|
|
261
|
+
console.log();
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
243
264
|
console.log(chalk.bold(`Approval ${decisionLabel}`));
|
|
244
265
|
console.log();
|
|
245
|
-
console.log(` id: ${chalk.dim(
|
|
266
|
+
console.log(` id: ${chalk.dim(req?.id ?? id)}`);
|
|
246
267
|
console.log(` decision: ${decisionLabel}`);
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
if (
|
|
250
|
-
console.log();
|
|
251
|
-
|
|
268
|
+
if (req?.resolved_via)
|
|
269
|
+
console.log(` via: ${chalk.dim(req.resolved_via)}`);
|
|
270
|
+
if (req?.resolved_at) {
|
|
271
|
+
console.log(` resolved_at: ${new Date(req.resolved_at).toLocaleString()}`);
|
|
272
|
+
}
|
|
273
|
+
console.log(` pipeline: ${data.pipeline_resumed ? chalk.cyan('resumed') : chalk.dim('not resumed')}`);
|
|
274
|
+
if (data.denied_path_applied) {
|
|
275
|
+
console.log(` denied_path: ${chalk.yellow(data.denied_path_applied)}`);
|
|
252
276
|
}
|
|
253
277
|
console.log();
|
|
254
278
|
}
|
|
@@ -260,11 +284,18 @@ export function registerApprovalsCommands(program) {
|
|
|
260
284
|
if (err.code) {
|
|
261
285
|
console.error(chalk.dim(` code: ${err.code}`));
|
|
262
286
|
}
|
|
263
|
-
|
|
264
|
-
|
|
287
|
+
// Codes the API actually emits. The previous branches keyed on
|
|
288
|
+
// APPROVAL_ALREADY_RESOLVED / REJECT_REQUIRES_REASON, neither of
|
|
289
|
+
// which exists server-side (an already-resolved gate is a 200 with
|
|
290
|
+
// already_resolved:true, handled above).
|
|
291
|
+
if (err.code === 'REASON_REQUIRED') {
|
|
292
|
+
console.error(chalk.dim(' A reason is required when rejecting. Pass --reason "<text>".'));
|
|
293
|
+
}
|
|
294
|
+
else if (err.code === 'INVALID_DECISION') {
|
|
295
|
+
console.error(chalk.dim(" --decision must be 'approved' or 'rejected'."));
|
|
265
296
|
}
|
|
266
|
-
else if (err.code === '
|
|
267
|
-
console.error(chalk.dim('
|
|
297
|
+
else if (err.code === 'APPROVER_ROLE_REQUIRED') {
|
|
298
|
+
console.error(chalk.dim(' You do not hold the approver role for this gate in its org.'));
|
|
268
299
|
}
|
|
269
300
|
}
|
|
270
301
|
else {
|
package/dist/approvals.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../src/approvals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"approvals.js","sourceRoot":"","sources":["../src/approvals.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -212,7 +212,23 @@ program
|
|
|
212
212
|
// env var > the persisted active env. Lets one command (or, via the env var,
|
|
213
213
|
// a whole session) target a different environment without a shared-disk
|
|
214
214
|
// `fazemos env` switch that would clobber a concurrent session.
|
|
215
|
-
.option('--env <name>', 'Environment to use for this invocation (overrides FAZEMOS_ENV and the persisted active env)')
|
|
215
|
+
.option('--env <name>', 'Environment to use for this invocation (overrides FAZEMOS_ENV and the persisted active env)')
|
|
216
|
+
// SECURITY / CORRECTNESS: refuse stray operands, program-wide.
|
|
217
|
+
//
|
|
218
|
+
// Commander defaults allowExcessArguments to TRUE, which silently swallows
|
|
219
|
+
// any operand a command didn't declare. Two live consequences we hit:
|
|
220
|
+
//
|
|
221
|
+
// 1. `fazemos pause resume --reason x` ran the PARENT pause action — a
|
|
222
|
+
// fleet-wide control-plane write — because `resume` matched no
|
|
223
|
+
// subcommand and was simply dropped. Exit 0.
|
|
224
|
+
// 2. `fazemos use journeyjuntos/fazemos` silently ignored the argument
|
|
225
|
+
// (it takes -o/-p) and printed the current context instead, so the
|
|
226
|
+
// caller believed they had switched scope when they had not.
|
|
227
|
+
//
|
|
228
|
+
// Set BEFORE any .command() registration: Command.command() calls
|
|
229
|
+
// copyInheritedSettings(), which copies _allowExcessArguments, so every
|
|
230
|
+
// subcommand registered after this line inherits the strict behavior.
|
|
231
|
+
.allowExcessArguments(false);
|
|
216
232
|
// ── Directory-scoped default org/project (.fazemos.json) ─────
|
|
217
233
|
//
|
|
218
234
|
// Before any command action runs, discover the nearest `.fazemos.json`
|
|
@@ -257,8 +273,14 @@ async function applyDirContext(topCommand) {
|
|
|
257
273
|
setOrgOverride(await resolveOrgIdMaybeSlug(org));
|
|
258
274
|
}
|
|
259
275
|
catch {
|
|
260
|
-
//
|
|
261
|
-
//
|
|
276
|
+
// Do NOT fail silently. Leaving the override unset means the command
|
|
277
|
+
// runs against whatever `orgs switch` last persisted machine-globally —
|
|
278
|
+
// for a READ the API error eventually hints at it, but for a WRITE the
|
|
279
|
+
// command simply SUCCEEDS IN THE WRONG ORG. Say so, on stderr, so the
|
|
280
|
+
// operator can see the scope they think they pinned was not applied.
|
|
281
|
+
console.error(chalk.yellow(`Warning: .fazemos.json pins org '${org}' but it could not be resolved ` +
|
|
282
|
+
`(offline, wrong --env, stale cache, or a typo'd slug). ` +
|
|
283
|
+
`Falling back to the machine-global active org — verify with 'fazemos whoami' before writing.`));
|
|
262
284
|
}
|
|
263
285
|
}
|
|
264
286
|
if (project) {
|
|
@@ -269,12 +291,22 @@ async function applyDirContext(topCommand) {
|
|
|
269
291
|
else {
|
|
270
292
|
// Resolves against the active org, which now reflects the org override.
|
|
271
293
|
const projectId = await resolveProjectIdBySlug(project);
|
|
272
|
-
if (projectId)
|
|
294
|
+
if (projectId) {
|
|
273
295
|
setProjectOverride(projectId);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
// Resolver MISS, not a throw — the old code fell through here in
|
|
299
|
+
// silence, which is how a pinned scope quietly became the global one.
|
|
300
|
+
console.error(chalk.yellow(`Warning: .fazemos.json pins project '${project}' but no such project ` +
|
|
301
|
+
`exists in the active org. Falling back to the machine-global active project.`));
|
|
302
|
+
}
|
|
274
303
|
}
|
|
275
304
|
}
|
|
276
305
|
catch {
|
|
277
|
-
//
|
|
306
|
+
// Same hazard as the org branch above — warn rather than silently
|
|
307
|
+
// inheriting the machine-global project.
|
|
308
|
+
console.error(chalk.yellow(`Warning: .fazemos.json pins project '${project}' but it could not be resolved. ` +
|
|
309
|
+
`Falling back to the machine-global active project — verify with 'fazemos whoami' before writing.`));
|
|
278
310
|
}
|
|
279
311
|
}
|
|
280
312
|
}
|