@ytspar/sweetlink 1.20.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 +154 -68
- 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/evidence.js +1 -1
- package/dist/daemon/evidence.js.map +1 -1
- package/dist/daemon/listeners.js +1 -1
- package/dist/daemon/listeners.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 +5 -23
- package/dist/daemon/recording.js.map +1 -1
- package/dist/daemon/refs.js +1 -1
- package/dist/daemon/refs.js.map +1 -1
- package/dist/daemon/ringBuffer.d.ts +8 -0
- package/dist/daemon/ringBuffer.d.ts.map +1 -1
- package/dist/daemon/ringBuffer.js +17 -0
- package/dist/daemon/ringBuffer.js.map +1 -1
- package/dist/daemon/server.d.ts.map +1 -1
- package/dist/daemon/server.js +84 -23
- 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/stateFile.js +2 -2
- package/dist/daemon/stateFile.js.map +1 -1
- package/dist/daemon/summary.js +2 -2
- package/dist/daemon/summary.js.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 +5 -11
- 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 +13 -2
- package/dist/daemon/visualDiff.js.map +1 -1
- package/dist/next.js +3 -3
- package/dist/next.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 +19 -0
- package/dist/simulator/android.d.ts.map +1 -1
- package/dist/simulator/android.js +141 -2
- package/dist/simulator/android.js.map +1 -1
- package/dist/simulator/androidTaps.d.ts +109 -0
- package/dist/simulator/androidTaps.d.ts.map +1 -0
- package/dist/simulator/androidTaps.js +208 -0
- package/dist/simulator/androidTaps.js.map +1 -0
- 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/simulator/overlay.d.ts +41 -0
- package/dist/simulator/overlay.d.ts.map +1 -0
- package/dist/simulator/overlay.js +78 -0
- package/dist/simulator/overlay.js.map +1 -0
- 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 +37 -15
- 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 +36 -2
- 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);
|
|
@@ -1935,15 +2012,21 @@ const COMMAND_HELP = {
|
|
|
1935
2012
|
--label <text> Embedded in filename
|
|
1936
2013
|
--device <name|udid> Pick a specific simulator/emulator (default: first booted)
|
|
1937
2014
|
--time-limit <sec> Android only — caps screen recording (max 180)
|
|
2015
|
+
--app <name> Group artifacts under .sweetlink/<app>/<YYYYMMDD>/<run>/sim/
|
|
2016
|
+
--run <id> Override the auto-generated run id
|
|
2017
|
+
--no-overlays Android only — skip tap-event capture and ffmpeg overlay
|
|
1938
2018
|
--ignore-exit Don't propagate the recorded command's exit code
|
|
1939
2019
|
|
|
1940
2020
|
Requirements:
|
|
1941
2021
|
iOS: Xcode + a booted Simulator (Simulator.app)
|
|
1942
2022
|
Android: Android Platform Tools (\`adb\`) + a running emulator
|
|
2023
|
+
Tap-indicator overlays additionally need \`ffmpeg\` on PATH;
|
|
2024
|
+
without it, taps are still captured to a sidecar .taps.json.
|
|
1943
2025
|
|
|
1944
2026
|
Examples:
|
|
1945
2027
|
pnpm sweetlink sim ios "fastlane scan" --device "iPhone 15"
|
|
1946
|
-
pnpm sweetlink sim android "./gradlew connectedAndroidTest"
|
|
2028
|
+
pnpm sweetlink sim android "./gradlew connectedAndroidTest"
|
|
2029
|
+
pnpm sweetlink sim android "appium run" --no-overlays`,
|
|
1947
2030
|
term: ` term <command...>
|
|
1948
2031
|
Record a shell command's stdout/stderr into asciicast v2 + a self-contained
|
|
1949
2032
|
HTML player. Captures real timing; the player has play/pause, 0.1×–4×
|
|
@@ -2111,7 +2194,7 @@ if (!commandType || commandType === '--help' || commandType === '-h') {
|
|
|
2111
2194
|
}
|
|
2112
2195
|
catch (err) {
|
|
2113
2196
|
const msg = err instanceof Error ? err.message : String(err);
|
|
2114
|
-
process.stdout.write(JSON.stringify({ ok: false, error: msg })
|
|
2197
|
+
process.stdout.write(`${JSON.stringify({ ok: false, error: msg })}\n`);
|
|
2115
2198
|
process.exit(1);
|
|
2116
2199
|
}
|
|
2117
2200
|
}
|
|
@@ -2157,14 +2240,38 @@ async function runBatchFromStdin() {
|
|
|
2157
2240
|
}
|
|
2158
2241
|
}
|
|
2159
2242
|
const allOk = results.every((r) => r.ok);
|
|
2160
|
-
process.stdout.write(JSON.stringify({
|
|
2243
|
+
process.stdout.write(`${JSON.stringify({
|
|
2161
2244
|
ok: allOk,
|
|
2162
2245
|
duration: Date.now() - startTime,
|
|
2163
2246
|
captures: results,
|
|
2164
|
-
})
|
|
2247
|
+
})}\n`);
|
|
2165
2248
|
if (!allOk)
|
|
2166
2249
|
process.exit(1);
|
|
2167
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
|
+
}
|
|
2168
2275
|
async function runOneBatchCapture(cap) {
|
|
2169
2276
|
const mode = cap.mode;
|
|
2170
2277
|
if (!mode)
|
|
@@ -2174,13 +2281,14 @@ async function runOneBatchCapture(cap) {
|
|
|
2174
2281
|
if (!command)
|
|
2175
2282
|
throw new Error('term capture missing "command".');
|
|
2176
2283
|
const label = cap.label ?? 'batch';
|
|
2177
|
-
const
|
|
2178
|
-
|
|
2179
|
-
|
|
2180
|
-
.
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
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
|
+
});
|
|
2184
2292
|
ensureDir(output);
|
|
2185
2293
|
const { captureTerminal } = await import('../term/recorder.js');
|
|
2186
2294
|
const { generatePlayer } = await import('../term/player.js');
|
|
@@ -2191,6 +2299,7 @@ async function runOneBatchCapture(cap) {
|
|
|
2191
2299
|
shell: cap.shell,
|
|
2192
2300
|
cols: typeof cap.cols === 'number' ? cap.cols : undefined,
|
|
2193
2301
|
rows: typeof cap.rows === 'number' ? cap.rows : undefined,
|
|
2302
|
+
inheritEnv: cap.inheritEnv === true,
|
|
2194
2303
|
});
|
|
2195
2304
|
const playerPath = await generatePlayer({ castPath: output });
|
|
2196
2305
|
return {
|
|
@@ -2206,13 +2315,14 @@ async function runOneBatchCapture(cap) {
|
|
|
2206
2315
|
if (!command)
|
|
2207
2316
|
throw new Error(`${mode} capture missing "command".`);
|
|
2208
2317
|
const label = cap.label ?? 'batch';
|
|
2209
|
-
const
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
.
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
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
|
+
});
|
|
2216
2326
|
ensureDir(output);
|
|
2217
2327
|
const device = cap.device;
|
|
2218
2328
|
if (mode === 'sim-ios') {
|
|
@@ -2240,7 +2350,7 @@ async function runOneBatchCapture(cap) {
|
|
|
2240
2350
|
});
|
|
2241
2351
|
const data = resp.data;
|
|
2242
2352
|
if (cap.output) {
|
|
2243
|
-
const outputPath = cap.output;
|
|
2353
|
+
const outputPath = assertOutputInRoot(cap.output);
|
|
2244
2354
|
ensureDir(outputPath);
|
|
2245
2355
|
fs.writeFileSync(outputPath, Buffer.from(data.screenshot, 'base64'));
|
|
2246
2356
|
return { path: outputPath, width: data.width, height: data.height };
|
|
@@ -2715,17 +2825,11 @@ async function handleStatusCommand() {
|
|
|
2715
2825
|
process.exit(1);
|
|
2716
2826
|
}
|
|
2717
2827
|
const sessionDirArg = getArg('--session') ?? '.sweetlink';
|
|
2718
|
-
|
|
2719
|
-
|
|
2720
|
-
.readdirSync(sessionDirArg)
|
|
2721
|
-
.filter((f) => f.startsWith('session-'))
|
|
2722
|
-
.sort()
|
|
2723
|
-
.reverse();
|
|
2724
|
-
if (sessionFiles.length === 0) {
|
|
2828
|
+
const latestSession = findLatestSessionDir(sessionDirArg);
|
|
2829
|
+
if (!latestSession) {
|
|
2725
2830
|
console.error('[Sweetlink] No session found. Run `record start` and `record stop` first.');
|
|
2726
2831
|
process.exit(1);
|
|
2727
2832
|
}
|
|
2728
|
-
const latestSession = path.join(sessionDirArg, sessionFiles[0]);
|
|
2729
2833
|
const manifestPath = path.join(latestSession, 'sweetlink-session.json');
|
|
2730
2834
|
if (!fs.existsSync(manifestPath)) {
|
|
2731
2835
|
console.error(`[Sweetlink] No manifest found at ${manifestPath}`);
|
|
@@ -2776,20 +2880,7 @@ async function handleStatusCommand() {
|
|
|
2776
2880
|
// Auto-open the viewer (cross-platform; --no-open to suppress)
|
|
2777
2881
|
if (data.viewerPath && !hasFlag('--no-open')) {
|
|
2778
2882
|
console.log(` Viewer: ${data.viewerPath}`);
|
|
2779
|
-
|
|
2780
|
-
// `start` on Windows is a cmd builtin, not an exe — must invoke via cmd.
|
|
2781
|
-
const cmd = process.platform === 'darwin'
|
|
2782
|
-
? 'open'
|
|
2783
|
-
: process.platform === 'win32'
|
|
2784
|
-
? 'cmd'
|
|
2785
|
-
: 'xdg-open';
|
|
2786
|
-
const args = process.platform === 'win32'
|
|
2787
|
-
? ['/c', 'start', '', data.viewerPath]
|
|
2788
|
-
: [data.viewerPath];
|
|
2789
|
-
execFile(cmd, args, (err) => {
|
|
2790
|
-
if (err)
|
|
2791
|
-
console.error(' Could not open viewer:', err.message);
|
|
2792
|
-
});
|
|
2883
|
+
openInBrowser(data.viewerPath);
|
|
2793
2884
|
console.log(` Opened in browser.`);
|
|
2794
2885
|
}
|
|
2795
2886
|
else if (data.viewerPath) {
|
|
@@ -2909,21 +3000,15 @@ async function handleStatusCommand() {
|
|
|
2909
3000
|
}
|
|
2910
3001
|
case 'report': {
|
|
2911
3002
|
const sessionDirArg = getArg('--session') ?? '.sweetlink';
|
|
2912
|
-
// Find latest session directory
|
|
2913
3003
|
if (!fs.existsSync(sessionDirArg)) {
|
|
2914
3004
|
console.error(`[Sweetlink] Session directory not found: ${sessionDirArg}`);
|
|
2915
3005
|
process.exit(1);
|
|
2916
3006
|
}
|
|
2917
|
-
const
|
|
2918
|
-
|
|
2919
|
-
.filter((f) => f.startsWith('session-'))
|
|
2920
|
-
.sort()
|
|
2921
|
-
.reverse();
|
|
2922
|
-
if (reportSessions.length === 0) {
|
|
3007
|
+
const reportSessionDir = findLatestSessionDir(sessionDirArg);
|
|
3008
|
+
if (!reportSessionDir) {
|
|
2923
3009
|
console.error('[Sweetlink] No session found. Run `record start` and `record stop` first.');
|
|
2924
3010
|
process.exit(1);
|
|
2925
3011
|
}
|
|
2926
|
-
const reportSessionDir = path.join(sessionDirArg, reportSessions[0]);
|
|
2927
3012
|
if (hasFlag('--clipboard')) {
|
|
2928
3013
|
// Copy SUMMARY.md to clipboard
|
|
2929
3014
|
const summaryPath = path.join(reportSessionDir, 'SUMMARY.md');
|
|
@@ -2943,7 +3028,7 @@ async function handleStatusCommand() {
|
|
|
2943
3028
|
console.error(`[Sweetlink] Failed to copy to clipboard (${clipCmd}):`, err instanceof Error ? err.message : err);
|
|
2944
3029
|
process.exit(1);
|
|
2945
3030
|
}
|
|
2946
|
-
result = { mode: 'clipboard', session:
|
|
3031
|
+
result = { mode: 'clipboard', session: path.basename(reportSessionDir) };
|
|
2947
3032
|
}
|
|
2948
3033
|
else if (hasFlag('--serve')) {
|
|
2949
3034
|
// Serve viewer.html on a random port
|
|
@@ -3027,7 +3112,7 @@ async function handleStatusCommand() {
|
|
|
3027
3112
|
}
|
|
3028
3113
|
const summaryContent = fs.readFileSync(summaryPath, 'utf-8');
|
|
3029
3114
|
process.stdout.write(summaryContent);
|
|
3030
|
-
result = { mode: 'stdout', session:
|
|
3115
|
+
result = { mode: 'stdout', session: path.basename(reportSessionDir) };
|
|
3031
3116
|
}
|
|
3032
3117
|
break;
|
|
3033
3118
|
}
|
|
@@ -3094,6 +3179,7 @@ async function handleStatusCommand() {
|
|
|
3094
3179
|
output,
|
|
3095
3180
|
device,
|
|
3096
3181
|
timeLimit: tl ? parseInt(tl, 10) : undefined,
|
|
3182
|
+
overlays: !hasFlag('--no-overlays'),
|
|
3097
3183
|
});
|
|
3098
3184
|
}
|
|
3099
3185
|
let sizeKb = '?';
|
|
@@ -3103,8 +3189,12 @@ async function handleStatusCommand() {
|
|
|
3103
3189
|
catch {
|
|
3104
3190
|
/* file may not exist if recordingClosed is false */
|
|
3105
3191
|
}
|
|
3192
|
+
const tapSuffix = (recResult.tapCount ?? 0) > 0
|
|
3193
|
+
? ` · ${recResult.tapCount} taps${recResult.overlaysApplied ? ' (overlaid)' : ' (sidecar only — install ffmpeg for overlays)'}`
|
|
3194
|
+
: '';
|
|
3106
3195
|
console.log(`[Sweetlink] ${recResult.recordingClosed ? '✓' : '⚠'} ${getRelativePath(output)} · ` +
|
|
3107
3196
|
`${recResult.durationSec.toFixed(1)}s · ${sizeKb}KB · ${recResult.device} · exit=${recResult.exitCode}` +
|
|
3197
|
+
tapSuffix +
|
|
3108
3198
|
(recResult.recordingClosed
|
|
3109
3199
|
? ''
|
|
3110
3200
|
: ' (recording was force-killed; mp4 may be incomplete)'));
|
|
@@ -3114,6 +3204,9 @@ async function handleStatusCommand() {
|
|
|
3114
3204
|
durationSec: recResult.durationSec,
|
|
3115
3205
|
exitCode: recResult.exitCode,
|
|
3116
3206
|
recordingClosed: recResult.recordingClosed,
|
|
3207
|
+
tapCount: recResult.tapCount,
|
|
3208
|
+
tapsJsonPath: recResult.tapsJsonPath,
|
|
3209
|
+
overlaysApplied: recResult.overlaysApplied,
|
|
3117
3210
|
};
|
|
3118
3211
|
if (recResult.exitCode !== 0 && !hasFlag('--ignore-exit')) {
|
|
3119
3212
|
process.exit(recResult.exitCode);
|
|
@@ -3281,14 +3374,7 @@ async function handleStatusCommand() {
|
|
|
3281
3374
|
else if (sub === 'open') {
|
|
3282
3375
|
// Open the index.html in the browser
|
|
3283
3376
|
if (data.indexPath) {
|
|
3284
|
-
|
|
3285
|
-
const cmd = process.platform === 'darwin'
|
|
3286
|
-
? 'open'
|
|
3287
|
-
: process.platform === 'win32'
|
|
3288
|
-
? 'cmd'
|
|
3289
|
-
: 'xdg-open';
|
|
3290
|
-
const cmdArgs = process.platform === 'win32' ? ['/c', 'start', '', data.indexPath] : [data.indexPath];
|
|
3291
|
-
execFile(cmd, cmdArgs, () => { });
|
|
3377
|
+
openInBrowser(data.indexPath);
|
|
3292
3378
|
console.log(`[Sweetlink] Opened ${data.indexPath}`);
|
|
3293
3379
|
}
|
|
3294
3380
|
result = { indexPath: data.indexPath };
|