@tracelane/cli 0.1.0-alpha.11 → 0.1.0-alpha.13

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/README.md CHANGED
@@ -2,15 +2,17 @@
2
2
 
3
3
  # @tracelane/cli
4
4
 
5
- > The reporter for your WebdriverIO tests — Playwright and Cypress on the roadmap. Self-contained HTML for every run — replay failures, audit successes, attach to any bug tracker. No SaaS, no dashboard, no signup.
5
+ > The reporter for your WebdriverIO and Playwright tests — Cypress on the roadmap. Self-contained HTML for every run — replay failures, audit successes, attach to any bug tracker. No SaaS, no dashboard, no signup.
6
6
 
7
- One command to wire tracelane into your WebdriverIO project. Detects your runner + package manager, installs `@tracelane/wdio`, edits `wdio.conf.ts`, creates `tracelane-reports/`, ignores it in git. Idempotent and dry-runnable.
7
+ One command to wire tracelane into your WebdriverIO or Playwright project. Detects your runner + package manager, installs the right adapter (`@tracelane/wdio` / `@tracelane/playwright`), edits the runner config in place, creates `tracelane-reports/`, ignores it in git. Idempotent and dry-runnable.
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/@tracelane/cli.svg)](https://www.npmjs.com/package/@tracelane/cli)
10
10
  [![downloads](https://img.shields.io/npm/dw/@tracelane/cli.svg)](https://www.npmjs.com/package/@tracelane/cli)
11
11
  [![license](https://img.shields.io/npm/l/@tracelane/cli.svg)](https://github.com/Cubenest/rrweb-stack/blob/main/LICENSE)
12
12
  [![CI](https://github.com/Cubenest/rrweb-stack/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Cubenest/rrweb-stack/actions/workflows/ci.yml)
13
13
  [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Cubenest/rrweb-stack/badge)](https://scorecard.dev/viewer/?uri=github.com/Cubenest/rrweb-stack)
14
+ [![node](https://img.shields.io/node/v/@tracelane/cli.svg)](https://www.npmjs.com/package/@tracelane/cli)
15
+ ![status: alpha](https://img.shields.io/badge/status-alpha-orange.svg)
14
16
 
15
17
  ![tracelane init — one command](https://raw.githubusercontent.com/Cubenest/rrweb-stack/main/assets/tracelane-hero.gif)
16
18
 
@@ -23,14 +25,25 @@ npx @tracelane/cli init
23
25
 
24
26
  That's it. `npx @tracelane/cli init` does four things:
25
27
 
26
- 1. Detects WebdriverIO from `wdio.conf.{ts,js,mjs,cjs}` and your package manager from your lockfile.
27
- 2. Runs the package manager's dev-add for `@tracelane/wdio` (`pnpm add -D` / `yarn add -D` / `npm install --save-dev` / `bun add -d`).
28
- 3. Edits `wdio.conf.ts` in place: adds the `TraceLaneService` import and inserts the service tuple into the `services:` array.
28
+ 1. Detects your runner — WebdriverIO from `wdio.conf.{ts,js,mjs,cjs}` or Playwright from `playwright.config.{ts,js,mjs,cjs}` — and your package manager from your lockfile.
29
+ 2. Runs the package manager's dev-add for the matching adapter — `@tracelane/wdio` or `@tracelane/playwright` (`pnpm add -D` / `yarn add -D` / `npm install --save-dev` / `bun add -d`).
30
+ 3. Edits the runner config in place:
31
+ - **WebdriverIO** — adds the `TraceLaneService` import and inserts the service tuple into the `services:` array.
32
+ - **Playwright** — registers the `['@tracelane/playwright', { mode: 'failed' }]` entry in the `reporter` array.
29
33
  4. Creates `./tracelane-reports/` and appends `tracelane-reports/` to `.gitignore`.
30
34
 
31
- Run your tests. On a failing Chrome test you get `./tracelane-reports/<spec>--<title>.html` — open it in any browser, replay the run with [rrweb-player](https://www.rrweb.io), inspect console + failed-network panels, attach to any bug tracker.
35
+ Run your tests. On a failing test you get a self-contained `./tracelane-reports/…html` — open it in any browser, replay the run with [rrweb](https://www.rrweb.io), inspect console + failed-network panels, attach to any bug tracker.
32
36
 
33
- See the [@tracelane/wdio README](https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-wdio) for the full options reference.
37
+ > **Playwright one-time follow-up.** The Playwright recording is driven by tracelane's test **fixture**, and the CLI can't safely rewrite every spec file. After `init`, change your spec imports yourself (recording is then automatic — nothing per-test):
38
+ >
39
+ > ```diff
40
+ > - import { test, expect } from '@playwright/test';
41
+ > + import { test, expect } from '@tracelane/playwright/fixture';
42
+ > ```
43
+ >
44
+ > `init` prints this reminder when it finishes.
45
+
46
+ See the [@tracelane/wdio README](https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-wdio) and the [@tracelane/playwright README](https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-playwright) for the full options reference.
34
47
 
35
48
  ## Usage
36
49
 
@@ -43,7 +56,7 @@ Options:
43
56
  --dry-run Print what would happen; change nothing.
44
57
  --yes, -y Skip the "about to do X, Y, Z - continue?" prompt.
45
58
  --skip-install Don't run the package-manager install command.
46
- Useful if you have @tracelane/wdio already.
59
+ Useful if you already have the adapter installed.
47
60
  --help, -h Show usage.
48
61
  ```
49
62
 
@@ -51,22 +64,21 @@ Options:
51
64
 
52
65
  ## What this is NOT
53
66
 
54
- - Not a test runner. tracelane wires itself **into** WebdriverIO; you keep using `npx wdio run wdio.conf.ts` (or whatever runner you have today).
67
+ - Not a test runner. tracelane wires itself **into** WebdriverIO / Playwright; you keep using `npx wdio run wdio.conf.ts` or `npx playwright test`.
55
68
  - Not a SaaS or cloud uploader. The artifact is a single HTML file on your filesystem.
56
69
  - Not coupled to the GitHub repo. The CLI only reads + writes files in the directory you ran it from.
57
70
 
58
- ## Playwright and Cypress
71
+ ## Cypress
59
72
 
60
- Detection works, but the v0.1 CLI exits 0 with a "coming Q3/Q4 2026" message for these. The integration packages (`@tracelane/playwright`, `@tracelane/cypress`) aren't published yet when they are, a future bump to `@tracelane/cli` will add the wiring. Progress is [tracked on the issues board](https://github.com/Cubenest/rrweb-stack/issues):
73
+ Cypress detection works, but the CLI exits 0 with a "not yet supported" message the `@tracelane/cypress` adapter hasn't been published. When it is, a future bump to `@tracelane/cli` will add the wiring. Progress is [tracked on the issues board](https://github.com/Cubenest/rrweb-stack/issues).
61
74
 
62
- - Playwright — target Q3 2026
63
- - Cypress — target Q4 2026
75
+ If you have a `wdio.conf.*` and a `playwright.config.*` (and/or a `cypress.config.*`) side by side, detection picks the most-mature match in priority order WDIO > Playwright > Cypress pass `--runner playwright` (etc.) to override.
64
76
 
65
- If you have a `wdio.conf.*` alongside a Playwright/Cypress conf, the WDIO path wins by default pass `--runner playwright` or `--runner cypress` to override (it'll still print the coming-soon message).
77
+ ## How the config edit works (and what to do if it fails)
66
78
 
67
- ## How the conf edit works (and what to do if it fails)
79
+ For **Playwright**, the editor registers `['@tracelane/playwright', { mode: 'failed' }]` in the `reporter` array of your `playwright.config.*` — creating the array if there isn't one, appending if there is, idempotent on re-run. It does **not** touch your spec files: the second half of the Playwright wiring (swapping the test import to `@tracelane/playwright/fixture`) is a one-time manual step `init` reminds you to do.
68
80
 
69
- The editor uses string-based regex to:
81
+ For **WebdriverIO**, the editor uses string-based regex to:
70
82
 
71
83
  1. Insert `import TraceLaneService from '@tracelane/wdio';` after the last existing `import` line.
72
84
  2. Append `[TraceLaneService, { mode: 'failed' }]` as the LAST element of the `services:` array. Three shapes are recognized:
@@ -105,8 +117,12 @@ Both routes produce the same setup. The CLI exists to remove the "edit wdio.conf
105
117
 
106
118
  Semantic Versioning. Currently `0.1.0-alpha.x` (pre-release; the API + flags may shift before `1.0.0`).
107
119
 
120
+ **Requires Node.js >= 22.**
121
+
108
122
  **No telemetry.** The CLI inspects local files only (lockfile presence, conf shape) and spawns the package-manager process you'd have run by hand. Nothing is sent anywhere.
109
123
 
110
124
  ## License
111
125
 
112
126
  Apache 2.0. Contributions accepted under the [Developer Certificate of Origin (DCO)](https://developercertificate.org/) — sign commits with `git commit -s`. See [CONTRIBUTING.md](https://github.com/Cubenest/rrweb-stack/blob/main/CONTRIBUTING.md) + [SECURITY.md](https://github.com/Cubenest/rrweb-stack/blob/main/SECURITY.md).
127
+
128
+ Full release history: [CHANGELOG.md](https://github.com/Cubenest/rrweb-stack/blob/main/packages/tracelane-cli/CHANGELOG.md).
@@ -35,7 +35,7 @@ export interface InitOptions {
35
35
  */
36
36
  export declare function runInitProgrammatic(opts: InitOptions): Promise<number>;
37
37
  /** Help text for `tracelane init --help`. */
38
- export declare const INIT_HELP = "tracelane init - wire @tracelane/wdio into the project in this directory.\n\nUsage: npx @tracelane/cli init [options] (one-off; recommended)\n tracelane init [options] (after 'npm i -D @tracelane/cli')\n\nOptions:\n --runner <name> Force runner choice (wdio|playwright|cypress).\n Default: auto-detected from project files.\n --dry-run Print what would happen; change nothing.\n --yes, -y Skip the \"about to do X, Y, Z - continue?\" prompt.\n --skip-install Don't run the package-manager install command.\n Useful if you have @tracelane/wdio already.\n --help, -h Show this help.\n\nThe CLI scans the current working directory for a wdio.conf.{ts,js,mjs,cjs},\nadds @tracelane/wdio as a devDependency via the detected package manager\n(pnpm/yarn/npm/bun), inserts the import + service tuple into the conf, creates\n./tracelane-reports/, and appends to .gitignore. Idempotent: re-running on an\nalready-wired project is a no-op.\n\nAuto-edit limitation: the conf editor uses string regex to insert into the\nservices array. If it can't recognise the array shape it BACKS OUT cleanly\nand prints the snippet to paste manually - it will NEVER corrupt your conf.\n";
38
+ export declare const INIT_HELP = "tracelane init - wire tracelane into the test project in this directory.\n\nUsage: npx @tracelane/cli init [options] (one-off; recommended)\n tracelane init [options] (after 'npm i -D @tracelane/cli')\n\nOptions:\n --runner <name> Force runner choice (wdio|playwright|cypress).\n Default: auto-detected from project files.\n --dry-run Print what would happen; change nothing.\n --yes, -y Skip the \"about to do X, Y, Z - continue?\" prompt.\n --skip-install Don't run the package-manager install command.\n Useful if you already have the adapter installed.\n --help, -h Show this help.\n\nThe CLI scans the current working directory for a runner config:\n\n WebdriverIO wdio.conf.{ts,js,mjs,cjs} adds @tracelane/wdio,\n inserts the service tuple\n Playwright playwright.config.{ts,js,mjs,cjs} adds @tracelane/playwright,\n registers the reporter\n Cypress cypress.config.* detected, not yet supported\n\nIt adds the adapter as a devDependency via the detected package manager\n(pnpm/yarn/npm/bun), edits the config, creates ./tracelane-reports/, and\nappends to .gitignore. Idempotent: re-running on an already-wired project is a\nno-op.\n\nPlaywright also needs a one-time manual step the CLI can't do for you: change\nyour spec imports to tracelane's fixture --\n import { test, expect } from '@tracelane/playwright/fixture';\ninit prints this reminder after it finishes.\n\nAuto-edit limitation: the editors use string regex to insert into the\nservices / reporter array. If they can't recognise the shape they BACK OUT\ncleanly and print the snippet to paste manually - they NEVER corrupt your config.\n";
39
39
  /**
40
40
  * Argv entry for `tracelane init`. Parses flags via node:util.parseArgs and
41
41
  * delegates to runInitProgrammatic.
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAC;AAWtE,OAAO,EAGL,KAAK,MAAM,EAKZ,MAAM,kBAAkB,CAAC;AAQ1B,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KACzE,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAK9B,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;CAC9B;AAiFD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA+L5E;AAuFD,6CAA6C;AAC7C,eAAO,MAAM,SAAS,6vCAuBrB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDtE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAC;AAWtE,OAAO,EAGL,KAAK,MAAM,EAKZ,MAAM,kBAAkB,CAAC;AAmB1B,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,KACzE,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAK9B,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,2CAA2C;IAC3C,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;CAC9B;AAoFD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyO5E;AAgJD,6CAA6C;AAC7C,eAAO,MAAM,SAAS,k0DAmCrB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDtE"}
@@ -6,8 +6,12 @@
6
6
  // 2. Detect package manager from lockfile presence.
7
7
  // 3. For WDIO: ask, then install @tracelane/wdio + edit conf + mkdir
8
8
  // ./tracelane-reports/ + append to .gitignore.
9
- // 4. For Playwright/Cypress: print "support coming Q3/Q4 2026" + a tracking
10
- // issue link, install nothing, exit 0.
9
+ // 4. For Playwright: ask, then install @tracelane/playwright + register the
10
+ // reporter in playwright.config + mkdir ./tracelane-reports/ + append to
11
+ // .gitignore + print the fixture-import follow-up the user must apply by
12
+ // hand (the CLI can't safely rewrite every spec file).
13
+ // 5. For Cypress: print "not yet supported" + a tracking issue link, install
14
+ // nothing, exit 0 (the @tracelane/cypress adapter isn't published yet).
11
15
  //
12
16
  // Side effects (mkdirSync, writeFileSync, the package-manager spawn) are
13
17
  // gated behind --dry-run and an interactive confirm prompt (suppressed by
@@ -19,8 +23,14 @@ import { join } from 'node:path';
19
23
  import { parseArgs } from 'node:util';
20
24
  import { detectPackageManager, detectRunner, findRunnerConfig, installCommand, } from '../lib/detect.js';
21
25
  import { hasTracelaneEntry, mergeGitignore } from '../lib/gitignore.js';
26
+ import { FIXTURE_IMPORT_FOLLOWUP, MANUAL_SNIPPET as PLAYWRIGHT_MANUAL_SNIPPET, applyPlaywrightEdit, } from '../lib/playwright-editor.js';
22
27
  import { confirm } from '../lib/prompt.js';
23
28
  import { MANUAL_SNIPPET, applyWdioEdit } from '../lib/wdio-editor.js';
29
+ /** The npm package that provides each runner's tracelane adapter. */
30
+ const RUNNER_PACKAGE = {
31
+ wdio: '@tracelane/wdio',
32
+ playwright: '@tracelane/playwright',
33
+ };
24
34
  /** Issues board for tracking the not-yet-shipped Playwright/Cypress paths. */
25
35
  const ISSUES_BOARD = 'https://github.com/Cubenest/rrweb-stack/issues';
26
36
  const realSpawn = (program, args, options) => spawnSync(program, args, options);
@@ -42,12 +52,14 @@ function describeSteps(detected, pm, options) {
42
52
  if (!options.skipInstall) {
43
53
  steps.push({
44
54
  index: i++,
45
- description: commandString(installCommand(pm.manager)),
55
+ description: commandString(installCommand(pm.manager, options.pkg)),
46
56
  });
47
57
  }
48
58
  steps.push({
49
59
  index: i++,
50
- description: `Edit ${basename(detected.configPath)} to register the Service`,
60
+ description: detected.runner === 'playwright'
61
+ ? `Edit ${basename(detected.configPath)} to register the tracelane reporter`
62
+ : `Edit ${basename(detected.configPath)} to register the Service`,
51
63
  });
52
64
  steps.push({ index: i++, description: 'Create ./tracelane-reports/' });
53
65
  steps.push({
@@ -63,20 +75,20 @@ function basename(p) {
63
75
  return p.split(/[/\\]/).pop() ?? p;
64
76
  }
65
77
  /**
66
- * Print the not-yet-supported message for Playwright / Cypress. Exits 0
67
- * (no error — the user has a valid project, we just don't have wiring yet).
78
+ * Print the not-yet-supported message for Cypress. Exits 0 (no error — the
79
+ * user has a valid project, the @tracelane/cypress adapter just isn't published
80
+ * yet, so there's nothing to wire).
68
81
  */
69
- function printComingSoon(detected, stdout) {
70
- const runnerLabel = detected.runner === 'playwright' ? 'Playwright' : 'Cypress';
71
- const target = detected.runner === 'playwright' ? 'Q3 2026' : 'Q4 2026';
82
+ function printCypressUnsupported(detected, stdout) {
72
83
  write(stdout, [
73
- `tracelane init - detected ${runnerLabel} project (${basename(detected.configPath)}).`,
84
+ `tracelane init - detected Cypress project (${basename(detected.configPath)}).`,
74
85
  '',
75
- `tracelane ${runnerLabel} support is in development; target ship ${target}.`,
86
+ 'Cypress is not yet supported: the @tracelane/cypress adapter has not been',
87
+ 'published. WebdriverIO and Playwright are wired today.',
76
88
  `Track progress: ${ISSUES_BOARD}`,
77
89
  '',
78
- 'To use tracelane today, add a WebdriverIO suite, or pass --runner wdio',
79
- 'if your project already has a wdio.conf.*.',
90
+ 'To use tracelane now, run it against a WebdriverIO or Playwright suite',
91
+ '(pass --runner wdio / --runner playwright if your project has both).',
80
92
  '',
81
93
  ].join('\n'));
82
94
  return 0;
@@ -101,9 +113,9 @@ export async function runInitProgrammatic(opts) {
101
113
  // editor has something to point at.
102
114
  const configPath = findRunnerConfig(cwd, opts.runner);
103
115
  if (configPath === undefined) {
104
- // For WDIO we need a config file. For Playwright/Cypress the no-op
105
- // print doesn't strictly need one but the user asked us to pretend,
106
- // so be explicit.
116
+ // WDIO + Playwright need a config file to edit; Cypress needs one to
117
+ // confirm the project shape before printing the not-yet-supported note.
118
+ // Either way, a missing config for the forced runner is a hard error.
107
119
  writeErr(stderr, `tracelane init: --runner ${opts.runner} was passed, but no matching config file found in ${cwd}.\n`);
108
120
  return 1;
109
121
  }
@@ -117,22 +129,28 @@ export async function runInitProgrammatic(opts) {
117
129
  }
118
130
  }
119
131
  // ---- Runner-specific routing ------------------------------------------
120
- if (detected.runner !== 'wdio') {
121
- return printComingSoon(detected, stdout);
132
+ // Cypress is detected but not yet wired (adapter unpublished).
133
+ if (detected.runner === 'cypress') {
134
+ return printCypressUnsupported(detected, stdout);
122
135
  }
123
- // ---- WDIO happy path --------------------------------------------------
136
+ // WDIO + Playwright share the same scaffold flow; the per-runner details
137
+ // (install package, config editor, success CTA, fixture follow-up) are
138
+ // captured below.
139
+ const runner = detected.runner;
140
+ const pkg = RUNNER_PACKAGE[runner];
141
+ const runnerLabel = runner === 'playwright' ? 'Playwright' : 'WebdriverIO';
124
142
  const pm = detectPackageManager(cwd);
125
143
  const gitignorePath = join(cwd, '.gitignore');
126
144
  const gitignoreExists = existsSync(gitignorePath);
127
145
  const skipInstall = opts.skipInstall ?? false;
128
- write(stdout, `tracelane init - detected WebdriverIO project (${basename(detected.configPath)}) using ${pm.manager}.\n\n`);
146
+ write(stdout, `tracelane init - detected ${runnerLabel} project (${basename(detected.configPath)}) using ${pm.manager}.\n\n`);
129
147
  if (pm.multipleLockfiles) {
130
148
  write(stdout, `Note: multiple lockfiles detected (${pm.lockfilesFound.join(', ')}); using ${pm.manager}.\n\n`);
131
149
  }
132
150
  if (pm.fallback) {
133
151
  write(stdout, 'Note: no lockfile detected; defaulting to npm.\n\n');
134
152
  }
135
- const steps = describeSteps(detected, pm, { skipInstall, gitignoreExists });
153
+ const steps = describeSteps(detected, pm, { skipInstall, gitignoreExists, pkg });
136
154
  write(stdout, opts.dryRun ? 'DRY RUN — would do:\n' : 'About to:\n');
137
155
  for (const s of steps) {
138
156
  write(stdout, ` ${s.index}. ${opts.dryRun ? 'WOULD: ' : ''}${s.description}\n`);
@@ -140,9 +158,14 @@ export async function runInitProgrammatic(opts) {
140
158
  write(stdout, '\n');
141
159
  if (opts.dryRun) {
142
160
  // Show the conf-edit preview without writing.
143
- const preview = previewConfEdit(detected.configPath);
161
+ const preview = runner === 'playwright'
162
+ ? previewPlaywrightEdit(detected.configPath)
163
+ : previewConfEdit(detected.configPath);
144
164
  if (preview !== undefined)
145
165
  write(stdout, preview);
166
+ if (runner === 'playwright') {
167
+ write(stdout, `Manual follow-up after init:\n${FIXTURE_IMPORT_FOLLOWUP}\n\n`);
168
+ }
146
169
  write(stdout, 'Dry run complete; no files changed.\n');
147
170
  return 0;
148
171
  }
@@ -155,7 +178,7 @@ export async function runInitProgrammatic(opts) {
155
178
  }
156
179
  // ---- Execute the steps ------------------------------------------------
157
180
  if (!skipInstall) {
158
- const cmd = installCommand(pm.manager);
181
+ const cmd = installCommand(pm.manager, pkg);
159
182
  const [program, ...args] = cmd;
160
183
  if (program === undefined) {
161
184
  writeErr(stderr, 'tracelane init: empty install command (internal error).\n');
@@ -168,15 +191,17 @@ export async function runInitProgrammatic(opts) {
168
191
  return 1;
169
192
  }
170
193
  if (result.status !== 0) {
171
- writeErr(stderr, `tracelane init: install exited with code ${result.status}. Re-run with --skip-install once you've added @tracelane/wdio manually.\n`);
194
+ writeErr(stderr, `tracelane init: install exited with code ${result.status}. Re-run with --skip-install once you've added ${pkg} manually.\n`);
172
195
  return 1;
173
196
  }
174
197
  write(stdout, '\n');
175
198
  }
176
- // Edit the wdio.conf.* in place. Back-out path keeps a one-shot .backup
177
- // next to the conf so the user can restore on their own if anything
199
+ // Edit the runner config in place. Back-out path keeps a one-shot .backup
200
+ // next to the config so the user can restore on their own if anything
178
201
  // looks wrong after the run.
179
- const editOutcome = editWdioConfOnDisk(detected.configPath);
202
+ const editOutcome = runner === 'playwright'
203
+ ? editPlaywrightConfigOnDisk(detected.configPath)
204
+ : editWdioConfOnDisk(detected.configPath);
180
205
  if (editOutcome.kind === 'manual') {
181
206
  write(stdout, [
182
207
  `! Could not auto-edit ${basename(detected.configPath)}: ${editOutcome.reason}`,
@@ -199,7 +224,9 @@ export async function runInitProgrammatic(opts) {
199
224
  ].join('\n'));
200
225
  }
201
226
  else if (editOutcome.kind === 'alreadyConfigured') {
202
- write(stdout, `* ${basename(detected.configPath)} already wires TraceLaneService; left it alone.\n`);
227
+ write(stdout, runner === 'playwright'
228
+ ? `* ${basename(detected.configPath)} already registers the @tracelane/playwright reporter; left it alone.\n`
229
+ : `* ${basename(detected.configPath)} already wires TraceLaneService; left it alone.\n`);
203
230
  }
204
231
  else {
205
232
  write(stdout, `+ Edited ${basename(detected.configPath)}.\n`);
@@ -227,16 +254,39 @@ export async function runInitProgrammatic(opts) {
227
254
  // copy-paste-ready command so the user knows exactly what to run, with
228
255
  // the conf filename matching what we detected (handles .js/.mjs/.cjs).
229
256
  const ok = process.stdout.isTTY ? '✔' : 'OK';
230
- write(stdout, [
231
- '',
232
- `${ok} done.`,
233
- `Run: npx wdio run ${basename(detected.configPath)}`,
234
- 'On a failing Chrome test you get',
235
- './tracelane-reports/<spec>--<title>.html — open it in any browser.',
236
- '',
237
- 'Docs: https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-wdio',
238
- '',
239
- ].join('\n'));
257
+ if (runner === 'playwright') {
258
+ // Playwright needs a SECOND, manual edit the CLI can't do safely: every
259
+ // spec must import tracelane's fixture instead of @playwright/test. Print
260
+ // it prominently so the user doesn't miss it.
261
+ write(stdout, [
262
+ '',
263
+ `${ok} reporter registered.`,
264
+ '',
265
+ "ONE MANUAL STEP LEFT — the recording is driven by tracelane's test fixture,",
266
+ "which the CLI can't safely add to your spec files for you:",
267
+ '',
268
+ ...FIXTURE_IMPORT_FOLLOWUP.split('\n').map((l) => ` ${l}`),
269
+ '',
270
+ 'Then run your suite: npx playwright test',
271
+ 'On a failing test you get',
272
+ './tracelane-reports/<spec>--<title>--<project>-<ts>.html — open it in any browser.',
273
+ '',
274
+ 'Docs: https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-playwright',
275
+ '',
276
+ ].join('\n'));
277
+ }
278
+ else {
279
+ write(stdout, [
280
+ '',
281
+ `${ok} done.`,
282
+ `Run: npx wdio run ${basename(detected.configPath)}`,
283
+ 'On a failing Chrome test you get',
284
+ './tracelane-reports/<spec>--<title>.html — open it in any browser.',
285
+ '',
286
+ 'Docs: https://github.com/Cubenest/rrweb-stack/tree/main/packages/tracelane-wdio',
287
+ '',
288
+ ].join('\n'));
289
+ }
240
290
  return 0;
241
291
  }
242
292
  function editWdioConfOnDisk(configPath) {
@@ -306,8 +356,65 @@ function previewConfEdit(configPath) {
306
356
  : '';
307
357
  return `Conf edit preview (${basename(configPath)}):\n${importLine}${entryLine}\n`;
308
358
  }
359
+ /**
360
+ * Playwright analogue of `editWdioConfOnDisk`. Reads the playwright.config,
361
+ * registers the tracelane reporter, and on success writes the new content
362
+ * back with the same backup/sanity-check/restore discipline. On a clean
363
+ * back-out (unrecognised config shape) the file on disk is untouched.
364
+ */
365
+ function editPlaywrightConfigOnDisk(configPath) {
366
+ const original = readFileSync(configPath, 'utf8');
367
+ const result = applyPlaywrightEdit(original);
368
+ if (!result.ok) {
369
+ return { kind: 'manual', reason: result.reason, snippet: result.manualSnippet };
370
+ }
371
+ if (result.alreadyConfigured) {
372
+ return { kind: 'alreadyConfigured' };
373
+ }
374
+ const backupPath = `${configPath}.tracelane-init.backup`;
375
+ writeFileSync(backupPath, original, 'utf8');
376
+ writeFileSync(configPath, result.source, 'utf8');
377
+ const verifyContent = readFileSync(configPath, 'utf8');
378
+ if (verifyContent !== result.source) {
379
+ renameSync(backupPath, configPath);
380
+ return {
381
+ kind: 'restored',
382
+ reason: 'post-write read-back did not match expected content',
383
+ snippet: PLAYWRIGHT_MANUAL_SNIPPET,
384
+ backupPath,
385
+ };
386
+ }
387
+ try {
388
+ unlinkSync(backupPath);
389
+ }
390
+ catch {
391
+ // Non-fatal; the leftover .backup is harmless.
392
+ }
393
+ return { kind: 'edited' };
394
+ }
395
+ /** Build the WOULD-BE preview shown by --dry-run for a Playwright config. */
396
+ function previewPlaywrightEdit(configPath) {
397
+ let original;
398
+ try {
399
+ original = readFileSync(configPath, 'utf8');
400
+ }
401
+ catch {
402
+ return undefined;
403
+ }
404
+ const result = applyPlaywrightEdit(original);
405
+ if (!result.ok) {
406
+ return `Would back out of config edit: ${result.reason}\n Manual snippet:\n${result.manualSnippet
407
+ .split('\n')
408
+ .map((l) => ` ${l}`)
409
+ .join('\n')}\n\n`;
410
+ }
411
+ if (result.alreadyConfigured) {
412
+ return `Would leave ${basename(configPath)} alone (already registers the @tracelane/playwright reporter).\n\n`;
413
+ }
414
+ return `Config edit preview (${basename(configPath)}):\n+ reporter: [..., ['@tracelane/playwright', { mode: 'failed' }]]\n\n`;
415
+ }
309
416
  /** Help text for `tracelane init --help`. */
310
- export const INIT_HELP = `tracelane init - wire @tracelane/wdio into the project in this directory.
417
+ export const INIT_HELP = `tracelane init - wire tracelane into the test project in this directory.
311
418
 
312
419
  Usage: npx @tracelane/cli init [options] (one-off; recommended)
313
420
  tracelane init [options] (after 'npm i -D @tracelane/cli')
@@ -318,18 +425,30 @@ Options:
318
425
  --dry-run Print what would happen; change nothing.
319
426
  --yes, -y Skip the "about to do X, Y, Z - continue?" prompt.
320
427
  --skip-install Don't run the package-manager install command.
321
- Useful if you have @tracelane/wdio already.
428
+ Useful if you already have the adapter installed.
322
429
  --help, -h Show this help.
323
430
 
324
- The CLI scans the current working directory for a wdio.conf.{ts,js,mjs,cjs},
325
- adds @tracelane/wdio as a devDependency via the detected package manager
326
- (pnpm/yarn/npm/bun), inserts the import + service tuple into the conf, creates
327
- ./tracelane-reports/, and appends to .gitignore. Idempotent: re-running on an
328
- already-wired project is a no-op.
431
+ The CLI scans the current working directory for a runner config:
432
+
433
+ WebdriverIO wdio.conf.{ts,js,mjs,cjs} adds @tracelane/wdio,
434
+ inserts the service tuple
435
+ Playwright playwright.config.{ts,js,mjs,cjs} adds @tracelane/playwright,
436
+ registers the reporter
437
+ Cypress cypress.config.* detected, not yet supported
438
+
439
+ It adds the adapter as a devDependency via the detected package manager
440
+ (pnpm/yarn/npm/bun), edits the config, creates ./tracelane-reports/, and
441
+ appends to .gitignore. Idempotent: re-running on an already-wired project is a
442
+ no-op.
443
+
444
+ Playwright also needs a one-time manual step the CLI can't do for you: change
445
+ your spec imports to tracelane's fixture --
446
+ import { test, expect } from '@tracelane/playwright/fixture';
447
+ init prints this reminder after it finishes.
329
448
 
330
- Auto-edit limitation: the conf editor uses string regex to insert into the
331
- services array. If it can't recognise the array shape it BACKS OUT cleanly
332
- and prints the snippet to paste manually - it will NEVER corrupt your conf.
449
+ Auto-edit limitation: the editors use string regex to insert into the
450
+ services / reporter array. If they can't recognise the shape they BACK OUT
451
+ cleanly and print the snippet to paste manually - they NEVER corrupt your config.
333
452
  `;
334
453
  /**
335
454
  * Argv entry for `tracelane init`. Parses flags via node:util.parseArgs and
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,gEAAgE;AAChE,EAAE;AACF,SAAS;AACT,4DAA4D;AAC5D,sDAAsD;AACtD,uEAAuE;AACvE,oDAAoD;AACpD,8EAA8E;AAC9E,4CAA4C;AAC5C,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AACzE,qBAAqB;AAErB,OAAO,EAAyB,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAIL,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtE,8EAA8E;AAC9E,MAAM,YAAY,GAAG,gDAAgD,CAAC;AAStE,MAAM,SAAS,GAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CACxD,SAAS,CAAC,OAAO,EAAE,IAAgB,EAAE,OAAO,CAAC,CAAC;AAsBhD,mEAAmE;AACnE,SAAS,KAAK,CAAC,CAAoC,EAAE,GAAW;IAC9D,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,sBAAsB;AACtB,SAAS,QAAQ,CAAC,CAAoC,EAAE,GAAW;IACjE,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,qEAAqE;AACrE,SAAS,aAAa,CAAC,GAAsB;IAC3C,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvB,CAAC;AAQD,SAAS,aAAa,CACpB,QAAwB,EACxB,EAA0B,EAC1B,OAA2D;IAE3D,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC;YACT,KAAK,EAAE,CAAC,EAAE;YACV,WAAW,EAAE,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;SACvD,CAAC,CAAC;IACL,CAAC;IACD,KAAK,CAAC,IAAI,CAAC;QACT,KAAK,EAAE,CAAC,EAAE;QACV,WAAW,EAAE,QAAQ,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,0BAA0B;KAC7E,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC;QACT,KAAK,EAAE,CAAC,EAAE;QACV,WAAW,EAAE,OAAO,CAAC,eAAe;YAClC,CAAC,CAAC,yCAAyC;YAC3C,CAAC,CAAC,2CAA2C;KAChD,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6EAA6E;AAC7E,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CACtB,QAAwB,EACxB,MAAyC;IAEzC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,KAAK,CACH,MAAM,EACN;QACE,6BAA6B,WAAW,aAAa,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;QACtF,EAAE;QACF,aAAa,WAAW,2CAA2C,MAAM,GAAG;QAC5E,mBAAmB,YAAY,EAAE;QACjC,EAAE;QACF,wEAAwE;QACxE,4CAA4C;QAC5C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAiB;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IAErB,2EAA2E;IAE3E,IAAI,QAAoC,CAAC;IACzC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,wEAAwE;QACxE,oCAAoC;QACpC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,mEAAmE;YACnE,sEAAsE;YACtE,kBAAkB;YAClB,QAAQ,CACN,MAAM,EACN,4BAA4B,IAAI,CAAC,MAAM,qDAAqD,GAAG,KAAK,CACrG,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,QAAQ,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CACN,MAAM,EACN,wDAAwD,GAAG,uEAAuE,CACnI,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,0EAA0E;IAE1E,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,0EAA0E;IAE1E,MAAM,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC;IAE9C,KAAK,CACH,MAAM,EACN,kDAAkD,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,OAAO,CAC5G,CAAC;IAEF,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACzB,KAAK,CACH,MAAM,EACN,sCAAsC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,OAAO,CAChG,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,EAAE,oDAAoD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC,CAAC;IAC5E,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;IACnF,CAAC;IACD,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEpB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,8CAA8C;QAC9C,MAAM,OAAO,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,OAAO,KAAK,SAAS;YAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClD,KAAK,CAAC,MAAM,EAAE,uCAAuC,CAAC,CAAC;QACvD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,0EAA0E;IAE1E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;QAC/B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,QAAQ,CAAC,MAAM,EAAE,2DAA2D,CAAC,CAAC;YAC9E,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,YAAY,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,QAAQ,CAAC,MAAM,EAAE,6CAA6C,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACxF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,QAAQ,CACN,MAAM,EACN,4CAA4C,MAAM,CAAC,MAAM,4EAA4E,CACtI,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,wEAAwE;IACxE,oEAAoE;IACpE,6BAA6B;IAC7B,MAAM,WAAW,GAAG,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5D,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,KAAK,CACH,MAAM,EACN;YACE,yBAAyB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,WAAW,CAAC,MAAM,EAAE;YAC/E,gDAAgD;YAChD,EAAE;YACF,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,EAAE;YACF,0DAA0D;YAC1D,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;SAAM,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3C,KAAK,CACH,MAAM,EACN;YACE,kBAAkB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,0CAA0C;YACzF,oBAAoB,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,yBAAyB;YAC7E,iCAAiC;YACjC,EAAE;YACF,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;SAAM,IAAI,WAAW,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACpD,KAAK,CACH,MAAM,EACN,KAAK,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,mDAAmD,CACtF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,MAAM,EAAE,YAAY,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC;IAED,8CAA8C;IAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IAClD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,KAAK,CAAC,MAAM,EAAE,kCAAkC,CAAC,CAAC;IAElD,mEAAmE;IACnE,IAAI,iBAAiB,GAAG,EAAE,CAAC;IAC3B,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,iBAAiB,GAAG,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,iBAAiB,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACzC,KAAK,CAAC,MAAM,EAAE,iEAAiE,CAAC,CAAC;IACnF,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,cAAc,CAAC,iBAAiB,CAAC,CAAC;QACjD,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,KAAK,CACH,MAAM,EACN,iBAAiB,CAAC,MAAM,KAAK,CAAC;YAC5B,CAAC,CAAC,gDAAgD;YAClD,CAAC,CAAC,+CAA+C,CACpD,CAAC;IACJ,CAAC;IAED,kEAAkE;IAClE,uEAAuE;IACvE,uEAAuE;IACvE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,KAAK,CACH,MAAM,EACN;QACE,EAAE;QACF,GAAG,EAAE,QAAQ;QACb,qBAAqB,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpD,kCAAkC;QAClC,oEAAoE;QACpE,EAAE;QACF,iFAAiF;QACjF,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IAEF,OAAO,CAAC,CAAC;AACX,CAAC;AAoBD,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,0EAA0E;QAC1E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC;IAClF,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;IACvC,CAAC;IACD,yEAAyE;IACzE,uEAAuE;IACvE,2CAA2C;IAC3C,MAAM,UAAU,GAAG,GAAG,UAAU,wBAAwB,CAAC;IACzD,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,aAAa,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACpC,oEAAoE;QACpE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,qDAAqD;YAC7D,mEAAmE;YACnE,wCAAwC;YACxC,OAAO,EAAE,cAAc;YACvB,UAAU;SACX,CAAC;IACJ,CAAC;IACD,mEAAmE;IACnE,IAAI,CAAC;QACH,UAAU,CAAC,UAAU,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED,0DAA0D;AAC1D,SAAS,eAAe,CAAC,UAAkB;IACzC,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,gCAAgC,MAAM,CAAC,MAAM,wBAAwB,MAAM,CAAC,aAAa;aAC7F,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;aACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IACtB,CAAC;IACD,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC7B,OAAO,eAAe,QAAQ,CAAC,UAAU,CAAC,8CAA8C,CAAC;IAC3F,CAAC;IACD,uEAAuE;IACvE,yEAAyE;IACzE,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW;QACnC,CAAC,CAAC,qDAAqD;QACvD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB;QACxC,CAAC,CAAC,6DAA6D;QAC/D,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,sBAAsB,QAAQ,CAAC,UAAU,CAAC,OAAO,UAAU,GAAG,SAAS,IAAI,CAAC;AACrF,CAAC;AAED,6CAA6C;AAC7C,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuBxB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAuB;IACnD,IAAI,MAUH,CAAC;IACF,IAAI,CAAC;QACH,MAAM,GAAG,SAAS,CAAC;YACjB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;YACf,OAAO,EAAE;gBACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC9B,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACpC,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACnC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;aACtC;YACD,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,SAAS,EAAE,CACtF,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,IAAI,MAA0B,CAAC;IAC/B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,YAAY,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAClF,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yEAAyE,SAAS,OAAO,CAC1F,CAAC;YACF,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK;QACzC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,KAAK;QAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,KAAK;KACpD,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- /** The test runners tracelane recognises. Only WDIO is fully wired in v0.1. */
1
+ /** The test runners tracelane recognises. WDIO + Playwright are fully wired. */
2
2
  export type Runner = 'wdio' | 'playwright' | 'cypress';
3
3
  /** The package managers tracelane recognises (lockfile-driven detection). */
4
4
  export type PackageManager = 'pnpm' | 'yarn' | 'npm' | 'bun';
@@ -45,15 +45,17 @@ export interface DetectedPackageManager {
45
45
  */
46
46
  export declare function detectPackageManager(cwd: string, fileExists?: (path: string) => boolean): DetectedPackageManager;
47
47
  /**
48
- * Build the package-manager install command for adding `@tracelane/wdio` as
49
- * a devDependency. Returned as `[program, ...args]` for `spawnSync`, NOT a
50
- * single shell string `sh -c` is avoided to dodge injection on Windows and
51
- * paths-with-spaces. Each manager has its own dev-flag spelling:
48
+ * Build the package-manager install command for adding a tracelane adapter as
49
+ * a devDependency. `pkg` defaults to `@tracelane/wdio` but callers pass the
50
+ * runner-specific package (e.g. `@tracelane/playwright`). Returned as
51
+ * `[program, ...args]` for `spawnSync`, NOT a single shell string — `sh -c` is
52
+ * avoided to dodge injection on Windows and paths-with-spaces. Each manager
53
+ * has its own dev-flag spelling:
52
54
  *
53
- * pnpm add -D @tracelane/wdio
54
- * yarn add -D @tracelane/wdio
55
- * npm install --save-dev @tracelane/wdio
56
- * bun add -d @tracelane/wdio
55
+ * pnpm add -D <pkg>
56
+ * yarn add -D <pkg>
57
+ * npm install --save-dev <pkg>
58
+ * bun add -d <pkg>
57
59
  */
58
60
  export declare function installCommand(manager: PackageManager, pkg?: string): readonly string[];
59
61
  //# sourceMappingURL=detect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"AAcA,+EAA+E;AAC/E,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAoC7D,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,cAAc,GAAG,SAAS,CAQ5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,MAAM,GAAG,SAAS,CAQpB;AAiBD,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,oEAAoE;IACpE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,sBAAsB,CAsBxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,GAAG,SAAoB,GACtB,SAAS,MAAM,EAAE,CAWnB"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"AAcA,gFAAgF;AAChF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvD,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAoC7D,0EAA0E;AAC1E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,sDAAsD;IACtD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,cAAc,GAAG,SAAS,CAQ5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,MAAM,GAAG,SAAS,CAQpB;AAiBD,2CAA2C;AAC3C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,oEAAoE;IACpE,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAoB,GACjD,sBAAsB,CAsBxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,GAAG,SAAoB,GACtB,SAAS,MAAM,EAAE,CAWnB"}
@@ -6,14 +6,14 @@
6
6
  //
7
7
  // Runner detection looks ONLY at the project root, not recursively — a
8
8
  // wdio.conf inside node_modules is not the user's project. Priority order
9
- // when multiple match is WDIO > Playwright > Cypress (WDIO is the only path
10
- // the v0.1 CLI fully wires).
9
+ // when multiple match is WDIO > Playwright > Cypress (both WDIO and Playwright
10
+ // are fully wired; Cypress isn't supported yet).
11
11
  import { existsSync } from 'node:fs';
12
12
  import { join } from 'node:path';
13
- // Priority order: WDIO first because it's the only runner the CLI can wire
14
- // end-to-end today. Playwright + Cypress detection drives a no-op "support
15
- // coming Q3/Q4 2026" branch they're listed so a user with both a Playwright
16
- // and a Cypress config still gets routed to the more-mature path.
13
+ // Priority order: WDIO first, then Playwright (both are fully wired by the
14
+ // CLI), then Cypress (detected, but not yet supported the init command
15
+ // prints a clear "not yet supported" message). Listing all three means a user
16
+ // with multiple configs is routed to the most-mature matching path.
17
17
  const RUNNER_SPECS = [
18
18
  {
19
19
  runner: 'wdio',
@@ -115,15 +115,17 @@ export function detectPackageManager(cwd, fileExists = existsSync) {
115
115
  };
116
116
  }
117
117
  /**
118
- * Build the package-manager install command for adding `@tracelane/wdio` as
119
- * a devDependency. Returned as `[program, ...args]` for `spawnSync`, NOT a
120
- * single shell string `sh -c` is avoided to dodge injection on Windows and
121
- * paths-with-spaces. Each manager has its own dev-flag spelling:
118
+ * Build the package-manager install command for adding a tracelane adapter as
119
+ * a devDependency. `pkg` defaults to `@tracelane/wdio` but callers pass the
120
+ * runner-specific package (e.g. `@tracelane/playwright`). Returned as
121
+ * `[program, ...args]` for `spawnSync`, NOT a single shell string — `sh -c` is
122
+ * avoided to dodge injection on Windows and paths-with-spaces. Each manager
123
+ * has its own dev-flag spelling:
122
124
  *
123
- * pnpm add -D @tracelane/wdio
124
- * yarn add -D @tracelane/wdio
125
- * npm install --save-dev @tracelane/wdio
126
- * bun add -d @tracelane/wdio
125
+ * pnpm add -D <pkg>
126
+ * yarn add -D <pkg>
127
+ * npm install --save-dev <pkg>
128
+ * bun add -d <pkg>
127
129
  */
128
130
  export function installCommand(manager, pkg = '@tracelane/wdio') {
129
131
  switch (manager) {
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/lib/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * The reporter-array entry we add. Tuple form: ['@tracelane/playwright', opts].
3
+ * Mirrors the canonical wiring from the @tracelane/playwright README.
4
+ */
5
+ export declare const TRACELANE_REPORTER_ENTRY = "['@tracelane/playwright', { mode: 'failed' }]";
6
+ /**
7
+ * The manual follow-up the user must apply themselves: swap the test import in
8
+ * their spec files to tracelane's fixture. The CLI can't safely rewrite every
9
+ * spec, so init prints this verbatim. Phrasing mirrors the README's "Use
10
+ * tracelane's test/expect" step.
11
+ */
12
+ export declare const FIXTURE_IMPORT_FOLLOWUP = "In each spec file, change your Playwright test import to tracelane's fixture\n(a drop-in for @playwright/test \u2014 recording is automatic, nothing per-test):\n\n - import { test, expect } from '@playwright/test';\n + import { test, expect } from '@tracelane/playwright/fixture';";
13
+ /** Sanity bounds for the post-edit byte-count delta. */
14
+ export declare const EDIT_DELTA_MIN = 30;
15
+ export declare const EDIT_DELTA_MAX = 400;
16
+ /** A `reporter: [...]` literal block we found inside the source. */
17
+ interface ReporterBlock {
18
+ /** Absolute character offset of the opening `[`. */
19
+ readonly openIndex: number;
20
+ /** Absolute character offset of the matching closing `]`. */
21
+ readonly closeIndex: number;
22
+ /** Substring between `[` and `]` (exclusive). */
23
+ readonly inner: string;
24
+ }
25
+ /**
26
+ * Produce a same-length copy of `src` where every string literal and every
27
+ * comment is replaced with same-length space padding (newlines preserved).
28
+ * Template-literal `${...}` interpolation bodies are treated as code.
29
+ */
30
+ export declare function stripStringsAndComments(src: string): string;
31
+ /**
32
+ * Locate the `reporter:` array literal in a playwright.config source string.
33
+ * Returns the bracket indices + the substring inside, or `undefined` if the
34
+ * `reporter` key is absent OR is not an array (e.g. `reporter: 'list'`).
35
+ *
36
+ * Runs against `stripStringsAndComments(source)` so a `reporter:` inside a
37
+ * comment or string can never be selected. Prefers the SHALLOWEST brace+bracket
38
+ * depth so a nested `reporter:` inside e.g. a `projects: [{ ... }]` entry would
39
+ * not win over a top-level config `reporter:`.
40
+ */
41
+ export declare function findReporterArray(source: string): ReporterBlock | undefined;
42
+ /**
43
+ * True if the source already registers the `@tracelane/playwright` reporter.
44
+ * Only the `reporter:` value region is inspected (see `reporterValueRegion`),
45
+ * so a `@tracelane/playwright` string literal elsewhere — or in a comment —
46
+ * never false-positives.
47
+ */
48
+ export declare function hasTracelaneReporter(source: string): boolean;
49
+ /**
50
+ * Append the tracelane reporter entry as the LAST element of an existing
51
+ * reporter array. Covers:
52
+ *
53
+ * reporter: [] → reporter: [<entry>]
54
+ * reporter: [['list']] → reporter: [['list'], <entry>]
55
+ * reporter: [['list'],] → reporter: [['list'], <entry>] (trailing comma)
56
+ *
57
+ * Caller has already located `block` via `findReporterArray`.
58
+ */
59
+ export declare function appendToReporterArray(source: string, block: ReporterBlock): string;
60
+ /**
61
+ * Insert a `reporter: [<entry>]` line into a config object that has no
62
+ * `reporter:` key at all.
63
+ *
64
+ * Strategy: find the FIRST config object literal — either the object passed to
65
+ * `defineConfig({ ... })`, or an `export default { ... }` / `const config = {`
66
+ * literal — locate its outermost `{`/`}`, and insert the reporter key just
67
+ * after the opening brace. Returns undefined if no object literal is found
68
+ * (caller backs out to the manual snippet).
69
+ *
70
+ * Runs against the stripped buffer so an example in a doc-comment can't match.
71
+ */
72
+ export declare function insertReporterKey(source: string): string | undefined;
73
+ /** Result shape for `applyPlaywrightEdit`. */
74
+ export type PlaywrightEditResult = {
75
+ readonly ok: true;
76
+ /** The new source content to write back. */
77
+ readonly source: string;
78
+ /** True if the reporter was already registered — no-op. */
79
+ readonly alreadyConfigured: boolean;
80
+ } | {
81
+ readonly ok: false;
82
+ /** Why the editor backed out. Surfaced verbatim to the user. */
83
+ readonly reason: string;
84
+ /** The snippet the user should paste manually (always populated). */
85
+ readonly manualSnippet: string;
86
+ };
87
+ /**
88
+ * Manual-paste snippet shown when the editor backs out. The user adds the
89
+ * reporter tuple to their `reporter` array themselves. Single source of truth
90
+ * — init.ts's "restored from backup" path references this so the copy can't
91
+ * drift.
92
+ */
93
+ export declare const MANUAL_SNIPPET: string;
94
+ /**
95
+ * The single high-level entrypoint. Given the current source of a
96
+ * playwright.config.*, produce the new source (with the tracelane reporter
97
+ * registered) — or fail cleanly with a manual snippet.
98
+ *
99
+ * Steps:
100
+ * 1. If the reporter is already registered, no-op (alreadyConfigured).
101
+ * 2. Append to an existing `reporter: [...]` array, OR
102
+ * 3. Promote a bare-string `reporter: 'x'` into an array, OR
103
+ * 4. Insert a new `reporter:` key into the config object literal.
104
+ * 5. Sanity-check the byte-count delta + presence of the marker string.
105
+ */
106
+ export declare function applyPlaywrightEdit(originalSource: string): PlaywrightEditResult;
107
+ export {};
108
+ //# sourceMappingURL=playwright-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-editor.d.ts","sourceRoot":"","sources":["../../src/lib/playwright-editor.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,eAAO,MAAM,wBAAwB,kDAAkD,CAAC;AAExF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,+RAI8B,CAAC;AAEnE,wDAAwD;AACxD,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,oEAAoE;AACpE,UAAU,aAAa;IACrB,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,6DAA6D;IAC7D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAQD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoF3D;AAgDD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAwB3E;AA6BD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAI5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,CAclF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAepE;AA2BD,8CAA8C;AAC9C,MAAM,MAAM,oBAAoB,GAC5B;IACE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC,GACD;IACE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,gEAAgE;IAChE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC,CAAC;AAEN;;;;;GAKG;AACH,eAAO,MAAM,cAAc,QAG6B,CAAC;AAEzD;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,oBAAoB,CA2ChF"}
@@ -0,0 +1,417 @@
1
+ // String-based editor for playwright.config.* — the Playwright analogue of
2
+ // wdio-editor.ts (Strategy A: regex over an AST parser, for the same two
3
+ // reasons documented there: ts-morph would bloat the published CLI, and the
4
+ // space of "real" playwright.config shapes is small + well-defined).
5
+ //
6
+ // What it does (and DELIBERATELY does NOT do):
7
+ //
8
+ // - It registers the `@tracelane/playwright` reporter in the `reporter`
9
+ // array of the user's Playwright config — creating the array if absent,
10
+ // appending if present, idempotent on re-run.
11
+ // - It does NOT rewrite the user's spec files. The Playwright integration
12
+ // also requires swapping the test import to the fixture
13
+ // (`import { test, expect } from '@tracelane/playwright/fixture'`), which
14
+ // can live across arbitrarily many spec files in arbitrary shapes. The
15
+ // CLI cannot reliably rewrite all of them, so `init` registers the
16
+ // reporter here and prints a clear, copy-pasteable follow-up instruction
17
+ // (see FIXTURE_IMPORT_FOLLOWUP). This is the conservative choice — we
18
+ // never touch files we can't edit safely.
19
+ //
20
+ // The contract every edit MUST satisfy after `applyPlaywrightEdit` returns
21
+ // `{ ok: true, ... }`:
22
+ //
23
+ // - The source contains a `@tracelane/playwright` entry inside the
24
+ // `reporter` array.
25
+ // - File length grew by a plausible amount (sanity bound; 0 = nothing
26
+ // happened, 10kb+ = the regex went off the rails). Idempotent re-runs
27
+ // return `alreadyConfigured: true` and grow by 0.
28
+ //
29
+ // SHADOW SAFETY: like wdio-editor, every source-scanning regex runs against a
30
+ // `stripStringsAndComments` buffer (NOT the raw source), so a `reporter:`
31
+ // mention inside a comment or string literal can never be edited. Offsets
32
+ // translate 1:1 between the stripped and raw buffers (the strip is
33
+ // length-preserving), so a match in the stripped buffer slices out of the raw
34
+ // source by its index.
35
+ /**
36
+ * The reporter-array entry we add. Tuple form: ['@tracelane/playwright', opts].
37
+ * Mirrors the canonical wiring from the @tracelane/playwright README.
38
+ */
39
+ export const TRACELANE_REPORTER_ENTRY = `['@tracelane/playwright', { mode: 'failed' }]`;
40
+ /**
41
+ * The manual follow-up the user must apply themselves: swap the test import in
42
+ * their spec files to tracelane's fixture. The CLI can't safely rewrite every
43
+ * spec, so init prints this verbatim. Phrasing mirrors the README's "Use
44
+ * tracelane's test/expect" step.
45
+ */
46
+ export const FIXTURE_IMPORT_FOLLOWUP = `In each spec file, change your Playwright test import to tracelane's fixture
47
+ (a drop-in for @playwright/test — recording is automatic, nothing per-test):
48
+
49
+ - import { test, expect } from '@playwright/test';
50
+ + import { test, expect } from '@tracelane/playwright/fixture';`;
51
+ /** Sanity bounds for the post-edit byte-count delta. */
52
+ export const EDIT_DELTA_MIN = 30; // the reporter entry alone is ~45 bytes
53
+ export const EDIT_DELTA_MAX = 400;
54
+ // ---------------------------------------------------------------------------
55
+ // Shared scanner — identical strategy to wdio-editor: walk the source once,
56
+ // padding string-literal + comment bodies to spaces so regex can never match
57
+ // inside them. Offsets are preserved 1:1 (the strip is length-preserving).
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Produce a same-length copy of `src` where every string literal and every
61
+ * comment is replaced with same-length space padding (newlines preserved).
62
+ * Template-literal `${...}` interpolation bodies are treated as code.
63
+ */
64
+ export function stripStringsAndComments(src) {
65
+ const out = new Array(src.length);
66
+ let i = 0;
67
+ const n = src.length;
68
+ while (i < n) {
69
+ const ch = src[i];
70
+ const next = src[i + 1];
71
+ // Line comment: `// ...` to end-of-line.
72
+ if (ch === '/' && next === '/') {
73
+ out[i] = ' ';
74
+ out[i + 1] = ' ';
75
+ i += 2;
76
+ while (i < n && src[i] !== '\n') {
77
+ out[i] = ' ';
78
+ i += 1;
79
+ }
80
+ continue;
81
+ }
82
+ // Block comment: `/* ... */`.
83
+ if (ch === '/' && next === '*') {
84
+ out[i] = ' ';
85
+ out[i + 1] = ' ';
86
+ i += 2;
87
+ while (i < n && !(src[i] === '*' && src[i + 1] === '/')) {
88
+ out[i] = src[i] === '\n' ? '\n' : ' ';
89
+ i += 1;
90
+ }
91
+ if (i < n) {
92
+ out[i] = ' ';
93
+ out[i + 1] = ' ';
94
+ i += 2;
95
+ }
96
+ continue;
97
+ }
98
+ // String literals: single, double, template.
99
+ if (ch === '"' || ch === "'" || ch === '`') {
100
+ const quote = ch;
101
+ out[i] = ch;
102
+ i += 1;
103
+ while (i < n) {
104
+ const c = src[i];
105
+ if (c === '\\') {
106
+ out[i] = ' ';
107
+ if (i + 1 < n)
108
+ out[i + 1] = src[i + 1] === '\n' ? '\n' : ' ';
109
+ i += 2;
110
+ continue;
111
+ }
112
+ if (quote === '`' && c === '$' && src[i + 1] === '{') {
113
+ out[i] = ' ';
114
+ out[i + 1] = ' ';
115
+ let braceDepth = 1;
116
+ i += 2;
117
+ while (i < n && braceDepth > 0) {
118
+ const cc = src[i] ?? '';
119
+ if (cc === '{')
120
+ braceDepth += 1;
121
+ else if (cc === '}')
122
+ braceDepth -= 1;
123
+ if (braceDepth === 0) {
124
+ out[i] = ' ';
125
+ i += 1;
126
+ break;
127
+ }
128
+ out[i] = cc;
129
+ i += 1;
130
+ }
131
+ continue;
132
+ }
133
+ if (c === quote) {
134
+ out[i] = c;
135
+ i += 1;
136
+ break;
137
+ }
138
+ out[i] = c === '\n' ? '\n' : ' ';
139
+ i += 1;
140
+ }
141
+ continue;
142
+ }
143
+ out[i] = ch ?? '';
144
+ i += 1;
145
+ }
146
+ return out.join('');
147
+ }
148
+ /**
149
+ * Generic bracket/brace counter. Walks `scan` (a pre-stripped buffer) from
150
+ * `openIndex` (which must point at an opening delimiter) and returns the index
151
+ * of the matching closer, or -1 if EOF arrives first.
152
+ */
153
+ function findMatchingDelimiter(scan, openIndex, open, close) {
154
+ let depth = 0;
155
+ let i = openIndex;
156
+ const n = scan.length;
157
+ while (i < n) {
158
+ const ch = scan[i];
159
+ if (ch === open)
160
+ depth += 1;
161
+ else if (ch === close) {
162
+ depth -= 1;
163
+ if (depth === 0)
164
+ return i;
165
+ }
166
+ i += 1;
167
+ }
168
+ return -1;
169
+ }
170
+ /** Brace + bracket combined depth at every character of a stripped buffer. */
171
+ function depthAt(scan) {
172
+ const out = new Array(scan.length);
173
+ let braces = 0;
174
+ let brackets = 0;
175
+ for (let i = 0; i < scan.length; i += 1) {
176
+ const ch = scan[i];
177
+ if (ch === '{')
178
+ braces += 1;
179
+ else if (ch === '}')
180
+ braces = Math.max(0, braces - 1);
181
+ else if (ch === '[')
182
+ brackets += 1;
183
+ else if (ch === ']')
184
+ brackets = Math.max(0, brackets - 1);
185
+ out[i] = braces + brackets;
186
+ }
187
+ return out;
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Public scanning helpers
191
+ // ---------------------------------------------------------------------------
192
+ /**
193
+ * Locate the `reporter:` array literal in a playwright.config source string.
194
+ * Returns the bracket indices + the substring inside, or `undefined` if the
195
+ * `reporter` key is absent OR is not an array (e.g. `reporter: 'list'`).
196
+ *
197
+ * Runs against `stripStringsAndComments(source)` so a `reporter:` inside a
198
+ * comment or string can never be selected. Prefers the SHALLOWEST brace+bracket
199
+ * depth so a nested `reporter:` inside e.g. a `projects: [{ ... }]` entry would
200
+ * not win over a top-level config `reporter:`.
201
+ */
202
+ export function findReporterArray(source) {
203
+ const scan = stripStringsAndComments(source);
204
+ const depths = depthAt(scan);
205
+ // Match `reporter:` followed (after optional whitespace) by `[`. If the
206
+ // next non-space char is NOT `[`, this isn't an array reporter and we skip.
207
+ const re = /(?:^|[\s,{])(?:reporter|"reporter"|'reporter')\s*:\s*\[/g;
208
+ let m;
209
+ let best;
210
+ // biome-ignore lint/suspicious/noAssignInExpressions: idiomatic for global-flag regex iteration
211
+ while ((m = re.exec(scan)) !== null) {
212
+ const openIndex = m.index + m[0].length - 1; // points at `[`
213
+ const closeIndex = findMatchingDelimiter(scan, openIndex, '[', ']');
214
+ if (closeIndex === -1)
215
+ continue;
216
+ const keyDepth = depths[openIndex - 1] ?? 0;
217
+ if (best === undefined || keyDepth < best.depth) {
218
+ best = { openIndex, closeIndex, depth: keyDepth };
219
+ }
220
+ }
221
+ if (!best)
222
+ return undefined;
223
+ return {
224
+ openIndex: best.openIndex,
225
+ closeIndex: best.closeIndex,
226
+ inner: source.slice(best.openIndex + 1, best.closeIndex),
227
+ };
228
+ }
229
+ /**
230
+ * Slice the value region of a `reporter:` key — the array body if it's an
231
+ * array, or the single string literal if it's a bare-string reporter. Returns
232
+ * the RAW-source substring (offsets translate 1:1), or undefined if there's no
233
+ * `reporter:` key outside strings/comments. This is the only place a tracelane
234
+ * reporter entry can legitimately live, so checking ONLY this region prevents
235
+ * a stray `"@tracelane/playwright"` string literal elsewhere in the file from
236
+ * false-positiving.
237
+ */
238
+ function reporterValueRegion(source) {
239
+ // Array form first.
240
+ const block = findReporterArray(source);
241
+ if (block !== undefined)
242
+ return block.inner;
243
+ // Bare-string form: `reporter: '...'`.
244
+ const scan = stripStringsAndComments(source);
245
+ const re = /(?:^|[\s,{])(?:reporter|"reporter"|'reporter')\s*:\s*(['"])/g;
246
+ const m = re.exec(scan);
247
+ if (!m)
248
+ return undefined;
249
+ const quoteOpen = m.index + m[0].length - 1;
250
+ const quoteChar = source[quoteOpen];
251
+ if (quoteChar !== "'" && quoteChar !== '"')
252
+ return undefined;
253
+ let i = quoteOpen + 1;
254
+ while (i < source.length && source[i] !== quoteChar)
255
+ i += 1;
256
+ if (i >= source.length)
257
+ return undefined;
258
+ return source.slice(quoteOpen, i + 1);
259
+ }
260
+ /**
261
+ * True if the source already registers the `@tracelane/playwright` reporter.
262
+ * Only the `reporter:` value region is inspected (see `reporterValueRegion`),
263
+ * so a `@tracelane/playwright` string literal elsewhere — or in a comment —
264
+ * never false-positives.
265
+ */
266
+ export function hasTracelaneReporter(source) {
267
+ const region = reporterValueRegion(source);
268
+ if (region === undefined)
269
+ return false;
270
+ return /(['"])@tracelane\/playwright\1/.test(region);
271
+ }
272
+ /**
273
+ * Append the tracelane reporter entry as the LAST element of an existing
274
+ * reporter array. Covers:
275
+ *
276
+ * reporter: [] → reporter: [<entry>]
277
+ * reporter: [['list']] → reporter: [['list'], <entry>]
278
+ * reporter: [['list'],] → reporter: [['list'], <entry>] (trailing comma)
279
+ *
280
+ * Caller has already located `block` via `findReporterArray`.
281
+ */
282
+ export function appendToReporterArray(source, block) {
283
+ const inner = block.inner;
284
+ const trimmedInner = inner.replace(/\s+$/, '');
285
+ const isEmpty = trimmedInner.trim().length === 0;
286
+ const hasTrailingComma = trimmedInner.endsWith(',');
287
+ let newInner;
288
+ if (isEmpty) {
289
+ newInner = TRACELANE_REPORTER_ENTRY;
290
+ }
291
+ else if (hasTrailingComma) {
292
+ newInner = `${trimmedInner} ${TRACELANE_REPORTER_ENTRY}`;
293
+ }
294
+ else {
295
+ newInner = `${trimmedInner}, ${TRACELANE_REPORTER_ENTRY}`;
296
+ }
297
+ return `${source.slice(0, block.openIndex + 1)}${newInner}${source.slice(block.closeIndex)}`;
298
+ }
299
+ /**
300
+ * Insert a `reporter: [<entry>]` line into a config object that has no
301
+ * `reporter:` key at all.
302
+ *
303
+ * Strategy: find the FIRST config object literal — either the object passed to
304
+ * `defineConfig({ ... })`, or an `export default { ... }` / `const config = {`
305
+ * literal — locate its outermost `{`/`}`, and insert the reporter key just
306
+ * after the opening brace. Returns undefined if no object literal is found
307
+ * (caller backs out to the manual snippet).
308
+ *
309
+ * Runs against the stripped buffer so an example in a doc-comment can't match.
310
+ */
311
+ export function insertReporterKey(source) {
312
+ const scan = stripStringsAndComments(source);
313
+ // defineConfig({ ... }) | export default { ... } | const config ... = {
314
+ // | export const config ... = { | module.exports = {
315
+ const re = /(?:defineConfig\s*\(\s*|export\s+default\s*|export\s+const\s+\w+[^=]*=\s*|const\s+\w+[^=]*=\s*|module\.exports\s*=\s*)(\{)/;
316
+ const m = re.exec(scan);
317
+ if (!m)
318
+ return undefined;
319
+ const braceIndex = m.index + m[0].length - 1; // points at `{`
320
+ const closeIndex = findMatchingDelimiter(scan, braceIndex, '{', '}');
321
+ if (closeIndex === -1)
322
+ return undefined;
323
+ // Insert right after the opening brace, on its own line, matching the
324
+ // two-space indent typical of these configs.
325
+ const insertion = `\n reporter: [${TRACELANE_REPORTER_ENTRY}],`;
326
+ return `${source.slice(0, braceIndex + 1)}${insertion}${source.slice(braceIndex + 1)}`;
327
+ }
328
+ /**
329
+ * Promote a bare-string reporter (`reporter: 'list'`) into an array that keeps
330
+ * the original entry and adds ours: `reporter: ['list', <entry>]`. Returns
331
+ * undefined if no bare-string reporter is found.
332
+ */
333
+ function promoteStringReporter(source) {
334
+ const scan = stripStringsAndComments(source);
335
+ // `reporter:` followed by a quote (string literal), NOT a `[`.
336
+ const re = /(?:^|[\s,{])(?:reporter|"reporter"|'reporter')\s*:\s*(['"])/g;
337
+ const m = re.exec(scan);
338
+ if (!m)
339
+ return undefined;
340
+ // The opening quote is at m.index + m[0].length - 1 (length-preserving).
341
+ const quoteOpen = m.index + m[0].length - 1;
342
+ const quoteChar = source[quoteOpen];
343
+ if (quoteChar !== "'" && quoteChar !== '"')
344
+ return undefined;
345
+ // Find the closing quote in the RAW source.
346
+ let i = quoteOpen + 1;
347
+ while (i < source.length && source[i] !== quoteChar)
348
+ i += 1;
349
+ if (i >= source.length)
350
+ return undefined;
351
+ const closeQuote = i;
352
+ const original = source.slice(quoteOpen, closeQuote + 1);
353
+ const replacement = `[${original}, ${TRACELANE_REPORTER_ENTRY}]`;
354
+ return `${source.slice(0, quoteOpen)}${replacement}${source.slice(closeQuote + 1)}`;
355
+ }
356
+ /**
357
+ * Manual-paste snippet shown when the editor backs out. The user adds the
358
+ * reporter tuple to their `reporter` array themselves. Single source of truth
359
+ * — init.ts's "restored from backup" path references this so the copy can't
360
+ * drift.
361
+ */
362
+ export const MANUAL_SNIPPET = `// In playwright.config.*, register the tracelane reporter:
363
+ // reporter: [${TRACELANE_REPORTER_ENTRY}],
364
+ //
365
+ // ${FIXTURE_IMPORT_FOLLOWUP.split('\n').join('\n// ')}`;
366
+ /**
367
+ * The single high-level entrypoint. Given the current source of a
368
+ * playwright.config.*, produce the new source (with the tracelane reporter
369
+ * registered) — or fail cleanly with a manual snippet.
370
+ *
371
+ * Steps:
372
+ * 1. If the reporter is already registered, no-op (alreadyConfigured).
373
+ * 2. Append to an existing `reporter: [...]` array, OR
374
+ * 3. Promote a bare-string `reporter: 'x'` into an array, OR
375
+ * 4. Insert a new `reporter:` key into the config object literal.
376
+ * 5. Sanity-check the byte-count delta + presence of the marker string.
377
+ */
378
+ export function applyPlaywrightEdit(originalSource) {
379
+ if (hasTracelaneReporter(originalSource)) {
380
+ return { ok: true, source: originalSource, alreadyConfigured: true };
381
+ }
382
+ let next;
383
+ const block = findReporterArray(originalSource);
384
+ if (block !== undefined) {
385
+ next = appendToReporterArray(originalSource, block);
386
+ }
387
+ else {
388
+ // No array reporter. Try promoting a bare-string reporter first; if there
389
+ // isn't one either, insert a fresh reporter key.
390
+ next = promoteStringReporter(originalSource) ?? insertReporterKey(originalSource);
391
+ }
392
+ if (next === undefined) {
393
+ return {
394
+ ok: false,
395
+ reason: "Couldn't find a Playwright config object literal (defineConfig({...}) or export default {...}) to register the reporter into. The auto-edit was aborted — apply the snippet below manually.",
396
+ manualSnippet: MANUAL_SNIPPET,
397
+ };
398
+ }
399
+ // Sanity check: did our edit do something plausible?
400
+ if (!hasTracelaneReporter(next)) {
401
+ return {
402
+ ok: false,
403
+ reason: 'Post-edit sanity check failed: @tracelane/playwright reporter entry missing.',
404
+ manualSnippet: MANUAL_SNIPPET,
405
+ };
406
+ }
407
+ const delta = next.length - originalSource.length;
408
+ if (delta < EDIT_DELTA_MIN || delta > EDIT_DELTA_MAX) {
409
+ return {
410
+ ok: false,
411
+ reason: `Post-edit sanity check failed: byte delta ${delta} outside [${EDIT_DELTA_MIN}, ${EDIT_DELTA_MAX}] bounds.`,
412
+ manualSnippet: MANUAL_SNIPPET,
413
+ };
414
+ }
415
+ return { ok: true, source: next, alreadyConfigured: false };
416
+ }
417
+ //# sourceMappingURL=playwright-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-editor.js","sourceRoot":"","sources":["../../src/lib/playwright-editor.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tracelane/cli",
3
- "version": "0.1.0-alpha.11",
4
- "description": "tracelane scaffolding CLI. `npx @tracelane/cli init` detects your test runner (WDIO / Playwright / Cypress) and wires @tracelane/wdio into wdio.conf.* in one command — the published path from `npm install` + manual conf edit to a single npx invocation.",
3
+ "version": "0.1.0-alpha.13",
4
+ "description": "tracelane scaffolding CLI. `npx @tracelane/cli init` detects your test runner (WDIO / Playwright / Cypress) and wires the matching adapter (@tracelane/wdio or @tracelane/playwright) into your runner config in one command — the published path from `npm install` + manual conf edit to a single npx invocation.",
5
5
  "keywords": [
6
6
  "tracelane",
7
7
  "testing",