@koda-sl/baker-cli 0.187.0-dev.720190ec6 → 0.187.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
@@ -491,7 +491,7 @@ baker ads google keywords metrics --customer-id 1234567890 --keywords "running s
491
491
 
492
492
  ### Staged writes (`baker ads google budgets|campaigns|...`)
493
493
 
494
- Write commands **never touch the Google Ads API at stage time**. Each command stages a create/update/pause/resume/remove op against the current chat's draft (`BAKER_CHAT_ID`); the dashboard shows it as a pending "Google Ads" change, and the whole draft applies as one atomic `GoogleAdsService.Mutate` when the chat is published. Feature-flagged per company (`companies.googleAdsWriteEnabled`) — off by default = a fully simulated publish with zero real API calls.
494
+ Write commands **never touch the Google Ads API at stage time**. Each command stages a create/update/pause/resume/remove op against the current chat's draft (`BAKER_CHAT_ID`); the dashboard shows it as a pending "Google Ads" change, and the whole draft applies as one atomic `GoogleAdsService.Mutate` when the chat is published. **That publish reaches the real account for every company**Google Ads writes are generally available, with no per-company flag to turn them on or off. Discarding the chat before it completes is what undoes a staged change.
495
495
 
496
496
  Reference not-yet-created resources with `g_temp_*` refs returned by earlier `create` commands (they map to Google's temporary negative-ID resource names inside one atomic batch).
497
497
 
@@ -594,9 +594,7 @@ baker tag-manager draft show --chat <chat-id> gtm_temp_ab12
594
594
  baker actions draft --chat <chat-id>
595
595
  ```
596
596
 
597
- Command groups: `budgets`, `campaigns`, `ad-groups`, `keywords` (add/update/remove), `negative-keywords`, `keyword-lists`, `ads`, `assets` (create/update/attach/detach), `asset-groups` (create/update/attach/detach — Performance Max), `audiences`, `conversions` (create/update/goal), `bidding-strategies`, `labels`, `campaign-criteria` (add/update/remove), and `draft`. Amounts are in major currency units (converted to micros). Money/bids: `--amount`, `--cpc-bid`, `--target-cpa`, `--max-cpc` take major units; `--target-roas` a ratio. `--max-cpc` sets the max CPC bid ceiling for `TARGET_IMPRESSION_SHARE` / `TARGET_SPEND` / `PERCENT_CPC` and must be paired with `--bidding-strategy`. Less-common ops accept a `--file <payload.json>` (flags override file keys). Updates target a resource name or bare id as the positional argument; a target that names an op staged earlier **amends it in place**.
598
-
599
- **Device targeting is adjusted, never added or removed** — Google keeps a criterion for every device on every campaign, so `campaign-criteria remove` on one is rejected (and refused before publish). Use `campaign-criteria update customers/<cid>/campaignCriteria/<campaignId>~<criterionId> --bid-modifier <n>`: `1` for no adjustment, `1.25` to bid 25% more, `0.9` to bid 10% less, `0` to stop serving on that device. Locations, languages and ad schedules remove normally.
597
+ Command groups: `budgets`, `campaigns`, `ad-groups`, `keywords` (add/update/remove), `negative-keywords`, `keyword-lists`, `ads`, `assets` (create/update/attach/detach), `asset-groups` (create/update/attach/detach — Performance Max), `audiences`, `conversions` (create/update/goal), `bidding-strategies`, `labels`, `campaign-criteria`, and `draft`. Amounts are in major currency units (converted to micros). Money/bids: `--amount`, `--cpc-bid`, `--target-cpa`, `--max-cpc` take major units; `--target-roas` a ratio. `--max-cpc` sets the max CPC bid ceiling for `TARGET_IMPRESSION_SHARE` / `TARGET_SPEND` / `PERCENT_CPC` and must be paired with `--bidding-strategy`. Less-common ops accept a `--file <payload.json>` (flags override file keys). Updates target a resource name or bare id as the positional argument; a target that names an op staged earlier **amends it in place**.
600
598
 
601
599
  **Primary vs secondary conversion actions** — `conversions update <id> --primary` makes an action a primary action (automated bidding optimizes toward it); `--no-primary` (or `--primary=false`) demotes it to secondary (reported only) — the spaced form `--primary false` is rejected, since a boolean flag written with a space is set to true and the word dropped. `conversions create` stages a new action as **secondary** unless its `--file` payload sets `"primaryForGoal": true`, so a new action never silently joins the bidding target of a Maximize Conversions or Target CPA campaign. The staged card shows an "Action optimization" row with the before/after role.
602
600
 
@@ -604,7 +602,7 @@ Command groups: `budgets`, `campaigns`, `ad-groups`, `keywords` (add/update/remo
604
602
 
605
603
  **Retiring a conversion action** — `status` accepts `ENABLED` and `REMOVED` only. Google denies `HIDDEN` on every conversion-action write, so to stop bidding toward an action while it keeps measuring use `--no-primary`, and to stop it counting at all use `"status": "REMOVED"`. Conversion actions **Google owns** cannot be changed at all — Smart campaign call/directions actions, the in-ad lead form's submit, YouTube subscriptions and follow-on views, Floodlight and Search Ads 360 imports, store visits, codeless webpage actions. Staging any edit to one, a rename included, is refused up front; there is no manual route either, since the Google Ads interface will not change them.
606
604
 
607
- **Reviewing the draft** — `baker ads google draft list` renders everything you've staged as a grouped campaign ▸ ad group ▸ ad tree (with the simulated/live mode banner and non-blocking completeness advisories), the CLI counterpart to the dashboard's Google Ads tab. Pass `--json` for the raw envelope. Aim for a fully built campaign — 2–4 ad groups, ≥5 keywords each, 2–4 RSAs with 8–12 headlines, ≥4 sitelinks / ≥3 callouts / ≥1 structured snippet, and ≥1 shared negative list; the advisories flag what's still thin.
605
+ **Reviewing the draft** — `baker ads google draft list` renders everything you've staged as a grouped campaign ▸ ad group ▸ ad tree (with non-blocking completeness advisories), the CLI counterpart to the dashboard's Google Ads tab. Pass `--json` for the raw envelope. Aim for a fully built campaign — 2–4 ad groups, ≥5 keywords each, 2–4 RSAs with 8–12 headlines, ≥4 sitelinks / ≥3 callouts / ≥1 structured snippet, and ≥1 shared negative list; the advisories flag what's still thin.
608
606
 
609
607
  **Amending a staged op** — `draft amend <ref> (--file patch.json | --patch '<json>')` merges a JSON patch into an already-staged op's payload (objects deep-merge, `null` deletes a key, arrays/scalars replace) and re-validates it in full. Always prefer this over removing and re-staging — it preserves the op's ref (so dependents don't break) and its position in the draft. `draft show <ref>` prints the full staged payload (including warnings/annotations) so you can verify a change looks right before publish.
610
608
 
@@ -2139,6 +2137,17 @@ baker images get j571abc123def
2139
2137
  baker images get j571abc123def --full
2140
2138
  ```
2141
2139
 
2140
+ ### `baker images group <id>`
2141
+
2142
+ List every image that arrived in the same set — the slides of one Instagram carousel, the images pulled off one scraped page. Carousel slides are authored to be read in order and usually only make sense together, so pull the set before using any one slide on its own.
2143
+
2144
+ ```bash
2145
+ baker images group j571abc123def
2146
+ baker images group --group-key "instagram:Cx7Ab9"
2147
+ ```
2148
+
2149
+ Returns the set's shared caption or page title, a link back to the original post/page, and the members in order — as both `images` and `videos`, since a carousel can mix stills and clips across the two libraries. Accepts an **image or a video id**, for the same reason: `baker videos group` is the same lookup from the other side.
2150
+
2142
2151
  ### `baker images upload <file|url>`
2143
2152
 
2144
2153
  Add an image to the library — accepts a **local file path** or a **remote `http(s)://` URL**. The positional arg is sniffed: if it starts with `http://` or `https://`, the call dispatches to `/api/images/ingest` (hash-deduped on bytes + externalId, byte-fetch happens server-side); otherwise the local file is read, base64-encoded, and sent to `/api/images/upload`.
@@ -2322,10 +2331,25 @@ Upload a video file via Mux direct upload.
2322
2331
  ```bash
2323
2332
  baker videos upload ./demo.mp4
2324
2333
  baker videos upload ./demo.mp4 --dry-run
2334
+ baker videos upload ./testimonial-maria.mp4 \
2335
+ --context "Testimonial from Maria, a real customer, filmed on her phone for the autumn campaign"
2325
2336
  ```
2326
2337
 
2327
2338
  Supported extensions: `.mp4`, `.mov`, `.webm`, `.avi`, `.mkv`
2328
2339
 
2340
+ `--context` describes what the clip is and what it's for. The analysis watches the frames and hears the audio, but it can't know which campaign a clip belongs to or whether the person on camera is a real customer or a hired actor — and those are what you'll search on later. The filename is sent automatically as a weaker hint.
2341
+
2342
+ ### `baker videos group <id>`
2343
+
2344
+ List every asset that arrived in the same set as this clip — the other slides of the Instagram post it came from, stills included. A carousel is authored to be read in order, so a clip lifted out of one is usually missing half its meaning.
2345
+
2346
+ ```bash
2347
+ baker videos group xd7abc123def
2348
+ baker videos group --group-key "instagram:Cx7Ab9"
2349
+ ```
2350
+
2351
+ Same lookup as `baker images group` and takes either kind of id; the two exist so the noun you happen to hold does not decide whether you can ask.
2352
+
2329
2353
  ### `baker videos delete <id>`
2330
2354
 
2331
2355
  Delete a video by ID.
@@ -7,9 +7,9 @@ import {
7
7
  __toESM
8
8
  } from "./chunk-YL3HDEIJ.js";
9
9
 
10
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js
10
+ // ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js
11
11
  var require_safe_stable_stringify = __commonJS({
12
- "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js"(exports, module) {
12
+ "../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js"(exports, module) {
13
13
  "use strict";
14
14
  var { hasOwnProperty } = Object.prototype;
15
15
  var stringify = configure2();
@@ -1075,7 +1075,7 @@ function resolveAdaptFormats(params) {
1075
1075
  return params.formats ?? [];
1076
1076
  }
1077
1077
 
1078
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/esm/wrapper.js
1078
+ // ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/esm/wrapper.js
1079
1079
  var import__ = __toESM(require_safe_stable_stringify(), 1);
1080
1080
  var configure = import__.default.configure;
1081
1081
  var wrapper_default = import__.default;
@@ -8368,4 +8368,4 @@ export {
8368
8368
  defaultRegistry,
8369
8369
  createEngineFromEnv
8370
8370
  };
8371
- //# sourceMappingURL=chunk-FNH2XY63.js.map
8371
+ //# sourceMappingURL=chunk-OWDTSPY4.js.map