devrel-toolkit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -0
- package/dist/__tests__/cli.test.d.ts +2 -0
- package/dist/__tests__/cli.test.d.ts.map +1 -0
- package/dist/__tests__/cli.test.js +47 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/__tests__/components.test.d.ts +2 -0
- package/dist/__tests__/components.test.d.ts.map +1 -0
- package/dist/__tests__/components.test.js +73 -0
- package/dist/__tests__/components.test.js.map +1 -0
- package/dist/__tests__/d-id-client.test.d.ts +2 -0
- package/dist/__tests__/d-id-client.test.d.ts.map +1 -0
- package/dist/__tests__/d-id-client.test.js +116 -0
- package/dist/__tests__/d-id-client.test.js.map +1 -0
- package/dist/__tests__/render-integration.test.d.ts +2 -0
- package/dist/__tests__/render-integration.test.d.ts.map +1 -0
- package/dist/__tests__/render-integration.test.js +26 -0
- package/dist/__tests__/render-integration.test.js.map +1 -0
- package/dist/__tests__/schema.test.d.ts +2 -0
- package/dist/__tests__/schema.test.d.ts.map +1 -0
- package/dist/__tests__/schema.test.js +173 -0
- package/dist/__tests__/schema.test.js.map +1 -0
- package/dist/__tests__/timing.test.d.ts +2 -0
- package/dist/__tests__/timing.test.d.ts.map +1 -0
- package/dist/__tests__/timing.test.js +69 -0
- package/dist/__tests__/timing.test.js.map +1 -0
- package/dist/cli/d-id.d.ts +3 -0
- package/dist/cli/d-id.d.ts.map +1 -0
- package/dist/cli/d-id.js +53 -0
- package/dist/cli/d-id.js.map +1 -0
- package/dist/cli/doctor.d.ts +3 -0
- package/dist/cli/doctor.d.ts.map +1 -0
- package/dist/cli/doctor.js +134 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +21 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install-skill.d.ts +3 -0
- package/dist/cli/install-skill.d.ts.map +1 -0
- package/dist/cli/install-skill.js +50 -0
- package/dist/cli/install-skill.js.map +1 -0
- package/dist/cli/render.d.ts +4 -0
- package/dist/cli/render.d.ts.map +1 -0
- package/dist/cli/render.js +134 -0
- package/dist/cli/render.js.map +1 -0
- package/dist/cli/setup.d.ts +3 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +60 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/compositor/DemoVideo.d.ts +4 -0
- package/dist/compositor/DemoVideo.d.ts.map +1 -0
- package/dist/compositor/DemoVideo.js +64 -0
- package/dist/compositor/DemoVideo.js.map +1 -0
- package/dist/compositor/Root.d.ts +3 -0
- package/dist/compositor/Root.d.ts.map +1 -0
- package/dist/compositor/Root.js +30 -0
- package/dist/compositor/Root.js.map +1 -0
- package/dist/compositor/components/AvatarPiP.d.ts +10 -0
- package/dist/compositor/components/AvatarPiP.d.ts.map +1 -0
- package/dist/compositor/components/AvatarPiP.js +52 -0
- package/dist/compositor/components/AvatarPiP.js.map +1 -0
- package/dist/compositor/components/BrowserFrame.d.ts +18 -0
- package/dist/compositor/components/BrowserFrame.d.ts.map +1 -0
- package/dist/compositor/components/BrowserFrame.js +97 -0
- package/dist/compositor/components/BrowserFrame.js.map +1 -0
- package/dist/compositor/components/Cursor.d.ts +13 -0
- package/dist/compositor/components/Cursor.d.ts.map +1 -0
- package/dist/compositor/components/Cursor.js +65 -0
- package/dist/compositor/components/Cursor.js.map +1 -0
- package/dist/compositor/components/Highlight.d.ts +9 -0
- package/dist/compositor/components/Highlight.d.ts.map +1 -0
- package/dist/compositor/components/Highlight.js +83 -0
- package/dist/compositor/components/Highlight.js.map +1 -0
- package/dist/compositor/components/IntroOutro.d.ts +10 -0
- package/dist/compositor/components/IntroOutro.d.ts.map +1 -0
- package/dist/compositor/components/IntroOutro.js +48 -0
- package/dist/compositor/components/IntroOutro.js.map +1 -0
- package/dist/compositor/components/SceneTransition.d.ts +9 -0
- package/dist/compositor/components/SceneTransition.d.ts.map +1 -0
- package/dist/compositor/components/SceneTransition.js +35 -0
- package/dist/compositor/components/SceneTransition.js.map +1 -0
- package/dist/compositor/components/Subtitles.d.ts +9 -0
- package/dist/compositor/components/Subtitles.d.ts.map +1 -0
- package/dist/compositor/components/Subtitles.js +45 -0
- package/dist/compositor/components/Subtitles.js.map +1 -0
- package/dist/compositor/index.d.ts +2 -0
- package/dist/compositor/index.d.ts.map +1 -0
- package/dist/compositor/index.js +4 -0
- package/dist/compositor/index.js.map +1 -0
- package/dist/compositor/timing.d.ts +16 -0
- package/dist/compositor/timing.d.ts.map +1 -0
- package/dist/compositor/timing.js +39 -0
- package/dist/compositor/timing.js.map +1 -0
- package/dist/d-id/client.d.ts +50 -0
- package/dist/d-id/client.d.ts.map +1 -0
- package/dist/d-id/client.js +114 -0
- package/dist/d-id/client.js.map +1 -0
- package/dist/d-id/generate.d.ts +9 -0
- package/dist/d-id/generate.d.ts.map +1 -0
- package/dist/d-id/generate.js +81 -0
- package/dist/d-id/generate.js.map +1 -0
- package/dist/utils/config.d.ts +14 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +34 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/schema.d.ts +273 -0
- package/dist/utils/schema.d.ts.map +1 -0
- package/dist/utils/schema.js +98 -0
- package/dist/utils/schema.js.map +1 -0
- package/package.json +54 -0
- package/remotion.config.ts +4 -0
- package/skills/make-demo/SKILL.md +282 -0
- package/skills/make-demo/references/demo-script-schema.md +47 -0
- package/skills/make-demo/references/render-props-schema.md +49 -0
- package/skills/make-demo/references/toolkit-commands.md +23 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { calculateTotalFrames, estimateDuration, } from "../compositor/timing.js";
|
|
3
|
+
function makeProps(scenes, fps = 30) {
|
|
4
|
+
return {
|
|
5
|
+
resolution: { width: 1920, height: 1080 },
|
|
6
|
+
fps,
|
|
7
|
+
scenes: scenes.map((s) => ({
|
|
8
|
+
id: s.id,
|
|
9
|
+
screenshotPath: `/tmp/${s.id}.png`,
|
|
10
|
+
avatarDuration: s.duration,
|
|
11
|
+
narration: "test",
|
|
12
|
+
highlights: [],
|
|
13
|
+
transition: s.transition,
|
|
14
|
+
})),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
describe("calculateTotalFrames", () => {
|
|
18
|
+
it("returns 0 for empty scenes", () => {
|
|
19
|
+
expect(calculateTotalFrames(makeProps([]))).toBe(0);
|
|
20
|
+
});
|
|
21
|
+
it("returns correct frames for a single scene", () => {
|
|
22
|
+
const props = makeProps([{ id: "s1", duration: 5, transition: "fade" }]);
|
|
23
|
+
// 5 seconds * 30fps = 150 frames
|
|
24
|
+
expect(calculateTotalFrames(props)).toBe(150);
|
|
25
|
+
});
|
|
26
|
+
it("accounts for transition overlap between scenes", () => {
|
|
27
|
+
const props = makeProps([
|
|
28
|
+
{ id: "s1", duration: 5, transition: "fade" },
|
|
29
|
+
{ id: "s2", duration: 5, transition: "fade" },
|
|
30
|
+
]);
|
|
31
|
+
// Without overlap: 300 frames
|
|
32
|
+
// Transition = 0.5s = 15 frames overlap (between s1 and s2, using s2's transition type)
|
|
33
|
+
// Total: 300 - 15 = 285
|
|
34
|
+
expect(calculateTotalFrames(props)).toBe(285);
|
|
35
|
+
});
|
|
36
|
+
it("has no overlap for cut transitions", () => {
|
|
37
|
+
const props = makeProps([
|
|
38
|
+
{ id: "s1", duration: 5, transition: "cut" },
|
|
39
|
+
{ id: "s2", duration: 5, transition: "cut" },
|
|
40
|
+
]);
|
|
41
|
+
// No transition overlap (next scene is "cut")
|
|
42
|
+
expect(calculateTotalFrames(props)).toBe(300);
|
|
43
|
+
});
|
|
44
|
+
it("handles mixed transitions", () => {
|
|
45
|
+
const props = makeProps([
|
|
46
|
+
{ id: "s1", duration: 3, transition: "fade" },
|
|
47
|
+
{ id: "s2", duration: 3, transition: "cut" },
|
|
48
|
+
{ id: "s3", duration: 3, transition: "slide" },
|
|
49
|
+
]);
|
|
50
|
+
// s1→s2: s2 is cut, no overlap
|
|
51
|
+
// s2→s3: s3 is slide, 15 frames overlap
|
|
52
|
+
// Total: 270 - 15 = 255
|
|
53
|
+
expect(calculateTotalFrames(props)).toBe(255);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("estimateDuration", () => {
|
|
57
|
+
it("estimates duration from word count", () => {
|
|
58
|
+
// 150 words per minute = 2.5 words per second
|
|
59
|
+
const text = Array(25).fill("word").join(" "); // 25 words
|
|
60
|
+
expect(estimateDuration(text)).toBe(10); // 25 / 2.5 = 10s
|
|
61
|
+
});
|
|
62
|
+
it("returns minimum 2 seconds", () => {
|
|
63
|
+
expect(estimateDuration("hi")).toBe(2);
|
|
64
|
+
});
|
|
65
|
+
it("handles empty-ish strings", () => {
|
|
66
|
+
expect(estimateDuration("hello")).toBe(2);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=timing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.test.js","sourceRoot":"","sources":["../../src/__tests__/timing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d-id.d.ts","sourceRoot":"","sources":["../../src/cli/d-id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0DzD"}
|
package/dist/cli/d-id.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DIDClient } from "../d-id/client.js";
|
|
2
|
+
import { requireDidApiKey } from "../utils/config.js";
|
|
3
|
+
import { generateAvatarClips } from "../d-id/generate.js";
|
|
4
|
+
export function registerDidCommand(program) {
|
|
5
|
+
const did = program
|
|
6
|
+
.command("d-id")
|
|
7
|
+
.description("D-ID avatar generation commands");
|
|
8
|
+
did
|
|
9
|
+
.command("avatars")
|
|
10
|
+
.description("List available D-ID avatars")
|
|
11
|
+
.action(async () => {
|
|
12
|
+
const apiKey = requireDidApiKey();
|
|
13
|
+
const client = new DIDClient(apiKey);
|
|
14
|
+
console.log("\nFetching available avatars...\n");
|
|
15
|
+
const avatars = await client.listAvatars();
|
|
16
|
+
if (avatars.length === 0) {
|
|
17
|
+
console.log("No avatars found.");
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
// Print table header
|
|
21
|
+
const idWidth = 40;
|
|
22
|
+
const nameWidth = 30;
|
|
23
|
+
console.log(`${"AVATAR ID".padEnd(idWidth)} ${"NAME".padEnd(nameWidth)} SENTIMENTS`);
|
|
24
|
+
console.log(`${"-".repeat(idWidth)} ${"-".repeat(nameWidth)} ${"-".repeat(30)}`);
|
|
25
|
+
for (const avatar of avatars) {
|
|
26
|
+
const sentimentNames = avatar.sentiments
|
|
27
|
+
?.map((s) => s.name || s.id)
|
|
28
|
+
.join(", ") ?? "—";
|
|
29
|
+
const id = (avatar.id ?? "").padEnd(idWidth);
|
|
30
|
+
const name = (avatar.name ?? "unknown").padEnd(nameWidth);
|
|
31
|
+
console.log(`${id} ${name} ${sentimentNames}`);
|
|
32
|
+
}
|
|
33
|
+
console.log(`\n${avatars.length} avatar(s) found.\n`);
|
|
34
|
+
});
|
|
35
|
+
did
|
|
36
|
+
.command("generate")
|
|
37
|
+
.description("Generate avatar clips from a script")
|
|
38
|
+
.requiredOption("-s, --script <path>", "Path to avatar script JSON")
|
|
39
|
+
.option("-o, --output <dir>", "Output directory for avatar clips", "./avatars")
|
|
40
|
+
.option("-a, --avatar <id>", "Avatar ID to use")
|
|
41
|
+
.option("--sentiment <id>", "Sentiment ID to use")
|
|
42
|
+
.option("-c, --concurrency <n>", "Max concurrent generations", "2")
|
|
43
|
+
.action(async (opts) => {
|
|
44
|
+
await generateAvatarClips({
|
|
45
|
+
scriptPath: opts.script,
|
|
46
|
+
outputDir: opts.output,
|
|
47
|
+
defaultAvatarId: opts.avatar,
|
|
48
|
+
defaultSentimentId: opts.sentiment,
|
|
49
|
+
concurrency: parseInt(opts.concurrency, 10),
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=d-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d-id.js","sourceRoot":"","sources":["../../src/cli/d-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoHzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmC5D"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { loadConfig } from "../utils/config.js";
|
|
3
|
+
function checkCommand(cmd) {
|
|
4
|
+
try {
|
|
5
|
+
return execSync(cmd, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
async function checkNodeVersion() {
|
|
12
|
+
const version = process.version;
|
|
13
|
+
const major = parseInt(version.slice(1).split(".")[0], 10);
|
|
14
|
+
if (major >= 18) {
|
|
15
|
+
return { name: "Node.js", status: "pass", detail: `${version} (>= 18 required)` };
|
|
16
|
+
}
|
|
17
|
+
return { name: "Node.js", status: "fail", detail: `${version} — Node.js 18+ is required` };
|
|
18
|
+
}
|
|
19
|
+
async function checkFfmpeg() {
|
|
20
|
+
const output = checkCommand("ffmpeg -version");
|
|
21
|
+
if (output) {
|
|
22
|
+
const firstLine = output.split("\n")[0];
|
|
23
|
+
return { name: "FFmpeg", status: "pass", detail: firstLine };
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
name: "FFmpeg",
|
|
27
|
+
status: "fail",
|
|
28
|
+
detail: "Not found. Install with: brew install ffmpeg (macOS) or apt install ffmpeg (Linux)",
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function checkBrowserAutomation() {
|
|
32
|
+
const browserUse = checkCommand("browser-use --version");
|
|
33
|
+
if (browserUse) {
|
|
34
|
+
return { name: "Browser Automation", status: "pass", detail: `Browser-Use CLI ${browserUse}` };
|
|
35
|
+
}
|
|
36
|
+
const playwright = checkCommand("npx playwright --version");
|
|
37
|
+
if (playwright) {
|
|
38
|
+
return {
|
|
39
|
+
name: "Browser Automation",
|
|
40
|
+
status: "pass",
|
|
41
|
+
detail: `Playwright ${playwright} (fallback)`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
name: "Browser Automation",
|
|
46
|
+
status: "warn",
|
|
47
|
+
detail: "Neither Browser-Use CLI nor Playwright found. Install browser-use or npx playwright install",
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function checkDidApiKey() {
|
|
51
|
+
const config = loadConfig();
|
|
52
|
+
if (!config.didApiKey) {
|
|
53
|
+
return {
|
|
54
|
+
name: "D-ID API Key",
|
|
55
|
+
status: "fail",
|
|
56
|
+
detail: "DID_API_KEY not set. Add it to .env.local or set as environment variable",
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Test the key with a lightweight API call
|
|
60
|
+
try {
|
|
61
|
+
const response = await fetch("https://api.d-id.com/expressives/avatars", {
|
|
62
|
+
headers: {
|
|
63
|
+
Authorization: `Basic ${config.didApiKey}`,
|
|
64
|
+
"Content-Type": "application/json",
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
if (response.ok) {
|
|
68
|
+
return { name: "D-ID API Key", status: "pass", detail: "Valid (authenticated successfully)" };
|
|
69
|
+
}
|
|
70
|
+
if (response.status === 401) {
|
|
71
|
+
return {
|
|
72
|
+
name: "D-ID API Key",
|
|
73
|
+
status: "fail",
|
|
74
|
+
detail: "Invalid key — authentication failed (401). Check your DID_API_KEY",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
name: "D-ID API Key",
|
|
79
|
+
status: "warn",
|
|
80
|
+
detail: `Key is set but API returned status ${response.status}`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return {
|
|
85
|
+
name: "D-ID API Key",
|
|
86
|
+
status: "warn",
|
|
87
|
+
detail: `Key is set but could not reach D-ID API: ${err.message}`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function statusIcon(status) {
|
|
92
|
+
switch (status) {
|
|
93
|
+
case "pass":
|
|
94
|
+
return "\u2705";
|
|
95
|
+
case "fail":
|
|
96
|
+
return "\u274C";
|
|
97
|
+
case "warn":
|
|
98
|
+
return "\u26A0\uFE0F";
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function registerDoctorCommand(program) {
|
|
102
|
+
program
|
|
103
|
+
.command("doctor")
|
|
104
|
+
.description("Check dependencies and environment setup")
|
|
105
|
+
.action(async () => {
|
|
106
|
+
console.log("\ndevrel-toolkit doctor\n");
|
|
107
|
+
console.log("Checking dependencies...\n");
|
|
108
|
+
const checks = await Promise.all([
|
|
109
|
+
checkNodeVersion(),
|
|
110
|
+
checkFfmpeg(),
|
|
111
|
+
checkBrowserAutomation(),
|
|
112
|
+
checkDidApiKey(),
|
|
113
|
+
]);
|
|
114
|
+
for (const check of checks) {
|
|
115
|
+
console.log(` ${statusIcon(check.status)} ${check.name}: ${check.detail}`);
|
|
116
|
+
}
|
|
117
|
+
const failures = checks.filter((c) => c.status === "fail");
|
|
118
|
+
const warnings = checks.filter((c) => c.status === "warn");
|
|
119
|
+
console.log("");
|
|
120
|
+
if (failures.length === 0 && warnings.length === 0) {
|
|
121
|
+
console.log("All checks passed! Ready to create demos.\n");
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
if (failures.length > 0) {
|
|
125
|
+
console.log(`${failures.length} check(s) failed. Fix the issues above to proceed.\n`);
|
|
126
|
+
}
|
|
127
|
+
if (warnings.length > 0) {
|
|
128
|
+
console.log(`${warnings.length} warning(s). Some features may not work.\n`);
|
|
129
|
+
}
|
|
130
|
+
process.exitCode = failures.length > 0 ? 1 : 0;
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { registerDidCommand } from "./d-id.js";
|
|
4
|
+
import { registerRenderCommand, registerPreviewCommand } from "./render.js";
|
|
5
|
+
import { registerDoctorCommand } from "./doctor.js";
|
|
6
|
+
import { registerSetupCommand } from "./setup.js";
|
|
7
|
+
import { registerInstallSkillCommand } from "./install-skill.js";
|
|
8
|
+
const program = new Command();
|
|
9
|
+
program
|
|
10
|
+
.name("devrel-toolkit")
|
|
11
|
+
.description("Toolkit for automated product demo video creation with AI avatars and Remotion compositing")
|
|
12
|
+
.version("0.1.0")
|
|
13
|
+
.option("-v, --verbose", "Enable verbose debug output");
|
|
14
|
+
registerDidCommand(program);
|
|
15
|
+
registerRenderCommand(program);
|
|
16
|
+
registerPreviewCommand(program);
|
|
17
|
+
registerDoctorCommand(program);
|
|
18
|
+
registerSetupCommand(program);
|
|
19
|
+
registerInstallSkillCommand(program);
|
|
20
|
+
program.parse();
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,gBAAgB,CAAC;KACtB,WAAW,CACV,4FAA4F,CAC7F;KACA,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;AAE1D,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,2BAA2B,CAAC,OAAO,CAAC,CAAC;AAErC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../src/cli/install-skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoDlE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { resolve, join, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { homedir } from "node:os";
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
export function registerInstallSkillCommand(program) {
|
|
7
|
+
program
|
|
8
|
+
.command("install-skill")
|
|
9
|
+
.description("Install the make-demo skill to ~/.claude/skills/")
|
|
10
|
+
.option("--dest <path>", "Custom destination directory")
|
|
11
|
+
.action(async (opts) => {
|
|
12
|
+
// Source: skills/make-demo/ relative to the package root
|
|
13
|
+
const packageRoot = resolve(__dirname, "../..");
|
|
14
|
+
const skillSource = join(packageRoot, "skills", "make-demo");
|
|
15
|
+
// In the built dist, skills/ is at the repo root not in dist/
|
|
16
|
+
// Try multiple locations
|
|
17
|
+
const candidates = [
|
|
18
|
+
skillSource,
|
|
19
|
+
resolve(__dirname, "../../skills/make-demo"),
|
|
20
|
+
resolve(__dirname, "../../../skills/make-demo"),
|
|
21
|
+
];
|
|
22
|
+
let source = null;
|
|
23
|
+
for (const candidate of candidates) {
|
|
24
|
+
if (existsSync(join(candidate, "SKILL.md"))) {
|
|
25
|
+
source = candidate;
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (!source) {
|
|
30
|
+
console.error("Could not find make-demo skill directory. Expected skills/make-demo/SKILL.md relative to package root.");
|
|
31
|
+
process.exitCode = 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const dest = opts.dest
|
|
35
|
+
? resolve(opts.dest)
|
|
36
|
+
: join(homedir(), ".claude", "skills", "make-demo");
|
|
37
|
+
// Ensure parent directory exists
|
|
38
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
39
|
+
// Copy the skill directory
|
|
40
|
+
cpSync(source, dest, { recursive: true });
|
|
41
|
+
console.log(`\nSkill installed to: ${dest}`);
|
|
42
|
+
console.log("Files copied:");
|
|
43
|
+
console.log(" - SKILL.md");
|
|
44
|
+
console.log(" - references/demo-script-schema.md");
|
|
45
|
+
console.log(" - references/render-props-schema.md");
|
|
46
|
+
console.log(" - references/toolkit-commands.md");
|
|
47
|
+
console.log("\nThe /make-demo skill is now available in Claude Code.\n");
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=install-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/cli/install-skill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,UAAU,2BAA2B,CAAC,OAAgB;IAC1D,OAAO;SACJ,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,8BAA8B,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,yDAAyD;QACzD,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE7D,8DAA8D;QAC9D,yBAAyB;QACzB,MAAM,UAAU,GAAG;YACjB,WAAW;YACX,OAAO,CAAC,SAAS,EAAE,wBAAwB,CAAC;YAC5C,OAAO,CAAC,SAAS,EAAE,2BAA2B,CAAC;SAChD,CAAC;QAEF,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;gBAC5C,MAAM,GAAG,SAAS,CAAC;gBACnB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CACX,wGAAwG,CACzG,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;YACpB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACpB,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEtD,iCAAiC;QACjC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9C,2BAA2B;QAC3B,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1C,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/cli/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+HzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB5D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAa7D"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { resolve, dirname } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { RenderPropsSchema } from "../utils/schema.js";
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
async function doRender(opts) {
|
|
7
|
+
const { bundle } = await import("@remotion/bundler");
|
|
8
|
+
const { renderMedia, selectComposition } = await import("@remotion/renderer");
|
|
9
|
+
// Read and validate render props
|
|
10
|
+
const propsPath = resolve(opts.props);
|
|
11
|
+
const raw = readFileSync(propsPath, "utf-8");
|
|
12
|
+
const parseResult = RenderPropsSchema.safeParse(JSON.parse(raw));
|
|
13
|
+
if (!parseResult.success) {
|
|
14
|
+
console.error("Invalid render props:");
|
|
15
|
+
console.error(parseResult.error.issues);
|
|
16
|
+
process.exitCode = 1;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const inputProps = parseResult.data;
|
|
20
|
+
// Validate that all referenced files exist
|
|
21
|
+
const missingFiles = [];
|
|
22
|
+
for (const scene of inputProps.scenes) {
|
|
23
|
+
if (!existsSync(scene.screenshotPath)) {
|
|
24
|
+
missingFiles.push(`Screenshot: ${scene.screenshotPath} (scene: ${scene.id})`);
|
|
25
|
+
}
|
|
26
|
+
if (scene.avatarClipPath && !existsSync(scene.avatarClipPath)) {
|
|
27
|
+
missingFiles.push(`Avatar clip: ${scene.avatarClipPath} (scene: ${scene.id})`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (inputProps.backgroundMusic && !existsSync(inputProps.backgroundMusic)) {
|
|
31
|
+
missingFiles.push(`Background music: ${inputProps.backgroundMusic}`);
|
|
32
|
+
}
|
|
33
|
+
if (missingFiles.length > 0) {
|
|
34
|
+
console.error("Missing files referenced in render props:");
|
|
35
|
+
for (const f of missingFiles) {
|
|
36
|
+
console.error(` - ${f}`);
|
|
37
|
+
}
|
|
38
|
+
process.exitCode = 1;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Override resolution/fps for preview mode
|
|
42
|
+
if (opts.preview) {
|
|
43
|
+
inputProps.resolution = { width: 854, height: 480 };
|
|
44
|
+
inputProps.fps = 15;
|
|
45
|
+
}
|
|
46
|
+
if (opts.resolution) {
|
|
47
|
+
const h = parseInt(opts.resolution, 10);
|
|
48
|
+
const w = Math.round(h * (16 / 9));
|
|
49
|
+
inputProps.resolution = { width: w, height: h };
|
|
50
|
+
}
|
|
51
|
+
if (opts.fps) {
|
|
52
|
+
inputProps.fps = parseInt(opts.fps, 10);
|
|
53
|
+
}
|
|
54
|
+
const outputPath = resolve(opts.output);
|
|
55
|
+
const isTransparent = opts.transparent === true;
|
|
56
|
+
const codec = isTransparent ? "prores" : (opts.codec ?? "h264");
|
|
57
|
+
console.log("\nBundling Remotion project...");
|
|
58
|
+
// Bundle the compositor entry point
|
|
59
|
+
const entryPoint = resolve(__dirname, "../compositor/index.js");
|
|
60
|
+
const bundleLocation = await bundle({
|
|
61
|
+
entryPoint,
|
|
62
|
+
webpackOverride: (config) => config,
|
|
63
|
+
});
|
|
64
|
+
console.log("Selecting composition...");
|
|
65
|
+
const composition = await selectComposition({
|
|
66
|
+
serveUrl: bundleLocation,
|
|
67
|
+
id: "DemoVideo",
|
|
68
|
+
inputProps,
|
|
69
|
+
});
|
|
70
|
+
console.log(`Rendering ${composition.width}x${composition.height} @ ${composition.fps}fps (${composition.durationInFrames} frames)...`);
|
|
71
|
+
let lastProgress = 0;
|
|
72
|
+
const renderOptions = {
|
|
73
|
+
composition,
|
|
74
|
+
serveUrl: bundleLocation,
|
|
75
|
+
codec,
|
|
76
|
+
outputLocation: outputPath,
|
|
77
|
+
inputProps,
|
|
78
|
+
crf: opts.preview ? 28 : 18,
|
|
79
|
+
};
|
|
80
|
+
if (isTransparent) {
|
|
81
|
+
renderOptions.imageFormat = "png";
|
|
82
|
+
renderOptions.pixelFormat = "yuva444p10le";
|
|
83
|
+
renderOptions.proResProfile = "4444";
|
|
84
|
+
delete renderOptions.crf;
|
|
85
|
+
}
|
|
86
|
+
await renderMedia({
|
|
87
|
+
...renderOptions,
|
|
88
|
+
onProgress: ({ progress }) => {
|
|
89
|
+
const pct = Math.floor(progress * 100);
|
|
90
|
+
if (pct > lastProgress) {
|
|
91
|
+
lastProgress = pct;
|
|
92
|
+
process.stdout.write(`\r Rendering: ${pct}%`);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
console.log(`\r Rendering: 100%`);
|
|
97
|
+
console.log(`\nOutput: ${outputPath}\n`);
|
|
98
|
+
}
|
|
99
|
+
export function registerRenderCommand(program) {
|
|
100
|
+
program
|
|
101
|
+
.command("render")
|
|
102
|
+
.description("Render demo video from props JSON")
|
|
103
|
+
.requiredOption("-p, --props <path>", "Path to render props JSON")
|
|
104
|
+
.option("-o, --output <path>", "Output MP4 file path", "demo-output.mp4")
|
|
105
|
+
.option("-r, --resolution <res>", "Output resolution (720 or 1080)")
|
|
106
|
+
.option("--fps <n>", "Frames per second")
|
|
107
|
+
.option("--codec <codec>", "Video codec (h264 or h265)", "h264")
|
|
108
|
+
.option("--transparent", "Export ProRes 4444 with transparency for compositing")
|
|
109
|
+
.action(async (opts) => {
|
|
110
|
+
await doRender({
|
|
111
|
+
props: opts.props,
|
|
112
|
+
output: opts.output,
|
|
113
|
+
resolution: opts.resolution,
|
|
114
|
+
fps: opts.fps,
|
|
115
|
+
codec: opts.codec,
|
|
116
|
+
transparent: opts.transparent,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
export function registerPreviewCommand(program) {
|
|
121
|
+
program
|
|
122
|
+
.command("preview")
|
|
123
|
+
.description("Quick low-res preview render (480p, 15fps, no avatar)")
|
|
124
|
+
.requiredOption("-p, --props <path>", "Path to render props JSON")
|
|
125
|
+
.option("-o, --output <path>", "Output MP4 file path", "preview-output.mp4")
|
|
126
|
+
.action(async (opts) => {
|
|
127
|
+
await doRender({
|
|
128
|
+
props: opts.props,
|
|
129
|
+
output: opts.output,
|
|
130
|
+
preview: true,
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/cli/render.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8C3D"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { loadConfig } from "../utils/config.js";
|
|
3
|
+
function runSilent(cmd) {
|
|
4
|
+
try {
|
|
5
|
+
execSync(cmd, { stdio: ["pipe", "pipe", "pipe"] });
|
|
6
|
+
return true;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function checkInstalled(cmd) {
|
|
13
|
+
return runSilent(`which ${cmd}`);
|
|
14
|
+
}
|
|
15
|
+
export function registerSetupCommand(program) {
|
|
16
|
+
program
|
|
17
|
+
.command("setup")
|
|
18
|
+
.description("Install everything needed for /make-demo")
|
|
19
|
+
.action(async () => {
|
|
20
|
+
console.log("\ndevrel-toolkit setup\n");
|
|
21
|
+
// 1. Check FFmpeg
|
|
22
|
+
if (checkInstalled("ffmpeg")) {
|
|
23
|
+
console.log(" \u2705 FFmpeg is installed");
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.log(" \u2699\uFE0F Installing FFmpeg...");
|
|
27
|
+
if (process.platform === "darwin") {
|
|
28
|
+
const ok = runSilent("brew install ffmpeg");
|
|
29
|
+
console.log(ok ? " \u2705 FFmpeg installed" : " \u274C Failed — run: brew install ffmpeg");
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
console.log(" \u274C Not installed. Run: apt install ffmpeg (Linux) or brew install ffmpeg (macOS)");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// 2. Check Browser-Use CLI
|
|
36
|
+
if (checkInstalled("browser-use")) {
|
|
37
|
+
console.log(" \u2705 Browser-Use CLI is installed");
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
console.log(" \u2699\uFE0F Installing Browser-Use CLI...");
|
|
41
|
+
const ok = runSilent("curl -fsSL https://browser-use.com/cli/install.sh | bash");
|
|
42
|
+
console.log(ok
|
|
43
|
+
? " \u2705 Browser-Use CLI installed"
|
|
44
|
+
: " \u274C Failed — run: curl -fsSL https://browser-use.com/cli/install.sh | bash");
|
|
45
|
+
}
|
|
46
|
+
// 3. Check D-ID API key
|
|
47
|
+
const config = loadConfig();
|
|
48
|
+
if (config.didApiKey) {
|
|
49
|
+
console.log(" \u2705 D-ID API key is set");
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log(" \u274C D-ID API key not found");
|
|
53
|
+
console.log(" Sign up at https://d-id.com and add DID_API_KEY to your .env.local");
|
|
54
|
+
}
|
|
55
|
+
// 4. Install skill
|
|
56
|
+
console.log("\n To install the Claude Code skill:");
|
|
57
|
+
console.log(" npx skills add <repo-url> --skill make-demo\n");
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,OAAO,SAAS,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0CAA0C,CAAC;SACvD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QAExC,kBAAkB;QAClB,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAClC,MAAM,EAAE,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC;YAC/F,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,wFAAwF,CAAC,CAAC;YACxG,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,IAAI,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,MAAM,EAAE,GAAG,SAAS,CAAC,0DAA0D,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CACT,EAAE;gBACA,CAAC,CAAC,oCAAoC;gBACtC,CAAC,CAAC,iFAAiF,CACtF,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;QACzF,CAAC;QAED,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DemoVideo.d.ts","sourceRoot":"","sources":["../../src/compositor/DemoVideo.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAuBtD,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAsF3C,CAAC"}
|