blitzreels 0.0.0 → 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 CHANGED
@@ -1,3 +1,73 @@
1
- # BlitzReels CLI
1
+ # blitzreels
2
2
 
3
- Placeholder package reserved for the public BlitzReels command-line interface.
3
+ Command-line video editing control surface for BlitzReels.
4
+
5
+ This is the primary CLI package. The scoped package `@blitzreels/cli` wraps this
6
+ package for users who prefer scoped installs.
7
+
8
+ ## Install
9
+
10
+ After the first real publish:
11
+
12
+ ```bash
13
+ npx blitzreels auth login
14
+ ```
15
+
16
+ Local repo development:
17
+
18
+ ```bash
19
+ pnpm --filter blitzreels dev auth login --base-url http://localhost:3000/api/v1
20
+ ```
21
+
22
+ ## Auth
23
+
24
+ ```bash
25
+ blitzreels auth login
26
+ blitzreels auth set-key --api-key br_live_...
27
+ blitzreels auth whoami
28
+ ```
29
+
30
+ `auth login` opens BlitzReels in your browser, asks you to approve a one-time
31
+ CLI code, then stores the generated API key in macOS Keychain when available or
32
+ `~/.blitzreels/config.json` as a fallback. Use `--no-browser` on remote shells
33
+ and open the printed URL manually.
34
+
35
+ API keys are environment-bounded:
36
+
37
+ - production uses `br_live_...`
38
+ - local/development uses `br_test_...`
39
+
40
+ ## Commands
41
+
42
+ ```bash
43
+ blitzreels project inspect --project-id PROJECT_ID --json
44
+ blitzreels project timeline --project-id PROJECT_ID --json
45
+ blitzreels project snapshot --project-id PROJECT_ID --at 00:03
46
+ blitzreels project snapshots --project-id PROJECT_ID --at 00:01,00:03
47
+
48
+ blitzreels text add --project-id PROJECT_ID --text "Hook" --at 0 --duration 4
49
+ blitzreels text list --project-id PROJECT_ID --json
50
+ blitzreels text update --project-id PROJECT_ID --content-item-id CONTENT_ITEM_ID --text "New hook"
51
+ blitzreels text remove --project-id PROJECT_ID --content-item-id CONTENT_ITEM_ID
52
+
53
+ blitzreels audio add --project-id PROJECT_ID --asset-id ASSET_ID --at 0 --volume 0.6
54
+
55
+ blitzreels silence plan --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --json
56
+ blitzreels silence apply --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --confirm-preview
57
+
58
+ blitzreels mistakes plan --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --json
59
+ blitzreels mistakes apply --project-id PROJECT_ID --timeline-item-id TIMELINE_ITEM_ID --confirm-preview
60
+
61
+ blitzreels captions themes list --json
62
+ blitzreels captions theme set --project-id PROJECT_ID --theme-id THEME_ID
63
+ blitzreels captions theme set-default --theme-id THEME_ID
64
+
65
+ blitzreels exports start --project-id PROJECT_ID
66
+ blitzreels exports wait --export-id EXPORT_ID
67
+ blitzreels exports download --export-id EXPORT_ID --output ./short.mp4
68
+
69
+ blitzreels api docs
70
+ blitzreels api spec
71
+ ```
72
+
73
+ Use `--json` for script and AI-agent workflows.
@@ -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/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,909 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join, resolve } from "node:path";
6
+ import { BlitzReelsClient, BlitzReelsError, } from "@blitzreels/sdk";
7
+ const CONFIG_PATH = join(homedir(), ".blitzreels", "config.json");
8
+ const KEYCHAIN_SERVICE = "BlitzReels CLI";
9
+ const KEYCHAIN_ACCOUNT = "api-key";
10
+ const DEFAULT_WAIT_INTERVAL_MS = 3000;
11
+ const DEFAULT_WAIT_TIMEOUT_MS = 20 * 60 * 1000;
12
+ async function main() {
13
+ const parsed = parseArgs({ argv: process.argv.slice(2) });
14
+ if (parsed.command.length === 0 ||
15
+ getBooleanFlag({ flags: parsed.flags, name: "help" })) {
16
+ printHelp();
17
+ return;
18
+ }
19
+ const config = await loadConfig();
20
+ const apiKey = getStringFlag({ flags: parsed.flags, name: "api-key" }) ??
21
+ process.env.BLITZREELS_API_KEY ??
22
+ config.apiKey;
23
+ const baseUrl = getStringFlag({ flags: parsed.flags, name: "base-url" }) ??
24
+ process.env.BLITZREELS_BASE_URL ??
25
+ config.baseUrl;
26
+ const clientConfig = {
27
+ apiKey,
28
+ baseUrl,
29
+ fetchFn: undefined,
30
+ userAgent: "blitzreels-cli/0.0.0",
31
+ };
32
+ const context = {
33
+ args: parsed,
34
+ json: getBooleanFlag({ flags: parsed.flags, name: "json" }),
35
+ client: new BlitzReelsClient(clientConfig),
36
+ config: { apiKey, baseUrl, keyStorage: config.keyStorage },
37
+ };
38
+ await runCommand({ context });
39
+ }
40
+ async function runCommand({ context }) {
41
+ const [group, action, subaction] = context.args.command;
42
+ if (group === "auth" && action === "set-key") {
43
+ await setApiKey({ context });
44
+ return;
45
+ }
46
+ if (group === "auth" && action === "login") {
47
+ await loginWithBrowser({ context });
48
+ return;
49
+ }
50
+ if (group === "auth" && action === "whoami") {
51
+ const result = await context.client.auth.validate();
52
+ printResult({
53
+ json: context.json,
54
+ value: result,
55
+ human: [
56
+ `Workspace: ${result.organization_id}`,
57
+ `User: ${result.user_id}`,
58
+ `Plan: ${result.plan}`,
59
+ `Environment: ${result.environment}`,
60
+ `Docs: ${result.docs_url}`,
61
+ ],
62
+ });
63
+ return;
64
+ }
65
+ if (group === "api" && action === "spec") {
66
+ const url = new URL(context.config.baseUrl ?? "https://www.blitzreels.com/api/v1");
67
+ url.pathname = "/api/openapi.json";
68
+ printResult({
69
+ json: context.json,
70
+ value: { url: url.toString() },
71
+ human: [url.toString()],
72
+ });
73
+ return;
74
+ }
75
+ if (group === "api" && action === "docs") {
76
+ const url = new URL(context.config.baseUrl ?? "https://www.blitzreels.com/api/v1");
77
+ url.pathname = "/api/docs.md";
78
+ printResult({
79
+ json: context.json,
80
+ value: { url: url.toString() },
81
+ human: [url.toString()],
82
+ });
83
+ return;
84
+ }
85
+ requireApiKey({ apiKey: context.config.apiKey });
86
+ if (group === "project" && action === "inspect") {
87
+ const projectId = requireStringFlag({
88
+ flags: context.args.flags,
89
+ name: "project-id",
90
+ });
91
+ const mode = getStringFlag({ flags: context.args.flags, name: "mode" }) ?? "full";
92
+ const result = await context.client.projects.inspect({
93
+ projectId,
94
+ mode: parseContextMode({ value: mode }),
95
+ });
96
+ printResult({
97
+ json: context.json,
98
+ value: result,
99
+ human: [
100
+ `Project context loaded (${result.mode}).`,
101
+ JSON.stringify(result.data, null, 2),
102
+ ],
103
+ });
104
+ return;
105
+ }
106
+ if (group === "project" && action === "timeline") {
107
+ const projectId = requireStringFlag({
108
+ flags: context.args.flags,
109
+ name: "project-id",
110
+ });
111
+ const result = await context.client.projects.timeline({ projectId });
112
+ printResult({
113
+ json: context.json,
114
+ value: result,
115
+ human: [JSON.stringify(result.data, null, 2)],
116
+ });
117
+ return;
118
+ }
119
+ if (group === "project" && action === "snapshot") {
120
+ const result = await context.client.projects.renderSnapshot({
121
+ projectId: requireStringFlag({
122
+ flags: context.args.flags,
123
+ name: "project-id",
124
+ }),
125
+ atSeconds: parseTimecode({
126
+ value: requireStringFlag({ flags: context.args.flags, name: "at" }),
127
+ }),
128
+ targetWidth: getNumberFlag({
129
+ flags: context.args.flags,
130
+ name: "target-width",
131
+ }),
132
+ imageFormat: parseImageFormat({
133
+ value: getStringFlag({
134
+ flags: context.args.flags,
135
+ name: "image-format",
136
+ }),
137
+ }),
138
+ });
139
+ printResult({
140
+ json: context.json,
141
+ value: result,
142
+ human: [`Snapshot: ${result.preview_url}`],
143
+ });
144
+ return;
145
+ }
146
+ if (group === "project" && action === "snapshots") {
147
+ const at = requireStringFlag({ flags: context.args.flags, name: "at" });
148
+ const result = await context.client.projects.renderSnapshots({
149
+ projectId: requireStringFlag({
150
+ flags: context.args.flags,
151
+ name: "project-id",
152
+ }),
153
+ atSeconds: at.split(",").map((value) => parseTimecode({ value })),
154
+ targetWidth: getNumberFlag({
155
+ flags: context.args.flags,
156
+ name: "target-width",
157
+ }),
158
+ imageFormat: parseImageFormat({
159
+ value: getStringFlag({
160
+ flags: context.args.flags,
161
+ name: "image-format",
162
+ }),
163
+ }),
164
+ });
165
+ printResult({
166
+ json: context.json,
167
+ value: result,
168
+ human: result.previews.map((preview) => `${preview.time_seconds}s ${preview.preview_url}`),
169
+ });
170
+ return;
171
+ }
172
+ if (group === "text" && action === "add") {
173
+ const result = await context.client.text.add({
174
+ projectId: requireStringFlag({
175
+ flags: context.args.flags,
176
+ name: "project-id",
177
+ }),
178
+ text: requireStringFlag({ flags: context.args.flags, name: "text" }),
179
+ name: getStringFlag({ flags: context.args.flags, name: "name" }),
180
+ startSeconds: parseTimecode({
181
+ value: getStringFlag({ flags: context.args.flags, name: "at" }) ?? "0",
182
+ }),
183
+ durationSeconds: getNumberFlag({ flags: context.args.flags, name: "duration" }) ?? 4,
184
+ layerIndex: getNumberFlag({
185
+ flags: context.args.flags,
186
+ name: "layer-index",
187
+ }),
188
+ });
189
+ printResult({
190
+ json: context.json,
191
+ value: result,
192
+ human: [`Text added: ${result.content_item_id}`],
193
+ });
194
+ return;
195
+ }
196
+ if (group === "text" && action === "list") {
197
+ const result = await context.client.text.list({
198
+ projectId: requireStringFlag({
199
+ flags: context.args.flags,
200
+ name: "project-id",
201
+ }),
202
+ });
203
+ printResult({
204
+ json: context.json,
205
+ value: result,
206
+ human: result.data.map((item) => `${item.content_item_id} ${item.kind} ${item.name} ${item.start_seconds ?? "-"}s`),
207
+ });
208
+ return;
209
+ }
210
+ if (group === "text" && action === "remove") {
211
+ const result = await context.client.text.remove({
212
+ projectId: requireStringFlag({
213
+ flags: context.args.flags,
214
+ name: "project-id",
215
+ }),
216
+ contentItemId: requireStringFlag({
217
+ flags: context.args.flags,
218
+ name: "content-item-id",
219
+ }),
220
+ });
221
+ printResult({
222
+ json: context.json,
223
+ value: result,
224
+ human: ["Text removed."],
225
+ });
226
+ return;
227
+ }
228
+ if (group === "text" && action === "update") {
229
+ const result = await context.client.text.update({
230
+ projectId: requireStringFlag({
231
+ flags: context.args.flags,
232
+ name: "project-id",
233
+ }),
234
+ contentItemId: requireStringFlag({
235
+ flags: context.args.flags,
236
+ name: "content-item-id",
237
+ }),
238
+ text: getStringFlag({ flags: context.args.flags, name: "text" }),
239
+ name: getStringFlag({ flags: context.args.flags, name: "name" }),
240
+ spec: parseJsonObjectFlag({
241
+ flags: context.args.flags,
242
+ name: "spec-json",
243
+ }),
244
+ });
245
+ printResult({
246
+ json: context.json,
247
+ value: result,
248
+ human: ["Text updated."],
249
+ });
250
+ return;
251
+ }
252
+ if (group === "audio" && action === "add") {
253
+ const result = await context.client.audio.add({
254
+ projectId: requireStringFlag({
255
+ flags: context.args.flags,
256
+ name: "project-id",
257
+ }),
258
+ assetId: requireStringFlag({
259
+ flags: context.args.flags,
260
+ name: "asset-id",
261
+ }),
262
+ startSeconds: parseTimecode({
263
+ value: getStringFlag({ flags: context.args.flags, name: "at" }) ?? "0",
264
+ }),
265
+ durationSeconds: getNumberFlag({
266
+ flags: context.args.flags,
267
+ name: "duration",
268
+ }),
269
+ volume: getNumberFlag({ flags: context.args.flags, name: "volume" }),
270
+ fadeInSeconds: getNumberFlag({
271
+ flags: context.args.flags,
272
+ name: "fade-in",
273
+ }),
274
+ fadeOutSeconds: getNumberFlag({
275
+ flags: context.args.flags,
276
+ name: "fade-out",
277
+ }),
278
+ loop: getOptionalBooleanFlag({ flags: context.args.flags, name: "loop" }),
279
+ });
280
+ printResult({
281
+ json: context.json,
282
+ value: result,
283
+ human: [
284
+ `Inserted ${result.summary.inserted}/${result.summary.total} audio item(s).`,
285
+ ],
286
+ });
287
+ return;
288
+ }
289
+ if (group === "silence" && action === "plan") {
290
+ const result = await context.client.silence.plan({
291
+ projectId: requireStringFlag({
292
+ flags: context.args.flags,
293
+ name: "project-id",
294
+ }),
295
+ timelineItemId: requireStringFlag({
296
+ flags: context.args.flags,
297
+ name: "timeline-item-id",
298
+ }),
299
+ paddingMs: getNumberFlag({
300
+ flags: context.args.flags,
301
+ name: "padding-ms",
302
+ }),
303
+ silenceThresholdDb: getNumberFlag({
304
+ flags: context.args.flags,
305
+ name: "silence-threshold-db",
306
+ }),
307
+ minSilenceDurationSeconds: getNumberFlag({
308
+ flags: context.args.flags,
309
+ name: "min-silence-duration",
310
+ }),
311
+ removeBlipsMaxDurationSeconds: getNumberFlag({
312
+ flags: context.args.flags,
313
+ name: "remove-blips-max-duration",
314
+ }),
315
+ useCaptionValidation: getOptionalBooleanFlag({
316
+ flags: context.args.flags,
317
+ name: "use-caption-validation",
318
+ }),
319
+ });
320
+ printResult({
321
+ json: context.json,
322
+ value: result,
323
+ human: [JSON.stringify(result, null, 2)],
324
+ });
325
+ return;
326
+ }
327
+ if (group === "silence" && action === "apply") {
328
+ const result = await context.client.silence.apply({
329
+ projectId: requireStringFlag({
330
+ flags: context.args.flags,
331
+ name: "project-id",
332
+ }),
333
+ timelineItemId: requireStringFlag({
334
+ flags: context.args.flags,
335
+ name: "timeline-item-id",
336
+ }),
337
+ paddingMs: getNumberFlag({
338
+ flags: context.args.flags,
339
+ name: "padding-ms",
340
+ }),
341
+ silenceThresholdDb: getNumberFlag({
342
+ flags: context.args.flags,
343
+ name: "silence-threshold-db",
344
+ }),
345
+ minSilenceDurationSeconds: getNumberFlag({
346
+ flags: context.args.flags,
347
+ name: "min-silence-duration",
348
+ }),
349
+ removeBlipsMaxDurationSeconds: getNumberFlag({
350
+ flags: context.args.flags,
351
+ name: "remove-blips-max-duration",
352
+ }),
353
+ useCaptionValidation: getOptionalBooleanFlag({
354
+ flags: context.args.flags,
355
+ name: "use-caption-validation",
356
+ }),
357
+ deleteSilentClips: getOptionalBooleanFlag({
358
+ flags: context.args.flags,
359
+ name: "delete-silent-clips",
360
+ }),
361
+ manualSegmentOverrides: parseStringRecordFlag({
362
+ flags: context.args.flags,
363
+ name: "manual-segment-overrides-json",
364
+ }),
365
+ previewConfirmed: requireConfirmPreview({ flags: context.args.flags }),
366
+ });
367
+ printResult({
368
+ json: context.json,
369
+ value: result,
370
+ human: [JSON.stringify(result, null, 2)],
371
+ });
372
+ return;
373
+ }
374
+ if (group === "mistakes" && action === "plan") {
375
+ const result = await context.client.mistakes.plan({
376
+ projectId: requireStringFlag({
377
+ flags: context.args.flags,
378
+ name: "project-id",
379
+ }),
380
+ timelineItemId: requireStringFlag({
381
+ flags: context.args.flags,
382
+ name: "timeline-item-id",
383
+ }),
384
+ });
385
+ printResult({
386
+ json: context.json,
387
+ value: result,
388
+ human: [JSON.stringify(result, null, 2)],
389
+ });
390
+ return;
391
+ }
392
+ if (group === "mistakes" && action === "apply") {
393
+ const result = await context.client.mistakes.apply({
394
+ projectId: requireStringFlag({
395
+ flags: context.args.flags,
396
+ name: "project-id",
397
+ }),
398
+ timelineItemId: requireStringFlag({
399
+ flags: context.args.flags,
400
+ name: "timeline-item-id",
401
+ }),
402
+ plan: parseJsonObjectFlag({
403
+ flags: context.args.flags,
404
+ name: "plan-json",
405
+ }),
406
+ manualVerdicts: parseStringRecordFlag({
407
+ flags: context.args.flags,
408
+ name: "manual-verdicts-json",
409
+ }),
410
+ deleteMistakes: getOptionalBooleanFlag({
411
+ flags: context.args.flags,
412
+ name: "delete-mistakes",
413
+ }),
414
+ previewConfirmed: requireConfirmPreview({ flags: context.args.flags }),
415
+ });
416
+ printResult({
417
+ json: context.json,
418
+ value: result,
419
+ human: [JSON.stringify(result, null, 2)],
420
+ });
421
+ return;
422
+ }
423
+ if (group === "captions" && action === "themes" && subaction === "list") {
424
+ const result = await context.client.captions.listThemes();
425
+ printResult({
426
+ json: context.json,
427
+ value: result,
428
+ human: result.themes.map((theme) => JSON.stringify(theme)),
429
+ });
430
+ return;
431
+ }
432
+ if (group === "captions" && action === "theme" && subaction === "set") {
433
+ const result = await context.client.captions.setProjectTheme({
434
+ projectId: requireStringFlag({
435
+ flags: context.args.flags,
436
+ name: "project-id",
437
+ }),
438
+ themeId: requireStringFlag({
439
+ flags: context.args.flags,
440
+ name: "theme-id",
441
+ }),
442
+ });
443
+ printResult({
444
+ json: context.json,
445
+ value: result,
446
+ human: ["Project caption theme updated."],
447
+ });
448
+ return;
449
+ }
450
+ if (group === "captions" &&
451
+ action === "theme" &&
452
+ subaction === "set-default") {
453
+ const result = await context.client.captions.setDefaultTheme({
454
+ themeId: requireStringFlag({
455
+ flags: context.args.flags,
456
+ name: "theme-id",
457
+ }),
458
+ });
459
+ printResult({
460
+ json: context.json,
461
+ value: result,
462
+ human: ["Default caption theme updated."],
463
+ });
464
+ return;
465
+ }
466
+ if (group === "exports" && action === "start") {
467
+ const result = await context.client.exports.start({
468
+ projectId: requireStringFlag({
469
+ flags: context.args.flags,
470
+ name: "project-id",
471
+ }),
472
+ resolution: getStringFlag({
473
+ flags: context.args.flags,
474
+ name: "resolution",
475
+ }),
476
+ format: getStringFlag({ flags: context.args.flags, name: "format" }),
477
+ includeCaptions: getOptionalBooleanFlag({
478
+ flags: context.args.flags,
479
+ name: "include-captions",
480
+ }),
481
+ });
482
+ printResult({
483
+ json: context.json,
484
+ value: result,
485
+ human: [`Export queued: ${result.export_id ?? result.job_id}`],
486
+ });
487
+ return;
488
+ }
489
+ if (group === "exports" && action === "wait") {
490
+ const result = await context.client.exports.wait({
491
+ exportId: requireStringFlag({
492
+ flags: context.args.flags,
493
+ name: "export-id",
494
+ }),
495
+ intervalMs: getNumberFlag({ flags: context.args.flags, name: "interval-ms" }) ??
496
+ DEFAULT_WAIT_INTERVAL_MS,
497
+ timeoutMs: getNumberFlag({ flags: context.args.flags, name: "timeout-ms" }) ??
498
+ DEFAULT_WAIT_TIMEOUT_MS,
499
+ });
500
+ printResult({
501
+ json: context.json,
502
+ value: result,
503
+ human: [
504
+ `Export ready: ${result.download_url ?? result.short_download_url ?? result.export_id}`,
505
+ ],
506
+ });
507
+ return;
508
+ }
509
+ if (group === "exports" && action === "download") {
510
+ const output = requireStringFlag({
511
+ flags: context.args.flags,
512
+ name: "output",
513
+ });
514
+ const bytes = await context.client.exports.download({
515
+ exportId: requireStringFlag({
516
+ flags: context.args.flags,
517
+ name: "export-id",
518
+ }),
519
+ });
520
+ await writeFile(resolve(output), Buffer.from(bytes));
521
+ printResult({
522
+ json: context.json,
523
+ value: { output },
524
+ human: [`Downloaded export: ${output}`],
525
+ });
526
+ return;
527
+ }
528
+ throw new Error(`Unknown command: ${context.args.command.join(" ")}`);
529
+ }
530
+ async function setApiKey({ context }) {
531
+ const apiKey = getStringFlag({ flags: context.args.flags, name: "api-key" }) ??
532
+ process.env.BLITZREELS_API_KEY;
533
+ if (!apiKey) {
534
+ throw new Error("Pass --api-key or set BLITZREELS_API_KEY.");
535
+ }
536
+ const savedToKeychain = await saveApiKey({ apiKey });
537
+ const config = {
538
+ apiKey: savedToKeychain ? "" : apiKey,
539
+ baseUrl: getStringFlag({ flags: context.args.flags, name: "base-url" }),
540
+ keyStorage: savedToKeychain ? "keychain" : "config",
541
+ };
542
+ await mkdir(dirname(CONFIG_PATH), { recursive: true });
543
+ await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {
544
+ mode: 0o600,
545
+ });
546
+ printResult({
547
+ json: context.json,
548
+ value: { configPath: CONFIG_PATH },
549
+ human: [`API key saved to ${CONFIG_PATH}`],
550
+ });
551
+ }
552
+ async function loginWithBrowser({ context, }) {
553
+ const appUrl = resolveAppUrl({ baseUrl: context.config.baseUrl });
554
+ const startResponse = await fetch(`${appUrl}/api/cli/auth/device`, {
555
+ method: "POST",
556
+ headers: { Accept: "application/json" },
557
+ });
558
+ if (!startResponse.ok) {
559
+ throw new Error(`Failed to start CLI login (${startResponse.status}).`);
560
+ }
561
+ const login = (await startResponse.json());
562
+ const shouldOpenBrowser = !getBooleanFlag({
563
+ flags: context.args.flags,
564
+ name: "no-browser",
565
+ });
566
+ if (shouldOpenBrowser) {
567
+ openBrowser({ url: login.verification_uri_complete });
568
+ }
569
+ const loginInstructions = [
570
+ `First copy your one-time code: ${login.user_code}`,
571
+ `Then open: ${login.verification_uri_complete}`,
572
+ "Waiting for browser approval...",
573
+ ];
574
+ if (context.json) {
575
+ console.error(loginInstructions.join("\n"));
576
+ }
577
+ else {
578
+ printResult({
579
+ json: context.json,
580
+ value: {
581
+ user_code: login.user_code,
582
+ verification_uri: login.verification_uri_complete,
583
+ expires_in: login.expires_in,
584
+ },
585
+ human: loginInstructions,
586
+ });
587
+ }
588
+ const startedAt = Date.now();
589
+ const timeoutMs = Math.min(login.expires_in * 1000, getNumberFlag({ flags: context.args.flags, name: "timeout-ms" }) ??
590
+ login.expires_in * 1000);
591
+ const intervalMs = Math.max(1000, login.interval * 1000);
592
+ while (Date.now() - startedAt <= timeoutMs) {
593
+ await sleep({ ms: intervalMs });
594
+ const pollResponse = await fetch(`${appUrl}/api/cli/auth/token`, {
595
+ method: "POST",
596
+ headers: {
597
+ Accept: "application/json",
598
+ "Content-Type": "application/json",
599
+ },
600
+ body: JSON.stringify({ device_code: login.device_code }),
601
+ });
602
+ const result = (await pollResponse.json());
603
+ if (result.status === "approved" && result.api_key) {
604
+ await persistLoggedInApiKey({
605
+ apiKey: result.api_key,
606
+ baseUrl: context.config.baseUrl,
607
+ });
608
+ printResult({
609
+ json: context.json,
610
+ value: { success: true, key_prefix: result.key_prefix ?? "" },
611
+ human: [`Logged in. API key prefix: ${result.key_prefix ?? "saved"}`],
612
+ });
613
+ return;
614
+ }
615
+ if (result.status === "expired" ||
616
+ result.status === "denied" ||
617
+ result.status === "invalid" ||
618
+ result.status === "consumed") {
619
+ throw new Error(`Login failed: ${result.status}.`);
620
+ }
621
+ }
622
+ throw new Error("Timed out waiting for browser approval.");
623
+ }
624
+ async function loadConfig() {
625
+ try {
626
+ const raw = await readFile(CONFIG_PATH, "utf8");
627
+ const value = JSON.parse(raw);
628
+ const keyStorage = value.keyStorage === "keychain" ? "keychain" : "config";
629
+ const keychainApiKey = keyStorage === "keychain" ? await readKeychainApiKey() : "";
630
+ return {
631
+ apiKey: keychainApiKey ||
632
+ (typeof value.apiKey === "string" ? value.apiKey : ""),
633
+ baseUrl: typeof value.baseUrl === "string" ? value.baseUrl : undefined,
634
+ keyStorage,
635
+ };
636
+ }
637
+ catch {
638
+ return { apiKey: "", baseUrl: undefined, keyStorage: undefined };
639
+ }
640
+ }
641
+ function parseArgs({ argv }) {
642
+ const command = [];
643
+ const flags = {};
644
+ for (let index = 0; index < argv.length; index++) {
645
+ const value = argv[index];
646
+ if (value === undefined) {
647
+ continue;
648
+ }
649
+ if (!value.startsWith("--")) {
650
+ command.push(value);
651
+ continue;
652
+ }
653
+ const [rawKey, inlineValue] = value.slice(2).split("=", 2);
654
+ const key = rawKey ?? "";
655
+ if (inlineValue !== undefined) {
656
+ flags[key] = inlineValue;
657
+ continue;
658
+ }
659
+ const next = argv[index + 1];
660
+ if (next !== undefined && !next.startsWith("--")) {
661
+ flags[key] = next;
662
+ index++;
663
+ continue;
664
+ }
665
+ flags[key] = true;
666
+ }
667
+ return { command, flags };
668
+ }
669
+ function getStringFlag({ flags, name, }) {
670
+ const value = flags[name];
671
+ return typeof value === "string" ? value : undefined;
672
+ }
673
+ function requireStringFlag({ flags, name, }) {
674
+ const value = getStringFlag({ flags, name });
675
+ if (!value) {
676
+ throw new Error(`Missing required --${name}.`);
677
+ }
678
+ return value;
679
+ }
680
+ function getBooleanFlag({ flags, name, }) {
681
+ return flags[name] === true || flags[name] === "true";
682
+ }
683
+ function getOptionalBooleanFlag({ flags, name, }) {
684
+ if (!(name in flags)) {
685
+ return undefined;
686
+ }
687
+ return getBooleanFlag({ flags, name });
688
+ }
689
+ function getNumberFlag({ flags, name, }) {
690
+ const value = getStringFlag({ flags, name });
691
+ if (value === undefined) {
692
+ return undefined;
693
+ }
694
+ const parsed = Number(value);
695
+ if (!Number.isFinite(parsed)) {
696
+ throw new Error(`--${name} must be a number.`);
697
+ }
698
+ return parsed;
699
+ }
700
+ function parseJsonObjectFlag({ flags, name, }) {
701
+ const value = getStringFlag({ flags, name });
702
+ if (value === undefined) {
703
+ return undefined;
704
+ }
705
+ const parsed = JSON.parse(value);
706
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
707
+ throw new Error(`--${name} must be a JSON object.`);
708
+ }
709
+ return parsed;
710
+ }
711
+ function parseStringRecordFlag({ flags, name, }) {
712
+ const value = parseJsonObjectFlag({ flags, name });
713
+ if (value === undefined) {
714
+ return undefined;
715
+ }
716
+ for (const [key, item] of Object.entries(value)) {
717
+ if (typeof item !== "string") {
718
+ throw new Error(`--${name}.${key} must be a string.`);
719
+ }
720
+ }
721
+ return value;
722
+ }
723
+ function requireConfirmPreview({ flags }) {
724
+ if (!getBooleanFlag({ flags, name: "confirm-preview" })) {
725
+ throw new Error("Destructive edits require --confirm-preview after reviewing a plan.");
726
+ }
727
+ return true;
728
+ }
729
+ function parseTimecode({ value }) {
730
+ const trimmed = value.trim();
731
+ if (/^\d+(\.\d+)?$/.test(trimmed)) {
732
+ return Number(trimmed);
733
+ }
734
+ const parts = trimmed.split(":").map((part) => Number(part));
735
+ if (parts.some((part) => !Number.isFinite(part))) {
736
+ throw new Error(`Invalid time value: ${value}`);
737
+ }
738
+ if (parts.length === 2) {
739
+ return (parts[0] ?? 0) * 60 + (parts[1] ?? 0);
740
+ }
741
+ if (parts.length === 3) {
742
+ return (parts[0] ?? 0) * 3600 + (parts[1] ?? 0) * 60 + (parts[2] ?? 0);
743
+ }
744
+ throw new Error(`Invalid time value: ${value}`);
745
+ }
746
+ function resolveAppUrl({ baseUrl }) {
747
+ const url = new URL(baseUrl ?? "https://www.blitzreels.com/api/v1");
748
+ return `${url.protocol}//${url.host}`;
749
+ }
750
+ function openBrowser({ url }) {
751
+ const command = process.platform === "darwin"
752
+ ? "open"
753
+ : process.platform === "win32"
754
+ ? "cmd"
755
+ : "xdg-open";
756
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
757
+ const child = spawn(command, args, {
758
+ detached: true,
759
+ stdio: "ignore",
760
+ });
761
+ child.unref();
762
+ }
763
+ function canUseKeychain() {
764
+ return (process.platform === "darwin" &&
765
+ process.env.BLITZREELS_DISABLE_KEYCHAIN !== "1");
766
+ }
767
+ function runSecurity({ args, }) {
768
+ return new Promise((resolveCommand) => {
769
+ const child = spawn("security", args, {
770
+ stdio: ["ignore", "pipe", "ignore"],
771
+ });
772
+ const chunks = [];
773
+ child.stdout.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
774
+ child.on("error", () => resolveCommand({ stdout: "", ok: false }));
775
+ child.on("close", (code) => resolveCommand({
776
+ stdout: Buffer.concat(chunks).toString("utf8").trim(),
777
+ ok: code === 0,
778
+ }));
779
+ });
780
+ }
781
+ function sleep({ ms }) {
782
+ return new Promise((resolveSleep) => {
783
+ setTimeout(resolveSleep, ms);
784
+ });
785
+ }
786
+ async function saveApiKey({ apiKey }) {
787
+ if (!canUseKeychain()) {
788
+ return false;
789
+ }
790
+ const result = await runSecurity({
791
+ args: [
792
+ "add-generic-password",
793
+ "-a",
794
+ KEYCHAIN_ACCOUNT,
795
+ "-s",
796
+ KEYCHAIN_SERVICE,
797
+ "-w",
798
+ apiKey,
799
+ "-U",
800
+ ],
801
+ });
802
+ return result.ok;
803
+ }
804
+ async function readKeychainApiKey() {
805
+ if (!canUseKeychain()) {
806
+ return "";
807
+ }
808
+ const result = await runSecurity({
809
+ args: [
810
+ "find-generic-password",
811
+ "-a",
812
+ KEYCHAIN_ACCOUNT,
813
+ "-s",
814
+ KEYCHAIN_SERVICE,
815
+ "-w",
816
+ ],
817
+ });
818
+ return result.ok ? result.stdout : "";
819
+ }
820
+ async function persistLoggedInApiKey({ apiKey, baseUrl, }) {
821
+ const savedToKeychain = await saveApiKey({ apiKey });
822
+ const config = {
823
+ apiKey: savedToKeychain ? "" : apiKey,
824
+ baseUrl,
825
+ keyStorage: savedToKeychain ? "keychain" : "config",
826
+ };
827
+ await mkdir(dirname(CONFIG_PATH), { recursive: true });
828
+ await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), {
829
+ mode: 0o600,
830
+ });
831
+ }
832
+ function parseImageFormat({ value, }) {
833
+ if (value === undefined) {
834
+ return undefined;
835
+ }
836
+ if (value === "jpeg" || value === "png") {
837
+ return value;
838
+ }
839
+ throw new Error("--image-format must be jpeg or png.");
840
+ }
841
+ function parseContextMode({ value, }) {
842
+ if (value === "summary" ||
843
+ value === "assets" ||
844
+ value === "timeline" ||
845
+ value === "transcript" ||
846
+ value === "full") {
847
+ return value;
848
+ }
849
+ throw new Error("--mode must be summary, assets, timeline, transcript, or full.");
850
+ }
851
+ function requireApiKey({ apiKey }) {
852
+ if (!apiKey) {
853
+ throw new Error("Missing API key. Run `blitzreels auth login`, `blitzreels auth set-key --api-key ...`, or set BLITZREELS_API_KEY.");
854
+ }
855
+ }
856
+ function printResult({ json, value, human, }) {
857
+ if (json) {
858
+ console.log(JSON.stringify(value, null, 2));
859
+ return;
860
+ }
861
+ console.log(human.join("\n"));
862
+ }
863
+ function printHelp() {
864
+ console.log(`blitzreels
865
+
866
+ Usage:
867
+ blitzreels auth login [--no-browser]
868
+ blitzreels auth set-key --api-key KEY [--base-url URL]
869
+ blitzreels auth whoami [--json]
870
+ blitzreels project inspect --project-id ID [--mode full] [--json]
871
+ blitzreels project timeline --project-id ID [--json]
872
+ blitzreels project snapshot --project-id ID --at 00:03 [--json]
873
+ blitzreels project snapshots --project-id ID --at 00:01,00:03 [--json]
874
+ blitzreels text add --project-id ID --text "Hook" [--at 0] [--duration 4]
875
+ blitzreels text list --project-id ID [--json]
876
+ blitzreels text update --project-id ID --content-item-id ID [--text "New hook"]
877
+ blitzreels text remove --project-id ID --content-item-id ID
878
+ blitzreels audio add --project-id ID --asset-id ID [--at 0] [--volume 0.6]
879
+ blitzreels silence plan --project-id ID --timeline-item-id ID [--json]
880
+ blitzreels silence apply --project-id ID --timeline-item-id ID --confirm-preview
881
+ blitzreels mistakes plan --project-id ID --timeline-item-id ID [--json]
882
+ blitzreels mistakes apply --project-id ID --timeline-item-id ID --confirm-preview
883
+ blitzreels captions themes list [--json]
884
+ blitzreels captions theme set --project-id ID --theme-id ID
885
+ blitzreels captions theme set-default --theme-id ID
886
+ blitzreels exports start --project-id ID [--resolution 1080p] [--format mp4]
887
+ blitzreels exports wait --export-id ID [--json]
888
+ blitzreels exports download --export-id ID --output ./short.mp4
889
+ blitzreels api docs
890
+ blitzreels api spec
891
+
892
+ Global flags:
893
+ --api-key KEY
894
+ --base-url URL
895
+ --json
896
+ `);
897
+ }
898
+ main().catch((error) => {
899
+ if (error instanceof BlitzReelsError) {
900
+ const requestId = error.requestId ? ` request_id=${error.requestId}` : "";
901
+ console.error(`BlitzReels API error ${error.status}:${requestId} ${error.message}`);
902
+ process.exitCode = 1;
903
+ return;
904
+ }
905
+ const message = error instanceof Error ? error.message : String(error);
906
+ console.error(message);
907
+ process.exitCode = 1;
908
+ });
909
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,38 @@
1
1
  {
2
2
  "name": "blitzreels",
3
- "version": "0.0.0",
4
- "description": "Command-line interface for BlitzReels.",
3
+ "version": "0.1.0",
4
+ "description": "Command-line video editing control surface for BlitzReels.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
5
8
  "bin": {
6
- "blitzreels": "bin/blitzreels.js"
9
+ "blitzreels": "./dist/index.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
7
16
  },
8
17
  "files": [
9
- "bin",
18
+ "dist",
10
19
  "README.md"
11
20
  ],
12
- "license": "UNLICENSED"
13
- }
21
+ "dependencies": {
22
+ "@blitzreels/sdk": "^0.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "tsx": "^4.21.0"
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.json && node scripts/make-bin-executable.mjs",
35
+ "typecheck": "tsc -p tsconfig.json --noEmit",
36
+ "dev": "tsx src/index.ts"
37
+ }
38
+ }
package/bin/blitzreels.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- console.log("BlitzReels CLI is coming soon.");