@juangadm/pre-post 1.4.0 → 1.6.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 (77) hide show
  1. package/README.md +2 -1
  2. package/assets/labels/post.png +0 -0
  3. package/assets/labels/pre.png +0 -0
  4. package/dist/attach.d.ts +60 -0
  5. package/dist/attach.d.ts.map +1 -0
  6. package/dist/attach.js +138 -0
  7. package/dist/attach.js.map +1 -0
  8. package/dist/bin/cli.js +25 -17
  9. package/dist/bin/cli.js.map +1 -1
  10. package/dist/browser.d.ts +48 -2
  11. package/dist/browser.d.ts.map +1 -1
  12. package/dist/browser.js +60 -31
  13. package/dist/browser.js.map +1 -1
  14. package/dist/commands/doctor.d.ts +6 -0
  15. package/dist/commands/doctor.d.ts.map +1 -1
  16. package/dist/commands/doctor.js +14 -0
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/pr.d.ts +20 -0
  19. package/dist/commands/pr.d.ts.map +1 -1
  20. package/dist/commands/pr.js +95 -30
  21. package/dist/commands/pr.js.map +1 -1
  22. package/dist/comparison.d.ts.map +1 -1
  23. package/dist/comparison.js +10 -4
  24. package/dist/comparison.js.map +1 -1
  25. package/dist/compose.d.ts +72 -0
  26. package/dist/compose.d.ts.map +1 -0
  27. package/dist/compose.js +237 -0
  28. package/dist/compose.js.map +1 -0
  29. package/dist/doctor.d.ts +6 -0
  30. package/dist/doctor.d.ts.map +1 -1
  31. package/dist/doctor.js +5 -1
  32. package/dist/doctor.js.map +1 -1
  33. package/dist/ffmpeg.d.ts +35 -0
  34. package/dist/ffmpeg.d.ts.map +1 -0
  35. package/dist/ffmpeg.js +143 -0
  36. package/dist/ffmpeg.js.map +1 -0
  37. package/dist/github.d.ts +7 -0
  38. package/dist/github.d.ts.map +1 -1
  39. package/dist/github.js +18 -0
  40. package/dist/github.js.map +1 -1
  41. package/dist/index.d.ts +4 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +2 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/moments.d.ts +83 -0
  46. package/dist/moments.d.ts.map +1 -0
  47. package/dist/moments.js +170 -0
  48. package/dist/moments.js.map +1 -0
  49. package/dist/record.d.ts +69 -0
  50. package/dist/record.d.ts.map +1 -0
  51. package/dist/record.js +223 -0
  52. package/dist/record.js.map +1 -0
  53. package/dist/report.d.ts +9 -0
  54. package/dist/report.d.ts.map +1 -1
  55. package/dist/report.js +60 -3
  56. package/dist/report.js.map +1 -1
  57. package/dist/run.d.ts +2 -0
  58. package/dist/run.d.ts.map +1 -1
  59. package/dist/run.js +2 -1
  60. package/dist/run.js.map +1 -1
  61. package/dist/timeline.d.ts +46 -0
  62. package/dist/timeline.d.ts.map +1 -0
  63. package/dist/timeline.js +80 -0
  64. package/dist/timeline.js.map +1 -0
  65. package/dist/types.d.ts +34 -0
  66. package/dist/types.d.ts.map +1 -1
  67. package/dist/types.js.map +1 -1
  68. package/dist/video.d.ts +19 -0
  69. package/dist/video.d.ts.map +1 -0
  70. package/dist/video.js +109 -0
  71. package/dist/video.js.map +1 -0
  72. package/dist/viewport.d.ts +13 -0
  73. package/dist/viewport.d.ts.map +1 -1
  74. package/dist/viewport.js +16 -0
  75. package/dist/viewport.js.map +1 -1
  76. package/package.json +4 -2
  77. package/skill/SKILL.md +25 -6
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Line two recordings up so every step lands at the same instant on both.
3
+ *
4
+ * Pre and Post never run at the same speed: one host is slower, one button
5
+ * animates longer, a click waits for an element to settle. Played from the
6
+ * same start, the two panes drift apart and a reviewer compares load speed
7
+ * instead of the change. So each recording is cut at its step marks and every
8
+ * segment plays for as long as the slower side needs, with the faster side
9
+ * held on its last frame of that segment.
10
+ *
11
+ * Pure: times in, times out. The frames themselves are looked up afterwards.
12
+ */
13
+ export interface SideTiming {
14
+ /** When the recording started (ms, same clock as the frames). */
15
+ start: number;
16
+ /**
17
+ * When it stopped. For a side whose step failed, the moment that step began:
18
+ * the time it spent failing is not something to show.
19
+ */
20
+ end: number;
21
+ /** When each step began, in order — only the steps this side got to. */
22
+ marks: number[];
23
+ }
24
+ export interface Tick {
25
+ /** Source time to show on each side. */
26
+ a: number;
27
+ b: number;
28
+ /** Whether this side has run out of steps (its step failed): show the "missing" card. */
29
+ aMissing: boolean;
30
+ bMissing: boolean;
31
+ /** Index of the step in progress, -1 before the first. */
32
+ step: number;
33
+ /** Milliseconds since that step began, in output time; -1 before the first. */
34
+ sinceStep: number;
35
+ }
36
+ /** Output ticks at `fps`, step-aligned across the two sides. */
37
+ export declare function alignTimeline(a: SideTiming, b: SideTiming, fps: number): Tick[];
38
+ /** Output duration of an aligned timeline, in ms. */
39
+ export declare function timelineDuration(ticks: Tick[], fps: number): number;
40
+ /**
41
+ * Index of the frame on screen at `t`: the last one captured at or before it.
42
+ * The screencast sends a frame only when pixels change, so the one before is
43
+ * what was still showing. Before the first frame, the first frame.
44
+ */
45
+ export declare function frameAt(times: number[], t: number): number;
46
+ //# sourceMappingURL=timeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACnB,wCAAwC;IACxC,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,yFAAyF;IACzF,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,SAAS,EAAE,MAAM,CAAC;CACnB;AASD,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,CAkC/E;AAED,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW1D"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Line two recordings up so every step lands at the same instant on both.
3
+ *
4
+ * Pre and Post never run at the same speed: one host is slower, one button
5
+ * animates longer, a click waits for an element to settle. Played from the
6
+ * same start, the two panes drift apart and a reviewer compares load speed
7
+ * instead of the change. So each recording is cut at its step marks and every
8
+ * segment plays for as long as the slower side needs, with the faster side
9
+ * held on its last frame of that segment.
10
+ *
11
+ * Pure: times in, times out. The frames themselves are looked up afterwards.
12
+ */
13
+ function boundaries(side) {
14
+ // Clamp so a mark recorded a hair after `end` (clock jitter) can never
15
+ // produce a negative segment.
16
+ const marks = side.marks.map(m => Math.min(Math.max(m, side.start), side.end));
17
+ return [side.start, ...marks, side.end];
18
+ }
19
+ /** Output ticks at `fps`, step-aligned across the two sides. */
20
+ export function alignTimeline(a, b, fps) {
21
+ const frameMs = 1000 / fps;
22
+ const ba = boundaries(a);
23
+ const bb = boundaries(b);
24
+ const segments = Math.max(ba.length, bb.length) - 1;
25
+ const ticks = [];
26
+ // Carried across segments so ticks stay evenly spaced in output time.
27
+ let carry = 0;
28
+ for (let k = 0; k < segments; k++) {
29
+ const hasA = k < ba.length - 1;
30
+ const hasB = k < bb.length - 1;
31
+ const lenA = hasA ? ba[k + 1] - ba[k] : 0;
32
+ const lenB = hasB ? bb[k + 1] - bb[k] : 0;
33
+ const len = Math.max(lenA, lenB);
34
+ let u = carry;
35
+ for (; u < len; u += frameMs) {
36
+ ticks.push({
37
+ a: hasA ? ba[k] + Math.min(u, lenA) : a.end,
38
+ b: hasB ? bb[k] + Math.min(u, lenB) : b.end,
39
+ aMissing: !hasA,
40
+ bMissing: !hasB,
41
+ step: k - 1,
42
+ sinceStep: k === 0 ? -1 : u,
43
+ });
44
+ }
45
+ carry = u - len;
46
+ }
47
+ // The final frame: both sides at their end, so the clip closes on the result.
48
+ ticks.push({
49
+ a: a.end, b: b.end,
50
+ aMissing: ba.length - 1 < segments, bMissing: bb.length - 1 < segments,
51
+ step: segments - 2, sinceStep: Number.MAX_SAFE_INTEGER,
52
+ });
53
+ return ticks;
54
+ }
55
+ /** Output duration of an aligned timeline, in ms. */
56
+ export function timelineDuration(ticks, fps) {
57
+ return Math.round((ticks.length - 1) * 1000 / fps);
58
+ }
59
+ /**
60
+ * Index of the frame on screen at `t`: the last one captured at or before it.
61
+ * The screencast sends a frame only when pixels change, so the one before is
62
+ * what was still showing. Before the first frame, the first frame.
63
+ */
64
+ export function frameAt(times, t) {
65
+ let lo = 0;
66
+ let hi = times.length - 1;
67
+ if (hi < 0)
68
+ return -1;
69
+ if (t < times[0])
70
+ return 0;
71
+ while (lo < hi) {
72
+ const mid = (lo + hi + 1) >> 1;
73
+ if (times[mid] <= t)
74
+ lo = mid;
75
+ else
76
+ hi = mid - 1;
77
+ }
78
+ return lo;
79
+ }
80
+ //# sourceMappingURL=timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline.js","sourceRoot":"","sources":["../src/timeline.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -182,6 +182,11 @@ export interface PrePostConfig {
182
182
  assetsBranch?: string;
183
183
  /** Skip paths (glob-ish prefixes) from route detection */
184
184
  ignore?: string[];
185
+ /**
186
+ * Short interactions to record on Pre and Post, in priority order; the
187
+ * first three run. See docs/video.md. Validated by `parseMoments`.
188
+ */
189
+ moments?: unknown[];
185
190
  /**
186
191
  * Command run in the app directory between the install and the dev server
187
192
  * when the baseline is built from source — a workspace build, a codegen
@@ -321,6 +326,35 @@ export interface PrRunResult {
321
326
  delivery?: Delivery;
322
327
  /** Set when the run found a side rendering errors instead of the page. */
323
328
  verdict?: RunVerdict;
329
+ /** One per Moment recorded, in priority order. */
330
+ moments?: MomentOutcome[];
331
+ /** Names of Moments over the per-run limit, listed but not recorded. */
332
+ momentsSkipped?: string[];
333
+ /** Why the clips link out instead of playing inline, when they do: the one thing to fix. */
334
+ momentsHint?: string;
335
+ }
336
+ /** What became of one Moment. */
337
+ export interface MomentOutcome {
338
+ name: string;
339
+ route: string;
340
+ viewport: string;
341
+ status: 'recorded' | 'error';
342
+ /** Why there is no clip, in one plain sentence. */
343
+ error?: string;
344
+ /** Why the Pre pane shows a card instead of the interaction, when it does. */
345
+ preNote?: string;
346
+ durationMs?: number;
347
+ bytes?: number;
348
+ /** Local clip (`.webm`) and its last frame (`.jpg`). */
349
+ file?: string;
350
+ poster?: string;
351
+ /** Published clip and poster. */
352
+ videoUrl?: string;
353
+ posterUrl?: string;
354
+ /** True when `videoUrl` is a GitHub attachment, which plays inline in the PR. */
355
+ inline?: boolean;
356
+ /** The one-line nudge for a clip that ran long. */
357
+ note?: string;
324
358
  }
325
359
  /**
326
360
  * What happened to a run's result on GitHub.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;AAW/D,MAAM,CAAC,MAAM,gBAAgB,GAAyC;IACpE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACrC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACpC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CACpC,CAAC;AA4NF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAU,CAAC;AAI9F;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY,CAAC,CAAC,OAAO,aAAa,CAAC;QACxC,KAAK,WAAW,CAAC,CAAC,OAAO,YAAY,CAAC;QACtC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAsDD,oCAAoC;AACpC,MAAM,UAAU,QAAQ,CAAC,IAAwB;IAC/C,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAmBD,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,CAAgC;IAC9D,OAAO,CAAC,EAAE,IAAI,KAAK,aAAa,IAAI,CAAC,EAAE,IAAI,KAAK,iBAAiB,CAAC;AACpE,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,WAAW;AACX,+DAA+D;AAW/D,MAAM,CAAC,MAAM,gBAAgB,GAAyC;IACpE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACrC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACpC,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CACpC,CAAC;AAiOF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAU,CAAC;AAI9F;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,IAAkB;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY,CAAC,CAAC,OAAO,aAAa,CAAC;QACxC,KAAK,WAAW,CAAC,CAAC,OAAO,YAAY,CAAC;QACtC,OAAO,CAAC,CAAC,OAAO,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAsDD,oCAAoC;AACpC,MAAM,UAAU,QAAQ,CAAC,IAAwB;IAC/C,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5C,CAAC;AAmBD,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,CAAgC;IAC9D,OAAO,CAAC,EAAE,IAAI,KAAK,aAAa,IAAI,CAAC,EAAE,IAAI,KAAK,iBAAiB,CAAC;AACpE,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Record a run's Moments: both sides of each, in parallel, then one clip each.
3
+ *
4
+ * Optional by the same rule as the summary sheet: a Moment that cannot be
5
+ * recorded becomes one plain sentence in the PR, never a failed run. The
6
+ * screenshots are the record; the clips show what screenshots cannot.
7
+ */
8
+ import { AuthOptions, MomentOutcome } from './types.js';
9
+ import { Moment } from './moments.js';
10
+ export interface RecordMomentsOptions {
11
+ before: string;
12
+ after: string;
13
+ auth?: AuthOptions;
14
+ outputDir: string;
15
+ log?: (msg: string) => void;
16
+ }
17
+ /** Record every Moment; never throws for a Moment's own failure. */
18
+ export declare function recordMoments(moments: Moment[], opts: RecordMomentsOptions): Promise<MomentOutcome[]>;
19
+ //# sourceMappingURL=video.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.d.ts","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAC;AAO3D,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AA0ED,oEAAoE;AACpE,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAmB3G"}
package/dist/video.js ADDED
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Record a run's Moments: both sides of each, in parallel, then one clip each.
3
+ *
4
+ * Optional by the same rule as the summary sheet: a Moment that cannot be
5
+ * recorded becomes one plain sentence in the PR, never a failed run. The
6
+ * screenshots are the record; the clips show what screenshots cannot.
7
+ */
8
+ import path from 'path';
9
+ import { longClipNote, quote } from './moments.js';
10
+ import { recordSide } from './record.js';
11
+ import { composeMoment, layoutFor } from './compose.js';
12
+ import { parseViewport } from './viewport.js';
13
+ import { describeError, routeSlug } from './run.js';
14
+ import { joinUrl } from './url.js';
15
+ function size(bytes) {
16
+ return bytes >= 1024 * 1024 ? `${(bytes / 1024 / 1024).toFixed(1)} MB` : `${Math.round(bytes / 1024)} KB`;
17
+ }
18
+ /**
19
+ * What the Pre pane shows: the recording (null when there is none to show),
20
+ * and the card and note when Pre could not play the Moment. A missing page or
21
+ * a missing button on Pre is the normal case for a new feature, so it reads
22
+ * as news, not as a failure.
23
+ */
24
+ function preSide(pre, url) {
25
+ if (pre.status === 'rejected') {
26
+ const why = describeError(pre.reason, 'before', url);
27
+ return { pre: null, card: { title: 'Pre could not be loaded', detail: why.slice(0, 90) }, note: `Pre could not be loaded (${why}).` };
28
+ }
29
+ const rec = pre.value;
30
+ if (rec.status !== undefined && rec.status >= 400) {
31
+ return rec.status === 404
32
+ ? { pre: null, card: { title: 'New page in this PR', detail: 'No page here on Pre' }, note: 'This page is new, so Pre has nothing to show.' }
33
+ : { pre: null, card: { title: `Pre answered HTTP ${rec.status}` }, note: `Pre answered HTTP ${rec.status}.` };
34
+ }
35
+ if (rec.failure) {
36
+ return { pre: rec, card: { title: 'Not in the old version', detail: `${rec.failure.message} on Pre` }, note: `${rec.failure.message} on Pre, so it is shown as new.` };
37
+ }
38
+ return { pre: rec };
39
+ }
40
+ async function recordOne(moment, index, opts) {
41
+ const vp = parseViewport(moment.viewport);
42
+ const base = { name: moment.name, route: moment.route, viewport: vp.label, status: 'error' };
43
+ const beforeUrl = joinUrl(opts.before, moment.route);
44
+ const afterUrl = joinUrl(opts.after, moment.route);
45
+ const side = { auth: opts.auth, maxWidth: layoutFor(vp.size).paneWidth };
46
+ const [pre, post] = await Promise.allSettled([
47
+ recordSide(beforeUrl, moment, vp.size, side),
48
+ recordSide(afterUrl, moment, vp.size, side),
49
+ ]);
50
+ // Post is the change under review: if it cannot play the Moment there is no
51
+ // clip worth showing, only the sentence that says why.
52
+ if (post.status === 'rejected')
53
+ return { ...base, error: `Post: ${describeError(post.reason, 'after', afterUrl)}` };
54
+ if (post.value.status !== undefined && post.value.status >= 400)
55
+ return { ...base, error: `Post answered HTTP ${post.value.status} for ${moment.route}.` };
56
+ if (post.value.failure)
57
+ return { ...base, error: `${post.value.failure.message} on Post (step ${post.value.failure.step + 1}).` };
58
+ const shown = preSide(pre, beforeUrl);
59
+ // Numbered, so two Moments whose names slug alike never write one file.
60
+ const stem = path.join(opts.outputDir, `moment-${index + 1}-${routeSlug(moment.name.toLowerCase())}-${vp.label}`);
61
+ try {
62
+ const clip = await composeMoment({
63
+ name: moment.name,
64
+ steps: moment.steps,
65
+ pre: shown.pre,
66
+ post: post.value,
67
+ preCard: shown.card,
68
+ out: `${stem}.webm`,
69
+ poster: `${stem}.jpg`,
70
+ });
71
+ return {
72
+ ...base,
73
+ status: 'recorded',
74
+ preNote: shown.note,
75
+ durationMs: clip.durationMs,
76
+ bytes: clip.bytes,
77
+ file: `${stem}.webm`,
78
+ poster: `${stem}.jpg`,
79
+ note: longClipNote(moment.name, clip.durationMs) ?? undefined,
80
+ };
81
+ }
82
+ catch (err) {
83
+ return { ...base, error: `Couldn't make the video: ${err?.message?.split('\n')[0] ?? err}` };
84
+ }
85
+ }
86
+ /** Record every Moment; never throws for a Moment's own failure. */
87
+ export async function recordMoments(moments, opts) {
88
+ const log = opts.log ?? (() => undefined);
89
+ if (!moments.length)
90
+ return [];
91
+ log(`Recording ${moments.length} Moment(s) ...`);
92
+ // All at once: the page pool bounds how many pages are open, so wall time
93
+ // is about the longest clip, not the sum of them.
94
+ // Each Moment settles on its own: one that throws is one sentence in the PR,
95
+ // never the loss of the others.
96
+ const outcomes = await Promise.all(moments.map((m, i) => recordOne(m, i, opts).catch((err) => ({
97
+ name: m.name, route: m.route, viewport: m.viewport, status: 'error',
98
+ error: `Couldn't record it: ${err?.message?.split('\n')[0] ?? err}`,
99
+ }))));
100
+ for (const o of outcomes) {
101
+ log(o.status === 'recorded'
102
+ ? ` ${quote(o.name)} ${(o.durationMs / 1000).toFixed(1)}s, ${size(o.bytes)}${o.preNote ? ` — ${o.preNote}` : ''}`
103
+ : ` ${quote(o.name)} not recorded: ${o.error}`);
104
+ if (o.note)
105
+ log(` Note: ${o.note}`);
106
+ }
107
+ return outcomes;
108
+ }
109
+ //# sourceMappingURL=video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,17 @@ export declare function parseViewport(spec: ViewportConfig | string): {
5
5
  size: ViewportSize;
6
6
  };
7
7
  export declare function resolveViewport(config?: ViewportConfig | string): ViewportSize;
8
+ export interface ViewportFlags {
9
+ viewports?: string;
10
+ mobile?: boolean;
11
+ responsive?: boolean;
12
+ tablet?: boolean;
13
+ size?: string;
14
+ }
15
+ /**
16
+ * Viewports from CLI flags, or undefined for the default (desktop).
17
+ * `--mobile` adds mobile on top of desktop; `-r`/`--responsive` are older aliases for it.
18
+ * Mobile only is `--viewports mobile`.
19
+ */
20
+ export declare function viewportsFromFlags(flags: ViewportFlags): string[] | undefined;
8
21
  //# sourceMappingURL=viewport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAoC,MAAM,YAAY,CAAC;AAE5F,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAOlG;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,YAAY,CAE9E"}
1
+ {"version":3,"file":"viewport.d.ts","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAoC,MAAM,YAAY,CAAC;AAE5F,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAOlG;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,GAAG,YAAY,CAE9E;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,GAAG,SAAS,CAM7E"}
package/dist/viewport.js CHANGED
@@ -14,4 +14,20 @@ export function parseViewport(spec) {
14
14
  export function resolveViewport(config) {
15
15
  return config ? parseViewport(config).size : VIEWPORT_PRESETS.desktop;
16
16
  }
17
+ /**
18
+ * Viewports from CLI flags, or undefined for the default (desktop).
19
+ * `--mobile` adds mobile on top of desktop; `-r`/`--responsive` are older aliases for it.
20
+ * Mobile only is `--viewports mobile`.
21
+ */
22
+ export function viewportsFromFlags(flags) {
23
+ if (flags.viewports)
24
+ return flags.viewports.split(',').map(s => s.trim()).filter(Boolean);
25
+ if (flags.mobile || flags.responsive)
26
+ return ['desktop', 'mobile'];
27
+ if (flags.tablet)
28
+ return ['tablet'];
29
+ if (flags.size)
30
+ return [flags.size];
31
+ return undefined;
32
+ }
17
33
  //# sourceMappingURL=viewport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5F,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3F,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAsB,CAAC,CAAC;IACxD,IAAI,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,yDAAyD,CAAC,CAAC;IAC5G,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAgC;IAC9D,OAAO,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC;AACxE,CAAC"}
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../src/viewport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgD,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5F,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,IAA6B;IACzD,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3F,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAsB,CAAC,CAAC;IACxD,IAAI,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACtC,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,yDAAyD,CAAC,CAAC;IAC5G,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAgC;IAC9D,OAAO,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC;AACxE,CAAC;AAUD;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1F,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM;QAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,IAAI;QAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@juangadm/pre-post",
3
- "version": "1.4.0",
4
- "description": "Before/after screenshots for pull requests: detect changed routes, capture, pixel-diff, and show the result in the PR description",
3
+ "version": "1.6.0",
4
+ "description": "Before/after screenshots and interaction videos for pull requests: detect changed routes, capture, pixel-diff, and show the result in the PR description",
5
5
  "author": "Juan Gabriel Delgado (forked from James Clements)",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -20,6 +20,7 @@
20
20
  "pull-request",
21
21
  "playwright",
22
22
  "pixelmatch",
23
+ "video",
23
24
  "cli",
24
25
  "claude-code-skill"
25
26
  ],
@@ -37,6 +38,7 @@
37
38
  },
38
39
  "files": [
39
40
  "dist",
41
+ "assets",
40
42
  "skill",
41
43
  "README.md",
42
44
  "LICENSE"
package/skill/SKILL.md CHANGED
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: pre-post
3
3
  description: Before/after screenshots for the current PR. Use when the user says "take before and after", "pre-post", "screenshot comparison", "visual diff", "PR screenshots", or after making visual UI changes.
4
- version: 1.4.0
4
+ version: 1.6.0
5
5
  allowed-tools:
6
- - Bash(npx -y @juangadm/pre-post@1.4.0 *)
6
+ - Bash(npx -y @juangadm/pre-post@1.6.0 *)
7
7
  - Bash(npx pre-post *)
8
8
  - Bash(pre-post *)
9
9
  ---
@@ -40,7 +40,7 @@ the Post side. Pass `--no-local-baseline` to turn it off.
40
40
  ## Run
41
41
 
42
42
  ```bash
43
- npx -y @juangadm/pre-post@1.4.0 pr
43
+ npx -y @juangadm/pre-post@1.6.0 pr
44
44
  ```
45
45
 
46
46
  The version is pinned on purpose: this file describes that release. If the run starts with
@@ -53,12 +53,30 @@ land somewhere they can see. Add `--routes /a,/b` when the user names pages expl
53
53
  `--before https://production-url` only if the run reports it cannot work out the baseline
54
54
  (it is then saved to `.pre-post.json` for next time).
55
55
 
56
+ ## Video: Moments
57
+
58
+ When the change **moves or reacts** (a menu or dialog opening, a hover or focus state, a
59
+ transition, form feedback), also record it: write Moments to a file outside the repo and
60
+ add `--moments <file>`. Static changes need none; screenshots cover them.
61
+
62
+ ```json
63
+ { "moments": [{ "name": "Open the account menu", "route": "/settings",
64
+ "steps": [{ "hover": "Account" }, { "click": "Account" }] }] }
65
+ ```
66
+
67
+ Steps are `click`, `hover`, `press`, `type` (`["Email", "a@b.co"]`), `scroll` and `wait` (ms),
68
+ naming targets by the text on screen. One interaction per Moment, under 15s, most important
69
+ first; three at most are recorded. "Couldn't find … on Post" means the target text is wrong:
70
+ fix it from the code and re-run once. Guide: https://github.com/juangadm/pre-post/blob/main/docs/video.md
71
+
56
72
  ## What it posts
57
73
 
58
74
  The visual changes go at the **top of the PR description**, in a delimited block that
59
75
  re-runs replace in place — the author's own text is never touched. If the PR cannot be
60
76
  edited (a fork, a read-only token) it falls back to a single sticky comment.
61
77
 
78
+ Moments come first, one clip each. If they could not play inline, the PR says why; relay that line.
79
+
62
80
  Each changed route shows **Pre beside Post**, per viewport, full pages in a `<details>`. No
63
81
  overlay, no percentage. A page that moved says `Content shifted down 48px`; relay as written. A pure move
64
82
  ("Nothing else changed.") shows the full pages with no crop and no `<details>`, by design.
@@ -67,7 +85,8 @@ overlay, no percentage. A page that moved says `Content shifted down 48px`; rela
67
85
 
68
86
  When anything changed, the command prints `Sheet: <path>`: one image with Pre beside Post for
69
87
  every change. If you can send files to the user, send that one file, even when the PR was
70
- updated. Someone following you from a phone sees it there before they open GitHub.
88
+ updated. Someone following you from a phone sees it there before they open GitHub. Each clip
89
+ is printed as `Video: <path>`; send those too.
71
90
 
72
91
  ## Rules
73
92
 
@@ -93,7 +112,7 @@ updated. Someone following you from a phone sees it there before they open GitHu
93
112
  | Flag | Use when |
94
113
  |------|----------|
95
114
  | `--routes /a,/b` | The user names the pages |
96
- | `-r`, `--responsive` | Desktop and mobile (default is desktop only) |
115
+ | `--mobile` | Add mobile to desktop (default is desktop only) |
97
116
  | `--viewport-only` | First screen only instead of full page |
98
117
  | `--pr <n>` | The branch has several PRs or the lookup fails |
99
118
  | `--dry-run` | Preview locally, post nothing |
@@ -102,5 +121,5 @@ updated. Someone following you from a phone sees it there before they open GitHu
102
121
  To run on every PR without anyone invoking it, point the user to the GitHub Action guide
103
122
  (https://github.com/juangadm/pre-post/blob/main/docs/github-action.md). It posts with GitHub's own token, which also covers work done in cloud sessions.
104
123
 
105
- Login-protected sites: `npx -y @juangadm/pre-post@1.4.0 login https://site` opens a browser
124
+ Login-protected sites: `npx -y @juangadm/pre-post@1.6.0 login https://site` opens a browser
106
125
  once; the saved session is reused automatically.