@wirecat/cli-base 0.0.0-stage → 0.22.0

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.
Files changed (241) hide show
  1. package/LICENSE +204 -0
  2. package/README.md +390 -2
  3. package/config/biome.base.json +56 -0
  4. package/config/cspell.json +57 -0
  5. package/config/lefthook.yml +34 -0
  6. package/config/rumdl.toml +9 -0
  7. package/config/tsconfig.base.json +21 -0
  8. package/config/tsconfig.scripts.json +13 -0
  9. package/config/tsconfig.test.json +11 -0
  10. package/config/vale/CliDocs/Filler.yml +9 -0
  11. package/config/vale/CliDocs/SentenceLength.yml +6 -0
  12. package/config/vale/Tg/Tone.yml +7 -0
  13. package/config/wirecat/LICENSE +204 -0
  14. package/config/wirecat/biome.base.json +56 -0
  15. package/config/wirecat/check.mjs +41 -0
  16. package/config/wirecat/cspell.json +80 -0
  17. package/config/wirecat/lefthook.yml +26 -0
  18. package/config/wirecat/manifest.json +23 -0
  19. package/config/wirecat/markdownlint.json +10 -0
  20. package/config/wirecat/rumdl.toml +9 -0
  21. package/dist/codegen/index.d.ts +12 -0
  22. package/dist/codegen/index.d.ts.map +1 -0
  23. package/dist/codegen/index.js +11 -0
  24. package/dist/codegen/index.js.map +1 -0
  25. package/dist/codegen/manifest.d.ts +47 -0
  26. package/dist/codegen/manifest.d.ts.map +1 -0
  27. package/dist/codegen/manifest.js +73 -0
  28. package/dist/codegen/manifest.js.map +1 -0
  29. package/dist/codegen/model.d.ts +146 -0
  30. package/dist/codegen/model.d.ts.map +1 -0
  31. package/dist/codegen/model.js +7 -0
  32. package/dist/codegen/model.js.map +1 -0
  33. package/dist/codegen/names.d.ts +4 -0
  34. package/dist/codegen/names.d.ts.map +1 -0
  35. package/dist/codegen/names.js +46 -0
  36. package/dist/codegen/names.js.map +1 -0
  37. package/dist/codegen/pipeline.d.ts +24 -0
  38. package/dist/codegen/pipeline.d.ts.map +1 -0
  39. package/dist/codegen/pipeline.js +193 -0
  40. package/dist/codegen/pipeline.js.map +1 -0
  41. package/dist/codegen/runtime.d.ts +24 -0
  42. package/dist/codegen/runtime.d.ts.map +1 -0
  43. package/dist/codegen/runtime.js +38 -0
  44. package/dist/codegen/runtime.js.map +1 -0
  45. package/dist/codegen/tree.d.ts +29 -0
  46. package/dist/codegen/tree.d.ts.map +1 -0
  47. package/dist/codegen/tree.js +87 -0
  48. package/dist/codegen/tree.js.map +1 -0
  49. package/dist/codegen/typescript.d.ts +6 -0
  50. package/dist/codegen/typescript.d.ts.map +1 -0
  51. package/dist/codegen/typescript.js +78 -0
  52. package/dist/codegen/typescript.js.map +1 -0
  53. package/dist/codegen/valibot.d.ts +10 -0
  54. package/dist/codegen/valibot.d.ts.map +1 -0
  55. package/dist/codegen/valibot.js +132 -0
  56. package/dist/codegen/valibot.js.map +1 -0
  57. package/dist/commands/document.d.ts +72 -0
  58. package/dist/commands/document.d.ts.map +1 -0
  59. package/dist/commands/document.js +71 -0
  60. package/dist/commands/document.js.map +1 -0
  61. package/dist/commands/index.d.ts +83 -0
  62. package/dist/commands/index.d.ts.map +1 -0
  63. package/dist/commands/index.js +85 -0
  64. package/dist/commands/index.js.map +1 -0
  65. package/dist/commands/page.d.ts +80 -0
  66. package/dist/commands/page.d.ts.map +1 -0
  67. package/dist/commands/page.js +100 -0
  68. package/dist/commands/page.js.map +1 -0
  69. package/dist/completion/index.d.ts +37 -0
  70. package/dist/completion/index.d.ts.map +1 -0
  71. package/dist/completion/index.js +87 -0
  72. package/dist/completion/index.js.map +1 -0
  73. package/dist/config.d.ts +20 -0
  74. package/dist/config.d.ts.map +1 -0
  75. package/dist/config.js +61 -0
  76. package/dist/config.js.map +1 -0
  77. package/dist/credentials.d.ts +48 -0
  78. package/dist/credentials.d.ts.map +1 -0
  79. package/dist/credentials.js +120 -0
  80. package/dist/credentials.js.map +1 -0
  81. package/dist/deadline.d.ts +14 -0
  82. package/dist/deadline.d.ts.map +1 -0
  83. package/dist/deadline.js +88 -0
  84. package/dist/deadline.js.map +1 -0
  85. package/dist/dev/bin.d.ts +3 -0
  86. package/dist/dev/bin.d.ts.map +1 -0
  87. package/dist/dev/bin.js +8 -0
  88. package/dist/dev/bin.js.map +1 -0
  89. package/dist/dev/lint.d.ts +31 -0
  90. package/dist/dev/lint.d.ts.map +1 -0
  91. package/dist/dev/lint.js +148 -0
  92. package/dist/dev/lint.js.map +1 -0
  93. package/dist/dev/main.d.ts +7 -0
  94. package/dist/dev/main.d.ts.map +1 -0
  95. package/dist/dev/main.js +279 -0
  96. package/dist/dev/main.js.map +1 -0
  97. package/dist/dev/next-version.d.ts +11 -0
  98. package/dist/dev/next-version.d.ts.map +1 -0
  99. package/dist/dev/next-version.js +33 -0
  100. package/dist/dev/next-version.js.map +1 -0
  101. package/dist/dev/slow-tests.d.ts +14 -0
  102. package/dist/dev/slow-tests.d.ts.map +1 -0
  103. package/dist/dev/slow-tests.js +17 -0
  104. package/dist/dev/slow-tests.js.map +1 -0
  105. package/dist/dev/test-matrix.d.ts +35 -0
  106. package/dist/dev/test-matrix.d.ts.map +1 -0
  107. package/dist/dev/test-matrix.js +93 -0
  108. package/dist/dev/test-matrix.js.map +1 -0
  109. package/dist/errors.d.ts +34 -0
  110. package/dist/errors.d.ts.map +1 -0
  111. package/dist/errors.js +40 -0
  112. package/dist/errors.js.map +1 -0
  113. package/dist/executable.d.ts +3 -0
  114. package/dist/executable.d.ts.map +1 -0
  115. package/dist/executable.js +41 -0
  116. package/dist/executable.js.map +1 -0
  117. package/dist/exit-codes.d.ts +11 -0
  118. package/dist/exit-codes.d.ts.map +1 -0
  119. package/dist/exit-codes.js +25 -0
  120. package/dist/exit-codes.js.map +1 -0
  121. package/dist/http/index.d.ts +20 -0
  122. package/dist/http/index.d.ts.map +1 -0
  123. package/dist/http/index.js +46 -0
  124. package/dist/http/index.js.map +1 -0
  125. package/dist/index.d.ts +20 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +19 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/keyring.d.ts +27 -0
  130. package/dist/keyring.d.ts.map +1 -0
  131. package/dist/keyring.js +45 -0
  132. package/dist/keyring.js.map +1 -0
  133. package/dist/legacy-paths.d.ts +33 -0
  134. package/dist/legacy-paths.d.ts.map +1 -0
  135. package/dist/legacy-paths.js +128 -0
  136. package/dist/legacy-paths.js.map +1 -0
  137. package/dist/logger.d.ts +12 -0
  138. package/dist/logger.d.ts.map +1 -0
  139. package/dist/logger.js +7 -0
  140. package/dist/logger.js.map +1 -0
  141. package/dist/logging.d.ts +31 -0
  142. package/dist/logging.d.ts.map +1 -0
  143. package/dist/logging.js +58 -0
  144. package/dist/logging.js.map +1 -0
  145. package/dist/mcp/index.d.ts +32 -0
  146. package/dist/mcp/index.d.ts.map +1 -0
  147. package/dist/mcp/index.js +113 -0
  148. package/dist/mcp/index.js.map +1 -0
  149. package/dist/output-buffer.d.ts +16 -0
  150. package/dist/output-buffer.d.ts.map +1 -0
  151. package/dist/output-buffer.js +69 -0
  152. package/dist/output-buffer.js.map +1 -0
  153. package/dist/paths.d.ts +35 -0
  154. package/dist/paths.d.ts.map +1 -0
  155. package/dist/paths.js +45 -0
  156. package/dist/paths.js.map +1 -0
  157. package/dist/pretty.d.ts +12 -0
  158. package/dist/pretty.d.ts.map +1 -0
  159. package/dist/pretty.js +83 -0
  160. package/dist/pretty.js.map +1 -0
  161. package/dist/release/index.d.ts +38 -0
  162. package/dist/release/index.d.ts.map +1 -0
  163. package/dist/release/index.js +91 -0
  164. package/dist/release/index.js.map +1 -0
  165. package/dist/release/markdown.d.ts +36 -0
  166. package/dist/release/markdown.d.ts.map +1 -0
  167. package/dist/release/markdown.js +153 -0
  168. package/dist/release/markdown.js.map +1 -0
  169. package/dist/release/structure.d.ts +16 -0
  170. package/dist/release/structure.d.ts.map +1 -0
  171. package/dist/release/structure.js +74 -0
  172. package/dist/release/structure.js.map +1 -0
  173. package/dist/renderer.d.ts +34 -0
  174. package/dist/renderer.d.ts.map +1 -0
  175. package/dist/renderer.js +55 -0
  176. package/dist/renderer.js.map +1 -0
  177. package/dist/result-fields.d.ts +4 -0
  178. package/dist/result-fields.d.ts.map +1 -0
  179. package/dist/result-fields.js +56 -0
  180. package/dist/result-fields.js.map +1 -0
  181. package/dist/retry.d.ts +27 -0
  182. package/dist/retry.d.ts.map +1 -0
  183. package/dist/retry.js +26 -0
  184. package/dist/retry.js.map +1 -0
  185. package/dist/sanitize.d.ts +25 -0
  186. package/dist/sanitize.d.ts.map +1 -0
  187. package/dist/sanitize.js +52 -0
  188. package/dist/sanitize.js.map +1 -0
  189. package/dist/skill/index.d.ts +78 -0
  190. package/dist/skill/index.d.ts.map +1 -0
  191. package/dist/skill/index.js +190 -0
  192. package/dist/skill/index.js.map +1 -0
  193. package/dist/standards/errors.d.ts +40 -0
  194. package/dist/standards/errors.d.ts.map +1 -0
  195. package/dist/standards/errors.js +33 -0
  196. package/dist/standards/errors.js.map +1 -0
  197. package/dist/standards/index.d.ts +8 -0
  198. package/dist/standards/index.d.ts.map +1 -0
  199. package/dist/standards/index.js +8 -0
  200. package/dist/standards/index.js.map +1 -0
  201. package/dist/standards/lint.d.ts +29 -0
  202. package/dist/standards/lint.d.ts.map +1 -0
  203. package/dist/standards/lint.js +50 -0
  204. package/dist/standards/lint.js.map +1 -0
  205. package/dist/standards/log.d.ts +21 -0
  206. package/dist/standards/log.d.ts.map +1 -0
  207. package/dist/standards/log.js +18 -0
  208. package/dist/standards/log.js.map +1 -0
  209. package/dist/standards/output.d.ts +126 -0
  210. package/dist/standards/output.d.ts.map +1 -0
  211. package/dist/standards/output.js +54 -0
  212. package/dist/standards/output.js.map +1 -0
  213. package/dist/standards/registry.d.ts +18 -0
  214. package/dist/standards/registry.d.ts.map +1 -0
  215. package/dist/standards/registry.js +41 -0
  216. package/dist/standards/registry.js.map +1 -0
  217. package/dist/standards/steps.d.ts +28 -0
  218. package/dist/standards/steps.d.ts.map +1 -0
  219. package/dist/standards/steps.js +56 -0
  220. package/dist/standards/steps.js.map +1 -0
  221. package/dist/standards/vocabulary.d.ts +40 -0
  222. package/dist/standards/vocabulary.d.ts.map +1 -0
  223. package/dist/standards/vocabulary.js +242 -0
  224. package/dist/standards/vocabulary.js.map +1 -0
  225. package/dist/streams.d.ts +24 -0
  226. package/dist/streams.d.ts.map +1 -0
  227. package/dist/streams.js +26 -0
  228. package/dist/streams.js.map +1 -0
  229. package/dist/testing/index.d.ts +24 -0
  230. package/dist/testing/index.d.ts.map +1 -0
  231. package/dist/testing/index.js +29 -0
  232. package/dist/testing/index.js.map +1 -0
  233. package/dist/time.d.ts +21 -0
  234. package/dist/time.d.ts.map +1 -0
  235. package/dist/time.js +19 -0
  236. package/dist/time.js.map +1 -0
  237. package/dist/update/index.d.ts +76 -0
  238. package/dist/update/index.d.ts.map +1 -0
  239. package/dist/update/index.js +160 -0
  240. package/dist/update/index.js.map +1 -0
  241. package/package.json +135 -4
@@ -0,0 +1,279 @@
1
+ /**
2
+ * `cli-dev`: the development scripts every CLI on cli-base used to carry a copy of. Each command
3
+ * reads and writes under `cwd` and reports through `out` and `err`; `main` returns the exit code.
4
+ */
5
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
6
+ import { isAbsolute, join } from "node:path";
7
+ import { pathToFileURL } from "node:url";
8
+ import { parseArgs } from "node:util";
9
+ import spawn from "cross-spawn";
10
+ import * as v from "valibot";
11
+ import { parseCommandsDocument } from "../commands/document.js";
12
+ import { changelogProblems, docsProblems, JOURNAL_IDS, markdownFiles, structureProblems, versionScript, } from "../release/index.js";
13
+ import { baselineProblems, baselineSchema, LINT_RULES, OVERRIDE_BUDGET, overridesProblems, overridesSchema, } from "../standards/lint.js";
14
+ import { issuesOf } from "../standards/registry.js";
15
+ import { VOCABULARY } from "../standards/vocabulary.js";
16
+ import { baselineOf, judge, lintCommands } from "./lint.js";
17
+ import { nextVersion } from "./next-version.js";
18
+ import { slowTests } from "./slow-tests.js";
19
+ import { matrixPage, matrixRows, parseArgvLog } from "./test-matrix.js";
20
+ const USAGE = `usage: cli-dev <command> [options]
21
+
22
+ slow-tests [report] [count] the slowest tests and files (report: coverage/tests.json, count: 20)
23
+ next-version <wanted> <latest> <versions-json>
24
+ the version bin/release publishes, given npm's answers
25
+ version [--sync] [--file <path>] package.json's version against src/version.ts
26
+ docs-check [--rules <module>] [--ids <A,B>] [--pages]
27
+ links, anchors and the changelog's shape; --pages also
28
+ docs/ against docs/meta.json, the docs portal's structure
29
+ test-matrix --program <module> --untested <module> --name <cli> [--page <path>] [--check]
30
+ docs/dev/test-matrix.md from coverage/argv.jsonl
31
+ lint (--cli <bin> | --commands <file>) [--baseline <dir>] [--overrides <file>] [--budget <n>]
32
+ [--write-baseline] the command tree against the standard's rules; fails on a
33
+ new violation, a stale baseline entry or override, or more
34
+ overrides than the budget (10). --write-baseline rewrites
35
+ lint/baseline/<rule>.json to today's violations`;
36
+ const load = async (cwd, path) => (await import(pathToFileURL(isAbsolute(path) ? path : join(cwd, path)).href));
37
+ const report = (io, problems, ok) => {
38
+ for (const problem of problems)
39
+ io.err(problem);
40
+ if (problems.length > 0)
41
+ return 1;
42
+ io.out(ok);
43
+ return 0;
44
+ };
45
+ const docsCheck = async (args, io) => {
46
+ const { values } = parseArgs({
47
+ args,
48
+ options: { rules: { type: "string" }, ids: { type: "string" }, pages: { type: "boolean" } },
49
+ });
50
+ const root = io.cwd;
51
+ let changelog;
52
+ let docs;
53
+ if (values.rules) {
54
+ // A module exporting the rules the release check uses too: `CHANGELOG` and `docsRules(root)`.
55
+ const rules = await load(root, values.rules);
56
+ changelog = rules.CHANGELOG;
57
+ docs = rules.docsRules(root);
58
+ }
59
+ else {
60
+ const ids = [...JOURNAL_IDS, ...(values.ids?.split(",").filter(Boolean) ?? [])];
61
+ changelog = {
62
+ headings: ["Added", "Changed — may break callers", "Fixed", "Security", "Removed"],
63
+ unreleased: "Unreleased",
64
+ ids,
65
+ };
66
+ docs = { files: markdownFiles(root, new Set(["node_modules", "dist", "coverage", ".git", "docs_ai"])), ids };
67
+ }
68
+ return report(io, [
69
+ ...changelogProblems(readFileSync(join(root, "CHANGELOG.md"), "utf8"), { ...changelog, release: false }),
70
+ ...docsProblems(root, docs),
71
+ ...(values.pages ? structureProblems(root) : []),
72
+ ], "docs: ok");
73
+ };
74
+ const testMatrix = async (args, io) => {
75
+ const { values } = parseArgs({
76
+ args,
77
+ options: {
78
+ program: { type: "string" },
79
+ untested: { type: "string" },
80
+ name: { type: "string" },
81
+ page: { type: "string", default: "docs/dev/test-matrix.md" },
82
+ check: { type: "boolean", default: false },
83
+ },
84
+ });
85
+ if (!values.program || !values.untested || !values.name) {
86
+ io.err("test-matrix needs --program, --untested and --name");
87
+ return 2;
88
+ }
89
+ const log = join(io.cwd, "coverage", "argv.jsonl");
90
+ if (!existsSync(log)) {
91
+ io.err("no coverage/argv.jsonl — run the suite first (pnpm test:matrix does)");
92
+ return 1;
93
+ }
94
+ const program = (await load(io.cwd, values.program)).createProgram();
95
+ const untested = (await load(io.cwd, values.untested)).UNTESTED;
96
+ const { rows, stale } = matrixRows(program, parseArgvLog(readFileSync(log, "utf8")), untested);
97
+ writeFileSync(join(io.cwd, values.page), matrixPage(rows, values.name));
98
+ let failed = false;
99
+ if (stale.length > 0) {
100
+ failed = true;
101
+ io.err("untested entries that name nothing in the program any more:");
102
+ for (const entry of stale)
103
+ io.err(` ${entry.command}${entry.option ? ` ${entry.option}` : ""}`);
104
+ }
105
+ const missing = rows.filter((row) => row.state === "missing");
106
+ if (missing.length > 0 && values.check) {
107
+ failed = true;
108
+ io.err(`${missing.length} commands or options with no test and no reason — see ${values.page}:`);
109
+ for (const row of missing)
110
+ io.err(` ${row.command || "(global)"}${row.option ? ` ${row.option}` : ""}`);
111
+ }
112
+ const count = (state) => rows.filter((row) => row.state === state).length;
113
+ io.err(`test matrix: ${count("tested")} tested, ${count("untested")} untested with a reason, ${missing.length} missing`);
114
+ return failed ? 1 : 0;
115
+ };
116
+ const readJson = (path) => {
117
+ try {
118
+ return JSON.parse(readFileSync(path, "utf8"));
119
+ }
120
+ catch (error) {
121
+ throw new Error(`${path}: ${error.message}`);
122
+ }
123
+ };
124
+ const commandsJson = (io, cli, file) => {
125
+ if (file)
126
+ return readJson(isAbsolute(file) ? file : join(io.cwd, file));
127
+ const bin = cli ?? "";
128
+ const script = /\.[cm]?js$/.test(bin);
129
+ const run = spawn.sync(script ? process.execPath : bin, [...(script ? [bin] : []), "commands", "--json"], {
130
+ cwd: io.cwd,
131
+ encoding: "utf8",
132
+ maxBuffer: 64 * 1024 * 1024,
133
+ });
134
+ if (run.error || run.status !== 0)
135
+ throw new Error(`${bin} commands --json failed: ${run.error?.message ?? String(run.stderr).trim().split("\n")[0]}`);
136
+ return JSON.parse(String(run.stdout));
137
+ };
138
+ const lint = (args, io) => {
139
+ try {
140
+ return lintRun(args, io);
141
+ }
142
+ catch (error) {
143
+ io.err(error.message);
144
+ return 2;
145
+ }
146
+ };
147
+ const lintRun = (args, io) => {
148
+ const { values } = parseArgs({
149
+ args,
150
+ options: {
151
+ cli: { type: "string" },
152
+ commands: { type: "string" },
153
+ baseline: { type: "string", default: "lint/baseline" },
154
+ overrides: { type: "string", default: "lint/overrides.json" },
155
+ budget: { type: "string", default: String(OVERRIDE_BUDGET) },
156
+ "write-baseline": { type: "boolean", default: false },
157
+ },
158
+ });
159
+ if (Boolean(values.cli) === Boolean(values.commands)) {
160
+ io.err("lint needs one of --cli <bin> or --commands <file>");
161
+ return 2;
162
+ }
163
+ const budget = Number(values.budget);
164
+ if (!Number.isInteger(budget) || budget < 0) {
165
+ io.err(`--budget takes a whole number, not "${values.budget}"`);
166
+ return 2;
167
+ }
168
+ let raw;
169
+ try {
170
+ raw = commandsJson(io, values.cli, values.commands);
171
+ }
172
+ catch (error) {
173
+ io.err(error.message);
174
+ return 2;
175
+ }
176
+ const parsed = parseCommandsDocument(raw);
177
+ if (!parsed.document) {
178
+ io.err("the commands document is not the shape cli-base's commandsDocument() writes:");
179
+ for (const problem of parsed.problems.slice(0, 20))
180
+ io.err(` ${problem}`);
181
+ if (parsed.problems.length > 20)
182
+ io.err(` … and ${parsed.problems.length - 20} more`);
183
+ return 2;
184
+ }
185
+ const problems = [];
186
+ const overridesPath = join(io.cwd, values.overrides);
187
+ let overrides = [];
188
+ if (existsSync(overridesPath)) {
189
+ const read = v.safeParse(overridesSchema, readJson(overridesPath));
190
+ const found = read.success ? overridesProblems(read.output) : issuesOf(read.issues);
191
+ if (read.success)
192
+ overrides = read.output;
193
+ problems.push(...found.map((issue) => `${values.overrides}: ${issue}`));
194
+ }
195
+ const baselineDir = join(io.cwd, values.baseline);
196
+ const baseline = {};
197
+ if (existsSync(baselineDir))
198
+ for (const file of readdirSync(baselineDir).filter((name) => name.endsWith(".json"))) {
199
+ const read = v.safeParse(baselineSchema, readJson(join(baselineDir, file)));
200
+ const found = read.success ? baselineProblems(read.output) : issuesOf(read.issues);
201
+ if (read.success)
202
+ baseline[file.slice(0, -".json".length)] = read.output;
203
+ problems.push(...found.map((issue) => `${values.baseline}/${file}: ${issue}`));
204
+ }
205
+ const violations = lintCommands(parsed.document, VOCABULARY);
206
+ const severity = new Map(LINT_RULES.map((rule) => [rule.id, rule.severity]));
207
+ if (values["write-baseline"]) {
208
+ mkdirSync(baselineDir, { recursive: true });
209
+ for (const [rule, targets] of Object.entries(baselineOf(violations, overrides))) {
210
+ const path = join(baselineDir, `${rule}.json`);
211
+ if (targets.length > 0)
212
+ writeFileSync(path, `${JSON.stringify(targets, null, 2)}\n`);
213
+ else
214
+ rmSync(path, { force: true });
215
+ baseline[rule] = targets;
216
+ }
217
+ }
218
+ const verdict = judge(violations, baseline, overrides, budget);
219
+ for (const id of verdict.unknownRules)
220
+ problems.push(`no lint rule "${id}" (named in ${values.baseline} or ${values.overrides})`);
221
+ for (const found of verdict.fresh)
222
+ problems.push(`${severity.get(found.rule) ?? "?"} ${found.rule} ${found.target}: ${found.message}`);
223
+ for (const entry of verdict.stale)
224
+ problems.push(entry.in === "baseline"
225
+ ? `stale baseline entry, fixed or overridden — remove it: ${values.baseline}/${entry.rule}.json "${entry.target}"`
226
+ : `stale override, no such violation — remove it: ${entry.rule} "${entry.target}"`);
227
+ if (verdict.overBudget)
228
+ problems.push(`${overrides.length} overrides; the budget is ${budget}`);
229
+ io.err(`lint: ${violations.length} violations — ${verdict.baselined} in the baseline, ${verdict.overridden} overridden (budget ${budget}), ${verdict.fresh.length} new`);
230
+ return report(io, problems, "lint: ok");
231
+ };
232
+ export const main = async (argv, io) => {
233
+ const [command, ...args] = argv;
234
+ switch (command) {
235
+ case "slow-tests": {
236
+ const [file = "coverage/tests.json", count = "20"] = args;
237
+ const parsed = JSON.parse(readFileSync(join(io.cwd, file), "utf8"));
238
+ io.out(slowTests(parsed, io.cwd, Number(count)));
239
+ return 0;
240
+ }
241
+ case "next-version": {
242
+ const [wanted = "", latest = "", versions = ""] = args;
243
+ const found = nextVersion(wanted, latest, versions);
244
+ if ("error" in found) {
245
+ io.err(found.error);
246
+ return 1;
247
+ }
248
+ io.out(found.version);
249
+ return 0;
250
+ }
251
+ case "version": {
252
+ const { values } = parseArgs({
253
+ args,
254
+ options: { sync: { type: "boolean", default: false }, file: { type: "string", default: "src/version.ts" } },
255
+ });
256
+ const { code, message } = versionScript(io.cwd, values.sync ? ["--sync"] : [], values.file);
257
+ if (code === 0)
258
+ io.out(message);
259
+ else
260
+ io.err(message);
261
+ return code;
262
+ }
263
+ case "docs-check":
264
+ return docsCheck(args, io);
265
+ case "test-matrix":
266
+ return testMatrix(args, io);
267
+ case "lint":
268
+ return lint(args, io);
269
+ case "help":
270
+ case "--help":
271
+ case "-h":
272
+ io.out(USAGE);
273
+ return 0;
274
+ default:
275
+ io.err(command ? `cli-dev: no command "${command}"\n\n${USAGE}` : USAGE);
276
+ return 2;
277
+ }
278
+ };
279
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/dev/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjG,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,KAAK,MAAM,aAAa,CAAA;AAC/B,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,EAEL,iBAAiB,EAEjB,YAAY,EACZ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,aAAa,GACd,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,UAAU,EACV,eAAe,EAEf,iBAAiB,EACjB,eAAe,GAChB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAqB,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAoB,YAAY,EAAiB,MAAM,kBAAkB,CAAA;AAQxG,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;uFAeyE,CAAA;AAEvF,MAAM,IAAI,GAAG,KAAK,EAAE,GAAW,EAAE,IAAY,EAAoC,EAAE,CACjF,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAA4B,CAAA;AAE1G,MAAM,MAAM,GAAG,CAAC,EAAS,EAAE,QAA2B,EAAE,EAAU,EAAE,EAAE;IACpE,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC/C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,CAAA;IACjC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACV,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,KAAK,EAAE,IAAc,EAAE,EAAS,EAAE,EAAE;IACpD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI;QACJ,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;KAC5F,CAAC,CAAA;IACF,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAA;IACnB,IAAI,SAAyB,CAAA;IAC7B,IAAI,IAAe,CAAA;IACnB,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,8FAA8F;QAC9F,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAA;QAC5C,SAAS,GAAG,KAAK,CAAC,SAA2B,CAAA;QAC7C,IAAI,GAAI,KAAK,CAAC,SAAyC,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC/E,SAAS,GAAG;YACV,QAAQ,EAAE,CAAC,OAAO,EAAE,6BAA6B,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC;YAClF,UAAU,EAAE,YAAY;YACxB,GAAG;SACJ,CAAA;QACD,IAAI,GAAG,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAA;IAC9G,CAAC;IACD,OAAO,MAAM,CACX,EAAE,EACF;QACE,GAAG,iBAAiB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACxG,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;QAC3B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACjD,EACD,UAAU,CACX,CAAA;AACH,CAAC,CAAA;AAED,MAAM,UAAU,GAAG,KAAK,EAAE,IAAc,EAAE,EAAS,EAAE,EAAE;IACrD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI;QACJ,OAAO,EAAE;YACP,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC3B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yBAAyB,EAAE;YAC5D,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;SAC3C;KACF,CAAC,CAAA;IACF,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACxD,EAAE,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;QAC5D,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;IAClD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,EAAE,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAA;QAC9E,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,OAAO,GAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAmC,EAAE,CAAA;IAC3F,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAsB,CAAA;IAC7E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;IAC9F,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAEvE,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAA;QACb,EAAE,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;QACrE,KAAK,MAAM,KAAK,IAAI,KAAK;YAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAClG,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAA;IAC7D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACvC,MAAM,GAAG,IAAI,CAAA;QACb,EAAE,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,yDAAyD,MAAM,CAAC,IAAI,GAAG,CAAC,CAAA;QAChG,KAAK,MAAM,GAAG,IAAI,OAAO;YAAE,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,OAAO,IAAI,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1G,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,MAAM,CAAA;IACjF,EAAE,CAAC,GAAG,CACJ,gBAAgB,KAAK,CAAC,QAAQ,CAAC,YAAY,KAAK,CAAC,UAAU,CAAC,4BAA4B,OAAO,CAAC,MAAM,UAAU,CACjH,CAAA;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACvB,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAW,EAAE;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,KAAM,KAAe,CAAC,OAAO,EAAE,CAAC,CAAA;IACzD,CAAC;AACH,CAAC,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,EAAS,EAAE,GAAuB,EAAE,IAAwB,EAAW,EAAE;IAC7F,IAAI,IAAI;QAAE,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;IACvE,MAAM,GAAG,GAAG,GAAG,IAAI,EAAE,CAAA;IACrB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACrC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE;QACxG,GAAG,EAAE,EAAE,CAAC,GAAG;QACX,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAA;IACF,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,4BAA4B,GAAG,CAAC,KAAK,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACrH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AACvC,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,EAAS,EAAE,EAAE;IACzC,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAA;QAChC,OAAO,CAAC,CAAA;IACV,CAAC;AACH,CAAC,CAAA;AAED,MAAM,OAAO,GAAG,CAAC,IAAc,EAAE,EAAS,EAAE,EAAE;IAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI;QACJ,OAAO,EAAE;YACP,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACvB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE;YACtD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,qBAAqB,EAAE;YAC7D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE;YAC5D,gBAAgB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;SACtD;KACF,CAAC,CAAA;IACF,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,EAAE,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;QAC5D,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,EAAE,CAAC,GAAG,CAAC,uCAAuC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;QAC/D,OAAO,CAAC,CAAA;IACV,CAAC;IAED,IAAI,GAAY,CAAA;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAA;QAChC,OAAO,CAAC,CAAA;IACV,CAAC;IACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAA;IACzC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,EAAE,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAA;QACtF,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAAE,EAAE,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAA;QAC1E,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE;YAAE,EAAE,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAA;QACtF,OAAO,CAAC,CAAA;IACV,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,aAAa,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAA;IACpD,IAAI,SAAS,GAAe,EAAE,CAAA;IAC9B,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,eAAe,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAA;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnF,IAAI,IAAI,CAAC,OAAO;YAAE,SAAS,GAAG,IAAI,CAAC,MAAM,CAAA;QACzC,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC,CAAC,CAAA;IACzE,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAA;IACjD,MAAM,QAAQ,GAA6B,EAAE,CAAA;IAC7C,IAAI,UAAU,CAAC,WAAW,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACrF,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;YAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAClF,IAAI,IAAI,CAAC,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;YACxE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAA;QAChF,CAAC;IAEH,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAC5D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAE5E,IAAI,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC7B,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAChF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,OAAO,CAAC,CAAA;YAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;;gBAC/E,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YAClC,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IAC9D,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,YAAY;QACnC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,MAAM,CAAC,QAAQ,OAAO,MAAM,CAAC,SAAS,GAAG,CAAC,CAAA;IAC5F,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAC/B,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IACvG,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK;QAC/B,QAAQ,CAAC,IAAI,CACX,KAAK,CAAC,EAAE,KAAK,UAAU;YACrB,CAAC,CAAC,0DAA0D,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,UAAU,KAAK,CAAC,MAAM,GAAG;YAClH,CAAC,CAAC,kDAAkD,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,GAAG,CACrF,CAAA;IACH,IAAI,OAAO,CAAC,UAAU;QAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,6BAA6B,MAAM,EAAE,CAAC,CAAA;IAE/F,EAAE,CAAC,GAAG,CACJ,SAAS,UAAU,CAAC,MAAM,iBAAiB,OAAO,CAAC,SAAS,qBAAqB,OAAO,CAAC,UAAU,uBAAuB,MAAM,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,MAAM,CACjK,CAAA;IACD,OAAO,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,KAAK,EAAE,IAAuB,EAAE,EAAS,EAAmB,EAAE;IAChF,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;IAC/B,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,GAAG,qBAAqB,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAiB,CAAA;YACnF,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAChD,OAAO,CAAC,CAAA;QACV,CAAC;QACD,KAAK,cAAc,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,IAAI,CAAA;YACtD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YACnD,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBACrB,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACnB,OAAO,CAAC,CAAA;YACV,CAAC;YACD,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,CAAC,CAAA;QACV,CAAC;QACD,KAAK,SAAS,EAAE,CAAC;YACf,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;gBAC3B,IAAI;gBACJ,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAAE;aAC5G,CAAC,CAAA;YACF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;YAC3F,IAAI,IAAI,KAAK,CAAC;gBAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;;gBAC1B,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACpB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,KAAK,YAAY;YACf,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC5B,KAAK,aAAa;YAChB,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC7B,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QACvB,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACP,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YACb,OAAO,CAAC,CAAA;QACV;YACE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,OAAO,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YACxE,OAAO,CAAC,CAAA;IACZ,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The version `bin/release` publishes: the one in package.json when npm has not taken it and it is
3
+ * above npm's latest, else the next free one at the same bump level (x.y.0 → minor, x.y.z → patch).
4
+ * npm's answers are arguments, not calls, so CI and a test can hand it any registry state.
5
+ */
6
+ export declare const nextVersion: (wanted: string, latest: string, versionsJson: string) => {
7
+ version: string;
8
+ } | {
9
+ error: string;
10
+ };
11
+ //# sourceMappingURL=next-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-version.d.ts","sourceRoot":"","sources":["../../src/dev/next-version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,WAAW,WACd,MAAM,UACN,MAAM,gBACA,MAAM,KACnB;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CA6BvC,CAAA"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The version `bin/release` publishes: the one in package.json when npm has not taken it and it is
3
+ * above npm's latest, else the next free one at the same bump level (x.y.0 → minor, x.y.z → patch).
4
+ * npm's answers are arguments, not calls, so CI and a test can hand it any registry state.
5
+ */
6
+ export const nextVersion = (wanted, latest, versionsJson) => {
7
+ const parse = (version) => /^(\d+)\.(\d+)\.(\d+)$/.exec(version)?.slice(1).map(Number);
8
+ const compare = (a, b) => (a[0] ?? 0) - (b[0] ?? 0) || (a[1] ?? 0) - (b[1] ?? 0) || (a[2] ?? 0) - (b[2] ?? 0);
9
+ const want = parse(wanted);
10
+ // A pre-release is picked by hand; bin/release still refuses it if npm has it.
11
+ if (!want)
12
+ return { version: wanted };
13
+ let published = [];
14
+ try {
15
+ published = [JSON.parse(versionsJson || "[]")].flat();
16
+ }
17
+ catch { }
18
+ const taken = new Set(published);
19
+ const top = parse(latest);
20
+ if (!top) {
21
+ if (taken.has(wanted))
22
+ return { error: `${wanted} is on npm, and npm's latest "${latest}" is not a plain x.y.z version` };
23
+ return { version: wanted };
24
+ }
25
+ if (!taken.has(wanted) && compare(want, top) > 0)
26
+ return { version: wanted };
27
+ const step = ([major = 0, minor = 0, patch = 0]) => want[2] === 0 ? [major, minor + 1, 0] : [major, minor, patch + 1];
28
+ let next = step(top);
29
+ while (taken.has(next.join(".")))
30
+ next = step(next);
31
+ return { version: next.join(".") };
32
+ };
33
+ //# sourceMappingURL=next-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-version.js","sourceRoot":"","sources":["../../src/dev/next-version.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CACzB,MAAc,EACd,MAAc,EACd,YAAoB,EACqB,EAAE;IAC3C,MAAM,KAAK,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC9F,MAAM,OAAO,GAAG,CAAC,CAAW,EAAE,CAAW,EAAE,EAAE,CAC3C,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IAErF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IAC1B,+EAA+E;IAC/E,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAErC,IAAI,SAAS,GAAc,EAAE,CAAA;IAC7B,IAAI,CAAC;QACH,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IACvD,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAA;IAEhC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAA;IACzB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YACnB,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,iCAAiC,MAAM,gCAAgC,EAAE,CAAA;QACpG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAC5B,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;IAE5E,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAW,EAAE,EAAE,CAC3D,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;IACnE,IAAI,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAA;IACpB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAA;IACnD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;AACpC,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ /** The slowest tests and files from vitest's JSON report (`--reporter=json`), slowest first. */
2
+ export interface VitestReport {
3
+ testResults: {
4
+ name: string;
5
+ startTime: number;
6
+ endTime: number;
7
+ assertionResults: {
8
+ title: string;
9
+ duration?: number;
10
+ }[];
11
+ }[];
12
+ }
13
+ export declare const slowTests: (report: VitestReport, cwd: string, count: number) => string;
14
+ //# sourceMappingURL=slow-tests.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slow-tests.d.ts","sourceRoot":"","sources":["../../src/dev/slow-tests.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,OAAO,EAAE,MAAM,CAAA;QACf,gBAAgB,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KACzD,EAAE,CAAA;CACJ;AAED,eAAO,MAAM,SAAS,WAAY,YAAY,OAAO,MAAM,SAAS,MAAM,KAAG,MAkB5E,CAAA"}
@@ -0,0 +1,17 @@
1
+ export const slowTests = (report, cwd, count) => {
2
+ const relative = (path) => path.slice(cwd.length + 1);
3
+ const tests = report.testResults
4
+ .flatMap((result) => result.assertionResults.map((test) => ({ ms: test.duration ?? 0, file: result.name, test: test.title })))
5
+ .sort((a, b) => b.ms - a.ms);
6
+ const files = report.testResults
7
+ .map((result) => ({ ms: result.endTime - result.startTime, file: result.name }))
8
+ .sort((a, b) => b.ms - a.ms);
9
+ const total = tests.reduce((sum, test) => sum + test.ms, 0);
10
+ return [
11
+ `${tests.length} tests, ${(total / 1000).toFixed(1)} s of test time\n\nslowest tests:`,
12
+ ...tests.slice(0, count).map(({ ms, file, test }) => `${ms.toFixed(0).padStart(6)} ms ${relative(file)} ${test}`),
13
+ "\nslowest files:",
14
+ ...files.slice(0, 10).map(({ ms, file }) => `${ms.toFixed(0).padStart(6)} ms ${relative(file)}`),
15
+ ].join("\n");
16
+ };
17
+ //# sourceMappingURL=slow-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slow-tests.js","sourceRoot":"","sources":["../../src/dev/slow-tests.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAoB,EAAE,GAAW,EAAE,KAAa,EAAU,EAAE;IACpF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW;SAC7B,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAClB,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CACzG;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW;SAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;SAC/E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAA;IAE9B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;IAC3D,OAAO;QACL,GAAG,KAAK,CAAC,MAAM,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC;QACtF,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACnH,kBAAkB;QAClB,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;KAClG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC,CAAA"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The test matrix page: every command and option of a commander program, and what exercises it — an
3
+ * offline test that drove it (one `{ command, options }` JSON line per parsed run, written by the
4
+ * CLI under vitest), or a written reason it is not tested offline.
5
+ */
6
+ /** The part of commander's `Command` read here; structural, so commander stays an optional peer. */
7
+ export interface ProgramNode {
8
+ name(): string;
9
+ parent: ProgramNode | null;
10
+ commands: readonly ProgramNode[];
11
+ options: readonly {
12
+ long?: string;
13
+ short?: string;
14
+ }[];
15
+ }
16
+ /** `command` ending in ` *` covers every subcommand under it; `""` is the program's own options. */
17
+ export interface Untested {
18
+ command: string;
19
+ option?: string;
20
+ reason: string;
21
+ }
22
+ interface Row {
23
+ command: string;
24
+ option?: string;
25
+ state: "tested" | "untested" | "missing";
26
+ note: string;
27
+ }
28
+ export declare const parseArgvLog: (text: string) => Map<string, Set<string>>;
29
+ export declare const matrixRows: (program: ProgramNode, seen: Map<string, Set<string>>, untested: readonly Untested[]) => {
30
+ rows: Row[];
31
+ stale: Untested[];
32
+ };
33
+ export declare const matrixPage: (rows: readonly Row[], cli: string) => string;
34
+ export {};
35
+ //# sourceMappingURL=test-matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-matrix.d.ts","sourceRoot":"","sources":["../../src/dev/test-matrix.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,MAAM,CAAA;IACd,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAA;IAChC,OAAO,EAAE,SAAS;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CACtD;AAED,oGAAoG;AACpG,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACf;AAED,UAAU,GAAG;IACX,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;IACxC,IAAI,EAAE,MAAM,CAAA;CACb;AAED,eAAO,MAAM,YAAY,SAAU,MAAM,6BAUxC,CAAA;AAcD,eAAO,MAAM,UAAU,YAAa,WAAW,QAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,YAAY,SAAS,QAAQ,EAAE;;;CAoD7G,CAAA;AAID,eAAO,MAAM,UAAU,SAAU,SAAS,GAAG,EAAE,OAAO,MAAM,WAuB3D,CAAA"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * The test matrix page: every command and option of a commander program, and what exercises it — an
3
+ * offline test that drove it (one `{ command, options }` JSON line per parsed run, written by the
4
+ * CLI under vitest), or a written reason it is not tested offline.
5
+ */
6
+ export const parseArgvLog = (text) => {
7
+ const seen = new Map();
8
+ for (const line of text.split("\n")) {
9
+ if (!line)
10
+ continue;
11
+ const { command, options } = JSON.parse(line);
12
+ const known = seen.get(command) ?? new Set();
13
+ for (const option of options)
14
+ known.add(option);
15
+ seen.set(command, known);
16
+ }
17
+ return seen;
18
+ };
19
+ const runnable = (command) => command._actionHandler != null;
20
+ const pathOf = (command) => {
21
+ const words = [];
22
+ for (let at = command; at?.parent; at = at.parent)
23
+ words.unshift(at.name());
24
+ return words.join(" ");
25
+ };
26
+ const covers = (entry, command) => entry.command === command || (entry.command.endsWith(" *") && command.startsWith(entry.command.slice(0, -1)));
27
+ export const matrixRows = (program, seen, untested) => {
28
+ const skipFor = (command, option) => untested.find((entry) => covers(entry, command) && entry.option === option);
29
+ const rows = [];
30
+ const walk = (command) => {
31
+ if (command.parent && runnable(command)) {
32
+ const path = pathOf(command);
33
+ const ran = seen.get(path);
34
+ const skip = skipFor(path);
35
+ rows.push(ran
36
+ ? { command: path, state: "tested", note: "" }
37
+ : skip
38
+ ? { command: path, state: "untested", note: skip.reason }
39
+ : { command: path, state: "missing", note: "" });
40
+ for (const option of command.options) {
41
+ const name = option.long ?? option.short ?? "";
42
+ if (name === "--help")
43
+ continue;
44
+ const optionSkip = skipFor(path, name) ?? (skip && !ran ? skip : undefined);
45
+ rows.push(ran?.has(name)
46
+ ? { command: path, option: name, state: "tested", note: "" }
47
+ : optionSkip
48
+ ? { command: path, option: name, state: "untested", note: optionSkip.reason }
49
+ : { command: path, option: name, state: "missing", note: "" });
50
+ }
51
+ }
52
+ for (const child of command.commands)
53
+ walk(child);
54
+ };
55
+ walk(program);
56
+ const globalSeen = new Set([...seen.values()].flatMap((options) => [...options]));
57
+ for (const option of program.options) {
58
+ const name = option.long;
59
+ if (!name || name === "--help")
60
+ continue;
61
+ const skip = skipFor("", name);
62
+ rows.push(globalSeen.has(name)
63
+ ? { command: "", option: name, state: "tested", note: "" }
64
+ : skip
65
+ ? { command: "", option: name, state: "untested", note: skip.reason }
66
+ : { command: "", option: name, state: "missing", note: "" });
67
+ }
68
+ const stale = untested.filter((entry) => !rows.some((row) => row.option === entry.option && covers(entry, row.command)));
69
+ return { rows, stale };
70
+ };
71
+ const MARK = { tested: "✅", untested: "⛔", missing: "❌" };
72
+ export const matrixPage = (rows, cli) => {
73
+ const count = (state) => rows.filter((row) => row.state === state).length;
74
+ const cell = (text) => text.replace(/\|/g, "\\|");
75
+ return `<!-- Generated by cli-dev test-matrix from the command tree and a test run. Do not edit; \`pnpm test:matrix\`. -->
76
+
77
+ # Test matrix
78
+
79
+ Every command and option of \`${cli}\`, and whether an offline test drives it through the CLI. ✅ a test
80
+ ran it · ⛔ not tested offline, with the reason and where it is checked instead · ❌ nothing.
81
+ Measured from the test run (\`coverage/argv.jsonl\`), not searched for — see
82
+ [TESTING.md](TESTING.md) for how, and for the states and failures that cut across commands.
83
+
84
+ **${count("tested")} ✅ · ${count("untested")} ⛔ · ${count("missing")} ❌** — ${rows.filter((row) => !row.option).length} commands, ${rows.filter((row) => row.option).length} options.
85
+
86
+ | Command | Option | | Note |
87
+ |---|---|---|---|
88
+ ${rows
89
+ .map((row) => `| ${row.command ? `\`${row.command}\`` : "*global*"} | ${row.option ? `\`${row.option}\`` : ""} | ${MARK[row.state]} | ${cell(row.note)} |`)
90
+ .join("\n")}
91
+ `;
92
+ };
93
+ //# sourceMappingURL=test-matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-matrix.js","sourceRoot":"","sources":["../../src/dev/test-matrix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Every failure a CLI built on this package, and anything consuming its output, can see. The list
3
+ * is closed on purpose: an agent branches on `code`, and a new code is a contract change.
4
+ *
5
+ * "provider" is whatever the CLI talks to — an HTTP API, a socket, a messenger. The word is
6
+ * deliberately not "server": a provider that answered with a refusal is not the same as one that
7
+ * never answered.
8
+ */
9
+ export declare const errorCodes: readonly ["validation_error", "configuration_error", "authentication_error", "permission_error", "not_found", "confirmation_required", "rate_limited", "timeout", "network_error", "provider_error", "provider_unavailable", "invalid_response", "outcome_unknown", "cancelled"];
10
+ export type ErrorCode = (typeof errorCodes)[number];
11
+ /**
12
+ * Anything a caller may attach. Everything is optional because these are diagnostics, not a
13
+ * contract — the contract is `code`.
14
+ *
15
+ * `retryable` says whether **this** failure could be retried, not whether the operation is safe to
16
+ * retry. Those are different questions and conflating them is how a duplicate write happens.
17
+ */
18
+ export interface CliErrorDetails {
19
+ readonly status?: number;
20
+ readonly retryable?: boolean;
21
+ readonly attempts?: number;
22
+ readonly requestId?: string;
23
+ readonly runId?: string;
24
+ readonly retryAfterMs?: number;
25
+ readonly operation?: string;
26
+ readonly [key: string]: unknown;
27
+ }
28
+ export declare class CliError extends Error {
29
+ readonly code: ErrorCode;
30
+ readonly details: CliErrorDetails;
31
+ constructor(code: ErrorCode, message: string, details?: CliErrorDetails);
32
+ }
33
+ export declare const isCliError: (value: unknown) => value is CliError;
34
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,YACrB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,kBAAkB,EAClB,WAAW,EACX,uBAAuB,EACvB,cAAc,EACd,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,WAAW,CACH,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAChC;AAMD,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;IAEjC,YAAY,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,EAM1E;CACF;AAED,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,QAC4C,CAAA"}
package/dist/errors.js ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Every failure a CLI built on this package, and anything consuming its output, can see. The list
3
+ * is closed on purpose: an agent branches on `code`, and a new code is a contract change.
4
+ *
5
+ * "provider" is whatever the CLI talks to — an HTTP API, a socket, a messenger. The word is
6
+ * deliberately not "server": a provider that answered with a refusal is not the same as one that
7
+ * never answered.
8
+ */
9
+ export const errorCodes = [
10
+ "validation_error",
11
+ "configuration_error",
12
+ "authentication_error",
13
+ "permission_error",
14
+ "not_found",
15
+ "confirmation_required",
16
+ "rate_limited",
17
+ "timeout",
18
+ "network_error",
19
+ "provider_error",
20
+ "provider_unavailable",
21
+ "invalid_response",
22
+ "outcome_unknown",
23
+ "cancelled",
24
+ ];
25
+ // Symbol.for, so two copies of this package — one CLI's and one dependency's, during a pin bump —
26
+ // recognise each other's errors where `instanceof` cannot.
27
+ const BRAND = Symbol.for("@wirecat/cli-base/CliError");
28
+ export class CliError extends Error {
29
+ code;
30
+ details;
31
+ constructor(code, message, details = {}) {
32
+ super(message);
33
+ this.name = "CliError";
34
+ this.code = code;
35
+ this.details = details;
36
+ Object.defineProperty(this, BRAND, { value: true });
37
+ }
38
+ }
39
+ export const isCliError = (value) => typeof value === "object" && value !== null && value[BRAND] === true;
40
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,kBAAkB;IAClB,qBAAqB;IACrB,sBAAsB;IACtB,kBAAkB;IAClB,WAAW;IACX,uBAAuB;IACvB,cAAc;IACd,SAAS;IACT,eAAe;IACf,gBAAgB;IAChB,sBAAsB;IACtB,kBAAkB;IAClB,iBAAiB;IACjB,WAAW;CACH,CAAA;AAsBV,kGAAkG;AAClG,2DAA2D;AAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;AAEtD,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,IAAI,CAAW;IACf,OAAO,CAAiB;IAEjC,YAAY,IAAe,EAAE,OAAe,EAAE,OAAO,GAAoB,EAAE;QACzE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAA+B,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const executableOnPath: (command: string, env: NodeJS.ProcessEnv, platform?: NodeJS.Platform, exists?: (path: string) => boolean) => string;
2
+ export declare const executableEnvironment: (env: NodeJS.ProcessEnv, platform?: NodeJS.Platform) => NodeJS.ProcessEnv;
3
+ //# sourceMappingURL=executable.d.ts.map