@formigio/fazemos-cli 0.10.10 → 0.10.12
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/index.js +164 -1
- package/dist/index.js.map +1 -1
- package/dist/manifest/checks.d.ts +6 -0
- package/dist/manifest/checks.js +356 -0
- package/dist/manifest/checks.js.map +1 -0
- package/dist/manifest/schema.d.ts +314 -0
- package/dist/manifest/schema.js +208 -0
- package/dist/manifest/schema.js.map +1 -0
- package/dist/yaml/format.d.ts +5 -0
- package/dist/yaml/format.js +41 -0
- package/dist/yaml/format.js.map +1 -0
- package/dist/yaml/load.d.ts +28 -0
- package/dist/yaml/load.js +74 -0
- package/dist/yaml/load.js.map +1 -0
- package/package.json +5 -2
|
@@ -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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"}
|