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.
- package/dist/commands/auth/index.d.ts +3 -0
- package/dist/commands/auth/index.d.ts.map +1 -0
- package/dist/commands/auth/index.js +13 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +3 -0
- package/dist/commands/auth/login.d.ts.map +1 -0
- package/dist/commands/auth/login.js +109 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +3 -0
- package/dist/commands/auth/logout.d.ts.map +1 -0
- package/dist/commands/auth/logout.js +21 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/status.d.ts +3 -0
- package/dist/commands/auth/status.d.ts.map +1 -0
- package/dist/commands/auth/status.js +25 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +373 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +384 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/projects/delete.d.ts +3 -0
- package/dist/commands/projects/delete.d.ts.map +1 -0
- package/dist/commands/projects/delete.js +41 -0
- package/dist/commands/projects/delete.js.map +1 -0
- package/dist/commands/projects/get.d.ts +3 -0
- package/dist/commands/projects/get.d.ts.map +1 -0
- package/dist/commands/projects/get.js +30 -0
- package/dist/commands/projects/get.js.map +1 -0
- package/dist/commands/projects/index.d.ts +3 -0
- package/dist/commands/projects/index.d.ts.map +1 -0
- package/dist/commands/projects/index.js +17 -0
- package/dist/commands/projects/index.js.map +1 -0
- package/dist/commands/projects/list.d.ts +3 -0
- package/dist/commands/projects/list.d.ts.map +1 -0
- package/dist/commands/projects/list.js +40 -0
- package/dist/commands/projects/list.js.map +1 -0
- package/dist/commands/projects/open.d.ts +3 -0
- package/dist/commands/projects/open.d.ts.map +1 -0
- package/dist/commands/projects/open.js +45 -0
- package/dist/commands/projects/open.js.map +1 -0
- package/dist/commands/projects/update.d.ts +3 -0
- package/dist/commands/projects/update.d.ts.map +1 -0
- package/dist/commands/projects/update.js +31 -0
- package/dist/commands/projects/update.js.map +1 -0
- package/dist/commands/push.d.ts +3 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +86 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/tts.d.ts +3 -0
- package/dist/commands/tts.d.ts.map +1 -0
- package/dist/commands/tts.js +44 -0
- package/dist/commands/tts.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +13 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +58 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/credentials.d.ts +5 -0
- package/dist/lib/credentials.d.ts.map +1 -0
- package/dist/lib/credentials.js +101 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/timing.d.ts +29 -0
- package/dist/lib/timing.d.ts.map +1 -0
- package/dist/lib/timing.js +145 -0
- package/dist/lib/timing.js.map +1 -0
- package/dist/lib/tts.d.ts +42 -0
- package/dist/lib/tts.d.ts.map +1 -0
- package/dist/lib/tts.js +198 -0
- package/dist/lib/tts.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/projects/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMvE,SAAS,OAAO,CAAC,GAAW;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,GAAW,CAAC;IAChB,IAAI,IAAc,CAAC;IAEnB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,GAAG,GAAG,MAAM,CAAC;QACb,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;SAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAChC,GAAG,GAAG,KAAK,CAAC;QACZ,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,UAAU,CAAC;QACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAED,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,QAAQ;SACL,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,GAAG,CAC9B,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE,CACxC,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACpF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAuC7D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {} from "commander";
|
|
2
|
+
import { createApiClient, requireAuth } from "../../lib/api-client.js";
|
|
3
|
+
export function registerUpdateCommand(projects) {
|
|
4
|
+
projects
|
|
5
|
+
.command("update <name>")
|
|
6
|
+
.description("Update a project")
|
|
7
|
+
.option("--name <newName>", "New project name")
|
|
8
|
+
.option("--description <description>", "New project description")
|
|
9
|
+
.action(async (name, opts) => {
|
|
10
|
+
if (!opts.name && !opts.description) {
|
|
11
|
+
console.error("No updates specified. Use --name or --description.");
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const token = await requireAuth();
|
|
15
|
+
const client = createApiClient(token);
|
|
16
|
+
const payload = {};
|
|
17
|
+
if (opts.name)
|
|
18
|
+
payload.name = opts.name;
|
|
19
|
+
if (opts.description)
|
|
20
|
+
payload.description = opts.description;
|
|
21
|
+
try {
|
|
22
|
+
const result = await client.put(`/projects/${encodeURIComponent(name)}`, payload);
|
|
23
|
+
console.log(`Updated project '${result.name}'.`);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
console.error(`Failed to update project: ${error instanceof Error ? error.message : String(error)}`);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/commands/projects/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAYvE,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;SAC9C,MAAM,CAAC,6BAA6B,EAAE,yBAAyB,CAAC;SAChE,MAAM,CACL,KAAK,EACH,IAAY,EACZ,IAA6C,EAC7C,EAAE;QACF,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO,CAAC,KAAK,CACX,oDAAoD,CACrD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtC,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACxC,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAE7D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE,EACvC,OAAO,CACR,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACtF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAgDzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqE1D"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {} from "commander";
|
|
2
|
+
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createApiClient, requireAuth } from "../lib/api-client.js";
|
|
5
|
+
const REQUIRED_FILES = [
|
|
6
|
+
"demo.spec.ts",
|
|
7
|
+
"playwright.config.ts",
|
|
8
|
+
"proposal.md",
|
|
9
|
+
"script.md",
|
|
10
|
+
];
|
|
11
|
+
const OPTIONAL_FILES = ["transcript.md"];
|
|
12
|
+
function readProjectFile(projectDir, filename) {
|
|
13
|
+
return readFileSync(join(projectDir, filename), "utf-8");
|
|
14
|
+
}
|
|
15
|
+
function readAudioFiles(projectDir) {
|
|
16
|
+
const audioDir = join(projectDir, "audio");
|
|
17
|
+
const audio = {};
|
|
18
|
+
if (!existsSync(audioDir)) {
|
|
19
|
+
return audio;
|
|
20
|
+
}
|
|
21
|
+
const entries = readdirSync(audioDir, { withFileTypes: true });
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
if (!entry.isFile())
|
|
24
|
+
continue;
|
|
25
|
+
const filePath = join(audioDir, entry.name);
|
|
26
|
+
const buffer = readFileSync(filePath);
|
|
27
|
+
audio[entry.name] = buffer.toString("base64");
|
|
28
|
+
}
|
|
29
|
+
return audio;
|
|
30
|
+
}
|
|
31
|
+
export function registerPushCommand(program) {
|
|
32
|
+
program
|
|
33
|
+
.command("push <project>")
|
|
34
|
+
.description("Push a demo project to demofly cloud")
|
|
35
|
+
.action(async (project) => {
|
|
36
|
+
const token = await requireAuth();
|
|
37
|
+
const projectDir = join(process.cwd(), "demofly", project);
|
|
38
|
+
for (const file of REQUIRED_FILES) {
|
|
39
|
+
const filePath = join(projectDir, file);
|
|
40
|
+
if (!existsSync(filePath)) {
|
|
41
|
+
console.error(`Missing required file: demofly/${project}/${file}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const artifacts = {};
|
|
46
|
+
for (const file of REQUIRED_FILES) {
|
|
47
|
+
artifacts[file] = readProjectFile(projectDir, file);
|
|
48
|
+
}
|
|
49
|
+
for (const file of OPTIONAL_FILES) {
|
|
50
|
+
const filePath = join(projectDir, file);
|
|
51
|
+
if (existsSync(filePath)) {
|
|
52
|
+
artifacts[file] = readProjectFile(projectDir, file);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const audio = readAudioFiles(projectDir);
|
|
56
|
+
const payload = { artifacts, audio };
|
|
57
|
+
const client = createApiClient(token);
|
|
58
|
+
try {
|
|
59
|
+
const response = await client.post(`/projects/${encodeURIComponent(project)}/push`, payload);
|
|
60
|
+
if (response.errors && response.errors.length > 0) {
|
|
61
|
+
console.error("Push rejected:");
|
|
62
|
+
for (const error of response.errors) {
|
|
63
|
+
console.error(` - ${error}`);
|
|
64
|
+
}
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
if (response.warnings && response.warnings.length > 0) {
|
|
68
|
+
console.warn("Warnings:");
|
|
69
|
+
for (const warning of response.warnings) {
|
|
70
|
+
console.warn(` - ${warning}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (response.url) {
|
|
74
|
+
console.log(`Pushed successfully: ${response.url}`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
console.log("Push completed successfully.");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error(`Push failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tts.d.ts","sourceRoot":"","sources":["../../src/commands/tts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8CzD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {} from "commander";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { generateAllAudio } from "../lib/tts.js";
|
|
5
|
+
export function registerTtsCommand(program) {
|
|
6
|
+
program
|
|
7
|
+
.command("tts <project>")
|
|
8
|
+
.description("Generate TTS audio from a project's transcript.md")
|
|
9
|
+
.option("--voice <name>", "TTS voice name", "af_heart")
|
|
10
|
+
.option("--speed <multiplier>", "TTS speed multiplier", "1.0")
|
|
11
|
+
.action((project, opts) => {
|
|
12
|
+
const projectDir = resolve(process.cwd(), "demofly", project);
|
|
13
|
+
const transcriptPath = resolve(projectDir, "transcript.md");
|
|
14
|
+
if (!existsSync(transcriptPath)) {
|
|
15
|
+
console.error(`No transcript.md found in demofly/${project}/. Generate one with /demofly:create ${project} in Claude Code.`);
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const ttsOpts = {
|
|
19
|
+
voice: opts.voice,
|
|
20
|
+
speed: parseFloat(opts.speed),
|
|
21
|
+
};
|
|
22
|
+
console.log(`Generating TTS audio for project "${project}"...\n`);
|
|
23
|
+
try {
|
|
24
|
+
const results = generateAllAudio(transcriptPath, projectDir, ttsOpts);
|
|
25
|
+
if (results.length === 0) {
|
|
26
|
+
console.log("No scenes found in transcript. Nothing to generate.");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const totalDuration = results.reduce((sum, r) => sum + r.durationS, 0);
|
|
30
|
+
const peakMemory = Math.max(...results.map((r) => r.peakMemoryMb));
|
|
31
|
+
console.log("\n--- demofly tts summary ---\n");
|
|
32
|
+
console.log(` Scenes: ${results.length}`);
|
|
33
|
+
console.log(` Duration: ${totalDuration.toFixed(1)}s`);
|
|
34
|
+
console.log(` Peak memory: ${peakMemory.toFixed(0)}MB`);
|
|
35
|
+
console.log();
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
39
|
+
console.error(`TTS generation failed: ${message}`);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=tts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../src/commands/tts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,CAAC;SACtD,MAAM,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,KAAK,CAAC;SAC7D,MAAM,CAAC,CAAC,OAAe,EAAE,IAAsC,EAAE,EAAE;QAClE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC9D,MAAM,cAAc,GAAG,OAAO,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAE5D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CACX,qCAAqC,OAAO,wCAAwC,OAAO,kBAAkB,CAC9G,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAe;YAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;SAC9B,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,QAAQ,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAEtE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YAED,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACvE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YAEnE,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,kBAAkB,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { program } from "commander";
|
|
3
|
+
import { registerInitCommand } from "./commands/init.js";
|
|
4
|
+
import { registerGenerateCommand } from "./commands/generate.js";
|
|
5
|
+
import { registerTtsCommand } from "./commands/tts.js";
|
|
6
|
+
import { registerAuthCommands } from "./commands/auth/index.js";
|
|
7
|
+
import { registerPushCommand } from "./commands/push.js";
|
|
8
|
+
import { registerProjectsCommands } from "./commands/projects/index.js";
|
|
9
|
+
const nodeVersion = parseInt(process.versions.node.split(".")[0], 10);
|
|
10
|
+
if (nodeVersion < 22) {
|
|
11
|
+
console.error(`demofly requires Node.js 22 or higher (found v${process.versions.node})`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
program
|
|
15
|
+
.name("demofly")
|
|
16
|
+
.version("0.1.1")
|
|
17
|
+
.description("CLI for demofly — automated demo video generation");
|
|
18
|
+
registerInitCommand(program);
|
|
19
|
+
registerGenerateCommand(program);
|
|
20
|
+
registerTtsCommand(program);
|
|
21
|
+
registerAuthCommands(program);
|
|
22
|
+
registerPushCommand(program);
|
|
23
|
+
registerProjectsCommands(program);
|
|
24
|
+
program.parse();
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;IACrB,OAAO,CAAC,KAAK,CACX,iDAAiD,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CAC1E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC,CAAC;AAEpE,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class ApiClient {
|
|
2
|
+
private baseUrl;
|
|
3
|
+
private token;
|
|
4
|
+
constructor(baseUrl: string, token: string);
|
|
5
|
+
get<T>(path: string): Promise<T>;
|
|
6
|
+
post<T>(path: string, body: unknown): Promise<T>;
|
|
7
|
+
put<T>(path: string, body: unknown): Promise<T>;
|
|
8
|
+
delete(path: string): Promise<void>;
|
|
9
|
+
private request;
|
|
10
|
+
}
|
|
11
|
+
export declare function createApiClient(token: string): ApiClient;
|
|
12
|
+
export declare function requireAuth(): Promise<string>;
|
|
13
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAIA,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;gBAEV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAKpC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAI/C,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAI3B,OAAO;CAkCtB;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAExD;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAOnD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getToken } from "./credentials.js";
|
|
2
|
+
const DEFAULT_BASE_URL = "https://api.demofly.dev";
|
|
3
|
+
export class ApiClient {
|
|
4
|
+
baseUrl;
|
|
5
|
+
token;
|
|
6
|
+
constructor(baseUrl, token) {
|
|
7
|
+
this.baseUrl = baseUrl;
|
|
8
|
+
this.token = token;
|
|
9
|
+
}
|
|
10
|
+
async get(path) {
|
|
11
|
+
return this.request("GET", path);
|
|
12
|
+
}
|
|
13
|
+
async post(path, body) {
|
|
14
|
+
return this.request("POST", path, body);
|
|
15
|
+
}
|
|
16
|
+
async put(path, body) {
|
|
17
|
+
return this.request("PUT", path, body);
|
|
18
|
+
}
|
|
19
|
+
async delete(path) {
|
|
20
|
+
await this.request("DELETE", path);
|
|
21
|
+
}
|
|
22
|
+
async request(method, path, body) {
|
|
23
|
+
const url = `${this.baseUrl}${path}`;
|
|
24
|
+
const headers = {
|
|
25
|
+
Authorization: `Bearer ${this.token}`,
|
|
26
|
+
"Content-Type": "application/json",
|
|
27
|
+
};
|
|
28
|
+
const init = { method, headers };
|
|
29
|
+
if (body !== undefined) {
|
|
30
|
+
init.body = JSON.stringify(body);
|
|
31
|
+
}
|
|
32
|
+
const response = await fetch(url, init);
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
const text = await response.text();
|
|
35
|
+
throw new Error(`API request failed (${response.status}): ${text}`);
|
|
36
|
+
}
|
|
37
|
+
if (response.status === 204) {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
const contentType = response.headers.get("content-type");
|
|
41
|
+
if (contentType?.includes("application/json")) {
|
|
42
|
+
return (await response.json());
|
|
43
|
+
}
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function createApiClient(token) {
|
|
48
|
+
return new ApiClient(DEFAULT_BASE_URL, token);
|
|
49
|
+
}
|
|
50
|
+
export async function requireAuth() {
|
|
51
|
+
const token = await getToken();
|
|
52
|
+
if (!token) {
|
|
53
|
+
console.error("Not authenticated. Run: demofly auth login");
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
return token;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/lib/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,MAAM,gBAAgB,GAAG,yBAAyB,CAAC;AAEnD,MAAM,OAAO,SAAS;IACZ,OAAO,CAAS;IAChB,KAAK,CAAS;IAEtB,YAAY,OAAe,EAAE,KAAa;QACxC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,IAAY;QACvB,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,IAAY,EAAE,IAAa;QACvC,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,IAAa;QACtC,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,IAAI,CAAC,OAAO,CAAO,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,MAAc,EACd,IAAY,EACZ,IAAc;QAEd,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B;YACtC,aAAa,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACrC,cAAc,EAAE,kBAAkB;SACnC,CAAC;QAEF,MAAM,IAAI,GAAgB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,SAAc,CAAC;QACxB,CAAC;QAED,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,WAAW,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;QACtC,CAAC;QAED,OAAO,SAAc,CAAC;IACxB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,IAAI,SAAS,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,KAAK,GAAG,MAAM,QAAQ,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function getToken(): Promise<string | null>;
|
|
2
|
+
export declare function setToken(token: string): Promise<void>;
|
|
3
|
+
export declare function deleteToken(): Promise<void>;
|
|
4
|
+
export declare function getTokenSource(): Promise<string | null>;
|
|
5
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAqFA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQvD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK7D"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { execSync, spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
const KEYCHAIN_SERVICE = "demofly";
|
|
6
|
+
const KEYCHAIN_ACCOUNT = "demofly-token";
|
|
7
|
+
const CONFIG_DIR = join(homedir(), ".config", "demofly");
|
|
8
|
+
const CREDENTIALS_FILE = join(CONFIG_DIR, "credentials.json");
|
|
9
|
+
const ENV_VAR = "DEMOFLY_TOKEN";
|
|
10
|
+
function isMacOS() {
|
|
11
|
+
return process.platform === "darwin";
|
|
12
|
+
}
|
|
13
|
+
function tryKeychainRead() {
|
|
14
|
+
if (!isMacOS())
|
|
15
|
+
return null;
|
|
16
|
+
try {
|
|
17
|
+
const token = execSync(`security find-generic-password -s ${KEYCHAIN_SERVICE} -a ${KEYCHAIN_ACCOUNT} -w`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
18
|
+
return token || null;
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function tryKeychainWrite(token) {
|
|
25
|
+
if (!isMacOS())
|
|
26
|
+
return false;
|
|
27
|
+
try {
|
|
28
|
+
const result = spawnSync("security", ["add-generic-password", "-s", KEYCHAIN_SERVICE, "-a", KEYCHAIN_ACCOUNT, "-w", token, "-U"], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
29
|
+
return result.status === 0;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function tryKeychainDelete() {
|
|
36
|
+
if (!isMacOS())
|
|
37
|
+
return;
|
|
38
|
+
try {
|
|
39
|
+
execSync(`security delete-generic-password -s ${KEYCHAIN_SERVICE} -a ${KEYCHAIN_ACCOUNT}`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Keychain entry may not exist; ignore
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function tryFileRead() {
|
|
46
|
+
try {
|
|
47
|
+
if (!existsSync(CREDENTIALS_FILE))
|
|
48
|
+
return null;
|
|
49
|
+
const raw = readFileSync(CREDENTIALS_FILE, "utf-8");
|
|
50
|
+
const data = JSON.parse(raw);
|
|
51
|
+
return data.token ?? null;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function writeFile(token) {
|
|
58
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
59
|
+
writeFileSync(CREDENTIALS_FILE, JSON.stringify({ token }, null, 2) + "\n", {
|
|
60
|
+
mode: 0o600,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function deleteFile() {
|
|
64
|
+
try {
|
|
65
|
+
if (existsSync(CREDENTIALS_FILE)) {
|
|
66
|
+
unlinkSync(CREDENTIALS_FILE);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// File may already be gone; ignore
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export async function getToken() {
|
|
74
|
+
const envToken = process.env[ENV_VAR];
|
|
75
|
+
if (envToken)
|
|
76
|
+
return envToken;
|
|
77
|
+
const keychainToken = tryKeychainRead();
|
|
78
|
+
if (keychainToken)
|
|
79
|
+
return keychainToken;
|
|
80
|
+
return tryFileRead();
|
|
81
|
+
}
|
|
82
|
+
export async function setToken(token) {
|
|
83
|
+
const stored = tryKeychainWrite(token);
|
|
84
|
+
if (!stored) {
|
|
85
|
+
writeFile(token);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
export async function deleteToken() {
|
|
89
|
+
tryKeychainDelete();
|
|
90
|
+
deleteFile();
|
|
91
|
+
}
|
|
92
|
+
export async function getTokenSource() {
|
|
93
|
+
if (process.env[ENV_VAR])
|
|
94
|
+
return "env";
|
|
95
|
+
if (tryKeychainRead())
|
|
96
|
+
return "keychain";
|
|
97
|
+
if (tryFileRead())
|
|
98
|
+
return "file";
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface TimingMarker {
|
|
2
|
+
action: string;
|
|
3
|
+
target: string;
|
|
4
|
+
ms: number;
|
|
5
|
+
}
|
|
6
|
+
export interface TimingScene {
|
|
7
|
+
sceneId: string;
|
|
8
|
+
startMs: number;
|
|
9
|
+
endMs: number;
|
|
10
|
+
markers: TimingMarker[];
|
|
11
|
+
}
|
|
12
|
+
export interface TimingData {
|
|
13
|
+
totalDuration: number;
|
|
14
|
+
scenes: TimingScene[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Normalize raw timing data (from disk) into the canonical TimingData shape.
|
|
18
|
+
* Accepts both camelCase (CLI-generated) and snake_case (plugin-generated) field names.
|
|
19
|
+
* Throws with a clear message if required fields are missing or malformed.
|
|
20
|
+
*
|
|
21
|
+
* Mapping:
|
|
22
|
+
* total_duration_ms | totalDurationMs → totalDuration
|
|
23
|
+
* id | scene_id → sceneId
|
|
24
|
+
* start_ms → startMs
|
|
25
|
+
* end_ms → endMs
|
|
26
|
+
*/
|
|
27
|
+
export declare function normalizeTimingData(raw: unknown): TimingData;
|
|
28
|
+
export declare function parseTimingMarkers(consoleOutput: string): TimingData;
|
|
29
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAqFD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAwE5D;AAED,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAsBpE"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
const VALID_ACTIONS = new Set([
|
|
2
|
+
"start",
|
|
3
|
+
"end",
|
|
4
|
+
"click",
|
|
5
|
+
"type-start",
|
|
6
|
+
"type-end",
|
|
7
|
+
"wait-start",
|
|
8
|
+
"wait-end",
|
|
9
|
+
"hover",
|
|
10
|
+
"scroll",
|
|
11
|
+
"navigate",
|
|
12
|
+
"pause",
|
|
13
|
+
]);
|
|
14
|
+
const MARKER_PATTERN = /^DEMOFLY\|([^|]+)\|([^|]+)\|([^|]*)\|(\d+)$/;
|
|
15
|
+
function parseMarkerLine(line) {
|
|
16
|
+
const match = line.trim().match(MARKER_PATTERN);
|
|
17
|
+
if (!match) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
const [, sceneId, action, target, msStr] = match;
|
|
21
|
+
if (!VALID_ACTIONS.has(action)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
sceneId,
|
|
26
|
+
action,
|
|
27
|
+
target,
|
|
28
|
+
ms: parseInt(msStr, 10),
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function groupByScene(markers) {
|
|
32
|
+
const groups = new Map();
|
|
33
|
+
for (const marker of markers) {
|
|
34
|
+
const existing = groups.get(marker.sceneId);
|
|
35
|
+
if (existing) {
|
|
36
|
+
existing.push(marker);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
groups.set(marker.sceneId, [marker]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return groups;
|
|
43
|
+
}
|
|
44
|
+
function buildScene(sceneId, rawMarkers) {
|
|
45
|
+
const markers = rawMarkers.map((m) => ({
|
|
46
|
+
action: m.action,
|
|
47
|
+
target: m.target,
|
|
48
|
+
ms: m.ms,
|
|
49
|
+
}));
|
|
50
|
+
const times = rawMarkers.map((m) => m.ms);
|
|
51
|
+
const startMs = Math.min(...times);
|
|
52
|
+
const endMs = Math.max(...times);
|
|
53
|
+
return { sceneId, startMs, endMs, markers };
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Coerce a value to a number, accepting number or numeric string.
|
|
57
|
+
*/
|
|
58
|
+
function asNumber(val) {
|
|
59
|
+
if (typeof val === "number")
|
|
60
|
+
return val;
|
|
61
|
+
if (typeof val === "string") {
|
|
62
|
+
const n = Number(val);
|
|
63
|
+
if (!Number.isNaN(n))
|
|
64
|
+
return n;
|
|
65
|
+
}
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Normalize raw timing data (from disk) into the canonical TimingData shape.
|
|
70
|
+
* Accepts both camelCase (CLI-generated) and snake_case (plugin-generated) field names.
|
|
71
|
+
* Throws with a clear message if required fields are missing or malformed.
|
|
72
|
+
*
|
|
73
|
+
* Mapping:
|
|
74
|
+
* total_duration_ms | totalDurationMs → totalDuration
|
|
75
|
+
* id | scene_id → sceneId
|
|
76
|
+
* start_ms → startMs
|
|
77
|
+
* end_ms → endMs
|
|
78
|
+
*/
|
|
79
|
+
export function normalizeTimingData(raw) {
|
|
80
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
81
|
+
throw new Error("Invalid timing data: expected an object");
|
|
82
|
+
}
|
|
83
|
+
const obj = raw;
|
|
84
|
+
const totalDuration = asNumber(obj.totalDuration ?? obj.totalDurationMs ?? obj.total_duration_ms);
|
|
85
|
+
if (totalDuration === undefined) {
|
|
86
|
+
throw new Error("Invalid timing data: missing or non-numeric totalDuration " +
|
|
87
|
+
"(also checked totalDurationMs, total_duration_ms)");
|
|
88
|
+
}
|
|
89
|
+
const rawScenes = obj.scenes;
|
|
90
|
+
if (!Array.isArray(rawScenes)) {
|
|
91
|
+
throw new Error("Invalid timing data: missing or non-array 'scenes'");
|
|
92
|
+
}
|
|
93
|
+
const scenes = rawScenes.map((s, i) => {
|
|
94
|
+
if (typeof s !== "object" || s === null) {
|
|
95
|
+
throw new Error(`Invalid timing data: scenes[${i}] is not an object`);
|
|
96
|
+
}
|
|
97
|
+
const sc = s;
|
|
98
|
+
const sceneId = sc.sceneId ?? sc.scene_id ?? sc.id;
|
|
99
|
+
if (typeof sceneId !== "string" || sceneId === "") {
|
|
100
|
+
throw new Error(`Invalid timing data: scenes[${i}] missing sceneId (also checked scene_id, id)`);
|
|
101
|
+
}
|
|
102
|
+
const startMs = asNumber(sc.startMs ?? sc.start_ms);
|
|
103
|
+
if (startMs === undefined) {
|
|
104
|
+
throw new Error(`Invalid timing data: scenes[${i}] missing or non-numeric startMs (also checked start_ms)`);
|
|
105
|
+
}
|
|
106
|
+
const endMs = asNumber(sc.endMs ?? sc.end_ms);
|
|
107
|
+
if (endMs === undefined) {
|
|
108
|
+
throw new Error(`Invalid timing data: scenes[${i}] missing or non-numeric endMs (also checked end_ms)`);
|
|
109
|
+
}
|
|
110
|
+
const rawMarkers = sc.markers;
|
|
111
|
+
const markers = Array.isArray(rawMarkers)
|
|
112
|
+
? rawMarkers.map((m, j) => {
|
|
113
|
+
if (typeof m !== "object" || m === null) {
|
|
114
|
+
throw new Error(`Invalid timing data: scenes[${i}].markers[${j}] is not an object`);
|
|
115
|
+
}
|
|
116
|
+
const mk = m;
|
|
117
|
+
return {
|
|
118
|
+
action: String(mk.action ?? ""),
|
|
119
|
+
target: String(mk.target ?? ""),
|
|
120
|
+
ms: typeof mk.ms === "number" ? mk.ms : 0,
|
|
121
|
+
};
|
|
122
|
+
})
|
|
123
|
+
: [];
|
|
124
|
+
return { sceneId, startMs, endMs, markers };
|
|
125
|
+
});
|
|
126
|
+
return { totalDuration, scenes };
|
|
127
|
+
}
|
|
128
|
+
export function parseTimingMarkers(consoleOutput) {
|
|
129
|
+
const lines = consoleOutput.split("\n");
|
|
130
|
+
const rawMarkers = [];
|
|
131
|
+
for (const line of lines) {
|
|
132
|
+
const marker = parseMarkerLine(line);
|
|
133
|
+
if (marker) {
|
|
134
|
+
rawMarkers.push(marker);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const sceneGroups = groupByScene(rawMarkers);
|
|
138
|
+
const scenes = [];
|
|
139
|
+
for (const [sceneId, markers] of sceneGroups) {
|
|
140
|
+
scenes.push(buildScene(sceneId, markers));
|
|
141
|
+
}
|
|
142
|
+
const totalDuration = rawMarkers.length > 0 ? Math.max(...rawMarkers.map((m) => m.ms)) : 0;
|
|
143
|
+
return { totalDuration, scenes };
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/lib/timing.ts"],"names":[],"mappings":"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"}
|