spec-controller 0.1.0-alpha.5 → 0.1.0-alpha.50
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 +34 -6
- 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 +60 -0
- package/dist/cli-allocate/cli.js.map +1 -0
- package/dist/cli-allocate/readHistory.d.ts +15 -0
- package/dist/cli-allocate/readHistory.d.ts.map +1 -0
- package/dist/cli-allocate/readHistory.js +108 -0
- package/dist/cli-allocate/readHistory.js.map +1 -0
- package/dist/cli-allocate/readParts.d.ts +2 -0
- package/dist/cli-allocate/readParts.d.ts.map +1 -0
- package/dist/cli-allocate/readParts.js +22 -0
- package/dist/cli-allocate/readParts.js.map +1 -0
- package/dist/cli-allocate/readTree.d.ts +5 -0
- package/dist/cli-allocate/readTree.d.ts.map +1 -0
- package/dist/cli-allocate/readTree.js +74 -0
- package/dist/cli-allocate/readTree.js.map +1 -0
- package/dist/cli-allocate/refStore.d.ts +2 -0
- package/dist/cli-allocate/refStore.d.ts.map +1 -0
- package/dist/cli-allocate/refStore.js +34 -0
- package/dist/cli-allocate/refStore.js.map +1 -0
- package/dist/cli-allocate/request.d.ts +9 -0
- package/dist/cli-allocate/request.d.ts.map +1 -0
- package/dist/cli-allocate/request.js +22 -0
- package/dist/cli-allocate/request.js.map +1 -0
- package/dist/cli-allocate/stderr.d.ts +7 -0
- package/dist/cli-allocate/stderr.d.ts.map +1 -0
- package/dist/cli-allocate/stderr.js +26 -0
- package/dist/cli-allocate/stderr.js.map +1 -0
- package/dist/cli-allocate/unreadable.d.ts +11 -0
- package/dist/cli-allocate/unreadable.d.ts.map +1 -0
- package/dist/cli-allocate/unreadable.js +30 -0
- package/dist/cli-allocate/unreadable.js.map +1 -0
- package/dist/cli-args.d.ts +12 -70
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +158 -81
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-balance/cli.d.ts +1 -81
- package/dist/cli-balance/cli.d.ts.map +1 -1
- package/dist/cli-balance/cli.js +71 -357
- package/dist/cli-balance/cli.js.map +1 -1
- package/dist/cli-balance/emit/format.d.ts +16 -38
- package/dist/cli-balance/emit/format.d.ts.map +1 -1
- package/dist/cli-balance/emit/format.js +31 -58
- package/dist/cli-balance/emit/format.js.map +1 -1
- package/dist/cli-balance/emit/writer.d.ts +2 -32
- package/dist/cli-balance/emit/writer.d.ts.map +1 -1
- package/dist/cli-balance/emit/writer.js +50 -37
- package/dist/cli-balance/emit/writer.js.map +1 -1
- package/dist/cli-balance/exitStatus.d.ts +2 -0
- package/dist/cli-balance/exitStatus.d.ts.map +1 -0
- package/dist/cli-balance/exitStatus.js +5 -0
- package/dist/cli-balance/exitStatus.js.map +1 -0
- package/dist/cli-balance/inputsRead.d.ts +11 -0
- package/dist/cli-balance/inputsRead.d.ts.map +1 -0
- package/dist/cli-balance/inputsRead.js +53 -0
- package/dist/cli-balance/inputsRead.js.map +1 -0
- package/dist/cli-balance/reRender.d.ts +8 -0
- package/dist/cli-balance/reRender.d.ts.map +1 -0
- package/dist/cli-balance/reRender.js +21 -0
- package/dist/cli-balance/reRender.js.map +1 -0
- package/dist/cli-balance/unreadableInputs.d.ts +14 -0
- package/dist/cli-balance/unreadableInputs.d.ts.map +1 -0
- package/dist/cli-balance/unreadableInputs.js +80 -0
- package/dist/cli-balance/unreadableInputs.js.map +1 -0
- package/dist/cli-registry.d.ts +12 -70
- package/dist/cli-registry.d.ts.map +1 -1
- package/dist/cli-registry.js +37 -97
- package/dist/cli-registry.js.map +1 -1
- package/dist/cli.d.ts +0 -21
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +62 -55
- package/dist/cli.js.map +1 -1
- package/dist/deferralTags.d.ts +0 -14
- package/dist/deferralTags.d.ts.map +1 -1
- package/dist/deferralTags.js +0 -14
- package/dist/deferralTags.js.map +1 -1
- package/dist/host.d.ts +10 -41
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +103 -50
- package/dist/host.js.map +1 -1
- package/dist/ingest/ciSourcePaths.d.ts +0 -38
- package/dist/ingest/ciSourcePaths.d.ts.map +1 -1
- package/dist/ingest/ciSourcePaths.js +0 -38
- package/dist/ingest/ciSourcePaths.js.map +1 -1
- package/dist/ingest/gherkinValidation.d.ts +0 -80
- package/dist/ingest/gherkinValidation.d.ts.map +1 -1
- package/dist/ingest/gherkinValidation.js +0 -80
- package/dist/ingest/gherkinValidation.js.map +1 -1
- package/dist/ingest/ingestQualityChecks.d.ts +8 -93
- package/dist/ingest/ingestQualityChecks.d.ts.map +1 -1
- package/dist/ingest/ingestQualityChecks.js +57 -214
- package/dist/ingest/ingestQualityChecks.js.map +1 -1
- package/dist/ingest/ingestScenarios.d.ts +0 -45
- package/dist/ingest/ingestScenarios.d.ts.map +1 -1
- package/dist/ingest/ingestScenarios.js +28 -108
- package/dist/ingest/ingestScenarios.js.map +1 -1
- package/dist/ingest/inputShapes.d.ts +16 -0
- package/dist/ingest/inputShapes.d.ts.map +1 -0
- package/dist/ingest/inputShapes.js +113 -0
- package/dist/ingest/inputShapes.js.map +1 -0
- package/dist/outputLocation.d.ts +27 -0
- package/dist/outputLocation.d.ts.map +1 -0
- package/dist/outputLocation.js +135 -0
- package/dist/outputLocation.js.map +1 -0
- package/dist/run-management/keptRun.d.ts +5 -105
- package/dist/run-management/keptRun.d.ts.map +1 -1
- package/dist/run-management/keptRun.js +16 -82
- package/dist/run-management/keptRun.js.map +1 -1
- package/dist/run-management/resolveRunInputs.d.ts +0 -67
- package/dist/run-management/resolveRunInputs.d.ts.map +1 -1
- package/dist/run-management/resolveRunInputs.js +0 -88
- package/dist/run-management/resolveRunInputs.js.map +1 -1
- package/dist/storedRun.d.ts +6 -0
- package/dist/storedRun.d.ts.map +1 -0
- package/dist/storedRun.js +28 -0
- package/dist/storedRun.js.map +1 -0
- package/package.json +2 -2
- package/dist/corpus/cli.d.ts +0 -34
- package/dist/corpus/cli.d.ts.map +0 -1
- package/dist/corpus/cli.js +0 -125
- package/dist/corpus/cli.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unreadable.js","sourceRoot":"","sources":["../../src/cli-allocate/unreadable.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAI7B;IACA;IACA;IALO,IAAI,GAAG,iBAAiB,CAAC;IAE3C,YACW,OAAe,EACf,IAAY,EACZ,MAAc;QAEvB,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,uBAAuB,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,uBAAuB,IAAI,KAAK,MAAM,GAAG,CAAC,CAAC;QAJ7G,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAQ;IAGzB,CAAC;CACF;AAED,MAAM,UAAU,YAAY,CAAI,OAAe,EAAE,IAAY,EAAE,IAAa;IAC1E,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,IAAY,EAAE,GAAY;IAChE,MAAM,KAAK,GAAG,GAA4B,CAAC;IAC3C,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,MAAM,GAAG,CAAC;IACzE,MAAM,IAAI,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAwB;IAClD,OAAO,2CAA2C,OAAO,CAAC,OAAO,EAAE,CAAC;AACtE,CAAC"}
|
package/dist/cli-args.d.ts
CHANGED
|
@@ -1,73 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* WHY IT IS ITS OWN MODULE (3F-3300). Both halves lived inside `cli-balance/cli.ts` while
|
|
5
|
-
* `balance` was the only command — `parseArgs` private to it, `checkUnknownFlags` exported for
|
|
6
|
-
* its own `@unit` arm. A second command needs both, and the two ways of giving it them were
|
|
7
|
-
* worse than moving them: copying `parseArgs` would put a second reading of argv in a tree whose
|
|
8
|
-
* whole subject is second readings, and importing them from `cli-balance/cli.ts` would have the
|
|
9
|
-
* corpus command pull the entire reconcile ingest chain into memory to answer a question about
|
|
10
|
-
* feature files.
|
|
11
|
-
*
|
|
12
|
-
* THE BOUNDING IS PER-COMMAND, which is what makes "accepted = registry = help" hold for every
|
|
13
|
-
* command rather than for the one this code was written beside. `checkUnknownFlags` took the
|
|
14
|
-
* registry and looked `balance` up inside itself; the command is a parameter now, exactly as it
|
|
15
|
-
* became one for `renderCommandHelp` (3F-3298). @SCN-CLI-009's scenario is unchanged and still
|
|
16
|
-
* asks about `balance`: what a second command gets is the same bounding BY CONSTRUCTION, and the
|
|
17
|
-
* residual — that an unregistered flag to `tags` is unproven by a scenario of its own — is named
|
|
18
|
-
* on 3F-3286 rather than left silent.
|
|
19
|
-
*/
|
|
20
|
-
import type { CliRegistry } from "./cli-registry.js";
|
|
21
|
-
/**
|
|
22
|
-
* Parse `--flag value` pairs from a command's argv into a record, keys with the `--` stripped.
|
|
23
|
-
*
|
|
24
|
-
* A flag whose next token is another flag (or absent) records the string `"true"`, which is how
|
|
25
|
-
* the boolean flags — `--strict`, `--help` — are recognised: presence is what matters, so callers
|
|
26
|
-
* read them with `!== undefined`.
|
|
27
|
-
*
|
|
28
|
-
* PERMISSIVE BY ITSELF, AND BOUNDED BY THE CALLER. It records whatever it is given, including a
|
|
29
|
-
* flag no registry names; `checkUnknownFlags` below is what turns that into a usage error. The
|
|
30
|
-
* split is deliberate — the parse has no opinion about which command it is reading for, and the
|
|
31
|
-
* bounding has nothing else to do.
|
|
32
|
-
*/
|
|
1
|
+
import type { CliRegistry, FlagSpec } from "./cli-registry.js";
|
|
2
|
+
export declare function asksForHelp(argv: readonly string[]): boolean;
|
|
33
3
|
export declare function parseArgs(argv: readonly string[]): Record<string, string>;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
* naming it WITH its dashes — routed to stderr and the enumerated usage status 2 by the caller,
|
|
45
|
-
* never 1, never a silent run — else null. The global `--store`/`--run-id` modifiers never reach
|
|
46
|
-
* here: the top-level dispatcher consumes them BEFORE any command is dispatched, so a bounded
|
|
47
|
-
* parse sees only the command's own args.
|
|
48
|
-
*
|
|
49
|
-
* A COMMAND THE REGISTRY DOES NOT NAME ACCEPTS NOTHING, which is the honest reading rather than a
|
|
50
|
-
* degenerate one: an unregistered command has no scope, so every flag given to it is outside it.
|
|
51
|
-
* The dispatcher refuses such a command before this is ever reached, so the case is unreachable
|
|
52
|
-
* today and stated here so it cannot become a silent "accept everything" later.
|
|
53
|
-
*
|
|
54
|
-
* IT NAMES THE VERSION THAT REFUSED, AND THAT IS FOR THE PINNED READER (3F-3105, @SCN-CLI-009).
|
|
55
|
-
* A consumer pins spec-controller and then moves their own tree; the pinned reader is handed argv
|
|
56
|
-
* it was published too early — or too late — to understand, and an unadorned "unknown flag" is
|
|
57
|
-
* indistinguishable from a typo. Naming the running version makes version skew legible from the CI
|
|
58
|
-
* log alone, and naming the bump says what to do about it. `toolVersion` is a PARAMETER rather than
|
|
59
|
-
* a read performed here so this stays pure and `@unit`-testable; the callers pass
|
|
60
|
-
* `resolveToolIdentity().toolVersion`, the same value the report provenance carries.
|
|
61
|
-
*
|
|
62
|
-
* WHY THE PRODUCT SAYS THIS AND NOT THE CONSUMER. spec-controller's own repository is a consumer of
|
|
63
|
-
* its published self, and the ruling there is that it does NOT wrap itself — a dependency, a `run:`
|
|
64
|
-
* step, and the verdict its exit code gives. A consumer-side translator turning exit 2 into a skew
|
|
65
|
-
* refusal is exactly that forbidden wrapper, and no other adopter could write one either. So the
|
|
66
|
-
* refusal is the tool's own, which makes it universal rather than local.
|
|
67
|
-
*
|
|
68
|
-
* THE STATUS DOES NOT MOVE. The caller still routes this to stderr and exit 2. A mistyped `--strcit`
|
|
69
|
-
* is still a usage fault, and giving skew its own status would cost every adopter the ordinary
|
|
70
|
-
* reading to serve the rarer one.
|
|
71
|
-
*/
|
|
4
|
+
export declare function valueFlagsOf(flags: readonly FlagSpec[]): Map<string, FlagSpec>;
|
|
5
|
+
export declare function isMissingValue(next: string | undefined): boolean;
|
|
6
|
+
export declare function checkMissingValues(argv: readonly string[], registry: CliRegistry, command: string): string | null;
|
|
7
|
+
export declare function missingValueRefusal(given: string, flag: FlagSpec, scope: string): string;
|
|
8
|
+
export declare function checkArgvShape(argv: readonly string[], registry: CliRegistry, command: string): string | null;
|
|
9
|
+
export declare function positionalArguments(argv: readonly string[], registry: CliRegistry, command: string): string[];
|
|
10
|
+
export declare function givenTwiceRefusal(given: string, scope: string): string;
|
|
11
|
+
export declare function isEqualsForm(token: string): boolean;
|
|
12
|
+
export declare function equalsFormRefusal(token: string, flags: ReadonlyMap<string, FlagSpec>, scope: string): string;
|
|
13
|
+
export declare function checkMisplacedHostModifiers(args: Record<string, string>, registry: CliRegistry, command: string): string | null;
|
|
72
14
|
export declare function checkUnknownFlags(args: Record<string, string>, registry: CliRegistry, command: string, toolVersion: string): string | null;
|
|
73
15
|
//# sourceMappingURL=cli-args.d.ts.map
|
package/dist/cli-args.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cli-args.d.ts","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,QAAQ,EAAkB,MAAM,mBAAmB,CAAC;AAE5F,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAE5D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBzE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAO9E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEhE;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CAUf;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKxF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW7G;AAaD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAS7G;AA2BD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtE;AAcD,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAW5G;AAsCD,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,IAAI,CASf;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAoBf"}
|
package/dist/cli-args.js
CHANGED
|
@@ -1,34 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* WHY IT IS ITS OWN MODULE (3F-3300). Both halves lived inside `cli-balance/cli.ts` while
|
|
5
|
-
* `balance` was the only command — `parseArgs` private to it, `checkUnknownFlags` exported for
|
|
6
|
-
* its own `@unit` arm. A second command needs both, and the two ways of giving it them were
|
|
7
|
-
* worse than moving them: copying `parseArgs` would put a second reading of argv in a tree whose
|
|
8
|
-
* whole subject is second readings, and importing them from `cli-balance/cli.ts` would have the
|
|
9
|
-
* corpus command pull the entire reconcile ingest chain into memory to answer a question about
|
|
10
|
-
* feature files.
|
|
11
|
-
*
|
|
12
|
-
* THE BOUNDING IS PER-COMMAND, which is what makes "accepted = registry = help" hold for every
|
|
13
|
-
* command rather than for the one this code was written beside. `checkUnknownFlags` took the
|
|
14
|
-
* registry and looked `balance` up inside itself; the command is a parameter now, exactly as it
|
|
15
|
-
* became one for `renderCommandHelp` (3F-3298). @SCN-CLI-009's scenario is unchanged and still
|
|
16
|
-
* asks about `balance`: what a second command gets is the same bounding BY CONSTRUCTION, and the
|
|
17
|
-
* residual — that an unregistered flag to `tags` is unproven by a scenario of its own — is named
|
|
18
|
-
* on 3F-3286 rather than left silent.
|
|
19
|
-
*/
|
|
20
|
-
/**
|
|
21
|
-
* Parse `--flag value` pairs from a command's argv into a record, keys with the `--` stripped.
|
|
22
|
-
*
|
|
23
|
-
* A flag whose next token is another flag (or absent) records the string `"true"`, which is how
|
|
24
|
-
* the boolean flags — `--strict`, `--help` — are recognised: presence is what matters, so callers
|
|
25
|
-
* read them with `!== undefined`.
|
|
26
|
-
*
|
|
27
|
-
* PERMISSIVE BY ITSELF, AND BOUNDED BY THE CALLER. It records whatever it is given, including a
|
|
28
|
-
* flag no registry names; `checkUnknownFlags` below is what turns that into a usage error. The
|
|
29
|
-
* split is deliberate — the parse has no opinion about which command it is reading for, and the
|
|
30
|
-
* bounding has nothing else to do.
|
|
31
|
-
*/
|
|
1
|
+
export function asksForHelp(argv) {
|
|
2
|
+
return argv.includes("--help") || argv.includes("-h");
|
|
3
|
+
}
|
|
32
4
|
export function parseArgs(argv) {
|
|
33
5
|
const args = {};
|
|
34
6
|
for (let i = 0; i < argv.length; i++) {
|
|
@@ -47,49 +19,146 @@ export function parseArgs(argv) {
|
|
|
47
19
|
}
|
|
48
20
|
return args;
|
|
49
21
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
22
|
+
export function valueFlagsOf(flags) {
|
|
23
|
+
const valueFlags = new Map();
|
|
24
|
+
for (const flag of flags) {
|
|
25
|
+
if (flag.arg === undefined)
|
|
26
|
+
continue;
|
|
27
|
+
for (const name of [flag.name, ...(flag.aliases ?? [])])
|
|
28
|
+
valueFlags.set(name, flag);
|
|
29
|
+
}
|
|
30
|
+
return valueFlags;
|
|
31
|
+
}
|
|
32
|
+
export function isMissingValue(next) {
|
|
33
|
+
return next === undefined || next === "" || next.startsWith("--");
|
|
34
|
+
}
|
|
35
|
+
export function checkMissingValues(argv, registry, command) {
|
|
36
|
+
const entry = registry.commands.find((c) => c.name === command);
|
|
37
|
+
const valueFlags = valueFlagsOf(entry?.flags ?? []);
|
|
38
|
+
for (let i = 0; i < argv.length; i++) {
|
|
39
|
+
const flag = valueFlags.get(argv[i] ?? "");
|
|
40
|
+
if (flag !== undefined && isMissingValue(argv[i + 1])) {
|
|
41
|
+
return missingValueRefusal(argv[i] ?? flag.name, flag, `spec-controller ${command}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
export function missingValueRefusal(given, flag, scope) {
|
|
47
|
+
return (`The ${given} flag of '${scope}' needs a value — ${given} ${flag.arg ?? ""} — and was given none.\n` +
|
|
48
|
+
`Run '${scope} --help' to see the flags this version accepts and the values they take.`);
|
|
49
|
+
}
|
|
50
|
+
export function checkArgvShape(argv, registry, command) {
|
|
51
|
+
const scope = flagScopeOf(registry, command);
|
|
52
|
+
const seen = new Set();
|
|
53
|
+
const positionals = positionalsOf(registry, command);
|
|
54
|
+
const walk = { scope, seen, positionals, slotsLeft: positionals.length };
|
|
55
|
+
for (let i = 0; i < argv.length; i++) {
|
|
56
|
+
const read = readToken(argv, i, walk, command);
|
|
57
|
+
if (typeof read === "string")
|
|
58
|
+
return read;
|
|
59
|
+
i += read;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
function positionalsOf(registry, command) {
|
|
64
|
+
return registry.commands.find((c) => c.name === command)?.positionals ?? [];
|
|
65
|
+
}
|
|
66
|
+
export function positionalArguments(argv, registry, command) {
|
|
67
|
+
const scope = flagScopeOf(registry, command);
|
|
68
|
+
const words = [];
|
|
69
|
+
for (let i = 0; i < argv.length; i++) {
|
|
70
|
+
const token = argv[i] ?? "";
|
|
71
|
+
if (!isFlagShaped(token))
|
|
72
|
+
words.push(token);
|
|
73
|
+
else if (scope.get(token)?.arg !== undefined)
|
|
74
|
+
i++;
|
|
75
|
+
}
|
|
76
|
+
return words;
|
|
77
|
+
}
|
|
78
|
+
function readToken(argv, i, walk, command) {
|
|
79
|
+
const token = argv[i] ?? "";
|
|
80
|
+
const next = argv[i + 1];
|
|
81
|
+
if (isEqualsForm(token))
|
|
82
|
+
return equalsFormRefusal(token, walk.scope, `spec-controller ${command}`);
|
|
83
|
+
if (!isFlagShaped(token) && !walk.scope.has(token))
|
|
84
|
+
return positionalRead(token, walk, command);
|
|
85
|
+
const flag = walk.scope.get(token);
|
|
86
|
+
if (flag === undefined)
|
|
87
|
+
return valueTokensAfter(undefined, next);
|
|
88
|
+
return registeredFlagRefusal(flag, token, next, walk, command) ?? valueTokensAfter(flag, next);
|
|
89
|
+
}
|
|
90
|
+
function registeredFlagRefusal(flag, token, next, walk, command) {
|
|
91
|
+
if (walk.seen.has(flag) && flag.repeatable !== true)
|
|
92
|
+
return givenTwiceRefusal(token, `spec-controller ${command}`);
|
|
93
|
+
walk.seen.add(flag);
|
|
94
|
+
if (flag.arg === undefined && next !== undefined && !isFlagShaped(next) && !walk.scope.has(next) && walk.slotsLeft === 0) {
|
|
95
|
+
return takesNoValueRefusal(token, next, command);
|
|
96
|
+
}
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
export function givenTwiceRefusal(given, scope) {
|
|
100
|
+
return (`The ${given} flag of '${scope}' was given more than once, and is read once: give it once.\n` +
|
|
101
|
+
`Run '${scope} --help' to see the flags this version accepts.`);
|
|
102
|
+
}
|
|
103
|
+
function flagScopeOf(registry, command) {
|
|
104
|
+
const scope = new Map();
|
|
105
|
+
for (const flag of registry.commands.find((c) => c.name === command)?.flags ?? []) {
|
|
106
|
+
for (const name of [flag.name, ...(flag.aliases ?? [])])
|
|
107
|
+
scope.set(name, flag);
|
|
108
|
+
}
|
|
109
|
+
return scope;
|
|
110
|
+
}
|
|
111
|
+
function isFlagShaped(token) {
|
|
112
|
+
return token.startsWith("--");
|
|
113
|
+
}
|
|
114
|
+
export function isEqualsForm(token) {
|
|
115
|
+
return isFlagShaped(token) && token.includes("=");
|
|
116
|
+
}
|
|
117
|
+
export function equalsFormRefusal(token, flags, scope) {
|
|
118
|
+
const at = token.indexOf("=");
|
|
119
|
+
const name = token.slice(0, at);
|
|
120
|
+
const value = token.slice(at + 1);
|
|
121
|
+
const flag = flags.get(name);
|
|
122
|
+
const spelling = flag !== undefined && flag.arg === undefined ? name : `${name} ${value === "" ? (flag?.arg ?? "<value>") : value}`;
|
|
123
|
+
return (`The ${token} form is not read by '${scope}': a flag and its value are two arguments, as in '${spelling}'.\n` +
|
|
124
|
+
`Run '${scope} --help' to see the flags this version accepts.`);
|
|
125
|
+
}
|
|
126
|
+
function valueTokensAfter(flag, next) {
|
|
127
|
+
if (next === undefined || isFlagShaped(next))
|
|
128
|
+
return 0;
|
|
129
|
+
return flag === undefined || flag.arg !== undefined ? 1 : 0;
|
|
130
|
+
}
|
|
131
|
+
function takesNoValueRefusal(flag, value, command) {
|
|
132
|
+
return (`The ${flag} flag of 'spec-controller ${command}' takes no value, and was given one: '${value}'.\n` +
|
|
133
|
+
`Run 'spec-controller ${command} --help' to see the flags this version accepts and the values they take.`);
|
|
134
|
+
}
|
|
135
|
+
function positionalRead(token, walk, command) {
|
|
136
|
+
if (walk.slotsLeft === 0) {
|
|
137
|
+
return walk.positionals.length === 0 ? notAFlagRefusal(token, command) : extraPositionalRefusal(token, walk, command);
|
|
138
|
+
}
|
|
139
|
+
walk.slotsLeft--;
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
function extraPositionalRefusal(token, walk, command) {
|
|
143
|
+
const takes = walk.positionals.map((positional) => positional.name).join(" ");
|
|
144
|
+
return (`The argument '${token}' is more than 'spec-controller ${command}' takes: it takes ${takes} once, and its flags.\n` +
|
|
145
|
+
`Run 'spec-controller ${command} --help' to see what this version accepts.`);
|
|
146
|
+
}
|
|
147
|
+
function notAFlagRefusal(token, command) {
|
|
148
|
+
return (`The argument '${token}' is not a flag, nor the value of the flag before it: ` +
|
|
149
|
+
`'spec-controller ${command}' takes only flags and their values.\n` +
|
|
150
|
+
`Run 'spec-controller ${command} --help' to see the flags this version accepts.`);
|
|
151
|
+
}
|
|
152
|
+
export function checkMisplacedHostModifiers(args, registry, command) {
|
|
153
|
+
const modifiers = new Set(registry.global.map((flag) => flag.name.replace(/^-+/, "")));
|
|
154
|
+
const key = Object.keys(args).find((k) => modifiers.has(k));
|
|
155
|
+
if (key === undefined)
|
|
156
|
+
return null;
|
|
157
|
+
return (`The --${key} flag is a host modifier: it goes before the command, as in ` +
|
|
158
|
+
`'spec-controller --${key} <value> ${command} …', never after it.\n` +
|
|
159
|
+
`Run 'spec-controller --help' to see the host modifiers this version accepts.`);
|
|
160
|
+
}
|
|
88
161
|
export function checkUnknownFlags(args, registry, command, toolVersion) {
|
|
89
|
-
// The accepted set: every flag name AND alias in THIS command's scope, with the leading dashes
|
|
90
|
-
// stripped so it compares against the parse's `--`-stripped keys (e.g. "--features" and "-h"
|
|
91
|
-
// become "features" and "h"). Built from the registry alone — the single source — so
|
|
92
|
-
// "accepted = registry" holds by construction.
|
|
93
162
|
const entry = registry.commands.find((c) => c.name === command);
|
|
94
163
|
const accepted = new Set();
|
|
95
164
|
for (const flag of entry?.flags ?? []) {
|
|
@@ -97,18 +166,26 @@ export function checkUnknownFlags(args, registry, command, toolVersion) {
|
|
|
97
166
|
for (const alias of flag.aliases ?? [])
|
|
98
167
|
accepted.add(alias.replace(/^-+/, ""));
|
|
99
168
|
}
|
|
100
|
-
// The FIRST parsed flag not in the accepted set is the reported error (Object.keys is argv
|
|
101
|
-
// order, so this is deterministic). The message names the flag WITH its dashes, and the command
|
|
102
|
-
// whose scope refused it — a consumer running two commands needs to know which help to open.
|
|
103
169
|
for (const key of Object.keys(args)) {
|
|
104
170
|
if (!accepted.has(key)) {
|
|
105
|
-
return (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
171
|
+
return (retiredFlagRefusal(entry, key, command, toolVersion) ??
|
|
172
|
+
`Unknown flag --${key} for 'spec-controller ${command}' — this is spec-controller ` +
|
|
173
|
+
`${toolVersion}, and that flag is not in its ${command} scope.\n` +
|
|
174
|
+
`If this version is pinned, the pin and the tree it is reading have drifted apart: ` +
|
|
175
|
+
`bump the pin to a version whose '${command}' accepts --${key}.\n` +
|
|
176
|
+
`Otherwise run 'spec-controller ${command} --help' to see the flags this version accepts.`);
|
|
110
177
|
}
|
|
111
178
|
}
|
|
112
179
|
return null;
|
|
113
180
|
}
|
|
181
|
+
function retiredFlagRefusal(entry, key, command, toolVersion) {
|
|
182
|
+
const retired = entry?.retiredFlags?.find((flag) => flag.name.replace(/^-+/, "") === key);
|
|
183
|
+
if (retired === undefined)
|
|
184
|
+
return undefined;
|
|
185
|
+
return (`Retired flag ${retired.name} for 'spec-controller ${command}' — retired in spec-controller ` +
|
|
186
|
+
`${retired.retiredIn}, and no later version accepts it (this is spec-controller ${toolVersion}).\n` +
|
|
187
|
+
`Do not pin an earlier version to get it back: that restores the route it was retired with. ` +
|
|
188
|
+
`${retired.replacement}\n` +
|
|
189
|
+
`Run 'spec-controller ${command} --help' to see the flags this version accepts.`);
|
|
190
|
+
}
|
|
114
191
|
//# sourceMappingURL=cli-args.js.map
|
package/dist/cli-args.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli-args.js","sourceRoot":"","sources":["../src/cli-args.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,87 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The balance CLI — thin wiring over the reconciler seams. The orchestration half of
|
|
3
|
-
* the old cli.ts: arg parsing, the render-from-JSON mode, and the reconcile →
|
|
4
|
-
* census → provenance → plan → write sequence. The impure file reads it calls
|
|
5
|
-
* (runReconcile + the read* siblings) live in ingest/ingestQualityChecks.ts; the output
|
|
6
|
-
* plan/write in ./emit; the git-derived run inputs in run-management/resolveRunInputs.ts.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* pnpm reconcile [--features <dir>] [--vitest <report.json>]
|
|
10
|
-
* [--cucumber <report.json>] [--ci-steps <record.json>]
|
|
11
|
-
* [--ci <ci.yml>]
|
|
12
|
-
* [--format <fmt>[:<path>]]
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* The legacy-`--json` guard at the CLI edge (@SCN-FMT-006). The earlier
|
|
16
|
-
* `--json <path>` flag is removed; supplying it must fail fast with a migration hint to
|
|
17
|
-
* `--format json:<path>`, so the removed flag never silently no-ops and drops output. PURE
|
|
18
|
-
* and `@unit`-testable: the removed flag is NOT a `--format` spec (planOutput never sees
|
|
19
|
-
* it), so the guard reads the parsed args directly and returns the typed migration-hint
|
|
20
|
-
* error message when `--json` is present — routed to stderr + a non-zero exit by main(),
|
|
21
|
-
* the same handling planOutput's typed error gets (the shared error surface) — else null.
|
|
22
|
-
*/
|
|
23
1
|
export declare function checkLegacyJson(args: Record<string, string>): string | null;
|
|
24
|
-
/**
|
|
25
|
-
* Source the provenance "Target repo:" name for a run (@SCN-RPT-001 Update —
|
|
26
|
-
* Fork A). The operator's `--target` is recorded VERBATIM — no resolution — defaulting to
|
|
27
|
-
* `"unknown-target"` when omitted (parallel to `sourceSha`'s `"unknown"`; the facts
|
|
28
|
-
* artefact is self-describing, so the line always renders). PURE and `@unit`-testable at
|
|
29
|
-
* the CLI edge, like `checkLegacyJson`. It never inspects `--features`: the prior
|
|
30
|
-
* `basename(dirname(--features))` resolution (the deleted `resolveTarget`) and its
|
|
31
|
-
* degenerate `.` are impossible now — the target is only ever the given value or the
|
|
32
|
-
* explicit default.
|
|
33
|
-
*/
|
|
34
2
|
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
|
-
*/
|
|
52
3
|
export declare function checkInputsExist(args: Record<string, string>, exists: (path: string) => boolean): string | null;
|
|
53
|
-
/**
|
|
54
|
-
* Guard the READABILITY of the supplied JSON inputs at the CLI edge (@SCN-CLI-014).
|
|
55
|
-
* `checkInputsExist` already guards their PRESENCE — but a path that is present yet
|
|
56
|
-
* UNPARSEABLE fell straight through it: the reader threw mid-parse, nothing caught it, and
|
|
57
|
-
* the process hit Node's default exit 1 — the code reserved for a genuine OUT-OF-BALANCE
|
|
58
|
-
* verdict. A crashed invocation was therefore indistinguishable, by exit code, from an
|
|
59
|
-
* honest disagreement (3F-1742). An input the tool cannot read is a USAGE fault: exit 2,
|
|
60
|
-
* sibling to a missing path (@SCN-CLI-002) and an unrecognised flag (@SCN-CLI-009).
|
|
61
|
-
*
|
|
62
|
-
* PURE and `@unit`-testable like its sibling guards: reads the parsed args + an injected
|
|
63
|
-
* `read` fn (no fs), returns the FIRST supplied-but-unparseable `(flag, path, failure)` as
|
|
64
|
-
* a typed error naming all three — routed to stderr + exit 2 by `refuseUnreadableInputs` — else null.
|
|
65
|
-
* An omitted flag is not an error, and an unreadable file (a race after the existence
|
|
66
|
-
* check) reports as the same input fault rather than escaping as a crash.
|
|
67
|
-
*/
|
|
68
4
|
export declare function checkInputsParse(args: Record<string, string>, read: (path: string) => string): string | null;
|
|
69
|
-
/**
|
|
70
|
-
* Guard the readability of `--render-from-json` at the CLI edge (@SCN-CLI-015). The
|
|
71
|
-
* render-from-saved-JSON branch RETURNS before the input guards ever run, so it honoured
|
|
72
|
-
* NEITHER: a missing path crashed to `ENOENT` and a malformed file to `SyntaxError`, both
|
|
73
|
-
* landing on Node's default exit 1 — the out-of-balance code (3F-1764).
|
|
74
|
-
*
|
|
75
|
-
* The missing-path case was a live violation of @SCN-CLI-002's own shipped principle: a
|
|
76
|
-
* supplied input path that does not exist is a hard error at exit 2, enforced for the five
|
|
77
|
-
* evidence flags and not for this one. The CLI shipped a guard that half-honoured its Rule.
|
|
78
|
-
*
|
|
79
|
-
* MISSING and UNPARSEABLE are two Examples of one boundary rule — an input the tool cannot
|
|
80
|
-
* read is a usage error, never a verdict — so one guard covers both. PURE and
|
|
81
|
-
* `@unit`-testable like its siblings: the parsed args + an injected `read` (no fs), which
|
|
82
|
-
* throws for an absent/unreadable path exactly as `readFileSync` does. An OMITTED flag is
|
|
83
|
-
* not an error (the ordinary reconcile path).
|
|
84
|
-
*/
|
|
85
5
|
export declare function checkRenderFromJson(args: Record<string, string>, read: (path: string) => string): string | null;
|
|
86
|
-
export declare function runBalance(argv: string[]):
|
|
6
|
+
export declare function runBalance(argv: string[]): boolean;
|
|
87
7
|
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli-balance/cli.ts"],"names":[],"mappings":"AAmDA,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,GAAG,IAAI,CAS3E;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAEjE;AAaD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GAChC,MAAM,GAAG,IAAI,CAWf;AAMD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,GAAG,IAAI,CAkBf;AAMD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAC7B,MAAM,GAAG,IAAI,CAWf;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAElD"}
|