@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.
Files changed (65) hide show
  1. package/README.md +77 -0
  2. package/dist/browser/SweetlinkBridge.d.ts +9 -0
  3. package/dist/browser/SweetlinkBridge.d.ts.map +1 -1
  4. package/dist/browser/SweetlinkBridge.js +73 -20
  5. package/dist/browser/SweetlinkBridge.js.map +1 -1
  6. package/dist/browser/commands/screenshot.d.ts.map +1 -1
  7. package/dist/browser/commands/screenshot.js +16 -7
  8. package/dist/browser/commands/screenshot.js.map +1 -1
  9. package/dist/browser/screenshotUtils.d.ts +13 -3
  10. package/dist/browser/screenshotUtils.d.ts.map +1 -1
  11. package/dist/browser/screenshotUtils.js +32 -6
  12. package/dist/browser/screenshotUtils.js.map +1 -1
  13. package/dist/cdp.d.ts +1 -0
  14. package/dist/cdp.d.ts.map +1 -1
  15. package/dist/cdp.js +34 -3
  16. package/dist/cdp.js.map +1 -1
  17. package/dist/cli/outputSchemas.d.ts +1 -0
  18. package/dist/cli/outputSchemas.d.ts.map +1 -1
  19. package/dist/cli/outputSchemas.js +1 -0
  20. package/dist/cli/outputSchemas.js.map +1 -1
  21. package/dist/cli/sweetlink-dev.d.ts +5 -2
  22. package/dist/cli/sweetlink-dev.d.ts.map +1 -1
  23. package/dist/cli/sweetlink-dev.js +12 -4
  24. package/dist/cli/sweetlink-dev.js.map +1 -1
  25. package/dist/cli/sweetlink.js +12 -0
  26. package/dist/cli/sweetlink.js.map +1 -1
  27. package/dist/daemon/browser.d.ts +3 -0
  28. package/dist/daemon/browser.d.ts.map +1 -1
  29. package/dist/daemon/browser.js +38 -5
  30. package/dist/daemon/browser.js.map +1 -1
  31. package/dist/daemon/server.d.ts.map +1 -1
  32. package/dist/daemon/server.js +2 -0
  33. package/dist/daemon/server.js.map +1 -1
  34. package/dist/daemon/types.d.ts +2 -0
  35. package/dist/daemon/types.d.ts.map +1 -1
  36. package/dist/daemon/types.js.map +1 -1
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +1 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/next.d.ts.map +1 -1
  42. package/dist/next.js +16 -1
  43. package/dist/next.js.map +1 -1
  44. package/dist/playwright.d.ts +19 -0
  45. package/dist/playwright.d.ts.map +1 -1
  46. package/dist/playwright.js +119 -12
  47. package/dist/playwright.js.map +1 -1
  48. package/dist/server/index.d.ts +6 -0
  49. package/dist/server/index.d.ts.map +1 -1
  50. package/dist/server/index.js +56 -16
  51. package/dist/server/index.js.map +1 -1
  52. package/dist/types.d.ts +35 -0
  53. package/dist/types.d.ts.map +1 -1
  54. package/dist/types.js +127 -0
  55. package/dist/types.js.map +1 -1
  56. package/dist/vite.d.ts +11 -0
  57. package/dist/vite.d.ts.map +1 -1
  58. package/dist/vite.js +20 -1
  59. package/dist/vite.js.map +1 -1
  60. package/package.json +1 -1
  61. package/claude-skills/console-check-sweetlink/SKILL.md +0 -330
  62. package/claude-skills/console-check-sweetlink/examples.md +0 -394
  63. package/claude-skills/resize-for-claude/SKILL.md +0 -97
  64. package/claude-skills/responsive-screenshots/SKILL.md +0 -366
  65. 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":"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"}
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
@@ -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;CAClB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,sBAA2B,GAAG,MAAM,CAyDtE;AAGD,eAAe,SAAS,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;AAwB5C;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,UAAkC,EAAE;IAC5D,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,OAAO,EAAE,uBAAuB;QAEvC,eAAe,CAAC,UAAU;YACxB,4CAA4C;YAC5C,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBAClD,0DAA0D;gBAC1D,MAAM,cAAc,EAAE,CAAC;gBAEvB,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAE9E,gEAAgE;gBAChE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,GAAG,cAAc,CAAC;gBAEzD,aAAa,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,QAAQ;oBACjB,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE;wBACtB,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;4BAC1B,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,KAAK,MAAM,cAAc,CAAC,CAAC;wBAC7E,CAAC;oBACH,CAAC;iBACF,CAAC,CAAC;gBAEH,OAAO,CAAC,GAAG,CAAC,uDAAuD,QAAQ,GAAG,CAAC,CAAC;gBAEhF,kCAAkC;gBAClC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,MAAM,GAAG,GAAG,oBAAoB,QAAQ,EAAE,CAAC;oBAC3C,MAAM,CAAC,oBAAoB,CAAC;yBACzB,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;wBACzB,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;6BACzD,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;4BACd,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,IAAI,aAAa,GAAG,GAAG,CAAC,CAAC;wBACjF,CAAC,CAAC;6BACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;4BACb,OAAO,CAAC,IAAI,CACV,uCAAuC,EACvC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;wBACJ,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE;wBACV,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;oBAC1D,CAAC,CAAC,CAAC;gBACP,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,QAAQ;YACN,oEAAoE;YACpE,cAAc,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,eAAe,SAAS,CAAC"}
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,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAqC/D;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,UAAkC,EAAE;IAC5D,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,YAAY,GAAG,OAAO,GAAG,cAAc,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,iBAAiB,CAAC;IAEnD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,OAAO,EAAE,uBAAuB;QAEvC,eAAe,CAAC,UAAU;YACxB,4CAA4C;YAC5C,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;gBAClD,0DAA0D;gBAC1D,MAAM,cAAc,EAAE,CAAC;gBAEvB,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;gBACjD,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9E,OAAO,GAAG,QAAQ,CAAC;gBAEnB,gEAAgE;gBAChE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,GAAG,cAAc,CAAC;gBACzD,YAAY,GAAG,MAAM,CAAC;gBAEtB,aAAa,CAAC;oBACZ,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,QAAQ;oBACjB,SAAS,EACP,OAAO,CAAC,UAAU,KAAK,KAAK;wBAC1B,CAAC,CAAC,SAAS;wBACX,CAAC,CAAE,UAAU,CAAC,UAA+D;oBACjF,MAAM;oBACN,OAAO,EAAE,CAAC,UAAU,EAAE,EAAE;wBACtB,YAAY,GAAG,UAAU,CAAC;wBAC1B,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;4BAC1B,OAAO,CAAC,GAAG,CAAC,0BAA0B,UAAU,KAAK,MAAM,cAAc,CAAC,CAAC;wBAC7E,CAAC;oBACH,CAAC;iBACF,CAAC,CAAC;gBAEH,OAAO,CAAC,GAAG,CAAC,uDAAuD,QAAQ,GAAG,CAAC,CAAC;gBAEhF,kCAAkC;gBAClC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,MAAM,GAAG,GAAG,oBAAoB,QAAQ,EAAE,CAAC;oBAC3C,MAAM,CAAC,oBAAoB,CAAC;yBACzB,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE;wBACzB,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;6BACzD,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;4BACd,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,IAAI,aAAa,GAAG,GAAG,CAAC,CAAC;wBACjF,CAAC,CAAC;6BACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;4BACb,OAAO,CAAC,IAAI,CACV,uCAAuC,EACvC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CACzC,CAAC;wBACJ,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC;yBACD,KAAK,CAAC,GAAG,EAAE;wBACV,OAAO,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;oBAC1D,CAAC,CAAC,CAAC;gBACP,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,kBAAkB;YAChB,OAAO;gBACL;oBACE,GAAG,EAAE,QAAQ;oBACb,QAAQ,EAAE,cAAc;oBACxB,QAAQ,EAAE,uEAAuE,OAAO,WAAW,YAAY,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,oCAAoC,OAAO,iCAAiC,YAAY,iCAAiC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;iBACnS;aACF,CAAC;QACJ,CAAC;QAED,QAAQ;YACN,oEAAoE;YACpE,cAAc,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,eAAe,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ytspar/sweetlink",
3
- "version": "1.22.0",
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.