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.
Files changed (115) hide show
  1. package/README.md +63 -0
  2. package/dist/__tests__/cli.test.d.ts +2 -0
  3. package/dist/__tests__/cli.test.d.ts.map +1 -0
  4. package/dist/__tests__/cli.test.js +47 -0
  5. package/dist/__tests__/cli.test.js.map +1 -0
  6. package/dist/__tests__/components.test.d.ts +2 -0
  7. package/dist/__tests__/components.test.d.ts.map +1 -0
  8. package/dist/__tests__/components.test.js +73 -0
  9. package/dist/__tests__/components.test.js.map +1 -0
  10. package/dist/__tests__/d-id-client.test.d.ts +2 -0
  11. package/dist/__tests__/d-id-client.test.d.ts.map +1 -0
  12. package/dist/__tests__/d-id-client.test.js +116 -0
  13. package/dist/__tests__/d-id-client.test.js.map +1 -0
  14. package/dist/__tests__/render-integration.test.d.ts +2 -0
  15. package/dist/__tests__/render-integration.test.d.ts.map +1 -0
  16. package/dist/__tests__/render-integration.test.js +26 -0
  17. package/dist/__tests__/render-integration.test.js.map +1 -0
  18. package/dist/__tests__/schema.test.d.ts +2 -0
  19. package/dist/__tests__/schema.test.d.ts.map +1 -0
  20. package/dist/__tests__/schema.test.js +173 -0
  21. package/dist/__tests__/schema.test.js.map +1 -0
  22. package/dist/__tests__/timing.test.d.ts +2 -0
  23. package/dist/__tests__/timing.test.d.ts.map +1 -0
  24. package/dist/__tests__/timing.test.js +69 -0
  25. package/dist/__tests__/timing.test.js.map +1 -0
  26. package/dist/cli/d-id.d.ts +3 -0
  27. package/dist/cli/d-id.d.ts.map +1 -0
  28. package/dist/cli/d-id.js +53 -0
  29. package/dist/cli/d-id.js.map +1 -0
  30. package/dist/cli/doctor.d.ts +3 -0
  31. package/dist/cli/doctor.d.ts.map +1 -0
  32. package/dist/cli/doctor.js +134 -0
  33. package/dist/cli/doctor.js.map +1 -0
  34. package/dist/cli/index.d.ts +3 -0
  35. package/dist/cli/index.d.ts.map +1 -0
  36. package/dist/cli/index.js +21 -0
  37. package/dist/cli/index.js.map +1 -0
  38. package/dist/cli/install-skill.d.ts +3 -0
  39. package/dist/cli/install-skill.d.ts.map +1 -0
  40. package/dist/cli/install-skill.js +50 -0
  41. package/dist/cli/install-skill.js.map +1 -0
  42. package/dist/cli/render.d.ts +4 -0
  43. package/dist/cli/render.d.ts.map +1 -0
  44. package/dist/cli/render.js +134 -0
  45. package/dist/cli/render.js.map +1 -0
  46. package/dist/cli/setup.d.ts +3 -0
  47. package/dist/cli/setup.d.ts.map +1 -0
  48. package/dist/cli/setup.js +60 -0
  49. package/dist/cli/setup.js.map +1 -0
  50. package/dist/compositor/DemoVideo.d.ts +4 -0
  51. package/dist/compositor/DemoVideo.d.ts.map +1 -0
  52. package/dist/compositor/DemoVideo.js +64 -0
  53. package/dist/compositor/DemoVideo.js.map +1 -0
  54. package/dist/compositor/Root.d.ts +3 -0
  55. package/dist/compositor/Root.d.ts.map +1 -0
  56. package/dist/compositor/Root.js +30 -0
  57. package/dist/compositor/Root.js.map +1 -0
  58. package/dist/compositor/components/AvatarPiP.d.ts +10 -0
  59. package/dist/compositor/components/AvatarPiP.d.ts.map +1 -0
  60. package/dist/compositor/components/AvatarPiP.js +52 -0
  61. package/dist/compositor/components/AvatarPiP.js.map +1 -0
  62. package/dist/compositor/components/BrowserFrame.d.ts +18 -0
  63. package/dist/compositor/components/BrowserFrame.d.ts.map +1 -0
  64. package/dist/compositor/components/BrowserFrame.js +97 -0
  65. package/dist/compositor/components/BrowserFrame.js.map +1 -0
  66. package/dist/compositor/components/Cursor.d.ts +13 -0
  67. package/dist/compositor/components/Cursor.d.ts.map +1 -0
  68. package/dist/compositor/components/Cursor.js +65 -0
  69. package/dist/compositor/components/Cursor.js.map +1 -0
  70. package/dist/compositor/components/Highlight.d.ts +9 -0
  71. package/dist/compositor/components/Highlight.d.ts.map +1 -0
  72. package/dist/compositor/components/Highlight.js +83 -0
  73. package/dist/compositor/components/Highlight.js.map +1 -0
  74. package/dist/compositor/components/IntroOutro.d.ts +10 -0
  75. package/dist/compositor/components/IntroOutro.d.ts.map +1 -0
  76. package/dist/compositor/components/IntroOutro.js +48 -0
  77. package/dist/compositor/components/IntroOutro.js.map +1 -0
  78. package/dist/compositor/components/SceneTransition.d.ts +9 -0
  79. package/dist/compositor/components/SceneTransition.d.ts.map +1 -0
  80. package/dist/compositor/components/SceneTransition.js +35 -0
  81. package/dist/compositor/components/SceneTransition.js.map +1 -0
  82. package/dist/compositor/components/Subtitles.d.ts +9 -0
  83. package/dist/compositor/components/Subtitles.d.ts.map +1 -0
  84. package/dist/compositor/components/Subtitles.js +45 -0
  85. package/dist/compositor/components/Subtitles.js.map +1 -0
  86. package/dist/compositor/index.d.ts +2 -0
  87. package/dist/compositor/index.d.ts.map +1 -0
  88. package/dist/compositor/index.js +4 -0
  89. package/dist/compositor/index.js.map +1 -0
  90. package/dist/compositor/timing.d.ts +16 -0
  91. package/dist/compositor/timing.d.ts.map +1 -0
  92. package/dist/compositor/timing.js +39 -0
  93. package/dist/compositor/timing.js.map +1 -0
  94. package/dist/d-id/client.d.ts +50 -0
  95. package/dist/d-id/client.d.ts.map +1 -0
  96. package/dist/d-id/client.js +114 -0
  97. package/dist/d-id/client.js.map +1 -0
  98. package/dist/d-id/generate.d.ts +9 -0
  99. package/dist/d-id/generate.d.ts.map +1 -0
  100. package/dist/d-id/generate.js +81 -0
  101. package/dist/d-id/generate.js.map +1 -0
  102. package/dist/utils/config.d.ts +14 -0
  103. package/dist/utils/config.d.ts.map +1 -0
  104. package/dist/utils/config.js +34 -0
  105. package/dist/utils/config.js.map +1 -0
  106. package/dist/utils/schema.d.ts +273 -0
  107. package/dist/utils/schema.d.ts.map +1 -0
  108. package/dist/utils/schema.js +98 -0
  109. package/dist/utils/schema.js.map +1 -0
  110. package/package.json +54 -0
  111. package/remotion.config.ts +4 -0
  112. package/skills/make-demo/SKILL.md +282 -0
  113. package/skills/make-demo/references/demo-script-schema.md +47 -0
  114. package/skills/make-demo/references/render-props-schema.md +49 -0
  115. 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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerDidCommand(program: Command): void;
3
+ //# sourceMappingURL=d-id.d.ts.map
@@ -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"}
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerDoctorCommand(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerInstallSkillCommand(program: Command): void;
3
+ //# sourceMappingURL=install-skill.d.ts.map
@@ -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,4 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerRenderCommand(program: Command): void;
3
+ export declare function registerPreviewCommand(program: Command): void;
4
+ //# sourceMappingURL=render.d.ts.map
@@ -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,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerSetupCommand(program: Command): void;
3
+ //# sourceMappingURL=setup.d.ts.map
@@ -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,4 @@
1
+ import React from "react";
2
+ import type { RenderProps } from "../utils/schema.js";
3
+ export declare const DemoVideo: React.FC<RenderProps>;
4
+ //# sourceMappingURL=DemoVideo.d.ts.map
@@ -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"}