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.
- package/CHANGELOG.md +124 -0
- package/README.md +116 -13
- package/dist/cli/commands/doctor.js +39 -2
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/init.js +25 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/preview.js +10 -1
- package/dist/cli/commands/preview.js.map +1 -1
- package/dist/cli/commands/render.d.ts +17 -0
- package/dist/cli/commands/render.js +78 -21
- package/dist/cli/commands/render.js.map +1 -1
- package/dist/cli/cwd.d.ts +46 -0
- package/dist/cli/cwd.js +102 -0
- package/dist/cli/cwd.js.map +1 -0
- package/dist/cli/main.js +11 -2
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/usage.d.ts +3 -2
- package/dist/cli/usage.js +9 -4
- package/dist/cli/usage.js.map +1 -1
- package/dist/config.d.ts +24 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -1
- package/dist/core/camera-track.d.ts +63 -0
- package/dist/core/camera-track.js +230 -0
- package/dist/core/camera-track.js.map +1 -0
- package/dist/core/camera.d.ts +14 -1
- package/dist/core/camera.js +18 -2
- package/dist/core/camera.js.map +1 -1
- package/dist/core/follow.d.ts +129 -0
- package/dist/core/follow.js +151 -0
- package/dist/core/follow.js.map +1 -0
- package/dist/core/motion-defaults.d.ts +29 -0
- package/dist/core/motion-defaults.js +29 -0
- package/dist/core/motion-defaults.js.map +1 -1
- package/dist/core/timeline.d.ts +10 -2
- package/dist/core/timeline.js.map +1 -1
- package/dist/driver/session.d.ts +22 -1
- package/dist/driver/session.js +48 -12
- package/dist/driver/session.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +7 -1
- package/dist/loader.js +23 -8
- package/dist/loader.js.map +1 -1
- package/dist/page/assets/index-fZtacWyp.js +2 -0
- package/dist/page/index.html +1 -1
- package/dist/render/encode.d.ts +12 -1
- package/dist/render/encode.js +94 -35
- package/dist/render/encode.js.map +1 -1
- package/dist/render/presentation.d.ts +12 -0
- package/dist/render/presentation.js +15 -0
- package/dist/render/presentation.js.map +1 -1
- package/dist/render/render.js +18 -1
- package/dist/render/render.js.map +1 -1
- package/dist/render/sampling.d.ts +13 -0
- package/dist/render/sampling.js +47 -19
- package/dist/render/sampling.js.map +1 -1
- package/dist/render/scenes.d.ts +16 -0
- package/dist/render/scenes.js +108 -0
- package/dist/render/scenes.js.map +1 -0
- package/dist/render/sequence.d.ts +18 -0
- package/dist/render/sequence.js +67 -13
- package/dist/render/sequence.js.map +1 -1
- package/dist/review/review.js +46 -21
- package/dist/review/review.js.map +1 -1
- package/dsl.md +37 -0
- package/package.json +1 -1
- package/plugin/README.md +7 -2
- package/plugin/agents/versioncam-reviewer.md +3 -2
- package/plugin/skills/versioncam/SKILL.md +60 -14
- package/plugin/skills/versioncam/authoring.md +6 -1
- package/plugin/skills/versioncam/onboarding.md +17 -17
- 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
|
|
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
|
|
218
|
-
`npx versioncam --help`
|
|
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
|
|
284
|
-
|
|
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`.
|
|
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
|
|
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
|
|
437
|
-
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EACL,SAAS,EACT,cAAc,EACd,UAAU,EACV,YAAY,GACb,MAAM,iBAAiB,CAAC;AAIzB,MAAM,WAAW,GACf,yFAAyF,CAAC;AAE5F;;;;;;;;;;;;;;GAcG;AACH,KAAK,UAAU,QAAQ,CAAC,GAAW;IACjC,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,KAAK;YACX,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,wBAAyB,KAAe,CAAC,OAAO,EAAE;YAC1D,GAAG,EAAE,6DAA6D;SACnE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,EAAE;YACd,CAAC,CAAC;gBACE,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,sBAAsB,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,MAAM,GAAG;aACvE;YACH,CAAC,CAAC;gBACE,IAAI,EAAE,KAAK;gBACX,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE;gBAC7C,GAAG,EAAE,WAAW;aACjB,CAAC;IACR,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;SACnE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,oEAAoE;QACpE,gDAAgD;QAChD,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAI,KAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACzE,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,WAAW,CAAC,GAAW;IACpC,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEhC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,EAAE;SAChE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,uEAAuE;QACvE,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAI,KAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5E,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM;IAC1B,MAAM,MAAM,GAAY,EAAE,CAAC;IAE3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,MAAM;QACZ,EAAE,EAAE,KAAK,IAAI,EAAE;QACf,MAAM,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QACnC,GAAG,EAAE,2BAA2B;KACjC,CAAC,CAAC;IAEH,IAAI,YAAY,GAAG,EAAE,CAAC;IACtB,IAAI,CAAC;QACH,YAAY,GAAG,QAAQ,CAAC,cAAc,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,YAAY,GAAG,EAAE,CAAC;IACpB,CAAC;IACD,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,UAAU;QAChB,EAAE,EAAE,YAAY,KAAK,EAAE,IAAI,UAAU,CAAC,YAAY,CAAC;QACnD,MAAM,EAAE,YAAY,IAAI,eAAe;QACvC,GAAG,EAAE,wBAAwB;KAC9B,CAAC,CAAC;IAEH,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,MAAM,KAAK,IAAI;QACnB,MAAM,EAAE,MAAM,IAAI,WAAW;QAC7B,GAAG,EAAE,8CAA8C;KACpD,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,OAAO,KAAK,IAAI;QACpB,MAAM,EAAE,OAAO,IAAI,WAAW;QAC9B,GAAG,EAAE,0DAA0D;KAChE,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,QAAQ;QACd,EAAE,EAAE,MAAM,KAAK,IAAI;QACnB,MAAM,EAAE,MAAM,IAAI,8BAA8B,OAAO,CAAC,GAAG,EAAE,EAAE;QAC/D,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IAEH,2EAA2E;IAC3E,2BAA2B;IAC3B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAChD,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CACpE,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
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>;
|