Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ permissions:
pull-requests: write
jobs:
dogfood:
# The action run on itself: record vos.so's own CLI page, deliver the
# store set, verify it, and on a pull request keep the comment. Only a
# The action run on itself: record vos.so's own agents page, deliver the
# README loop, verify it, and on a pull request keep the comment. Only a
# push to main versions the tracked vos in test/vos.json (the dogfood
# take on the vos.so shelf): a pull request run gets no key, so two
# branches never race for the same base, and the base main pushes from
Expand All @@ -23,7 +23,7 @@ jobs:
with:
actions: test/actions.json
doc: ''
channels: cws,og
channels: github
release: ci-${{ github.run_number }}
tracking: test/vos.json
key: ${{ github.event_name == 'push' && secrets.VOS_API_KEY || '' }}
Expand Down
17 changes: 8 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# vos release media, on every pull request

A GitHub Action that records the real product in CI, cuts the release's media from it (store screenshots, cards, the README loop, the demo), verifies every asset against its channel spec, pushes the take to [vos.so](https://vos.so), and keeps **one comment on the pull request** with the watch page and the kit. The next release is a re-render of the same click script, not a re-shoot.
A GitHub Action that records the real product in CI, cuts the release's videos from it (the README loop, the feed and vertical cuts, the demo), verifies every cut against its channel spec, pushes the take to [vos.so](https://vos.so), and keeps **one comment on the pull request** with the watch page and the kit. The next release is a re-render of the same click script, not a re-shoot.

```yaml
name: release media
Expand Down Expand Up @@ -29,12 +29,12 @@ What lands on the pull request:
>
> **Watch** https://vos.so/vos/… (v3) · **edit** https://vos.so/studio?vos=… · `vos pull` brings studio edits back.
>
> | Channel | Asset | Size | Bytes | Length | Moment |
> | --- | --- | --- | --- | --- | --- |
> | cws | screenshot | 1280x800 | 260 KB | | 14.5 s |
> | github | readme-loop | 1920x1080 | 880 KB | 16.0 s | |
> | Channel | Asset | Size | Bytes | Length |
> | --- | --- | --- | --- | --- |
> | github | readme-loop | 1920x1080 | 880 KB | 16.0 s |
> | x | feed-cut | 1920x1080 | 4.1 MB | 42.0 s |
>
> **Verifier:** 0 problems across 11 assets, re-measured from their bytes.
> **Verifier:** 0 problems across 2 assets, re-measured from their bytes.

The comment is found by its marker and updated in place, so a pull request with ten pushes has one comment, not ten. Reviewers, QA and marketing sign off on a link instead of pulling the branch. The same run on a tag is the release.

Expand All @@ -45,7 +45,6 @@ media/
actions.json the click script (the next release's script too)
doc.json the signed-off cut (zooms, trims, speed, all data); carried onto new footage by vos plan --reuse
vos.json which vos on the shelf the pushes version
poster/ the poster documents the card destinations render from, one per aspect class, optional
BRAND.md the brand kit; write it once with `vos brand https://your.app`
```

Expand All @@ -57,7 +56,7 @@ Start with the [launch-kit skill](https://github.com/vosjs/skills) (`npx skills
| --- | --- | --- |
| `actions` | `media/actions.json` | The click script `vos record` drives. |
| `doc` | `media/doc.json` | The committed cut to carry onto the new footage. Skipped when the file is absent. |
| `channels` | `cws,og,github` | The channel set `vos deliver` renders (`cws,producthunt,x,linkedin,og,github,youtube` or `all`). |
| `channels` | `github` | The channel set `vos deliver` renders (`youtube,x,shorts-linkedin,github` or `all`). A cut longer than the take allows is skipped with the reason. |
| `release` | tag, or `pr-<n>` | The name on the kit and the push label. |
| `key` | | A vos.so content key. Without one the take is not pushed; the kit and the comment still land. |
| `tracking` | `media/vos.json` | Which vos the pushes version. After a push the action writes the new base back to this file; commit it (a step in your workflow, or a bot commit) or the next push is refused as a stale base. |
Expand All @@ -68,7 +67,7 @@ Outputs: `kit`, `vos-id`, `version`, `watch-url`.

## What it refuses

`vos record --strict` fails the job on a skipped selector instead of shipping around it. A push against a stale base fails with the changelog of what changed on the shelf. A kit that fails its own verifier (`vos validate`) fails the job after the comment says why. Store uploads stay yours: the kit is an artifact on the run, never uploaded to a store.
`vos record --strict` fails the job on a skipped selector instead of shipping around it. A push against a stale base fails with the changelog of what changed on the shelf. A kit that fails its own verifier (`vos validate`) fails the job after the comment says why. Uploads stay yours: the kit is an artifact on the run, never uploaded anywhere for you.

MIT. The CLI it installs, `@vosjs/cli`, is MIT too.

Expand Down
10 changes: 5 additions & 5 deletions action.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
name: vos release media
description: >-
Record the real product in CI, cut the release's media from it (store
screenshots, cards, the README loop, the demo), verify every asset against
its channel spec, push the take to vos.so, and keep one comment on the pull
Record the real product in CI, cut the release's videos from it (the README
loop, the feed and vertical cuts, the demo), verify every cut against its
channel spec, push the take to vos.so, and keep one comment on the pull
request with the watch page and the kit. The next release is a re-render,
not a re-shoot.
author: vosso
Expand All @@ -18,8 +18,8 @@ inputs:
description: The committed cut to carry onto the new footage (vos plan --reuse --from). Skipped when absent.
default: media/doc.json
channels:
description: The channel set vos deliver renders (cws,producthunt,x,linkedin,og,github,youtube or all).
default: cws,og,github
description: The channel set vos deliver renders (youtube,x,shorts-linkedin,github or all).
default: github
release:
description: The release name stamped on the kit and the push label. Defaults to the tag, or pr-<number>.
default: ''
Expand Down
6 changes: 2 additions & 4 deletions scripts/comment.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,9 @@ if (push?.vosId) {
)
}
if (kit?.assets?.length) {
lines.push('| Channel | Asset | Size | Bytes | Length | Moment |', '| --- | --- | --- | --- | --- | --- |')
lines.push('| Channel | Asset | Size | Bytes | Length |', '| --- | --- | --- | --- | --- |')
for (const a of kit.assets) {
lines.push(
`| ${a.channel} | ${a.asset}${a.source === 'poster' ? ' (poster)' : ''} | ${a.w}x${a.h} | ${kb(a.bytes)} | ${secs(a.seconds)} | ${a.frameTime !== null && a.frameTime !== undefined ? `${a.frameTime.toFixed(1)} s` : ''} |`,
)
lines.push(`| ${a.channel} | ${a.asset} | ${a.w}x${a.h} | ${kb(a.bytes)} | ${secs(a.seconds)} |`)
}
lines.push('')
}
Expand Down
4 changes: 2 additions & 2 deletions test/actions.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"url": "https://vos.so/cli",
"url": "https://vos.so/agents",
"viewport": { "width": 1280, "height": 800 },
"steps": [
{ "id": "open", "do": "wait", "ms": 1200 },
Expand All @@ -9,6 +9,6 @@
{ "id": "scroll", "do": "scroll", "dy": 700 },
{ "id": "settle", "do": "wait", "ms": 1200 },
{ "id": "section", "do": "hover", "selector": "h2", "ms": 900 },
{ "id": "end", "do": "wait", "ms": 1500 }
{ "id": "end", "do": "wait", "ms": 6000 }
]
}
Loading