@vosjs/cli 0.87.1 → 0.88.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.
- package/README.md +16 -2
- package/dist/{chunk-7A3PZARL.js → chunk-BDFC2L2O.js} +2 -2
- package/dist/chunk-BDFC2L2O.js.map +1 -0
- package/dist/{chunk-ACWV3Y6Y.js → chunk-BHWDA2KG.js} +408 -220
- package/dist/chunk-BHWDA2KG.js.map +1 -0
- package/dist/cli.js +4 -4
- package/dist/index.js +2 -2
- package/dist/manifest-E4KFN42P.js +8 -0
- package/dist/{run-OT54QJ4T.js → run-B52VR6J6.js} +4 -2
- package/package.json +4 -3
- package/dist/chunk-7A3PZARL.js.map +0 -1
- package/dist/chunk-ACWV3Y6Y.js.map +0 -1
- package/dist/manifest-OLVFUZTW.js +0 -8
- /package/dist/{manifest-OLVFUZTW.js.map → manifest-E4KFN42P.js.map} +0 -0
- /package/dist/{run-OT54QJ4T.js.map → run-B52VR6J6.js.map} +0 -0
package/README.md
CHANGED
|
@@ -34,7 +34,7 @@ Until 0.9 the take pipeline and the vos.so verbs shipped separately as `@vosso/v
|
|
|
34
34
|
|
|
35
35
|
## Requirements
|
|
36
36
|
|
|
37
|
-
Node 18 or newer and a Chromium-family browser. A system Chrome is used when present; otherwise `npx playwright install chromium` once, or set `VOS_BROWSER_PATH`. mp4 output needs Chrome (Chromium ships no AVC encoder). Render pages load `three` and mediabunny from a CDN, so rendering needs network access.
|
|
37
|
+
Node 18 or newer and a Chromium-family browser. A system Chrome is used when present; otherwise `npx playwright install chromium` once, or set `VOS_BROWSER_PATH`. mp4 output needs Chrome (Chromium ships no AVC encoder). Recording a desktop app (`vos record --app`) is macOS 14 or later, and needs no browser. Render pages load `three` and mediabunny from a CDN, so rendering needs network access.
|
|
38
38
|
|
|
39
39
|
```bash
|
|
40
40
|
vos setup [--agent claude,cursor,codex,copilot|all] [--global] [--no-skills] [--skills-from-catalog] [--no-rules] [--no-browser] [--url <dev server>]
|
|
@@ -157,9 +157,20 @@ vos record --hosted --actions actions.json --out take # needs a credential (vo
|
|
|
157
157
|
|
|
158
158
|
What travels: the script, the viewport, every `--header` value (a preview's bypass token), and the value of every `{ "env": "NAME" }` a `setup` or `teardown` step reads, from this shell. What never travels: a session (`--hosted` refuses `--session` and `--storage-state`, because none of a person's ever reaches vos.so). A page behind a sign-in fails on the fleet in words naming the local ladder, exit 4; a private-network URL is refused before a job exists. The fleet records up to ten minutes. `--dry-run` stays a local act. A script with a guarded step, a `download`, a `paste`, a `js` check or `peers` is refused on `--hosted` in words: nobody can confirm a step that spends on the fleet, a hosted take has no `outputs/` to keep a file in and no clipboard to paste from, a fleet browser runs no code it was handed, and it runs one browser.
|
|
159
159
|
|
|
160
|
+
**A desktop app?** `vos record --app` records one app's window on macOS while you, or your agent's computer use, work the app. There is no script: the take is what was performed. The window is recorded alone (every other application is kept out, and the capture follows the window if it moves) with no system pointer in the pixels. The pointer's path, its presses and where typing happened are in `cursor.json`, in the window's own points, so the planner zooms on them as it does on a page take. What was typed is never recorded.
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
vos record --windows # the windows that can be recorded
|
|
164
|
+
vos record --app TextEdit --out take # Ctrl-C ends the take
|
|
165
|
+
vos record --app com.apple.TextEdit --seconds 20 --out take # by bundle id, for a fixed length
|
|
166
|
+
vos record --window 4127 --out take # one window, by its id from --windows
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
It needs macOS 14 or later, and Screen Recording granted to the app the CLI runs from (the terminal, the editor, the agent's host): macOS records the grant against that app. With Accessibility granted as well, a press carries the bounds of what was pressed, so its zoom fits the control; without it the take still has its pointer, presses and typing. `vos doctor` says which are granted. The footage is `recording.mp4`, and the take is cut, opened and pushed like any other.
|
|
170
|
+
|
|
160
171
|
| Verb | Flags |
|
|
161
172
|
| -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
162
|
-
| `record` | `--actions <file>` (or positional) `--url` `--out take` `--strict` `--dry-run` `--allow-wall` `--keep-frames` `--storage-state <file>` or `--session <name>` `--header name=value`... `--confirm <id>`... `--browser-arg=<switch>`... `--max-duration <s>` `--ready dom\|networkidle` `--background <slug\|url\|none>` `--hosted` (record on vos.so; with `--title` `--folder <id>`)
|
|
173
|
+
| `record` | `--actions <file>` (or positional) `--url` `--out take` `--strict` `--dry-run` `--allow-wall` `--keep-frames` `--storage-state <file>` or `--session <name>` `--header name=value`... `--confirm <id>`... `--browser-arg=<switch>`... `--max-duration <s>` `--ready dom\|networkidle` `--background <slug\|url\|none>` `--hosted` (record on vos.so; with `--title` `--folder <id>`); `--app <name\|bundle id>` or `--window <id>` (a desktop app's window, with `--seconds <n>` `--out` `--max-duration` `--background`), `--windows` |
|
|
163
174
|
| `create` | The `record` flags plus the render flags (`--width` `--height` `--fps` `--format` `--parallel` `--draft` `--frame` `--set`), no `--range`. With `--strict` an incomplete recording exits 2 before anything is rendered |
|
|
164
175
|
| `plan` | `--fresh` (discard the current plan) `--reuse` `--from <doc.json>` (defaults to `<take>/doc.prev.json`) `--style <doc.json\|take\|vosId>` `--with <doc.json\|take\|vosId>[@end\|@start\|@step:<id>\|@<seconds>]` (a template, repeatable) `--background` `--motion` (re-propose the motion) `--headline` `--kicker` `--launch` `--brand` `--music` `--entrance` `--transitions slide\|fade\|scale\|none` `--end-card on\|none\|<ref>` `--captions` (bare: the step captions, anchored; `none`: no beat captions) `--clicks` `--release` `--zooms per-beat` (at most one zoom per captioned step) |
|
|
165
176
|
| `digest` | `--out <take>/digest` `--full 960` `--crop 640` (image long edges, the token budget) `--no-frames` `--transcript <file>` (Whisper-shaped segments merged as `said`) `--style <ref>` (report a reference document's style fields) |
|
|
@@ -290,6 +301,9 @@ take/
|
|
|
290
301
|
recording.webm encoded footage (30 fps CFR WebM; `recording.mp4` when a
|
|
291
302
|
pull brought the footage home in that container)
|
|
292
303
|
frames/ raw screencast JPEGs, indexed by frames.json (kept for re-encode)
|
|
304
|
+
A desktop take (`record --app`) has `recording.mp4` and no frames/
|
|
305
|
+
or actions.json; its meta.json says producer: "desktop" and
|
|
306
|
+
captureSurface: "app"
|
|
293
307
|
cursor.json the synthesized CursorTrack: exact coordinates, element rects
|
|
294
308
|
meta.json RecordingMeta (producer: "cli", per-step source extents)
|
|
295
309
|
actions.json the script that produced it, with the resolved url; pushed inside the document and written back by a fetch or pull with --media
|
|
@@ -11,7 +11,7 @@ var manifest = {
|
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
13
|
name: "record",
|
|
14
|
-
summary: "drive actions.json into a take (screencast + cursor track)"
|
|
14
|
+
summary: "drive actions.json into a take (screencast + cursor track); --app <name> records a desktop app's window as you or your agent work it (macOS)"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
name: "look",
|
|
@@ -144,4 +144,4 @@ var manifest = {
|
|
|
144
144
|
export {
|
|
145
145
|
manifest
|
|
146
146
|
};
|
|
147
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
//# sourceMappingURL=chunk-BDFC2L2O.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugin/manifest.ts"],"sourcesContent":["/**\n * The verb manifest of the take pipeline and the vos.so verbs — what\n * `vos help` lists under the engine verbs. It kept the shape a separately\n * installed plugin once handed the host (name + host range), so a script\n * reading it keeps working.\n */\nexport interface PluginVerb {\n name: string\n summary: string\n}\n\nexport interface PluginManifest {\n name: string\n /** Host versions this plugin speaks the run(argv) contract with. */\n hostRange: string\n verbs: PluginVerb[]\n}\n\nexport const manifest: PluginManifest = {\n name: '@vosjs/cli',\n hostRange: '>=0.9.0',\n verbs: [\n {\n name: 'create',\n summary: 'record + auto-plan + render, one command (--strict)',\n },\n {\n name: 'record',\n summary:\n \"drive actions.json into a take (screencast + cursor track); --app <name> records a desktop app's window as you or your agent work it (macOS)\",\n },\n {\n name: 'look',\n summary:\n 'see a page before scripting it (signed in, like record): a screenshot + every control in view with one proposed stable selector',\n },\n {\n name: 'plan',\n summary:\n 'plan zoom/cursor effects into doc.json (wand contract); --reuse re-times a previous cut onto a re-recording',\n },\n {\n name: 'render',\n summary: 'render a take directory (engine configs render in the host)',\n },\n {\n name: 'frames',\n summary:\n 'PNG stills at output times / zoom apexes (each checked against its zoom-off twin) / moments / exact sizes',\n },\n {\n name: 'check-video',\n summary:\n 'check a rendered file: facts, scene changes, loudness, first and last frames',\n },\n {\n name: 'deliver',\n summary:\n 'render a take to release video destinations (YouTube, X, Shorts/LinkedIn, GitHub) + verified kit.json',\n },\n {\n name: 'digest',\n summary:\n 'see a recording before cutting it: moments (clicks, typing, scrolls, idle, scenes) + footage frames + crops, in doc units',\n },\n { name: 'open', summary: 'serve the take into the vos.so studio' },\n {\n name: 'validate',\n summary:\n 'lint actions.json, a take dir (doc.json semantics), or re-measure a kit.json against the channel specs',\n },\n {\n name: 'actions',\n summary:\n 'from-agent-browser: turn an agent-browser walk (steps.jsonl) into actions.json; what cannot follow is named',\n },\n {\n name: 'ingest',\n summary:\n 'a take from a recording someone else made, with its cursor track from a trace beside it (Playwright trace.zip, stamped records, CSV); without one nothing is planned',\n },\n {\n name: 'join',\n summary:\n 'several takes and video files as one take: each next input a media, its spans tagged, its layers moved to where it starts; --captions anchors every step caption',\n },\n {\n name: 'score',\n summary:\n \"a music track as the film's score, its strongest swell landed on a step or a second (--dry-run prints the loudness envelope and the plan)\",\n },\n {\n name: 'audio',\n summary:\n 'measure: every audio clip’s loudness (integrated LUFS, sample peak) written beside it, which a clip’s normalize target plays it to',\n },\n {\n name: 'music',\n summary:\n 'ls: the library one line per track (tempo, vocals, loops, the sentence); pick: the beds that fit this film, best first, with reasons and the vos score line that places each',\n },\n {\n name: 'port',\n summary:\n 'bring a page, a HyperFrames or a Remotion piece: inventory (its words, colours, faces, media, scenes) then scaffold (a data-first program.mjs to translate the motion into)',\n },\n {\n name: 'build',\n summary:\n 'program.mjs (real functions) → config.json, refusing what cannot run on its own (module-scope reads, syntax the page cannot parse, non-JSON data)',\n },\n {\n name: 'compare',\n summary:\n \"a program against the source's own render: per-frame SSIM and source | vos | difference sheets; exits 1 when any frame is under the threshold\",\n },\n {\n name: 'brand',\n summary:\n \"write a product's BRAND.md, witnessed: /design.md, /llms.txt, then the page (palette, faces, marks, the avoid list)\",\n },\n {\n name: 'fetch',\n summary: 'download a hosted program: config.json + vos.json tracking',\n },\n {\n name: 'push',\n summary: 'push a config.json or take to vos.so (private; versioned)',\n },\n {\n name: 'duplicate',\n summary:\n 'a private sibling of your OWN vos (someone else\\u2019s is remixed: fetch + push --remix-of)',\n },\n {\n name: 'pull',\n summary:\n 'sync what changed on vos.so since your base (--media brings a take’s footage home)',\n },\n {\n name: 'folder',\n summary:\n 'list/create/pull folders, move voses and assets into them (pull = the context package on disk)',\n },\n {\n name: 'asset',\n summary:\n 'your files: push or import one, list them (assets ls), see storage (assets usage) and what uses a file (assets why)',\n },\n {\n name: 'recipe',\n summary:\n 'push a recipe .md into a folder, or replace one in place (prior body kept)',\n },\n {\n name: 'login',\n summary: 'sign in via the browser (or --key); stores a content key',\n },\n {\n name: 'setup',\n summary:\n 'ready this machine: the vos skills into your agent, a browser, one rules block, then doctor',\n },\n {\n name: 'doctor',\n summary:\n 'what is ready, in words: node, browser, ffmpeg, skills, a credential (never printed), the dev server',\n },\n {\n name: 'whoami',\n summary:\n 'the account in use and every other one stored for the origin, never a key',\n },\n {\n name: 'switch',\n summary:\n 'use another stored account (vos login once per account stores them all)',\n },\n {\n name: 'logout',\n summary:\n 'forget the account in use, a named one (vos logout <handle>), or all (--all)',\n },\n ],\n}\n"],"mappings":";;;AAkBO,IAAM,WAA2B;AAAA,EACtC,MAAM;AAAA,EACN,WAAW;AAAA,EACX,OAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA,EAAE,MAAM,QAAQ,SAAS,wCAAwC;AAAA,IACjE;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,SACE;AAAA,IACJ;AAAA,EACF;AACF;","names":[]}
|