demofly 0.1.2

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 (77) hide show
  1. package/dist/commands/auth/index.d.ts +3 -0
  2. package/dist/commands/auth/index.d.ts.map +1 -0
  3. package/dist/commands/auth/index.js +13 -0
  4. package/dist/commands/auth/index.js.map +1 -0
  5. package/dist/commands/auth/login.d.ts +3 -0
  6. package/dist/commands/auth/login.d.ts.map +1 -0
  7. package/dist/commands/auth/login.js +109 -0
  8. package/dist/commands/auth/login.js.map +1 -0
  9. package/dist/commands/auth/logout.d.ts +3 -0
  10. package/dist/commands/auth/logout.d.ts.map +1 -0
  11. package/dist/commands/auth/logout.js +21 -0
  12. package/dist/commands/auth/logout.js.map +1 -0
  13. package/dist/commands/auth/status.d.ts +3 -0
  14. package/dist/commands/auth/status.d.ts.map +1 -0
  15. package/dist/commands/auth/status.js +25 -0
  16. package/dist/commands/auth/status.js.map +1 -0
  17. package/dist/commands/generate.d.ts +3 -0
  18. package/dist/commands/generate.d.ts.map +1 -0
  19. package/dist/commands/generate.js +373 -0
  20. package/dist/commands/generate.js.map +1 -0
  21. package/dist/commands/init.d.ts +3 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +384 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/projects/delete.d.ts +3 -0
  26. package/dist/commands/projects/delete.d.ts.map +1 -0
  27. package/dist/commands/projects/delete.js +41 -0
  28. package/dist/commands/projects/delete.js.map +1 -0
  29. package/dist/commands/projects/get.d.ts +3 -0
  30. package/dist/commands/projects/get.d.ts.map +1 -0
  31. package/dist/commands/projects/get.js +30 -0
  32. package/dist/commands/projects/get.js.map +1 -0
  33. package/dist/commands/projects/index.d.ts +3 -0
  34. package/dist/commands/projects/index.d.ts.map +1 -0
  35. package/dist/commands/projects/index.js +17 -0
  36. package/dist/commands/projects/index.js.map +1 -0
  37. package/dist/commands/projects/list.d.ts +3 -0
  38. package/dist/commands/projects/list.d.ts.map +1 -0
  39. package/dist/commands/projects/list.js +40 -0
  40. package/dist/commands/projects/list.js.map +1 -0
  41. package/dist/commands/projects/open.d.ts +3 -0
  42. package/dist/commands/projects/open.d.ts.map +1 -0
  43. package/dist/commands/projects/open.js +45 -0
  44. package/dist/commands/projects/open.js.map +1 -0
  45. package/dist/commands/projects/update.d.ts +3 -0
  46. package/dist/commands/projects/update.d.ts.map +1 -0
  47. package/dist/commands/projects/update.js +31 -0
  48. package/dist/commands/projects/update.js.map +1 -0
  49. package/dist/commands/push.d.ts +3 -0
  50. package/dist/commands/push.d.ts.map +1 -0
  51. package/dist/commands/push.js +86 -0
  52. package/dist/commands/push.js.map +1 -0
  53. package/dist/commands/tts.d.ts +3 -0
  54. package/dist/commands/tts.d.ts.map +1 -0
  55. package/dist/commands/tts.js +44 -0
  56. package/dist/commands/tts.js.map +1 -0
  57. package/dist/index.d.ts +3 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +25 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/lib/api-client.d.ts +13 -0
  62. package/dist/lib/api-client.d.ts.map +1 -0
  63. package/dist/lib/api-client.js +58 -0
  64. package/dist/lib/api-client.js.map +1 -0
  65. package/dist/lib/credentials.d.ts +5 -0
  66. package/dist/lib/credentials.d.ts.map +1 -0
  67. package/dist/lib/credentials.js +101 -0
  68. package/dist/lib/credentials.js.map +1 -0
  69. package/dist/lib/timing.d.ts +29 -0
  70. package/dist/lib/timing.d.ts.map +1 -0
  71. package/dist/lib/timing.js +145 -0
  72. package/dist/lib/timing.js.map +1 -0
  73. package/dist/lib/tts.d.ts +42 -0
  74. package/dist/lib/tts.d.ts.map +1 -0
  75. package/dist/lib/tts.js +198 -0
  76. package/dist/lib/tts.js.map +1 -0
  77. package/package.json +39 -0
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerAuthCommands(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAQ3D"}
@@ -0,0 +1,13 @@
1
+ import {} from "commander";
2
+ import { registerLoginCommand } from "./login.js";
3
+ import { registerLogoutCommand } from "./logout.js";
4
+ import { registerStatusCommand } from "./status.js";
5
+ export function registerAuthCommands(program) {
6
+ const auth = program
7
+ .command("auth")
8
+ .description("Manage demofly authentication");
9
+ registerLoginCommand(auth);
10
+ registerLogoutCommand(auth);
11
+ registerStatusCommand(auth);
12
+ }
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC,CAAC;IAEhD,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3B,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAC5B,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerLoginCommand(auth: Command): void;
3
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAyDzC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAyExD"}
@@ -0,0 +1,109 @@
1
+ import {} from "commander";
2
+ import { createServer } from "node:http";
3
+ import { execFileSync } from "node:child_process";
4
+ import { setToken } from "../../lib/credentials.js";
5
+ const CLIENT_ID = "demofly-cli";
6
+ const AUTH_BASE = "https://app.demofly.dev/oauth";
7
+ const LOGIN_TIMEOUT_MS = 120_000;
8
+ function openBrowser(url) {
9
+ const platform = process.platform;
10
+ try {
11
+ if (platform === "darwin") {
12
+ execFileSync("open", [url], { stdio: ["pipe", "pipe", "pipe"] });
13
+ }
14
+ else if (platform === "win32") {
15
+ execFileSync("cmd", ["/c", "start", "", url], { stdio: ["pipe", "pipe", "pipe"] });
16
+ }
17
+ else {
18
+ execFileSync("xdg-open", [url], { stdio: ["pipe", "pipe", "pipe"] });
19
+ }
20
+ }
21
+ catch {
22
+ console.log(`Open this URL in your browser:\n ${url}`);
23
+ }
24
+ }
25
+ async function exchangeCodeForToken(code, redirectUri) {
26
+ const response = await fetch(`${AUTH_BASE}/token`, {
27
+ method: "POST",
28
+ headers: { "Content-Type": "application/json" },
29
+ body: JSON.stringify({
30
+ code,
31
+ client_id: CLIENT_ID,
32
+ redirect_uri: redirectUri,
33
+ }),
34
+ });
35
+ if (!response.ok) {
36
+ const body = await response.text();
37
+ throw new Error(`Token exchange failed (${response.status}): ${body}`);
38
+ }
39
+ const data = (await response.json());
40
+ return data.access_token;
41
+ }
42
+ function extractCode(url) {
43
+ if (!url)
44
+ return null;
45
+ try {
46
+ const parsed = new URL(url, "http://localhost");
47
+ return parsed.searchParams.get("code");
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ }
53
+ export function registerLoginCommand(auth) {
54
+ auth
55
+ .command("login")
56
+ .description("Authenticate with demofly")
57
+ .action(async () => {
58
+ await new Promise((resolve, reject) => {
59
+ const server = createServer(async (req, res) => {
60
+ const code = extractCode(req.url);
61
+ if (!code) {
62
+ res.writeHead(400, { "Content-Type": "text/plain" });
63
+ res.end("Missing authorization code.");
64
+ return;
65
+ }
66
+ try {
67
+ const address = server.address();
68
+ const port = address && typeof address === "object" ? address.port : 0;
69
+ const redirectUri = `http://localhost:${port}/callback`;
70
+ const token = await exchangeCodeForToken(code, redirectUri);
71
+ await setToken(token);
72
+ res.writeHead(200, { "Content-Type": "text/html" });
73
+ res.end("<html><body><h2>Authenticated successfully.</h2><p>You can close this tab.</p></body></html>");
74
+ console.log("Authenticated successfully.");
75
+ }
76
+ catch (err) {
77
+ const message = err instanceof Error ? err.message : "Unknown error";
78
+ res.writeHead(500, { "Content-Type": "text/plain" });
79
+ res.end(`Authentication failed: ${message}`);
80
+ console.error(`Authentication failed: ${message}`);
81
+ }
82
+ finally {
83
+ clearTimeout(timeout);
84
+ server.close();
85
+ resolve();
86
+ }
87
+ });
88
+ const timeout = setTimeout(() => {
89
+ console.error("Authentication timed out. Try again with: demofly auth login");
90
+ server.close();
91
+ process.exit(1);
92
+ }, LOGIN_TIMEOUT_MS);
93
+ server.on("error", (err) => {
94
+ clearTimeout(timeout);
95
+ reject(new Error(`Failed to start auth server: ${err.message}`));
96
+ });
97
+ server.listen(0, () => {
98
+ const address = server.address();
99
+ const port = address && typeof address === "object" ? address.port : 0;
100
+ const redirectUri = `http://localhost:${port}/callback`;
101
+ const authorizeUrl = `${AUTH_BASE}/authorize?client_id=${CLIENT_ID}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code`;
102
+ console.log("Opening browser for authentication...");
103
+ openBrowser(authorizeUrl);
104
+ console.log("Waiting for authentication (timeout in 120s)...");
105
+ });
106
+ });
107
+ });
108
+ }
109
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerLogoutCommand(auth: Command): void;
3
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAkBzD"}
@@ -0,0 +1,21 @@
1
+ import {} from "commander";
2
+ import { deleteToken, getTokenSource } from "../../lib/credentials.js";
3
+ export function registerLogoutCommand(auth) {
4
+ auth
5
+ .command("logout")
6
+ .description("Remove stored demofly credentials")
7
+ .action(async () => {
8
+ const source = await getTokenSource();
9
+ if (source === "keychain" || source === "file") {
10
+ await deleteToken();
11
+ console.log("Logged out successfully.");
12
+ }
13
+ else if (source === "env") {
14
+ console.log("Credentials are set via DEMOFLY_TOKEN environment variable. Unset it to log out.");
15
+ }
16
+ else {
17
+ console.log("Not currently logged in.");
18
+ }
19
+ });
20
+ }
21
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YAC/C,MAAM,WAAW,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;aAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CACT,kFAAkF,CACnF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerStatusCommand(auth: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAwBzD"}
@@ -0,0 +1,25 @@
1
+ import {} from "commander";
2
+ import { getTokenSource } from "../../lib/credentials.js";
3
+ export function registerStatusCommand(auth) {
4
+ auth
5
+ .command("status")
6
+ .description("Show current authentication status")
7
+ .action(async () => {
8
+ const source = await getTokenSource();
9
+ switch (source) {
10
+ case "env":
11
+ console.log("Authenticated via DEMOFLY_TOKEN environment variable");
12
+ break;
13
+ case "keychain":
14
+ console.log("Logged in (via keychain)");
15
+ break;
16
+ case "file":
17
+ console.log("Logged in (via config file)");
18
+ break;
19
+ default:
20
+ console.log("Not authenticated. Run: demofly auth login");
21
+ break;
22
+ }
23
+ });
24
+ }
25
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,OAAO,CAAC,GAAG,CACT,sDAAsD,CACvD,CAAC;gBACF,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,MAAM;YACR;gBACE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerGenerateCommand(program: Command): void;
3
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkTzC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwK9D"}
@@ -0,0 +1,373 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, mkdirSync, readdirSync, writeFileSync, readFileSync, copyFileSync, } from "node:fs";
3
+ import { resolve, basename, extname } from "node:path";
4
+ import * as readline from "node:readline";
5
+ import { parseTimingMarkers } from "../lib/timing.js";
6
+ function validateProjectArtifacts(projectDir, project) {
7
+ const specPath = resolve(projectDir, "demo.spec.ts");
8
+ const configPath = resolve(projectDir, "playwright.config.ts");
9
+ let valid = true;
10
+ if (!existsSync(specPath)) {
11
+ console.error(`No demo.spec.ts found in demofly/${project}/. Create one with /demofly:create ${project} in Claude Code.`);
12
+ valid = false;
13
+ }
14
+ if (!existsSync(configPath)) {
15
+ console.error(`No playwright.config.ts found in demofly/${project}/. Create one with /demofly:create ${project} in Claude Code.`);
16
+ valid = false;
17
+ }
18
+ return valid;
19
+ }
20
+ function runPlaywrightTest(projectDir, project) {
21
+ const specPath = `demofly/${project}/demo.spec.ts`;
22
+ const configPath = `demofly/${project}/playwright.config.ts`;
23
+ const cmd = `npx playwright test ${specPath} --config ${configPath}`;
24
+ console.log(`Running: ${cmd}\n`);
25
+ try {
26
+ const output = execSync(cmd, {
27
+ encoding: "utf-8",
28
+ timeout: 600_000,
29
+ stdio: ["pipe", "pipe", "pipe"],
30
+ cwd: resolve(projectDir, "..", ".."),
31
+ });
32
+ return output;
33
+ }
34
+ catch (error) {
35
+ const execError = error;
36
+ const stderr = execError.stderr ?? "";
37
+ const stdout = execError.stdout ?? "";
38
+ console.error("Playwright test failed.\n");
39
+ if (stderr) {
40
+ console.error(stderr);
41
+ }
42
+ if (stdout) {
43
+ console.error(stdout);
44
+ }
45
+ process.exit(1);
46
+ }
47
+ }
48
+ function ensureRecordingsDir(projectDir) {
49
+ const recordingsDir = resolve(projectDir, "recordings");
50
+ if (!existsSync(recordingsDir)) {
51
+ mkdirSync(recordingsDir, { recursive: true });
52
+ }
53
+ return recordingsDir;
54
+ }
55
+ function writeTimingJson(recordingsDir, timingData) {
56
+ const timingPath = resolve(recordingsDir, "timing.json");
57
+ writeFileSync(timingPath, JSON.stringify(timingData, null, 2), "utf-8");
58
+ return timingPath;
59
+ }
60
+ function findRecordedVideo(projectDir) {
61
+ const testResultsDir = resolve(projectDir, "..", "..", "test-results");
62
+ if (!existsSync(testResultsDir)) {
63
+ return null;
64
+ }
65
+ return findVideoRecursive(testResultsDir);
66
+ }
67
+ function findVideoRecursive(dir) {
68
+ const entries = readdirSync(dir, { withFileTypes: true });
69
+ for (const entry of entries) {
70
+ const fullPath = resolve(dir, entry.name);
71
+ if (entry.isFile() && entry.name.endsWith(".webm")) {
72
+ return fullPath;
73
+ }
74
+ if (entry.isDirectory()) {
75
+ const found = findVideoRecursive(fullPath);
76
+ if (found) {
77
+ return found;
78
+ }
79
+ }
80
+ }
81
+ return null;
82
+ }
83
+ function findAudioFiles(projectDir, timingData) {
84
+ const audioDir = resolve(projectDir, "audio");
85
+ if (!existsSync(audioDir)) {
86
+ return { matched: [], missing: [] };
87
+ }
88
+ const audioFiles = readdirSync(audioDir).filter((f) => {
89
+ const ext = extname(f).toLowerCase();
90
+ return [".mp3", ".wav", ".aac", ".m4a", ".ogg"].includes(ext);
91
+ });
92
+ const audioBySceneId = new Map();
93
+ for (const file of audioFiles) {
94
+ const sceneId = basename(file, extname(file));
95
+ audioBySceneId.set(sceneId, resolve(audioDir, file));
96
+ }
97
+ const matched = [];
98
+ const missing = [];
99
+ for (const scene of timingData.scenes) {
100
+ const audioPath = audioBySceneId.get(scene.sceneId);
101
+ if (audioPath) {
102
+ matched.push({ sceneId: scene.sceneId, filePath: audioPath });
103
+ }
104
+ else {
105
+ missing.push(scene.sceneId);
106
+ }
107
+ }
108
+ return { matched, missing };
109
+ }
110
+ function buildFfmpegCommand(videoPath, audioMatches, timingData, outputPath) {
111
+ const sceneMap = new Map(timingData.scenes.map((s) => [s.sceneId, s]));
112
+ const inputArgs = ["-i", videoPath];
113
+ const filterParts = [];
114
+ for (let i = 0; i < audioMatches.length; i++) {
115
+ const match = audioMatches[i];
116
+ const scene = sceneMap.get(match.sceneId);
117
+ if (!scene)
118
+ continue;
119
+ inputArgs.push("-i", match.filePath);
120
+ const audioIndex = i + 1;
121
+ const delayMs = scene.startMs;
122
+ filterParts.push(`[${audioIndex}:a]adelay=${delayMs}|${delayMs}[a${audioIndex}]`);
123
+ }
124
+ const mixInputs = filterParts
125
+ .map((_, i) => `[a${i + 1}]`)
126
+ .join("");
127
+ const filterComplex = filterParts.join("; ") +
128
+ `; ${mixInputs}amix=inputs=${audioMatches.length}:normalize=0[aout]`;
129
+ const args = [
130
+ "ffmpeg",
131
+ "-y",
132
+ ...inputArgs,
133
+ "-filter_complex",
134
+ `"${filterComplex}"`,
135
+ "-map",
136
+ "0:v",
137
+ "-map",
138
+ "[aout]",
139
+ "-c:v",
140
+ "libx264",
141
+ "-preset",
142
+ "fast",
143
+ "-crf",
144
+ "23",
145
+ "-pix_fmt",
146
+ "yuv420p",
147
+ "-shortest",
148
+ outputPath,
149
+ ];
150
+ return args.join(" ");
151
+ }
152
+ function stitchAudio(videoPath, audioMatches, timingData, recordingsDir) {
153
+ const outputPath = resolve(recordingsDir, "final.mp4");
154
+ const cmd = buildFfmpegCommand(videoPath, audioMatches, timingData, outputPath);
155
+ console.log(`Stitching audio with ffmpeg...\n`);
156
+ try {
157
+ execSync(cmd, {
158
+ encoding: "utf-8",
159
+ timeout: 600_000,
160
+ stdio: ["pipe", "pipe", "pipe"],
161
+ });
162
+ return outputPath;
163
+ }
164
+ catch (error) {
165
+ const execError = error;
166
+ console.error("ffmpeg stitching failed:");
167
+ if (execError.stderr) {
168
+ console.error(execError.stderr);
169
+ }
170
+ return null;
171
+ }
172
+ }
173
+ function formatDuration(ms) {
174
+ const totalSeconds = Math.floor(ms / 1000);
175
+ const minutes = Math.floor(totalSeconds / 60);
176
+ const seconds = totalSeconds % 60;
177
+ if (minutes > 0) {
178
+ return `${minutes}m ${seconds}s`;
179
+ }
180
+ return `${seconds}s`;
181
+ }
182
+ function printSummary(videoPath, timingPath, finalPath, timingData) {
183
+ console.log("\n--- demofly generate summary ---\n");
184
+ if (videoPath) {
185
+ console.log(` Video: ${videoPath}`);
186
+ }
187
+ console.log(` Timing: ${timingPath}`);
188
+ if (finalPath) {
189
+ console.log(` Final: ${finalPath}`);
190
+ console.log(` Stitched: yes`);
191
+ }
192
+ else {
193
+ console.log(` Stitched: no`);
194
+ }
195
+ console.log(` Duration: ${formatDuration(timingData.totalDuration)}`);
196
+ console.log(` Scenes: ${timingData.scenes.length}`);
197
+ console.log();
198
+ }
199
+ function recordDemo(projectDir, project) {
200
+ const stdout = runPlaywrightTest(projectDir, project);
201
+ const timingData = parseTimingMarkers(stdout);
202
+ const recordingsDir = ensureRecordingsDir(projectDir);
203
+ writeTimingJson(recordingsDir, timingData);
204
+ const videoPath = findRecordedVideo(projectDir);
205
+ if (videoPath) {
206
+ const destPath = resolve(recordingsDir, "video.webm");
207
+ execSync(`cp "${videoPath}" "${destPath}"`);
208
+ }
209
+ return { stdout, videoPath };
210
+ }
211
+ function promptYesNo(question) {
212
+ return new Promise((res) => {
213
+ const rl = readline.createInterface({
214
+ input: process.stdin,
215
+ output: process.stdout,
216
+ });
217
+ rl.question(`${question} (y/n) `, (answer) => {
218
+ rl.close();
219
+ res(answer.toLowerCase().startsWith("y"));
220
+ });
221
+ });
222
+ }
223
+ function hasFfmpeg() {
224
+ try {
225
+ execSync("ffmpeg -version", { stdio: "pipe" });
226
+ return true;
227
+ }
228
+ catch {
229
+ return false;
230
+ }
231
+ }
232
+ export function registerGenerateCommand(program) {
233
+ program
234
+ .command("generate <project>")
235
+ .description("Assemble a demo video from existing artifacts")
236
+ .option("--record", "Run Playwright recording before assembly")
237
+ .option("--narrate", "REMOVED: use `demofly tts` instead")
238
+ .action(async (project, opts) => {
239
+ // Migration check for removed --narrate flag
240
+ if (opts.narrate) {
241
+ console.error("--narrate has been removed. Use `demofly tts` to generate narration, then `demofly generate` to assemble.");
242
+ process.exit(1);
243
+ }
244
+ const projectDir = resolve(process.cwd(), "demofly", project);
245
+ // Step 1: Validate artifacts exist
246
+ if (!validateProjectArtifacts(projectDir, project)) {
247
+ process.exit(1);
248
+ }
249
+ const recordingsDir = ensureRecordingsDir(projectDir);
250
+ let videoPath = null;
251
+ let timingData;
252
+ let timingPath;
253
+ // Step 2: Record or use existing artifacts
254
+ if (opts.record) {
255
+ const result = recordDemo(projectDir, project);
256
+ videoPath = result.videoPath
257
+ ? resolve(recordingsDir, "video.webm")
258
+ : null;
259
+ const stdout = result.stdout;
260
+ timingData = parseTimingMarkers(stdout);
261
+ timingPath = resolve(recordingsDir, "timing.json");
262
+ if (timingData.scenes.length === 0) {
263
+ console.warn("Warning: No DEMOFLY timing markers found in test output. Video was still recorded.");
264
+ }
265
+ }
266
+ else {
267
+ // Assembler-first: look for existing artifacts
268
+ const existingVideo = resolve(recordingsDir, "video.webm");
269
+ const existingTiming = resolve(recordingsDir, "timing.json");
270
+ const hasVideo = existsSync(existingVideo);
271
+ const hasTiming = existsSync(existingTiming);
272
+ if (!hasVideo || !hasTiming) {
273
+ const missingParts = [];
274
+ if (!hasVideo)
275
+ missingParts.push("recordings/video.webm");
276
+ if (!hasTiming)
277
+ missingParts.push("recordings/timing.json");
278
+ const missingMsg = `Missing artifacts: ${missingParts.join(", ")}`;
279
+ if (process.stdin.isTTY) {
280
+ console.warn(missingMsg);
281
+ const shouldRecord = await promptYesNo("No existing artifacts found. Run Playwright recording now?");
282
+ if (shouldRecord) {
283
+ const result = recordDemo(projectDir, project);
284
+ videoPath = result.videoPath
285
+ ? resolve(recordingsDir, "video.webm")
286
+ : null;
287
+ timingData = parseTimingMarkers(result.stdout);
288
+ timingPath = resolve(recordingsDir, "timing.json");
289
+ if (timingData.scenes.length === 0) {
290
+ console.warn("Warning: No DEMOFLY timing markers found in test output. Video was still recorded.");
291
+ }
292
+ }
293
+ else {
294
+ console.log("Aborted. Run `demofly generate --record` to record first.");
295
+ process.exit(0);
296
+ }
297
+ }
298
+ else {
299
+ console.error(`${missingMsg}\nRun \`demofly generate ${project} --record\` to record artifacts first.`);
300
+ process.exit(1);
301
+ }
302
+ // If we fell through from the prompt path, videoPath/timingData are set above.
303
+ // TypeScript needs a definite assignment check, but the logic guarantees
304
+ // that if we reach here without exiting, the variables were assigned.
305
+ // We use the ! assertion below since the only path here is the shouldRecord=true branch.
306
+ }
307
+ // If we didn't record (existing artifacts found), load from disk
308
+ if (!videoPath) {
309
+ videoPath = existingVideo;
310
+ timingData = JSON.parse(readFileSync(existingTiming, "utf-8"));
311
+ timingPath = existingTiming;
312
+ }
313
+ else {
314
+ // videoPath was set during the prompt-triggered recording above
315
+ timingData = timingData;
316
+ timingPath = timingPath;
317
+ }
318
+ }
319
+ // Step 3: Find audio files and check ffmpeg
320
+ const { matched, missing } = findAudioFiles(projectDir, timingData);
321
+ let finalPath = null;
322
+ if (matched.length > 0) {
323
+ if (!hasFfmpeg()) {
324
+ console.error("Audio files found but ffmpeg is not installed. Install ffmpeg to stitch audio with video.");
325
+ process.exit(1);
326
+ }
327
+ if (missing.length > 0) {
328
+ console.warn(`Warning: No audio files found for scenes: ${missing.join(", ")}`);
329
+ }
330
+ finalPath = stitchAudio(videoPath, matched, timingData, recordingsDir);
331
+ }
332
+ else if (videoPath) {
333
+ // No audio — copy or convert video as final output
334
+ if (hasFfmpeg()) {
335
+ // Convert webm to mp4 for compatibility
336
+ const outputPath = resolve(recordingsDir, "final.mp4");
337
+ console.log("No audio files found. Converting video to mp4...\n");
338
+ try {
339
+ execSync(`ffmpeg -y -i "${videoPath}" -c:v libx264 -preset fast -crf 23 -pix_fmt yuv420p "${outputPath}"`, { encoding: "utf-8", timeout: 600_000, stdio: ["pipe", "pipe", "pipe"] });
340
+ finalPath = outputPath;
341
+ }
342
+ catch (error) {
343
+ const execError = error;
344
+ console.error("ffmpeg conversion failed:");
345
+ if (execError.stderr) {
346
+ console.error(execError.stderr);
347
+ }
348
+ }
349
+ }
350
+ else {
351
+ // No ffmpeg — copy webm as-is
352
+ const outputPath = resolve(recordingsDir, "final.webm");
353
+ console.log("No audio and no ffmpeg. Copying video as-is.\n");
354
+ copyFileSync(videoPath, outputPath);
355
+ finalPath = outputPath;
356
+ }
357
+ }
358
+ else {
359
+ console.warn("Warning: No recorded video found. Skipping assembly.");
360
+ }
361
+ // Step 4: Print summary
362
+ printSummary(videoPath, timingPath, finalPath, timingData);
363
+ });
364
+ // Hide the --narrate option from help output
365
+ const generateCmd = program.commands.find((c) => c.name() === "generate");
366
+ if (generateCmd) {
367
+ const narrateOpt = generateCmd.options.find((o) => o.long === "--narrate");
368
+ if (narrateOpt) {
369
+ narrateOpt.hidden = true;
370
+ }
371
+ }
372
+ }
373
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerInitCommand(program: Command): void;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAobzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0B1D"}