@remixmate/cli 0.9.14 → 0.9.16
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/README.md +1 -1
- package/README.zh-CN.md +1 -1
- package/dist/billing.d.ts +44 -0
- package/dist/billing.js +76 -0
- package/dist/capabilities.d.ts +5 -1
- package/dist/cli.js +0 -0
- package/dist/http.d.ts +3 -0
- package/dist/http.js +4 -0
- package/dist/manifest.json +13 -13
- package/dist/runner.js +9 -0
- package/package.json +1 -1
- package/skills/export-jianying/version.json +1 -1
- package/skills/gen-digital-human/SKILL.md +12 -0
- package/skills/gen-digital-human/skill.json +9 -3
- package/skills/gen-digital-human/version.json +1 -1
- package/skills/gen-image/SKILL.md +51 -17
- package/skills/gen-image/skill.json +11 -3
- package/skills/gen-image/version.json +1 -1
- package/skills/gen-script/SKILL.md +17 -21
- package/skills/gen-script/version.json +1 -1
- package/skills/gen-video/SKILL.md +17 -3
- package/skills/gen-video/skill.json +10 -2
- package/skills/gen-video/version.json +1 -1
- package/skills/gen-voice/SKILL.md +13 -1
- package/skills/gen-voice/version.json +1 -1
- package/skills/prepare-video-assets/SKILL.md +12 -0
- package/skills/prepare-video-assets/version.json +1 -1
- package/skills/render-video/SKILL.md +12 -0
- package/skills/render-video/scripts/render_video.py +63 -0
- package/skills/render-video/version.json +1 -1
- package/skills/template-registry/scripts/render_job_client.py +27 -0
- package/skills/template-registry/version.json +1 -1
- package/skills/video-parser/version.json +1 -1
- package/skills/web-record/SKILL.md +131 -133
- package/skills/web-screenshot/SKILL.md +93 -96
- package/skills/web-screenshot/version.json +1 -1
|
@@ -1,60 +1,58 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: web-record
|
|
3
3
|
description: |
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
4
|
+
Web-page recording / storyboard video skill (records webm, then by default transcodes to mp4 + grabs a cover frame + uploads to VOD and returns a CDN URL), built on Playwright Python.
|
|
5
|
+
Supports: fixed-duration recording, condition-triggered stop (element appears / disappears), auto-scroll recording (top to bottom), custom storyboards, and parameterized templates.
|
|
6
|
+
Storyboard scenes: highlight / focus / zoom / scroll / virtual-cursor click / type / hover / caption / title card / arrow / numbered sequence / redact / code-line highlight.
|
|
7
|
+
|
|
8
|
+
Video only. For still screenshots (png/jpg) use web-screenshot / `web_screenshot`.
|
|
9
|
+
|
|
10
|
+
Use this skill immediately whenever the user asks for any of:
|
|
11
|
+
- Screen recording, record a web page, record a video, capture an interaction, produce a webm, screencast
|
|
12
|
+
- Scroll recording, a video that pans the page from top to bottom
|
|
13
|
+
- Multi-scene video, storyboard video, timeline-sequenced clips (highlight box / zoom-in / scrolling walkthrough)
|
|
14
|
+
- Animated demos of clicks / typing / hover (virtual cursor + ripple / typewriter / triggering tooltips)
|
|
15
|
+
- One-command clips from a template (github-repo-intro / github-readme-tour / github-code-tour, etc.)
|
|
16
16
|
triggers:
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
17
|
+
- Screen recording, record a web page, record a video, capture an interaction, produce a webm, screencast
|
|
18
|
+
- Scroll recording, a video that pans the page from top to bottom
|
|
19
|
+
- Multi-scene video, storyboard video, timeline-sequenced clips
|
|
20
|
+
- Animated demos of clicks / typing / hover (virtual cursor + ripple / typewriter / triggering tooltips)
|
|
21
|
+
- One-command template clips, numbering and highlighting several regions in sequence and recording it
|
|
22
22
|
---
|
|
23
23
|
|
|
24
|
-
#
|
|
24
|
+
# Web Recording / Storyboard Video Skill (`web_record`)
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
The recording entry point. For still screenshots use **web-screenshot / `web_screenshot`** instead.
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
`_media_screenshot/` 包(`skill.json` 的 `entry.scriptPath` 相对指向
|
|
30
|
-
`../web-screenshot/scripts/record.py`)。下文命令里的 **`<RecordScript>`** 一律替换为:
|
|
28
|
+
**Script location**: this skill has no `scripts/` of its own — it reuses `record.py` and the `_media_screenshot/` package from the web-screenshot directory (`skill.json`'s `entry.scriptPath` points relatively at `../web-screenshot/scripts/record.py`). Everywhere the commands below say **`<RecordScript>`**, substitute:
|
|
31
29
|
|
|
32
30
|
```
|
|
33
31
|
<SkillDir>/../web-screenshot/scripts/record.py
|
|
34
32
|
```
|
|
35
33
|
|
|
36
|
-
>
|
|
34
|
+
> Path convention: read the system-injected `Base directory for this skill: <path>` as `<SkillDir>`. Never hardcode an absolute path.
|
|
37
35
|
|
|
38
|
-
##
|
|
36
|
+
## Prerequisites
|
|
39
37
|
|
|
40
38
|
- **Python 3.9+**
|
|
41
|
-
-
|
|
42
|
-
- **ffmpeg
|
|
39
|
+
- **The `playwright` pip package + the chromium engine**: the first run **bootstraps automatically** (`pip install playwright` + `playwright install chromium`).
|
|
40
|
+
- **ffmpeg** (optional): only needed on the standalone `--no-upload` path, to trim the loading segment off the start. On the default upload path ab-render trims it in the same transcode pass, so no local ffmpeg is required.
|
|
43
41
|
|
|
44
|
-
##
|
|
42
|
+
## Output and upload
|
|
45
43
|
|
|
46
|
-
|
|
44
|
+
Default behavior (it does **not** just drop a webm): record `.webm` → hand off to ab-render to transcode to mp4 + grab a cover frame → upload to VOD → print a playable CDN URL, and **delete the local webm** (VOD holds the copy).
|
|
47
45
|
|
|
48
|
-
- `--no-upload
|
|
49
|
-
- `--keep-webm
|
|
50
|
-
- `--cover-at-sec
|
|
51
|
-
- `--vod-title
|
|
46
|
+
- `--no-upload`: skip the finishing steps and keep only the local `.webm` (in this case local ffmpeg makes a best-effort trim of the start; without ffmpeg the raw clip is kept and a notice printed).
|
|
47
|
+
- `--keep-webm`: keep the local `.webm` even after a successful upload.
|
|
48
|
+
- `--cover-at-sec`: cover-frame timestamp, default `0.5` seconds (avoids a blank first frame).
|
|
49
|
+
- `--vod-title`: VOD asset title, defaults to the output file name.
|
|
52
50
|
|
|
53
|
-
|
|
51
|
+
Requires the env vars **`PRIV_TOKEN`** (auth) and **`REMOTION_RENDER_API_URL`** (ab-render address). Without `PRIV_TOKEN` it degrades automatically to "local file only" and says so on stderr; an upload failure degrades the same way, so an already-recorded file is never lost.
|
|
54
52
|
|
|
55
|
-
##
|
|
53
|
+
## Recording usage
|
|
56
54
|
|
|
57
|
-
###
|
|
55
|
+
### Fixed-duration recording
|
|
58
56
|
|
|
59
57
|
```bash
|
|
60
58
|
python3 <RecordScript> \
|
|
@@ -64,17 +62,17 @@ python3 <RecordScript> \
|
|
|
64
62
|
--duration 8000
|
|
65
63
|
```
|
|
66
64
|
|
|
67
|
-
###
|
|
65
|
+
### Stop on a condition (pair it with max-duration so it can't hang)
|
|
68
66
|
|
|
69
67
|
```bash
|
|
70
|
-
#
|
|
68
|
+
# Stop once the "loaded" element appears
|
|
71
69
|
python3 <RecordScript> \
|
|
72
70
|
--url "https://example.com" \
|
|
73
71
|
--output "loaded.webm" \
|
|
74
72
|
--stop-when-selector "div.loaded" \
|
|
75
73
|
--max-duration 30000
|
|
76
74
|
|
|
77
|
-
#
|
|
75
|
+
# Stop once the loading spinner disappears
|
|
78
76
|
python3 <RecordScript> \
|
|
79
77
|
--url "https://example.com" \
|
|
80
78
|
--output "spinner_done.webm" \
|
|
@@ -82,7 +80,7 @@ python3 <RecordScript> \
|
|
|
82
80
|
--max-duration 30000
|
|
83
81
|
```
|
|
84
82
|
|
|
85
|
-
###
|
|
83
|
+
### Combined: whichever fires first wins
|
|
86
84
|
|
|
87
85
|
```bash
|
|
88
86
|
python3 <RecordScript> \
|
|
@@ -93,7 +91,7 @@ python3 <RecordScript> \
|
|
|
93
91
|
--max-duration 20000
|
|
94
92
|
```
|
|
95
93
|
|
|
96
|
-
###
|
|
94
|
+
### Wait for the page to be ready before recording
|
|
97
95
|
|
|
98
96
|
```bash
|
|
99
97
|
python3 <RecordScript> \
|
|
@@ -104,7 +102,7 @@ python3 <RecordScript> \
|
|
|
104
102
|
--duration 6000
|
|
105
103
|
```
|
|
106
104
|
|
|
107
|
-
###
|
|
105
|
+
### Auto-scroll recording (top to bottom)
|
|
108
106
|
|
|
109
107
|
```bash
|
|
110
108
|
python3 <RecordScript> \
|
|
@@ -118,36 +116,36 @@ python3 <RecordScript> \
|
|
|
118
116
|
--scroll-pause-bottom 1500
|
|
119
117
|
```
|
|
120
118
|
|
|
121
|
-
###
|
|
119
|
+
### Template videos (fast path)
|
|
122
120
|
|
|
123
|
-
`templates/`
|
|
121
|
+
`templates/` ships parameterized storyboard templates that turn common structures into a one-line command:
|
|
124
122
|
|
|
125
123
|
```bash
|
|
126
|
-
#
|
|
124
|
+
# List available templates
|
|
127
125
|
python3 <RecordScript> --list-templates
|
|
128
126
|
|
|
129
|
-
#
|
|
127
|
+
# Record any GitHub repo with the github-repo-intro template
|
|
130
128
|
python3 <RecordScript> \
|
|
131
129
|
--template github-repo-intro \
|
|
132
130
|
--param repo_url=https://github.com/user/repo \
|
|
133
131
|
--output repo.webm
|
|
134
132
|
```
|
|
135
133
|
|
|
136
|
-
|
|
134
|
+
Repeat `--param key=value` to override the template's defaults (label text, colors, zoom factor, etc.). A template's `_meta.params` declares the parameters it accepts.
|
|
137
135
|
|
|
138
|
-
|
|
136
|
+
**Current templates**:
|
|
139
137
|
|
|
140
|
-
|
|
|
141
|
-
|
|
142
|
-
| `github-repo-intro` | GitHub
|
|
143
|
-
| `github-readme-tour` |
|
|
144
|
-
| `github-code-tour` |
|
|
138
|
+
| Name | Description | Required params |
|
|
139
|
+
|------|-------------|-----------------|
|
|
140
|
+
| `github-repo-intro` | GitHub repo trio: highlight the project name → zoom the star count → scroll the README | `repo_url` |
|
|
141
|
+
| `github-readme-tour` | Title card → project name → cursor hovers star → README scroll → closing call to action | `repo_url` |
|
|
142
|
+
| `github-code-tour` | Jump to a file → highlight a line range → caption walkthrough | `file_url` / `start_line` / `end_line` |
|
|
145
143
|
|
|
146
|
-
|
|
144
|
+
**Adding a template**: drop a JSON file under `<SkillDir>/../web-screenshot/templates/`, write the scenes in storyboard format, and use `{{var_name}}` placeholders. Optionally add `_meta.params` to declare parameters (marked `required: true` / `default: ...`). A placeholder that is the entire string is auto-converted to int/float/bool (e.g. `"scale": "{{zoom_scale}}"` renders as a number).
|
|
147
145
|
|
|
148
|
-
###
|
|
146
|
+
### Custom storyboards
|
|
149
147
|
|
|
150
|
-
|
|
148
|
+
Compose a sequence of "scenes" into one video; scenes are joined by an overlay cross-fade (**never a black frame**).
|
|
151
149
|
|
|
152
150
|
```bash
|
|
153
151
|
python3 <RecordScript> \
|
|
@@ -157,7 +155,7 @@ python3 <RecordScript> \
|
|
|
157
155
|
--storyboard story.json
|
|
158
156
|
```
|
|
159
157
|
|
|
160
|
-
`story.json
|
|
158
|
+
Example `story.json`:
|
|
161
159
|
|
|
162
160
|
```json
|
|
163
161
|
{
|
|
@@ -173,7 +171,7 @@ python3 <RecordScript> \
|
|
|
173
171
|
"color": "#ff3b30",
|
|
174
172
|
"lineWidth": 5,
|
|
175
173
|
"padding": 10,
|
|
176
|
-
"label": "
|
|
174
|
+
"label": "Project name",
|
|
177
175
|
"duration": 3000
|
|
178
176
|
},
|
|
179
177
|
{
|
|
@@ -184,7 +182,7 @@ python3 <RecordScript> \
|
|
|
184
182
|
"rampInMs": 900,
|
|
185
183
|
"holdMs": 2200,
|
|
186
184
|
"rampOutMs": 700,
|
|
187
|
-
"label": "⭐ Star
|
|
185
|
+
"label": "⭐ Star count"
|
|
188
186
|
},
|
|
189
187
|
{
|
|
190
188
|
"type": "scroll",
|
|
@@ -198,80 +196,80 @@ python3 <RecordScript> \
|
|
|
198
196
|
}
|
|
199
197
|
```
|
|
200
198
|
|
|
201
|
-
|
|
199
|
+
**Scene types**:
|
|
202
200
|
|
|
203
|
-
|
|
204
|
-
- `highlight` —
|
|
205
|
-
- `focus` —
|
|
206
|
-
- `zoom` —
|
|
207
|
-
- `target: "element"` (
|
|
208
|
-
- `target: "page"` —
|
|
201
|
+
*Visual emphasis*
|
|
202
|
+
- `highlight` — box around an element + label; `padding` / `lineWidth` / `color` / `duration`
|
|
203
|
+
- `focus` — dim the surroundings (spotlight) + outline the element + label
|
|
204
|
+
- `zoom` — zoom animation
|
|
205
|
+
- `target: "element"` (default) — scale the target element itself (elastic curve)
|
|
206
|
+
- `target: "page"` — zoom the whole page around the target element's center, like browser zoom
|
|
209
207
|
- `scale` / `rampInMs` / `rampOutMs` / `holdMs` / `dim` / `label` / `color`
|
|
210
|
-
- `scroll` —
|
|
211
|
-
- `wait` —
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
- `click` —
|
|
215
|
-
- `type` —
|
|
216
|
-
- `hover` —
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
- `arrow` —
|
|
220
|
-
- `sequence` —
|
|
221
|
-
- `caption` —
|
|
222
|
-
- `title-card` —
|
|
223
|
-
- `redact` —
|
|
224
|
-
|
|
225
|
-
*GitHub
|
|
226
|
-
- `code-lines` —
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
###
|
|
231
|
-
|
|
232
|
-
|
|
|
233
|
-
|
|
234
|
-
| `-u` / `--url` |
|
|
235
|
-
| `-o` / `--output` |
|
|
236
|
-
| `-b` / `--browser` | `chromium` / `firefox` / `webkit
|
|
237
|
-
| `--device` |
|
|
238
|
-
| `--viewport` | `"
|
|
239
|
-
| `--duration` |
|
|
240
|
-
| `--stop-when-selector` |
|
|
241
|
-
| `--stop-when-hidden` |
|
|
242
|
-
| `--max-duration` |
|
|
243
|
-
| `--scroll-through` |
|
|
244
|
-
| `--scroll-step` |
|
|
245
|
-
| `--scroll-interval` |
|
|
246
|
-
| `--scroll-pause-top` |
|
|
247
|
-
| `--scroll-pause-bottom` |
|
|
248
|
-
| `--storyboard` |
|
|
249
|
-
| `--template` |
|
|
250
|
-
| `--param` |
|
|
251
|
-
| `--list-templates` |
|
|
252
|
-
| `--wait-for-selector` |
|
|
253
|
-
| `--wait-for-timeout` |
|
|
254
|
-
| `--color-scheme` | prefers-color-scheme |
|
|
255
|
-
| `--user-agent` |
|
|
256
|
-
| `--timeout` | Playwright
|
|
257
|
-
| `--ignore-https-errors` |
|
|
258
|
-
| `--storage-state` | storageState JSON
|
|
259
|
-
| `--cookies` | cookies JSON
|
|
260
|
-
| `--no-upload` |
|
|
261
|
-
| `--vod-title` |
|
|
262
|
-
| `--cover-at-sec` |
|
|
263
|
-
| `--keep-webm` |
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
##
|
|
268
|
-
|
|
269
|
-
-
|
|
270
|
-
- **`ModuleNotFoundError: playwright
|
|
271
|
-
- **`Executable doesn't exist
|
|
272
|
-
- **`Timeout ... exceeded
|
|
273
|
-
-
|
|
274
|
-
-
|
|
275
|
-
- **storyboard
|
|
276
|
-
-
|
|
277
|
-
- **HTTPS
|
|
208
|
+
- `scroll` — scroll to a target. `fromSelector` start, `toSelector` end, `step` / `interval` / `duration` / `holdAtEnd`
|
|
209
|
+
- `wait` — plain pause for `duration`
|
|
210
|
+
|
|
211
|
+
*Interaction simulation (virtual cursor)*
|
|
212
|
+
- `click` — cursor flies to the element → ripple → really fires `el.click()`. `moveMs` / `preHoldMs` / `postHoldMs` / `rippleMs` / `color` / `realClick` (default true; set false to animate without clicking)
|
|
213
|
+
- `type` — cursor flies to the input → focus → types character by character. `text` / `delay` (ms per char) / `clearFirst` / `moveCursor`
|
|
214
|
+
- `hover` — cursor moves onto the element and triggers a native hover; typical for surfacing a tooltip / hover card. `moveMs` / `holdMs`
|
|
215
|
+
|
|
216
|
+
*Annotation*
|
|
217
|
+
- `arrow` — draw an SVG curved arrow from one anchor to another. Anchors `from` / `to` look like `{selector, side}` (side: center/left/right/top/bottom) or `{x, y}`. `color` / `lineWidth` / `label` / `duration`
|
|
218
|
+
- `sequence` — several selectors get ①②③ circular badges + boxes + labels in order. `items: [{selector, label}, ...]` / `stepMs` controls the gap between steps / `color` / `holdMs`
|
|
219
|
+
- `caption` — caption bar sliding in from the top/bottom. `text` / `position: top|bottom` / `background` / `color` / `fontSize` / `duration`
|
|
220
|
+
- `title-card` — full-screen opening/closing title card. `title` / `subtitle` (optional) / `background` / `accent` / `duration`
|
|
221
|
+
- `redact` — mask a region: blur / pixelate / solid. `selectors: [...]` or `selector` / `mode: "blur" | "pixelate" | "solid"` / `color` (when solid) / `duration`
|
|
222
|
+
|
|
223
|
+
*GitHub-specific*
|
|
224
|
+
- `code-lines` — highlight a contiguous code-line range (matches the new React blob `[data-line-number="{n}"]` by default; the old table-based blob needs `linePattern: "#LC{n}"`). `startLine` / `endLine` / `linePattern` / `color` / `label` / `duration`
|
|
225
|
+
|
|
226
|
+
**Automatic trimming**: in storyboard mode the recorder waits for the page to genuinely settle (networkidle + skeletons gone), then trims the leading load segment afterwards with frame-accurate ffmpeg, so the final video length ≈ the sum of the scene durations.
|
|
227
|
+
|
|
228
|
+
### Full flag list
|
|
229
|
+
|
|
230
|
+
| Flag | Description | Default |
|
|
231
|
+
|------|-------------|---------|
|
|
232
|
+
| `-u` / `--url` | Target URL (required) | — |
|
|
233
|
+
| `-o` / `--output` | Local `.webm` output path | `recording.webm` |
|
|
234
|
+
| `-b` / `--browser` | `chromium` / `firefox` / `webkit` (chromium recommended) | `chromium` |
|
|
235
|
+
| `--device` | Device emulation | none |
|
|
236
|
+
| `--viewport` | `"width,height"` | none |
|
|
237
|
+
| `--duration` | Fixed recording length (ms) | none |
|
|
238
|
+
| `--stop-when-selector` | Stop once this selector appears | none |
|
|
239
|
+
| `--stop-when-hidden` | Stop once this selector disappears | none |
|
|
240
|
+
| `--max-duration` | Safety cap for condition modes (ms) | 60000 |
|
|
241
|
+
| `--scroll-through` | Auto-scroll from top to bottom | off |
|
|
242
|
+
| `--scroll-step` | Pixels per step | 60 |
|
|
243
|
+
| `--scroll-interval` | Interval between steps (ms) | 50 |
|
|
244
|
+
| `--scroll-pause-top` | Pause at the top (ms) | 800 |
|
|
245
|
+
| `--scroll-pause-bottom` | Pause at the bottom (ms) | 1200 |
|
|
246
|
+
| `--storyboard` | Storyboard JSON file path | none |
|
|
247
|
+
| `--template` | Template name (`templates/<name>.json`); mutually exclusive with `--storyboard` | none |
|
|
248
|
+
| `--param` | Template parameter `key=value` (repeatable) | none |
|
|
249
|
+
| `--list-templates` | List available templates and exit | — |
|
|
250
|
+
| `--wait-for-selector` | Wait for this selector before recording | none |
|
|
251
|
+
| `--wait-for-timeout` | Fixed wait before recording (ms) | none |
|
|
252
|
+
| `--color-scheme` | prefers-color-scheme | none |
|
|
253
|
+
| `--user-agent` | Override the User-Agent | none |
|
|
254
|
+
| `--timeout` | Playwright global timeout (ms) | none |
|
|
255
|
+
| `--ignore-https-errors` | Ignore certificate errors | off |
|
|
256
|
+
| `--storage-state` | storageState JSON file | none |
|
|
257
|
+
| `--cookies` | cookies JSON string or file | none |
|
|
258
|
+
| `--no-upload` | Skip the upload; keep only the local webm | off (uploads by default) |
|
|
259
|
+
| `--vod-title` | Title for the VOD upload | output file name |
|
|
260
|
+
| `--cover-at-sec` | Cover-frame timestamp (seconds) | 0.5 |
|
|
261
|
+
| `--keep-webm` | Keep the local webm after a successful upload | off (deleted by default) |
|
|
262
|
+
|
|
263
|
+
At least one of `--duration` / `--stop-when-selector` / `--stop-when-hidden` / `--scroll-through` / `--storyboard` / `--template` must be supplied; when several are combined, **whichever fires first stops the recording**, with `--max-duration` as the backstop. A template / storyboard JSON may carry its own `url`, in which case `--url` can be omitted.
|
|
264
|
+
|
|
265
|
+
## Error handling
|
|
266
|
+
|
|
267
|
+
- **The first run is slow**: the script auto-runs `pip install playwright` + `playwright install chromium`. Wait it out once.
|
|
268
|
+
- **`ModuleNotFoundError: playwright`**: the bootstrap did not complete; run `pip install playwright && playwright install chromium` manually.
|
|
269
|
+
- **`Executable doesn't exist`**: the browser engine is missing; run `playwright install chromium`.
|
|
270
|
+
- **`Timeout ... exceeded`**: raise `--timeout` / `--wait-for-timeout`, or switch to a more reliable `--wait-for-selector`.
|
|
271
|
+
- **No recording file produced**: check that `--output` ends in `.webm`; read the `stop reason` on stderr.
|
|
272
|
+
- **Got a local path but no CDN URL**: usually `PRIV_TOKEN` is unset, or the finishing steps failed and it degraded — stderr has the reason.
|
|
273
|
+
- **Loading artifacts still visible at the start of a storyboard**: raise `settleMs` / add `waitForReadySelectors`; the `--no-upload` path additionally needs local ffmpeg.
|
|
274
|
+
- **Session expired**: re-export `storageState` or update the cookies JSON — `domain` / `path` must match.
|
|
275
|
+
- **HTTPS certificate errors**: in test environments add `--ignore-https-errors`.
|