@qa-gentic/stlc-agents 1.0.27 → 1.0.29
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/ARCHITECTURE-ADO.md +350 -0
- package/ARCHITECTURE-JIRA.md +203 -0
- package/QUICKSTART-ADO.md +400 -0
- package/QUICKSTART-JIRA.md +334 -0
- package/README.md +49 -0
- package/bin/postinstall.js +14 -4
- package/package.json +19 -7
- package/skills/migrate-framework/SKILL.md +207 -0
- package/src/stlc_agents/agent_migration/__init__.py +0 -0
- package/src/stlc_agents/agent_migration/_migrate.py +1398 -0
- package/src/stlc_agents/agent_migration/cli.py +217 -0
- package/src/stlc_agents/agent_migration/detector.py +81 -0
- package/src/stlc_agents/agent_migration/mapper.py +439 -0
- package/src/stlc_agents/agent_migration/reporter.py +86 -0
- package/src/stlc_agents/agent_migration/server.py +267 -0
- package/src/stlc_agents/agent_migration/transformer/__init__.py +0 -0
- package/src/stlc_agents/agent_migration/transformer/config_merger.py +513 -0
- package/src/stlc_agents/agent_migration/transformer/healer_injector.py +1143 -0
- package/src/stlc_agents/agent_migration/transformer/import_fixer.py +419 -0
- package/src/stlc_agents/agent_migration/transformer/js_to_ts.py +413 -0
- package/src/stlc_agents/agent_migration/transformer/local_var_hoister.py +378 -0
- package/src/stlc_agents/agent_migration/transformer/locator_moderniser.py +132 -0
- package/src/stlc_agents/agent_migration/transformer/locator_registrar.py +328 -0
- package/src/stlc_agents/agent_migration/transformer/spec_to_bdd.py +820 -0
- package/src/stlc_agents/agent_playwright_generator/server.py +926 -91
- package/src/stlc_agents/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_gherkin_generator/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_gherkin_generator/__pycache__/server.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_gherkin_generator/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_gherkin_generator/tools/__pycache__/ado_gherkin.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_helix_writer/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_helix_writer/__pycache__/server.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_helix_writer/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_helix_writer/tools/__pycache__/boilerplate.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_helix_writer/tools/__pycache__/helix_write.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_playwright_generator/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_playwright_generator/__pycache__/server.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_playwright_generator/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_playwright_generator/tools/__pycache__/ado_attach.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_test_case_manager/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_test_case_manager/__pycache__/server.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_test_case_manager/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/agent_test_case_manager/tools/__pycache__/ado_workitem.cpython-314.pyc +0 -0
- package/src/stlc_agents/shared/__pycache__/__init__.cpython-314.pyc +0 -0
- package/src/stlc_agents/shared/__pycache__/auth.cpython-314.pyc +0 -0
- package/src/stlc_agents/shared/__pycache__/cost_tracker.cpython-314.pyc +0 -0
- package/src/stlc_agents/shared/__pycache__/pricing.cpython-314.pyc +0 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Skill: migrate-framework
|
|
2
|
+
|
|
3
|
+
Migrate an existing Playwright test framework into the Helix-QA layout so every
|
|
4
|
+
QA STLC agent (qa-test-case-manager, qa-gherkin-generator, qa-playwright-generator,
|
|
5
|
+
qa-helix-writer, qa-jira-manager) can operate against it. The migration ships
|
|
6
|
+
self-healing locator infrastructure, an HTTP healing dashboard, agent skill
|
|
7
|
+
files, an `.mcp.json`, and every other asset the agents expect.
|
|
8
|
+
|
|
9
|
+
## When to use this skill
|
|
10
|
+
|
|
11
|
+
Trigger on any of:
|
|
12
|
+
- "migrate my Playwright tests"
|
|
13
|
+
- "convert existing tests to Helix"
|
|
14
|
+
- "migrate playwright+cucumber project"
|
|
15
|
+
- "bring old tests into the agent framework"
|
|
16
|
+
- "stlc-migrate", "qa-migration", "migrate_framework" tool names
|
|
17
|
+
|
|
18
|
+
## Supported source frameworks
|
|
19
|
+
|
|
20
|
+
| Framework | Detection |
|
|
21
|
+
|-----------|-----------|
|
|
22
|
+
| Plain Playwright JS | `playwright.config.js`, no `.feature` files |
|
|
23
|
+
| Plain Playwright TS | `playwright.config.ts`, no `.feature` files |
|
|
24
|
+
| Playwright + Cucumber JS | `playwright.config.js` + `.feature` files or `@cucumber/cucumber` in package.json |
|
|
25
|
+
| Playwright + Cucumber TS | `playwright.config.ts` + `.feature` files or `@cucumber/cucumber` in package.json |
|
|
26
|
+
|
|
27
|
+
## Step-by-step workflow
|
|
28
|
+
|
|
29
|
+
### Step 1 — Confirm source and target directories
|
|
30
|
+
|
|
31
|
+
Ask the user for:
|
|
32
|
+
- **Source directory** — root of the existing Playwright project (must exist)
|
|
33
|
+
- **Helix root** — root of the Helix-QA project to migrate into (must exist unless dry-run)
|
|
34
|
+
- **Integration** (optional) — `ado`, `jira`, or `both` (default `both`). Controls which agent skills + MCP entries get installed.
|
|
35
|
+
|
|
36
|
+
### Step 2 — Detect the framework
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
detect_framework(source_dir=<source>)
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Report back:
|
|
43
|
+
- `framework` — one of: `playwright-bdd-ts`, `playwright-bdd-js`, `playwright-ts`, `playwright-js`
|
|
44
|
+
- `language` — `typescript` or `javascript`
|
|
45
|
+
- `bdd` — whether BDD/Cucumber files were found
|
|
46
|
+
- `file_counts` — number of `.ts`, `.js`, `.feature` files found
|
|
47
|
+
|
|
48
|
+
### Step 3 — Preview the migration plan
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
preview_migration(source_dir=<source>, helix_root=<helix>)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Show the user:
|
|
55
|
+
- Total mappable files and their roles
|
|
56
|
+
- Any conflicts (files already existing in Helix)
|
|
57
|
+
- Files with unknown/unrecognised roles that will be skipped
|
|
58
|
+
|
|
59
|
+
Ask the user to confirm before proceeding if there are conflicts.
|
|
60
|
+
|
|
61
|
+
### Step 4 — Run the migration
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
migrate_framework(
|
|
65
|
+
source_dir=<source>,
|
|
66
|
+
helix_root=<helix>,
|
|
67
|
+
conflict_strategy="interactive", # "overwrite" | "skip" | "interactive"
|
|
68
|
+
integration="both", # "ado" | "jira" | "both"
|
|
69
|
+
dry_run=false,
|
|
70
|
+
)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The tool applies this pipeline to each file:
|
|
74
|
+
|
|
75
|
+
| Step | What happens |
|
|
76
|
+
|------|-------------|
|
|
77
|
+
| **JS → TS** | `require(...)` → `import`, `module.exports` → `export default`, async return types added |
|
|
78
|
+
| **Locator modernisation** | `[data-testid]` → `getByTestId`, `text=` → `getByText`, `[aria-label]` → `getByLabel`, `[placeholder]` → `getByPlaceholder`, `role=X[name=Y]` → `getByRole`. Complex XPath/CSS flagged with `// TODO`. **Multi-line string-concat selectors** (`"a" + "b"`) are registered as a single `{selector, intent, stability}` entry preserving the concatenation. |
|
|
79
|
+
| **Healer injection** | EVERY locator interaction (regardless of caller shape) is routed through `_healer.clickWithHealing` / `_healer.fillWithHealing` / `_healer.assertVisibleWithHealing`. Covered patterns: raw `page.click/fill`, chained `page.locator(X).click()`, custom wrappers (`base.waitAndClick`, `base.waitAndFill`, `*ByTestId` variants), non-awaited calls inside `Promise.all([...])`, `currentFixture.page.*` receivers, aliased references (`this.Elements.foo`, `const E = fooLocators`), inline class-field locator dictionaries (`private MassInviteElements = { ... }`), and dynamic selectors (auto-wrapped with `dyn.<prefix>.<n>` keys). Arguments are extracted by **balanced-paren scan** so calls like `fill(X, String(visitorCount))` extract the full second arg. |
|
|
80
|
+
| **Locator registration** | Every page-object constructor gets `Object.entries(xxxLocators).forEach(([k, v]) => { this._repo.register(\`xxxPage.${k}\`, ...); this._repo.register(k, ...); })` so the runtime store knows about every key. Registers under both **namespaced** and **bare** key conventions so legacy hand-written `_healer.<…>("usernameInput", …)` and freshly-emitted `_healer.<…>("loginPage.usernameInput", …)` both resolve. |
|
|
81
|
+
| **Import fixing** | Relative imports remapped to the **mapper's authoritative target paths** (no more "predicted" alias names that don't match what was actually written). Source-project `@pages/scweb/locators` → `@locators/locators.locators` exactly as the mapper renamed it. |
|
|
82
|
+
| **Spec → BDD** | See "Zero-inference guarantees" below. |
|
|
83
|
+
| **Config merge** | `playwright.config` settings merged. `cucumber.js` is rewritten with `dotenv/config` injected as the FIRST `requireModule` entry — so `.env` is loaded before any TS file is compiled. `package.json` gets `dotenv` runtime dep, `@types/*` companions for known JS-only deps (fs-extra, lodash, glob, mkdirp, rimraf, uuid, js-yaml, jsonwebtoken, module-alias, cookie, express, cors, node-fetch, minimist, yargs, semver), and two new scripts: `healix:dashboard` and `healix:review`. |
|
|
84
|
+
| **tsconfig merge** | Adds path aliases (`@pages`, `@steps`, `@features`, `@locators`, `@hooks`, `@helper`, `@utils`, `@config`). Does **not** fabricate `strict: true` / `strictNullChecks` — the source's strictness setting is preserved verbatim (introducing strictness the source didn't have would surface cascading errors on code that compiled fine before). |
|
|
85
|
+
|
|
86
|
+
#### Zero-inference guarantees for spec → BDD
|
|
87
|
+
|
|
88
|
+
The converter is intentionally **lossless** and **non-fabricating**:
|
|
89
|
+
|
|
90
|
+
- **No generic step text.** Step text is always the literal `test()` name (prefixed with the file slug for cross-file uniqueness). The tool does NOT invent `"I run step #N"`, `"I prepare state #N"`, or `"I execute if block #N"` text.
|
|
91
|
+
- **One step per test.** The full original body of each `test('name', body)` is placed inside a single step definition. No per-statement splitting; no Given/When/Then reclassification.
|
|
92
|
+
- **Hooks become real Cucumber hooks.** `test.beforeEach`/`afterEach`/`beforeAll`/`afterAll` → real `Before`/`After`/`BeforeAll`/`AfterAll`. `test.skip`/`only`/`fixme`/`fail`/`slow` modifiers → `@skip`/`@only`/… tags on the scenario.
|
|
93
|
+
- **Nothing is dropped.** Module-level helpers, suite-scope `let`/`const`/`var`, comments, and hook bodies are all preserved. `test.use(...)`/`test.step(...)` and other runner-only calls are commented out as `// MIGRATION TODO:` rather than silently removed.
|
|
94
|
+
- **Source bugs surface, not papered over.** If the original source references a non-existent property (e.g. `GlobalVars.Api.Username` when the class only exposes `username`), the migrated step keeps the original reference. `tsc` will flag it; the tool does not "fix" what it cannot verify.
|
|
95
|
+
- **Step text with `/`, `(`, `)`, `{`, `}`** is rendered as a RegExp step definition automatically so Cucumber Expression parsing doesn't reject the test name.
|
|
96
|
+
|
|
97
|
+
### Step 5 — Scaffold & assets installed automatically
|
|
98
|
+
|
|
99
|
+
In addition to file-by-file migration, the tool emits a complete agent-ready
|
|
100
|
+
tree:
|
|
101
|
+
|
|
102
|
+
| Asset | What it does |
|
|
103
|
+
|---|---|
|
|
104
|
+
| `src/utils/locators/LocatorHealer.ts` | 8-strategy healing chain: cached-healed → primary → **attribute** → **type-hint** → role → label → text → AI Vision. After each successful strategy, the matched element is introspected and the **specific stable selector** (data-testid > id > name > placeholder > aria-label > autocomplete > input[type]) is persisted — not the search union. Strategy order tunable via `HEAL_STRATEGY_ORDER` CSV. |
|
|
105
|
+
| `src/utils/locators/LocatorRepository.ts` | Heal store: schema v1 envelope (`{_version, _writtenAt, entries}`), heal-only persist filter (baseline-only entries don't get written), debounced writes (500ms), singleton process exit hook, read-modify-write merge for multi-instance safety, ENV-suffixed file path (`healed-locators.qa4.json` when ENV=qa4), capped `healingHistory` (default 50, env-tunable). |
|
|
106
|
+
| `src/utils/locators/TimingHealer.ts` / `VisualIntentChecker.ts` | Network-trace timing healer + visual-regression checker. |
|
|
107
|
+
| `src/utils/locators/HealingDashboard.ts` | Two-server HTTP UI. Primary at `HEALING_DASHBOARD_PORT` (default 7890) has Healed-locators + Pending-suggestions tables with Confirm/Revert / Approve/Reject buttons. Read-only mirror at `HEALIX_REVIEW_PORT` (opt-in, default 0). Auto-discovers all sibling heal-store files in the directory (so `healix:dashboard` without an ENV picks up `*.qa4.json` automatically). **Confirm on a healed entry writes the healed selector back to the locator `.ts` file** so the next run uses it as the primary. |
|
|
108
|
+
| `src/utils/locators/dashboard-server.ts` | Standalone launcher for the dashboard. Wired via `healix:dashboard` and `healix:review` npm scripts. |
|
|
109
|
+
| `src/utils/locators/{ElementContextHelper, HealApplicator, LocatorRules, LocatorStrategy, healix-ci-apply, review-server}.ts` | Filled from `agent_helix_writer.tools.boilerplate.BOILERPLATE` — purely additive infrastructure that integrates with the enhanced LocatorHealer. |
|
|
110
|
+
| `src/utils/helpers/{Logger, RetryHandler, WaitHelper}.ts` | Filled from BOILERPLATE — helpers the strategy layer depends on. |
|
|
111
|
+
| `src/config/environment.ts` | Filled from BOILERPLATE — referenced by Logger. |
|
|
112
|
+
| `src/locators/base.locators.ts` | Filled from BOILERPLATE — base locator file. |
|
|
113
|
+
| `.claude/skills/<name>/SKILL.md` + `.github/copilot-instructions/<name>.md` | Per-integration skill files (ado / jira / both). |
|
|
114
|
+
| `AGENT-BEHAVIOR.md` + `ORCHESTRATION_RULES.md` | Copied to project root, `.claude/`, and `.github/copilot-instructions/`. |
|
|
115
|
+
| `.mcp.json` | Auto-generated entries for every agent + Playwright MCP, with absolute binary paths. |
|
|
116
|
+
| `.env.example` | Documents every healing env var: `HEAL_STORE_PATH`, `HEAL_LOG_PATH`, `HEAL_LOG_DISABLED`, `ENABLE_LOCATOR_VERSIONING`, `HEAL_HISTORY_CAP`, `LOCATOR_TIMEOUT`, `LOCATOR_HEAL_ATTEMPTS`, `HEAL_STRATEGY_ORDER`, `HEALING_DASHBOARD_PORT`, `HEALIX_REVIEW_PORT`, `ENABLE_AI_HEALING`, `AI_HEALING_PROVIDER`, `AI_HEALING_API_KEY`, `ENV` / `HELIX_ENV`. |
|
|
117
|
+
|
|
118
|
+
### Step 6 — Review the migration report
|
|
119
|
+
|
|
120
|
+
The tool writes `MIGRATION-REPORT.md` to the Helix root. Report back to the user:
|
|
121
|
+
- Number of files written / skipped / conflicted
|
|
122
|
+
- TODO count (locators needing manual review)
|
|
123
|
+
- Path to `MIGRATION-REPORT.md`
|
|
124
|
+
|
|
125
|
+
### Step 7 — Post-migration steps (tell the user)
|
|
126
|
+
|
|
127
|
+
After migration, the user should:
|
|
128
|
+
|
|
129
|
+
1. `npm install` — picks up new deps (`dotenv`, `@types/fs-extra`, etc.).
|
|
130
|
+
2. `npx tsc --noEmit` — should be clean (any remaining errors are source bugs the migration preserved verbatim per the zero-inference contract).
|
|
131
|
+
3. Review `// TODO: convert to getByRole` comments in locator files (complex XPath/CSS the tool wouldn't auto-rewrite).
|
|
132
|
+
4. Fill in `.env` — at minimum, set `HEADLESS=false` if you want a visible browser.
|
|
133
|
+
5. Verify `inspect_helix_project` reports `framework_state: "present"` against the migrated tree.
|
|
134
|
+
6. Run the existing test suite (e.g. `npm test`) — healing fires automatically on broken primary selectors and writes to `self-heals/healed-locators[.<env>].json`.
|
|
135
|
+
7. Inspect heals visually:
|
|
136
|
+
- `npm run healix:dashboard` → http://localhost:7890 (full UI with Confirm / Revert)
|
|
137
|
+
- `npm run healix:review` → http://localhost:7891 (read-only mirror)
|
|
138
|
+
8. When ready, click **Confirm** on a heal — the migration rewrites the source locator file's `selector:` field with the verified healed value. Future runs use it as the primary; the healing chain only fires if the page changes again.
|
|
139
|
+
|
|
140
|
+
## Helix-QA file layout
|
|
141
|
+
|
|
142
|
+
| Source role | Helix target |
|
|
143
|
+
|-------------|-------------|
|
|
144
|
+
| Locators (`*Locators.ts`, `*selectors.ts`) | `src/locators/<kebab>.locators.ts` |
|
|
145
|
+
| Page objects (`*Page.ts`, `*.page.ts`) | `src/pages/<kebab>.page.ts` |
|
|
146
|
+
| Step definitions (`*.steps.ts`, `step_definitions/**`) | `src/test/steps/<kebab>.steps.ts` |
|
|
147
|
+
| Feature files (`*.feature`) | `src/test/features/<kebab>.feature` |
|
|
148
|
+
| Playwright config | `playwright.config.ts` (merged) |
|
|
149
|
+
| Cucumber config | `config/cucumber.js` (merged, with `dotenv/config` injected) |
|
|
150
|
+
| Heal-store JSON | `self-heals/healed-locators[.<env>].json` (heal-only) |
|
|
151
|
+
| Heal audit log | `self-heals/heal.log` (tab-separated `timestamp / key / strategy / selector`) |
|
|
152
|
+
|
|
153
|
+
## CLI usage (terminal)
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# Preview migration without writing
|
|
157
|
+
stlc-migrate --source ./my-old-tests --helix ./helix-qa --dry-run
|
|
158
|
+
|
|
159
|
+
# Full migration (interactive conflict handling, every agent reachable)
|
|
160
|
+
stlc-migrate --source ./my-old-tests --helix ./helix-qa
|
|
161
|
+
|
|
162
|
+
# ADO-only integration (no Jira skill / MCP entry)
|
|
163
|
+
stlc-migrate --source ./my-old-tests --helix ./helix-qa --integration ado
|
|
164
|
+
|
|
165
|
+
# Jira-only
|
|
166
|
+
stlc-migrate --source ./my-old-tests --helix ./helix-qa --integration jira
|
|
167
|
+
|
|
168
|
+
# Overwrite all existing files (refreshes scaffold + skill files)
|
|
169
|
+
stlc-migrate --source ./my-old-tests --helix ./helix-qa --conflict overwrite
|
|
170
|
+
|
|
171
|
+
# JSON output for scripting
|
|
172
|
+
stlc-migrate --source ./my-old-tests --helix ./helix-qa --json
|
|
173
|
+
|
|
174
|
+
# Makefile shortcut
|
|
175
|
+
make migrate-preview SOURCE=./my-old-tests HELIX=./helix-qa
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Runtime environment variables
|
|
179
|
+
|
|
180
|
+
Every knob has a sensible default. Override per-run in `.env` or via `cross-env` in npm scripts.
|
|
181
|
+
|
|
182
|
+
| Variable | Default | Effect |
|
|
183
|
+
|---|---|---|
|
|
184
|
+
| `HEAL_STORE_PATH` | `./self-heals/healed-locators.json` | Where the heal-store JSON is read/written. |
|
|
185
|
+
| `HEAL_LOG_PATH` | sibling `heal.log` | Tab-separated audit log per heal. |
|
|
186
|
+
| `HEAL_LOG_DISABLED` | `false` | Set `true` to skip the audit log. |
|
|
187
|
+
| `ENV` / `HELIX_ENV` | unset | When set, auto-suffixes the heal-store path: `healed-locators.qa4.json`. |
|
|
188
|
+
| `ENABLE_LOCATOR_VERSIONING` | `true` | When `false`, keeps only the latest heal entry (no `healingHistory[]` accumulation). |
|
|
189
|
+
| `HEAL_HISTORY_CAP` | `50` | Max heals retained per locator. `0` = unlimited. |
|
|
190
|
+
| `LOCATOR_TIMEOUT` | `3000` | Per-strategy attach-probe timeout (ms). |
|
|
191
|
+
| `LOCATOR_HEAL_ATTEMPTS` | `0` (unlimited) | Bound on the total number of probes before AI Vision fallback. |
|
|
192
|
+
| `HEAL_STRATEGY_ORDER` | `attribute,type-hint,role,label,text` | CSV — omit names to disable; reorder to prioritise. |
|
|
193
|
+
| `HEALING_DASHBOARD_PORT` | `7890` | Dashboard server port. `0` to disable. |
|
|
194
|
+
| `HEALIX_REVIEW_PORT` | `0` (disabled) | Read-only review server port (rejects POSTs with 403). |
|
|
195
|
+
| `ENABLE_AI_HEALING` | `true` | When `false`, AI Vision strategy is skipped. |
|
|
196
|
+
| `AI_HEALING_PROVIDER` | `anthropic` | One of `anthropic` / `copilot` / `claude-code`. |
|
|
197
|
+
| `AI_HEALING_API_KEY` (or `ANTHROPIC_API_KEY`) | unset | Required when AI Vision is enabled and primary fails. |
|
|
198
|
+
|
|
199
|
+
## Key rules
|
|
200
|
+
|
|
201
|
+
1. **Always run `preview_migration` first** — review the plan and conflicts before writing.
|
|
202
|
+
2. **Never infer conflict decisions** — ask the user whether to overwrite, skip, or abort.
|
|
203
|
+
3. **TODO comments are not errors** — complex locators flagged with `// TODO` are valid output; inform the user they need manual review.
|
|
204
|
+
4. **Feature files are copied as-is** — no Gherkin transformation is applied to `.feature` files during migration (the spec→BDD conversion is only for non-BDD `.spec.*` sources).
|
|
205
|
+
5. **BOILERPLATE fill is allowlisted** — `_BOILERPLATE_FILL_ALLOWLIST` in `_migrate.py` lists exactly which boilerplate entries are dropped in (the rest are held back because they assume APIs the enhanced scaffold doesn't expose).
|
|
206
|
+
6. **Config merge is non-destructive** — existing settings in Helix configs are never overwritten; only missing settings are added. `--conflict overwrite` refreshes `.mcp.json`, `.env.example`, generated scaffolds, and the cucumber config to pick up tool-side improvements.
|
|
207
|
+
7. **Healing scaffold takes precedence over BOILERPLATE** — the enhanced `LocatorHealer.ts` / `LocatorRepository.ts` / `TimingHealer.ts` / `VisualIntentChecker.ts` / `HealingDashboard.ts` are written first by `_scaffold_locator_repository`; the BOILERPLATE versions of the same files are never written.
|
|
File without changes
|