@metaobjectsdev/cli 0.22.1 → 0.23.1-rc.1
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/src/commands/verify.d.ts.map +1 -1
- package/dist/src/commands/verify.js +117 -9
- package/dist/src/commands/verify.js.map +1 -1
- package/dist/src/lib/requirement-check.d.ts +30 -0
- package/dist/src/lib/requirement-check.d.ts.map +1 -1
- package/dist/src/lib/requirement-check.js +259 -13
- package/dist/src/lib/requirement-check.js.map +1 -1
- package/dist/src/lib/verified-by-scan.d.ts +3 -1
- package/dist/src/lib/verified-by-scan.d.ts.map +1 -1
- package/dist/src/lib/verified-by-scan.js +192 -16
- package/dist/src/lib/verified-by-scan.js.map +1 -1
- package/package.json +10 -10
- package/src/commands/verify.ts +133 -8
- package/src/lib/requirement-check.ts +275 -12
- package/src/lib/verified-by-scan.ts +202 -17
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// Two kinds, opposite checks: `functional` fails when NOTHING implements it;
|
|
21
21
|
// `architectural` fails when something VIOLATES it (v1: an empty claim set on a
|
|
22
22
|
// live policy — claim-set arithmetic, deliberately not a predicate DSL).
|
|
23
|
-
import { TYPE_OBJECT, TYPE_REQUIREMENT, OBJECT_SUBTYPE_ENTITY, PACKAGE_SEPARATOR, REQUIREMENT_SUBTYPE_ARCHITECTURAL, REQUIREMENT_LINK_FLOOR_LEVEL, REQUIREMENT_MIN_LEVEL, REQUIREMENT_MAX_LEVEL, REQUIREMENT_LEVEL_MEMBER, REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES, resolveObjectRef, didYouMeanHint, } from "@metaobjectsdev/metadata";
|
|
23
|
+
import { TYPE_OBJECT, TYPE_REQUIREMENT, OBJECT_SUBTYPE_ENTITY, PACKAGE_SEPARATOR, REQUIREMENT_SUBTYPE_ARCHITECTURAL, REQUIREMENT_LINK_FLOOR_LEVEL, REQUIREMENT_MIN_LEVEL, REQUIREMENT_MAX_LEVEL, REQUIREMENT_LEVEL_MEMBER, REQUIREMENT_DISPOSITION_DEFERRED, REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES, resolveObjectRef, didYouMeanHint, } from "@metaobjectsdev/metadata";
|
|
24
24
|
export const ERR_REQUIREMENT_LINK_ABOVE_FLOOR = "ERR_REQUIREMENT_LINK_ABOVE_FLOOR";
|
|
25
25
|
export const ERR_REQUIREMENT_DANGLING_REF = "ERR_REQUIREMENT_DANGLING_REF";
|
|
26
26
|
export const ERR_REQUIREMENT_BAD_LEVEL = "ERR_REQUIREMENT_BAD_LEVEL";
|
|
@@ -29,6 +29,9 @@ export const ERR_REQUIREMENT_L4_NOT_OBJECT = "ERR_REQUIREMENT_L4_NOT_OBJECT";
|
|
|
29
29
|
export const ERR_REQUIREMENT_L5_NOT_MEMBER = "ERR_REQUIREMENT_L5_NOT_MEMBER";
|
|
30
30
|
export const ERR_REQUIREMENT_ARCH_NO_IMPLEMENTERS = "ERR_REQUIREMENT_ARCH_NO_IMPLEMENTERS";
|
|
31
31
|
export const WARN_REQUIREMENT_OBJECT_UNCLAIMED = "WARN_REQUIREMENT_OBJECT_UNCLAIMED";
|
|
32
|
+
export const WARN_REQUIREMENT_DISPOSITION_NOT_APPLICABLE = "WARN_REQUIREMENT_DISPOSITION_NOT_APPLICABLE";
|
|
33
|
+
export const WARN_REQUIREMENT_DEFERRED_UNTRACKED = "WARN_REQUIREMENT_DEFERRED_UNTRACKED";
|
|
34
|
+
export const WARN_REQUIREMENT_NOTHING_IMPLEMENTS = "WARN_REQUIREMENT_NOTHING_IMPLEMENTS";
|
|
32
35
|
/** Severity of the object-coverage gate. Promotion to `"error"` is a one-line
|
|
33
36
|
* flip here, which activates an already-written test rather than requiring new
|
|
34
37
|
* authoring under release pressure.
|
|
@@ -65,6 +68,83 @@ export function splitMemberRef(ref) {
|
|
|
65
68
|
return { owner: ref, path: [] };
|
|
66
69
|
return { owner: ref.slice(0, dot), path: ref.slice(dot + 1).split(".") };
|
|
67
70
|
}
|
|
71
|
+
/** Resolution keys of every root-level object whose `extends` chain reaches
|
|
72
|
+
* `ancestor`. Walks the RESOLVED super pointer rather than the raw string, so a
|
|
73
|
+
* cross-package or dotted reference resolves the same way the loader resolved
|
|
74
|
+
* it — reading `superRef` here would be a second, divergent resolver. */
|
|
75
|
+
function subtypesOf(root, ancestor) {
|
|
76
|
+
const out = [];
|
|
77
|
+
for (const cand of root.children()) {
|
|
78
|
+
if (cand.type !== TYPE_OBJECT || cand === ancestor)
|
|
79
|
+
continue;
|
|
80
|
+
const seen = new Set();
|
|
81
|
+
let cur = cand.superData;
|
|
82
|
+
while (cur !== undefined && !seen.has(cur)) {
|
|
83
|
+
seen.add(cur);
|
|
84
|
+
if (cur === ancestor) {
|
|
85
|
+
out.push(cand.resolutionKey());
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
cur = cur.superData;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
/** True when this requirement, or anything nested beneath it, names an
|
|
94
|
+
* implementing node. Subtree-scoped deliberately: an L1 solution that delegates
|
|
95
|
+
* everything to its children implements nothing directly, and flagging that
|
|
96
|
+
* would fire on the correct shape of every tree. */
|
|
97
|
+
function subtreeClaimsAnything(req) {
|
|
98
|
+
if (req.implementedBy().length > 0)
|
|
99
|
+
return true;
|
|
100
|
+
for (const child of req.children()) {
|
|
101
|
+
if (child.type !== TYPE_REQUIREMENT)
|
|
102
|
+
continue;
|
|
103
|
+
if (subtreeClaimsAnything(child))
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve the owner segment of an `@implementedBy` reference to the node it names.
|
|
110
|
+
*
|
|
111
|
+
* OBJECTS FIRST, through the loader's own resolver, so package-local binding stays the
|
|
112
|
+
* ADR-0042 contract and never a parallel name scan (#228).
|
|
113
|
+
*
|
|
114
|
+
* Then ROOT-LEVEL NON-OBJECT nodes — `template.prompt` and its siblings today. The
|
|
115
|
+
* attribute is documented as naming "the model nodes realising this requirement", and a
|
|
116
|
+
* declared prompt is one: it is the durable artifact a capability like "the game master
|
|
117
|
+
* is told what the party can see" actually lives in. Resolving only objects meant the
|
|
118
|
+
* prompt estate — the thing whose retirement is hardest to see in a model, since a
|
|
119
|
+
* removed prompt leaves no table behind — was the one part of a model that could not
|
|
120
|
+
* carry a status. So L4 means "a declared top-level model node", not "an object".
|
|
121
|
+
*
|
|
122
|
+
* Requirements themselves are excluded: hierarchy is nesting, and a requirement claiming
|
|
123
|
+
* a requirement would be a second, contradictory parent mechanism.
|
|
124
|
+
*/
|
|
125
|
+
function resolveClaimTarget(root, owner, referrerPkg) {
|
|
126
|
+
const { node } = resolveObjectRef(root, owner, referrerPkg);
|
|
127
|
+
if (node !== undefined)
|
|
128
|
+
return node;
|
|
129
|
+
const candidates = root
|
|
130
|
+
.children()
|
|
131
|
+
.filter((c) => c.type !== TYPE_OBJECT && c.type !== TYPE_REQUIREMENT);
|
|
132
|
+
// A fully-qualified reference binds exactly, like every other FQN in the model.
|
|
133
|
+
if (owner.includes(PACKAGE_SEPARATOR)) {
|
|
134
|
+
return candidates.find((c) => c.resolutionKey() === owner);
|
|
135
|
+
}
|
|
136
|
+
// A bare reference prefers the referrer's own package, then a root-level node of that
|
|
137
|
+
// bare name. An ambiguous bare name binds NOTHING — same fail-closed rule objects use,
|
|
138
|
+
// because silently picking one of two same-named nodes is how a claim ends up pointing
|
|
139
|
+
// at the wrong thing without anyone noticing.
|
|
140
|
+
const local = referrerPkg === "" ? [] : candidates.filter((c) => c.resolutionKey() === `${referrerPkg}${PACKAGE_SEPARATOR}${owner}`);
|
|
141
|
+
if (local.length === 1)
|
|
142
|
+
return local[0];
|
|
143
|
+
// Root-level (unpackaged) only, matching resolveObjectRef's own bare fallback. A bare
|
|
144
|
+
// ref must not reach into an arbitrary package just because the name is unique there.
|
|
145
|
+
const bare = candidates.filter((c) => c.name === owner && c.resolutionKey() === owner);
|
|
146
|
+
return bare.length === 1 ? bare[0] : undefined;
|
|
147
|
+
}
|
|
68
148
|
/** Walk dotted member segments by CHILD NAME from an object node. */
|
|
69
149
|
function resolveMember(obj, path) {
|
|
70
150
|
let cur = obj;
|
|
@@ -90,6 +170,64 @@ export function collectRequirements(root) {
|
|
|
90
170
|
walk(root);
|
|
91
171
|
return out;
|
|
92
172
|
}
|
|
173
|
+
/**
|
|
174
|
+
* Resolution keys of every object claimed by a requirement.
|
|
175
|
+
*
|
|
176
|
+
* SHARED by the gate and the summary deliberately. The two used to compute this
|
|
177
|
+
* separately and drifted: the summary missed the extends-chain propagation the
|
|
178
|
+
* gate applies to an ARCHITECTURAL claim, so a project using the documented
|
|
179
|
+
* BaseEntity pattern got a summary reporting entities as unclaimed while the
|
|
180
|
+
* gate beneath it named none. A summary that contradicts its own diagnostics
|
|
181
|
+
* reads as a measurement and cannot be reconciled with the run that produced it.
|
|
182
|
+
*/
|
|
183
|
+
function claimedObjectKeys(root, reqs) {
|
|
184
|
+
const claimed = new Set();
|
|
185
|
+
for (const req of reqs) {
|
|
186
|
+
// A PLANNED requirement never contributes to coverage. Otherwise the
|
|
187
|
+
// cheapest way to clear an unclaimed-entity warning would be to declare an
|
|
188
|
+
// intention — the gate would measure ambition rather than work.
|
|
189
|
+
if (req.isPlanned())
|
|
190
|
+
continue;
|
|
191
|
+
// referrerPkg is the requirement's own effective package, so a bare ref
|
|
192
|
+
// binds package-locally under the ADR-0042 contract — the loader's own
|
|
193
|
+
// resolver, never a parallel name scan (#228).
|
|
194
|
+
const referrerPkg = req.package ?? req.fileDefaultPackage ?? "";
|
|
195
|
+
for (const ref of req.implementedBy()) {
|
|
196
|
+
const { owner, path } = splitMemberRef(ref);
|
|
197
|
+
const node = resolveClaimTarget(root, owner, referrerPkg);
|
|
198
|
+
if (node === undefined)
|
|
199
|
+
continue;
|
|
200
|
+
if (path.length > 0 && resolveMember(node, path) === undefined)
|
|
201
|
+
continue;
|
|
202
|
+
claimed.add(node.resolutionKey());
|
|
203
|
+
// ARCHITECTURAL claims propagate DOWN the extends chain; functional ones
|
|
204
|
+
// do not. A policy ("every row is addressable") claimed on an abstract
|
|
205
|
+
// BaseEntity genuinely holds for everything extending it — that is what
|
|
206
|
+
// universality means, and without this the documented BaseEntity pattern
|
|
207
|
+
// is worse than not using it. A functional claim is the opposite: it says
|
|
208
|
+
// this entity exists for a REASON, and inheriting a reason from a shared
|
|
209
|
+
// base would mean adding an entity no longer forces anyone to say what it
|
|
210
|
+
// is for. Same mechanism, opposite polarity — as everywhere else in the
|
|
211
|
+
// subtype split.
|
|
212
|
+
if (req.subType === REQUIREMENT_SUBTYPE_ARCHITECTURAL) {
|
|
213
|
+
for (const sub of subtypesOf(root, node))
|
|
214
|
+
claimed.add(sub);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return claimed;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* The entities object coverage measures — and the same set for the gate and the
|
|
222
|
+
* summary, for the reason given on `claimedObjectKeys`.
|
|
223
|
+
*
|
|
224
|
+
* An ABSTRACT entity is shape, not data: there is no table and no rows, so
|
|
225
|
+
* demanding a capability claim for it is the same category error as demanding
|
|
226
|
+
* one for an object.value. It is exempt for the same reason.
|
|
227
|
+
*/
|
|
228
|
+
function coverableEntities(root) {
|
|
229
|
+
return root.children().filter((n) => n.type === TYPE_OBJECT && n.subType === OBJECT_SUBTYPE_ENTITY && !n.isAbstract);
|
|
230
|
+
}
|
|
93
231
|
/**
|
|
94
232
|
* Check the requirement tree against the loaded model.
|
|
95
233
|
*
|
|
@@ -103,18 +241,29 @@ export function checkRequirements(root) {
|
|
|
103
241
|
const reqs = collectRequirements(root);
|
|
104
242
|
if (reqs.length === 0)
|
|
105
243
|
return out; // opt-in by declaration — no requirements, nothing to say
|
|
106
|
-
const claimedObjects =
|
|
244
|
+
const claimedObjects = claimedObjectKeys(root, reqs);
|
|
107
245
|
for (const req of reqs) {
|
|
108
246
|
const architectural = req.subType === REQUIREMENT_SUBTYPE_ARCHITECTURAL;
|
|
109
247
|
const level = req.level();
|
|
110
248
|
const refs = req.implementedBy();
|
|
111
|
-
|
|
112
|
-
|
|
249
|
+
// -- the level rules -------------------------------------------------------
|
|
250
|
+
// A functional requirement MUST be levelled. An architectural one MAY be,
|
|
251
|
+
// and levelling is the OPT-IN: unlevelled it is the original flat,
|
|
252
|
+
// object-independent policy and these rules must not touch it. Once a level
|
|
253
|
+
// is present the node has joined a tree, and `@level`'s own registered
|
|
254
|
+
// description promises that "the same rules as functional apply: nesting
|
|
255
|
+
// must agree with the level". Enforcing that here is what makes the promise
|
|
256
|
+
// true — a levelled architectural node used to be exempt from BOTH checks,
|
|
257
|
+
// so an ISO-25010 tree could re-ascend or declare a level 7 in silence.
|
|
258
|
+
const levelled = level !== undefined;
|
|
259
|
+
if (!architectural || levelled) {
|
|
260
|
+
if (!levelled || !Number.isInteger(level)
|
|
113
261
|
|| level < REQUIREMENT_MIN_LEVEL || level > REQUIREMENT_MAX_LEVEL) {
|
|
114
262
|
out.push({
|
|
115
263
|
severity: "error", code: ERR_REQUIREMENT_BAD_LEVEL, name: req.name,
|
|
116
264
|
message: `level must be an integer ${REQUIREMENT_MIN_LEVEL}-${REQUIREMENT_MAX_LEVEL} (got ${String(level)}). ` +
|
|
117
|
-
`L1 solution, L2 segment (app/library), L3 service, L4 object, L5 member
|
|
265
|
+
`L1 solution, L2 segment (app/library), L3 service, L4 object, L5 member.` +
|
|
266
|
+
(architectural ? ` On an architectural requirement the level is optional — omit it for a flat policy.` : ``),
|
|
118
267
|
});
|
|
119
268
|
}
|
|
120
269
|
// Nesting IS the hierarchy, so a child must sit strictly below its parent.
|
|
@@ -146,11 +295,18 @@ export function checkRequirements(root) {
|
|
|
146
295
|
// binds package-locally under the ADR-0042 contract — the loader's own
|
|
147
296
|
// resolver, never a parallel name scan (#228).
|
|
148
297
|
const referrerPkg = req.package ?? req.fileDefaultPackage ?? "";
|
|
149
|
-
const
|
|
298
|
+
const node = resolveClaimTarget(root, owner, referrerPkg);
|
|
150
299
|
const isObjectRef = path.length === 0;
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
300
|
+
// GRAIN, and it stays functional-only DELIBERATELY. On a functional
|
|
301
|
+
// requirement L4 and L5 MEAN "an object" and "a member" — that is what the
|
|
302
|
+
// allocation step allocates. On a levelled architectural one the upper
|
|
303
|
+
// tiers are a quality taxonomy and L4/L5 retain only their link-floor
|
|
304
|
+
// meaning, so a policy whose claim set legitimately mixes grains ("every
|
|
305
|
+
// money FIELD declares its currency", claimed alongside the entities that
|
|
306
|
+
// hold them) must not be forced to split by grain to say so. Extending
|
|
307
|
+
// this to architectural would be a new rule, not the missing half of an
|
|
308
|
+
// existing one — unlike the level checks above, which `@level` already
|
|
309
|
+
// promised.
|
|
154
310
|
if (!architectural && level === REQUIREMENT_LINK_FLOOR_LEVEL && !isObjectRef) {
|
|
155
311
|
out.push({
|
|
156
312
|
severity: "error", code: ERR_REQUIREMENT_L4_NOT_OBJECT, name: req.name,
|
|
@@ -189,13 +345,57 @@ export function checkRequirements(root) {
|
|
|
189
345
|
const status = req.status();
|
|
190
346
|
const live = status !== undefined
|
|
191
347
|
&& REQUIREMENT_STATUSES_REQUIRING_LIVE_NODES.includes(status);
|
|
192
|
-
|
|
348
|
+
// Two exemptions, both structural rather than lenient.
|
|
349
|
+
//
|
|
350
|
+
// `planned` — a policy that is not built yet is SUPPOSED to be applied to
|
|
351
|
+
// nothing, so the check would fire on precisely the entries it should stay
|
|
352
|
+
// quiet about.
|
|
353
|
+
//
|
|
354
|
+
// An ORGANISATIONAL node in a levelled architectural tree — an "ISO 25010
|
|
355
|
+
// Security" at L1 delegates to its children and names nothing, exactly as
|
|
356
|
+
// an L1 functional node does. mayReferenceModel() is the right predicate
|
|
357
|
+
// because it already encodes "is this tier allowed to name the model at
|
|
358
|
+
// all": true for a flat policy (the original form), false for L1-L3 of a
|
|
359
|
+
// levelled one, true again at the link floor.
|
|
360
|
+
if (architectural && live && refs.length === 0 && req.mayReferenceModel()) {
|
|
193
361
|
out.push({
|
|
194
362
|
severity: "error", code: ERR_REQUIREMENT_ARCH_NO_IMPLEMENTERS, name: req.name,
|
|
195
363
|
message: `architectural requirement is '${String(status)}' but nothing implements it. ` +
|
|
196
364
|
`Its check is universality — a claim set of zero means the policy is declared and unapplied.`,
|
|
197
365
|
});
|
|
198
366
|
}
|
|
367
|
+
// -- disposition: the decision, not the state -----------------------------
|
|
368
|
+
const disposition = req.disposition();
|
|
369
|
+
if (disposition !== undefined && !req.hasOutstandingWork()) {
|
|
370
|
+
out.push({
|
|
371
|
+
severity: "warn", code: WARN_REQUIREMENT_DISPOSITION_NOT_APPLICABLE, name: req.name,
|
|
372
|
+
message: `carries @disposition '${disposition}' but its status is '${String(status)}', which has no ` +
|
|
373
|
+
`outstanding work to decide about. A disposition is meaningful on 'planned' and 'partial' only — ` +
|
|
374
|
+
`on any other status the decision IS the status.`,
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
// -- functional existence, SUBTREE-scoped ---------------------------------
|
|
378
|
+
// A functional requirement's check is EXISTENCE: it fails when nothing
|
|
379
|
+
// implements it. But an organisational tier legitimately implements nothing
|
|
380
|
+
// ITSELF — it delegates to children, and that is the whole shape of the
|
|
381
|
+
// tree. So the question is not "does this node claim anything" but "does
|
|
382
|
+
// anything in this subtree claim anything". A live L1 whose entire subtree
|
|
383
|
+
// is empty is a capability declared and built by nobody.
|
|
384
|
+
if (!architectural && live && !subtreeClaimsAnything(req)) {
|
|
385
|
+
out.push({
|
|
386
|
+
severity: "warn", code: WARN_REQUIREMENT_NOTHING_IMPLEMENTS, name: req.name,
|
|
387
|
+
message: `is '${String(status)}' but neither it nor anything nested under it names an ` +
|
|
388
|
+
`implementing node. A functional requirement's check is existence — a subtree that claims ` +
|
|
389
|
+
`nothing is a capability nobody built.`,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
if (disposition === REQUIREMENT_DISPOSITION_DEFERRED && req.trackedBy().length === 0) {
|
|
393
|
+
out.push({
|
|
394
|
+
severity: "warn", code: WARN_REQUIREMENT_DEFERRED_UNTRACKED, name: req.name,
|
|
395
|
+
message: `is deferred but names no @trackedBy issue. Deferring without a ticket is how a known gap ` +
|
|
396
|
+
`becomes an unknown one — nothing will raise it again.`,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
199
399
|
}
|
|
200
400
|
// -- object coverage: adding an entity forces a requirement -----------------
|
|
201
401
|
// Binary per entity, never a ratio: a "% claimed" number measures what the
|
|
@@ -218,9 +418,7 @@ export function checkRequirements(root) {
|
|
|
218
418
|
//
|
|
219
419
|
// So a green run means "every entity is claimed by something", not "every node is
|
|
220
420
|
// described". The stronger reading would be false.
|
|
221
|
-
for (const ent of root
|
|
222
|
-
if (ent.type !== TYPE_OBJECT || ent.subType !== OBJECT_SUBTYPE_ENTITY)
|
|
223
|
-
continue;
|
|
421
|
+
for (const ent of coverableEntities(root)) {
|
|
224
422
|
const key = ent.resolutionKey();
|
|
225
423
|
if (!claimedObjects.has(key)) {
|
|
226
424
|
out.push({
|
|
@@ -231,4 +429,52 @@ export function checkRequirements(root) {
|
|
|
231
429
|
}
|
|
232
430
|
return out;
|
|
233
431
|
}
|
|
432
|
+
/**
|
|
433
|
+
* Count what the ledger contains, for the line `meta verify` prints on EVERY
|
|
434
|
+
* run — including a clean one.
|
|
435
|
+
*
|
|
436
|
+
* This exists because silence is ambiguous. A run that prints nothing cannot be
|
|
437
|
+
* told apart from a run that checked nothing, and an entry that skipped a whole
|
|
438
|
+
* grain of the model looks exactly like one that covered it. The counts below
|
|
439
|
+
* are deliberately the ones an author would otherwise have to write a script to
|
|
440
|
+
* get: how many gaps are recorded, and how many of those nobody has ruled on.
|
|
441
|
+
*/
|
|
442
|
+
export function summariseRequirements(root) {
|
|
443
|
+
const reqs = collectRequirements(root);
|
|
444
|
+
if (reqs.length === 0)
|
|
445
|
+
return undefined; // opt-in by declaration
|
|
446
|
+
const summary = {
|
|
447
|
+
total: reqs.length,
|
|
448
|
+
functional: 0,
|
|
449
|
+
architectural: 0,
|
|
450
|
+
byStatus: {},
|
|
451
|
+
undecided: 0,
|
|
452
|
+
deferredUntracked: 0,
|
|
453
|
+
entitiesTotal: 0,
|
|
454
|
+
entitiesClaimed: 0,
|
|
455
|
+
};
|
|
456
|
+
for (const req of reqs) {
|
|
457
|
+
if (req.subType === REQUIREMENT_SUBTYPE_ARCHITECTURAL)
|
|
458
|
+
summary.architectural++;
|
|
459
|
+
else
|
|
460
|
+
summary.functional++;
|
|
461
|
+
const status = req.status();
|
|
462
|
+
if (status !== undefined)
|
|
463
|
+
summary.byStatus[status] = (summary.byStatus[status] ?? 0) + 1;
|
|
464
|
+
if (req.hasOutstandingWork() && req.disposition() === undefined)
|
|
465
|
+
summary.undecided++;
|
|
466
|
+
if (req.disposition() === REQUIREMENT_DISPOSITION_DEFERRED && req.trackedBy().length === 0) {
|
|
467
|
+
summary.deferredUntracked++;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
// Both sides of the ratio come from the SAME helpers the gate uses, so the
|
|
471
|
+
// printed summary cannot disagree with the diagnostics printed beneath it.
|
|
472
|
+
const claimed = claimedObjectKeys(root, reqs);
|
|
473
|
+
for (const ent of coverableEntities(root)) {
|
|
474
|
+
summary.entitiesTotal++;
|
|
475
|
+
if (claimed.has(ent.resolutionKey()))
|
|
476
|
+
summary.entitiesClaimed++;
|
|
477
|
+
}
|
|
478
|
+
return summary;
|
|
479
|
+
}
|
|
234
480
|
//# sourceMappingURL=requirement-check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirement-check.js","sourceRoot":"","sources":["../../../src/lib/requirement-check.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"requirement-check.js","sourceRoot":"","sources":["../../../src/lib/requirement-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { type MetaData } from "@metaobjectsdev/metadata";
|
|
2
2
|
export declare const ERR_REQUIREMENT_TEST_MISSING = "ERR_REQUIREMENT_TEST_MISSING";
|
|
3
3
|
export declare const WARN_REQUIREMENT_TEST_SKIPPED = "WARN_REQUIREMENT_TEST_SKIPPED";
|
|
4
|
+
export declare const WARN_REQUIREMENT_TEST_COMMENT_ONLY = "WARN_REQUIREMENT_TEST_COMMENT_ONLY";
|
|
5
|
+
export declare const WARN_REQUIREMENT_TEST_UNCLASSIFIED = "WARN_REQUIREMENT_TEST_UNCLASSIFIED";
|
|
4
6
|
export interface VerifiedByDiagnostic {
|
|
5
7
|
severity: "error" | "warn";
|
|
6
8
|
code: string;
|
|
@@ -14,5 +16,5 @@ export interface VerifiedByDiagnostic {
|
|
|
14
16
|
* and silent on `abandoned`/`superseded`, because a retired requirement naming a
|
|
15
17
|
* deleted test is the entry doing its job, not drift.
|
|
16
18
|
*/
|
|
17
|
-
export declare function checkVerifiedBy(root: MetaData, cwd: string): VerifiedByDiagnostic[];
|
|
19
|
+
export declare function checkVerifiedBy(root: MetaData, cwd: string, testFiles?: string[]): VerifiedByDiagnostic[];
|
|
18
20
|
//# sourceMappingURL=verified-by-scan.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verified-by-scan.d.ts","sourceRoot":"","sources":["../../../src/lib/verified-by-scan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"verified-by-scan.d.ts","sourceRoot":"","sources":["../../../src/lib/verified-by-scan.ts"],"names":[],"mappings":"AA2CA,OAAO,EAEL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAElC,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAC3E,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAC7E,eAAO,MAAM,kCAAkC,uCAAuC,CAAC;AACvF,eAAO,MAAM,kCAAkC,uCAAuC,CAAC;AAEvF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAwMD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,oBAAoB,EAAE,CAwGxB"}
|