flakelab 0.1.0 → 0.1.2

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 (322) hide show
  1. package/README.md +225 -38
  2. package/dist/analysis/blob-report.d.ts +15 -0
  3. package/dist/analysis/blob-report.js +137 -0
  4. package/dist/analysis/blob-report.js.map +1 -0
  5. package/dist/analysis/cli.d.ts +7 -0
  6. package/dist/analysis/cli.js +28 -0
  7. package/dist/analysis/cli.js.map +1 -0
  8. package/dist/analysis/schema.d.ts +175 -0
  9. package/dist/analysis/schema.js +34 -0
  10. package/dist/analysis/schema.js.map +1 -0
  11. package/dist/analysis/zip-archive.d.ts +6 -0
  12. package/dist/analysis/zip-archive.js +193 -0
  13. package/dist/analysis/zip-archive.js.map +1 -0
  14. package/dist/artifacts/paths.d.ts +3 -0
  15. package/dist/artifacts/paths.js +34 -0
  16. package/dist/artifacts/paths.js.map +1 -0
  17. package/dist/artifacts/retention.d.ts +1 -0
  18. package/dist/artifacts/retention.js +80 -0
  19. package/dist/artifacts/retention.js.map +1 -0
  20. package/dist/bisect/engine.js +0 -1
  21. package/dist/bisect/engine.js.map +1 -1
  22. package/dist/bisect/schema.d.ts +5 -6
  23. package/dist/bisect/schema.js +1 -2
  24. package/dist/bisect/schema.js.map +1 -1
  25. package/dist/bisect/solari-evaluator.js +9 -1
  26. package/dist/bisect/solari-evaluator.js.map +1 -1
  27. package/dist/ci/job-summary.d.ts +2 -0
  28. package/dist/ci/job-summary.js +120 -2
  29. package/dist/ci/job-summary.js.map +1 -1
  30. package/dist/ci/select-command.js +1 -1
  31. package/dist/ci/select-command.js.map +1 -1
  32. package/dist/ci/summary-command.js +12 -7
  33. package/dist/ci/summary-command.js.map +1 -1
  34. package/dist/cli-arguments.d.ts +44 -0
  35. package/dist/cli-arguments.js +356 -0
  36. package/dist/cli-arguments.js.map +1 -0
  37. package/dist/cli-command-help.d.ts +11 -0
  38. package/dist/cli-command-help.js +211 -0
  39. package/dist/cli-command-help.js.map +1 -0
  40. package/dist/cli-help.d.ts +5 -2
  41. package/dist/cli-help.js +122 -45
  42. package/dist/cli-help.js.map +1 -1
  43. package/dist/cli-option-definitions.d.ts +202 -0
  44. package/dist/cli-option-definitions.js +59 -0
  45. package/dist/cli-option-definitions.js.map +1 -0
  46. package/dist/cli.js +100 -100
  47. package/dist/cli.js.map +1 -1
  48. package/dist/commands/analyze-summary.d.ts +5 -0
  49. package/dist/commands/analyze-summary.js +89 -0
  50. package/dist/commands/analyze-summary.js.map +1 -0
  51. package/dist/commands/analyze.d.ts +6 -0
  52. package/dist/commands/analyze.js +128 -0
  53. package/dist/commands/analyze.js.map +1 -0
  54. package/dist/commands/bisect.d.ts +2 -2
  55. package/dist/commands/bisect.js +32 -3
  56. package/dist/commands/bisect.js.map +1 -1
  57. package/dist/commands/diagnose.d.ts +3 -2
  58. package/dist/commands/diagnose.js +355 -23
  59. package/dist/commands/diagnose.js.map +1 -1
  60. package/dist/commands/discover.d.ts +18 -2
  61. package/dist/commands/discover.js +215 -25
  62. package/dist/commands/discover.js.map +1 -1
  63. package/dist/commands/doctor.d.ts +2 -0
  64. package/dist/commands/doctor.js +66 -25
  65. package/dist/commands/doctor.js.map +1 -1
  66. package/dist/commands/investigate.d.ts +3 -2
  67. package/dist/commands/investigate.js +22 -3
  68. package/dist/commands/investigate.js.map +1 -1
  69. package/dist/commands/options.d.ts +123 -16
  70. package/dist/commands/options.js +24 -2
  71. package/dist/commands/options.js.map +1 -1
  72. package/dist/commands/prove.d.ts +2 -2
  73. package/dist/commands/prove.js +38 -1
  74. package/dist/commands/prove.js.map +1 -1
  75. package/dist/commands/repair.d.ts +8 -2
  76. package/dist/commands/repair.js +32 -9
  77. package/dist/commands/repair.js.map +1 -1
  78. package/dist/commands/replay.d.ts +2 -2
  79. package/dist/commands/replay.js +15 -2
  80. package/dist/commands/replay.js.map +1 -1
  81. package/dist/commands/report.d.ts +2 -2
  82. package/dist/commands/report.js +35 -10
  83. package/dist/commands/report.js.map +1 -1
  84. package/dist/commands/scan-summary.d.ts +7 -0
  85. package/dist/commands/scan-summary.js +175 -0
  86. package/dist/commands/scan-summary.js.map +1 -0
  87. package/dist/commands/scan.d.ts +9 -12
  88. package/dist/commands/scan.js +66 -62
  89. package/dist/commands/scan.js.map +1 -1
  90. package/dist/core/plan.js +1 -1
  91. package/dist/core/plan.js.map +1 -1
  92. package/dist/diagnosis/checkpoint.d.ts +6 -0
  93. package/dist/diagnosis/checkpoint.js +46 -0
  94. package/dist/diagnosis/checkpoint.js.map +1 -0
  95. package/dist/diagnosis/cli.d.ts +7 -0
  96. package/dist/diagnosis/cli.js +84 -0
  97. package/dist/diagnosis/cli.js.map +1 -0
  98. package/dist/diagnosis/recommendation.d.ts +13 -0
  99. package/dist/diagnosis/recommendation.js +95 -0
  100. package/dist/diagnosis/recommendation.js.map +1 -0
  101. package/dist/diagnosis/run-state.d.ts +52 -0
  102. package/dist/diagnosis/run-state.js +173 -0
  103. package/dist/diagnosis/run-state.js.map +1 -0
  104. package/dist/diagnosis/schema.d.ts +207 -0
  105. package/dist/diagnosis/schema.js +108 -0
  106. package/dist/diagnosis/schema.js.map +1 -0
  107. package/dist/diagnosis/solari-handoff.d.ts +9 -0
  108. package/dist/diagnosis/solari-handoff.js +40 -0
  109. package/dist/diagnosis/solari-handoff.js.map +1 -0
  110. package/dist/diagnosis/summary.d.ts +3 -0
  111. package/dist/diagnosis/summary.js +115 -0
  112. package/dist/diagnosis/summary.js.map +1 -0
  113. package/dist/discovery/auth-cookie.d.ts +19 -0
  114. package/dist/discovery/auth-cookie.js +26 -0
  115. package/dist/discovery/auth-cookie.js.map +1 -0
  116. package/dist/discovery/evaluate.d.ts +35 -2
  117. package/dist/discovery/evaluate.js +136 -30
  118. package/dist/discovery/evaluate.js.map +1 -1
  119. package/dist/discovery/event-loop.d.ts +25 -0
  120. package/dist/discovery/event-loop.js +84 -0
  121. package/dist/discovery/event-loop.js.map +1 -0
  122. package/dist/discovery/minimize.d.ts +61 -1
  123. package/dist/discovery/minimize.js +179 -7
  124. package/dist/discovery/minimize.js.map +1 -1
  125. package/dist/discovery/resource-loading.d.ts +25 -0
  126. package/dist/discovery/resource-loading.js +84 -0
  127. package/dist/discovery/resource-loading.js.map +1 -0
  128. package/dist/discovery/runner-environment.d.ts +26 -0
  129. package/dist/discovery/runner-environment.js +68 -0
  130. package/dist/discovery/runner-environment.js.map +1 -0
  131. package/dist/discovery/startup-event.d.ts +25 -0
  132. package/dist/discovery/startup-event.js +84 -0
  133. package/dist/discovery/startup-event.js.map +1 -0
  134. package/dist/discovery/storage-state.d.ts +26 -0
  135. package/dist/discovery/storage-state.js +86 -0
  136. package/dist/discovery/storage-state.js.map +1 -0
  137. package/dist/discovery/temporal-environment.d.ts +31 -0
  138. package/dist/discovery/temporal-environment.js +43 -0
  139. package/dist/discovery/temporal-environment.js.map +1 -0
  140. package/dist/discovery/visual-environment.d.ts +28 -0
  141. package/dist/discovery/visual-environment.js +42 -0
  142. package/dist/discovery/visual-environment.js.map +1 -0
  143. package/dist/domain/schema.d.ts +840 -20
  144. package/dist/domain/schema.js +216 -6
  145. package/dist/domain/schema.js.map +1 -1
  146. package/dist/faults/browser-context.d.ts +16 -0
  147. package/dist/faults/browser-context.js +60 -0
  148. package/dist/faults/browser-context.js.map +1 -0
  149. package/dist/faults/cookie-header.d.ts +5 -0
  150. package/dist/faults/cookie-header.js +25 -0
  151. package/dist/faults/cookie-header.js.map +1 -0
  152. package/dist/faults/document-bootstrap.d.ts +5 -0
  153. package/dist/faults/document-bootstrap.js +141 -0
  154. package/dist/faults/document-bootstrap.js.map +1 -0
  155. package/dist/faults/install.d.ts +1 -1
  156. package/dist/faults/install.js +199 -6
  157. package/dist/faults/install.js.map +1 -1
  158. package/dist/faults/pattern.d.ts +1 -0
  159. package/dist/faults/pattern.js +24 -0
  160. package/dist/faults/pattern.js.map +1 -0
  161. package/dist/investigator/agent.js +39 -17
  162. package/dist/investigator/agent.js.map +1 -1
  163. package/dist/investigator/ledger.d.ts +1 -1
  164. package/dist/investigator/ledger.js +2 -2
  165. package/dist/investigator/ledger.js.map +1 -1
  166. package/dist/investigator/safe-source.d.ts +1 -0
  167. package/dist/investigator/safe-source.js +12 -3
  168. package/dist/investigator/safe-source.js.map +1 -1
  169. package/dist/investigator/schema.d.ts +293 -2
  170. package/dist/investigator/schema.js +100 -2
  171. package/dist/investigator/schema.js.map +1 -1
  172. package/dist/proof/cli.d.ts +7 -0
  173. package/dist/proof/cli.js +108 -0
  174. package/dist/proof/cli.js.map +1 -0
  175. package/dist/proof/preflight.d.ts +4 -0
  176. package/dist/proof/preflight.js +9 -0
  177. package/dist/proof/preflight.js.map +1 -0
  178. package/dist/repair/generator.d.ts +12 -1
  179. package/dist/repair/generator.js +30 -6
  180. package/dist/repair/generator.js.map +1 -1
  181. package/dist/repair/remote-proof-runner.js +6 -10
  182. package/dist/repair/remote-proof-runner.js.map +1 -1
  183. package/dist/repair/schema.d.ts +77 -2
  184. package/dist/repair/schema.js +23 -2
  185. package/dist/repair/schema.js.map +1 -1
  186. package/dist/repair/solari-validator.d.ts +2 -0
  187. package/dist/repair/solari-validator.js +4 -6
  188. package/dist/repair/solari-validator.js.map +1 -1
  189. package/dist/repair/summary.d.ts +10 -0
  190. package/dist/repair/summary.js +58 -0
  191. package/dist/repair/summary.js.map +1 -0
  192. package/dist/repair/validator.d.ts +1 -0
  193. package/dist/repair/validator.js +53 -12
  194. package/dist/repair/validator.js.map +1 -1
  195. package/dist/report/bundle.js +16 -37
  196. package/dist/report/bundle.js.map +1 -1
  197. package/dist/report/model.js +131 -12
  198. package/dist/report/model.js.map +1 -1
  199. package/dist/report/open.d.ts +9 -0
  200. package/dist/report/open.js +23 -0
  201. package/dist/report/open.js.map +1 -1
  202. package/dist/report/report-client.css +2 -0
  203. package/dist/report/report-client.js +58 -0
  204. package/dist/report/schema.d.ts +115 -5
  205. package/dist/report/schema.js +24 -5
  206. package/dist/report/schema.js.map +1 -1
  207. package/dist/reproducer/schema.d.ts +89 -4
  208. package/dist/reproducer/schema.js +3 -4
  209. package/dist/reproducer/schema.js.map +1 -1
  210. package/dist/runner/execution-fault.d.ts +10 -0
  211. package/dist/runner/execution-fault.js +24 -0
  212. package/dist/runner/execution-fault.js.map +1 -0
  213. package/dist/runner/fault-proxy.d.ts +7 -0
  214. package/dist/runner/fault-proxy.js +366 -0
  215. package/dist/runner/fault-proxy.js.map +1 -0
  216. package/dist/runner/local.js +2 -2
  217. package/dist/runner/local.js.map +1 -1
  218. package/dist/runner/native-scan.d.ts +25 -0
  219. package/dist/runner/native-scan.js +306 -0
  220. package/dist/runner/native-scan.js.map +1 -0
  221. package/dist/runner/playwright-executor.d.ts +3 -0
  222. package/dist/runner/playwright-executor.js +125 -66
  223. package/dist/runner/playwright-executor.js.map +1 -1
  224. package/dist/runner/process-tree.d.ts +7 -0
  225. package/dist/runner/process-tree.js +62 -0
  226. package/dist/runner/process-tree.js.map +1 -0
  227. package/dist/runner/project-bridge.d.ts +7 -0
  228. package/dist/runner/project-bridge.js +83 -0
  229. package/dist/runner/project-bridge.js.map +1 -0
  230. package/dist/runner/trial-reporter.d.ts +7 -0
  231. package/dist/runner/trial-reporter.js +47 -0
  232. package/dist/runner/trial-reporter.js.map +1 -0
  233. package/dist/scan/failure-clusters.d.ts +24 -0
  234. package/dist/scan/failure-clusters.js +74 -0
  235. package/dist/scan/failure-clusters.js.map +1 -0
  236. package/dist/scan/schema.d.ts +170 -0
  237. package/dist/scan/schema.js +71 -0
  238. package/dist/scan/schema.js.map +1 -0
  239. package/dist/solari/executor.d.ts +5 -1
  240. package/dist/solari/executor.js +25 -17
  241. package/dist/solari/executor.js.map +1 -1
  242. package/dist/solari/run-demo.d.ts +13 -1
  243. package/dist/solari/run-demo.js +35 -16
  244. package/dist/solari/run-demo.js.map +1 -1
  245. package/dist/solari/usage.d.ts +8 -2
  246. package/dist/solari/usage.js +14 -4
  247. package/dist/solari/usage.js.map +1 -1
  248. package/dist/ui/boundary.d.ts +17 -0
  249. package/dist/ui/boundary.js +18 -0
  250. package/dist/ui/boundary.js.map +1 -0
  251. package/dist/ui/console.d.ts +4 -0
  252. package/dist/ui/console.js +11 -0
  253. package/dist/ui/console.js.map +1 -0
  254. package/dist/ui/document.d.ts +40 -0
  255. package/dist/ui/document.js +120 -0
  256. package/dist/ui/document.js.map +1 -0
  257. package/dist/ui/format.d.ts +8 -0
  258. package/dist/ui/format.js +32 -0
  259. package/dist/ui/format.js.map +1 -0
  260. package/dist/ui/progress.d.ts +17 -1
  261. package/dist/ui/progress.js +51 -8
  262. package/dist/ui/progress.js.map +1 -1
  263. package/dist/ui/status.d.ts +7 -0
  264. package/dist/ui/status.js +36 -0
  265. package/dist/ui/status.js.map +1 -0
  266. package/dist/ui/style.d.ts +8 -0
  267. package/dist/ui/style.js +22 -0
  268. package/dist/ui/style.js.map +1 -0
  269. package/dist/ui/text.d.ts +17 -0
  270. package/dist/ui/text.js +123 -0
  271. package/dist/ui/text.js.map +1 -0
  272. package/dist/ui/theme.d.ts +23 -0
  273. package/dist/ui/theme.js +77 -0
  274. package/dist/ui/theme.js.map +1 -0
  275. package/dist/ui/trial-progress.d.ts +13 -0
  276. package/dist/ui/trial-progress.js +42 -0
  277. package/dist/ui/trial-progress.js.map +1 -0
  278. package/package.json +14 -19
  279. package/dist/faults/network-delay.d.ts +0 -5
  280. package/dist/faults/network-delay.js +0 -34
  281. package/dist/faults/network-delay.js.map +0 -1
  282. package/dist/faults/request-failure.d.ts +0 -5
  283. package/dist/faults/request-failure.js +0 -24
  284. package/dist/faults/request-failure.js.map +0 -1
  285. package/dist/playwright.d.ts +0 -3
  286. package/dist/playwright.js +0 -21
  287. package/dist/playwright.js.map +0 -1
  288. package/dist/report/browser-entry.d.ts +0 -2
  289. package/dist/report/browser-entry.js +0 -15
  290. package/dist/report/browser-entry.js.map +0 -1
  291. package/dist/report/components/artifacts.d.ts +0 -4
  292. package/dist/report/components/artifacts.js +0 -6
  293. package/dist/report/components/artifacts.js.map +0 -1
  294. package/dist/report/components/experiments.d.ts +0 -4
  295. package/dist/report/components/experiments.js +0 -7
  296. package/dist/report/components/experiments.js.map +0 -1
  297. package/dist/report/components/hypotheses.d.ts +0 -4
  298. package/dist/report/components/hypotheses.js +0 -26
  299. package/dist/report/components/hypotheses.js.map +0 -1
  300. package/dist/report/components/indicators.d.ts +0 -32
  301. package/dist/report/components/indicators.js +0 -42
  302. package/dist/report/components/indicators.js.map +0 -1
  303. package/dist/report/components/layout.d.ts +0 -29
  304. package/dist/report/components/layout.js +0 -20
  305. package/dist/report/components/layout.js.map +0 -1
  306. package/dist/report/components/proof.d.ts +0 -4
  307. package/dist/report/components/proof.js +0 -34
  308. package/dist/report/components/proof.js.map +0 -1
  309. package/dist/report/components/reproduction.d.ts +0 -4
  310. package/dist/report/components/reproduction.js +0 -19
  311. package/dist/report/components/reproduction.js.map +0 -1
  312. package/dist/report/components/summary.d.ts +0 -4
  313. package/dist/report/components/summary.js +0 -12
  314. package/dist/report/components/summary.js.map +0 -1
  315. package/dist/report/components/verdict.d.ts +0 -4
  316. package/dist/report/components/verdict.js +0 -27
  317. package/dist/report/components/verdict.js.map +0 -1
  318. package/dist/report/report-app.d.ts +0 -6
  319. package/dist/report/report-app.js +0 -16
  320. package/dist/report/report-app.js.map +0 -1
  321. package/dist/report/report-details.css +0 -182
  322. package/dist/report/report.css +0 -404
package/dist/cli-help.js CHANGED
@@ -1,47 +1,124 @@
1
- export const VERSION = "0.1.0";
2
- export function helpText() {
3
- return `FlakeLab ${VERSION} find and prove flaky Playwright tests
4
-
5
- Usage
6
- flakelab <path> [options]
7
- flakelab <command> <target> [options]
8
-
9
- Easiest run
10
- npx flakelab@latest .
11
-
12
- Common examples
13
- npx flakelab@latest tests/checkout.spec.ts --runs 20
14
- npx flakelab@latest tests/checkout.spec.ts --verbose
15
- npx flakelab@latest tests/checkout.spec.ts --prove --pattern "**/api/checkout"
16
-
17
- Default scan options
18
- --runs <number> Repetitions to run (default: 4)
19
- --concurrency <number> Parallel test processes (default: 4)
20
- --seed <number> Deterministic seed (default: 1)
21
- --artifacts <directory> Evidence directory (default: .flakelab/runs)
22
- --verbose Include machine-readable evidence
23
- --prove Run discovery, AI investigation, isolated repair, and report
24
- --prompt-credentials Securely replace provider keys for this run
25
- --open Open the generated report
26
-
27
- Advanced commands
28
- doctor Check local readiness and credential safety
29
- diagnose <test> Compare control and network-delay trials
30
- discover <test> Minimize a reproducible network trigger
31
- replay <reproducer> Verify a saved reproducer
32
- investigate <test> Run the bounded Groq investigator
33
- repair <investigation> Prove a candidate repair in Solari
34
- report <investigation> Build the portable evidence report
35
- bisect --good <revision> Locate the introducing commit in Solari
36
-
37
- Environment
38
- GROQ_API_KEY Required for investigate, repair, and --prove
39
- SOLARI_API_KEY Required for repair, bisect, publish, and --prove
40
- Missing keys are requested through hidden, run-once terminal prompts.
41
- Provider keys are never passed to Playwright test processes.
42
-
43
- Detailed command documentation
44
- https://github.com/Astraque-Softwares/solari-cookbook/tree/main/projects/flakelab
45
- `;
1
+ import { readFileSync } from "node:fs";
2
+ import { commandHelpText } from "./cli-command-help.js";
3
+ import { labelColumn, TerminalDocument } from "./ui/document.js";
4
+ import { PLAIN_THEME } from "./ui/theme.js";
5
+ function packageVersion() {
6
+ const manifest = readFileSync(new URL("../package.json", import.meta.url), "utf8");
7
+ const match = /"version"\s*:\s*"([^"]+)"/u.exec(manifest);
8
+ if (!match?.[1]) {
9
+ throw new Error("FlakeLab package version is missing");
10
+ }
11
+ return match[1];
12
+ }
13
+ export const VERSION = packageVersion();
14
+ const DOCUMENTATION = "https://github.com/Astraque-Softwares/solari-cookbook/tree/main/projects/flakelab";
15
+ const COMMAND_GROUPS = [
16
+ {
17
+ rows: [
18
+ { label: "scan <target>", value: "Run a bounded stability scan" },
19
+ {
20
+ label: "analyze <blob-report>",
21
+ value: "Triage an existing Playwright blob report",
22
+ },
23
+ { label: "doctor", value: "Check local readiness and credential safety" },
24
+ ],
25
+ title: "Observe",
26
+ },
27
+ {
28
+ rows: [
29
+ {
30
+ label: "diagnose [test]",
31
+ value: "Explain evidence and run the next bounded step",
32
+ },
33
+ {
34
+ label: "discover <test>",
35
+ value: "Minimize a reproducible causal fault",
36
+ },
37
+ { label: "replay <reproducer>", value: "Verify a saved reproducer" },
38
+ {
39
+ label: "resume <diagnose.json>",
40
+ value: "Continue a checkpointed diagnosis",
41
+ },
42
+ ],
43
+ title: "Reproduce",
44
+ },
45
+ {
46
+ rows: [
47
+ {
48
+ label: "investigate <test>",
49
+ value: "Run the bounded Groq investigator",
50
+ },
51
+ {
52
+ label: "repair <investigation>",
53
+ value: "Prove a candidate repair in Solari",
54
+ },
55
+ {
56
+ label: "prove <test>",
57
+ value: "Run discover, investigate, repair, and report",
58
+ },
59
+ {
60
+ label: "report <investigation>",
61
+ value: "Build the portable evidence report",
62
+ },
63
+ {
64
+ label: "bisect --good <rev>",
65
+ value: "Locate the introducing commit in Solari",
66
+ },
67
+ ],
68
+ title: "Explain and prove",
69
+ },
70
+ ];
71
+ const WORKFLOWS = [
72
+ {
73
+ label: "Measure stability",
74
+ value: "flakelab tests/checkout.spec.ts --runs 20",
75
+ },
76
+ { label: "Triage CI evidence", value: "flakelab analyze ./blob-report" },
77
+ {
78
+ label: "Find a trigger",
79
+ value: "flakelab diagnose tests/checkout.spec.ts --discover",
80
+ },
81
+ { label: "Prove a fix", value: "flakelab prove tests/checkout.spec.ts" },
82
+ ];
83
+ const EXIT_CODES = [
84
+ { label: "0", value: "No failure observed" },
85
+ {
86
+ label: "1",
87
+ value: "Mixed outcomes, failure in every run, or command error",
88
+ },
89
+ {
90
+ label: "2",
91
+ value: "Inconclusive scan caused by test or Playwright infrastructure",
92
+ },
93
+ ];
94
+ const CREDENTIALS = [
95
+ { label: "GROQ_API_KEY", value: "investigate, repair, prove" },
96
+ { label: "SOLARI_API_KEY", value: "repair, bisect, publish, prove" },
97
+ ];
98
+ function appendCommands(document) {
99
+ const column = labelColumn(COMMAND_GROUPS.flatMap((group) => group.rows));
100
+ for (const group of COMMAND_GROUPS) {
101
+ document.section(group.title).rows(group.rows, column);
102
+ }
103
+ }
104
+ export function mainHelpText(theme = PLAIN_THEME) {
105
+ const document = new TerminalDocument(theme);
106
+ document.banner(`FlakeLab ${VERSION} - find and prove flaky Playwright tests`);
107
+ document.section("Usage");
108
+ document.command("flakelab <target> [scan options]");
109
+ document.command("flakelab <command> [command options]");
110
+ appendCommands(document);
111
+ document.section("Common workflows").rows(WORKFLOWS);
112
+ document.section("Exit codes").rows(EXIT_CODES);
113
+ document.section("Credentials").rows(CREDENTIALS);
114
+ document.note("Missing keys are requested through hidden, run-once terminal prompts and are never" +
115
+ " passed to Playwright test processes.");
116
+ document.section("More");
117
+ document.command("flakelab <command> --help");
118
+ document.note(DOCUMENTATION);
119
+ return `${document.render()}\n`;
120
+ }
121
+ export function helpText(topic, theme = PLAIN_THEME) {
122
+ return topic ? commandHelpText(topic, theme) : mainHelpText(theme);
46
123
  }
47
124
  //# sourceMappingURL=cli-help.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA;AAE9B,MAAM,UAAU,QAAQ;IACtB,OAAO,YAAY,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0C3B,CAAA;AACD,CAAC"}
1
+ {"version":3,"file":"cli-help.js","sourceRoot":"","sources":["../src/cli-help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ export declare const CLI_OPTION_DEFINITIONS: {
2
+ readonly animationRate: {
3
+ readonly type: "string";
4
+ readonly default: "5";
5
+ };
6
+ readonly artifacts: {
7
+ readonly type: "string";
8
+ readonly default: ".flakelab/runs";
9
+ };
10
+ readonly bad: {
11
+ readonly type: "string";
12
+ readonly default: "HEAD";
13
+ };
14
+ readonly bisectParallelism: {
15
+ readonly type: "string";
16
+ readonly default: "2";
17
+ };
18
+ readonly bisectReport: {
19
+ readonly type: "string";
20
+ readonly default: "flakelab.bisect.json";
21
+ };
22
+ readonly concurrency: {
23
+ readonly type: "string";
24
+ readonly default: "1";
25
+ };
26
+ readonly clockOffsetMs: {
27
+ readonly type: "string";
28
+ readonly default: "3600000";
29
+ };
30
+ readonly cookieName: {
31
+ readonly type: "string";
32
+ };
33
+ readonly fault: {
34
+ readonly type: "string";
35
+ readonly default: "network-delay";
36
+ };
37
+ readonly html: {
38
+ readonly type: "string";
39
+ readonly default: "flakelab.report.html";
40
+ };
41
+ readonly json: {
42
+ readonly type: "boolean";
43
+ readonly default: false;
44
+ };
45
+ readonly jumpAfterMs: {
46
+ readonly type: "string";
47
+ readonly default: "0";
48
+ };
49
+ readonly locale: {
50
+ readonly type: "string";
51
+ readonly default: "fr-FR";
52
+ };
53
+ readonly maxCost: {
54
+ readonly type: "string";
55
+ readonly default: "0.25";
56
+ };
57
+ readonly maxCopies: {
58
+ readonly type: "string";
59
+ readonly default: "4";
60
+ };
61
+ readonly maxDelay: {
62
+ readonly type: "string";
63
+ readonly default: "250";
64
+ };
65
+ readonly discoveryMaxSeconds: {
66
+ readonly type: "string";
67
+ readonly default: "300";
68
+ };
69
+ readonly maxDuplicateBytes: {
70
+ readonly type: "string";
71
+ readonly default: "1024";
72
+ };
73
+ readonly maxHoldMs: {
74
+ readonly type: "string";
75
+ readonly default: "250";
76
+ };
77
+ readonly maxRemoveBytes: {
78
+ readonly type: "string";
79
+ readonly default: "1024";
80
+ };
81
+ readonly maxStallMs: {
82
+ readonly type: "string";
83
+ readonly default: "500";
84
+ };
85
+ readonly maxExperiments: {
86
+ readonly type: "string";
87
+ readonly default: "3";
88
+ };
89
+ readonly maxSeconds: {
90
+ readonly type: "string";
91
+ readonly default: "90";
92
+ };
93
+ readonly maxSteps: {
94
+ readonly type: "string";
95
+ readonly default: "3";
96
+ };
97
+ readonly maxTrials: {
98
+ readonly type: "string";
99
+ readonly default: "12";
100
+ };
101
+ readonly maxWorkers: {
102
+ readonly type: "string";
103
+ readonly default: "4";
104
+ };
105
+ readonly minRate: {
106
+ readonly type: "string";
107
+ readonly default: "0.7";
108
+ };
109
+ readonly model: {
110
+ readonly type: "string";
111
+ readonly default: "qwen/qwen3.8-27b";
112
+ };
113
+ readonly open: {
114
+ readonly type: "boolean";
115
+ readonly default: false;
116
+ };
117
+ readonly output: {
118
+ readonly type: "string";
119
+ readonly default: "flakelab.repro.yaml";
120
+ };
121
+ readonly patch: {
122
+ readonly type: "string";
123
+ readonly default: "candidate.diff";
124
+ };
125
+ readonly pattern: {
126
+ readonly type: "string";
127
+ readonly default: "**/api/checkout";
128
+ };
129
+ readonly proof: {
130
+ readonly type: "string";
131
+ readonly default: "flakelab.proof.json";
132
+ };
133
+ readonly promptCredentials: {
134
+ readonly type: "boolean";
135
+ readonly default: false;
136
+ };
137
+ readonly publish: {
138
+ readonly type: "boolean";
139
+ readonly default: false;
140
+ };
141
+ readonly report: {
142
+ readonly type: "string";
143
+ readonly default: "flakelab.investigation.json";
144
+ };
145
+ readonly reproducer: {
146
+ readonly type: "string";
147
+ readonly default: "flakelab.repro.yaml";
148
+ };
149
+ readonly resourceType: {
150
+ readonly type: "string";
151
+ readonly default: "script";
152
+ };
153
+ readonly runs: {
154
+ readonly type: "string";
155
+ readonly default: "4";
156
+ };
157
+ readonly seed: {
158
+ readonly type: "string";
159
+ readonly default: "1";
160
+ };
161
+ readonly source: {
162
+ readonly type: "string";
163
+ readonly multiple: true;
164
+ readonly default: string[];
165
+ };
166
+ readonly startupEvent: {
167
+ readonly type: "string";
168
+ readonly default: "dom-content-loaded";
169
+ };
170
+ readonly storage: {
171
+ readonly type: "string";
172
+ readonly default: "local-storage";
173
+ };
174
+ readonly storageKey: {
175
+ readonly type: "string";
176
+ };
177
+ readonly timezone: {
178
+ readonly type: "string";
179
+ readonly default: "America/New_York";
180
+ };
181
+ readonly stallAfterMs: {
182
+ readonly type: "string";
183
+ readonly default: "0";
184
+ };
185
+ readonly trials: {
186
+ readonly type: "string";
187
+ readonly default: "4";
188
+ };
189
+ readonly verbose: {
190
+ readonly type: "boolean";
191
+ readonly default: false;
192
+ };
193
+ readonly viewportHeight: {
194
+ readonly type: "string";
195
+ readonly default: "667";
196
+ };
197
+ readonly viewportWidth: {
198
+ readonly type: "string";
199
+ readonly default: "375";
200
+ };
201
+ };
202
+ export declare function requiredOption<T>(value: T | undefined, name: string): T;
@@ -0,0 +1,59 @@
1
+ export const CLI_OPTION_DEFINITIONS = {
2
+ animationRate: { type: "string", default: "5" },
3
+ artifacts: { type: "string", default: ".flakelab/runs" },
4
+ bad: { type: "string", default: "HEAD" },
5
+ bisectParallelism: { type: "string", default: "2" },
6
+ bisectReport: { type: "string", default: "flakelab.bisect.json" },
7
+ concurrency: { type: "string", default: "1" },
8
+ clockOffsetMs: { type: "string", default: "3600000" },
9
+ cookieName: { type: "string" },
10
+ fault: { type: "string", default: "network-delay" },
11
+ html: { type: "string", default: "flakelab.report.html" },
12
+ json: { type: "boolean", default: false },
13
+ jumpAfterMs: { type: "string", default: "0" },
14
+ locale: { type: "string", default: "fr-FR" },
15
+ maxCost: { type: "string", default: "0.25" },
16
+ maxCopies: { type: "string", default: "4" },
17
+ maxDelay: { type: "string", default: "250" },
18
+ discoveryMaxSeconds: { type: "string", default: "300" },
19
+ maxDuplicateBytes: { type: "string", default: "1024" },
20
+ maxHoldMs: { type: "string", default: "250" },
21
+ maxRemoveBytes: { type: "string", default: "1024" },
22
+ maxStallMs: { type: "string", default: "500" },
23
+ maxExperiments: { type: "string", default: "3" },
24
+ maxSeconds: { type: "string", default: "90" },
25
+ maxSteps: { type: "string", default: "3" },
26
+ maxTrials: { type: "string", default: "12" },
27
+ maxWorkers: { type: "string", default: "4" },
28
+ minRate: { type: "string", default: "0.7" },
29
+ model: { type: "string", default: "qwen/qwen3.8-27b" },
30
+ open: { type: "boolean", default: false },
31
+ output: { type: "string", default: "flakelab.repro.yaml" },
32
+ patch: { type: "string", default: "candidate.diff" },
33
+ pattern: { type: "string", default: "**/api/checkout" },
34
+ proof: { type: "string", default: "flakelab.proof.json" },
35
+ promptCredentials: { type: "boolean", default: false },
36
+ publish: { type: "boolean", default: false },
37
+ report: { type: "string", default: "flakelab.investigation.json" },
38
+ reproducer: { type: "string", default: "flakelab.repro.yaml" },
39
+ resourceType: { type: "string", default: "script" },
40
+ runs: { type: "string", default: "4" },
41
+ seed: { type: "string", default: "1" },
42
+ source: { type: "string", multiple: true, default: [] },
43
+ startupEvent: { type: "string", default: "dom-content-loaded" },
44
+ storage: { type: "string", default: "local-storage" },
45
+ storageKey: { type: "string" },
46
+ timezone: { type: "string", default: "America/New_York" },
47
+ stallAfterMs: { type: "string", default: "0" },
48
+ trials: { type: "string", default: "4" },
49
+ verbose: { type: "boolean", default: false },
50
+ viewportHeight: { type: "string", default: "667" },
51
+ viewportWidth: { type: "string", default: "375" },
52
+ };
53
+ export function requiredOption(value, name) {
54
+ if (value === undefined) {
55
+ throw new Error(`Internal CLI default is missing for --${name}`);
56
+ }
57
+ return value;
58
+ }
59
+ //# sourceMappingURL=cli-option-definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-option-definitions.js","sourceRoot":"","sources":["../src/cli-option-definitions.ts"],"names":[],"mappings":"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"}