@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 +29 -5
- package/dist/{chunk-FNH2XY63.js → chunk-OWDTSPY4.js} +4 -4
- package/dist/chunk-OWDTSPY4.js.map +1 -0
- package/dist/cli.js +1699 -1435
- package/dist/cli.js.map +1 -1
- package/dist/engine/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-FNH2XY63.js.map +0 -1
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.
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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
|
-
"
|
|
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
|
-
//
|
|
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-
|
|
8371
|
+
//# sourceMappingURL=chunk-OWDTSPY4.js.map
|