@ytspar/sweetlink 1.20.0 → 1.21.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.
Files changed (44) hide show
  1. package/dist/cli/sweetlink.js +18 -4
  2. package/dist/cli/sweetlink.js.map +1 -1
  3. package/dist/daemon/evidence.js +1 -1
  4. package/dist/daemon/evidence.js.map +1 -1
  5. package/dist/daemon/listeners.js +1 -1
  6. package/dist/daemon/listeners.js.map +1 -1
  7. package/dist/daemon/recording.js +4 -4
  8. package/dist/daemon/recording.js.map +1 -1
  9. package/dist/daemon/refs.js +1 -1
  10. package/dist/daemon/refs.js.map +1 -1
  11. package/dist/daemon/ringBuffer.d.ts +8 -0
  12. package/dist/daemon/ringBuffer.d.ts.map +1 -1
  13. package/dist/daemon/ringBuffer.js +17 -0
  14. package/dist/daemon/ringBuffer.js.map +1 -1
  15. package/dist/daemon/server.d.ts.map +1 -1
  16. package/dist/daemon/server.js +79 -14
  17. package/dist/daemon/server.js.map +1 -1
  18. package/dist/daemon/stateFile.js +2 -2
  19. package/dist/daemon/stateFile.js.map +1 -1
  20. package/dist/daemon/summary.js +2 -2
  21. package/dist/daemon/summary.js.map +1 -1
  22. package/dist/daemon/viewer.js +3 -3
  23. package/dist/daemon/viewer.js.map +1 -1
  24. package/dist/daemon/visualDiff.js +1 -1
  25. package/dist/daemon/visualDiff.js.map +1 -1
  26. package/dist/next.js +3 -3
  27. package/dist/next.js.map +1 -1
  28. package/dist/simulator/android.d.ts +13 -0
  29. package/dist/simulator/android.d.ts.map +1 -1
  30. package/dist/simulator/android.js +62 -0
  31. package/dist/simulator/android.js.map +1 -1
  32. package/dist/simulator/androidTaps.d.ts +99 -0
  33. package/dist/simulator/androidTaps.d.ts.map +1 -0
  34. package/dist/simulator/androidTaps.js +162 -0
  35. package/dist/simulator/androidTaps.js.map +1 -0
  36. package/dist/simulator/overlay.d.ts +41 -0
  37. package/dist/simulator/overlay.d.ts.map +1 -0
  38. package/dist/simulator/overlay.js +78 -0
  39. package/dist/simulator/overlay.js.map +1 -0
  40. package/dist/term/player.js +1 -1
  41. package/dist/term/player.js.map +1 -1
  42. package/dist/term/recorder.js +1 -1
  43. package/dist/term/recorder.js.map +1 -1
  44. package/package.json +1 -1
@@ -1935,15 +1935,21 @@ const COMMAND_HELP = {
1935
1935
  --label <text> Embedded in filename
1936
1936
  --device <name|udid> Pick a specific simulator/emulator (default: first booted)
1937
1937
  --time-limit <sec> Android only — caps screen recording (max 180)
1938
+ --app <name> Group artifacts under .sweetlink/<app>/<YYYYMMDD>/<run>/sim/
1939
+ --run <id> Override the auto-generated run id
1940
+ --no-overlays Android only — skip tap-event capture and ffmpeg overlay
1938
1941
  --ignore-exit Don't propagate the recorded command's exit code
1939
1942
 
1940
1943
  Requirements:
1941
1944
  iOS: Xcode + a booted Simulator (Simulator.app)
1942
1945
  Android: Android Platform Tools (\`adb\`) + a running emulator
1946
+ Tap-indicator overlays additionally need \`ffmpeg\` on PATH;
1947
+ without it, taps are still captured to a sidecar .taps.json.
1943
1948
 
1944
1949
  Examples:
1945
1950
  pnpm sweetlink sim ios "fastlane scan" --device "iPhone 15"
1946
- pnpm sweetlink sim android "./gradlew connectedAndroidTest"`,
1951
+ pnpm sweetlink sim android "./gradlew connectedAndroidTest"
1952
+ pnpm sweetlink sim android "appium run" --no-overlays`,
1947
1953
  term: ` term <command...>
1948
1954
  Record a shell command's stdout/stderr into asciicast v2 + a self-contained
1949
1955
  HTML player. Captures real timing; the player has play/pause, 0.1×–4×
@@ -2111,7 +2117,7 @@ if (!commandType || commandType === '--help' || commandType === '-h') {
2111
2117
  }
2112
2118
  catch (err) {
2113
2119
  const msg = err instanceof Error ? err.message : String(err);
2114
- process.stdout.write(JSON.stringify({ ok: false, error: msg }) + '\n');
2120
+ process.stdout.write(`${JSON.stringify({ ok: false, error: msg })}\n`);
2115
2121
  process.exit(1);
2116
2122
  }
2117
2123
  }
@@ -2157,11 +2163,11 @@ async function runBatchFromStdin() {
2157
2163
  }
2158
2164
  }
2159
2165
  const allOk = results.every((r) => r.ok);
2160
- process.stdout.write(JSON.stringify({
2166
+ process.stdout.write(`${JSON.stringify({
2161
2167
  ok: allOk,
2162
2168
  duration: Date.now() - startTime,
2163
2169
  captures: results,
2164
- }) + '\n');
2170
+ })}\n`);
2165
2171
  if (!allOk)
2166
2172
  process.exit(1);
2167
2173
  }
@@ -3094,6 +3100,7 @@ async function handleStatusCommand() {
3094
3100
  output,
3095
3101
  device,
3096
3102
  timeLimit: tl ? parseInt(tl, 10) : undefined,
3103
+ overlays: !hasFlag('--no-overlays'),
3097
3104
  });
3098
3105
  }
3099
3106
  let sizeKb = '?';
@@ -3103,8 +3110,12 @@ async function handleStatusCommand() {
3103
3110
  catch {
3104
3111
  /* file may not exist if recordingClosed is false */
3105
3112
  }
3113
+ const tapSuffix = (recResult.tapCount ?? 0) > 0
3114
+ ? ` · ${recResult.tapCount} taps${recResult.overlaysApplied ? ' (overlaid)' : ' (sidecar only — install ffmpeg for overlays)'}`
3115
+ : '';
3106
3116
  console.log(`[Sweetlink] ${recResult.recordingClosed ? '✓' : '⚠'} ${getRelativePath(output)} · ` +
3107
3117
  `${recResult.durationSec.toFixed(1)}s · ${sizeKb}KB · ${recResult.device} · exit=${recResult.exitCode}` +
3118
+ tapSuffix +
3108
3119
  (recResult.recordingClosed
3109
3120
  ? ''
3110
3121
  : ' (recording was force-killed; mp4 may be incomplete)'));
@@ -3114,6 +3125,9 @@ async function handleStatusCommand() {
3114
3125
  durationSec: recResult.durationSec,
3115
3126
  exitCode: recResult.exitCode,
3116
3127
  recordingClosed: recResult.recordingClosed,
3128
+ tapCount: recResult.tapCount,
3129
+ tapsJsonPath: recResult.tapsJsonPath,
3130
+ overlaysApplied: recResult.overlaysApplied,
3117
3131
  };
3118
3132
  if (recResult.exitCode !== 0 && !hasFlag('--ignore-exit')) {
3119
3133
  process.exit(recResult.exitCode);