playwright-e2e-mcp 0.6.0 → 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 (77) 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 +74 -8
  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/audit-accessibility.d.ts +3 -0
  21. package/dist/tools/audit-performance.d.ts +3 -0
  22. package/dist/tools/audit-performance.js +1 -1
  23. package/dist/tools/audit-performance.js.map +1 -1
  24. package/dist/tools/check-test-change.d.ts +44 -0
  25. package/dist/tools/check-test-change.js +132 -0
  26. package/dist/tools/check-test-change.js.map +1 -0
  27. package/dist/tools/compare-visual-state.d.ts +3 -0
  28. package/dist/tools/generate-e2e-test.js +1 -1
  29. package/dist/tools/generate-e2e-test.js.map +1 -1
  30. package/dist/tools/get-run-status.js +8 -2
  31. package/dist/tools/get-run-status.js.map +1 -1
  32. package/dist/tools/inspect-page.d.ts +3 -0
  33. package/dist/tools/inspect-page.js +9 -5
  34. package/dist/tools/inspect-page.js.map +1 -1
  35. package/dist/tools/probe-script.js +158 -10
  36. package/dist/tools/probe-script.js.map +1 -1
  37. package/dist/tools/quarantine.d.ts +61 -0
  38. package/dist/tools/quarantine.js +133 -0
  39. package/dist/tools/quarantine.js.map +1 -0
  40. package/dist/tools/run-test.d.ts +10 -1
  41. package/dist/tools/run-test.js +36 -5
  42. package/dist/tools/run-test.js.map +1 -1
  43. package/dist/tools/save-login.d.ts +142 -0
  44. package/dist/tools/save-login.js +264 -0
  45. package/dist/tools/save-login.js.map +1 -0
  46. package/dist/tools/shared.d.ts +30 -1
  47. package/dist/tools/shared.js +51 -27
  48. package/dist/tools/shared.js.map +1 -1
  49. package/dist/tools/structured.d.ts +16 -1
  50. package/dist/tools/structured.js +14 -1
  51. package/dist/tools/structured.js.map +1 -1
  52. package/dist/tools/suggest-fix.js +1 -1
  53. package/dist/tools/suggest-fix.js.map +1 -1
  54. package/dist/tools/validate-selector.d.ts +6 -0
  55. package/dist/tools/validate-selector.js +28 -5
  56. package/dist/tools/validate-selector.js.map +1 -1
  57. package/dist/types/index.d.ts +1 -1
  58. package/dist/types/index.js.map +1 -1
  59. package/dist/utils/locator-expr.d.ts +3 -1
  60. package/dist/utils/locator-expr.js +25 -7
  61. package/dist/utils/locator-expr.js.map +1 -1
  62. package/dist/utils/pro-client.d.ts +29 -0
  63. package/dist/utils/pro-client.js +114 -0
  64. package/dist/utils/pro-client.js.map +1 -0
  65. package/dist/utils/quarantine.d.ts +64 -0
  66. package/dist/utils/quarantine.js +106 -0
  67. package/dist/utils/quarantine.js.map +1 -0
  68. package/dist/utils/test-change-guard.d.ts +69 -0
  69. package/dist/utils/test-change-guard.js +391 -0
  70. package/dist/utils/test-change-guard.js.map +1 -0
  71. package/dist/utils/totp.d.ts +26 -0
  72. package/dist/utils/totp.js +84 -0
  73. package/dist/utils/totp.js.map +1 -0
  74. package/package.json +1 -1
  75. package/skill/playwright-e2e-mcp/SKILL.md +46 -7
  76. package/skill/playwright-e2e-mcp/references/setup.md +7 -1
  77. package/skill/playwright-e2e-mcp/references/tools.md +43 -1
@@ -23,7 +23,7 @@ export interface LocatorCall {
23
23
  method: LocatorMethod;
24
24
  args: LocatorArg[];
25
25
  }
26
- export declare const LOCATOR_METHODS: readonly ['getByRole', 'getByText', 'getByLabel', 'getByPlaceholder', 'getByAltText', 'getByTitle', 'getByTestId', 'locator', 'first', 'last', 'nth', 'filter'];
26
+ export declare const LOCATOR_METHODS: readonly ['getByRole', 'getByText', 'getByLabel', 'getByPlaceholder', 'getByAltText', 'getByTitle', 'getByTestId', 'locator', 'first', 'last', 'nth', 'filter', 'frameLocator', 'contentFrame'];
27
27
  export type LocatorMethod = (typeof LOCATOR_METHODS)[number];
28
28
  /** True when the input looks like a call chain rather than a selector string. */
29
29
  export declare function isLocatorExpression(input: string): boolean;
@@ -32,6 +32,8 @@ export declare function isLocatorExpression(input: string): boolean;
32
32
  * Throws INVALID_PATH with a usable hint on anything else.
33
33
  */
34
34
  export declare function parseLocator(input: string): LocatorCall[];
35
+ /** Steps that move the chain into an iframe's document. */
36
+ export declare const FRAME_STEPS: Set<string>;
35
37
  /** Single-quoted JS string literal. */
36
38
  export declare function quote(text: string): string;
37
39
  /** Render a chain back to source, e.g. `getByRole('button', { name: 'Save' })`. */
@@ -25,6 +25,8 @@ export const LOCATOR_METHODS = [
25
25
  'last',
26
26
  'nth',
27
27
  'filter',
28
+ 'frameLocator',
29
+ 'contentFrame',
28
30
  ];
29
31
  const METHOD_SET = new Set(LOCATOR_METHODS);
30
32
  const MAX_EXPRESSION_CHARS = 2_000;
@@ -67,7 +69,7 @@ class Cursor {
67
69
  return this.pos >= this.src.length;
68
70
  }
69
71
  fail(message) {
70
- throw new PlaywrightMcpError(`Cannot parse locator: ${message} at position ${this.pos + 1}`, 'INVALID_PATH', {
72
+ throw new PlaywrightMcpError(`Cannot parse locator: ${message} at position ${this.pos + 1}`, 'INVALID_INPUT', {
71
73
  hint: 'Use a Playwright locator such as getByRole(\'button\', { name: \'Save\' }), getByTestId(\'cart\'), locator(\'#cta\').first(), or a plain selector string.',
72
74
  });
73
75
  }
@@ -174,7 +176,7 @@ function parseValue(c, depth) {
174
176
  /** True when the input looks like a call chain rather than a selector string. */
175
177
  export function isLocatorExpression(input) {
176
178
  const trimmed = input.trim().replace(/^await\s+/, '');
177
- return /^(page\s*\.\s*)?(getBy(Role|Text|Label|Placeholder|AltText|Title|TestId)|locator)\s*\(/.test(trimmed);
179
+ return /^(page\s*\.\s*)?(getBy(Role|Text|Label|Placeholder|AltText|Title|TestId)|locator|frameLocator)\s*\(/.test(trimmed);
178
180
  }
179
181
  /**
180
182
  * Parse a locator expression or selector into a whitelisted call chain.
@@ -183,10 +185,10 @@ export function isLocatorExpression(input) {
183
185
  export function parseLocator(input) {
184
186
  const raw = input.trim().replace(/;$/, '').trim();
185
187
  if (raw === '') {
186
- throw new PlaywrightMcpError('Locator is empty', 'INVALID_PATH', { hint: 'Pass a selector or a Playwright locator.' });
188
+ throw new PlaywrightMcpError('Locator is empty', 'INVALID_INPUT', { hint: 'Pass a selector or a Playwright locator.' });
187
189
  }
188
190
  if (raw.length > MAX_EXPRESSION_CHARS) {
189
- throw new PlaywrightMcpError('Locator is too long', 'INVALID_PATH', {
191
+ throw new PlaywrightMcpError('Locator is too long', 'INVALID_INPUT', {
190
192
  hint: `Keep locators under ${MAX_EXPRESSION_CHARS} characters.`,
191
193
  });
192
194
  }
@@ -223,9 +225,23 @@ export function parseLocator(input) {
223
225
  return calls;
224
226
  }
225
227
  function validateCalls(calls) {
226
- for (const call of calls) {
228
+ const last = calls[calls.length - 1];
229
+ if (last && FRAME_STEPS.has(last.method)) {
230
+ throw bad(`${last.method}() switches into an iframe; follow it with the element inside, e.g. ${last.method}(${last.method === 'frameLocator' ? "'#checkout'" : ''}).getByRole('button')`);
231
+ }
232
+ for (const [i, call] of calls.entries()) {
227
233
  const [a0] = call.args;
228
234
  switch (call.method) {
235
+ case 'frameLocator':
236
+ if (typeof a0 !== 'string' || call.args.length !== 1)
237
+ throw bad('frameLocator() takes an iframe selector string');
238
+ break;
239
+ case 'contentFrame':
240
+ if (call.args.length !== 0)
241
+ throw bad('contentFrame() takes no arguments');
242
+ if (i === 0)
243
+ throw bad("contentFrame() follows the iframe's locator, e.g. locator('#checkout').contentFrame()");
244
+ break;
229
245
  case 'first':
230
246
  case 'last':
231
247
  if (call.args.length !== 0)
@@ -254,9 +270,11 @@ function validateCalls(calls) {
254
270
  }
255
271
  }
256
272
  }
273
+ /** Steps that move the chain into an iframe's document. */
274
+ export const FRAME_STEPS = new Set(['frameLocator', 'contentFrame']);
257
275
  function bad(message) {
258
- return new PlaywrightMcpError(`Cannot parse locator: ${message}`, 'INVALID_PATH', {
259
- hint: 'Supported: getByRole/Text/Label/Placeholder/AltText/Title/TestId, locator, first, last, nth, filter({ hasText }).',
276
+ return new PlaywrightMcpError(`Cannot parse locator: ${message}`, 'INVALID_INPUT', {
277
+ hint: "Supported: getByRole/Text/Label/Placeholder/AltText/Title/TestId, locator, first, last, nth, filter({ hasText }), and frameLocator('#frame') or locator('#frame').contentFrame() for iframes.",
260
278
  });
261
279
  }
262
280
  function formatArg(arg) {
@@ -1 +1 @@
1
- {"version":3,"file":"locator-expr.js","sourceRoot":"","sources":["../../src/utils/locator-expr.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locator-expr.js","sourceRoot":"","sources":["../../src/utils/locator-expr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Pro Cloud client: shared CI run history for teams that subscribe to Pro.
3
+ *
4
+ * Strictly opt-in. Nothing here makes a network call unless
5
+ * PW_MCP_PRO_KEY is set; without it the server behaves exactly as before.
6
+ * The key is the license key from the Pro subscription; PW_MCP_PRO_URL
7
+ * points at the Pro Cloud deployment. There is deliberately no built-in
8
+ * default URL: the key only ever goes where the user pointed it.
9
+ */
10
+ import type { HistoryEntry } from './run-history.js';
11
+ export interface ProSettings {
12
+ key: string;
13
+ url: string;
14
+ }
15
+ /** The Pro settings, or undefined when Pro is not configured (the normal case). */
16
+ export declare function proSettings(env?: NodeJS.ProcessEnv): ProSettings | undefined;
17
+ /**
18
+ * The project name runs are filed under: PW_MCP_PRO_PROJECT, else the
19
+ * GitHub repository (owner/name, from CI or the origin remote), else the
20
+ * folder name. The same rule on CI and laptops, so both see one history.
21
+ */
22
+ export declare function proProjectName(root: string, env?: NodeJS.ProcessEnv): Promise<string>;
23
+ export declare function uploadRuns(settings: ProSettings, project: string, runs: HistoryEntry[]): Promise<{
24
+ stored: number;
25
+ skipped: number;
26
+ }>;
27
+ export declare function fetchRuns(settings: ProSettings, project: string, limit: number): Promise<HistoryEntry[]>;
28
+ /** Local and cloud runs together, oldest first, without duplicates. */
29
+ export declare function mergeRuns(local: HistoryEntry[], cloud: HistoryEntry[], last: number): HistoryEntry[];
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Pro Cloud client: shared CI run history for teams that subscribe to Pro.
3
+ *
4
+ * Strictly opt-in. Nothing here makes a network call unless
5
+ * PW_MCP_PRO_KEY is set; without it the server behaves exactly as before.
6
+ * The key is the license key from the Pro subscription; PW_MCP_PRO_URL
7
+ * points at the Pro Cloud deployment. There is deliberately no built-in
8
+ * default URL: the key only ever goes where the user pointed it.
9
+ */
10
+ import { execFile } from 'node:child_process';
11
+ import path from 'node:path';
12
+ import { PlaywrightMcpError } from '../types/index.js';
13
+ import { parseHistory } from './run-history.js';
14
+ const PROJECT_RE = /^[A-Za-z0-9][\w./-]{0,99}$/;
15
+ const UPLOAD_BATCH = 100;
16
+ /** The Pro settings, or undefined when Pro is not configured (the normal case). */
17
+ export function proSettings(env = process.env) {
18
+ const key = env.PW_MCP_PRO_KEY?.trim();
19
+ if (!key)
20
+ return undefined;
21
+ const url = (env.PW_MCP_PRO_URL?.trim() ?? '').replace(/\/+$/, '');
22
+ if (!url) {
23
+ throw new PlaywrightMcpError('PW_MCP_PRO_KEY is set but PW_MCP_PRO_URL is not', 'INVALID_INPUT', {
24
+ hint: 'Set PW_MCP_PRO_URL to the Pro Cloud address from your welcome email, or unset PW_MCP_PRO_KEY.',
25
+ });
26
+ }
27
+ let parsed;
28
+ try {
29
+ parsed = new URL(url);
30
+ }
31
+ catch {
32
+ throw new PlaywrightMcpError(`PW_MCP_PRO_URL is not a URL: ${url}`, 'INVALID_INPUT');
33
+ }
34
+ const local = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';
35
+ if (parsed.protocol !== 'https:' && !(local && parsed.protocol === 'http:')) {
36
+ throw new PlaywrightMcpError('PW_MCP_PRO_URL must use https', 'INVALID_INPUT', { hint: 'The Pro key is sent with every request.' });
37
+ }
38
+ return { key, url };
39
+ }
40
+ function git(args, cwd) {
41
+ return new Promise((resolve) => {
42
+ execFile('git', args, { cwd, timeout: 3_000, windowsHide: true }, (err, stdout) => resolve(err ? undefined : String(stdout).trim()));
43
+ });
44
+ }
45
+ /**
46
+ * The project name runs are filed under: PW_MCP_PRO_PROJECT, else the
47
+ * GitHub repository (owner/name, from CI or the origin remote), else the
48
+ * folder name. The same rule on CI and laptops, so both see one history.
49
+ */
50
+ export async function proProjectName(root, env = process.env) {
51
+ const candidates = [env.PW_MCP_PRO_PROJECT, env.GITHUB_REPOSITORY];
52
+ const remote = await git(['remote', 'get-url', 'origin'], root);
53
+ const match = remote ? /[:/]([^/:]+\/[^/]+?)(?:\.git)?$/.exec(remote) : null;
54
+ candidates.push(match?.[1], path.basename(root));
55
+ for (const raw of candidates) {
56
+ const name = raw?.trim();
57
+ if (name && PROJECT_RE.test(name) && !name.includes('..'))
58
+ return name;
59
+ }
60
+ return 'project';
61
+ }
62
+ async function call(settings, method, pathAndQuery, body) {
63
+ let response;
64
+ try {
65
+ response = await fetch(`${settings.url}/api/v1/${pathAndQuery}`, {
66
+ method,
67
+ headers: { authorization: `Bearer ${settings.key}`, accept: 'application/json', ...(body ? { 'content-type': 'application/json' } : {}) },
68
+ body: body ? JSON.stringify(body) : undefined,
69
+ signal: AbortSignal.timeout(20_000),
70
+ });
71
+ }
72
+ catch (error) {
73
+ throw new PlaywrightMcpError(`Pro Cloud is unreachable (${settings.url}): ${error.message}`, 'UNKNOWN', {
74
+ hint: 'Check the network and PW_MCP_PRO_URL; local history still works.',
75
+ });
76
+ }
77
+ const data = (await response.json().catch(() => ({})));
78
+ if (!response.ok) {
79
+ throw new PlaywrightMcpError(`Pro Cloud: ${data.error ?? `HTTP ${response.status}`}`, response.status === 401 ? 'INVALID_INPUT' : 'UNKNOWN', {
80
+ hint: data.hint,
81
+ });
82
+ }
83
+ return data;
84
+ }
85
+ export async function uploadRuns(settings, project, runs) {
86
+ let stored = 0;
87
+ let skipped = 0;
88
+ for (let i = 0; i < runs.length; i += UPLOAD_BATCH) {
89
+ const batch = runs.slice(i, i + UPLOAD_BATCH);
90
+ const result = (await call(settings, 'POST', 'runs', { project, runs: batch }));
91
+ stored += result.stored ?? 0;
92
+ skipped += result.skipped ?? 0;
93
+ }
94
+ return { stored, skipped };
95
+ }
96
+ export async function fetchRuns(settings, project, limit) {
97
+ const result = (await call(settings, 'GET', `runs?project=${encodeURIComponent(project)}&limit=${limit}`));
98
+ // Same parser as the local file: anything malformed is dropped.
99
+ return parseHistory((result.runs ?? []).map((run) => JSON.stringify(run)).join('\n'));
100
+ }
101
+ /** Local and cloud runs together, oldest first, without duplicates. */
102
+ export function mergeRuns(local, cloud, last) {
103
+ const seen = new Set();
104
+ const out = [];
105
+ for (const entry of [...local, ...cloud]) {
106
+ const key = `${entry.at}\u0000${entry.command}`;
107
+ if (seen.has(key))
108
+ continue;
109
+ seen.add(key);
110
+ out.push(entry);
111
+ }
112
+ return out.sort((a, b) => a.at.localeCompare(b.at)).slice(-last);
113
+ }
114
+ //# sourceMappingURL=pro-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pro-client.js","sourceRoot":"","sources":["../../src/utils/pro-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Flaky-test quarantine: a short, owned, expiring list of tests whose
3
+ * failures do not block the build while someone fixes them.
4
+ *
5
+ * Retries hide flaky tests (they pass on the second try and show green);
6
+ * skipping them hides them for good. A quarantine entry is the honest
7
+ * middle: the test still runs and its result is still reported, but a
8
+ * failure does not fail the run, and every entry names who owns the fix,
9
+ * why it is there and the date it stops counting. After that date the
10
+ * test blocks again, so quarantine cannot become a graveyard.
11
+ *
12
+ * The list lives in playwright-quarantine.json at the project root, meant
13
+ * to be committed so the whole team and CI share it (the history folder is
14
+ * git-ignored, so it does not go there).
15
+ */
16
+ import type { TestFailure } from '../types/index.js';
17
+ export declare const QUARANTINE_FILE = "playwright-quarantine.json";
18
+ export declare const DEFAULT_QUARANTINE_DAYS = 14;
19
+ export declare const MAX_QUARANTINE_DAYS = 90;
20
+ export interface QuarantineEntry {
21
+ /** Project-relative spec file, posix separators. */
22
+ file: string;
23
+ /** Test title, or its tail (the last parts of "describe › title"). */
24
+ title: string;
25
+ owner: string;
26
+ reason: string;
27
+ /** Last day the entry counts, YYYY-MM-DD (inclusive, UTC). */
28
+ until: string;
29
+ /** Day it was added, YYYY-MM-DD. */
30
+ added: string;
31
+ }
32
+ export interface QuarantineList {
33
+ version: 1;
34
+ entries: QuarantineEntry[];
35
+ }
36
+ export declare function quarantinePath(root: string): string;
37
+ export declare function today(now?: Date): string;
38
+ export declare function addDays(day: string, days: number): string;
39
+ export declare function isExpired(entry: QuarantineEntry, now?: Date): boolean;
40
+ /** Read the list; a missing file is an empty list. */
41
+ export declare function readQuarantine(root: string): Promise<QuarantineList>;
42
+ export declare function writeQuarantine(root: string, list: QuarantineList): Promise<void>;
43
+ /** Does an entry cover this test? Titles match whole, or as the tail of the title path. */
44
+ export declare function matchesEntry(entry: QuarantineEntry, test: {
45
+ file: string;
46
+ title: string;
47
+ }): boolean;
48
+ export interface QuarantineSplit {
49
+ /** Failures that still fail the run. */
50
+ blocking: TestFailure[];
51
+ /** Failures covered by an active entry. */
52
+ quarantined: Array<{
53
+ failure: TestFailure;
54
+ entry: QuarantineEntry;
55
+ }>;
56
+ /** Failures whose entry expired: they block, with a reason. */
57
+ expired: Array<{
58
+ failure: TestFailure;
59
+ entry: QuarantineEntry;
60
+ }>;
61
+ }
62
+ export declare function splitFailures(failures: TestFailure[], list: QuarantineList, now?: Date): QuarantineSplit;
63
+ /** Markdown lines for a run's quarantine section; empty when nothing matched. */
64
+ export declare function quarantineLines(split: QuarantineSplit): string[];
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Flaky-test quarantine: a short, owned, expiring list of tests whose
3
+ * failures do not block the build while someone fixes them.
4
+ *
5
+ * Retries hide flaky tests (they pass on the second try and show green);
6
+ * skipping them hides them for good. A quarantine entry is the honest
7
+ * middle: the test still runs and its result is still reported, but a
8
+ * failure does not fail the run, and every entry names who owns the fix,
9
+ * why it is there and the date it stops counting. After that date the
10
+ * test blocks again, so quarantine cannot become a graveyard.
11
+ *
12
+ * The list lives in playwright-quarantine.json at the project root, meant
13
+ * to be committed so the whole team and CI share it (the history folder is
14
+ * git-ignored, so it does not go there).
15
+ */
16
+ import { readFile } from 'node:fs/promises';
17
+ import { PlaywrightMcpError } from '../types/index.js';
18
+ import { assertRealPathInside, joinProjectPath, toNativePath, writeFileInsideRoot } from './path-utils.js';
19
+ export const QUARANTINE_FILE = 'playwright-quarantine.json';
20
+ export const DEFAULT_QUARANTINE_DAYS = 14;
21
+ export const MAX_QUARANTINE_DAYS = 90;
22
+ export function quarantinePath(root) {
23
+ return joinProjectPath(root, QUARANTINE_FILE);
24
+ }
25
+ export function today(now = new Date()) {
26
+ return now.toISOString().slice(0, 10);
27
+ }
28
+ export function addDays(day, days) {
29
+ const date = new Date(`${day}T00:00:00Z`);
30
+ date.setUTCDate(date.getUTCDate() + days);
31
+ return today(date);
32
+ }
33
+ export function isExpired(entry, now = new Date()) {
34
+ return entry.until < today(now);
35
+ }
36
+ /** Read the list; a missing file is an empty list. */
37
+ export async function readQuarantine(root) {
38
+ const file = quarantinePath(root);
39
+ const text = await readFile(toNativePath(file), 'utf8').catch(() => undefined);
40
+ if (text === undefined)
41
+ return { version: 1, entries: [] };
42
+ await assertRealPathInside(file, root);
43
+ let parsed;
44
+ try {
45
+ parsed = JSON.parse(text);
46
+ }
47
+ catch {
48
+ throw new PlaywrightMcpError(`${QUARANTINE_FILE} is not valid JSON`, 'INVALID_INPUT', {
49
+ hint: 'Fix or delete the file; quarantine add recreates it.',
50
+ });
51
+ }
52
+ const raw = parsed.entries;
53
+ const entries = Array.isArray(raw)
54
+ ? raw.filter((e) => !!e &&
55
+ typeof e === 'object' &&
56
+ typeof e.file === 'string' &&
57
+ typeof e.title === 'string' &&
58
+ typeof e.until === 'string')
59
+ : [];
60
+ return { version: 1, entries };
61
+ }
62
+ export async function writeQuarantine(root, list) {
63
+ const sorted = [...list.entries].sort((a, b) => a.file.localeCompare(b.file) || a.title.localeCompare(b.title));
64
+ await writeFileInsideRoot(quarantinePath(root), `${JSON.stringify({ version: 1, entries: sorted }, null, 2)}\n`, root);
65
+ }
66
+ /** Does an entry cover this test? Titles match whole, or as the tail of the title path. */
67
+ export function matchesEntry(entry, test) {
68
+ if (entry.file !== test.file)
69
+ return false;
70
+ return test.title === entry.title || test.title.endsWith(` › ${entry.title}`);
71
+ }
72
+ export function splitFailures(failures, list, now = new Date()) {
73
+ const split = { blocking: [], quarantined: [], expired: [] };
74
+ for (const failure of failures) {
75
+ const entry = list.entries.find((e) => matchesEntry(e, failure));
76
+ if (!entry)
77
+ split.blocking.push(failure);
78
+ else if (isExpired(entry, now)) {
79
+ split.expired.push({ failure, entry });
80
+ split.blocking.push(failure);
81
+ }
82
+ else
83
+ split.quarantined.push({ failure, entry });
84
+ }
85
+ return split;
86
+ }
87
+ /** Markdown lines for a run's quarantine section; empty when nothing matched. */
88
+ export function quarantineLines(split) {
89
+ const lines = [];
90
+ if (split.quarantined.length > 0) {
91
+ lines.push(`### 🧊 ${split.quarantined.length} quarantined failure(s), not blocking`, '');
92
+ for (const { failure, entry } of split.quarantined) {
93
+ lines.push(`- \`${failure.file}\` · ${failure.title} — owner **${entry.owner}**, until ${entry.until}: ${entry.reason}`);
94
+ }
95
+ lines.push('');
96
+ }
97
+ if (split.expired.length > 0) {
98
+ lines.push(`### ⏰ ${split.expired.length} quarantine(s) expired: these failures block again`, '');
99
+ for (const { failure, entry } of split.expired) {
100
+ lines.push(`- \`${failure.file}\` · ${failure.title} — owner **${entry.owner}**, expired ${entry.until}. Fix it, or extend it with **quarantine** and a new reason.`);
101
+ }
102
+ lines.push('');
103
+ }
104
+ return lines;
105
+ }
106
+ //# sourceMappingURL=quarantine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarantine.js","sourceRoot":"","sources":["../../src/utils/quarantine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Heal guard: compare a test file before and after a fix and catch the
3
+ * changes that make a failing test pass by testing less — an assertion
4
+ * deleted, a test skipped or removed, a matcher swapped for a weaker one,
5
+ * a hard wait, a forced click, an error swallowed, a timeout or retry
6
+ * count blown up.
7
+ *
8
+ * AI healers (Playwright's Healer agent, ours, any agent editing specs)
9
+ * are good at turning red tests green; this is the reviewer that checks
10
+ * they did it honestly. The scan is lexical: strings and comments are
11
+ * masked so their words do not count, then each test(...) call is matched
12
+ * by its describe path and title across the two versions.
13
+ */
14
+ export type GuardSeverity = 'block' | 'warn';
15
+ export interface GuardFinding {
16
+ severity: GuardSeverity;
17
+ rule: string;
18
+ /** "describe › title", or undefined for file-level findings. */
19
+ test?: string;
20
+ message: string;
21
+ /** 1-based line in the new version, when the test still exists. */
22
+ line?: number;
23
+ }
24
+ export interface GuardFileResult {
25
+ file: string;
26
+ findings: GuardFinding[];
27
+ testsBefore: number;
28
+ testsAfter: number;
29
+ }
30
+ export type GuardVerdict = 'BLOCK' | 'WARN' | 'OK';
31
+ /**
32
+ * Replace the inside of strings, template literals and comments with
33
+ * spaces (newlines kept), so positions and line numbers stay the same
34
+ * and no word inside them looks like code.
35
+ */
36
+ export declare function maskCode(source: string): string;
37
+ export interface TestShape {
38
+ key: string;
39
+ title: string;
40
+ line: number;
41
+ modifier?: string;
42
+ assertions: number;
43
+ soft: number;
44
+ conditionalSkips: number;
45
+ hardWaits: number;
46
+ forced: number;
47
+ swallowed: number;
48
+ tries: number;
49
+ maxTimeout: number;
50
+ strong: number;
51
+ weak: number;
52
+ body: string;
53
+ }
54
+ export interface FileShape {
55
+ tests: Map<string, TestShape>;
56
+ only: number;
57
+ describeSkips: number;
58
+ maxRetries: number;
59
+ maxDiffAllowance: number;
60
+ }
61
+ /** Find every test(...) and describe(...) with a string title, and measure each test. */
62
+ export declare function shapeOf(source: string): FileShape;
63
+ /** Compare two versions of one file. */
64
+ export declare function guardFileChange(file: string, beforeSource: string, afterSource: string | undefined): GuardFileResult;
65
+ export declare function guardVerdict(results: GuardFileResult[]): GuardVerdict;
66
+ /** Spec files and Playwright configs, the files the guard reads. */
67
+ export declare function isGuardedFile(file: string): boolean;
68
+ /** Markdown report shared by the tool and the CLI. */
69
+ export declare function renderGuardReport(results: GuardFileResult[], scope: string): string;