demofly 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/dist/commands/auth/index.d.ts +3 -0
  2. package/dist/commands/auth/index.d.ts.map +1 -0
  3. package/dist/commands/auth/index.js +13 -0
  4. package/dist/commands/auth/index.js.map +1 -0
  5. package/dist/commands/auth/login.d.ts +3 -0
  6. package/dist/commands/auth/login.d.ts.map +1 -0
  7. package/dist/commands/auth/login.js +109 -0
  8. package/dist/commands/auth/login.js.map +1 -0
  9. package/dist/commands/auth/logout.d.ts +3 -0
  10. package/dist/commands/auth/logout.d.ts.map +1 -0
  11. package/dist/commands/auth/logout.js +21 -0
  12. package/dist/commands/auth/logout.js.map +1 -0
  13. package/dist/commands/auth/status.d.ts +3 -0
  14. package/dist/commands/auth/status.d.ts.map +1 -0
  15. package/dist/commands/auth/status.js +25 -0
  16. package/dist/commands/auth/status.js.map +1 -0
  17. package/dist/commands/generate.d.ts +3 -0
  18. package/dist/commands/generate.d.ts.map +1 -0
  19. package/dist/commands/generate.js +373 -0
  20. package/dist/commands/generate.js.map +1 -0
  21. package/dist/commands/init.d.ts +3 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +384 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/projects/delete.d.ts +3 -0
  26. package/dist/commands/projects/delete.d.ts.map +1 -0
  27. package/dist/commands/projects/delete.js +41 -0
  28. package/dist/commands/projects/delete.js.map +1 -0
  29. package/dist/commands/projects/get.d.ts +3 -0
  30. package/dist/commands/projects/get.d.ts.map +1 -0
  31. package/dist/commands/projects/get.js +30 -0
  32. package/dist/commands/projects/get.js.map +1 -0
  33. package/dist/commands/projects/index.d.ts +3 -0
  34. package/dist/commands/projects/index.d.ts.map +1 -0
  35. package/dist/commands/projects/index.js +17 -0
  36. package/dist/commands/projects/index.js.map +1 -0
  37. package/dist/commands/projects/list.d.ts +3 -0
  38. package/dist/commands/projects/list.d.ts.map +1 -0
  39. package/dist/commands/projects/list.js +40 -0
  40. package/dist/commands/projects/list.js.map +1 -0
  41. package/dist/commands/projects/open.d.ts +3 -0
  42. package/dist/commands/projects/open.d.ts.map +1 -0
  43. package/dist/commands/projects/open.js +45 -0
  44. package/dist/commands/projects/open.js.map +1 -0
  45. package/dist/commands/projects/update.d.ts +3 -0
  46. package/dist/commands/projects/update.d.ts.map +1 -0
  47. package/dist/commands/projects/update.js +31 -0
  48. package/dist/commands/projects/update.js.map +1 -0
  49. package/dist/commands/push.d.ts +3 -0
  50. package/dist/commands/push.d.ts.map +1 -0
  51. package/dist/commands/push.js +86 -0
  52. package/dist/commands/push.js.map +1 -0
  53. package/dist/commands/tts.d.ts +3 -0
  54. package/dist/commands/tts.d.ts.map +1 -0
  55. package/dist/commands/tts.js +44 -0
  56. package/dist/commands/tts.js.map +1 -0
  57. package/dist/index.d.ts +3 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +25 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/lib/api-client.d.ts +13 -0
  62. package/dist/lib/api-client.d.ts.map +1 -0
  63. package/dist/lib/api-client.js +58 -0
  64. package/dist/lib/api-client.js.map +1 -0
  65. package/dist/lib/credentials.d.ts +5 -0
  66. package/dist/lib/credentials.d.ts.map +1 -0
  67. package/dist/lib/credentials.js +101 -0
  68. package/dist/lib/credentials.js.map +1 -0
  69. package/dist/lib/timing.d.ts +29 -0
  70. package/dist/lib/timing.d.ts.map +1 -0
  71. package/dist/lib/timing.js +145 -0
  72. package/dist/lib/timing.js.map +1 -0
  73. package/dist/lib/tts.d.ts +42 -0
  74. package/dist/lib/tts.d.ts.map +1 -0
  75. package/dist/lib/tts.js +198 -0
  76. package/dist/lib/tts.js.map +1 -0
  77. package/package.json +39 -0
@@ -0,0 +1,384 @@
1
+ import {} from "commander";
2
+ import { execSync, execFileSync } from "node:child_process";
3
+ import { existsSync, mkdirSync } from "node:fs";
4
+ import { createInterface } from "node:readline";
5
+ import { resolve } from "node:path";
6
+ import { homedir } from "node:os";
7
+ function runCommand(cmd, opts) {
8
+ const result = execSync(cmd, {
9
+ stdio: opts?.stdio ?? "pipe",
10
+ encoding: "utf-8",
11
+ timeout: 120_000,
12
+ });
13
+ // execSync returns null when stdio is "inherit"
14
+ return (result ?? "").trim();
15
+ }
16
+ function commandExists(cmd) {
17
+ try {
18
+ runCommand(`which ${cmd}`);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }
25
+ function canResolvePackage(packageName) {
26
+ try {
27
+ runCommand(`node -e "require.resolve('${packageName}')"`);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ function ensurePlaywrightTest() {
35
+ const label = "@playwright/test";
36
+ if (canResolvePackage("@playwright/test")) {
37
+ return { label, ok: true, skipped: true };
38
+ }
39
+ try {
40
+ console.log("Installing @playwright/test...");
41
+ runCommand("npm install @playwright/test", { stdio: "inherit" });
42
+ return { label, ok: true };
43
+ }
44
+ catch {
45
+ return { label, ok: false };
46
+ }
47
+ }
48
+ function ensurePlaywrightChromium() {
49
+ const label = "Playwright Chromium";
50
+ try {
51
+ runCommand("npx playwright install chromium", { stdio: "inherit" });
52
+ return { label, ok: true };
53
+ }
54
+ catch {
55
+ return { label, ok: false };
56
+ }
57
+ }
58
+ function detectPackageManager() {
59
+ if (process.platform === "darwin") {
60
+ if (commandExists("brew")) {
61
+ return { cmd: "brew", args: ["install", "ffmpeg"], sudo: false };
62
+ }
63
+ return null;
64
+ }
65
+ if (process.platform === "linux") {
66
+ if (commandExists("apt-get")) {
67
+ return { cmd: "apt-get", args: ["install", "-y", "ffmpeg"], sudo: true };
68
+ }
69
+ if (commandExists("dnf")) {
70
+ return { cmd: "dnf", args: ["install", "-y", "ffmpeg"], sudo: true };
71
+ }
72
+ if (commandExists("pacman")) {
73
+ return { cmd: "pacman", args: ["-S", "--noconfirm", "ffmpeg"], sudo: true };
74
+ }
75
+ if (commandExists("zypper")) {
76
+ return { cmd: "zypper", args: ["install", "-y", "ffmpeg"], sudo: true };
77
+ }
78
+ return null;
79
+ }
80
+ return null;
81
+ }
82
+ async function ensureFfmpeg(opts) {
83
+ const label = "ffmpeg";
84
+ if (commandExists("ffmpeg")) {
85
+ return { label, ok: true, skipped: true };
86
+ }
87
+ const pm = detectPackageManager();
88
+ // No supported package manager — manual instructions only
89
+ if (!pm) {
90
+ if (process.platform === "darwin") {
91
+ console.log("ffmpeg not found. Install Homebrew (https://brew.sh) then run: brew install ffmpeg\n" +
92
+ "Or download from https://ffmpeg.org/download.html");
93
+ }
94
+ else if (process.platform === "linux") {
95
+ console.log("ffmpeg not found. No supported package manager detected.\n" +
96
+ "Install manually: sudo apt install ffmpeg (Debian/Ubuntu) or sudo dnf install ffmpeg (Fedora)");
97
+ }
98
+ else {
99
+ console.log("ffmpeg not found. Download from https://ffmpeg.org/download.html");
100
+ }
101
+ return { label, ok: false };
102
+ }
103
+ // Non-interactive: skip unless --yes
104
+ if (!opts.yes && !process.stdin.isTTY) {
105
+ const installCmd = pm.sudo
106
+ ? `sudo ${pm.cmd} ${pm.args.join(" ")}`
107
+ : `${pm.cmd} ${pm.args.join(" ")}`;
108
+ console.log(`Warning: ffmpeg is missing. Run with --yes to auto-install, or run manually:\n ${installCmd}`);
109
+ return { label, ok: false };
110
+ }
111
+ // Prompt for approval (unless --yes)
112
+ if (!opts.yes) {
113
+ const installCmd = pm.sudo
114
+ ? `sudo ${pm.cmd} ${pm.args.join(" ")}`
115
+ : `${pm.cmd} ${pm.args.join(" ")}`;
116
+ const approved = await promptUser(`ffmpeg is not installed. Install via \`${installCmd}\`?${pm.sudo ? " This requires sudo." : ""}`);
117
+ if (!approved) {
118
+ console.log(`Skipped. You can install manually with: ${installCmd}`);
119
+ return { label, ok: false };
120
+ }
121
+ }
122
+ // Run the install
123
+ try {
124
+ if (pm.sudo) {
125
+ const isRoot = typeof process.getuid === "function" && process.getuid() === 0;
126
+ if (isRoot) {
127
+ console.log(`Installing ffmpeg via ${pm.cmd}...`);
128
+ execFileSync(pm.cmd, pm.args, {
129
+ stdio: "inherit",
130
+ timeout: 120_000,
131
+ });
132
+ }
133
+ else {
134
+ if (!commandExists("sudo")) {
135
+ console.log(`sudo is not available. Install ffmpeg manually as root:\n ${pm.cmd} ${pm.args.join(" ")}`);
136
+ return { label, ok: false };
137
+ }
138
+ console.log(`Installing ffmpeg via sudo ${pm.cmd}...`);
139
+ execFileSync("sudo", [pm.cmd, ...pm.args], {
140
+ stdio: "inherit",
141
+ timeout: 120_000,
142
+ });
143
+ }
144
+ }
145
+ else {
146
+ console.log(`Installing ffmpeg via ${pm.cmd}...`);
147
+ execFileSync(pm.cmd, pm.args, {
148
+ stdio: "inherit",
149
+ timeout: 120_000,
150
+ });
151
+ }
152
+ }
153
+ catch {
154
+ console.log("ffmpeg installation command failed.");
155
+ return { label, ok: false };
156
+ }
157
+ // Post-install verification
158
+ if (commandExists("ffmpeg")) {
159
+ return { label, ok: true };
160
+ }
161
+ console.log("ffmpeg was installed but is not on PATH. You may need to restart your shell or install manually.");
162
+ return { label, ok: false };
163
+ }
164
+ function installPlaywrightPlugin() {
165
+ const label = "Playwright MCP plugin for Claude Code";
166
+ if (!commandExists("claude")) {
167
+ console.log("Claude CLI not found. Install it first: https://docs.anthropic.com/en/docs/claude-code");
168
+ return { label, ok: false };
169
+ }
170
+ try {
171
+ const output = runCommand("claude plugin list");
172
+ if (output.toLowerCase().includes("playwright")) {
173
+ return { label, ok: true, skipped: true };
174
+ }
175
+ }
176
+ catch {
177
+ // plugin list failed; try installing anyway
178
+ }
179
+ try {
180
+ console.log("Installing Playwright MCP plugin for Claude Code...");
181
+ runCommand("claude plugin install playwright@claude-plugins-official", { stdio: "inherit" });
182
+ return { label, ok: true };
183
+ }
184
+ catch {
185
+ return { label, ok: false };
186
+ }
187
+ }
188
+ function installDemoflyPlugin() {
189
+ const label = "Demofly plugin for Claude Code";
190
+ if (!commandExists("claude")) {
191
+ console.log("Claude CLI not found. Install it first: https://docs.anthropic.com/en/docs/claude-code");
192
+ return { label, ok: false };
193
+ }
194
+ try {
195
+ console.log("Registering demofly marketplace...");
196
+ runCommand("claude plugin marketplace add llama-farm/demofly-claude");
197
+ }
198
+ catch (err) {
199
+ const stderr = err.stderr ?? "";
200
+ const msg = err.message ?? "";
201
+ const combined = `${stderr} ${msg}`.toLowerCase();
202
+ if (!combined.includes("already installed")) {
203
+ console.log("Failed to register demofly marketplace.");
204
+ return { label, ok: false };
205
+ }
206
+ }
207
+ try {
208
+ console.log("Installing Demofly plugin for Claude Code...");
209
+ runCommand("claude plugin install demofly@demofly-marketplace", { stdio: "inherit" });
210
+ return { label, ok: true };
211
+ }
212
+ catch {
213
+ return { label, ok: false };
214
+ }
215
+ }
216
+ function promptUser(question) {
217
+ return new Promise((resolve) => {
218
+ const rl = createInterface({
219
+ input: process.stdin,
220
+ output: process.stdout,
221
+ });
222
+ rl.question(`${question} (y/N) `, (answer) => {
223
+ rl.close();
224
+ resolve(answer.trim().toLowerCase() === "y");
225
+ });
226
+ });
227
+ }
228
+ async function ensureSystemDeps(opts) {
229
+ const label = "Chromium system dependencies";
230
+ // Only relevant on Linux (WSL reports as linux, which is correct)
231
+ if (process.platform !== "linux") {
232
+ return { label, ok: true, skipped: true };
233
+ }
234
+ // Detect missing deps via dry-run
235
+ let hasMissingDeps = false;
236
+ let dryRunSupported = true;
237
+ try {
238
+ const output = runCommand("npx playwright install-deps --dry-run chromium 2>&1");
239
+ // If dry-run exits 0 with no actionable output, deps are likely present.
240
+ // Non-empty output listing packages indicates missing deps.
241
+ hasMissingDeps = output.length > 0 && !output.toLowerCase().includes("already");
242
+ }
243
+ catch {
244
+ // --dry-run not supported in this Playwright version; we'll ask the user
245
+ // and attempt the install directly if they approve.
246
+ dryRunSupported = false;
247
+ hasMissingDeps = true;
248
+ }
249
+ if (!hasMissingDeps) {
250
+ return { label, ok: true, skipped: true };
251
+ }
252
+ // Non-interactive: skip unless --yes
253
+ if (!opts.yes && !process.stdin.isTTY) {
254
+ console.log("Warning: Chromium system dependencies may be missing. Run with --yes to auto-install, or run manually:\n" +
255
+ " sudo npx playwright install-deps chromium");
256
+ return { label, ok: false };
257
+ }
258
+ // Prompt for approval (unless --yes)
259
+ if (!opts.yes) {
260
+ const msg = dryRunSupported
261
+ ? "System dependencies are missing for Chromium. Install them? This requires sudo."
262
+ : "Unable to detect system dependencies (dry-run not supported). Attempt to install Chromium system deps? This requires sudo.";
263
+ const approved = await promptUser(msg);
264
+ if (!approved) {
265
+ console.log("Skipped. You can install manually with: sudo npx playwright install-deps chromium");
266
+ return { label, ok: false };
267
+ }
268
+ }
269
+ // Determine how to run the install
270
+ const isRoot = typeof process.getuid === "function" && process.getuid() === 0;
271
+ if (isRoot) {
272
+ // Already root — run directly
273
+ try {
274
+ console.log("Installing Chromium system dependencies...");
275
+ runCommand("npx playwright install-deps chromium", { stdio: "inherit" });
276
+ return { label, ok: true };
277
+ }
278
+ catch {
279
+ return { label, ok: false };
280
+ }
281
+ }
282
+ // Need sudo
283
+ if (!commandExists("sudo")) {
284
+ console.log("sudo is not available. Install system dependencies manually as root:\n" +
285
+ " npx playwright install-deps chromium");
286
+ return { label, ok: false };
287
+ }
288
+ try {
289
+ console.log("Installing Chromium system dependencies (sudo)...");
290
+ execFileSync("sudo", ["npx", "playwright", "install-deps", "chromium"], {
291
+ stdio: "inherit",
292
+ timeout: 120_000,
293
+ });
294
+ return { label, ok: true };
295
+ }
296
+ catch {
297
+ return { label, ok: false };
298
+ }
299
+ }
300
+ function ensureDemoflyDir() {
301
+ const label = "demofly/ directory";
302
+ const dir = resolve(process.cwd(), "demofly");
303
+ if (existsSync(dir)) {
304
+ return { label, ok: true, skipped: true };
305
+ }
306
+ try {
307
+ mkdirSync(dir, { recursive: true });
308
+ return { label, ok: true };
309
+ }
310
+ catch {
311
+ return { label, ok: false };
312
+ }
313
+ }
314
+ function ensureKokoroModel() {
315
+ const label = "Kokoro TTS model";
316
+ const modelDir = resolve(homedir(), ".demofly", "models", "kokoro-en-v0_19");
317
+ const modelFile = resolve(modelDir, "model.onnx");
318
+ if (existsSync(modelFile)) {
319
+ return { label, ok: true, skipped: true };
320
+ }
321
+ const modelsDir = resolve(homedir(), ".demofly", "models");
322
+ const tarball = "/tmp/kokoro-en-v0_19.tar.bz2";
323
+ const url = "https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kokoro-en-v0_19.tar.bz2";
324
+ try {
325
+ mkdirSync(modelsDir, { recursive: true });
326
+ console.log("Downloading Kokoro TTS model (~80MB)...");
327
+ const downloadCmd = commandExists("wget")
328
+ ? `wget -q --show-progress "${url}" -O "${tarball}"`
329
+ : `curl -L --progress-bar "${url}" -o "${tarball}"`;
330
+ execSync(downloadCmd, { stdio: "inherit", timeout: 600_000 });
331
+ console.log("Extracting model...");
332
+ execSync(`tar xf "${tarball}" -C "${modelsDir}"`, { stdio: "inherit", timeout: 120_000 });
333
+ execSync(`rm -f "${tarball}"`, { stdio: "pipe" });
334
+ if (existsSync(modelFile)) {
335
+ return { label, ok: true };
336
+ }
337
+ console.log("Model extraction succeeded but model.onnx not found at expected path.");
338
+ return { label, ok: false };
339
+ }
340
+ catch {
341
+ console.log("Kokoro model download/extraction failed.");
342
+ return { label, ok: false };
343
+ }
344
+ }
345
+ function printSummary(results) {
346
+ console.log("\n--- demofly init summary ---\n");
347
+ for (const r of results) {
348
+ const icon = r.ok ? "\u2714" : "\u2718";
349
+ const suffix = r.ok && r.skipped ? " (already present)" : "";
350
+ console.log(` ${icon} ${r.label}${suffix}`);
351
+ }
352
+ const allOk = results.every((r) => r.ok);
353
+ console.log();
354
+ if (allOk) {
355
+ console.log("Ready! Use /demofly:create in Claude Code to create your first demo.");
356
+ }
357
+ else {
358
+ console.log("Not ready -- see issues above.");
359
+ }
360
+ }
361
+ export function registerInitCommand(program) {
362
+ program
363
+ .command("init")
364
+ .description("Initialize demofly prerequisites in the current project")
365
+ .option("-y, --yes", "Auto-approve prompts (for CI/scripted use)")
366
+ .action(async (opts) => {
367
+ console.log("Initializing demofly...\n");
368
+ const results = [];
369
+ results.push(ensurePlaywrightTest());
370
+ results.push(ensurePlaywrightChromium());
371
+ results.push(await ensureSystemDeps({ yes: opts.yes }));
372
+ results.push(await ensureFfmpeg({ yes: opts.yes }));
373
+ results.push(ensureKokoroModel());
374
+ results.push(installPlaywrightPlugin());
375
+ results.push(installDemoflyPlugin());
376
+ results.push(ensureDemoflyDir());
377
+ printSummary(results);
378
+ const allOk = results.every((r) => r.ok);
379
+ if (!allOk) {
380
+ process.exitCode = 1;
381
+ }
382
+ });
383
+ }
384
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerDeleteCommand(projects: Command): void;
3
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgC7D"}
@@ -0,0 +1,41 @@
1
+ import {} from "commander";
2
+ import { createInterface } from "node:readline";
3
+ import { createApiClient, requireAuth } from "../../lib/api-client.js";
4
+ function confirm(message) {
5
+ return new Promise((resolve) => {
6
+ const rl = createInterface({
7
+ input: process.stdin,
8
+ output: process.stdout,
9
+ });
10
+ rl.question(`${message} (y/N) `, (answer) => {
11
+ rl.close();
12
+ resolve(answer.trim().toLowerCase() === "y");
13
+ });
14
+ });
15
+ }
16
+ export function registerDeleteCommand(projects) {
17
+ projects
18
+ .command("delete <name>")
19
+ .description("Delete a project")
20
+ .option("-f, --force", "Skip confirmation prompt")
21
+ .action(async (name, opts) => {
22
+ const token = await requireAuth();
23
+ if (!opts.force) {
24
+ const confirmed = await confirm(`Are you sure you want to delete project '${name}'?`);
25
+ if (!confirmed) {
26
+ console.log("Cancelled.");
27
+ return;
28
+ }
29
+ }
30
+ const client = createApiClient(token);
31
+ try {
32
+ await client.delete(`/projects/${encodeURIComponent(name)}`);
33
+ console.log(`Deleted project '${name}'.`);
34
+ }
35
+ catch (error) {
36
+ console.error(`Failed to delete project: ${error instanceof Error ? error.message : String(error)}`);
37
+ process.exit(1);
38
+ }
39
+ });
40
+ }
41
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../src/commands/projects/delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEvE,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,eAAe,CAAC;YACzB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,QAAiB;IACrD,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,kBAAkB,CAAC;SAC/B,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;SACjD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAAyB,EAAE,EAAE;QACxD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAElC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,SAAS,GAAG,MAAM,OAAO,CAC7B,4CAA4C,IAAI,IAAI,CACrD,CAAC;YACF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CACjB,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE,CACxC,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,IAAI,CAAC,CAAC;QAC5C,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,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerGetCommand(projects: Command): void;
3
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgC1D"}
@@ -0,0 +1,30 @@
1
+ import {} from "commander";
2
+ import { createApiClient, requireAuth } from "../../lib/api-client.js";
3
+ export function registerGetCommand(projects) {
4
+ projects
5
+ .command("get <name>")
6
+ .description("Get details of a project")
7
+ .action(async (name) => {
8
+ const token = await requireAuth();
9
+ const client = createApiClient(token);
10
+ try {
11
+ const project = await client.get(`/projects/${encodeURIComponent(name)}`);
12
+ console.log(`Name: ${project.name}`);
13
+ console.log(`Status: ${project.status}`);
14
+ console.log(`Created: ${project.created}`);
15
+ console.log(`Updated: ${project.updated}`);
16
+ console.log(`URL: ${project.url}`);
17
+ if (project.exports && project.exports.length > 0) {
18
+ console.log(`Exports:`);
19
+ for (const exp of project.exports) {
20
+ console.log(` - ${exp}`);
21
+ }
22
+ }
23
+ }
24
+ catch (error) {
25
+ console.error(`Project '${name}' not found. ${error instanceof Error ? error.message : String(error)}`);
26
+ process.exit(1);
27
+ }
28
+ });
29
+ }
30
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../src/commands/projects/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAWvE,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,QAAQ;SACL,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,0BAA0B,CAAC;SACvC,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,cAAc,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;YAEzC,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBAClC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,YAAY,IAAI,gBAAgB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACzF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerProjectsCommands(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAU/D"}
@@ -0,0 +1,17 @@
1
+ import {} from "commander";
2
+ import { registerListCommand } from "./list.js";
3
+ import { registerGetCommand } from "./get.js";
4
+ import { registerUpdateCommand } from "./update.js";
5
+ import { registerDeleteCommand } from "./delete.js";
6
+ import { registerOpenCommand } from "./open.js";
7
+ export function registerProjectsCommands(program) {
8
+ const projects = program
9
+ .command("projects")
10
+ .description("Manage demofly projects");
11
+ registerListCommand(projects);
12
+ registerGetCommand(projects);
13
+ registerUpdateCommand(projects);
14
+ registerDeleteCommand(projects);
15
+ registerOpenCommand(projects);
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/projects/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,yBAAyB,CAAC,CAAC;IAE1C,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9B,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7B,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAChC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerListCommand(projects: Command): void;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAmD3D"}
@@ -0,0 +1,40 @@
1
+ import {} from "commander";
2
+ import { createApiClient, requireAuth } from "../../lib/api-client.js";
3
+ export function registerListCommand(projects) {
4
+ projects
5
+ .command("list")
6
+ .description("List all projects")
7
+ .action(async () => {
8
+ const token = await requireAuth();
9
+ const client = createApiClient(token);
10
+ try {
11
+ const items = await client.get("/projects");
12
+ if (items.length === 0) {
13
+ console.log("No projects found. Push a demo with: demofly push <project>");
14
+ return;
15
+ }
16
+ const nameWidth = Math.max("NAME".length, ...items.map((p) => p.name.length));
17
+ const statusWidth = Math.max("STATUS".length, ...items.map((p) => p.status.length));
18
+ const header = [
19
+ "NAME".padEnd(nameWidth),
20
+ "STATUS".padEnd(statusWidth),
21
+ "URL",
22
+ ].join(" ");
23
+ console.log(header);
24
+ console.log("-".repeat(header.length));
25
+ for (const item of items) {
26
+ const row = [
27
+ item.name.padEnd(nameWidth),
28
+ item.status.padEnd(statusWidth),
29
+ item.url,
30
+ ].join(" ");
31
+ console.log(row);
32
+ }
33
+ }
34
+ catch (error) {
35
+ console.error(`Failed to list projects: ${error instanceof Error ? error.message : String(error)}`);
36
+ process.exit(1);
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/projects/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQvE,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,mBAAmB,CAAC;SAChC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,GAAG,CAAmB,WAAW,CAAC,CAAC;YAE9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CACT,6DAA6D,CAC9D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,MAAM,CAAC,MAAM,EACb,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CACnC,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,QAAQ,CAAC,MAAM,EACf,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CACrC,CAAC;YAEF,MAAM,MAAM,GAAG;gBACb,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;gBACxB,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,KAAK;aACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEb,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG;oBACV,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC/B,IAAI,CAAC,GAAG;iBACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACrF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerOpenCommand(projects: Command): void;
3
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../../src/commands/projects/open.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCzC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAsB3D"}
@@ -0,0 +1,45 @@
1
+ import {} from "commander";
2
+ import { execFile } from "node:child_process";
3
+ import { createApiClient, requireAuth } from "../../lib/api-client.js";
4
+ function openUrl(url) {
5
+ const platform = process.platform;
6
+ let cmd;
7
+ let args;
8
+ if (platform === "darwin") {
9
+ cmd = "open";
10
+ args = [url];
11
+ }
12
+ else if (platform === "win32") {
13
+ cmd = "cmd";
14
+ args = ["/c", "start", "", url];
15
+ }
16
+ else {
17
+ cmd = "xdg-open";
18
+ args = [url];
19
+ }
20
+ execFile(cmd, args, (error) => {
21
+ if (error) {
22
+ console.error(`Failed to open browser: ${error.message}`);
23
+ console.log(`Open manually: ${url}`);
24
+ }
25
+ });
26
+ }
27
+ export function registerOpenCommand(projects) {
28
+ projects
29
+ .command("open <name>")
30
+ .description("Open a project in the browser")
31
+ .action(async (name) => {
32
+ const token = await requireAuth();
33
+ const client = createApiClient(token);
34
+ try {
35
+ const project = await client.get(`/projects/${encodeURIComponent(name)}`);
36
+ console.log(`Opening ${project.url}`);
37
+ openUrl(project.url);
38
+ }
39
+ catch (error) {
40
+ console.error(`Failed to open project: ${error instanceof Error ? error.message : String(error)}`);
41
+ process.exit(1);
42
+ }
43
+ });
44
+ }
45
+ //# sourceMappingURL=open.js.map