spec-controller 0.1.0-alpha.4 → 0.1.0-alpha.5
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/cli-args.d.ts +1 -1
- package/dist/cli-args.js +1 -1
- package/dist/cli-balance/cli.d.ts +18 -1
- package/dist/cli-balance/cli.d.ts.map +1 -1
- package/dist/cli-balance/cli.js +159 -149
- package/dist/cli-balance/cli.js.map +1 -1
- package/dist/cli-registry.d.ts.map +1 -1
- package/dist/cli-registry.js +0 -5
- package/dist/cli-registry.js.map +1 -1
- package/dist/corpus/cli.d.ts.map +1 -1
- package/dist/corpus/cli.js +1 -4
- package/dist/corpus/cli.js.map +1 -1
- package/dist/ingest/ingestQualityChecks.d.ts +0 -25
- package/dist/ingest/ingestQualityChecks.d.ts.map +1 -1
- package/dist/ingest/ingestQualityChecks.js +7 -79
- package/dist/ingest/ingestQualityChecks.js.map +1 -1
- package/package.json +2 -2
- package/dist/mutation-ratchet/index.d.ts +0 -51
- package/dist/mutation-ratchet/index.d.ts.map +0 -1
- package/dist/mutation-ratchet/index.js +0 -51
- package/dist/mutation-ratchet/index.js.map +0 -1
- package/dist/mutation-ratchet/record.d.ts +0 -178
- package/dist/mutation-ratchet/record.d.ts.map +0 -1
- package/dist/mutation-ratchet/record.js +0 -314
- package/dist/mutation-ratchet/record.js.map +0 -1
- package/dist/mutation-ratchet/report.d.ts +0 -109
- package/dist/mutation-ratchet/report.d.ts.map +0 -1
- package/dist/mutation-ratchet/report.js +0 -156
- package/dist/mutation-ratchet/report.js.map +0 -1
package/dist/cli-args.d.ts
CHANGED
|
@@ -51,7 +51,7 @@ export declare function parseArgs(argv: readonly string[]): Record<string, strin
|
|
|
51
51
|
* The dispatcher refuses such a command before this is ever reached, so the case is unreachable
|
|
52
52
|
* today and stated here so it cannot become a silent "accept everything" later.
|
|
53
53
|
*
|
|
54
|
-
* IT NAMES THE VERSION THAT REFUSED, AND THAT IS FOR THE PINNED READER (3F-3105, @SCN-
|
|
54
|
+
* IT NAMES THE VERSION THAT REFUSED, AND THAT IS FOR THE PINNED READER (3F-3105, @SCN-CLI-009).
|
|
55
55
|
* A consumer pins spec-controller and then moves their own tree; the pinned reader is handed argv
|
|
56
56
|
* it was published too early — or too late — to understand, and an unadorned "unknown flag" is
|
|
57
57
|
* indistinguishable from a typo. Naming the running version makes version skew legible from the CI
|
package/dist/cli-args.js
CHANGED
|
@@ -67,7 +67,7 @@ export function parseArgs(argv) {
|
|
|
67
67
|
* The dispatcher refuses such a command before this is ever reached, so the case is unreachable
|
|
68
68
|
* today and stated here so it cannot become a silent "accept everything" later.
|
|
69
69
|
*
|
|
70
|
-
* IT NAMES THE VERSION THAT REFUSED, AND THAT IS FOR THE PINNED READER (3F-3105, @SCN-
|
|
70
|
+
* IT NAMES THE VERSION THAT REFUSED, AND THAT IS FOR THE PINNED READER (3F-3105, @SCN-CLI-009).
|
|
71
71
|
* A consumer pins spec-controller and then moves their own tree; the pinned reader is handed argv
|
|
72
72
|
* it was published too early — or too late — to understand, and an unadorned "unknown flag" is
|
|
73
73
|
* indistinguishable from a typo. Naming the running version makes version skew legible from the CI
|
|
@@ -32,6 +32,23 @@ export declare function checkLegacyJson(args: Record<string, string>): string |
|
|
|
32
32
|
* explicit default.
|
|
33
33
|
*/
|
|
34
34
|
export declare function sourceTarget(args: Record<string, string>): string;
|
|
35
|
+
/**
|
|
36
|
+
* Guard the supplied input-file/dir flags at the CLI edge (@SCN-CLI-002). A
|
|
37
|
+
* mistyped `--vitest` / `--cucumber` / `--features` / `--ci` / `--package-json`
|
|
38
|
+
* pointing at a non-existent path used to reconcile silently against ZERO evidence —
|
|
39
|
+
* a terrifying false all-red report meaning "you forgot the reports", not "your code
|
|
40
|
+
* is broken" (the dogfooding fault). These flags are Examples of ONE boundary
|
|
41
|
+
* rule: a supplied-but-absent input path is a hard error, and a flag added to the set
|
|
42
|
+
* inherits it rather than restating it. Scope is existence only
|
|
43
|
+
* (readability / file-vs-dir type-correctness out of scope; `exists` covers the dir
|
|
44
|
+
* flag and the file flags alike).
|
|
45
|
+
*
|
|
46
|
+
* PURE and `@unit`-testable like `checkLegacyJson` / `sourceTarget`: reads the parsed
|
|
47
|
+
* args + an injected `exists` fn (no fs), returns the FIRST supplied-but-absent
|
|
48
|
+
* `(flag, path)` as a typed error naming both — routed to stderr + a non-zero exit by
|
|
49
|
+
* `refuseUnreadableInputs` (the shared typed-error surface) — else null. An OMITTED flag is not an
|
|
50
|
+
* error (legitimately optional: simply no evidence of that kind).
|
|
51
|
+
*/
|
|
35
52
|
export declare function checkInputsExist(args: Record<string, string>, exists: (path: string) => boolean): string | null;
|
|
36
53
|
/**
|
|
37
54
|
* Guard the READABILITY of the supplied JSON inputs at the CLI edge (@SCN-CLI-014).
|
|
@@ -44,7 +61,7 @@ export declare function checkInputsExist(args: Record<string, string>, exists: (
|
|
|
44
61
|
*
|
|
45
62
|
* PURE and `@unit`-testable like its sibling guards: reads the parsed args + an injected
|
|
46
63
|
* `read` fn (no fs), returns the FIRST supplied-but-unparseable `(flag, path, failure)` as
|
|
47
|
-
* a typed error naming all three — routed to stderr + exit 2 by `
|
|
64
|
+
* a typed error naming all three — routed to stderr + exit 2 by `refuseUnreadableInputs` — else null.
|
|
48
65
|
* An omitted flag is not an error, and an unreadable file (a race after the existence
|
|
49
66
|
* check) reports as the same input fault rather than escaping as a crash.
|
|
50
67
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiDH;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAS3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEjE;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAiDH;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAS3E;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEjE;AAqBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAChC,MAAM,GAAG,IAAI,CAcf;AAYD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,GAAG,IAAI,CAef;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,GAAG,IAAI,CAcf;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiJ/C"}
|
package/dist/cli-balance/cli.js
CHANGED
|
@@ -72,23 +72,6 @@ export function checkLegacyJson(args) {
|
|
|
72
72
|
export function sourceTarget(args) {
|
|
73
73
|
return args["target"] ?? "unknown-target";
|
|
74
74
|
}
|
|
75
|
-
/**
|
|
76
|
-
* Guard the supplied input-file/dir flags at the CLI edge (@SCN-CLI-002). A
|
|
77
|
-
* mistyped `--vitest` / `--cucumber` / `--features` / `--ci` / `--package-json`
|
|
78
|
-
* pointing at a non-existent path used to reconcile silently against ZERO evidence —
|
|
79
|
-
* a terrifying false all-red report meaning "you forgot the reports", not "your code
|
|
80
|
-
* is broken" (the dogfooding fault). These flags are Examples of ONE boundary
|
|
81
|
-
* rule: a supplied-but-absent input path is a hard error, and a flag added to the set
|
|
82
|
-
* inherits it rather than restating it. Scope is existence only
|
|
83
|
-
* (readability / file-vs-dir type-correctness out of scope; `exists` covers the dir
|
|
84
|
-
* flag and the file flags alike).
|
|
85
|
-
*
|
|
86
|
-
* PURE and `@unit`-testable like `checkLegacyJson` / `sourceTarget`: reads the parsed
|
|
87
|
-
* args + an injected `exists` fn (no fs), returns the FIRST supplied-but-absent
|
|
88
|
-
* `(flag, path)` as a typed error naming both — routed to stderr + a non-zero exit by
|
|
89
|
-
* `runBalance` (the shared typed-error surface) — else null. An OMITTED flag is not an
|
|
90
|
-
* error (legitimately optional: simply no evidence of that kind).
|
|
91
|
-
*/
|
|
92
75
|
/**
|
|
93
76
|
* The parsed args, as the reconciler's input paths — the one place a `--flag` name becomes a
|
|
94
77
|
* `ReconcileOptions` key.
|
|
@@ -104,16 +87,32 @@ function reconcileInputsOf(args) {
|
|
|
104
87
|
cucumber: args["cucumber"],
|
|
105
88
|
ci: args["ci"],
|
|
106
89
|
packageJson: args["package-json"],
|
|
107
|
-
measurements: args["measurements"],
|
|
108
90
|
ciSteps: args["ci-steps"],
|
|
109
91
|
};
|
|
110
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* Guard the supplied input-file/dir flags at the CLI edge (@SCN-CLI-002). A
|
|
95
|
+
* mistyped `--vitest` / `--cucumber` / `--features` / `--ci` / `--package-json`
|
|
96
|
+
* pointing at a non-existent path used to reconcile silently against ZERO evidence —
|
|
97
|
+
* a terrifying false all-red report meaning "you forgot the reports", not "your code
|
|
98
|
+
* is broken" (the dogfooding fault). These flags are Examples of ONE boundary
|
|
99
|
+
* rule: a supplied-but-absent input path is a hard error, and a flag added to the set
|
|
100
|
+
* inherits it rather than restating it. Scope is existence only
|
|
101
|
+
* (readability / file-vs-dir type-correctness out of scope; `exists` covers the dir
|
|
102
|
+
* flag and the file flags alike).
|
|
103
|
+
*
|
|
104
|
+
* PURE and `@unit`-testable like `checkLegacyJson` / `sourceTarget`: reads the parsed
|
|
105
|
+
* args + an injected `exists` fn (no fs), returns the FIRST supplied-but-absent
|
|
106
|
+
* `(flag, path)` as a typed error naming both — routed to stderr + a non-zero exit by
|
|
107
|
+
* `refuseUnreadableInputs` (the shared typed-error surface) — else null. An OMITTED flag is not an
|
|
108
|
+
* error (legitimately optional: simply no evidence of that kind).
|
|
109
|
+
*/
|
|
111
110
|
export function checkInputsExist(args, exists) {
|
|
112
111
|
// The input flags in a fixed order — the FIRST supplied-but-absent one is the
|
|
113
112
|
// reported error (deterministic; the operator fixes and re-runs). Keys are the
|
|
114
113
|
// parseArgs form (the `--` stripped); the message names the flag WITH its dashes.
|
|
115
114
|
const flags = [
|
|
116
|
-
"vitest", "cucumber", "features", "ci", "package-json", "
|
|
115
|
+
"vitest", "cucumber", "features", "ci", "package-json", "ci-steps",
|
|
117
116
|
];
|
|
118
117
|
for (const flag of flags) {
|
|
119
118
|
const path = args[flag];
|
|
@@ -130,7 +129,7 @@ export function checkInputsExist(args, exists) {
|
|
|
130
129
|
* process, and on garbage both reconcile normally (verified, 3F-1742 Discovery).
|
|
131
130
|
*/
|
|
132
131
|
const JSON_INPUT_FLAGS = [
|
|
133
|
-
"vitest", "cucumber", "package-json", "
|
|
132
|
+
"vitest", "cucumber", "package-json", "ci-steps",
|
|
134
133
|
];
|
|
135
134
|
/**
|
|
136
135
|
* Guard the READABILITY of the supplied JSON inputs at the CLI edge (@SCN-CLI-014).
|
|
@@ -143,7 +142,7 @@ const JSON_INPUT_FLAGS = [
|
|
|
143
142
|
*
|
|
144
143
|
* PURE and `@unit`-testable like its sibling guards: reads the parsed args + an injected
|
|
145
144
|
* `read` fn (no fs), returns the FIRST supplied-but-unparseable `(flag, path, failure)` as
|
|
146
|
-
* a typed error naming all three — routed to stderr + exit 2 by `
|
|
145
|
+
* a typed error naming all three — routed to stderr + exit 2 by `refuseUnreadableInputs` — else null.
|
|
147
146
|
* An omitted flag is not an error, and an unreadable file (a race after the existence
|
|
148
147
|
* check) reports as the same input fault rather than escaping as a crash.
|
|
149
148
|
*/
|
|
@@ -217,13 +216,8 @@ export function runBalance(argv) {
|
|
|
217
216
|
// guard's typed error is routed to stderr + a non-zero exit, exactly as planOutput's error
|
|
218
217
|
// is below (the shared typed-error surface).
|
|
219
218
|
const legacyJsonError = checkLegacyJson(args);
|
|
220
|
-
if (legacyJsonError)
|
|
221
|
-
|
|
222
|
-
// Usage/config error → exit 2 (the enumerated usage code, @SCN-CLI-002), distinct
|
|
223
|
-
// from the out-of-balance verdict code 1 (@SCN-CLI-004): an out-of-balance run must
|
|
224
|
-
// never masquerade as a usage error, nor the reverse.
|
|
225
|
-
process.exit(2);
|
|
226
|
-
}
|
|
219
|
+
if (legacyJsonError)
|
|
220
|
+
exitUsage(legacyJsonError);
|
|
227
221
|
// Registry-bounded parse (@SCN-CLI-009): `balance` accepts ONLY the flags its registry
|
|
228
222
|
// scope LISTS. An unregistered flag — a typo `--strcit`, a stray `--bogus` — is a
|
|
229
223
|
// USAGE error: name it on stderr, set process.exitCode = 2 (the enumerated usage code,
|
|
@@ -238,97 +232,9 @@ export function runBalance(argv) {
|
|
|
238
232
|
process.exitCode = 2;
|
|
239
233
|
return;
|
|
240
234
|
}
|
|
241
|
-
|
|
242
|
-
// banked spec-reconciliation.json ALONE — no reconcile, no live inputs, no RunContext. Reads
|
|
243
|
-
// the file, JSON.parses it back into the whole-document report model, renders the markdown via
|
|
244
|
-
// renderReport, and writes it to stdout (the same trailing-newline convention as the writer's
|
|
245
|
-
// stdout path). The load-bearing proof that the JSON IS the model — returns before any reconcile.
|
|
246
|
-
// Saved-report READABILITY guard (@SCN-CLI-015). This branch RETURNS before the input
|
|
247
|
-
// guards below ever run, so it honoured NEITHER: a missing path crashed to ENOENT and a
|
|
248
|
-
// malformed file to SyntaxError, both landing on Node's default exit 1 — the
|
|
249
|
-
// out-of-balance code. The missing-path case was a live violation of @SCN-CLI-002's own
|
|
250
|
-
// shipped principle, which the CLI enforced for the five evidence flags and not for this
|
|
251
|
-
// one. The guard therefore runs INSIDE this branch, ahead of the read (3F-1764).
|
|
252
|
-
const unreadableSavedReportError = checkRenderFromJson(args, (path) => readFileSync(path, "utf8"));
|
|
253
|
-
if (unreadableSavedReportError) {
|
|
254
|
-
process.stderr.write(unreadableSavedReportError + "\n");
|
|
255
|
-
process.exit(2);
|
|
256
|
-
}
|
|
257
|
-
const rehydratePath = args["render-from-json"];
|
|
258
|
-
if (rehydratePath !== undefined) {
|
|
259
|
-
const savedReport = readFileSync(rehydratePath, "utf8");
|
|
260
|
-
process.stdout.write(renderReportFromJson(savedReport) + "\n");
|
|
235
|
+
if (renderSavedReport(args))
|
|
261
236
|
return;
|
|
262
|
-
|
|
263
|
-
// Input-existence guard (@SCN-CLI-002): a supplied input-file/dir flag pointing at a
|
|
264
|
-
// non-existent path is a HARD ERROR — halt BEFORE reconciling, with a typed message
|
|
265
|
-
// naming the flag + path, never the silent zero-evidence all-red report a mistyped
|
|
266
|
-
// path used to produce (the dogfooding fault). Routed to stderr + a non-zero exit,
|
|
267
|
-
// exactly as the legacy-`--json` guard above (the shared typed-error surface). An
|
|
268
|
-
// omitted flag is legitimately optional and passes through untouched.
|
|
269
|
-
const missingInputError = checkInputsExist(args, existsSync);
|
|
270
|
-
if (missingInputError) {
|
|
271
|
-
process.stderr.write(missingInputError + "\n");
|
|
272
|
-
// Usage/input error → exit 2 (@SCN-CLI-002), distinct from the out-of-balance
|
|
273
|
-
// verdict code 1 (@SCN-CLI-004).
|
|
274
|
-
process.exit(2);
|
|
275
|
-
}
|
|
276
|
-
// Input-READABILITY guard (@SCN-CLI-014): existence is not enough. A report that is
|
|
277
|
-
// PRESENT but UNPARSEABLE (`--vitest /dev/null`, truncated JSON, non-JSON) used to throw
|
|
278
|
-
// mid-parse inside reconcileWithCensus, uncaught — and Node's default exit code is 1, the
|
|
279
|
-
// code reserved for a genuine OUT-OF-BALANCE verdict (@SCN-CLI-004). So a tool that
|
|
280
|
-
// CRASHED before reconciling was indistinguishable, by exit code, from an honest
|
|
281
|
-
// disagreement (3F-1742). Runs immediately after the existence guard and BEFORE any
|
|
282
|
-
// reconcile, routing to the same stderr + exit 2 lane: an input the tool cannot read is a
|
|
283
|
-
// usage fault, sibling to a missing path and an unrecognised flag — never a verdict.
|
|
284
|
-
const unparseableInputError = checkInputsParse(args, (path) => readFileSync(path, "utf8"));
|
|
285
|
-
if (unparseableInputError) {
|
|
286
|
-
process.stderr.write(unparseableInputError + "\n");
|
|
287
|
-
process.exit(2);
|
|
288
|
-
}
|
|
289
|
-
// The FEATURE-CORPUS integrity checkpoint (@SCN-CLI-016, 3F-1767). The feature corpus is an
|
|
290
|
-
// input too — the ledger's DEBIT side — and it was read by a hand-rolled TAG-LINE SCAN that
|
|
291
|
-
// never consulted a parser. So a malformed tag line simply stopped being a tag line and its
|
|
292
|
-
// scenario CEASED TO EXIST: one stray character deleted a failing row and turned an
|
|
293
|
-
// out-of-balance run (exit 1) into a clean BALANCED (exit 0). A dropped scenario cannot even
|
|
294
|
-
// reconcile `missing`, because it was never RAISED to be missing — the run read cleaner than
|
|
295
|
-
// reality, the exact false-green this tool exists to prevent.
|
|
296
|
-
//
|
|
297
|
-
// Validated with the REAL Gherkin parser (cucumber's own), so a file the tool would reconcile is
|
|
298
|
-
// at least a file cucumber would RUN. A file it rejects is an input we CANNOT READ: exit 2,
|
|
299
|
-
// halting BEFORE any reconcile, naming the file and the parse failure — the same Rule as
|
|
300
|
-
// @SCN-CLI-014 and @SCN-CLI-015 ("an input the tool cannot read is a usage error, never a
|
|
301
|
-
// verdict"), now on the obligation side. Never a verdict, and never a green.
|
|
302
|
-
//
|
|
303
|
-
// The corpus is EXTRACTED from the same real AST (@SCN-LDG-020), so what the tool reconciles is
|
|
304
|
-
// what cucumber runs — Feature/Rule tag inheritance included. This guard decides whether the file
|
|
305
|
-
// can be read at all; parseScenarios then reads it exactly as cucumber would.
|
|
306
|
-
const featureParseErrors = featureCorpusParseErrors(args["features"]);
|
|
307
|
-
if (featureParseErrors.length > 0) {
|
|
308
|
-
for (const { file, message } of featureParseErrors) {
|
|
309
|
-
process.stderr.write(`The --features corpus contains a feature file that could not be parsed: ${file}\n${message}\n`);
|
|
310
|
-
}
|
|
311
|
-
process.exit(2);
|
|
312
|
-
}
|
|
313
|
-
// AMBIGUOUS-CORPUS guard (@SCN-LDG-020's guardrail, 3F-1775). An @SCN identifies exactly ONE
|
|
314
|
-
// scenario — that is the whole basis of attributing evidence to it. Tag inheritance makes a
|
|
315
|
-
// DUPLICATE reachable: an @SCN hoisted to a Feature:/Rule: is inherited by every scenario
|
|
316
|
-
// beneath it (cucumber does this, so we do). One passing test would then mark EVERY scenario
|
|
317
|
-
// sharing that id `balanced` — including scenarios nothing proves — a BALANCED-WHEN-BROKEN run
|
|
318
|
-
// at exit 0. A new silent false-green, introduced by the very fix that closed the last one.
|
|
319
|
-
//
|
|
320
|
-
// So the corpus is REFUSED, not reconciled: the tool cannot know which scenario a citing test
|
|
321
|
-
// proves, and any verdict over it would be a guess. Same Rule as @SCN-CLI-014/015/016 — an input
|
|
322
|
-
// the tool cannot read is a usage error, never a verdict.
|
|
323
|
-
const duplicateScnIds = featureCorpusDuplicateScnIds(args["features"]);
|
|
324
|
-
if (duplicateScnIds.length > 0) {
|
|
325
|
-
process.stderr.write(`The --features corpus names the same @SCN on more than one scenario: ` +
|
|
326
|
-
`${duplicateScnIds.join(", ")}.\n` +
|
|
327
|
-
`An @SCN identifies exactly one scenario — evidence citing a duplicated id cannot be ` +
|
|
328
|
-
`attributed, so no verdict over this corpus would be trustworthy. (An @SCN on a Feature: ` +
|
|
329
|
-
`or Rule: line is inherited by every scenario beneath it — name it on the scenario.)\n`);
|
|
330
|
-
process.exit(2);
|
|
331
|
-
}
|
|
237
|
+
refuseUnreadableInputs(args);
|
|
332
238
|
const inputs = reconcileInputsOf(args);
|
|
333
239
|
// Reconcile the obligation-vs-observation evidence into the Ledger. The runtime evidence-observation
|
|
334
240
|
// views (Test volume, the evidence grid) are FOLDS the renderers derive off this Ledger's posted
|
|
@@ -348,31 +254,7 @@ export function runBalance(argv) {
|
|
|
348
254
|
// — the by-feature cut's full-name labels. The 5th sibling, threaded to the MARKDOWN
|
|
349
255
|
// renderer via writeOutputs only (markdown-only; the by-feature cut isn't on JSON).
|
|
350
256
|
const featureNames = readFeatureNames(args["features"]);
|
|
351
|
-
|
|
352
|
-
// Ledger staying pure — reusing the existing runStart. The target is the
|
|
353
|
-
// operator's --target VERBATIM (unknown-target on omit; Fork A — no
|
|
354
|
-
// resolution, no basename guessing). Source SHA via the read-only target read, with
|
|
355
|
-
// --source-sha as the override (resolveSourceSha).
|
|
356
|
-
const ctx = {
|
|
357
|
-
target: sourceTarget(args),
|
|
358
|
-
inputs,
|
|
359
|
-
runStart,
|
|
360
|
-
sourceSha: resolveSourceSha({
|
|
361
|
-
sourceSha: args["source-sha"],
|
|
362
|
-
targetDir: args["features"] !== undefined ? dirname(args["features"]) : undefined,
|
|
363
|
-
}),
|
|
364
|
-
// The TARGET repo root the recorded input paths are made portable against (fixed to
|
|
365
|
-
// the target root, not the run cwd, by @SCN-RPT-016) — the SAME
|
|
366
|
-
// root readEvidenceObservations passes to countRuntimeEvidenceObservationKinds, derived from
|
|
367
|
-
// --features, so a cross-repo reconcile records inputs relative (`features`) rather
|
|
368
|
-
// than leaking the target's absolute path.
|
|
369
|
-
root: resolveTargetRoot({ features: inputs.features }),
|
|
370
|
-
// The TOOL's own identity (@SCN-RPT-026, 3F-1916) — which spec-controller produced
|
|
371
|
-
// this run, distinct from the target's sourceSha. Read from the tool's OWN dir, never
|
|
372
|
-
// cwd (which is the target). One call, spread into the ctx; the same identity feeds
|
|
373
|
-
// the run.yaml manifest.
|
|
374
|
-
...resolveToolIdentity(),
|
|
375
|
-
};
|
|
257
|
+
const ctx = runContextOf(args, inputs, runStart);
|
|
376
258
|
// Plan the outputs from the --format specs (no flag → md→stdout) and write them via
|
|
377
259
|
// the writer — the pure plan / impure writer split (@SCN-FMT-001). The plan
|
|
378
260
|
// parse+validate is pure; the writer is the only IO for the emitted report. This is
|
|
@@ -380,12 +262,8 @@ export function runBalance(argv) {
|
|
|
380
262
|
// legacy runs/<target>/<ISO>/ auto-archive was removed with @SCN-RUN-001, the
|
|
381
263
|
// caller now routes stored runs (spec-controller's run-management layer).
|
|
382
264
|
const planResult = planOutput(collectFormatSpecs(argv));
|
|
383
|
-
if (!planResult.ok)
|
|
384
|
-
|
|
385
|
-
// Usage/config error (bad --format spec) → exit 2 (@SCN-CLI-002), distinct from the
|
|
386
|
-
// out-of-balance verdict code 1 (@SCN-CLI-004).
|
|
387
|
-
process.exit(2);
|
|
388
|
-
}
|
|
265
|
+
if (!planResult.ok)
|
|
266
|
+
exitUsage(planResult.error);
|
|
389
267
|
writeOutputs(planResult.plan, { balance, ctx, evidenceObligations, withRuntimeObservations: true, withStaticChecks: true, featureNames });
|
|
390
268
|
// The CI gate (@SCN-CLI-004): `balance` is a GATE, not just a reporter. AFTER the report
|
|
391
269
|
// is written in full, map the whole-run verdict to the process exit code. Out-of-balance
|
|
@@ -455,6 +333,138 @@ export function runBalance(argv) {
|
|
|
455
333
|
if (code !== 0)
|
|
456
334
|
process.exitCode = code;
|
|
457
335
|
}
|
|
336
|
+
/**
|
|
337
|
+
* A usage or input fault: the message on stderr, then exit 2 — the enumerated usage code
|
|
338
|
+
* (@SCN-CLI-002), distinct from the out-of-balance verdict code 1 (@SCN-CLI-004). An
|
|
339
|
+
* out-of-balance run must never masquerade as a usage error, nor the reverse.
|
|
340
|
+
*/
|
|
341
|
+
function exitUsage(message) {
|
|
342
|
+
process.stderr.write(message + "\n");
|
|
343
|
+
process.exit(2);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Render-from-saved-JSON mode (@SCN-RMD-007): regenerate the human markdown from a
|
|
347
|
+
* banked spec-reconciliation.json ALONE — no reconcile, no live inputs, no RunContext. Reads
|
|
348
|
+
* the file, JSON.parses it back into the whole-document report model, renders the markdown via
|
|
349
|
+
* renderReport, and writes it to stdout (the same trailing-newline convention as the writer's
|
|
350
|
+
* stdout path). The load-bearing proof that the JSON IS the model — true when it answered the
|
|
351
|
+
* run, so `runBalance` returns before any reconcile.
|
|
352
|
+
*/
|
|
353
|
+
function renderSavedReport(args) {
|
|
354
|
+
// Saved-report READABILITY guard (@SCN-CLI-015). This mode RETURNS before
|
|
355
|
+
// `refuseUnreadableInputs` ever runs, so it honoured NEITHER of its guards: a missing path
|
|
356
|
+
// crashed to ENOENT and a malformed file to SyntaxError, both landing on Node's default exit 1
|
|
357
|
+
// — the out-of-balance code. The missing-path case was a live violation of @SCN-CLI-002's own
|
|
358
|
+
// shipped principle, which the CLI enforced for the five evidence flags and not for this
|
|
359
|
+
// one. The guard therefore runs INSIDE this mode, ahead of the read (3F-1764).
|
|
360
|
+
const unreadableSavedReportError = checkRenderFromJson(args, (path) => readFileSync(path, "utf8"));
|
|
361
|
+
if (unreadableSavedReportError)
|
|
362
|
+
exitUsage(unreadableSavedReportError);
|
|
363
|
+
const rehydratePath = args["render-from-json"];
|
|
364
|
+
if (rehydratePath === undefined)
|
|
365
|
+
return false;
|
|
366
|
+
const savedReport = readFileSync(rehydratePath, "utf8");
|
|
367
|
+
process.stdout.write(renderReportFromJson(savedReport) + "\n");
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* The live-input guards, in the order they run: each halts at exit 2 BEFORE any reconcile,
|
|
372
|
+
* because an input the tool cannot read is a usage error, never a verdict.
|
|
373
|
+
*/
|
|
374
|
+
function refuseUnreadableInputs(args) {
|
|
375
|
+
// Input-existence guard (@SCN-CLI-002): a supplied input-file/dir flag pointing at a
|
|
376
|
+
// non-existent path is a HARD ERROR — halt BEFORE reconciling, with a typed message
|
|
377
|
+
// naming the flag + path, never the silent zero-evidence all-red report a mistyped
|
|
378
|
+
// path used to produce (the dogfooding fault). Routed to stderr + a non-zero exit,
|
|
379
|
+
// exactly as the legacy-`--json` guard (the shared typed-error surface). An
|
|
380
|
+
// omitted flag is legitimately optional and passes through untouched.
|
|
381
|
+
const missingInputError = checkInputsExist(args, existsSync);
|
|
382
|
+
if (missingInputError)
|
|
383
|
+
exitUsage(missingInputError);
|
|
384
|
+
// Input-READABILITY guard (@SCN-CLI-014): existence is not enough. A report that is
|
|
385
|
+
// PRESENT but UNPARSEABLE (`--vitest /dev/null`, truncated JSON, non-JSON) used to throw
|
|
386
|
+
// mid-parse inside reconcileWithCensus, uncaught — and Node's default exit code is 1, the
|
|
387
|
+
// code reserved for a genuine OUT-OF-BALANCE verdict (@SCN-CLI-004). So a tool that
|
|
388
|
+
// CRASHED before reconciling was indistinguishable, by exit code, from an honest
|
|
389
|
+
// disagreement (3F-1742). Runs immediately after the existence guard and BEFORE any
|
|
390
|
+
// reconcile, routing to the same stderr + exit 2 lane: an input the tool cannot read is a
|
|
391
|
+
// usage fault, sibling to a missing path and an unrecognised flag — never a verdict.
|
|
392
|
+
const unparseableInputError = checkInputsParse(args, (path) => readFileSync(path, "utf8"));
|
|
393
|
+
if (unparseableInputError)
|
|
394
|
+
exitUsage(unparseableInputError);
|
|
395
|
+
// The FEATURE-CORPUS integrity checkpoint (@SCN-CLI-016, 3F-1767). The feature corpus is an
|
|
396
|
+
// input too — the ledger's DEBIT side — and it was read by a hand-rolled TAG-LINE SCAN that
|
|
397
|
+
// never consulted a parser. So a malformed tag line simply stopped being a tag line and its
|
|
398
|
+
// scenario CEASED TO EXIST: one stray character deleted a failing row and turned an
|
|
399
|
+
// out-of-balance run (exit 1) into a clean BALANCED (exit 0). A dropped scenario cannot even
|
|
400
|
+
// reconcile `missing`, because it was never RAISED to be missing — the run read cleaner than
|
|
401
|
+
// reality, the exact false-green this tool exists to prevent.
|
|
402
|
+
//
|
|
403
|
+
// Validated with the REAL Gherkin parser (cucumber's own), so a file the tool would reconcile is
|
|
404
|
+
// at least a file cucumber would RUN. A file it rejects is an input we CANNOT READ: exit 2,
|
|
405
|
+
// halting BEFORE any reconcile, naming the file and the parse failure — the same Rule as
|
|
406
|
+
// @SCN-CLI-014 and @SCN-CLI-015 ("an input the tool cannot read is a usage error, never a
|
|
407
|
+
// verdict"), now on the obligation side. Never a verdict, and never a green.
|
|
408
|
+
//
|
|
409
|
+
// The corpus is EXTRACTED from the same real AST (@SCN-LDG-020), so what the tool reconciles is
|
|
410
|
+
// what cucumber runs — Feature/Rule tag inheritance included. This guard decides whether the file
|
|
411
|
+
// can be read at all; parseScenarios then reads it exactly as cucumber would.
|
|
412
|
+
const featureParseErrors = featureCorpusParseErrors(args["features"]);
|
|
413
|
+
if (featureParseErrors.length > 0) {
|
|
414
|
+
for (const { file, message } of featureParseErrors) {
|
|
415
|
+
process.stderr.write(`The --features corpus contains a feature file that could not be parsed: ${file}\n${message}\n`);
|
|
416
|
+
}
|
|
417
|
+
process.exit(2);
|
|
418
|
+
}
|
|
419
|
+
// AMBIGUOUS-CORPUS guard (@SCN-LDG-020's guardrail, 3F-1775). An @SCN identifies exactly ONE
|
|
420
|
+
// scenario — that is the whole basis of attributing evidence to it. Tag inheritance makes a
|
|
421
|
+
// DUPLICATE reachable: an @SCN hoisted to a Feature:/Rule: is inherited by every scenario
|
|
422
|
+
// beneath it (cucumber does this, so we do). One passing test would then mark EVERY scenario
|
|
423
|
+
// sharing that id `balanced` — including scenarios nothing proves — a BALANCED-WHEN-BROKEN run
|
|
424
|
+
// at exit 0. A new silent false-green, introduced by the very fix that closed the last one.
|
|
425
|
+
//
|
|
426
|
+
// So the corpus is REFUSED, not reconciled: the tool cannot know which scenario a citing test
|
|
427
|
+
// proves, and any verdict over it would be a guess. Same Rule as @SCN-CLI-014/015/016 — an input
|
|
428
|
+
// the tool cannot read is a usage error, never a verdict.
|
|
429
|
+
const duplicateScnIds = featureCorpusDuplicateScnIds(args["features"]);
|
|
430
|
+
if (duplicateScnIds.length > 0) {
|
|
431
|
+
process.stderr.write(`The --features corpus names the same @SCN on more than one scenario: ` +
|
|
432
|
+
`${duplicateScnIds.join(", ")}.\n` +
|
|
433
|
+
`An @SCN identifies exactly one scenario — evidence citing a duplicated id cannot be ` +
|
|
434
|
+
`attributed, so no verdict over this corpus would be trustworthy. (An @SCN on a Feature: ` +
|
|
435
|
+
`or Rule: line is inherited by every scenario beneath it — name it on the scenario.)\n`);
|
|
436
|
+
process.exit(2);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Build the run provenance ONCE (project design §1) — a sibling RunContext, the
|
|
441
|
+
* Ledger staying pure — reusing the existing runStart. The target is the
|
|
442
|
+
* operator's --target VERBATIM (unknown-target on omit; Fork A — no
|
|
443
|
+
* resolution, no basename guessing). Source SHA via the read-only target read, with
|
|
444
|
+
* --source-sha as the override (resolveSourceSha).
|
|
445
|
+
*/
|
|
446
|
+
function runContextOf(args, inputs, runStart) {
|
|
447
|
+
return {
|
|
448
|
+
target: sourceTarget(args),
|
|
449
|
+
inputs,
|
|
450
|
+
runStart,
|
|
451
|
+
sourceSha: resolveSourceSha({
|
|
452
|
+
sourceSha: args["source-sha"],
|
|
453
|
+
targetDir: args["features"] !== undefined ? dirname(args["features"]) : undefined,
|
|
454
|
+
}),
|
|
455
|
+
// The TARGET repo root the recorded input paths are made portable against (fixed to
|
|
456
|
+
// the target root, not the run cwd, by @SCN-RPT-016) — the SAME
|
|
457
|
+
// root readEvidenceObservations passes to countRuntimeEvidenceObservationKinds, derived from
|
|
458
|
+
// --features, so a cross-repo reconcile records inputs relative (`features`) rather
|
|
459
|
+
// than leaking the target's absolute path.
|
|
460
|
+
root: resolveTargetRoot({ features: inputs.features }),
|
|
461
|
+
// The TOOL's own identity (@SCN-RPT-026, 3F-1916) — which spec-controller produced
|
|
462
|
+
// this run, distinct from the target's sourceSha. Read from the tool's OWN dir, never
|
|
463
|
+
// cwd (which is the target). One call, spread into the ctx; the same identity feeds
|
|
464
|
+
// the run.yaml manifest.
|
|
465
|
+
...resolveToolIdentity(),
|
|
466
|
+
};
|
|
467
|
+
}
|
|
458
468
|
/**
|
|
459
469
|
* THE DOMINANCE LADDER — the whole-run verdict as the enumerated status a consumer's CI branches
|
|
460
470
|
* on, and the ONE place the order argued for above is written down. Extracted from `runBalance`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,4BAA4B,GAE7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EACL,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpE,8FAA8F;AAC9F,6FAA6F;AAC7F,sFAAsF;AACtF,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG9D;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,IAAc;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC,EAAE,CAAC;YACN,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,IAA4B;IAC1D,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CACL,2CAA2C;YAC3C,8DAA8D;YAC9D,gDAAgD,CACjD,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,IAA4B;IACvD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC;AAC5C,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-registry.d.ts","sourceRoot":"","sources":["../src/cli-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,0FAA0F;AAC1F,MAAM,WAAW,QAAQ;IACvB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qGAAqG;AACrG,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"cli-registry.d.ts","sourceRoot":"","sources":["../src/cli-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,0FAA0F;AAC1F,MAAM,WAAW,QAAQ;IACvB,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qGAAqG;AACrG,MAAM,WAAW,WAAW;IAC1B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,0FAA0F;AAC1F,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AA0ID;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,WAiBzB,CAAC;AAQF;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBhF;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,CA0BhE"}
|
package/dist/cli-registry.js
CHANGED
|
@@ -54,11 +54,6 @@ const balanceFlags = [
|
|
|
54
54
|
arg: "<path>",
|
|
55
55
|
description: "The target's package.json — its `scripts`, and its specController.fitnessChecks rows: each names a scenario's @SCN, a characteristic, and the command that is the check.",
|
|
56
56
|
},
|
|
57
|
-
{
|
|
58
|
-
name: "--measurements",
|
|
59
|
-
arg: "<report.json>",
|
|
60
|
-
description: "A measurement report — the number each measured check posted, evidence for the measured fitness checks.",
|
|
61
|
-
},
|
|
62
57
|
{
|
|
63
58
|
name: "--ci-steps",
|
|
64
59
|
arg: "<record.json>",
|
package/dist/cli-registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-registry.js","sourceRoot":"","sources":["../src/cli-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AA0C1D;;;;GAIG;AACH,MAAM,YAAY,GAAe;IAC/B;QACE,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,OAAO;QACZ,WAAW,EACT,uIAAuI;KAC1I;IACD;QACE,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,eAAe;QACpB,WAAW,EAAE,+CAA+C;KAC7D;IACD;QACE,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,eAAe;QACpB,WAAW,EAAE,iDAAiD;KAC/D;IACD;QACE,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,UAAU;QACf,WAAW,EACT,uOAAuO;KAC1O;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,GAAG,EAAE,QAAQ;QACb,WAAW,EACT,0KAA0K;KAC7K;IACD;QACE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"cli-registry.js","sourceRoot":"","sources":["../src/cli-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/corpus/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/corpus/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/corpus/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AA8DH;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAiD5C"}
|
package/dist/corpus/cli.js
CHANGED
|
@@ -31,8 +31,7 @@ import { checkUnknownFlags, parseArgs } from "../cli-args.js";
|
|
|
31
31
|
import { DEFAULT_DEFERRAL_TAGS } from "../deferralTags.js";
|
|
32
32
|
import { UnreadableFeatureCorpusError } from "../ingest/gherkinValidation.js";
|
|
33
33
|
import { discoverFeatures } from "../ingest/ingestScenarios.js";
|
|
34
|
-
import {
|
|
35
|
-
import { resolveTargetRoot, resolveToolIdentity } from "../run-management/resolveRunInputs.js";
|
|
34
|
+
import { resolveToolIdentity } from "../run-management/resolveRunInputs.js";
|
|
36
35
|
/**
|
|
37
36
|
* Read everything the rule takes, or say why it could not be read.
|
|
38
37
|
*
|
|
@@ -65,7 +64,6 @@ function readCorpusInputs(featuresDir, manifestPath) {
|
|
|
65
64
|
packageJson: existsSync(manifestPath)
|
|
66
65
|
? JSON.parse(readFileSync(manifestPath, "utf8"))
|
|
67
66
|
: {},
|
|
68
|
-
root: resolveTargetRoot({ features: featuresDir }),
|
|
69
67
|
};
|
|
70
68
|
}
|
|
71
69
|
catch (err) {
|
|
@@ -114,7 +112,6 @@ export function runTags(argv) {
|
|
|
114
112
|
// only extend. Single-sourced here for the reason the reconcile composition takes it as a
|
|
115
113
|
// parameter: which words the community recognises is the product's answer, not the engine's.
|
|
116
114
|
deferralTags: DEFAULT_DEFERRAL_TAGS,
|
|
117
|
-
killFloor: killFloorReaderFor(inputs.root),
|
|
118
115
|
});
|
|
119
116
|
if (faults.length === 0) {
|
|
120
117
|
process.stdout.write("tags: OK — every feature code names one feature file, and every tag on the corpus obeys the @SCN scheme's own rules.\n");
|
package/dist/corpus/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/corpus/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/corpus/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,25 +15,6 @@
|
|
|
15
15
|
import { type GherkinParseError } from "./gherkinValidation.js";
|
|
16
16
|
import { type EvidenceObligations } from "@3f-consulting/spec-controller-core";
|
|
17
17
|
import type { EvidenceReconciliation } from "@3f-consulting/spec-controller-core";
|
|
18
|
-
/**
|
|
19
|
-
* A reader over ONE resolution pass's records.
|
|
20
|
-
*
|
|
21
|
-
* EACH RECORD IS OPENED ONCE, WHICH IS WHY THIS IS A CLOSURE AND NOT A FUNCTION PER REFERENCE. A
|
|
22
|
-
* manifest may name several gates of one record, and a reader opening it per entry would let two
|
|
23
|
-
* references answer for two different states of the same file — a rewrite landing mid-pass, a gate
|
|
24
|
-
* present for one and gone for the next. One read makes the pass's bars one reading of one record.
|
|
25
|
-
*
|
|
26
|
-
* THE REFUSAL IS REMEMBERED TOO. Cacheing only the successes would re-open an absent or unreadable
|
|
27
|
-
* record per reference, which is the same disagreement by the other door — and the likelier door,
|
|
28
|
-
* since a record being rewritten is unreadable for exactly the window that matters.
|
|
29
|
-
*
|
|
30
|
-
* THE SUBTRACTION IS THE RECORD'S, NOT THIS EDGE'S. `killFloorOf` spends the allowance; an edge
|
|
31
|
-
* computing `detected - slack` itself would be a second place holding a fact about the record.
|
|
32
|
-
*/
|
|
33
|
-
export declare function killFloorReaderFor(root: string): (reference: {
|
|
34
|
-
readonly mutationGate: string;
|
|
35
|
-
readonly recordFile?: string;
|
|
36
|
-
}) => number | null;
|
|
37
18
|
/**
|
|
38
19
|
* The reconciler's resolved input paths — the CLI options threaded to the readers.
|
|
39
20
|
* Every path is optional; a missing result file is tolerated (its evidence is
|
|
@@ -48,12 +29,6 @@ export interface ReconcileOptions {
|
|
|
48
29
|
cucumber?: string;
|
|
49
30
|
ci?: string;
|
|
50
31
|
packageJson?: string;
|
|
51
|
-
/**
|
|
52
|
-
* The measurement artefact (@SCN-CIP-003) — the number each measured check posted, and
|
|
53
|
-
* the credit side of every measured fitness check. Optional like the other result files: absent,
|
|
54
|
-
* it contributes nothing, and each measured obligation it would have answered reads `missing`.
|
|
55
|
-
*/
|
|
56
|
-
measurements?: string;
|
|
57
32
|
/**
|
|
58
33
|
* The CI RUN'S OWN RECORD of what each of its steps did (@SCN-LNT-021, @SCN-LNT-028) — the credit
|
|
59
34
|
* side of every CONVERTED fitness check, written by the consumer's own pipeline and by neither
|