tuffgal 0.1.0-alpha.1 → 0.1.0-alpha.11

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 (120) hide show
  1. package/CHANGELOG.md +185 -0
  2. package/README.md +25 -14
  3. package/dist/cli.d.ts +20 -0
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +107 -25
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +15 -11
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/supervise.d.ts.map +1 -1
  11. package/dist/commands/supervise.js +3 -25
  12. package/dist/commands/supervise.js.map +1 -1
  13. package/dist/config.d.ts +122 -23
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +160 -3
  16. package/dist/config.js.map +1 -1
  17. package/dist/coverage/flows.d.ts +2 -7
  18. package/dist/coverage/flows.d.ts.map +1 -1
  19. package/dist/coverage/flows.js.map +1 -1
  20. package/dist/coverage/screens.d.ts +2 -7
  21. package/dist/coverage/screens.d.ts.map +1 -1
  22. package/dist/coverage/screens.js.map +1 -1
  23. package/dist/index.d.ts +6 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +7 -6
  26. package/dist/index.js.map +1 -1
  27. package/dist/reporter/assets/report.css +728 -0
  28. package/dist/reporter/assets/report.js +437 -0
  29. package/dist/reporter/template.d.ts +4 -6
  30. package/dist/reporter/template.d.ts.map +1 -1
  31. package/dist/reporter/template.js +430 -159
  32. package/dist/reporter/template.js.map +1 -1
  33. package/dist/reporter/writeReport.d.ts +1 -1
  34. package/dist/reporter/writeReport.d.ts.map +1 -1
  35. package/dist/reporter/writeReport.js +2 -2
  36. package/dist/reporter/writeReport.js.map +1 -1
  37. package/dist/runner/approve.d.ts +20 -2
  38. package/dist/runner/approve.d.ts.map +1 -1
  39. package/dist/runner/approve.js +32 -7
  40. package/dist/runner/approve.js.map +1 -1
  41. package/dist/runner/breakpointPasses.d.ts +39 -0
  42. package/dist/runner/breakpointPasses.d.ts.map +1 -0
  43. package/dist/runner/breakpointPasses.js +107 -0
  44. package/dist/runner/breakpointPasses.js.map +1 -0
  45. package/dist/runner/bridges/database.d.ts +4 -3
  46. package/dist/runner/bridges/database.d.ts.map +1 -1
  47. package/dist/runner/bridges/database.js +4 -3
  48. package/dist/runner/bridges/database.js.map +1 -1
  49. package/dist/runner/bridges/devServers.d.ts.map +1 -1
  50. package/dist/runner/bridges/devServers.js +4 -28
  51. package/dist/runner/bridges/devServers.js.map +1 -1
  52. package/dist/runner/coverage.d.ts +2 -1
  53. package/dist/runner/coverage.d.ts.map +1 -1
  54. package/dist/runner/coverage.js +10 -5
  55. package/dist/runner/coverage.js.map +1 -1
  56. package/dist/runner/interpolate.d.ts.map +1 -1
  57. package/dist/runner/interpolate.js +4 -1
  58. package/dist/runner/interpolate.js.map +1 -1
  59. package/dist/runner/run.d.ts +10 -1
  60. package/dist/runner/run.d.ts.map +1 -1
  61. package/dist/runner/run.js +113 -13
  62. package/dist/runner/run.js.map +1 -1
  63. package/dist/runner/runAction.d.ts +6 -0
  64. package/dist/runner/runAction.d.ts.map +1 -1
  65. package/dist/runner/runAction.js +76 -30
  66. package/dist/runner/runAction.js.map +1 -1
  67. package/dist/runner/runStory.d.ts +32 -2
  68. package/dist/runner/runStory.d.ts.map +1 -1
  69. package/dist/runner/runStory.js +195 -61
  70. package/dist/runner/runStory.js.map +1 -1
  71. package/dist/runner/scheduler.d.ts +7 -5
  72. package/dist/runner/scheduler.d.ts.map +1 -1
  73. package/dist/runner/scheduler.js +73 -23
  74. package/dist/runner/scheduler.js.map +1 -1
  75. package/dist/runner/steps/intercept.d.ts.map +1 -1
  76. package/dist/runner/steps/intercept.js +8 -2
  77. package/dist/runner/steps/intercept.js.map +1 -1
  78. package/dist/runner/steps/navigate.d.ts +3 -1
  79. package/dist/runner/steps/navigate.d.ts.map +1 -1
  80. package/dist/runner/steps/navigate.js +2 -2
  81. package/dist/runner/steps/navigate.js.map +1 -1
  82. package/dist/runner/steps/read.d.ts +4 -2
  83. package/dist/runner/steps/read.d.ts.map +1 -1
  84. package/dist/runner/steps/read.js +4 -2
  85. package/dist/runner/steps/read.js.map +1 -1
  86. package/dist/runner/storyFilter.d.ts +19 -0
  87. package/dist/runner/storyFilter.d.ts.map +1 -0
  88. package/dist/runner/storyFilter.js +23 -0
  89. package/dist/runner/storyFilter.js.map +1 -0
  90. package/dist/schema/action.d.ts +12 -1
  91. package/dist/schema/action.d.ts.map +1 -1
  92. package/dist/schema/action.js +13 -7
  93. package/dist/schema/action.js.map +1 -1
  94. package/dist/schema/load.d.ts.map +1 -1
  95. package/dist/schema/load.js +10 -1
  96. package/dist/schema/load.js.map +1 -1
  97. package/dist/schema/result.d.ts +46 -1
  98. package/dist/schema/result.d.ts.map +1 -1
  99. package/dist/schema/result.js +25 -1
  100. package/dist/schema/result.js.map +1 -1
  101. package/dist/schema/story.d.ts +15 -0
  102. package/dist/schema/story.d.ts.map +1 -1
  103. package/dist/schema/story.js +45 -7
  104. package/dist/schema/story.js.map +1 -1
  105. package/dist/screenshots/baselineStore.d.ts +25 -0
  106. package/dist/screenshots/baselineStore.d.ts.map +1 -1
  107. package/dist/screenshots/baselineStore.js +53 -5
  108. package/dist/screenshots/baselineStore.js.map +1 -1
  109. package/dist/screenshots/capture.d.ts +10 -5
  110. package/dist/screenshots/capture.d.ts.map +1 -1
  111. package/dist/screenshots/capture.js +23 -6
  112. package/dist/screenshots/capture.js.map +1 -1
  113. package/dist/screenshots/diff.d.ts.map +1 -1
  114. package/dist/screenshots/diff.js +12 -0
  115. package/dist/screenshots/diff.js.map +1 -1
  116. package/dist/util.d.ts +16 -0
  117. package/dist/util.d.ts.map +1 -0
  118. package/dist/util.js +48 -0
  119. package/dist/util.js.map +1 -0
  120. package/package.json +11 -3
package/CHANGELOG.md ADDED
@@ -0,0 +1,185 @@
1
+ # 🪵 Changelog
2
+
3
+ **All notable project changes will be documented in this file.** The format
4
+ is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and
5
+ this project uses [Pride Versioning](https://pridever.org) → `PROUD.DEFAULT.SHAME`
6
+
7
+ ## [Unreleased]
8
+
9
+ _Nothing just yet_
10
+
11
+ ## [0.1.0-alpha.11] — 2026-06-26
12
+
13
+ ### Added
14
+
15
+ - Approve by breakpoint (e.g. `approve --desktop`, `approve --breakpoint <name>`)
16
+ - Approve by story (e.g. `approve user-logs-in`)
17
+ - `captureMode` config to limit screenshots to viewport-only or full page
18
+ - Documentation for CLI and reports
19
+ - `interactiveMode` config to view baseline/actual/diffs in a single-image view
20
+ - New baselines can now be filtered in the HTML report
21
+ - New baselines are now listed in the terminal summary report
22
+
23
+ ### Changed
24
+
25
+ - Screenshots default to viewport-only (were previously full page)
26
+
27
+ ### Fixed
28
+
29
+ - Multiple breakpoint runs no longer leak database state
30
+ - Report filters now only show matching actions inside each story
31
+
32
+ ## [0.1.0-alpha.10] — 2026-06-22
33
+
34
+ ### Added
35
+
36
+ - `${breakpoint}` interpolation token
37
+
38
+ ### Fixed
39
+
40
+ - Per-breakpoint database isolation
41
+
42
+ ## [0.1.0-alpha.9] — 2026-06-21
43
+
44
+ ### Added
45
+
46
+ - Breakpoint modes, replacing the single `viewport` config
47
+ - `mobile` 375×667 / `tablet` 768×1024 / `laptop` 1024×768 / `desktop` 1280×800
48
+ - Each mode runs in its own browser context + produces its own baselines
49
+ - Each `config.breakpoints` entry is a bare name (registry dimensions) or `{ name, width?, height? }` to override that mode's size; an omitted axis inherits the registry default
50
+ - Order preserved; when a name repeats, the first entry wins
51
+ - Omit `breakpoints` to run a single `desktop` mode (1280×800)
52
+ - Per-story `breakpoints` field, same shape, that **replaces** the project's modes for that story — a story may run a mode the project does not configure, and its overrides resolve against the registry
53
+ - Breakpoint grouping in the HTML report, each group labelled with the real capture size; a single-mode story renders as a flat list with no breakpoint chrome
54
+ - Pre-breakpoint baselines at `<action>/0.png` are read as fallbacks until promoted
55
+
56
+ ### Removed
57
+
58
+ **Breaking:** `viewport` config field + per-story `viewport` override. Set
59
+ a single mode's size with `breakpoints: [{ name: 'desktop', width, height }]`
60
+ instead.
61
+
62
+ ## [0.1.0-alpha.8] — 2026-06-20
63
+
64
+ ### Fixed
65
+
66
+ - Reset page scroll to origin before each full-page capture, so `position: sticky` and `fixed` elements no longer render shifted by `scrollY`
67
+
68
+ ## [0.1.0-alpha.7] — 2026-06-20
69
+
70
+ ### Added
71
+
72
+ - Add `npm run preview` to render a sample HTML report
73
+
74
+ ### Changed
75
+
76
+ - Capitalize the report title to "Tuffgal report" and show a friendlier timestamp
77
+ - Convey story status as a colored, marked story name instead of a badge
78
+ - Make the whole action row clickable to toggle screenshots
79
+ - Move the expand/collapse buttons to the right of the filters; the story-count status now sits beside the filters, with filter-aware labels
80
+ - Rename "pass" terminology to "passed" throughout the HTML report
81
+ - Show the status badge as plain text (no glyphs)
82
+ - Validate the consumer config before resolving it, failing with the config file path instead of an opaque `TypeError`
83
+
84
+ ### Fixed
85
+
86
+ - Guard the diff core against non-RGBA PNG pixel formats so a format change fails loudly instead of scoring garbage
87
+ - Memoize coverage init so concurrent workers no longer orphan the HTML report
88
+ - Raise subtle-text contrast to clear WCAG 1.4.3 (4.5:1) in both light and dark themes
89
+ - Reject non-finite or non-positive numeric CLI flags at parse time (e.g. `--idle-limit foo` no longer busy-loops the supervisor)
90
+ - Render the HTML report's default screenshot server-side so screenshots still show when JavaScript fails or is disabled
91
+ - Serialize per-baseline writes so stories sharing an action no longer race to create the same baseline under `--workers > 1`
92
+
93
+ ### Removed
94
+
95
+ - Drop redundant "Failures" section at the bottom of the HTML report
96
+ - Stop linking to Playwright trace in the HTML report
97
+
98
+ ## [0.1.0-alpha.6] — 2026-06-11
99
+
100
+ ### Added
101
+
102
+ - Add per-story overrides for browser `viewport` optional config field
103
+ - Add `tuffgal approve --new-only` flag to limit baselines to new stories
104
+ - Allow reports to be filtered by passed, changed, or failed
105
+ - Allow reports to expand/contract all screenshots
106
+
107
+ ### Changed
108
+
109
+ - Edit `tuffgal run` output to group changed, failed at end w/ report link
110
+ - Skip npm release if no version bump
111
+
112
+ ## [0.1.0-alpha.5] — 2026-06-11
113
+
114
+ ### Added
115
+
116
+ `navigate` step accepts an optional `waitUntil` field (`'load' |
117
+ 'domcontentloaded' | 'networkidle' | 'commit'`) that overrides Playwright's
118
+ `page.goto` ready signal on a per-step basis. Defaults to `'networkidle'`.
119
+ Use `'domcontentloaded'` for dev-mode pages with long-tail external fetches
120
+ that prevent `networkidle` from settling.
121
+
122
+ ## [0.1.0-alpha.4] — 2026-06-06
123
+
124
+ ### Added
125
+
126
+ - `tuffgal approve` now updates the a11y snapshot at the same time as the screenshot
127
+ - `--story` works the same way on both `tuffgal run` and `tuffgal approve`
128
+ - Two stories with the same filename in different folders is now an error
129
+
130
+ ### Changed
131
+
132
+ - Stories that get skipped b/c a prereq failed now show up in the run report + totals
133
+ - Screenshot comparison uses SSIM only
134
+ - README and `docs/` pages now match how the code actually works lol
135
+
136
+ ### Removed
137
+
138
+ - **Breaking:** Removed the legacy `diff.maxDiffRatio` setting
139
+ - **Breaking:** Dropped the `ci` block from `TuffgalConfig` and the public API
140
+ - Removed stale `bin/**` and `schema/**` paths
141
+
142
+ ## [0.1.0-alpha.3] — 2026-06-06
143
+
144
+ Grants clipboard permissions in browser contexts.
145
+
146
+ Without `permissions: ['clipboard-read', 'clipboard-write']` Playwright
147
+ default-denies clipboard API access, which breaks any story using the Web
148
+ Clipboard API.
149
+
150
+ ## [0.1.0-alpha.2] — 2026-06-04
151
+
152
+ `npm run build` now copies `src/reporter/assets/{report.css,report.js}`
153
+ into `dist/reporter/assets/`. Earlier alpha builds shipped without the
154
+ reporter's static assets, so the generated HTML report rendered without
155
+ styling or interactivity.
156
+
157
+ ## [0.1.0-alpha.1] — 2026-06-04
158
+
159
+ ### Changed
160
+
161
+ - Package now ships compiled `dist/` instead of raw `.ts` sources
162
+ - CLI entry point is `./dist/cli.js`
163
+
164
+ ### Fixed
165
+
166
+ - Corrected `bin` extension and publish flags for the alpha channel
167
+
168
+ ## [0.1.0-alpha.0] — 2026-06-04
169
+
170
+ Initial public alpha. Tuffgal extracted from [Linklater](https://github.com/nschneble/linklater)'s
171
+ in-tree visual testing workspace.
172
+
173
+ [Unreleased]: https://github.com/nschneble/tuffgal/compare/v0.1.0-alpha.11...HEAD
174
+ [0.1.0-alpha.11]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.11
175
+ [0.1.0-alpha.10]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.10
176
+ [0.1.0-alpha.9]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.9
177
+ [0.1.0-alpha.8]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.8
178
+ [0.1.0-alpha.7]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.7
179
+ [0.1.0-alpha.6]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.6
180
+ [0.1.0-alpha.5]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.5
181
+ [0.1.0-alpha.4]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.4
182
+ [0.1.0-alpha.3]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.3
183
+ [0.1.0-alpha.2]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.2
184
+ [0.1.0-alpha.1]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.1
185
+ [0.1.0-alpha.0]: https://github.com/nschneble/tuffgal/releases/tag/v0.1.0-alpha.0
package/README.md CHANGED
@@ -1,14 +1,14 @@
1
1
  # Tuffgal
2
2
 
3
- ![GitHub License](https://img.shields.io/github/license/nschneble/tuffgal)
3
+ [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
4
4
 
5
- > JSON-driven visual regression for web apps. Authoring stays declarative,
6
- > screenshots become a committable build artifact.
5
+ JSON-driven visual regression testing for web apps.
7
6
 
8
7
  <img src="tuffgal.png" alt="Tuffgal" />
9
8
 
10
- **Status:** Pre-release. `v0.1.0-alpha` in active extraction from the
11
- `apps/testing-ui` workspace in [Linklater](https://github.com/nschneble/linklater).
9
+ **Status:** Pre-1.0. Published on npm as `tuffgal@0.1.0-alpha.{n}` with
10
+ provenance. [Linklater](https://github.com/nschneble/linklater) is the
11
+ pilot consumer.
12
12
 
13
13
  Public API is unstable until `v1.0.0`.
14
14
 
@@ -24,17 +24,21 @@ When a screenshot changes, a human reviews the diff and decides what to do.
24
24
 
25
25
  ## What ships in v1
26
26
 
27
- - 10 step primitives as action verbs: `click`, `input`, `intercept`,
28
- `navigate`, `read`, `scroll`, `type`, `wait`, `waitFor`, and `screenshot`
29
- as the implicit capture point
27
+ - 9 step primitives composed into actions: `click`, `input`, `intercept`,
28
+ `navigate`, `read`, `scroll`, `type`, `wait`, `waitFor`
29
+ - An implicit screenshot at the end of every action
30
+ - Named breakpoint modes (`mobile`, `tablet`, `laptop`, `desktop`) keyed to
31
+ Tailwind widths. Pick which to run per project or per story. Each mode
32
+ gets its own baseline and a per-mode group in the HTML report
30
33
  - DAG scheduler with `needs`/`produces` labels and parallel workers
31
34
  - SSIM-gated visual diff + pixelmatch overlay + a11y-tree snapshots
32
35
  - Trace zip on failure (Playwright trace viewer)
33
36
  - Clock freeze (`page.clock.install`)
34
37
  - Storage-state persistence across stories
35
- - Static HTML reporter + optional SARIF for GitHub code scanning
38
+ - Static HTML reporter
36
39
  - V8 coverage (optional via `monocart-coverage-reports`)
37
- - Per-story DB reset + fixture hooks (consumer-supplied via config)
40
+ - Per-run DB reset + per-breakpoint fixture hooks (consumer-supplied via config),
41
+ plus a `${breakpoint}` interpolation token for per-mode test data
38
42
  - Process supervisor for dev-server hot-reload rot (it happens)
39
43
 
40
44
  ## What's explicitly out of scope (v1)
@@ -45,23 +49,30 @@ When a screenshot changes, a human reviews the diff and decides what to do.
45
49
  - WebDriver / Puppeteer substrate
46
50
  - Supporting browsers other than Chromium
47
51
 
48
- ## Quick start (when alpha releases)
52
+ ## Quick start
49
53
 
50
54
  ```bash
51
- npm install -D tuffgal
55
+ npm install -D tuffgal@alpha
52
56
  npx tuffgal init # scaffolds tuffgal.config.ts
53
57
  npx tuffgal run # runs all stories
54
58
  ```
55
59
 
60
+ For CI on GitHub Actions, use the companion
61
+ [`nschneble/tuffgal-action`](https://github.com/nschneble/tuffgal-action)
62
+ composite action.
63
+
56
64
  ## Documentation
57
65
 
58
66
  - [App contract](docs/app-contract.md)
59
67
  - [Authoring guide](docs/authoring.md)
68
+ - [Changelog](CHANGELOG.md)
60
69
  - [CI integration](docs/ci.md)
70
+ - [CLI reference](docs/cli.md)
61
71
  - [Config reference](docs/config.md)
62
72
  - [Migrating from Cypress](docs/migration-cypress.md)
63
73
  - [Migrating from Playwright](docs/migration-playwright.md)
64
74
  - [Product requirements](docs/prd-v1.md)
75
+ - [Reporting data (results.json)](docs/reporting.md)
65
76
  - [Supervisor](docs/supervisor.md)
66
77
 
67
78
  ## License
@@ -76,8 +87,8 @@ MIT. See [LICENSE](LICENSE).
76
87
  | Core extraction | ✅ |
77
88
  | Bridges | ✅ |
78
89
  | Linklater migration | ✅ |
79
- | GitHub Action | 🚧 |
80
- | `v0.1.0-alpha` npm publish | 🚧 |
90
+ | GitHub Action | ✅ |
91
+ | `v0.1.0-alpha` npm publish | ✅ |
81
92
  | `v1.0.0` public launch | ⏳ |
82
93
  | `v1.1.0` AI fuzzy matching | Deferred |
83
94
 
package/dist/cli.d.ts CHANGED
@@ -1,3 +1,23 @@
1
1
  #!/usr/bin/env node
2
+ declare const COMMANDS: readonly ["approve", "help", "init", "run", "supervise"];
3
+ type Command = (typeof COMMANDS)[number];
4
+ interface ParsedArguments {
5
+ command: Command;
6
+ coverage: boolean;
7
+ headed: boolean;
8
+ manageServers: boolean;
9
+ healthcheckIntervalMs?: number;
10
+ idleLimitMs?: number;
11
+ maxRespawns?: number;
12
+ maxRuntimeMs?: number;
13
+ newOnly: boolean;
14
+ storyFilter?: string;
15
+ /** Bare positional argument (e.g. `approve user-logs-in`). */
16
+ positional?: string;
17
+ /** `--breakpoint <name>` (repeatable) plus `--<name>` shorthands. */
18
+ breakpoints: string[];
19
+ workers?: number;
20
+ }
21
+ export declare function parseArguments(argv: string[]): ParsedArguments;
2
22
  export {};
3
23
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AASA,QAAA,MAAM,QAAQ,0DAA2D,CAAC;AAC1E,KAAK,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;AAKzC,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,OAAO,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAgG9D"}
package/dist/cli.js CHANGED
@@ -1,22 +1,32 @@
1
1
  #!/usr/bin/env node
2
- import { init } from "./commands/init.js";
3
- import { supervise } from "./commands/supervise.js";
4
- import { loadConfig } from "./config.js";
2
+ import { pathToFileURL } from 'node:url';
5
3
  import { approveAll } from "./runner/approve.js";
4
+ import { init } from "./commands/init.js";
5
+ import { BREAKPOINTS, loadConfig } from "./config.js";
6
6
  import { runAll } from "./runner/run.js";
7
- function parseArguments(argv) {
7
+ import { normaliseStoryArg } from "./runner/storyFilter.js";
8
+ import { supervise } from "./commands/supervise.js";
9
+ const COMMANDS = ['approve', 'help', 'init', 'run', 'supervise'];
10
+ /** Registry breakpoint names that double as `--<name>` approve shorthands. */
11
+ const BREAKPOINT_FLAGS = Object.keys(BREAKPOINTS);
12
+ export function parseArguments(argv) {
8
13
  const [command, ...rest] = argv;
9
14
  const parsed = {
10
- command: command === 'run' ||
11
- command === 'approve' ||
12
- command === 'init' ||
13
- command === 'supervise' ||
14
- command === 'help'
15
+ command: COMMANDS.includes(command)
15
16
  ? command
16
17
  : 'help',
17
18
  headed: false,
18
19
  manageServers: false,
19
20
  coverage: false,
21
+ newOnly: false,
22
+ breakpoints: [],
23
+ };
24
+ const addBreakpoint = (name) => {
25
+ if (name === undefined || name === '') {
26
+ throw new Error('--breakpoint requires a mode name (e.g. desktop)');
27
+ }
28
+ if (!parsed.breakpoints.includes(name))
29
+ parsed.breakpoints.push(name);
20
30
  };
21
31
  for (let index = 0; index < rest.length; index += 1) {
22
32
  const arg = rest[index];
@@ -32,12 +42,29 @@ function parseArguments(argv) {
32
42
  else if (arg.startsWith('--story=')) {
33
43
  parsed.storyFilter = arg.slice('--story='.length);
34
44
  }
45
+ else if (arg === '--breakpoint') {
46
+ addBreakpoint(rest[index + 1]);
47
+ index += 1;
48
+ }
49
+ else if (arg.startsWith('--breakpoint=')) {
50
+ addBreakpoint(arg.slice('--breakpoint='.length));
51
+ }
52
+ else if (arg.startsWith('--') &&
53
+ BREAKPOINT_FLAGS.includes(arg.slice(2))) {
54
+ addBreakpoint(arg.slice(2));
55
+ }
56
+ else if (!arg.startsWith('-')) {
57
+ if (parsed.positional !== undefined) {
58
+ throw new Error(`unexpected extra argument "${arg}" (already got "${parsed.positional}")`);
59
+ }
60
+ parsed.positional = arg;
61
+ }
35
62
  else if (arg === '--workers') {
36
- parsed.workers = Number(rest[index + 1]);
63
+ parsed.workers = numericFlag('--workers', rest[index + 1]);
37
64
  index += 1;
38
65
  }
39
66
  else if (arg.startsWith('--workers=')) {
40
- parsed.workers = Number(arg.slice('--workers='.length));
67
+ parsed.workers = numericFlag('--workers', arg.slice('--workers='.length));
41
68
  }
42
69
  else if (arg === '--manage-servers') {
43
70
  parsed.manageServers = true;
@@ -45,37 +72,56 @@ function parseArguments(argv) {
45
72
  else if (arg === '--coverage') {
46
73
  parsed.coverage = true;
47
74
  }
75
+ else if (arg === '--new-only') {
76
+ parsed.newOnly = true;
77
+ }
48
78
  else if (arg === '--healthcheck-interval') {
49
- parsed.healthcheckIntervalMs = Number(rest[index + 1]);
79
+ parsed.healthcheckIntervalMs = numericFlag('--healthcheck-interval', rest[index + 1]);
50
80
  index += 1;
51
81
  }
52
82
  else if (arg.startsWith('--healthcheck-interval=')) {
53
- parsed.healthcheckIntervalMs = Number(arg.slice('--healthcheck-interval='.length));
83
+ parsed.healthcheckIntervalMs = numericFlag('--healthcheck-interval', arg.slice('--healthcheck-interval='.length));
54
84
  }
55
85
  else if (arg === '--idle-limit') {
56
- parsed.idleLimitMs = Number(rest[index + 1]);
86
+ parsed.idleLimitMs = numericFlag('--idle-limit', rest[index + 1]);
57
87
  index += 1;
58
88
  }
59
89
  else if (arg.startsWith('--idle-limit=')) {
60
- parsed.idleLimitMs = Number(arg.slice('--idle-limit='.length));
90
+ parsed.idleLimitMs = numericFlag('--idle-limit', arg.slice('--idle-limit='.length));
61
91
  }
62
92
  else if (arg === '--max-runtime') {
63
- parsed.maxRuntimeMs = Number(rest[index + 1]);
93
+ parsed.maxRuntimeMs = numericFlag('--max-runtime', rest[index + 1]);
64
94
  index += 1;
65
95
  }
66
96
  else if (arg.startsWith('--max-runtime=')) {
67
- parsed.maxRuntimeMs = Number(arg.slice('--max-runtime='.length));
97
+ parsed.maxRuntimeMs = numericFlag('--max-runtime', arg.slice('--max-runtime='.length));
68
98
  }
69
99
  else if (arg === '--max-respawns') {
70
- parsed.maxRespawns = Number(rest[index + 1]);
100
+ parsed.maxRespawns = numericFlag('--max-respawns', rest[index + 1]);
71
101
  index += 1;
72
102
  }
73
103
  else if (arg.startsWith('--max-respawns=')) {
74
- parsed.maxRespawns = Number(arg.slice('--max-respawns='.length));
104
+ parsed.maxRespawns = numericFlag('--max-respawns', arg.slice('--max-respawns='.length));
75
105
  }
76
106
  }
77
107
  return parsed;
78
108
  }
109
+ /**
110
+ * Parses a numeric CLI flag, rejecting anything non-finite or <= 0. Without
111
+ * this, `--idle-limit foo` became `NaN` and flowed into `setTimeout(…, NaN)`,
112
+ * which behaves as `0` and busy-loops the supervisor's healthcheck. Fail loudly
113
+ * at parse time instead.
114
+ */
115
+ function numericFlag(flag, raw) {
116
+ const value = Number(raw);
117
+ if (raw === undefined ||
118
+ raw === '' ||
119
+ !Number.isFinite(value) ||
120
+ value <= 0) {
121
+ throw new Error(`${flag} requires a positive number (got "${raw ?? ''}")`);
122
+ }
123
+ return value;
124
+ }
79
125
  function printHelp() {
80
126
  process.stdout.write([
81
127
  'Usage: tuffgal <command> [options]',
@@ -95,6 +141,11 @@ function printHelp() {
95
141
  ' --manage-servers Spawn devServers.command, wait, run, then kill it.',
96
142
  ' --coverage Capture V8 JS + CSS coverage and emit a monocart report.',
97
143
  '',
144
+ 'Approve options:',
145
+ ' <story> Positional story to approve (name or path); same as --story.',
146
+ ' --new-only Only promote new baselines; skip changed.',
147
+ ' --breakpoint <name> Only approve this mode; repeatable. Also --desktop/--mobile/etc.',
148
+ '',
98
149
  'Supervise options:',
99
150
  ' --healthcheck-interval N Probe interval in ms (default 30_000).',
100
151
  ' --idle-limit N Ms with no `tuffgal run` heartbeat before exit (default 600_000).',
@@ -102,8 +153,25 @@ function printHelp() {
102
153
  ' --max-respawns N Respawn budget after unhealthy/exit (default 3).',
103
154
  ].join('\n') + '\n');
104
155
  }
156
+ function failExit(message) {
157
+ process.stderr.write(`tuffgal error: ${message}\n`);
158
+ process.exit(1);
159
+ }
105
160
  async function main() {
106
161
  const args = parseArguments(process.argv.slice(2));
162
+ // `--new-only` and the breakpoint filters narrow an approval set; they have no
163
+ // meaning on the other subcommands.
164
+ if (args.command !== 'approve') {
165
+ if (args.newOnly) {
166
+ failExit('--new-only is only valid with the `approve` subcommand');
167
+ }
168
+ if (args.breakpoints.length > 0) {
169
+ failExit('--breakpoint (and --desktop/--mobile/…) is only valid with the `approve` subcommand');
170
+ }
171
+ if (args.positional !== undefined) {
172
+ failExit(`unexpected argument "${args.positional}"`);
173
+ }
174
+ }
107
175
  if (args.command === 'help') {
108
176
  printHelp();
109
177
  return;
@@ -121,12 +189,21 @@ async function main() {
121
189
  manageServers: args.manageServers,
122
190
  coverage: args.coverage,
123
191
  });
124
- process.stdout.write(`\nTotals: ${result.totals.passed} pass · ${result.totals.changed} changed · ${result.totals.failed} failed\n`);
125
192
  process.exit(result.totals.failed > 0 ? 1 : 0);
126
193
  }
127
194
  if (args.command === 'approve') {
195
+ // A story may be named positionally (`approve user-logs-in`) or via
196
+ // `--story`, but not both.
197
+ if (args.positional !== undefined && args.storyFilter !== undefined) {
198
+ failExit('name a story positionally or with --story, not both');
199
+ }
200
+ const storyFilter = args.positional !== undefined
201
+ ? normaliseStoryArg(args.positional)
202
+ : args.storyFilter;
128
203
  const summary = await approveAll(config, {
129
- storyFilter: args.storyFilter,
204
+ storyFilter,
205
+ newOnly: args.newOnly,
206
+ breakpoints: args.breakpoints,
130
207
  });
131
208
  process.stdout.write(`\nApproved ${summary.approved} baselines; skipped ${summary.skipped} actions.\n`);
132
209
  }
@@ -139,8 +216,13 @@ async function main() {
139
216
  });
140
217
  }
141
218
  }
142
- main().catch((error) => {
143
- process.stderr.write(`tuffgal error: ${error instanceof Error ? error.message : String(error)}\n`);
144
- process.exit(1);
145
- });
219
+ // Only drive the CLI when run as the entry point. Importing this module (e.g.
220
+ // from a unit test exercising `parseArguments`) must not kick off a real run.
221
+ if (process.argv[1] &&
222
+ import.meta.url === pathToFileURL(process.argv[1]).href) {
223
+ main().catch((error) => {
224
+ process.stderr.write(`tuffgal error: ${error instanceof Error ? error.message : String(error)}\n`);
225
+ process.exit(1);
226
+ });
227
+ }
146
228
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAuEA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C9D"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAoFA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C9D"}
@@ -1,5 +1,6 @@
1
- import { mkdir, writeFile, access } from 'node:fs/promises';
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
2
  import { join, relative } from 'node:path';
3
+ import { pathExists } from "../util.js";
3
4
  const CONFIG_FILES = ['tuffgal.config.ts', 'tuffgal.config.js'];
4
5
  const CONFIG_TEMPLATE = `import { defineConfig } from 'tuffgal';
5
6
 
@@ -29,7 +30,19 @@ export default defineConfig({
29
30
  // leave this empty — cookies always persist via Playwright storage state.
30
31
  // storageStatePins: ['session_token'],
31
32
 
32
- viewport: { width: 1280, height: 800 },
33
+ // Breakpoint modes to run, keyed to Tailwind widths:
34
+ // mobile 375x667 · tablet 768x1024 · laptop 1024x768 · desktop 1280x800
35
+ // Each mode gets its own baseline + a group in the report. Omit to run a
36
+ // single \`desktop\` mode (1280x800). Override a mode's size with an object,
37
+ // e.g. { name: 'desktop', width: 1440, height: 900 }. A story can run its own
38
+ // modes via its own \`breakpoints\` field, which replace these for that story.
39
+ // breakpoints: ['mobile', 'tablet', 'laptop', 'desktop'],
40
+
41
+ // Screenshot scope. 'viewport' (default) crops to each breakpoint's
42
+ // width x height — what the user sees above the fold. 'fullPage' composites
43
+ // the whole scrollable document, however tall.
44
+ // captureMode: 'viewport',
45
+
33
46
  defaultTimeoutMs: 10_000,
34
47
  navigationTimeoutMs: 15_000,
35
48
  frozenTime: '2026-01-15T12:00:00.000Z',
@@ -111,13 +124,4 @@ export async function init(options) {
111
124
  '',
112
125
  ].join('\n'));
113
126
  }
114
- async function pathExists(absolute) {
115
- try {
116
- await access(absolute);
117
- return true;
118
- }
119
- catch {
120
- return false;
121
- }
122
- }
123
127
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE3C,MAAM,YAAY,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AAEhE,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqDvB,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC7B,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;CAGxB,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAExB,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACrC,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,sBAAsB,GAAG,2BAA2B;gBAC9D,+CAA+C,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAClD,MAAM,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,mBAAmB,IAAI,CAAC,CAAC;IAEpF,KAAK,MAAM,YAAY,IAAI,sBAAsB,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,SAAS,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,EAAE;QACF,qCAAqC;QACrC,0DAA0D;QAC1D,sDAAsD;QACtD,qDAAqD;QACrD,kDAAkD;QAClD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,YAAY,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AAEhE,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEvB,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC7B,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;CACpB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;CAGxB,CAAC;AAMF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAAoB;IAC7C,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAExB,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACrC,IAAI,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,sBAAsB,GAAG,2BAA2B;gBAC9D,+CAA+C,CAClD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAClD,MAAM,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,SAAS,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,mBAAmB,IAAI,CAC9D,CAAC;IAEF,KAAK,MAAM,YAAY,IAAI,sBAAsB,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzC,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,SAAS,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,EAAE;QACF,qCAAqC;QACrC,0DAA0D;QAC1D,sDAAsD;QACtD,qDAAqD;QACrD,kDAAkD;QAClD,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"supervise.d.ts","sourceRoot":"","sources":["../../src/commands/supervise.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,cAAc,CAAC;AAWpE,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuGf"}
1
+ {"version":3,"file":"supervise.d.ts","sourceRoot":"","sources":["../../src/commands/supervise.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,cAAc,CAAC;AAYpE,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAuGf"}