screenci 0.0.71 → 0.0.73
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 +13 -13
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +257 -81
- package/dist/cli.js.map +1 -1
- package/dist/docs/manifest.d.ts +3 -3
- package/dist/docs/manifest.js +1 -1
- package/dist/docs/manifest.js.map +1 -1
- package/dist/docs/video-sources/installation.screenci.js +13 -12
- package/dist/docs/video-sources/installation.screenci.js.map +1 -1
- package/dist/docs/video-sources/landing.screenci.js +16 -9
- package/dist/docs/video-sources/landing.screenci.js.map +1 -1
- package/dist/docs/video-sources/public-urls.screenci.js +16 -9
- package/dist/docs/video-sources/public-urls.screenci.js.map +1 -1
- package/dist/docs/video-sources/studio.screenci.js +42 -27
- package/dist/docs/video-sources/studio.screenci.js.map +1 -1
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/src/asset.d.ts +82 -51
- package/dist/src/asset.d.ts.map +1 -1
- package/dist/src/asset.js +93 -46
- package/dist/src/asset.js.map +1 -1
- package/dist/src/audio.d.ts +6 -24
- package/dist/src/audio.d.ts.map +1 -1
- package/dist/src/audio.js +10 -35
- package/dist/src/audio.js.map +1 -1
- package/dist/src/builder.d.ts +214 -0
- package/dist/src/builder.d.ts.map +1 -0
- package/dist/src/builder.js +212 -0
- package/dist/src/builder.js.map +1 -0
- package/dist/src/config.d.ts +1 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +13 -7
- package/dist/src/config.js.map +1 -1
- package/dist/src/cue.d.ts +40 -123
- package/dist/src/cue.d.ts.map +1 -1
- package/dist/src/cue.js +190 -30
- package/dist/src/cue.js.map +1 -1
- package/dist/src/defaults.d.ts +2 -2
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +2 -2
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/events.d.ts +80 -15
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +72 -6
- package/dist/src/events.js.map +1 -1
- package/dist/src/init.d.ts.map +1 -1
- package/dist/src/init.js +80 -39
- package/dist/src/init.js.map +1 -1
- package/dist/src/locales.d.ts +19 -0
- package/dist/src/locales.d.ts.map +1 -0
- package/dist/src/locales.js +60 -0
- package/dist/src/locales.js.map +1 -0
- package/dist/src/localize.d.ts +135 -0
- package/dist/src/localize.d.ts.map +1 -0
- package/dist/src/localize.js +195 -0
- package/dist/src/localize.js.map +1 -0
- package/dist/src/localizeRuntime.d.ts +53 -0
- package/dist/src/localizeRuntime.d.ts.map +1 -0
- package/dist/src/localizeRuntime.js +79 -0
- package/dist/src/localizeRuntime.js.map +1 -0
- package/dist/src/mouse.d.ts.map +1 -1
- package/dist/src/mouse.js +6 -0
- package/dist/src/mouse.js.map +1 -1
- package/dist/src/recordingData.d.ts +5 -4
- package/dist/src/recordingData.d.ts.map +1 -1
- package/dist/src/runtimeContext.d.ts +22 -4
- package/dist/src/runtimeContext.d.ts.map +1 -1
- package/dist/src/runtimeContext.js +11 -0
- package/dist/src/runtimeContext.js.map +1 -1
- package/dist/src/runtimeMode.d.ts +47 -0
- package/dist/src/runtimeMode.d.ts.map +1 -1
- package/dist/src/runtimeMode.js +124 -0
- package/dist/src/runtimeMode.js.map +1 -1
- package/dist/src/screenshot.d.ts +56 -2
- package/dist/src/screenshot.d.ts.map +1 -1
- package/dist/src/screenshot.js +49 -10
- package/dist/src/screenshot.js.map +1 -1
- package/dist/src/stillCapture.d.ts +10 -4
- package/dist/src/stillCapture.d.ts.map +1 -1
- package/dist/src/stillCapture.js +11 -0
- package/dist/src/stillCapture.js.map +1 -1
- package/dist/src/studio.d.ts +55 -22
- package/dist/src/studio.d.ts.map +1 -1
- package/dist/src/studio.js +38 -12
- package/dist/src/studio.js.map +1 -1
- package/dist/src/types.d.ts +20 -7
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +1 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/video.d.ts +149 -13
- package/dist/src/video.d.ts.map +1 -1
- package/dist/src/video.js +98 -25
- package/dist/src/video.js.map +1 -1
- package/dist/src/voiceConfig.d.ts +110 -0
- package/dist/src/voiceConfig.d.ts.map +1 -0
- package/dist/src/voiceConfig.js +2 -0
- package/dist/src/voiceConfig.js.map +1 -0
- package/dist/src/voices.d.ts +27 -23
- package/dist/src/voices.d.ts.map +1 -1
- package/dist/src/voices.js +7 -4
- package/dist/src/voices.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/skills/screenci/SKILL.md +51 -47
- package/skills/screenci/references/init.md +1 -1
- package/skills/screenci/references/record.md +6 -6
- package/dist/docs/video-sources/product-pitch.screenci.d.ts +0 -2
- package/dist/docs/video-sources/product-pitch.screenci.d.ts.map +0 -1
- package/dist/docs/video-sources/product-pitch.screenci.js +0 -136
- package/dist/docs/video-sources/product-pitch.screenci.js.map +0 -1
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Use `screenci record` to capture ScreenCI videos from `.screenci.ts` scripts.
|
|
4
4
|
|
|
5
|
-
Assume the ScreenCI project is already initialized. Add new video scripts under `
|
|
6
|
-
If you are creating new videos, remove the starter `
|
|
5
|
+
Assume the ScreenCI project is already initialized. Add new video scripts under `recordings/`.
|
|
6
|
+
If you are creating new videos, remove the starter `recordings/example.screenci.ts` file.
|
|
7
7
|
|
|
8
8
|
## Commands
|
|
9
9
|
|
|
@@ -21,14 +21,14 @@ npx screenci record -c screenci.config.ts
|
|
|
21
21
|
|
|
22
22
|
## Sign In Early
|
|
23
23
|
|
|
24
|
-
Sign-in only blocks the final recording, not authoring or testing. Get it going up front: surface the sign-in link to the user early (printed by `screenci init`, or by running `npx screenci record` once, or read from `screenci/.screenci/link-session.json`) and ask them to sign in while you build the video. The link is valid for 24 hours. For the final recording,
|
|
24
|
+
Sign-in only blocks the final recording, not authoring or testing. Get it going up front: surface the sign-in link to the user early (printed by `screenci init`, or by running `npx screenci record` once, or read from `screenci/.screenci/link-session.json`) and ask them to sign in while you build the video. The link is valid for 24 hours. For the final recording, run `npx screenci record` (no flag): off-CI it waits and records as soon as sign-in completes. Attempting it before they finish does no harm: it reprints the link, and if the timeout elapses it exits non-zero with the link still valid, so re-prompt and run again.
|
|
25
25
|
|
|
26
26
|
## Runtime Behavior
|
|
27
27
|
|
|
28
28
|
- Recording runs with local Playwright.
|
|
29
|
-
- When `SCREENCI_SECRET` is missing in an interactive terminal,
|
|
30
|
-
-
|
|
31
|
-
-
|
|
29
|
+
- When `SCREENCI_SECRET` is missing, `screenci record` waits for browser sign-in by default and continues once it completes. This is the default at an interactive terminal and in a plain non-interactive session (no terminal, no CI), so an agent does not need a flag. It prints the link, polls (every 2 seconds interactively, every 5 seconds otherwise) up to a timeout (15 minutes interactively, 5 minutes otherwise), then saves the secret and records. If the timeout elapses first, it exits **non-zero** with the link still valid, so re-surface the link and rerun once signed in. Override the timeout with `SCREENCI_POLL_AUTH_TIMEOUT_MS` (milliseconds).
|
|
30
|
+
- Under CI (`CI=true`), or with `SCREENCI_NONINTERACTIVE=1` or `--no-poll-auth`, `screenci record` does not wait: it prints the sign-in link and exits cleanly with exit code 0 without recording. A clean exit here is a handoff, not a finished recording, so do not treat exit code 0 as "recording done" when the output contains a sign-in link. Set `SCREENCI_SECRET` ahead of time (the expected CI setup) to record without an interactive sign-in.
|
|
31
|
+
- `--poll-auth` still forces waiting and is kept for backwards compatibility, but is no longer needed off-CI where waiting is already the default.
|
|
32
32
|
- Pending auth state is cached in `.screenci/link-session.json`, so rerunning `record` reuses the same link until it expires or completes.
|
|
33
33
|
- Playwright arguments can be passed through after the command.
|
|
34
34
|
- When API configuration and `SCREENCI_SECRET` are available, uploads may run after recording.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"product-pitch.screenci.d.ts","sourceRoot":"","sources":["../../../docs/video-sources/product-pitch.screenci.ts"],"names":[],"mappings":""}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { expect } from '@playwright/test';
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { autoZoom, createNarration, createOverlays, hide, resetZoom, video, voices, zoomTo, } from 'screenci';
|
|
5
|
-
// Before recording:
|
|
6
|
-
// 1. Put the condensed, cursor-safe agent capture at assets/agent.mp4.
|
|
7
|
-
// 2. Set SCREENCI_APP_STORAGE_STATE to a logged-in Playwright storage state.
|
|
8
|
-
// 3. Override these defaults when the agent created a different remote video:
|
|
9
|
-
// SCREENCI_PITCH_PROJECT_NAME
|
|
10
|
-
// SCREENCI_PITCH_VIDEO_NAME
|
|
11
|
-
//
|
|
12
|
-
// This video deliberately starts a real one-off Studio render. Testing or
|
|
13
|
-
// recording it therefore consumes one render. Keep agent.mp4 short enough that
|
|
14
|
-
// the complete pitch remains below two minutes (roughly 20-25 seconds).
|
|
15
|
-
const projectName = process.env.SCREENCI_PITCH_PROJECT_NAME ?? 'demo-saas';
|
|
16
|
-
const videoName = process.env.SCREENCI_PITCH_VIDEO_NAME ?? 'Vertical invoice';
|
|
17
|
-
const agentRecording = fileURLToPath(new URL('../assets/agent.mp4', import.meta.url));
|
|
18
|
-
const overlays = createOverlays({
|
|
19
|
-
agentSession: {
|
|
20
|
-
path: '../assets/agent.mp4',
|
|
21
|
-
fullScreen: true,
|
|
22
|
-
// The launch narration explains this condensed recording, so mute any
|
|
23
|
-
// incidental screen-recorder audio in the source clip.
|
|
24
|
-
audio: 0,
|
|
25
|
-
},
|
|
26
|
-
});
|
|
27
|
-
const narration = createNarration({
|
|
28
|
-
voice: {
|
|
29
|
-
name: voices.Sophie,
|
|
30
|
-
style: 'Calm, direct developer presenting a real product workflow',
|
|
31
|
-
},
|
|
32
|
-
en: {
|
|
33
|
-
intro: 'This video shows how a coding agent and ScreenCI [pronounce: screen see eye] turn a product flow into a finished product video.',
|
|
34
|
-
agent: 'I asked the agent to create a narrated walkthrough for this sample SaaS application. This is the actual session, condensed.',
|
|
35
|
-
source: 'It reads the application, then writes and tests a Playwright-style video file in the repository.',
|
|
36
|
-
oneOff: 'The flow is already recorded, so I can render a one-off version without recording the application again.',
|
|
37
|
-
rendering: 'This is the real render job, combining the recording, narration, camera motion, and overlays.',
|
|
38
|
-
privacy: 'The application, source, session, and credentials stayed local. Only the recording and timing data were uploaded.',
|
|
39
|
-
delivery: 'The finished video is ready to review, download, or publish through a stable public URL.',
|
|
40
|
-
maintenance: 'Run the source locally or in CI. If the product flow changes, it fails visibly instead of leaving a stale walkthrough online.',
|
|
41
|
-
more: 'One recording can produce language versions with synchronized narration and subtitles, cloned voices, and React or HTML overlays.',
|
|
42
|
-
outro: 'That is ScreenCI [pronounce: screen see eye]: from a coding-agent prompt to a product video you can rerun whenever the product changes.',
|
|
43
|
-
},
|
|
44
|
-
});
|
|
45
|
-
video('ScreenCI product pitch', async ({ page }) => {
|
|
46
|
-
video.skip(!process.env.SCREENCI_APP_STORAGE_STATE, 'Requires SCREENCI_APP_STORAGE_STATE with a logged-in ScreenCI app session.');
|
|
47
|
-
video.skip(!existsSync(agentRecording), 'Add the condensed agent capture at screenci/assets/agent.mp4.');
|
|
48
|
-
// Start in Studio for the video produced during the captured agent session.
|
|
49
|
-
// Authentication and dashboard navigation are setup, so they are not shown.
|
|
50
|
-
await hide(async () => {
|
|
51
|
-
await page.goto('https://app.screenci.com/');
|
|
52
|
-
await page.waitForLoadState('networkidle');
|
|
53
|
-
const projects = page.getByTestId('projects-list');
|
|
54
|
-
await expect(projects).toBeVisible({ timeout: 30_000 });
|
|
55
|
-
await projects.getByRole('link', { name: projectName, exact: true }).click();
|
|
56
|
-
await page.getByRole('link', { name: videoName, exact: true }).click();
|
|
57
|
-
await expect(page.getByRole('heading', { name: /languages/i })).toBeVisible({ timeout: 30_000 });
|
|
58
|
-
await page.getByRole('link', { name: /open in studio/i }).click();
|
|
59
|
-
await expect(page.getByRole('heading', { name: /^studio$/i })).toBeVisible({
|
|
60
|
-
timeout: 30_000,
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
await narration.intro();
|
|
64
|
-
// agent.mp4 uses its natural duration. Keep it condensed to 20-25 seconds.
|
|
65
|
-
await narration.agent.start();
|
|
66
|
-
await overlays.agentSession();
|
|
67
|
-
await narration.agent.end();
|
|
68
|
-
await narration.source();
|
|
69
|
-
// This is an intentional real side effect: every run starts one new Studio
|
|
70
|
-
// render for the selected language.
|
|
71
|
-
await narration.oneOff.start();
|
|
72
|
-
await autoZoom(async () => {
|
|
73
|
-
await page.getByRole('button', { name: 'Create one-off version' }).click();
|
|
74
|
-
const dialog = page.getByRole('alertdialog');
|
|
75
|
-
await expect(dialog.getByRole('heading', { name: 'Create a one-off version' })).toBeVisible();
|
|
76
|
-
await dialog.getByRole('button', { name: 'Continue' }).click();
|
|
77
|
-
const renderButton = page.getByRole('button', {
|
|
78
|
-
name: /^Render one-off [A-Z-]+$/,
|
|
79
|
-
});
|
|
80
|
-
await expect(renderButton).toBeEnabled();
|
|
81
|
-
await renderButton.click();
|
|
82
|
-
});
|
|
83
|
-
await expect(page.getByText(/One-off render started for [A-Z-]+\./)).toBeVisible({ timeout: 30_000 });
|
|
84
|
-
await narration.oneOff.end();
|
|
85
|
-
await narration.rendering.start();
|
|
86
|
-
await page.getByRole('link', { name: /view render/i }).click();
|
|
87
|
-
await expect(page.getByRole('heading', { name: /^Studio render/ })).toBeVisible({ timeout: 30_000 });
|
|
88
|
-
await narration.rendering.end();
|
|
89
|
-
// Show the genuine progress UI, but cut the unpredictable cloud wait from
|
|
90
|
-
// the final timeline. A fast render may already be complete at this point.
|
|
91
|
-
await page.waitForTimeout(1_500);
|
|
92
|
-
await hide(async () => {
|
|
93
|
-
await expect(page.getByText('Rendering complete', { exact: true })).toBeVisible({ timeout: 10 * 60_000 });
|
|
94
|
-
});
|
|
95
|
-
await narration.privacy();
|
|
96
|
-
// Open the finished one-off version from the render-run page.
|
|
97
|
-
const finishedVersion = page
|
|
98
|
-
.getByRole('link')
|
|
99
|
-
.filter({ hasText: /View\s*→/ })
|
|
100
|
-
.first();
|
|
101
|
-
await expect(finishedVersion).toBeVisible();
|
|
102
|
-
await finishedVersion.click();
|
|
103
|
-
await expect(page.getByRole('heading', { name: /^v\d+$/ })).toBeVisible({
|
|
104
|
-
timeout: 30_000,
|
|
105
|
-
});
|
|
106
|
-
await expect(page.getByTestId('video-loading-overlay')).toBeHidden({
|
|
107
|
-
timeout: 30_000,
|
|
108
|
-
});
|
|
109
|
-
// Let the generated product video demonstrate itself without narration over
|
|
110
|
-
// it. Twelve seconds is enough to establish the output while keeping the
|
|
111
|
-
// complete pitch below two minutes.
|
|
112
|
-
const playButton = page.getByRole('button', { name: /^play$/i });
|
|
113
|
-
await expect(playButton).toBeVisible();
|
|
114
|
-
await playButton.click();
|
|
115
|
-
await page.waitForTimeout(12_000);
|
|
116
|
-
const pauseButton = page.getByRole('button', { name: /^pause$/i });
|
|
117
|
-
if (await pauseButton.isVisible()) {
|
|
118
|
-
await pauseButton.click();
|
|
119
|
-
}
|
|
120
|
-
await narration.delivery();
|
|
121
|
-
await zoomTo(page.getByRole('button', { name: 'Download Video' }));
|
|
122
|
-
await page.waitForTimeout(700);
|
|
123
|
-
await resetZoom();
|
|
124
|
-
await narration.maintenance();
|
|
125
|
-
// Return to the video overview so the language and delivery surfaces support
|
|
126
|
-
// the final feature summary visually.
|
|
127
|
-
await page.getByRole('link', { name: videoName, exact: true }).click();
|
|
128
|
-
await expect(page.getByRole('heading', { name: /languages/i })).toBeVisible({
|
|
129
|
-
timeout: 30_000,
|
|
130
|
-
});
|
|
131
|
-
await zoomTo(page.getByRole('heading', { name: /languages/i }));
|
|
132
|
-
await narration.more();
|
|
133
|
-
await resetZoom();
|
|
134
|
-
await narration.outro();
|
|
135
|
-
});
|
|
136
|
-
//# sourceMappingURL=product-pitch.screenci.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"product-pitch.screenci.js","sourceRoot":"","sources":["../../../docs/video-sources/product-pitch.screenci.ts"],"names":[],"mappings":"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"}
|