screenci 0.0.72 → 0.0.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.d.ts +6 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +129 -74
  5. package/dist/cli.js.map +1 -1
  6. package/dist/src/asset.d.ts +74 -28
  7. package/dist/src/asset.d.ts.map +1 -1
  8. package/dist/src/asset.js +83 -14
  9. package/dist/src/asset.js.map +1 -1
  10. package/dist/src/config.d.ts +1 -1
  11. package/dist/src/config.d.ts.map +1 -1
  12. package/dist/src/config.js +13 -7
  13. package/dist/src/config.js.map +1 -1
  14. package/dist/src/defaults.d.ts +2 -2
  15. package/dist/src/defaults.d.ts.map +1 -1
  16. package/dist/src/defaults.js +2 -2
  17. package/dist/src/defaults.js.map +1 -1
  18. package/dist/src/init.d.ts.map +1 -1
  19. package/dist/src/init.js +66 -26
  20. package/dist/src/init.js.map +1 -1
  21. package/dist/src/mouse.d.ts.map +1 -1
  22. package/dist/src/mouse.js +6 -0
  23. package/dist/src/mouse.js.map +1 -1
  24. package/dist/src/runtimeContext.d.ts +19 -0
  25. package/dist/src/runtimeContext.d.ts.map +1 -1
  26. package/dist/src/runtimeContext.js +11 -0
  27. package/dist/src/runtimeContext.js.map +1 -1
  28. package/dist/src/screenshot.d.ts.map +1 -1
  29. package/dist/src/screenshot.js +2 -0
  30. package/dist/src/screenshot.js.map +1 -1
  31. package/dist/src/stillCapture.d.ts +8 -1
  32. package/dist/src/stillCapture.d.ts.map +1 -1
  33. package/dist/src/stillCapture.js +11 -0
  34. package/dist/src/stillCapture.js.map +1 -1
  35. package/dist/src/types.d.ts +2 -2
  36. package/dist/src/types.d.ts.map +1 -1
  37. package/dist/src/types.js +1 -1
  38. package/dist/src/types.js.map +1 -1
  39. package/dist/src/video.d.ts.map +1 -1
  40. package/dist/src/video.js +7 -1
  41. package/dist/src/video.js.map +1 -1
  42. package/dist/tsconfig.tsbuildinfo +1 -1
  43. package/package.json +1 -1
  44. package/skills/screenci/SKILL.md +12 -17
  45. package/skills/screenci/references/init.md +1 -1
  46. package/skills/screenci/references/record.md +6 -6
  47. package/dist/docs/video-sources/product-pitch.screenci.d.ts +0 -2
  48. package/dist/docs/video-sources/product-pitch.screenci.d.ts.map +0 -1
  49. package/dist/docs/video-sources/product-pitch.screenci.js +0 -201
  50. package/dist/docs/video-sources/product-pitch.screenci.js.map +0 -1
@@ -1,201 +0,0 @@
1
- import { expect } from '@playwright/test';
2
- import { existsSync } from 'node:fs';
3
- import { fileURLToPath } from 'node:url';
4
- import { autoZoom, 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 appUrl = process.env.SCREENCI_PITCH_APP_URL ??
18
- process.env.SCREENCI_APP_URL ??
19
- 'https://app.screenci.com/';
20
- const placeholderMode = process.env.SCREENCI_PITCH_PLACEHOLDER === 'true';
21
- const agentRecording = fileURLToPath(new URL('../assets/agent.mp4', import.meta.url));
22
- const overlays = createOverlays({
23
- agentSession: {
24
- path: '../assets/agent.mp4',
25
- fullScreen: true,
26
- // The launch narration explains this condensed recording, so mute any
27
- // incidental screen-recorder audio in the source clip.
28
- audio: 0,
29
- },
30
- });
31
- video.use({
32
- renderOptions: {
33
- narration: {
34
- voice: {
35
- name: voices.Sophie,
36
- style: 'Calm, direct developer presenting a real product workflow',
37
- },
38
- },
39
- },
40
- });
41
- video.localize({
42
- narration: {
43
- en: {
44
- intro: 'This video shows how a coding agent and ScreenCI [pronounce: screen see eye] turn a product flow into a finished product video.',
45
- agent: 'I asked the agent to create a narrated walkthrough for this sample SaaS application. This is the actual session, condensed.',
46
- source: 'It reads the application, then writes and tests a Playwright-style video file in the repository.',
47
- oneOff: 'The flow is already recorded, so Studio can render a one-off version without recording the application again.',
48
- rendering: 'This is the real render job, combining the recording, narration, camera motion, and overlays.',
49
- privacy: 'The application, source, session, and credentials stayed local. Only the recording and timing data were uploaded.',
50
- delivery: 'The finished video is ready to review, download, or publish through a stable public URL.',
51
- maintenance: 'Run the source locally or in CI. If the product flow changes, it fails visibly instead of leaving a stale walkthrough online.',
52
- more: 'One recording can produce language versions with synchronized narration and subtitles, cloned voices, and React or HTML overlays.',
53
- outro: 'That is ScreenCI [pronounce: screen see eye]: from a coding-agent prompt to a product video you can rerun whenever the product changes.',
54
- },
55
- },
56
- })('ScreenCI product pitch', async ({ page, narration }) => {
57
- let selectedVideoName = videoName;
58
- video.skip(!placeholderMode && !process.env.SCREENCI_APP_STORAGE_STATE, 'Requires SCREENCI_APP_STORAGE_STATE with a logged-in ScreenCI app session.');
59
- video.skip(!existsSync(agentRecording), 'Add the condensed agent capture at screenci/assets/agent.mp4.');
60
- if (placeholderMode) {
61
- await hide(async () => {
62
- await page.goto(appUrl);
63
- await page.waitForLoadState('networkidle');
64
- });
65
- await narration.intro();
66
- await overlays.agentSession();
67
- await narration.outro();
68
- return;
69
- }
70
- // Start in Studio for the video produced during the captured agent session.
71
- // Authentication and dashboard navigation are setup, so they are not shown.
72
- await hide(async () => {
73
- await page.goto(appUrl);
74
- await page.waitForLoadState('networkidle');
75
- const projects = page.getByTestId('projects-list');
76
- await expect(projects).toBeVisible({ timeout: 30_000 });
77
- const configuredProject = projects.getByRole('link', {
78
- name: projectName,
79
- exact: true,
80
- });
81
- const projectLink = (await configuredProject.count()) > 0
82
- ? configuredProject
83
- : projects.getByRole('link').first();
84
- await projectLink.click();
85
- const configuredVideo = page.getByRole('link', {
86
- name: videoName,
87
- exact: true,
88
- });
89
- const videoLink = (await configuredVideo.count()) > 0
90
- ? configuredVideo
91
- : page.locator('a[href*="/video/"]').first();
92
- selectedVideoName =
93
- (await videoLink.getAttribute('aria-label')) ?? selectedVideoName;
94
- await videoLink.click();
95
- await expect(page.getByRole('heading', { name: /language versions/i })).toBeVisible({ timeout: 30_000 });
96
- await page
97
- .getByRole('link', { name: /^open /i })
98
- .first()
99
- .click();
100
- await expect(page.getByRole('heading', { name: /^studio$/i })).toBeVisible({
101
- timeout: 30_000,
102
- });
103
- });
104
- await narration.intro();
105
- // agent.mp4 uses its natural duration. Keep it condensed to 20-25 seconds.
106
- await narration.agent.start();
107
- await overlays.agentSession();
108
- await narration.agent.end();
109
- await narration.source();
110
- const createOneOffButton = page.getByRole('button', {
111
- name: 'Create one-off version',
112
- });
113
- const canCreateOneOff = await createOneOffButton
114
- .isVisible({ timeout: 5_000 })
115
- .catch(() => false);
116
- if (!canCreateOneOff) {
117
- await narration.oneOff.start();
118
- await zoomTo(page.getByRole('heading', { name: /^studio$/i }));
119
- await page.waitForTimeout(900);
120
- await resetZoom();
121
- await narration.oneOff.end();
122
- await narration.privacy();
123
- await narration.delivery();
124
- await narration.maintenance();
125
- await page
126
- .getByRole('link', { name: selectedVideoName, exact: true })
127
- .click();
128
- await expect(page.getByRole('heading', { name: /language versions/i })).toBeVisible({ timeout: 30_000 });
129
- await zoomTo(page.getByRole('heading', { name: /language versions/i }));
130
- await narration.more();
131
- await resetZoom();
132
- await narration.outro();
133
- return;
134
- }
135
- // This is an intentional real side effect when the authenticated workspace has
136
- // Studio rendering enabled: every run starts one new Studio render for the
137
- // selected language. Read-only CI workspaces take the fallback above.
138
- await narration.oneOff.start();
139
- await autoZoom(async () => {
140
- await createOneOffButton.click();
141
- const dialog = page.getByRole('alertdialog');
142
- await expect(dialog.getByRole('heading', { name: 'Create a one-off version' })).toBeVisible();
143
- await dialog.getByRole('button', { name: 'Continue' }).click();
144
- const renderButton = page.getByRole('button', {
145
- name: /^Render one-off [A-Z-]+$/,
146
- });
147
- await expect(renderButton).toBeEnabled();
148
- await renderButton.click();
149
- });
150
- await expect(page.getByText(/One-off render started for [A-Z-]+\./)).toBeVisible({ timeout: 30_000 });
151
- await narration.oneOff.end();
152
- await narration.rendering.start();
153
- await page.getByRole('link', { name: /view render/i }).click();
154
- await expect(page.getByRole('heading', { name: /^Studio render/ })).toBeVisible({ timeout: 30_000 });
155
- await narration.rendering.end();
156
- // Show the genuine progress UI, but cut the unpredictable cloud wait from
157
- // the final timeline. A fast render may already be complete at this point.
158
- await page.waitForTimeout(1_500);
159
- await hide(async () => {
160
- await expect(page.getByText('Rendering complete', { exact: true })).toBeVisible({ timeout: 10 * 60_000 });
161
- });
162
- await narration.privacy();
163
- // Open the finished one-off version from the render-run page.
164
- const finishedVersion = page
165
- .getByRole('link')
166
- .filter({ hasText: /View\s*→/ })
167
- .first();
168
- await expect(finishedVersion).toBeVisible();
169
- await finishedVersion.click();
170
- await expect(page.getByRole('heading', { name: /^v\d+$/ })).toBeVisible({
171
- timeout: 30_000,
172
- });
173
- await expect(page.getByTestId('video-loading-overlay')).toBeHidden({
174
- timeout: 30_000,
175
- });
176
- // Let the generated product video demonstrate itself without narration over
177
- // it. Twelve seconds is enough to establish the output while keeping the
178
- // complete pitch below two minutes.
179
- const playButton = page.getByRole('button', { name: /^play$/i });
180
- await expect(playButton).toBeVisible();
181
- await playButton.click();
182
- await page.waitForTimeout(12_000);
183
- const pauseButton = page.getByRole('button', { name: /^pause$/i });
184
- if (await pauseButton.isVisible()) {
185
- await pauseButton.click();
186
- }
187
- await narration.delivery();
188
- await zoomTo(page.getByRole('button', { name: 'Download Video' }));
189
- await page.waitForTimeout(700);
190
- await resetZoom();
191
- await narration.maintenance();
192
- // Return to the video overview so the language and delivery surfaces support
193
- // the final feature summary visually.
194
- await page.getByRole('link', { name: selectedVideoName, exact: true }).click();
195
- await expect(page.getByRole('heading', { name: /language versions/i })).toBeVisible({ timeout: 30_000 });
196
- await zoomTo(page.getByRole('heading', { name: /language versions/i }));
197
- await narration.more();
198
- await resetZoom();
199
- await narration.outro();
200
- });
201
- //# 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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"}