screencast-axi 0.1.1 → 0.1.3
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 +115 -114
- package/dist/src/browser.js +10 -12
- package/dist/src/browser.js.map +1 -1
- package/dist/src/commands/home.js +43 -10
- package/dist/src/commands/home.js.map +1 -1
- package/dist/src/commands/scaffold.js +16 -6
- package/dist/src/commands/scaffold.js.map +1 -1
- package/dist/src/commands/setup.js +2 -7
- package/dist/src/commands/setup.js.map +1 -1
- package/dist/src/config.js +60 -38
- package/dist/src/config.js.map +1 -1
- package/dist/src/resolve.d.ts +28 -0
- package/dist/src/resolve.js +59 -0
- package/dist/src/resolve.js.map +1 -0
- package/dist/src/skill.js +10 -8
- package/dist/src/skill.js.map +1 -1
- package/dist/src/toolchain.js +10 -14
- package/dist/src/toolchain.js.map +1 -1
- package/dist/src/types.d.ts +15 -0
- package/dist/src/types.js +24 -0
- package/dist/src/types.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +1 -1
- package/skills/screencast-axi/SKILL.md +10 -8
- package/dist/src/hooks.d.ts +0 -9
- package/dist/src/hooks.js +0 -20
- package/dist/src/hooks.js.map +0 -1
package/README.md
CHANGED
|
@@ -12,8 +12,110 @@ conventions, so an agent can drive it as comfortably as a person can.
|
|
|
12
12
|
<sup>The ask, the scenario that came back, and the take it produced - itself recorded by this tool,
|
|
13
13
|
from [`demo/scenarios/demo.ts`](demo/scenarios/demo.ts). Re-record it with `pnpm demo`.</sup>
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
[](https://www.npmjs.com/package/screencast-axi)
|
|
16
|
+
|
|
17
|
+
## Install
|
|
18
|
+
|
|
19
|
+
Two ways, and which one fits depends on how often you record.
|
|
20
|
+
|
|
21
|
+
**Recording regularly** - install it in the project, so the commands are short and your editor has
|
|
22
|
+
the types:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
pnpm add -D screencast-axi playwright tsx
|
|
26
|
+
pnpm exec playwright install chromium
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
pnpm 11 refuses to run a dependency's install script until you allow it, and `tsx` brings
|
|
30
|
+
`esbuild`, which needs its script to place a binary. Run `pnpm approve-builds` and pick `esbuild`,
|
|
31
|
+
or put the same thing in `pnpm-workspace.yaml`:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
allowBuilds:
|
|
35
|
+
esbuild: true
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**A one-off, or a repo that should not carry the tool** - run it through `npx` and install nothing
|
|
39
|
+
in the project at all:
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
npx -y -p screencast-axi -p playwright -p tsx screencast-axi record ./scenarios/product-tour.ts
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The one rule that makes the second form work: a scenario imports only **types** from the package.
|
|
46
|
+
`import type` is erased when the file is compiled, so nothing is resolved from your project at
|
|
47
|
+
runtime - which is what an npx cache cannot provide. `scaffold` writes files that way already. A
|
|
48
|
+
runtime import (`import { defineScenario } from "screencast-axi"`) resolves from _your_ project
|
|
49
|
+
and needs the first form.
|
|
50
|
+
|
|
51
|
+
`tsx` is what lets Node read a TypeScript scenario. Skip it only if you write scenarios as `.mjs`.
|
|
52
|
+
|
|
53
|
+
To let an agent drive it, add the skill as well:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
npx skills add Valzon/screencast-axi --skill screencast-axi -g
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Quick start
|
|
60
|
+
|
|
61
|
+
No config needed. Point it at any site:
|
|
62
|
+
|
|
63
|
+
```sh
|
|
64
|
+
pnpm exec screencast-axi scaffold product-tour --url https://example.com
|
|
65
|
+
# fill in the run() body
|
|
66
|
+
pnpm exec screencast-axi rehearse ./scenarios/product-tour.ts
|
|
67
|
+
pnpm exec screencast-axi record ./scenarios/product-tour.ts
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`rehearse` runs the scenario without encoding, so a stale selector surfaces in seconds rather than
|
|
71
|
+
a minute - and the failure comes back with the URL it reached, a screenshot, and what each part of
|
|
72
|
+
the selector actually matched.
|
|
73
|
+
|
|
74
|
+
A scenario is TypeScript, and a plain object:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
import type { Scenario } from "screencast-axi";
|
|
78
|
+
|
|
79
|
+
export default {
|
|
80
|
+
id: "product-tour",
|
|
81
|
+
title: "A three-stop tour",
|
|
82
|
+
description: "The pages that matter, in order.",
|
|
83
|
+
steps: ["Where the work lives", "How it gets organised", "And what comes out"],
|
|
84
|
+
|
|
85
|
+
async run(d) {
|
|
86
|
+
await d.tour([
|
|
87
|
+
{ path: "/", step: 0, scroll: 0.6 },
|
|
88
|
+
{ path: "/features", step: 1, scroll: 0.5 },
|
|
89
|
+
{ path: "/pricing", step: 2 },
|
|
90
|
+
]);
|
|
91
|
+
},
|
|
92
|
+
} satisfies Scenario;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
`satisfies` keeps full typing - `d` is a `Director`, and a typo such as `d.gotoo` fails the
|
|
96
|
+
typecheck with a suggestion. Each line in `steps` goes on screen once, in order. The same array
|
|
97
|
+
becomes the burnt-in caption and the manifest's step list, so the written workflow cannot drift
|
|
98
|
+
from the recorded one - a take that skips a line fails.
|
|
99
|
+
|
|
100
|
+
`defineScenario` still exists for a scenario exported under a name rather than as the default.
|
|
101
|
+
|
|
102
|
+
## Prerequisites
|
|
103
|
+
|
|
104
|
+
| Piece | Required | How it is found |
|
|
105
|
+
| ----------- | -------- | -------------------------------------------------------------------- |
|
|
106
|
+
| Node | >= 20 | |
|
|
107
|
+
| Chromium | yes | Playwright downloads it |
|
|
108
|
+
| `ffmpeg` | yes | `$SCREENCAST_FFMPEG`, then an installed `ffmpeg-static`, then `PATH` |
|
|
109
|
+
| WebP poster | optional | ffmpeg's `libwebp`, else `cwebp`, else a PNG poster |
|
|
110
|
+
|
|
111
|
+
ffmpeg is not bundled: it is 80MB+ per platform, and _which_ build you have matters - many builds
|
|
112
|
+
(Homebrew's among them) ship without `libwebp`, which is why the poster has a fallback chain
|
|
113
|
+
rather than one hard requirement. If you would rather not install it system-wide,
|
|
114
|
+
`pnpm add -D ffmpeg-static` and the cascade finds it.
|
|
115
|
+
|
|
116
|
+
**Platforms:** macOS and Linux are tested, including in CI. Windows is intended to work but is
|
|
117
|
+
**unverified** - the known risks are argument quoting in spawned ffmpeg filter strings, path
|
|
118
|
+
separators inside those arguments, and Chrome's lock on a persistent profile directory.
|
|
17
119
|
|
|
18
120
|
## What the tool does
|
|
19
121
|
|
|
@@ -78,6 +180,10 @@ site's own `@media (hover: none)` and touch rules apply at all, and it carries t
|
|
|
78
180
|
agent - so this is the mobile layout the site actually serves, not a desktop squeezed narrow.
|
|
79
181
|
Playwright ships 140+ presets; `--viewport 390x844` covers the rest.
|
|
80
182
|
|
|
183
|
+
```sh
|
|
184
|
+
screencast-axi record onboarding --device "iPhone 13" --orientation portrait
|
|
185
|
+
```
|
|
186
|
+
|
|
81
187
|
<picture>
|
|
82
188
|
<source srcset="docs/usecase-mobile.anim.webp" type="image/webp">
|
|
83
189
|
<img src="docs/usecase-mobile.gif" alt="The same workflow recorded in a portrait phone viewport." width="240">
|
|
@@ -180,88 +286,16 @@ hold on each caption - and constants only help if you can run the same thing aga
|
|
|
180
286
|
same thing back. A scenario file survives a product change, gets reviewed in a pull request, and
|
|
181
287
|
can be re-cut at a different length without re-deciding anything.
|
|
182
288
|
|
|
183
|
-
## Quick start
|
|
184
|
-
|
|
185
|
-
No config needed. Point it at any site:
|
|
186
|
-
|
|
187
|
-
```sh
|
|
188
|
-
npx -y screencast-axi scaffold product-tour --url https://example.com
|
|
189
|
-
# fill in the run() body
|
|
190
|
-
npx -y screencast-axi rehearse ./scenarios/product-tour.ts
|
|
191
|
-
npx -y screencast-axi record ./scenarios/product-tour.ts
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
`rehearse` runs the scenario without encoding, so a stale selector surfaces in seconds rather than
|
|
195
|
-
a minute - and the failure comes back with the URL it reached, a screenshot, and what each part of
|
|
196
|
-
the selector actually matched.
|
|
197
|
-
|
|
198
|
-
A scenario is TypeScript:
|
|
199
|
-
|
|
200
|
-
```ts
|
|
201
|
-
import { defineScenario } from "screencast-axi";
|
|
202
|
-
|
|
203
|
-
export default defineScenario({
|
|
204
|
-
id: "product-tour",
|
|
205
|
-
title: "A three-stop tour",
|
|
206
|
-
description: "The pages that matter, in order.",
|
|
207
|
-
steps: ["Where the work lives", "How it gets organised", "And what comes out"],
|
|
208
|
-
|
|
209
|
-
async run(d) {
|
|
210
|
-
await d.tour([
|
|
211
|
-
{ path: "/", step: 0, scroll: 0.6 },
|
|
212
|
-
{ path: "/features", step: 1, scroll: 0.5 },
|
|
213
|
-
{ path: "/pricing", step: 2 },
|
|
214
|
-
]);
|
|
215
|
-
},
|
|
216
|
-
});
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
Each line in `steps` goes on screen once, in order. The same array becomes the burnt-in caption
|
|
220
|
-
and the manifest's step list, so the written workflow cannot drift from the recorded one - a take
|
|
221
|
-
that skips a line fails.
|
|
222
|
-
|
|
223
|
-
## Install
|
|
224
|
-
|
|
225
|
-
The skill is installed from GitHub; the CLI is pulled on demand, so there is nothing global:
|
|
226
|
-
|
|
227
|
-
```sh
|
|
228
|
-
npx skills add Valzon/screencast-axi --skill screencast-axi -g
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
## Prerequisites
|
|
232
|
-
|
|
233
|
-
| Piece | Required | How it is found |
|
|
234
|
-
| ----------- | -------- | -------------------------------------------------------------------- |
|
|
235
|
-
| Node | >= 20 | |
|
|
236
|
-
| Chromium | yes | Playwright downloads it |
|
|
237
|
-
| `ffmpeg` | yes | `$SCREENCAST_FFMPEG`, then an installed `ffmpeg-static`, then `PATH` |
|
|
238
|
-
| WebP poster | optional | ffmpeg's `libwebp`, else `cwebp`, else a PNG poster |
|
|
239
|
-
|
|
240
|
-
ffmpeg is not bundled: it is 80MB+ per platform, and _which_ build you have matters - many builds
|
|
241
|
-
(Homebrew's among them) ship without `libwebp`, which is why the poster has a fallback chain
|
|
242
|
-
rather than one hard requirement. If you would rather not install it system-wide,
|
|
243
|
-
`pnpm add -D ffmpeg-static` and the cascade finds it.
|
|
244
|
-
|
|
245
|
-
**Platforms:** macOS and Linux are tested, including in CI. Windows is intended to work but is
|
|
246
|
-
**unverified** - the known risks are argument quoting in spawned ffmpeg filter strings, path
|
|
247
|
-
separators inside those arguments, and Chrome's lock on a persistent profile directory.
|
|
248
|
-
|
|
249
289
|
## Recording a page behind a login
|
|
250
290
|
|
|
251
|
-
|
|
252
|
-
this once:
|
|
291
|
+
`profileAuth()` needs no code for the site you are recording. A person runs this once:
|
|
253
292
|
|
|
254
293
|
```sh
|
|
255
|
-
|
|
294
|
+
pnpm exec screencast-axi auth login --interactive
|
|
256
295
|
```
|
|
257
296
|
|
|
258
|
-
A browser opens, they sign in however that site wants
|
|
259
|
-
|
|
260
|
-
credential is handled by this package.
|
|
261
|
-
|
|
262
|
-
`auth login` never reads stdin, so an agent can open the window on the user's screen rather than
|
|
263
|
-
making them retype a command. It cannot hang: the wait is bounded, and it refuses up front where
|
|
264
|
-
no window could appear.
|
|
297
|
+
A browser opens, they sign in however that site wants and close the window. The session lives in
|
|
298
|
+
a persistent Chrome profile, every take reuses it, and `auth check` tells you when it has expired.
|
|
265
299
|
|
|
266
300
|
Also shipped: `storageStateAuth({ path })` for a portable session file, and
|
|
267
301
|
`basicAuth({ username, password })` for staging environments. Anything else is an `AuthStrategy`
|
|
@@ -270,20 +304,6 @@ object written in the config - typed and debuggable rather than a shelled-out sc
|
|
|
270
304
|
> A scenario that creates or drags something **writes to whatever it is pointed at**. Prefer
|
|
271
305
|
> read-only scenarios against production, or point at staging.
|
|
272
306
|
|
|
273
|
-
## Seeing what a scenario does
|
|
274
|
-
|
|
275
|
-
A scenario is arbitrary code driving a real browser, often one signed into your own account, so
|
|
276
|
-
"what will this actually do" deserves a better answer than "read the TypeScript". Two:
|
|
277
|
-
|
|
278
|
-
```sh
|
|
279
|
-
screencast-axi rehearse <id> # prints every action it took
|
|
280
|
-
screencast-axi rehearse <id> --headed # and shows you it happening
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
A rehearsal prints `performed` - every goto, click, typed value, drag and scroll, in order, with
|
|
284
|
-
timings - and `hosts`, the short answer to where the script went. `--headed` opens a real window
|
|
285
|
-
and does not change the output; the clip is identical either way.
|
|
286
|
-
|
|
287
307
|
## Output formats
|
|
288
308
|
|
|
289
309
|
Every take produces an mp4, a webm and a poster. Looping images are opt-in with `--gif` and
|
|
@@ -329,19 +349,6 @@ export default defineConfig({
|
|
|
329
349
|
Relative paths resolve against the config file, never the shell's working directory, so a command
|
|
330
350
|
means the same thing from anywhere in a repo.
|
|
331
351
|
|
|
332
|
-
## Mobile, and aiming at a length
|
|
333
|
-
|
|
334
|
-
```sh
|
|
335
|
-
screencast-axi record tour --device "iPhone 13" --orientation portrait --duration 20s
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
Device presets come from Playwright's registry, so a phone clip is captured at its real device
|
|
339
|
-
pixels rather than its CSS viewport - the difference between readable UI text and a smear.
|
|
340
|
-
|
|
341
|
-
`--duration` runs one measuring pass, then solves for the pace that lands near the target. A take
|
|
342
|
-
is `fixed + pace x scalable`: the site's own waits do not get slower because the recorder does, so
|
|
343
|
-
the solve uses the measured split rather than assuming everything scales.
|
|
344
|
-
|
|
345
352
|
## Reading the manifest
|
|
346
353
|
|
|
347
354
|
Every take writes `manifest.json` beside the clips. A site can read it at build time without
|
|
@@ -501,10 +508,9 @@ Install the browser; name anything you must install yourself.
|
|
|
501
508
|
screencast-axi setup
|
|
502
509
|
```
|
|
503
510
|
|
|
504
|
-
| Flag | What it does
|
|
505
|
-
| ----------------- |
|
|
506
|
-
| `--browsers-only` | Install Chromium and stop.
|
|
507
|
-
| `--scope <s>` | For `setup hooks`: user or project. |
|
|
511
|
+
| Flag | What it does |
|
|
512
|
+
| ----------------- | -------------------------- |
|
|
513
|
+
| `--browsers-only` | Install Chromium and stop. |
|
|
508
514
|
|
|
509
515
|
#### `auth`
|
|
510
516
|
|
|
@@ -534,11 +540,6 @@ screencast-axi guide [topic]
|
|
|
534
540
|
_No flags._
|
|
535
541
|
<!-- reference:end -->
|
|
536
542
|
|
|
537
|
-
## Roadmap
|
|
538
|
-
|
|
539
|
-
Publishing to npm. The command surface is complete; `setup hooks` is declared but not implemented
|
|
540
|
-
and says so rather than pretending.
|
|
541
|
-
|
|
542
543
|
## Contributing
|
|
543
544
|
|
|
544
545
|
```sh
|
package/dist/src/browser.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ScreencastError } from "./errors.js";
|
|
2
|
+
import { importFromProject } from "./resolve.js";
|
|
2
3
|
/** Where a consumer's Playwright might live, best first. */
|
|
3
4
|
const CANDIDATES = ["playwright", "playwright-core", "@playwright/test"];
|
|
4
5
|
let cached = null;
|
|
@@ -7,23 +8,20 @@ export async function resolvePlaywright() {
|
|
|
7
8
|
return cached;
|
|
8
9
|
const tried = [];
|
|
9
10
|
for (const specifier of CANDIDATES) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
tried.push(`${specifier} (no chromium export)`);
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
tried.push(specifier);
|
|
11
|
+
// Resolved from the project first: Playwright is the consumer's, and a CLI
|
|
12
|
+
// running from an npx cache or a global install has none of its own.
|
|
13
|
+
// `@playwright/test` re-exports chromium, which is why it qualifies.
|
|
14
|
+
const loaded = await importFromProject(specifier, (module) => Boolean(module.chromium));
|
|
15
|
+
if (loaded?.chromium) {
|
|
16
|
+
cached = { module: loaded, specifier };
|
|
17
|
+
return cached;
|
|
21
18
|
}
|
|
19
|
+
tried.push(specifier);
|
|
22
20
|
}
|
|
23
21
|
throw new ScreencastError("Playwright is not installed", "PLAYWRIGHT_MISSING", [
|
|
24
22
|
"Install it: `pnpm add -D playwright`",
|
|
25
23
|
"Then download the browser: `pnpm exec playwright install chromium`",
|
|
26
|
-
`Looked for
|
|
24
|
+
`Looked for ${tried.join(", ")} in ${process.cwd()}`,
|
|
27
25
|
]);
|
|
28
26
|
}
|
|
29
27
|
/**
|
package/dist/src/browser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { readManifest } from "../manifest.js";
|
|
2
|
-
import { loadConfig, loadScenarios } from "../config.js";
|
|
2
|
+
import { loadConfig, loadScenarios, resolveConfigPath } from "../config.js";
|
|
3
3
|
/**
|
|
4
4
|
* The no-argument view: live data, never help text (AXI principle 8).
|
|
5
5
|
*
|
|
@@ -11,19 +11,45 @@ import { loadConfig, loadScenarios } from "../config.js";
|
|
|
11
11
|
* The SDK prepends `{ bin, description }`, so this returns only the state.
|
|
12
12
|
*/
|
|
13
13
|
export async function homeView() {
|
|
14
|
-
|
|
14
|
+
// A config that exists but throws is a different state from having none, and
|
|
15
|
+
// the difference is the whole answer: telling someone with a broken config to
|
|
16
|
+
// create one sends them to write a second file beside the one that is failing.
|
|
17
|
+
const configPath = resolveConfigPath();
|
|
18
|
+
let config = null;
|
|
19
|
+
let configError = null;
|
|
20
|
+
try {
|
|
21
|
+
config = await loadConfig();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
configError = error instanceof Error ? error.message : String(error);
|
|
25
|
+
}
|
|
15
26
|
if (!config) {
|
|
16
27
|
return {
|
|
17
|
-
config: "none",
|
|
28
|
+
config: configPath ?? "none",
|
|
29
|
+
...(configError ? { error: configError } : {}),
|
|
18
30
|
scenarios: [],
|
|
19
31
|
totals: "0 scenarios",
|
|
20
|
-
help:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
help: configError
|
|
33
|
+
? [
|
|
34
|
+
"The config above was found but could not be loaded - the error says why",
|
|
35
|
+
"Run `screencast-axi doctor` for the full diagnosis",
|
|
36
|
+
]
|
|
37
|
+
: [
|
|
38
|
+
"Create one: `screencast-axi scaffold <id> --url <url>`",
|
|
39
|
+
"Run `screencast-axi guide` for topic-sized guidance",
|
|
40
|
+
],
|
|
24
41
|
};
|
|
25
42
|
}
|
|
26
|
-
|
|
43
|
+
// Scenario files fail one at a time and for their own reasons, so a broken
|
|
44
|
+
// one is reported as itself rather than collapsing the whole list to empty.
|
|
45
|
+
let loaded = [];
|
|
46
|
+
let scenarioError = null;
|
|
47
|
+
try {
|
|
48
|
+
loaded = await loadScenarios(config);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
scenarioError = error instanceof Error ? error.message : String(error);
|
|
52
|
+
}
|
|
27
53
|
const { entries } = readManifest(config.outDir);
|
|
28
54
|
const byId = new Map(entries.map((e) => [e.id, e]));
|
|
29
55
|
const rows = loaded.map(({ scenario }) => {
|
|
@@ -44,16 +70,23 @@ export async function homeView() {
|
|
|
44
70
|
const orphans = entries.filter((e) => !loaded.some((l) => l.scenario.id === e.id));
|
|
45
71
|
return {
|
|
46
72
|
config: config.configPath ?? "none",
|
|
73
|
+
...(scenarioError ? { error: scenarioError } : {}),
|
|
47
74
|
out: config.outDir,
|
|
48
75
|
scenarios: rows,
|
|
49
76
|
totals: rows.length === 0
|
|
50
77
|
? "0 scenarios"
|
|
51
78
|
: `${rows.length} scenarios, ${counts.recorded} recorded, ${counts.stale} stale, ${counts["never-recorded"]} never-recorded`,
|
|
52
79
|
...(orphans.length > 0 ? { orphaned: orphans.map((o) => o.id) } : {}),
|
|
53
|
-
help: buildHelp(rows, orphans.length),
|
|
80
|
+
help: buildHelp(rows, orphans.length, scenarioError),
|
|
54
81
|
};
|
|
55
82
|
}
|
|
56
|
-
function buildHelp(rows, orphans) {
|
|
83
|
+
function buildHelp(rows, orphans, scenarioError) {
|
|
84
|
+
if (scenarioError) {
|
|
85
|
+
return [
|
|
86
|
+
"The scenario files matched by the config could not be loaded - the error says why",
|
|
87
|
+
"Run `screencast-axi list` to see the failure on its own",
|
|
88
|
+
];
|
|
89
|
+
}
|
|
57
90
|
if (rows.length === 0) {
|
|
58
91
|
return [
|
|
59
92
|
"No scenarios found. Create one: `screencast-axi scaffold <id> --url <url>`",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/commands/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/commands/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAuB,MAAM,cAAc,CAAC;AAKjG;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,6EAA6E;IAC7E,8EAA8E;IAC9E,+EAA+E;IAC/E,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;IACvC,IAAI,MAAM,GAA0B,IAAI,CAAC;IACzC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,WAAW,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,MAAM,EAAE,UAAU,IAAI,MAAM;YAC5B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,WAAW;gBACf,CAAC,CAAC;oBACE,yEAAyE;oBACzE,oDAAoD;iBACrD;gBACH,CAAC,CAAC;oBACE,wDAAwD;oBACxD,qDAAqD;iBACtD;SACN,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAI,MAAM,GAA8C,EAAE,CAAC;IAC3D,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,aAAa,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,MAAM,GAAW,CAAC,KAAK;YAC3B,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC;gBACjF,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,UAAU,CAAC;QACjB,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,MAAM;YACN,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;YAClC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACrE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,EACvD,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAC/C,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEnF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM;QACnC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,EAAE,MAAM,CAAC,MAAM;QAClB,SAAS,EAAE,IAAI;QACf,MAAM,EACJ,IAAI,CAAC,MAAM,KAAK,CAAC;YACf,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,eAAe,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,gBAAgB,CAAC,iBAAiB;QAChI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,IAA+C,EAC/C,OAAe,EACf,aAA4B;IAE5B,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO;YACL,mFAAmF;YACnF,yDAAyD;SAC1D,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,4EAA4E;YAC5E,sEAAsE;SACvE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,CAAC,CAAC;IAC9D,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CACP,2BAA2B,KAAK,CAAC,EAAE,oDAAoD,CACxF,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,2BAA2B,KAAK,CAAC,EAAE,qBAAqB,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,4DAA4D,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAC/E,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -21,11 +21,19 @@ function titleFrom(id) {
|
|
|
21
21
|
* This is what makes a TypeScript-only authoring format cheap: the author -
|
|
22
22
|
* often an agent - supplies only the `run()` body and the narration, not the
|
|
23
23
|
* imports, the id or the shape.
|
|
24
|
+
*
|
|
25
|
+
* The skeleton imports only a type and exports a plain object checked with
|
|
26
|
+
* `satisfies`. `defineScenario` would give the same editor experience, but it
|
|
27
|
+
* is a runtime import - and a runtime import inside the user's file resolves
|
|
28
|
+
* from the user's project, so it breaks every run that has not installed the
|
|
29
|
+
* package there, `npx` first among them.
|
|
24
30
|
*/
|
|
25
31
|
function template(id, title, url, device) {
|
|
26
|
-
return
|
|
32
|
+
return `// A type-only import: erased when this file is compiled, so it loads whether
|
|
33
|
+
// or not the project has screencast-axi installed - under npx included.
|
|
34
|
+
import type { Scenario } from "screencast-axi";
|
|
27
35
|
|
|
28
|
-
export default
|
|
36
|
+
export default {
|
|
29
37
|
id: ${JSON.stringify(id)},
|
|
30
38
|
title: ${JSON.stringify(title)},
|
|
31
39
|
description: "TODO: one line describing what this clip shows.",
|
|
@@ -45,15 +53,17 @@ export default defineScenario({
|
|
|
45
53
|
|
|
46
54
|
await d.step(1, 1200);
|
|
47
55
|
},
|
|
48
|
-
}
|
|
56
|
+
} satisfies Scenario;
|
|
49
57
|
`;
|
|
50
58
|
}
|
|
51
59
|
function tourTemplate(id, title, url, stops, device) {
|
|
52
60
|
const paths = ["/", "/pricing", "/docs", "/blog", "/contact"];
|
|
53
61
|
const chosen = Array.from({ length: stops }, (_, i) => paths[i] ?? `/page-${i + 1}`);
|
|
54
|
-
return
|
|
62
|
+
return `// A type-only import: erased when this file is compiled, so it loads whether
|
|
63
|
+
// or not the project has screencast-axi installed - under npx included.
|
|
64
|
+
import type { Scenario } from "screencast-axi";
|
|
55
65
|
|
|
56
|
-
export default
|
|
66
|
+
export default {
|
|
57
67
|
id: ${JSON.stringify(id)},
|
|
58
68
|
title: ${JSON.stringify(title)},
|
|
59
69
|
description: "TODO: one line describing what this walkthrough shows.",
|
|
@@ -71,7 +81,7 @@ ${chosen
|
|
|
71
81
|
` await d.scrollBy(500);`)
|
|
72
82
|
.join("\n\n")}
|
|
73
83
|
},
|
|
74
|
-
}
|
|
84
|
+
} satisfies Scenario;
|
|
75
85
|
`;
|
|
76
86
|
}
|
|
77
87
|
export function scaffoldCommand(args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/commands/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AAGzD,MAAM,CAAC,MAAM,cAAc,GAAc;IACvC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE,WAAW,EAAE,KAAK,EAAE;IACvF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,EAAE;IACvF,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,EAAE;IAC9E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;IACjF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,WAAW,EAAE,MAAM,EAAE;CACzF,CAAC;AAEF,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAEhD,SAAS,SAAS,CAAC,EAAU;IAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvF,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/commands/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { join, relative, resolve } from "node:path";
|
|
3
|
-
import { installHooks } from "../hooks.js";
|
|
4
3
|
import { ScreencastError } from "../errors.js";
|
|
5
4
|
import { parseFlags } from "../flags.js";
|
|
6
5
|
import { detectToolchain, installHint, run } from "../toolchain.js";
|
|
7
6
|
import { CONFIG_BASENAMES } from "../config.js";
|
|
8
7
|
export const SETUP_FLAGS = {
|
|
9
8
|
"browsers-only": { kind: "boolean", description: "Install Chromium and stop" },
|
|
10
|
-
scope: { kind: "string", description: "For `setup hooks`: user or project", placeholder: "s" },
|
|
11
9
|
};
|
|
12
10
|
export const INIT_FLAGS = {
|
|
13
11
|
out: { kind: "string", description: "Where clips should be written", placeholder: "dir" },
|
|
@@ -24,13 +22,10 @@ export const INIT_FLAGS = {
|
|
|
24
22
|
*/
|
|
25
23
|
export async function setupCommand(args) {
|
|
26
24
|
const { positionals, flags } = parseFlags(args, SETUP_FLAGS);
|
|
27
|
-
if (positionals[0] === "hooks") {
|
|
28
|
-
return installHooks(flags["scope"]);
|
|
29
|
-
}
|
|
30
25
|
if (positionals[0]) {
|
|
31
26
|
throw new ScreencastError(`Unknown setup target: ${positionals[0]}`, "VALIDATION_ERROR", [
|
|
32
|
-
"`screencast-axi setup` installs the browser and checks the rest",
|
|
33
|
-
"
|
|
27
|
+
"`screencast-axi setup` takes no arguments: it installs the browser and checks the rest",
|
|
28
|
+
"`--browsers-only` installs Chromium and stops",
|
|
34
29
|
]);
|
|
35
30
|
}
|
|
36
31
|
const done = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
package/dist/src/config.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { ScreencastError } from "./errors.js";
|
|
2
2
|
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
3
3
|
import { dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
4
|
-
import { createRequire } from "node:module";
|
|
5
4
|
import { pathToFileURL } from "node:url";
|
|
6
5
|
import { DEFAULT_ENCODE_SETTINGS } from "./encode.js";
|
|
7
6
|
import { DEFAULT_SETTLE_MS } from "./director.js";
|
|
8
7
|
import { DEFAULT_OVERLAY_THEME } from "./overlay.js";
|
|
9
|
-
import { isScenario } from "./types.js";
|
|
8
|
+
import { defineScenario, isScenario, looksLikeScenario, } from "./types.js";
|
|
9
|
+
import { importFromProject } from "./resolve.js";
|
|
10
10
|
import { noAuth } from "./auth/strategies.js";
|
|
11
11
|
export const CONFIG_BASENAMES = [
|
|
12
12
|
"screencast.config.ts",
|
|
@@ -69,40 +69,17 @@ let tsxRegistered = false;
|
|
|
69
69
|
/**
|
|
70
70
|
* Loads `tsx/esm/api` from the *project*, not from wherever this package sits.
|
|
71
71
|
*
|
|
72
|
-
*
|
|
73
|
-
* Under the documented `npx -y screencast-axi` invocation that is npx's cache
|
|
74
|
-
* directory, which has no tsx in it - so the loader was reported missing on
|
|
75
|
-
* projects that had installed it. Resolving from the working directory finds
|
|
76
|
-
* the tsx the project actually declared.
|
|
72
|
+
* See `importFromProject` for why the working directory has to come first.
|
|
77
73
|
*/
|
|
78
74
|
async function registerTsx() {
|
|
79
75
|
if (tsxRegistered)
|
|
80
76
|
return true;
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
catch {
|
|
88
|
-
// No tsx in the project. The bare specifier below still covers the case
|
|
89
|
-
// where this package and tsx are installed side by side.
|
|
90
|
-
}
|
|
91
|
-
candidates.push("tsx/esm/api");
|
|
92
|
-
for (const specifier of candidates) {
|
|
93
|
-
try {
|
|
94
|
-
const tsx = (await import(specifier));
|
|
95
|
-
if (typeof tsx.register !== "function")
|
|
96
|
-
continue;
|
|
97
|
-
tsx.register();
|
|
98
|
-
tsxRegistered = true;
|
|
99
|
-
return true;
|
|
100
|
-
}
|
|
101
|
-
catch {
|
|
102
|
-
// Try the next candidate.
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
return false;
|
|
77
|
+
const tsx = await importFromProject("tsx/esm/api", (module) => typeof module.register === "function");
|
|
78
|
+
if (!tsx?.register)
|
|
79
|
+
return false;
|
|
80
|
+
tsx.register();
|
|
81
|
+
tsxRegistered = true;
|
|
82
|
+
return true;
|
|
106
83
|
}
|
|
107
84
|
/**
|
|
108
85
|
* Flattens CommonJS interop wrapping.
|
|
@@ -128,6 +105,31 @@ function unwrapModule(module) {
|
|
|
128
105
|
}
|
|
129
106
|
return flattened;
|
|
130
107
|
}
|
|
108
|
+
/** This package's own name, as a scenario or config file imports it. */
|
|
109
|
+
const SELF = "screencast-axi";
|
|
110
|
+
/**
|
|
111
|
+
* Rewrites "cannot find screencast-axi" into something worth reading.
|
|
112
|
+
*
|
|
113
|
+
* A scaffolded scenario opens with `import { defineScenario } from
|
|
114
|
+
* "screencast-axi"`, and that specifier resolves from the *file's* project.
|
|
115
|
+
* Run the CLI through `npx` and this package sits in a cache directory
|
|
116
|
+
* instead, so the import fails on a machine where the command plainly works.
|
|
117
|
+
* Node's own message names a module the author never typed a path for, which
|
|
118
|
+
* reads like a broken install rather than a missing dependency.
|
|
119
|
+
*/
|
|
120
|
+
function selfImportFailure(file, error) {
|
|
121
|
+
const code = error.code;
|
|
122
|
+
if (code !== "MODULE_NOT_FOUND" && code !== "ERR_MODULE_NOT_FOUND")
|
|
123
|
+
return null;
|
|
124
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
125
|
+
if (!new RegExp(`'${SELF}(/[^']*)?'|"${SELF}(/[^"]*)?"`).test(message))
|
|
126
|
+
return null;
|
|
127
|
+
return new ScreencastError(`Cannot load ${file}: it imports \`${SELF}\`, which this project does not have`, "SELF_NOT_INSTALLED", [
|
|
128
|
+
`Import only types, so nothing is resolved at runtime: \`import type { Scenario } from "${SELF}"\` and \`export default { ... } satisfies Scenario\``,
|
|
129
|
+
`Or install it beside the file that imports it: \`pnpm add -D ${SELF}\``,
|
|
130
|
+
"Running the CLI through `npx` leaves the package in a cache a runtime import cannot reach",
|
|
131
|
+
]);
|
|
132
|
+
}
|
|
131
133
|
async function importModule(file) {
|
|
132
134
|
const url = pathToFileURL(file).href;
|
|
133
135
|
try {
|
|
@@ -138,15 +140,20 @@ async function importModule(file) {
|
|
|
138
140
|
const needsLoader = code === "ERR_UNKNOWN_FILE_EXTENSION" ||
|
|
139
141
|
(error instanceof SyntaxError && /\.m?ts$/.test(file));
|
|
140
142
|
if (!needsLoader || tsxRegistered)
|
|
141
|
-
throw error;
|
|
143
|
+
throw selfImportFailure(file, error) ?? error;
|
|
142
144
|
if (!(await registerTsx())) {
|
|
143
145
|
throw new ScreencastError(`Cannot load ${file}: this Node cannot run TypeScript directly`, "TS_LOADER_MISSING", [
|
|
144
146
|
"Install the loader in this project: `pnpm add -D tsx`",
|
|
145
147
|
"Or write the file as .mjs instead of .ts",
|
|
146
148
|
]);
|
|
147
149
|
}
|
|
148
|
-
|
|
149
|
-
|
|
150
|
+
try {
|
|
151
|
+
// Cache-bust so the retry does not get the failed module record back.
|
|
152
|
+
return unwrapModule((await import(`${url}?tsx=1`)));
|
|
153
|
+
}
|
|
154
|
+
catch (retried) {
|
|
155
|
+
throw selfImportFailure(file, retried) ?? retried;
|
|
156
|
+
}
|
|
150
157
|
}
|
|
151
158
|
}
|
|
152
159
|
export async function loadConfig(explicit, cwd = process.cwd()) {
|
|
@@ -262,14 +269,29 @@ export async function loadScenarioFiles(files) {
|
|
|
262
269
|
const seen = new Map();
|
|
263
270
|
for (const file of files) {
|
|
264
271
|
const module = await importModule(file);
|
|
272
|
+
// A stamped scenario is found in any export position. An unstamped one is
|
|
273
|
+
// accepted only as the default export - after CJS interop that may sit at
|
|
274
|
+
// `default.default` - so a file needs no runtime import of this package.
|
|
275
|
+
const defaults = [
|
|
276
|
+
module["default"],
|
|
277
|
+
module["default.default"],
|
|
278
|
+
module["module.exports.default"],
|
|
279
|
+
];
|
|
280
|
+
const candidates = [
|
|
281
|
+
...Object.values(module).filter(isScenario),
|
|
282
|
+
...defaults
|
|
283
|
+
.filter((v) => !isScenario(v) && looksLikeScenario(v))
|
|
284
|
+
.map((v) => v),
|
|
285
|
+
];
|
|
265
286
|
// Deduped by identity: CJS interop exposes the same object under both
|
|
266
287
|
// `default` and `module.exports`, and one scenario seen twice is not two
|
|
267
288
|
// scenarios sharing an id.
|
|
268
|
-
const found = [...new Set(
|
|
289
|
+
const found = [...new Set(candidates)].map((s) => (isScenario(s) ? s : defineScenario(s)));
|
|
269
290
|
if (found.length === 0) {
|
|
270
291
|
throw new ScreencastError(`No scenario exported by ${file}`, "NO_SCENARIO", [
|
|
271
|
-
"
|
|
272
|
-
|
|
292
|
+
"Make it the default export: `export default { id, title, description, run } satisfies Scenario`",
|
|
293
|
+
'Type it with `import type { Scenario } from "screencast-axi"`, which leaves no runtime import',
|
|
294
|
+
"Or wrap a named export: `export const clip = defineScenario({ ... })`",
|
|
273
295
|
]);
|
|
274
296
|
}
|
|
275
297
|
for (const scenario of found) {
|
package/dist/src/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Importing a consuming project's packages, not our own.
|
|
3
|
+
*
|
|
4
|
+
* Every optional dependency this tool reaches for - `tsx` to read TypeScript,
|
|
5
|
+
* Playwright to drive a browser - belongs to the *project*, not to this
|
|
6
|
+
* package. A bare `import("playwright")` resolves against this module's own
|
|
7
|
+
* location, which under `npx screencast-axi` or a global install is a cache
|
|
8
|
+
* directory that has none of them. The dependency is then reported missing on
|
|
9
|
+
* a project that installed it and did exactly what the error message asked.
|
|
10
|
+
*
|
|
11
|
+
* Anchoring resolution on the working directory finds what the project
|
|
12
|
+
* actually declared, and the bare specifier stays as a fallback for a
|
|
13
|
+
* side-by-side install.
|
|
14
|
+
*/
|
|
15
|
+
/** A module shape a caller is willing to accept. */
|
|
16
|
+
type Accept<T> = (module: T) => boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Loads `name` from the project if it has it, else from wherever we sit.
|
|
19
|
+
*
|
|
20
|
+
* `accept` decides whether a loaded module is the one wanted. A rung that
|
|
21
|
+
* loads but has the wrong shape is skipped rather than returned, because the
|
|
22
|
+
* next rung may hold the same package in a usable form.
|
|
23
|
+
*
|
|
24
|
+
* Returns null when nothing satisfies `accept`, so a caller can try the next
|
|
25
|
+
* package name in its own list rather than unpick an exception.
|
|
26
|
+
*/
|
|
27
|
+
export declare function importFromProject<T>(name: string, accept?: Accept<T>, cwd?: string): Promise<T | null>;
|
|
28
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { pathToFileURL } from "node:url";
|
|
4
|
+
/**
|
|
5
|
+
* Ways to load `name`, best first.
|
|
6
|
+
*
|
|
7
|
+
* `require` leads because it hands back the real `module.exports`. Importing
|
|
8
|
+
* the file that `require.resolve` picks looks equivalent and is not: that path
|
|
9
|
+
* is the package's *CommonJS* entry, and `import()` of it re-exports only the
|
|
10
|
+
* names a static lexer can spot. Playwright is the case that proves it - the
|
|
11
|
+
* lexer finds its internals and misses `chromium`, so the recorder decided a
|
|
12
|
+
* perfectly good Playwright was not one.
|
|
13
|
+
*
|
|
14
|
+
* The file-URL import stays as the second rung, because `require` cannot load
|
|
15
|
+
* an ESM-only package on every supported Node.
|
|
16
|
+
*/
|
|
17
|
+
function loaders(name, cwd) {
|
|
18
|
+
const rungs = [];
|
|
19
|
+
let fromProject = null;
|
|
20
|
+
try {
|
|
21
|
+
// Anchored on a file path inside cwd so node walks up from the project.
|
|
22
|
+
fromProject = createRequire(join(cwd, "__resolve__.js"));
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// No project to resolve from. The bare specifier below still applies.
|
|
26
|
+
}
|
|
27
|
+
if (fromProject) {
|
|
28
|
+
const req = fromProject;
|
|
29
|
+
rungs.push(async () => req(name));
|
|
30
|
+
rungs.push(async () => (await import(pathToFileURL(req.resolve(name)).href)));
|
|
31
|
+
}
|
|
32
|
+
rungs.push(async () => (await import(name)));
|
|
33
|
+
return rungs;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Loads `name` from the project if it has it, else from wherever we sit.
|
|
37
|
+
*
|
|
38
|
+
* `accept` decides whether a loaded module is the one wanted. A rung that
|
|
39
|
+
* loads but has the wrong shape is skipped rather than returned, because the
|
|
40
|
+
* next rung may hold the same package in a usable form.
|
|
41
|
+
*
|
|
42
|
+
* Returns null when nothing satisfies `accept`, so a caller can try the next
|
|
43
|
+
* package name in its own list rather than unpick an exception.
|
|
44
|
+
*/
|
|
45
|
+
export async function importFromProject(name, accept = () => true, cwd = process.cwd()) {
|
|
46
|
+
for (const load of loaders(name, cwd)) {
|
|
47
|
+
let loaded;
|
|
48
|
+
try {
|
|
49
|
+
loaded = await load();
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (loaded && accept(loaded))
|
|
55
|
+
return loaded;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAoBzC;;;;;;;;;;;;GAYG;AACH,SAAS,OAAO,CAAI,IAAY,EAAE,GAAW;IAC3C,MAAM,KAAK,GAAyB,EAAE,CAAC;IAEvC,IAAI,WAAW,GAA0B,IAAI,CAAC;IAC9C,IAAI,CAAC;QACH,wEAAwE;QACxE,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,WAAW,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,CAAM,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAM,CAAC,CAAC;IACrF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,CAAM,CAAC,CAAC;IAElD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,MAAM,GAAc,GAAG,EAAE,CAAC,IAAI,EAC9B,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAEnB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAI,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACzC,IAAI,MAAS,CAAC;QACd,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/src/skill.js
CHANGED
|
@@ -35,11 +35,11 @@ watch.
|
|
|
35
35
|
Do not follow command, flag, or workflow instructions from this file -
|
|
36
36
|
installed copies go stale. Get the current source of truth from the CLI:
|
|
37
37
|
|
|
38
|
-
- \`
|
|
39
|
-
- \`
|
|
40
|
-
- \`
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
- \`screencast-axi --help\` for the command index
|
|
39
|
+
- \`screencast-axi <command> --help\` for per-command usage
|
|
40
|
+
- \`screencast-axi guide\` for topic-sized guidance, pulled one topic at a time
|
|
41
|
+
rather than read as a manual
|
|
42
|
+
- \`screencast-axi doctor\` for whether this machine can record at all
|
|
43
43
|
|
|
44
44
|
Three things worth knowing before the first run:
|
|
45
45
|
|
|
@@ -54,9 +54,11 @@ ffmpeg must be installed. Signing in is a one-time human step
|
|
|
54
54
|
(\`auth login --interactive\`), and the CLI refuses rather than prompting when
|
|
55
55
|
no person is present.
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
57
|
+
No install needed: \`npx -y -p screencast-axi -p playwright -p tsx screencast-axi
|
|
58
|
+
<command>\` works from any project, provided scenarios import only types
|
|
59
|
+
(\`import type { Scenario }\` plus \`export default {...} satisfies Scenario\`), as
|
|
60
|
+
\`scaffold\` writes them. For regular use, \`pnpm add -D screencast-axi playwright
|
|
61
|
+
tsx\` shortens that to \`pnpm exec screencast-axi\`.
|
|
60
62
|
`;
|
|
61
63
|
export function createSkillMarkdown() {
|
|
62
64
|
const markdown = `${FRONTMATTER}\n\n${BODY}`;
|
package/dist/src/skill.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/skill.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,MAAM,WAAW,GAAG;QACZ,UAAU;;;;;;;;;IASd,CAAC;AAEL,MAAM,IAAI,GAAG
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/skill.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;AAE3C;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,MAAM,WAAW,GAAG;QACZ,UAAU;;;;;;;;;IASd,CAAC;AAEL,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCZ,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,GAAG,WAAW,OAAO,IAAI,EAAE,CAAC;IAC7C,IAAI,QAAQ,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,yBAAyB,QAAQ,CAAC,MAAM,+BAA+B;YACrE,GAAG,wBAAwB,gCAAgC,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/src/toolchain.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { platform } from "node:os";
|
|
3
|
+
import { importFromProject } from "./resolve.js";
|
|
3
4
|
/** Spawns `bin`, capturing both streams. Never throws on a non-zero exit. */
|
|
4
5
|
export function run(bin, args) {
|
|
5
6
|
return new Promise((resolve, reject) => {
|
|
@@ -48,20 +49,15 @@ export async function resolveFfmpeg() {
|
|
|
48
49
|
const override = process.env[FFMPEG_ENV];
|
|
49
50
|
if (override)
|
|
50
51
|
return probe(override, "env");
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return found;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
// Not installed. Expected: it is an opt-in convenience, not a dependency.
|
|
52
|
+
// Resolved from the project, like tsx and Playwright: `ffmpeg-static` is a
|
|
53
|
+
// dependency the consumer opted into, and a CLI running from an npx cache
|
|
54
|
+
// has none of theirs. Getting this wrong reports ffmpeg missing to exactly
|
|
55
|
+
// the people who installed it precisely so it would not be.
|
|
56
|
+
const bundled = await importFromProject("ffmpeg-static", (module) => typeof module.default === "string");
|
|
57
|
+
if (typeof bundled?.default === "string") {
|
|
58
|
+
const found = await probe(bundled.default, "ffmpeg-static");
|
|
59
|
+
if (found)
|
|
60
|
+
return found;
|
|
65
61
|
}
|
|
66
62
|
return probe("ffmpeg", "path");
|
|
67
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchain.js","sourceRoot":"","sources":["../../src/toolchain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"toolchain.js","sourceRoot":"","sources":["../../src/toolchain.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -85,4 +85,19 @@ export type DefinedScenario = Scenario & {
|
|
|
85
85
|
* convention the author has to remember.
|
|
86
86
|
*/
|
|
87
87
|
export declare function defineScenario(scenario: Scenario): DefinedScenario;
|
|
88
|
+
/**
|
|
89
|
+
* Whether a value has the shape of a scenario, stamped or not.
|
|
90
|
+
*
|
|
91
|
+
* This is what lets a scenario file carry no runtime import of this package:
|
|
92
|
+
* `import type { Scenario } from "screencast-axi"` is erased when the file is
|
|
93
|
+
* compiled, and `export default { ... } satisfies Scenario` is a plain object.
|
|
94
|
+
* The file then loads in a project that has not installed the package at all -
|
|
95
|
+
* which is what `npx` needs, because a runtime import inside the user's file
|
|
96
|
+
* resolves from the user's project, where npx's copy cannot be found.
|
|
97
|
+
*
|
|
98
|
+
* Only ever applied to a module's *default* export. A named export still needs
|
|
99
|
+
* the `defineScenario` stamp, so a helper object that happens to have an `id`
|
|
100
|
+
* and a `run` is never mistaken for a clip.
|
|
101
|
+
*/
|
|
102
|
+
export declare function looksLikeScenario(value: unknown): value is Scenario;
|
|
88
103
|
export declare function isScenario(value: unknown): value is DefinedScenario;
|
package/dist/src/types.js
CHANGED
|
@@ -10,6 +10,30 @@ export const SCENARIO_MARKER = Symbol.for("screencast-axi.scenario");
|
|
|
10
10
|
export function defineScenario(scenario) {
|
|
11
11
|
return { ...scenario, [SCENARIO_MARKER]: true };
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Whether a value has the shape of a scenario, stamped or not.
|
|
15
|
+
*
|
|
16
|
+
* This is what lets a scenario file carry no runtime import of this package:
|
|
17
|
+
* `import type { Scenario } from "screencast-axi"` is erased when the file is
|
|
18
|
+
* compiled, and `export default { ... } satisfies Scenario` is a plain object.
|
|
19
|
+
* The file then loads in a project that has not installed the package at all -
|
|
20
|
+
* which is what `npx` needs, because a runtime import inside the user's file
|
|
21
|
+
* resolves from the user's project, where npx's copy cannot be found.
|
|
22
|
+
*
|
|
23
|
+
* Only ever applied to a module's *default* export. A named export still needs
|
|
24
|
+
* the `defineScenario` stamp, so a helper object that happens to have an `id`
|
|
25
|
+
* and a `run` is never mistaken for a clip.
|
|
26
|
+
*/
|
|
27
|
+
export function looksLikeScenario(value) {
|
|
28
|
+
if (typeof value !== "object" || value === null)
|
|
29
|
+
return false;
|
|
30
|
+
const v = value;
|
|
31
|
+
return (typeof v["id"] === "string" &&
|
|
32
|
+
v["id"].length > 0 &&
|
|
33
|
+
typeof v["title"] === "string" &&
|
|
34
|
+
typeof v["description"] === "string" &&
|
|
35
|
+
typeof v["run"] === "function");
|
|
36
|
+
}
|
|
13
37
|
export function isScenario(value) {
|
|
14
38
|
return (typeof value === "object" &&
|
|
15
39
|
value !== null &&
|
package/dist/src/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAyEA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAIrE;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiC,CAAC,eAAe,CAAC,KAAK,IAAI,CAC7D,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAyEA,6EAA6E;AAC7E,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAIrE;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAAkB;IAC/C,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CACL,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,QAAQ;QAC3B,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAClB,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ;QAC9B,OAAO,CAAC,CAAC,aAAa,CAAC,KAAK,QAAQ;QACpC,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiC,CAAC,eAAe,CAAC,KAAK,IAAI,CAC7D,CAAC;AACJ,CAAC"}
|
package/dist/src/version.d.ts
CHANGED
package/dist/src/version.js
CHANGED
|
@@ -7,5 +7,5 @@
|
|
|
7
7
|
* package.json by a test - so a drift fails CI rather than shipping a CLI
|
|
8
8
|
* that misreports its own version.
|
|
9
9
|
*/
|
|
10
|
-
export const VERSION = "0.1.
|
|
10
|
+
export const VERSION = "0.1.3"; // x-release-please-version
|
|
11
11
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "screencast-axi",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "AXI-compliant screencast recorder - script a web workflow, record it with a synthetic cursor and captions, encode to mp4/webm/poster. Requires ffmpeg.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -25,11 +25,11 @@ watch.
|
|
|
25
25
|
Do not follow command, flag, or workflow instructions from this file -
|
|
26
26
|
installed copies go stale. Get the current source of truth from the CLI:
|
|
27
27
|
|
|
28
|
-
- `
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
|
|
32
|
-
|
|
28
|
+
- `screencast-axi --help` for the command index
|
|
29
|
+
- `screencast-axi <command> --help` for per-command usage
|
|
30
|
+
- `screencast-axi guide` for topic-sized guidance, pulled one topic at a time
|
|
31
|
+
rather than read as a manual
|
|
32
|
+
- `screencast-axi doctor` for whether this machine can record at all
|
|
33
33
|
|
|
34
34
|
Three things worth knowing before the first run:
|
|
35
35
|
|
|
@@ -44,6 +44,8 @@ ffmpeg must be installed. Signing in is a one-time human step
|
|
|
44
44
|
(`auth login --interactive`), and the CLI refuses rather than prompting when
|
|
45
45
|
no person is present.
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
No install needed: `npx -y -p screencast-axi -p playwright -p tsx screencast-axi
|
|
48
|
+
<command>` works from any project, provided scenarios import only types
|
|
49
|
+
(`import type { Scenario }` plus `export default {...} satisfies Scenario`), as
|
|
50
|
+
`scaffold` writes them. For regular use, `pnpm add -D screencast-axi playwright
|
|
51
|
+
tsx` shortens that to `pnpm exec screencast-axi`.
|
package/dist/src/hooks.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { AxiStructuredOutput } from "./output.js";
|
|
2
|
-
/**
|
|
3
|
-
* Session integration.
|
|
4
|
-
*
|
|
5
|
-
* The AXI convention is a setup command that registers hooks with the agent
|
|
6
|
-
* harness, so the tool is ambient rather than something to remember. That is
|
|
7
|
-
* not built yet, and saying so beats registering something that does nothing.
|
|
8
|
-
*/
|
|
9
|
-
export declare function installHooks(scope: string | undefined): AxiStructuredOutput;
|
package/dist/src/hooks.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { ScreencastError } from "./errors.js";
|
|
2
|
-
/**
|
|
3
|
-
* Session integration.
|
|
4
|
-
*
|
|
5
|
-
* The AXI convention is a setup command that registers hooks with the agent
|
|
6
|
-
* harness, so the tool is ambient rather than something to remember. That is
|
|
7
|
-
* not built yet, and saying so beats registering something that does nothing.
|
|
8
|
-
*/
|
|
9
|
-
export function installHooks(scope) {
|
|
10
|
-
if (scope && scope !== "user" && scope !== "project") {
|
|
11
|
-
throw new ScreencastError("--scope must be user or project", "VALIDATION_ERROR", [
|
|
12
|
-
"Example: --scope project",
|
|
13
|
-
]);
|
|
14
|
-
}
|
|
15
|
-
throw new ScreencastError("Session hooks are not implemented yet", "NOT_IMPLEMENTED", [
|
|
16
|
-
"Install the skill instead: `npx skills add Valzon/screencast-axi --skill screencast-axi -g`",
|
|
17
|
-
"The CLI works without either - `npx -y screencast-axi --help`",
|
|
18
|
-
]);
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=hooks.js.map
|
package/dist/src/hooks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,KAAyB;IACpD,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACrD,MAAM,IAAI,eAAe,CAAC,iCAAiC,EAAE,kBAAkB,EAAE;YAC/E,0BAA0B;SAC3B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,eAAe,CAAC,uCAAuC,EAAE,iBAAiB,EAAE;QACpF,6FAA6F;QAC7F,+DAA+D;KAChE,CAAC,CAAC;AACL,CAAC"}
|