@formigio/fazemos-cli 0.10.11 → 0.10.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ import type { Finding } from '../yaml/load.js';
2
+ /**
3
+ * Run schema + custom checks against a parsed manifest value.
4
+ * Returns a flat list of findings (errors / warnings / info).
5
+ */
6
+ export declare function validateManifest(value: unknown): Finding[];
@@ -0,0 +1,356 @@
1
+ import * as AjvNs from 'ajv';
2
+ import { manifestSchema, KNOWN_MANIFEST_VERSIONS } from './schema.js';
3
+ // ajv 8.x ships as CJS; in ESM contexts the constructor lands on the namespace's
4
+ // `.default` property. Resolve at runtime so `new Ajv(...)` works under Node ESM.
5
+ const Ajv = AjvNs.default ?? AjvNs;
6
+ /**
7
+ * Run schema + custom checks against a parsed manifest value.
8
+ * Returns a flat list of findings (errors / warnings / info).
9
+ */
10
+ export function validateManifest(value) {
11
+ const findings = [];
12
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
13
+ findings.push({
14
+ severity: 'error',
15
+ rule: 'manifest.shape',
16
+ message: 'Manifest root must be a YAML mapping (object).',
17
+ });
18
+ return findings;
19
+ }
20
+ const m = value;
21
+ // -- Schema validation (ajv) --------------------------------------------
22
+ const ajv = new Ajv({ allErrors: true, strict: false });
23
+ const validate = ajv.compile(manifestSchema);
24
+ if (!validate(m)) {
25
+ for (const err of validate.errors ?? []) {
26
+ findings.push(schemaErrorToFinding(err));
27
+ }
28
+ }
29
+ // -- manifest_version present + known? ---------------------------------
30
+ if (m.manifest_version === undefined) {
31
+ findings.push({
32
+ severity: 'warning',
33
+ rule: 'manifest.version_missing',
34
+ message: `manifest_version is missing. Add \`manifest_version: "${KNOWN_MANIFEST_VERSIONS[KNOWN_MANIFEST_VERSIONS.length - 1]}"\` at the top of the file so future schema changes can be tracked.`,
35
+ path: '(root)',
36
+ });
37
+ }
38
+ else if (typeof m.manifest_version === 'string'
39
+ && !KNOWN_MANIFEST_VERSIONS.includes(m.manifest_version)) {
40
+ findings.push({
41
+ severity: 'warning',
42
+ rule: 'manifest.version_unknown',
43
+ message: `manifest_version "${m.manifest_version}" is not in known set [${KNOWN_MANIFEST_VERSIONS.join(', ')}]. Validation continued; some checks may not match newer shapes.`,
44
+ path: 'manifest_version',
45
+ });
46
+ }
47
+ // -- Custom checks ------------------------------------------------------
48
+ checkAuditSummary(m, findings);
49
+ checkAcTraceability(m, findings);
50
+ checkDuplicateIds(m, findings);
51
+ checkRenderSourcePathCallers(m, findings);
52
+ return findings;
53
+ }
54
+ function schemaErrorToFinding(err) {
55
+ const instancePath = err.instancePath || '(root)';
56
+ let msg = err.message ?? 'schema violation';
57
+ if (err.keyword === 'required') {
58
+ const missing = err.params?.missingProperty;
59
+ msg = missing ? `missing required property: ${missing}` : msg;
60
+ }
61
+ else if (err.keyword === 'additionalProperties') {
62
+ msg = `unexpected property: ${err.params?.additionalProperty}`;
63
+ }
64
+ else if (err.keyword === 'enum') {
65
+ msg = `${msg}: ${JSON.stringify(err.params?.allowedValues)}`;
66
+ }
67
+ return {
68
+ severity: 'error',
69
+ rule: `schema.${err.keyword}`,
70
+ message: msg,
71
+ path: instancePath,
72
+ };
73
+ }
74
+ // ──────────────────────────────────────────────────────────────────────
75
+ // audit_summary numeric self-consistency
76
+ // ──────────────────────────────────────────────────────────────────────
77
+ function checkAuditSummary(m, findings) {
78
+ const ep = m.entry_points;
79
+ if (!ep || typeof ep !== 'object')
80
+ return;
81
+ const summary = ep.audit_summary;
82
+ if (!summary || typeof summary !== 'object')
83
+ return;
84
+ const fields = ['added', 'modified', 'replaced', 'unchanged'];
85
+ const declared = {};
86
+ for (const k of fields) {
87
+ if (typeof summary[k] !== 'number')
88
+ return; // schema layer flags non-number
89
+ declared[k] = summary[k];
90
+ }
91
+ const total = summary.total_in_this_manifest;
92
+ if (typeof total !== 'number')
93
+ return;
94
+ // Rule (a): declared sum vs declared total
95
+ const sum = fields.reduce((a, k) => a + declared[k], 0);
96
+ if (sum !== total) {
97
+ findings.push({
98
+ severity: 'error',
99
+ rule: 'audit.sum_mismatch',
100
+ message: `audit_summary self-contradicts: ${fields.map(k => `${k}=${declared[k]}`).join(' + ')} = ${sum}, but total_in_this_manifest = ${total}.`,
101
+ path: 'entry_points.audit_summary',
102
+ });
103
+ }
104
+ // Rule (b): declared counts vs actual array lengths
105
+ for (const k of fields) {
106
+ const arr = ep[k];
107
+ if (!Array.isArray(arr))
108
+ continue; // schema layer flags shape
109
+ if (arr.length !== declared[k]) {
110
+ findings.push({
111
+ severity: 'error',
112
+ rule: 'audit.count_vs_array',
113
+ message: `audit_summary.${k} declares ${declared[k]} but entry_points.${k} array has ${arr.length} entries.`,
114
+ path: `entry_points.${k}`,
115
+ });
116
+ }
117
+ }
118
+ }
119
+ // ──────────────────────────────────────────────────────────────────────
120
+ // AC traceability: every traceability.AC*.task value must point at a real task
121
+ // ──────────────────────────────────────────────────────────────────────
122
+ function checkAcTraceability(m, findings) {
123
+ const trace = m.traceability;
124
+ if (!trace || typeof trace !== 'object')
125
+ return;
126
+ const taskIds = collectTaskIds(m);
127
+ if (taskIds === null)
128
+ return; // no implementation block; skip silently
129
+ for (const [acKey, block] of Object.entries(trace)) {
130
+ if (!isAcKey(acKey))
131
+ continue;
132
+ // Three legitimate shapes:
133
+ // { task: "T1, T2" } — single-row criterion
134
+ // [ { task: "T1" }, { task: "T2" } ] — multi-row criterion (I17 style)
135
+ // "..." — pointer string (no task ref)
136
+ const rows = [];
137
+ if (Array.isArray(block)) {
138
+ block.forEach((row, i) => {
139
+ if (row && typeof row === 'object' && row.task !== undefined) {
140
+ rows.push({ rowIdx: i, taskField: row.task });
141
+ }
142
+ });
143
+ }
144
+ else if (block && typeof block === 'object') {
145
+ const tf = block.task;
146
+ if (tf !== undefined && tf !== null)
147
+ rows.push({ rowIdx: null, taskField: tf });
148
+ }
149
+ for (const { rowIdx, taskField } of rows) {
150
+ const where = rowIdx === null
151
+ ? `traceability.${acKey}.task`
152
+ : `traceability.${acKey}[${rowIdx}].task`;
153
+ const referenced = parseTaskRefs(taskField);
154
+ // A value with no task-shaped tokens is a deliberate "no task" statement
155
+ // (e.g., `task: "no task — verified by integration test"`). That is a
156
+ // legitimate authoring choice, not an error. Skip silently.
157
+ if (!referenced.length)
158
+ continue;
159
+ for (const ref of referenced) {
160
+ if (!taskIds.has(ref)) {
161
+ findings.push({
162
+ severity: 'error',
163
+ rule: 'trace.ac_task_missing',
164
+ message: `${where} references task "${ref}" but no implementation.*.tasks[*].id matches.`,
165
+ path: where,
166
+ });
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ /**
173
+ * Heuristic for which traceability keys are acceptance criteria. Authors use
174
+ * either AC1_..., AC01_..., or rule-style r1_... / R1_... naming. Anything
175
+ * starting with AC or matching r\d+_ is treated as an AC. Pointer-only keys
176
+ * like requirements_source / acceptance_criteria_source are excluded.
177
+ */
178
+ function isAcKey(key) {
179
+ if (key.startsWith('AC'))
180
+ return true;
181
+ if (/^r\d+_/i.test(key))
182
+ return true;
183
+ return false;
184
+ }
185
+ function collectTaskIds(m) {
186
+ const impl = m.implementation;
187
+ if (!impl || typeof impl !== 'object')
188
+ return null;
189
+ const ids = new Set();
190
+ // Walk the entire implementation subtree. Authors organize task buckets
191
+ // either directly under implementation (implementation.api.tasks) or
192
+ // nested one level deeper under implementation.sequencing.api.tasks.
193
+ // Recursive collection accommodates both without prescribing structure.
194
+ walkForTasks(impl, ids);
195
+ return ids;
196
+ }
197
+ function walkForTasks(node, ids) {
198
+ if (!node || typeof node !== 'object')
199
+ return;
200
+ if (Array.isArray(node)) {
201
+ for (const child of node)
202
+ walkForTasks(child, ids);
203
+ return;
204
+ }
205
+ for (const [key, val] of Object.entries(node)) {
206
+ if (key === 'tasks' && Array.isArray(val)) {
207
+ for (const t of val) {
208
+ if (t && typeof t === 'object' && typeof t.id === 'string') {
209
+ ids.add(t.id);
210
+ }
211
+ }
212
+ continue;
213
+ }
214
+ walkForTasks(val, ids);
215
+ }
216
+ }
217
+ /** Same shape as walkForTasks but records a path for each occurrence so
218
+ * duplicate-id reporting can name the locations. */
219
+ function walkForTaskLocations(node, path, seen) {
220
+ if (!node || typeof node !== 'object')
221
+ return;
222
+ if (Array.isArray(node)) {
223
+ node.forEach((child, i) => walkForTaskLocations(child, `${path}[${i}]`, seen));
224
+ return;
225
+ }
226
+ for (const [key, val] of Object.entries(node)) {
227
+ const childPath = `${path}.${key}`;
228
+ if (key === 'tasks' && Array.isArray(val)) {
229
+ val.forEach((t, i) => {
230
+ if (t && typeof t === 'object' && typeof t.id === 'string') {
231
+ const id = t.id;
232
+ const list = seen.get(id) ?? [];
233
+ list.push(`${childPath}[${i}]`);
234
+ seen.set(id, list);
235
+ }
236
+ });
237
+ continue;
238
+ }
239
+ walkForTaskLocations(val, childPath, seen);
240
+ }
241
+ }
242
+ /**
243
+ * Parse `task: T3, T4, T5` or `task: P1` or `task: [T1, T2]` into a list of
244
+ * task IDs. Tolerant of prose like `task: "no task — verified by T5 test"`
245
+ * — the shape filter (uppercase-leading + contains a digit) cleanly extracts
246
+ * T5 and discards English words. Real task IDs in this codebase are uniformly
247
+ * letter-prefixed and digit-bearing (T1..T12, A0..A8, W0..W3, P1, D1, EC1, etc.).
248
+ */
249
+ function parseTaskRefs(value) {
250
+ const tokens = [];
251
+ const consume = (s) => tokens.push(...splitTokens(s));
252
+ if (Array.isArray(value)) {
253
+ for (const v of value)
254
+ if (typeof v === 'string')
255
+ consume(v);
256
+ }
257
+ else if (typeof value === 'string') {
258
+ consume(value);
259
+ }
260
+ return tokens.filter(isTaskIdShape);
261
+ }
262
+ function splitTokens(s) {
263
+ // Split on whitespace, commas, em-dashes, parens, brackets. Trims residual punctuation.
264
+ return s
265
+ .split(/[\s,—–()[\]{}]+/)
266
+ .map(t => t.replace(/[.;:'"`]+$/, '').replace(/^[.;:'"`]+/, ''))
267
+ .filter(Boolean);
268
+ }
269
+ function isTaskIdShape(token) {
270
+ // Uppercase-leading, contains a digit, all alnum/underscore/hyphen.
271
+ return /^[A-Z][A-Z0-9_-]*\d[A-Z0-9_-]*$/.test(token);
272
+ }
273
+ // ──────────────────────────────────────────────────────────────────────
274
+ // Duplicate IDs across known ID-bearing collections
275
+ // ──────────────────────────────────────────────────────────────────────
276
+ function checkDuplicateIds(m, findings) {
277
+ // Tasks across the entire implementation subtree — IDs must be globally unique.
278
+ const taskIdSeen = new Map();
279
+ if (m.implementation && typeof m.implementation === 'object') {
280
+ walkForTaskLocations(m.implementation, 'implementation', taskIdSeen);
281
+ }
282
+ for (const [id, locs] of taskIdSeen) {
283
+ if (locs.length > 1) {
284
+ findings.push({
285
+ severity: 'error',
286
+ rule: 'ids.duplicate_task',
287
+ message: `Task id "${id}" appears in multiple locations: ${locs.join(', ')}.`,
288
+ path: 'implementation',
289
+ });
290
+ }
291
+ }
292
+ // Edge case IDs
293
+ flagDuplicateIdsInArray(m.edge_cases, 'edge_cases', findings);
294
+ // Risk IDs
295
+ flagDuplicateIdsInArray(m.risks, 'risks', findings);
296
+ // Phase 1 gate question IDs
297
+ const gate = m.phase_1_gate;
298
+ if (gate && typeof gate === 'object' && Array.isArray(gate.questions)) {
299
+ flagDuplicateIdsInArray(gate.questions, 'phase_1_gate.questions', findings);
300
+ }
301
+ }
302
+ function flagDuplicateIdsInArray(arr, path, findings) {
303
+ if (!Array.isArray(arr))
304
+ return;
305
+ const seen = new Set();
306
+ const dupes = new Set();
307
+ for (const item of arr) {
308
+ if (item && typeof item === 'object' && typeof item.id === 'string') {
309
+ const id = item.id;
310
+ if (seen.has(id))
311
+ dupes.add(id);
312
+ else
313
+ seen.add(id);
314
+ }
315
+ }
316
+ for (const d of dupes) {
317
+ findings.push({
318
+ severity: 'error',
319
+ rule: 'ids.duplicate',
320
+ message: `Duplicate id "${d}" in ${path}[].`,
321
+ path,
322
+ });
323
+ }
324
+ }
325
+ // ──────────────────────────────────────────────────────────────────────
326
+ // internal_helper.callers consistency (light)
327
+ // ──────────────────────────────────────────────────────────────────────
328
+ function checkRenderSourcePathCallers(m, findings) {
329
+ const helper = m?.api?.internal_helper;
330
+ if (!helper || typeof helper !== 'object')
331
+ return;
332
+ if (Array.isArray(helper.callers)) {
333
+ const seen = new Set();
334
+ const dupes = new Set();
335
+ for (const c of helper.callers) {
336
+ if (typeof c !== 'string')
337
+ continue;
338
+ const norm = c.split(' ')[0]; // first token (function name)
339
+ if (!norm)
340
+ continue;
341
+ if (seen.has(norm))
342
+ dupes.add(norm);
343
+ else
344
+ seen.add(norm);
345
+ }
346
+ for (const d of dupes) {
347
+ findings.push({
348
+ severity: 'warning',
349
+ rule: 'helper.callers_duplicate',
350
+ message: `api.internal_helper.callers lists "${d}" more than once (matched on leading token).`,
351
+ path: 'api.internal_helper.callers',
352
+ });
353
+ }
354
+ }
355
+ }
356
+ //# sourceMappingURL=checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checks.js","sourceRoot":"","sources":["../../src/manifest/checks.ts"],"names":[],"mappings":"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"}