playwright-e2e-mcp 0.4.2 → 0.5.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 (50) hide show
  1. package/README.md +175 -33
  2. package/dist/http.d.ts +1 -1
  3. package/dist/http.js +1 -1
  4. package/dist/server.d.ts +2 -2
  5. package/dist/server.js +31 -4
  6. package/dist/server.js.map +1 -1
  7. package/dist/tools/analyze-history.d.ts +12 -1
  8. package/dist/tools/analyze-history.js +89 -5
  9. package/dist/tools/analyze-history.js.map +1 -1
  10. package/dist/tools/audit-accessibility.d.ts +85 -0
  11. package/dist/tools/audit-accessibility.js +4 -1
  12. package/dist/tools/audit-accessibility.js.map +1 -1
  13. package/dist/tools/audit-performance.d.ts +333 -0
  14. package/dist/tools/audit-performance.js +377 -0
  15. package/dist/tools/audit-performance.js.map +1 -0
  16. package/dist/tools/compare-visual-state.d.ts +84 -0
  17. package/dist/tools/generate-e2e-test.d.ts +90 -0
  18. package/dist/tools/generate-e2e-test.js +223 -34
  19. package/dist/tools/generate-e2e-test.js.map +1 -1
  20. package/dist/tools/get-failure.js +2 -1
  21. package/dist/tools/get-failure.js.map +1 -1
  22. package/dist/tools/inspect-page.d.ts +94 -0
  23. package/dist/tools/inspect-page.js +42 -5
  24. package/dist/tools/inspect-page.js.map +1 -1
  25. package/dist/tools/load-report.d.ts +48 -0
  26. package/dist/tools/load-report.js +167 -0
  27. package/dist/tools/load-report.js.map +1 -0
  28. package/dist/tools/probe-script.d.ts +7 -0
  29. package/dist/tools/probe-script.js +256 -7
  30. package/dist/tools/probe-script.js.map +1 -1
  31. package/dist/tools/shared.d.ts +137 -2
  32. package/dist/tools/shared.js +151 -7
  33. package/dist/tools/shared.js.map +1 -1
  34. package/dist/tools/suggest-fix.d.ts +35 -1
  35. package/dist/tools/suggest-fix.js +197 -17
  36. package/dist/tools/suggest-fix.js.map +1 -1
  37. package/dist/tools/validate-selector.d.ts +84 -0
  38. package/dist/tools/validate-selector.js +7 -1
  39. package/dist/tools/validate-selector.js.map +1 -1
  40. package/dist/types/index.d.ts +28 -0
  41. package/dist/utils/report-parser.d.ts +28 -3
  42. package/dist/utils/report-parser.js +77 -11
  43. package/dist/utils/report-parser.js.map +1 -1
  44. package/dist/utils/run-history.d.ts +66 -3
  45. package/dist/utils/run-history.js +149 -3
  46. package/dist/utils/run-history.js.map +1 -1
  47. package/package.json +2 -2
  48. package/skill/playwright-e2e-mcp/SKILL.md +71 -15
  49. package/skill/playwright-e2e-mcp/references/setup.md +1 -1
  50. package/skill/playwright-e2e-mcp/references/tools.md +67 -6
@@ -9,7 +9,7 @@
9
9
  * behind a login can be inspected.
10
10
  */
11
11
  import { z } from 'zod';
12
- import { assertHttpUrl, bestLocator, clipLines, describePageState, guard, loginHint, pageStateShape, resolvePageState, resolveProjectRoot, runBrowserScript, toolError, toolText, } from './shared.js';
12
+ import { assertHttpUrl, bestLocator, clipLines, describePageState, describeRouteHits, guard, loginHint, pageStateShape, resolvePageState, resolveProjectRoot, runBrowserScript, toolError, toolText, } from './shared.js';
13
13
  import { formatLocator } from '../utils/locator-expr.js';
14
14
  import { assertUrlAllowed } from '../utils/url-policy.js';
15
15
  const inspectPageInput = z.object({
@@ -23,9 +23,9 @@ const inspectPageInput = z.object({
23
23
  .optional()
24
24
  .describe('CSS selector: inspect matches instead of the whole DOM'),
25
25
  view: z
26
- .enum(['elements', 'locators'])
26
+ .enum(['elements', 'locators', 'aria'])
27
27
  .optional()
28
- .describe("'locators': compact map of interactive elements (cheapest); 'elements' (default): DOM inventory"),
28
+ .describe("'locators': compact map of interactive elements (cheapest); 'aria': accessibility snapshot + toMatchAriaSnapshot check (scoped by selector); 'elements' (default): DOM inventory"),
29
29
  waitFor: z
30
30
  .string()
31
31
  .optional()
@@ -46,6 +46,26 @@ const inspectPageInput = z.object({
46
46
  .describe('Overall inspection limit in ms (default 45000)'),
47
47
  });
48
48
  export const inspectPageSchema = inspectPageInput;
49
+ /**
50
+ * A toMatchAriaSnapshot assertion for a captured snapshot. The template
51
+ * literal is escaped so backticks and `${` in page text stay literal.
52
+ */
53
+ export function ariaAssertion(snapshot, selector) {
54
+ return ['```ts', ariaAssertionCode(snapshot, selector), '```'].join('\n');
55
+ }
56
+ /** The assertion statement itself, indented by `indent` spaces. */
57
+ export function ariaAssertionCode(snapshot, selector, indent = 0) {
58
+ const pad = ' '.repeat(indent);
59
+ const body = snapshot
60
+ .replace(/\\/g, '\\\\')
61
+ .replace(/`/g, '\\`')
62
+ .replace(/\$\{/g, '\\${')
63
+ .split('\n')
64
+ .map((line) => `${pad} ${line}`)
65
+ .join('\n');
66
+ const target = selector ? `page.locator(${JSON.stringify(selector)})` : "page.locator('body')";
67
+ return [`${pad}await expect(${target}).toMatchAriaSnapshot(\``, body, `${pad}\`);`].join('\n');
68
+ }
49
69
  function renderLocatorLine(element, position) {
50
70
  const best = bestLocator(element);
51
71
  const alt = (element.locators ?? []).slice(1).map((chain) => `\`${formatLocator(chain)}\``);
@@ -76,7 +96,7 @@ function renderElement(element, position) {
76
96
  }
77
97
  export const inspectPageTool = {
78
98
  name: 'inspect-page',
79
- description: "Open a URL headlessly and return its elements with Playwright locators proven unique on the page (role + name first), CSS selectors, visibility, text and console messages. storageState/headers open it signed in; actions click/fill first to reach a state. view 'locators' is the compact map.",
99
+ description: "Open a URL headlessly and return its elements with Playwright locators proven unique on the page (role + name first), CSS selectors, visibility, text and console messages. storageState/headers open it signed in; actions click/fill first to reach a state. view 'locators' is the compact map; view 'aria' returns the accessibility snapshot plus a ready toMatchAriaSnapshot assertion.",
80
100
  inputSchema: inspectPageSchema,
81
101
  handler: async (args, ctx) => guard('inspect-page', async () => {
82
102
  const url = assertHttpUrl(args.url);
@@ -84,7 +104,7 @@ export const inspectPageTool = {
84
104
  const root = await resolveProjectRoot(args.projectRoot, ctx);
85
105
  const state = await resolvePageState(args, root, url, ctx);
86
106
  const timeoutMs = args.timeoutMs ?? 45_000;
87
- const view = args.selector ? 'elements' : (args.view ?? 'elements');
107
+ const view = args.view === 'aria' ? 'aria' : args.selector ? 'elements' : (args.view ?? 'elements');
88
108
  const outcome = await runBrowserScript({
89
109
  ...state,
90
110
  mode: 'inspect',
@@ -115,12 +135,29 @@ export const inspectPageTool = {
115
135
  const stateLine = describePageState(state, root);
116
136
  if (stateLine)
117
137
  lines.push(`**Page state:** ${stateLine}`);
138
+ const mocks = describeRouteHits(state, data.routeHits);
139
+ if (mocks.length > 0)
140
+ lines.push('**Network mocks:**', ...mocks);
118
141
  if (data.actionsDone?.length)
119
142
  lines.push(`**Steps run:** ${data.actionsDone.join('; ')}`);
120
143
  lines.push('');
121
144
  const login = loginHint(data.finalUrl, state);
122
145
  if (login)
123
146
  lines.push(`> 🔒 ${login}`, '');
147
+ if (view === 'aria') {
148
+ if (data.ariaSnapshot === undefined) {
149
+ lines.push(`_\`${args.selector}\` matched no element._`);
150
+ return toolText(lines.join('\n'));
151
+ }
152
+ lines.push(`### Accessibility snapshot${args.selector ? ` of \`${args.selector}\`${data.matchCount > 1 ? ` (first of ${data.matchCount})` : ''}` : ''}${data.ariaTruncated ? ' (truncated)' : ''}`, '', '```yaml', data.ariaSnapshot, '```', '');
153
+ if (!data.ariaTruncated) {
154
+ lines.push('### Assertion', '', 'Paste into a test to lock this structure. Trim lines you do not care about; partial snapshots match, and `/regex/` names tolerate changing text.', '', ariaAssertion(data.ariaSnapshot, args.selector));
155
+ }
156
+ else {
157
+ lines.push('> The snapshot was cut. Pass a narrower `selector` to get a complete one with an assertion.');
158
+ }
159
+ return toolText(lines.join('\n'));
160
+ }
124
161
  const heading = args.selector
125
162
  ? `### Matches for \`${args.selector}\` (${data.matchCount})`
126
163
  : view === 'locators'
@@ -1 +1 @@
1
- {"version":3,"file":"inspect-page.js","sourceRoot":"","sources":["../../src/tools/inspect-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,aAAa,EACb,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,KAAK,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,SAAS,EACT,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACrE,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,sEAAsE,CAAC;IACnF,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wDAAwD,CAAC;IACrE,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SAC9B,QAAQ,EAAE;SACV,QAAQ,CAAC,iGAAiG,CAAC;IAC9G,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,8BAA8B,CAAC;IAC3C,GAAG,cAAc;IACjB,SAAS,EAAE,CAAC;SACT,IAAI,CAAC,CAAC,MAAM,EAAE,kBAAkB,EAAE,aAAa,CAAC,CAAC;SACjD,QAAQ,EAAE;SACV,QAAQ,CAAC,sDAAsD,CAAC;IACnE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACrF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kDAAkD,CAAC;IAC9H,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,KAAK,CAAC;SACV,GAAG,CAAC,OAAO,CAAC;SACZ,QAAQ,EAAE;SACV,QAAQ,CAAC,gDAAgD,CAAC;CAC9D,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,SAAS,iBAAiB,CAAC,OAAoB,EAAE,QAAgB;IAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5F,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC1H,OAAO,GAAG,QAAQ,OAAO,IAAI,IAAI,OAAO,CAAC,QAAQ,QAAQ,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACvH,CAAC;AAED,SAAS,aAAa,CAAC,OAAoB,EAAE,QAAgB;IAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;QACrB,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,QAAQ,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG;QACrF,CAAC,CAAC,QAAQ,CAAC;IACb,MAAM,KAAK,GAAG;QACZ,GAAG,QAAQ,OAAO,OAAO,CAAC,QAAQ,UAAU,OAAO,CAAC,GAAG,QAAQ,UAAU,MAAM,GAAG,EAAE;KACrF,CAAC;IACF,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,CAAC;IAChF,IAAI,OAAO,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CACrD,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,IAAI,CAC9C,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,KAAK;aAChB,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;QACnG,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,oSAAoS;IACtS,WAAW,EAAE,iBAAiB;IAC9B,OAAO,EAAE,KAAK,EAAE,IAAsB,EAAE,GAAgB,EAAyB,EAAE,CACjF,KAAK,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC/B,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CACpC;YACE,GAAG,KAAK;YACR,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,IAAI;YACjB,GAAG;YACH,IAAI;YACJ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC;YAC/C,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;YACjE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,EACD,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAClC,CAAC;QAEF,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,2CAA2C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5H,OAAO,SAAS,CACd,OAAO,CAAC,IAAI,IAAI,SAAS,EACzB,qBAAqB,GAAG,KAAK,OAAO,CAAC,KAAK,IAAI,eAAe,GAAG,IAAI,EAAE,EACtE,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,UAAU,CACnB,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAK,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,SAAS,CACd,cAAc,EACd,qBAAqB,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,UAAU,EAAE,EACzD,qFAAqF,CACtF,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CACR,YAAY,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EACzF,iBAAiB,IAAI,CAAC,YAAY,sBAAsB,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,kBAAkB,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CACzK,CAAC;QACF,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,WAAW,EAAE,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ;YAC3B,CAAC,CAAC,qBAAqB,IAAI,CAAC,QAAQ,OAAO,IAAI,CAAC,UAAU,GAAG;YAC7D,CAAC,CAAC,IAAI,KAAK,UAAU;gBACnB,CAAC,CAAC,oBAAoB,IAAI,CAAC,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,UAAU,0DAA0D;gBAC1H,CAAC,CAAC,yBAAyB,IAAI,CAAC,QAAQ,CAAC,MAAM,OAAO,IAAI,CAAC,YAAY,YAAY,CAAC;QACxF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,mCAAmC,EAAE,EAAE,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC;QAC1H,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,IAAI,OAAO,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,QAAQ,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC1E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CACR,WAAW,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,EAClF,EAAE,EACF,SAAS,EACT,IAAI,CAAC,IAAI,EACT,KAAK,EACL,EAAE,CACH,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,QAAQ,cAAc,IAAI,CAAC,UAAU,0EAA0E,CAC5H,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC,CAAC;CACL,CAAC"}
1
+ {"version":3,"file":"inspect-page.js","sourceRoot":"","sources":["../../src/tools/inspect-page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Tool 14 — load-report: bring a run that happened elsewhere (a CI job, a
3
+ * teammate's machine) into the same diagnosis loop as a local run.
4
+ *
5
+ * It reads a Playwright JSON report (or merges a folder of blob reports
6
+ * from sharded jobs), rebases the CI machine's absolute paths onto the
7
+ * local checkout, finds the trace archives wherever the job's
8
+ * test-results artifact was unpacked, and makes the result the "last run",
9
+ * so get-failure, suggest-fix and diagnose-flaky work on it exactly as on
10
+ * a run-test result. The run is recorded in the history with the commit
11
+ * it tested, so analyze-history covers CI as well.
12
+ */
13
+ import { z } from 'zod';
14
+ import type { ToolContext, ToolResponse } from '../types/index.js';
15
+ declare const loadReportInput: z.ZodObject<{
16
+ report: z.ZodString;
17
+ traceDirs: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ commit: z.ZodOptional<z.ZodString>;
19
+ branch: z.ZodOptional<z.ZodString>;
20
+ record: z.ZodOptional<z.ZodBoolean>;
21
+ projectRoot: z.ZodOptional<z.ZodString>;
22
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
23
+ }, z.core.$strip>;
24
+ export type LoadReportInput = z.infer<typeof loadReportInput>;
25
+ export declare const loadReportSchema: z.ZodObject<{
26
+ report: z.ZodString;
27
+ traceDirs: z.ZodOptional<z.ZodArray<z.ZodString>>;
28
+ commit: z.ZodOptional<z.ZodString>;
29
+ branch: z.ZodOptional<z.ZodString>;
30
+ record: z.ZodOptional<z.ZodBoolean>;
31
+ projectRoot: z.ZodOptional<z.ZodString>;
32
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
33
+ }, z.core.$strip>;
34
+ export declare const loadReportTool: {
35
+ name: string;
36
+ description: string;
37
+ inputSchema: z.ZodObject<{
38
+ report: z.ZodString;
39
+ traceDirs: z.ZodOptional<z.ZodArray<z.ZodString>>;
40
+ commit: z.ZodOptional<z.ZodString>;
41
+ branch: z.ZodOptional<z.ZodString>;
42
+ record: z.ZodOptional<z.ZodBoolean>;
43
+ projectRoot: z.ZodOptional<z.ZodString>;
44
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
45
+ }, z.core.$strip>;
46
+ handler: (args: LoadReportInput, ctx: ToolContext) => Promise<ToolResponse>;
47
+ };
48
+ export {};
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Tool 14 — load-report: bring a run that happened elsewhere (a CI job, a
3
+ * teammate's machine) into the same diagnosis loop as a local run.
4
+ *
5
+ * It reads a Playwright JSON report (or merges a folder of blob reports
6
+ * from sharded jobs), rebases the CI machine's absolute paths onto the
7
+ * local checkout, finds the trace archives wherever the job's
8
+ * test-results artifact was unpacked, and makes the result the "last run",
9
+ * so get-failure, suggest-fix and diagnose-flaky work on it exactly as on
10
+ * a run-test result. The run is recorded in the history with the commit
11
+ * it tested, so analyze-history covers CI as well.
12
+ */
13
+ import { readdir, readFile, rm, stat } from 'node:fs/promises';
14
+ import { z } from 'zod';
15
+ import { PlaywrightMcpError } from '../types/index.js';
16
+ import { parseReportJson } from '../utils/report-parser.js';
17
+ import { childEnv, resolvePlaywrightCli, runProcess } from '../utils/playwright-runner.js';
18
+ import { recordRun } from '../utils/run-history.js';
19
+ import { assertRealPathInside, normalizePath, relativeToRoot, resolvePath, sanitizeUserPath, tempFilePath, toNativePath, } from '../utils/path-utils.js';
20
+ import { guard, resolveProjectRoot, toolText } from './shared.js';
21
+ import { renderRunResult } from './run-test.js';
22
+ const MAX_REPORT_BYTES = 200_000_000;
23
+ const loadReportInput = z.object({
24
+ report: z
25
+ .string()
26
+ .describe('Playwright JSON report inside the project (e.g. ci-artifacts/results.json), or a folder of blob reports (*.zip) from sharded jobs'),
27
+ traceDirs: z
28
+ .array(z.string())
29
+ .max(10)
30
+ .optional()
31
+ .describe("Folders inside the project where the job's test-results artifact was unpacked (default: the report's folder and its parent)"),
32
+ commit: z.string().max(64).optional().describe('Commit the run tested (default: read from the report metadata)'),
33
+ branch: z.string().max(200).optional(),
34
+ record: z.boolean().optional().describe('Add the run to the local history for analyze-history (default true)'),
35
+ projectRoot: z.string().optional(),
36
+ timeoutMs: z.number().int().min(5_000).max(600_000).optional().describe('Limit for merging blob reports (default 120000)'),
37
+ });
38
+ export const loadReportSchema = loadReportInput;
39
+ function parentOf(p) {
40
+ const i = p.lastIndexOf('/');
41
+ return i > 0 ? p.slice(0, i) : p;
42
+ }
43
+ /** Merge blob reports with the project's Playwright into one JSON report. */
44
+ async function mergeBlobReports(dir, root, ctx, timeoutMs) {
45
+ const entries = await readdir(toNativePath(dir));
46
+ if (!entries.some((name) => name.endsWith('.zip'))) {
47
+ throw new PlaywrightMcpError(`No blob reports (*.zip) in ${relativeToRoot(root, dir)}`, 'REPORT_MISSING', {
48
+ hint: 'Point `report` at the JSON report file, or at the folder holding the blob-report zips from every shard.',
49
+ });
50
+ }
51
+ const cli = await resolvePlaywrightCli(root);
52
+ if (!cli) {
53
+ throw new PlaywrightMcpError('Playwright is not installed in this project', 'NO_PLAYWRIGHT', {
54
+ hint: 'Merging blob reports needs the project\'s Playwright: npm install -D @playwright/test',
55
+ });
56
+ }
57
+ const out = tempFilePath('pw-merged', '.json');
58
+ const outcome = await runProcess(process.execPath, [cli, 'merge-reports', '--reporter=json', toNativePath(dir)], {
59
+ cwd: root,
60
+ env: childEnv({ PLAYWRIGHT_JSON_OUTPUT_NAME: out, FORCE_COLOR: '0' }),
61
+ timeoutMs,
62
+ signal: ctx.signal,
63
+ });
64
+ const raw = await readFile(out, 'utf8').catch(() => null);
65
+ await rm(out, { force: true }).catch(() => undefined);
66
+ if (raw === null) {
67
+ throw new PlaywrightMcpError(`playwright merge-reports produced no report${outcome.timedOut ? ' (timed out)' : ''}`, outcome.timedOut ? 'TIMEOUT' : 'REPORT_MISSING', { hint: 'Check that every zip is a blob report from the same Playwright version as this project.', details: outcome.stderr.slice(-2_000) });
68
+ }
69
+ return raw;
70
+ }
71
+ export const loadReportTool = {
72
+ name: 'load-report',
73
+ description: "Load a Playwright run that happened elsewhere (a CI job's JSON report, or a folder of blob reports from shards) so get-failure, suggest-fix and diagnose-flaky work on it like a local run. CI paths are mapped onto this checkout and traces are found in the unpacked test-results artifact; the run is recorded in the history with its commit.",
74
+ inputSchema: loadReportSchema,
75
+ handler: async (args, ctx) => guard('load-report', async () => {
76
+ if (ctx.restricted) {
77
+ throw new PlaywrightMcpError('load-report is not available on this server', 'INVALID_PATH', {
78
+ hint: 'This endpoint does not read files from the project.',
79
+ });
80
+ }
81
+ const root = await resolveProjectRoot(args.projectRoot, ctx);
82
+ const reportPath = normalizePath(sanitizeUserPath(args.report.trim(), root));
83
+ await assertRealPathInside(reportPath, root);
84
+ const info = await stat(toNativePath(reportPath)).catch(() => null);
85
+ if (!info) {
86
+ throw new PlaywrightMcpError(`Report not found: ${relativeToRoot(root, reportPath)}`, 'REPORT_MISSING', {
87
+ hint: 'Download the CI artifact into the project first, e.g. `gh run download <run-id> -n playwright-report -D ci-artifacts`.',
88
+ });
89
+ }
90
+ let raw;
91
+ let source;
92
+ if (info.isDirectory()) {
93
+ raw = await mergeBlobReports(reportPath, root, ctx, args.timeoutMs ?? 120_000);
94
+ source = `merged blob reports in \`${relativeToRoot(root, reportPath)}\``;
95
+ }
96
+ else {
97
+ if (info.size > MAX_REPORT_BYTES) {
98
+ throw new PlaywrightMcpError(`Report is too large (${Math.round(info.size / 1_000_000)} MB)`, 'INVALID_PATH');
99
+ }
100
+ raw = await readFile(toNativePath(reportPath), 'utf8');
101
+ source = `\`${relativeToRoot(root, reportPath)}\``;
102
+ }
103
+ const traceDirs = [];
104
+ for (const dir of args.traceDirs ?? [parentOf(reportPath), parentOf(parentOf(reportPath))]) {
105
+ const resolved = normalizePath(args.traceDirs ? sanitizeUserPath(dir, root) : resolvePath(root, dir));
106
+ try {
107
+ await assertRealPathInside(resolved, root);
108
+ traceDirs.push(resolved);
109
+ }
110
+ catch {
111
+ if (args.traceDirs)
112
+ throw new PlaywrightMcpError(`traceDirs entry is outside the project: ${dir}`, 'INVALID_PATH');
113
+ }
114
+ }
115
+ const parsed = parseReportJson(raw, root, undefined, { traceDirs });
116
+ if (parsed.parseError) {
117
+ throw new PlaywrightMcpError(parsed.parseError, 'REPORT_MISSING', {
118
+ hint: 'Pass the file written by the json reporter (`reporter: [["json", { outputFile: "results.json" }]]`), or a folder of blob-report zips.',
119
+ });
120
+ }
121
+ const git = {
122
+ ...parsed.git,
123
+ ...(args.commit ? { commit: args.commit.trim() } : {}),
124
+ ...(args.branch ? { branch: args.branch.trim() } : {}),
125
+ };
126
+ const stats = parsed.stats;
127
+ const result = {
128
+ ok: (stats?.unexpected ?? parsed.failures.length) === 0,
129
+ outcomes: parsed.outcomes,
130
+ exitCode: null,
131
+ signalName: null,
132
+ durationMs: stats?.duration ?? 0,
133
+ timedOut: false,
134
+ killed: false,
135
+ partial: false,
136
+ stats,
137
+ failures: parsed.failures,
138
+ failuresTruncated: parsed.failuresTruncated,
139
+ stdoutTail: '',
140
+ stderrTail: '',
141
+ truncatedOutput: false,
142
+ reportPath: info.isDirectory() ? undefined : toNativePath(reportPath),
143
+ command: `load-report ${relativeToRoot(root, reportPath)}`,
144
+ imported: { reportPath, traceDirs, git: Object.keys(git).length > 0 ? git : undefined },
145
+ };
146
+ ctx.store.setLastRun({ projectRoot: root, result, at: Date.now() });
147
+ let recorded = false;
148
+ if (args.record !== false) {
149
+ // An imported run records the commit it tested, never this checkout's.
150
+ recorded = await recordRun(root, result, 'load-report', { git }).catch(() => false);
151
+ }
152
+ const withTrace = parsed.failures.filter((f) => f.tracePath).length;
153
+ const lines = [
154
+ renderRunResult(result, root).replace('## Playwright run —', '## Imported run —'),
155
+ '',
156
+ `**Source:** ${source}${git.commit ? ` · commit \`${git.commit.slice(0, 8)}\`` : ''}${git.branch ? ` on \`${git.branch}\`` : ''}${git.buildUrl ? ` · [build](${git.buildUrl})` : ''}`,
157
+ ];
158
+ if (parsed.failures.length > 0) {
159
+ lines.push(withTrace === parsed.failures.length
160
+ ? `**Traces:** found for all ${withTrace} failure(s), so get-failure shows the DOM, requests and console at failure.`
161
+ : `**Traces:** found for ${withTrace} of ${parsed.failures.length} failure(s). Unpack the job's test-results artifact into the project and pass its folder as \`traceDirs\` to see the DOM at failure.`);
162
+ }
163
+ lines.push(recorded ? '**History:** recorded; `analyze-history` now includes this run.' : '**History:** not recorded.', '', '> This run is now the last run: **get-failure**, **suggest-fix** (which re-runs the fix locally) and **diagnose-flaky** work on it.');
164
+ return toolText(lines.join('\n'));
165
+ }),
166
+ };
167
+ //# sourceMappingURL=load-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"load-report.js","sourceRoot":"","sources":["../../src/tools/load-report.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,13 @@
15
15
  * on the live page or on a DOM snapshot taken from a trace
16
16
  * - a11y run axe-core on the page (or a scoped part) and describe the
17
17
  * offending elements, each with a verified locator
18
+ * - perf lab Web Vitals (LCP, CLS, TBT, INP during actions, FCP, TTFB)
19
+ * and the network cost per resource type, optionally under
20
+ * CPU and network throttling; the LCP element and the elements
21
+ * that shifted come back with verified locators
22
+ *
23
+ * Any mode that navigates applies the caller's network mocks (cfg.routes)
24
+ * first and reports how many requests each one handled.
18
25
  *
19
26
  * Every element the script reports carries Playwright locators that were
20
27
  * proven, in this same page, to resolve to exactly that one element.