@formigio/fazemos-cli 0.10.67 → 0.10.74

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 (48) hide show
  1. package/dist/commands/preflight.d.ts +41 -0
  2. package/dist/commands/preflight.js +706 -0
  3. package/dist/commands/preflight.js.map +1 -0
  4. package/dist/commands/provision.d.ts +29 -0
  5. package/dist/commands/provision.js +382 -0
  6. package/dist/commands/provision.js.map +1 -0
  7. package/dist/index.js +87 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/preflight/repoRead.d.ts +65 -0
  10. package/dist/preflight/repoRead.js +194 -0
  11. package/dist/preflight/repoRead.js.map +1 -0
  12. package/dist/preflight/roster.d.ts +65 -0
  13. package/dist/preflight/roster.js +153 -0
  14. package/dist/preflight/roster.js.map +1 -0
  15. package/dist/preflight/row1_member.d.ts +8 -0
  16. package/dist/preflight/row1_member.js +64 -0
  17. package/dist/preflight/row1_member.js.map +1 -0
  18. package/dist/preflight/row2_roleRegistration.d.ts +18 -0
  19. package/dist/preflight/row2_roleRegistration.js +156 -0
  20. package/dist/preflight/row2_roleRegistration.js.map +1 -0
  21. package/dist/preflight/row3_persona.d.ts +24 -0
  22. package/dist/preflight/row3_persona.js +92 -0
  23. package/dist/preflight/row3_persona.js.map +1 -0
  24. package/dist/preflight/row3_playbook.d.ts +30 -0
  25. package/dist/preflight/row3_playbook.js +142 -0
  26. package/dist/preflight/row3_playbook.js.map +1 -0
  27. package/dist/preflight/row3_rolesJson.d.ts +12 -0
  28. package/dist/preflight/row3_rolesJson.js +38 -0
  29. package/dist/preflight/row3_rolesJson.js.map +1 -0
  30. package/dist/preflight/row3_workspace.d.ts +24 -0
  31. package/dist/preflight/row3_workspace.js +253 -0
  32. package/dist/preflight/row3_workspace.js.map +1 -0
  33. package/dist/preflight/row4_ssm.d.ts +57 -0
  34. package/dist/preflight/row4_ssm.js +235 -0
  35. package/dist/preflight/row4_ssm.js.map +1 -0
  36. package/dist/preflight/row5_workerLambdaWakeConfig.d.ts +20 -0
  37. package/dist/preflight/row5_workerLambdaWakeConfig.js +113 -0
  38. package/dist/preflight/row5_workerLambdaWakeConfig.js.map +1 -0
  39. package/dist/preflight/row6_ingest.d.ts +20 -0
  40. package/dist/preflight/row6_ingest.js +178 -0
  41. package/dist/preflight/row6_ingest.js.map +1 -0
  42. package/dist/preflight/schema.d.ts +175 -0
  43. package/dist/preflight/schema.js +62 -0
  44. package/dist/preflight/schema.js.map +1 -0
  45. package/dist/preflight/workerLambdas.d.ts +22 -0
  46. package/dist/preflight/workerLambdas.js +25 -0
  47. package/dist/preflight/workerLambdas.js.map +1 -0
  48. package/package.json +1 -1
@@ -0,0 +1,113 @@
1
+ /**
2
+ * F53 Row 5 — Worker Lambda wake config check.
3
+ *
4
+ * For each Lambda in PREFLIGHT_WORKER_LAMBDAS, verifies that the function's
5
+ * environment variables include the required wake/SSM config keys
6
+ * (WAKE_ALLOWLIST_PARAM, etc.) — the BUG153 gap.
7
+ *
8
+ * Uses `aws lambda get-function-configuration --function-name <name>`
9
+ * (shells out via execSync, consistent with existing CLI pattern).
10
+ *
11
+ * D2: enumeration is hard-coded with visible staleness (printed on every run).
12
+ *
13
+ * Fix line for row 5 FAILs: honest docs-link (no fake executable command —
14
+ * Ollie A3, rul_f53_fix_command_honesty).
15
+ */
16
+ import { execSync } from 'child_process';
17
+ import { PREFLIGHT_WORKER_LAMBDAS, workerEnumerationSummary } from './workerLambdas.js';
18
+ /**
19
+ * Required env var keys that every dispatch-reaching worker Lambda must have.
20
+ */
21
+ const REQUIRED_ENV_KEYS = ['WAKE_ALLOWLIST_PARAM', 'AUTO_WAKEABLE_ROLES_PARAM'];
22
+ function getLambdaEnvVars(functionName, region) {
23
+ const regionFlag = region ? `--region ${region}` : '';
24
+ try {
25
+ const output = execSync(`aws lambda get-function-configuration --function-name "${functionName}" --query 'Environment.Variables' --output json ${regionFlag}`.trim(), { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
26
+ if (output === 'null' || !output)
27
+ return {};
28
+ return JSON.parse(output);
29
+ }
30
+ catch (err) {
31
+ const stderr = String(err.stderr ?? err.message ?? '');
32
+ if (stderr.includes('ResourceNotFoundException') ||
33
+ stderr.includes('Function not found') ||
34
+ stderr.includes('does not exist')) {
35
+ return 'not_found';
36
+ }
37
+ if (stderr.includes('Unable to locate credentials') ||
38
+ stderr.includes('ExpiredToken') ||
39
+ stderr.includes('NoCredentialProviders') ||
40
+ stderr.includes('AccessDenied') ||
41
+ stderr.includes('not authorized')) {
42
+ return 'tooling_error';
43
+ }
44
+ return 'tooling_error';
45
+ }
46
+ }
47
+ export async function checkRow5WorkerLambdaWakeConfig(opts) {
48
+ const { env, region } = opts;
49
+ const enumSummary = workerEnumerationSummary();
50
+ const failures = [];
51
+ const toolingErrors = [];
52
+ for (const worker of PREFLIGHT_WORKER_LAMBDAS) {
53
+ // Lambda function names: typically `fazemos-<env>-<suffix>`
54
+ const functionName = `fazemos-${env}-${worker.functionNameSuffix}`;
55
+ const envVars = getLambdaEnvVars(functionName, region);
56
+ if (envVars === 'tooling_error') {
57
+ toolingErrors.push(`${functionName}: AWS credential or access error`);
58
+ continue;
59
+ }
60
+ if (envVars === 'not_found') {
61
+ failures.push(`${functionName}: function not found`);
62
+ continue;
63
+ }
64
+ const missing = REQUIRED_ENV_KEYS.filter((k) => !envVars[k]);
65
+ if (missing.length > 0) {
66
+ failures.push(`${functionName}: missing env vars [${missing.join(', ')}]`);
67
+ }
68
+ }
69
+ if (toolingErrors.length > 0) {
70
+ return {
71
+ id: '5',
72
+ name: `worker Lambda wake config (${enumSummary})`,
73
+ status: 'tooling_error',
74
+ detail: toolingErrors.join('; '),
75
+ fix_command: null,
76
+ fix_instruction: 'Run: aws sso login --profile AdministratorAccess-047982206554',
77
+ enumerated: {
78
+ count: PREFLIGHT_WORKER_LAMBDAS.length,
79
+ last_audited: PREFLIGHT_WORKER_LAMBDAS[0]?.lastAudited ?? '2026-08-06',
80
+ entries: PREFLIGHT_WORKER_LAMBDAS.map((w) => ({ function_name_suffix: w.functionNameSuffix })),
81
+ },
82
+ };
83
+ }
84
+ if (failures.length > 0) {
85
+ return {
86
+ id: '5',
87
+ name: `worker Lambda wake config (${enumSummary})`,
88
+ status: 'fail',
89
+ detail: failures.join('; '),
90
+ fix_command: null,
91
+ fix_instruction: `fix: infra — see docs/guides/agent-provisioning-runbook.md §5 and BUG153. ` +
92
+ `Add WAKE_ALLOWLIST_PARAM + AUTO_WAKEABLE_ROLES_PARAM env vars to the Lambda via template.yaml update + deploy.`,
93
+ enumerated: {
94
+ count: PREFLIGHT_WORKER_LAMBDAS.length,
95
+ last_audited: PREFLIGHT_WORKER_LAMBDAS[0]?.lastAudited ?? '2026-08-06',
96
+ entries: PREFLIGHT_WORKER_LAMBDAS.map((w) => ({ function_name_suffix: w.functionNameSuffix })),
97
+ },
98
+ };
99
+ }
100
+ return {
101
+ id: '5',
102
+ name: `worker Lambda wake config (${enumSummary})`,
103
+ status: 'pass',
104
+ detail: `All ${PREFLIGHT_WORKER_LAMBDAS.length} enumerated worker(s) have required env vars.`,
105
+ fix_command: null,
106
+ enumerated: {
107
+ count: PREFLIGHT_WORKER_LAMBDAS.length,
108
+ last_audited: PREFLIGHT_WORKER_LAMBDAS[0]?.lastAudited ?? '2026-08-06',
109
+ entries: PREFLIGHT_WORKER_LAMBDAS.map((w) => ({ function_name_suffix: w.functionNameSuffix })),
110
+ },
111
+ };
112
+ }
113
+ //# sourceMappingURL=row5_workerLambdaWakeConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row5_workerLambdaWakeConfig.js","sourceRoot":"","sources":["../../src/preflight/row5_workerLambdaWakeConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAExF;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,sBAAsB,EAAE,2BAA2B,CAAC,CAAC;AAEhF,SAAS,gBAAgB,CACvB,YAAoB,EACpB,MAAe;IAEf,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CACrB,0DAA0D,YAAY,mDAAmD,UAAU,EAAE,CAAC,IAAI,EAAE,EAC5I,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;IACtD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACvD,IACE,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACrC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACjC,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IACE,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YAC/C,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EACjC,CAAC;YACD,OAAO,eAAe,CAAC;QACzB,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAC,IAGrD;IACC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7B,MAAM,WAAW,GAAG,wBAAwB,EAAE,CAAC;IAE/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAa,EAAE,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,wBAAwB,EAAE,CAAC;QAC9C,4DAA4D;QAC5D,MAAM,YAAY,GAAG,WAAW,GAAG,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACnE,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QAEvD,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,GAAG,YAAY,kCAAkC,CAAC,CAAC;YACtE,SAAS;QACX,CAAC;QACD,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,sBAAsB,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,EAAE,EAAE,GAAG;YACP,IAAI,EAAE,8BAA8B,WAAW,GAAG;YAClD,MAAM,EAAE,eAAe;YACvB,MAAM,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAChC,WAAW,EAAE,IAAI;YACjB,eAAe,EAAE,+DAA+D;YAChF,UAAU,EAAE;gBACV,KAAK,EAAE,wBAAwB,CAAC,MAAM;gBACtC,YAAY,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,YAAY;gBACtE,OAAO,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;aAC/F;SACF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,EAAE,EAAE,GAAG;YACP,IAAI,EAAE,8BAA8B,WAAW,GAAG;YAClD,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,WAAW,EAAE,IAAI;YACjB,eAAe,EACb,4EAA4E;gBAC5E,gHAAgH;YAClH,UAAU,EAAE;gBACV,KAAK,EAAE,wBAAwB,CAAC,MAAM;gBACtC,YAAY,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,YAAY;gBACtE,OAAO,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;aAC/F;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,8BAA8B,WAAW,GAAG;QAClD,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,OAAO,wBAAwB,CAAC,MAAM,+CAA+C;QAC7F,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE;YACV,KAAK,EAAE,wBAAwB,CAAC,MAAM;YACtC,YAAY,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,YAAY;YACtE,OAAO,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;SAC/F;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * F53 Rows 6a/6b/6c — Email ingest checks.
3
+ *
4
+ * Row 6 SKIP trigger (D4): if the project has no known_senders (empty sender-map),
5
+ * ingest isn't configured for it — the whole row 6 SKIPs (not fails).
6
+ *
7
+ * When row 6 runs:
8
+ * 6a — global email_ingest_personas table has ≥1 active row
9
+ * via GET /api/email-ingest/personas (global, no project scope)
10
+ * 6b — project has ≥1 known_senders entry
11
+ * via enriched project response email_ingest.known_senders
12
+ * 6c — project has intake_worksheet_id set (not null)
13
+ * via enriched project response email_ingest.intake_worksheet_id
14
+ */
15
+ import type { PreflightRow } from './schema.js';
16
+ export declare function checkRow6Ingest(opts: {
17
+ orgId: string;
18
+ projectId: string;
19
+ projectSlug: string;
20
+ }): Promise<PreflightRow[]>;
@@ -0,0 +1,178 @@
1
+ /**
2
+ * F53 Rows 6a/6b/6c — Email ingest checks.
3
+ *
4
+ * Row 6 SKIP trigger (D4): if the project has no known_senders (empty sender-map),
5
+ * ingest isn't configured for it — the whole row 6 SKIPs (not fails).
6
+ *
7
+ * When row 6 runs:
8
+ * 6a — global email_ingest_personas table has ≥1 active row
9
+ * via GET /api/email-ingest/personas (global, no project scope)
10
+ * 6b — project has ≥1 known_senders entry
11
+ * via enriched project response email_ingest.known_senders
12
+ * 6c — project has intake_worksheet_id set (not null)
13
+ * via enriched project response email_ingest.intake_worksheet_id
14
+ */
15
+ import { api } from '../api.js';
16
+ export async function checkRow6Ingest(opts) {
17
+ const { orgId, projectId, projectSlug } = opts;
18
+ // ── Fetch enriched project response for 6b/6c ─────────────────────────────
19
+ let emailIngest = null;
20
+ let projectFetchError = null;
21
+ try {
22
+ const projectData = (await api('GET', `/api/organizations/${orgId}/projects/${projectId}`, undefined, { noProjectHeader: true }));
23
+ emailIngest = projectData.project?.email_ingest ?? null;
24
+ }
25
+ catch (err) {
26
+ projectFetchError = err?.message ?? String(err);
27
+ }
28
+ const knownSenders = emailIngest?.known_senders ?? [];
29
+ // ── SKIP trigger: no known_senders → row 6 not applicable ────────────────
30
+ if (!projectFetchError && knownSenders.length === 0) {
31
+ const skipMsg = `Project '${projectSlug}' has no sender-map entries — email ingest not configured for this project.`;
32
+ return [
33
+ {
34
+ id: '6a',
35
+ name: 'email ingest personas (global)',
36
+ status: 'skip',
37
+ detail: skipMsg,
38
+ fix_command: null,
39
+ },
40
+ {
41
+ id: '6b',
42
+ name: 'email ingest sender map',
43
+ status: 'skip',
44
+ detail: skipMsg,
45
+ fix_command: null,
46
+ },
47
+ {
48
+ id: '6c',
49
+ name: 'email ingest intake worksheet',
50
+ status: 'skip',
51
+ detail: skipMsg,
52
+ fix_command: null,
53
+ },
54
+ ];
55
+ }
56
+ const rows = [];
57
+ // ── 6a — global email_ingest_personas presence ───────────────────────────
58
+ try {
59
+ const data = (await api('GET', '/api/email-ingest/personas', undefined, {
60
+ noProjectHeader: true,
61
+ }));
62
+ const personas = data.personas ?? [];
63
+ if (personas.length === 0) {
64
+ rows.push({
65
+ id: '6a',
66
+ name: 'email ingest personas (global)',
67
+ status: 'fail',
68
+ detail: 'email_ingest_personas table is empty (global check — no personas configured).',
69
+ fix_command: null,
70
+ fix_instruction: 'Add at least one email ingest persona via the Fazemos admin UI or API. See docs/guides/agent-provisioning-runbook.md §6a.',
71
+ });
72
+ }
73
+ else {
74
+ rows.push({
75
+ id: '6a',
76
+ name: 'email ingest personas (global)',
77
+ status: 'pass',
78
+ detail: `${personas.length} global persona(s) configured.`,
79
+ fix_command: null,
80
+ });
81
+ }
82
+ }
83
+ catch (err) {
84
+ rows.push({
85
+ id: '6a',
86
+ name: 'email ingest personas (global)',
87
+ status: 'tooling_error',
88
+ detail: `API call failed: ${err?.message ?? String(err)}`,
89
+ fix_command: null,
90
+ fix_instruction: 'Check your Fazemos API credentials (owner/admin required) and retry.',
91
+ });
92
+ }
93
+ // ── 6b — per-project known_senders ───────────────────────────────────────
94
+ if (projectFetchError) {
95
+ rows.push({
96
+ id: '6b',
97
+ name: 'email ingest sender map',
98
+ status: 'tooling_error',
99
+ detail: `Project fetch failed: ${projectFetchError}`,
100
+ fix_command: null,
101
+ fix_instruction: 'Check your Fazemos API credentials and active project, then retry.',
102
+ });
103
+ }
104
+ else if (emailIngest === null) {
105
+ // email_ingest block absent entirely — treat as no ingest configured
106
+ rows.push({
107
+ id: '6b',
108
+ name: 'email ingest sender map',
109
+ status: 'skip',
110
+ detail: `Project '${projectSlug}' has no email_ingest block — ingest not configured.`,
111
+ fix_command: null,
112
+ });
113
+ }
114
+ else if (knownSenders.length === 0) {
115
+ rows.push({
116
+ id: '6b',
117
+ name: 'email ingest sender map',
118
+ status: 'fail',
119
+ detail: `Project '${projectSlug}' has no known_senders entries.`,
120
+ fix_command: null,
121
+ fix_instruction: 'Add sender-map entries for this project via the Fazemos admin UI or API.',
122
+ });
123
+ }
124
+ else {
125
+ rows.push({
126
+ id: '6b',
127
+ name: 'email ingest sender map',
128
+ status: 'pass',
129
+ detail: `${knownSenders.length} known sender(s): ${knownSenders.slice(0, 3).join(', ')}${knownSenders.length > 3 ? ' …' : ''}`,
130
+ fix_command: null,
131
+ });
132
+ }
133
+ // ── 6c — intake worksheet ─────────────────────────────────────────────────
134
+ if (projectFetchError) {
135
+ rows.push({
136
+ id: '6c',
137
+ name: 'email ingest intake worksheet',
138
+ status: 'tooling_error',
139
+ detail: `Project fetch failed: ${projectFetchError}`,
140
+ fix_command: null,
141
+ fix_instruction: 'Check your Fazemos API credentials and active project, then retry.',
142
+ });
143
+ }
144
+ else if (emailIngest === null) {
145
+ rows.push({
146
+ id: '6c',
147
+ name: 'email ingest intake worksheet',
148
+ status: 'skip',
149
+ detail: `Project '${projectSlug}' has no email_ingest block — ingest not configured.`,
150
+ fix_command: null,
151
+ });
152
+ }
153
+ else {
154
+ const wsId = emailIngest.intake_worksheet_id ?? null;
155
+ if (!wsId) {
156
+ rows.push({
157
+ id: '6c',
158
+ name: 'email ingest intake worksheet',
159
+ status: 'fail',
160
+ detail: `Project '${projectSlug}' has no intake_worksheet_id set (null).`,
161
+ fix_command: null,
162
+ fix_instruction: `Set an intake worksheet for project '${projectSlug}' via the Fazemos admin UI or: ` +
163
+ `fazemos projects update --intake-worksheet <worksheet-id>`,
164
+ });
165
+ }
166
+ else {
167
+ rows.push({
168
+ id: '6c',
169
+ name: 'email ingest intake worksheet',
170
+ status: 'pass',
171
+ detail: `intake_worksheet_id=${wsId}`,
172
+ fix_command: null,
173
+ });
174
+ }
175
+ }
176
+ return rows;
177
+ }
178
+ //# sourceMappingURL=row6_ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"row6_ingest.js","sourceRoot":"","sources":["../../src/preflight/row6_ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * F53 — Preflight verifier TypeScript types.
3
+ *
4
+ * schema_version "1.2" (bumped from 1.1):
5
+ * - Added `indeterminate` status value (r3.2). Any --json consumer switching
6
+ * exhaustively on `status` must handle this value or may break on unknown input.
7
+ * - schema_version "1.1" → "1.2" signals this addition.
8
+ * schema_version "1.1" (bumped from 1.0):
9
+ * - Added `xws_deferred` status value (r3). Any --json consumer switching
10
+ * exhaustively on `status` must handle this value or may break on unknown input.
11
+ * - schema_version "1.0" → "1.1" signals this addition.
12
+ * Structural field removals or renames bump the major version.
13
+ */
14
+ export type PreflightStatus = 'pass' | 'fail' | 'skip' | 'tooling_error' | 'xws_deferred' | 'indeterminate';
15
+ /** Row 2 FAIL variants (r3 penta-state). */
16
+ export type Row2Variant = 'no_registration' | 'bound_elsewhere' | 'resolver_ambiguous' | 'resolver_mismatch';
17
+ export interface ResolverCandidate {
18
+ id: string;
19
+ workspace: string;
20
+ role_slug: string;
21
+ org_id: string;
22
+ org_slug: string;
23
+ project_id: string | null;
24
+ project_slug: string | null;
25
+ active: boolean;
26
+ }
27
+ /**
28
+ * Result of a single preflight row check.
29
+ * `fix_command` is an executable shell string, or null when `fix_instruction` is used.
30
+ */
31
+ export interface PreflightRow {
32
+ id: string;
33
+ name: string;
34
+ status: PreflightStatus;
35
+ detail: string;
36
+ fix_command: string | null;
37
+ fix_instruction?: string;
38
+ variant?: Row2Variant;
39
+ bound_to?: {
40
+ org_slug: string;
41
+ org_id: string;
42
+ project_slug: string | null;
43
+ project_id: string | null;
44
+ };
45
+ resolver_candidates?: ResolverCandidate[];
46
+ resolver_deterministic?: boolean;
47
+ /** True when the API is pre-r3 and didn't return resolver_candidates. Degrades to r2 tri-state. */
48
+ resolver_parity_unavailable?: boolean;
49
+ enumerated?: {
50
+ count: number;
51
+ last_audited: string;
52
+ entries: Array<{
53
+ function_name_suffix: string;
54
+ }>;
55
+ };
56
+ }
57
+ /**
58
+ * XWS_DEFERRED result for a whole target that is cross-workspace.
59
+ * Appears at the top-level for single-project cross-workspace targets,
60
+ * or in the cross_workspace array for fan-out shapes.
61
+ */
62
+ export interface XwsDeferredResult {
63
+ verdict: 'xws_deferred';
64
+ role_slug: string;
65
+ cross_workspace_source: {
66
+ workspace_path: string;
67
+ registry_path: string;
68
+ };
69
+ fix_instruction: string;
70
+ }
71
+ export interface PreflightSummary {
72
+ pass: number;
73
+ fail: number;
74
+ skip: number;
75
+ tooling_error: number;
76
+ xws_deferred: number;
77
+ indeterminate: number;
78
+ ok: boolean;
79
+ }
80
+ /**
81
+ * `--json` output schema (schema_version "1.2").
82
+ *
83
+ * Single-project form: org + project + role + rows + summary present.
84
+ * Fan-out `<org>/<role>` form: roster + projects present; org + role present; project absent.
85
+ * Fan-out `<org>/<project>` form: roster + roles present; org + project present; role absent.
86
+ * Cross-workspace single-project: xws_deferred present; rows absent.
87
+ */
88
+ export interface PreflightJsonOutput {
89
+ schema_version: '1.2';
90
+ target: string;
91
+ env: string;
92
+ exit_code: number;
93
+ /** Present when a tooling error prevented the run from completing. */
94
+ error?: string;
95
+ org?: {
96
+ slug: string;
97
+ id: string;
98
+ };
99
+ project?: {
100
+ slug: string;
101
+ id: string;
102
+ };
103
+ role?: string;
104
+ agent?: string | null;
105
+ workspace_repo?: string;
106
+ workspace_ref?: string;
107
+ /** Present when the whole single-project target is cross-workspace. */
108
+ xws_deferred?: XwsDeferredResult;
109
+ rows?: PreflightRow[];
110
+ summary?: PreflightSummary;
111
+ roster?: {
112
+ source_files: string[];
113
+ declared_projects?: string[];
114
+ undeclared_projects?: string[];
115
+ cross_workspace_roles?: Array<{
116
+ role_slug: string;
117
+ workspace_path: string;
118
+ registry_path: string;
119
+ fix_instruction: string;
120
+ }>;
121
+ };
122
+ /** Fan-out `<org>/<role>`: array of projects (declared, undeclared, xws_deferred). */
123
+ projects?: Array<{
124
+ project: {
125
+ slug: string;
126
+ id: string;
127
+ };
128
+ declared: boolean;
129
+ declared_cross_workspace?: boolean;
130
+ reason?: string;
131
+ role?: string;
132
+ agent?: string | null;
133
+ rows?: PreflightRow[];
134
+ summary?: PreflightSummary;
135
+ fix_instruction?: string;
136
+ }>;
137
+ /** Fan-out `<org>/<project>`: array of roles (declared, xws_deferred). */
138
+ roles?: Array<{
139
+ role: string;
140
+ declared: boolean;
141
+ declared_cross_workspace?: boolean;
142
+ agent?: string | null;
143
+ rows?: PreflightRow[];
144
+ summary?: PreflightSummary;
145
+ fix_instruction?: string;
146
+ }>;
147
+ org_summary?: {
148
+ total_projects?: number;
149
+ declared_projects?: number;
150
+ undeclared_projects?: number;
151
+ all_declared_pass?: boolean;
152
+ failing_projects?: string[];
153
+ xws_deferred_count?: number;
154
+ };
155
+ project_summary?: {
156
+ total_roles_declared_here?: number;
157
+ cross_workspace_count?: number;
158
+ all_declared_here_pass?: boolean;
159
+ failing_roles?: string[];
160
+ };
161
+ }
162
+ /**
163
+ * Summarize a set of row results.
164
+ */
165
+ export declare function summarizeRows(rows: PreflightRow[]): PreflightSummary;
166
+ /**
167
+ * Compute the exit code for a set of row results.
168
+ * Precedence: 2 (tooling_error) > 1 (fail) > 3 (xws_deferred | indeterminate) > 0 (all clear).
169
+ */
170
+ export declare function computeExitCode(rows: PreflightRow[], hasXwsDeferred: boolean): number;
171
+ /**
172
+ * Merge exit codes from multiple row-sets.
173
+ * Precedence: 2 > 1 > 3 > 0.
174
+ */
175
+ export declare function mergeExitCodes(codes: number[]): number;
@@ -0,0 +1,62 @@
1
+ /**
2
+ * F53 — Preflight verifier TypeScript types.
3
+ *
4
+ * schema_version "1.2" (bumped from 1.1):
5
+ * - Added `indeterminate` status value (r3.2). Any --json consumer switching
6
+ * exhaustively on `status` must handle this value or may break on unknown input.
7
+ * - schema_version "1.1" → "1.2" signals this addition.
8
+ * schema_version "1.1" (bumped from 1.0):
9
+ * - Added `xws_deferred` status value (r3). Any --json consumer switching
10
+ * exhaustively on `status` must handle this value or may break on unknown input.
11
+ * - schema_version "1.0" → "1.1" signals this addition.
12
+ * Structural field removals or renames bump the major version.
13
+ */
14
+ /**
15
+ * Summarize a set of row results.
16
+ */
17
+ export function summarizeRows(rows) {
18
+ const counts = { pass: 0, fail: 0, skip: 0, tooling_error: 0, xws_deferred: 0, indeterminate: 0 };
19
+ for (const r of rows) {
20
+ if (r.status === 'pass')
21
+ counts.pass++;
22
+ else if (r.status === 'fail')
23
+ counts.fail++;
24
+ else if (r.status === 'skip')
25
+ counts.skip++;
26
+ else if (r.status === 'tooling_error')
27
+ counts.tooling_error++;
28
+ else if (r.status === 'xws_deferred')
29
+ counts.xws_deferred++;
30
+ else if (r.status === 'indeterminate')
31
+ counts.indeterminate++;
32
+ }
33
+ return { ...counts, ok: counts.fail === 0 && counts.tooling_error === 0 };
34
+ }
35
+ /**
36
+ * Compute the exit code for a set of row results.
37
+ * Precedence: 2 (tooling_error) > 1 (fail) > 3 (xws_deferred | indeterminate) > 0 (all clear).
38
+ */
39
+ export function computeExitCode(rows, hasXwsDeferred) {
40
+ const summary = summarizeRows(rows);
41
+ if (summary.tooling_error > 0)
42
+ return 2;
43
+ if (summary.fail > 0)
44
+ return 1;
45
+ if (hasXwsDeferred || summary.xws_deferred > 0 || summary.indeterminate > 0)
46
+ return 3;
47
+ return 0;
48
+ }
49
+ /**
50
+ * Merge exit codes from multiple row-sets.
51
+ * Precedence: 2 > 1 > 3 > 0.
52
+ */
53
+ export function mergeExitCodes(codes) {
54
+ if (codes.includes(2))
55
+ return 2;
56
+ if (codes.includes(1))
57
+ return 1;
58
+ if (codes.includes(3))
59
+ return 3;
60
+ return 0;
61
+ }
62
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/preflight/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA4JH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAoB;IAChD,MAAM,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IAClG,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,EAAE,CAAC;aAClC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,EAAE,CAAC;aACvC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,EAAE,CAAC;aACvC,IAAI,CAAC,CAAC,MAAM,KAAK,eAAe;YAAE,MAAM,CAAC,aAAa,EAAE,CAAC;aACzD,IAAI,CAAC,CAAC,MAAM,KAAK,cAAc;YAAE,MAAM,CAAC,YAAY,EAAE,CAAC;aACvD,IAAI,CAAC,CAAC,MAAM,KAAK,eAAe;YAAE,MAAM,CAAC,aAAa,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAoB,EAAE,cAAuB;IAC3E,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACxC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,cAAc,IAAI,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACtF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAe;IAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * F53 D2 — Hard-coded enumeration of dispatch-reaching worker Lambdas.
3
+ *
4
+ * v1 set: one entry, the email-ingest parse worker (BUG153 audit sweep, 2026-08-06).
5
+ *
6
+ * When adding a new dispatch-reaching Lambda:
7
+ * 1. Append to PREFLIGHT_WORKER_LAMBDAS below.
8
+ * 2. Update lastAudited to today.
9
+ * 3. The worker must also be in WAKE_ALLOWLIST_PARAM + AUTO_WAKEABLE_ROLES_PARAM (row 4).
10
+ */
11
+ export interface WorkerLambdaEntry {
12
+ /** Suffix of the Lambda function name (without env prefix). */
13
+ functionNameSuffix: string;
14
+ /** ISO date of the last audit sweep that confirmed this is the complete set. */
15
+ lastAudited: string;
16
+ note: string;
17
+ }
18
+ export declare const PREFLIGHT_WORKER_LAMBDAS: WorkerLambdaEntry[];
19
+ /**
20
+ * Human-readable enumeration summary for row 5 output.
21
+ */
22
+ export declare function workerEnumerationSummary(): string;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * F53 D2 — Hard-coded enumeration of dispatch-reaching worker Lambdas.
3
+ *
4
+ * v1 set: one entry, the email-ingest parse worker (BUG153 audit sweep, 2026-08-06).
5
+ *
6
+ * When adding a new dispatch-reaching Lambda:
7
+ * 1. Append to PREFLIGHT_WORKER_LAMBDAS below.
8
+ * 2. Update lastAudited to today.
9
+ * 3. The worker must also be in WAKE_ALLOWLIST_PARAM + AUTO_WAKEABLE_ROLES_PARAM (row 4).
10
+ */
11
+ export const PREFLIGHT_WORKER_LAMBDAS = [
12
+ {
13
+ functionNameSuffix: 'email-ingest-parse-worker',
14
+ lastAudited: '2026-08-06',
15
+ note: 'BUG153 landed 2026-08-06 — parse worker is the only dispatch-reaching worker per audit sweep.',
16
+ },
17
+ ];
18
+ /**
19
+ * Human-readable enumeration summary for row 5 output.
20
+ */
21
+ export function workerEnumerationSummary() {
22
+ const lastAudited = PREFLIGHT_WORKER_LAMBDAS.reduce((acc, e) => (e.lastAudited > acc ? e.lastAudited : acc), '0000-00-00');
23
+ return `enumerated set: ${PREFLIGHT_WORKER_LAMBDAS.length} worker(s), last audited ${lastAudited}`;
24
+ }
25
+ //# sourceMappingURL=workerLambdas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerLambdas.js","sourceRoot":"","sources":["../../src/preflight/workerLambdas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAUH,MAAM,CAAC,MAAM,wBAAwB,GAAwB;IAC3D;QACE,kBAAkB,EAAE,2BAA2B;QAC/C,WAAW,EAAE,YAAY;QACzB,IAAI,EAAE,+FAA+F;KACtG;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,wBAAwB;IACtC,MAAM,WAAW,GAAG,wBAAwB,CAAC,MAAM,CACjD,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EACvD,YAAY,CACb,CAAC;IACF,OAAO,mBAAmB,wBAAwB,CAAC,MAAM,4BAA4B,WAAW,EAAE,CAAC;AACrG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formigio/fazemos-cli",
3
- "version": "0.10.67",
3
+ "version": "0.10.74",
4
4
  "description": "CLI for the Fazemos Team Accomplishment Platform",
5
5
  "type": "module",
6
6
  "license": "MIT",