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.
- package/.claude/settings.local.json +26 -0
- package/.claude/skills/uisnap/README.md +48 -0
- package/.claude/skills/uisnap/REFERENCE.md +1261 -0
- package/.claude/skills/uisnap/SETUP.md +75 -0
- package/.claude/skills/uisnap/SKILL.md +130 -0
- package/.claude/skills/uisnap/snapshot-capture-and-analysis.md +452 -0
- package/.claude/skills/uisnap/trace-capture-and-analysis.md +472 -0
- package/CHANGELOG.md +96 -0
- package/LICENSE +21 -0
- package/README.md +394 -0
- package/SKILL-INSTALLATION.md +103 -0
- package/dist/analyze-console.d.ts +3 -0
- package/dist/analyze-console.d.ts.map +1 -0
- package/dist/analyze-console.js +153 -0
- package/dist/analyze-console.js.map +1 -0
- package/dist/analyze-network.d.ts +3 -0
- package/dist/analyze-network.d.ts.map +1 -0
- package/dist/analyze-network.js +156 -0
- package/dist/analyze-network.js.map +1 -0
- package/dist/chrome-trace-analyze.d.ts +3 -0
- package/dist/chrome-trace-analyze.d.ts.map +1 -0
- package/dist/chrome-trace-analyze.js +119 -0
- package/dist/chrome-trace-analyze.js.map +1 -0
- package/dist/chrome-trace-import.d.ts +3 -0
- package/dist/chrome-trace-import.d.ts.map +1 -0
- package/dist/chrome-trace-import.js +90 -0
- package/dist/chrome-trace-import.js.map +1 -0
- package/dist/commands/snapshot.d.ts +4 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +154 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/diagnose.d.ts +3 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +244 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/pw.d.ts +3 -0
- package/dist/pw.d.ts.map +1 -0
- package/dist/pw.js +289 -0
- package/dist/pw.js.map +1 -0
- package/dist/query-a11y.d.ts +3 -0
- package/dist/query-a11y.d.ts.map +1 -0
- package/dist/query-a11y.js +208 -0
- package/dist/query-a11y.js.map +1 -0
- package/dist/trace-import.d.ts +3 -0
- package/dist/trace-import.d.ts.map +1 -0
- package/dist/trace-import.js +93 -0
- package/dist/trace-import.js.map +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/chromeTraceAnalyze.d.ts +40 -0
- package/dist/utils/chromeTraceAnalyze.d.ts.map +1 -0
- package/dist/utils/chromeTraceAnalyze.js +113 -0
- package/dist/utils/chromeTraceAnalyze.js.map +1 -0
- package/dist/utils/chromeTraceHelpers.d.ts +4 -0
- package/dist/utils/chromeTraceHelpers.d.ts.map +1 -0
- package/dist/utils/chromeTraceHelpers.js +68 -0
- package/dist/utils/chromeTraceHelpers.js.map +1 -0
- package/dist/utils/chromeTraceImport.d.ts +14 -0
- package/dist/utils/chromeTraceImport.d.ts.map +1 -0
- package/dist/utils/chromeTraceImport.js +77 -0
- package/dist/utils/chromeTraceImport.js.map +1 -0
- package/dist/utils/helpers.d.ts +3 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +88 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/projectRoot.d.ts +2 -0
- package/dist/utils/projectRoot.d.ts.map +1 -0
- package/dist/utils/projectRoot.js +56 -0
- package/dist/utils/projectRoot.js.map +1 -0
- package/dist/utils/traceHelpers.d.ts +4 -0
- package/dist/utils/traceHelpers.d.ts.map +1 -0
- package/dist/utils/traceHelpers.js +67 -0
- package/dist/utils/traceHelpers.js.map +1 -0
- package/dist/utils/traceImport.d.ts +20 -0
- package/dist/utils/traceImport.d.ts.map +1 -0
- package/dist/utils/traceImport.js +124 -0
- package/dist/utils/traceImport.js.map +1 -0
- package/dist/utils/webVitals.d.ts +9 -0
- package/dist/utils/webVitals.d.ts.map +1 -0
- package/dist/utils/webVitals.js +54 -0
- package/dist/utils/webVitals.js.map +1 -0
- package/examples/login-flow.js +37 -0
- package/examples/scroll-perf-trace.js +43 -0
- package/examples/simple-capture.js +28 -0
- package/package.json +74 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// Capture Chrome DevTools Performance trace (not Playwright trace)
|
|
2
|
+
// This captures actual browser performance: paint, layout, JS execution
|
|
3
|
+
// Usage: node dist/pw.js exec examples/scroll-perf-trace.js http://localhost:4321
|
|
4
|
+
|
|
5
|
+
// Get CDP session
|
|
6
|
+
const cdp = await context.newCDPSession(page);
|
|
7
|
+
|
|
8
|
+
// Start Chrome tracing
|
|
9
|
+
console.log('Starting Chrome performance trace...');
|
|
10
|
+
await utils.startChromeTrace(cdp);
|
|
11
|
+
|
|
12
|
+
// Navigate to Part 2
|
|
13
|
+
await page.goto('http://localhost:4321');
|
|
14
|
+
await page.getByRole('link', { name: /part 2/i }).click();
|
|
15
|
+
await page.waitForLoadState('networkidle');
|
|
16
|
+
|
|
17
|
+
console.log('Page loaded, scrolling through sections...');
|
|
18
|
+
|
|
19
|
+
// Scroll down through sections
|
|
20
|
+
await page.evaluate(() => window.scrollTo({ top: 500, behavior: 'smooth' }));
|
|
21
|
+
await page.waitForTimeout(500);
|
|
22
|
+
|
|
23
|
+
await page.evaluate(() => window.scrollTo({ top: 1000, behavior: 'smooth' }));
|
|
24
|
+
await page.waitForTimeout(500);
|
|
25
|
+
|
|
26
|
+
await page.evaluate(() => window.scrollTo({ top: 2000, behavior: 'smooth' }));
|
|
27
|
+
await page.waitForTimeout(500);
|
|
28
|
+
|
|
29
|
+
await page.evaluate(() => window.scrollTo({ top: 3000, behavior: 'smooth' }));
|
|
30
|
+
await page.waitForTimeout(500);
|
|
31
|
+
|
|
32
|
+
console.log('Stopping trace and importing to database...');
|
|
33
|
+
|
|
34
|
+
// Stop tracing and auto-import to DuckDB
|
|
35
|
+
const tracePath = path.join(utils.baseOutputDir, 'chrome-trace.json');
|
|
36
|
+
const dbPath = await utils.stopChromeTraceAndImport(cdp, tracePath);
|
|
37
|
+
|
|
38
|
+
console.log('\n✓ Chrome trace analysis complete!');
|
|
39
|
+
console.log('\nAnalyze with canned queries:');
|
|
40
|
+
console.log(` chrome-trace-analyze ${dbPath}`);
|
|
41
|
+
console.log(` chrome-trace-analyze ${dbPath} --long-tasks`);
|
|
42
|
+
console.log(` chrome-trace-analyze ${dbPath} --js-time`);
|
|
43
|
+
console.log(` chrome-trace-analyze ${dbPath} --full`);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Example: Simple custom data extraction
|
|
2
|
+
//
|
|
3
|
+
// Usage: pw-debug exec examples/simple-capture.js https://example.com
|
|
4
|
+
//
|
|
5
|
+
// This demonstrates basic data extraction without multi-step capture
|
|
6
|
+
|
|
7
|
+
await page.goto(args[0] || 'https://example.com');
|
|
8
|
+
|
|
9
|
+
// Extract custom data
|
|
10
|
+
const data = await page.evaluate(() => {
|
|
11
|
+
return {
|
|
12
|
+
title: document.title,
|
|
13
|
+
links: Array.from(document.links).map(link => ({
|
|
14
|
+
text: link.textContent?.trim(),
|
|
15
|
+
href: link.href,
|
|
16
|
+
})),
|
|
17
|
+
headings: Array.from(document.querySelectorAll('h1, h2, h3')).map(h => ({
|
|
18
|
+
level: h.tagName,
|
|
19
|
+
text: h.textContent?.trim(),
|
|
20
|
+
})),
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
// Write to disk
|
|
25
|
+
utils.writeJson('page-data.json', data);
|
|
26
|
+
|
|
27
|
+
console.log(`Extracted ${data.links.length} links and ${data.headings.length} headings`);
|
|
28
|
+
console.log('Data saved to page-data.json');
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "uisnap",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "UI snapshot debugging for frontend development. Capture browser state to disk once, query efficiently many times.",
|
|
5
|
+
"author": "Tony Chu",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"uisnap",
|
|
9
|
+
"snapshot",
|
|
10
|
+
"capture",
|
|
11
|
+
"debugging",
|
|
12
|
+
"frontend",
|
|
13
|
+
"ui",
|
|
14
|
+
"playwright",
|
|
15
|
+
"browser",
|
|
16
|
+
"claude-code"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/tonyhschu/uisnap.git"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/tonyhschu/uisnap/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/tonyhschu/uisnap#readme",
|
|
26
|
+
"main": "dist/index.js",
|
|
27
|
+
"types": "dist/index.d.ts",
|
|
28
|
+
"bin": {
|
|
29
|
+
"uisnap": "dist/pw.js",
|
|
30
|
+
"uisnap-diagnose": "dist/diagnose.js",
|
|
31
|
+
"uisnap-analyze-console": "dist/analyze-console.js",
|
|
32
|
+
"uisnap-analyze-network": "dist/analyze-network.js",
|
|
33
|
+
"uisnap-query-a11y": "dist/query-a11y.js",
|
|
34
|
+
"uisnap-trace-import": "dist/trace-import.js",
|
|
35
|
+
"uisnap-chrome-trace-import": "dist/chrome-trace-import.js",
|
|
36
|
+
"uisnap-chrome-trace-analyze": "dist/chrome-trace-analyze.js"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist",
|
|
40
|
+
"examples",
|
|
41
|
+
".claude",
|
|
42
|
+
"README.md",
|
|
43
|
+
"CHANGELOG.md",
|
|
44
|
+
"SKILL-INSTALLATION.md"
|
|
45
|
+
],
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc",
|
|
48
|
+
"watch": "tsc --watch",
|
|
49
|
+
"clean": "rm -rf dist",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:watch": "vitest",
|
|
52
|
+
"test:ui": "vitest --ui",
|
|
53
|
+
"test:coverage": "vitest run --coverage",
|
|
54
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
55
|
+
"dev": "npm run build && node dist/pw.js",
|
|
56
|
+
"postinstall": "echo '\n✓ uisnap installed!\n\nNext step: Install Chromium browser:\n npx playwright install chromium\n\nThen try:\n uisnap snapshot https://example.com\n'"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"adm-zip": "^0.5.16",
|
|
60
|
+
"duckdb-async": "^1.4.2",
|
|
61
|
+
"playwright": "^1.49.0",
|
|
62
|
+
"yaml": "^2.6.1"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@types/adm-zip": "^0.5.7",
|
|
66
|
+
"@types/node": "^22.10.2",
|
|
67
|
+
"@vitest/ui": "^4.0.16",
|
|
68
|
+
"typescript": "^5.7.2",
|
|
69
|
+
"vitest": "^4.0.16"
|
|
70
|
+
},
|
|
71
|
+
"engines": {
|
|
72
|
+
"node": ">=18.0.0"
|
|
73
|
+
}
|
|
74
|
+
}
|