@wirecat/cli-core 0.0.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +344 -0
  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/dist/codegen/index.d.ts +12 -0
  14. package/dist/codegen/index.d.ts.map +1 -0
  15. package/dist/codegen/index.js +11 -0
  16. package/dist/codegen/index.js.map +1 -0
  17. package/dist/codegen/manifest.d.ts +47 -0
  18. package/dist/codegen/manifest.d.ts.map +1 -0
  19. package/dist/codegen/manifest.js +73 -0
  20. package/dist/codegen/manifest.js.map +1 -0
  21. package/dist/codegen/model.d.ts +146 -0
  22. package/dist/codegen/model.d.ts.map +1 -0
  23. package/dist/codegen/model.js +7 -0
  24. package/dist/codegen/model.js.map +1 -0
  25. package/dist/codegen/names.d.ts +4 -0
  26. package/dist/codegen/names.d.ts.map +1 -0
  27. package/dist/codegen/names.js +46 -0
  28. package/dist/codegen/names.js.map +1 -0
  29. package/dist/codegen/pipeline.d.ts +24 -0
  30. package/dist/codegen/pipeline.d.ts.map +1 -0
  31. package/dist/codegen/pipeline.js +193 -0
  32. package/dist/codegen/pipeline.js.map +1 -0
  33. package/dist/codegen/runtime.d.ts +24 -0
  34. package/dist/codegen/runtime.d.ts.map +1 -0
  35. package/dist/codegen/runtime.js +38 -0
  36. package/dist/codegen/runtime.js.map +1 -0
  37. package/dist/codegen/tree.d.ts +29 -0
  38. package/dist/codegen/tree.d.ts.map +1 -0
  39. package/dist/codegen/tree.js +87 -0
  40. package/dist/codegen/tree.js.map +1 -0
  41. package/dist/codegen/typescript.d.ts +6 -0
  42. package/dist/codegen/typescript.d.ts.map +1 -0
  43. package/dist/codegen/typescript.js +78 -0
  44. package/dist/codegen/typescript.js.map +1 -0
  45. package/dist/codegen/valibot.d.ts +10 -0
  46. package/dist/codegen/valibot.d.ts.map +1 -0
  47. package/dist/codegen/valibot.js +132 -0
  48. package/dist/codegen/valibot.js.map +1 -0
  49. package/dist/commands/index.d.ts +76 -0
  50. package/dist/commands/index.d.ts.map +1 -0
  51. package/dist/commands/index.js +62 -0
  52. package/dist/commands/index.js.map +1 -0
  53. package/dist/commands/page.d.ts +80 -0
  54. package/dist/commands/page.d.ts.map +1 -0
  55. package/dist/commands/page.js +100 -0
  56. package/dist/commands/page.js.map +1 -0
  57. package/dist/completion/index.d.ts +37 -0
  58. package/dist/completion/index.d.ts.map +1 -0
  59. package/dist/completion/index.js +87 -0
  60. package/dist/completion/index.js.map +1 -0
  61. package/dist/config.d.ts +20 -0
  62. package/dist/config.d.ts.map +1 -0
  63. package/dist/config.js +61 -0
  64. package/dist/config.js.map +1 -0
  65. package/dist/credentials.d.ts +48 -0
  66. package/dist/credentials.d.ts.map +1 -0
  67. package/dist/credentials.js +120 -0
  68. package/dist/credentials.js.map +1 -0
  69. package/dist/dev/bin.d.ts +3 -0
  70. package/dist/dev/bin.d.ts.map +1 -0
  71. package/dist/dev/bin.js +8 -0
  72. package/dist/dev/bin.js.map +1 -0
  73. package/dist/dev/main.d.ts +7 -0
  74. package/dist/dev/main.d.ts.map +1 -0
  75. package/dist/dev/main.js +149 -0
  76. package/dist/dev/main.js.map +1 -0
  77. package/dist/dev/next-version.d.ts +11 -0
  78. package/dist/dev/next-version.d.ts.map +1 -0
  79. package/dist/dev/next-version.js +33 -0
  80. package/dist/dev/next-version.js.map +1 -0
  81. package/dist/dev/slow-tests.d.ts +14 -0
  82. package/dist/dev/slow-tests.d.ts.map +1 -0
  83. package/dist/dev/slow-tests.js +17 -0
  84. package/dist/dev/slow-tests.js.map +1 -0
  85. package/dist/dev/test-matrix.d.ts +35 -0
  86. package/dist/dev/test-matrix.d.ts.map +1 -0
  87. package/dist/dev/test-matrix.js +93 -0
  88. package/dist/dev/test-matrix.js.map +1 -0
  89. package/dist/errors.d.ts +34 -0
  90. package/dist/errors.d.ts.map +1 -0
  91. package/dist/errors.js +36 -0
  92. package/dist/errors.js.map +1 -0
  93. package/dist/exit-codes.d.ts +11 -0
  94. package/dist/exit-codes.d.ts.map +1 -0
  95. package/dist/exit-codes.js +25 -0
  96. package/dist/exit-codes.js.map +1 -0
  97. package/dist/http/index.d.ts +20 -0
  98. package/dist/http/index.d.ts.map +1 -0
  99. package/dist/http/index.js +46 -0
  100. package/dist/http/index.js.map +1 -0
  101. package/dist/index.d.ts +16 -0
  102. package/dist/index.d.ts.map +1 -0
  103. package/dist/index.js +15 -0
  104. package/dist/index.js.map +1 -0
  105. package/dist/keyring.d.ts +27 -0
  106. package/dist/keyring.d.ts.map +1 -0
  107. package/dist/keyring.js +45 -0
  108. package/dist/keyring.js.map +1 -0
  109. package/dist/logger.d.ts +12 -0
  110. package/dist/logger.d.ts.map +1 -0
  111. package/dist/logger.js +7 -0
  112. package/dist/logger.js.map +1 -0
  113. package/dist/logging.d.ts +31 -0
  114. package/dist/logging.d.ts.map +1 -0
  115. package/dist/logging.js +58 -0
  116. package/dist/logging.js.map +1 -0
  117. package/dist/mcp/index.d.ts +32 -0
  118. package/dist/mcp/index.d.ts.map +1 -0
  119. package/dist/mcp/index.js +105 -0
  120. package/dist/mcp/index.js.map +1 -0
  121. package/dist/paths.d.ts +28 -0
  122. package/dist/paths.d.ts.map +1 -0
  123. package/dist/paths.js +23 -0
  124. package/dist/paths.js.map +1 -0
  125. package/dist/pretty.d.ts +12 -0
  126. package/dist/pretty.d.ts.map +1 -0
  127. package/dist/pretty.js +83 -0
  128. package/dist/pretty.js.map +1 -0
  129. package/dist/release/index.d.ts +38 -0
  130. package/dist/release/index.d.ts.map +1 -0
  131. package/dist/release/index.js +91 -0
  132. package/dist/release/index.js.map +1 -0
  133. package/dist/release/markdown.d.ts +36 -0
  134. package/dist/release/markdown.d.ts.map +1 -0
  135. package/dist/release/markdown.js +153 -0
  136. package/dist/release/markdown.js.map +1 -0
  137. package/dist/release/structure.d.ts +16 -0
  138. package/dist/release/structure.d.ts.map +1 -0
  139. package/dist/release/structure.js +74 -0
  140. package/dist/release/structure.js.map +1 -0
  141. package/dist/renderer.d.ts +34 -0
  142. package/dist/renderer.d.ts.map +1 -0
  143. package/dist/renderer.js +55 -0
  144. package/dist/renderer.js.map +1 -0
  145. package/dist/retry.d.ts +27 -0
  146. package/dist/retry.d.ts.map +1 -0
  147. package/dist/retry.js +26 -0
  148. package/dist/retry.js.map +1 -0
  149. package/dist/sanitize.d.ts +25 -0
  150. package/dist/sanitize.d.ts.map +1 -0
  151. package/dist/sanitize.js +52 -0
  152. package/dist/sanitize.js.map +1 -0
  153. package/dist/skill/index.d.ts +78 -0
  154. package/dist/skill/index.d.ts.map +1 -0
  155. package/dist/skill/index.js +190 -0
  156. package/dist/skill/index.js.map +1 -0
  157. package/dist/streams.d.ts +24 -0
  158. package/dist/streams.d.ts.map +1 -0
  159. package/dist/streams.js +26 -0
  160. package/dist/streams.js.map +1 -0
  161. package/dist/testing/index.d.ts +24 -0
  162. package/dist/testing/index.d.ts.map +1 -0
  163. package/dist/testing/index.js +29 -0
  164. package/dist/testing/index.js.map +1 -0
  165. package/dist/time.d.ts +21 -0
  166. package/dist/time.d.ts.map +1 -0
  167. package/dist/time.js +19 -0
  168. package/dist/time.js.map +1 -0
  169. package/dist/update/index.d.ts +80 -0
  170. package/dist/update/index.d.ts.map +1 -0
  171. package/dist/update/index.js +159 -0
  172. package/dist/update/index.js.map +1 -0
  173. package/package.json +116 -2
@@ -0,0 +1,7 @@
1
+ export interface DevIo {
2
+ cwd: string;
3
+ out: (text: string) => void;
4
+ err: (text: string) => void;
5
+ }
6
+ export declare const main: (argv: readonly string[], io: DevIo) => Promise<number>;
7
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/dev/main.ts"],"names":[],"mappings":"AAsBA,MAAM,WAAW,KAAK;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC5B;AAqGD,eAAO,MAAM,IAAI,SAAgB,SAAS,MAAM,EAAE,MAAM,KAAK,KAAG,OAAO,CAAC,MAAM,CA0C7E,CAAA"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * `cli-dev`: the development scripts every CLI on cli-core 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, readFileSync, 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 { changelogProblems, docsProblems, JOURNAL_IDS, markdownFiles, structureProblems, versionScript, } from "../release/index.js";
10
+ import { nextVersion } from "./next-version.js";
11
+ import { slowTests } from "./slow-tests.js";
12
+ import { matrixPage, matrixRows, parseArgvLog } from "./test-matrix.js";
13
+ const USAGE = `usage: cli-dev <command> [options]
14
+
15
+ slow-tests [report] [count] the slowest tests and files (report: coverage/tests.json, count: 20)
16
+ next-version <wanted> <latest> <versions-json>
17
+ the version bin/release publishes, given npm's answers
18
+ version [--sync] [--file <path>] package.json's version against src/version.ts
19
+ docs-check [--rules <module>] [--ids <A,B>] [--pages]
20
+ links, anchors and the changelog's shape; --pages also
21
+ docs/ against docs/meta.json, the docs portal's structure
22
+ test-matrix --program <module> --untested <module> --name <cli> [--page <path>] [--check]
23
+ docs/dev/test-matrix.md from coverage/argv.jsonl`;
24
+ const load = async (cwd, path) => (await import(pathToFileURL(isAbsolute(path) ? path : join(cwd, path)).href));
25
+ const report = (io, problems, ok) => {
26
+ for (const problem of problems)
27
+ io.err(problem);
28
+ if (problems.length > 0)
29
+ return 1;
30
+ io.out(ok);
31
+ return 0;
32
+ };
33
+ const docsCheck = async (args, io) => {
34
+ const { values } = parseArgs({
35
+ args,
36
+ options: { rules: { type: "string" }, ids: { type: "string" }, pages: { type: "boolean" } },
37
+ });
38
+ const root = io.cwd;
39
+ let changelog;
40
+ let docs;
41
+ if (values.rules) {
42
+ // A module exporting the rules the release check uses too: `CHANGELOG` and `docsRules(root)`.
43
+ const rules = await load(root, values.rules);
44
+ changelog = rules.CHANGELOG;
45
+ docs = rules.docsRules(root);
46
+ }
47
+ else {
48
+ const ids = [...JOURNAL_IDS, ...(values.ids?.split(",").filter(Boolean) ?? [])];
49
+ changelog = {
50
+ headings: ["Added", "Changed — may break callers", "Fixed", "Security", "Removed"],
51
+ unreleased: "Unreleased",
52
+ ids,
53
+ };
54
+ docs = { files: markdownFiles(root, new Set(["node_modules", "dist", "coverage", ".git", "docs_ai"])), ids };
55
+ }
56
+ return report(io, [
57
+ ...changelogProblems(readFileSync(join(root, "CHANGELOG.md"), "utf8"), { ...changelog, release: false }),
58
+ ...docsProblems(root, docs),
59
+ ...(values.pages ? structureProblems(root) : []),
60
+ ], "docs: ok");
61
+ };
62
+ const testMatrix = async (args, io) => {
63
+ const { values } = parseArgs({
64
+ args,
65
+ options: {
66
+ program: { type: "string" },
67
+ untested: { type: "string" },
68
+ name: { type: "string" },
69
+ page: { type: "string", default: "docs/dev/test-matrix.md" },
70
+ check: { type: "boolean", default: false },
71
+ },
72
+ });
73
+ if (!values.program || !values.untested || !values.name) {
74
+ io.err("test-matrix needs --program, --untested and --name");
75
+ return 2;
76
+ }
77
+ const log = join(io.cwd, "coverage", "argv.jsonl");
78
+ if (!existsSync(log)) {
79
+ io.err("no coverage/argv.jsonl — run the suite first (pnpm test:matrix does)");
80
+ return 1;
81
+ }
82
+ const program = (await load(io.cwd, values.program)).createProgram();
83
+ const untested = (await load(io.cwd, values.untested)).UNTESTED;
84
+ const { rows, stale } = matrixRows(program, parseArgvLog(readFileSync(log, "utf8")), untested);
85
+ writeFileSync(join(io.cwd, values.page), matrixPage(rows, values.name));
86
+ let failed = false;
87
+ if (stale.length > 0) {
88
+ failed = true;
89
+ io.err("untested entries that name nothing in the program any more:");
90
+ for (const entry of stale)
91
+ io.err(` ${entry.command}${entry.option ? ` ${entry.option}` : ""}`);
92
+ }
93
+ const missing = rows.filter((row) => row.state === "missing");
94
+ if (missing.length > 0 && values.check) {
95
+ failed = true;
96
+ io.err(`${missing.length} commands or options with no test and no reason — see ${values.page}:`);
97
+ for (const row of missing)
98
+ io.err(` ${row.command || "(global)"}${row.option ? ` ${row.option}` : ""}`);
99
+ }
100
+ const count = (state) => rows.filter((row) => row.state === state).length;
101
+ io.err(`test matrix: ${count("tested")} tested, ${count("untested")} untested with a reason, ${missing.length} missing`);
102
+ return failed ? 1 : 0;
103
+ };
104
+ export const main = async (argv, io) => {
105
+ const [command, ...args] = argv;
106
+ switch (command) {
107
+ case "slow-tests": {
108
+ const [file = "coverage/tests.json", count = "20"] = args;
109
+ const parsed = JSON.parse(readFileSync(join(io.cwd, file), "utf8"));
110
+ io.out(slowTests(parsed, io.cwd, Number(count)));
111
+ return 0;
112
+ }
113
+ case "next-version": {
114
+ const [wanted = "", latest = "", versions = ""] = args;
115
+ const found = nextVersion(wanted, latest, versions);
116
+ if ("error" in found) {
117
+ io.err(found.error);
118
+ return 1;
119
+ }
120
+ io.out(found.version);
121
+ return 0;
122
+ }
123
+ case "version": {
124
+ const { values } = parseArgs({
125
+ args,
126
+ options: { sync: { type: "boolean", default: false }, file: { type: "string", default: "src/version.ts" } },
127
+ });
128
+ const { code, message } = versionScript(io.cwd, values.sync ? ["--sync"] : [], values.file);
129
+ if (code === 0)
130
+ io.out(message);
131
+ else
132
+ io.err(message);
133
+ return code;
134
+ }
135
+ case "docs-check":
136
+ return docsCheck(args, io);
137
+ case "test-matrix":
138
+ return testMatrix(args, io);
139
+ case "help":
140
+ case "--help":
141
+ case "-h":
142
+ io.out(USAGE);
143
+ return 0;
144
+ default:
145
+ io.err(command ? `cli-dev: no command "${command}"\n\n${USAGE}` : USAGE);
146
+ return 2;
147
+ }
148
+ };
149
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/dev/main.ts"],"names":[],"mappings":"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"}
@@ -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;AAED,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,EAK1E;CACF;AAED,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,QAAqC,CAAA"}
package/dist/errors.js ADDED
@@ -0,0 +1,36 @@
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
+ export class CliError extends Error {
26
+ code;
27
+ details;
28
+ constructor(code, message, details = {}) {
29
+ super(message);
30
+ this.name = "CliError";
31
+ this.code = code;
32
+ this.details = details;
33
+ }
34
+ }
35
+ export const isCliError = (value) => value instanceof CliError;
36
+ //# 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,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;IACxB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAAC,KAAK,YAAY,QAAQ,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { ErrorCode } from "./errors.js";
2
+ /**
3
+ * One mapping, so a script can branch on `$?` without parsing text. Defined here rather than at
4
+ * each command site: numbers invented per command are how two of them end up disagreeing.
5
+ *
6
+ * 130 for a cancellation is the shell's convention for SIGINT.
7
+ */
8
+ export declare const EXIT_CODES: Record<ErrorCode, number>;
9
+ export declare const exitCodeFor: (code: ErrorCode) => number;
10
+ export declare const GENERIC_FAILURE = 1;
11
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../src/exit-codes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAehD,CAAA;AAED,eAAO,MAAM,WAAW,SAAU,SAAS,KAAG,MAA0B,CAAA;AAExE,eAAO,MAAM,eAAe,IAAI,CAAA"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * One mapping, so a script can branch on `$?` without parsing text. Defined here rather than at
3
+ * each command site: numbers invented per command are how two of them end up disagreeing.
4
+ *
5
+ * 130 for a cancellation is the shell's convention for SIGINT.
6
+ */
7
+ export const EXIT_CODES = {
8
+ validation_error: 2,
9
+ configuration_error: 3,
10
+ authentication_error: 4,
11
+ permission_error: 5,
12
+ not_found: 6,
13
+ confirmation_required: 7,
14
+ rate_limited: 8,
15
+ timeout: 9,
16
+ network_error: 10,
17
+ provider_error: 11,
18
+ provider_unavailable: 12,
19
+ invalid_response: 13,
20
+ outcome_unknown: 14,
21
+ cancelled: 130,
22
+ };
23
+ export const exitCodeFor = (code) => EXIT_CODES[code];
24
+ export const GENERIC_FAILURE = 1;
25
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../src/exit-codes.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAA8B;IACnD,gBAAgB,EAAE,CAAC;IACnB,mBAAmB,EAAE,CAAC;IACtB,oBAAoB,EAAE,CAAC;IACvB,gBAAgB,EAAE,CAAC;IACnB,SAAS,EAAE,CAAC;IACZ,qBAAqB,EAAE,CAAC;IACxB,YAAY,EAAE,CAAC;IACf,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,EAAE;IACjB,cAAc,EAAE,EAAE;IAClB,oBAAoB,EAAE,EAAE;IACxB,gBAAgB,EAAE,EAAE;IACpB,eAAe,EAAE,EAAE;IACnB,SAAS,EAAE,GAAG;CACf,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAe,EAAU,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;AAExE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAA"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The HTTP layer, deliberately behind its own entry point.
3
+ *
4
+ * A CLI that speaks a socket, a message bus or a local database has no business depending on
5
+ * status-code semantics and `Retry-After` parsing. Import `@wirecat/cli-core/http` only when
6
+ * the thing on the other end is actually HTTP.
7
+ */
8
+ import type { ErrorCode } from "../errors.js";
9
+ import type { WallClock } from "../time.js";
10
+ /** The one function an HTTP client needs from its environment. A Worker, a browser, a test and Node all satisfy it. */
11
+ export type FetchLike = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
12
+ /** `Retry-After` is either a number of seconds or an HTTP date. Both forms occur in the wild. */
13
+ export declare const parseRetryAfter: (header: string | null | undefined, now: WallClock) => number | undefined;
14
+ /** A Unix timestamp in seconds, the shape several providers use for `X-RateLimit-Reset`. */
15
+ export declare const parseRateLimitReset: (header: string | null | undefined, now: WallClock) => number | undefined;
16
+ /** What the provider asked us to wait, if it asked at all. Its timing beats our own backoff. */
17
+ export declare const providerWaitMs: (headers: Headers, now: WallClock) => number | undefined;
18
+ export declare const retryableStatus: (status: number) => boolean;
19
+ export declare const statusToCode: (status: number) => ErrorCode;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,uHAAuH;AACvH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEhG,iGAAiG;AACjG,eAAO,MAAM,eAAe,WAAY,MAAM,GAAG,IAAI,GAAG,SAAS,OAAO,SAAS,KAAG,MAAM,GAAG,SAa5F,CAAA;AAED,4FAA4F;AAC5F,eAAO,MAAM,mBAAmB,WAAY,MAAM,GAAG,IAAI,GAAG,SAAS,OAAO,SAAS,KAAG,MAAM,GAAG,SAQhG,CAAA;AAED,gGAAgG;AAChG,eAAO,MAAM,cAAc,YAAa,OAAO,OAAO,SAAS,KAAG,MAAM,GAAG,SACqC,CAAA;AAEhH,eAAO,MAAM,eAAe,WAAY,MAAM,KAAG,OAA4D,CAAA;AAE7G,eAAO,MAAM,YAAY,WAAY,MAAM,KAAG,SAS7C,CAAA"}
@@ -0,0 +1,46 @@
1
+ /** `Retry-After` is either a number of seconds or an HTTP date. Both forms occur in the wild. */
2
+ export const parseRetryAfter = (header, now) => {
3
+ if (!header)
4
+ return undefined;
5
+ const trimmed = header.trim();
6
+ if (/^\d+$/.test(trimmed))
7
+ return Number(trimmed) * 1000;
8
+ const at = Date.parse(trimmed);
9
+ if (Number.isNaN(at))
10
+ return undefined;
11
+ const delta = at - now().getTime();
12
+ // A date already in the past would otherwise become a zero wait, and a zero wait against a rate
13
+ // limit is a hot loop.
14
+ return delta > 0 ? delta : undefined;
15
+ };
16
+ /** A Unix timestamp in seconds, the shape several providers use for `X-RateLimit-Reset`. */
17
+ export const parseRateLimitReset = (header, now) => {
18
+ if (!header)
19
+ return undefined;
20
+ const seconds = Number(header.trim());
21
+ if (!Number.isFinite(seconds))
22
+ return undefined;
23
+ const delta = seconds * 1000 - now().getTime();
24
+ return delta > 0 ? delta : undefined;
25
+ };
26
+ /** What the provider asked us to wait, if it asked at all. Its timing beats our own backoff. */
27
+ export const providerWaitMs = (headers, now) => parseRetryAfter(headers.get("retry-after"), now) ?? parseRateLimitReset(headers.get("x-ratelimit-reset"), now);
28
+ export const retryableStatus = (status) => status === 408 || status === 429 || status >= 500;
29
+ export const statusToCode = (status) => {
30
+ if (status === 400 || status === 422)
31
+ return "validation_error";
32
+ if (status === 401)
33
+ return "authentication_error";
34
+ if (status === 403)
35
+ return "permission_error";
36
+ if (status === 404)
37
+ return "not_found";
38
+ if (status === 408)
39
+ return "timeout";
40
+ if (status === 429)
41
+ return "rate_limited";
42
+ if (status === 502 || status === 503 || status === 504)
43
+ return "provider_unavailable";
44
+ return "provider_error";
45
+ };
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAaA,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAiC,EAAE,GAAc,EAAsB,EAAE;IACvG,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAE7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAExD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAA;IAEtC,MAAM,KAAK,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;IAClC,gGAAgG;IAChG,uBAAuB;IACvB,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACtC,CAAC,CAAA;AAED,4FAA4F;AAC5F,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAiC,EAAE,GAAc,EAAsB,EAAE;IAC3G,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAE7B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAA;IAE/C,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;IAC9C,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AACtC,CAAC,CAAA;AAED,gGAAgG;AAChG,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgB,EAAE,GAAc,EAAsB,EAAE,CACrF,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,CAAC,IAAI,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAA;AAEhH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAW,EAAE,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,IAAI,GAAG,CAAA;AAE7G,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAa,EAAE;IACxD,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,kBAAkB,CAAA;IAC/D,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,sBAAsB,CAAA;IACjD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,kBAAkB,CAAA;IAC7C,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAA;IACtC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,SAAS,CAAA;IACpC,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,cAAc,CAAA;IACzC,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,sBAAsB,CAAA;IACrF,OAAO,gBAAgB,CAAA;AACzB,CAAC,CAAA"}