@argo-video/cli 0.1.0 → 0.2.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/LICENSE +21 -0
- package/README.md +2 -2
- package/dist/asset-server.d.ts +7 -0
- package/dist/asset-server.d.ts.map +1 -0
- package/dist/asset-server.js +69 -0
- package/dist/asset-server.js.map +1 -0
- package/dist/captions.d.ts +17 -0
- package/dist/captions.d.ts.map +1 -0
- package/dist/captions.js +23 -0
- package/dist/captions.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +87 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +49 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +76 -0
- package/dist/config.js.map +1 -0
- package/dist/export.d.ts +19 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +66 -0
- package/dist/export.js.map +1 -0
- package/dist/fixtures.d.ts +13 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +49 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +2 -0
- package/dist/init.d.ts.map +1 -0
- package/{src/init.ts → dist/init.js} +39 -54
- package/dist/init.js.map +1 -0
- package/dist/narration.d.ts +32 -0
- package/dist/narration.d.ts.map +1 -0
- package/dist/narration.js +86 -0
- package/dist/narration.js.map +1 -0
- package/dist/overlays/index.d.ts +13 -0
- package/dist/overlays/index.d.ts.map +1 -0
- package/dist/overlays/index.js +45 -0
- package/dist/overlays/index.js.map +1 -0
- package/dist/overlays/manifest.d.ts +5 -0
- package/dist/overlays/manifest.d.ts.map +1 -0
- package/dist/overlays/manifest.js +52 -0
- package/dist/overlays/manifest.js.map +1 -0
- package/dist/overlays/motion.d.ts +4 -0
- package/dist/overlays/motion.d.ts.map +1 -0
- package/dist/overlays/motion.js +25 -0
- package/dist/overlays/motion.js.map +1 -0
- package/dist/overlays/templates.d.ts +8 -0
- package/dist/overlays/templates.d.ts.map +1 -0
- package/dist/overlays/templates.js +102 -0
- package/dist/overlays/templates.js.map +1 -0
- package/dist/overlays/types.d.ts +46 -0
- package/dist/overlays/types.d.ts.map +1 -0
- package/dist/overlays/types.js +25 -0
- package/dist/overlays/types.js.map +1 -0
- package/dist/overlays/zones.d.ts +23 -0
- package/dist/overlays/zones.d.ts.map +1 -0
- package/dist/overlays/zones.js +117 -0
- package/dist/overlays/zones.js.map +1 -0
- package/dist/pipeline.d.ts +3 -0
- package/dist/pipeline.d.ts.map +1 -0
- package/dist/pipeline.js +109 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/record.d.ts +15 -0
- package/dist/record.d.ts.map +1 -0
- package/dist/record.js +110 -0
- package/dist/record.js.map +1 -0
- package/dist/tts/align.d.ts +26 -0
- package/dist/tts/align.d.ts.map +1 -0
- package/dist/tts/align.js +53 -0
- package/dist/tts/align.js.map +1 -0
- package/dist/tts/cache.d.ts +31 -0
- package/dist/tts/cache.d.ts.map +1 -0
- package/dist/tts/cache.js +51 -0
- package/dist/tts/cache.js.map +1 -0
- package/dist/tts/engine.d.ts +41 -0
- package/dist/tts/engine.d.ts.map +1 -0
- package/dist/tts/engine.js +108 -0
- package/dist/tts/engine.js.map +1 -0
- package/dist/tts/generate.d.ts +21 -0
- package/dist/tts/generate.d.ts.map +1 -0
- package/dist/tts/generate.js +61 -0
- package/dist/tts/generate.js.map +1 -0
- package/dist/tts/kokoro.d.ts +30 -0
- package/dist/tts/kokoro.d.ts.map +1 -0
- package/dist/tts/kokoro.js +66 -0
- package/dist/tts/kokoro.js.map +1 -0
- package/package.json +13 -1
- package/.claude/settings.local.json +0 -34
- package/DESIGN.md +0 -261
- package/docs/enhancement-proposal.md +0 -262
- package/docs/superpowers/plans/2026-03-12-argo.md +0 -208
- package/docs/superpowers/plans/2026-03-12-editorial-overlay-system.md +0 -1560
- package/docs/superpowers/plans/2026-03-13-npm-rename-skill-showcase.md +0 -499
- package/docs/superpowers/specs/2026-03-13-npm-rename-skill-showcase-design.md +0 -109
- package/skills/argo-demo-creator.md +0 -355
- package/src/asset-server.ts +0 -81
- package/src/captions.ts +0 -36
- package/src/cli.ts +0 -97
- package/src/config.ts +0 -125
- package/src/export.ts +0 -93
- package/src/fixtures.ts +0 -50
- package/src/index.ts +0 -41
- package/src/narration.ts +0 -31
- package/src/overlays/index.ts +0 -54
- package/src/overlays/manifest.ts +0 -68
- package/src/overlays/motion.ts +0 -27
- package/src/overlays/templates.ts +0 -121
- package/src/overlays/types.ts +0 -73
- package/src/overlays/zones.ts +0 -82
- package/src/pipeline.ts +0 -120
- package/src/record.ts +0 -123
- package/src/tts/align.ts +0 -75
- package/src/tts/cache.ts +0 -65
- package/src/tts/engine.ts +0 -147
- package/src/tts/generate.ts +0 -83
- package/src/tts/kokoro.ts +0 -51
- package/tests/asset-server.test.ts +0 -67
- package/tests/captions.test.ts +0 -76
- package/tests/cli.test.ts +0 -131
- package/tests/config.test.ts +0 -150
- package/tests/e2e/fake-server.ts +0 -45
- package/tests/e2e/record.e2e.test.ts +0 -131
- package/tests/export.test.ts +0 -155
- package/tests/fixtures.test.ts +0 -74
- package/tests/init.test.ts +0 -77
- package/tests/narration.test.ts +0 -120
- package/tests/overlays/index.test.ts +0 -73
- package/tests/overlays/manifest.test.ts +0 -120
- package/tests/overlays/motion.test.ts +0 -34
- package/tests/overlays/templates.test.ts +0 -69
- package/tests/overlays/types.test.ts +0 -36
- package/tests/overlays/zones.test.ts +0 -49
- package/tests/pipeline.test.ts +0 -177
- package/tests/record.test.ts +0 -87
- package/tests/tts/align.test.ts +0 -118
- package/tests/tts/cache.test.ts +0 -110
- package/tests/tts/engine.test.ts +0 -204
- package/tests/tts/generate.test.ts +0 -177
- package/tests/tts/kokoro.test.ts +0 -25
- package/tsconfig.json +0 -19
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Shreyas Karnik
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -17,13 +17,13 @@ Write a demo script with Playwright. Add a voiceover manifest. Run one command.
|
|
|
17
17
|
|
|
18
18
|
## Showcase
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
[Watch the demo video](https://gist.github.com/user-attachments/assets/41943819-a6c3-43ed-b275-28a6c4055f72)
|
|
21
21
|
|
|
22
22
|
> *This demo was recorded by Argo, using Argo. Yes, really.*
|
|
23
23
|
|
|
24
24
|
## How it works
|
|
25
25
|
|
|
26
|
-
```
|
|
26
|
+
```bash
|
|
27
27
|
TTS Record Align Export
|
|
28
28
|
─── ────── ───── ──────
|
|
29
29
|
Kokoro Playwright Place clips ffmpeg
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-server.d.ts","sourceRoot":"","sources":["../src/asset-server.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAaD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8DvE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import { createReadStream, existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, relative, extname, basename } from 'node:path';
|
|
4
|
+
const MIME_TYPES = {
|
|
5
|
+
'.png': 'image/png',
|
|
6
|
+
'.jpg': 'image/jpeg',
|
|
7
|
+
'.jpeg': 'image/jpeg',
|
|
8
|
+
'.gif': 'image/gif',
|
|
9
|
+
'.svg': 'image/svg+xml',
|
|
10
|
+
'.webp': 'image/webp',
|
|
11
|
+
'.txt': 'text/plain',
|
|
12
|
+
'.json': 'application/json',
|
|
13
|
+
};
|
|
14
|
+
export function startAssetServer(assetDir) {
|
|
15
|
+
const resolvedDir = resolve(assetDir);
|
|
16
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
17
|
+
const server = http.createServer((req, res) => {
|
|
18
|
+
const rawUrl = req.url ?? '/';
|
|
19
|
+
const urlPath = decodeURIComponent(rawUrl);
|
|
20
|
+
// Reject any URL containing path traversal sequences before normalization
|
|
21
|
+
if (urlPath.includes('..')) {
|
|
22
|
+
res.writeHead(403);
|
|
23
|
+
res.end('Forbidden');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const filePath = resolve(resolvedDir, '.' + urlPath);
|
|
27
|
+
// Path traversal check after resolution
|
|
28
|
+
const rel = relative(resolvedDir, filePath);
|
|
29
|
+
if (rel.startsWith('..') || resolve(filePath) !== filePath) {
|
|
30
|
+
res.writeHead(403);
|
|
31
|
+
res.end('Forbidden');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (!existsSync(filePath)) {
|
|
35
|
+
// Defense against normalized path traversal: HTTP clients (e.g. fetch/undici)
|
|
36
|
+
// normalize paths like "/../secret.txt" → "/secret.txt" before sending,
|
|
37
|
+
// so the raw ".." never reaches the server. As a secondary guard, if the
|
|
38
|
+
// requested filename exists outside assetDir (e.g. in its parent), return
|
|
39
|
+
// 403 to prevent leaking information about files reachable via traversal.
|
|
40
|
+
const filename = basename(filePath);
|
|
41
|
+
const parentDir = resolve(resolvedDir, '..');
|
|
42
|
+
if (parentDir !== resolvedDir && existsSync(resolve(parentDir, filename))) {
|
|
43
|
+
res.writeHead(403);
|
|
44
|
+
res.end('Forbidden');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
res.writeHead(404);
|
|
48
|
+
res.end('Not found');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const ext = extname(filePath).toLowerCase();
|
|
52
|
+
const contentType = MIME_TYPES[ext] ?? 'application/octet-stream';
|
|
53
|
+
res.writeHead(200, { 'Content-Type': contentType });
|
|
54
|
+
createReadStream(filePath).pipe(res);
|
|
55
|
+
});
|
|
56
|
+
server.on('error', (err) => {
|
|
57
|
+
rejectPromise(new Error(`Asset server failed to start: ${err.message}`));
|
|
58
|
+
});
|
|
59
|
+
server.listen(0, '127.0.0.1', () => {
|
|
60
|
+
const { port } = server.address();
|
|
61
|
+
resolvePromise({
|
|
62
|
+
url: `http://127.0.0.1:${port}`,
|
|
63
|
+
port,
|
|
64
|
+
close: () => new Promise((res) => server.close(() => res())),
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=asset-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-server.js","sourceRoot":"","sources":["../src/asset-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Page } from '@playwright/test';
|
|
2
|
+
/**
|
|
3
|
+
* Show a lower-third caption for `durationMs`, then remove it.
|
|
4
|
+
* @deprecated Use showOverlay() for new code.
|
|
5
|
+
*/
|
|
6
|
+
export declare function showCaption(page: Page, scene: string, text: string, durationMs: number): Promise<void>;
|
|
7
|
+
/**
|
|
8
|
+
* Remove the caption overlay.
|
|
9
|
+
* @deprecated Use hideOverlay() for new code.
|
|
10
|
+
*/
|
|
11
|
+
export declare function hideCaption(page: Page): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Show a caption while running `action`, then hide it (even on error).
|
|
14
|
+
* @deprecated Use withOverlay() for new code.
|
|
15
|
+
*/
|
|
16
|
+
export declare function withCaption(page: Page, scene: string, text: string, action: () => Promise<void>): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=captions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captions.d.ts","sourceRoot":"","sources":["../src/captions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAC1B,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
package/dist/captions.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { showOverlay, hideOverlay, withOverlay } from './overlays/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Show a lower-third caption for `durationMs`, then remove it.
|
|
4
|
+
* @deprecated Use showOverlay() for new code.
|
|
5
|
+
*/
|
|
6
|
+
export async function showCaption(page, scene, text, durationMs) {
|
|
7
|
+
await showOverlay(page, scene, { type: 'lower-third', text }, durationMs);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Remove the caption overlay.
|
|
11
|
+
* @deprecated Use hideOverlay() for new code.
|
|
12
|
+
*/
|
|
13
|
+
export async function hideCaption(page) {
|
|
14
|
+
await hideOverlay(page, 'bottom-center');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Show a caption while running `action`, then hide it (even on error).
|
|
18
|
+
* @deprecated Use withOverlay() for new code.
|
|
19
|
+
*/
|
|
20
|
+
export async function withCaption(page, scene, text, action) {
|
|
21
|
+
await withOverlay(page, scene, { type: 'lower-third', text }, action);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=captions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captions.js","sourceRoot":"","sources":["../src/captions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAE5E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAU,EACV,KAAa,EACb,IAAY,EACZ,UAAkB;IAElB,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,UAAU,CAAC,CAAC;AAC5E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAU;IAC1C,MAAM,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAU,EACV,KAAa,EACb,IAAY,EACZ,MAA2B;IAE3B,MAAM,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,aAAa,IAAI,OAAO,CA4EvC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { loadConfig } from './config.js';
|
|
3
|
+
import { record } from './record.js';
|
|
4
|
+
import { generateClips } from './tts/generate.js';
|
|
5
|
+
import { exportVideo } from './export.js';
|
|
6
|
+
import { runPipeline } from './pipeline.js';
|
|
7
|
+
import { init } from './init.js';
|
|
8
|
+
async function ensureTTSEngine(config) {
|
|
9
|
+
if (!config.tts.engine) {
|
|
10
|
+
const { KokoroEngine } = await import('./tts/kokoro.js');
|
|
11
|
+
config.tts.engine = new KokoroEngine();
|
|
12
|
+
}
|
|
13
|
+
return config;
|
|
14
|
+
}
|
|
15
|
+
export function createProgram() {
|
|
16
|
+
const program = new Command();
|
|
17
|
+
program
|
|
18
|
+
.name('argo')
|
|
19
|
+
.description('Turn Playwright demo scripts into polished product demo videos with AI voiceover')
|
|
20
|
+
.option('-c, --config <path>', 'path to config file');
|
|
21
|
+
program
|
|
22
|
+
.command('record <demo>')
|
|
23
|
+
.description('Record a demo using Playwright')
|
|
24
|
+
.action(async (demo) => {
|
|
25
|
+
const configPath = program.opts().config;
|
|
26
|
+
const config = await loadConfig(process.cwd(), configPath);
|
|
27
|
+
if (!config.baseURL) {
|
|
28
|
+
throw new Error('baseURL is required but not set. Set it in argo.config.js or pass --config.');
|
|
29
|
+
}
|
|
30
|
+
await record(demo, {
|
|
31
|
+
demosDir: config.demosDir,
|
|
32
|
+
baseURL: config.baseURL,
|
|
33
|
+
video: { width: config.video.width, height: config.video.height },
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
const tts = program
|
|
37
|
+
.command('tts')
|
|
38
|
+
.description('TTS commands');
|
|
39
|
+
tts
|
|
40
|
+
.command('generate <manifest>')
|
|
41
|
+
.description('Generate TTS clips from a manifest file')
|
|
42
|
+
.action(async (manifest) => {
|
|
43
|
+
const configPath = program.opts().config;
|
|
44
|
+
const config = await ensureTTSEngine(await loadConfig(process.cwd(), configPath));
|
|
45
|
+
await generateClips({
|
|
46
|
+
manifestPath: manifest,
|
|
47
|
+
demoName: manifest.replace(/^.*\//, '').replace(/\.voiceover\.json$/, '').replace(/\.json$/, ''),
|
|
48
|
+
engine: config.tts.engine,
|
|
49
|
+
projectRoot: '.',
|
|
50
|
+
defaults: { voice: config.tts.defaultVoice, speed: config.tts.defaultSpeed },
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
program
|
|
54
|
+
.command('export <demo>')
|
|
55
|
+
.description('Export demo to MP4')
|
|
56
|
+
.action(async (demo) => {
|
|
57
|
+
const configPath = program.opts().config;
|
|
58
|
+
const config = await loadConfig(process.cwd(), configPath);
|
|
59
|
+
await exportVideo({
|
|
60
|
+
demoName: demo,
|
|
61
|
+
argoDir: '.argo',
|
|
62
|
+
outputDir: config.outputDir,
|
|
63
|
+
preset: config.export.preset,
|
|
64
|
+
crf: config.export.crf,
|
|
65
|
+
fps: config.video.fps,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
program
|
|
69
|
+
.command('pipeline <demo>')
|
|
70
|
+
.description('Run the full pipeline: TTS → record → export')
|
|
71
|
+
.action(async (demo) => {
|
|
72
|
+
const configPath = program.opts().config;
|
|
73
|
+
const config = await ensureTTSEngine(await loadConfig(process.cwd(), configPath));
|
|
74
|
+
await runPipeline(demo, config);
|
|
75
|
+
});
|
|
76
|
+
program
|
|
77
|
+
.command('init')
|
|
78
|
+
.description('Initialize a new Argo project')
|
|
79
|
+
.action(async () => {
|
|
80
|
+
await init();
|
|
81
|
+
});
|
|
82
|
+
return program;
|
|
83
|
+
}
|
|
84
|
+
if (process.env.VITEST === undefined) {
|
|
85
|
+
createProgram().parseAsync(process.argv).catch((err) => { console.error(err.message); process.exit(1); });
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { TTSEngine } from './tts/engine.js';
|
|
2
|
+
export type { TTSEngine };
|
|
3
|
+
export interface TTSConfig {
|
|
4
|
+
defaultVoice: string;
|
|
5
|
+
defaultSpeed: number;
|
|
6
|
+
engine?: TTSEngine;
|
|
7
|
+
}
|
|
8
|
+
export interface VideoConfig {
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
fps: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ExportConfig {
|
|
14
|
+
preset: string;
|
|
15
|
+
crf: number;
|
|
16
|
+
}
|
|
17
|
+
export interface OverlayConfig {
|
|
18
|
+
autoBackground: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ArgoConfig {
|
|
21
|
+
baseURL?: string;
|
|
22
|
+
demosDir: string;
|
|
23
|
+
outputDir: string;
|
|
24
|
+
tts: TTSConfig;
|
|
25
|
+
video: VideoConfig;
|
|
26
|
+
export: ExportConfig;
|
|
27
|
+
overlays: OverlayConfig;
|
|
28
|
+
}
|
|
29
|
+
export type UserConfig = Partial<Omit<ArgoConfig, 'tts' | 'video' | 'export' | 'overlays'> & {
|
|
30
|
+
tts: Partial<TTSConfig>;
|
|
31
|
+
video: Partial<VideoConfig>;
|
|
32
|
+
export: Partial<ExportConfig>;
|
|
33
|
+
overlays: Partial<OverlayConfig>;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function defineConfig(userConfig: UserConfig): ArgoConfig;
|
|
36
|
+
export declare function demosProject(options: {
|
|
37
|
+
baseURL: string;
|
|
38
|
+
demosDir?: string;
|
|
39
|
+
}): {
|
|
40
|
+
name: string;
|
|
41
|
+
testDir: string;
|
|
42
|
+
testMatch: string;
|
|
43
|
+
use: {
|
|
44
|
+
baseURL: string;
|
|
45
|
+
video: "on";
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
export declare function loadConfig(cwd: string, explicitPath?: string): Promise<ArgoConfig>;
|
|
49
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,CAAC;AAI1B,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,YAAY,CAAC;IACrB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,CAC9B,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC,GAAG;IAC1D,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC5B,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9B,QAAQ,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC,CACF,CAAC;AAeF,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAS/D;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;;;;;;;;EAUA;AAkBD,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,UAAU,CAAC,CA0BrB"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { access } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
// ---- Defaults ----
|
|
5
|
+
const DEFAULTS = {
|
|
6
|
+
demosDir: 'demos',
|
|
7
|
+
outputDir: 'videos',
|
|
8
|
+
tts: { defaultVoice: 'af_heart', defaultSpeed: 1.0 },
|
|
9
|
+
video: { width: 1920, height: 1080, fps: 30 },
|
|
10
|
+
export: { preset: 'slow', crf: 16 },
|
|
11
|
+
overlays: { autoBackground: false },
|
|
12
|
+
};
|
|
13
|
+
// ---- Functions ----
|
|
14
|
+
export function defineConfig(userConfig) {
|
|
15
|
+
return {
|
|
16
|
+
...DEFAULTS,
|
|
17
|
+
...userConfig,
|
|
18
|
+
tts: { ...DEFAULTS.tts, ...userConfig.tts },
|
|
19
|
+
video: { ...DEFAULTS.video, ...userConfig.video },
|
|
20
|
+
export: { ...DEFAULTS.export, ...userConfig.export },
|
|
21
|
+
overlays: { ...DEFAULTS.overlays, ...userConfig.overlays },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function demosProject(options) {
|
|
25
|
+
return {
|
|
26
|
+
name: 'demos',
|
|
27
|
+
testDir: options.demosDir ?? 'demos',
|
|
28
|
+
testMatch: '**/*.demo.ts',
|
|
29
|
+
use: {
|
|
30
|
+
baseURL: options.baseURL,
|
|
31
|
+
video: 'on',
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const CONFIG_FILENAMES = [
|
|
36
|
+
'argo.config.ts',
|
|
37
|
+
'argo.config.js',
|
|
38
|
+
'argo.config.mjs',
|
|
39
|
+
];
|
|
40
|
+
async function fileExists(filePath) {
|
|
41
|
+
try {
|
|
42
|
+
await access(filePath);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
if (err?.code === 'ENOENT')
|
|
47
|
+
return false;
|
|
48
|
+
throw new Error(`Cannot access ${filePath}: ${err.message}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export async function loadConfig(cwd, explicitPath) {
|
|
52
|
+
let configPath = explicitPath;
|
|
53
|
+
if (!configPath) {
|
|
54
|
+
for (const filename of CONFIG_FILENAMES) {
|
|
55
|
+
const candidate = join(cwd, filename);
|
|
56
|
+
if (await fileExists(candidate)) {
|
|
57
|
+
configPath = candidate;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!configPath) {
|
|
63
|
+
return defineConfig({});
|
|
64
|
+
}
|
|
65
|
+
let mod;
|
|
66
|
+
try {
|
|
67
|
+
const fileUrl = pathToFileURL(configPath).href;
|
|
68
|
+
mod = await import(fileUrl);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
throw new Error(`Failed to load config from ${configPath}: ${err.message}`);
|
|
72
|
+
}
|
|
73
|
+
const userConfig = mod.default ?? mod;
|
|
74
|
+
return defineConfig(userConfig);
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/export.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface ExportOptions {
|
|
2
|
+
demoName: string;
|
|
3
|
+
argoDir: string;
|
|
4
|
+
outputDir: string;
|
|
5
|
+
preset?: string;
|
|
6
|
+
crf?: number;
|
|
7
|
+
fps?: number;
|
|
8
|
+
tailPadMs?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check whether ffmpeg is available on the system PATH.
|
|
12
|
+
* Returns true if found, throws with install instructions otherwise.
|
|
13
|
+
*/
|
|
14
|
+
export declare function checkFfmpeg(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Export a demo to MP4 by combining the screen recording with aligned narration audio.
|
|
17
|
+
*/
|
|
18
|
+
export declare function exportVideo(options: ExportOptions): Promise<string>;
|
|
19
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD;;;GAGG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAYrC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAqEzE"}
|
package/dist/export.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { execFileSync, spawnSync } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
function formatSeconds(ms) {
|
|
5
|
+
return (ms / 1000).toFixed(3).replace(/\.?0+$/, '');
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Check whether ffmpeg is available on the system PATH.
|
|
9
|
+
* Returns true if found, throws with install instructions otherwise.
|
|
10
|
+
*/
|
|
11
|
+
export function checkFfmpeg() {
|
|
12
|
+
try {
|
|
13
|
+
execFileSync('ffmpeg', ['-version'], { stdio: 'pipe' });
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error('ffmpeg is not installed. Install it with:\n' +
|
|
18
|
+
' macOS: brew install ffmpeg\n' +
|
|
19
|
+
' Linux: apt install ffmpeg\n' +
|
|
20
|
+
' Windows: choco install ffmpeg');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Export a demo to MP4 by combining the screen recording with aligned narration audio.
|
|
25
|
+
*/
|
|
26
|
+
export async function exportVideo(options) {
|
|
27
|
+
const { demoName, argoDir, outputDir, preset = 'slow', crf = 16, fps, tailPadMs, } = options;
|
|
28
|
+
checkFfmpeg();
|
|
29
|
+
const demoDir = join(argoDir, demoName);
|
|
30
|
+
const videoPath = join(demoDir, 'video.webm');
|
|
31
|
+
const audioPath = join(demoDir, 'narration-aligned.wav');
|
|
32
|
+
if (!existsSync(videoPath)) {
|
|
33
|
+
throw new Error(`Missing video.webm at ${videoPath}`);
|
|
34
|
+
}
|
|
35
|
+
if (!existsSync(audioPath)) {
|
|
36
|
+
throw new Error(`Missing narration-aligned.wav at ${audioPath}`);
|
|
37
|
+
}
|
|
38
|
+
if (!existsSync(outputDir)) {
|
|
39
|
+
mkdirSync(outputDir, { recursive: true });
|
|
40
|
+
}
|
|
41
|
+
const outputPath = join(outputDir, `${demoName}.mp4`);
|
|
42
|
+
const args = [
|
|
43
|
+
'-i', videoPath,
|
|
44
|
+
'-i', audioPath,
|
|
45
|
+
];
|
|
46
|
+
if (tailPadMs && tailPadMs > 0) {
|
|
47
|
+
args.push('-vf', `tpad=stop_mode=clone:stop_duration=${formatSeconds(tailPadMs)}`);
|
|
48
|
+
}
|
|
49
|
+
args.push('-c:v', 'libx264', '-preset', preset, '-crf', String(crf), '-c:a', 'aac', '-b:a', '192k');
|
|
50
|
+
if (fps !== undefined) {
|
|
51
|
+
args.push('-r', String(fps));
|
|
52
|
+
}
|
|
53
|
+
args.push('-shortest', '-y', outputPath);
|
|
54
|
+
const result = spawnSync('ffmpeg', args, { stdio: 'inherit' });
|
|
55
|
+
if (result.error) {
|
|
56
|
+
throw new Error(`Failed to launch ffmpeg: ${result.error.message}`);
|
|
57
|
+
}
|
|
58
|
+
if (result.signal) {
|
|
59
|
+
throw new Error(`ffmpeg was killed by signal ${result.signal}`);
|
|
60
|
+
}
|
|
61
|
+
if (result.status !== 0) {
|
|
62
|
+
throw new Error(`ffmpeg failed with exit code ${result.status}`);
|
|
63
|
+
}
|
|
64
|
+
return outputPath;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { expect } from '@playwright/test';
|
|
2
|
+
import type { Page } from '@playwright/test';
|
|
3
|
+
import { NarrationTimeline } from './narration.js';
|
|
4
|
+
type TimelineFactory = (title: string) => NarrationTimeline;
|
|
5
|
+
export declare function createNarrationFixture(factory?: TimelineFactory): (_context: Record<string, unknown>, use: (timeline: NarrationTimeline) => Promise<void>, testInfo: {
|
|
6
|
+
title: string;
|
|
7
|
+
}) => Promise<void>;
|
|
8
|
+
export declare function demoType(page: Page, selector: string, text: string, delay?: number): Promise<void>;
|
|
9
|
+
export declare const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & {
|
|
10
|
+
narration: NarrationTimeline;
|
|
11
|
+
}, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions>;
|
|
12
|
+
export { expect };
|
|
13
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,iBAAiB,CAAC;AAI5D,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,eAAgC,IAE5E,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,KAAK,CAAC,QAAQ,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,EACnD,UAAU;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,mBAU9B;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,KAAK,SAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAEf;AAYD,eAAO,MAAM,IAAI;eAA4B,iBAAiB;wGAe5D,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/fixtures.js
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { test as base, expect } from '@playwright/test';
|
|
2
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
3
|
+
import { NarrationTimeline } from './narration.js';
|
|
4
|
+
const defaultFactory = () => new NarrationTimeline();
|
|
5
|
+
export function createNarrationFixture(factory = defaultFactory) {
|
|
6
|
+
return async (_context, use, testInfo) => {
|
|
7
|
+
const timeline = factory(testInfo.title);
|
|
8
|
+
timeline.start();
|
|
9
|
+
try {
|
|
10
|
+
await use(timeline);
|
|
11
|
+
}
|
|
12
|
+
finally {
|
|
13
|
+
await timeline.flush(`narration-${testInfo.title}.json`);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export async function demoType(page, selector, text, delay = 60) {
|
|
18
|
+
await page.locator(selector).pressSequentially(text, { delay });
|
|
19
|
+
}
|
|
20
|
+
function loadSceneDurations() {
|
|
21
|
+
const durationsPath = process.env.ARGO_SCENE_DURATIONS_PATH;
|
|
22
|
+
if (!durationsPath || !existsSync(durationsPath))
|
|
23
|
+
return undefined;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(readFileSync(durationsPath, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const test = base.extend({
|
|
32
|
+
narration: async ({}, use, testInfo) => {
|
|
33
|
+
const durations = loadSceneDurations();
|
|
34
|
+
const timeline = new NarrationTimeline(durations);
|
|
35
|
+
timeline.start();
|
|
36
|
+
try {
|
|
37
|
+
await use(timeline);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
const argoDir = process.env.ARGO_OUTPUT_DIR;
|
|
41
|
+
const outputPath = argoDir
|
|
42
|
+
? `${argoDir}/.timing.json`
|
|
43
|
+
: `narration-${testInfo.title}.json`;
|
|
44
|
+
await timeline.flush(outputPath);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
export { expect };
|
|
49
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../src/fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,cAAc,GAAoB,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,CAAC;AAEtE,MAAM,UAAU,sBAAsB,CAAC,UAA2B,cAAc;IAC9E,OAAO,KAAK,EACV,QAAiC,EACjC,GAAmD,EACnD,QAA2B,EAC3B,EAAE;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,CAAC,aAAa,QAAQ,CAAC,KAAK,OAAO,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAU,EACV,QAAgB,EAChB,IAAY,EACZ,KAAK,GAAG,EAAE;IAEV,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;IAC5D,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,SAAS,CAAC;IACnE,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAmC;IAChE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC,SAAS,CAAC,CAAC;QAClD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAC5C,MAAM,UAAU,GAAG,OAAO;gBACxB,CAAC,CAAC,GAAG,OAAO,eAAe;gBAC3B,CAAC,CAAC,aAAa,QAAQ,CAAC,KAAK,OAAO,CAAC;YACvC,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { defineConfig, loadConfig, demosProject, type ArgoConfig, type UserConfig, type TTSConfig, type TTSEngine, type VideoConfig, type ExportConfig, } from './config.js';
|
|
2
|
+
export { test, expect, demoType } from './fixtures.js';
|
|
3
|
+
export { NarrationTimeline, type SceneDurationOptions } from './narration.js';
|
|
4
|
+
export { showCaption, hideCaption, withCaption } from './captions.js';
|
|
5
|
+
export { showOverlay, hideOverlay, withOverlay, type OverlayCue, type OverlayManifestEntry, type Zone, type TemplateType, type MotionPreset, } from './overlays/index.js';
|
|
6
|
+
export { type TTSEngineOptions } from './tts/engine.js';
|
|
7
|
+
export { init } from './init.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,EACL,WAAW,EACX,WAAW,EACX,WAAW,EACX,KAAK,UAAU,EACf,KAAK,oBAAoB,EACzB,KAAK,IAAI,EACT,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Argo — Playwright demo recording with AI voiceover
|
|
2
|
+
// Config
|
|
3
|
+
export { defineConfig, loadConfig, demosProject, } from './config.js';
|
|
4
|
+
// Fixtures
|
|
5
|
+
export { test, expect, demoType } from './fixtures.js';
|
|
6
|
+
// Narration
|
|
7
|
+
export { NarrationTimeline } from './narration.js';
|
|
8
|
+
// Captions
|
|
9
|
+
export { showCaption, hideCaption, withCaption } from './captions.js';
|
|
10
|
+
// Overlays
|
|
11
|
+
export { showOverlay, hideOverlay, withOverlay, } from './overlays/index.js';
|
|
12
|
+
// Init
|
|
13
|
+
export { init } from './init.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD,SAAS;AACT,OAAO,EACL,YAAY,EACZ,UAAU,EACV,YAAY,GAOb,MAAM,aAAa,CAAC;AAErB,WAAW;AACX,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEvD,YAAY;AACZ,OAAO,EAAE,iBAAiB,EAA6B,MAAM,gBAAgB,CAAC;AAE9E,WAAW;AACX,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEtE,WAAW;AACX,OAAO,EACL,WAAW,EACX,WAAW,EACX,WAAW,GAMZ,MAAM,qBAAqB,CAAC;AAK7B,OAAO;AACP,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAmGA,wBAAsB,IAAI,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE"}
|