@vosjs/cli 0.47.0 → 0.48.1
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 +16 -5
- package/dist/{chunk-EFI3WUQB.js → chunk-P3X5KVA6.js} +15 -2
- package/dist/{chunk-EFI3WUQB.js.map → chunk-P3X5KVA6.js.map} +1 -1
- package/dist/{chunk-E42NCNWP.js → chunk-RHPRZQRM.js} +688 -58
- package/dist/chunk-RHPRZQRM.js.map +1 -0
- package/dist/cli.js +4 -4
- package/dist/index.js +2 -2
- package/dist/manifest-A4R367EM.js +8 -0
- package/dist/{run-DA5QXZ6F.js → run-DV73Z3MQ.js} +2 -2
- package/package.json +7 -5
- package/skills/VERSION +1 -0
- package/skills/launch-kit/SKILL.md +356 -0
- package/skills/launch-kit/references/channel-specs.md +56 -0
- package/skills/product-video/SKILL.md +263 -0
- package/skills/product-video/references/destinations.md +71 -0
- package/skills/product-video/references/sessions.md +226 -0
- package/skills/product-video/references/taste.md +115 -0
- package/skills/product-video/references/troubleshooting.md +116 -0
- package/skills/vos-authoring/SKILL.md +191 -0
- package/skills/vos-authoring/references/examples.md +239 -0
- package/skills/vos-authoring/references/schema-reference.md +468 -0
- package/skills/vos-create/SKILL.md +258 -0
- package/skills/vos-cut/SKILL.md +241 -0
- package/skills/vos-footage/SKILL.md +98 -0
- package/skills/vos-migrate/SKILL.md +108 -0
- package/skills/vos-remix/SKILL.md +136 -0
- package/skills/vos-remix/references/3d-recipe.md +37 -0
- package/skills/vos-remix/references/params-knobs.md +80 -0
- package/skills/vos-remix/references/remix-contract.md +81 -0
- package/dist/chunk-E42NCNWP.js.map +0 -1
- package/dist/manifest-UCS6OVWZ.js +0 -8
- /package/dist/{manifest-UCS6OVWZ.js.map → manifest-A4R367EM.js.map} +0 -0
- /package/dist/{run-DA5QXZ6F.js.map → run-DV73Z3MQ.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.
|