maeve-cli 0.9.0 → 0.10.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
@@ -150,14 +150,17 @@ maeve media:list --workspace <id> --type image --label-ids <id,id> --favorite
150
150
  maeve media:list --workspace <id> --state deleted
151
151
  maeve media:upload ./image.png --workspace <id>
152
152
  maeve media:get --workspace <id> --id <mediaId>
153
+ maeve media:usage-history --workspace <id> --id <mediaId>
153
154
  maeve media:update --workspace <id> --id <mediaId> --json media-update.json
154
155
  maeve media:download-url --workspace <id> --id <mediaId>
155
156
  maeve media:view-url --workspace <id> --id <mediaId>
156
157
  maeve media:archive --workspace <id> --id <mediaId>
157
158
  maeve media:delete --workspace <id> --id <mediaId>
159
+ maeve media:restore --workspace <id> --id <mediaId>
160
+ maeve media:delete-permanent --workspace <id> --id <mediaId> --yes
158
161
  ```
159
162
 
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`.
163
+ `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`. Use `media:restore` to bring an item back from the Bin, or `media:delete-permanent` to remove it for good (requires `--yes`).
161
164
 
162
165
  Folders and labels:
163
166
 
@@ -175,9 +178,28 @@ maeve media:labels:update --workspace <id> --id <labelId> --json media-label.jso
175
178
  maeve media:labels:delete --workspace <id> --id <labelId>
176
179
  maeve media:labels:attach --workspace <id> --id <mediaId> --json media-label-ids.json
177
180
  maeve media:labels:detach --workspace <id> --id <mediaId> --json media-label-ids.json
181
+ maeve media:labels:usage --workspace <id> --label-ids <id,id>
182
+ maeve media:labels:health --workspace <id>
183
+ maeve media:labels:archive --workspace <id> --id <labelId>
184
+ maeve media:labels:restore --workspace <id> --id <labelId>
185
+ maeve media:labels:merge --workspace <id> --id <sourceLabelId> --json media-label-merge.json
178
186
  ```
179
187
 
180
- `media:labels:*` is the canonical Media Room organization command family. If a global install still shows `media:tags:*`, upgrade `maeve-cli`.
188
+ `media:labels:*` is the canonical Media Room organization command family. If a global install still shows `media:tags:*`, upgrade `maeve-cli`. `media:labels:merge` folds the source label into a target; its payload is `{ "targetLabelId": "<id>" }`.
189
+
190
+ Label groups:
191
+
192
+ ```bash
193
+ maeve media:label-groups:list --workspace <id>
194
+ maeve media:label-groups:create --workspace <id> --json label-group.json
195
+ maeve media:label-groups:update --workspace <id> --id <groupId> --json label-group.json
196
+ maeve media:label-groups:reorder --workspace <id> --json label-group-order.json
197
+ maeve media:label-groups:add-labels --workspace <id> --id <groupId> --json label-ids.json
198
+ maeve media:label-groups:ungroup-labels --workspace <id> --json label-ids.json
199
+ maeve media:label-groups:delete --workspace <id> --id <groupId> --json label-group-delete.json
200
+ ```
201
+
202
+ `media:label-groups:reorder` takes the full `{ "groupIds": [...] }` order. `add-labels` and `ungroup-labels` take `{ "labelIds": [...] }`. `delete` takes `{ "mode": "archive-labels" }` or `{ "mode": "ungroup-labels" }` to say what happens to the labels in the group.
181
203
 
182
204
  Bulk operations:
183
205
 
@@ -187,6 +209,8 @@ maeve media:bulk-move --workspace <id> --json media-bulk-move.json
187
209
  maeve media:bulk-label --workspace <id> --json media-bulk-labels.json
188
210
  maeve media:bulk-unlabel --workspace <id> --json media-bulk-labels.json
189
211
  maeve media:bulk-delete --workspace <id> --json media-ids.json --yes
212
+ maeve media:bulk-restore --workspace <id> --json media-ids.json
213
+ maeve media:bulk-delete-forever --workspace <id> --json media-ids.json --yes
190
214
  ```
191
215
 
192
216
  ### Content
@@ -201,7 +225,6 @@ maeve content:schedule --workspace <id> --id <contentId> --scheduled-at "2026-05
201
225
  maeve content:intended-time --workspace <id> --id <contentId> --scheduled-at "2026-05-01T10:00:00+10:00"
202
226
  maeve content:notes --workspace <id> --id <contentId> --notes "<p>Planning notes</p>"
203
227
  maeve content:notes --workspace <id> --id <contentId> --json notes.json
204
- maeve content:workflow --workspace <id> --id <contentId> --status drafting
205
228
  maeve content:publish --workspace <id> --id <contentId> --yes
206
229
  maeve content:published-caption --workspace <id> --id <contentId> --json published-caption.json --yes
207
230
  maeve content:archive --workspace <id> --id <contentId>
@@ -248,6 +271,52 @@ maeve client-reviews:update-participant --workspace <id> --batch <batchId> --jso
248
271
  maeve client-reviews:comment --workspace <id> --batch <batchId> --json comment.json
249
272
  ```
250
273
 
274
+ ### Campaigns
275
+
276
+ ```bash
277
+ maeve campaigns:list --workspace <id> --include-phases
278
+ maeve campaigns:get --workspace <id> --id <campaignId>
279
+ maeve campaigns:content --workspace <id> --id <campaignId> --status scheduled
280
+ maeve campaigns:create --workspace <id> --json campaign.json
281
+ maeve campaigns:update --workspace <id> --id <campaignId> --json campaign.json
282
+ maeve campaigns:archive --workspace <id> --id <campaignId>
283
+ maeve campaigns:restore --workspace <id> --id <campaignId>
284
+ maeve campaigns:phases:list --workspace <id> --id <campaignId>
285
+ maeve campaigns:phases:create --workspace <id> --id <campaignId> --json campaign-phase.json
286
+ maeve campaigns:phases:replace --workspace <id> --id <campaignId> --json campaign-phases.json
287
+ maeve campaigns:phases:update --workspace <id> --id <campaignId> --phase-id <phaseId> --json campaign-phase.json
288
+ maeve campaigns:phases:delete --workspace <id> --id <campaignId> --phase-id <phaseId> --yes
289
+ ```
290
+
291
+ Use `campaigns:list` and `campaigns:get` to find the campaign and phase IDs that
292
+ `content:create` and `content:update` accept in `campaignId` / `campaignPhaseId`. Create
293
+ payload: `name`, `startDate`, and `endDate` are required (dates are ISO 8601); `color`,
294
+ `goal`, `description`, `targetPlatforms`, `estimatedBudget`, `actualBudget`, and
295
+ `budgetCurrency` are optional. `campaigns:phases:replace` takes the full `{ "phases": [...] }`
296
+ array.
297
+
298
+ ```json
299
+ {
300
+ "name": "May launch",
301
+ "startDate": "2026-05-01",
302
+ "endDate": "2026-05-31",
303
+ "color": "#2563EB",
304
+ "targetPlatforms": ["instagram", "facebook"]
305
+ }
306
+ ```
307
+
308
+ ### Strategy
309
+
310
+ Read-only. The CLI exposes the strategy reads the public API serves; strategy is edited in
311
+ the app.
312
+
313
+ ```bash
314
+ maeve strategy:foundation --workspace <id>
315
+ maeve strategy:goals --workspace <id>
316
+ maeve strategy:goals:metrics --workspace <id>
317
+ maeve strategy:goal --workspace <id> --id <goalId>
318
+ ```
319
+
251
320
  ### Taxonomy and hashtags
252
321
 
253
322
  ```bash
@@ -278,7 +347,7 @@ maeve analytics:report --workspace <id> --provider instagram --json analytics-re
278
347
 
279
348
  `analytics:posts` is single-integration. `analytics:posts-aggregate` accepts `--integration-ids` and `--sort-by recent|engagement|views`.
280
349
 
281
- `analytics:report` is agency-plan only. It saves the PDF to `--output`. Stdout stays JSON metadata.
350
+ `analytics:report` is team-plan only. It saves the PDF to `--output`. Stdout stays JSON metadata.
282
351
 
283
352
  ### Inbox
284
353
 
@@ -289,6 +358,11 @@ maeve inbox:stats --workspace <id>
289
358
  maeve inbox:read --workspace <id> --thread <threadId>
290
359
  maeve inbox:unread --workspace <id> --thread <threadId>
291
360
  maeve inbox:read-all --workspace <id> --json inbox-read-all.json --yes
361
+ maeve inbox:resolve --workspace <id> --thread <threadId>
362
+ maeve inbox:reopen --workspace <id> --thread <threadId>
363
+ maeve inbox:resolve-all --workspace <id> --json inbox-resolve-all.json --yes
364
+ maeve inbox:resolve-message --workspace <id> --message <messageId>
365
+ maeve inbox:reopen-message --workspace <id> --message <messageId>
292
366
  maeve inbox:reply --workspace <id> --thread <threadId> --json inbox-reply.json --yes
293
367
  maeve inbox:note --workspace <id> --thread <threadId> --json inbox-note.json
294
368
  maeve inbox:moderate --workspace <id> --message <messageId> --json inbox-moderate.json --yes
@@ -296,6 +370,8 @@ maeve inbox:retry-message --workspace <id> --message <messageId> --yes
296
370
  maeve inbox:delete-failed --workspace <id> --message <messageId> --yes
297
371
  ```
298
372
 
373
+ `inbox:resolve` and `inbox:resolve-message` accept an optional `--json` file with a resolution reason and note. `inbox:resolve-all` resolves every thread matching the filter payload and requires `--yes`. The reopen commands take no body.
374
+
299
375
  ### Grid planner
300
376
 
301
377
  ```bash
@@ -310,6 +386,21 @@ maeve grid:remove-cover --workspace <id> --item <itemId>
310
386
  maeve grid:promote --workspace <id> --item <itemId> --json grid-promote.json --yes
311
387
  ```
312
388
 
389
+ ### Boosts
390
+
391
+ Read-only, team plan. The CLI reads boost state for reporting but does not create, pause,
392
+ resume, delete, or estimate boosts, because those spend Meta ad budget. Run those from the
393
+ app.
394
+
395
+ ```bash
396
+ maeve boosts:list --workspace <id> --statuses active,paused
397
+ maeve boosts:get --workspace <id> --id <boostId>
398
+ maeve boosts:performance --workspace <id> --id <boostId>
399
+ maeve boosts:ad-accounts --workspace <id> --integration <integrationId>
400
+ maeve boosts:boosted-content-ids --workspace <id>
401
+ maeve boosts:by-content --workspace <id> --content <contentId>
402
+ ```
403
+
313
404
  ## Payloads
314
405
 
315
406
  ### Content
@@ -355,12 +446,10 @@ Common fields:
355
446
  - `settings`: provider settings from integration capabilities only. Media metadata belongs in `contentMedia`.
356
447
  - `firstComment`, `shareToFeed`: optional publish behavior fields.
357
448
  - `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`.
449
+ - `campaignId`, `campaignPhaseId`: optional root-post campaign links. Use `null` to clear when updating.
450
+ - `priority`: optional root-post priority, `urgent`, `high`, `medium`, or `low`.
360
451
  - `threadMessages`: items for thread-style content using `captions` and optional `contentMedia`.
361
452
 
362
- `content:workflow` accepts only the user-mutable workflow statuses: `idea` or `drafting`.
363
-
364
453
  `content:published-caption` edits the provider caption for an already-published Facebook item and requires `--yes`.
365
454
 
366
455
  ```json
@@ -371,7 +460,7 @@ Common fields:
371
460
 
372
461
  ### Approvals and client reviews
373
462
 
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.
463
+ Approval and client review commands need an team workspace plan and the role shown in each command's `--help`. Payloads mirror the public API DTOs.
375
464
 
376
465
  Internal approval request:
377
466