@juangadm/pre-post 0.1.1 → 0.3.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 CHANGED
@@ -10,7 +10,7 @@ Visual diff tool that captures pre/post screenshots for PRs. Use it as a Claude
10
10
  |------|-----------------|----------|
11
11
  | Browser engine | `agent-browser` (Vercel-proprietary) | **Playwright** (direct dependency) |
12
12
  | Screenshot quality | 1x | **2x retina** (`deviceScaleFactor: 2`) |
13
- | Route detection | Manual | **Automatic** from `git diff` (Next.js App/Pages Router, Remix, SvelteKit) |
13
+ | Route detection | Manual | **Automatic** from `git diff` (Next.js App/Pages Router, generic fallback) |
14
14
  | Responsive capture | Single viewport | **Desktop + mobile** per route (`--responsive`) |
15
15
  | CLI subcommands | URL pairs only | `detect`, `compare`, `run` subcommands |
16
16
  | Skill orchestration | Basic capture | Full workflow: route detection, Claude refinement, user approval, PR posting |
@@ -23,41 +23,55 @@ flowchart TD
23
23
  A[pre-post] --> B{Mode?}
24
24
 
25
25
  B -->|Manual| C["pre-post url1 url2"]
26
- B -->|Automatic| D["pre-post run"]
26
+ B -->|Subcommand| D{"detect | compare | run"}
27
27
  B -->|Claude Code Skill| E["/pre-post"]
28
28
 
29
- D --> F["git diff --name-only"]
29
+ D -->|detect| F["Git: diff, staged, unstaged, untracked"]
30
+ D -->|compare| J
31
+ D -->|run| F
32
+
30
33
  F --> G{Detect framework}
31
34
  G -->|Next.js App Router| H[Map files → routes]
32
35
  G -->|Next.js Pages Router| H
33
- G -->|Remix / SvelteKit| H
34
- G -->|Unknown| I["Default to /"]
35
- H --> J[Route list with confidence]
36
-
37
- E --> F
38
- E --> K[Claude refines routes]
39
- K --> J
36
+ G -->|Generic| H
37
+ H --> I{Routes found?}
38
+ I -->|Yes| J[Route list with confidence]
39
+ I -->|No| J2["Default to /"]
40
+ J2 --> J
41
+
42
+ E --> E1[Pre-flight checks]
43
+ E1 --> F
44
+ E1 --> K[Claude refines routes]
45
+ K --> K1[User approves routes]
46
+ K1 --> J
40
47
 
41
48
  C --> L[Playwright]
42
49
  J --> L
43
50
 
44
- L --> M{System Chrome?}
45
- M -->|Found| N[Use system Chrome]
46
- M -->|Not found| O[Use bundled Chromium]
47
- N --> P[Capture screenshots]
48
- O --> P
51
+ L --> M{Launch Chromium}
52
+ M -->|"PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH"| M1[Custom path — fail hard if invalid]
53
+ M -->|Auto-detect| M2[System Chrome → Bundled → Cached]
54
+ M1 --> P[Navigate + wait for network idle]
55
+ M2 --> P
49
56
 
50
- P --> Q[Disable animations]
51
- Q --> R[Wait for fonts]
57
+ P --> Q[Disable CSS animations]
58
+ Q --> R[Wait for document.fonts.ready]
52
59
  R --> S[Take 2x retina screenshot]
53
60
 
54
- S --> T{Output}
55
- T -->|Default| U["Save to ~/Downloads"]
56
- T -->|--markdown| V{Upload}
57
- V -->|Default| W["Commit to .pre-post/ (blob+SHA URL)"]
58
- V -->|--upload-url| Y["Custom storage"]
59
- W --> Z[Markdown table for PR]
60
- Y --> Z
61
+ S --> T[Save to ~/Downloads]
62
+ T --> T1{--markdown?}
63
+ T1 -->|No| U[Done]
64
+ T1 -->|Yes| V{Upload method}
65
+ V -->|Default| W["git-native: commit to .pre-post/"]
66
+ V -->|--upload-url| Y["HTTP: 0x0.st / Vercel Blob / PUT"]
67
+ W --> X[Build blob+SHA URL]
68
+ Y --> X
69
+ X --> Z[Markdown table]
70
+
71
+ Z --> Z1{Skill mode?}
72
+ Z1 -->|Yes| Z2[User approves screenshots]
73
+ Z2 --> Z3["gh pr edit — append to PR body"]
74
+ Z1 -->|No| Z4[Copy to clipboard]
61
75
 
62
76
  style A fill:#4f46e5,color:#fff
63
77
  style L fill:#2563eb,color:#fff
@@ -73,10 +87,40 @@ flowchart TD
73
87
  npx playwright install chromium
74
88
  ```
75
89
 
90
+ ## CI / Sandboxed Environments
91
+
92
+ pre-post needs a Chromium binary. In restricted environments where `npx playwright install chromium` fails (CDN blocked):
93
+
94
+ ```bash
95
+ # Point to a pre-installed Chrome/Chromium binary
96
+ export PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/path/to/chrome
97
+
98
+ # This is treated as an explicit override — pre-post will fail with a
99
+ # clear error if the path is wrong, rather than silently falling back.
100
+ ```
101
+
102
+ When no custom path is set, pre-post auto-detects in order: system Chrome, bundled Playwright Chromium, then any builds in `~/.cache/ms-playwright/`.
103
+
104
+ If no browser is available at all, use image-only mode:
105
+
106
+ ```bash
107
+ pre-post before.png after.png --markdown
108
+ ```
109
+
110
+ **Proxy URLs**: If your git remote uses a proxy (e.g., `http://proxy@host/git/owner/repo`), set the repo explicitly:
111
+
112
+ ```bash
113
+ export GH_REPO=owner/repo
114
+ ```
115
+
116
+ **Google Fonts**: Container egress proxies typically block `fonts.googleapis.com`.
117
+ Screenshots will render with system font fallbacks. This is cosmetic only —
118
+ `document.fonts.ready` still resolves and layout is preserved.
119
+
76
120
  ## Install
77
121
 
78
122
  ```bash
79
- npm i -g pre-post
123
+ npm install -D @juangadm/pre-post
80
124
  ```
81
125
 
82
126
  ## Basic Use
@@ -201,20 +245,24 @@ Pre-post automatically maps `git diff --name-only` to affected UI routes:
201
245
  Supports:
202
246
  - **Next.js App Router** (route groups, dynamic segments, parallel routes, catch-all)
203
247
  - **Next.js Pages Router** (`pages/`, `_app.tsx`, `_document.tsx`)
204
- - **Remix** (`routes/` directory)
205
- - **SvelteKit** (`src/routes/+page.svelte`)
206
248
  - **Generic fallback** (defaults to `/`)
207
249
 
208
250
  ## Add Skill
209
251
 
210
- Install as a Claude Code skill:
252
+ Install as an agent skill using the [`skills` CLI](https://github.com/vercel-labs/skills):
211
253
 
212
254
  ```bash
213
- npx skills add juangadm/pre-post
255
+ npx skills add juangadm/pre-post # interactive — pick your agent(s)
256
+ npx skills add juangadm/pre-post -y # auto-install to all universal agents
257
+ npx skills add juangadm/pre-post -y -g # install globally (all projects)
214
258
  ```
215
259
 
260
+ This copies `skill/SKILL.md` into the appropriate directory for your agent (e.g., `.claude/skills/` for Claude Code, `.agents/skills/` for Amp/Codex/Gemini CLI, etc.).
261
+
216
262
  The skill uses `gh` to detect the associated PR and Playwright for screenshots.
217
263
 
264
+ > **Note:** The npm package (`@juangadm/pre-post`) is published on [npmjs.com](https://www.npmjs.com/package/@juangadm/pre-post), not GitHub Packages — so the "Packages" section on the GitHub repo page will show none.
265
+
218
266
  ## Credits
219
267
 
220
268
  - Original [before-and-after](https://github.com/vercel-labs/before-and-after) by [James Clements](https://github.com/jamesclement) at [Vercel Labs](https://github.com/vercel-labs)
package/dist/bin/cli.js CHANGED
@@ -6,9 +6,11 @@ import { BeforeAndAfter, generateFilename } from '../index.js';
6
6
  import { VIEWPORT_PRESETS } from '../types.js';
7
7
  import { closeBrowser } from '../browser.js';
8
8
  import { captureScreenshot } from '../capture.js';
9
+ import { captureVideo } from '../video.js';
9
10
  import { uploadBeforeAfter } from '../upload.js';
10
11
  import { copyToClipboard } from '../clipboard.js';
11
12
  import { detectRoutes, getChangedFiles, detectFramework } from '../routes.js';
13
+ import { resolveViewport } from '../viewport.js';
12
14
  // Determine subcommand
13
15
  const subcommand = process.argv[2];
14
16
  const isSubcommand = ['detect', 'compare', 'run'].includes(subcommand);
@@ -38,6 +40,11 @@ const { values, positionals } = parseArgs({
38
40
  framework: { type: 'string' },
39
41
  'before-base': { type: 'string' },
40
42
  'after-base': { type: 'string' },
43
+ // Video/GIF options
44
+ video: { type: 'boolean' },
45
+ duration: { type: 'string' },
46
+ fps: { type: 'string' },
47
+ delay: { type: 'string' },
41
48
  },
42
49
  });
43
50
  function printHelp() {
@@ -78,6 +85,12 @@ COMPARE OPTIONS:
78
85
  --before-base <url> Base URL for "before" state (production)
79
86
  --after-base <url> Base URL for "after" state (localhost)
80
87
 
88
+ VIDEO OPTIONS:
89
+ --video Capture animated GIF instead of static screenshot
90
+ --duration <seconds> Recording duration (default: 3, max: 10)
91
+ --fps <n> Target frames per second (default: 5, max: 10)
92
+ --delay <ms> Wait after page load before recording (default: 0)
93
+
81
94
  OUTPUT OPTIONS:
82
95
  -o, --output <dir> Output directory (default: ~/Downloads)
83
96
  --markdown Upload images & output markdown table
@@ -105,6 +118,13 @@ EXAMPLES:
105
118
  # Responsive capture (desktop + mobile)
106
119
  pre-post compare --before-base url1 --after-base url2 --responsive
107
120
 
121
+ # Capture animated GIFs instead of static screenshots
122
+ pre-post google.com facebook.com --video
123
+ pre-post google.com facebook.com --video --duration 5 --fps 8
124
+
125
+ # GIF capture with compare mode
126
+ pre-post compare --before-base url1 --after-base url2 --video --delay 500
127
+
108
128
  # Use existing images (auto-detected)
109
129
  pre-post before.png after.png --markdown
110
130
  `);
@@ -123,6 +143,58 @@ function normalizeUrl(url) {
123
143
  }
124
144
  return `https://${url}`;
125
145
  }
146
+ function parseStrictNumber(value, flag) {
147
+ if (!/^-?\d+(?:\.\d+)?$/.test(value.trim())) {
148
+ console.error(`Invalid value for ${flag}: ${value}. Expected a number.`);
149
+ process.exit(1);
150
+ }
151
+ const parsed = Number(value);
152
+ if (!Number.isFinite(parsed)) {
153
+ console.error(`Invalid value for ${flag}: ${value}. Expected a finite number.`);
154
+ process.exit(1);
155
+ }
156
+ return parsed;
157
+ }
158
+ function parseStrictInteger(value, flag) {
159
+ if (!/^-?\d+$/.test(value.trim())) {
160
+ console.error(`Invalid value for ${flag}: ${value}. Expected an integer.`);
161
+ process.exit(1);
162
+ }
163
+ const parsed = Number(value);
164
+ if (!Number.isSafeInteger(parsed)) {
165
+ console.error(`Invalid value for ${flag}: ${value}. Expected a safe integer.`);
166
+ process.exit(1);
167
+ }
168
+ return parsed;
169
+ }
170
+ /**
171
+ * Validate --video flag combinations and parse video-related options.
172
+ * Returns parsed options if --video is set, undefined otherwise.
173
+ */
174
+ function validateVideoFlags() {
175
+ if (!values.video)
176
+ return undefined;
177
+ if (values.full) {
178
+ console.error('--full (fullPage) is not supported with --video');
179
+ process.exit(1);
180
+ }
181
+ const duration = values.duration ? parseStrictNumber(values.duration, '--duration') : undefined;
182
+ if (duration !== undefined && (duration <= 0 || duration > 10)) {
183
+ console.error('Duration must be between 0.1 and 10 seconds');
184
+ process.exit(1);
185
+ }
186
+ const fps = values.fps ? parseStrictInteger(values.fps, '--fps') : undefined;
187
+ if (fps !== undefined && (fps < 1 || fps > 10)) {
188
+ console.error('FPS must be between 1 and 10');
189
+ process.exit(1);
190
+ }
191
+ const delay = values.delay ? parseStrictInteger(values.delay, '--delay') : undefined;
192
+ if (delay !== undefined && delay < 0) {
193
+ console.error('Delay must be a non-negative integer in milliseconds');
194
+ process.exit(1);
195
+ }
196
+ return { duration, fps, delay };
197
+ }
126
198
  function resolveViewportFlag() {
127
199
  if (values.mobile)
128
200
  return 'mobile';
@@ -160,63 +232,80 @@ async function runDetect() {
160
232
  // ============================================================
161
233
  // Subcommand: compare
162
234
  // ============================================================
163
- async function runCompare() {
235
+ async function runCompare(routeOverrides, videoOpts) {
164
236
  const beforeBase = values['before-base'];
165
237
  const afterBase = values['after-base'];
166
238
  if (!beforeBase || !afterBase) {
167
239
  console.error('Both --before-base and --after-base are required for compare.');
168
240
  process.exit(1);
169
241
  }
170
- const routeList = values.routes
171
- ? values.routes.split(',').map(r => r.trim())
172
- : ['/'];
242
+ const routeList = routeOverrides
243
+ ?? (values.routes ? values.routes.split(',').map(r => r.trim()) : ['/']);
173
244
  const responsive = values.responsive ?? false;
174
- const viewport = resolveViewportFlag();
245
+ const isVideo = values.video ?? false;
246
+ const ext = isVideo ? 'gif' : 'png';
247
+ const captureType = isVideo ? 'GIF' : 'screenshot';
175
248
  const outputDir = values.output || path.join(process.env.HOME || '~', 'Downloads');
176
249
  fs.mkdirSync(outputDir, { recursive: true });
177
250
  const timestamp = new Date();
251
+ const viewports = responsive
252
+ ? ['desktop', 'mobile'].map(p => ({ label: p, size: VIEWPORT_PRESETS[p] }))
253
+ : [{ size: resolveViewport(resolveViewportFlag()) }];
254
+ const tasks = [];
255
+ for (const route of routeList) {
256
+ const beforeUrl = normalizeUrl(beforeBase.replace(/\/$/, '') + route);
257
+ const afterUrl = normalizeUrl(afterBase.replace(/\/$/, '') + route);
258
+ const routeSlug = route === '/' ? 'home' : route.replace(/^\//, '').replace(/\//g, '-');
259
+ for (const { label: presetLabel, size: vp } of viewports) {
260
+ const filePrefix = presetLabel ? `${routeSlug}-${presetLabel}` : routeSlug;
261
+ tasks.push({
262
+ route,
263
+ presetLabel,
264
+ vp,
265
+ beforeUrl,
266
+ afterUrl,
267
+ beforeFilename: `${filePrefix}-before-${formatTimestamp(timestamp)}.${ext}`,
268
+ afterFilename: `${filePrefix}-after-${formatTimestamp(timestamp)}.${ext}`,
269
+ });
270
+ }
271
+ }
272
+ const totalCaptures = tasks.length * 2;
273
+ console.log(`Capturing ${totalCaptures} ${captureType}s across ${routeList.length} route(s)...`);
178
274
  try {
179
- for (const route of routeList) {
180
- const beforeUrl = normalizeUrl(beforeBase.replace(/\/$/, '') + route);
181
- const afterUrl = normalizeUrl(afterBase.replace(/\/$/, '') + route);
182
- if (responsive) {
183
- // Capture desktop + mobile for each route
184
- for (const preset of ['desktop', 'mobile']) {
185
- const vp = VIEWPORT_PRESETS[preset];
186
- console.log(`Capturing ${route} @ ${preset} (${vp.width}x${vp.height})...`);
187
- const beforeResult = await captureScreenshot({
188
- url: beforeUrl,
189
- viewport: preset,
190
- fullPage: values.full,
191
- selector: values.selector,
192
- });
193
- const afterResult = await captureScreenshot({
194
- url: afterUrl,
195
- viewport: preset,
196
- fullPage: values.full,
197
- selector: values.selector,
198
- });
199
- const routeSlug = route === '/' ? 'home' : route.replace(/^\//, '').replace(/\//g, '-');
200
- const beforeFilename = `${routeSlug}-${preset}-before-${formatTimestamp(timestamp)}.png`;
201
- const afterFilename = `${routeSlug}-${preset}-after-${formatTimestamp(timestamp)}.png`;
202
- fs.writeFileSync(path.join(outputDir, beforeFilename), beforeResult.image);
203
- fs.writeFileSync(path.join(outputDir, afterFilename), afterResult.image);
204
- console.log(` Saved: ${beforeFilename}, ${afterFilename}`);
205
- }
275
+ // Execute all tasks in parallel (pool limits concurrency)
276
+ const results = await Promise.allSettled(tasks.map(async (task) => {
277
+ if (isVideo) {
278
+ const opts = { viewport: task.vp, ...videoOpts, selector: values.selector };
279
+ const [beforeResult, afterResult] = await Promise.all([
280
+ captureVideo(task.beforeUrl, opts),
281
+ captureVideo(task.afterUrl, opts),
282
+ ]);
283
+ fs.writeFileSync(path.join(outputDir, task.beforeFilename), beforeResult.gif);
284
+ fs.writeFileSync(path.join(outputDir, task.afterFilename), afterResult.gif);
285
+ console.log(` Done: ${task.route}${task.presetLabel ? ` @ ${task.presetLabel}` : ''} (${beforeResult.frameCount}f + ${afterResult.frameCount}f)`);
206
286
  }
207
287
  else {
208
- console.log(`Capturing ${route}...`);
209
- const beforeResult = await captureScreenshot({ url: beforeUrl, viewport, fullPage: values.full });
210
- const afterResult = await captureScreenshot({ url: afterUrl, viewport, fullPage: values.full });
211
- const routeSlug = route === '/' ? 'home' : route.replace(/^\//, '').replace(/\//g, '-');
212
- const beforeFilename = `${routeSlug}-before-${formatTimestamp(timestamp)}.png`;
213
- const afterFilename = `${routeSlug}-after-${formatTimestamp(timestamp)}.png`;
214
- fs.writeFileSync(path.join(outputDir, beforeFilename), beforeResult.image);
215
- fs.writeFileSync(path.join(outputDir, afterFilename), afterResult.image);
216
- console.log(` Saved: ${beforeFilename}, ${afterFilename}`);
288
+ const [beforeResult, afterResult] = await Promise.all([
289
+ captureScreenshot({
290
+ url: task.beforeUrl, viewport: task.vp, fullPage: values.full, selector: values.selector,
291
+ }),
292
+ captureScreenshot({
293
+ url: task.afterUrl, viewport: task.vp, fullPage: values.full, selector: values.selector,
294
+ }),
295
+ ]);
296
+ fs.writeFileSync(path.join(outputDir, task.beforeFilename), beforeResult.image);
297
+ fs.writeFileSync(path.join(outputDir, task.afterFilename), afterResult.image);
298
+ console.log(` Done: ${task.route}${task.presetLabel ? ` @ ${task.presetLabel}` : ''}`);
217
299
  }
300
+ }));
301
+ const failures = results.filter((r) => r.status === 'rejected');
302
+ if (failures.length > 0) {
303
+ for (const f of failures)
304
+ console.error(` Failed: ${f.reason}`);
305
+ if (failures.length === results.length)
306
+ throw new Error('All captures failed');
218
307
  }
219
- console.log(`\nAll screenshots saved to: ${outputDir}`);
308
+ console.log(`\nAll ${captureType}s saved to: ${outputDir}`);
220
309
  }
221
310
  finally {
222
311
  await closeBrowser();
@@ -225,14 +314,13 @@ async function runCompare() {
225
314
  // ============================================================
226
315
  // Subcommand: run (detect + compare)
227
316
  // ============================================================
228
- async function runFull() {
317
+ async function runFull(videoOpts) {
229
318
  const beforeBase = values['before-base'];
230
319
  const afterBase = values['after-base'];
231
320
  if (!beforeBase || !afterBase) {
232
321
  console.error('Both --before-base and --after-base are required for run.');
233
322
  process.exit(1);
234
323
  }
235
- // Detect routes
236
324
  const framework = values.framework;
237
325
  const maxRoutes = values['max-routes'] ? parseInt(values['max-routes']) : undefined;
238
326
  const changedFiles = getChangedFiles();
@@ -255,14 +343,12 @@ async function runFull() {
255
343
  console.log('No changed files detected. Defaulting to /');
256
344
  routeList = ['/'];
257
345
  }
258
- // Override routes in values for compare to pick up
259
- values.routes = routeList.join(',');
260
- await runCompare();
346
+ await runCompare(routeList, videoOpts);
261
347
  }
262
348
  // ============================================================
263
349
  // Default mode (original before-and-after behavior)
264
350
  // ============================================================
265
- async function runDefault() {
351
+ async function runDefault(videoOpts) {
266
352
  if (values.help) {
267
353
  printHelp();
268
354
  return;
@@ -282,7 +368,7 @@ async function runDefault() {
282
368
  after: second,
283
369
  });
284
370
  if (values.markdown) {
285
- console.log(result.markdown);
371
+ await uploadAndOutputMarkdown(result.beforeImage, result.afterImage, path.basename(first), path.basename(second));
286
372
  }
287
373
  else {
288
374
  console.log(`Before: ${first}`);
@@ -305,51 +391,58 @@ async function runDefault() {
305
391
  }
306
392
  const outputDir = values.output || path.join(process.env.HOME || '~', 'Downloads');
307
393
  fs.mkdirSync(outputDir, { recursive: true });
308
- console.log(`Capturing before: ${beforeUrl}${beforeSelector ? ` (${beforeSelector})` : ''}`);
309
- console.log(`Capturing after: ${afterUrl}${afterSelector ? ` (${afterSelector})` : ''}`);
310
- const result = await ba.captureBeforeAfter({
311
- before: {
312
- url: beforeUrl,
394
+ const isVideo = values.video ?? false;
395
+ const captureType = isVideo ? 'GIF' : 'screenshot';
396
+ console.log(`Capturing ${captureType} before: ${beforeUrl}${beforeSelector ? ` (${beforeSelector})` : ''}`);
397
+ console.log(`Capturing ${captureType} after: ${afterUrl}${afterSelector ? ` (${afterSelector})` : ''}`);
398
+ if (isVideo) {
399
+ // Video/GIF mode
400
+ const resolvedViewport = resolveViewport(viewport);
401
+ const opts = {
402
+ viewport: resolvedViewport,
403
+ ...videoOpts,
313
404
  selector: beforeSelector,
314
- fullPage: values.full,
315
- },
316
- after: {
317
- url: afterUrl,
318
- selector: afterSelector,
319
- fullPage: values.full,
320
- },
321
- });
322
- // Generate filenames
323
- const timestamp = new Date();
324
- const beforeFilename = generateFilename({
325
- url: beforeUrl,
326
- suffix: 'before',
327
- timestamp,
328
- });
329
- const afterFilename = generateFilename({
330
- url: afterUrl,
331
- suffix: 'after',
332
- timestamp,
333
- });
334
- const beforePath = path.join(outputDir, beforeFilename);
335
- const afterPath = path.join(outputDir, afterFilename);
336
- fs.writeFileSync(beforePath, result.before.image);
337
- fs.writeFileSync(afterPath, result.after.image);
338
- console.log(`\nSaved: ${beforePath}`);
339
- console.log(`Saved: ${afterPath}`);
340
- // Output markdown if requested
341
- if (values.markdown) {
342
- const uploadUrl = values['upload-url'] || process.env.UPLOAD_URL;
343
- console.log(`\nUploading images${uploadUrl ? ` to ${uploadUrl}` : ''}...`);
344
- const { beforeUrl: bUrl, afterUrl: aUrl } = await uploadBeforeAfter({ image: result.before.image, filename: beforeFilename }, { image: result.after.image, filename: afterFilename }, uploadUrl);
345
- console.log(`Before: ${bUrl}`);
346
- console.log(`After: ${aUrl}`);
347
- const markdown = `| Pre | Post |
348
- |:---:|:----:|
349
- | ![Pre](${bUrl}) | ![Post](${aUrl}) |`;
350
- console.log(`\n${markdown}`);
351
- if (copyToClipboard(markdown)) {
352
- console.log(`\nMarkdown copied to clipboard`);
405
+ };
406
+ const beforeResult = await captureVideo(beforeUrl, opts);
407
+ const afterResult = await captureVideo(afterUrl, { ...opts, selector: afterSelector });
408
+ const timestamp = new Date();
409
+ const beforeFilename = generateFilename({ url: beforeUrl, suffix: 'before', timestamp, format: 'gif' });
410
+ const afterFilename = generateFilename({ url: afterUrl, suffix: 'after', timestamp, format: 'gif' });
411
+ const beforePath = path.join(outputDir, beforeFilename);
412
+ const afterPath = path.join(outputDir, afterFilename);
413
+ fs.writeFileSync(beforePath, beforeResult.gif);
414
+ fs.writeFileSync(afterPath, afterResult.gif);
415
+ console.log(`\nSaved: ${beforePath} (${beforeResult.frameCount} frames)`);
416
+ console.log(`Saved: ${afterPath} (${afterResult.frameCount} frames)`);
417
+ if (values.markdown) {
418
+ await uploadAndOutputMarkdown(beforeResult.gif, afterResult.gif, beforeFilename, afterFilename);
419
+ }
420
+ }
421
+ else {
422
+ // Static screenshot mode
423
+ const result = await ba.captureBeforeAfter({
424
+ before: {
425
+ url: beforeUrl,
426
+ selector: beforeSelector,
427
+ fullPage: values.full,
428
+ },
429
+ after: {
430
+ url: afterUrl,
431
+ selector: afterSelector,
432
+ fullPage: values.full,
433
+ },
434
+ });
435
+ const timestamp = new Date();
436
+ const beforeFilename = generateFilename({ url: beforeUrl, suffix: 'before', timestamp });
437
+ const afterFilename = generateFilename({ url: afterUrl, suffix: 'after', timestamp });
438
+ const beforePath = path.join(outputDir, beforeFilename);
439
+ const afterPath = path.join(outputDir, afterFilename);
440
+ fs.writeFileSync(beforePath, result.before.image);
441
+ fs.writeFileSync(afterPath, result.after.image);
442
+ console.log(`\nSaved: ${beforePath}`);
443
+ console.log(`Saved: ${afterPath}`);
444
+ if (values.markdown) {
445
+ await uploadAndOutputMarkdown(result.before.image, result.after.image, beforeFilename, afterFilename);
353
446
  }
354
447
  }
355
448
  }
@@ -360,6 +453,22 @@ async function runDefault() {
360
453
  function formatTimestamp(date) {
361
454
  return date.toISOString().replace(/[:.]/g, '-').slice(0, 19);
362
455
  }
456
+ function buildMarkdownTable(beforeUrl, afterUrl) {
457
+ const header = '| Pre | Post |';
458
+ const divider = '|:---:|:----:|';
459
+ const row = `| ![Pre](${beforeUrl}) | ![Post](${afterUrl}) |`;
460
+ return `${header}\n${divider}\n${row}`;
461
+ }
462
+ async function uploadAndOutputMarkdown(beforeImage, afterImage, beforeFilename, afterFilename) {
463
+ const uploadUrl = values['upload-url'] || process.env.UPLOAD_URL;
464
+ console.log(`Uploading images${uploadUrl ? ` to ${uploadUrl}` : ''}...`);
465
+ const { beforeUrl, afterUrl } = await uploadBeforeAfter({ image: beforeImage, filename: beforeFilename }, { image: afterImage, filename: afterFilename }, uploadUrl);
466
+ const markdown = buildMarkdownTable(beforeUrl, afterUrl);
467
+ console.log(`\n${markdown}`);
468
+ if (copyToClipboard(markdown)) {
469
+ console.log('\nMarkdown copied to clipboard');
470
+ }
471
+ }
363
472
  // ============================================================
364
473
  // Main dispatch
365
474
  // ============================================================
@@ -368,15 +477,16 @@ async function main() {
368
477
  printHelp();
369
478
  return;
370
479
  }
480
+ const videoOpts = validateVideoFlags();
371
481
  switch (subcommand) {
372
482
  case 'detect':
373
483
  return runDetect();
374
484
  case 'compare':
375
- return runCompare();
485
+ return runCompare(undefined, videoOpts);
376
486
  case 'run':
377
- return runFull();
487
+ return runFull(videoOpts);
378
488
  default:
379
- return runDefault();
489
+ return runDefault(videoOpts);
380
490
  }
381
491
  }
382
492
  main()
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/bin/cli.ts"],"names":[],"mappings":"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"}