@vosjs/cli 0.55.1 → 0.56.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/dist/cli.js CHANGED
@@ -730,7 +730,7 @@ async function cmdCheck(argv) {
730
730
  return result.ok ? EXIT_OK : EXIT_ERROR;
731
731
  }
732
732
  async function delegate(argv, viaAlias = false) {
733
- const { run } = await import("./run-QREATZCN.js");
733
+ const { run } = await import("./run-OIZ7NQPU.js");
734
734
  if (viaAlias && argv[0]) {
735
735
  process.stderr.write(
736
736
  `note: "vos voila ${argv[0]}" is now "vos ${argv[0]}".
@@ -770,7 +770,7 @@ async function main() {
770
770
  const engine = HELP_ENGINE.split("\n").filter(
771
771
  (l) => l.startsWith(` vos ${cmd} `)
772
772
  );
773
- const { verbHelp } = await import("./run-QREATZCN.js");
773
+ const { verbHelp } = await import("./run-OIZ7NQPU.js");
774
774
  const take = verbHelp(cmd);
775
775
  process.stdout.write(
776
776
  `${engine.join("\n")}
@@ -802,7 +802,7 @@ ${take.includes("no such verb") ? "" : take}`
802
802
  main().then(async (code) => {
803
803
  if (code === EXIT_OK) {
804
804
  const verb = process.argv[2] ?? "";
805
- const { HELP } = await import("./run-QREATZCN.js");
805
+ const { HELP } = await import("./run-OIZ7NQPU.js");
806
806
  const documented = [
807
807
  ...helpFlagsFor(HELP_ENGINE, verb),
808
808
  ...helpFlagsFor(HELP, verb)
package/dist/index.js CHANGED
@@ -18,7 +18,7 @@ import {
18
18
  takePaths,
19
19
  validateActions,
20
20
  waitForPageDone
21
- } from "./chunk-FQA7LFXG.js";
21
+ } from "./chunk-XXAY42XS.js";
22
22
  import {
23
23
  BrowserUnavailableError,
24
24
  apiError,
@@ -6,7 +6,7 @@ import {
6
6
  takeBackdrop,
7
7
  takeBrowserArgs,
8
8
  verbHelp
9
- } from "./chunk-FQA7LFXG.js";
9
+ } from "./chunk-XXAY42XS.js";
10
10
  import "./chunk-JX2YEL3M.js";
11
11
  import "./chunk-6XPFWQKP.js";
12
12
  export {
@@ -17,4 +17,4 @@ export {
17
17
  takeBrowserArgs,
18
18
  verbHelp
19
19
  };
20
- //# sourceMappingURL=run-QREATZCN.js.map
20
+ //# sourceMappingURL=run-OIZ7NQPU.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vosjs/cli",
3
- "version": "0.55.1",
3
+ "version": "0.56.1",
4
4
  "description": "The vos CLI: record the real product from a scripted browser flow, auto-zoom from the cursor track, cut as data in doc.json, render deterministic video and stills, deliver a release's media per destination spec, and sync with vos.so. One binary, every verb, MIT.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -51,14 +51,14 @@
51
51
  "acorn-walk": "^8.3.5",
52
52
  "mediabunny": "^1.55.7",
53
53
  "playwright": "^1.49.0",
54
+ "@vosjs/core": "^0.25.5",
54
55
  "@vosjs/editor": "^1.4.0",
56
+ "@vosjs/render-core": "^0.3.11",
55
57
  "@vosjs/elements": "^0.10.0",
56
- "@vosjs/core": "^0.25.5",
57
58
  "@vosjs/shared": "^0.6.0",
58
- "@vosjs/render-core": "^0.3.11",
59
- "@vosjs/studio-core": "^0.33.2",
60
59
  "@vosjs/timeline": "^0.4.1",
61
- "@vosjs/tween": "^0.8.2"
60
+ "@vosjs/tween": "^0.8.2",
61
+ "@vosjs/studio-core": "^0.33.2"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@types/node": "^22",
package/skills/VERSION CHANGED
@@ -1 +1 @@
1
- 0.15.0
1
+ 0.17.0
@@ -20,6 +20,8 @@ the render: a config produces the same frames on every machine.
20
20
  3. **Generate the config**: write a complete, valid VosConfigJson to
21
21
  `<kebab-case-name>.json` wherever the project keeps configs.
22
22
  4. **Validate locally** (see below), then render or preview it.
23
+ 5. **Push it and give the link** (see below): the work is done when the
24
+ user has a link that plays it, not when a file sits on disk.
23
25
 
24
26
  If the user provides an image, analyze its visual style (colors, mood,
25
27
  composition, lighting) and translate those qualities into the scene.
@@ -44,12 +46,25 @@ vos preview my-config.json # local playback page
44
46
  vos info my-config.json
45
47
  ```
46
48
 
47
- ## Share for preview (no account needed)
49
+ ## Push it and give the link
48
50
 
49
- Local render is the default — nothing leaves the machine unless the user
50
- asks for sharing or hosting. When they do want to see it hosted (playable
51
- link, fine-tuning in the vos.so studio) and no API key is configured, use
52
- the claimable push:
51
+ A vos program is made to be watched, tuned in the studio and remixed, so
52
+ finish by pushing it and handing back the link. Skip the push only when the
53
+ user said to keep the work local.
54
+
55
+ Find a credential in this order, without printing it: `VOS_API_KEY`, then
56
+ the first line of `~/.config/vos/credentials`. With one, push:
57
+
58
+ ```bash
59
+ vos push my-config.json --title "…" --desc "one line" --wait
60
+ # --wait stays until the cover has rendered, then prints the links
61
+ ```
62
+
63
+ The vos lands PRIVATE on the key owner's shelf: only they can open the
64
+ links, and publishing stays their act on vos.so. Keyed pushes never expire;
65
+ iterate with `vos push my-config.json --vos <id>`.
66
+
67
+ No credential at all? Use the claimable push instead of stopping:
53
68
 
54
69
  ```bash
55
70
  vos push my-config.json --claimable --title "…"
@@ -62,12 +77,16 @@ curl -s -X POST https://vos.so/api/claim \
62
77
  # → { "claimUrl": "https://vos.so/claim/…", "expiresAt": "…" }
63
78
  ```
64
79
 
65
- Hand `claimUrl` to the user and nowhere else — it is the only reference and
66
- the only credential. It lasts 72 hours; unclaimed work is deleted after
80
+ Hand `claimUrl` to the user and nowhere else: it is the only reference and
81
+ the only credential. It lasts 72 hours, and unclaimed work is deleted after
67
82
  that (re-push if it lapses). Claiming moves the vos into the user's
68
- library. With a key configured (`VOS_API_KEY` or `vos login`), prefer
69
- `vos push` — keyed pushes have no expiry. Programs only, config ≤200KB,
70
- 5 pushes per day per network.
83
+ library. Programs only, config ≤200KB, 5 pushes per day per network.
84
+
85
+ End your reply with the links, never only a file path: the watch page
86
+ (`https://vos.so/vos/<id>`, it plays the program) and the studio
87
+ (`https://vos.so/studio?vos=<id>`, where the user tunes your knobs), or
88
+ the claim link when there was no credential. A local MP4 is a bonus, not
89
+ the deliverable.
71
90
 
72
91
  ## VosConfigJson structure
73
92
 
@@ -162,7 +181,8 @@ Values must reference declared param keys with matching types.
162
181
  Configs pushed to vos.so get preview-rendered on a software-GL fleet: no
163
182
  `THREE.DoubleSide` on transmission materials (hard hang), no `dispersion`
164
183
  (too slow), and any fetched asset must be reachable and CORS-open. These are
165
- fine for purely local renders on a real GPU.
184
+ fine for purely local renders on a real GPU. They are things to avoid, never
185
+ a reason to skip the push: keep transmission single-sided, and push.
166
186
 
167
187
  ## Your own passes: depth of field, refraction
168
188
 
@@ -180,6 +180,8 @@ publish; promoting is the human's gesture on vos.so.
180
180
  **Look at what landed.** Every push renders a still within about 15
181
181
  seconds: `GET /api/vos/{id}`, follow `contentUrls.thumbnail`, and view the
182
182
  image before reporting done. A push you never looked at is not finished.
183
+ Then end your reply with the links: the watch page
184
+ (`https://vos.so/vos/<id>`) and the studio (`https://vos.so/studio?vos=<id>`).
183
185
 
184
186
  **Pace a batch**: back-to-back pushes are fine at the quota (the render
185
187
  queue spaces browser launches and backs off itself). Verify state after a
@@ -169,7 +169,11 @@ approximation.
169
169
  3. **Scaffold**: `npx vos port scaffold` writes `port/program/program.mjs`
170
170
  (every word a bound element, every colour a key, the knobs, a label and a
171
171
  TODO per scene, each scene's words shown in its window, a painter only
172
- when the inventory needs one), `doc.json` with the score as a track, and
172
+ when the inventory needs one, and the PAINTER STARTER as
173
+ `content.refs.lib` when the piece needs a painter or springs: Remotion's
174
+ `spring` to the frame, `springTo` for the timeline, `interpolate`,
175
+ `bezier`, seeded noise; never read another engine's source for these),
176
+ `doc.json` with the score as a track, and
173
177
  `port/REPORT.md` (substituted faces, gaps). Read the report first. On an
174
178
  older CLI, scaffold from `references/intro-port.mjs` by hand.
175
179
  4. **Translate scene by scene** with the tables, replacing each TODO. One
@@ -202,8 +206,8 @@ stated approximation:
202
206
  | a colour per split unit (`charStyle` making one letter red) | segments carry x/y/opacity/scale/rotation only: a separate element, or paint it |
203
207
  | `mixBlendMode` | no blend modes on elements: paint it |
204
208
  | a shape's colour as a knob | an svg's colours are compiled in (static `colors`): paint the shape if its colour must change live |
205
- | `spring()` | no spring ease in the dialect: a `back.out(n)` of the same shape, checked by eye |
206
- | `@remotion/noise`, SVG `feTurbulence` | the painter |
209
+ | `spring()` | no spring EASE in the dialect; the scaffold's painter starter (cli 0.56+) has `lib.springTo`, Remotion's spring on the timeline a step per frame, exact. Older: `back.out(n)`, by eye |
210
+ | `@remotion/noise`, SVG `feTurbulence` | the painter, on the starter's `lib.noise2D/noise3D` (the same character, not the same values) |
207
211
  | a group transform (scale the whole scene) | no element groups: tween each element the same way |
208
212
 
209
213
  Colours render as authored from `@vosjs/elements` 0.8.2 (older versions
@@ -16,7 +16,7 @@ rows name what has no element equivalent yet.
16
16
  | `useCurrentFrame()` | nothing in a tween (the timeline is the clock); `ctx.time * fps` inside `onFrame` |
17
17
  | `interpolate(f, [a, b], [x, y], { easing, extrapolate: 'clamp' })` | `tl.fromTo(props, { p: x }, { p: y, duration: (b - a) / fps, ease }, a / fps)` |
18
18
  | `Easing.bezier(x1, y1, x2, y2)` | `ease: 'css-bezier(x1, y1, x2, y2)'` (exact) |
19
- | `spring({ frame, fps, config })` | GAP: no spring ease; `back.out(n)` of a similar overshoot, checked by eye |
19
+ | `spring({ frame, fps, config })` | the painter starter (cli 0.56+): `content.refs.lib.springTo(tl, props, { y: [from, to] }, at, { fps, config })` puts Remotion's own spring on the timeline, a step per frame, exact to the frame; `lib.spring({ frame, fps, config })` is the value (`durationInFrames`, `delay`, `overshootClamping` as Remotion's). On an older CLI: `back.out(n)` of a similar overshoot, by eye |
20
20
  | `<Sequence from durationInFrames>` | `tl.addLabel(name, from / fps)` and the scene's elements tweened in and out inside that window |
21
21
  | `<TransitionSeries>` + `fade()` | opacity tweens across the overlap window |
22
22
  | `<AbsoluteFill>` + flex centring | `position: 'center'`; offsets in `transform: { translateX, translateY }` (design px) |
@@ -31,7 +31,7 @@ rows name what has no element equivalent yet.
31
31
  | `<Audio src={staticFile('s.mp3')} />` | `doc.json` `audio: [{ key: 's.mp3', start, in, out, duration, gain, fadeIn, fadeOut }]` |
32
32
  | `<Video>` / `<OffthreadVideo>` | a `video` element, windowed by opacity; a source in-point is not supported yet |
33
33
  | `@remotion/google-fonts` `loadFont()` | `fonts: [{ family, weight, url }]` from `https://vos.so/api/fonts`; a face the catalog lacks is substituted and said |
34
- | `@remotion/noise` `noise3D`, SVG `feTurbulence` grain | the painter, reading its seed and amounts from `data` |
34
+ | `@remotion/noise` `noise3D`, SVG `feTurbulence` grain | the painter, with `content.refs.lib.noise2D/noise3D(seed, …)` (cli 0.56+: seeded simplex, the character of `@remotion/noise`, not its values, so match by eye), reading its seed and amounts from `data` |
35
35
  | `mixBlendMode` | GAP: the painter |
36
36
  | an inline `<svg>` shape | an `svg` element (`src` is the markup); its colours are static, so a shape colour that must be a knob is painted |
37
37
  | a solid background | `ctx.scene.background = new ctx.THREE.Color(ctx.data.ink)` in `createContent`, `.set(ctx.data.ink)` in `onFrame` |