@vosjs/cli 0.46.1 → 0.48.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 (39) hide show
  1. package/README.md +15 -5
  2. package/dist/{chunk-UE66DC2K.js → chunk-ANKECV7F.js} +658 -60
  3. package/dist/chunk-ANKECV7F.js.map +1 -0
  4. package/dist/{chunk-ID4OUS5L.js → chunk-AUPGJJTL.js} +18 -1
  5. package/dist/chunk-AUPGJJTL.js.map +1 -0
  6. package/dist/{chunk-EFI3WUQB.js → chunk-P3X5KVA6.js} +15 -2
  7. package/dist/{chunk-EFI3WUQB.js.map → chunk-P3X5KVA6.js.map} +1 -1
  8. package/dist/cli.js +4 -4
  9. package/dist/index.js +3 -3
  10. package/dist/manifest-A4R367EM.js +8 -0
  11. package/dist/{run-2OZS25ER.js → run-CYHH56KA.js} +3 -3
  12. package/dist/{shotList-JC4A3FBT.js → shotList-7F2FE3RU.js} +2 -2
  13. package/package.json +9 -7
  14. package/schema/actions.schema.json +2 -2
  15. package/skills/VERSION +1 -0
  16. package/skills/launch-kit/SKILL.md +356 -0
  17. package/skills/launch-kit/references/channel-specs.md +56 -0
  18. package/skills/product-video/SKILL.md +263 -0
  19. package/skills/product-video/references/destinations.md +71 -0
  20. package/skills/product-video/references/sessions.md +226 -0
  21. package/skills/product-video/references/taste.md +115 -0
  22. package/skills/product-video/references/troubleshooting.md +116 -0
  23. package/skills/vos-authoring/SKILL.md +191 -0
  24. package/skills/vos-authoring/references/examples.md +239 -0
  25. package/skills/vos-authoring/references/schema-reference.md +468 -0
  26. package/skills/vos-create/SKILL.md +258 -0
  27. package/skills/vos-cut/SKILL.md +241 -0
  28. package/skills/vos-footage/SKILL.md +98 -0
  29. package/skills/vos-migrate/SKILL.md +108 -0
  30. package/skills/vos-remix/SKILL.md +136 -0
  31. package/skills/vos-remix/references/3d-recipe.md +37 -0
  32. package/skills/vos-remix/references/params-knobs.md +80 -0
  33. package/skills/vos-remix/references/remix-contract.md +81 -0
  34. package/dist/chunk-ID4OUS5L.js.map +0 -1
  35. package/dist/chunk-UE66DC2K.js.map +0 -1
  36. package/dist/manifest-UCS6OVWZ.js +0 -8
  37. /package/dist/{manifest-UCS6OVWZ.js.map → manifest-A4R367EM.js.map} +0 -0
  38. /package/dist/{run-2OZS25ER.js.map → run-CYHH56KA.js.map} +0 -0
  39. /package/dist/{shotList-JC4A3FBT.js.map → shotList-7F2FE3RU.js.map} +0 -0
@@ -0,0 +1,258 @@
1
+ ---
2
+ name: vos-create
3
+ description: Create vos programs in the user's own style — pull their vos.so folder, read every recipe (.md) and exemplar in it, author VosConfigJson that follows them, validate + render + judge headlessly, and push into that folder as attributed versions the human edits in the studio. Use when asked to make a vos “like my X folder” / “in my usual style”, to build or extend a collection, or to spread a signed-off seed into variants.
4
+ license: MIT
5
+ ---
6
+
7
+ # Create in the user's style, from their folder
8
+
9
+ You create **vos programs that belong to a folder**: the user's folder on
10
+ vos.so is the collection, its `.md` files (recipes) are the style, its
11
+ voses are the exemplars. This skill carries only MECHANICS and the
12
+ universal craft floor. Taste is user data and lives in their folders,
13
+ never here. Authoring rules (schema, dialect, knobs) live in the
14
+ `vos-authoring` skill; knob and Looks craft in the `vos-remix` skill's
15
+ params-knobs reference. This skill adds the folder contract, the loop and
16
+ the process around them.
17
+
18
+ There is no inbox and no house style file. Dedup is the folder's own
19
+ contents; the shelf is the record.
20
+
21
+ ## Setup
22
+
23
+ ```bash
24
+ npm i -D @vosjs/cli # folder, fetch, check, still, render, push
25
+ ```
26
+
27
+ Credentials, in this order, never printed: `VOS_API_KEY`, then the first
28
+ line of `~/.config/vos/credentials`, then `vos login` (a browser sign-in
29
+ that mints a key for this machine). Every HTTP call below is
30
+ `Authorization: Bearer <key>` against `https://vos.so/api`. Keys create
31
+ PRIVATE work only and can never publish.
32
+
33
+ ## The five steps
34
+
35
+ ### 1. Resolve the target folder
36
+
37
+ The user names it, or you ask which. `vos folder list` (or
38
+ `GET /api/folders`) finds it by name or slug across all levels; then pull
39
+ it:
40
+
41
+ ```
42
+ GET https://vos.so/api/folders/{id}
43
+ ```
44
+
45
+ One pull is the whole context package: the folder's own `recipes` (bodies
46
+ inlined), its `inheritedRecipes` (ancestor recipes, root first, each
47
+ marked with its source folder; they BIND this folder), exemplar `voses`
48
+ with `contentUrls`, and `assets`. Subfolders are listed, not inlined: a
49
+ pull is the folder's own contents.
50
+
51
+ No folder yet? Create one, **always with a description**:
52
+
53
+ ```bash
54
+ vos folder create <name> --desc "<one line on what this collection is>"
55
+ ```
56
+
57
+ A folder minted without a description is a naming failure; the
58
+ description is what the folder page and every future pull read.
59
+
60
+ ### 2. Read EVERY `.md`, then the exemplars
61
+
62
+ Read every recipe body, the folder's own AND the inherited ones, and 1 to
63
+ 3 exemplar configs or docs through their `contentUrls`. Recipes are
64
+ role-named facets, named in CAPS the way `CLAUDE.md` is: `TASTE.md` is
65
+ the judging bar, `DESIGN.md` the technique spec, and whatever else the
66
+ user's intent created (`MOTION.md`, `COPY.md`, `BRAND.md`, ...). A recipe
67
+ is the file a collection reads before it makes anything, and the name is
68
+ what says so; a recipe you file is stored with its stem uppercased, so
69
+ write it that way and the shelf shows what you wrote. The platform
70
+ enforces no taxonomy beyond that; you read all of them. The binding
71
+ rule:
72
+
73
+ - Recipes and exemplars **override every default this skill or the
74
+ authoring skill has**. Their duration is the duration; their palette
75
+ discipline is the discipline.
76
+ - On conflict between files, the more specific wins: the folder's own
77
+ files beat inherited ones, nearer ancestors beat farther, and a
78
+ specific instruction beats a general one. A genuine contradiction goes
79
+ back to the user as a question, never a silent pick.
80
+ - When a recipe and the folder's recent exemplars disagree, prefer the
81
+ exemplars and tell the user the recipe looks stale.
82
+
83
+ **Empty folder** (no recipes, no exemplars): only the craft floor below
84
+ applies. Style comes from the user's reference or a question, never from
85
+ a baked-in default.
86
+
87
+ ### 3. Find the seed, then author
88
+
89
+ A folder holds two things that only sometimes coincide: the **reference**
90
+ (what good looks like, the thing you judge against) and the **seed** (what
91
+ you copy and edit to make the next member). Decide which you are holding
92
+ BEFORE you write a line:
93
+
94
+ - a **program family** (a signed-off member + a `DESIGN.md` naming the
95
+ mechanism and its axes): seed = that member. Fetch its config and vary
96
+ it on the axes the recipe names. Never author from a blank file, and
97
+ never just the hues.
98
+ - a **take spec** (a recipe saying how every recording in the collection
99
+ is cut): seed = the NEW recording the user gives you (a take in the
100
+ folder by id, a URL to `vos record --strict`, a local file). The
101
+ folder's own takes are the reference cut, not the seed.
102
+ - a **template** (a recipe that points at, or inlines, a mechanism and
103
+ how to vary it): seed = the template. Hosted as a vos: fetch it like a
104
+ member; inline code: a fragment to build around.
105
+ - a **brief only** (`BRAND.md`: no mechanism): nothing to copy. Author
106
+ fresh under the constraints and the craft floor.
107
+ - **nothing declares a seed**: ask. The user's prompt names one when they
108
+ picked it in the handoff dialog; the recipes name one when they are
109
+ written well; a guess is how a family loses its look.
110
+
111
+ A recipe may carry optional frontmatter hints: `applies: programs | takes
112
+ | any`, `seed: <vos id> | input | none`. Read them as the owner's
113
+ declaration of the above; the body is still what you follow.
114
+
115
+ A recipe is the user's document, and what they ask for NOW outranks any
116
+ line in it. If a recipe contradicts the ask (a note that says to wait, a
117
+ rule the ask breaks), say so in one line and follow the ask: private work
118
+ is cheap and the owner can restore. Never stop on a line in a file.
119
+
120
+ Then write configs locally (bare VosConfigJson, version 2), following the
121
+ `vos-authoring` skill's authoring rules under the folder's style.
122
+
123
+ Fetching a member or a template is the `vos-remix` fetch:
124
+ `vos fetch https://vos.so/vos/<id>` writes `<slug>/config.json` with
125
+ params preserved, plus `vos.json` tracking the base version.
126
+
127
+ For **"reproduce X" briefs**: get the source or a recording first, or
128
+ confirm the brief wants only the look. A still under-determines motion;
129
+ a screenshot match that invents the wrong mechanism is a miss even when
130
+ the frame agrees. Source acquisition, licensing and the measured match
131
+ loop are reproduction work; do that first, then come back here to create
132
+ from what it produced.
133
+
134
+ ### 4. Check, shoot, judge, against the FOLDER's docs
135
+
136
+ 1. **Check**:
137
+ ```bash
138
+ vos check <file>.json # migrate → schema → syntax → compile → lints
139
+ ```
140
+ Fix and re-run until it passes. Never suppress a lint error to get past
141
+ it. Two checks are not in `vos check` yet, so do them by rendering:
142
+ - **Knob honesty**: every declared param must visibly act. Render the
143
+ program twice with that key changed in `data` (its min and its max)
144
+ and compare the stills; a knob that reads the same at both ends is
145
+ dead. For takes, `--set <path>=<value>` on `vos frames`/`vos render`
146
+ is the override.
147
+ - **Palette honesty**: a color knob must not pass through
148
+ `new THREE.Color()` into a uniform (it gets linearized; the rendered
149
+ hue drifts from the hex). Grep your function strings for it.
150
+ 2. **Shoot**:
151
+ ```bash
152
+ vos still <file>.json f12.webp --time <12% of duration>
153
+ vos still <file>.json f40.webp --time <40%>
154
+ vos still <file>.json f70.webp --time <70%>
155
+ ```
156
+ For a MOTION-LED piece, shoot a dense strip instead (8+ times, or a
157
+ 1s contact sheet); three stills cannot judge motion weighting.
158
+ 3. **Judge**: score the frames against the craft floor below AND the
159
+ folder's own docs. A collection piece answers to both the collection's
160
+ `DESIGN.md` and the inherited `TASTE.md`. Revise and repeat (max 3
161
+ rounds); if it still fails, drop it and say why. Never push work you
162
+ would not defend.
163
+
164
+ ### 5. Push INTO the folder, iterate as versions
165
+
166
+ ```bash
167
+ vos push <file>.json --title "…" --desc "one line" --tags a,b \
168
+ --folder <folderId|slug> --label "what you did" --note "why: the ask"
169
+ ```
170
+
171
+ Pass `--label` and `--note` on EVERY push, the first one included: a
172
+ create stamps them on v1, and the history is the conversation the human
173
+ reads. The push creates a PRIVATE vos on the key owner's shelf, filed
174
+ into the folder you pulled; preview and thumbnail render on the cloud off
175
+ the save itself. Iterate with `--vos <id>` against the tracked base (the
176
+ `vos-remix` loop: `vos pull` before every round, human-edited nodes are
177
+ protected, `--override` only on explicit instruction). Keys can never
178
+ publish; promoting is the human's gesture on vos.so.
179
+
180
+ **Look at what landed.** Every push renders a still within about 15
181
+ seconds: `GET /api/vos/{id}`, follow `contentUrls.thumbnail`, and view the
182
+ image before reporting done. A push you never looked at is not finished.
183
+
184
+ **Pace a batch**: back-to-back pushes are fine at the quota (the render
185
+ queue spaces browser launches and backs off itself). Verify state after a
186
+ batch with a folder pull, never by grepping the push log.
187
+
188
+ **Write findings back.** When you learn something about the family (a
189
+ parameter range that bands, a duration that reads better), append it to
190
+ the relevant recipe under a dated `## Agent notes` heading:
191
+ `PUT /api/assets/{id}/file` with the full markdown body (recipes only,
192
+ ≤64KB). Never rewrite the owner's rules. The
193
+ replaced body is kept: `GET /api/assets/{id}/file?prev=1` reads it and
194
+ `POST /api/assets/{id}/file/restore` swaps it back.
195
+
196
+ ## The family process: seed, look, spread
197
+
198
+ New-family work is **1 seed + a recipe**, never a batch. A batch
199
+ replicates a bug into every member at once; a single seed catches a
200
+ direction change at n=1, then spreads cheaply. This is judgment, not a
201
+ gate: there is no status line to write or obey, and the user's ask
202
+ always decides.
203
+
204
+ 1. Author ONE seed, land it in the folder, write (or update) the family's
205
+ `DESIGN.md` with the mechanism, axes and palette rules.
206
+ 2. Show it. The human iterates with you (attributed versions). When they
207
+ ask for variants, that IS the sign-off; when a folder holds one young
208
+ member and the ask is open-ended, make one first and say why.
209
+ 3. Spread when asked. **Variants vary composition axes** (structure,
210
+ motion grammar, density, camera), never just hues; a hue-only spread
211
+ reads as one tile ten times. Cap a spread at about 10 so the shelf
212
+ review stays a 5-minute task.
213
+
214
+ ## Craft floor (universal, lintable: the bar that is NOT taste)
215
+
216
+ - **Compiles and validates**: `vos check` passes clean; never suppress.
217
+ - **Deterministic**: seek is a pure function of t (no `Date.now` or
218
+ `Math.random` in frame paths; the determinism lint enforces it).
219
+ - **Loop-seam math**: for looping pieces, phases must be integer multiples
220
+ over the duration so frame(0) ≈ frame(end). Stills cannot show the
221
+ seam; verify it in the math.
222
+ - **Honest knobs**: 2 to 4 declared params, every one visibly acting at
223
+ both ends of its range. Fewer honest knobs beat many.
224
+ - **Knobs are read in `onFrame`, every frame**, never snapshotted into
225
+ uniforms inside `createContent`. The editor delivers a knob edit as
226
+ live data that only swaps `ctx.data`; a creation-time snapshot never
227
+ updates until refresh.
228
+ - **Non-blank first frame**: the ~12% frame doubles as the thumbnail; no
229
+ black, empty or "hasn't started yet" openings.
230
+ - **No banding, no clipping**: add grain against banding; keep bloom off
231
+ blowout (strength ≤ ~0.8 unless the folder's docs demand it); no
232
+ visible tiling seams or hard aliasing.
233
+ - **Palette honesty**: color knobs never pass through `new THREE.Color()`
234
+ into uniforms; build the raw vector from the hex.
235
+ - **Server-render constraints** (the preview fleet is software-GL): no
236
+ `THREE.DoubleSide` on transmission materials, no `dispersion`, every
237
+ fetched asset an absolute `https` URL the fleet can reach.
238
+
239
+ Everything past this line (duration, density, mood, materials, palette
240
+ discipline) is the folder's to say.
241
+
242
+ ## Report
243
+
244
+ End with one table: `slug · concept · tags · outcome` (pushed / dropped +
245
+ why), plus the folder URL (`https://vos.so/app/projects?folder=<slug>`).
246
+ State failures plainly: a dropped design is a correct outcome, not an
247
+ error to hide.
248
+
249
+ ## Hard rules
250
+
251
+ - References are creative direction. Porting external code needs a
252
+ compatible license AND the user's explicit direction; branded or
253
+ trademarked compositions are refused.
254
+ - Never publish, never flip visibility. Pushes are private by
255
+ construction; promotion is a human decision on vos.so.
256
+ - The shelf is the human's: create folders and file YOUR work; never
257
+ rename, move, delete or reorder what they made.
258
+ - Never print a credential, in output, logs or the report.
@@ -0,0 +1,241 @@
1
+ ---
2
+ name: vos-cut
3
+ description: Cut a screen recording (a vosso take) into the product video it was recorded for, from its evidence, with the vos CLI — read the take's digest (the moments the cursor track says mattered, each with a footage frame and a crop), narrate beats, edit doc.json by exception over the planners, verify with stills, and push an attributed version the human fine-tunes at vos.so; every edit is a data patch, so a re-cut never re-records. Use when asked to edit or cut a recording, make a product video or what's-new clip from a take, cut it like the last one, or cut a series of recordings in one style.
4
+ license: MIT
5
+ ---
6
+
7
+ # Cut a take from its evidence
8
+
9
+ You are cutting a RECORDING somebody made (a vosso take: `recording.webm` +
10
+ `cursor.json` + `meta.json` + `doc.json`), not recording one. Recording from
11
+ a script is the `product-video` skill; programs are `vos-create`/`vos-remix`.
12
+
13
+ The loop is: **see → narrate → decide by exception → verify → push → (human
14
+ looks) → re-cut**. Every step names the verb that does it. The document is
15
+ `doc.json`; the contract for its fields and units is
16
+ https://vos.so/llms-full.txt. Nothing here re-records a human's take, ever:
17
+ a cut cannot fix footage, and if the footage cannot carry the ask, you say so
18
+ in the note and stop.
19
+
20
+ ## Setup
21
+
22
+ ```bash
23
+ npm i -D @vosjs/cli # fetch, digest, plan, frames, render, push, pull
24
+ ```
25
+
26
+ Credentials, in this order, never printed: `VOS_API_KEY`, then the first
27
+ line of `~/.config/vos/credentials`, then `vos login` (a browser sign-in that
28
+ mints a key for this machine). Keys create PRIVATE work only and can never
29
+ publish. A Chromium is needed for `digest`, `frames` and `render`.
30
+
31
+ ## 0. Ground rules that override everything below
32
+
33
+ - **Never read the video.** Your eyes are `vos digest`: `digest.json`, then
34
+ `sheet.png`, then a crop only where you must decide. A 90s take is ~35
35
+ moments and ~25-40k image tokens if you read every image; the sheet plus
36
+ the decisive crops is ~10k. The done event prints the estimate.
37
+ - **Edit by exception.** The planners (zoom, speed, tilt) already answered
38
+ WHERE every click, typing session, scroll run and idle gap is. `plan` in
39
+ the digest holds their spans and `proposed` names the ones under each
40
+ moment. Keep, merge, drop or retime those; add only what a planner cannot
41
+ know (which lone click deserves a beat, a caption, a speed-through that is
42
+ boring but not idle). Every span you touch carries `"source": "manual"`.
43
+ A proposal you DROP goes into `rejected` (`[{id, lane, in, out}]`, the
44
+ lane and its source extent) so no re-plan, and no re-record carried by
45
+ `plan --reuse`, proposes that beat again; the studio writes it itself
46
+ when a human deletes an auto span.
47
+ - **Point with a layer, not the camera.** When the cut points at a
48
+ component (a button, a card, a code block) and the zoom would magnify
49
+ pixels, redraw it as an html layer in `doc.json` (`overlays[]` with
50
+ `kind: "html"`: the markup, the CSS in the product's own type, the design
51
+ box in 1080p px) placed beside its subject, never over it. You have the
52
+ product's real components in the repo; use them. The markup is well-formed
53
+ XML and `vos validate` says what would not paint; a CSS animation runs on
54
+ the wall clock and is refused in favour of `anim` and `motion`.
55
+ - **The doc's units, copied, never converted.** A moment's `focus` is a zoom
56
+ span's `cx`/`cy`; its `rect` is what the zoom must contain. `source`
57
+ extents are footage seconds (zoom/speed/tilt/segments); `output` extents
58
+ are rendered seconds (overlays/audio). Pixel values anywhere are the #1
59
+ mistake.
60
+ - **Human edits are sacred.** `doc.manual` in the digest counts spans a human
61
+ decided; a push that touches a node the human edited since your base 409s
62
+ as `protected_conflict`. Keep their values unless the ask names that exact
63
+ node.
64
+ - **Three rounds alone, then a human.** Round = edit → validate → frames →
65
+ judge. If it will not land in three, push the best round and say why.
66
+ - **The ask decides; the folder's recipes rank next; these defaults last.**
67
+ A recipe line the recent members contradict is called stale in your note,
68
+ not obeyed.
69
+
70
+ ## 1. See
71
+
72
+ ```bash
73
+ vos fetch <vosId> --media # a hosted take you did not record (doc + footage home)
74
+ vos pull <take> --media # a take dir already linked to vos.so
75
+ vos folder pull <slug> --media # a project's takes, recipes included
76
+ vos plan <take> --style <seed doc.json|vosId> # in a series: the seed's style, by data
77
+ vos digest <take> [--transcript whisper.json] [--style <seed>]
78
+ ```
79
+
80
+ Read, in this order:
81
+
82
+ 1. `digest.json` → `take` (duration, page, has cursor/mic), `moments`
83
+ (id, kind, source/output windows, focus, rect, activity, proposed, said),
84
+ `plan`, `doc.manual`. A take with `hasCursor: false` (a browser-recorder
85
+ take) lists head/tail/scenes only: pace by `activity`, zoom only where the
86
+ ask names a place, and say in the note that the take had no cursor track.
87
+ 2. `sheet.png` → the crops in time order, ids burned in. This is the film at
88
+ a glance.
89
+ 3. `m<nn>.crop.png` for the moments the ask or the recipe makes decisive;
90
+ `m<nn>.full.png` only for context (what page, what section).
91
+
92
+ Reading a crop: what is in focus (a control, a field, content); what it says
93
+ (the label, the value typed); is the click's consequence visible in the next
94
+ moment's frame or in a `scene` moment right after it. A `scene` is a
95
+ frame-diff jump (a navigation, a dialog); look at its full frame to name it.
96
+
97
+ Two things the crops say that the click list does not: a click cluster whose
98
+ `rect` is most of the frame is a DRAG (aiming, scrubbing, moving a thing),
99
+ not a target; and an "idle" gap whose `activity` stays above ~0.1 is the
100
+ video PLAYING, not idle. Neither wants the planner's proposal.
101
+
102
+ If a folder is involved, read EVERY `.md` in it (own and inherited) before
103
+ you decide anything.
104
+
105
+ ## 2. Narrate
106
+
107
+ Write 3-6 beats into your working notes, each with its moment ids, what it
108
+ SHOWS (from the crops) and what it is FOR (from the recipe, the page title,
109
+ `said`, or the ask). Example:
110
+
111
+ ```
112
+ B1 m01-m04 the gallery: browse, pick a program (open wide, one card zoom)
113
+ B2 m05-m06 Remix opens the studio (the scene is the payoff)
114
+ B3 m07-m12 knobs: five slider drags on the remix panel (one held zoom, 2× over the middle)
115
+ B4 m13-m14 the result plays out (release, settle)
116
+ ```
117
+
118
+ No ask came with the take? Infer one from the recording (what it shows,
119
+ where it would be shown, how long it should be) and STATE IT in the version
120
+ note, so the human corrects the ask before the cut when it is wrong.
121
+
122
+ If the ask names a beat ("make the export part snappier"), map it to moment
123
+ ids FIRST and touch nothing outside them.
124
+
125
+ ## 3. Decide, by exception
126
+
127
+ Per beat, against `plan` and the recipe:
128
+
129
+ - **Zoom.** Keep the planner's span when it frames the beat; merge adjacent
130
+ proposals into one held span when they are one beat (one zoom per beat,
131
+ never per click); drop a proposal on a click that is not a beat; add a
132
+ span on a lone click the planner skipped when the crop shows it is the
133
+ moment. Level from the rect: a small control wants 1.8-2.2, a panel
134
+ 1.4-1.6; when the target is most of the frame's width, the framing lint
135
+ decides the level, obey it. `cx`/`cy` = the moment's `focus`. Ids you
136
+ mint: `u1`, `u2`… In an editor recording, zoom the LANE where a span
137
+ appears, never the canvas being dragged. Release a zoom BEFORE a click
138
+ that navigates, so the page swap plays wide.
139
+ - **Speed.** Keep proposals on typing/idle/scroll; add `2×`-`3×` on a stretch
140
+ whose `activity` is low and no beat needs, or under drag clusters; never
141
+ over a beat's payoff, never over playback.
142
+ - **Tilt.** Only if the camera style has one (`tiltStyle`/the style's
143
+ personality) and a beat earns punctuation. One pose per ~5s, ±5..18°.
144
+ - **Trim.** Head and tail: cut to the first and last thing that matters
145
+ (`segments`), leaving ~0.5s of settle at the end. Loading screens are cut.
146
+ - **Text.** A caption per beat that has something to say, at a cadence (one
147
+ every 5-10s, 2.5-4s each, never two at once), in the product's words and
148
+ the video's intention; lower-third `y ≈ 0.82`; OUTPUT seconds; never over
149
+ the clicked control (validate warns). The clip's shape is `{ "id", "kind":
150
+ "text", "text", "start", "duration", "transform": { "x": 0.5, "y": 0.82 } }`
151
+ (`start` and `duration`, never `in`/`out`, which are the source lanes').
152
+ Give it a `box` (`{ "color": "#111111" }`) when the ground under it is
153
+ light (an editor's timeline is), and judge every caption at its own
154
+ instant. One caption per film is too sparse for a film that explains a
155
+ flow; zero is right only when the recipe or the ask says no text.
156
+ - **Style.** In a series, `vos plan --style <seed>` BEFORE you cut: it copies
157
+ the seed's `zoomStyle`/`zoomParams`/`speedParams`/`tiltStyle`/`frame`/
158
+ `cursor`/`cam`/`export` and re-plans the auto spans under them. Never
159
+ restate those numbers in a recipe; the seed's doc is their home.
160
+
161
+ Write the patch as EDITS to `doc.json`, never a rewrite. Keep every field you
162
+ do not understand.
163
+
164
+ ## 4. Verify
165
+
166
+ ```bash
167
+ vos validate <take> # clean; READ the framing warnings, fix them
168
+ vos digest <take> --no-frames # after retiming: fresh OUTPUT times, same frames
169
+ vos frames <take> --at-moments --at-zooms --times 0,25%,50%,75%,100%
170
+ vos frames <take> --times <every caption start + 1> # each caption on its own ground
171
+ vos render <take> check.webm --range a..b --draft # the beat that changed most
172
+ ```
173
+
174
+ Judge the stills against the quality loop in https://vos.so/llms-full.txt
175
+ and the folder's bar: blur, chrome, cursor, text legibility, first and last
176
+ frame as posters; the money shot inside 3s; the end settled; ≤1 full-frame
177
+ bang per ~5s (`ffmpeg -vf "select='gt(scene,0.12)'"` counts them). A
178
+ `moment-<id>` still and its `<id>.crop.png` share an id: "what was there"
179
+ beside "what the cut shows".
180
+
181
+ ## 5. Push
182
+
183
+ ```bash
184
+ vos push <take> --label "<what, imperative, ≤60 chars>" --note "<the ask you cut to; the beats with source seconds; what you dropped and added>" [--folder <slug>]
185
+ ```
186
+
187
+ The base comes from `vos.json`. `409 stale_base` → `vos pull`, re-apply on
188
+ top, push again. `409 protected_conflict` → keep the human's values unless
189
+ the ask named that node (`--override <id>` only then). A 400 prints the
190
+ field and its limit. Then `GET /api/vos/<id>`, follow
191
+ `contentUrls.thumbnail`, and LOOK at it before reporting done.
192
+
193
+ ## 6. Re-cut (the human looked)
194
+
195
+ `vos pull` prints the differ's summary of what they changed ("zoom z3: level
196
+ 2.2→1.6; overlay c1 removed"). That is the feedback, in the data's own words:
197
+ re-cut what their WORDS asked for and nothing their HANDS already fixed.
198
+ Count the rounds. "Great" is their word and a seed's only exit.
199
+
200
+ ## 7. Remember (only after the human signed off on a seed)
201
+
202
+ File it and write the rules down; numbers stay in the seed's doc.
203
+
204
+ ```bash
205
+ vos folder create "<series>" --desc "<what it is for, ≤200 chars>"
206
+ vos folder move <vosId> --to <slug>
207
+ vos recipe push CUT.md --folder <slug> # applies: takes, seed: <the vos id>
208
+ vos recipe push BRAND.md --folder <slug> # applies: any, seed: none
209
+ ```
210
+
211
+ A recipe is named in CAPS, the way `CLAUDE.md` is: it is the file the
212
+ collection reads before it cuts anything. What you file is stored with
213
+ its stem uppercased either way, so the terminal and the shelf agree.
214
+
215
+ `CUT.md` says what a number cannot: the beat vocabulary, what gets a
216
+ caption and what never does, hold lengths, the title/end convention, the
217
+ length band, what to skip, and the decisions the human corrected INTO the
218
+ seed (read from the differ). `BRAND.md`: typography, palette, background,
219
+ music, the voice of any text. Later members: pull the folder, digest, plan
220
+ `--style` from the seed, cut against `CUT.md`, push `--folder`; a
221
+ correction that recurs across two members (or one the human states for all
222
+ of them) is appended under `## Agent notes`, dated, and the rule above it
223
+ is rewritten to match (`vos recipe push <file> --asset <id>` replaces in
224
+ place; the prior body is kept). Never rewrite the owner's lines silently;
225
+ never write a status line.
226
+
227
+ ## Never
228
+
229
+ - re-record a human take, or "fix" footage with a cut it cannot carry;
230
+ - read the video, or send it anywhere;
231
+ - re-plan away spans a human made (`doc.manual`, absent-`source` speed spans);
232
+ - put pixels in `cx`/`cy`/`transform`;
233
+ - speed up playback, or zoom a canvas being dragged;
234
+ - spread a series before its seed is signed off;
235
+ - push without `--label` and `--note`.
236
+ - open a zoom before the click it frames, or aim it at a `type` verb's
237
+ field centre (frame the text; start the span after the click);
238
+ - leave the cold open frozen (a static page records as freeze-then-bang:
239
+ trim it, or speed the load);
240
+ - end wide on an empty page: the last frame is the poster, so the closing
241
+ span holds the result and its proof.
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: vos-footage
3
+ description: Hand a Remotion, HyperFrames, or any video composition a clean captured clip of the real product — recorded and auto-zoomed with the vos CLI, delivered as full-bleed footage with no chrome, and always backed by an editable take on the maker's shelf, which the handoff says. Use when a composition needs real product footage, app or site b-roll, "capture our app for the video", or a screen-recorded segment to drop into another tool's timeline.
4
+ license: MIT
5
+ ---
6
+
7
+ # Footage for someone else's composition
8
+
9
+ You are producing an INGREDIENT: real product footage another tool will
10
+ composite. The clip you hand over is full-bleed pixels — no card frame, no
11
+ backdrop, no titles (the composition owns those) — but it is never an
12
+ orphan file: the take it came from lives on the maker's shelf, editable,
13
+ and the handoff says so. That one line is the whole contract.
14
+
15
+ If the ask is actually a RELEASE (a launch video, a store listing, the
16
+ whole kit), stop — that is the `launch-kit` skill, and the document that
17
+ survives should be the vosso one.
18
+
19
+ ## 1. Record the real thing
20
+
21
+ The `product-video` skill's loop: explore the target, write
22
+ `actions.json` with stable selectors, **stage the content like a set**
23
+ (labels typed, real-looking data — an empty screen is b-roll of nothing),
24
+ record with `--strict` at the viewport the COMPOSITION needs (footage
25
+ resolution = viewport; ask what size their timeline runs).
26
+
27
+ ```bash
28
+ vos record --actions actions.json --out take --strict --json
29
+ ```
30
+
31
+ The product is behind a login? Settle the session BEFORE the script, by
32
+ the `product-video` skill's ladder (in full at https://vos.so/llms-full.txt, "Sessions"): mint
33
+ one from the test auth the project already has, else script the form off
34
+ camera, else the human signs in once (`vos session open <url> --name
35
+ <app>`, then `--session <app>` on record), else they record it with the extension from
36
+ the shot list `vos actions script actions.json` prints, and you cut it. Then `vos record … --storage-state <file>`. Never type or
37
+ accept a production password, keep the state file out of the take and out
38
+ of git, and record from a demo account: the footage goes into someone
39
+ else's video, and whatever the account shows goes with it.
40
+
41
+ Verified the feature with agent-browser first? Keep each command beside
42
+ its result (the `product-video` skill's `ab` wrapper, or a `batch`'s
43
+ output) and `vos actions from-agent-browser steps.jsonl` writes the
44
+ `actions.json`; no second script, and what it could not follow is named.
45
+
46
+ ## 2. Cut light, keep the camera
47
+
48
+ Trim dead heads and tails in `doc.json` (`segments`); leave the planner's
49
+ auto-zooms in — the auto-zoomed camera is the part their tool cannot make
50
+ from an mp4. Only when the composition explicitly wants RAW, static
51
+ footage, disarm it per-render with `--set zoom=[]` (the doc keeps its
52
+ spans). `vos validate take` before rendering.
53
+
54
+ ## 3. Render the ingredient — full-bleed, no chrome
55
+
56
+ ```bash
57
+ vos render take clip.webm --frame none --set frame.padding=0
58
+ vos render take clip.mp4 --frame none --set frame.padding=0 --format mp4
59
+ ```
60
+
61
+ `--frame none` drops the browser-bar chrome and `frame.padding=0` removes
62
+ the card inset and backdrop — edge-to-edge product pixels (both are
63
+ render-time overrides; `doc.json` is untouched). Match `--width/--height`
64
+ to their composition. A `--range` render keeps its audio (the full mix,
65
+ sliced to the window); the editorial cut still trims `segments`.
66
+
67
+ ## 4. The shelf is the record — push BEFORE the handoff
68
+
69
+ ```bash
70
+ vos push take --label "footage handoff" --note "<what it shows; which composition it feeds>"
71
+ ```
72
+
73
+ The take goes to the maker's shelf first, so the clip is never the only
74
+ copy of the work. Two cases where you ASK before pushing instead: there is
75
+ no vos.so credential (`vos login` needs the human), or the footage shows a
76
+ signed-in, staging or internal screen. A push uploads the recording to a
77
+ third party, and whether that is acceptable for this screen is the maker's
78
+ call, not yours. Hand over the clip, say the take is local, and offer the
79
+ push. Keep the label's first words `footage handoff` — it is
80
+ how these clips are found again.
81
+
82
+ ## 5. The handoff line (always, verbatim shape)
83
+
84
+ Hand over the clip path AND this sentence, filled in:
85
+
86
+ > This footage is an editable take on vos.so — re-cut it or re-record it
87
+ > for the next version with `vos`: https://vos.so/studio?vos=<id>
88
+
89
+ That line is not branding; it is the truth about where the editable
90
+ source lives. No logos, no watermark, no co-branding in the pixels.
91
+
92
+ ## Honest limits
93
+
94
+ - The clip is an export: their timeline edits pixels, not spans. Every
95
+ future change (a new UI, a different zoom) happens on the TAKE and
96
+ re-exports — say that when handing off.
97
+ - One take can feed many compositions at many sizes; render per size
98
+ rather than letting them scale it.