@koda-sl/baker-cli 0.216.0-dev.843330ec0 → 0.217.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
@@ -100,6 +100,17 @@ question — and nothing in the output said so. Both spellings of an option work
100
100
  (`--run-id` and `--runId`), as they always did. Run `baker schema <command>` to see
101
101
  every option a command takes.
102
102
 
103
+ ### Fresh reads: `--no-cache`
104
+
105
+ Every command that caches takes `--no-cache`, and it skips **both** cache layers — the
106
+ CLI's own disk cache and the server's. The Google, GA4, GSC, research and X families
107
+ used `--no-cache` while LinkedIn and Meta used `--skip-cache`, a split that named our
108
+ two cache layers rather than anything a caller wanted to choose between. Once an
109
+ unrecognised option started failing the call, it broke every consumer that could not
110
+ know which family it was talking to — including report refresh, which appends
111
+ `--no-cache` for any source. `--skip-cache` is still accepted as the old spelling and
112
+ is rewritten to `--no-cache` before parsing; it will be removed.
113
+
103
114
  Use `--output` to change format:
104
115
 
105
116
  | Format | Description | Best for | Available on |
@@ -885,7 +896,7 @@ The HTTP backend exposes more endpoints (catalogs, ad-studies, ad-images, labels
885
896
  - Tokens auto-refresh server-side (60-day rolling long-lived user tokens). On `code 190` reconnect Meta from the dashboard.
886
897
  - Account scoping: backend rejects any call against an account not in the picker selection — pick accounts via Settings → Connections → Meta Ads first.
887
898
  - All cached actions are keyed per company; two companies that connect to the same Meta account never share cache entries.
888
- - `--skip-cache` on any command forces a re-fetch.
899
+ - `--no-cache` on any command forces a re-fetch.
889
900
 
890
901
  #### Restricted pixel fields
891
902
 
@@ -1114,7 +1125,7 @@ Each finding: `{id, area, check, status, severity, evidence, fix: {explanation,
1114
1125
  - Account scoping: backend rejects calls against an account not in the picker selection.
1115
1126
  - Pinned API version: `Linkedin-Version: 202606` (declared in `oauth/constants.ts`). Bump as a coordinated change — LinkedIn deprecates monthly with a ~12-month support window. The floor is `TRACKING_PARAM_DYNAMIC_MIN_API_VERSION` (`CREATIVE_NAME` needs 202606), asserted in `ads/linkedin/utils.test.ts`.
1116
1127
  - Cache TTLs: accounts/account-detail 1h, listings 30m, analytics 15m–6h (depends on date range), facets 7d, urn-resolve 1h, bid-pricing/forecast 6h, audience-size 1h.
1117
- - `--skip-cache` (server-side) and `--no-cache` (client-side, where supported) on any command.
1128
+ - `--no-cache` on any command skips both cache layers (the CLI's own and the server's).
1118
1129
 
1119
1130
  #### LinkedIn-specific gotchas
1120
1131
 
@@ -5555,7 +5566,6 @@ This CLI is designed for AI agent consumption. Key patterns:
5555
5566
  - **0.119.0**: `draft amend`/`draft show` land on both `baker ads google` and `baker ads linkedin` — a generic JSON-merge-patch to update any staged op in place plus a full-payload receipt, replacing remove+recreate as the correction path. Google gains `assets update` and `asset-groups create|update` (Performance Max asset groups are now their own entity — `ads create --format performanceMaxAssetGroup` never worked and is gone); `ads create --format video` moves from a bare YouTube id to `--video-assets` refs (**breaking flag change** — stage the video as an asset first); `--format demandGen` gains `--image-assets`/`--square-image-assets`/`--logo-image-assets` and flag-building for headlines/descriptions. LinkedIn's `draft list` now renders a readable Campaign group ▸ Campaign ▸ Creative tree by default (`--json` for raw), `creatives update` gains `--campaign` (re-parent while staged), and `campaigns update` passes create-only fields (`--group`/`--type`/`--locale`/`--associated-entity`) through when amending a `li_temp_*` staged create instead of always stripping them.
5556
5567
  - **0.150.0**: `baker landing critique` gains an `agent-washing` rule in the `copy` family — an autonomy claim ("fully autonomous", "while you sleep", "no human intervention") with no signal anywhere on the page about who oversees the agent (approval, review, override, undo/rollback, audit log, escalation) scores a warn. Page-scope, so a hero may defer the trust story to a later section; generic privacy boilerplate does not clear it. `CRITIC_VERSION` bumps to `2`.
5557
5568
  - **0.152.0**: `baker ads linkedin campaigns url-params <ad-set-id>` stages an ad set's URL tracking parameters (LinkedIn's `adTrackingParameters`) — `--param key=value` for fixed values (repeatable or `&`-joined), `--dynamic key=PLACEHOLDER` for values LinkedIn fills in per ad (`CAMPAIGN_NAME`, `CREATIVE_ID`, …), `--clear` to remove them. LinkedIn appends these to the landing URL of every ad in the ad set, including ads already running, so this replaces stamping the same UTM onto each ad's `--landing-url` — which missed later ads and double-appended keys the ad set already set. Account-level parameters remain UI-only (LinkedIn exposes no API for them).
5558
- - **0.155.0**: new family `baker avatars list|get|create|update|delete` — company-scoped reusable AI presenters, typed from the shared `@baker/api` avatars contract. `get` returns the identity-sheet URL to pass to `baker studio generate --reference` plus the subject description to reuse verbatim, and every command's `hints` carry the next move (still building → re-check with `get`; changed `--subject` without `--regenerate-sheet` → the sheet is stale). `create` refuses `--source-image` without `--likeness-confirmed` and returns an `error.fix` telling the agent to ask the user for that permission; an unknown handle returns an `error.fix` pointing at `baker avatars list`. Profile flags on `update` merge over the stored profile instead of replacing it.
5559
5569
  - **0.153.0**: `baker landing critique` accepts several slugs in one call (`baker landing critique a b c`). `data.landings[]` always carries one entry per slug; a single slug additionally keeps the old top-level `data.slug`/`counts`/`dimensions`/`findings` shape, so existing readers are unaffected. An invalid or missing slug anywhere in the batch still fails the whole call up front. The scaffold's Stop-hook critique gate now emits one batched command instead of one line per stale landing.
5560
5570
  - **0.159.0**: `baker ads google ads update` takes the same content flags as `ads create` (`--format` + `--headlines`/`--descriptions`/image refs/…), and `--format app` becomes a flag-buildable format on both, with `--image-assets` wiring an App campaign ad's images (`AppAdInfo.images`) the same way Responsive Display does. Content flags without `--format` now fail instead of being silently dropped. An ad content update replaces **every field it sends** — a list has to include the entries you want to keep, while an optional asset list you omit is left untouched on the ad — and a partial payload (only the images, or Google's read-shaped `{"appAd":{…}}`) is rejected at stage time with the fields it's missing, instead of staging cleanly and blocking publish later. Content updates also record the staged image assets they consume as dependencies, so discarding an asset no longer leaves the ad pointing at nothing.
5561
5571
  - **0.167.0**: `baker ads google conversions update` stops staging two conversion-action changes Google always rejects. `status: "HIDDEN"` leaves the write contract — Google denies it on every conversion action ("the field's value is on a deny-list for this field"), and offering it made it the obvious pick for retiring an action gently, so a whole cleanup published nothing; the refusal now names the two changes that do work (`--no-primary` to stop bidding toward it while it keeps measuring, `status: "REMOVED"` to stop it counting). `HIDDEN` is unchanged everywhere it is *read* — an action hidden long ago still reads back. And an update against a conversion action **Google owns** — Smart campaign calls/directions, the in-ad lead form's submit, YouTube subscriptions and follow-on views, Floodlight and Search Ads 360 imports, store visits, codeless webpage actions — is refused at stage time, renames included, since Google rejects every write against one and its own interface will not change them either. Both refusals name what to do instead and tell the agent to carry on with the rest of the job.
@@ -5577,6 +5587,8 @@ This CLI is designed for AI agent consumption. Key patterns:
5577
5587
  - **0.180.1**: `baker tag-manager --help` said the container version Baker cuts at publish is **NOT** published, and told the agent to have the user publish it in Tag Manager. The executor publishes it — a clean run takes the client's container live — so the help understated an irreversible change to a production site. Corrected, and the stale `versionPendingMessage` helper (no callers, same wrong claim) removed from `@baker/api/tag-manager`. `draft list` already reported both outcomes correctly and is unchanged.
5578
5588
  - **0.191.0**: `baker ads google draft list` now flags a Search campaign staged with fewer than **3 image assets**, alongside the sitelink/callout/structured-snippet/negative-list advisories it already prints. The completeness pass counted `MARKETING_IMAGE` links but only ever checked them on Performance Max and Demand Gen, so a Search campaign could be staged and published with no images at all and nothing said a word — it just performed worse, which is exactly the failure advisories exist to catch. This is the same gap Google raises as its "Add images to your ads" recommendation, moved to the point where the agent can act on it: an image-less text ad is visibly smaller in the SERP than a competitor's. Images are the one asset kind an agent cannot write inline, so the advisory names the route — build with the `creative-canvas-ads` flow and its new `google_search` platform preset (1:1 required, 1.91:1 cropped from a rendered 16:9), then `assets create` + `assets attach --file` at `"fieldType": "MARKETING_IMAGE"` — and repeats the playbook's two rejections: never stock, never a logo on a plain background. Non-blocking, like every other advisory; publish is never gated on it.
5579
5589
 
5590
+ - **0.217.0**: new family `baker avatars list|get|create|update|delete`, plus `--avatar <handle>` on `baker studio generate` and `baker studio animate` — company-scoped reusable presenters, typed from the shared `@baker/api` avatars contract. `--avatar` is the way to cast one: it grounds the render on the identity sheet, reuses the subject description verbatim, and records the avatar on the batch. Passing the sheet through `--reference` instead does none of those and leaves the batch unattributed, so the avatar can never show what it has appeared in; the route refuses a handle that is not `ready`, because generating a stranger is worse than an error. `get` returns the sheet URL and that description; every command's `hints` carry the next move (still building → re-check with `get`; changed `--subject` without `--regenerate-sheet` → the sheet is stale). `create` refuses `--source-image` without `--likeness-confirmed` and returns an `error.fix` telling the agent to ask the user for that permission, since only they can give it; an unknown handle returns an `error.fix` pointing at `baker avatars list`. Profile flags on `update` merge over the stored profile instead of replacing it.
5591
+
5580
5592
  ## Publishing
5581
5593
 
5582
5594
  ### Auto-publish (CI)
@@ -16,9 +16,9 @@ import {
16
16
  shouldEscalate
17
17
  } from "./chunk-DZUVUGEP.js";
18
18
 
19
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js
19
+ // ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js
20
20
  var require_safe_stable_stringify = __commonJS({
21
- "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js"(exports, module) {
21
+ "../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js"(exports, module) {
22
22
  "use strict";
23
23
  var { hasOwnProperty } = Object.prototype;
24
24
  var stringify = configure2();
@@ -1092,7 +1092,7 @@ function resolveAdaptFormats(params) {
1092
1092
  return params.formats ?? [];
1093
1093
  }
1094
1094
 
1095
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/esm/wrapper.js
1095
+ // ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/esm/wrapper.js
1096
1096
  var import__ = __toESM(require_safe_stable_stringify(), 1);
1097
1097
  var configure = import__.default.configure;
1098
1098
  var wrapper_default = import__.default;
@@ -9074,4 +9074,4 @@ export {
9074
9074
  defaultRegistry,
9075
9075
  createEngineFromEnv
9076
9076
  };
9077
- //# sourceMappingURL=chunk-CMPAHYLB.js.map
9077
+ //# sourceMappingURL=chunk-EKLAHWSF.js.map