@vijaypjavvadi/bdd2pw 4.1.0 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +244 -0
- package/README.md +17 -11
- package/dist/cli.js +21 -1
- package/dist/cli.js.map +1 -1
- package/dist/discovery/domHash.d.ts +51 -0
- package/dist/discovery/domHash.js +99 -0
- package/dist/discovery/domHash.js.map +1 -0
- package/dist/index.js +70 -5
- package/dist/index.js.map +1 -1
- package/dist/repo/projectScaffolder.d.ts +24 -1
- package/dist/repo/projectScaffolder.js +113 -3
- package/dist/repo/projectScaffolder.js.map +1 -1
- package/dist/types.d.ts +29 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,250 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
_Nothing yet._
|
|
11
11
|
|
|
12
|
+
## [4.3.0] — 2026-09-18
|
|
13
|
+
|
|
14
|
+
### Theme: in-process self-healing via `@vijaypjavvadi/pw-self-heal`
|
|
15
|
+
|
|
16
|
+
`--self-healing` used to emit a 450-line `lib/heal.ts` shim, patch
|
|
17
|
+
`tsconfig.json` with a path alias, and require an external HTTP
|
|
18
|
+
service at `SELF_HEALING_URL` to actually rank replacement locators.
|
|
19
|
+
That worked but the operational burden — a Python service, a
|
|
20
|
+
database, network hop on every heal — meant most users never turned
|
|
21
|
+
it on.
|
|
22
|
+
|
|
23
|
+
v4.3 replaces that entire stack with `@vijaypjavvadi/pw-self-heal`
|
|
24
|
+
— the trained-ONNX-ranker sibling package with a published Zenodo
|
|
25
|
+
DOI (10.5281/zenodo.19684439). It runs in-process, needs no server,
|
|
26
|
+
no API key, no Python, and the DOM never leaves the machine.
|
|
27
|
+
|
|
28
|
+
Emitted repos with `--self-healing` now get a **3-line**
|
|
29
|
+
`tests/fixtures.ts`:
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { test as base } from "@playwright/test";
|
|
33
|
+
import { withSelfHealing } from "@vijaypjavvadi/pw-self-heal";
|
|
34
|
+
export const test = withSelfHealing(base, { mode: "hybrid" });
|
|
35
|
+
export { expect } from "@playwright/test";
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Every emitted spec's top-of-file import auto-rewrites from
|
|
39
|
+
`@playwright/test` to `./fixtures`. POM classes are unchanged —
|
|
40
|
+
they receive the healing-wrapped `page` transparently, so
|
|
41
|
+
`await loginPage.usernameInput.fill("x")` heals on locator drift
|
|
42
|
+
without a single `healOrThrow(...)` wrapper.
|
|
43
|
+
|
|
44
|
+
### Added — pw-self-heal scaffold emission (default when `--self-healing`)
|
|
45
|
+
|
|
46
|
+
- **`tests/fixtures.ts`** — wraps `@playwright/test`'s base `test`
|
|
47
|
+
with `withSelfHealing({ mode })`. Re-exports `test` and `expect`.
|
|
48
|
+
Overwritten idempotently on every re-scaffold so mode changes
|
|
49
|
+
propagate; hand-editing this file is supported (rename it or move
|
|
50
|
+
it out of `tests/` to prevent overwrite).
|
|
51
|
+
- **`.pwheal/.gitkeep`** — placeholder so the telemetry directory
|
|
52
|
+
exists on fresh clones. pw-self-heal appends
|
|
53
|
+
`.pwheal/heal-events.jsonl` at runtime; the JSONL itself is
|
|
54
|
+
gitignored.
|
|
55
|
+
- **Emitted `package.json` devDependencies** get
|
|
56
|
+
`@vijaypjavvadi/pw-self-heal ^1.1.2` unconditionally, and
|
|
57
|
+
`onnxruntime-node ^1.18.0` only when the ranker mode is `ml` or
|
|
58
|
+
`hybrid` (the `heuristic` mode has zero native deps).
|
|
59
|
+
- **Spec import rewrite** — the top-of-file
|
|
60
|
+
`import { test, expect } from "@playwright/test"` in every
|
|
61
|
+
emitted spec is redirected to `"./fixtures"` when
|
|
62
|
+
`--self-healing` is on without `--legacy-healing`. Exact single-
|
|
63
|
+
line regex — inline type-only imports elsewhere in the spec are
|
|
64
|
+
left untouched.
|
|
65
|
+
- **POM emission** — `--self-healing` no longer passes
|
|
66
|
+
`selfHealingShim: true` to `pw-emit`, so POM fields are plain
|
|
67
|
+
`page.getByLabel(...)` calls without the `healOrThrow(page, {...})`
|
|
68
|
+
wrapping. The healing happens invisibly through the wrapped
|
|
69
|
+
fixture instead.
|
|
70
|
+
|
|
71
|
+
### Added — CLI flags
|
|
72
|
+
|
|
73
|
+
- **`--self-healing-mode <heuristic|ml|hybrid>`** — pass through to
|
|
74
|
+
`withSelfHealing({ mode })`. Default `hybrid`. Matches pw-self-heal's
|
|
75
|
+
production default (0.4·heuristic + 0.6·ml, 68.63% HSR on their
|
|
76
|
+
bench).
|
|
77
|
+
- **`--legacy-healing`** — DEPRECATED. Keeps emitting the v4.2
|
|
78
|
+
`lib/heal.ts` + external service shim for one release. Prints a
|
|
79
|
+
`warn`-severity entry in `BDD_REVIEW.md` so users see the
|
|
80
|
+
deprecation path. Removed in v5.0.
|
|
81
|
+
|
|
82
|
+
### Added — API surface
|
|
83
|
+
|
|
84
|
+
Two new optional fields on the public types:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
interface ScaffoldOptions {
|
|
88
|
+
// ... existing fields
|
|
89
|
+
selfHealingMode?: "heuristic" | "ml" | "hybrid"; // v4.3.0
|
|
90
|
+
legacyHealing?: boolean; // v4.3.0
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Added — tests
|
|
95
|
+
|
|
96
|
+
- 10-case vitest suite in `tests/unit/v430PwSelfHeal.test.ts`
|
|
97
|
+
covering: default mode, mode override, re-emit idempotency,
|
|
98
|
+
`.pwheal` gitkeep, package.json devDependency patching (hybrid
|
|
99
|
+
vs. heuristic), legacy-healing deprecation warning, and
|
|
100
|
+
self-healing-off no-op.
|
|
101
|
+
- 8-case Node.js smoke runner in `scripts/smoke-v430-selfheal.mjs`
|
|
102
|
+
that bypasses vitest.
|
|
103
|
+
|
|
104
|
+
### Deprecated
|
|
105
|
+
|
|
106
|
+
- **`--legacy-healing`** (v4.3.0 → removed in v5.0.0). One-release
|
|
107
|
+
window for existing users to migrate off the external
|
|
108
|
+
`SELF_HEALING_URL` service. The `bdd2pw heal-stats` CLI continues
|
|
109
|
+
to work — it now reads `.pwheal/heal-events.jsonl` by default
|
|
110
|
+
and falls back to the v4.2 `artefacts/heal-events.jsonl` path.
|
|
111
|
+
|
|
112
|
+
### No breaking changes
|
|
113
|
+
|
|
114
|
+
Users NOT passing `--self-healing` see identical output to v4.2.
|
|
115
|
+
Users on `--self-healing --legacy-healing` see the same
|
|
116
|
+
lib/heal.ts + tsconfig-alias emission as v4.2. Users adopting the
|
|
117
|
+
new `--self-healing` default get a smaller emitted repo (no
|
|
118
|
+
`lib/heal.ts`, no tsconfig `paths`, no external service required)
|
|
119
|
+
plus a strictly better runtime healer.
|
|
120
|
+
|
|
121
|
+
### Migration
|
|
122
|
+
|
|
123
|
+
`npm i @vijaypjavvadi/bdd2pw@4.3.0` — no code changes required.
|
|
124
|
+
Re-scaffold repos that use `--self-healing` and the new fixture
|
|
125
|
+
wiring lands automatically. If you were relying on the v4.2
|
|
126
|
+
`SELF_HEALING_URL` service, either:
|
|
127
|
+
|
|
128
|
+
1. Drop it and adopt the new default (recommended — trained ONNX
|
|
129
|
+
ranker with a published DOI, no service to run).
|
|
130
|
+
2. Pass `--legacy-healing` for one release while you plan the
|
|
131
|
+
migration. Deprecation warning appears in `BDD_REVIEW.md`.
|
|
132
|
+
|
|
133
|
+
## [4.2.0] — 2026-09-02
|
|
134
|
+
|
|
135
|
+
### Theme: Silent problems, made loud — DOM drift detection
|
|
136
|
+
|
|
137
|
+
Silent UI changes are the second-worst failure mode in Playwright
|
|
138
|
+
suites (the worst being flaky locators — which bdd2pw's healing loop
|
|
139
|
+
already addresses). A vendor updates their design system, a component
|
|
140
|
+
library rolls out a new variant, a form input's role attribute
|
|
141
|
+
changes — and a week later three tests start failing with `element
|
|
142
|
+
not found` and no obvious cause. The team spends an hour bisecting
|
|
143
|
+
the DOM instead of an hour fixing the UI.
|
|
144
|
+
|
|
145
|
+
v4.2 embeds a **stable sha256 of the page's accessibility tree** in
|
|
146
|
+
every emitted POM's header comment. On re-scaffold, bdd2pw compares
|
|
147
|
+
the new snapshot against the hash stored in the existing POM. If
|
|
148
|
+
they differ, a `DOM DRIFT` warning lands in `BDD_REVIEW.md` with
|
|
149
|
+
both hashes and a suggested triage path. A new `--fail-on-drift`
|
|
150
|
+
CLI flag turns the warning into a non-zero exit code so CI can
|
|
151
|
+
gate merges on silent UI regressions.
|
|
152
|
+
|
|
153
|
+
Credit for the idea: a LinkedIn commenter on the v4.1 release post
|
|
154
|
+
suggested "version the emitted POM against a DOM snapshot hash so a
|
|
155
|
+
silent UI change shows up as a diff rather than a mystery failure
|
|
156
|
+
next run." That's exactly what v4.2 does.
|
|
157
|
+
|
|
158
|
+
### Added — DOM-hash utilities (`src/discovery/domHash.ts`)
|
|
159
|
+
|
|
160
|
+
- `computeDomHash(snapshot)` — deterministic sha256 of the
|
|
161
|
+
accessibility tree via canonical JSON stringify (sorted keys at
|
|
162
|
+
every object level). Identical trees always produce identical
|
|
163
|
+
hashes regardless of MCP's property ordering. Only the tree
|
|
164
|
+
contributes to the hash — url, title, and raw DOM string are
|
|
165
|
+
ignored so unrelated changes don't false-positive.
|
|
166
|
+
- `buildDomHashHeader(hash, url, at?)` — the JSDoc-formatted
|
|
167
|
+
`@bdd2pw` comment block prepended to every emitted POM.
|
|
168
|
+
- `extractDomHashFromPom(contents)` — reverse operation for drift
|
|
169
|
+
detection on re-scaffold.
|
|
170
|
+
- `prependDomHashHeader(contents, header)` — idempotent header
|
|
171
|
+
injection; replaces any prior `@bdd2pw` block instead of
|
|
172
|
+
stacking duplicates.
|
|
173
|
+
|
|
174
|
+
### Added — POM header emission
|
|
175
|
+
|
|
176
|
+
Every emitted POM now carries a comment block above the imports:
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
/**
|
|
180
|
+
* @bdd2pw generated 2026-09-02T14:32:00.000Z
|
|
181
|
+
* @bdd2pw dom-hash a3f8c2e4d5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2
|
|
182
|
+
* @bdd2pw url https://saucedemo.com/
|
|
183
|
+
*
|
|
184
|
+
* The dom-hash line is used by bdd2pw to detect DOM drift on
|
|
185
|
+
* re-scaffold. Do not edit it by hand — regenerate with `bdd2pw
|
|
186
|
+
* scaffold` or `bdd2pw update-pom` to refresh.
|
|
187
|
+
*/
|
|
188
|
+
import { Page } from "@playwright/test";
|
|
189
|
+
export class LoginPage { ... }
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Emission is unconditional — deterministic-only runs, LLM-fallback
|
|
193
|
+
runs, and `--dry-run` all produce the header when a snapshot exists.
|
|
194
|
+
`--no-discovery` runs (no snapshot) skip the header, and re-scaffold
|
|
195
|
+
against a v4.1-or-earlier POM emits an info-level `BDD_REVIEW.md`
|
|
196
|
+
note that says the baseline hash was just planted.
|
|
197
|
+
|
|
198
|
+
### Added — drift detection on re-scaffold
|
|
199
|
+
|
|
200
|
+
When `scaffold()` runs in `augment` mode (existing POM present) and
|
|
201
|
+
the new snapshot's hash differs from the one embedded in the POM:
|
|
202
|
+
|
|
203
|
+
- A `warn`-severity `ReviewItem` is added to `BDD_REVIEW.md` with
|
|
204
|
+
both truncated hashes and a suggested review path.
|
|
205
|
+
- `ScaffoldResult.driftDetected` is set to `true` for programmatic
|
|
206
|
+
callers.
|
|
207
|
+
|
|
208
|
+
### Added — `--fail-on-drift` CLI flag
|
|
209
|
+
|
|
210
|
+
`bdd2pw scaffold ... --fail-on-drift` exits with code `2` when
|
|
211
|
+
drift is detected, AFTER the scaffold completes writing (so
|
|
212
|
+
`BDD_REVIEW.md` and the refreshed POM are still on disk for the
|
|
213
|
+
developer to inspect). Exit code `2` is distinct from `1` (used for
|
|
214
|
+
other scaffold errors) so CI can special-case drift vs. real failures.
|
|
215
|
+
|
|
216
|
+
### Added — API surface
|
|
217
|
+
|
|
218
|
+
Two new optional fields on the public types:
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
interface ScaffoldOptions {
|
|
222
|
+
// ... existing fields
|
|
223
|
+
failOnDrift?: boolean; // v4.2.0
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
interface ScaffoldResult {
|
|
227
|
+
// ... existing fields
|
|
228
|
+
driftDetected?: boolean; // v4.2.0
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Added — tests
|
|
233
|
+
|
|
234
|
+
- 15-case vitest suite in `tests/unit/v420DomHash.test.ts` covering
|
|
235
|
+
hash determinism, canonical key ordering, round-trip
|
|
236
|
+
extract/build, and idempotent header injection.
|
|
237
|
+
- 11-case Node.js smoke runner in `scripts/smoke-v420-domhash.mjs`
|
|
238
|
+
that bypasses vitest.
|
|
239
|
+
|
|
240
|
+
### No breaking changes
|
|
241
|
+
|
|
242
|
+
Additive-only. Programmatic callers that don't set `failOnDrift`
|
|
243
|
+
see no behavioural change (drift is still detected and reported in
|
|
244
|
+
`BDD_REVIEW.md`, but the process exit code is unchanged). Emitted
|
|
245
|
+
POMs gain a comment block above the imports; all downstream
|
|
246
|
+
consumers (Playwright itself, `merge` mode, `updatePom`) tolerate
|
|
247
|
+
the comment. `updatePom`'s append-only guarantee is preserved.
|
|
248
|
+
|
|
249
|
+
### Migration
|
|
250
|
+
|
|
251
|
+
`npm i @vijaypjavvadi/bdd2pw@4.2.0` — no code changes required. The
|
|
252
|
+
first re-scaffold of an existing repo plants the baseline hash and
|
|
253
|
+
emits an info-level `BDD_REVIEW.md` line. From the second re-scaffold
|
|
254
|
+
onward, DOM drift will be detected and warned about.
|
|
255
|
+
|
|
12
256
|
## [4.1.0] — 2026-08-21
|
|
13
257
|
|
|
14
258
|
### Theme: LLM-binding rewriter — 3/8 → 8/8 bench apps compile cleanly
|
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ Most teams writing BDD test cases (via Cucumber `.feature` files, possibly autho
|
|
|
25
25
|
|
|
26
26
|
Point it at a `.feature` file and a URL. It parses the Gherkin, scans the live page with Chromium, picks the most stable locator for every interactive element, matches each step to a POM method call, and emits a runnable Playwright TypeScript repo — including `playwright.config.ts`, `pages/login.page.ts`, `tests/login.spec.ts`, and a `BDD_REVIEW.md` listing anything a human still needs to look at.
|
|
27
27
|
|
|
28
|
-
## What `bdd2pw` is and isn't (as of v4.
|
|
28
|
+
## What `bdd2pw` is and isn't (as of v4.3.0)
|
|
29
29
|
|
|
30
30
|
`bdd2pw` is a **deterministic scaffolder with an optional governed LLM fallback across three providers**. The output is honest about its limits:
|
|
31
31
|
|
|
@@ -39,6 +39,8 @@ Point it at a `.feature` file and a URL. It parses the Gherkin, scans the live p
|
|
|
39
39
|
- **Three-provider LLM fallback, batched per scenario** (v3.5 + v3.11 + v3.12) — one Anthropic Claude Sonnet 4.6, OpenAI gpt-4o-mini, or Google Gemini 2.5 Flash call per scenario instead of one per unmatched step. ~75% cost reduction on unmatched-heavy scaffolds. Every prompt goes through the `ai-governance` sidecar's `/sanitize` endpoint (fail-closed on 4xx/5xx/timeout — the run terminates rather than emit ungoverned code).
|
|
40
40
|
- **Three hallucination-rejection gates on LLM output** (v4.0.1) — invented-helper detection, structured-pomCall guard, and bare-field-call trap. Bindings the LLM emits that would compile-fail land as `// TODO` comments with `BDD_REVIEW.md` entries instead of broken code. Locked by 19 dedicated unit tests.
|
|
41
41
|
- **Six-pattern LLM-binding rewriter** (v4.1) — mechanically transforms common LLM emission mistakes (invented-helper shapes, bare-field args, unquoted string values, CSS-selector args, `page.<method>` invented-helpers in customBody, Locator-only matchers hallucinated on `page`, bare-identifier assertion locators) into valid Playwright-idiomatic code. Runs *before* the v4.0.1 gates; if a rewrite would still produce broken code, the binding is rejected and lands as TODO. Bench result: 3/8 → **8/8 apps produce specs that pass `tsc --noEmit`**. Locked by 35 unit tests.
|
|
42
|
+
- **DOM-drift detection via POM header hash** (v4.2) — every emitted POM carries a `@bdd2pw dom-hash` comment with a stable sha256 of the page's accessibility tree. On re-scaffold, bdd2pw diffs the new snapshot against the stored hash. Silent UI changes surface as a `DOM DRIFT` warning in `BDD_REVIEW.md` with both hashes and a suggested triage path. `--fail-on-drift` turns it into a non-zero exit code so CI can gate merges on silent UI regressions.
|
|
43
|
+
- **In-process self-healing locators via `@vijaypjavvadi/pw-self-heal`** (v4.3) — `--self-healing` emits a 3-line `tests/fixtures.ts` that wraps the base `test` with `withSelfHealing({ mode })`. Every spec's top-of-file import auto-rewrites to pull `test` + `expect` from `./fixtures` instead of `@playwright/test` directly. POM classes are unchanged; healing is transparent. Ranker: trained ONNX model with a published Zenodo DOI ([10.5281/zenodo.19684439](https://doi.org/10.5281/zenodo.19684439)), GB AUC 0.9993, three modes (`heuristic` / `ml` / `hybrid`). No server, no API key, no Python — the DOM never leaves the machine.
|
|
42
44
|
- **Data-driven scaffolds** (v4.0.0) — `--data <path>` injects CSV / JSON / XLSX rows into every Scenario Outline's `Examples:` table; `--gen-data --schema <path> --rows N` generates synthetic rows via Faker + optional per-column LLM calls (`llm:auto insurance claim description`); seeded (`--seed 42`) for reproducibility.
|
|
43
45
|
- **`updatePom` is append-only by construction.** Re-scanning a page that already has a Page Object adds new locators only. Hand-edited method bodies, custom helper methods, custom imports are all preserved byte-identical.
|
|
44
46
|
- **`--merge` mode** (v3.2) preserves `// bdd2pw:user-block id="..."` sections across regenerations so iterative locator tuning doesn't lose work.
|
|
@@ -362,20 +364,24 @@ output/
|
|
|
362
364
|
| v3.10.0 | Heal stats | `bdd2pw heal-stats <repo>` CLI consumes `artefacts/heal-events.jsonl` and writes `heal-stats.json` with heal rate, top failing fields, top error patterns, retry latency, candidate-selector promotions. Self-healing ROI per test run. |
|
|
363
365
|
| v3.11.0 | OpenAI provider | `LLMClientOptions.provider: "openai"` lands with cache + governance + batching + telemetry parity. Default model `gpt-4o-mini` (~17x cheaper than `gpt-4o` for structured-JSON tasks). |
|
|
364
366
|
| v3.12.0 | Gemini provider | `LLMClientOptions.provider: "gemini"` lands with full parity. Default model `gemini-2.5-flash` ($0.10/M input — cheapest across all three providers). Three-provider parity complete. |
|
|
365
|
-
|
|
|
367
|
+
| v4.0.0 | Data-driven scaffolds | `--data <path>` (CSV/JSON/XLSX) and `--gen-data --schema <path>` (Faker + LLM) inject Examples rows into Scenario Outlines. `LLMClient.generateText()` added to all three providers. **Additive only — no breaking changes.** |
|
|
368
|
+
| v4.0.1 | LLM hallucination gates | Three-layer rejector for invented POM helpers — bindings that would compile-fail land as TODO instead of broken code. 19 unit tests lock the behaviour. |
|
|
369
|
+
| v4.1.0 | LLM binding rewriter | Six-pattern rewriter that mechanically fixes common LLM emission mistakes (invented helpers, bare-field args, CSS-selector args, `page.<method>` in customBody, hallucinated Page matchers, bare-identifier assertion locators). Bench result: 3/8 → **8/8 apps produce specs that pass `tsc --noEmit`**. Peer-reviewed publication in Elsevier SoftwareX. |
|
|
370
|
+
| v4.2.0 | DOM-drift detection | Every emitted POM carries a `@bdd2pw dom-hash` header (sha256 of the accessibility tree). Re-scaffold diffs against the stored hash and surfaces silent UI changes in `BDD_REVIEW.md`. `--fail-on-drift` CLI flag exits non-zero when drift is detected (CI merge gate). |
|
|
371
|
+
| **v4.3.0 (current)** | pw-self-heal integration | `--self-healing` swaps the v4.2 lib/heal.ts + external service shim for `@vijaypjavvadi/pw-self-heal` — trained ONNX ranker (Zenodo DOI 10.5281/zenodo.19684439), in-process, no server. Emits a 3-line `tests/fixtures.ts`; POM classes unchanged. `--legacy-healing` keeps v4.2 behaviour for one release. |
|
|
366
372
|
|
|
367
|
-
### Next 6 months (
|
|
373
|
+
### Next 6 months (Oct 2026 → Mar 2027, ~1 release/month)
|
|
368
374
|
|
|
369
375
|
| Target | Version | Theme | Headline |
|
|
370
376
|
|---|---|---|---|
|
|
371
|
-
|
|
|
372
|
-
|
|
|
373
|
-
|
|
|
374
|
-
|
|
|
375
|
-
|
|
|
376
|
-
|
|
|
377
|
-
|
|
|
378
|
-
|
|
|
377
|
+
| Oct 2026 | **v4.4.0** | LLM quarantine lane | `@llm-generated` Playwright tag on every LLM-derived scenario + `bdd2pw quarantine-stats` CLI that reports pass rate for the LLM-fallback lane separately from the deterministic lane. Teams can filter runs with `--grep-invert @llm-generated` for a "trusted only" execution. |
|
|
378
|
+
| Nov 2026 | **v4.5.0** | sel2pw merge | sel2pw migrated onto `@vijaypjavvadi/pw-emit` — three packages share one emitter. All future emitter improvements automatically flow to Selenium users. |
|
|
379
|
+
| Oct 2026 | **v4.5.0** | Auto-rules | `bdd2pw apply-proposals --interactive` — walks the human through each v3.6 proposal, validates the regex compiles + matches the sample texts, optionally appends to `stepMatcher.ts`. Closes the propose-rules loop. |
|
|
380
|
+
| Nov 2026 | **v4.6.0** | Domain packs | Three more opt-in packs: **fintech** (KYC, AML, trading desks), **real-estate** (MLS, listings, escrow), **hospitality** (PMS, reservations, OTA). ~60 more rules. |
|
|
381
|
+
| Nov 2026 | **v4.7.0** | API v2 | WebSocket assertion rules, multipart file-upload patterns, GraphQL query / mutation / subscription rules. Extends v3.0's API testing surface. |
|
|
382
|
+
| Dec 2026 | **v4.8.0** | Coverage analyzer | `bdd2pw coverage` CLI: which deterministic rules fired on which features across a fleet, per-pack hit rate, dead-rule report, suggestion to retire unused rules. |
|
|
383
|
+
| Jan 2027 | **v4.9.0** | CI/CD templates | Optional scaffolder output: GitHub Actions / GitLab CI / Azure Pipelines / CircleCI starter workflows wired to run the generated specs. Opt-in via `--ci <provider>`. |
|
|
384
|
+
| Feb 2027 | **v5.0.0** | Mobile dialect | Touch / swipe / scroll-into-view rules + responsive viewport assertions. Reuses the same emitter pipeline; opt-in via `domains: ["mobile"]`. Bumps to v5 alongside a small set of default flips (llm-stats + healing become opt-out). Migration guide ships alongside. |
|
|
379
385
|
|
|
380
386
|
Each release is shaped to be self-contained, ship in ~2 weeks, and keep `domains: []` byte-stable for existing users so the upgrade path stays painless.
|
|
381
387
|
|
package/dist/cli.js
CHANGED
|
@@ -75,7 +75,9 @@ program
|
|
|
75
75
|
.option("--no-validate", "Skip tsc --noEmit step")
|
|
76
76
|
.option("--telemetry", "Enable local SQLite failure telemetry", false)
|
|
77
77
|
.option("--force", "Overwrite existing spec files", false)
|
|
78
|
-
.option("--self-healing", "
|
|
78
|
+
.option("--self-healing", "v4.3.0 — wire the emitted test suite to @vijaypjavvadi/pw-self-heal (in-process, trained ONNX ranker, no server). Writes tests/fixtures.ts + adds pw-self-heal to devDependencies. Combine with --legacy-healing to keep the v4.2 lib/heal.ts + external SELF_HEALING_URL service shim (deprecated).", false)
|
|
79
|
+
.option("--self-healing-mode <mode>", "v4.3.0 — pw-self-heal ranker mode: heuristic (no native deps) | ml (ONNX only) | hybrid (default: 0.4·heuristic + 0.6·ml).", "hybrid")
|
|
80
|
+
.option("--legacy-healing", "v4.3.0 — DEPRECATED. Keep emitting the v4.2 lib/heal.ts + external SELF_HEALING_URL service shim instead of the pw-self-heal integration. Removed in v5.0.", false)
|
|
79
81
|
.option("--llm-stats", "v3.9.0 — write <repo>/artefacts/llm-stats.json with per-call latency, token counts, cache hit rate, and estimated cost.", false)
|
|
80
82
|
// v3.4.0 — domain rule packs. Comma-separated list of any of:
|
|
81
83
|
// banking, healthcare, insurance, retail, gov, education, telecom.
|
|
@@ -88,6 +90,7 @@ program
|
|
|
88
90
|
.option("--schema <path>", "v4.0.0 — JSON schema for --gen-data. Object of {column: source} where source is 'faker.X.Y', 'llm:<prompt>', or a literal string.")
|
|
89
91
|
.option("--rows <n>", "v4.0.0 — row count for --gen-data. Default 20.", "20")
|
|
90
92
|
.option("--seed <n>", "v4.0.0 — Faker RNG seed for --gen-data reproducibility. Default 42.", "42")
|
|
93
|
+
.option("--fail-on-drift", "v4.2.0 — exit non-zero when the page's DOM has drifted since the previous scaffold (POM header dom-hash mismatch). Useful in CI to gate merges on silent UI regressions.", false)
|
|
91
94
|
.action(async (feature, opts) => {
|
|
92
95
|
try {
|
|
93
96
|
// v2.0 — wire the actual LLM config when --llm is passed. The legacy
|
|
@@ -146,6 +149,13 @@ program
|
|
|
146
149
|
// Commander negates --no-discovery into opts.discovery=false
|
|
147
150
|
noDiscovery: opts.discovery === false,
|
|
148
151
|
selfHealing: opts.selfHealing,
|
|
152
|
+
// v4.3.0 — pw-self-heal integration.
|
|
153
|
+
selfHealingMode: opts.selfHealingMode === "heuristic" ||
|
|
154
|
+
opts.selfHealingMode === "ml" ||
|
|
155
|
+
opts.selfHealingMode === "hybrid"
|
|
156
|
+
? opts.selfHealingMode
|
|
157
|
+
: "hybrid",
|
|
158
|
+
legacyHealing: opts.legacyHealing === true,
|
|
149
159
|
// v3.4.0 — domain rule packs. Empty array if --domains not passed.
|
|
150
160
|
domains: opts.domains
|
|
151
161
|
? opts.domains
|
|
@@ -170,8 +180,18 @@ program
|
|
|
170
180
|
seed: opts.seed ? Number(opts.seed) : undefined,
|
|
171
181
|
}
|
|
172
182
|
: undefined,
|
|
183
|
+
// v4.2.0 — drift gate for CI.
|
|
184
|
+
failOnDrift: opts.failOnDrift === true,
|
|
173
185
|
});
|
|
174
186
|
logger_1.logger.info({ result }, "scaffold complete");
|
|
187
|
+
// v4.2.0 — exit non-zero when the user asked to gate on drift
|
|
188
|
+
// and drift was actually detected. Runs AFTER the scaffold has
|
|
189
|
+
// fully written its output so users still see the drift warning
|
|
190
|
+
// in BDD_REVIEW.md and can review the affected fields.
|
|
191
|
+
if (opts.failOnDrift === true && result.driftDetected === true) {
|
|
192
|
+
logger_1.logger.warn("--fail-on-drift set and DOM drift detected; exiting with code 2");
|
|
193
|
+
process.exit(2);
|
|
194
|
+
}
|
|
175
195
|
}
|
|
176
196
|
catch (err) {
|
|
177
197
|
logger_1.logger.error({ err }, "scaffold failed");
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAoC;AACpC,2CAA6B;AAC7B,mCAAuD;AACvD,+BAAqC;AACrC,mDAAuD;AACvD,2CAAwC;AAExC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACV,4EAA4E,CAC7E;KACA,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC;AAE/C,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CACV,iFAAiF,CAClF;KACA,QAAQ,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACxD,cAAc,CAAC,aAAa,EAAE,4BAA4B,CAAC;KAC3D,cAAc,CAAC,eAAe,EAAE,qCAAqC,CAAC;KACtE,cAAc,CAAC,cAAc,EAAE,gDAAgD,CAAC;KAChF,MAAM,CAAC,gBAAgB,EAAE,sDAAsD,CAAC;KAChF,MAAM,CAAC,wBAAwB,EAAE,sCAAsC,CAAC;KACxE,MAAM,CAAC,UAAU,EAAE,8BAA8B,EAAE,KAAK,CAAC;KACzD,MAAM,CAAC,wBAAwB,EAAE,+DAA+D,CAAC;KACjG,MAAM,CACL,gBAAgB,EAChB,8FAA8F,CAC/F;KACA,MAAM,CAAC,kBAAkB,EAAE,uFAAuF,CAAC;KACnH,MAAM,CACL,wBAAwB,EACxB,wGAAwG,EACxG,uBAAuB,CACxB;KACA,MAAM,CAAC,qBAAqB,EAAE,6GAA6G,CAAC;KAC5I,MAAM,CAAC,qBAAqB,EAAE,0EAA0E,EAAE,IAAI,CAAC;KAC/G,MAAM,CAAC,oBAAoB,EAAE,0FAA0F,CAAC;KACxH,MAAM,CAAC,uBAAuB,EAAE,0FAA0F,EAAE,KAAK,CAAC;KAClI,MAAM,CAAC,2BAA2B,EAAE,6GAA6G,EAAE,OAAO,CAAC;KAC3J,MAAM,CAAC,+BAA+B,EAAE,8DAA8D,EAAE,OAAO,CAAC;KAChH,MAAM,CAAC,iCAAiC,EAAE,4DAA4D,EAAE,OAAO,CAAC;KAChH,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,WAAW,EAAE,2BAA2B,EAAE,KAAK,CAAC;KACvD,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,aAAa,EAAE,uCAAuC,EAAE,KAAK,CAAC;KACrE,MAAM,CAAC,SAAS,EAAE,+BAA+B,EAAE,KAAK,CAAC;KACzD,MAAM,CACL,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;AACA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,yCAAoC;AACpC,2CAA6B;AAC7B,mCAAuD;AACvD,+BAAqC;AACrC,mDAAuD;AACvD,2CAAwC;AAExC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CACV,4EAA4E,CAC7E;KACA,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC;AAE/C,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CACV,iFAAiF,CAClF;KACA,QAAQ,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACxD,cAAc,CAAC,aAAa,EAAE,4BAA4B,CAAC;KAC3D,cAAc,CAAC,eAAe,EAAE,qCAAqC,CAAC;KACtE,cAAc,CAAC,cAAc,EAAE,gDAAgD,CAAC;KAChF,MAAM,CAAC,gBAAgB,EAAE,sDAAsD,CAAC;KAChF,MAAM,CAAC,wBAAwB,EAAE,sCAAsC,CAAC;KACxE,MAAM,CAAC,UAAU,EAAE,8BAA8B,EAAE,KAAK,CAAC;KACzD,MAAM,CAAC,wBAAwB,EAAE,+DAA+D,CAAC;KACjG,MAAM,CACL,gBAAgB,EAChB,8FAA8F,CAC/F;KACA,MAAM,CAAC,kBAAkB,EAAE,uFAAuF,CAAC;KACnH,MAAM,CACL,wBAAwB,EACxB,wGAAwG,EACxG,uBAAuB,CACxB;KACA,MAAM,CAAC,qBAAqB,EAAE,6GAA6G,CAAC;KAC5I,MAAM,CAAC,qBAAqB,EAAE,0EAA0E,EAAE,IAAI,CAAC;KAC/G,MAAM,CAAC,oBAAoB,EAAE,0FAA0F,CAAC;KACxH,MAAM,CAAC,uBAAuB,EAAE,0FAA0F,EAAE,KAAK,CAAC;KAClI,MAAM,CAAC,2BAA2B,EAAE,6GAA6G,EAAE,OAAO,CAAC;KAC3J,MAAM,CAAC,+BAA+B,EAAE,8DAA8D,EAAE,OAAO,CAAC;KAChH,MAAM,CAAC,iCAAiC,EAAE,4DAA4D,EAAE,OAAO,CAAC;KAChH,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,WAAW,EAAE,2BAA2B,EAAE,KAAK,CAAC;KACvD,MAAM,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACjD,MAAM,CAAC,aAAa,EAAE,uCAAuC,EAAE,KAAK,CAAC;KACrE,MAAM,CAAC,SAAS,EAAE,+BAA+B,EAAE,KAAK,CAAC;KACzD,MAAM,CACL,gBAAgB,EAChB,sSAAsS,EACtS,KAAK,CACN;KACA,MAAM,CACL,4BAA4B,EAC5B,4HAA4H,EAC5H,QAAQ,CACT;KACA,MAAM,CACL,kBAAkB,EAClB,4JAA4J,EAC5J,KAAK,CACN;KACA,MAAM,CACL,aAAa,EACb,yHAAyH,EACzH,KAAK,CACN;IACD,8DAA8D;IAC9D,mEAAmE;IACnE,mEAAmE;IACnE,oEAAoE;KACnE,MAAM,CACL,kBAAkB,EAClB,kIAAkI,CACnI;IACD,2CAA2C;KAC1C,MAAM,CACL,eAAe,EACf,oNAAoN,CACrN;KACA,MAAM,CACL,YAAY,EACZ,qHAAqH,EACrH,KAAK,CACN;KACA,MAAM,CACL,iBAAiB,EACjB,mIAAmI,CACpI;KACA,MAAM,CACL,YAAY,EACZ,gDAAgD,EAChD,IAAI,CACL;KACA,MAAM,CACL,YAAY,EACZ,qEAAqE,EACrE,IAAI,CACL;KACA,MAAM,CACL,iBAAiB,EACjB,0KAA0K,EAC1K,KAAK,CACN;KACA,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;IACtC,IAAI,CAAC;QACH,qEAAqE;QACrE,uEAAuE;QACvE,4DAA4D;QAC5D,MAAM,WAAW,GACf,IAAI,CAAC,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ;YACxE,CAAC,CAAC,IAAI,CAAC,GAAG;YACV,CAAC,CAAC,IAAI,CAAC;QACX,MAAM,SAAS,GAAG,WAAW;YAC3B,CAAC,CAAC,CAAC;gBACG,QAAQ,EAAE,WAAgD;gBAC1D,KAAK,EAAE,IAAI,CAAC,QAAQ;gBACpB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,QAAQ,EAAE,IAAI,CAAC,WAAW;oBACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;oBAC1B,CAAC,CAAC,SAAS;gBACb,SAAS,EAAE,IAAI,CAAC,QAAQ;gBACxB,cAAc,EAAE,IAAI,CAAC,iBAAiB;gBACtC,mBAAmB;gBACnB,aAAa,EAAE,IAAI,CAAC,gBAAgB;oBAClC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;oBAC/B,CAAC,CAAC,SAAS;gBACb,iBAAiB,EAAE,IAAI,CAAC,oBAAoB;oBAC1C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;oBACnC,CAAC,CAAC,SAAS;gBACb,mBAAmB,EAAE,IAAI,CAAC,sBAAsB;oBAC9C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC;oBACrC,CAAC,CAAC,SAAS;aACd,CAAC;YACN,CAAC,CAAC,SAAS,CAAC;QACd,+DAA+D;QAC/D,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CACV,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QACD,gDAAgD;QAChD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,IAAI,CACV,oEAAoE,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAA,gBAAQ,EAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1D,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,SAAS;YACT,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU,KAAK,KAAK;YACrC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,6DAA6D;YAC7D,WAAW,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK;YACrC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,qCAAqC;YACrC,eAAe,EACb,IAAI,CAAC,eAAe,KAAK,WAAW;gBACpC,IAAI,CAAC,eAAe,KAAK,IAAI;gBAC7B,IAAI,CAAC,eAAe,KAAK,QAAQ;gBAC/B,CAAC,CAAC,IAAI,CAAC,eAAe;gBACtB,CAAC,CAAC,QAAQ;YACd,aAAa,EAAE,IAAI,CAAC,aAAa,KAAK,IAAI;YAC1C,mEAAmE;YACnE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACnB,CAAC,CAAC,IAAI,CAAC,OAAO;qBACT,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAC5B,MAAM,CAAC,OAAO,CAAC;gBACpB,CAAC,CAAC,SAAS;YACb,6BAA6B;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI;YAChC,4DAA4D;YAC5D,gEAAgE;YAChE,4BAA4B;YAC5B,UAAU,EAAE,IAAI,CAAC,IAAI;gBACnB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC1D,CAAC,CAAC,IAAI,CAAC,OAAO;oBACZ,CAAC,CAAC;wBACE,IAAI,EAAE,WAAoB;wBAC1B,UAAU,EAAE,IAAI,CAAC,MAAM;4BACrB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;4BAC3B,CAAC,CAAC,SAAS;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;wBAC/C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;qBAChD;oBACH,CAAC,CAAC,SAAS;YACf,8BAA8B;YAC9B,WAAW,EAAE,IAAI,CAAC,WAAW,KAAK,IAAI;SACvC,CAAC,CAAC;QACH,eAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC7C,8DAA8D;QAC9D,+DAA+D;QAC/D,gEAAgE;QAChE,uDAAuD;QACvD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,MAAM,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAC/D,eAAM,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,qEAAqE,CAAC;KAClF,QAAQ,CAAC,WAAW,EAAE,iCAAiC,CAAC;KACxD,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC;KAC5C,MAAM,CAAC,wBAAwB,EAAE,sCAAsC,CAAC;KACxE,MAAM,CAAC,UAAU,EAAE,8BAA8B,EAAE,KAAK,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAI,EAAE,EAAE;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,eAAO,EAAC;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC9B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,oEAAoE,CAAC;KACjF,cAAc,CAAC,eAAe,EAAE,wBAAwB,CAAC;KACzD,cAAc,CAAC,aAAa,EAAE,gBAAgB,CAAC;KAC/C,cAAc,CAAC,cAAc,EAAE,6BAA6B,CAAC;KAC7D,MAAM,CAAC,wBAAwB,EAAE,sCAAsC,CAAC;KACxE,MAAM,CAAC,UAAU,EAAE,8BAA8B,EAAE,KAAK,CAAC;KACzD,MAAM,CAAC,mBAAmB,EAAE,6CAA6C,CAAC;KAC1E,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAA,iBAAS,EAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;QACH,eAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,eAAe,EAAE,mBAAmB,EAAE,MAAM,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,UAAU,GAAC,CAAC;IACjD,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL;;GAEG;AACH,SAAS,WAAW,CAAC,GAAY;IAC/B,MAAM,IAAI,GAAI,GAAyB,EAAE,IAAI,IAAI,EAAE,CAAC;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,mBAAmB;YACtB,OAAO,CAAC,CAAC;QACX,KAAK,iBAAiB;YACpB,OAAO,CAAC,CAAC;QACX,KAAK,UAAU,CAAC;QAChB,KAAK,iBAAiB;YACpB,OAAO,CAAC,CAAC;QACX,KAAK,yBAAyB;YAC5B,OAAO,CAAC,CAAC;QACX;YACE,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CACV,yGAAyG,CAC1G;KACA,QAAQ,CACP,SAAS,EACT,kEAAkE,CACnE;KACA,MAAM,CACL,cAAc,EACd,iEAAiE,CAClE;KACA,MAAM,CACL,wBAAwB,EACxB,qDAAqD,EACrD,GAAG,CACJ;KACA,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,GAA8C,EAAE,EAAE;IAC9E,MAAM,MAAM,GAAG,MAAM,IAAA,kBAAY,EAAC;QAChC,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,GAAG;QACnB,cAAc,EAAE,GAAG,CAAC,cAAc;YAChC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC;YAC5B,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;IACH,eAAM,CAAC,IAAI,CACT;QACE,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,eAAe,EAAE,MAAM,CAAC,eAAe;KACxC,EACD,yBAAyB,CAC1B,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,MAAM,CAAC,gBAAgB,2BAA2B,MAAM,CAAC,UAAU,GAAG;QACzE,SAAS,MAAM,CAAC,eAAe,wBAAwB,CAC1D,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL;;;;;;;GAOG;AACH,OAAO;KACJ,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CACV,8EAA8E,CAC/E;KACA,QAAQ,CACP,SAAS,EACT,mFAAmF,CACpF;KACA,MAAM,CACL,cAAc,EACd,sEAAsE,CACvE;KACA,MAAM,CACL,WAAW,EACX,2GAA2G,EAC3G,IAAI,CACL;KACA,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,GAAmC,EAAE,EAAE;IACnE,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAgB,EAAC;QACpC,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,GAAG,CAAC,GAAG;QACnB,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5C,CAAC,CAAC;IACH,eAAM,CAAC,IAAI,CACT;QACE,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,EACD,sBAAsB,CACvB,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uBAAuB,MAAM,CAAC,UAAU,YAAY,MAAM,CAAC,WAAW,eAAe,CACtF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v4.2.0 — DOM snapshot hashing for POM drift detection.
|
|
3
|
+
*
|
|
4
|
+
* Every emitted POM carries a stable sha256 of the accessibility tree it
|
|
5
|
+
* was generated from. On re-scaffold, bdd2pw compares the new snapshot's
|
|
6
|
+
* hash against the one embedded in the existing POM. If they differ, the
|
|
7
|
+
* UI drifted since the last scaffold — and any downstream test failure
|
|
8
|
+
* suddenly has a specific, actionable explanation: "the page shape
|
|
9
|
+
* changed, here are the affected fields."
|
|
10
|
+
*
|
|
11
|
+
* Detection triggers a `DOM DRIFT` entry in `BDD_REVIEW.md`. When
|
|
12
|
+
* `--fail-on-drift` is set (or `failOnDrift: true` programmatically),
|
|
13
|
+
* `scaffold()` returns `driftDetected: true` and the CLI exits with a
|
|
14
|
+
* non-zero code so CI catches silent UI regressions.
|
|
15
|
+
*
|
|
16
|
+
* Why hash the accessibility tree (not the raw DOM):
|
|
17
|
+
* - The tree is what drives POM field selection — irrelevant DOM shifts
|
|
18
|
+
* (whitespace, comment nodes, class-name churn) shouldn't trigger a
|
|
19
|
+
* drift warning.
|
|
20
|
+
* - Deterministic canonical JSON output means identical trees always
|
|
21
|
+
* produce identical hashes, regardless of key order.
|
|
22
|
+
*/
|
|
23
|
+
import type { PageSnapshot } from "./mcpClient";
|
|
24
|
+
/**
|
|
25
|
+
* Compute the sha256 hash of a page snapshot's accessibility tree.
|
|
26
|
+
* Returned as lowercase hex (64 chars).
|
|
27
|
+
*/
|
|
28
|
+
export declare function computeDomHash(snapshot: PageSnapshot): string;
|
|
29
|
+
/**
|
|
30
|
+
* Build the POM-header comment that carries the DOM hash. Emitted at the
|
|
31
|
+
* top of every generated POM immediately after any `import` block by
|
|
32
|
+
* `index.ts`.
|
|
33
|
+
*
|
|
34
|
+
* Uses a machine-parseable format so `extractDomHashFromPom` can find
|
|
35
|
+
* the value on re-scaffold. The `bdd2pw:dom-hash` tag is unique enough
|
|
36
|
+
* that a naive substring match works.
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildDomHashHeader(hash: string, url: string, generatedAt?: Date): string;
|
|
39
|
+
/**
|
|
40
|
+
* Extract the DOM hash from an existing POM file's contents. Returns
|
|
41
|
+
* undefined if no hash header is present (older POM files predating
|
|
42
|
+
* v4.2, or files where the header was hand-removed).
|
|
43
|
+
*/
|
|
44
|
+
export declare function extractDomHashFromPom(pomContents: string): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Prepend the DOM-hash header to a POM file's contents. Placed above
|
|
47
|
+
* any existing text (which typically starts with `import` statements).
|
|
48
|
+
* If a header is already present (idempotent re-emit), it is replaced
|
|
49
|
+
* rather than duplicated.
|
|
50
|
+
*/
|
|
51
|
+
export declare function prependDomHashHeader(pomContents: string, header: string): string;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* v4.2.0 — DOM snapshot hashing for POM drift detection.
|
|
4
|
+
*
|
|
5
|
+
* Every emitted POM carries a stable sha256 of the accessibility tree it
|
|
6
|
+
* was generated from. On re-scaffold, bdd2pw compares the new snapshot's
|
|
7
|
+
* hash against the one embedded in the existing POM. If they differ, the
|
|
8
|
+
* UI drifted since the last scaffold — and any downstream test failure
|
|
9
|
+
* suddenly has a specific, actionable explanation: "the page shape
|
|
10
|
+
* changed, here are the affected fields."
|
|
11
|
+
*
|
|
12
|
+
* Detection triggers a `DOM DRIFT` entry in `BDD_REVIEW.md`. When
|
|
13
|
+
* `--fail-on-drift` is set (or `failOnDrift: true` programmatically),
|
|
14
|
+
* `scaffold()` returns `driftDetected: true` and the CLI exits with a
|
|
15
|
+
* non-zero code so CI catches silent UI regressions.
|
|
16
|
+
*
|
|
17
|
+
* Why hash the accessibility tree (not the raw DOM):
|
|
18
|
+
* - The tree is what drives POM field selection — irrelevant DOM shifts
|
|
19
|
+
* (whitespace, comment nodes, class-name churn) shouldn't trigger a
|
|
20
|
+
* drift warning.
|
|
21
|
+
* - Deterministic canonical JSON output means identical trees always
|
|
22
|
+
* produce identical hashes, regardless of key order.
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.computeDomHash = computeDomHash;
|
|
26
|
+
exports.buildDomHashHeader = buildDomHashHeader;
|
|
27
|
+
exports.extractDomHashFromPom = extractDomHashFromPom;
|
|
28
|
+
exports.prependDomHashHeader = prependDomHashHeader;
|
|
29
|
+
const node_crypto_1 = require("node:crypto");
|
|
30
|
+
/**
|
|
31
|
+
* Canonical JSON stringify — sorted keys at every object level so
|
|
32
|
+
* identical accessibility trees always hash to the same value even if
|
|
33
|
+
* MCP delivered them with different property ordering.
|
|
34
|
+
*/
|
|
35
|
+
function canonicalStringify(value) {
|
|
36
|
+
if (value === null)
|
|
37
|
+
return "null";
|
|
38
|
+
if (typeof value !== "object")
|
|
39
|
+
return JSON.stringify(value);
|
|
40
|
+
if (Array.isArray(value)) {
|
|
41
|
+
return "[" + value.map(canonicalStringify).join(",") + "]";
|
|
42
|
+
}
|
|
43
|
+
const obj = value;
|
|
44
|
+
const keys = Object.keys(obj).sort();
|
|
45
|
+
const parts = keys.map((k) => JSON.stringify(k) + ":" + canonicalStringify(obj[k]));
|
|
46
|
+
return "{" + parts.join(",") + "}";
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Compute the sha256 hash of a page snapshot's accessibility tree.
|
|
50
|
+
* Returned as lowercase hex (64 chars).
|
|
51
|
+
*/
|
|
52
|
+
function computeDomHash(snapshot) {
|
|
53
|
+
const canonical = canonicalStringify(snapshot.accessibilityTree);
|
|
54
|
+
return (0, node_crypto_1.createHash)("sha256").update(canonical, "utf8").digest("hex");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Build the POM-header comment that carries the DOM hash. Emitted at the
|
|
58
|
+
* top of every generated POM immediately after any `import` block by
|
|
59
|
+
* `index.ts`.
|
|
60
|
+
*
|
|
61
|
+
* Uses a machine-parseable format so `extractDomHashFromPom` can find
|
|
62
|
+
* the value on re-scaffold. The `bdd2pw:dom-hash` tag is unique enough
|
|
63
|
+
* that a naive substring match works.
|
|
64
|
+
*/
|
|
65
|
+
function buildDomHashHeader(hash, url, generatedAt = new Date()) {
|
|
66
|
+
return [
|
|
67
|
+
"/**",
|
|
68
|
+
" * @bdd2pw generated " + generatedAt.toISOString(),
|
|
69
|
+
" * @bdd2pw dom-hash " + hash,
|
|
70
|
+
" * @bdd2pw url " + url,
|
|
71
|
+
" *",
|
|
72
|
+
" * The dom-hash line is used by bdd2pw to detect DOM drift on",
|
|
73
|
+
" * re-scaffold. Do not edit it by hand — regenerate with `bdd2pw",
|
|
74
|
+
" * scaffold` or `bdd2pw update-pom` to refresh.",
|
|
75
|
+
" */",
|
|
76
|
+
"",
|
|
77
|
+
].join("\n");
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract the DOM hash from an existing POM file's contents. Returns
|
|
81
|
+
* undefined if no hash header is present (older POM files predating
|
|
82
|
+
* v4.2, or files where the header was hand-removed).
|
|
83
|
+
*/
|
|
84
|
+
function extractDomHashFromPom(pomContents) {
|
|
85
|
+
const match = pomContents.match(/@bdd2pw dom-hash ([a-f0-9]{64})/);
|
|
86
|
+
return match ? match[1] : undefined;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Prepend the DOM-hash header to a POM file's contents. Placed above
|
|
90
|
+
* any existing text (which typically starts with `import` statements).
|
|
91
|
+
* If a header is already present (idempotent re-emit), it is replaced
|
|
92
|
+
* rather than duplicated.
|
|
93
|
+
*/
|
|
94
|
+
function prependDomHashHeader(pomContents, header) {
|
|
95
|
+
// Strip any existing @bdd2pw header block first (idempotent).
|
|
96
|
+
const stripped = pomContents.replace(/^\/\*\*[\s\S]*?@bdd2pw dom-hash[\s\S]*?\*\/\s*\n*/, "");
|
|
97
|
+
return header + stripped;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=domHash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domHash.js","sourceRoot":"","sources":["../../src/discovery/domHash.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;;AA4BH,wCAGC;AAWD,gDAiBC;AAOD,sDAKC;AAQD,oDAUC;AAvFD,6CAAyC;AAGzC;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAC7D,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAC5D,CAAC;IACF,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,SAAgB,cAAc,CAAC,QAAsB;IACnD,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACjE,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAChC,IAAY,EACZ,GAAW,EACX,cAAoB,IAAI,IAAI,EAAE;IAE9B,OAAO;QACL,KAAK;QACL,uBAAuB,GAAG,WAAW,CAAC,WAAW,EAAE;QACnD,sBAAsB,GAAG,IAAI;QAC7B,iBAAiB,GAAG,GAAG;QACvB,IAAI;QACJ,+DAA+D;QAC/D,kEAAkE;QAClE,iDAAiD;QACjD,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CACnC,WAAmB;IAEnB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACnE,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAClC,WAAmB,EACnB,MAAc;IAEd,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAClC,mDAAmD,EACnD,EAAE,CACH,CAAC;IACF,OAAO,MAAM,GAAG,QAAQ,CAAC;AAC3B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -60,6 +60,7 @@ const locatorPicker_1 = require("./transformers/locatorPicker");
|
|
|
60
60
|
const pomResolver_1 = require("./transformers/pomResolver");
|
|
61
61
|
const stepMatcher_1 = require("./transformers/stepMatcher");
|
|
62
62
|
const facade_1 = require("./emitters/facade");
|
|
63
|
+
const domHash_1 = require("./discovery/domHash");
|
|
63
64
|
const tscRunner_1 = require("./validate/tscRunner");
|
|
64
65
|
const reviewReport_1 = require("./reports/reviewReport");
|
|
65
66
|
const metaSidecar_1 = require("./reports/metaSidecar");
|
|
@@ -133,6 +134,9 @@ async function scaffold(opts) {
|
|
|
133
134
|
baseUrl: opts.url,
|
|
134
135
|
projectName: feature.name.toLowerCase().replace(/\s+/g, "-"),
|
|
135
136
|
selfHealing: opts.selfHealing,
|
|
137
|
+
// v4.3.0 — pw-self-heal integration.
|
|
138
|
+
selfHealingMode: opts.selfHealingMode,
|
|
139
|
+
legacyHealing: opts.legacyHealing,
|
|
136
140
|
dependencyStrategy: opts.dependencyStrategy,
|
|
137
141
|
});
|
|
138
142
|
reviewItems.push(...scaffoldResult.warnings);
|
|
@@ -148,6 +152,10 @@ async function scaffold(opts) {
|
|
|
148
152
|
// lands and rule-only steps (`I am on the page`, `should be redirected`)
|
|
149
153
|
// still produce useful output even when the URL isn't reachable.
|
|
150
154
|
let elements = [];
|
|
155
|
+
// v4.2.0 — DOM-hash tracking. Snapshot is hoisted here so the hash can
|
|
156
|
+
// be embedded in the POM header (§8 below). undefined if discovery
|
|
157
|
+
// failed or was skipped, which suppresses the header.
|
|
158
|
+
let capturedSnapshot;
|
|
151
159
|
if (opts.noDiscovery) {
|
|
152
160
|
reviewItems.push({
|
|
153
161
|
severity: "info",
|
|
@@ -156,13 +164,13 @@ async function scaffold(opts) {
|
|
|
156
164
|
}
|
|
157
165
|
else {
|
|
158
166
|
try {
|
|
159
|
-
|
|
167
|
+
capturedSnapshot = await (0, mcpClient_1.scanPage)({
|
|
160
168
|
url: opts.url,
|
|
161
169
|
storageState: opts.storageState,
|
|
162
170
|
headed: opts.headed,
|
|
163
171
|
snapshotFile: opts.snapshotFile,
|
|
164
172
|
});
|
|
165
|
-
elements = (0, snapshotParser_1.parseSnapshot)(
|
|
173
|
+
elements = (0, snapshotParser_1.parseSnapshot)(capturedSnapshot);
|
|
166
174
|
}
|
|
167
175
|
catch (err) {
|
|
168
176
|
reviewItems.push({
|
|
@@ -460,6 +468,40 @@ async function scaffold(opts) {
|
|
|
460
468
|
}
|
|
461
469
|
}
|
|
462
470
|
const filesWritten = [...scaffoldResult.filesWritten];
|
|
471
|
+
// v4.2.0 — drift detection. Runs BEFORE the emit so a warning lands
|
|
472
|
+
// even if the emit itself fails partway through. `driftDetected` is
|
|
473
|
+
// surfaced in the return value for --fail-on-drift CI behaviour.
|
|
474
|
+
let driftDetected = false;
|
|
475
|
+
const currentDomHash = capturedSnapshot ? (0, domHash_1.computeDomHash)(capturedSnapshot) : undefined;
|
|
476
|
+
if (currentDomHash && decision.existing) {
|
|
477
|
+
const existingPomContents = await fs
|
|
478
|
+
.readFile(decision.existing.filePath, "utf8")
|
|
479
|
+
.catch(() => undefined);
|
|
480
|
+
if (existingPomContents) {
|
|
481
|
+
const previousHash = (0, domHash_1.extractDomHashFromPom)(existingPomContents);
|
|
482
|
+
if (previousHash && previousHash !== currentDomHash) {
|
|
483
|
+
driftDetected = true;
|
|
484
|
+
reviewItems.push({
|
|
485
|
+
severity: "warn",
|
|
486
|
+
message: "DOM DRIFT detected: the page's accessibility tree has changed since the last scaffold. " +
|
|
487
|
+
"Previous hash " +
|
|
488
|
+
previousHash.slice(0, 12) +
|
|
489
|
+
"… → new hash " +
|
|
490
|
+
currentDomHash.slice(0, 12) +
|
|
491
|
+
"…. Any pinned locators may now point at moved or missing elements.",
|
|
492
|
+
suggestion: "Review the diff between the last snapshot and the current one, then re-run the affected specs to confirm behaviour. Pass --fail-on-drift in CI to gate merges on this signal.",
|
|
493
|
+
file: finalPom.filePath,
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
else if (!previousHash) {
|
|
497
|
+
reviewItems.push({
|
|
498
|
+
severity: "info",
|
|
499
|
+
message: "Existing POM predates v4.2 dom-hash tracking. First scaffold with v4.2+ will embed a baseline hash; future runs will detect drift.",
|
|
500
|
+
file: finalPom.filePath,
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
463
505
|
if (!opts.dryRun) {
|
|
464
506
|
// 8) Emit Page Object
|
|
465
507
|
const pomEmitMode = decision.decision === "CREATE" ? "create" : "augment";
|
|
@@ -469,11 +511,23 @@ async function scaffold(opts) {
|
|
|
469
511
|
existing: decision.existing
|
|
470
512
|
? await fs.readFile(decision.existing.filePath, "utf8").catch(() => undefined)
|
|
471
513
|
: undefined,
|
|
472
|
-
|
|
514
|
+
// v4.3.0 — the pw-emit healing shim (healOrThrow wrapping) is ONLY
|
|
515
|
+
// emitted for --legacy-healing. New-mode healing is transparent —
|
|
516
|
+
// the emitted spec imports `test` from a fixtures file that wraps
|
|
517
|
+
// the base test with `withSelfHealing(...)`, so POM classes need
|
|
518
|
+
// no changes and every field call heals through the wrapped page.
|
|
519
|
+
selfHealingShim: opts.selfHealing === true && opts.legacyHealing === true,
|
|
473
520
|
});
|
|
474
521
|
reviewItems.push(...pomEmit.warnings.map((w) => ({ ...w, file: finalPom.filePath })));
|
|
522
|
+
// v4.2.0 — prepend DOM-hash header if we have a snapshot. Header is
|
|
523
|
+
// idempotent (replaces any prior header block from a previous
|
|
524
|
+
// scaffold) so re-emitting doesn't stack duplicates.
|
|
525
|
+
let pomContents = pomEmit.contents;
|
|
526
|
+
if (currentDomHash) {
|
|
527
|
+
pomContents = (0, domHash_1.prependDomHashHeader)(pomContents, (0, domHash_1.buildDomHashHeader)(currentDomHash, opts.url));
|
|
528
|
+
}
|
|
475
529
|
await fs.ensureDir(path.dirname(finalPom.filePath));
|
|
476
|
-
await fs.writeFile(finalPom.filePath,
|
|
530
|
+
await fs.writeFile(finalPom.filePath, pomContents, "utf8");
|
|
477
531
|
filesWritten.push(finalPom.filePath);
|
|
478
532
|
// 9) Emit spec file. pageObjectFileName returns "login.page.ts"; strip
|
|
479
533
|
// the trailing ".ts" for both the spec file stem and the import path.
|
|
@@ -505,6 +559,17 @@ async function scaffold(opts) {
|
|
|
505
559
|
// prepend a `// bdd2pw:generated v=… source=…` header so future
|
|
506
560
|
// merges can recognise our own output.
|
|
507
561
|
let finalSpec = specEmit.contents;
|
|
562
|
+
// v4.3.0 — pw-self-heal integration. When --self-healing is on and
|
|
563
|
+
// --legacy-healing is not set, redirect the emitted spec's `test` /
|
|
564
|
+
// `expect` import from `@playwright/test` to the sibling `./fixtures`
|
|
565
|
+
// file scaffoldProject wrote. The fixtures file re-exports the two
|
|
566
|
+
// symbols with `withSelfHealing()` applied to `test`, so every
|
|
567
|
+
// `page` fixture in the spec heals broken locators at runtime.
|
|
568
|
+
// Only rewrites the exact top-of-file import — inline type-only
|
|
569
|
+
// imports elsewhere in the spec are left untouched.
|
|
570
|
+
if (opts.selfHealing === true && opts.legacyHealing !== true) {
|
|
571
|
+
finalSpec = finalSpec.replace(/^import\s+\{\s*test\s*,\s*expect\s*\}\s+from\s+["']@playwright\/test["'];\s*$/m, 'import { test, expect } from "./fixtures";');
|
|
572
|
+
}
|
|
508
573
|
if (opts.merge) {
|
|
509
574
|
finalSpec = (0, specMerge_1.prependGeneratedHeader)(finalSpec, PACKAGE_VERSION, path.relative(opts.repo, opts.feature));
|
|
510
575
|
if (await fs.pathExists(specPath)) {
|
|
@@ -577,7 +642,7 @@ async function scaffold(opts) {
|
|
|
577
642
|
// Close the SQLite cache handle if we opened one.
|
|
578
643
|
if (llm?.close)
|
|
579
644
|
await llm.close().catch(() => undefined);
|
|
580
|
-
return { filesWritten, reviewItems, tscErrorCount, reviewReportPath };
|
|
645
|
+
return { filesWritten, reviewItems, tscErrorCount, reviewReportPath, driftDetected };
|
|
581
646
|
}
|
|
582
647
|
/**
|
|
583
648
|
* Construct the final POM IR based on the resolver decision.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,31 @@ export interface ScaffoldProjectOptions {
|
|
|
24
24
|
baseUrl?: string;
|
|
25
25
|
/** Injected as `name` in package.json. */
|
|
26
26
|
projectName?: string;
|
|
27
|
-
/**
|
|
27
|
+
/**
|
|
28
|
+
* When true, wire runtime locator healing into the emitted repo.
|
|
29
|
+
* v4.3.0+: default emission uses `@vijaypjavvadi/pw-self-heal` —
|
|
30
|
+
* a `tests/fixtures.ts` is written that wraps `@playwright/test`
|
|
31
|
+
* with `withSelfHealing(...)` and the emitted spec files import
|
|
32
|
+
* `test` and `expect` from `../fixtures` instead of directly from
|
|
33
|
+
* `@playwright/test`. No `lib/heal.ts` template, no tsconfig path
|
|
34
|
+
* alias, no external service.
|
|
35
|
+
*
|
|
36
|
+
* When combined with `legacyHealing: true`, the v4.2 behaviour
|
|
37
|
+
* (bundled `lib/heal.ts` template + tsconfig alias + external
|
|
38
|
+
* `SELF_HEALING_URL` service) is emitted instead. Deprecated —
|
|
39
|
+
* removed in v5.0.
|
|
40
|
+
*/
|
|
28
41
|
selfHealing?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* v4.3.0 — ranker mode passed to `withSelfHealing({mode})` in the
|
|
44
|
+
* emitted fixtures. Ignored when `legacyHealing: true`.
|
|
45
|
+
*/
|
|
46
|
+
selfHealingMode?: "heuristic" | "ml" | "hybrid";
|
|
47
|
+
/**
|
|
48
|
+
* v4.3.0 — keep emitting the v4.2 `lib/heal.ts` + external service
|
|
49
|
+
* shim. One-release deprecation window; will be removed in v5.0.
|
|
50
|
+
*/
|
|
51
|
+
legacyHealing?: boolean;
|
|
29
52
|
/**
|
|
30
53
|
* v3.2.0 — pin emitted devDependency versions when set to `exact`.
|
|
31
54
|
* Default `caret` matches existing behavior. See TestForge handoff
|
|
@@ -68,7 +68,17 @@ async function scaffoldProject(opts) {
|
|
|
68
68
|
const filesWritten = [...result.filesWritten];
|
|
69
69
|
const warnings = [...result.warnings];
|
|
70
70
|
if (opts.selfHealing) {
|
|
71
|
-
|
|
71
|
+
if (opts.legacyHealing) {
|
|
72
|
+
warnings.push({
|
|
73
|
+
severity: "warn",
|
|
74
|
+
message: "--legacy-healing emits the v4.2 bundled lib/heal.ts + external SELF_HEALING_URL service shim. This mode is deprecated and will be removed in v5.0.",
|
|
75
|
+
suggestion: "Drop --legacy-healing to use the v4.3+ in-process @vijaypjavvadi/pw-self-heal integration (trained ONNX ranker, no server, no API key).",
|
|
76
|
+
});
|
|
77
|
+
await emitLegacyHealingScaffold(opts.repoRoot, filesWritten, warnings);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
await emitPwSelfHealScaffold(opts.repoRoot, opts.selfHealingMode ?? "hybrid", filesWritten, warnings);
|
|
81
|
+
}
|
|
72
82
|
}
|
|
73
83
|
return {
|
|
74
84
|
filesWritten,
|
|
@@ -77,10 +87,110 @@ async function scaffoldProject(opts) {
|
|
|
77
87
|
};
|
|
78
88
|
}
|
|
79
89
|
/**
|
|
90
|
+
* v4.3.0+ — emit the pw-self-heal fixture wiring:
|
|
91
|
+
* - `tests/fixtures.ts` — re-exports `test`/`expect` with
|
|
92
|
+
* `withSelfHealing()` applied to the base test.
|
|
93
|
+
* - `.pwheal/.gitkeep` — placeholder so the telemetry directory exists
|
|
94
|
+
* on fresh clones (heal-events.jsonl is gitignored).
|
|
95
|
+
* - Append `@vijaypjavvadi/pw-self-heal` + optional `onnxruntime-node`
|
|
96
|
+
* to the emitted `package.json` devDependencies.
|
|
97
|
+
*
|
|
98
|
+
* All operations are idempotent — re-scaffold rewrites the fixture with
|
|
99
|
+
* the currently-selected mode but never appends duplicates to
|
|
100
|
+
* package.json. Existing `tests/fixtures.ts` is overwritten so mode
|
|
101
|
+
* changes propagate. Downstream consumers that need a custom fixture
|
|
102
|
+
* (extra beforeEach, storage state, etc.) can copy the emitted file
|
|
103
|
+
* to a different path and update spec imports accordingly.
|
|
104
|
+
*/
|
|
105
|
+
async function emitPwSelfHealScaffold(repoRoot, mode, filesWritten, warnings) {
|
|
106
|
+
// 1) tests/fixtures.ts — the minimal wrapper.
|
|
107
|
+
const testsDir = path.join(repoRoot, "tests");
|
|
108
|
+
await fs.ensureDir(testsDir);
|
|
109
|
+
const fixturesPath = path.join(testsDir, "fixtures.ts");
|
|
110
|
+
const fixturesContent = renderPwSelfHealFixtures(mode);
|
|
111
|
+
await fs.writeFile(fixturesPath, fixturesContent, "utf8");
|
|
112
|
+
if (!filesWritten.includes(fixturesPath))
|
|
113
|
+
filesWritten.push(fixturesPath);
|
|
114
|
+
// 2) .pwheal/.gitkeep so telemetry directory is committable.
|
|
115
|
+
const pwhealDir = path.join(repoRoot, ".pwheal");
|
|
116
|
+
await fs.ensureDir(pwhealDir);
|
|
117
|
+
const gitkeep = path.join(pwhealDir, ".gitkeep");
|
|
118
|
+
if (!(await fs.pathExists(gitkeep))) {
|
|
119
|
+
await fs.writeFile(gitkeep, "# @vijaypjavvadi/pw-self-heal writes heal-events.jsonl here at test\n" +
|
|
120
|
+
"# runtime. Files in this directory are intentionally excluded from\n" +
|
|
121
|
+
"# version control via the project's .gitignore — only this\n" +
|
|
122
|
+
"# placeholder is tracked so the directory exists on a fresh checkout.\n", "utf8");
|
|
123
|
+
filesWritten.push(gitkeep);
|
|
124
|
+
}
|
|
125
|
+
// 3) Append pw-self-heal + optional onnxruntime-node to package.json.
|
|
126
|
+
const pkgPath = path.join(repoRoot, "package.json");
|
|
127
|
+
if (await fs.pathExists(pkgPath)) {
|
|
128
|
+
try {
|
|
129
|
+
const pkgRaw = await fs.readFile(pkgPath, "utf8");
|
|
130
|
+
const pkg = JSON.parse(pkgRaw);
|
|
131
|
+
pkg.devDependencies ?? (pkg.devDependencies = {});
|
|
132
|
+
let mutated = false;
|
|
133
|
+
if (!pkg.devDependencies["@vijaypjavvadi/pw-self-heal"]) {
|
|
134
|
+
pkg.devDependencies["@vijaypjavvadi/pw-self-heal"] = "^1.1.2";
|
|
135
|
+
mutated = true;
|
|
136
|
+
}
|
|
137
|
+
// onnxruntime-node is required only for `ml` and `hybrid` modes.
|
|
138
|
+
// Emit it as optional so `mode: heuristic` users can drop it.
|
|
139
|
+
if ((mode === "ml" || mode === "hybrid") &&
|
|
140
|
+
!pkg.devDependencies["onnxruntime-node"]) {
|
|
141
|
+
pkg.devDependencies["onnxruntime-node"] = "^1.18.0";
|
|
142
|
+
mutated = true;
|
|
143
|
+
}
|
|
144
|
+
if (mutated) {
|
|
145
|
+
// Preserve trailing newline convention.
|
|
146
|
+
const trailer = pkgRaw.endsWith("\n") ? "\n" : "";
|
|
147
|
+
await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2) + trailer, "utf8");
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
warnings.push({
|
|
152
|
+
severity: "warn",
|
|
153
|
+
message: "Could not append @vijaypjavvadi/pw-self-heal to package.json — file was malformed. Add it manually: `npm i -D @vijaypjavvadi/pw-self-heal onnxruntime-node`.",
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Build the fixtures.ts contents.
|
|
160
|
+
*/
|
|
161
|
+
function renderPwSelfHealFixtures(mode) {
|
|
162
|
+
return [
|
|
163
|
+
"/**",
|
|
164
|
+
" * Generated by bdd2pw v4.3.0+ — self-healing test fixtures.",
|
|
165
|
+
" *",
|
|
166
|
+
" * Every scaffolded spec imports `test` and `expect` from this file",
|
|
167
|
+
" * instead of `@playwright/test` directly. `withSelfHealing()` wraps",
|
|
168
|
+
" * the base `test` so the `page` fixture heals broken locators at",
|
|
169
|
+
" * runtime — POM classes need zero changes.",
|
|
170
|
+
" *",
|
|
171
|
+
" * Ranker mode: " + JSON.stringify(mode) + " — override via",
|
|
172
|
+
" * `bdd2pw scaffold --self-healing-mode {heuristic|ml|hybrid}`.",
|
|
173
|
+
" *",
|
|
174
|
+
" * See https://www.npmjs.com/package/@vijaypjavvadi/pw-self-heal",
|
|
175
|
+
" */",
|
|
176
|
+
'import { test as base } from "@playwright/test";',
|
|
177
|
+
'import { withSelfHealing } from "@vijaypjavvadi/pw-self-heal";',
|
|
178
|
+
"",
|
|
179
|
+
"export const test = withSelfHealing(base, { mode: " +
|
|
180
|
+
JSON.stringify(mode) +
|
|
181
|
+
" });",
|
|
182
|
+
'export { expect } from "@playwright/test";',
|
|
183
|
+
"",
|
|
184
|
+
].join("\n");
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* v4.2 — legacy healing scaffold. Deprecated in v4.3, removed in v5.0.
|
|
188
|
+
*
|
|
80
189
|
* Add lib/heal.ts + tsconfig path alias + artefacts/.gitkeep when the
|
|
81
|
-
* scaffold is run with --self-healing. All three
|
|
190
|
+
* scaffold is run with --self-healing --legacy-healing. All three
|
|
191
|
+
* operations are idempotent.
|
|
82
192
|
*/
|
|
83
|
-
async function
|
|
193
|
+
async function emitLegacyHealingScaffold(repoRoot, filesWritten, warnings) {
|
|
84
194
|
// 1) Copy heal.ts template -> lib/heal.ts
|
|
85
195
|
// We resolve the template relative to this compiled module so it works
|
|
86
196
|
// both in dev (src/repo/projectScaffolder.ts -> ../../templates) and in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectScaffolder.js","sourceRoot":"","sources":["../../src/repo/projectScaffolder.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"projectScaffolder.js","sourceRoot":"","sources":["../../src/repo/projectScaffolder.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -219,6 +219,20 @@ export interface ScaffoldOptions {
|
|
|
219
219
|
* Default: false (purely additive minor bump).
|
|
220
220
|
*/
|
|
221
221
|
selfHealing?: boolean;
|
|
222
|
+
/**
|
|
223
|
+
* v4.3.0 — self-healing ranker mode passed through to
|
|
224
|
+
* `withSelfHealing({mode})` in the emitted `tests/fixtures.ts`.
|
|
225
|
+
* Ignored when `legacyHealing: true` or `selfHealing: false`.
|
|
226
|
+
* Default `hybrid` — the production default per pw-self-heal docs
|
|
227
|
+
* (0.4·heuristic + 0.6·ml, 68.63% HSR on their bench).
|
|
228
|
+
*/
|
|
229
|
+
selfHealingMode?: "heuristic" | "ml" | "hybrid";
|
|
230
|
+
/**
|
|
231
|
+
* v4.3.0 — keep emitting the v4.2 lib/heal.ts + external service
|
|
232
|
+
* shim instead of the pw-self-heal integration. Deprecated —
|
|
233
|
+
* removed in v5.0. Prints a warning in BDD_REVIEW.md.
|
|
234
|
+
*/
|
|
235
|
+
legacyHealing?: boolean;
|
|
222
236
|
/**
|
|
223
237
|
* v3.1.0 — opt-in instrumentation. See TestForge handoff Issue 4 and
|
|
224
238
|
* Issue 5.
|
|
@@ -334,12 +348,27 @@ export interface ScaffoldOptions {
|
|
|
334
348
|
/** type === "synthetic" only. Faker seed for reproducibility. Default 42. */
|
|
335
349
|
seed?: number;
|
|
336
350
|
};
|
|
351
|
+
/**
|
|
352
|
+
* v4.2.0 — treat DOM drift as an error. When true and re-scaffold
|
|
353
|
+
* detects that the accessibility tree of the target URL has changed
|
|
354
|
+
* since the previous run (POM header dom-hash mismatch), `scaffold()`
|
|
355
|
+
* returns `driftDetected: true` and the CLI exits with a non-zero
|
|
356
|
+
* code. Useful in CI to gate merges on silent UI regressions.
|
|
357
|
+
*/
|
|
358
|
+
failOnDrift?: boolean;
|
|
337
359
|
}
|
|
338
360
|
export interface ScaffoldResult {
|
|
339
361
|
filesWritten: string[];
|
|
340
362
|
reviewItems: ReviewItem[];
|
|
341
363
|
tscErrorCount: number;
|
|
342
364
|
reviewReportPath: string;
|
|
365
|
+
/**
|
|
366
|
+
* v4.2.0 — true iff the DOM snapshot hash differs from the one
|
|
367
|
+
* embedded in the existing POM. Independent of `failOnDrift` — the
|
|
368
|
+
* flag is always populated so callers can inspect drift status even
|
|
369
|
+
* without triggering an exit.
|
|
370
|
+
*/
|
|
371
|
+
driftDetected?: boolean;
|
|
343
372
|
}
|
|
344
373
|
export interface AnalyzeOptions {
|
|
345
374
|
feature: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vijaypjavvadi/bdd2pw",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"description": "Scaffold runnable Playwright TypeScript tests from Gherkin .feature files. Detects existing Page Objects, scans live pages via Microsoft Playwright MCP, emits POMs + specs, ready for execution. CLI + HTTP service. Optional governed LLM fallback (Anthropic / OpenAI / Gemini).",
|
|
5
5
|
"bin": {
|
|
6
6
|
"bdd2pw": "dist/cli.js"
|