screenci 0.0.68 → 0.0.69

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 (76) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.d.ts +3 -18
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +105 -154
  5. package/dist/cli.js.map +1 -1
  6. package/dist/docs/manifest.d.ts +13 -13
  7. package/dist/docs/manifest.js +4 -4
  8. package/dist/docs/manifest.js.map +1 -1
  9. package/dist/docs/video-sources/studio.video.d.ts +2 -0
  10. package/dist/docs/video-sources/studio.video.d.ts.map +1 -0
  11. package/dist/docs/video-sources/studio.video.js +57 -0
  12. package/dist/docs/video-sources/studio.video.js.map +1 -0
  13. package/dist/e2e/htmlRasterizer.e2e.d.ts +2 -0
  14. package/dist/e2e/htmlRasterizer.e2e.d.ts.map +1 -0
  15. package/dist/e2e/htmlRasterizer.e2e.js +107 -0
  16. package/dist/e2e/htmlRasterizer.e2e.js.map +1 -0
  17. package/dist/index.d.ts +5 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +2 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/src/asset.d.ts +141 -53
  22. package/dist/src/asset.d.ts.map +1 -1
  23. package/dist/src/asset.js +533 -78
  24. package/dist/src/asset.js.map +1 -1
  25. package/dist/src/audio.d.ts +113 -0
  26. package/dist/src/audio.d.ts.map +1 -0
  27. package/dist/src/audio.js +204 -0
  28. package/dist/src/audio.js.map +1 -0
  29. package/dist/src/defaults.d.ts +7 -1
  30. package/dist/src/defaults.d.ts.map +1 -1
  31. package/dist/src/defaults.js +7 -0
  32. package/dist/src/defaults.js.map +1 -1
  33. package/dist/src/events.d.ts +134 -6
  34. package/dist/src/events.d.ts.map +1 -1
  35. package/dist/src/events.js +73 -2
  36. package/dist/src/events.js.map +1 -1
  37. package/dist/src/htmlRasterizer.d.ts +110 -0
  38. package/dist/src/htmlRasterizer.d.ts.map +1 -0
  39. package/dist/src/htmlRasterizer.js +364 -0
  40. package/dist/src/htmlRasterizer.js.map +1 -0
  41. package/dist/src/init.d.ts +17 -0
  42. package/dist/src/init.d.ts.map +1 -1
  43. package/dist/src/init.js +127 -7
  44. package/dist/src/init.js.map +1 -1
  45. package/dist/src/linkSession.d.ts +36 -0
  46. package/dist/src/linkSession.d.ts.map +1 -0
  47. package/dist/src/linkSession.js +122 -0
  48. package/dist/src/linkSession.js.map +1 -0
  49. package/dist/src/performance.d.ts +1 -3
  50. package/dist/src/performance.d.ts.map +1 -1
  51. package/dist/src/performance.js +0 -12
  52. package/dist/src/performance.js.map +1 -1
  53. package/dist/src/recording.d.ts +1 -1
  54. package/dist/src/recording.d.ts.map +1 -1
  55. package/dist/src/recordingData.d.ts +2 -2
  56. package/dist/src/recordingData.d.ts.map +1 -1
  57. package/dist/src/runtimeContext.d.ts +38 -0
  58. package/dist/src/runtimeContext.d.ts.map +1 -1
  59. package/dist/src/runtimeContext.js +25 -0
  60. package/dist/src/runtimeContext.js.map +1 -1
  61. package/dist/src/types.d.ts +25 -7
  62. package/dist/src/types.d.ts.map +1 -1
  63. package/dist/src/types.js.map +1 -1
  64. package/dist/src/video.d.ts +34 -1
  65. package/dist/src/video.d.ts.map +1 -1
  66. package/dist/src/video.js +120 -19
  67. package/dist/src/video.js.map +1 -1
  68. package/dist/src/voices.d.ts +22 -9
  69. package/dist/src/voices.d.ts.map +1 -1
  70. package/dist/src/voices.js +6 -24
  71. package/dist/src/voices.js.map +1 -1
  72. package/dist/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +16 -2
  74. package/skills/screenci/SKILL.md +27 -5
  75. package/skills/screenci/references/init.md +2 -0
  76. package/skills/screenci/references/record.md +6 -1
@@ -0,0 +1,364 @@
1
+ import { spawn } from 'child_process';
2
+ import { createHash } from 'crypto';
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
4
+ import { mkdtemp, readFile, rm, writeFile } from 'fs/promises';
5
+ import { tmpdir } from 'os';
6
+ import { dirname, join } from 'path';
7
+ import ffmpegStatic from 'ffmpeg-static';
8
+ import { getRuntimePage, getRuntimeRecordingDir } from './runtimeContext.js';
9
+ const ffmpegPath = ffmpegStatic;
10
+ const OVERLAY_ROOT_ID = 'screenci-overlay-root';
11
+ // Render overlays at 2x pixel density so the PNG carries more detail than the
12
+ // on-screen overlay size. The renderer then downscales it to the placement box,
13
+ // which keeps text and edges crisp. 2x keeps overlays sharp at typical sizes
14
+ // while roughly quartering the byte cost of the previous 4x density. Overlay
15
+ // content is bounded by the off-screen page viewport, so the screenshot stays
16
+ // well under GPU texture limits.
17
+ const DEFAULT_OVERLAY_DEVICE_SCALE_FACTOR = 2;
18
+ // Bump when anything that affects rasterized output changes (the HTML wrapper,
19
+ // screenshot options, default density) so stale cache entries are invalidated.
20
+ const RASTERIZE_CACHE_VERSION = 2;
21
+ let rasterizer = playwrightHtmlRasterizer;
22
+ // Cache only the real (browser) rasterizer. Injected rasterizers are used by
23
+ // tests, where caching across a shared tmp dir would leak between cases.
24
+ let cacheEnabled = true;
25
+ export function setHtmlRasterizer(fn) {
26
+ rasterizer = fn;
27
+ cacheEnabled = false;
28
+ }
29
+ /** Test hook: re-enable caching after injecting a (counting) rasterizer. */
30
+ export function setOverlayCacheEnabled(enabled) {
31
+ cacheEnabled = enabled;
32
+ }
33
+ // CSS injected into every overlay document, on top of the minimal reset. Set it
34
+ // once (e.g. to your compiled Tailwind stylesheet) so overlays can be styled
35
+ // with `className`. Per-overlay `css` is merged on top of this.
36
+ let defaultOverlayCss = '';
37
+ /**
38
+ * Sets CSS injected into every HTML/React overlay document. Pass a compiled
39
+ * stylesheet (for example Tailwind's output) so overlays can use `className`.
40
+ * Per-overlay `css` is appended after this.
41
+ */
42
+ export function setOverlayCss(css) {
43
+ defaultOverlayCss = css;
44
+ }
45
+ /** Merges the global default overlay CSS with a per-overlay override. */
46
+ export function resolveOverlayCss(css) {
47
+ return [defaultOverlayCss, css]
48
+ .filter((part) => part !== undefined && part.length > 0)
49
+ .join('\n');
50
+ }
51
+ function wrapOverlayHtml(html, options = {}) {
52
+ const { css, capturePadding } = options;
53
+ // capturePadding is transparent padding on the root, so the captured box (the
54
+ // element/clip bounding box) grows by it on every side. Animations can then
55
+ // translate/scale/rotate within that margin without being clipped, replacing
56
+ // the manual "stage" wrapper.
57
+ const padding = capturePadding !== undefined && capturePadding > 0
58
+ ? `;padding:${capturePadding}px`
59
+ : '';
60
+ const userStyle = css !== undefined && css.length > 0 ? `<style>${css}</style>` : '';
61
+ return ('<!doctype html><html><head><meta charset="utf-8"><style>' +
62
+ 'html,body{margin:0;padding:0;background:transparent}' +
63
+ `#${OVERLAY_ROOT_ID}{display:inline-block${padding}}` +
64
+ `</style>${userStyle}</head><body><div id="${OVERLAY_ROOT_ID}">${html}</div></body></html>`);
65
+ }
66
+ async function playwrightHtmlRasterizer(request) {
67
+ const page = getRuntimePage();
68
+ if (page === null) {
69
+ throw new Error('[screenci] Cannot rasterize an HTML overlay without an active recording page.');
70
+ }
71
+ const browser = page.context().browser();
72
+ if (browser === null) {
73
+ throw new Error('[screenci] Cannot rasterize an HTML overlay: the browser is not available.');
74
+ }
75
+ // A dedicated context with no video recording so the overlay render never
76
+ // leaks into the recording page or its captured video.
77
+ const overlayContext = await browser.newContext({
78
+ deviceScaleFactor: request.deviceScaleFactor ?? DEFAULT_OVERLAY_DEVICE_SCALE_FACTOR,
79
+ });
80
+ try {
81
+ const overlayPage = await overlayContext.newPage();
82
+ await overlayPage.setContent(wrapOverlayHtml(request.html, {
83
+ ...(request.css !== undefined && { css: request.css }),
84
+ ...(request.capturePadding !== undefined && {
85
+ capturePadding: request.capturePadding,
86
+ }),
87
+ }), { waitUntil: 'load' });
88
+ const root = overlayPage.locator(`#${OVERLAY_ROOT_ID}`);
89
+ const box = await root.boundingBox();
90
+ const buffer = await root.screenshot({ omitBackground: true, type: 'png' });
91
+ return {
92
+ buffer,
93
+ width: box ? Math.round(box.width) : 0,
94
+ height: box ? Math.round(box.height) : 0,
95
+ };
96
+ }
97
+ finally {
98
+ await overlayContext.close().catch(() => { });
99
+ }
100
+ }
101
+ function sanitizeName(name) {
102
+ return name.replace(/[^a-zA-Z0-9_-]/g, '_');
103
+ }
104
+ /**
105
+ * Renders the overlay, reusing a cached PNG when the same input (markup +
106
+ * density) was already rendered in a previous run. The per-recording directory
107
+ * is wiped each run, so the cache lives one level up (`.screenci/.overlay-cache`)
108
+ * and survives across runs. Rendering an overlay launches a browser context, so
109
+ * skipping unchanged ones speeds up the author loop noticeably.
110
+ */
111
+ async function renderOverlay(recordingDir, deviceScaleFactor, html, css, capturePadding) {
112
+ const request = {
113
+ html,
114
+ deviceScaleFactor,
115
+ ...(css.length > 0 && { css }),
116
+ ...(capturePadding > 0 && { capturePadding }),
117
+ };
118
+ if (!cacheEnabled) {
119
+ return rasterizer(request);
120
+ }
121
+ const inputHash = createHash('sha256')
122
+ .update(`${RASTERIZE_CACHE_VERSION} ${deviceScaleFactor} ${capturePadding} ${css} ${html}`)
123
+ .digest('hex');
124
+ const cacheDir = join(dirname(recordingDir), '.overlay-cache');
125
+ const pngPath = join(cacheDir, `${inputHash}.png`);
126
+ const metaPath = join(cacheDir, `${inputHash}.json`);
127
+ if (existsSync(pngPath) && existsSync(metaPath)) {
128
+ const { width, height } = JSON.parse(readFileSync(metaPath, 'utf-8'));
129
+ return { buffer: readFileSync(pngPath), width, height };
130
+ }
131
+ const result = await rasterizer(request);
132
+ mkdirSync(cacheDir, { recursive: true });
133
+ writeFileSync(pngPath, result.buffer);
134
+ writeFileSync(metaPath, JSON.stringify({ width: result.width, height: result.height }));
135
+ return result;
136
+ }
137
+ /**
138
+ * Rasterizes overlay HTML to a transparent PNG written into the per-recording
139
+ * directory so the upload step picks it up alongside the recording. Returns the
140
+ * path, content hash, and intrinsic pixel size. Unchanged overlays are served
141
+ * from a cross-run cache instead of re-rendering.
142
+ */
143
+ export async function rasterizeHtmlOverlay(opts) {
144
+ const recordingDir = getRuntimeRecordingDir();
145
+ if (recordingDir === null) {
146
+ throw new Error('[screenci] Cannot write a generated overlay: no active recording directory.');
147
+ }
148
+ const deviceScaleFactor = opts.deviceScaleFactor ?? DEFAULT_OVERLAY_DEVICE_SCALE_FACTOR;
149
+ const { buffer, width, height } = await renderOverlay(recordingDir, deviceScaleFactor, opts.html, resolveOverlayCss(opts.css), opts.capturePadding ?? 0);
150
+ const fileHash = createHash('sha256').update(buffer).digest('hex');
151
+ const dir = join(recordingDir, 'generated');
152
+ mkdirSync(dir, { recursive: true });
153
+ const path = join(dir, `${sanitizeName(opts.name)}-${fileHash.slice(0, 16)}.png`);
154
+ writeFileSync(path, buffer);
155
+ return { path, fileHash, width, height };
156
+ }
157
+ // ─── Animated overlays ────────────────────────────────────────────────────────
158
+ const DEFAULT_ANIMATION_FPS = 30;
159
+ /**
160
+ * Number of frames captured for an animation of `durationMs` at `fps`. At least
161
+ * one frame so a zero-length capture still produces a valid clip. Pure so the
162
+ * sampling math can be unit-tested without a browser.
163
+ */
164
+ export function framesForDuration(durationMs, fps) {
165
+ if (!Number.isFinite(durationMs) || durationMs < 0) {
166
+ throw new Error(`[screenci] Animated overlay durationMs must be a finite number >= 0. Received: ${String(durationMs)}`);
167
+ }
168
+ if (!Number.isFinite(fps) || fps <= 0) {
169
+ throw new Error(`[screenci] Animated overlay fps must be a finite number > 0. Received: ${String(fps)}`);
170
+ }
171
+ return Math.max(1, Math.round(durationMs / (1000 / fps)));
172
+ }
173
+ let animatedRasterizer = playwrightAnimatedHtmlRasterizer;
174
+ export function setAnimatedHtmlRasterizer(fn) {
175
+ animatedRasterizer = fn;
176
+ cacheEnabled = false;
177
+ }
178
+ // Single ffmpeg graph that turns the RGBA PNG sequence into one MP4 carrying two
179
+ // NVDEC-decodable H.264 streams: stream 0 is the opaque color, stream 1 is the
180
+ // alpha matte (its luma IS the alpha plane). Dimensions are padded to even so
181
+ // yuv420p is valid. The matte is converted full-range then tagged tv (a
182
+ // metadata-only label) so the renderer's CUDA graph never range-converts it and
183
+ // the alpha reaches full opacity — the same recipe NarrationRenderer uses for
184
+ // its shape mask (a limited-range matte caps opacity at ~92%).
185
+ const ANIMATION_FILTER_COMPLEX = '[0:v]pad=ceil(iw/2)*2:ceil(ih/2)*2:0:0:color=black@0,split=2[a][b];' +
186
+ '[a]format=yuv420p[col];' +
187
+ '[b]alphaextract,scale=in_range=full:out_range=full,format=yuv420p,setparams=range=tv[alp]';
188
+ async function captureAnimationFrames(request) {
189
+ const page = getRuntimePage();
190
+ if (page === null) {
191
+ throw new Error('[screenci] Cannot rasterize an animated overlay without an active recording page.');
192
+ }
193
+ const browser = page.context().browser();
194
+ if (browser === null) {
195
+ throw new Error('[screenci] Cannot rasterize an animated overlay: the browser is not available.');
196
+ }
197
+ const overlayContext = await browser.newContext({
198
+ deviceScaleFactor: request.deviceScaleFactor ?? DEFAULT_OVERLAY_DEVICE_SCALE_FACTOR,
199
+ });
200
+ try {
201
+ const overlayPage = await overlayContext.newPage();
202
+ // Install a virtual clock at t=0 before loading so the animation starts from
203
+ // its first frame; advancing the clock deterministically samples each frame.
204
+ await overlayPage.clock.install({ time: 0 });
205
+ await overlayPage.setContent(wrapOverlayHtml(request.html, {
206
+ ...(request.css !== undefined && { css: request.css }),
207
+ ...(request.capturePadding !== undefined && {
208
+ capturePadding: request.capturePadding,
209
+ }),
210
+ }), { waitUntil: 'load' });
211
+ const root = overlayPage.locator(`#${OVERLAY_ROOT_ID}`);
212
+ const box = await root.boundingBox();
213
+ // Capture a fixed clip (the initial layout box) for every frame so the
214
+ // encoded stream has constant dimensions. Animate transform/opacity rather
215
+ // than layout size to stay within the box.
216
+ const clip = box !== null
217
+ ? { x: box.x, y: box.y, width: box.width, height: box.height }
218
+ : undefined;
219
+ const frames = [];
220
+ const frameCount = framesForDuration(request.durationMs, request.fps);
221
+ let elapsed = 0;
222
+ for (let i = 0; i < frameCount; i++) {
223
+ frames.push(await overlayPage.screenshot({
224
+ omitBackground: true,
225
+ type: 'png',
226
+ ...(clip !== undefined && { clip }),
227
+ }));
228
+ // Advance to the next exact frame timestamp (integer ms, no drift).
229
+ const next = Math.round(((i + 1) * 1000) / request.fps);
230
+ await overlayPage.clock.runFor(next - elapsed);
231
+ elapsed = next;
232
+ }
233
+ return {
234
+ frames,
235
+ width: box ? Math.round(box.width) : 0,
236
+ height: box ? Math.round(box.height) : 0,
237
+ };
238
+ }
239
+ finally {
240
+ await overlayContext.close().catch(() => { });
241
+ }
242
+ }
243
+ function runFfmpeg(args) {
244
+ return new Promise((resolve, reject) => {
245
+ if (ffmpegPath === null) {
246
+ reject(new Error('[screenci] ffmpeg binary not found; cannot encode an animated overlay.'));
247
+ return;
248
+ }
249
+ const child = spawn(ffmpegPath, args, {
250
+ stdio: ['ignore', 'ignore', 'pipe'],
251
+ });
252
+ let stderr = '';
253
+ child.stderr?.on('data', (chunk) => {
254
+ stderr += chunk.toString();
255
+ });
256
+ child.on('error', reject);
257
+ child.on('close', (code) => {
258
+ if (code === 0) {
259
+ resolve();
260
+ return;
261
+ }
262
+ reject(new Error(`[screenci] ffmpeg exited with code ${String(code)} while encoding an animated overlay.\n${stderr.slice(-2000)}`));
263
+ });
264
+ });
265
+ }
266
+ async function encodeAnimationFrames(frames, fps) {
267
+ const tmp = await mkdtemp(join(tmpdir(), 'screenci-anim-'));
268
+ try {
269
+ await Promise.all(frames.map((buffer, i) => writeFile(join(tmp, `frame_${String(i + 1).padStart(5, '0')}.png`), buffer)));
270
+ const outPath = join(tmp, 'overlay.mp4');
271
+ await runFfmpeg([
272
+ '-y',
273
+ '-framerate',
274
+ String(fps),
275
+ '-i',
276
+ join(tmp, 'frame_%05d.png'),
277
+ '-filter_complex',
278
+ ANIMATION_FILTER_COMPLEX,
279
+ '-map',
280
+ '[col]',
281
+ '-map',
282
+ '[alp]',
283
+ '-c:v',
284
+ 'libx264',
285
+ '-pix_fmt',
286
+ 'yuv420p',
287
+ '-preset',
288
+ 'veryfast',
289
+ '-movflags',
290
+ '+faststart',
291
+ outPath,
292
+ ]);
293
+ return await readFile(outPath);
294
+ }
295
+ finally {
296
+ await rm(tmp, { recursive: true, force: true });
297
+ }
298
+ }
299
+ async function playwrightAnimatedHtmlRasterizer(request) {
300
+ const { frames, width, height } = await captureAnimationFrames(request);
301
+ const buffer = await encodeAnimationFrames(frames, request.fps);
302
+ return { buffer, width, height };
303
+ }
304
+ /**
305
+ * Renders an animated overlay, reusing a cached clip when the same input
306
+ * (markup + density + fps + duration) was already rendered in a previous run.
307
+ * Mirrors {@link renderOverlay} but caches the encoded .mp4.
308
+ */
309
+ async function renderAnimatedOverlay(recordingDir, request) {
310
+ if (!cacheEnabled) {
311
+ return animatedRasterizer(request);
312
+ }
313
+ const deviceScaleFactor = request.deviceScaleFactor ?? DEFAULT_OVERLAY_DEVICE_SCALE_FACTOR;
314
+ const inputHash = createHash('sha256')
315
+ .update(`${RASTERIZE_CACHE_VERSION} anim ${deviceScaleFactor} ${request.capturePadding ?? 0} ${request.fps} ${request.durationMs} ${request.css ?? ''} ${request.html}`)
316
+ .digest('hex');
317
+ const cacheDir = join(dirname(recordingDir), '.overlay-cache');
318
+ const clipPath = join(cacheDir, `${inputHash}.mp4`);
319
+ const metaPath = join(cacheDir, `${inputHash}.anim.json`);
320
+ if (existsSync(clipPath) && existsSync(metaPath)) {
321
+ const { width, height } = JSON.parse(readFileSync(metaPath, 'utf-8'));
322
+ return { buffer: readFileSync(clipPath), width, height };
323
+ }
324
+ const result = await animatedRasterizer(request);
325
+ mkdirSync(cacheDir, { recursive: true });
326
+ writeFileSync(clipPath, result.buffer);
327
+ writeFileSync(metaPath, JSON.stringify({ width: result.width, height: result.height }));
328
+ return result;
329
+ }
330
+ /**
331
+ * Rasterizes an animated HTML/React overlay to a transparent clip (a single
332
+ * .mp4 with a color stream and an alpha-matte stream) written into the
333
+ * per-recording directory for upload. Returns the path, content hash, intrinsic
334
+ * size, and capture duration. Unchanged overlays are served from the cross-run
335
+ * cache instead of re-rendering.
336
+ */
337
+ export async function rasterizeAnimatedHtmlOverlay(opts) {
338
+ const recordingDir = getRuntimeRecordingDir();
339
+ if (recordingDir === null) {
340
+ throw new Error('[screenci] Cannot write a generated overlay: no active recording directory.');
341
+ }
342
+ const fps = opts.fps ?? DEFAULT_ANIMATION_FPS;
343
+ const deviceScaleFactor = opts.deviceScaleFactor ?? DEFAULT_OVERLAY_DEVICE_SCALE_FACTOR;
344
+ // Validate sampling parameters up front (also exercised by the real capture).
345
+ framesForDuration(opts.durationMs, fps);
346
+ const css = resolveOverlayCss(opts.css);
347
+ const { buffer, width, height } = await renderAnimatedOverlay(recordingDir, {
348
+ html: opts.html,
349
+ durationMs: opts.durationMs,
350
+ fps,
351
+ deviceScaleFactor,
352
+ ...(css.length > 0 && { css }),
353
+ ...(opts.capturePadding !== undefined && {
354
+ capturePadding: opts.capturePadding,
355
+ }),
356
+ });
357
+ const fileHash = createHash('sha256').update(buffer).digest('hex');
358
+ const dir = join(recordingDir, 'generated');
359
+ mkdirSync(dir, { recursive: true });
360
+ const path = join(dir, `${sanitizeName(opts.name)}-${fileHash.slice(0, 16)}.mp4`);
361
+ writeFileSync(path, buffer);
362
+ return { path, fileHash, width, height, durationMs: opts.durationMs };
363
+ }
364
+ //# sourceMappingURL=htmlRasterizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"htmlRasterizer.js","sourceRoot":"","sources":["../../src/htmlRasterizer.ts"],"names":[],"mappings":"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"}
@@ -28,10 +28,27 @@ export declare function parsePackageManager(value: string | undefined, cwd?: str
28
28
  * when the slug is empty or would collide with `screenci`.
29
29
  */
30
30
  export declare function toIslandPackageName(projectName: string): string;
31
+ export declare function generateIslandTsconfig(withReact?: boolean): string;
31
32
  export declare function generateIslandReadme(projectName: string, packageManager: PackageManager): string;
32
33
  export declare function parsePnpmVersionSupport(versionOutput: string): PnpmVersionSupport;
33
34
  export declare function parseYarnVersionSupport(versionOutput: string): YarnVersionSupport;
35
+ /**
36
+ * Pre-creates a CLI sign-in link during init and persists it into the new
37
+ * project's `.screenci/link-session.json`, so the user can sign in while their
38
+ * first video is being authored and a later `screenci record` reuses the same
39
+ * link (it just polls and continues once sign-in completes).
40
+ *
41
+ * Best-effort: a network failure here must never fail `init`. If a secret is
42
+ * already configured there is nothing to sign in for, so we skip silently.
43
+ *
44
+ * Returns the sign-in URL when one was created, otherwise null.
45
+ */
46
+ export declare function createInitLinkSession(islandDir: string, options?: {
47
+ env?: NodeJS.ProcessEnv;
48
+ }): Promise<string | null>;
34
49
  export declare function generateExampleVideo(): string;
50
+ export declare function generateReactExampleVideo(): string;
35
51
  export declare function runInit(projectNameArg: string | undefined, options: InitOptions): Promise<void>;
36
52
  export declare function runCreateScreenciCli(argv?: string[]): Promise<void>;
53
+ export declare function generateConfig(projectName: string): string;
37
54
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;IACZ,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAKD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,EACF,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,EACF,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,CAAA;CACtB,CAAA;AAED,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,MAAM,GACV,cAAc,GAAG,IAAI,CAUvB;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,GACV,cAAc,GAAG,IAAI,CAavB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAwBpE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASxD;AAmSD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,cAAc,CAUhB;AAoID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAS/D;AA4ED,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC7B,MAAM,CAiBR;AA4DD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,GACpB,kBAAkB,CA6BpB;AA0ED,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,GACpB,kBAAkB,CAapB;AA0SD,wBAAgB,oBAAoB,IAAI,MAAM,CA+B7C;AAkGD,wBAAsB,OAAO,CAC3B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAwOf;AAeD,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,MAAM,EAAiB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqCf"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/init.ts"],"names":[],"mappings":"AA2BA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAEpD,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,OAAO,CAAA;IACZ,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA;AAKD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,EACF,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,OAAO,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,MAAM,EACF,WAAW,GACX,gBAAgB,GAChB,mBAAmB,GACnB,iBAAiB,CAAA;CACtB,CAAA;AAED,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,MAAM,GACV,cAAc,GAAG,IAAI,CAUvB;AAED,wBAAgB,mCAAmC,CACjD,GAAG,EAAE,MAAM,GACV,cAAc,GAAG,IAAI,CAavB;AAED,wBAAgB,uBAAuB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,cAAc,CAwBpE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CASxD;AAmSD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,cAAc,CAUhB;AAoID;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAS/D;AAoBD,wBAAgB,sBAAsB,CAAC,SAAS,UAAQ,GAAG,MAAM,CA6BhE;AAiCD,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,cAAc,GAC7B,MAAM,CAiBR;AA4DD,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,GACpB,kBAAkB,CA6BpB;AA0ED,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,GACpB,kBAAkB,CAapB;AA0MD;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAO,GACxC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2BxB;AA+HD,wBAAgB,oBAAoB,IAAI,MAAM,CA+B7C;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CA0ClD;AAyGD,wBAAsB,OAAO,CAC3B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAwPf;AAeD,wBAAsB,oBAAoB,CACxC,IAAI,GAAE,MAAM,EAAiB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAgC1D"}