@vosjs/cli 0.65.4 → 0.67.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
@@ -19,7 +19,7 @@ import {
19
19
  stillOutFor,
20
20
  stillWarnings,
21
21
  videoFormat
22
- } from "./chunk-TYGDQEEI.js";
22
+ } from "./chunk-MDRYSHOF.js";
23
23
  import {
24
24
  ASSET_ROUTE,
25
25
  MEDIA_HEAD_BYTES,
@@ -34,7 +34,7 @@ import {
34
34
  resolveMediaType,
35
35
  serveFile,
36
36
  unusedFlagsMessage
37
- } from "./chunk-UQLC4BEZ.js";
37
+ } from "./chunk-C5VKACGQ.js";
38
38
 
39
39
  // src/cli.ts
40
40
  import { writeFile } from "fs/promises";
@@ -822,7 +822,7 @@ async function cmdCheck(argv) {
822
822
  const result = runCheck(parsed);
823
823
  if (result.config) {
824
824
  const baseDir = baseDirOf(source);
825
- const { hostedLiteralWarnings } = await import("./assetManifest-RDHHKAAM.js");
825
+ const { hostedLiteralWarnings } = await import("./assetManifest-DU5ZEIDE.js");
826
826
  const extra = [
827
827
  ...baseDir ? missingManifestFiles(result.config, baseDir) : [],
828
828
  ...hostedLiteralWarnings(result.config)
@@ -856,7 +856,7 @@ async function cmdCheck(argv) {
856
856
  return result.ok ? EXIT_OK : EXIT_ERROR;
857
857
  }
858
858
  async function delegate(argv, viaAlias = false) {
859
- const { run } = await import("./run-J7CQANKJ.js");
859
+ const { run } = await import("./run-QSV3VXKE.js");
860
860
  if (viaAlias && argv[0]) {
861
861
  process.stderr.write(
862
862
  `note: "vos voila ${argv[0]}" is now "vos ${argv[0]}".
@@ -896,7 +896,7 @@ async function main() {
896
896
  const engine = HELP_ENGINE.split("\n").filter(
897
897
  (l) => l.startsWith(` vos ${cmd} `)
898
898
  );
899
- const { verbHelp } = await import("./run-J7CQANKJ.js");
899
+ const { verbHelp } = await import("./run-QSV3VXKE.js");
900
900
  const take = verbHelp(cmd);
901
901
  process.stdout.write(
902
902
  `${engine.join("\n")}
@@ -928,7 +928,7 @@ ${take.includes("no such verb") ? "" : take}`
928
928
  main().then(async (code) => {
929
929
  if (code === EXIT_OK) {
930
930
  const verb = process.argv[2] ?? "";
931
- const { HELP } = await import("./run-J7CQANKJ.js");
931
+ const { HELP } = await import("./run-QSV3VXKE.js");
932
932
  const documented = [
933
933
  ...helpFlagsFor(HELP_ENGINE, verb),
934
934
  ...helpFlagsFor(HELP, verb)
package/dist/index.js CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  startTakeServer,
15
15
  validateActions,
16
16
  waitForPageDone
17
- } from "./chunk-IDPTF5PP.js";
17
+ } from "./chunk-XCWC7SUS.js";
18
18
  import {
19
19
  BrowserUnavailableError,
20
20
  configDuration,
@@ -23,13 +23,13 @@ import {
23
23
  previewPages,
24
24
  renderStill,
25
25
  renderVideo
26
- } from "./chunk-TYGDQEEI.js";
26
+ } from "./chunk-MDRYSHOF.js";
27
27
  import {
28
28
  RECORDING_NAME,
29
29
  loadTake,
30
30
  pullMedia,
31
31
  takePaths
32
- } from "./chunk-63KINQOJ.js";
32
+ } from "./chunk-OFTRK3Y3.js";
33
33
  import {
34
34
  apiError,
35
35
  apiJson,
@@ -38,7 +38,7 @@ import {
38
38
  readSyncState,
39
39
  resolveCredential,
40
40
  writeSyncState
41
- } from "./chunk-UQLC4BEZ.js";
41
+ } from "./chunk-C5VKACGQ.js";
42
42
  import "./chunk-6XPFWQKP.js";
43
43
  import {
44
44
  manifest
@@ -6,10 +6,10 @@ import {
6
6
  takeBackdrop,
7
7
  takeBrowserArgs,
8
8
  verbHelp
9
- } from "./chunk-IDPTF5PP.js";
10
- import "./chunk-TYGDQEEI.js";
11
- import "./chunk-63KINQOJ.js";
12
- import "./chunk-UQLC4BEZ.js";
9
+ } from "./chunk-XCWC7SUS.js";
10
+ import "./chunk-MDRYSHOF.js";
11
+ import "./chunk-OFTRK3Y3.js";
12
+ import "./chunk-C5VKACGQ.js";
13
13
  import "./chunk-6XPFWQKP.js";
14
14
  export {
15
15
  HELP,
@@ -19,4 +19,4 @@ export {
19
19
  takeBrowserArgs,
20
20
  verbHelp
21
21
  };
22
- //# sourceMappingURL=run-J7CQANKJ.js.map
22
+ //# sourceMappingURL=run-QSV3VXKE.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vosjs/cli",
3
- "version": "0.65.4",
3
+ "version": "0.67.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",
@@ -53,12 +53,12 @@
53
53
  "playwright": "^1.49.0",
54
54
  "@vosjs/core": "^0.27.1",
55
55
  "@vosjs/editor": "^1.4.0",
56
+ "@vosjs/render-core": "^0.3.21",
56
57
  "@vosjs/elements": "^0.10.3",
57
58
  "@vosjs/shared": "^0.7.0",
58
- "@vosjs/render-core": "^0.3.20",
59
- "@vosjs/studio-core": "^0.37.0",
60
- "@vosjs/timeline": "^0.5.0",
61
- "@vosjs/tween": "^0.8.3"
59
+ "@vosjs/studio-core": "^0.38.0",
60
+ "@vosjs/tween": "^0.8.3",
61
+ "@vosjs/timeline": "^0.5.0"
62
62
  },
63
63
  "devDependencies": {
64
64
  "@types/node": "^22",
@@ -964,8 +964,44 @@
964
964
  "exclusiveMinimum": 0
965
965
  },
966
966
  "text": {
967
- "type": "string",
968
- "description": "content; \\n breaks lines. With `emphasis` set (OPT-IN; {} is enough), *words between asterisks* are set in the emphasis weight (a two-weight caption: light words with bold ones), a word-by-word reveal keeps each word in its own weight, \\* is a literal asterisk and a lone * stays as typed. Without `emphasis`, asterisks are text as typed"
967
+ "description": "the words; \\n breaks lines. A string, or a list of RUNS when parts of it are set differently: each run is a piece of text and the fields in which it departs from the layer's style. Example: [{ \"text\": \"Ship \" }, { \"text\": \"faster\", \"weight\": 700, \"underline\": true }]. There is no markup in the words: an asterisk is an asterisk. A run may hold \\n, a style may start and end anywhere, and a word-by-word reveal keeps every word in its own style",
968
+ "oneOf": [
969
+ { "type": "string" },
970
+ {
971
+ "type": "array",
972
+ "items": {
973
+ "type": "object",
974
+ "additionalProperties": false,
975
+ "required": ["text"],
976
+ "properties": {
977
+ "text": { "type": "string" },
978
+ "weight": {
979
+ "type": "number",
980
+ "minimum": 100,
981
+ "maximum": 900,
982
+ "description": "font weight of this run, snapped to what the layer's family hosts (700 is bold). A family with one weight paints it as the layer's own"
983
+ },
984
+ "italic": {
985
+ "type": "boolean",
986
+ "description": "italic on, or false for upright words on an italic layer"
987
+ },
988
+ "color": {
989
+ "type": "string",
990
+ "description": "fill colour of this run (absent = the layer's)"
991
+ },
992
+ "underline": { "type": "boolean" },
993
+ "strike": {
994
+ "type": "boolean",
995
+ "description": "strikethrough"
996
+ },
997
+ "highlight": {
998
+ "type": "string",
999
+ "description": "a colour behind this run"
1000
+ }
1001
+ }
1002
+ }
1003
+ }
1004
+ ]
969
1005
  },
970
1006
  "emphasis": {
971
1007
  "type": "object",
@@ -982,7 +1018,7 @@
982
1018
  "description": "the colour of *marked* words (absent = the clip's colour)"
983
1019
  }
984
1020
  },
985
- "description": "text kind: turns *markers* in text ON ({} is enough) and says how marked words are set. Absent = emphasis off: asterisks are text as typed"
1021
+ "description": "RETIRED: styled words are runs in `text` now. A layer that still carries this is read into runs (each *marked* word a run in this weight and colour); write runs instead"
986
1022
  },
987
1023
  "preset": {
988
1024
  "enum": ["title", "caption", "label"],
package/skills/VERSION CHANGED
@@ -1 +1 @@
1
- 0.21.0
1
+ 0.22.0
@@ -285,11 +285,14 @@ kit's stills into the release's project so the human can retrospect without
285
285
  a terminal:
286
286
 
287
287
  ```
288
- vos push take --folder <project-slug> --label "v2.1 launch" --note "<what shipped, one line>"
288
+ vos push take --folder <project-slug> --label "v2.1 launch" --note "<what shipped, one line>" \
289
+ --prompt "<the person's prompt, as they wrote it>"
289
290
  vos push poster/landscape --folder <project-slug> --label "v2.1 poster, landscape"
290
291
  vos asset push kit/*.png --folder <project-slug>
291
292
  ```
292
293
 
294
+ `--prompt` shows the person's prompt on the watch page by default: their words as they wrote them, never yours, with no file path, key or email they did not mean to publish. Say it is shown, and that they can take it off from the watch page.
295
+
293
296
  End by handing the human the loop, not the files: the watch page plays the
294
297
  latest version, the studio edits the cut AND the posters (the card is a
295
298
  layer you drag; the words are retyped in place), and `vos pull --media`
@@ -56,10 +56,20 @@ Find a credential in this order, without printing it: `VOS_API_KEY`, then
56
56
  the first line of `~/.config/vos/credentials`. With one, push:
57
57
 
58
58
  ```bash
59
- vos push my-config.json --title "…" --desc "one line" --wait
59
+ vos push my-config.json --title "…" --desc "one line" \
60
+ --prompt "<the person's prompt, as they wrote it>" --wait
60
61
  # --wait stays until the cover has rendered, then prints the links
61
62
  ```
62
63
 
64
+ **Show the prompt that made it.** Pass the person's prompt with `--prompt`
65
+ on the push that creates the vos: the watch page shows it by default, so
66
+ whoever watches sees what was asked. Use their words as they wrote them,
67
+ typos included, and never add your own; leave out a file path, key, email
68
+ or name they did not mean to publish. The vos lands private, so its owner
69
+ sees the prompt before anyone else: say it is shown, and that they can take
70
+ it off from the watch page. A push without one prints the command that
71
+ adds it.
72
+
63
73
  The vos lands PRIVATE on the key owner's shelf: only they can open the
64
74
  links, and publishing stays their act on vos.so. Keyed pushes never expire;
65
75
  iterate with `vos push my-config.json --vos <id>`.
@@ -67,13 +77,14 @@ iterate with `vos push my-config.json --vos <id>`.
67
77
  No credential at all? Use the claimable push instead of stopping:
68
78
 
69
79
  ```bash
70
- vos push my-config.json --claimable --title "…"
80
+ vos push my-config.json --claimable --title "…" \
81
+ --prompt "<the person's prompt, as they wrote it>"
71
82
  # → claim: https://vos.so/claim/… expires: <72h from now>
72
83
 
73
84
  # No CLI, or an older one? The same thing over plain HTTP:
74
85
  curl -s -X POST https://vos.so/api/claim \
75
86
  -H 'content-type: application/json' \
76
- -d '{"title": "…", "config": <the VosConfigJson>}'
87
+ -d '{"title": "…", "prompt": "<their prompt>", "config": <the VosConfigJson>}'
77
88
  # → { "claimUrl": "https://vos.so/claim/…", "expiresAt": "…" }
78
89
  ```
79
90
 
@@ -165,9 +165,12 @@ from what it produced.
165
165
 
166
166
  ```bash
167
167
  vos push <file>.json --title "…" --desc "one line" --tags a,b \
168
- --folder <folderId|slug> --label "what you did" --note "why: the ask"
168
+ --folder <folderId|slug> --label "what you did" --note "why: the ask" \
169
+ --prompt "<the person's prompt, as they wrote it>"
169
170
  ```
170
171
 
172
+ `--prompt` shows the person's prompt on the watch page by default: their words as they wrote them, never yours, with no file path, key or email they did not mean to publish. Say it is shown, and that they can take it off from the watch page.
173
+
171
174
  Pass `--label` and `--note` on EVERY push, the first one included: a
172
175
  create stamps them on v1, and the history is the conversation the human
173
176
  reads. The push creates a PRIVATE vos on the key owner's shelf, filed
@@ -69,9 +69,12 @@ sliced to the window); the editorial cut still trims `segments`.
69
69
  ## 4. The shelf is the record — push BEFORE the handoff
70
70
 
71
71
  ```bash
72
- vos push take --label "footage handoff" --note "<what it shows; which composition it feeds>"
72
+ vos push take --label "footage handoff" --note "<what it shows; which composition it feeds>" \
73
+ --prompt "<the person's prompt, as they wrote it>"
73
74
  ```
74
75
 
76
+ `--prompt` shows the person's prompt on the watch page by default: their words as they wrote them, never yours, with no file path, key or email they did not mean to publish. Say it is shown, and that they can take it off from the watch page.
77
+
75
78
  The take goes to the maker's shelf first, so the clip is never the only
76
79
  copy of the work. Two cases where you ASK before pushing instead: there is
77
80
  no vos.so credential (`vos login` needs the human), or the footage shows a
@@ -195,7 +195,8 @@ approximation.
195
195
  6. **Knob honesty**: one `--set data.<key>=<value>` still per param.
196
196
  7. **Push** with the score: `vos push config.json --folder <slug> --label
197
197
  "port of <source>" --note "<what was substituted, what is a painter>"
198
- --wait`, and hand over the watch and studio links.
198
+ --prompt "<the person's prompt, as they wrote it>" --wait`, and hand over
199
+ the watch and studio links. `--prompt` shows the person's prompt on the watch page by default: their words as they wrote them, never yours, with no file path, key or email they did not mean to publish. Say it is shown, and that they can take it off from the watch page.
199
200
 
200
201
  ## The honest gaps (say them in the push note)
201
202
 
@@ -1,4 +1,4 @@
1
- <!-- Generated by scripts/build-element-reference.mjs from @vosjs/core 0.27.0, @vosjs/elements 0.10.2, @vosjs/timeline 0.5.0 and @vosjs/shared 0.7.0. Do not edit by hand: re-run the script. -->
1
+ <!-- Generated by scripts/build-element-reference.mjs from @vosjs/core 0.27.1, @vosjs/elements 0.10.3, @vosjs/timeline 0.5.0 and @vosjs/shared 0.7.0. Do not edit by hand: re-run the script. -->
2
2
 
3
3
  # Elements, the context and eases: the declarations
4
4
 
@@ -208,7 +208,10 @@ interface BaseElement {
208
208
  type: 'text' | 'image' | 'svg' | 'video' | 'audio';
209
209
  /** Position on screen */
210
210
  position: ElementPosition;
211
- /** Transform origin */
211
+ /**
212
+ * The point of the box an `{x, y}` position names (absent: its top-left
213
+ * corner). Ignored for a preset position, which places the whole box.
214
+ */
212
215
  anchor?: Anchor;
213
216
  /** Layer order (higher = on top, default: 100) */
214
217
  zIndex?: number;
@@ -33,7 +33,8 @@ Two shapes, both used as `Authorization: Bearer`:
33
33
  Humans mint keys at https://vos.so/app/api.
34
34
  3. **No credential at all** — the claimable push (programs only):
35
35
  ```bash
36
- vos push my-remix.json --claimable --title "My remix"
36
+ vos push my-remix.json --claimable --title "My remix" \
37
+ --prompt "<the person's prompt, as they wrote it>"
37
38
  # → claim: https://vos.so/claim/… expires: <72h from now>
38
39
 
39
40
  # No CLI, or an older one? The same thing over plain HTTP:
@@ -88,11 +89,13 @@ vos.so.
88
89
  5. **Push** as a private vos with lineage (the CLI reads `vos.json` beside
89
90
  the config for the `remixOfId` credit):
90
91
  ```bash
91
- vos push <slug>/config.json --title "Aurora Ribbons — dusk"
92
+ vos push <slug>/config.json --title "Aurora Ribbons — dusk" \
93
+ --prompt "<the person's prompt, as they wrote it>"
92
94
  # → Created private vos <id>
93
95
  # watch: https://vos.so/vos/<id>
94
96
  # studio: https://vos.so/studio?vos=<id>
95
97
  ```
98
+ `--prompt` shows the person's prompt on the watch page by default: their words as they wrote them, never yours, with no file path, key or email they did not mean to publish. Say it is shown, and that they can take it off from the watch page.
96
99
 
97
100
  6. **Iterate** — further edits become versions of the same vos:
98
101
  ```bash