maeve-cli 0.9.0 → 0.10.1

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,17 +225,20 @@ 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>
208
231
  maeve content:restore --workspace <id> --id <contentId>
209
232
  maeve content:retry --workspace <id> --id <contentId>
210
233
  maeve content:delete --workspace <id> --id <contentId>
234
+ maeve content:recurring-occurrence:cancel --workspace <id> --occurrence <occurrenceId> --yes
235
+ maeve content:recurring-series:cancel --workspace <id> --series <seriesId> --effective-occurrence <occurrenceId> [--expected-version <number>] --yes
211
236
  maeve content:failed-count --workspace <id>
212
237
  maeve content:pending-approval-count --workspace <id>
213
238
  ```
214
239
 
240
+ `content:delete` refuses content that belongs to a recurring series; use the recurring cancel commands instead. `content:list` includes a `recurringMetadata` object on recurring-linked items with the `seriesId`, `occurrenceId`, and `seriesVersion` those commands need. `content:recurring-occurrence:cancel` cancels a single occurrence. `content:recurring-series:cancel` cancels the series and every not-yet-published occurrence from the effective occurrence forward. Both require `--yes` because they remove scheduled publishing work.
241
+
215
242
  Approvals, comments, and activity:
216
243
 
217
244
  ```bash
@@ -248,6 +275,52 @@ maeve client-reviews:update-participant --workspace <id> --batch <batchId> --jso
248
275
  maeve client-reviews:comment --workspace <id> --batch <batchId> --json comment.json
249
276
  ```
250
277
 
278
+ ### Campaigns
279
+
280
+ ```bash
281
+ maeve campaigns:list --workspace <id> --include-phases
282
+ maeve campaigns:get --workspace <id> --id <campaignId>
283
+ maeve campaigns:content --workspace <id> --id <campaignId> --status scheduled
284
+ maeve campaigns:create --workspace <id> --json campaign.json
285
+ maeve campaigns:update --workspace <id> --id <campaignId> --json campaign.json
286
+ maeve campaigns:archive --workspace <id> --id <campaignId>
287
+ maeve campaigns:restore --workspace <id> --id <campaignId>
288
+ maeve campaigns:phases:list --workspace <id> --id <campaignId>
289
+ maeve campaigns:phases:create --workspace <id> --id <campaignId> --json campaign-phase.json
290
+ maeve campaigns:phases:replace --workspace <id> --id <campaignId> --json campaign-phases.json
291
+ maeve campaigns:phases:update --workspace <id> --id <campaignId> --phase-id <phaseId> --json campaign-phase.json
292
+ maeve campaigns:phases:delete --workspace <id> --id <campaignId> --phase-id <phaseId> --yes
293
+ ```
294
+
295
+ Use `campaigns:list` and `campaigns:get` to find the campaign and phase IDs that
296
+ `content:create` and `content:update` accept in `campaignId` / `campaignPhaseId`. Create
297
+ payload: `name`, `startDate`, and `endDate` are required (dates are ISO 8601); `color`,
298
+ `goal`, `description`, `targetPlatforms`, `estimatedBudget`, `actualBudget`, and
299
+ `budgetCurrency` are optional. `campaigns:phases:replace` takes the full `{ "phases": [...] }`
300
+ array.
301
+
302
+ ```json
303
+ {
304
+ "name": "May launch",
305
+ "startDate": "2026-05-01",
306
+ "endDate": "2026-05-31",
307
+ "color": "#2563EB",
308
+ "targetPlatforms": ["instagram", "facebook"]
309
+ }
310
+ ```
311
+
312
+ ### Strategy
313
+
314
+ Read-only. The CLI exposes the strategy reads the public API serves; strategy is edited in
315
+ the app.
316
+
317
+ ```bash
318
+ maeve strategy:foundation --workspace <id>
319
+ maeve strategy:goals --workspace <id>
320
+ maeve strategy:goals:metrics --workspace <id>
321
+ maeve strategy:goal --workspace <id> --id <goalId>
322
+ ```
323
+
251
324
  ### Taxonomy and hashtags
252
325
 
253
326
  ```bash
@@ -278,7 +351,7 @@ maeve analytics:report --workspace <id> --provider instagram --json analytics-re
278
351
 
279
352
  `analytics:posts` is single-integration. `analytics:posts-aggregate` accepts `--integration-ids` and `--sort-by recent|engagement|views`.
280
353
 
281
- `analytics:report` is agency-plan only. It saves the PDF to `--output`. Stdout stays JSON metadata.
354
+ `analytics:report` is standard-plan only. It saves the PDF to `--output`. Stdout stays JSON metadata.
282
355
 
283
356
  ### Inbox
284
357
 
@@ -289,6 +362,11 @@ maeve inbox:stats --workspace <id>
289
362
  maeve inbox:read --workspace <id> --thread <threadId>
290
363
  maeve inbox:unread --workspace <id> --thread <threadId>
291
364
  maeve inbox:read-all --workspace <id> --json inbox-read-all.json --yes
365
+ maeve inbox:resolve --workspace <id> --thread <threadId>
366
+ maeve inbox:reopen --workspace <id> --thread <threadId>
367
+ maeve inbox:resolve-all --workspace <id> --json inbox-resolve-all.json --yes
368
+ maeve inbox:resolve-message --workspace <id> --message <messageId>
369
+ maeve inbox:reopen-message --workspace <id> --message <messageId>
292
370
  maeve inbox:reply --workspace <id> --thread <threadId> --json inbox-reply.json --yes
293
371
  maeve inbox:note --workspace <id> --thread <threadId> --json inbox-note.json
294
372
  maeve inbox:moderate --workspace <id> --message <messageId> --json inbox-moderate.json --yes
@@ -296,6 +374,8 @@ maeve inbox:retry-message --workspace <id> --message <messageId> --yes
296
374
  maeve inbox:delete-failed --workspace <id> --message <messageId> --yes
297
375
  ```
298
376
 
377
+ `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.
378
+
299
379
  ### Grid planner
300
380
 
301
381
  ```bash
@@ -310,6 +390,21 @@ maeve grid:remove-cover --workspace <id> --item <itemId>
310
390
  maeve grid:promote --workspace <id> --item <itemId> --json grid-promote.json --yes
311
391
  ```
312
392
 
393
+ ### Boosts
394
+
395
+ Read-only, standard plan. The CLI reads boost state for reporting but does not create, pause,
396
+ resume, delete, or estimate boosts, because those spend Meta ad budget. Run those from the
397
+ app.
398
+
399
+ ```bash
400
+ maeve boosts:list --workspace <id> --statuses active,paused
401
+ maeve boosts:get --workspace <id> --id <boostId>
402
+ maeve boosts:performance --workspace <id> --id <boostId>
403
+ maeve boosts:ad-accounts --workspace <id> --integration <integrationId>
404
+ maeve boosts:boosted-content-ids --workspace <id>
405
+ maeve boosts:by-content --workspace <id> --content <contentId>
406
+ ```
407
+
313
408
  ## Payloads
314
409
 
315
410
  ### Content
@@ -355,12 +450,10 @@ Common fields:
355
450
  - `settings`: provider settings from integration capabilities only. Media metadata belongs in `contentMedia`.
356
451
  - `firstComment`, `shareToFeed`: optional publish behavior fields.
357
452
  - `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`.
453
+ - `campaignId`, `campaignPhaseId`: optional root-post campaign links. Use `null` to clear when updating.
454
+ - `priority`: optional root-post priority, `urgent`, `high`, `medium`, or `low`.
360
455
  - `threadMessages`: items for thread-style content using `captions` and optional `contentMedia`.
361
456
 
362
- `content:workflow` accepts only the user-mutable workflow statuses: `idea` or `drafting`.
363
-
364
457
  `content:published-caption` edits the provider caption for an already-published Facebook item and requires `--yes`.
365
458
 
366
459
  ```json
@@ -371,7 +464,7 @@ Common fields:
371
464
 
372
465
  ### Approvals and client reviews
373
466
 
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.
467
+ Approval and client review commands need a standard workspace plan and the role shown in each command's `--help`. Payloads mirror the public API DTOs.
375
468
 
376
469
  Internal approval request:
377
470