demofly 0.2.8 → 0.2.10

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 (56) hide show
  1. package/README.md +154 -0
  2. package/dist/commands/analyze.d.ts +3 -0
  3. package/dist/commands/analyze.d.ts.map +1 -0
  4. package/dist/commands/analyze.js +163 -0
  5. package/dist/commands/analyze.js.map +1 -0
  6. package/dist/commands/demos/open.d.ts.map +1 -1
  7. package/dist/commands/demos/open.js +2 -1
  8. package/dist/commands/demos/open.js.map +1 -1
  9. package/dist/commands/generate.d.ts.map +1 -1
  10. package/dist/commands/generate.js +467 -198
  11. package/dist/commands/generate.js.map +1 -1
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +1 -15
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/push.d.ts.map +1 -1
  16. package/dist/commands/push.js +20 -1
  17. package/dist/commands/push.js.map +1 -1
  18. package/dist/commands/render.d.ts.map +1 -1
  19. package/dist/commands/render.js +5 -2
  20. package/dist/commands/render.js.map +1 -1
  21. package/dist/commands/tts.d.ts.map +1 -1
  22. package/dist/commands/tts.js +127 -12
  23. package/dist/commands/tts.js.map +1 -1
  24. package/dist/commands/voices/select.d.ts.map +1 -1
  25. package/dist/commands/voices/select.js +66 -11
  26. package/dist/commands/voices/select.js.map +1 -1
  27. package/dist/lib/audio-probe.d.ts +23 -0
  28. package/dist/lib/audio-probe.d.ts.map +1 -0
  29. package/dist/lib/audio-probe.js +59 -0
  30. package/dist/lib/audio-probe.js.map +1 -0
  31. package/dist/lib/checks.d.ts.map +1 -1
  32. package/dist/lib/checks.js +51 -16
  33. package/dist/lib/checks.js.map +1 -1
  34. package/dist/lib/demo-config.d.ts +7 -0
  35. package/dist/lib/demo-config.d.ts.map +1 -1
  36. package/dist/lib/demo-config.js +9 -0
  37. package/dist/lib/demo-config.js.map +1 -1
  38. package/dist/lib/edit-proposals.d.ts +48 -1
  39. package/dist/lib/edit-proposals.d.ts.map +1 -1
  40. package/dist/lib/edit-proposals.js +49 -0
  41. package/dist/lib/edit-proposals.js.map +1 -1
  42. package/dist/lib/push-project.d.ts +37 -0
  43. package/dist/lib/push-project.d.ts.map +1 -0
  44. package/dist/lib/push-project.js +194 -0
  45. package/dist/lib/push-project.js.map +1 -0
  46. package/dist/lib/retiming.js +47 -0
  47. package/dist/lib/retiming.js.map +1 -1
  48. package/dist/lib/scene-assembler.d.ts +32 -0
  49. package/dist/lib/scene-assembler.d.ts.map +1 -0
  50. package/dist/lib/scene-assembler.js +185 -0
  51. package/dist/lib/scene-assembler.js.map +1 -0
  52. package/dist/lib/voice-resolver.d.ts +4 -0
  53. package/dist/lib/voice-resolver.d.ts.map +1 -1
  54. package/dist/lib/voice-resolver.js +5 -2
  55. package/dist/lib/voice-resolver.js.map +1 -1
  56. package/package.json +1 -1
package/README.md ADDED
@@ -0,0 +1,154 @@
1
+ # demofly
2
+
3
+ Automated demo video generation from the command line. Record browser interactions, generate narration with text-to-speech, and assemble polished demo videos — all in one workflow.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install -g demofly
9
+ ```
10
+
11
+ Requires **Node.js 22** or later.
12
+
13
+ ## Quick Start
14
+
15
+ ```bash
16
+ # Initialize prerequisites (Playwright, ffmpeg, TTS models)
17
+ demofly init
18
+
19
+ # Generate a demo (record + narrate + assemble)
20
+ demofly generate my-demo --record
21
+
22
+ # Push to the cloud
23
+ demofly push my-demo
24
+ ```
25
+
26
+ ## Commands
27
+
28
+ ### Core Workflow
29
+
30
+ | Command | Description |
31
+ |---------|-------------|
32
+ | `demofly init` | Install prerequisites (Playwright, ffmpeg, Kokoro TTS model) |
33
+ | `demofly generate <demo>` | Record, narrate, and assemble a demo video |
34
+ | `demofly push <demo>` | Push a completed demo to the demofly cloud |
35
+ | `demofly status` | Check prerequisite status without installing |
36
+
37
+ ### Generate Options
38
+
39
+ ```
40
+ --record Record browser interactions with Playwright
41
+ --audio Generate narration audio only
42
+ --video Record video only (skip audio)
43
+ --assemble Full intelligent assembly (align + retiming)
44
+ --scene <id> Generate audio for a specific scene
45
+ --voice <name> TTS voice (e.g., "heart", "aria")
46
+ --provider <provider> TTS provider (kokoro, elevenlabs, openai)
47
+ --speed <multiplier> TTS speed multiplier (default: 1.0)
48
+ --no-audio Skip TTS generation
49
+ --verbose Show detailed debug output
50
+ ```
51
+
52
+ ### Authentication
53
+
54
+ ```bash
55
+ demofly auth login # Device code flow (default)
56
+ demofly auth login --browser # OAuth browser flow
57
+ demofly auth login --otp # Email OTP
58
+ demofly auth logout # Clear credentials
59
+ demofly auth status # Check login state
60
+ ```
61
+
62
+ ### Demo Management
63
+
64
+ ```bash
65
+ demofly demos list # List local and cloud demos
66
+ demofly demos get <name> # Get demo details
67
+ demofly demos update <name> # Update demo metadata
68
+ demofly demos delete <name> # Delete a demo
69
+ demofly demos open <name> # Open demo in browser
70
+ ```
71
+
72
+ ### Voice Selection
73
+
74
+ ```bash
75
+ demofly voices list # List available TTS voices
76
+ demofly voices select # Choose a default voice interactively
77
+ ```
78
+
79
+ ### Utilities
80
+
81
+ ```bash
82
+ demofly version # Print CLI version
83
+ demofly update # Update to latest version
84
+ demofly update --check # Check for updates without installing
85
+ ```
86
+
87
+ ## Voices
88
+
89
+ ### Local (free, always available)
90
+
91
+ Powered by [Kokoro](https://github.com/thewh1teagle/kokoro-onnx) — runs entirely on your machine, no API key needed.
92
+
93
+ | Voice | Gender |
94
+ |-------|--------|
95
+ | heart | Female |
96
+ | bella | Female |
97
+ | nicole | Female |
98
+ | nova | Female |
99
+ | sarah | Female |
100
+ | adam | Male |
101
+ | michael | Male |
102
+
103
+ ### Cloud (Pro)
104
+
105
+ With a Pro subscription, access premium voices from **ElevenLabs** and **OpenAI**. Run `demofly voices list` to see all available options.
106
+
107
+ ## Project Structure
108
+
109
+ After running `demofly init`, a `demofly/` directory is created in your project root. Each demo gets its own subdirectory:
110
+
111
+ ```
112
+ demofly/
113
+ └── my-demo/
114
+ ├── demo.spec.ts # Playwright test script
115
+ ├── playwright.config.ts # Playwright configuration
116
+ ├── proposal.md # Demo proposal and metadata
117
+ ├── script.md # Demo script outline
118
+ ├── narration.md # Scene-by-scene narration for TTS
119
+ ├── demofly.json # Demo config (cloud sync ID)
120
+ ├── audio/ # Generated TTS audio per scene
121
+ └── recordings/ # Recorded video, timing data, final output
122
+ ├── video.webm
123
+ ├── timing.json
124
+ └── final.mp4
125
+ ```
126
+
127
+ ## Claude Code Integration
128
+
129
+ Demofly works with [Claude Code](https://docs.anthropic.com/en/docs/claude-code) to create demos conversationally. Running `demofly init` installs the Playwright MCP plugin so Claude Code can drive the browser and record demos for you.
130
+
131
+ ## Configuration
132
+
133
+ ### Default Voice
134
+
135
+ Set with `demofly voices select` or pass `--voice` and `--provider` flags per command. Stored in `~/.config/demofly/config.json`.
136
+
137
+ ### Credentials
138
+
139
+ Authentication tokens are stored in `~/.demofly/credentials` with restricted file permissions.
140
+
141
+ ### Environment Variables
142
+
143
+ | Variable | Description |
144
+ |----------|-------------|
145
+ | `DEMOFLY_URL` | Override the API base URL (default: `https://app.demofly.ai`) |
146
+
147
+ ## Links
148
+
149
+ - **Website:** [demofly.ai](https://demofly.ai)
150
+ - **Issues:** [GitHub Issues](https://github.com/llama-farm/demofly/issues)
151
+
152
+ ## License
153
+
154
+ MIT
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerAnalyzeCommand(program: Command): void;
3
+ //# sourceMappingURL=analyze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkLzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsD7D"}
@@ -0,0 +1,163 @@
1
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { resolve, extname } from "node:path";
3
+ import { normalizeTimingData } from "../lib/timing.js";
4
+ import { hasFfprobe, probeAudioDuration, computeOverflow, } from "../lib/audio-probe.js";
5
+ function findAudioFile(audioDir, sceneId) {
6
+ const extensions = [".wav", ".mp3", ".aac", ".m4a", ".ogg"];
7
+ for (const ext of extensions) {
8
+ const filePath = resolve(audioDir, `${sceneId}${ext}`);
9
+ if (existsSync(filePath))
10
+ return filePath;
11
+ }
12
+ return null;
13
+ }
14
+ function analyzeScenes(timingData, audioDir) {
15
+ const results = [];
16
+ for (const scene of timingData.scenes) {
17
+ const windowMs = scene.endMs - scene.startMs;
18
+ const audioPath = findAudioFile(audioDir, scene.sceneId);
19
+ if (!audioPath) {
20
+ results.push({
21
+ sceneId: scene.sceneId,
22
+ windowMs,
23
+ audioDurationMs: 0,
24
+ overflowMs: 0,
25
+ status: "no-audio",
26
+ severity: "ok",
27
+ });
28
+ continue;
29
+ }
30
+ const audioDurationMs = probeAudioDuration(audioPath);
31
+ const { overflowMs, severity } = computeOverflow(audioDurationMs, windowMs);
32
+ results.push({
33
+ sceneId: scene.sceneId,
34
+ windowMs,
35
+ audioDurationMs,
36
+ overflowMs,
37
+ status: overflowMs > 0 ? "overflow" : "fit",
38
+ severity,
39
+ });
40
+ }
41
+ return results;
42
+ }
43
+ function buildReport(demo, scenes) {
44
+ const scenesWithAudio = scenes.filter((s) => s.status !== "no-audio");
45
+ const overflowScenes = scenes.filter((s) => s.overflowMs > 0);
46
+ return {
47
+ demo,
48
+ timestamp: new Date().toISOString(),
49
+ scenes,
50
+ summary: {
51
+ totalScenes: scenes.length,
52
+ scenesWithAudio: scenesWithAudio.length,
53
+ scenesOverflow: overflowScenes.length,
54
+ scenesUnderflow: scenesWithAudio.filter((s) => s.overflowMs < 0).length,
55
+ maxOverflowMs: overflowScenes.length > 0
56
+ ? Math.max(...overflowScenes.map((s) => s.overflowMs))
57
+ : 0,
58
+ totalOverflowMs: overflowScenes.reduce((sum, s) => sum + s.overflowMs, 0),
59
+ },
60
+ };
61
+ }
62
+ const COLORS = {
63
+ reset: "\x1b[0m",
64
+ green: "\x1b[32m",
65
+ yellow: "\x1b[33m",
66
+ red: "\x1b[31m",
67
+ dim: "\x1b[2m",
68
+ bold: "\x1b[1m",
69
+ };
70
+ function severityColor(severity) {
71
+ switch (severity) {
72
+ case "ok": return COLORS.green;
73
+ case "warning": return COLORS.yellow;
74
+ case "critical": return COLORS.red;
75
+ }
76
+ }
77
+ function formatMs(ms) {
78
+ return `${(ms / 1000).toFixed(1)}s`;
79
+ }
80
+ function printTable(report) {
81
+ const header = `${COLORS.bold}Scene${COLORS.reset}`.padEnd(25) +
82
+ "Window".padEnd(10) +
83
+ "Audio".padEnd(10) +
84
+ "Overflow".padEnd(12) +
85
+ "Status";
86
+ console.log(`\n${COLORS.bold}--- demofly analyze: ${report.demo} ---${COLORS.reset}\n`);
87
+ console.log(header);
88
+ console.log("─".repeat(60));
89
+ for (const scene of report.scenes) {
90
+ const color = severityColor(scene.severity);
91
+ const sceneCol = scene.sceneId.padEnd(15);
92
+ const windowCol = formatMs(scene.windowMs).padEnd(10);
93
+ if (scene.status === "no-audio") {
94
+ console.log(`${sceneCol}${windowCol}${COLORS.dim}—${COLORS.reset}`.padEnd(35) +
95
+ `${"—".padEnd(12)}${COLORS.dim}no audio${COLORS.reset}`);
96
+ continue;
97
+ }
98
+ const audioCol = formatMs(scene.audioDurationMs).padEnd(10);
99
+ const overflowSign = scene.overflowMs > 0 ? "+" : "";
100
+ const overflowCol = `${overflowSign}${formatMs(scene.overflowMs)}`.padEnd(12);
101
+ const statusLabel = scene.status === "overflow"
102
+ ? scene.severity
103
+ : "ok";
104
+ console.log(`${sceneCol}${windowCol}${audioCol}${color}${overflowCol}${statusLabel}${COLORS.reset}`);
105
+ }
106
+ console.log("─".repeat(60));
107
+ const { summary } = report;
108
+ const parts = [
109
+ `${summary.totalScenes} scene(s)`,
110
+ `${summary.scenesWithAudio} with audio`,
111
+ ];
112
+ if (summary.scenesOverflow > 0) {
113
+ parts.push(`${COLORS.yellow}${summary.scenesOverflow} overflow${COLORS.reset} (max ${formatMs(summary.maxOverflowMs)}, total ${formatMs(summary.totalOverflowMs)})`);
114
+ }
115
+ else {
116
+ parts.push(`${COLORS.green}0 overflow${COLORS.reset}`);
117
+ }
118
+ console.log(parts.join(" | "));
119
+ console.log();
120
+ }
121
+ export function registerAnalyzeCommand(program) {
122
+ program
123
+ .command("analyze <demo>")
124
+ .description("Analyze audio timing fit against scene durations")
125
+ .option("--json", "Output JSON to stdout (no table, no file written)")
126
+ .option("--no-file", "Print table but skip writing analysis.json")
127
+ .action((demo, opts) => {
128
+ const projectDir = resolve(process.cwd(), "demofly", demo);
129
+ const recordingsDir = resolve(projectDir, "recordings");
130
+ const timingPath = resolve(recordingsDir, "timing.json");
131
+ const audioDir = resolve(projectDir, "audio");
132
+ if (!existsSync(timingPath)) {
133
+ console.error(`No timing.json found at ${timingPath}. Run \`demofly generate ${demo} --record\` first.`);
134
+ process.exit(1);
135
+ }
136
+ if (!existsSync(audioDir) || readdirSync(audioDir).filter((f) => {
137
+ const ext = extname(f).toLowerCase();
138
+ return [".mp3", ".wav", ".aac", ".m4a", ".ogg"].includes(ext);
139
+ }).length === 0) {
140
+ console.error(`No audio files found in ${audioDir}. Generate audio first with \`demofly generate ${demo}\`.`);
141
+ process.exit(1);
142
+ }
143
+ if (!hasFfprobe()) {
144
+ console.error("ffprobe is required for audio analysis. Install ffmpeg to continue.");
145
+ process.exit(1);
146
+ }
147
+ const timingData = normalizeTimingData(JSON.parse(readFileSync(timingPath, "utf-8")));
148
+ const scenes = analyzeScenes(timingData, audioDir);
149
+ const report = buildReport(demo, scenes);
150
+ if (opts.json) {
151
+ console.log(JSON.stringify(report, null, 2));
152
+ return;
153
+ }
154
+ printTable(report);
155
+ // opts.file is false when --no-file is passed (commander negation)
156
+ if (opts.file !== false) {
157
+ const outputPath = resolve(recordingsDir, "analysis.json");
158
+ writeFileSync(outputPath, JSON.stringify(report, null, 2) + "\n", "utf-8");
159
+ console.log(` Analysis written to ${outputPath}\n`);
160
+ }
161
+ });
162
+ }
163
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/demos/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAoBxD"}
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/demos/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAuBxD"}
@@ -33,7 +33,8 @@ export function registerOpenCommand(demos) {
33
33
  const token = await requireAuth();
34
34
  const client = createApiClient(token);
35
35
  try {
36
- const demo = await resolveDemoBySlug(client, name);
36
+ const { id } = await resolveDemoBySlug(client, name);
37
+ const demo = await client.get(`/demos/${encodeURIComponent(id)}`);
37
38
  console.log(`Opening ${demo.url}`);
38
39
  openUrl(demo.url);
39
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/demos/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;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,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,KAAc;IAChD,KAAK;SACF,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,4BAA4B,CAAC;SACzC,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,IAAI,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAEnD,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../../src/commands/demos/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;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,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,KAAc;IAChD,KAAK;SACF,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,4BAA4B,CAAC;SACzC,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,EAAE,EAAE,EAAE,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACrD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,UAAU,kBAAkB,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,wBAAwB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACjF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA+QnD,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CA4BV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CA0CV;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CA6BV;AAoQD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0W9D"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAofnD,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CAmCV;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CA0CV;AAED,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CA6BV;AA0TD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0Y9D"}