playwright-e2e-mcp 0.4.1 → 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 (59) hide show
  1. package/README.md +215 -43
  2. package/dist/cli/init.js +3 -2
  3. package/dist/cli/init.js.map +1 -1
  4. package/dist/http.d.ts +6 -1
  5. package/dist/http.js +13 -3
  6. package/dist/http.js.map +1 -1
  7. package/dist/oauth.d.ts +34 -0
  8. package/dist/oauth.js +346 -0
  9. package/dist/oauth.js.map +1 -0
  10. package/dist/server.d.ts +2 -2
  11. package/dist/server.js +31 -4
  12. package/dist/server.js.map +1 -1
  13. package/dist/tools/analyze-history.d.ts +12 -1
  14. package/dist/tools/analyze-history.js +89 -5
  15. package/dist/tools/analyze-history.js.map +1 -1
  16. package/dist/tools/audit-accessibility.d.ts +85 -0
  17. package/dist/tools/audit-accessibility.js +4 -1
  18. package/dist/tools/audit-accessibility.js.map +1 -1
  19. package/dist/tools/audit-performance.d.ts +333 -0
  20. package/dist/tools/audit-performance.js +377 -0
  21. package/dist/tools/audit-performance.js.map +1 -0
  22. package/dist/tools/compare-visual-state.d.ts +84 -0
  23. package/dist/tools/generate-e2e-test.d.ts +90 -0
  24. package/dist/tools/generate-e2e-test.js +223 -34
  25. package/dist/tools/generate-e2e-test.js.map +1 -1
  26. package/dist/tools/get-failure.js +2 -1
  27. package/dist/tools/get-failure.js.map +1 -1
  28. package/dist/tools/inspect-page.d.ts +94 -0
  29. package/dist/tools/inspect-page.js +42 -5
  30. package/dist/tools/inspect-page.js.map +1 -1
  31. package/dist/tools/load-report.d.ts +48 -0
  32. package/dist/tools/load-report.js +167 -0
  33. package/dist/tools/load-report.js.map +1 -0
  34. package/dist/tools/probe-script.d.ts +7 -0
  35. package/dist/tools/probe-script.js +256 -7
  36. package/dist/tools/probe-script.js.map +1 -1
  37. package/dist/tools/shared.d.ts +137 -2
  38. package/dist/tools/shared.js +155 -8
  39. package/dist/tools/shared.js.map +1 -1
  40. package/dist/tools/suggest-fix.d.ts +35 -1
  41. package/dist/tools/suggest-fix.js +197 -17
  42. package/dist/tools/suggest-fix.js.map +1 -1
  43. package/dist/tools/validate-selector.d.ts +84 -0
  44. package/dist/tools/validate-selector.js +7 -1
  45. package/dist/tools/validate-selector.js.map +1 -1
  46. package/dist/types/index.d.ts +28 -0
  47. package/dist/utils/project-detector.d.ts +7 -0
  48. package/dist/utils/project-detector.js +11 -0
  49. package/dist/utils/project-detector.js.map +1 -1
  50. package/dist/utils/report-parser.d.ts +28 -3
  51. package/dist/utils/report-parser.js +77 -11
  52. package/dist/utils/report-parser.js.map +1 -1
  53. package/dist/utils/run-history.d.ts +66 -3
  54. package/dist/utils/run-history.js +149 -3
  55. package/dist/utils/run-history.js.map +1 -1
  56. package/package.json +5 -3
  57. package/skill/playwright-e2e-mcp/SKILL.md +71 -15
  58. package/skill/playwright-e2e-mcp/references/setup.md +1 -1
  59. package/skill/playwright-e2e-mcp/references/tools.md +67 -6
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Tool 13 — audit-performance: load a page in a real browser and return the
3
+ * lab Web Vitals (LCP, CLS, TBT, INP during `actions`, FCP, TTFB) rated
4
+ * against Google's thresholds or the caller's budgets, what each one is
5
+ * caused by (the LCP element and the elements that shifted, as verified
6
+ * Playwright locators; long tasks; render-blocking and heavy requests) and a
7
+ * budget check to paste into a spec.
8
+ *
9
+ * It takes the same page state as inspect-page (storageState, headers,
10
+ * actions, routes), so signed-in dashboards and later steps of a flow can be
11
+ * measured, and it can emulate a mid-range phone on a slow 4G network.
12
+ * Lab numbers vary between loads, so `runs` reports the median.
13
+ */
14
+ import { z } from 'zod';
15
+ import type { ToolContext, ToolResponse } from '../types/index.js';
16
+ import { type BrowserScriptData, type NetworkProfile, type PerformanceScan } from './shared.js';
17
+ /**
18
+ * Lighthouse's mobile preset: a mid-range phone (4x slower CPU) on slow 4G
19
+ * (150 ms RTT and 1.6 Mbps, with DevTools' packet-level adjustment).
20
+ */
21
+ export declare const MOBILE_PROFILE: {
22
+ cpuThrottle: number;
23
+ network: NetworkProfile;
24
+ viewport: {
25
+ width: number;
26
+ height: number;
27
+ };
28
+ };
29
+ export type MetricId = 'lcp' | 'cls' | 'inp' | 'tbt' | 'fcp' | 'ttfb';
30
+ interface MetricSpec {
31
+ id: MetricId;
32
+ label: string;
33
+ /** "good" ceiling and "poor" floor (Google's Web Vitals / Lighthouse). */
34
+ good: number;
35
+ poor: number;
36
+ unit: 'ms' | 'score';
37
+ }
38
+ export declare const METRICS: readonly MetricSpec[];
39
+ declare const budgetsShape: z.ZodObject<{
40
+ lcpMs: z.ZodOptional<z.ZodNumber>;
41
+ cls: z.ZodOptional<z.ZodNumber>;
42
+ inpMs: z.ZodOptional<z.ZodNumber>;
43
+ tbtMs: z.ZodOptional<z.ZodNumber>;
44
+ fcpMs: z.ZodOptional<z.ZodNumber>;
45
+ ttfbMs: z.ZodOptional<z.ZodNumber>;
46
+ transferKb: z.ZodOptional<z.ZodNumber>;
47
+ requests: z.ZodOptional<z.ZodNumber>;
48
+ }, z.core.$strip>;
49
+ declare const auditPerformanceInput: z.ZodObject<{
50
+ storageState: z.ZodOptional<z.ZodString>;
51
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
52
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
53
+ type: z.ZodEnum<{
54
+ check: "check";
55
+ click: "click";
56
+ dblclick: "dblclick";
57
+ fill: "fill";
58
+ goto: "goto";
59
+ hover: "hover";
60
+ press: "press";
61
+ select: "select";
62
+ uncheck: "uncheck";
63
+ wait: "wait";
64
+ }>;
65
+ locator: z.ZodOptional<z.ZodString>;
66
+ value: z.ZodOptional<z.ZodString>;
67
+ url: z.ZodOptional<z.ZodString>;
68
+ ms: z.ZodOptional<z.ZodNumber>;
69
+ }, z.core.$strip>>>;
70
+ routes: z.ZodOptional<z.ZodArray<z.ZodObject<{
71
+ url: z.ZodString;
72
+ method: z.ZodOptional<z.ZodString>;
73
+ status: z.ZodOptional<z.ZodNumber>;
74
+ json: z.ZodOptional<z.ZodUnknown>;
75
+ body: z.ZodOptional<z.ZodString>;
76
+ contentType: z.ZodOptional<z.ZodString>;
77
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
78
+ abort: z.ZodOptional<z.ZodBoolean>;
79
+ delayMs: z.ZodOptional<z.ZodNumber>;
80
+ }, z.core.$strip>>>;
81
+ viewport: z.ZodOptional<z.ZodObject<{
82
+ width: z.ZodNumber;
83
+ height: z.ZodNumber;
84
+ }, z.core.$strip>>;
85
+ har: z.ZodOptional<z.ZodObject<{
86
+ path: z.ZodString;
87
+ mode: z.ZodOptional<z.ZodEnum<{
88
+ record: "record";
89
+ replay: "replay";
90
+ }>>;
91
+ url: z.ZodOptional<z.ZodString>;
92
+ notFound: z.ZodOptional<z.ZodEnum<{
93
+ abort: "abort";
94
+ fallback: "fallback";
95
+ }>>;
96
+ }, z.core.$strip>>;
97
+ browser: z.ZodOptional<z.ZodEnum<{
98
+ chromium: "chromium";
99
+ firefox: "firefox";
100
+ webkit: "webkit";
101
+ }>>;
102
+ url: z.ZodString;
103
+ projectRoot: z.ZodOptional<z.ZodString>;
104
+ throttle: z.ZodOptional<z.ZodEnum<{
105
+ mobile: "mobile";
106
+ none: "none";
107
+ }>>;
108
+ cpuSlowdown: z.ZodOptional<z.ZodNumber>;
109
+ runs: z.ZodOptional<z.ZodNumber>;
110
+ budgets: z.ZodOptional<z.ZodObject<{
111
+ lcpMs: z.ZodOptional<z.ZodNumber>;
112
+ cls: z.ZodOptional<z.ZodNumber>;
113
+ inpMs: z.ZodOptional<z.ZodNumber>;
114
+ tbtMs: z.ZodOptional<z.ZodNumber>;
115
+ fcpMs: z.ZodOptional<z.ZodNumber>;
116
+ ttfbMs: z.ZodOptional<z.ZodNumber>;
117
+ transferKb: z.ZodOptional<z.ZodNumber>;
118
+ requests: z.ZodOptional<z.ZodNumber>;
119
+ }, z.core.$strip>>;
120
+ waitFor: z.ZodOptional<z.ZodString>;
121
+ waitUntil: z.ZodOptional<z.ZodEnum<{
122
+ domcontentloaded: "domcontentloaded";
123
+ load: "load";
124
+ networkidle: "networkidle";
125
+ }>>;
126
+ settleMs: z.ZodOptional<z.ZodNumber>;
127
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
128
+ }, z.core.$strip>;
129
+ export type AuditPerformanceInput = z.infer<typeof auditPerformanceInput>;
130
+ export type PerformanceBudgets = z.infer<typeof budgetsShape>;
131
+ export declare const auditPerformanceSchema: z.ZodObject<{
132
+ storageState: z.ZodOptional<z.ZodString>;
133
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
134
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
135
+ type: z.ZodEnum<{
136
+ check: "check";
137
+ click: "click";
138
+ dblclick: "dblclick";
139
+ fill: "fill";
140
+ goto: "goto";
141
+ hover: "hover";
142
+ press: "press";
143
+ select: "select";
144
+ uncheck: "uncheck";
145
+ wait: "wait";
146
+ }>;
147
+ locator: z.ZodOptional<z.ZodString>;
148
+ value: z.ZodOptional<z.ZodString>;
149
+ url: z.ZodOptional<z.ZodString>;
150
+ ms: z.ZodOptional<z.ZodNumber>;
151
+ }, z.core.$strip>>>;
152
+ routes: z.ZodOptional<z.ZodArray<z.ZodObject<{
153
+ url: z.ZodString;
154
+ method: z.ZodOptional<z.ZodString>;
155
+ status: z.ZodOptional<z.ZodNumber>;
156
+ json: z.ZodOptional<z.ZodUnknown>;
157
+ body: z.ZodOptional<z.ZodString>;
158
+ contentType: z.ZodOptional<z.ZodString>;
159
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
160
+ abort: z.ZodOptional<z.ZodBoolean>;
161
+ delayMs: z.ZodOptional<z.ZodNumber>;
162
+ }, z.core.$strip>>>;
163
+ viewport: z.ZodOptional<z.ZodObject<{
164
+ width: z.ZodNumber;
165
+ height: z.ZodNumber;
166
+ }, z.core.$strip>>;
167
+ har: z.ZodOptional<z.ZodObject<{
168
+ path: z.ZodString;
169
+ mode: z.ZodOptional<z.ZodEnum<{
170
+ record: "record";
171
+ replay: "replay";
172
+ }>>;
173
+ url: z.ZodOptional<z.ZodString>;
174
+ notFound: z.ZodOptional<z.ZodEnum<{
175
+ abort: "abort";
176
+ fallback: "fallback";
177
+ }>>;
178
+ }, z.core.$strip>>;
179
+ browser: z.ZodOptional<z.ZodEnum<{
180
+ chromium: "chromium";
181
+ firefox: "firefox";
182
+ webkit: "webkit";
183
+ }>>;
184
+ url: z.ZodString;
185
+ projectRoot: z.ZodOptional<z.ZodString>;
186
+ throttle: z.ZodOptional<z.ZodEnum<{
187
+ mobile: "mobile";
188
+ none: "none";
189
+ }>>;
190
+ cpuSlowdown: z.ZodOptional<z.ZodNumber>;
191
+ runs: z.ZodOptional<z.ZodNumber>;
192
+ budgets: z.ZodOptional<z.ZodObject<{
193
+ lcpMs: z.ZodOptional<z.ZodNumber>;
194
+ cls: z.ZodOptional<z.ZodNumber>;
195
+ inpMs: z.ZodOptional<z.ZodNumber>;
196
+ tbtMs: z.ZodOptional<z.ZodNumber>;
197
+ fcpMs: z.ZodOptional<z.ZodNumber>;
198
+ ttfbMs: z.ZodOptional<z.ZodNumber>;
199
+ transferKb: z.ZodOptional<z.ZodNumber>;
200
+ requests: z.ZodOptional<z.ZodNumber>;
201
+ }, z.core.$strip>>;
202
+ waitFor: z.ZodOptional<z.ZodString>;
203
+ waitUntil: z.ZodOptional<z.ZodEnum<{
204
+ domcontentloaded: "domcontentloaded";
205
+ load: "load";
206
+ networkidle: "networkidle";
207
+ }>>;
208
+ settleMs: z.ZodOptional<z.ZodNumber>;
209
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
210
+ }, z.core.$strip>;
211
+ export type Rating = 'good' | 'needs-improvement' | 'poor';
212
+ export declare function rate(id: MetricId, value: number): Rating;
213
+ export declare function metricValue(scan: PerformanceScan, id: MetricId): number | undefined;
214
+ export declare function formatMs(ms: number): string;
215
+ export declare function formatBytes(bytes: number): string;
216
+ /**
217
+ * Combine several runs: every number is the median of the runs that
218
+ * measured it, and the details (LCP element, resources) come from the run
219
+ * whose LCP is closest to that median.
220
+ */
221
+ export declare function mergeRuns(runs: BrowserScriptData[]): {
222
+ data: BrowserScriptData;
223
+ spread?: {
224
+ lcp: [number, number];
225
+ };
226
+ };
227
+ interface MetricRow {
228
+ spec: MetricSpec;
229
+ value?: number;
230
+ rating?: Rating;
231
+ budget?: number;
232
+ overBudget: boolean;
233
+ }
234
+ export declare function metricRows(scan: PerformanceScan, budgets?: PerformanceBudgets): MetricRow[];
235
+ /** Concrete causes and fixes for the metrics that are not good. */
236
+ export declare function perfFindings(data: BrowserScriptData): string[];
237
+ export declare function budgetCheck(url: string, budgets: PerformanceBudgets | undefined): string;
238
+ export declare function renderPerformance(url: string, data: BrowserScriptData, options: {
239
+ budgets?: PerformanceBudgets;
240
+ profile: string;
241
+ runs: number;
242
+ spread?: {
243
+ lcp: [number, number];
244
+ };
245
+ stateLine?: string;
246
+ routeLines?: string[];
247
+ }): string;
248
+ export declare const auditPerformanceTool: {
249
+ name: string;
250
+ description: string;
251
+ inputSchema: z.ZodObject<{
252
+ storageState: z.ZodOptional<z.ZodString>;
253
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
254
+ actions: z.ZodOptional<z.ZodArray<z.ZodObject<{
255
+ type: z.ZodEnum<{
256
+ check: "check";
257
+ click: "click";
258
+ dblclick: "dblclick";
259
+ fill: "fill";
260
+ goto: "goto";
261
+ hover: "hover";
262
+ press: "press";
263
+ select: "select";
264
+ uncheck: "uncheck";
265
+ wait: "wait";
266
+ }>;
267
+ locator: z.ZodOptional<z.ZodString>;
268
+ value: z.ZodOptional<z.ZodString>;
269
+ url: z.ZodOptional<z.ZodString>;
270
+ ms: z.ZodOptional<z.ZodNumber>;
271
+ }, z.core.$strip>>>;
272
+ routes: z.ZodOptional<z.ZodArray<z.ZodObject<{
273
+ url: z.ZodString;
274
+ method: z.ZodOptional<z.ZodString>;
275
+ status: z.ZodOptional<z.ZodNumber>;
276
+ json: z.ZodOptional<z.ZodUnknown>;
277
+ body: z.ZodOptional<z.ZodString>;
278
+ contentType: z.ZodOptional<z.ZodString>;
279
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
280
+ abort: z.ZodOptional<z.ZodBoolean>;
281
+ delayMs: z.ZodOptional<z.ZodNumber>;
282
+ }, z.core.$strip>>>;
283
+ viewport: z.ZodOptional<z.ZodObject<{
284
+ width: z.ZodNumber;
285
+ height: z.ZodNumber;
286
+ }, z.core.$strip>>;
287
+ har: z.ZodOptional<z.ZodObject<{
288
+ path: z.ZodString;
289
+ mode: z.ZodOptional<z.ZodEnum<{
290
+ record: "record";
291
+ replay: "replay";
292
+ }>>;
293
+ url: z.ZodOptional<z.ZodString>;
294
+ notFound: z.ZodOptional<z.ZodEnum<{
295
+ abort: "abort";
296
+ fallback: "fallback";
297
+ }>>;
298
+ }, z.core.$strip>>;
299
+ browser: z.ZodOptional<z.ZodEnum<{
300
+ chromium: "chromium";
301
+ firefox: "firefox";
302
+ webkit: "webkit";
303
+ }>>;
304
+ url: z.ZodString;
305
+ projectRoot: z.ZodOptional<z.ZodString>;
306
+ throttle: z.ZodOptional<z.ZodEnum<{
307
+ mobile: "mobile";
308
+ none: "none";
309
+ }>>;
310
+ cpuSlowdown: z.ZodOptional<z.ZodNumber>;
311
+ runs: z.ZodOptional<z.ZodNumber>;
312
+ budgets: z.ZodOptional<z.ZodObject<{
313
+ lcpMs: z.ZodOptional<z.ZodNumber>;
314
+ cls: z.ZodOptional<z.ZodNumber>;
315
+ inpMs: z.ZodOptional<z.ZodNumber>;
316
+ tbtMs: z.ZodOptional<z.ZodNumber>;
317
+ fcpMs: z.ZodOptional<z.ZodNumber>;
318
+ ttfbMs: z.ZodOptional<z.ZodNumber>;
319
+ transferKb: z.ZodOptional<z.ZodNumber>;
320
+ requests: z.ZodOptional<z.ZodNumber>;
321
+ }, z.core.$strip>>;
322
+ waitFor: z.ZodOptional<z.ZodString>;
323
+ waitUntil: z.ZodOptional<z.ZodEnum<{
324
+ domcontentloaded: "domcontentloaded";
325
+ load: "load";
326
+ networkidle: "networkidle";
327
+ }>>;
328
+ settleMs: z.ZodOptional<z.ZodNumber>;
329
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
330
+ }, z.core.$strip>;
331
+ handler: (args: AuditPerformanceInput, ctx: ToolContext) => Promise<ToolResponse>;
332
+ };
333
+ export {};