maeve-cli 0.9.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 LILY DIA PTY LTD
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,547 @@
1
+ # Maeve CLI
2
+
3
+ A command-line tool for the Maeve public API. Schedule posts, manage media, run analytics, and send client reviews from a terminal or a script.
4
+
5
+ [![npm](https://img.shields.io/npm/v/maeve-cli.svg)](https://www.npmjs.com/package/maeve-cli)
6
+ [![node](https://img.shields.io/node/v/maeve-cli.svg)](https://nodejs.org)
7
+ [![license](https://img.shields.io/npm/l/maeve-cli.svg)](./LICENSE)
8
+
9
+ ## Install
10
+
11
+ Run without installing:
12
+
13
+ ```bash
14
+ npx maeve-cli auth:status
15
+ pnpm dlx maeve-cli auth:status
16
+ ```
17
+
18
+ Install globally:
19
+
20
+ ```bash
21
+ npm install -g maeve-cli
22
+ maeve auth:status
23
+ ```
24
+
25
+ Or with pnpm:
26
+
27
+ ```bash
28
+ pnpm add -g maeve-cli
29
+ maeve auth:status
30
+ ```
31
+
32
+ Node 22 or newer is required.
33
+
34
+ ## Quick start
35
+
36
+ ```bash
37
+ maeve auth:login
38
+ maeve workspaces:list
39
+ maeve integrations:list --workspace <id>
40
+ ```
41
+
42
+ ## Authentication
43
+
44
+ There are two ways to sign in. Pick one.
45
+
46
+ ### API key (for CI, servers, scripts)
47
+
48
+ ```bash
49
+ export MAEVE_API_KEY="ezb_live_..."
50
+ export MAEVE_API_URL="https://api.maevesocial.com"
51
+ ```
52
+
53
+ PowerShell:
54
+
55
+ ```powershell
56
+ $env:MAEVE_API_KEY="ezb_live_..."
57
+ $env:MAEVE_API_URL="https://api.maevesocial.com"
58
+ ```
59
+
60
+ Prefer the env var over `--api-key`. Flags can leak into shell history and process lists.
61
+
62
+ For scoped keys stored under a named environment variable, pass the variable name instead of the secret value:
63
+
64
+ ```bash
65
+ maeve --api-key-env MAEVE_API_KEY_LILY_DIA_JEWELLERY_DEMO_KEY auth:status
66
+ maeve --api-key-env MAEVE_API_KEY_LILY_DIA_JEWELLERY_DEMO_KEY media:labels:list --workspace <id>
67
+ ```
68
+
69
+ When `--api-key-env` is provided, that named variable must exist; the CLI will not silently fall back to `MAEVE_API_KEY`.
70
+
71
+ ### Browser login (for humans on a laptop)
72
+
73
+ ```bash
74
+ maeve auth:login # opens a browser, prints a short code
75
+ maeve auth:whoami # shows the signed-in user and workspaces
76
+ maeve auth:logout # revokes the local token
77
+ ```
78
+
79
+ `auth:login` stores a revocable `ezb_cli_...` token for the API URL. Tokens expire after 7 days. They are never permanent API keys.
80
+
81
+ Use `--no-browser` if you want the URL printed instead of opened.
82
+
83
+ ### Credential precedence
84
+
85
+ The CLI uses the first credential it finds:
86
+
87
+ 1. `--api-key`
88
+ 2. `--api-key-env <name>`
89
+ 3. `MAEVE_API_KEY`
90
+ 4. Stored CLI login token
91
+
92
+ ### Where the token is stored
93
+
94
+ | Platform | Path |
95
+ | -------- | --------------------------------------------------- |
96
+ | Windows | `%APPDATA%\Maeve\cli-auth.json` |
97
+ | macOS | `~/Library/Application Support/Maeve/cli-auth.json` |
98
+ | Linux | `${XDG_CONFIG_HOME:-~/.config}/maeve/cli-auth.json` |
99
+
100
+ The file holds one credential per API URL. Token values are never printed by `auth:status` or any other command.
101
+
102
+ ## Output
103
+
104
+ Successful commands write JSON to stdout. Errors write structured JSON to stderr and exit non-zero. Pipe to `jq`:
105
+
106
+ ```bash
107
+ maeve workspaces:list | jq -r '.data[].id'
108
+ maeve content:list --workspace "$WORKSPACE_ID" --status scheduled | jq '.data | length'
109
+ ```
110
+
111
+ ## Commands
112
+
113
+ ### Auth
114
+
115
+ ```bash
116
+ maeve auth:status
117
+ maeve auth:login
118
+ maeve auth:logout
119
+ maeve auth:whoami
120
+ ```
121
+
122
+ ### Workspaces
123
+
124
+ ```bash
125
+ maeve workspaces:list
126
+ ```
127
+
128
+ ### Integrations
129
+
130
+ `integrations:capabilities` returns safe publishing metadata for a connected account: post types, media types, setting field names, dynamic option keys, and capability flags. It does not expose tokens, scopes, or raw provider payloads. Use `integrations:options` with a key from that response to fetch read-only provider data such as Pinterest boards or YouTube categories.
131
+
132
+ ```bash
133
+ maeve integrations:list --workspace <id>
134
+ maeve integrations:capabilities --workspace <id> --integration <id>
135
+ maeve integrations:options --workspace <id> --integration <id> --key pinterest-boards
136
+ maeve integrations:options --workspace <id> --integration <id> --key youtube-video-categories --json options.json
137
+ ```
138
+
139
+ Example option body:
140
+
141
+ ```json
142
+ { "regionCode": "AU" }
143
+ ```
144
+
145
+ ### Media
146
+
147
+ ```bash
148
+ maeve media:list --workspace <id>
149
+ maeve media:list --workspace <id> --type image --label-ids <id,id> --favorite
150
+ maeve media:list --workspace <id> --state deleted
151
+ maeve media:upload ./image.png --workspace <id>
152
+ maeve media:get --workspace <id> --id <mediaId>
153
+ maeve media:update --workspace <id> --id <mediaId> --json media-update.json
154
+ maeve media:download-url --workspace <id> --id <mediaId>
155
+ maeve media:view-url --workspace <id> --id <mediaId>
156
+ maeve media:archive --workspace <id> --id <mediaId>
157
+ maeve media:delete --workspace <id> --id <mediaId>
158
+ ```
159
+
160
+ `media:delete` and `media:bulk-delete` move active media to the Bin. The API returns `deleteAfter`; media attached to scheduled posts is blocked with `MEDIA_ATTACHED_TO_SCHEDULED_POST`.
161
+
162
+ Folders and labels:
163
+
164
+ ```bash
165
+ maeve media:folders:list --workspace <id> --parent-id root
166
+ maeve media:folders:get --workspace <id> --id <folderId>
167
+ maeve media:folders:path --workspace <id> --id <folderId>
168
+ maeve media:folders:create --workspace <id> --json media-folder.json
169
+ maeve media:folders:update --workspace <id> --id <folderId> --json media-folder.json
170
+ maeve media:folders:move --workspace <id> --id <folderId> --json media-folder-move.json
171
+ maeve media:folders:delete --workspace <id> --id <folderId>
172
+ maeve media:labels:list --workspace <id> --search approved
173
+ maeve media:labels:create --workspace <id> --json media-label.json
174
+ maeve media:labels:update --workspace <id> --id <labelId> --json media-label.json
175
+ maeve media:labels:delete --workspace <id> --id <labelId>
176
+ maeve media:labels:attach --workspace <id> --id <mediaId> --json media-label-ids.json
177
+ maeve media:labels:detach --workspace <id> --id <mediaId> --json media-label-ids.json
178
+ ```
179
+
180
+ `media:labels:*` is the canonical Media Room organization command family. If a global install still shows `media:tags:*`, upgrade `maeve-cli`.
181
+
182
+ Bulk operations:
183
+
184
+ ```bash
185
+ maeve media:bulk-archive --workspace <id> --json media-ids.json
186
+ maeve media:bulk-move --workspace <id> --json media-bulk-move.json
187
+ maeve media:bulk-label --workspace <id> --json media-bulk-labels.json
188
+ maeve media:bulk-unlabel --workspace <id> --json media-bulk-labels.json
189
+ maeve media:bulk-delete --workspace <id> --json media-ids.json --yes
190
+ ```
191
+
192
+ ### Content
193
+
194
+ ```bash
195
+ maeve content:create --workspace <id> --json examples/create-content.json
196
+ maeve content:update --workspace <id> --id <contentId> --json update-content.json
197
+ maeve content:list --workspace <id> --status scheduled
198
+ maeve content:list --workspace <id> --workflow-statuses approved,needs_changes
199
+ maeve content:get --workspace <id> --id <contentId>
200
+ maeve content:schedule --workspace <id> --id <contentId> --scheduled-at "2026-05-01T10:00:00+10:00"
201
+ maeve content:intended-time --workspace <id> --id <contentId> --scheduled-at "2026-05-01T10:00:00+10:00"
202
+ maeve content:notes --workspace <id> --id <contentId> --notes "<p>Planning notes</p>"
203
+ maeve content:notes --workspace <id> --id <contentId> --json notes.json
204
+ maeve content:workflow --workspace <id> --id <contentId> --status drafting
205
+ maeve content:publish --workspace <id> --id <contentId> --yes
206
+ maeve content:published-caption --workspace <id> --id <contentId> --json published-caption.json --yes
207
+ maeve content:archive --workspace <id> --id <contentId>
208
+ maeve content:restore --workspace <id> --id <contentId>
209
+ maeve content:retry --workspace <id> --id <contentId>
210
+ maeve content:delete --workspace <id> --id <contentId>
211
+ maeve content:failed-count --workspace <id>
212
+ maeve content:pending-approval-count --workspace <id>
213
+ ```
214
+
215
+ Approvals, comments, and activity:
216
+
217
+ ```bash
218
+ maeve content:approval-history --workspace <id>
219
+ maeve content:approval-history:client-batch --workspace <id> --batch <batchId>
220
+ maeve content:approval-history:internal --workspace <id> --record <recordId>
221
+ maeve content:comment --workspace <id> --id <contentId> --json comment.json
222
+ maeve content:comment-attachments:init --workspace <id> --json attachment.json
223
+ maeve content:comment-attachments:complete --workspace <id> --attachment <attachmentId>
224
+ maeve content:comment-attachments:abort --workspace <id> --attachment <attachmentId>
225
+ maeve content:activity:react --workspace <id> --activity <activityId> --json reaction.json
226
+ maeve content:activity:unreact --workspace <id> --activity <activityId> --emoji thumbs-up
227
+ maeve content:request-approval --workspace <id> --id <contentId> --json approval.json --yes
228
+ maeve content:decision --workspace <id> --id <contentId> --json decision.json
229
+ maeve content:withdraw --workspace <id> --id <contentId>
230
+ maeve content:resubmit --workspace <id> --id <contentId> --json approval.json --yes
231
+ maeve content:history --workspace <id> --id <contentId>
232
+ maeve content:reopen-client-review --workspace <id> --id <contentId>
233
+ ```
234
+
235
+ ### Client reviews
236
+
237
+ ```bash
238
+ maeve client-reviews:create --workspace <id> --json client-review.json
239
+ maeve client-reviews:open --workspace <id>
240
+ maeve client-reviews:get --workspace <id> --batch <batchId>
241
+ maeve client-reviews:add-post --workspace <id> --batch <batchId> --json post-id.json
242
+ maeve client-reviews:remove-post --workspace <id> --batch <batchId> --json post-id.json
243
+ maeve client-reviews:send --workspace <id> --batch <batchId> --yes
244
+ maeve client-reviews:resend --workspace <id> --batch <batchId> --yes
245
+ maeve client-reviews:cancel --workspace <id> --batch <batchId>
246
+ maeve client-reviews:override --workspace <id> --batch <batchId> --json override.json
247
+ maeve client-reviews:update-participant --workspace <id> --batch <batchId> --json participant.json
248
+ maeve client-reviews:comment --workspace <id> --batch <batchId> --json comment.json
249
+ ```
250
+
251
+ ### Taxonomy and hashtags
252
+
253
+ ```bash
254
+ maeve taxonomy:labels --workspace <id>
255
+ maeve taxonomy:pillars --workspace <id>
256
+ maeve taxonomy:formats --workspace <id>
257
+ maeve hashtags:list --workspace <id>
258
+ maeve hashtags:create --workspace <id> --json hashtags.json
259
+ maeve hashtags:update --workspace <id> --id <hashtagGroupId> --json hashtags.json
260
+ maeve hashtags:delete --workspace <id> --id <hashtagGroupId>
261
+ ```
262
+
263
+ ### Analytics
264
+
265
+ ```bash
266
+ maeve analytics:summary --workspace <id> --days 30
267
+ maeve analytics:summary --workspace <id> --integration <id> --days all
268
+ maeve analytics:summary --workspace <id> --integration-ids <id,id>
269
+ maeve analytics:health --workspace <id> --integration <id>
270
+ maeve analytics:posts --workspace <id> --integration <id> --limit 12 --offset 0
271
+ maeve analytics:posts-aggregate --workspace <id> --integration-ids <id,id> --sort-by views --days 30
272
+ maeve analytics:post --workspace <id> --id <contentId>
273
+ maeve analytics:demographics --workspace <id> --integration <id>
274
+ maeve analytics:report --workspace <id> --provider instagram --json analytics-report.json --output report.pdf --yes
275
+ ```
276
+
277
+ `analytics:summary` works on one integration or aggregates across many. Use `--integration-ids` to pick a set, or omit it for all accessible integrations. `--days` accepts `1` to `90` or `all`.
278
+
279
+ `analytics:posts` is single-integration. `analytics:posts-aggregate` accepts `--integration-ids` and `--sort-by recent|engagement|views`.
280
+
281
+ `analytics:report` is agency-plan only. It saves the PDF to `--output`. Stdout stays JSON metadata.
282
+
283
+ ### Inbox
284
+
285
+ ```bash
286
+ maeve inbox:threads --workspace <id> --read unread
287
+ maeve inbox:messages --workspace <id> --thread <threadId>
288
+ maeve inbox:stats --workspace <id>
289
+ maeve inbox:read --workspace <id> --thread <threadId>
290
+ maeve inbox:unread --workspace <id> --thread <threadId>
291
+ maeve inbox:read-all --workspace <id> --json inbox-read-all.json --yes
292
+ maeve inbox:reply --workspace <id> --thread <threadId> --json inbox-reply.json --yes
293
+ maeve inbox:note --workspace <id> --thread <threadId> --json inbox-note.json
294
+ maeve inbox:moderate --workspace <id> --message <messageId> --json inbox-moderate.json --yes
295
+ maeve inbox:retry-message --workspace <id> --message <messageId> --yes
296
+ maeve inbox:delete-failed --workspace <id> --message <messageId> --yes
297
+ ```
298
+
299
+ ### Grid planner
300
+
301
+ ```bash
302
+ maeve grid:list --workspace <id> --integration <integrationId>
303
+ maeve grid:create --workspace <id> --json grid-item.json
304
+ maeve grid:update --workspace <id> --item <itemId> --json grid-update.json
305
+ maeve grid:delete --workspace <id> --item <itemId> --yes
306
+ maeve grid:reorder --workspace <id> --json grid-reorder.json
307
+ maeve grid:replace-media --workspace <id> --item <itemId> --json grid-media.json
308
+ maeve grid:set-cover --workspace <id> --item <itemId> --json grid-cover.json
309
+ maeve grid:remove-cover --workspace <id> --item <itemId>
310
+ maeve grid:promote --workspace <id> --item <itemId> --json grid-promote.json --yes
311
+ ```
312
+
313
+ ## Payloads
314
+
315
+ ### Content
316
+
317
+ `content:create` reads a JSON file and sends an `Idempotency-Key` header for safe retries. Pass `--idempotency-key <key>` to reuse a known key, or omit it to let the CLI generate one. Omitted `intent` defaults to `draft`; use `schedule` with `scheduledAt`, or `publish_now` plus CLI `--yes` for explicit immediate publishing. `content:update` uses the same shape except `intent`, but every accepted field is optional and at least one must be present.
318
+
319
+ ```json
320
+ {
321
+ "integrationId": "00000000-0000-4000-8000-000000000001",
322
+ "intent": "draft",
323
+ "internalTitle": "Launch planning card",
324
+ "captions": {
325
+ "canonical": "Launch post copy"
326
+ },
327
+ "contentMedia": [
328
+ {
329
+ "mediaId": "00000000-0000-4000-8000-000000000007",
330
+ "order": 0,
331
+ "cover": {
332
+ "thumbOffsetMs": 2500
333
+ }
334
+ }
335
+ ],
336
+ "pillarIds": ["00000000-0000-4000-8000-000000000002"],
337
+ "formatIds": ["00000000-0000-4000-8000-000000000003"],
338
+ "labelIds": ["00000000-0000-4000-8000-000000000004"],
339
+ "campaignId": "00000000-0000-4000-8000-000000000005",
340
+ "campaignPhaseId": "00000000-0000-4000-8000-000000000006"
341
+ }
342
+ ```
343
+
344
+ Common fields:
345
+
346
+ - `integrationId`: integration to post to.
347
+ - `intent`: `draft`, `schedule`, or `publish_now`. Omitted intent defaults to `draft`.
348
+ - `internalTitle`: internal planning title. Never published.
349
+ - `publishTitle`: provider-facing title for platforms that support or require one.
350
+ - `captions`: canonical publish text and optional platform overrides.
351
+ - `notes`: internal rich-text notes. Never published. Max 100000 characters.
352
+ - `contentMedia`: array of uploaded media relationships, with optional per-media crops, tags, and cover metadata.
353
+ - `scheduledAt`: ISO 8601 with timezone, e.g. `2026-05-01T10:00:00+10:00`. Required only with `intent: "schedule"`.
354
+ - `postType`: `post`, `reel`, `story`, or `thread`.
355
+ - `settings`: provider settings from integration capabilities only. Media metadata belongs in `contentMedia`.
356
+ - `firstComment`, `shareToFeed`: optional publish behavior fields.
357
+ - `pillarIds`, `formatIds`, `labelIds`: arrays of workspace taxonomy UUIDs.
358
+ - `campaignId`, `campaignPhaseId`: optional campaign links. Use `null` to clear when updating.
359
+ - `priority`: `urgent`, `high`, `medium`, or `low`.
360
+ - `threadMessages`: items for thread-style content using `captions` and optional `contentMedia`.
361
+
362
+ `content:workflow` accepts only the user-mutable workflow statuses: `idea` or `drafting`.
363
+
364
+ `content:published-caption` edits the provider caption for an already-published Facebook item and requires `--yes`.
365
+
366
+ ```json
367
+ {
368
+ "message": "Updated Facebook caption"
369
+ }
370
+ ```
371
+
372
+ ### Approvals and client reviews
373
+
374
+ Approval and client review commands need an agency workspace plan and the role shown in each command's `--help`. Payloads mirror the public API DTOs.
375
+
376
+ Internal approval request:
377
+
378
+ ```json
379
+ {
380
+ "approverIds": ["00000000-0000-4000-8000-000000000001"],
381
+ "policy": "any"
382
+ }
383
+ ```
384
+
385
+ Client review batch:
386
+
387
+ ```json
388
+ {
389
+ "contentIds": ["00000000-0000-4000-8000-000000000001"],
390
+ "workflowMode": "client",
391
+ "client": {
392
+ "reviewers": [{ "name": "Client Reviewer", "email": "reviewer@example.com" }],
393
+ "policy": "all",
394
+ "inviteNote": "Please review when you have a moment.",
395
+ "batchLabel": "May launch"
396
+ }
397
+ }
398
+ ```
399
+
400
+ Use `workflowMode: "internal_client"` with an `internal` object containing `approverIds` and `policy` when internal approval is required before client review.
401
+
402
+ `content:create` requires `--yes` when the payload has `intent: "publish_now"`, `content:publish` requires `--yes` because it queues external publishing, and `content:published-caption` requires `--yes` because it edits already-published provider content. `content:request-approval`, `content:resubmit`, `client-reviews:send`, and `client-reviews:resend` all require `--yes` because they may notify people.
403
+
404
+ ### Inbox
405
+
406
+ Inbox commands take explicit thread or message IDs. Public replies, moderation, retries, deletes, and `read-all` require `--yes`.
407
+
408
+ Reply:
409
+
410
+ ```json
411
+ {
412
+ "content": "Thanks for reaching out.",
413
+ "parentMessageId": "00000000-0000-4000-8000-000000000001"
414
+ }
415
+ ```
416
+
417
+ `content` is optional when an `attachment` is provided:
418
+
419
+ ```json
420
+ {
421
+ "attachment": {
422
+ "type": "image",
423
+ "url": "https://cdn.example.com/reply.png"
424
+ }
425
+ }
426
+ ```
427
+
428
+ Internal note:
429
+
430
+ ```json
431
+ { "content": "Follow up with the team before replying." }
432
+ ```
433
+
434
+ Moderation. Allowed actions: `hide`, `unhide`, `delete`.
435
+
436
+ ```json
437
+ { "action": "hide" }
438
+ ```
439
+
440
+ Read-all takes the same filter shape as listing threads. Use `{}` only when you want all matching threads marked read.
441
+
442
+ ```json
443
+ {
444
+ "platform": "instagram",
445
+ "status": "open",
446
+ "integrationId": "00000000-0000-4000-8000-000000000001",
447
+ "messageType": "comment"
448
+ }
449
+ ```
450
+
451
+ ### Grid planner
452
+
453
+ Visual-only item:
454
+
455
+ ```json
456
+ {
457
+ "integrationId": "00000000-0000-4000-8000-000000000001",
458
+ "kind": "visual_only",
459
+ "mediaIds": ["00000000-0000-4000-8000-000000000002"],
460
+ "note": "Plan this visual",
461
+ "settings": { "aspectRatio": 1 }
462
+ }
463
+ ```
464
+
465
+ Linked content item:
466
+
467
+ ```json
468
+ {
469
+ "integrationId": "00000000-0000-4000-8000-000000000001",
470
+ "kind": "linked_post",
471
+ "linkedContentId": "00000000-0000-4000-8000-000000000003"
472
+ }
473
+ ```
474
+
475
+ Reorder needs the full item ID order for the integration:
476
+
477
+ ```json
478
+ {
479
+ "integrationId": "00000000-0000-4000-8000-000000000001",
480
+ "itemIds": ["00000000-0000-4000-8000-000000000004"]
481
+ }
482
+ ```
483
+
484
+ Media, cover, and promote payloads:
485
+
486
+ ```json
487
+ { "integrationId": "00000000-0000-4000-8000-000000000001", "mediaIds": ["00000000-0000-4000-8000-000000000002"] }
488
+ ```
489
+
490
+ ```json
491
+ { "integrationId": "00000000-0000-4000-8000-000000000001", "mediaId": "00000000-0000-4000-8000-000000000005" }
492
+ ```
493
+
494
+ ```json
495
+ { "integrationId": "00000000-0000-4000-8000-000000000001" }
496
+ ```
497
+
498
+ `grid:delete` and `grid:promote` require `--yes`.
499
+
500
+ ### Media
501
+
502
+ Supported upload extensions:
503
+
504
+ - `.jpg`, `.jpeg`, `.png`, `.gif`, `.webp`, `.avif`
505
+ - `.mp4`, `.mov`
506
+
507
+ Images cap at 50 MB, videos at 512 MB.
508
+
509
+ Update payload:
510
+
511
+ ```json
512
+ {
513
+ "filename": "campaign-hero.png",
514
+ "altText": "Campaign hero image",
515
+ "isFavorite": true,
516
+ "folderId": null
517
+ }
518
+ ```
519
+
520
+ Folder and label:
521
+
522
+ ```json
523
+ { "name": "Launch assets" }
524
+ ```
525
+
526
+ ```json
527
+ { "name": "Approved", "color": "#22cc88" }
528
+ ```
529
+
530
+ Bulk payloads are explicit ID lists:
531
+
532
+ ```json
533
+ { "mediaIds": ["00000000-0000-4000-8000-000000000001"] }
534
+ ```
535
+
536
+ ```json
537
+ {
538
+ "mediaIds": ["00000000-0000-4000-8000-000000000001"],
539
+ "labelIds": ["00000000-0000-4000-8000-000000000002"]
540
+ }
541
+ ```
542
+
543
+ `media:bulk-delete` moves active media to the Bin and requires `--yes`. Use `media:list --state deleted` to inspect Bin items.
544
+
545
+ ## License
546
+
547
+ MIT (c) 2026 LILY DIA PTY LTD.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+
4
+ declare function createProgram(): Command;
5
+ declare function runCli(argv?: string[]): Promise<void>;
6
+
7
+ export { createProgram, runCli };