@ytspar/sweetlink 1.21.0 → 1.23.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/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/consoleCapture.js +1 -1
- package/dist/browser/consoleCapture.js.map +1 -1
- package/dist/browser/earlyConsoleCapture.d.ts +1 -1
- package/dist/browser/earlyConsoleCapture.d.ts.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 +148 -64
- 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/demo.d.ts.map +1 -1
- package/dist/daemon/demo.js +3 -19
- package/dist/daemon/demo.js.map +1 -1
- package/dist/daemon/recording.d.ts +1 -1
- package/dist/daemon/recording.d.ts.map +1 -1
- package/dist/daemon/recording.js +1 -19
- package/dist/daemon/recording.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +7 -9
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session.d.ts +8 -1
- package/dist/daemon/session.d.ts.map +1 -1
- package/dist/daemon/types.d.ts +9 -2
- package/dist/daemon/types.d.ts.map +1 -1
- package/dist/daemon/types.js.map +1 -1
- package/dist/daemon/utils.d.ts +22 -0
- package/dist/daemon/utils.d.ts.map +1 -0
- package/dist/daemon/utils.js +44 -0
- package/dist/daemon/utils.js.map +1 -0
- package/dist/daemon/viewer.d.ts.map +1 -1
- package/dist/daemon/viewer.js +2 -8
- package/dist/daemon/viewer.js.map +1 -1
- package/dist/daemon/visualDiff.d.ts +9 -0
- package/dist/daemon/visualDiff.d.ts.map +1 -1
- package/dist/daemon/visualDiff.js +12 -1
- package/dist/daemon/visualDiff.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/runs.d.ts +15 -3
- package/dist/runs.d.ts.map +1 -1
- package/dist/runs.js +29 -13
- package/dist/runs.js.map +1 -1
- package/dist/server/index.d.ts +7 -1
- 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/simulator/android.d.ts +6 -0
- package/dist/simulator/android.d.ts.map +1 -1
- package/dist/simulator/android.js +81 -4
- package/dist/simulator/android.js.map +1 -1
- package/dist/simulator/androidTaps.d.ts +12 -2
- package/dist/simulator/androidTaps.d.ts.map +1 -1
- package/dist/simulator/androidTaps.js +57 -11
- package/dist/simulator/androidTaps.js.map +1 -1
- package/dist/simulator/ios.d.ts +7 -0
- package/dist/simulator/ios.d.ts.map +1 -1
- package/dist/simulator/ios.js +70 -25
- package/dist/simulator/ios.js.map +1 -1
- package/dist/term/cast.d.ts +24 -0
- package/dist/term/cast.d.ts.map +1 -0
- package/dist/term/cast.js +24 -0
- package/dist/term/cast.js.map +1 -0
- package/dist/term/player.d.ts.map +1 -1
- package/dist/term/player.js +36 -14
- package/dist/term/player.js.map +1 -1
- package/dist/term/recorder.d.ts +7 -0
- package/dist/term/recorder.d.ts.map +1 -1
- package/dist/term/recorder.js +35 -1
- package/dist/term/recorder.js.map +1 -1
- package/dist/types.d.ts +37 -1
- 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/dist/term/ansi.d.ts +0 -37
- package/dist/term/ansi.d.ts.map +0 -1
- package/dist/term/ansi.js +0 -205
- package/dist/term/ansi.js.map +0 -1
package/dist/cdp.js
CHANGED
|
@@ -16,6 +16,15 @@ const NETWORK_IDLE_TIMEOUT_MS = 10000;
|
|
|
16
16
|
const NETWORK_IDLE_TIME_MS = 500;
|
|
17
17
|
const SELECTOR_TIMEOUT_MS = 5000;
|
|
18
18
|
const HOVER_TRANSITION_DELAY_MS = 300;
|
|
19
|
+
const HIDE_DEVBAR_STYLE_ID = 'sweetlink-hide-devbar-for-screenshot';
|
|
20
|
+
const HIDE_DEVBAR_CSS = `
|
|
21
|
+
[data-devbar],
|
|
22
|
+
[data-devbar-overlay],
|
|
23
|
+
[data-devbar-tooltip] {
|
|
24
|
+
visibility: hidden !important;
|
|
25
|
+
pointer-events: none !important;
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
19
28
|
const NETWORK_REQUEST_COLLECT_DELAY_MS = 2000;
|
|
20
29
|
/**
|
|
21
30
|
* Check if Chrome DevTools Protocol is available
|
|
@@ -137,9 +146,31 @@ export async function screenshotViaCDP(options) {
|
|
|
137
146
|
throw new Error(`Failed to find element "${options.selector}": ${error instanceof Error ? error.message : error}`);
|
|
138
147
|
}
|
|
139
148
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
149
|
+
let devbarHidden = false;
|
|
150
|
+
if (options.hideDevbar) {
|
|
151
|
+
devbarHidden = await page.evaluate((styleId, css) => {
|
|
152
|
+
if (document.getElementById(styleId))
|
|
153
|
+
return false;
|
|
154
|
+
const style = document.createElement('style');
|
|
155
|
+
style.id = styleId;
|
|
156
|
+
style.textContent = css;
|
|
157
|
+
document.head.appendChild(style);
|
|
158
|
+
return true;
|
|
159
|
+
}, HIDE_DEVBAR_STYLE_ID, HIDE_DEVBAR_CSS);
|
|
160
|
+
}
|
|
161
|
+
let buffer;
|
|
162
|
+
try {
|
|
163
|
+
// Take the screenshot
|
|
164
|
+
const screenshot = await page.screenshot(screenshotOptions);
|
|
165
|
+
buffer = Buffer.from(screenshot);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
if (devbarHidden) {
|
|
169
|
+
await page.evaluate((styleId) => {
|
|
170
|
+
document.getElementById(styleId)?.remove();
|
|
171
|
+
}, HIDE_DEVBAR_STYLE_ID);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
143
174
|
// Save to file if output path provided
|
|
144
175
|
if (options.output) {
|
|
145
176
|
fs.writeFileSync(options.output, buffer);
|
package/dist/cdp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdp.js","sourceRoot":"","sources":["../src/cdp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,uBAAuB,CAAC;AACtE,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,uBAAuB,CAAC;AAEjF,eAAe;AACf,MAAM,uBAAuB,GAAG,KAAK,CAAC;AACtC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACjC,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,MAAM,yBAAyB,GAAG,GAAG,CAAC;AACtC,MAAM,gCAAgC,GAAG,IAAI,CAAC;AAE9C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,eAAe,CAAC,CAAC;QACxD,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC;YACtC,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC;QAC5F,MAAM,IAAI,KAAK,CACb,0BAA0B,YAAY,sIAAsI,CAC7K,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAgB;IACrD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7E,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAO,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,OAAO,EAAE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,uDAAuD;IACvD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CACT,sBAAsB,OAAO,IAAI,OAAO,8BAA8B,eAAe,KAAK,CAC3F,CAAC;QAEF,yCAAyC;QACzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,OAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"cdp.js","sourceRoot":"","sources":["../src/cdp.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outputSchemas.d.ts","sourceRoot":"","sources":["../../src/cli/outputSchemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAMD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"outputSchemas.d.ts","sourceRoot":"","sources":["../../src/cli/outputSchemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outputSchemas.js","sourceRoot":"","sources":["../../src/cli/outputSchemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"outputSchemas.js","sourceRoot":"","sources":["../../src/cli/outputSchemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA8JH,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E,MAAM,eAAe,GAAG;;;;;;EAMtB,CAAC;AAEH,MAAM,CAAC,MAAM,OAAO,GAA2B;IAC7C,UAAU,EAAE;;;;;;;EAOZ;IAEA,KAAK,EAAE;;;;EAIP;IAEA,IAAI,EAAE;;;;;;EAMN;IAEA,IAAI,EAAE;;EAEN;IAEA,KAAK,EAAE;;;;EAIP;IAEA,OAAO,EAAE;;EAET;IAEA,KAAK,EAAE;;;;;EAKP;IAEA,OAAO,EAAE;;;EAGT;IAEA,MAAM,EAAE;;;;EAIR;IAEA,OAAO,EAAE;;;;EAIT;IAEA,IAAI,EAAE;;;;EAIN;IAEA,MAAM,EAAE;;;EAGR;IAEA,OAAO,EAAE;;;;EAIT;IAEA,IAAI,EAAE;;;;EAIN;IAEA,MAAM,EAAE;;;;EAIR;IAEA,MAAM,EAAE;;;;;;EAMR;IAEA,QAAQ,EAAE;;;;EAIV;IAEA,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCT;IAEA,OAAO,EAAE;;;;;;EAMT;IAEA,IAAI,EAAE;;;EAGN;IAEA,KAAK,EAAE;;EAEP;IAEA,MAAM,EAAE;;;;;;EAMR;CACD,CAAC;AAEF,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAsB;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB;IAChD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO;IACT,CAAC;IAED,+BAA+B;IAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -6,8 +6,11 @@
|
|
|
6
6
|
* Run alongside the Remix dev server.
|
|
7
7
|
*
|
|
8
8
|
* Environment variables:
|
|
9
|
-
* - SWEETLINK_WS_PORT: WebSocket server port (default: 9223)
|
|
10
|
-
* -
|
|
9
|
+
* - SWEETLINK_WS_PORT: WebSocket server port (default: appPort + 6223, or 9223)
|
|
10
|
+
* - SWEETLINK_APP_PORT: Associated app port for origin validation (optional)
|
|
11
|
+
* - SWEETLINK_APP_URL: Associated local app URL for origin validation (optional)
|
|
12
|
+
* - PORTLESS_URL: Associated Portless app URL for origin validation (optional)
|
|
13
|
+
* - PORT: Associated app port fallback for origin validation (optional)
|
|
11
14
|
* - ANTHROPIC_API_KEY: Required for AI design review feature
|
|
12
15
|
*/
|
|
13
16
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweetlink-dev.d.ts","sourceRoot":"","sources":["../../src/cli/sweetlink-dev.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"sweetlink-dev.d.ts","sourceRoot":"","sources":["../../src/cli/sweetlink-dev.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG"}
|
|
@@ -6,8 +6,11 @@
|
|
|
6
6
|
* Run alongside the Remix dev server.
|
|
7
7
|
*
|
|
8
8
|
* Environment variables:
|
|
9
|
-
* - SWEETLINK_WS_PORT: WebSocket server port (default: 9223)
|
|
10
|
-
* -
|
|
9
|
+
* - SWEETLINK_WS_PORT: WebSocket server port (default: appPort + 6223, or 9223)
|
|
10
|
+
* - SWEETLINK_APP_PORT: Associated app port for origin validation (optional)
|
|
11
|
+
* - SWEETLINK_APP_URL: Associated local app URL for origin validation (optional)
|
|
12
|
+
* - PORTLESS_URL: Associated Portless app URL for origin validation (optional)
|
|
13
|
+
* - PORT: Associated app port fallback for origin validation (optional)
|
|
11
14
|
* - ANTHROPIC_API_KEY: Required for AI design review feature
|
|
12
15
|
*/
|
|
13
16
|
import { config } from 'dotenv';
|
|
@@ -15,8 +18,13 @@ import { join } from 'path';
|
|
|
15
18
|
// Load .env from the project directory (cwd)
|
|
16
19
|
config({ path: join(process.cwd(), '.env') });
|
|
17
20
|
import { closeSweetlink, initSweetlink } from '../server.js';
|
|
18
|
-
|
|
19
|
-
const appPort =
|
|
21
|
+
import { parsePortNumber, resolveAppPortFromLocalUrl, resolveSweetlinkWsPortForAppPort, } from '../types.js';
|
|
22
|
+
const appPort = parsePortNumber(process.env.SWEETLINK_APP_PORT) ??
|
|
23
|
+
resolveAppPortFromLocalUrl(process.env.SWEETLINK_APP_URL) ??
|
|
24
|
+
resolveAppPortFromLocalUrl(process.env.PORTLESS_URL) ??
|
|
25
|
+
parsePortNumber(process.env.PORT) ??
|
|
26
|
+
undefined;
|
|
27
|
+
const port = parsePortNumber(process.env.SWEETLINK_WS_PORT) ?? resolveSweetlinkWsPortForAppPort(appPort);
|
|
20
28
|
console.log('[Sweetlink] Starting development server...');
|
|
21
29
|
console.log(`[Sweetlink] Project directory: ${process.cwd()}`);
|
|
22
30
|
initSweetlink({ port, appPort });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sweetlink-dev.js","sourceRoot":"","sources":["../../src/cli/sweetlink-dev.ts"],"names":[],"mappings":";AAEA
|
|
1
|
+
{"version":3,"file":"sweetlink-dev.js","sourceRoot":"","sources":["../../src/cli/sweetlink-dev.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,6CAA6C;AAC7C,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,aAAa,CAAC;AAErB,MAAM,OAAO,GACX,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAC/C,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACzD,0BAA0B,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACpD,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC,SAAS,CAAC;AACZ,MAAM,IAAI,GACR,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,gCAAgC,CAAC,OAAO,CAAC,CAAC;AAE9F,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;AAC1D,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAE/D,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAEjC,oBAAoB;AACpB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,cAAc,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,cAAc,EAAE,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,2BAA2B;AAC3B,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC"}
|
package/dist/cli/sweetlink.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Command-line interface for interacting with the Sweetlink WebSocket server.
|
|
6
6
|
* Allows taking screenshots, querying DOM, getting console logs, and executing JavaScript.
|
|
7
7
|
*/
|
|
8
|
+
import * as childProcess from 'child_process';
|
|
8
9
|
import * as fs from 'fs';
|
|
9
10
|
import * as path from 'path';
|
|
10
11
|
import { WebSocket } from 'ws';
|
|
@@ -90,6 +91,75 @@ function ensureDir(filePath) {
|
|
|
90
91
|
fs.mkdirSync(dir, { recursive: true });
|
|
91
92
|
}
|
|
92
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Find the most recent recording-session directory.
|
|
96
|
+
* Returns the absolute path or null if no sessions exist.
|
|
97
|
+
*/
|
|
98
|
+
function findLatestSessionDir(baseDir) {
|
|
99
|
+
if (!fs.existsSync(baseDir))
|
|
100
|
+
return null;
|
|
101
|
+
const sessions = fs
|
|
102
|
+
.readdirSync(baseDir)
|
|
103
|
+
.filter((f) => f.startsWith('session-'))
|
|
104
|
+
.sort()
|
|
105
|
+
.reverse();
|
|
106
|
+
if (sessions.length === 0)
|
|
107
|
+
return null;
|
|
108
|
+
return path.join(baseDir, sessions[0]);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Open a file in the default GUI handler. Cross-platform helper used by
|
|
112
|
+
* `record stop` (auto-open viewer) and `sessions open` (browse index).
|
|
113
|
+
* Failure is best-effort — the path is already on disk, the user can open
|
|
114
|
+
* it manually if no GUI is available.
|
|
115
|
+
*/
|
|
116
|
+
function openInBrowser(filePath) {
|
|
117
|
+
let cmd;
|
|
118
|
+
let args;
|
|
119
|
+
switch (process.platform) {
|
|
120
|
+
case 'darwin':
|
|
121
|
+
cmd = 'open';
|
|
122
|
+
args = [filePath];
|
|
123
|
+
break;
|
|
124
|
+
case 'win32':
|
|
125
|
+
cmd = 'cmd';
|
|
126
|
+
args = ['/c', 'start', '', filePath];
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
cmd = 'xdg-open';
|
|
130
|
+
args = [filePath];
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
try {
|
|
134
|
+
childProcess.spawn(cmd, args, { detached: true, stdio: 'ignore' }).unref();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
/* best effort — user can open manually */
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Reject --output paths that escape the project root.
|
|
142
|
+
*
|
|
143
|
+
* Any path is fine when it resolves inside the project (relative or absolute);
|
|
144
|
+
* paths that resolve outside (e.g. `--output ../../../etc/passwd`,
|
|
145
|
+
* `--output /Users/victim/.zshrc`, or batch JSON `output: "/etc/cron.d/x"`)
|
|
146
|
+
* are blocked unless `SWEETLINK_ALLOW_OUTSIDE_OUTPUT=1` is set. Without this
|
|
147
|
+
* gate the batch JSON-stdin mode lets a less-trusted upstream agent write
|
|
148
|
+
* arbitrary content to arbitrary paths the user can write.
|
|
149
|
+
*/
|
|
150
|
+
function assertOutputInRoot(outputPath) {
|
|
151
|
+
const projectRoot = path.resolve(findProjectRoot());
|
|
152
|
+
const resolved = path.resolve(outputPath);
|
|
153
|
+
if (process.env.SWEETLINK_ALLOW_OUTSIDE_OUTPUT === '1')
|
|
154
|
+
return resolved;
|
|
155
|
+
if (resolved !== projectRoot && !resolved.startsWith(`${projectRoot}${path.sep}`)) {
|
|
156
|
+
throw new Error(`Refusing to write outside project root.\n` +
|
|
157
|
+
` output: ${resolved}\n` +
|
|
158
|
+
` project: ${projectRoot}\n` +
|
|
159
|
+
`Pass a path inside the project, or set SWEETLINK_ALLOW_OUTSIDE_OUTPUT=1 to override.`);
|
|
160
|
+
}
|
|
161
|
+
return resolved;
|
|
162
|
+
}
|
|
93
163
|
/**
|
|
94
164
|
* Get the default screenshot output path (relative to project root)
|
|
95
165
|
*/
|
|
@@ -408,6 +478,7 @@ async function takePlaywrightScreenshot(options, method) {
|
|
|
408
478
|
fullPage: options.fullPage,
|
|
409
479
|
viewport: options.viewport,
|
|
410
480
|
hover: options.hover,
|
|
481
|
+
hideDevbar: options.hideDevbar,
|
|
411
482
|
url: options.url,
|
|
412
483
|
});
|
|
413
484
|
reportScreenshotSuccess(outputPath, result.width, result.height, method, options.selector);
|
|
@@ -417,6 +488,7 @@ async function takePlaywrightScreenshot(options, method) {
|
|
|
417
488
|
height: result.height,
|
|
418
489
|
method,
|
|
419
490
|
selector: options.selector,
|
|
491
|
+
...(options.hideDevbar ? { devbarHidden: true } : {}),
|
|
420
492
|
};
|
|
421
493
|
}
|
|
422
494
|
async function screenshot(options) {
|
|
@@ -445,6 +517,7 @@ async function screenshot(options) {
|
|
|
445
517
|
if (options.responsive) {
|
|
446
518
|
const resp = await daemonRequest(daemonState, 'screenshot-responsive', {
|
|
447
519
|
fullPage: options.fullPage,
|
|
520
|
+
hideDevbar: options.hideDevbar,
|
|
448
521
|
});
|
|
449
522
|
const data = resp.data;
|
|
450
523
|
const outputDir = options.output
|
|
@@ -465,6 +538,7 @@ async function screenshot(options) {
|
|
|
465
538
|
width: first.width,
|
|
466
539
|
height: first.height,
|
|
467
540
|
method: 'Daemon (responsive)',
|
|
541
|
+
...(options.hideDevbar ? { devbarHidden: true } : {}),
|
|
468
542
|
};
|
|
469
543
|
}
|
|
470
544
|
// Single hifi screenshot
|
|
@@ -474,6 +548,7 @@ async function screenshot(options) {
|
|
|
474
548
|
viewport: options.viewport,
|
|
475
549
|
padding: options.padding,
|
|
476
550
|
theme: options.theme,
|
|
551
|
+
hideDevbar: options.hideDevbar,
|
|
477
552
|
});
|
|
478
553
|
const data = resp.data;
|
|
479
554
|
const outputPath = options.output || getDefaultScreenshotPath();
|
|
@@ -501,6 +576,7 @@ async function screenshot(options) {
|
|
|
501
576
|
height: data.height,
|
|
502
577
|
method: 'Daemon (hifi)',
|
|
503
578
|
selector: options.selector,
|
|
579
|
+
...(options.hideDevbar ? { devbarHidden: true } : {}),
|
|
504
580
|
};
|
|
505
581
|
}
|
|
506
582
|
console.log('[Sweetlink] Taking screenshot...');
|
|
@@ -524,6 +600,7 @@ async function screenshot(options) {
|
|
|
524
600
|
fullPage: options.fullPage,
|
|
525
601
|
viewport: options.viewport,
|
|
526
602
|
hover: options.hover,
|
|
603
|
+
hideDevbar: options.hideDevbar,
|
|
527
604
|
url: options.url,
|
|
528
605
|
};
|
|
529
606
|
// If we need CDP/Playwright (for hover or force-cdp), or if CDP is available, use Playwright
|
|
@@ -561,6 +638,7 @@ async function screenshot(options) {
|
|
|
561
638
|
const command = {
|
|
562
639
|
type: 'screenshot',
|
|
563
640
|
selector: options.selector,
|
|
641
|
+
hideDevbar: options.hideDevbar || undefined,
|
|
564
642
|
options: {
|
|
565
643
|
fullPage: options.fullPage,
|
|
566
644
|
a11y: options.a11y,
|
|
@@ -598,6 +676,7 @@ async function screenshot(options) {
|
|
|
598
676
|
height: data.height,
|
|
599
677
|
method: 'WebSocket (html2canvas)',
|
|
600
678
|
selector: data.selector,
|
|
679
|
+
...(options.hideDevbar ? { devbarHidden: true } : {}),
|
|
601
680
|
};
|
|
602
681
|
}
|
|
603
682
|
catch (error) {
|
|
@@ -1518,26 +1597,33 @@ async function getVitals(options) {
|
|
|
1518
1597
|
console.log(`\n[Sweetlink] Web Vitals`);
|
|
1519
1598
|
console.log(` URL: ${vitalsData.url}`);
|
|
1520
1599
|
console.log(` ${summary}`);
|
|
1521
|
-
// Detailed breakdown
|
|
1600
|
+
// Detailed breakdown — pick a green/yellow/red color per Web Vitals threshold
|
|
1601
|
+
const ANSI_GREEN = '\x1b[32m';
|
|
1602
|
+
const ANSI_YELLOW = '\x1b[33m';
|
|
1603
|
+
const ANSI_RED = '\x1b[31m';
|
|
1604
|
+
const ANSI_RESET = '\x1b[0m';
|
|
1605
|
+
const thresholdColor = (value, good, ok) => {
|
|
1606
|
+
if (value <= good)
|
|
1607
|
+
return ANSI_GREEN;
|
|
1608
|
+
if (value <= ok)
|
|
1609
|
+
return ANSI_YELLOW;
|
|
1610
|
+
return ANSI_RED;
|
|
1611
|
+
};
|
|
1522
1612
|
if (vitalsData.fcp !== null) {
|
|
1523
1613
|
const fcp = vitalsData.fcp;
|
|
1524
|
-
|
|
1525
|
-
console.log(` FCP: ${color}${fcp}ms\x1b[0m`);
|
|
1614
|
+
console.log(` FCP: ${thresholdColor(fcp, 1800, 3000)}${fcp}ms${ANSI_RESET}`);
|
|
1526
1615
|
}
|
|
1527
1616
|
if (vitalsData.lcp !== null) {
|
|
1528
1617
|
const lcp = vitalsData.lcp;
|
|
1529
|
-
|
|
1530
|
-
console.log(` LCP: ${color}${lcp}ms\x1b[0m`);
|
|
1618
|
+
console.log(` LCP: ${thresholdColor(lcp, 2500, 4000)}${lcp}ms${ANSI_RESET}`);
|
|
1531
1619
|
}
|
|
1532
1620
|
if (vitalsData.cls !== null) {
|
|
1533
1621
|
const cls = vitalsData.cls;
|
|
1534
|
-
|
|
1535
|
-
console.log(` CLS: ${color}${cls}\x1b[0m`);
|
|
1622
|
+
console.log(` CLS: ${thresholdColor(cls, 0.1, 0.25)}${cls}${ANSI_RESET}`);
|
|
1536
1623
|
}
|
|
1537
1624
|
if (vitalsData.inp !== null) {
|
|
1538
1625
|
const inp = vitalsData.inp;
|
|
1539
|
-
|
|
1540
|
-
console.log(` INP: ${color}${inp}ms\x1b[0m`);
|
|
1626
|
+
console.log(` INP: ${thresholdColor(inp, 200, 500)}${inp}ms${ANSI_RESET}`);
|
|
1541
1627
|
}
|
|
1542
1628
|
if (vitalsData.pageSize !== null) {
|
|
1543
1629
|
const sizeKB = Math.round(vitalsData.pageSize / 1024);
|
|
@@ -1595,6 +1681,7 @@ const COMMAND_HELP = {
|
|
|
1595
1681
|
--selector <css-selector> CSS selector of element to screenshot
|
|
1596
1682
|
--output <path> Output file path (default: screenshot-<timestamp>.png)
|
|
1597
1683
|
--full-page Capture full scrollable page (default: viewport only)
|
|
1684
|
+
--hide-devbar Temporarily hide DevBar chrome from the screenshot
|
|
1598
1685
|
--width <pixels> Viewport width for Playwright (e.g., 768 for tablet, 375 for mobile)
|
|
1599
1686
|
--height <pixels> Viewport height for Playwright (default: width * 1.5)
|
|
1600
1687
|
--viewport <preset|WxH> Viewport preset for Playwright (mobile, tablet, desktop) or WIDTHxHEIGHT
|
|
@@ -1615,6 +1702,7 @@ const COMMAND_HELP = {
|
|
|
1615
1702
|
pnpm sweetlink screenshot # Viewport screenshot (small)
|
|
1616
1703
|
pnpm sweetlink screenshot --url "http://localhost:3000/company/foo" # Navigate then capture
|
|
1617
1704
|
pnpm sweetlink screenshot --selector ".company-card" # Element screenshot
|
|
1705
|
+
pnpm sweetlink screenshot --hide-devbar # Capture app without DevBar chrome
|
|
1618
1706
|
pnpm sweetlink screenshot --full-page # Full scrollable page
|
|
1619
1707
|
pnpm sweetlink screenshot --force-cdp --viewport tablet # Playwright at 768x1024
|
|
1620
1708
|
pnpm sweetlink screenshot --force-cdp --width 375 --height 667 # Playwright at iPhone SE
|
|
@@ -2171,6 +2259,30 @@ async function runBatchFromStdin() {
|
|
|
2171
2259
|
if (!allOk)
|
|
2172
2260
|
process.exit(1);
|
|
2173
2261
|
}
|
|
2262
|
+
/**
|
|
2263
|
+
* Resolve the on-disk path for a capture artifact (term .cast, sim .mp4).
|
|
2264
|
+
* Honours --app/--run for the app-scoped hierarchy (delegates to runSlot)
|
|
2265
|
+
* and the historical flat layout when --app is absent. Used by both the
|
|
2266
|
+
* batch JSON-stdin path and the direct CLI handlers so they cannot drift.
|
|
2267
|
+
*/
|
|
2268
|
+
async function resolveCapturePath(opts) {
|
|
2269
|
+
if (opts.output)
|
|
2270
|
+
return assertOutputInRoot(opts.output);
|
|
2271
|
+
const labelSlug = (opts.label ?? 'batch')
|
|
2272
|
+
.replace(/[^a-z0-9]/gi, '-')
|
|
2273
|
+
.toLowerCase()
|
|
2274
|
+
.slice(0, 40);
|
|
2275
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
2276
|
+
const filename = `${labelSlug}-${stamp}.${opts.ext}`;
|
|
2277
|
+
const { runSlot } = await import('../runs.js');
|
|
2278
|
+
const dir = runSlot({
|
|
2279
|
+
baseDir: findProjectRoot(),
|
|
2280
|
+
app: opts.app,
|
|
2281
|
+
run: opts.run,
|
|
2282
|
+
kind: opts.kind,
|
|
2283
|
+
});
|
|
2284
|
+
return assertOutputInRoot(path.join(dir, filename));
|
|
2285
|
+
}
|
|
2174
2286
|
async function runOneBatchCapture(cap) {
|
|
2175
2287
|
const mode = cap.mode;
|
|
2176
2288
|
if (!mode)
|
|
@@ -2180,13 +2292,14 @@ async function runOneBatchCapture(cap) {
|
|
|
2180
2292
|
if (!command)
|
|
2181
2293
|
throw new Error('term capture missing "command".');
|
|
2182
2294
|
const label = cap.label ?? 'batch';
|
|
2183
|
-
const
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
.
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2295
|
+
const output = await resolveCapturePath({
|
|
2296
|
+
kind: 'term',
|
|
2297
|
+
label,
|
|
2298
|
+
output: cap.output,
|
|
2299
|
+
app: cap.app,
|
|
2300
|
+
run: cap.run,
|
|
2301
|
+
ext: 'cast',
|
|
2302
|
+
});
|
|
2190
2303
|
ensureDir(output);
|
|
2191
2304
|
const { captureTerminal } = await import('../term/recorder.js');
|
|
2192
2305
|
const { generatePlayer } = await import('../term/player.js');
|
|
@@ -2197,6 +2310,7 @@ async function runOneBatchCapture(cap) {
|
|
|
2197
2310
|
shell: cap.shell,
|
|
2198
2311
|
cols: typeof cap.cols === 'number' ? cap.cols : undefined,
|
|
2199
2312
|
rows: typeof cap.rows === 'number' ? cap.rows : undefined,
|
|
2313
|
+
inheritEnv: cap.inheritEnv === true,
|
|
2200
2314
|
});
|
|
2201
2315
|
const playerPath = await generatePlayer({ castPath: output });
|
|
2202
2316
|
return {
|
|
@@ -2212,13 +2326,14 @@ async function runOneBatchCapture(cap) {
|
|
|
2212
2326
|
if (!command)
|
|
2213
2327
|
throw new Error(`${mode} capture missing "command".`);
|
|
2214
2328
|
const label = cap.label ?? 'batch';
|
|
2215
|
-
const
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
.
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2329
|
+
const output = await resolveCapturePath({
|
|
2330
|
+
kind: 'sim',
|
|
2331
|
+
label,
|
|
2332
|
+
output: cap.output,
|
|
2333
|
+
app: cap.app,
|
|
2334
|
+
run: cap.run,
|
|
2335
|
+
ext: 'mp4',
|
|
2336
|
+
});
|
|
2222
2337
|
ensureDir(output);
|
|
2223
2338
|
const device = cap.device;
|
|
2224
2339
|
if (mode === 'sim-ios') {
|
|
@@ -2246,7 +2361,7 @@ async function runOneBatchCapture(cap) {
|
|
|
2246
2361
|
});
|
|
2247
2362
|
const data = resp.data;
|
|
2248
2363
|
if (cap.output) {
|
|
2249
|
-
const outputPath = cap.output;
|
|
2364
|
+
const outputPath = assertOutputInRoot(cap.output);
|
|
2250
2365
|
ensureDir(outputPath);
|
|
2251
2366
|
fs.writeFileSync(outputPath, Buffer.from(data.screenshot, 'base64'));
|
|
2252
2367
|
return { path: outputPath, width: data.width, height: data.height };
|
|
@@ -2452,6 +2567,7 @@ async function handleStatusCommand() {
|
|
|
2452
2567
|
width: getArg('--width') ? parseInt(getArg('--width'), 10) : undefined,
|
|
2453
2568
|
height: getArg('--height') ? parseInt(getArg('--height'), 10) : undefined,
|
|
2454
2569
|
hover: hasFlag('--hover'),
|
|
2570
|
+
hideDevbar: hasFlag('--hide-devbar'),
|
|
2455
2571
|
padding: getArg('--padding') ? parseInt(getArg('--padding'), 10) : undefined,
|
|
2456
2572
|
theme: getArg('--theme'),
|
|
2457
2573
|
url: getArg('--url'),
|
|
@@ -2721,17 +2837,11 @@ async function handleStatusCommand() {
|
|
|
2721
2837
|
process.exit(1);
|
|
2722
2838
|
}
|
|
2723
2839
|
const sessionDirArg = getArg('--session') ?? '.sweetlink';
|
|
2724
|
-
|
|
2725
|
-
|
|
2726
|
-
.readdirSync(sessionDirArg)
|
|
2727
|
-
.filter((f) => f.startsWith('session-'))
|
|
2728
|
-
.sort()
|
|
2729
|
-
.reverse();
|
|
2730
|
-
if (sessionFiles.length === 0) {
|
|
2840
|
+
const latestSession = findLatestSessionDir(sessionDirArg);
|
|
2841
|
+
if (!latestSession) {
|
|
2731
2842
|
console.error('[Sweetlink] No session found. Run `record start` and `record stop` first.');
|
|
2732
2843
|
process.exit(1);
|
|
2733
2844
|
}
|
|
2734
|
-
const latestSession = path.join(sessionDirArg, sessionFiles[0]);
|
|
2735
2845
|
const manifestPath = path.join(latestSession, 'sweetlink-session.json');
|
|
2736
2846
|
if (!fs.existsSync(manifestPath)) {
|
|
2737
2847
|
console.error(`[Sweetlink] No manifest found at ${manifestPath}`);
|
|
@@ -2782,20 +2892,7 @@ async function handleStatusCommand() {
|
|
|
2782
2892
|
// Auto-open the viewer (cross-platform; --no-open to suppress)
|
|
2783
2893
|
if (data.viewerPath && !hasFlag('--no-open')) {
|
|
2784
2894
|
console.log(` Viewer: ${data.viewerPath}`);
|
|
2785
|
-
|
|
2786
|
-
// `start` on Windows is a cmd builtin, not an exe — must invoke via cmd.
|
|
2787
|
-
const cmd = process.platform === 'darwin'
|
|
2788
|
-
? 'open'
|
|
2789
|
-
: process.platform === 'win32'
|
|
2790
|
-
? 'cmd'
|
|
2791
|
-
: 'xdg-open';
|
|
2792
|
-
const args = process.platform === 'win32'
|
|
2793
|
-
? ['/c', 'start', '', data.viewerPath]
|
|
2794
|
-
: [data.viewerPath];
|
|
2795
|
-
execFile(cmd, args, (err) => {
|
|
2796
|
-
if (err)
|
|
2797
|
-
console.error(' Could not open viewer:', err.message);
|
|
2798
|
-
});
|
|
2895
|
+
openInBrowser(data.viewerPath);
|
|
2799
2896
|
console.log(` Opened in browser.`);
|
|
2800
2897
|
}
|
|
2801
2898
|
else if (data.viewerPath) {
|
|
@@ -2915,21 +3012,15 @@ async function handleStatusCommand() {
|
|
|
2915
3012
|
}
|
|
2916
3013
|
case 'report': {
|
|
2917
3014
|
const sessionDirArg = getArg('--session') ?? '.sweetlink';
|
|
2918
|
-
// Find latest session directory
|
|
2919
3015
|
if (!fs.existsSync(sessionDirArg)) {
|
|
2920
3016
|
console.error(`[Sweetlink] Session directory not found: ${sessionDirArg}`);
|
|
2921
3017
|
process.exit(1);
|
|
2922
3018
|
}
|
|
2923
|
-
const
|
|
2924
|
-
|
|
2925
|
-
.filter((f) => f.startsWith('session-'))
|
|
2926
|
-
.sort()
|
|
2927
|
-
.reverse();
|
|
2928
|
-
if (reportSessions.length === 0) {
|
|
3019
|
+
const reportSessionDir = findLatestSessionDir(sessionDirArg);
|
|
3020
|
+
if (!reportSessionDir) {
|
|
2929
3021
|
console.error('[Sweetlink] No session found. Run `record start` and `record stop` first.');
|
|
2930
3022
|
process.exit(1);
|
|
2931
3023
|
}
|
|
2932
|
-
const reportSessionDir = path.join(sessionDirArg, reportSessions[0]);
|
|
2933
3024
|
if (hasFlag('--clipboard')) {
|
|
2934
3025
|
// Copy SUMMARY.md to clipboard
|
|
2935
3026
|
const summaryPath = path.join(reportSessionDir, 'SUMMARY.md');
|
|
@@ -2949,7 +3040,7 @@ async function handleStatusCommand() {
|
|
|
2949
3040
|
console.error(`[Sweetlink] Failed to copy to clipboard (${clipCmd}):`, err instanceof Error ? err.message : err);
|
|
2950
3041
|
process.exit(1);
|
|
2951
3042
|
}
|
|
2952
|
-
result = { mode: 'clipboard', session:
|
|
3043
|
+
result = { mode: 'clipboard', session: path.basename(reportSessionDir) };
|
|
2953
3044
|
}
|
|
2954
3045
|
else if (hasFlag('--serve')) {
|
|
2955
3046
|
// Serve viewer.html on a random port
|
|
@@ -3033,7 +3124,7 @@ async function handleStatusCommand() {
|
|
|
3033
3124
|
}
|
|
3034
3125
|
const summaryContent = fs.readFileSync(summaryPath, 'utf-8');
|
|
3035
3126
|
process.stdout.write(summaryContent);
|
|
3036
|
-
result = { mode: 'stdout', session:
|
|
3127
|
+
result = { mode: 'stdout', session: path.basename(reportSessionDir) };
|
|
3037
3128
|
}
|
|
3038
3129
|
break;
|
|
3039
3130
|
}
|
|
@@ -3295,14 +3386,7 @@ async function handleStatusCommand() {
|
|
|
3295
3386
|
else if (sub === 'open') {
|
|
3296
3387
|
// Open the index.html in the browser
|
|
3297
3388
|
if (data.indexPath) {
|
|
3298
|
-
|
|
3299
|
-
const cmd = process.platform === 'darwin'
|
|
3300
|
-
? 'open'
|
|
3301
|
-
: process.platform === 'win32'
|
|
3302
|
-
? 'cmd'
|
|
3303
|
-
: 'xdg-open';
|
|
3304
|
-
const cmdArgs = process.platform === 'win32' ? ['/c', 'start', '', data.indexPath] : [data.indexPath];
|
|
3305
|
-
execFile(cmd, cmdArgs, () => { });
|
|
3389
|
+
openInBrowser(data.indexPath);
|
|
3306
3390
|
console.log(`[Sweetlink] Opened ${data.indexPath}`);
|
|
3307
3391
|
}
|
|
3308
3392
|
result = { indexPath: data.indexPath };
|