versioncam 0.1.3 → 0.2.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.
Files changed (74) hide show
  1. package/CHANGELOG.md +124 -0
  2. package/README.md +116 -13
  3. package/dist/cli/commands/doctor.js +39 -2
  4. package/dist/cli/commands/doctor.js.map +1 -1
  5. package/dist/cli/commands/init.js +25 -0
  6. package/dist/cli/commands/init.js.map +1 -1
  7. package/dist/cli/commands/preview.js +10 -1
  8. package/dist/cli/commands/preview.js.map +1 -1
  9. package/dist/cli/commands/render.d.ts +17 -0
  10. package/dist/cli/commands/render.js +78 -21
  11. package/dist/cli/commands/render.js.map +1 -1
  12. package/dist/cli/cwd.d.ts +46 -0
  13. package/dist/cli/cwd.js +102 -0
  14. package/dist/cli/cwd.js.map +1 -0
  15. package/dist/cli/main.js +11 -2
  16. package/dist/cli/main.js.map +1 -1
  17. package/dist/cli/usage.d.ts +3 -2
  18. package/dist/cli/usage.js +9 -4
  19. package/dist/cli/usage.js.map +1 -1
  20. package/dist/config.d.ts +24 -0
  21. package/dist/config.js +25 -0
  22. package/dist/config.js.map +1 -1
  23. package/dist/core/camera-track.d.ts +63 -0
  24. package/dist/core/camera-track.js +230 -0
  25. package/dist/core/camera-track.js.map +1 -0
  26. package/dist/core/camera.d.ts +14 -1
  27. package/dist/core/camera.js +18 -2
  28. package/dist/core/camera.js.map +1 -1
  29. package/dist/core/follow.d.ts +129 -0
  30. package/dist/core/follow.js +151 -0
  31. package/dist/core/follow.js.map +1 -0
  32. package/dist/core/motion-defaults.d.ts +29 -0
  33. package/dist/core/motion-defaults.js +29 -0
  34. package/dist/core/motion-defaults.js.map +1 -1
  35. package/dist/core/timeline.d.ts +10 -2
  36. package/dist/core/timeline.js.map +1 -1
  37. package/dist/driver/session.d.ts +22 -1
  38. package/dist/driver/session.js +48 -12
  39. package/dist/driver/session.js.map +1 -1
  40. package/dist/index.d.ts +2 -2
  41. package/dist/index.js +1 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/loader.d.ts +7 -1
  44. package/dist/loader.js +23 -8
  45. package/dist/loader.js.map +1 -1
  46. package/dist/page/assets/index-fZtacWyp.js +2 -0
  47. package/dist/page/index.html +1 -1
  48. package/dist/render/encode.d.ts +12 -1
  49. package/dist/render/encode.js +94 -35
  50. package/dist/render/encode.js.map +1 -1
  51. package/dist/render/presentation.d.ts +12 -0
  52. package/dist/render/presentation.js +15 -0
  53. package/dist/render/presentation.js.map +1 -1
  54. package/dist/render/render.js +18 -1
  55. package/dist/render/render.js.map +1 -1
  56. package/dist/render/sampling.d.ts +13 -0
  57. package/dist/render/sampling.js +47 -19
  58. package/dist/render/sampling.js.map +1 -1
  59. package/dist/render/scenes.d.ts +16 -0
  60. package/dist/render/scenes.js +108 -0
  61. package/dist/render/scenes.js.map +1 -0
  62. package/dist/render/sequence.d.ts +18 -0
  63. package/dist/render/sequence.js +67 -13
  64. package/dist/render/sequence.js.map +1 -1
  65. package/dist/review/review.js +46 -21
  66. package/dist/review/review.js.map +1 -1
  67. package/dsl.md +37 -0
  68. package/package.json +1 -1
  69. package/plugin/README.md +7 -2
  70. package/plugin/agents/versioncam-reviewer.md +3 -2
  71. package/plugin/skills/versioncam/SKILL.md +60 -14
  72. package/plugin/skills/versioncam/authoring.md +6 -1
  73. package/plugin/skills/versioncam/onboarding.md +17 -17
  74. package/dist/page/assets/index-DUom5amc.js +0 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,130 @@ and versions follow [semantic versioning](https://semver.org/). While the
6
6
  major version is 0, a minor version may change the config or the clip DSL,
7
7
  and its entry here says how.
8
8
 
9
+ ## 0.2.0 (2026-09-29)
10
+
11
+ A minor version: new config fields and new camera methods. A clip whose
12
+ camera moves never overlap records what it did before, to the byte.
13
+
14
+ ### Added
15
+
16
+ - `s.camera.follow()` follows the cursor at one scale until the next camera
17
+ line, for a clip that moves around the page: one line instead of a zoom
18
+ before each thing the cursor uses, which zoomed in and out and panned in
19
+ fits and starts. The camera keeps the cursor inside a dead zone in the
20
+ middle of the frame, never shows beyond the page's edge, and moves
21
+ smoothly without overshooting. Its path is worked out from the whole
22
+ cursor track once the clip has run, so it keeps up with a cursor that
23
+ crosses the page. The options are `scale` (1.35, exact rather than a
24
+ ceiling), `deadZone` (0.3 of the frame), `smoothing` (600 milliseconds)
25
+ and `duration` (how long it takes to ease in). Their defaults are new
26
+ fields of the config's `motion`: `followZoom`, `followDeadZone` and
27
+ `followSmoothingMs`. `s.camera.release()` stops following, and the camera
28
+ comes to rest on the framing it was heading for.
29
+ - `versioncam review` warns, under `onscreen`, about a click that lands
30
+ outside what the camera shows: the button changes, and no frame shows it
31
+ pressed.
32
+ - `--cwd <dir>` runs any command as if from `<dir>`: that directory's
33
+ config, `.env.recording` and `.env`, and any relative path the command is
34
+ given or prints. It can go anywhere on the line. It is for a monorepo, run
35
+ from the repository root or from inside the app. `npx` looks for
36
+ versioncam only where it runs and above, so `--cwd` refuses a directory
37
+ whose own versioncam is not the one running, and says to `cd` into it
38
+ instead.
39
+ - `versioncam doctor` reads the scenes module a config names, and lists its
40
+ scene ids, or says what `render` would refuse it for and how to fix it.
41
+ - `theme.presentation.captionInset` moves a caption that sits over the app:
42
+ `{ left: n }` or `{ right: n }`, pixels of the video in from that side,
43
+ and `right` puts it in the bottom-right corner. The default, `{ left: 40 }`,
44
+ is where it always sat, to the byte. It is for an app whose own controls
45
+ are where the caption was, such as an account menu at the foot of a
46
+ sidebar or a map's legend. The README's Configure section has a table of
47
+ every `presentation` field now, which a test holds to the type.
48
+
49
+ ### Changed
50
+
51
+ - A camera line written while the camera is still moving starts at once,
52
+ from where the camera is, and takes its whole `duration`. It used to wait
53
+ for the move before it to arrive and then run in whatever time was left,
54
+ so a series of pans stopped and snapped. Two camera lines written at the
55
+ same instant used to glide to the first and cut to the second; now the
56
+ second is the only one. A clip whose camera moves never overlap records
57
+ exactly the camera it did before, to the byte.
58
+ - A recording whose camera follows the cursor, or eases from one move into
59
+ another, keeps its camera as a key a frame, with a new ease, `"linear"`.
60
+ A renderer from an earlier version draws such a recording the same way.
61
+ - `versioncam review` names a camera still moving at the end of a clip once,
62
+ at its last key, rather than once for every key past the end.
63
+ - `versioncam init` below a repository root says where Claude Code finds the
64
+ skill: in a session started in that directory or below it, and from the
65
+ root only after the session has read or edited a file there.
66
+ - `render` checks everything it was asked for before it renders anything.
67
+ An id that matches no recording and no scene, or a `--scene` the scenes
68
+ module does not define, stops it with what there is to render. An id that
69
+ matched nothing used to be passed over without a word.
70
+ - `versioncam --help` and the README say plainly that `render` with no ids
71
+ renders every recording on disk, stale ones from drafts, trial runs and
72
+ renamed clips included.
73
+
74
+ ### Fixed
75
+
76
+ - The authoring skill works in a monorepo wherever the session started. It
77
+ looks for `versioncam.config.ts` across the whole repository before
78
+ deciding anything, works in the directory that holds it, and asks which
79
+ when there are several. It used to look only in the directory the session
80
+ was in. Invoked at a repository root with the app below it, it said
81
+ versioncam was not installed, and past that it would have set the root up
82
+ as a second app, with a second config.
83
+ - A scenes module whose scenes are not its default export is refused, with
84
+ the file's name and the shape it should have: a `Record<string, Scene>`
85
+ keyed by scene id. A module whose record was a named export used to count
86
+ as having no scenes, so `render` rendered none, said nothing, and stitched
87
+ a sequence without them. An array, a single scene, or an entry with no
88
+ `draw`, no whole `durationFrames` or no `fps` is refused the same way.
89
+ `render` and `preview --scene` refuse it before a browser starts, and the
90
+ render page refuses it too, for anything that renders a scene without the
91
+ CLI.
92
+ - `render --scene <id>` renders that scene whatever ids come with it. The
93
+ ids used to filter the named scenes as well, so
94
+ `render 02 04 --scene 01-intro --sequence` rendered no scene and stitched
95
+ the recordings without it. Ids still choose among the scenes `--scene`
96
+ does not name.
97
+ - `render --sequence` says what the sequence was stitched without: the ids
98
+ in the config's `sequence` that this run did not render, and the ones it
99
+ rendered that the `sequence` leaves out. The first note was in the code
100
+ and could never print. With fewer than two of the `sequence`'s clips
101
+ rendered, it says a sequence needs two, as it does with fewer than two
102
+ clips at all, rather than failing.
103
+ - `render --sequence` joins clips of different frame rates, such as a
104
+ 15 fps draft beside 60 fps recordings, or a scene or a clip with an `fps`
105
+ of its own. Every clip is brought to the highest rate among them, so none
106
+ loses a frame. It used to print ffmpeg's error that the clips' timebases
107
+ or frame rates do not match, and stop without a sequence. Clips that
108
+ share one rate are stitched exactly as before.
109
+ - A sequence that fails in ffmpeg leaves the `sequence.mp4` of an earlier
110
+ run as it was, and says that the one there is an earlier run's. It used
111
+ to leave that file empty, or an empty one where there had been none:
112
+ ffmpeg wrote straight to it, and had emptied it by the time it failed.
113
+ The sequence is now written beside it and takes its place only once it
114
+ is complete.
115
+ - A clip or scene that fails partway through `render` stops it at once, and
116
+ leaves the last good render as it was. A scene that threw at a frame used
117
+ to leave both ffmpeg encoders waiting for frames that would never come:
118
+ `render` printed the error and then never exited, which in CI is a job
119
+ that hangs until it is killed. ffmpeg also wrote straight over the
120
+ finished files, so a playable half-clip, and the failed run's poster, took
121
+ the place of the last good ones. The clip, its webm, its poster and its
122
+ contact sheet are now each written beside the last and take its place only
123
+ once complete, as the sequence is.
124
+ - A contact sheet's evenly spread tiles no longer land in the dissolve the
125
+ renderer draws after a settle, where a tile showed the page before the
126
+ wait ghosting through the page after it. The sheet `render` writes and
127
+ `versioncam sheet` without `--at-marks` move such a tile to the first
128
+ frame after the dissolve, as `--at-marks` already did for its own tiles.
129
+ The example app's first clip had one. A scene's sheet is unchanged, since
130
+ a scene never dissolves. `evenFrames` is exported beside `uniformFrames`
131
+ and `markedFrames`.
132
+
9
133
  ## 0.1.3 (2026-09-28)
10
134
 
11
135
  ### Added
package/README.md CHANGED
@@ -28,8 +28,12 @@ The first run of the skill sets the repository up. It writes
28
28
  `versioncam.config.ts` from what it finds, proves the app starts and records
29
29
  the same way twice, and only then writes the clip. See *Authoring*.
30
30
 
31
+ In a monorepo, run all three in the app's own directory. The skill goes
32
+ there, and so does the config its first run writes.
33
+
31
34
  `npx versioncam doctor` checks the rest: Node 22 or later, Chromium, ffmpeg,
32
- your config, and whether the app starts. ffmpeg and ffprobe come from the
35
+ your config and the scenes module it names, if any, and whether the app
36
+ starts. ffmpeg and ffprobe come from the
33
37
  system (`brew install ffmpeg`, `apt install ffmpeg`). The optional
34
38
  `ffmpeg-static` package covers a machine that has neither, but it has no
35
39
  ffprobe. versioncam is tested on macOS and Linux. Windows is untested.
@@ -108,10 +112,10 @@ cannot say, that is a missing field. It is not a reason to fork.
108
112
  | `review` | `minSeconds: 9`, `maxSeconds: 11` | How long a clip should run. `versioncam review` holds clips to it. |
109
113
  | `cursorStart` | `{ x: 0.72, y: 0.28 }` | Where the cursor rests in the first frame, as fractions of the viewport. |
110
114
  | `clock` | `time: "2026-09-01T09:00:00Z"`, `timezoneId: "UTC"`, `locale: "en-GB"` | The instant, time zone and locale the app sees. |
111
- | `theme` | `accent: "#2f6fed"`, `cursorScale: 2.1` | The colour of ripples and rings, the cursor's size, and an optional `presentation`. |
115
+ | `theme` | `accent: "#2f6fed"`, `cursorScale: 2.1` | The colour of ripples and rings, the cursor's size, and an optional `presentation`. See *Presentation*. |
112
116
  | `motion` | `MOTION` | Dwells, strokes and camera timing. `MOTION` is exported, with the reason for each number beside it. |
113
117
  | `outDir` | `".versioncam"` | Where everything the recorder writes goes. Gitignore it. |
114
- | `scenes` | none | A module whose default export is `Record<string, Scene>`. |
118
+ | `scenes` | none | A module whose default export is `Record<string, Scene>`, keyed by scene id: `export default { [intro.id]: intro }`. A named export is not read, and a module with no default export is refused. |
115
119
  | `sequence` | none | Clip ids, in order, for `versioncam render --sequence`. |
116
120
 
117
121
  ### Starting the app
@@ -153,6 +157,32 @@ For a stack of several services, point `url` at the one that is ready last,
153
157
  not at the page. A dev server answers seconds before the API behind it, and a
154
158
  clip that opens too early meets a sign-in form with nothing to sign in to.
155
159
 
160
+ ### Presentation
161
+
162
+ `theme.presentation` is what surrounds the app in the video. A backdrop, a
163
+ device frame and padding are off by default, because the product should
164
+ record the product. They are there for a clip that should look like a
165
+ product shot, on a landing page say. A caption is drawn over the app on a
166
+ soft scrim unless `caption` says otherwise.
167
+
168
+ ```ts
169
+ theme: {
170
+ presentation: { captionInset: { right: 40 } },
171
+ },
172
+ ```
173
+
174
+ | Field | Default | What it sets |
175
+ |---|---|---|
176
+ | `backdrop` | none | Behind the app: two colours for a diagonal gradient, or one flat colour. |
177
+ | `frame` | `false` | Rounded corners, a hairline and a drop shadow around the app. |
178
+ | `padding` | `0` | How far in the app is drawn, as a fraction of the video's shorter side, up to 0.3. |
179
+ | `caption` | `"auto"` | Where captions go: `"below"` the app, `"overlay"` on it, or `"none"`. `"auto"` is below when padding makes room, and over the app when it does not. |
180
+ | `captionInset` | `{ left: 40 }` | Where a caption over the app sits: `{ left: n }` or `{ right: n }`, pixels of the video in from that side. `right` puts it in the bottom-right corner, for an app whose own controls are at the bottom left. |
181
+
182
+ A caption inset is in the video's pixels. The video is `output.width` wide,
183
+ 1920 unless the config says otherwise, so with a page 1440 wide, four of the
184
+ video's pixels are three of the page's.
185
+
156
186
  ## Write a clip
157
187
 
158
188
  A clip is a file that default-exports `clip(id, options, body)`. The body
@@ -196,6 +226,43 @@ test holds that list to the session's code. The same reference is
196
226
  | `viewport`, `dpr`, `fps` | the config's | For a clip that needs a different shape. |
197
227
  | `capture` | the config's | A clip that films a canvas sets `{ forceCaptureEvery: 1 }` here. |
198
228
 
229
+ ### The camera
230
+
231
+ The camera crops the recorded page as the video plays. There are two ways
232
+ to point it.
233
+
234
+ - **`s.camera.zoom(target, scale)`** frames one thing and stays there: a form
235
+ being filled, an answer to read. `scale` is a ceiling, so a small target
236
+ is framed with room around it.
237
+ - **`s.camera.follow()`** follows the cursor at one scale until the next
238
+ camera line. Use it when a clip moves around the page, in place of a zoom
239
+ before each thing the cursor uses, which zooms in and out and pans in fits
240
+ and starts.
241
+
242
+ ```ts
243
+ s.camera.follow({ scale: 1.35 });
244
+ await s.typeInto(s.byTestId("recipient"), "Mira Halloran");
245
+ await s.click(s.byTestId("create-shipment"));
246
+ await s.click(s.byTestId("cancel-3")); // across the page, and the camera goes too
247
+ s.camera.reset();
248
+ await s.hold(1200);
249
+ ```
250
+
251
+ A camera that follows keeps the cursor inside a dead zone in the middle of
252
+ the frame, and moves only when the cursor leaves it: a move to the next field
253
+ of a form does not move the picture. It never shows beyond the page's edge,
254
+ and it moves smoothly, without overshooting. Its path is worked out from the
255
+ whole cursor track once the clip has run, so it sets off with the cursor
256
+ instead of trailing behind it. `s.camera.release()` stops it where it is.
257
+
258
+ Every camera line starts from wherever the camera is, still or moving, and
259
+ eases into its new framing over its `duration`. A zoom written while the last
260
+ one is still moving takes over from it without a stop. `s.camera.reset()`
261
+ goes back to the whole page.
262
+
263
+ `versioncam review` warns about a click that lands outside what the camera
264
+ shows. *The clip DSL* has every option and its default.
265
+
199
266
  ### Look before you write
200
267
 
201
268
  A clip written from an app's source reaches for controls that are
@@ -214,8 +281,9 @@ status line it waits for instead of guessing at it.
214
281
 
215
282
  ## Commands
216
283
 
217
- Every command runs from the directory that holds `versioncam.config.ts`.
218
- `npx versioncam --help` prints the same list.
284
+ Every command works in the directory that holds `versioncam.config.ts`: run
285
+ it from there, or name that directory with `--cwd`. `npx versioncam --help`
286
+ prints the same list.
219
287
 
220
288
  ### Set up
221
289
 
@@ -277,14 +345,43 @@ versioncam preview <id> open the scrubber in a real browser
277
345
 
278
346
  ### Output
279
347
 
280
- Turn recordings into video.
348
+ Turn recordings and scenes into video.
349
+
350
+ With no ids, `render` renders every recording in `.versioncam/recordings/`,
351
+ and stale ones are recordings too: a draft or a trial run, or a clip since
352
+ renamed or deleted, stays there until its directory is deleted. It renders
353
+ every scene as well. Ids choose among recordings and scenes alike, by
354
+ substring, as they choose clips for `record`. `--scene` names a scene
355
+ exactly, and it renders whatever the ids are. Without ids, the scenes it
356
+ names are the only scenes rendered. An id that matches nothing, or a
357
+ `--scene` the scenes module does not define, stops the command before
358
+ anything renders.
281
359
 
282
360
  ```
283
- versioncam render [id…] composite and encode what has been recorded
284
- --scene <id> render a designed scene (repeatable)
361
+ versioncam render [id…] composite and encode recordings and scenes
362
+ no ids: every one, stale recordings included
363
+ --scene <id> and this scene, whatever the ids say (repeatable)
285
364
  --sequence stitch the results into one piece
286
365
  ```
287
366
 
367
+ ### From another directory
368
+
369
+ In a monorepo the app is one directory among many. A command run from
370
+ somewhere else, the repository root or a subdirectory of the app, can name
371
+ the app's directory. The config, `.env.recording` and `.env`, `.versioncam/`
372
+ and any relative path are then that directory's. `--cwd` can go anywhere on
373
+ the line.
374
+
375
+ `npx` runs the versioncam it finds in the directory it is run from, or in the
376
+ nearest one above it, never in one below. From above an app that has
377
+ versioncam in its own `node_modules`, it runs another copy, or downloads the
378
+ latest. So `--cwd` refuses a directory whose own versioncam is not the one
379
+ running, and says to `cd` into it instead.
380
+
381
+ ```
382
+ versioncam <command> --cwd <dir> as if run in <dir>, which holds versioncam.config.ts
383
+ ```
384
+
288
385
  ## What a recording leaves behind
289
386
 
290
387
  `versioncam record` writes each clip to `.versioncam/recordings/<id>/`.
@@ -299,7 +396,8 @@ versioncam render [id…] composite and encode what has been recorded
299
396
 
300
397
  The timeline's `frames` say which state each frame shows. Beside them are the
301
398
  tracks the renderer draws: `cursor`, `pointer`, `camera`, `highlights` and
302
- `captions`. Three more fields are there for reading:
399
+ `captions`. A camera that follows the cursor, or eases from one move into
400
+ another, is kept as a key a frame. Three more fields are there for reading:
303
401
 
304
402
  - **`marks`** are the clip's beats: one per labelled `settle()`, at the first
305
403
  frame that shows what the wait was for. `versioncam sheet --at-marks`
@@ -327,8 +425,8 @@ that needs no eyes and no browser. It prints a line per check and exits 0 or 1:
327
425
  - **progress**: the screen changed between one beat and the next.
328
426
  - **rendered**: nothing was written after the last frame, where no frame
329
427
  would show it. A warning, not a failure.
330
- - **onscreen**: every highlight is inside what the camera shows. Also a
331
- warning.
428
+ - **onscreen**: every highlight and every click is inside what the camera
429
+ shows. Also a warning.
332
430
 
333
431
  What needs eyes is what the contact sheet and `versioncam frame` are for. Is
334
432
  it legible? Is the cursor in the way? Does the frame show what the beat
@@ -433,8 +531,8 @@ reads skills from another place. Then ask for a clip:
433
531
  /versioncam "Find a shipment by filtering the list, and show how many matched"
434
532
  ```
435
533
 
436
- **The first run** in a directory with no `versioncam.config.ts` sets the
437
- repository up before anything else:
534
+ **The first run** in a repository with no `versioncam.config.ts` sets it up
535
+ before anything else:
438
536
 
439
537
  1. It works out how the app starts and where it is served, from its scripts
440
538
  and its framework's config.
@@ -446,6 +544,11 @@ repository up before anything else:
446
544
 
447
545
  It commits nothing.
448
546
 
547
+ **In a monorepo** the skill first looks for `versioncam.config.ts` across the
548
+ whole repository, wherever the session started, and then works in the
549
+ directory that holds it. With several apps, it asks which. With none, the
550
+ first run writes the config where `versioncam init` put the skill.
551
+
449
552
  **Every run** then goes the same way. The session inspects the start page and
450
553
  reads `versioncam dsl` and your existing clips. It writes a beat sheet, then
451
554
  the clip, and records it in draft until `versioncam review` passes, three
@@ -2,7 +2,7 @@ import { chromium } from "playwright";
2
2
  import { existsSync } from "node:fs";
3
3
  import { ffmpegStatus } from "../../render/ffmpeg.js";
4
4
  import { ensureApp, probe } from "../../app-server.js";
5
- import { NO_CONFIG, findConfigFile, loadConfig } from "../../loader.js";
5
+ import { NO_CONFIG, findConfigFile, loadConfig, loadSceneIds, } from "../../loader.js";
6
6
  const NOT_SERVING = "Start the app, point `baseUrl` at where it is served, or add `webServer` to the config.";
7
7
  /**
8
8
  * Is the app the config points at serving — and if not, can it be started?
@@ -63,6 +63,39 @@ async function appCheck(cwd) {
63
63
  return { name: "app", ok: false, detail: first, fix: rest.join("\n") };
64
64
  }
65
65
  }
66
+ /**
67
+ * Are the app's scenes where the renderer reads them?
68
+ *
69
+ * Only for a config that names a scenes module. `render` refuses one whose
70
+ * scenes are not its default export, but only once someone renders, and then
71
+ * after the minutes that takes; this says so the first time anyone asks
72
+ * whether the repository is set up. Null when there is nothing to say: no
73
+ * scenes module, or a config that did not load, which the app check reports.
74
+ */
75
+ async function scenesCheck(cwd) {
76
+ let config;
77
+ try {
78
+ config = await loadConfig(cwd);
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ if (!config.scenes)
84
+ return null;
85
+ try {
86
+ const ids = await loadSceneIds(config);
87
+ return {
88
+ name: "scenes",
89
+ ok: true,
90
+ detail: `${config.scenes}: ${ids.join(", ") || "none defined"}`,
91
+ };
92
+ }
93
+ catch (error) {
94
+ // What is wrong, then the shape it should have and the fix beneath it.
95
+ const [first, ...rest] = error.message.split("\n");
96
+ return { name: "scenes", ok: false, detail: first, fix: rest.join("\n") };
97
+ }
98
+ }
66
99
  /**
67
100
  * Can this machine record and encode?
68
101
  *
@@ -114,8 +147,12 @@ export async function doctor() {
114
147
  });
115
148
  // Only with a config: without one there is no `baseUrl` to try, and saying
116
149
  // so twice would be noise.
117
- if (config !== null)
150
+ if (config !== null) {
151
+ const scenes = await scenesCheck(process.cwd());
152
+ if (scenes)
153
+ checks.push(scenes);
118
154
  checks.push(await appCheck(process.cwd()));
155
+ }
119
156
  for (const check of checks) {
120
157
  process.stdout.write(`${check.ok ? "✓" : "✗"} ${check.name.padEnd(9)} ${check.detail}\n`);
121
158
  if (!check.ok && check.fix) {
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,19 @@ const OLD_INSTALL = [
16
16
  join(".claude", "agents", "demo-author.md"),
17
17
  join(".claude", "agents", "demo-reviewer.md"),
18
18
  ];
19
+ /**
20
+ * The nearest directory from `dir` up that holds a `.git`: the root of the
21
+ * repository `dir` is in, or null when it is in none. A file counts as well
22
+ * as a directory, since that is what a linked worktree has.
23
+ */
24
+ function repositoryRoot(dir) {
25
+ for (let at = dir;; at = dirname(at)) {
26
+ if (existsSync(join(at, ".git")))
27
+ return at;
28
+ if (dirname(at) === at)
29
+ return null;
30
+ }
31
+ }
19
32
  /** Every file under `dir`, as paths relative to it. */
20
33
  async function filesUnder(dir) {
21
34
  const entries = await readdir(dir, { recursive: true, withFileTypes: true });
@@ -102,6 +115,18 @@ export async function init(argv) {
102
115
  process.stdout.write(`\nAn older install is still here, and this one replaces it. Remove it:\n` +
103
116
  old.map((path) => ` ${path}\n`).join(""));
104
117
  }
118
+ // Claude Code loads a project's skills from the directory a session starts
119
+ // in and from those above it, and one further down only once the session
120
+ // has read or edited a file in the directory that holds it. So an app below
121
+ // the repository root is the one place a session started at the root does
122
+ // not look, and the symptom comes much later, as a /versioncam that is not
123
+ // there. Said here because this is when anyone reads where the skill went.
124
+ const root = repositoryRoot(cwd);
125
+ if (!into && root !== null && root !== cwd) {
126
+ const here = relative(root, cwd);
127
+ process.stdout.write(`\nClaude Code loads the skill in a session started in ${here} or below it.\n` +
128
+ `A session started at the repository root loads it only after reading or editing a file in ${here}.\n`);
129
+ }
105
130
  process.stdout.write(`\nInstalled. Ask your agent: /versioncam "<what the clip should show>"\n` +
106
131
  "The first run sets this repository up. Documentation: https://version.cam\n");
107
132
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,GAAG,OAAO,CACxB,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,QAAQ,CACT,CAAC;AAEF,iGAAiG;AACjG,MAAM,WAAW,GAAG;IAClB,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,CAAC;IACzC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAC3C,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,kBAAkB,CAAC;CAC9C,CAAC;AAEF;;;;GAIG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,KAAK,IAAI,EAAE,GAAG,GAAG,GAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,KAAK,UAAU,UAAU,CAAC,GAAW;IACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SACrD,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,IAAI;QACV,OAAO,EAAE;YACP,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;YAC1C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACxB,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;SAC5C;QACD,MAAM,EAAE,KAAK;QACb,gBAAgB,EAAE,IAAI;KACvB,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8HAA8H,CAC/H,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IACtE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,eAAe,QAAQ,KAAK;YAC1B,6DAA6D,CAChE,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,IAA0B,CAAC;IAC/C,MAAM,WAAW,GAAG,IAAI;QACtB,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,YAAY,CAAC;QAClC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,IAAI;QACzB,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,wBAAwB,CAAC;QAC7C,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,CAAC,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;QAC1B,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;KAC5B,CAAC,CAAC,CAAC;IACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kBAAkB;YAChB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1D,kDAAkD,CACrD,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qBAAqB,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,gIAAgI,CACnL,CAAC;IACJ,CAAC;IAED,oEAAoE;IACpE,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0EAA0E;YACxE,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC5C,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yDAAyD,IAAI,iBAAiB;YAC5E,6FAA6F,IAAI,KAAK,CACzG,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,0EAA0E;QACxE,6EAA6E,CAChF,CAAC;IACF,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -4,7 +4,8 @@ import { join } from "node:path";
4
4
  import { launchBrowser } from "../../driver/launch.js";
5
5
  import { loadConfig } from "../../loader.js";
6
6
  import { renderConfigOf } from "../../config.js";
7
- import { bundleScenes } from "../../loader.js";
7
+ import { bundleScenes, loadSceneIds } from "../../loader.js";
8
+ import { missingScenes } from "../../render/scenes.js";
8
9
  import { distPageDir, installRenderRoutes, RENDER_ORIGIN, } from "../../render/serve.js";
9
10
  /**
10
11
  * Open the scrubber, in a browser a person can see.
@@ -32,6 +33,14 @@ export async function preview(argv) {
32
33
  process.stderr.write(`No recording for "${id}".\n`);
33
34
  return 1;
34
35
  }
36
+ // Said here rather than in a window that opens only to show an error.
37
+ if (sceneId) {
38
+ const defined = await loadSceneIds(config);
39
+ if (!defined.includes(sceneId)) {
40
+ process.stderr.write(`${missingScenes([sceneId], defined, config.scenes)}\n`);
41
+ return 1;
42
+ }
43
+ }
35
44
  const browser = await launchBrowser({ headless: false });
36
45
  const context = await browser.newContext({
37
46
  viewport: { width: 1400, height: 1000 },
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/commands/preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/cli/commands/preview.ts"],"names":[],"mappings":"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"}
@@ -1 +1,18 @@
1
+ /**
2
+ * What `render` renders, from what there is and what was asked for.
3
+ *
4
+ * Ids are substrings, as everywhere else (`render 05` is the clip with 05 in
5
+ * its id), and they choose among the recordings and the scenes alike. A
6
+ * `--scene` names one scene exactly, and it renders whatever the ids say: it
7
+ * used to be filtered by them as well, so `render 02 04 --scene 01-intro`
8
+ * rendered no scene at all. With no ids, every recording on disk renders,
9
+ * and every scene unless `--scene` named the ones wanted.
10
+ *
11
+ * `unmatched` is the ids that choose nothing.
12
+ */
13
+ export declare function chooseTargets(recorded: string[], defined: string[], ids: string[], named: string[]): {
14
+ recordings: string[];
15
+ scenes: string[];
16
+ unmatched: string[];
17
+ };
1
18
  export declare function render(argv: string[]): Promise<number>;