@vosjs/cli 0.19.0 → 0.21.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/dist/cli.js CHANGED
@@ -495,7 +495,7 @@ async function cmdCheck(argv) {
495
495
  return result.ok ? EXIT_OK : EXIT_ERROR;
496
496
  }
497
497
  async function delegate(argv, viaAlias = false) {
498
- const { run } = await import("./run-PJOOKJE2.js");
498
+ const { run } = await import("./run-7AOC4JUE.js");
499
499
  if (viaAlias && argv[0]) {
500
500
  process.stderr.write(
501
501
  `note: "vos voila ${argv[0]}" is now "vos ${argv[0]}".
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Browser, Page } from 'playwright';
2
- import { CursorTrack, RecordingMeta, ProjectDoc, CursorEvent, Backdrop, LayoutParts, TranscriptSegment, Digest } from '@vosjs/studio-core';
2
+ import { CursorTrack, RecordingMeta, ProjectDoc, CursorEvent, TemplateAnchor, Backdrop, LayoutParts, TranscriptSegment, Digest } from '@vosjs/studio-core';
3
3
  export { Digest } from '@vosjs/studio-core';
4
4
 
5
5
  interface RenderCommonOptions {
@@ -270,25 +270,20 @@ interface MotionProposalInput {
270
270
  caption: string;
271
271
  }[];
272
272
  catalog: MusicCatalog | null;
273
+ /** The templates the recipe or the flags named, resolved, in order. */
274
+ templates?: MotionTemplate[];
275
+ }
276
+ /** Where a template lands: the studio-core anchor, or a recorded step's settle. */
277
+ type MotionAnchor = TemplateAnchor | {
278
+ step: string;
279
+ };
280
+ /** A template the recipe or a flag named, resolved to its document. */
281
+ interface MotionTemplate {
282
+ /** What its clips say they came from (the vos id or the path it was read from). */
283
+ from: string;
284
+ doc: ProjectDoc;
285
+ at: MotionAnchor;
273
286
  }
274
-
275
- /**
276
- * Reuse: re-time a previous cut onto a NEW recording of the same
277
- * script. The recorder's `meta.steps` say when each actions.json step ran
278
- * in BOTH takes, so the old timeline maps onto the new one piecewise —
279
- * matched step edges are the control points, and any source time in
280
- * between interpolates. Explicit `anchor`s on camera spans resolve
281
- * directly against the new steps and win over the map.
282
- *
283
- * Report, never guess: every span that
284
- * could not re-anchor cleanly is NAMED in `flagged` with the reason in
285
- * words — a vanished step, a skipped selector, a span clamped or dropped
286
- * at the new take's edge. The agent fixes actions.json and re-runs; the
287
- * verb never silently invents a cut.
288
- *
289
- * Pure functions, no I/O — reuse.test.ts drives them with synthetic
290
- * step timelines; the browser gate is smoke-recut.ts.
291
- */
292
287
 
293
288
  interface ReuseReport {
294
289
  /** spans re-timed through an explicit anchor. */
@@ -368,9 +363,10 @@ interface PlanOptions {
368
363
  aspect: number;
369
364
  } | null;
370
365
  /**
371
- * Propose the cut's motion (entrance, end card, captions, bed, clicks)
372
- * from these roles. Applied on a fresh plan; `again` re-proposes onto an
373
- * existing document (replacing only the proposals' own ids and fields).
366
+ * Propose the cut's motion (the card's enter, the templates the recipe
367
+ * names, the end card, captions, bed, clicks) from these roles. Applied
368
+ * on a fresh plan; `again` re-proposes onto an existing document
369
+ * (replacing only the proposals' own ids and `from`s).
374
370
  */
375
371
  motion?: MotionProposalInput & {
376
372
  again?: boolean;
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ import {
30
30
  validateActions,
31
31
  waitForPageDone,
32
32
  writeSyncState
33
- } from "./chunk-4LLBPFCW.js";
33
+ } from "./chunk-4IWHZBIY.js";
34
34
  import {
35
35
  BrowserUnavailableError,
36
36
  configDuration,
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  run
4
- } from "./chunk-4LLBPFCW.js";
4
+ } from "./chunk-4IWHZBIY.js";
5
5
  import "./chunk-NHKHTIDR.js";
6
6
  export {
7
7
  run
8
8
  };
9
- //# sourceMappingURL=run-PJOOKJE2.js.map
9
+ //# sourceMappingURL=run-7AOC4JUE.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vosjs/cli",
3
- "version": "0.19.0",
3
+ "version": "0.21.0",
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,11 +51,11 @@
51
51
  "@vosjs/core": "^0.23.6",
52
52
  "@vosjs/editor": "^1.3.1",
53
53
  "@vosjs/render-core": "^0.2.4",
54
- "@vosjs/shared": "^0.4.1",
55
54
  "@vosjs/elements": "^0.8.1",
56
- "@vosjs/studio-core": "^0.11.0",
57
- "@vosjs/timeline": "^0.4.1",
58
- "@vosjs/tween": "^0.8.2"
55
+ "@vosjs/shared": "^0.4.1",
56
+ "@vosjs/studio-core": "^0.12.0",
57
+ "@vosjs/tween": "^0.8.2",
58
+ "@vosjs/timeline": "^0.4.1"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/node": "^22",
@@ -45,8 +45,8 @@
45
45
  "hold": {
46
46
  "type": "number",
47
47
  "minimum": 0,
48
- "maximum": 10,
49
- "description": "freeze on this segment's last frame for these OUTPUT seconds (the beat before a cut, the ground for the end card)"
48
+ "maximum": 30,
49
+ "description": "LEGACY spelling of a freeze at this segment's end, read into `freeze` on every path; write `freeze` instead"
50
50
  }
51
51
  },
52
52
  "additionalProperties": true
@@ -55,6 +55,9 @@
55
55
  "speed": {
56
56
  "$ref": "#/definitions/speed"
57
57
  },
58
+ "freeze": {
59
+ "$ref": "#/definitions/freeze"
60
+ },
58
61
  "zoom": {
59
62
  "type": "array",
60
63
  "description": "Zoom regions (SOURCE time, footage-anchored, non-overlapping). The camera ramps in around `in`, holds until `out`, ramps out — or pans straight to the next span when the gap is short. Planner-made spans have source:'auto' (replaced on re-plan); set source:'manual' on any span you add or edit so it survives.",
@@ -1283,6 +1286,52 @@
1283
1286
  },
1284
1287
  "additionalProperties": true
1285
1288
  },
1289
+ "freeze": {
1290
+ "type": "array",
1291
+ "description": "Freezes (SOURCE moments, footage-anchored): the footage frozen on the frame just before `at` for `seconds` of output, anywhere in the take (a pause on a state while a caption reads, a beat before a cut, the rest a poster ends on). The retime primitive beside `speed`: a speed span is a source range with a rate, a freeze a source point with a length. A freeze whose frame is trimmed away has no effect and comes back when the trim does. The still every still-taking surface takes (the thumbnail, a poster's render, the stills export's first moment) is where the LAST freeze begins. Absent = none. The output ending past the footage needs no freeze: the card holds its last frame under the clips that outlast it.",
1292
+ "items": {
1293
+ "type": "object",
1294
+ "required": ["id", "at", "seconds"],
1295
+ "properties": {
1296
+ "id": {
1297
+ "type": "string",
1298
+ "description": "stable identity (f0, f1, …)"
1299
+ },
1300
+ "at": {
1301
+ "type": "number",
1302
+ "minimum": 0,
1303
+ "description": "SOURCE seconds: the frame just before this moment freezes"
1304
+ },
1305
+ "seconds": {
1306
+ "type": "number",
1307
+ "minimum": 0.25,
1308
+ "maximum": 30,
1309
+ "description": "OUTPUT seconds the frame holds"
1310
+ },
1311
+ "anchor": {
1312
+ "type": "object",
1313
+ "required": ["step"],
1314
+ "additionalProperties": false,
1315
+ "properties": {
1316
+ "step": {
1317
+ "type": ["string", "integer"],
1318
+ "description": "the actions.json step: its `id` when it has one, else its record-time index (meta.steps)"
1319
+ },
1320
+ "at": {
1321
+ "enum": ["start", "end"],
1322
+ "description": "which edge of the step the freeze's `at` is measured from (default start)"
1323
+ },
1324
+ "offset": {
1325
+ "type": "number",
1326
+ "description": "seconds from that edge to the freeze's `at` (negative = before it)"
1327
+ }
1328
+ },
1329
+ "description": "re-record tie to a step (vos plan --reuse resolves it against the new take's steps and it wins over the step map); `at` stays the truth"
1330
+ }
1331
+ },
1332
+ "additionalProperties": false
1333
+ }
1334
+ },
1286
1335
  "speed": {
1287
1336
  "type": "array",
1288
1337
  "description": "Speed-change spans (SOURCE time, footage-anchored, non-overlapping). Absent = all 1×. The planner proposes source:'auto' spans for typing passages, scroll runs and idle gaps (ids s0…); set source:'manual' on spans you add or edit so they survive a re-plan (absent source also counts as manual).",