screencli 0.1.0
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/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +14 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/src/agent/loop.d.ts +21 -0
- package/dist/src/agent/loop.d.ts.map +1 -0
- package/dist/src/agent/loop.js +119 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/system-prompt.d.ts +2 -0
- package/dist/src/agent/system-prompt.d.ts.map +1 -0
- package/dist/src/agent/system-prompt.js +43 -0
- package/dist/src/agent/system-prompt.js.map +1 -0
- package/dist/src/agent/tool-handlers.d.ts +44 -0
- package/dist/src/agent/tool-handlers.d.ts.map +1 -0
- package/dist/src/agent/tool-handlers.js +242 -0
- package/dist/src/agent/tool-handlers.js.map +1 -0
- package/dist/src/agent/tools.d.ts +5 -0
- package/dist/src/agent/tools.d.ts.map +1 -0
- package/dist/src/agent/tools.js +251 -0
- package/dist/src/agent/tools.js.map +1 -0
- package/dist/src/browser/accessibility.d.ts +28 -0
- package/dist/src/browser/accessibility.d.ts.map +1 -0
- package/dist/src/browser/accessibility.js +47 -0
- package/dist/src/browser/accessibility.js.map +1 -0
- package/dist/src/browser/actions.d.ts +32 -0
- package/dist/src/browser/actions.d.ts.map +1 -0
- package/dist/src/browser/actions.js +122 -0
- package/dist/src/browser/actions.js.map +1 -0
- package/dist/src/browser/auth.d.ts +12 -0
- package/dist/src/browser/auth.d.ts.map +1 -0
- package/dist/src/browser/auth.js +53 -0
- package/dist/src/browser/auth.js.map +1 -0
- package/dist/src/browser/resolve-locator.d.ts +15 -0
- package/dist/src/browser/resolve-locator.d.ts.map +1 -0
- package/dist/src/browser/resolve-locator.js +27 -0
- package/dist/src/browser/resolve-locator.js.map +1 -0
- package/dist/src/browser/session.d.ts +16 -0
- package/dist/src/browser/session.d.ts.map +1 -0
- package/dist/src/browser/session.js +47 -0
- package/dist/src/browser/session.js.map +1 -0
- package/dist/src/cli/commands/export.d.ts +3 -0
- package/dist/src/cli/commands/export.d.ts.map +1 -0
- package/dist/src/cli/commands/export.js +76 -0
- package/dist/src/cli/commands/export.js.map +1 -0
- package/dist/src/cli/commands/init.d.ts +8 -0
- package/dist/src/cli/commands/init.d.ts.map +1 -0
- package/dist/src/cli/commands/init.js +64 -0
- package/dist/src/cli/commands/init.js.map +1 -0
- package/dist/src/cli/commands/record.d.ts +3 -0
- package/dist/src/cli/commands/record.d.ts.map +1 -0
- package/dist/src/cli/commands/record.js +215 -0
- package/dist/src/cli/commands/record.js.map +1 -0
- package/dist/src/cli/options.d.ts +24 -0
- package/dist/src/cli/options.d.ts.map +1 -0
- package/dist/src/cli/options.js +35 -0
- package/dist/src/cli/options.js.map +1 -0
- package/dist/src/cli/output.d.ts +10 -0
- package/dist/src/cli/output.d.ts.map +1 -0
- package/dist/src/cli/output.js +29 -0
- package/dist/src/cli/output.js.map +1 -0
- package/dist/src/export/exporter.d.ts +16 -0
- package/dist/src/export/exporter.d.ts.map +1 -0
- package/dist/src/export/exporter.js +66 -0
- package/dist/src/export/exporter.js.map +1 -0
- package/dist/src/export/gif.d.ts +3 -0
- package/dist/src/export/gif.d.ts.map +1 -0
- package/dist/src/export/gif.js +36 -0
- package/dist/src/export/gif.js.map +1 -0
- package/dist/src/export/presets.d.ts +4 -0
- package/dist/src/export/presets.d.ts.map +1 -0
- package/dist/src/export/presets.js +68 -0
- package/dist/src/export/presets.js.map +1 -0
- package/dist/src/export/smart-crop.d.ts +10 -0
- package/dist/src/export/smart-crop.d.ts.map +1 -0
- package/dist/src/export/smart-crop.js +50 -0
- package/dist/src/export/smart-crop.js.map +1 -0
- package/dist/src/index.d.ts +10 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +9 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/recording/chapters.d.ts +3 -0
- package/dist/src/recording/chapters.d.ts.map +1 -0
- package/dist/src/recording/chapters.js +37 -0
- package/dist/src/recording/chapters.js.map +1 -0
- package/dist/src/recording/event-log.d.ts +20 -0
- package/dist/src/recording/event-log.d.ts.map +1 -0
- package/dist/src/recording/event-log.js +37 -0
- package/dist/src/recording/event-log.js.map +1 -0
- package/dist/src/recording/metadata.d.ts +4 -0
- package/dist/src/recording/metadata.d.ts.map +1 -0
- package/dist/src/recording/metadata.js +8 -0
- package/dist/src/recording/metadata.js.map +1 -0
- package/dist/src/recording/types.d.ts +81 -0
- package/dist/src/recording/types.d.ts.map +1 -0
- package/dist/src/recording/types.js +2 -0
- package/dist/src/recording/types.js.map +1 -0
- package/dist/src/utils/config.d.ts +13 -0
- package/dist/src/utils/config.d.ts.map +1 -0
- package/dist/src/utils/config.js +37 -0
- package/dist/src/utils/config.js.map +1 -0
- package/dist/src/utils/errors.d.ts +20 -0
- package/dist/src/utils/errors.d.ts.map +1 -0
- package/dist/src/utils/errors.js +39 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/logger.d.ts +9 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +40 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/paths.d.ts +9 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +28 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/video/background.d.ts +39 -0
- package/dist/src/video/background.d.ts.map +1 -0
- package/dist/src/video/background.js +141 -0
- package/dist/src/video/background.js.map +1 -0
- package/dist/src/video/compose.d.ts +14 -0
- package/dist/src/video/compose.d.ts.map +1 -0
- package/dist/src/video/compose.js +149 -0
- package/dist/src/video/compose.js.map +1 -0
- package/dist/src/video/cursor.d.ts +10 -0
- package/dist/src/video/cursor.d.ts.map +1 -0
- package/dist/src/video/cursor.js +31 -0
- package/dist/src/video/cursor.js.map +1 -0
- package/dist/src/video/ffmpeg.d.ts +10 -0
- package/dist/src/video/ffmpeg.d.ts.map +1 -0
- package/dist/src/video/ffmpeg.js +71 -0
- package/dist/src/video/ffmpeg.js.map +1 -0
- package/dist/src/video/highlight.d.ts +3 -0
- package/dist/src/video/highlight.d.ts.map +1 -0
- package/dist/src/video/highlight.js +21 -0
- package/dist/src/video/highlight.js.map +1 -0
- package/dist/src/video/trim.d.ts +19 -0
- package/dist/src/video/trim.d.ts.map +1 -0
- package/dist/src/video/trim.js +47 -0
- package/dist/src/video/trim.js.map +1 -0
- package/dist/src/video/zoom.d.ts +11 -0
- package/dist/src/video/zoom.d.ts.map +1 -0
- package/dist/src/video/zoom.js +88 -0
- package/dist/src/video/zoom.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Browser, type BrowserContext, type Page } from 'playwright';
|
|
2
|
+
import type { Viewport } from '../recording/types.js';
|
|
3
|
+
export interface BrowserSession {
|
|
4
|
+
browser: Browser;
|
|
5
|
+
context: BrowserContext;
|
|
6
|
+
page: Page;
|
|
7
|
+
close: () => Promise<string | undefined>;
|
|
8
|
+
}
|
|
9
|
+
export declare function launchSession(options: {
|
|
10
|
+
viewport: Viewport;
|
|
11
|
+
headless: boolean;
|
|
12
|
+
slowMo: number;
|
|
13
|
+
recordDir: string;
|
|
14
|
+
storageState?: string | object;
|
|
15
|
+
}): Promise<BrowserSession>;
|
|
16
|
+
//# sourceMappingURL=session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/browser/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAKpF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,cAAc,CAAC;IACxB,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,cAAc,CAAC,CA+C1B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { chromium } from 'playwright';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { renameSync, readdirSync } from 'node:fs';
|
|
4
|
+
import { BrowserError } from '../utils/errors.js';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
export async function launchSession(options) {
|
|
7
|
+
logger.info('Launching browser...');
|
|
8
|
+
const browser = await chromium.launch({
|
|
9
|
+
headless: options.headless,
|
|
10
|
+
slowMo: options.slowMo,
|
|
11
|
+
});
|
|
12
|
+
const context = await browser.newContext({
|
|
13
|
+
viewport: options.viewport,
|
|
14
|
+
recordVideo: {
|
|
15
|
+
dir: options.recordDir,
|
|
16
|
+
size: options.viewport,
|
|
17
|
+
},
|
|
18
|
+
userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
|
|
19
|
+
...(options.storageState ? { storageState: options.storageState } : {}),
|
|
20
|
+
});
|
|
21
|
+
const page = await context.newPage();
|
|
22
|
+
logger.info(`Browser launched. Viewport: ${options.viewport.width}x${options.viewport.height}`);
|
|
23
|
+
async function close() {
|
|
24
|
+
try {
|
|
25
|
+
// Must close context to finalize video
|
|
26
|
+
await context.close();
|
|
27
|
+
await browser.close();
|
|
28
|
+
// Playwright saves video as a random name in recordDir; find and rename it
|
|
29
|
+
const files = readdirSync(options.recordDir).filter((f) => f.endsWith('.webm'));
|
|
30
|
+
if (files.length > 0) {
|
|
31
|
+
const src = join(options.recordDir, files[0]);
|
|
32
|
+
const dest = join(options.recordDir, 'raw.webm');
|
|
33
|
+
if (src !== dest) {
|
|
34
|
+
renameSync(src, dest);
|
|
35
|
+
}
|
|
36
|
+
return dest;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
logger.error('Error closing browser session', err);
|
|
42
|
+
throw new BrowserError(`Failed to close browser: ${err}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return { browser, context, page, close };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/browser/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAgD,MAAM,YAAY,CAAC;AACpF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAc,WAAW,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAU5C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAMnC;IACC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE;YACX,GAAG,EAAE,OAAO,CAAC,SAAS;YACtB,IAAI,EAAE,OAAO,CAAC,QAAQ;SACvB;QACD,SAAS,EACP,uHAAuH;QACzH,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/E,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,MAAM,CAAC,IAAI,CAAC,+BAA+B,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAEhG,KAAK,UAAU,KAAK;QAClB,IAAI,CAAC;YACH,uCAAuC;YACvC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YAEtB,2EAA2E;YAC3E,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAChF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBACjD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;oBACjB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACxB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;YACnD,MAAM,IAAI,YAAY,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,eAAO,MAAM,aAAa,SA0EtB,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { presetOption, noZoomOption, noHighlightOption, noCursorOption, backgroundOption, noBackgroundOption, paddingOption, cornerRadiusOption, noShadowOption } from '../options.js';
|
|
4
|
+
import * as output from '../output.js';
|
|
5
|
+
import { readMetadata } from '../../recording/metadata.js';
|
|
6
|
+
import { metadataPath, exportsDir, composedVideoPath } from '../../utils/paths.js';
|
|
7
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
8
|
+
import { runExport } from '../../export/exporter.js';
|
|
9
|
+
export const exportCommand = new Command('export')
|
|
10
|
+
.description('Export a recording with platform-specific presets')
|
|
11
|
+
.argument('<recording-dir>', 'Path to recording directory')
|
|
12
|
+
.addOption(presetOption)
|
|
13
|
+
.addOption(noZoomOption)
|
|
14
|
+
.addOption(noHighlightOption)
|
|
15
|
+
.addOption(noCursorOption)
|
|
16
|
+
.addOption(backgroundOption)
|
|
17
|
+
.addOption(noBackgroundOption)
|
|
18
|
+
.addOption(paddingOption)
|
|
19
|
+
.addOption(cornerRadiusOption)
|
|
20
|
+
.addOption(noShadowOption)
|
|
21
|
+
.option('-o, --output <path>', 'Output file path')
|
|
22
|
+
.action(async (recordingDirPath, opts) => {
|
|
23
|
+
const recDir = resolve(recordingDirPath);
|
|
24
|
+
const metaPath = metadataPath(recDir);
|
|
25
|
+
if (!existsSync(metaPath)) {
|
|
26
|
+
output.error(`No metadata.json found in ${recDir}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
const metadata = readMetadata(metaPath);
|
|
30
|
+
output.header('screencli export');
|
|
31
|
+
output.info(`Recording: ${metadata.id}`);
|
|
32
|
+
output.info(`Preset: ${opts.preset}`);
|
|
33
|
+
// Load events
|
|
34
|
+
const events = JSON.parse(readFileSync(metadata.event_log_path, 'utf-8'));
|
|
35
|
+
// Determine source video
|
|
36
|
+
const sourceVideo = existsSync(composedVideoPath(recDir))
|
|
37
|
+
? composedVideoPath(recDir)
|
|
38
|
+
: metadata.raw_video_path;
|
|
39
|
+
if (!existsSync(sourceVideo)) {
|
|
40
|
+
output.error(`No video file found in ${recDir}`);
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const outDir = exportsDir(recDir);
|
|
44
|
+
const spinner = output.createSpinner(`Exporting ${opts.preset}...`);
|
|
45
|
+
spinner.start();
|
|
46
|
+
try {
|
|
47
|
+
const bg = (opts.noBackground || opts.background === 'none') ? undefined : opts.background;
|
|
48
|
+
const background = bg
|
|
49
|
+
? {
|
|
50
|
+
gradient: bg,
|
|
51
|
+
padding: parseInt(opts.padding, 10),
|
|
52
|
+
cornerRadius: parseInt(opts.cornerRadius, 10),
|
|
53
|
+
shadow: opts.shadow !== false,
|
|
54
|
+
}
|
|
55
|
+
: undefined;
|
|
56
|
+
const outputPath = await runExport({
|
|
57
|
+
sourceVideo,
|
|
58
|
+
events,
|
|
59
|
+
metadata,
|
|
60
|
+
presetName: opts.preset,
|
|
61
|
+
outputDir: outDir,
|
|
62
|
+
outputPath: opts.output,
|
|
63
|
+
zoom: opts.zoom !== false,
|
|
64
|
+
highlight: opts.highlight !== false,
|
|
65
|
+
cursor: opts.cursor !== false,
|
|
66
|
+
background,
|
|
67
|
+
});
|
|
68
|
+
spinner.succeed(`Exported: ${outputPath}`);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
spinner.fail(`Export failed: ${err instanceof Error ? err.message : err}`);
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
console.log('');
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../src/cli/commands/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Run the interactive setup flow.
|
|
4
|
+
* Returns true if a valid API key was configured.
|
|
5
|
+
*/
|
|
6
|
+
export declare function runInit(): Promise<boolean>;
|
|
7
|
+
export declare const initCommand: Command;
|
|
8
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC;;;GAGG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAqChD;AAED,eAAO,MAAM,WAAW,SAQpB,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import * as output from '../output.js';
|
|
7
|
+
const CONFIG_DIR = join(homedir(), '.screencli');
|
|
8
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
9
|
+
function prompt(question) {
|
|
10
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
rl.question(question, (answer) => {
|
|
13
|
+
rl.close();
|
|
14
|
+
resolve(answer.trim());
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Run the interactive setup flow.
|
|
20
|
+
* Returns true if a valid API key was configured.
|
|
21
|
+
*/
|
|
22
|
+
export async function runInit() {
|
|
23
|
+
output.header('screencli setup');
|
|
24
|
+
console.log('');
|
|
25
|
+
// Load existing config if any
|
|
26
|
+
let existing = {};
|
|
27
|
+
if (existsSync(CONFIG_FILE)) {
|
|
28
|
+
try {
|
|
29
|
+
existing = JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));
|
|
30
|
+
}
|
|
31
|
+
catch { /* ignore */ }
|
|
32
|
+
}
|
|
33
|
+
const masked = existing.anthropicApiKey
|
|
34
|
+
? `${existing.anthropicApiKey.slice(0, 10)}...${existing.anthropicApiKey.slice(-4)}`
|
|
35
|
+
: undefined;
|
|
36
|
+
const keyPrompt = masked
|
|
37
|
+
? ` Anthropic API key [${masked}]: `
|
|
38
|
+
: ' Anthropic API key: ';
|
|
39
|
+
const apiKey = await prompt(keyPrompt);
|
|
40
|
+
if (apiKey) {
|
|
41
|
+
existing.anthropicApiKey = apiKey;
|
|
42
|
+
}
|
|
43
|
+
else if (!existing.anthropicApiKey) {
|
|
44
|
+
output.warn('No API key provided. You can set ANTHROPIC_API_KEY env var instead.');
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
48
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(existing, null, 2) + '\n');
|
|
49
|
+
console.log('');
|
|
50
|
+
output.success(`Config saved to ${CONFIG_FILE}`);
|
|
51
|
+
output.success('API key configured');
|
|
52
|
+
console.log('');
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
export const initCommand = new Command('init')
|
|
56
|
+
.description('Set up screencli (configure API key and settings)')
|
|
57
|
+
.action(async () => {
|
|
58
|
+
const ok = await runInit();
|
|
59
|
+
if (ok) {
|
|
60
|
+
output.info('Run `screencli record <url> -p "..."` to start recording');
|
|
61
|
+
console.log('');
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+CpC,eAAO,MAAM,aAAa,SAwMtB,CAAC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { createInterface } from 'node:readline';
|
|
3
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
4
|
+
import { resolve } from 'node:path';
|
|
5
|
+
import { promptOption, outputOption, viewportOption, modelOption, headlessOption, slowMoOption, maxStepsOption, loginOption, authOption, backgroundOption, noBackgroundOption, paddingOption, cornerRadiusOption, noShadowOption, parseViewport, } from '../options.js';
|
|
6
|
+
import * as output from '../output.js';
|
|
7
|
+
import { loadConfig, isConfigured } from '../../utils/config.js';
|
|
8
|
+
import { runInit } from './init.js';
|
|
9
|
+
import { recordingDir, eventsPath, metadataPath } from '../../utils/paths.js';
|
|
10
|
+
import { launchSession } from '../../browser/session.js';
|
|
11
|
+
import { runLoginFlow, loadAuthState, saveAuthState, hasAuthState } from '../../browser/auth.js';
|
|
12
|
+
import { EventLog } from '../../recording/event-log.js';
|
|
13
|
+
import { writeMetadata } from '../../recording/metadata.js';
|
|
14
|
+
import { deriveChapters } from '../../recording/chapters.js';
|
|
15
|
+
import { runAgentLoop } from '../../agent/loop.js';
|
|
16
|
+
import { composeVideo } from '../../video/compose.js';
|
|
17
|
+
import { setLogLevel } from '../../utils/logger.js';
|
|
18
|
+
const BACKGROUND_CHOICES = ['aurora', 'sunset', 'ocean', 'lavender', 'mint', 'ember'];
|
|
19
|
+
function ask(question) {
|
|
20
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
21
|
+
return new Promise((resolve) => {
|
|
22
|
+
rl.question(question, (answer) => {
|
|
23
|
+
rl.close();
|
|
24
|
+
resolve(answer.trim());
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export const recordCommand = new Command('record')
|
|
29
|
+
.description('Record an AI-driven browser demo')
|
|
30
|
+
.argument('[url]', 'Starting URL')
|
|
31
|
+
.addOption(promptOption)
|
|
32
|
+
.addOption(outputOption)
|
|
33
|
+
.addOption(viewportOption)
|
|
34
|
+
.addOption(modelOption)
|
|
35
|
+
.addOption(headlessOption)
|
|
36
|
+
.addOption(slowMoOption)
|
|
37
|
+
.addOption(maxStepsOption)
|
|
38
|
+
.addOption(loginOption)
|
|
39
|
+
.addOption(authOption)
|
|
40
|
+
.addOption(backgroundOption)
|
|
41
|
+
.addOption(noBackgroundOption)
|
|
42
|
+
.addOption(paddingOption)
|
|
43
|
+
.addOption(cornerRadiusOption)
|
|
44
|
+
.addOption(noShadowOption)
|
|
45
|
+
.option('-v, --verbose', 'Verbose logging')
|
|
46
|
+
.action(async (urlArg, opts) => {
|
|
47
|
+
if (opts.verbose)
|
|
48
|
+
setLogLevel('debug');
|
|
49
|
+
// Auto-run init on first use
|
|
50
|
+
if (!isConfigured()) {
|
|
51
|
+
output.info('First time? Let\u2019s get you set up.\n');
|
|
52
|
+
const ok = await runInit();
|
|
53
|
+
if (!ok) {
|
|
54
|
+
output.error('Setup incomplete. Re-run with ANTHROPIC_API_KEY set, or run `screencli init`.');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// ── Interactive prompts for missing params ──
|
|
59
|
+
let url = urlArg ?? '';
|
|
60
|
+
if (!url) {
|
|
61
|
+
url = await ask(' URL to record: ');
|
|
62
|
+
if (!url) {
|
|
63
|
+
output.error('URL is required.');
|
|
64
|
+
process.exit(1);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
if (!opts.prompt) {
|
|
68
|
+
opts.prompt = await ask(' What should the agent do? ');
|
|
69
|
+
if (!opts.prompt) {
|
|
70
|
+
output.error('Prompt is required.');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Resolve background: --no-background or --background none disables it
|
|
75
|
+
if (opts.noBackground || opts.background === 'none') {
|
|
76
|
+
opts.background = undefined;
|
|
77
|
+
}
|
|
78
|
+
const config = loadConfig();
|
|
79
|
+
const viewport = parseViewport(opts.viewport);
|
|
80
|
+
const id = uuidv4();
|
|
81
|
+
const recDir = recordingDir(resolve(opts.output), id);
|
|
82
|
+
output.header('screencli record');
|
|
83
|
+
output.info(`Recording ID: ${id}`);
|
|
84
|
+
output.info(`URL: ${url}`);
|
|
85
|
+
output.info(`Prompt: ${opts.prompt}`);
|
|
86
|
+
output.info(`Viewport: ${viewport.width}x${viewport.height}`);
|
|
87
|
+
output.info(`Model: ${opts.model}`);
|
|
88
|
+
output.info(`Output: ${recDir}`);
|
|
89
|
+
console.log('');
|
|
90
|
+
// ── Auth: login handoff or saved state ──
|
|
91
|
+
let storageState;
|
|
92
|
+
const needsLogin = opts.login || (opts.auth && !hasAuthState(opts.auth));
|
|
93
|
+
if (needsLogin) {
|
|
94
|
+
output.info('Opening browser for manual login...');
|
|
95
|
+
output.info('Log in, then press Enter here to hand off to the AI agent.');
|
|
96
|
+
console.log('');
|
|
97
|
+
storageState = await runLoginFlow(url, viewport);
|
|
98
|
+
if (opts.auth) {
|
|
99
|
+
saveAuthState(opts.auth, storageState);
|
|
100
|
+
output.success(`Auth state saved as "${opts.auth}"`);
|
|
101
|
+
}
|
|
102
|
+
output.success('Login complete — starting recording.');
|
|
103
|
+
console.log('');
|
|
104
|
+
}
|
|
105
|
+
else if (opts.auth) {
|
|
106
|
+
const loaded = loadAuthState(opts.auth);
|
|
107
|
+
if (loaded) {
|
|
108
|
+
storageState = loaded;
|
|
109
|
+
output.success(`Loaded saved auth: "${opts.auth}"`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Launch browser (recording starts here — login is excluded)
|
|
113
|
+
const spinner = output.createSpinner('Launching browser...');
|
|
114
|
+
spinner.start();
|
|
115
|
+
const session = await launchSession({
|
|
116
|
+
viewport,
|
|
117
|
+
headless: opts.headless !== false,
|
|
118
|
+
slowMo: parseInt(opts.slowMo, 10),
|
|
119
|
+
recordDir: recDir,
|
|
120
|
+
storageState,
|
|
121
|
+
});
|
|
122
|
+
spinner.succeed('Browser launched');
|
|
123
|
+
// Run agent loop
|
|
124
|
+
const eventLog = new EventLog(eventsPath(recDir));
|
|
125
|
+
console.log('');
|
|
126
|
+
output.header('Agent Actions');
|
|
127
|
+
let result;
|
|
128
|
+
try {
|
|
129
|
+
result = await runAgentLoop({
|
|
130
|
+
apiKey: config.anthropicApiKey,
|
|
131
|
+
model: opts.model,
|
|
132
|
+
url,
|
|
133
|
+
prompt: opts.prompt,
|
|
134
|
+
page: session.page,
|
|
135
|
+
eventLog,
|
|
136
|
+
recordingDir: recDir,
|
|
137
|
+
actionDelayMs: config.actionDelayMs,
|
|
138
|
+
maxSteps: parseInt(opts.maxSteps, 10),
|
|
139
|
+
onAction: (step, toolName, description) => {
|
|
140
|
+
output.actionLog(step, toolName, description);
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
output.error(`Agent error: ${err}`);
|
|
146
|
+
eventLog.flush();
|
|
147
|
+
await session.close();
|
|
148
|
+
process.exit(1);
|
|
149
|
+
}
|
|
150
|
+
// Close browser to finalize video
|
|
151
|
+
console.log('');
|
|
152
|
+
const closeSpinner = output.createSpinner('Finalizing video...');
|
|
153
|
+
closeSpinner.start();
|
|
154
|
+
const rawVideoPath = await session.close();
|
|
155
|
+
closeSpinner.succeed('Video finalized');
|
|
156
|
+
// Flush event log
|
|
157
|
+
eventLog.flush();
|
|
158
|
+
// Write metadata
|
|
159
|
+
const events = eventLog.getEvents();
|
|
160
|
+
const chapters = deriveChapters(events);
|
|
161
|
+
writeMetadata(metadataPath(recDir), {
|
|
162
|
+
id,
|
|
163
|
+
created_at: new Date().toISOString(),
|
|
164
|
+
url,
|
|
165
|
+
prompt: opts.prompt,
|
|
166
|
+
model: opts.model,
|
|
167
|
+
viewport,
|
|
168
|
+
duration_ms: eventLog.getDurationMs(),
|
|
169
|
+
raw_video_path: rawVideoPath ?? '',
|
|
170
|
+
event_log_path: eventsPath(recDir),
|
|
171
|
+
chapters,
|
|
172
|
+
agent_stats: result.stats,
|
|
173
|
+
});
|
|
174
|
+
// Post-process video
|
|
175
|
+
if (rawVideoPath) {
|
|
176
|
+
console.log('');
|
|
177
|
+
const composeSpinner = output.createSpinner('Composing video with effects...');
|
|
178
|
+
composeSpinner.start();
|
|
179
|
+
try {
|
|
180
|
+
const background = opts.background
|
|
181
|
+
? {
|
|
182
|
+
gradient: opts.background,
|
|
183
|
+
padding: parseInt(opts.padding, 10),
|
|
184
|
+
cornerRadius: parseInt(opts.cornerRadius, 10),
|
|
185
|
+
shadow: opts.shadow !== false,
|
|
186
|
+
}
|
|
187
|
+
: undefined;
|
|
188
|
+
await composeVideo({
|
|
189
|
+
rawVideoPath,
|
|
190
|
+
events,
|
|
191
|
+
outputPath: resolve(recDir, 'composed.mp4'),
|
|
192
|
+
viewport,
|
|
193
|
+
zoom: true,
|
|
194
|
+
highlight: true,
|
|
195
|
+
cursor: true,
|
|
196
|
+
background,
|
|
197
|
+
});
|
|
198
|
+
composeSpinner.succeed('Video composed');
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
composeSpinner.warn(`Video composition skipped: ${err instanceof Error ? err.message : err}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Summary
|
|
205
|
+
console.log('');
|
|
206
|
+
output.header('Recording Complete');
|
|
207
|
+
output.stats('Summary', result.summary);
|
|
208
|
+
output.stats('Actions', result.stats.total_actions);
|
|
209
|
+
output.stats('Tokens (in/out)', `${result.stats.input_tokens} / ${result.stats.output_tokens}`);
|
|
210
|
+
output.stats('Duration', `${(eventLog.getDurationMs() / 1000).toFixed(1)}s`);
|
|
211
|
+
output.stats('Chapters', chapters.length);
|
|
212
|
+
output.stats('Output', recDir);
|
|
213
|
+
console.log('');
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../../src/cli/commands/record.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
2
|
+
export declare const promptOption: Option;
|
|
3
|
+
export declare const outputOption: Option;
|
|
4
|
+
export declare const viewportOption: Option;
|
|
5
|
+
export declare const modelOption: Option;
|
|
6
|
+
export declare const headlessOption: Option;
|
|
7
|
+
export declare const slowMoOption: Option;
|
|
8
|
+
export declare const maxStepsOption: Option;
|
|
9
|
+
export declare const presetOption: Option;
|
|
10
|
+
export declare const noZoomOption: Option;
|
|
11
|
+
export declare const noHighlightOption: Option;
|
|
12
|
+
export declare const noCursorOption: Option;
|
|
13
|
+
export declare const loginOption: Option;
|
|
14
|
+
export declare const authOption: Option;
|
|
15
|
+
export declare const backgroundOption: Option;
|
|
16
|
+
export declare const noBackgroundOption: Option;
|
|
17
|
+
export declare const paddingOption: Option;
|
|
18
|
+
export declare const cornerRadiusOption: Option;
|
|
19
|
+
export declare const noShadowOption: Option;
|
|
20
|
+
export declare function parseViewport(value: string): {
|
|
21
|
+
width: number;
|
|
22
|
+
height: number;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/cli/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,eAAO,MAAM,YAAY,QAAqE,CAAC;AAE/F,eAAO,MAAM,YAAY,QAA+E,CAAC;AAEzG,eAAO,MAAM,cAAc,QAAuE,CAAC;AAEnG,eAAO,MAAM,WAAW,QAA+F,CAAC;AAExH,eAAO,MAAM,cAAc,QAAqD,CAAC;AAEjF,eAAO,MAAM,YAAY,QAA2E,CAAC;AAErG,eAAO,MAAM,cAAc,QAAsE,CAAC;AAElG,eAAO,MAAM,YAAY,QAOJ,CAAC;AAEtB,eAAO,MAAM,YAAY,QAA+C,CAAC;AACzE,eAAO,MAAM,iBAAiB,QAA2D,CAAC;AAC1F,eAAO,MAAM,cAAc,QAAoD,CAAC;AAEhF,eAAO,MAAM,WAAW,QAA8E,CAAC;AACvG,eAAO,MAAM,UAAU,QAAiG,CAAC;AAEzH,eAAO,MAAM,gBAAgB,QAET,CAAC;AACrB,eAAO,MAAM,kBAAkB,QAAsD,CAAC;AACtF,eAAO,MAAM,aAAa,QAAkF,CAAC;AAC7G,eAAO,MAAM,kBAAkB,QAAoF,CAAC;AACpH,eAAO,MAAM,cAAc,QAAiE,CAAC;AAE7F,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAI9E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Option } from 'commander';
|
|
2
|
+
export const promptOption = new Option('-p, --prompt <text>', 'Instructions for the AI agent');
|
|
3
|
+
export const outputOption = new Option('-o, --output <dir>', 'Output directory').default('./recordings');
|
|
4
|
+
export const viewportOption = new Option('--viewport <WxH>', 'Viewport size').default('1920x1080');
|
|
5
|
+
export const modelOption = new Option('-m, --model <model>', 'Claude model to use').default('claude-sonnet-4-20250514');
|
|
6
|
+
export const headlessOption = new Option('--no-headless', 'Show browser window');
|
|
7
|
+
export const slowMoOption = new Option('--slow-mo <ms>', 'Extra delay between actions').default('0');
|
|
8
|
+
export const maxStepsOption = new Option('--max-steps <n>', 'Max agent iterations').default('50');
|
|
9
|
+
export const presetOption = new Option('--preset <name>', 'Platform preset').choices([
|
|
10
|
+
'youtube',
|
|
11
|
+
'twitter',
|
|
12
|
+
'instagram',
|
|
13
|
+
'tiktok',
|
|
14
|
+
'linkedin',
|
|
15
|
+
'github-gif',
|
|
16
|
+
]).default('youtube');
|
|
17
|
+
export const noZoomOption = new Option('--no-zoom', 'Disable auto-zoom');
|
|
18
|
+
export const noHighlightOption = new Option('--no-highlight', 'Disable click highlights');
|
|
19
|
+
export const noCursorOption = new Option('--no-cursor', 'Disable cursor trail');
|
|
20
|
+
export const loginOption = new Option('--login', 'Open browser for manual login before AI takes over');
|
|
21
|
+
export const authOption = new Option('--auth <name>', 'Use saved auth state (auto-creates on first use via login flow)');
|
|
22
|
+
export const backgroundOption = new Option('--background <name>', 'Background style').choices([
|
|
23
|
+
'aurora', 'sunset', 'ocean', 'lavender', 'mint', 'ember', 'none',
|
|
24
|
+
]).default('aurora');
|
|
25
|
+
export const noBackgroundOption = new Option('--no-background', 'Disable background');
|
|
26
|
+
export const paddingOption = new Option('--padding <percent>', 'Background padding percentage').default('8');
|
|
27
|
+
export const cornerRadiusOption = new Option('--corner-radius <px>', 'Video corner radius in pixels').default('12');
|
|
28
|
+
export const noShadowOption = new Option('--no-shadow', 'Disable drop shadow on background');
|
|
29
|
+
export function parseViewport(value) {
|
|
30
|
+
const match = value.match(/^(\d+)x(\d+)$/);
|
|
31
|
+
if (!match)
|
|
32
|
+
throw new Error(`Invalid viewport format: ${value}. Expected WxH (e.g. 1920x1080)`);
|
|
33
|
+
return { width: parseInt(match[1], 10), height: parseInt(match[2], 10) };
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/cli/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Ora } from 'ora';
|
|
2
|
+
export declare function createSpinner(text: string): Ora;
|
|
3
|
+
export declare function header(text: string): void;
|
|
4
|
+
export declare function success(text: string): void;
|
|
5
|
+
export declare function info(text: string): void;
|
|
6
|
+
export declare function warn(text: string): void;
|
|
7
|
+
export declare function error(text: string): void;
|
|
8
|
+
export declare function actionLog(step: number, toolName: string, description: string): void;
|
|
9
|
+
export declare function stats(label: string, value: string | number): void;
|
|
10
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/output.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAEpC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAE/C;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE1C;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEvC;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAExC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAInF;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
export function createSpinner(text) {
|
|
4
|
+
return ora({ text, color: 'cyan' });
|
|
5
|
+
}
|
|
6
|
+
export function header(text) {
|
|
7
|
+
console.log(chalk.bold.cyan(`\n ${text}\n`));
|
|
8
|
+
}
|
|
9
|
+
export function success(text) {
|
|
10
|
+
console.log(chalk.green(` ✓ ${text}`));
|
|
11
|
+
}
|
|
12
|
+
export function info(text) {
|
|
13
|
+
console.log(chalk.blue(` ℹ ${text}`));
|
|
14
|
+
}
|
|
15
|
+
export function warn(text) {
|
|
16
|
+
console.log(chalk.yellow(` ⚠ ${text}`));
|
|
17
|
+
}
|
|
18
|
+
export function error(text) {
|
|
19
|
+
console.error(chalk.red(` ✗ ${text}`));
|
|
20
|
+
}
|
|
21
|
+
export function actionLog(step, toolName, description) {
|
|
22
|
+
const stepStr = chalk.gray(`[${String(step).padStart(2, '0')}]`);
|
|
23
|
+
const tool = chalk.cyan(toolName.padEnd(15));
|
|
24
|
+
console.log(` ${stepStr} ${tool} ${description}`);
|
|
25
|
+
}
|
|
26
|
+
export function stats(label, value) {
|
|
27
|
+
console.log(` ${chalk.gray(label.padEnd(20))} ${value}`);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAiB,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAY;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,QAAgB,EAAE,WAAmB;IAC3E,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,KAAsB;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type BackgroundOptions } from '../video/background.js';
|
|
2
|
+
import type { RecordingEvent, RecordingMetadata } from '../recording/types.js';
|
|
3
|
+
export interface ExportRunOptions {
|
|
4
|
+
sourceVideo: string;
|
|
5
|
+
events: RecordingEvent[];
|
|
6
|
+
metadata: RecordingMetadata;
|
|
7
|
+
presetName: string;
|
|
8
|
+
outputDir: string;
|
|
9
|
+
outputPath?: string;
|
|
10
|
+
zoom: boolean;
|
|
11
|
+
highlight: boolean;
|
|
12
|
+
cursor: boolean;
|
|
13
|
+
background?: BackgroundOptions;
|
|
14
|
+
}
|
|
15
|
+
export declare function runExport(options: ExportRunOptions): Promise<string>;
|
|
16
|
+
//# sourceMappingURL=exporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exporter.d.ts","sourceRoot":"","sources":["../../../src/export/exporter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAkD,KAAK,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmE1E"}
|