@ytspar/sweetlink 1.21.0 → 1.22.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/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/cli/sweetlink.js +136 -64
- package/dist/cli/sweetlink.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.js +5 -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 +7 -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/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 +1 -1
- package/dist/server/index.d.ts.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 +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.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
|
@@ -298,7 +298,7 @@ export class ConsoleCapture {
|
|
|
298
298
|
if (event instanceof ErrorEvent)
|
|
299
299
|
return;
|
|
300
300
|
const target = event.target;
|
|
301
|
-
if (!target
|
|
301
|
+
if (!target?.tagName)
|
|
302
302
|
return;
|
|
303
303
|
// Skip devbar's own resources to avoid feedback loops
|
|
304
304
|
const url = target.src || target.href || '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consoleCapture.js","sourceRoot":"","sources":["../../src/browser/consoleCapture.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"consoleCapture.js","sourceRoot":"","sources":["../../src/browser/consoleCapture.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ export declare const EARLY_CONSOLE_CAPTURE_SCRIPT = "\n(function() {\n if (wind
|
|
|
21
21
|
declare global {
|
|
22
22
|
interface Window {
|
|
23
23
|
__sweetlinkEarlyLogs?: Array<{
|
|
24
|
-
level:
|
|
24
|
+
level: 'log' | 'error' | 'warn' | 'info' | 'debug' | 'trace';
|
|
25
25
|
message: string;
|
|
26
26
|
timestamp: string;
|
|
27
27
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"earlyConsoleCapture.d.ts","sourceRoot":"","sources":["../../src/browser/earlyConsoleCapture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,4BAA4B,21DAsDxC,CAAC;AAEF;;;GAGG;AACH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,oBAAoB,CAAC,EAAE,KAAK,CAAC;YAC3B,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"earlyConsoleCapture.d.ts","sourceRoot":"","sources":["../../src/browser/earlyConsoleCapture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,4BAA4B,21DAsDxC,CAAC;AAEF;;;GAGG;AACH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,oBAAoB,CAAC,EAAE,KAAK,CAAC;YAC3B,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;YAC7D,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC,CAAC;KACJ;CACF"}
|
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
|
*/
|
|
@@ -1518,26 +1588,33 @@ async function getVitals(options) {
|
|
|
1518
1588
|
console.log(`\n[Sweetlink] Web Vitals`);
|
|
1519
1589
|
console.log(` URL: ${vitalsData.url}`);
|
|
1520
1590
|
console.log(` ${summary}`);
|
|
1521
|
-
// Detailed breakdown
|
|
1591
|
+
// Detailed breakdown — pick a green/yellow/red color per Web Vitals threshold
|
|
1592
|
+
const ANSI_GREEN = '\x1b[32m';
|
|
1593
|
+
const ANSI_YELLOW = '\x1b[33m';
|
|
1594
|
+
const ANSI_RED = '\x1b[31m';
|
|
1595
|
+
const ANSI_RESET = '\x1b[0m';
|
|
1596
|
+
const thresholdColor = (value, good, ok) => {
|
|
1597
|
+
if (value <= good)
|
|
1598
|
+
return ANSI_GREEN;
|
|
1599
|
+
if (value <= ok)
|
|
1600
|
+
return ANSI_YELLOW;
|
|
1601
|
+
return ANSI_RED;
|
|
1602
|
+
};
|
|
1522
1603
|
if (vitalsData.fcp !== null) {
|
|
1523
1604
|
const fcp = vitalsData.fcp;
|
|
1524
|
-
|
|
1525
|
-
console.log(` FCP: ${color}${fcp}ms\x1b[0m`);
|
|
1605
|
+
console.log(` FCP: ${thresholdColor(fcp, 1800, 3000)}${fcp}ms${ANSI_RESET}`);
|
|
1526
1606
|
}
|
|
1527
1607
|
if (vitalsData.lcp !== null) {
|
|
1528
1608
|
const lcp = vitalsData.lcp;
|
|
1529
|
-
|
|
1530
|
-
console.log(` LCP: ${color}${lcp}ms\x1b[0m`);
|
|
1609
|
+
console.log(` LCP: ${thresholdColor(lcp, 2500, 4000)}${lcp}ms${ANSI_RESET}`);
|
|
1531
1610
|
}
|
|
1532
1611
|
if (vitalsData.cls !== null) {
|
|
1533
1612
|
const cls = vitalsData.cls;
|
|
1534
|
-
|
|
1535
|
-
console.log(` CLS: ${color}${cls}\x1b[0m`);
|
|
1613
|
+
console.log(` CLS: ${thresholdColor(cls, 0.1, 0.25)}${cls}${ANSI_RESET}`);
|
|
1536
1614
|
}
|
|
1537
1615
|
if (vitalsData.inp !== null) {
|
|
1538
1616
|
const inp = vitalsData.inp;
|
|
1539
|
-
|
|
1540
|
-
console.log(` INP: ${color}${inp}ms\x1b[0m`);
|
|
1617
|
+
console.log(` INP: ${thresholdColor(inp, 200, 500)}${inp}ms${ANSI_RESET}`);
|
|
1541
1618
|
}
|
|
1542
1619
|
if (vitalsData.pageSize !== null) {
|
|
1543
1620
|
const sizeKB = Math.round(vitalsData.pageSize / 1024);
|
|
@@ -2171,6 +2248,30 @@ async function runBatchFromStdin() {
|
|
|
2171
2248
|
if (!allOk)
|
|
2172
2249
|
process.exit(1);
|
|
2173
2250
|
}
|
|
2251
|
+
/**
|
|
2252
|
+
* Resolve the on-disk path for a capture artifact (term .cast, sim .mp4).
|
|
2253
|
+
* Honours --app/--run for the app-scoped hierarchy (delegates to runSlot)
|
|
2254
|
+
* and the historical flat layout when --app is absent. Used by both the
|
|
2255
|
+
* batch JSON-stdin path and the direct CLI handlers so they cannot drift.
|
|
2256
|
+
*/
|
|
2257
|
+
async function resolveCapturePath(opts) {
|
|
2258
|
+
if (opts.output)
|
|
2259
|
+
return assertOutputInRoot(opts.output);
|
|
2260
|
+
const labelSlug = (opts.label ?? 'batch')
|
|
2261
|
+
.replace(/[^a-z0-9]/gi, '-')
|
|
2262
|
+
.toLowerCase()
|
|
2263
|
+
.slice(0, 40);
|
|
2264
|
+
const stamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
2265
|
+
const filename = `${labelSlug}-${stamp}.${opts.ext}`;
|
|
2266
|
+
const { runSlot } = await import('../runs.js');
|
|
2267
|
+
const dir = runSlot({
|
|
2268
|
+
baseDir: findProjectRoot(),
|
|
2269
|
+
app: opts.app,
|
|
2270
|
+
run: opts.run,
|
|
2271
|
+
kind: opts.kind,
|
|
2272
|
+
});
|
|
2273
|
+
return assertOutputInRoot(path.join(dir, filename));
|
|
2274
|
+
}
|
|
2174
2275
|
async function runOneBatchCapture(cap) {
|
|
2175
2276
|
const mode = cap.mode;
|
|
2176
2277
|
if (!mode)
|
|
@@ -2180,13 +2281,14 @@ async function runOneBatchCapture(cap) {
|
|
|
2180
2281
|
if (!command)
|
|
2181
2282
|
throw new Error('term capture missing "command".');
|
|
2182
2283
|
const label = cap.label ?? 'batch';
|
|
2183
|
-
const
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
.
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2284
|
+
const output = await resolveCapturePath({
|
|
2285
|
+
kind: 'term',
|
|
2286
|
+
label,
|
|
2287
|
+
output: cap.output,
|
|
2288
|
+
app: cap.app,
|
|
2289
|
+
run: cap.run,
|
|
2290
|
+
ext: 'cast',
|
|
2291
|
+
});
|
|
2190
2292
|
ensureDir(output);
|
|
2191
2293
|
const { captureTerminal } = await import('../term/recorder.js');
|
|
2192
2294
|
const { generatePlayer } = await import('../term/player.js');
|
|
@@ -2197,6 +2299,7 @@ async function runOneBatchCapture(cap) {
|
|
|
2197
2299
|
shell: cap.shell,
|
|
2198
2300
|
cols: typeof cap.cols === 'number' ? cap.cols : undefined,
|
|
2199
2301
|
rows: typeof cap.rows === 'number' ? cap.rows : undefined,
|
|
2302
|
+
inheritEnv: cap.inheritEnv === true,
|
|
2200
2303
|
});
|
|
2201
2304
|
const playerPath = await generatePlayer({ castPath: output });
|
|
2202
2305
|
return {
|
|
@@ -2212,13 +2315,14 @@ async function runOneBatchCapture(cap) {
|
|
|
2212
2315
|
if (!command)
|
|
2213
2316
|
throw new Error(`${mode} capture missing "command".`);
|
|
2214
2317
|
const label = cap.label ?? 'batch';
|
|
2215
|
-
const
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
.
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2318
|
+
const output = await resolveCapturePath({
|
|
2319
|
+
kind: 'sim',
|
|
2320
|
+
label,
|
|
2321
|
+
output: cap.output,
|
|
2322
|
+
app: cap.app,
|
|
2323
|
+
run: cap.run,
|
|
2324
|
+
ext: 'mp4',
|
|
2325
|
+
});
|
|
2222
2326
|
ensureDir(output);
|
|
2223
2327
|
const device = cap.device;
|
|
2224
2328
|
if (mode === 'sim-ios') {
|
|
@@ -2246,7 +2350,7 @@ async function runOneBatchCapture(cap) {
|
|
|
2246
2350
|
});
|
|
2247
2351
|
const data = resp.data;
|
|
2248
2352
|
if (cap.output) {
|
|
2249
|
-
const outputPath = cap.output;
|
|
2353
|
+
const outputPath = assertOutputInRoot(cap.output);
|
|
2250
2354
|
ensureDir(outputPath);
|
|
2251
2355
|
fs.writeFileSync(outputPath, Buffer.from(data.screenshot, 'base64'));
|
|
2252
2356
|
return { path: outputPath, width: data.width, height: data.height };
|
|
@@ -2721,17 +2825,11 @@ async function handleStatusCommand() {
|
|
|
2721
2825
|
process.exit(1);
|
|
2722
2826
|
}
|
|
2723
2827
|
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) {
|
|
2828
|
+
const latestSession = findLatestSessionDir(sessionDirArg);
|
|
2829
|
+
if (!latestSession) {
|
|
2731
2830
|
console.error('[Sweetlink] No session found. Run `record start` and `record stop` first.');
|
|
2732
2831
|
process.exit(1);
|
|
2733
2832
|
}
|
|
2734
|
-
const latestSession = path.join(sessionDirArg, sessionFiles[0]);
|
|
2735
2833
|
const manifestPath = path.join(latestSession, 'sweetlink-session.json');
|
|
2736
2834
|
if (!fs.existsSync(manifestPath)) {
|
|
2737
2835
|
console.error(`[Sweetlink] No manifest found at ${manifestPath}`);
|
|
@@ -2782,20 +2880,7 @@ async function handleStatusCommand() {
|
|
|
2782
2880
|
// Auto-open the viewer (cross-platform; --no-open to suppress)
|
|
2783
2881
|
if (data.viewerPath && !hasFlag('--no-open')) {
|
|
2784
2882
|
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
|
-
});
|
|
2883
|
+
openInBrowser(data.viewerPath);
|
|
2799
2884
|
console.log(` Opened in browser.`);
|
|
2800
2885
|
}
|
|
2801
2886
|
else if (data.viewerPath) {
|
|
@@ -2915,21 +3000,15 @@ async function handleStatusCommand() {
|
|
|
2915
3000
|
}
|
|
2916
3001
|
case 'report': {
|
|
2917
3002
|
const sessionDirArg = getArg('--session') ?? '.sweetlink';
|
|
2918
|
-
// Find latest session directory
|
|
2919
3003
|
if (!fs.existsSync(sessionDirArg)) {
|
|
2920
3004
|
console.error(`[Sweetlink] Session directory not found: ${sessionDirArg}`);
|
|
2921
3005
|
process.exit(1);
|
|
2922
3006
|
}
|
|
2923
|
-
const
|
|
2924
|
-
|
|
2925
|
-
.filter((f) => f.startsWith('session-'))
|
|
2926
|
-
.sort()
|
|
2927
|
-
.reverse();
|
|
2928
|
-
if (reportSessions.length === 0) {
|
|
3007
|
+
const reportSessionDir = findLatestSessionDir(sessionDirArg);
|
|
3008
|
+
if (!reportSessionDir) {
|
|
2929
3009
|
console.error('[Sweetlink] No session found. Run `record start` and `record stop` first.');
|
|
2930
3010
|
process.exit(1);
|
|
2931
3011
|
}
|
|
2932
|
-
const reportSessionDir = path.join(sessionDirArg, reportSessions[0]);
|
|
2933
3012
|
if (hasFlag('--clipboard')) {
|
|
2934
3013
|
// Copy SUMMARY.md to clipboard
|
|
2935
3014
|
const summaryPath = path.join(reportSessionDir, 'SUMMARY.md');
|
|
@@ -2949,7 +3028,7 @@ async function handleStatusCommand() {
|
|
|
2949
3028
|
console.error(`[Sweetlink] Failed to copy to clipboard (${clipCmd}):`, err instanceof Error ? err.message : err);
|
|
2950
3029
|
process.exit(1);
|
|
2951
3030
|
}
|
|
2952
|
-
result = { mode: 'clipboard', session:
|
|
3031
|
+
result = { mode: 'clipboard', session: path.basename(reportSessionDir) };
|
|
2953
3032
|
}
|
|
2954
3033
|
else if (hasFlag('--serve')) {
|
|
2955
3034
|
// Serve viewer.html on a random port
|
|
@@ -3033,7 +3112,7 @@ async function handleStatusCommand() {
|
|
|
3033
3112
|
}
|
|
3034
3113
|
const summaryContent = fs.readFileSync(summaryPath, 'utf-8');
|
|
3035
3114
|
process.stdout.write(summaryContent);
|
|
3036
|
-
result = { mode: 'stdout', session:
|
|
3115
|
+
result = { mode: 'stdout', session: path.basename(reportSessionDir) };
|
|
3037
3116
|
}
|
|
3038
3117
|
break;
|
|
3039
3118
|
}
|
|
@@ -3295,14 +3374,7 @@ async function handleStatusCommand() {
|
|
|
3295
3374
|
else if (sub === 'open') {
|
|
3296
3375
|
// Open the index.html in the browser
|
|
3297
3376
|
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, () => { });
|
|
3377
|
+
openInBrowser(data.indexPath);
|
|
3306
3378
|
console.log(`[Sweetlink] Opened ${data.indexPath}`);
|
|
3307
3379
|
}
|
|
3308
3380
|
result = { indexPath: data.indexPath };
|