GitHub CLI 2.99 added --attach on pr/issue create/edit/comment: local file
references in the body are uploaded to user-attachments and rewritten in
place. That replaces the blob-upload + poster-frame workaround on GitHub
surfaces entirely.
format.mjs now defaults to attach mode (no --url-map): images keep the
side-by-side tables with ./relative refs; videos move to their own line
under a bold label, verified against gh 2.99 rendering:
- own-line video ref → bare attachment URL → inline player
- video ref in a table cell → demoted to a plain link
- <video> tags → never rewritten (final-URL trick documented as advanced)
Adds --attach-list (feeds the gh command), keeps hosted mode (--url-map,
poster→mp4 cells) for non-GitHub surfaces, and updates SKILL.md's publish
flow + requirements (gh >= 2.99, 10MB image / 100MB video limits).
The judgment (targeting, what 'before' means, stateful UI, verification)
lives in SKILL.md; scripts/ keeps only what must be deterministic:
- capture.mjs — parity engine: identical viewport/waits/timing across 1-2
URLs × N viewports; --record <s> for video (mp4 + poster via ffmpeg);
emits manifest.json. Positional args survive as the frozen bin alias.
- format.mjs — canonical PR block: side-by-side tables, poster→mp4 video
cells (GitHub can't inline-play external video), after-only 'Preview'
mode for net-new pages, attribution + idempotent marker comments.
- prewarm.mjs — idempotent daemon/viewport warm-up.
- upload.mjs — Vercel Blob via BLOB_READ_WRITE_TOKEN → URL map.
Scripts are zero-dependency .mjs (run from a raw skills-add checkout, no
build), version with the SKILL.md, and promise no interface stability.
Removes src/ library, the flag-rich CLI, shell adapters, and their tests;
npm keeps publishing the skill for semver pinning in agent sandboxes.