spec-controller 0.1.0-alpha.3 → 0.1.0-alpha.30
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/README.md +24 -4
- package/dist/cli-allocate/cli.d.ts +2 -0
- package/dist/cli-allocate/cli.d.ts.map +1 -0
- package/dist/cli-allocate/cli.js +45 -0
- package/dist/cli-allocate/cli.js.map +1 -0
- package/dist/cli-allocate/readHistory.d.ts +21 -0
- package/dist/cli-allocate/readHistory.d.ts.map +1 -0
- package/dist/cli-allocate/readHistory.js +97 -0
- package/dist/cli-allocate/readHistory.js.map +1 -0
- package/dist/cli-allocate/readParts.d.ts +3 -0
- package/dist/cli-allocate/readParts.d.ts.map +1 -0
- package/dist/cli-allocate/readParts.js +25 -0
- package/dist/cli-allocate/readParts.js.map +1 -0
- package/dist/cli-allocate/readTree.d.ts +17 -0
- package/dist/cli-allocate/readTree.d.ts.map +1 -0
- package/dist/cli-allocate/readTree.js +63 -0
- package/dist/cli-allocate/readTree.js.map +1 -0
- package/dist/cli-allocate/request.d.ts +11 -0
- package/dist/cli-allocate/request.d.ts.map +1 -0
- package/dist/cli-allocate/request.js +29 -0
- package/dist/cli-allocate/request.js.map +1 -0
- package/dist/cli-allocate/stderr.d.ts +14 -0
- package/dist/cli-allocate/stderr.d.ts.map +1 -0
- package/dist/cli-allocate/stderr.js +33 -0
- package/dist/cli-allocate/stderr.js.map +1 -0
- package/dist/cli-args.d.ts +70 -14
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +239 -18
- package/dist/cli-args.js.map +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 +185 -161
- package/dist/cli-balance/cli.js.map +1 -1
- package/dist/cli-registry.d.ts +28 -0
- package/dist/cli-registry.d.ts.map +1 -1
- package/dist/cli-registry.js +39 -34
- package/dist/cli-registry.js.map +1 -1
- package/dist/cli.d.ts +4 -5
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +26 -12
- package/dist/cli.js.map +1 -1
- package/dist/deferralTags.d.ts +2 -2
- package/dist/deferralTags.js +2 -2
- package/dist/host.d.ts +25 -1
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +119 -15
- package/dist/host.js.map +1 -1
- package/dist/ingest/gherkinValidation.d.ts +9 -12
- package/dist/ingest/gherkinValidation.d.ts.map +1 -1
- package/dist/ingest/gherkinValidation.js +9 -12
- package/dist/ingest/gherkinValidation.js.map +1 -1
- package/dist/ingest/ingestQualityChecks.d.ts +3 -49
- package/dist/ingest/ingestQualityChecks.d.ts.map +1 -1
- package/dist/ingest/ingestQualityChecks.js +27 -120
- package/dist/ingest/ingestQualityChecks.js.map +1 -1
- package/dist/ingest/ingestScenarios.d.ts +8 -14
- package/dist/ingest/ingestScenarios.d.ts.map +1 -1
- package/dist/ingest/ingestScenarios.js +32 -55
- package/dist/ingest/ingestScenarios.js.map +1 -1
- package/package.json +2 -7
- package/dist/corpus/cli.d.ts +0 -34
- package/dist/corpus/cli.d.ts.map +0 -1
- package/dist/corpus/cli.js +0 -128
- package/dist/corpus/cli.js.map +0 -1
- package/dist/mutation-ratchet/index.d.ts +0 -46
- package/dist/mutation-ratchet/index.d.ts.map +0 -1
- package/dist/mutation-ratchet/index.js +0 -46
- 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-registry.js
CHANGED
|
@@ -52,12 +52,7 @@ const balanceFlags = [
|
|
|
52
52
|
{
|
|
53
53
|
name: "--package-json",
|
|
54
54
|
arg: "<path>",
|
|
55
|
-
description: "The target's package.json — its `scripts`, and its specController.
|
|
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.",
|
|
55
|
+
description: "The target's package.json — its `scripts`, and its specController.runners, specController.notChecks and specController.deferralTags. A fitness check is declared by its @fitness scenario and the CI step whose id: is that scenario's @SCN; no manifest key names one.",
|
|
61
56
|
},
|
|
62
57
|
{
|
|
63
58
|
name: "--ci-steps",
|
|
@@ -89,6 +84,10 @@ const balanceFlags = [
|
|
|
89
84
|
name: "--strict",
|
|
90
85
|
description: "Fail the run (exit 3) when it carries Pending Items — the opt-in that escalates otherwise-run-neutral deferred obligations.",
|
|
91
86
|
},
|
|
87
|
+
{
|
|
88
|
+
name: "--exit-zero",
|
|
89
|
+
description: "Print the same report but exit 0 on an out-of-balance or scenario-code-error (1) or --strict pending (3) verdict — the on-ramp before gating. Usage (2), unsound (4) and nothing-to-reconcile (5) still fail.",
|
|
90
|
+
},
|
|
92
91
|
{
|
|
93
92
|
name: "--help",
|
|
94
93
|
aliases: ["-h"],
|
|
@@ -111,33 +110,14 @@ const balanceConfigHelp = [
|
|
|
111
110
|
` Built-in deferral tags: ${DEFAULT_DEFERRAL_TAGS.map((tag) => `@${tag}`).join(", ")}`,
|
|
112
111
|
];
|
|
113
112
|
/**
|
|
114
|
-
* The `
|
|
115
|
-
*
|
|
116
|
-
* manifest should not have to learn a second name for each when they point the other at the same
|
|
117
|
-
* two files. The descriptions are this command's — what it reads them FOR is not what `balance`
|
|
118
|
-
* reads them for — but the flags are the same flags.
|
|
119
|
-
*
|
|
120
|
-
* NO `configHelp`. A command's config block documents the `package.json` fields THAT command
|
|
121
|
-
* reads, and `tags` reads none yet: the check-tag union and the recognised deferral set arrive
|
|
122
|
-
* with the grammar rules (3F-3302 onward), and the entry gains its block then. Appending
|
|
123
|
-
* `balance`'s block here would document, under this command, fields this command does not read —
|
|
124
|
-
* which is the fault 3F-3298 moved that block onto a command entry to prevent.
|
|
113
|
+
* The flags `balance` has retired. `--measurements` left with the measured route at 3F-3506: no
|
|
114
|
+
* number reaches the ledger, and a fitness check is credited by its own CI step's outcome.
|
|
125
115
|
*/
|
|
126
|
-
const
|
|
127
|
-
{
|
|
128
|
-
name: "--features",
|
|
129
|
-
arg: "<dir>",
|
|
130
|
-
description: "Directory of Gherkin .feature files — the corpus these rules are asked about (default ./features).",
|
|
131
|
-
},
|
|
116
|
+
const balanceRetiredFlags = [
|
|
132
117
|
{
|
|
133
|
-
name: "--
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
name: "--help",
|
|
139
|
-
aliases: ["-h"],
|
|
140
|
-
description: "Show this help and exit.",
|
|
118
|
+
name: "--measurements",
|
|
119
|
+
retiredIn: "0.1.0-alpha.5",
|
|
120
|
+
replacement: "A fitness check is credited by the outcome of its own CI step: put the check's @SCN on that step's `id:` and hand balance the run's step record with --ci-steps.",
|
|
141
121
|
},
|
|
142
122
|
];
|
|
143
123
|
/** The global host-modifier scope — recognised before the command; the CLI-007 surface. */
|
|
@@ -164,11 +144,22 @@ export const cliRegistry = {
|
|
|
164
144
|
summary: "Reconcile Gherkin scenarios against test/CI evidence and emit the Evidence Reconciliation (Markdown to stdout by default).",
|
|
165
145
|
flags: balanceFlags,
|
|
166
146
|
configHelp: balanceConfigHelp,
|
|
147
|
+
retiredFlags: balanceRetiredFlags,
|
|
167
148
|
},
|
|
168
149
|
{
|
|
169
|
-
name: "
|
|
170
|
-
summary: "
|
|
171
|
-
|
|
150
|
+
name: "allocate",
|
|
151
|
+
summary: "Print the next @SCN code for a feature part: one past the highest the repository has ever carried, the code alone on stdout.",
|
|
152
|
+
acceptsHostModifiers: false,
|
|
153
|
+
positionals: [
|
|
154
|
+
{ name: "<FFF>", description: "The feature part: a feature file's header code, two to five of A-Z and 0-9." },
|
|
155
|
+
],
|
|
156
|
+
flags: [
|
|
157
|
+
{
|
|
158
|
+
name: "--new",
|
|
159
|
+
description: "Start a part no feature file's header carries yet: its first code, or one past any number the repository already carries for it.",
|
|
160
|
+
},
|
|
161
|
+
{ name: "--help", aliases: ["-h"], description: "Show this help and exit." },
|
|
162
|
+
],
|
|
172
163
|
},
|
|
173
164
|
],
|
|
174
165
|
};
|
|
@@ -199,12 +190,26 @@ export function renderCommandHelp(registry, command) {
|
|
|
199
190
|
const configHelp = entry?.configHelp ?? [];
|
|
200
191
|
return [
|
|
201
192
|
`spec-controller ${command} — ${entry?.summary ?? ""}`,
|
|
193
|
+
...positionalHelp(command, entry?.positionals ?? []),
|
|
202
194
|
"",
|
|
203
195
|
"Options:",
|
|
204
196
|
...lines,
|
|
205
197
|
...(configHelp.length > 0 ? ["", ...configHelp] : []),
|
|
206
198
|
].join("\n");
|
|
207
199
|
}
|
|
200
|
+
/** A command's usage line and its arguments, one line each; nothing for a command that takes flags only. */
|
|
201
|
+
function positionalHelp(command, positionals) {
|
|
202
|
+
if (positionals.length === 0)
|
|
203
|
+
return [];
|
|
204
|
+
const width = Math.max(...positionals.map((positional) => positional.name.length));
|
|
205
|
+
return [
|
|
206
|
+
"",
|
|
207
|
+
`Usage: spec-controller ${command} ${positionals.map((positional) => positional.name).join(" ")} [options]`,
|
|
208
|
+
"",
|
|
209
|
+
"Arguments:",
|
|
210
|
+
...positionals.map((positional) => ` ${positional.name.padEnd(width + 2)}${positional.description}`),
|
|
211
|
+
];
|
|
212
|
+
}
|
|
208
213
|
/**
|
|
209
214
|
* Render the top-level `spec-controller --help` surface (@SCN-CLI-007) FROM the registry:
|
|
210
215
|
* a Commands section (each command's name + one-line summary) and a Host modifiers section
|
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;
|
|
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;AAwE1D;;;;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,yQAAyQ;KAC5Q;IACD;QACE,IAAI,EAAE,YAAY;QAClB,GAAG,EAAE,eAAe;QACpB,WAAW,EACT,8KAA8K;KACjL;IACD;QACE,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,QAAQ;QACb,WAAW,EAAE,0FAA0F;KACxG;IACD;QACE,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE,OAAO;QACZ,WAAW,EAAE,qFAAqF;KACnG;IACD;QACE,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,gBAAgB;QACrB,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,uFAAuF;KACrG;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,GAAG,EAAE,QAAQ;QACb,WAAW,EAAE,yGAAyG;KACvH;IACD;QACE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,6HAA6H;KAC3I;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,+MAA+M;KAC7N;IACD;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,IAAI,CAAC;QACf,WAAW,EAAE,0BAA0B;KACxC;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAAa;IAClC,oDAAoD;IACpD,yCAAyC;IACzC,0FAA0F;IAC1F,8EAA8E;IAC9E,iCAAiC,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;CAC5F,CAAC;AAEF;;;GAGG;AACH,MAAM,mBAAmB,GAAsB;IAC7C;QACE,IAAI,EAAE,gBAAgB;QACtB,SAAS,EAAE,eAAe;QAC1B,WAAW,EACT,kKAAkK;KACrK;CACF,CAAC;AAEF,2FAA2F;AAC3F,MAAM,WAAW,GAAe;IAC9B;QACE,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,QAAQ;QACb,WAAW,EACT,uLAAuL;KAC1L;IACD;QACE,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,2DAA2D;KACzE;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,MAAM,EAAE,WAAW;IACnB,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EACL,4HAA4H;YAC9H,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,iBAAiB;YAC7B,YAAY,EAAE,mBAAmB;SAClC;QACD;YACE,IAAI,EAAE,UAAU;YAChB,OAAO,EACL,8HAA8H;YAChI,oBAAoB,EAAE,KAAK;YAC3B,WAAW,EAAE;gBACX,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,6EAA6E,EAAE;aAC9G;YACD,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,OAAO;oBACb,WAAW,EACT,kIAAkI;iBACrI;gBACD,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,0BAA0B,EAAE;aAC7E;SACF;KACF;CACF,CAAC;AAEF,qFAAqF;AACrF,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAqB,EAAE,OAAe;IACtE,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CACrB,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAChF,CAAC;IACF,MAAM,UAAU,GAAG,KAAK,EAAE,UAAU,IAAI,EAAE,CAAC;IAC3C,OAAO;QACL,mBAAmB,OAAO,MAAM,KAAK,EAAE,OAAO,IAAI,EAAE,EAAE;QACtD,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,IAAI,EAAE,CAAC;QACpD,EAAE;QACF,UAAU;QACV,GAAG,KAAK;QACR,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,4GAA4G;AAC5G,SAAS,cAAc,CAAC,OAAe,EAAE,WAAsC;IAC7E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,OAAO;QACL,EAAE;QACF,0BAA0B,OAAO,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY;QAC3G,EAAE;QACF,YAAY;QACZ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;KACtG,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAqB;IACtD,MAAM,aAAa,GAAG,CAAC,CAAC;IACxB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CACxC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,aAAa,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CACxF,CAAC;IACF,MAAM,cAAc,GAAG,CAAC,CAAC;IACzB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACtF,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CACvC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAC3F,CAAC;IACF,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtF,OAAO;QACL,iEAAiE;QACjE,EAAE;QACF,QAAQ;QACR,qBAAqB,aAAa,2BAA2B;QAC7D,EAAE;QACF,WAAW;QACX,GAAG,YAAY;QACf,EAAE;QACF,sCAAsC;QACtC,GAAG,aAAa;QAChB,EAAE;QACF,yDAAyD;KAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
|
package/dist/cli.d.ts
CHANGED
|
@@ -6,11 +6,10 @@
|
|
|
6
6
|
* spec-controller [--store <root>] [--run-id <id>] <command> [command-args]
|
|
7
7
|
*
|
|
8
8
|
* Commands: `balance` — the deterministic reconciliation of scenarios against
|
|
9
|
-
* observed evidence, standalone on the public core + app layer (no engine)
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* built on the same core.
|
|
9
|
+
* observed evidence, standalone on the public core + app layer (no engine). It also polices the
|
|
10
|
+
* corpus's own scenario codes (3F-3635). `allocate` — a query, not a verdict: the next scenario code
|
|
11
|
+
* for a feature part, which keeps no run and so takes no host modifier. The
|
|
12
|
+
* `analyse` / `migrate` capabilities are a separate, closed offering built on the same core.
|
|
14
13
|
*
|
|
15
14
|
* Storage is a CROSS-CUTTING host modifier, not a command. A leading `--store <root>`
|
|
16
15
|
* turns any command into a STORED run: the host wraps the command via the kept-run
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
|
package/dist/cli.js
CHANGED
|
@@ -6,11 +6,10 @@
|
|
|
6
6
|
* spec-controller [--store <root>] [--run-id <id>] <command> [command-args]
|
|
7
7
|
*
|
|
8
8
|
* Commands: `balance` — the deterministic reconciliation of scenarios against
|
|
9
|
-
* observed evidence, standalone on the public core + app layer (no engine)
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* built on the same core.
|
|
9
|
+
* observed evidence, standalone on the public core + app layer (no engine). It also polices the
|
|
10
|
+
* corpus's own scenario codes (3F-3635). `allocate` — a query, not a verdict: the next scenario code
|
|
11
|
+
* for a feature part, which keeps no run and so takes no host modifier. The
|
|
12
|
+
* `analyse` / `migrate` capabilities are a separate, closed offering built on the same core.
|
|
14
13
|
*
|
|
15
14
|
* Storage is a CROSS-CUTTING host modifier, not a command. A leading `--store <root>`
|
|
16
15
|
* turns any command into a STORED run: the host wraps the command via the kept-run
|
|
@@ -22,10 +21,10 @@
|
|
|
22
21
|
*/
|
|
23
22
|
import { dirname } from "node:path";
|
|
24
23
|
import { runBalance } from "./cli-balance/cli.js";
|
|
25
|
-
import {
|
|
24
|
+
import { runAllocate } from "./cli-allocate/cli.js";
|
|
26
25
|
import { resolveSourceSha, resolveToolIdentity } from "./run-management/resolveRunInputs.js";
|
|
27
26
|
import { executeKeptRun, resolveRunId, } from "./run-management/keptRun.js";
|
|
28
|
-
import { parseHostInvocation, wrapCommandArgv, peekFlag } from "./host.js";
|
|
27
|
+
import { parseHostInvocation, wrapCommandArgv, peekFlag, answerUnknownCommand, modifiersNotTakenRefusal, } from "./host.js";
|
|
29
28
|
import { cliRegistry, renderTopLevelHelp } from "./cli-registry.js";
|
|
30
29
|
/** Dispatch a command to its handler with the given (clean or store-wrapped) argv. */
|
|
31
30
|
function runCommand(command, argv) {
|
|
@@ -33,16 +32,31 @@ function runCommand(command, argv) {
|
|
|
33
32
|
case "balance":
|
|
34
33
|
runBalance(argv);
|
|
35
34
|
return;
|
|
36
|
-
case "
|
|
37
|
-
|
|
35
|
+
case "allocate":
|
|
36
|
+
runAllocate(argv);
|
|
38
37
|
return;
|
|
39
|
-
default:
|
|
40
|
-
|
|
41
|
-
process.
|
|
38
|
+
default: {
|
|
39
|
+
const answer = answerUnknownCommand(command, renderTopLevelHelp(cliRegistry));
|
|
40
|
+
process.stderr.write(answer.stderr);
|
|
41
|
+
process.exit(answer.exitCode);
|
|
42
|
+
}
|
|
42
43
|
}
|
|
43
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Refuse, at the usage status, what the leading tokens get wrong, before any command or stored run
|
|
47
|
+
* starts, so nothing is written anywhere: a usage fault among them (@SCN-CLI-059), or modifiers
|
|
48
|
+
* that would keep a run given to a command that keeps none.
|
|
49
|
+
*/
|
|
50
|
+
function refuseLeadingFaults(inv) {
|
|
51
|
+
const refusal = inv.refusal ?? modifiersNotTakenRefusal(inv);
|
|
52
|
+
if (refusal === undefined)
|
|
53
|
+
return;
|
|
54
|
+
process.stderr.write(refusal + "\n");
|
|
55
|
+
process.exit(2);
|
|
56
|
+
}
|
|
44
57
|
function main(hostArgv) {
|
|
45
58
|
const inv = parseHostInvocation(hostArgv);
|
|
59
|
+
refuseLeadingFaults(inv);
|
|
46
60
|
const command = inv.command;
|
|
47
61
|
if (command === undefined || command === "help" || command === "--help" || command === "-h") {
|
|
48
62
|
process.stdout.write(renderTopLevelHelp(cliRegistry) + "\n");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EACL,cAAc,EACd,YAAY,GAGb,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,QAAQ,EACR,oBAAoB,EACpB,wBAAwB,GAEzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEpE,sFAAsF;AACtF,SAAS,UAAU,CAAC,OAAe,EAAE,IAAc;IACjD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,KAAK,UAAU;YACb,WAAW,CAAC,IAAI,CAAC,CAAC;YAClB,OAAO;QACT,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,EAAE,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,GAAmB;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO;IAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,IAAI,CAAC,QAAkB;IAC9B,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC1C,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAE5B,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC5F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC5B,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,wFAAwF;IACxF,wFAAwF;IACxF,wFAAwF;IACxF,sFAAsF;IACtF,sFAAsF;IACtF,4EAA4E;IAC5E,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,IAAI,gBAAgB,CAAC;IACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACvD,MAAM,SAAS,GACb,gBAAgB,CAAC;QACf,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC;QAClD,SAAS,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC,IAAI,SAAS,CAAC;IAElB,MAAM,IAAI,GAAgB,EAAE,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClE,wFAAwF;IACxF,0CAA0C;IAC1C,oFAAoF;IACpF,sFAAsF;IACtF,0EAA0E;IAC1E,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAoB;QAC5B,SAAS;QACT,OAAO,EAAE,YAAY,CAAC,OAAO,IAAI,SAAS;QAC1C,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KAC/B,CAAC;IAEF,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CACtD,UAAU,CAAC,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CACxE,CAAC;IAEF,0FAA0F;IAC1F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/deferralTags.d.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* established Cucumber deferral conventions.
|
|
6
6
|
*
|
|
7
7
|
* This is **product policy, not a core-domain invariant** — an evolvable list of tag
|
|
8
|
-
* strings, so it lives in the application layer, NOT on the
|
|
9
|
-
*
|
|
8
|
+
* strings, so it lives in the application layer, NOT on the v1 core barrel.
|
|
9
|
+
* The core `parseScenarios` recognises only the deferral set it is
|
|
10
10
|
* handed (its default is `[]`, a policy-free pure core); the app is the single source
|
|
11
11
|
* of the starter policy and always passes the resolved set (starter ∪ configured) into
|
|
12
12
|
* the parser at the ingest edge. Both `resolveDeferralTags` (the `@SCN-PND-021` config
|
package/dist/deferralTags.js
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* established Cucumber deferral conventions.
|
|
6
6
|
*
|
|
7
7
|
* This is **product policy, not a core-domain invariant** — an evolvable list of tag
|
|
8
|
-
* strings, so it lives in the application layer, NOT on the
|
|
9
|
-
*
|
|
8
|
+
* strings, so it lives in the application layer, NOT on the v1 core barrel.
|
|
9
|
+
* The core `parseScenarios` recognises only the deferral set it is
|
|
10
10
|
* handed (its default is `[]`, a policy-free pure core); the app is the single source
|
|
11
11
|
* of the starter policy and always passes the resolved set (starter ∪ configured) into
|
|
12
12
|
* the parser at the ingest edge. Both `resolveDeferralTags` (the `@SCN-PND-021` config
|
package/dist/host.d.ts
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @SCN-RMG-004 — features/run-management.feature.
|
|
14
14
|
*/
|
|
15
|
+
import { type CommandSpec, type FlagSpec } from "./cli-registry.js";
|
|
15
16
|
/** A parsed host invocation: leading global options, then the command and its clean args. */
|
|
16
17
|
export interface HostInvocation {
|
|
17
18
|
/** The injected store root from a leading `--store <root>`, or undefined (no store). */
|
|
@@ -22,6 +23,11 @@ export interface HostInvocation {
|
|
|
22
23
|
command?: string;
|
|
23
24
|
/** The command's own args — everything after the command token, verbatim. */
|
|
24
25
|
commandArgs: string[];
|
|
26
|
+
/**
|
|
27
|
+
* The usage fault in the leading tokens, when there is one: the host refuses it at exit 2 before
|
|
28
|
+
* any command or stored run starts (@SCN-CLI-059).
|
|
29
|
+
*/
|
|
30
|
+
refusal?: string;
|
|
25
31
|
}
|
|
26
32
|
/**
|
|
27
33
|
* Parse the host argv into its leading global options (`--store`, `--run-id`) and the
|
|
@@ -31,8 +37,9 @@ export interface HostInvocation {
|
|
|
31
37
|
* --features f` yields the store + `balance` + `[--features, f]`, while `balance --store
|
|
32
38
|
* /s` leaves `--store` in the command's args (a `--store` AFTER the command is the
|
|
33
39
|
* command's own arg, never a host store directive) — the "global before command" contract.
|
|
40
|
+
* A modifier with nothing after it is refused (@SCN-CLI-067); an empty argv is the bare help.
|
|
34
41
|
*/
|
|
35
|
-
export declare function parseHostInvocation(argv: readonly string[]): HostInvocation;
|
|
42
|
+
export declare function parseHostInvocation(argv: readonly string[], globalFlags?: readonly FlagSpec[], commands?: readonly string[]): HostInvocation;
|
|
36
43
|
/**
|
|
37
44
|
* Build the wrapped command argv: the command's clean args followed by a repeated
|
|
38
45
|
* `--format <spec>` per store-dir output spec. Pure — the impure runner hands the result
|
|
@@ -47,4 +54,21 @@ export declare function wrapCommandArgv(commandArgs: readonly string[], formatSp
|
|
|
47
54
|
* them in its own args. Returns undefined when the flag is absent or has no value.
|
|
48
55
|
*/
|
|
49
56
|
export declare function peekFlag(argv: readonly string[], name: string): string | undefined;
|
|
57
|
+
/** The host's answer to a command it does not know: what goes to stderr, and the status. */
|
|
58
|
+
export interface UnknownCommandAnswer {
|
|
59
|
+
exitCode: number;
|
|
60
|
+
stderr: string;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Answer a command the registry does not carry. It is given the command token and the rendered
|
|
64
|
+
* help, never the command's args, so no flag after the command can change the answer.
|
|
65
|
+
*
|
|
66
|
+
* An unknown command is a usage fault, so it exits 2, the published usage code
|
|
67
|
+
* (packages/spec-controller/README.md), which `--exit-zero` never masks (3F-3649).
|
|
68
|
+
*
|
|
69
|
+
* @SCN-CLI-056 @SCN-CLI-057 — features/cli-balance.feature.
|
|
70
|
+
*/
|
|
71
|
+
export declare function answerUnknownCommand(command: string, help: string): UnknownCommandAnswer;
|
|
72
|
+
/** The refusal for host modifiers given before a command that takes none, else undefined. */
|
|
73
|
+
export declare function modifiersNotTakenRefusal(inv: HostInvocation, commands?: readonly CommandSpec[]): string | undefined;
|
|
50
74
|
//# sourceMappingURL=host.d.ts.map
|
package/dist/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAUH,OAAO,EAAe,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjF,6FAA6F;AAC7F,MAAM,WAAW,cAAc;IAC7B,wFAAwF;IACxF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,WAAW,GAAE,SAAS,QAAQ,EAAuB,EACrD,QAAQ,GAAE,SAAS,MAAM,EAAwD,GAChF,cAAc,CA2BhB;AAyFD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAExG;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASlF;AAED,4FAA4F;AAC5F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAKxF;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,cAAc,EACnB,QAAQ,GAAE,SAAS,WAAW,EAAyB,GACtD,MAAM,GAAG,SAAS,CAUpB"}
|
package/dist/host.js
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
*
|
|
13
13
|
* @SCN-RMG-004 — features/run-management.feature.
|
|
14
14
|
*/
|
|
15
|
+
import { equalsFormRefusal, givenTwiceRefusal, isEqualsForm, isMissingValue, missingValueRefusal, valueFlagsOf, } from "./cli-args.js";
|
|
16
|
+
import { cliRegistry } from "./cli-registry.js";
|
|
15
17
|
/**
|
|
16
18
|
* Parse the host argv into its leading global options (`--store`, `--run-id`) and the
|
|
17
19
|
* command + its clean args. Global options are recognised ONLY before the command: the
|
|
@@ -20,26 +22,101 @@
|
|
|
20
22
|
* --features f` yields the store + `balance` + `[--features, f]`, while `balance --store
|
|
21
23
|
* /s` leaves `--store` in the command's args (a `--store` AFTER the command is the
|
|
22
24
|
* command's own arg, never a host store directive) — the "global before command" contract.
|
|
25
|
+
* A modifier with nothing after it is refused (@SCN-CLI-067); an empty argv is the bare help.
|
|
23
26
|
*/
|
|
24
|
-
export function parseHostInvocation(argv) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
export function parseHostInvocation(argv, globalFlags = cliRegistry.global, commands = cliRegistry.commands.map((command) => command.name)) {
|
|
28
|
+
// The modifiers and the values they take are the registry's global scope, never a list kept here
|
|
29
|
+
// (@SCN-CLI-059): a modifier added later is read, and refused without its value, by construction.
|
|
30
|
+
const modifiers = valueFlagsOf(globalFlags);
|
|
31
|
+
const values = new Map();
|
|
27
32
|
let i = 0;
|
|
28
33
|
for (; i < argv.length; i++) {
|
|
29
|
-
const token = argv[i];
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
const token = argv[i] ?? "";
|
|
35
|
+
const modifier = modifiers.get(token);
|
|
36
|
+
if (modifier === undefined) {
|
|
37
|
+
const refusal = leadingFlagRefusal(token, modifiers, globalFlags);
|
|
38
|
+
if (refusal !== undefined)
|
|
39
|
+
return { commandArgs: [], refusal };
|
|
40
|
+
break; // first non-modifier token is the command
|
|
34
41
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
const value = argv[i + 1];
|
|
43
|
+
const refusal = modifierRefusal(token, modifier, argv.slice(i + 1, i + 3), { values, commands });
|
|
44
|
+
if (refusal !== undefined)
|
|
45
|
+
return { commandArgs: [], refusal };
|
|
46
|
+
values.set(modifier.name, value ?? "");
|
|
47
|
+
i++;
|
|
48
|
+
}
|
|
49
|
+
if (i === argv.length && values.size > 0)
|
|
50
|
+
return { commandArgs: [], refusal: noCommandRefusal([...values.keys()]) };
|
|
51
|
+
return {
|
|
52
|
+
store: values.get("--store"),
|
|
53
|
+
runId: values.get("--run-id"),
|
|
54
|
+
command: argv[i],
|
|
55
|
+
commandArgs: argv.slice(i + 1),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The refusal a modifier earns where it stands, else undefined; `ahead` is its value and the token
|
|
60
|
+
* after it. Given twice, it is never read as its last value (@SCN-CLI-064): `--store A --store B` used
|
|
61
|
+
* to store under B without a word. Given no value, it is never handed the next token (@SCN-CLI-059):
|
|
62
|
+
* `--store --run-id r1` used to store under a directory called `--run-id`. Given the command as its
|
|
63
|
+
* value with no command after it, it has eaten the command (@SCN-CLI-066): `--store balance
|
|
64
|
+
* --features f` used to blame `--features`, and `--store balance` alone answered help at exit 0. A
|
|
65
|
+
* command name followed by the command is still a value: `--store balance balance …` is read.
|
|
66
|
+
*/
|
|
67
|
+
function modifierRefusal(token, modifier, [value, after], read) {
|
|
68
|
+
if (read.values.has(modifier.name))
|
|
69
|
+
return givenTwiceRefusal(token, "spec-controller");
|
|
70
|
+
if (isMissingValue(value))
|
|
71
|
+
return missingValueRefusal(token, modifier, "spec-controller");
|
|
72
|
+
if (read.commands.includes(value ?? "") && (after === undefined || after.startsWith("-"))) {
|
|
73
|
+
return commandAsValueRefusal(token, modifier, value ?? "");
|
|
41
74
|
}
|
|
42
|
-
return
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The refusal for host modifiers with nothing after them: every modifier given, in one line, and the
|
|
79
|
+
* fix (@SCN-CLI-067). Given last, `--store <root>` used to answer the top-level help at exit 0 having
|
|
80
|
+
* run nothing, a false green for a CI step that lost its command word (3F-3686). Help after a
|
|
81
|
+
* modifier is a command here, and a bare `spec-controller` never reaches this.
|
|
82
|
+
*/
|
|
83
|
+
function noCommandRefusal(given) {
|
|
84
|
+
return (`No command followed the host modifiers given (${given.join(", ")}), so nothing ran: ` +
|
|
85
|
+
`a host modifier needs a command after it, or --help.\n` +
|
|
86
|
+
`Run 'spec-controller --help' to see the commands and host modifiers this version accepts.`);
|
|
87
|
+
}
|
|
88
|
+
/** The refusal for a modifier that took the command as its value: the modifier, the command, and the fix. */
|
|
89
|
+
function commandAsValueRefusal(token, modifier, command) {
|
|
90
|
+
return (`The ${token} host modifier took '${command}', a command, as its value, and left no command to run.\n` +
|
|
91
|
+
`Give ${token} its own value, as in 'spec-controller ${token} ${modifier.arg ?? ""} ${command} …'. ` +
|
|
92
|
+
`Run 'spec-controller --help' to see the commands and host modifiers this version accepts.`);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The refusal a leading token that is no modifier earns, else undefined (it is the command). A
|
|
96
|
+
* modifier written `--store=<root>` is a form that is not read (@SCN-CLI-065), never a flag out of
|
|
97
|
+
* place; any other flag here is out of place, never a command (@SCN-CLI-060): `--exit-zero balance`
|
|
98
|
+
* used to answer `unknown command "--exit-zero"`. The top-level help stays where it was.
|
|
99
|
+
*/
|
|
100
|
+
function leadingFlagRefusal(token, modifiers, globalFlags) {
|
|
101
|
+
if (isEqualsForm(token))
|
|
102
|
+
return equalsFormRefusal(token, modifiers, "spec-controller");
|
|
103
|
+
if (isFlagOutOfPlace(token))
|
|
104
|
+
return flagBeforeCommandRefusal(token, globalFlags);
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
/** The help the host answers in the command's place, which is the one flag it takes there. */
|
|
108
|
+
const TOP_LEVEL_HELP = new Set(["--help", "-h"]);
|
|
109
|
+
/** True for a flag-shaped token that is not the top-level help. */
|
|
110
|
+
function isFlagOutOfPlace(token) {
|
|
111
|
+
return token.length > 1 && token.startsWith("-") && !TOP_LEVEL_HELP.has(token);
|
|
112
|
+
}
|
|
113
|
+
/** The refusal for a flag given before the command: the flag, what goes there, and where it goes. */
|
|
114
|
+
function flagBeforeCommandRefusal(flag, globalFlags) {
|
|
115
|
+
const modifiers = globalFlags.map((modifier) => modifier.name).join(", ");
|
|
116
|
+
return (`The ${flag} flag was given before the command. Before the command, spec-controller takes ` +
|
|
117
|
+
`only its host modifiers (${modifiers}); a command's own flags go after it, as in ` +
|
|
118
|
+
`'spec-controller <command> ${flag}'.\n` +
|
|
119
|
+
`Run 'spec-controller --help' to see the commands and host modifiers this version accepts.`);
|
|
43
120
|
}
|
|
44
121
|
/**
|
|
45
122
|
* Build the wrapped command argv: the command's clean args followed by a repeated
|
|
@@ -66,4 +143,31 @@ export function peekFlag(argv, name) {
|
|
|
66
143
|
}
|
|
67
144
|
return undefined;
|
|
68
145
|
}
|
|
146
|
+
/**
|
|
147
|
+
* Answer a command the registry does not carry. It is given the command token and the rendered
|
|
148
|
+
* help, never the command's args, so no flag after the command can change the answer.
|
|
149
|
+
*
|
|
150
|
+
* An unknown command is a usage fault, so it exits 2, the published usage code
|
|
151
|
+
* (packages/spec-controller/README.md), which `--exit-zero` never masks (3F-3649).
|
|
152
|
+
*
|
|
153
|
+
* @SCN-CLI-056 @SCN-CLI-057 — features/cli-balance.feature.
|
|
154
|
+
*/
|
|
155
|
+
export function answerUnknownCommand(command, help) {
|
|
156
|
+
return {
|
|
157
|
+
exitCode: 2,
|
|
158
|
+
stderr: `spec-controller: unknown command "${command}".\n\n${help}\n`,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
/** The refusal for host modifiers given before a command that takes none, else undefined. */
|
|
162
|
+
export function modifiersNotTakenRefusal(inv, commands = cliRegistry.commands) {
|
|
163
|
+
const entry = commands.find((command) => command.name === inv.command);
|
|
164
|
+
if (entry?.acceptsHostModifiers !== false)
|
|
165
|
+
return undefined;
|
|
166
|
+
const given = [inv.store === undefined ? [] : ["--store"], inv.runId === undefined ? [] : ["--run-id"]].flat();
|
|
167
|
+
if (given.length === 0)
|
|
168
|
+
return undefined;
|
|
169
|
+
return (`spec-controller: usage error — '${entry.name}' takes no host modifier, and was given ${given.join(", ")}: ` +
|
|
170
|
+
`it answers a query and keeps no run.\n` +
|
|
171
|
+
`Run 'spec-controller ${entry.name} …' without them.`);
|
|
172
|
+
}
|
|
69
173
|
//# sourceMappingURL=host.js.map
|
package/dist/host.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,11 +23,12 @@
|
|
|
23
23
|
* PURE: `string → parse errors`. No fs, no process — the file READ lives beside it at the ingest
|
|
24
24
|
* edge, as it does for every other input.
|
|
25
25
|
*
|
|
26
|
-
* WHY IT LIVES IN THE APP, NOT CORE. Core's barrel is the
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* and the
|
|
26
|
+
* WHY IT LIVES IN THE APP, NOT CORE. Core's barrel is the v1 contract surface downstream consumers
|
|
27
|
+
* build on. Since 3F-3449 nothing reds when a symbol is added there — the guard that reconciled it
|
|
28
|
+
* both directions is gone — so keeping it narrow is a discipline rather than a gate. This validator
|
|
29
|
+
* is an INGEST concern (it decides whether an input can be read at all), not part of the
|
|
30
|
+
* reconciliation contract, so it belongs with the other readers at the app edge and the v1 surface
|
|
31
|
+
* stays untouched.
|
|
31
32
|
*/
|
|
32
33
|
/** A Gherkin parse failure: the file could not be read as Gherkin at all. */
|
|
33
34
|
export interface GherkinParseError {
|
|
@@ -73,13 +74,9 @@ export declare class UnreadableFeatureCorpusError extends Error {
|
|
|
73
74
|
* refusal means for it.
|
|
74
75
|
*
|
|
75
76
|
* WHY A TYPED ERROR RATHER THAN AN EMPTY CORPUS. The obvious fix is for `discoverFeatures` to hand
|
|
76
|
-
* back `[]` when the directory is not there
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* `checkInputsExist`, a supplied-but-absent `--features` too — into `The corpus could not be
|
|
80
|
-
* read: …` at exit 2. Tolerance at the reader turns both into `tags: OK …` at exit 0, inside the
|
|
81
|
-
* slice whose whole purpose is killing a vacuous certification. Typed, both survive untouched:
|
|
82
|
-
* this IS an `Error`, so it still lands in that generic catch.
|
|
77
|
+
* back `[]` when the directory is not there, and that would decide for every reader that absence
|
|
78
|
+
* is empty. Typed, each caller decides: `balance` reads it as no corpus (@SCN-CLI-017), and any
|
|
79
|
+
* other reader still meets a refusal. (The second command this guarded, `tags`, left at 3F-3635.)
|
|
83
80
|
*
|
|
84
81
|
* IT CARRIES THE DIRECTORY because the report is owed the name of what it examined — "I found no
|
|
85
82
|
* record" and "I found no regression" must never wear one word (3F-2947), and a consumer told
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gherkinValidation.d.ts","sourceRoot":"","sources":["../../src/ingest/gherkinValidation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gherkinValidation.d.ts","sourceRoot":"","sources":["../../src/ingest/gherkinValidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAKH,6EAA6E;AAC7E,MAAM,WAAW,iBAAiB;IAChC,qFAAqF;IACrF,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAa/E;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,MAAM,EAAE,SAAS,iBAAiB,EAAE,CAAC;gBAElC,MAAM,EAAE,SAAS,iBAAiB,EAAE;CAUjD;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,8FAA8F;IAC9F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM;CAK9B"}
|
|
@@ -23,11 +23,12 @@
|
|
|
23
23
|
* PURE: `string → parse errors`. No fs, no process — the file READ lives beside it at the ingest
|
|
24
24
|
* edge, as it does for every other input.
|
|
25
25
|
*
|
|
26
|
-
* WHY IT LIVES IN THE APP, NOT CORE. Core's barrel is the
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* and the
|
|
26
|
+
* WHY IT LIVES IN THE APP, NOT CORE. Core's barrel is the v1 contract surface downstream consumers
|
|
27
|
+
* build on. Since 3F-3449 nothing reds when a symbol is added there — the guard that reconciled it
|
|
28
|
+
* both directions is gone — so keeping it narrow is a discipline rather than a gate. This validator
|
|
29
|
+
* is an INGEST concern (it decides whether an input can be read at all), not part of the
|
|
30
|
+
* reconciliation contract, so it belongs with the other readers at the app edge and the v1 surface
|
|
31
|
+
* stays untouched.
|
|
31
32
|
*/
|
|
32
33
|
import { AstBuilder, GherkinClassicTokenMatcher, Parser } from "@cucumber/gherkin";
|
|
33
34
|
import { IdGenerator } from "@cucumber/messages";
|
|
@@ -88,13 +89,9 @@ export class UnreadableFeatureCorpusError extends Error {
|
|
|
88
89
|
* refusal means for it.
|
|
89
90
|
*
|
|
90
91
|
* WHY A TYPED ERROR RATHER THAN AN EMPTY CORPUS. The obvious fix is for `discoverFeatures` to hand
|
|
91
|
-
* back `[]` when the directory is not there
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* `checkInputsExist`, a supplied-but-absent `--features` too — into `The corpus could not be
|
|
95
|
-
* read: …` at exit 2. Tolerance at the reader turns both into `tags: OK …` at exit 0, inside the
|
|
96
|
-
* slice whose whole purpose is killing a vacuous certification. Typed, both survive untouched:
|
|
97
|
-
* this IS an `Error`, so it still lands in that generic catch.
|
|
92
|
+
* back `[]` when the directory is not there, and that would decide for every reader that absence
|
|
93
|
+
* is empty. Typed, each caller decides: `balance` reads it as no corpus (@SCN-CLI-017), and any
|
|
94
|
+
* other reader still meets a refusal. (The second command this guarded, `tags`, left at 3F-3635.)
|
|
98
95
|
*
|
|
99
96
|
* IT CARRIES THE DIRECTORY because the report is owed the name of what it examined — "I found no
|
|
100
97
|
* record" and "I found no regression" must never wear one word (3F-2947), and a consumer told
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gherkinValidation.js","sourceRoot":"","sources":["../../src/ingest/gherkinValidation.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gherkinValidation.js","sourceRoot":"","sources":["../../src/ingest/gherkinValidation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUjD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACxD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,0BAA0B,EAAE,CAAC,CAAC;IAEhG,IAAI,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrB,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0FAA0F;QAC1F,sFAAsF;QACtF,0FAA0F;QAC1F,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IAC5C,MAAM,CAA+B;IAE9C,YAAY,MAAoC;QAC9C,KAAK,CACH;YACE,yEAAyE;YACzE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC;SAC5D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;QAC3C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,8FAA8F;IACrF,SAAS,CAAS;IAE3B,YAAY,SAAiB;QAC3B,KAAK,CAAC,gDAAgD,SAAS,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACxC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
|