@ytspar/sweetlink 1.22.0 → 1.23.0-canary.2da2213
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/README.md +77 -0
- package/dist/browser/SweetlinkBridge.d.ts +9 -0
- package/dist/browser/SweetlinkBridge.d.ts.map +1 -1
- package/dist/browser/SweetlinkBridge.js +73 -20
- package/dist/browser/SweetlinkBridge.js.map +1 -1
- package/dist/browser/commands/screenshot.d.ts.map +1 -1
- package/dist/browser/commands/screenshot.js +16 -7
- package/dist/browser/commands/screenshot.js.map +1 -1
- package/dist/browser/screenshotUtils.d.ts +13 -3
- package/dist/browser/screenshotUtils.d.ts.map +1 -1
- package/dist/browser/screenshotUtils.js +32 -6
- package/dist/browser/screenshotUtils.js.map +1 -1
- package/dist/cdp.d.ts +1 -0
- package/dist/cdp.d.ts.map +1 -1
- package/dist/cdp.js +34 -3
- package/dist/cdp.js.map +1 -1
- package/dist/cli/outputSchemas.d.ts +1 -0
- package/dist/cli/outputSchemas.d.ts.map +1 -1
- package/dist/cli/outputSchemas.js +1 -0
- package/dist/cli/outputSchemas.js.map +1 -1
- package/dist/cli/sweetlink-dev.d.ts +5 -2
- package/dist/cli/sweetlink-dev.d.ts.map +1 -1
- package/dist/cli/sweetlink-dev.js +12 -4
- package/dist/cli/sweetlink-dev.js.map +1 -1
- package/dist/cli/sweetlink.js +12 -0
- package/dist/cli/sweetlink.js.map +1 -1
- package/dist/daemon/browser.d.ts +3 -0
- package/dist/daemon/browser.d.ts.map +1 -1
- package/dist/daemon/browser.js +38 -5
- package/dist/daemon/browser.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +2 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/types.d.ts +2 -0
- package/dist/daemon/types.d.ts.map +1 -1
- package/dist/daemon/types.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/next.d.ts.map +1 -1
- package/dist/next.js +16 -1
- package/dist/next.js.map +1 -1
- package/dist/playwright.d.ts +19 -0
- package/dist/playwright.d.ts.map +1 -1
- package/dist/playwright.js +119 -12
- package/dist/playwright.js.map +1 -1
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +56 -16
- package/dist/server/index.js.map +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +127 -0
- package/dist/types.js.map +1 -1
- package/dist/vite.d.ts +11 -0
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +20 -1
- package/dist/vite.js.map +1 -1
- package/package.json +1 -1
- package/claude-skills/console-check-sweetlink/SKILL.md +0 -330
- package/claude-skills/console-check-sweetlink/examples.md +0 -394
- package/claude-skills/resize-for-claude/SKILL.md +0 -97
- package/claude-skills/responsive-screenshots/SKILL.md +0 -366
- package/claude-skills/responsive-screenshots/examples.md +0 -441
package/dist/types.js
CHANGED
|
@@ -15,6 +15,133 @@ export const WS_PORT_OFFSET = 6223;
|
|
|
15
15
|
export const MAX_PORT_RETRIES = 10;
|
|
16
16
|
/** Delay between port scan attempts (ms) */
|
|
17
17
|
export const PORT_RETRY_DELAY_MS = 100;
|
|
18
|
+
/** Same-origin WebSocket path used when an app server can proxy Sweetlink. */
|
|
19
|
+
export const SWEETLINK_WS_PATH = '/__sweetlink';
|
|
20
|
+
export function parsePortNumber(value) {
|
|
21
|
+
if (value === null || value === undefined || value === '') {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
const parsed = typeof value === 'number' ? value : Number(value);
|
|
25
|
+
return Number.isInteger(parsed) && parsed > 0 && parsed <= 65535 ? parsed : null;
|
|
26
|
+
}
|
|
27
|
+
export function getDefaultPortForProtocol(protocol) {
|
|
28
|
+
if (protocol === 'http:') {
|
|
29
|
+
return 80;
|
|
30
|
+
}
|
|
31
|
+
if (protocol === 'https:') {
|
|
32
|
+
return 443;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
export function resolveAppPortFromLocation(location) {
|
|
37
|
+
return parsePortNumber(location.port) ?? getDefaultPortForProtocol(location.protocol) ?? 0;
|
|
38
|
+
}
|
|
39
|
+
export function resolveSweetlinkWsPortForAppPort(appPort) {
|
|
40
|
+
const parsedAppPort = parsePortNumber(appPort);
|
|
41
|
+
return parsedAppPort ? parsedAppPort + WS_PORT_OFFSET : DEFAULT_WS_PORT;
|
|
42
|
+
}
|
|
43
|
+
export function resolveSweetlinkWsPortFromLocation(location) {
|
|
44
|
+
return resolveSweetlinkWsPortForAppPort(resolveAppPortFromLocation(location));
|
|
45
|
+
}
|
|
46
|
+
function getRecord(value) {
|
|
47
|
+
return value && typeof value === 'object' ? value : null;
|
|
48
|
+
}
|
|
49
|
+
function getProcessEnv() {
|
|
50
|
+
if (typeof process === 'undefined')
|
|
51
|
+
return {};
|
|
52
|
+
return process.env;
|
|
53
|
+
}
|
|
54
|
+
function normalizeWsPath(value) {
|
|
55
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
56
|
+
return null;
|
|
57
|
+
const path = value.trim();
|
|
58
|
+
return path.startsWith('/') ? path : `/${path}`;
|
|
59
|
+
}
|
|
60
|
+
function normalizeWsUrl(value) {
|
|
61
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
62
|
+
return null;
|
|
63
|
+
try {
|
|
64
|
+
const url = new URL(value);
|
|
65
|
+
return url.protocol === 'ws:' || url.protocol === 'wss:' ? url.toString() : null;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Read Sweetlink connection hints injected by framework integrations.
|
|
73
|
+
*
|
|
74
|
+
* Vite injects `window.__SWEETLINK__`; Next.js exposes the same values through
|
|
75
|
+
* `NEXT_PUBLIC_SWEETLINK_*` env replacement. Explicit user options should still
|
|
76
|
+
* take precedence over these hints.
|
|
77
|
+
*/
|
|
78
|
+
export function getSweetlinkRuntimeConfig(globalValue = globalThis) {
|
|
79
|
+
const globalRecord = getRecord(globalValue);
|
|
80
|
+
const nested = getRecord(globalRecord?.__SWEETLINK__);
|
|
81
|
+
const env = getProcessEnv();
|
|
82
|
+
const appPort = globalRecord?.__SWEETLINK_APP_PORT__ ?? nested?.appPort ?? env.NEXT_PUBLIC_SWEETLINK_APP_PORT;
|
|
83
|
+
const wsPort = globalRecord?.__SWEETLINK_WS_PORT__ ?? nested?.wsPort ?? env.NEXT_PUBLIC_SWEETLINK_WS_PORT;
|
|
84
|
+
return {
|
|
85
|
+
appPort: typeof appPort === 'string' || typeof appPort === 'number' ? appPort : null,
|
|
86
|
+
wsPort: typeof wsPort === 'string' || typeof wsPort === 'number' ? wsPort : null,
|
|
87
|
+
wsUrl: normalizeWsUrl(globalRecord?.__SWEETLINK_WS_URL__ ?? nested?.wsUrl) ??
|
|
88
|
+
normalizeWsUrl(env.NEXT_PUBLIC_SWEETLINK_WS_URL),
|
|
89
|
+
wsPath: normalizeWsPath(globalRecord?.__SWEETLINK_WS_PATH__ ?? nested?.wsPath) ??
|
|
90
|
+
normalizeWsPath(env.NEXT_PUBLIC_SWEETLINK_WS_PATH),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function resolveAppPortFromRuntimeConfig(location, config) {
|
|
94
|
+
return parsePortNumber(config.appPort) ?? resolveAppPortFromLocation(location);
|
|
95
|
+
}
|
|
96
|
+
export function createSameOriginSweetlinkWsUrl(location, path = SWEETLINK_WS_PATH) {
|
|
97
|
+
if (!location.host)
|
|
98
|
+
return null;
|
|
99
|
+
const protocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
100
|
+
return `${protocol}//${location.host}${normalizeWsPath(path) ?? SWEETLINK_WS_PATH}`;
|
|
101
|
+
}
|
|
102
|
+
export function isLocalDevelopmentHostname(hostname) {
|
|
103
|
+
const normalized = hostname.toLowerCase().replace(/\.$/, '');
|
|
104
|
+
return (normalized === 'localhost' ||
|
|
105
|
+
normalized === '127.0.0.1' ||
|
|
106
|
+
normalized === '::1' ||
|
|
107
|
+
normalized === '[::1]' ||
|
|
108
|
+
normalized.endsWith('.localhost') ||
|
|
109
|
+
normalized.endsWith('.test') ||
|
|
110
|
+
normalized.endsWith('.local'));
|
|
111
|
+
}
|
|
112
|
+
export function parseLocalDevelopmentUrl(value) {
|
|
113
|
+
if (!value?.trim()) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const url = new URL(value);
|
|
118
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return isLocalDevelopmentHostname(url.hostname) ? url : null;
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function isLocalDevelopmentOrigin(origin) {
|
|
128
|
+
const url = parseLocalDevelopmentUrl(origin);
|
|
129
|
+
return Boolean(url && url.pathname === '/' && !url.search && !url.hash && !url.username && !url.password);
|
|
130
|
+
}
|
|
131
|
+
export function resolveAppPortFromLocalUrl(value) {
|
|
132
|
+
const url = parseLocalDevelopmentUrl(value);
|
|
133
|
+
if (!url) {
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
return parsePortNumber(url.port) ?? getDefaultPortForProtocol(url.protocol);
|
|
137
|
+
}
|
|
138
|
+
export function localOriginMatchesAppPort(origin, appPort) {
|
|
139
|
+
const parsedAppPort = parsePortNumber(appPort);
|
|
140
|
+
const originAppPort = isLocalDevelopmentOrigin(origin)
|
|
141
|
+
? resolveAppPortFromLocalUrl(origin)
|
|
142
|
+
: null;
|
|
143
|
+
return parsedAppPort !== null && originAppPort === parsedAppPort;
|
|
144
|
+
}
|
|
18
145
|
// ============================================================================
|
|
19
146
|
// Type Guards
|
|
20
147
|
// ============================================================================
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+EAA+E;AAC/E,8CAA8C;AAC9C,+EAA+E;AAE/E,sDAAsD;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,4CAA4C;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/vite.d.ts
CHANGED
|
@@ -33,6 +33,17 @@ export interface SweetlinkPluginOptions {
|
|
|
33
33
|
* Default: false
|
|
34
34
|
*/
|
|
35
35
|
headed?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Expose Sweetlink on the app origin at /__sweetlink.
|
|
38
|
+
* This lets HTTPS local proxies such as Portless use wss://<app>/__sweetlink.
|
|
39
|
+
* Default: true
|
|
40
|
+
*/
|
|
41
|
+
sameOrigin?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Same-origin WebSocket path. Only used when sameOrigin is enabled.
|
|
44
|
+
* Default: /__sweetlink
|
|
45
|
+
*/
|
|
46
|
+
wsPath?: string;
|
|
36
47
|
}
|
|
37
48
|
/**
|
|
38
49
|
* Vite plugin for automatic Sweetlink integration
|
package/dist/vite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,sBAA2B,GAAG,MAAM,CA+EtE;AAGD,eAAe,SAAS,CAAC"}
|
package/dist/vite.js
CHANGED
|
@@ -15,11 +15,14 @@
|
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
import { closeSweetlink, initSweetlink } from './server/index.js';
|
|
18
|
-
import { WS_PORT_OFFSET } from './types.js';
|
|
18
|
+
import { SWEETLINK_WS_PATH, WS_PORT_OFFSET } from './types.js';
|
|
19
19
|
/**
|
|
20
20
|
* Vite plugin for automatic Sweetlink integration
|
|
21
21
|
*/
|
|
22
22
|
export function sweetlink(options = {}) {
|
|
23
|
+
let appPort = 5173;
|
|
24
|
+
let actualWsPort = appPort + WS_PORT_OFFSET;
|
|
25
|
+
const wsPath = options.wsPath ?? SWEETLINK_WS_PATH;
|
|
23
26
|
return {
|
|
24
27
|
name: 'sweetlink',
|
|
25
28
|
apply: 'serve', // Only run in dev mode
|
|
@@ -30,12 +33,19 @@ export function sweetlink(options = {}) {
|
|
|
30
33
|
await closeSweetlink();
|
|
31
34
|
const address = viteServer.httpServer?.address();
|
|
32
35
|
const vitePort = typeof address === 'object' && address ? address.port : 5173;
|
|
36
|
+
appPort = vitePort;
|
|
33
37
|
// Calculate WebSocket port (matches GlobalDevBar's calculation)
|
|
34
38
|
const wsPort = options.port ?? vitePort + WS_PORT_OFFSET;
|
|
39
|
+
actualWsPort = wsPort;
|
|
35
40
|
initSweetlink({
|
|
36
41
|
port: wsPort,
|
|
37
42
|
appPort: vitePort,
|
|
43
|
+
appServer: options.sameOrigin === false
|
|
44
|
+
? undefined
|
|
45
|
+
: viteServer.httpServer,
|
|
46
|
+
wsPath,
|
|
38
47
|
onReady: (actualPort) => {
|
|
48
|
+
actualWsPort = actualPort;
|
|
39
49
|
if (actualPort !== wsPort) {
|
|
40
50
|
console.log(`[Sweetlink] Using port ${actualPort} (${wsPort} was in use)`);
|
|
41
51
|
}
|
|
@@ -61,6 +71,15 @@ export function sweetlink(options = {}) {
|
|
|
61
71
|
}
|
|
62
72
|
});
|
|
63
73
|
},
|
|
74
|
+
transformIndexHtml() {
|
|
75
|
+
return [
|
|
76
|
+
{
|
|
77
|
+
tag: 'script',
|
|
78
|
+
injectTo: 'head-prepend',
|
|
79
|
+
children: `window.__SWEETLINK__=Object.assign({},window.__SWEETLINK__,{appPort:${appPort},wsPort:${actualWsPort},wsPath:${JSON.stringify(wsPath)}});window.__SWEETLINK_APP_PORT__=${appPort};window.__SWEETLINK_WS_PORT__=${actualWsPort};window.__SWEETLINK_WS_PATH__=${JSON.stringify(wsPath)};`,
|
|
80
|
+
},
|
|
81
|
+
];
|
|
82
|
+
},
|
|
64
83
|
buildEnd() {
|
|
65
84
|
// Clean up on build end (though this mainly matters for serve mode)
|
|
66
85
|
closeSweetlink();
|
package/dist/vite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ytspar/sweetlink",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.23.0-canary.2da2213",
|
|
4
4
|
"description": "Autonomous development toolkit for AI agents - screenshots, DOM queries, console logs, and JavaScript execution via WebSocket and Chrome DevTools Protocol",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"autonomous-development",
|
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: console-check-sweetlink
|
|
3
|
-
description: "Check browser console for errors/warnings via Sweetlink WebSocket. Triggers on: \"console errors\", \"browser errors\", \"console check\", \"zero errors\". NOT for TypeScript/compile errors (use quick-typecheck) or server-side errors (use debugging agent)."
|
|
4
|
-
allowed-tools: Bash
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Console Check Sweetlink Skill
|
|
8
|
-
|
|
9
|
-
Quickly check browser console for errors and warnings using Sweetlink's real-time log monitoring.
|
|
10
|
-
|
|
11
|
-
## Purpose
|
|
12
|
-
|
|
13
|
-
This skill provides a fast way to verify there are no console errors in the running application. It's essential for maintaining code quality and catching runtime issues immediately after making changes.
|
|
14
|
-
|
|
15
|
-
## When to Use
|
|
16
|
-
|
|
17
|
-
**Automatically use this skill when:**
|
|
18
|
-
|
|
19
|
-
- After making ANY code changes (catch errors immediately)
|
|
20
|
-
- Before marking a task as complete (zero errors policy)
|
|
21
|
-
- User reports unexpected behavior or bugs
|
|
22
|
-
- During debugging workflows
|
|
23
|
-
- After deploying new features
|
|
24
|
-
- User asks to "check console" or "check for errors"
|
|
25
|
-
- Before committing code
|
|
26
|
-
- During code reviews
|
|
27
|
-
|
|
28
|
-
## How It Works
|
|
29
|
-
|
|
30
|
-
Sweetlink maintains a real-time connection to the browser and captures all console messages. This skill:
|
|
31
|
-
|
|
32
|
-
1. Queries Sweetlink for recent console logs
|
|
33
|
-
2. Filters for errors (and optionally warnings)
|
|
34
|
-
3. Returns a summary with error details
|
|
35
|
-
4. Helps identify the root cause quickly
|
|
36
|
-
|
|
37
|
-
## Commands
|
|
38
|
-
|
|
39
|
-
### Check for Errors Only
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
pnpm sweetlink logs --filter error
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### Check for Errors and Warnings
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
pnpm sweetlink logs --filter error && pnpm sweetlink logs --filter warning
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
### Get All Console Logs
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
pnpm sweetlink logs
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### Filter by Specific Term
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
pnpm sweetlink logs --filter "API"
|
|
61
|
-
pnpm sweetlink logs --filter "Failed to"
|
|
62
|
-
pnpm sweetlink logs --filter "undefined"
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Understanding Console Errors
|
|
66
|
-
|
|
67
|
-
### Common Error Types
|
|
68
|
-
|
|
69
|
-
**1. TypeError - Type-related errors**
|
|
70
|
-
|
|
71
|
-
```text
|
|
72
|
-
TypeError: Cannot read property 'data' of undefined
|
|
73
|
-
TypeError: undefined is not a function
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**2. ReferenceError - Variable not defined**
|
|
77
|
-
|
|
78
|
-
```text
|
|
79
|
-
ReferenceError: myVariable is not defined
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
**3. Hydration Errors (React/SSR)**
|
|
83
|
-
|
|
84
|
-
```text
|
|
85
|
-
Warning: Text content did not match. Server: "..." Client: "..."
|
|
86
|
-
Error: Hydration failed because the initial UI does not match...
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**4. Network Errors**
|
|
90
|
-
|
|
91
|
-
```text
|
|
92
|
-
Failed to fetch
|
|
93
|
-
NetworkError when attempting to fetch resource
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**5. React Errors**
|
|
97
|
-
|
|
98
|
-
```text
|
|
99
|
-
Warning: Each child in a list should have a unique "key" prop
|
|
100
|
-
Error: Maximum update depth exceeded
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Output Format
|
|
104
|
-
|
|
105
|
-
### Zero Errors (Success)
|
|
106
|
-
|
|
107
|
-
```text
|
|
108
|
-
✅ Console Check: CLEAN
|
|
109
|
-
|
|
110
|
-
Errors: 0
|
|
111
|
-
Warnings: 0
|
|
112
|
-
Status: Ready for commit ✓
|
|
113
|
-
|
|
114
|
-
The application has no console errors. Zero-error policy maintained.
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Errors Found
|
|
118
|
-
|
|
119
|
-
```markdown
|
|
120
|
-
❌ Console Check: ERRORS FOUND
|
|
121
|
-
|
|
122
|
-
Errors: 3
|
|
123
|
-
Warnings: 1
|
|
124
|
-
|
|
125
|
-
### Errors:
|
|
126
|
-
|
|
127
|
-
1. [ERROR] TypeError: Cannot read property 'data' of undefined
|
|
128
|
-
Location: Card.tsx:45
|
|
129
|
-
Timestamp: 14:23:15.234
|
|
130
|
-
|
|
131
|
-
2. [ERROR] Failed to fetch data from API
|
|
132
|
-
Location: api.ts:89
|
|
133
|
-
Timestamp: 14:23:16.891
|
|
134
|
-
|
|
135
|
-
3. [ERROR] Hydration failed: content mismatch
|
|
136
|
-
Location: page.tsx:12
|
|
137
|
-
Timestamp: 14:23:17.023
|
|
138
|
-
|
|
139
|
-
### Warnings:
|
|
140
|
-
|
|
141
|
-
1. [WARN] Missing key prop in list rendering
|
|
142
|
-
Location: List.tsx:34
|
|
143
|
-
Timestamp: 14:23:15.456
|
|
144
|
-
|
|
145
|
-
### Recommendations:
|
|
146
|
-
- Fix null safety in Card.tsx (add null check for data)
|
|
147
|
-
- Add error handling to API fetch in api.ts
|
|
148
|
-
- Fix hydration by ensuring SSR/client consistency in page.tsx
|
|
149
|
-
- Add unique keys to list items in List.tsx
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
## Best Practices
|
|
153
|
-
|
|
154
|
-
### Development Workflow
|
|
155
|
-
|
|
156
|
-
```bash
|
|
157
|
-
# 1. Check baseline (before making changes)
|
|
158
|
-
pnpm sweetlink logs --filter error
|
|
159
|
-
# Should show 0 errors
|
|
160
|
-
|
|
161
|
-
# 2. Make code changes
|
|
162
|
-
|
|
163
|
-
# 3. Wait for HMR reload (2-3 seconds)
|
|
164
|
-
|
|
165
|
-
# 4. Check for new errors immediately
|
|
166
|
-
pnpm sweetlink logs --filter error
|
|
167
|
-
|
|
168
|
-
# 5. If errors found, fix immediately
|
|
169
|
-
# 6. Repeat until 0 errors
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
### Before Committing
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
# Always check console before commit
|
|
176
|
-
pnpm sweetlink logs --filter error
|
|
177
|
-
|
|
178
|
-
# Only commit if 0 errors
|
|
179
|
-
git commit -m "Add feature (0 console errors)"
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### During Code Review
|
|
183
|
-
|
|
184
|
-
```bash
|
|
185
|
-
# Check PR branch for console errors
|
|
186
|
-
git checkout pr-branch
|
|
187
|
-
pnpm sweetlink logs --filter error
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
## Integration with Other Skills
|
|
191
|
-
|
|
192
|
-
**Works well with:**
|
|
193
|
-
|
|
194
|
-
- `quick-typecheck` - Check both compile-time and runtime errors
|
|
195
|
-
- `screenshot` - Visual verification + console check
|
|
196
|
-
- `responsive-screenshots` - Check errors across viewports
|
|
197
|
-
|
|
198
|
-
**Complete quality check:**
|
|
199
|
-
|
|
200
|
-
```bash
|
|
201
|
-
# 1. Type errors (compile-time)
|
|
202
|
-
pnpm run typecheck
|
|
203
|
-
|
|
204
|
-
# 2. Console errors (runtime)
|
|
205
|
-
pnpm sweetlink logs --filter error
|
|
206
|
-
|
|
207
|
-
# 3. Visual verification
|
|
208
|
-
pnpm sweetlink screenshot --output .tmp/screenshots/verify.png
|
|
209
|
-
|
|
210
|
-
# If all pass: ✅ Ready to commit
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
## Common Error Patterns
|
|
214
|
-
|
|
215
|
-
### Pattern 1: Null/Undefined Access
|
|
216
|
-
|
|
217
|
-
```javascript
|
|
218
|
-
// Error: Cannot read property 'name' of undefined
|
|
219
|
-
const name = user.name;
|
|
220
|
-
|
|
221
|
-
// Fix: Add null check
|
|
222
|
-
const name = user?.name;
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
### Pattern 2: Hydration Mismatch
|
|
226
|
-
|
|
227
|
-
```javascript
|
|
228
|
-
// Error: Hydration failed
|
|
229
|
-
<div>{new Date().toString()}</div>
|
|
230
|
-
|
|
231
|
-
// Fix: Use useEffect for client-only values
|
|
232
|
-
const [time, setTime] = useState('');
|
|
233
|
-
useEffect(() => setTime(new Date().toString()), []);
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### Pattern 3: Missing Error Handling
|
|
237
|
-
|
|
238
|
-
```javascript
|
|
239
|
-
// Error: Unhandled promise rejection
|
|
240
|
-
fetch('/api/data');
|
|
241
|
-
|
|
242
|
-
// Fix: Add error handling
|
|
243
|
-
fetch('/api/data').catch(err => console.error(err));
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
## Troubleshooting
|
|
247
|
-
|
|
248
|
-
### "No browser client connected"
|
|
249
|
-
|
|
250
|
-
**Solution:**
|
|
251
|
-
|
|
252
|
-
```bash
|
|
253
|
-
# 1. Start dev server
|
|
254
|
-
pnpm run dev
|
|
255
|
-
|
|
256
|
-
# 2. Open browser at http://localhost:3000
|
|
257
|
-
# 3. Look for Sweetlink connection indicator (bottom-right)
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### Old Errors Showing
|
|
261
|
-
|
|
262
|
-
**Solution:**
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
# Hard refresh browser to clear cache
|
|
266
|
-
# Mac: Cmd + Shift + R
|
|
267
|
-
# Windows/Linux: Ctrl + Shift + R
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
### Too Many Logs
|
|
271
|
-
|
|
272
|
-
**Solution:**
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
# Filter to focus on errors only
|
|
276
|
-
pnpm sweetlink logs --filter error
|
|
277
|
-
|
|
278
|
-
# Or search for specific term
|
|
279
|
-
pnpm sweetlink logs --filter "MyComponent"
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
## Zero-Error Policy
|
|
283
|
-
|
|
284
|
-
This skill enforces the zero-error policy:
|
|
285
|
-
|
|
286
|
-
**Before marking ANY task complete:**
|
|
287
|
-
|
|
288
|
-
1. Run console check
|
|
289
|
-
2. Ensure 0 errors
|
|
290
|
-
3. If errors found, fix them
|
|
291
|
-
4. Re-check until clean
|
|
292
|
-
5. Only then mark task as complete
|
|
293
|
-
|
|
294
|
-
**Why this matters:**
|
|
295
|
-
|
|
296
|
-
- Prevents bugs from accumulating
|
|
297
|
-
- Catches issues immediately
|
|
298
|
-
- Maintains code quality
|
|
299
|
-
- Improves user experience
|
|
300
|
-
- Reduces debugging time later
|
|
301
|
-
|
|
302
|
-
## Quick Reference
|
|
303
|
-
|
|
304
|
-
### Fast Error Check
|
|
305
|
-
|
|
306
|
-
```bash
|
|
307
|
-
pnpm sweetlink logs --filter error
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
### Full Console Analysis
|
|
311
|
-
|
|
312
|
-
```bash
|
|
313
|
-
pnpm sweetlink logs
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### Search Specific Issue
|
|
317
|
-
|
|
318
|
-
```bash
|
|
319
|
-
pnpm sweetlink logs --filter "hydration"
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
### Check Warnings Too
|
|
323
|
-
|
|
324
|
-
```bash
|
|
325
|
-
pnpm sweetlink logs --filter warning
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
## Examples
|
|
329
|
-
|
|
330
|
-
See `examples.md` for detailed usage scenarios.
|