playwright-e2e-mcp 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +40 -8
  2. package/dist/cli/ci.js +3 -0
  3. package/dist/cli/ci.js.map +1 -1
  4. package/dist/cli/guard.d.ts +11 -0
  5. package/dist/cli/guard.js +80 -0
  6. package/dist/cli/guard.js.map +1 -0
  7. package/dist/cli/upload.d.ts +14 -0
  8. package/dist/cli/upload.js +81 -0
  9. package/dist/cli/upload.js.map +1 -0
  10. package/dist/http.d.ts +1 -1
  11. package/dist/http.js +1 -1
  12. package/dist/index.js +22 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/server.d.ts +2 -2
  15. package/dist/server.js +44 -6
  16. package/dist/server.js.map +1 -1
  17. package/dist/tools/analyze-history.d.ts +15 -0
  18. package/dist/tools/analyze-history.js +44 -9
  19. package/dist/tools/analyze-history.js.map +1 -1
  20. package/dist/tools/check-test-change.d.ts +44 -0
  21. package/dist/tools/check-test-change.js +132 -0
  22. package/dist/tools/check-test-change.js.map +1 -0
  23. package/dist/tools/get-run-status.js +8 -2
  24. package/dist/tools/get-run-status.js.map +1 -1
  25. package/dist/tools/probe-script.js +93 -1
  26. package/dist/tools/probe-script.js.map +1 -1
  27. package/dist/tools/quarantine.d.ts +61 -0
  28. package/dist/tools/quarantine.js +133 -0
  29. package/dist/tools/quarantine.js.map +1 -0
  30. package/dist/tools/run-test.d.ts +10 -1
  31. package/dist/tools/run-test.js +36 -5
  32. package/dist/tools/run-test.js.map +1 -1
  33. package/dist/tools/save-login.d.ts +142 -0
  34. package/dist/tools/save-login.js +264 -0
  35. package/dist/tools/save-login.js.map +1 -0
  36. package/dist/tools/shared.d.ts +24 -1
  37. package/dist/tools/shared.js +1 -1
  38. package/dist/tools/shared.js.map +1 -1
  39. package/dist/tools/structured.d.ts +8 -1
  40. package/dist/tools/structured.js +8 -1
  41. package/dist/tools/structured.js.map +1 -1
  42. package/dist/utils/pro-client.d.ts +29 -0
  43. package/dist/utils/pro-client.js +114 -0
  44. package/dist/utils/pro-client.js.map +1 -0
  45. package/dist/utils/quarantine.d.ts +64 -0
  46. package/dist/utils/quarantine.js +106 -0
  47. package/dist/utils/quarantine.js.map +1 -0
  48. package/dist/utils/test-change-guard.d.ts +69 -0
  49. package/dist/utils/test-change-guard.js +391 -0
  50. package/dist/utils/test-change-guard.js.map +1 -0
  51. package/dist/utils/totp.d.ts +26 -0
  52. package/dist/utils/totp.js +84 -0
  53. package/dist/utils/totp.js.map +1 -0
  54. package/package.json +1 -1
  55. package/skill/playwright-e2e-mcp/SKILL.md +41 -7
  56. package/skill/playwright-e2e-mcp/references/setup.md +7 -1
  57. package/skill/playwright-e2e-mcp/references/tools.md +41 -0
package/README.md CHANGED
@@ -59,7 +59,7 @@ red at HEAD ─▶ bisect-failure (runs it across git history, names the breakin
59
59
  - **Flakiness with evidence.** Names the flaky test, whether it's a race, shared state or test order, and the seed that reproduces it.
60
60
  - **Lean.** Finding and fixing a broken locator took about **5,300 tokens** versus about **7,400**
61
61
  with Playwright MCP plus a shell ([benchmark](#benchmark)).
62
- - **Free and open source.** MIT, no account, no API key, no telemetry, no paid tier.
62
+ - **Free and open source.** MIT, no account, no API key, no telemetry. Every tool is free; an optional paid Pro only adds hosted CI history.
63
63
 
64
64
  ## 🚀 What only this MCP does
65
65
 
@@ -69,6 +69,8 @@ page. None of them, as of October 2026, does the following. This one does:
69
69
 
70
70
  | Capability | What you get |
71
71
  | --- | --- |
72
+ | 🛡️ **A guard against "fixes" that check less** | `check-test-change` compares a changed test with its old self and blocks a fix that went green by deleting an assertion, skipping the test or adding `.only`; it warns on weaker matchers, hard waits, forced clicks and swallowed errors. The same check runs in CI as `guard` |
73
+ | 🧊 **Quarantine with an owner and an expiry** | `quarantine` keeps a flaky test running and reported while its failure stops blocking the build, with who fixes it, why, and the date it blocks again |
72
74
  | 🎯 **Find the commit that broke a test** | `bisect-failure` runs the test across your git history, in a temporary worktree that leaves your checkout alone, and names the first bad commit with its diff and the failure |
73
75
  | 🧪 **Flake-risk audit of your test code** | `audit-tests` finds hard waits, one-shot assertions, missing `await`s and fragile selectors. It ranks them by how flaky those tests really were, then applies the safe rewrites and re-runs them to prove them |
74
76
  | ✅ **Fixes that prove themselves** | `suggest-fix` swaps in a locator proven unique on the DOM at failure, re-runs the test and reverts if it's still red. It refuses to patch over a real app bug |
@@ -95,6 +97,9 @@ keeps your suite green.
95
97
  | ♿ | "Check this page for accessibility" | Runs axe-core (WCAG 2.2 AA) and returns each problem with a ready-to-paste locator and regression test. |
96
98
  | ⚡ | "Why is this page slow?" | Measures Web Vitals (LCP, CLS, INP, TBT) on desktop or a throttled phone, names the slow element and the elements that jump, and hands back a budget test. |
97
99
  | 🧪 | "Show me the error state" | Mocks API responses (500s, empty lists, slow calls) so the AI can inspect, audit or measure states that are hard to reach. |
100
+ | 🔑 | "Log in and save the session" | Logs in once (password from an environment variable, **authenticator code generated from the TOTP secret**), checks the session works and saves it for tests and page tools; reuses it until it expires. The password never passes through the chat. |
101
+ | 🛡️ | "Did that fix cheat?" | Compares the changed tests with git and blocks a fix that passes by deleting assertions or skipping tests. |
102
+ | 🧊 | "Quarantine this flaky test" | Keeps it running and reported, stops it failing the build, with an owner and an expiry date. |
98
103
  | 🔐 | "Test the page after login" | Works behind sign-in with saved sessions, headers and click/fill steps, in Chromium, Firefox or WebKit, and can record or replay network traffic from a HAR file. |
99
104
  | 🤖 | "Do it in CI" | A [GitHub Action and `ci` command](#ci-github-action-and-ci-command) post the diagnosis, flaky verdict and fix diffs on your PR. |
100
105
 
@@ -253,8 +258,8 @@ Running and fixing your own tests needs your project, so use the local install f
253
258
  | --- | --- |
254
259
  | Skill only, any agent | `npx skills add xsignon-secure/E2E` |
255
260
  | MCP Registry | `io.github.xsignon-secure/E2E` ([listing](https://registry.modelcontextprotocol.io/)); registry-aware clients find it there |
256
- | Straight from GitHub, no npm | `npx -y github:xsignon-secure/E2E#v0.6.1` (pin a release tag) |
257
- | Release tarball | `npm install -D https://github.com/xsignon-secure/E2E/releases/download/v0.6.1/playwright-e2e-mcp-0.6.1.tgz` |
261
+ | Straight from GitHub, no npm | `npx -y github:xsignon-secure/E2E#v0.7.0` (pin a release tag) |
262
+ | Release tarball | `npm install -D https://github.com/xsignon-secure/E2E/releases/download/v0.7.0/playwright-e2e-mcp-0.7.0.tgz` |
258
263
  | Docker | `docker run -i --rm -v "$PWD:/work" ghcr.io/xsignon-secure/playwright-e2e-mcp` (published on each release; see [Development](docs/development.md#docker)) |
259
264
  | Local checkout | `"command": "node", "args": ["/path/to/E2E/dist/index.js"]` |
260
265
 
@@ -271,6 +276,16 @@ Run my Playwright tests and fix whatever fails.
271
276
  Your agent should run the suite, read the failure, and propose a fix it has re-run. To check the
272
277
  setup without your own tests, ask it to run `examples/sample-test.spec.ts` from this repo.
273
278
 
279
+ ## What's new in 0.7
280
+
281
+ - **Log in once, safely:** `save-login` signs in (2FA codes included) with secrets read from the
282
+ environment, checks the session and saves it as a `storageState` file; it reuses the session
283
+ until it stops working.
284
+ - **Heal guard:** `check-test-change` and `playwright-e2e-mcp guard` block a test "fix" that
285
+ passes by checking less (deleted assertions, skipped tests, `.only`).
286
+ - **Flaky-test quarantine:** `quarantine` stops a known flaky test from failing the build for a
287
+ set time, with an owner and a reason, while it keeps running and being reported.
288
+
274
289
  ## What's new in 0.6
275
290
 
276
291
  - **Find the commit that broke a test:** `bisect-failure` runs the test across git history in a
@@ -306,6 +321,9 @@ setup without your own tests, ask it to run `examples/sample-test.spec.ts` from
306
321
  | `diagnose-flaky` | Run a failing test 2–10 times **with retries disabled** and return an evidence verdict: `CONSISTENTLY FAILING`, `FLAKY` or `NOT REPRODUCING`; tells parallelism and **test-order** bugs from races |
307
322
  | `analyze-history` | Rank flaky, regressed and broken tests from the local run history, group failures by cause, list the slowest tests, show stability by day, name **the commit where each test went bad**, or show one test's timeline |
308
323
  | `audit-tests` | Audit the **test code** for flake risks (hard waits, one-shot assertions instead of web-first ones, missing `await`s, `.only`, force clicks, `networkidle`, element handles, layout selectors), ranked by how flaky those tests have been in the run history; `fix: true` rewrites the mechanical ones, re-runs the files and reverts if they fail |
324
+ | `save-login` | **Log in once and save the session** (`storageState`): steps with `{{env:E2E_PASSWORD}}` and `{{totp}}` (authenticator code from a secret in the environment), a check that the session works, and reuse until it expires; secrets never pass through the chat |
325
+ | `check-test-change` | **Heal guard**: compare changed tests with git (or a proposed fix with the file) and BLOCK deleted assertions, skipped or removed tests and `.only`; WARN on weaker matchers, hard waits, `force: true`, swallowed errors and raised timeouts or retries |
326
+ | `quarantine` | Quarantine a flaky test with an owner, a reason and an expiry (default 14 days): it keeps running and being reported, but its failure no longer fails `run-test` or `ci` until the entry expires. Stored in `playwright-quarantine.json` |
309
327
  | `bisect-failure` | **Find the commit that broke a test**: binary-search git history between a good and a bad commit, running the test at each step in a temporary worktree (your checkout is untouched), and report the first bad commit, what it changed and how the test failed |
310
328
 
311
329
  Two **prompts** package the main workflows for clients that show them as slash commands:
@@ -375,7 +393,7 @@ steps:
375
393
  - uses: actions/setup-node@v6
376
394
  with: { node-version: 24 }
377
395
  - run: npm ci && npx playwright install --with-deps chromium
378
- - uses: xsignon-secure/E2E@v0.6.1
396
+ - uses: xsignon-secure/E2E@v0.7.0
379
397
  with:
380
398
  flaky-runs: 3 # 0 skips the flaky verdict
381
399
  suggest: 2 # suggest-fix diffs for the first 2 failures
@@ -383,7 +401,19 @@ steps:
383
401
  ```
384
402
 
385
403
  Inputs: `project-root`, `args`, `flaky-runs`, `suggest`, `comment`, `review`,
386
- `verify-fixes`, `fail-on-failure`, `version`, `github-token`. Outputs: `exit-code`, `report`.
404
+ `verify-fixes`, `guard`, `pro-key`, `pro-url`, `fail-on-failure`, `version`, `github-token`. Outputs: `exit-code`,
405
+ `report`, `guard`.
406
+
407
+ Quarantined tests (`playwright-quarantine.json`, see [`quarantine`](docs/tools.md#quarantine))
408
+ are honoured here too: when every failure is quarantined and unexpired, `ci` exits `0` and the
409
+ report lists them.
410
+
411
+ **Heal guard in CI.** `guard: true` checks the PR's changed tests against the base branch first
412
+ and fails the job if a test was made to pass by checking less. Without the Action:
413
+
414
+ ```bash
415
+ npx -y playwright-e2e-mcp guard --base origin/main # exit 1 on BLOCK; --strict fails on warnings too
416
+ ```
387
417
 
388
418
  ## Configuration
389
419
 
@@ -393,10 +423,12 @@ Inputs: `project-root`, `args`, `flaky-runs`, `suggest`, `comment`, `review`,
393
423
  | Environment variable | Default | Purpose |
394
424
  | --- | --- | --- |
395
425
  | `PW_MCP_PROJECT_ROOT` | server cwd | Default project root for every tool |
396
- | `PW_MCP_TOOLS` | all | Which tools to expose, as tool names and/or profiles, comma separated (same as the `--tools=` flag). Profiles: `core` (run, status, failure, fix, flaky, list), `triage` (run, status, failure, CI report, flaky, history, test audit, bisect, list), `inspect` (page, selector, accessibility, performance, visual), `author` (list, page, selector, generate, run). All sixteen tool definitions cost about 12k tokens of context per request; `core` costs about 4k (10k and 2.3k with `PW_MCP_OUTPUT_SCHEMAS=0`) |
426
+ | `PW_MCP_TOOLS` | all | Which tools to expose, as tool names and/or profiles, comma separated (same as the `--tools=` flag). Profiles: `core` (run, status, failure, fix, flaky, heal guard, list), `triage` (run, status, failure, CI report, flaky, history, test audit, bisect, quarantine, heal guard, list), `inspect` (page, selector, accessibility, performance, visual, login), `author` (list, page, selector, generate, run, login, heal guard). All nineteen tool definitions cost about 14k tokens of context per request; `core` costs about 4k (11k and 2.6k with `PW_MCP_OUTPUT_SCHEMAS=0`) |
397
427
  | `PW_MCP_OUTPUT_SCHEMAS` | on | `0` leaves the output schemas out of the tool list to save context. Results still carry `structuredContent` (see [Structured results](docs/tools.md#structured-results)) |
398
428
  | `PW_MCP_STORAGE_STATE` | — | Default `storageState` file (inside the project) for the page tools |
399
429
  | `PW_MCP_SHUFFLE_SEEDS` | random | Comma-separated seeds for `diagnose-flaky`'s `order` pass, to replay the orders a diagnosis reported |
430
+ | `PW_MCP_LOGIN_ENV` | — | Extra environment variables `save-login` may type through `{{env:NAME}}`, comma separated. Without it only `E2E_*`, `TEST_*`, `PW_*`, `PLAYWRIGHT_*` and `LOGIN_*` are allowed |
431
+ | `PW_MCP_PRO_KEY` / `PW_MCP_PRO_URL` | — | Optional, paid: Pro key and Pro Cloud address. CI runs are uploaded with `playwright-e2e-mcp upload` (or the Action's `pro-key` / `pro-url` inputs) and `analyze-history` merges them with local runs. Unset (the default), nothing is ever sent anywhere |
400
432
  | `PW_MCP_HISTORY` | on | `0` stops recording runs to `.playwright-e2e-mcp/history.jsonl` |
401
433
  | `PW_MCP_ALLOWED_ROOTS` | — | Extra directories a caller may pass as `projectRoot` (`:`-separated, `;` on Windows). Anything outside these and the default root is rejected |
402
434
  | `PW_MCP_HTTP_TOKEN` | — | HTTP bridge only: bearer token that unlocks all tools: 16+ characters, 32+ recommended (see [Hosted endpoint](docs/hosted-endpoint.md)) |
@@ -449,9 +481,9 @@ A real `run-test` call served over stdio by `npx -y playwright-e2e-mcp` against
449
481
 
450
482
  ## Free and open source
451
483
 
452
- - **MIT licensed.** Use it, change it, ship it in commercial work; no fees, no paid tier, no feature held back.
484
+ - **MIT licensed.** Use it, change it, ship it in commercial work; no fees, no feature held back. The optional Pro plan adds a hosted service (CI run history across machines), not tools; nothing here needs it.
453
485
  - **No account, no API key, no sign-up.** `npx -y playwright-e2e-mcp init` is the whole setup.
454
- - **No telemetry.** It never phones home; your tests, traces and run history stay on your machine.
486
+ - **No telemetry.** It never phones home; your tests, traces and run history stay on your machine unless you set a Pro key and upload them.
455
487
  - **Free dependencies only:** the MCP SDK (Apache-2.0), zod (MIT), axe-core (MPL-2.0) and the Playwright your project already has (Apache-2.0).
456
488
  - **Free to host yourself**, too: the HTTP bridge deploys to a free Vercel account (see [Hosted endpoint](docs/hosted-endpoint.md)).
457
489
 
package/dist/cli/ci.js CHANGED
@@ -148,6 +148,9 @@ export async function runCi(argv) {
148
148
  const result = ctx.store.lastRun?.result;
149
149
  const failures = result?.failures ?? [];
150
150
  let code = result === undefined || run.isError ? 2 : result.ok ? 0 : failures.length > 0 ? 1 : 2;
151
+ // Every failure is quarantined (and none expired): report them, pass the build.
152
+ if (code === 1 && (structured(run)?.run?.quarantined ?? 0) > 0 && structured(run)?.ok === true)
153
+ code = 0;
151
154
  const fixes = [];
152
155
  const suggest = options.review || options.suggestions ? Math.max(options.suggest, 1) : options.suggest;
153
156
  if (code === 1 && suggest > 0 && ctx.store.lastRun) {
@@ -1 +1 @@
1
- {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../src/cli/ci.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../src/cli/ci.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `playwright-e2e-mcp guard`: the heal guard as a CI step. Compares the
3
+ * changed spec files with a base ref and fails the job when a change made
4
+ * tests pass by checking less (deleted assertions, skipped or removed
5
+ * tests, `.only`). Warnings are printed but do not fail unless --strict.
6
+ *
7
+ * Exit codes: 0 OK (or only warnings), 1 BLOCK (or WARN with --strict),
8
+ * 2 bad arguments or not a git checkout.
9
+ */
10
+ export declare const GUARD_USAGE: string;
11
+ export declare function runGuard(argv: string[]): Promise<number>;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * `playwright-e2e-mcp guard`: the heal guard as a CI step. Compares the
3
+ * changed spec files with a base ref and fails the job when a change made
4
+ * tests pass by checking less (deleted assertions, skipped or removed
5
+ * tests, `.only`). Warnings are printed but do not fail unless --strict.
6
+ *
7
+ * Exit codes: 0 OK (or only warnings), 1 BLOCK (or WARN with --strict),
8
+ * 2 bad arguments or not a git checkout.
9
+ */
10
+ import { appendFileSync } from 'node:fs';
11
+ import path from 'node:path';
12
+ import { parseArgs } from 'node:util';
13
+ import { assertGitRef, guardAgainstRef } from '../tools/check-test-change.js';
14
+ import { guardVerdict, renderGuardReport } from '../utils/test-change-guard.js';
15
+ export const GUARD_USAGE = [
16
+ 'Usage: playwright-e2e-mcp guard [options]',
17
+ '',
18
+ 'Checks that changed tests were not made to pass by checking less: blocks deleted',
19
+ 'assertions, skipped or removed tests and .only; warns on weaker matchers, hard',
20
+ 'waits, force: true, swallowed errors and raised timeouts or retries.',
21
+ '',
22
+ ' --base <ref> git ref to compare with (default: HEAD; in a PR use origin/main)',
23
+ ' --project-root <dir> project directory (default: cwd)',
24
+ ' --strict warnings fail the check too',
25
+ ' --json print the result as JSON',
26
+ '',
27
+ 'Exit codes: 0 OK, 1 blocked, 2 bad arguments.',
28
+ '',
29
+ ].join('\n');
30
+ export async function runGuard(argv) {
31
+ let values;
32
+ try {
33
+ ({ values } = parseArgs({
34
+ args: argv,
35
+ options: {
36
+ base: { type: 'string' },
37
+ 'project-root': { type: 'string' },
38
+ strict: { type: 'boolean' },
39
+ json: { type: 'boolean' },
40
+ },
41
+ strict: true,
42
+ }));
43
+ }
44
+ catch (error) {
45
+ process.stderr.write(`${error.message}\n\n${GUARD_USAGE}`);
46
+ return 2;
47
+ }
48
+ const root = path.resolve(values['project-root'] ?? process.cwd());
49
+ try {
50
+ const base = assertGitRef(values.base ?? 'HEAD');
51
+ const results = await guardAgainstRef(root.replace(/\\/g, '/'), base);
52
+ const verdict = guardVerdict(results);
53
+ const failed = verdict === 'BLOCK' || (values.strict === true && verdict === 'WARN');
54
+ if (values.json) {
55
+ process.stdout.write(`${JSON.stringify({ verdict, ok: !failed, files: results }, null, 2)}\n`);
56
+ }
57
+ else {
58
+ const report = results.length === 0
59
+ ? '## ✅ OK — no changed spec files\n\nNothing to compare: no spec file or playwright config differs from the base.\n'
60
+ : `${renderGuardReport(results, base === 'HEAD' ? 'last commit → working tree' : `\`${base}\` → working tree`)}\n`;
61
+ process.stdout.write(report);
62
+ const summary = process.env.GITHUB_STEP_SUMMARY;
63
+ if (summary) {
64
+ try {
65
+ appendFileSync(summary, `${report}\n`);
66
+ }
67
+ catch {
68
+ // The job summary is a nicety; the exit code is what matters.
69
+ }
70
+ }
71
+ }
72
+ return failed ? 1 : 0;
73
+ }
74
+ catch (error) {
75
+ const err = error;
76
+ process.stderr.write(`guard: ${err.message}${err.hint ? `\n${err.hint}` : ''}\n`);
77
+ return 2;
78
+ }
79
+ }
80
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/cli/guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `playwright-e2e-mcp upload`: send the project's recorded runs to Pro
3
+ * Cloud (PW_MCP_PRO_KEY + PW_MCP_PRO_URL), so CI runs from every machine
4
+ * end up in one history that analyze-history and the dashboard read.
5
+ *
6
+ * Only runs newer than the last upload are sent (remembered in
7
+ * .playwright-e2e-mcp/pro-upload.json); the service also ignores
8
+ * duplicates, so a repeated upload is harmless.
9
+ *
10
+ * Exit codes: 0 uploaded (or nothing new), 1 the upload failed,
11
+ * 2 bad arguments or Pro not configured.
12
+ */
13
+ export declare const UPLOAD_USAGE: string;
14
+ export declare function runUpload(argv: string[]): Promise<number>;
@@ -0,0 +1,81 @@
1
+ /**
2
+ * `playwright-e2e-mcp upload`: send the project's recorded runs to Pro
3
+ * Cloud (PW_MCP_PRO_KEY + PW_MCP_PRO_URL), so CI runs from every machine
4
+ * end up in one history that analyze-history and the dashboard read.
5
+ *
6
+ * Only runs newer than the last upload are sent (remembered in
7
+ * .playwright-e2e-mcp/pro-upload.json); the service also ignores
8
+ * duplicates, so a repeated upload is harmless.
9
+ *
10
+ * Exit codes: 0 uploaded (or nothing new), 1 the upload failed,
11
+ * 2 bad arguments or Pro not configured.
12
+ */
13
+ import { readFile, writeFile } from 'node:fs/promises';
14
+ import path from 'node:path';
15
+ import { parseArgs } from 'node:util';
16
+ import { joinProjectPath, toNativePath } from '../utils/path-utils.js';
17
+ import { proProjectName, proSettings, uploadRuns } from '../utils/pro-client.js';
18
+ import { HISTORY_DIR, readHistory } from '../utils/run-history.js';
19
+ export const UPLOAD_USAGE = [
20
+ 'Usage: playwright-e2e-mcp upload [options]',
21
+ '',
22
+ 'Uploads recorded runs to Pro Cloud. Needs PW_MCP_PRO_KEY and PW_MCP_PRO_URL.',
23
+ '',
24
+ ' --project <name> name to file runs under (default: PW_MCP_PRO_PROJECT,',
25
+ ' the GitHub repository, or the folder name)',
26
+ ' --project-root <dir> project directory (default: cwd)',
27
+ ' --all send every recorded run, not only new ones',
28
+ '',
29
+ ].join('\n');
30
+ const MARKER = 'pro-upload.json';
31
+ export async function runUpload(argv) {
32
+ let values;
33
+ try {
34
+ ({ values } = parseArgs({
35
+ args: argv,
36
+ options: { project: { type: 'string' }, 'project-root': { type: 'string' }, all: { type: 'boolean' } },
37
+ strict: true,
38
+ }));
39
+ }
40
+ catch (error) {
41
+ process.stderr.write(`${error.message}\n\n${UPLOAD_USAGE}`);
42
+ return 2;
43
+ }
44
+ let settings;
45
+ try {
46
+ settings = proSettings();
47
+ }
48
+ catch (error) {
49
+ process.stderr.write(`upload: ${error.message}\n`);
50
+ return 2;
51
+ }
52
+ if (!settings) {
53
+ process.stderr.write('upload: PW_MCP_PRO_KEY is not set. Pro Cloud is optional; without a key nothing is sent anywhere.\n');
54
+ return 2;
55
+ }
56
+ const root = path.resolve(values['project-root'] ?? process.cwd()).replace(/\\/g, '/');
57
+ const project = values.project ?? (await proProjectName(root));
58
+ const marker = joinProjectPath(root, `${HISTORY_DIR}/${MARKER}`);
59
+ const last = values.all
60
+ ? ''
61
+ : await readFile(toNativePath(marker), 'utf8')
62
+ .then((text) => String(JSON.parse(text).lastAt ?? ''))
63
+ .catch(() => '');
64
+ const runs = (await readHistory(root, 500)).filter((entry) => entry.at > last);
65
+ if (runs.length === 0) {
66
+ process.stdout.write(`Nothing new to upload for ${project}.\n`);
67
+ return 0;
68
+ }
69
+ try {
70
+ const result = await uploadRuns(settings, project, runs);
71
+ process.stdout.write(`Uploaded ${runs.length} run(s) to ${project}: ${result.stored} stored, ${result.skipped} already there.\n`);
72
+ await writeFile(toNativePath(marker), `${JSON.stringify({ lastAt: runs[runs.length - 1].at, project })}\n`, 'utf8').catch(() => undefined);
73
+ return 0;
74
+ }
75
+ catch (error) {
76
+ const err = error;
77
+ process.stderr.write(`upload: ${err.message}${err.hint ? `\n${err.hint}` : ''}\n`);
78
+ return 1;
79
+ }
80
+ }
81
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/cli/upload.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  * verified locally before it is deployed.
11
11
  *
12
12
  * The stdio transport in server.ts is untouched; this is an additional way to
13
- * reach the same sixteen tools.
13
+ * reach the same nineteen tools.
14
14
  */
15
15
  import type { IncomingMessage, ServerResponse } from 'node:http';
16
16
  import type { McpHttpHandler } from '@modelcontextprotocol/server';
package/dist/http.js CHANGED
@@ -10,7 +10,7 @@
10
10
  * verified locally before it is deployed.
11
11
  *
12
12
  * The stdio transport in server.ts is untouched; this is an additional way to
13
- * reach the same sixteen tools.
13
+ * reach the same nineteen tools.
14
14
  */
15
15
  import { createHash, timingSafeEqual } from 'node:crypto';
16
16
  import { createMcpHandler, hostHeaderValidationResponse } from '@modelcontextprotocol/server';
package/dist/index.js CHANGED
@@ -49,6 +49,24 @@ async function main() {
49
49
  process.exitCode = await runDoctor(process.argv.slice(3));
50
50
  return;
51
51
  }
52
+ if (process.argv[2] === 'guard') {
53
+ const { runGuard, GUARD_USAGE } = await import('./cli/guard.js');
54
+ if (process.argv.includes('--help') || process.argv.includes('-h')) {
55
+ process.stdout.write(GUARD_USAGE);
56
+ return;
57
+ }
58
+ process.exitCode = await runGuard(process.argv.slice(3));
59
+ return;
60
+ }
61
+ if (process.argv[2] === 'upload') {
62
+ const { runUpload, UPLOAD_USAGE } = await import('./cli/upload.js');
63
+ if (process.argv.includes('--help') || process.argv.includes('-h')) {
64
+ process.stdout.write(UPLOAD_USAGE);
65
+ return;
66
+ }
67
+ process.exitCode = await runUpload(process.argv.slice(3));
68
+ return;
69
+ }
52
70
  if (process.argv.includes('--version') || process.argv.includes('-v')) {
53
71
  process.stdout.write(`${SERVER_VERSION}\n`);
54
72
  return;
@@ -61,6 +79,8 @@ async function main() {
61
79
  ' playwright-e2e-mcp ci [options] run the suite and print a Markdown diagnosis (ci --help)',
62
80
  ' playwright-e2e-mcp init [options] add the server + agent skill to a project (init --help)',
63
81
  ' playwright-e2e-mcp doctor check Node, Playwright, browsers and client setup (doctor --help)',
82
+ ' playwright-e2e-mcp guard [options] fail CI when changed tests check less (guard --help)',
83
+ ' playwright-e2e-mcp upload [options] send recorded runs to Pro Cloud (opt-in; upload --help)',
64
84
  '',
65
85
  'Connects over stdio (MCP). Configuration via environment:',
66
86
  ' PW_MCP_PROJECT_ROOT default project root (default: cwd)',
@@ -68,6 +88,8 @@ async function main() {
68
88
  ' (all | core | triage | inspect | author); same as --tools',
69
89
  ' PW_MCP_ALLOWED_ROOTS extra roots callers may pass as projectRoot',
70
90
  ' PW_MCP_BLOCK_PRIVATE_URLS 1 = URL tools refuse private/loopback/metadata addresses',
91
+ ' PW_MCP_PRO_KEY / PW_MCP_PRO_URL optional Pro Cloud key and address; unset = no network calls',
92
+ ' PW_MCP_LOGIN_ENV extra variables save-login may type ({{env:NAME}}), comma separated',
71
93
  ' LOG_LEVEL / MCP_LOG_LEVEL debug | info | warn | error | silent (default: info)',
72
94
  ' LOG_FORMAT / MCP_LOG_FORMAT text | json (default: text)',
73
95
  '',
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP server setup: creates the McpServer instance, registers the sixteen
2
+ * MCP server setup: creates the McpServer instance, registers the nineteen
3
3
  * tools (with spec tool annotations) and the workflow prompts, and wires
4
4
  * each invocation to a ToolContext (per-tool logger, abort signal, progress
5
5
  * reporter, shared store, default project root).
@@ -31,7 +31,7 @@ export interface CreateServerOptions {
31
31
  export declare const READ_ONLY_TOOLS: readonly string[];
32
32
  /**
33
33
  * Named tool sets for PW_MCP_TOOLS / --tools. Every tool definition costs
34
- * context on each request (all sixteen are ~12k tokens), so a client that
34
+ * context on each request (all nineteen are ~14k tokens), so a client that
35
35
  * only fixes failing suites can load the core loop alone.
36
36
  */
37
37
  export declare const TOOL_PROFILES: Readonly<Record<string, readonly string[]>>;
package/dist/server.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * MCP server setup: creates the McpServer instance, registers the sixteen
2
+ * MCP server setup: creates the McpServer instance, registers the nineteen
3
3
  * tools (with spec tool annotations) and the workflow prompts, and wires
4
4
  * each invocation to a ToolContext (per-tool logger, abort signal, progress
5
5
  * reporter, shared store, default project root).
@@ -30,6 +30,9 @@ import { getRunStatusTool } from './tools/get-run-status.js';
30
30
  import { loadReportTool } from './tools/load-report.js';
31
31
  import { auditTestsTool } from './tools/audit-tests.js';
32
32
  import { bisectFailureTool } from './tools/bisect-failure.js';
33
+ import { saveLoginTool } from './tools/save-login.js';
34
+ import { checkTestChangeTool } from './tools/check-test-change.js';
35
+ import { quarantineTool } from './tools/quarantine.js';
33
36
  import { registerPrompts } from './prompts.js';
34
37
  import { outputSchemaFor } from './tools/structured.js';
35
38
  /**
@@ -260,6 +263,41 @@ const TOOLS = [
260
263
  },
261
264
  handler: bisectFailureTool.handler,
262
265
  },
266
+ {
267
+ ...checkTestChangeTool,
268
+ title: 'Check a test fix (heal guard)',
269
+ // Reads spec files and runs read-only git commands.
270
+ annotations: {
271
+ readOnlyHint: true,
272
+ idempotentHint: true,
273
+ openWorldHint: false,
274
+ },
275
+ handler: checkTestChangeTool.handler,
276
+ },
277
+ {
278
+ ...quarantineTool,
279
+ title: 'Quarantine flaky tests',
280
+ // Reads and writes playwright-quarantine.json in the project.
281
+ annotations: {
282
+ readOnlyHint: false,
283
+ destructiveHint: false,
284
+ idempotentHint: true,
285
+ openWorldHint: false,
286
+ },
287
+ handler: quarantineTool.handler,
288
+ },
289
+ {
290
+ ...saveLoginTool,
291
+ title: 'Save a login session',
292
+ // Drives a browser through a live login and writes a session file.
293
+ annotations: {
294
+ readOnlyHint: false,
295
+ destructiveHint: false,
296
+ idempotentHint: true,
297
+ openWorldHint: true,
298
+ },
299
+ handler: saveLoginTool.handler,
300
+ },
263
301
  ];
264
302
  /**
265
303
  * Tools that neither drive a browser nor write files. The HTTP bridge
@@ -270,15 +308,15 @@ const TOOLS = [
270
308
  export const READ_ONLY_TOOLS = ['list-tests', 'get-failure', 'analyze-history'];
271
309
  /**
272
310
  * Named tool sets for PW_MCP_TOOLS / --tools. Every tool definition costs
273
- * context on each request (all sixteen are ~12k tokens), so a client that
311
+ * context on each request (all nineteen are ~14k tokens), so a client that
274
312
  * only fixes failing suites can load the core loop alone.
275
313
  */
276
314
  export const TOOL_PROFILES = {
277
315
  all: TOOLS.map((tool) => tool.name),
278
- core: ['run-test', 'get-run-status', 'get-failure', 'suggest-fix', 'diagnose-flaky', 'list-tests'],
279
- triage: ['run-test', 'get-run-status', 'get-failure', 'load-report', 'diagnose-flaky', 'analyze-history', 'audit-tests', 'bisect-failure', 'list-tests'],
280
- inspect: ['inspect-page', 'validate-selector', 'compare-visual-state', 'audit-accessibility', 'audit-performance'],
281
- author: ['list-tests', 'inspect-page', 'validate-selector', 'generate-e2e-test', 'run-test'],
316
+ core: ['run-test', 'get-run-status', 'get-failure', 'suggest-fix', 'check-test-change', 'diagnose-flaky', 'list-tests'],
317
+ triage: ['run-test', 'get-run-status', 'get-failure', 'load-report', 'diagnose-flaky', 'quarantine', 'analyze-history', 'audit-tests', 'bisect-failure', 'check-test-change', 'list-tests'],
318
+ inspect: ['inspect-page', 'validate-selector', 'compare-visual-state', 'audit-accessibility', 'audit-performance', 'save-login'],
319
+ author: ['list-tests', 'save-login', 'inspect-page', 'validate-selector', 'generate-e2e-test', 'check-test-change', 'run-test'],
282
320
  };
283
321
  /**
284
322
  * Resolve a comma-separated list of tool names and profile names