uisnap 0.1.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 (91) hide show
  1. package/.claude/settings.local.json +26 -0
  2. package/.claude/skills/uisnap/README.md +48 -0
  3. package/.claude/skills/uisnap/REFERENCE.md +1261 -0
  4. package/.claude/skills/uisnap/SETUP.md +75 -0
  5. package/.claude/skills/uisnap/SKILL.md +130 -0
  6. package/.claude/skills/uisnap/snapshot-capture-and-analysis.md +452 -0
  7. package/.claude/skills/uisnap/trace-capture-and-analysis.md +472 -0
  8. package/CHANGELOG.md +96 -0
  9. package/LICENSE +21 -0
  10. package/README.md +394 -0
  11. package/SKILL-INSTALLATION.md +103 -0
  12. package/dist/analyze-console.d.ts +3 -0
  13. package/dist/analyze-console.d.ts.map +1 -0
  14. package/dist/analyze-console.js +153 -0
  15. package/dist/analyze-console.js.map +1 -0
  16. package/dist/analyze-network.d.ts +3 -0
  17. package/dist/analyze-network.d.ts.map +1 -0
  18. package/dist/analyze-network.js +156 -0
  19. package/dist/analyze-network.js.map +1 -0
  20. package/dist/chrome-trace-analyze.d.ts +3 -0
  21. package/dist/chrome-trace-analyze.d.ts.map +1 -0
  22. package/dist/chrome-trace-analyze.js +119 -0
  23. package/dist/chrome-trace-analyze.js.map +1 -0
  24. package/dist/chrome-trace-import.d.ts +3 -0
  25. package/dist/chrome-trace-import.d.ts.map +1 -0
  26. package/dist/chrome-trace-import.js +90 -0
  27. package/dist/chrome-trace-import.js.map +1 -0
  28. package/dist/commands/snapshot.d.ts +4 -0
  29. package/dist/commands/snapshot.d.ts.map +1 -0
  30. package/dist/commands/snapshot.js +154 -0
  31. package/dist/commands/snapshot.js.map +1 -0
  32. package/dist/diagnose.d.ts +3 -0
  33. package/dist/diagnose.d.ts.map +1 -0
  34. package/dist/diagnose.js +244 -0
  35. package/dist/diagnose.js.map +1 -0
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +26 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/pw.d.ts +3 -0
  41. package/dist/pw.d.ts.map +1 -0
  42. package/dist/pw.js +289 -0
  43. package/dist/pw.js.map +1 -0
  44. package/dist/query-a11y.d.ts +3 -0
  45. package/dist/query-a11y.d.ts.map +1 -0
  46. package/dist/query-a11y.js +208 -0
  47. package/dist/query-a11y.js.map +1 -0
  48. package/dist/trace-import.d.ts +3 -0
  49. package/dist/trace-import.d.ts.map +1 -0
  50. package/dist/trace-import.js +93 -0
  51. package/dist/trace-import.js.map +1 -0
  52. package/dist/types.d.ts +70 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +3 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/utils/chromeTraceAnalyze.d.ts +40 -0
  57. package/dist/utils/chromeTraceAnalyze.d.ts.map +1 -0
  58. package/dist/utils/chromeTraceAnalyze.js +113 -0
  59. package/dist/utils/chromeTraceAnalyze.js.map +1 -0
  60. package/dist/utils/chromeTraceHelpers.d.ts +4 -0
  61. package/dist/utils/chromeTraceHelpers.d.ts.map +1 -0
  62. package/dist/utils/chromeTraceHelpers.js +68 -0
  63. package/dist/utils/chromeTraceHelpers.js.map +1 -0
  64. package/dist/utils/chromeTraceImport.d.ts +14 -0
  65. package/dist/utils/chromeTraceImport.d.ts.map +1 -0
  66. package/dist/utils/chromeTraceImport.js +77 -0
  67. package/dist/utils/chromeTraceImport.js.map +1 -0
  68. package/dist/utils/helpers.d.ts +3 -0
  69. package/dist/utils/helpers.d.ts.map +1 -0
  70. package/dist/utils/helpers.js +88 -0
  71. package/dist/utils/helpers.js.map +1 -0
  72. package/dist/utils/projectRoot.d.ts +2 -0
  73. package/dist/utils/projectRoot.d.ts.map +1 -0
  74. package/dist/utils/projectRoot.js +56 -0
  75. package/dist/utils/projectRoot.js.map +1 -0
  76. package/dist/utils/traceHelpers.d.ts +4 -0
  77. package/dist/utils/traceHelpers.d.ts.map +1 -0
  78. package/dist/utils/traceHelpers.js +67 -0
  79. package/dist/utils/traceHelpers.js.map +1 -0
  80. package/dist/utils/traceImport.d.ts +20 -0
  81. package/dist/utils/traceImport.d.ts.map +1 -0
  82. package/dist/utils/traceImport.js +124 -0
  83. package/dist/utils/traceImport.js.map +1 -0
  84. package/dist/utils/webVitals.d.ts +9 -0
  85. package/dist/utils/webVitals.d.ts.map +1 -0
  86. package/dist/utils/webVitals.js +54 -0
  87. package/dist/utils/webVitals.js.map +1 -0
  88. package/examples/login-flow.js +37 -0
  89. package/examples/scroll-perf-trace.js +43 -0
  90. package/examples/simple-capture.js +28 -0
  91. package/package.json +74 -0
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.diagnoseSnapshot = diagnoseSnapshot;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const duckdb_async_1 = require("duckdb-async");
41
+ async function diagnoseSnapshot(snapshotDir, args) {
42
+ const options = {
43
+ errors: args.includes('--errors'),
44
+ network: args.includes('--network'),
45
+ performance: args.includes('--performance'),
46
+ full: args.includes('--full'),
47
+ };
48
+ const output = [];
49
+ const metadataPath = path.join(snapshotDir, 'metadata.json');
50
+ if (!fs.existsSync(metadataPath)) {
51
+ throw new Error(`No metadata.json found in ${snapshotDir}`);
52
+ }
53
+ const metadata = JSON.parse(fs.readFileSync(metadataPath, 'utf8'));
54
+ output.push('\n=== Web Vitals ===\n');
55
+ if (metadata.webVitals) {
56
+ const { fcp, lcp, tti, cls } = metadata.webVitals;
57
+ const fcpStatus = fcp < 1800 ? '✓' : fcp < 3000 ? '⚠️' : '❌';
58
+ const lcpStatus = lcp < 2500 ? '✓' : lcp < 4000 ? '⚠️' : '❌';
59
+ const ttiStatus = tti < 3800 ? '✓' : tti < 7300 ? '⚠️' : '❌';
60
+ const clsStatus = cls < 0.1 ? '✓' : cls < 0.25 ? '⚠️' : '❌';
61
+ output.push(` FCP: ${fcp}ms ${fcpStatus}`);
62
+ output.push(` LCP: ${lcp}ms ${lcpStatus}`);
63
+ output.push(` TTI: ${tti}ms ${ttiStatus}`);
64
+ output.push(` CLS: ${cls} ${clsStatus}`);
65
+ }
66
+ else {
67
+ output.push(' No web vitals data');
68
+ }
69
+ const consolePath = path.join(snapshotDir, 'console.jsonl');
70
+ let consoleSummary = { errors: 0, warnings: 0, errorGroups: new Map() };
71
+ if (fs.existsSync(consolePath)) {
72
+ const consoleLines = fs.readFileSync(consolePath, 'utf8').trim().split('\n').filter(l => l);
73
+ for (const line of consoleLines) {
74
+ const entry = JSON.parse(line);
75
+ if (entry.type === 'error') {
76
+ consoleSummary.errors++;
77
+ const count = consoleSummary.errorGroups.get(entry.text) || 0;
78
+ consoleSummary.errorGroups.set(entry.text, count + 1);
79
+ }
80
+ else if (entry.type === 'warning') {
81
+ consoleSummary.warnings++;
82
+ }
83
+ }
84
+ }
85
+ output.push(`\nConsole: ${consoleSummary.errors} errors, ${consoleSummary.warnings} warnings`);
86
+ const networkPath = path.join(snapshotDir, 'network.jsonl');
87
+ let networkSummary = { total: 0, failed: 0, slow: 0, failedRequests: [], slowRequests: [] };
88
+ if (fs.existsSync(networkPath)) {
89
+ const networkLines = fs.readFileSync(networkPath, 'utf8').trim().split('\n').filter(l => l);
90
+ networkSummary.total = networkLines.length;
91
+ for (const line of networkLines) {
92
+ const entry = JSON.parse(line);
93
+ if (entry.status >= 400) {
94
+ networkSummary.failed++;
95
+ networkSummary.failedRequests.push(entry);
96
+ }
97
+ if (entry.timing && (entry.timing.responseEnd - entry.timing.startTime) > 1000) {
98
+ networkSummary.slow++;
99
+ networkSummary.slowRequests.push(entry);
100
+ }
101
+ }
102
+ }
103
+ output.push(`Network: ${networkSummary.total} requests, ${networkSummary.failed} failed, ${networkSummary.slow} slow (>1s)`);
104
+ const traceDbPath = path.join(snapshotDir, 'chrome-trace.db');
105
+ let performanceSummary = { hasTrace: false, longTasks: 0, totalJsTime: 0 };
106
+ if (fs.existsSync(traceDbPath)) {
107
+ performanceSummary.hasTrace = true;
108
+ const db = await duckdb_async_1.Database.create(traceDbPath);
109
+ const longTasks = await db.all(`
110
+ SELECT COUNT(*) as count FROM tasks WHERE dur_ms > 50
111
+ `);
112
+ performanceSummary.longTasks = Number(longTasks[0].count);
113
+ const jsTime = await db.all(`
114
+ SELECT ROUND(SUM(dur_ms), 2) as total
115
+ FROM tasks
116
+ WHERE name LIKE '%Script%' OR name LIKE '%Function%'
117
+ `);
118
+ performanceSummary.totalJsTime = Number(jsTime[0].total || 0);
119
+ await db.close();
120
+ }
121
+ if (performanceSummary.hasTrace) {
122
+ output.push(`Performance: ${performanceSummary.longTasks} long tasks (>50ms), ${performanceSummary.totalJsTime}ms total JS time`);
123
+ }
124
+ if (!options.errors && !options.network && !options.performance && !options.full) {
125
+ output.push('\nFor details, use:');
126
+ if (consoleSummary.errors > 0) {
127
+ output.push(` --errors Show ${consoleSummary.errors} console error(s)`);
128
+ }
129
+ if (networkSummary.failed > 0 || networkSummary.slow > 0) {
130
+ output.push(` --network Show network details (${networkSummary.failed} failed, ${networkSummary.slow} slow)`);
131
+ }
132
+ if (performanceSummary.hasTrace) {
133
+ output.push(` --performance Show performance breakdown`);
134
+ }
135
+ output.push(` --full Show all details`);
136
+ }
137
+ if (options.errors || options.full) {
138
+ if (consoleSummary.errors > 0) {
139
+ output.push('\n=== Console Errors ===\n');
140
+ for (const [text, count] of consoleSummary.errorGroups) {
141
+ const plural = count > 1 ? 's' : '';
142
+ output.push(` ${text} (${count} occurrence${plural})`);
143
+ }
144
+ }
145
+ }
146
+ if (options.network || options.full) {
147
+ if (networkSummary.failed > 0) {
148
+ output.push('\n=== Failed Network Requests ===\n');
149
+ for (const req of networkSummary.failedRequests) {
150
+ output.push(` [${req.status}] ${req.method} ${req.url}`);
151
+ }
152
+ }
153
+ if (networkSummary.slow > 0) {
154
+ output.push('\n=== Slow Network Requests (>1s) ===\n');
155
+ for (const req of networkSummary.slowRequests) {
156
+ const duration = Math.round(req.timing.responseEnd - req.timing.startTime);
157
+ output.push(` [${duration}ms] ${req.method} ${req.url}`);
158
+ }
159
+ }
160
+ }
161
+ if (options.performance || options.full) {
162
+ if (performanceSummary.hasTrace) {
163
+ output.push('\n=== Performance Details ===\n');
164
+ const db = await duckdb_async_1.Database.create(traceDbPath);
165
+ if (performanceSummary.longTasks > 0) {
166
+ output.push('Long Tasks (>50ms):');
167
+ const tasks = await db.all(`
168
+ SELECT name, ROUND(dur_ms, 2) as dur_ms, ROUND(ts_ms, 2) as ts_ms
169
+ FROM tasks WHERE dur_ms > 50
170
+ ORDER BY dur_ms DESC LIMIT 10
171
+ `);
172
+ for (const task of tasks) {
173
+ output.push(` ${task.name}: ${task.dur_ms}ms at ${task.ts_ms}ms`);
174
+ }
175
+ output.push('');
176
+ }
177
+ output.push('JavaScript Execution:');
178
+ const jsStats = await db.all(`
179
+ SELECT name, COUNT(*) as count,
180
+ ROUND(SUM(dur_ms), 2) as total_ms,
181
+ ROUND(AVG(dur_ms), 2) as avg_ms,
182
+ ROUND(MAX(dur_ms), 2) as max_ms
183
+ FROM tasks
184
+ WHERE name LIKE '%Script%' OR name LIKE '%Function%'
185
+ GROUP BY name ORDER BY total_ms DESC
186
+ `);
187
+ for (const stat of jsStats) {
188
+ output.push(` ${stat.name}: ${stat.count} calls, ${stat.total_ms}ms total, ${stat.avg_ms}ms avg, ${stat.max_ms}ms max`);
189
+ }
190
+ await db.close();
191
+ }
192
+ else {
193
+ output.push('\n=== Performance ===\n');
194
+ output.push(' No Chrome trace data found');
195
+ }
196
+ }
197
+ output.push('');
198
+ return output.join('\n');
199
+ }
200
+ async function main() {
201
+ const snapshotDir = process.argv[2];
202
+ const args = process.argv.slice(3);
203
+ if (!snapshotDir || snapshotDir === '--help' || snapshotDir === '-h') {
204
+ console.log(`Diagnose Snapshot
205
+
206
+ Usage:
207
+ pw-diagnose <snapshot-dir> [options]
208
+
209
+ Options:
210
+ --errors Show detailed console errors
211
+ --network Show detailed network failures and slow requests
212
+ --performance Show detailed performance breakdown
213
+ --full Show all details
214
+
215
+ Examples:
216
+ pw-diagnose snapshots/example.com/latest/
217
+ pw-diagnose snapshots/example.com/latest/ --errors
218
+ pw-diagnose snapshots/example.com/latest/ --full
219
+ `);
220
+ process.exit(0);
221
+ }
222
+ if (!fs.existsSync(snapshotDir)) {
223
+ console.error(`Error: Snapshot directory not found: ${snapshotDir}`);
224
+ process.exit(1);
225
+ }
226
+ try {
227
+ const output = await diagnoseSnapshot(snapshotDir, args);
228
+ console.log(output);
229
+ }
230
+ catch (error) {
231
+ console.error('Error diagnosing snapshot:');
232
+ if (error instanceof Error) {
233
+ console.error(error.message);
234
+ }
235
+ else {
236
+ console.error(error);
237
+ }
238
+ process.exit(1);
239
+ }
240
+ }
241
+ if (require.main === module) {
242
+ main();
243
+ }
244
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export { createUtils } from './utils/helpers';
3
+ export { default as snapshot } from './commands/snapshot';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ var __importDefault = (this && this.__importDefault) || function (mod) {
17
+ return (mod && mod.__esModule) ? mod : { "default": mod };
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.snapshot = exports.createUtils = void 0;
21
+ __exportStar(require("./types"), exports);
22
+ var helpers_1 = require("./utils/helpers");
23
+ Object.defineProperty(exports, "createUtils", { enumerable: true, get: function () { return helpers_1.createUtils; } });
24
+ var snapshot_1 = require("./commands/snapshot");
25
+ Object.defineProperty(exports, "snapshot", { enumerable: true, get: function () { return __importDefault(snapshot_1).default; } });
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAMA,0CAAwB;AACxB,2CAA8C;AAArC,sGAAA,WAAW,OAAA;AACpB,gDAA0D;AAAjD,qHAAA,OAAO,OAAY"}
package/dist/pw.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=pw.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw.d.ts","sourceRoot":"","sources":["../src/pw.ts"],"names":[],"mappings":""}
package/dist/pw.js ADDED
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ var __importDefault = (this && this.__importDefault) || function (mod) {
37
+ return (mod && mod.__esModule) ? mod : { "default": mod };
38
+ };
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ const playwright_1 = require("playwright");
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const helpers_1 = require("./utils/helpers");
44
+ const projectRoot_1 = require("./utils/projectRoot");
45
+ const snapshot_1 = __importDefault(require("./commands/snapshot"));
46
+ const builtins = {
47
+ snapshot: snapshot_1.default,
48
+ };
49
+ async function executeUserScript(page, context, browser, args) {
50
+ const scriptPath = args[0];
51
+ const scriptArgs = args.slice(1);
52
+ if (!scriptPath) {
53
+ console.error('Usage: exec <script.js> <url> [output-dir]');
54
+ console.error('');
55
+ console.error('If output-dir is not specified, auto-generates:');
56
+ console.error(' snapshots/{hostname}/{script-name}-{timestamp}/');
57
+ console.error('');
58
+ console.error('Example:');
59
+ console.error(' pw-debug exec examples/scroll-perf-trace.js https://example.com');
60
+ process.exit(1);
61
+ }
62
+ if (!fs.existsSync(scriptPath)) {
63
+ console.error(`Error: Script not found: ${scriptPath}`);
64
+ process.exit(1);
65
+ }
66
+ const url = scriptArgs[0];
67
+ const userOutputDir = scriptArgs[1];
68
+ const remainingArgs = scriptArgs.slice(userOutputDir ? 2 : 1);
69
+ let outputDir;
70
+ if (userOutputDir) {
71
+ const projectRoot = (0, projectRoot_1.getUserProjectDir)();
72
+ outputDir = path.isAbsolute(userOutputDir)
73
+ ? userOutputDir
74
+ : path.join(projectRoot, userOutputDir);
75
+ }
76
+ else if (url && url.startsWith('http')) {
77
+ try {
78
+ const projectRoot = (0, projectRoot_1.getUserProjectDir)();
79
+ const urlObj = new URL(url);
80
+ const hostname = urlObj.hostname;
81
+ const scriptName = path.basename(scriptPath, path.extname(scriptPath));
82
+ const timestamp = new Date()
83
+ .toISOString()
84
+ .replace(/[:.]/g, '-')
85
+ .split('T')
86
+ .join('-')
87
+ .slice(0, 19);
88
+ outputDir = path.join(projectRoot, 'snapshots', hostname, `${scriptName}-${timestamp}`);
89
+ }
90
+ catch (error) {
91
+ console.error(`Warning: Invalid URL: ${url}. Using current directory.`);
92
+ const projectRoot = (0, projectRoot_1.getUserProjectDir)();
93
+ outputDir = projectRoot;
94
+ }
95
+ }
96
+ else {
97
+ const projectRoot = (0, projectRoot_1.getUserProjectDir)();
98
+ outputDir = projectRoot;
99
+ }
100
+ try {
101
+ fs.mkdirSync(outputDir, { recursive: true });
102
+ }
103
+ catch (error) {
104
+ console.error(`Error creating output directory: ${outputDir}`);
105
+ if (error.code === 'EACCES') {
106
+ console.error('Permission denied. Check directory permissions.');
107
+ }
108
+ else if (error.code === 'ENOSPC') {
109
+ console.error('No space left on device.');
110
+ }
111
+ else if (error.code === 'EROFS') {
112
+ console.error('Read-only file system.');
113
+ }
114
+ else {
115
+ console.error(error.message);
116
+ }
117
+ process.exit(1);
118
+ }
119
+ const projectRoot = (0, projectRoot_1.getUserProjectDir)();
120
+ const relativePath = path.relative(projectRoot, outputDir);
121
+ console.log(`📂 Output directory: ${relativePath}`);
122
+ console.log(` (${path.resolve(outputDir)})`);
123
+ console.log(`\nExecuting script: ${scriptPath}`);
124
+ let scriptCode;
125
+ try {
126
+ const stats = fs.statSync(scriptPath);
127
+ if (stats.isDirectory()) {
128
+ console.error(`Error: Script path is a directory: ${scriptPath}`);
129
+ console.error('Please provide a path to a JavaScript file (.js)');
130
+ process.exit(1);
131
+ }
132
+ scriptCode = fs.readFileSync(scriptPath, 'utf8');
133
+ }
134
+ catch (error) {
135
+ if (error.code === 'EACCES') {
136
+ console.error(`Error: Permission denied reading script: ${scriptPath}`);
137
+ console.error('Check file permissions and try again.');
138
+ }
139
+ else if (error.code === 'EISDIR') {
140
+ console.error(`Error: Script path is a directory: ${scriptPath}`);
141
+ console.error('Please provide a path to a JavaScript file (.js)');
142
+ }
143
+ else {
144
+ console.error(`Error reading script file: ${scriptPath}`);
145
+ console.error(error.message);
146
+ }
147
+ process.exit(1);
148
+ }
149
+ const env = {
150
+ page,
151
+ context,
152
+ browser,
153
+ args: remainingArgs,
154
+ fs,
155
+ path,
156
+ utils: (0, helpers_1.createUtils)(outputDir),
157
+ };
158
+ const wrappedScript = `
159
+ (async ({ page, context, browser, args, fs, path, utils }) => {
160
+ ${scriptCode}
161
+ })
162
+ `;
163
+ try {
164
+ const userFunction = eval(wrappedScript);
165
+ await userFunction(env);
166
+ }
167
+ catch (error) {
168
+ console.error('Error executing user script:');
169
+ if (error instanceof Error) {
170
+ console.error(error.message);
171
+ if (error.stack) {
172
+ console.error(error.stack);
173
+ }
174
+ }
175
+ else {
176
+ console.error(error);
177
+ }
178
+ process.exit(1);
179
+ }
180
+ }
181
+ async function main() {
182
+ const command = process.argv[2];
183
+ const args = process.argv.slice(3);
184
+ if (!command || command === '--help' || command === '-h') {
185
+ console.log(`Playwright Debug Toolkit - Browser State Capture & Analysis
186
+
187
+ Usage:
188
+ pw-debug snapshot <url> [output-dir]
189
+ pw-debug exec <script.js> <url> [output-dir]
190
+
191
+ BUILT-IN CAPTURE:
192
+ snapshot <url> [output-dir]
193
+ Capture complete page state to disk
194
+ Includes: ARIA tree, console logs, network requests, web vitals, Chrome trace
195
+
196
+ CUSTOM SCRIPTS (Multi-Step Debugging):
197
+ exec <script.js> <url> [output-dir]
198
+ Run your own Playwright script with full browser access
199
+ Includes: utils.captureStep() for step-by-step state capture
200
+ Perfect for: login flows, user interactions, performance debugging
201
+
202
+ Examples:
203
+ # Quick snapshot
204
+ pw-debug snapshot https://example.com
205
+
206
+ # Multi-step debugging
207
+ pw-debug exec login-flow.js https://myapp.com
208
+ pw-debug exec examples/scroll-perf-trace.js https://example.com
209
+
210
+ # Specify output directory
211
+ pw-debug snapshot https://example.com snapshots/baseline/
212
+ pw-debug exec my-script.js https://example.com debug-output/
213
+
214
+ Output Location:
215
+ Default: snapshots/{hostname}/{timestamp|script-name}/ in your project root
216
+
217
+ Analysis Commands (work on captured data):
218
+ pw-analyze-console <console.jsonl>
219
+ pw-analyze-network <network.jsonl>
220
+ pw-query-a11y <a11y.yaml> <query>
221
+ chrome-trace-analyze <trace.db> [--long-tasks|--js-time|--layout-paint|--full]
222
+ chrome-trace-import <trace.json> <output.db>
223
+ `);
224
+ process.exit(0);
225
+ }
226
+ let browser;
227
+ try {
228
+ browser = await playwright_1.chromium.launch({
229
+ headless: true,
230
+ args: ['--disable-dev-shm-usage'],
231
+ });
232
+ }
233
+ catch (error) {
234
+ console.error('Error: Failed to launch browser');
235
+ console.error('');
236
+ if (error.message) {
237
+ console.error(error.message);
238
+ console.error('');
239
+ }
240
+ console.error('Troubleshooting:');
241
+ console.error(' 1. Install Chromium browser:');
242
+ console.error(' npx playwright install chromium');
243
+ console.error('');
244
+ console.error(' 2. On Linux, install system dependencies:');
245
+ console.error(' npx playwright install-deps chromium');
246
+ console.error('');
247
+ console.error(' 3. Check system requirements:');
248
+ console.error(' https://playwright.dev/docs/browsers');
249
+ process.exit(1);
250
+ }
251
+ const context = await browser.newContext({
252
+ viewport: { width: 1280, height: 720 },
253
+ });
254
+ const page = await context.newPage();
255
+ try {
256
+ if (builtins[command]) {
257
+ await builtins[command](page, context, browser, args);
258
+ }
259
+ else if (command === 'exec') {
260
+ await executeUserScript(page, context, browser, args);
261
+ }
262
+ else {
263
+ console.error(`Unknown command: ${command}`);
264
+ console.error(`Run 'pw-debug' without arguments to see available commands.`);
265
+ process.exit(1);
266
+ }
267
+ }
268
+ catch (error) {
269
+ console.error('Fatal error:');
270
+ if (error instanceof Error) {
271
+ console.error(error.message);
272
+ if (error.stack) {
273
+ console.error(error.stack);
274
+ }
275
+ }
276
+ else {
277
+ console.error(error);
278
+ }
279
+ process.exit(1);
280
+ }
281
+ finally {
282
+ await browser.close();
283
+ }
284
+ }
285
+ main().catch(err => {
286
+ console.error('Unhandled error:', err);
287
+ process.exit(1);
288
+ });
289
+ //# sourceMappingURL=pw.js.map
package/dist/pw.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pw.js","sourceRoot":"","sources":["../src/pw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=query-a11y.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-a11y.d.ts","sourceRoot":"","sources":["../src/query-a11y.ts"],"names":[],"mappings":""}