@koda-sl/baker-cli 0.423.0 → 0.424.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
@@ -3360,7 +3360,7 @@ baker winning-ads search "delivery driver recruitment" --audience-temperature 0_
3360
3360
  | `--scope followed-first\|followed\|all` | Which brands to draw from (default `followed-first`: the company's followed brands, topped up from the shared library; the whole library when it follows nobody) |
3361
3361
  | `--sort winner\|longest_running\|newest` | Order of a no-query browse (default `winner`); ignored when a query is given |
3362
3362
  | `--limit <n>` | Max results 1–100 (**default 10** — shortlist size) |
3363
- | `--max-per-advertiser <n>` | Cap results per advertiser 0–50 (default 3; `0` = no cap) |
3363
+ | `--max-per-advertiser <n>` | Unset (default): brands spread, each brand's best 3 first and the rest after the other brands, none dropped. `1`–`50`: drop a brand's ads past N (`1` = one reference per brand). `0`: rank order. Brands the query names ("HubSpot video ads") are never capped |
3364
3364
  | `--min-relevance <0-1>` | Relevance floor; trims weak matches |
3365
3365
  | `--platform <list>` | `meta,linkedin,tiktok` — pass a single value to search **only** that platform |
3366
3366
  | `--format <list>` | `video,static,carousel` |
@@ -3372,15 +3372,17 @@ baker winning-ads search "delivery driver recruitment" --audience-temperature 0_
3372
3372
  | `--exclude-brand-reliant` | Drop ads whose copy only works if the viewer already knows the brand (ads not judged yet are kept) |
3373
3373
  | `--advertiser-id <list>` | **Restrict to** these advertiser ids (browse one brand's winners) |
3374
3374
  | `--exclude-advertiser <list>` | **Drop** these advertiser ids, usually your own brand |
3375
- | `--country <list>` / `--language <list>` | Filter by country / language codes |
3375
+ | `--country <list>` | ISO country codes: ads known to run there, plus ads with no country data (every Meta ad) in that country's main language |
3376
+ | `--language <list>` | ISO 639-1 codes (`es,en`) for the language of the ad's copy and voiceover |
3376
3377
  | `--first-seen-after` / `--first-seen-before` | ISO date (`2026-01-01`, read as the start of that day in UTC) or datetime bounds (recency) |
3377
3378
  | `--hook-archetype <list>` | Narrow to ads on a proven hook **seed** (from `winning-ads hooks`) |
3378
3379
  | `--format-pattern <list>` | Narrow to statics in these containers (from `winning-ads formats`, e.g. `comparison_table`) |
3379
3380
  | `--diverse` | One varied page (different brands, containers, hooks) instead of rank order; ignores paging |
3380
3381
  | `--output json\|md\|files` | Output format (default json) |
3382
+ | `--fields <list>` | Only these row fields (e.g. `advertiser,container,mechanism`); a `--full`-only field turns `--full` on, an unknown one is refused with `error.fix.validValues` |
3381
3383
  | `--full` | Include DNA detail + longevity |
3382
3384
 
3383
- A value outside a closed list (`--platform`, `--format`, `--winner-category`, `--awareness`, `--audience-temperature`, `--funnel-stage`, `--advertiser-size`, `--format-pattern`), a non-numeric `--limit`/`--max-per-advertiser`/`--min-relevance`, or a bound that is not a date is refused before the search runs; a refused list value comes with `error.fix.validValues`. References this company already adapted (`already_adapted`) never take a fresh reference's place: `--limit N` returns up to N fresh ones first. The search waits up to 120 s (`followed-first` can run two library searches).
3385
+ A value outside a closed list (`--platform`, `--format`, `--winner-category`, `--awareness`, `--audience-temperature`, `--funnel-stage`, `--advertiser-size`, `--format-pattern`), a non-numeric `--limit`/`--max-per-advertiser`/`--min-relevance`, or a bound that is not a date is refused before the search runs; a refused list value comes with `error.fix.validValues`. References this company already adapted (`already_adapted`) never take a fresh reference's place: `--limit N` returns up to N fresh ones first. The search waits up to 120 s (`followed-first` can run two library searches). A library that does not answer in time is `UNAVAILABLE`, with an `error.fix` to retry once narrower. An empty answer carries a hint naming the one filter to loosen.
3384
3386
 
3385
3387
  Reading the scores: **`relevance`** (0–1) = match of the creative to your query; **`winner_score`** = how proven the ad is in-market. Pick references that are both relevant *and* proven.
3386
3388
 
@@ -3454,7 +3456,7 @@ Winners across **every** brand you follow, in one library → `GET /api/ad-libra
3454
3456
  Response `data`: `winners`, `following_count` (how many brands you follow), `advertiser_ids` (the ids actually queried = follows ∩ requested), and — when relevant — `hints` (e.g. you follow nobody yet, or a requested id isn't in your follows and was skipped). In `--output md`/`files` the table is the payload and the hints are written to **stderr** so they still surface without corrupting the output.
3455
3457
 
3456
3458
  ```bash
3457
- baker winning-ads feed --per-advertiser 5 --output md
3459
+ baker winning-ads feed --output md
3458
3460
  baker winning-ads feed --advertiser adv_123,adv_456 --platform meta --output md
3459
3461
  ```
3460
3462
 
@@ -3462,7 +3464,7 @@ baker winning-ads feed --advertiser adv_123,adv_456 --platform meta --output md
3462
3464
  |---|---|
3463
3465
  | `--advertiser <ids>` | Trim to a comma-separated subset of your followed advertiser ids (ids you don't follow are skipped and reported) |
3464
3466
  | `--platform meta\|linkedin` | Filter to a single platform |
3465
- | `--per-advertiser <n>` | Max winners kept per advertiser 0–50 (`0` = no cap, default 5) |
3467
+ | `--per-advertiser <n>` | Unset (default): brands spread, each brand's best 3 first and the rest after, none dropped. `1`–`50`: keep at most N per brand. `0`: rank order |
3466
3468
  | `--limit <n>` | Total winners across all follows 1–200 (default 40) |
3467
3469
  | `--winner-category <list>` | Restrict to specific winner categories |
3468
3470
  | `--format <list>` | Restrict to specific formats (e.g. `static,video`) |
@@ -1391,8 +1391,11 @@ export {
1391
1391
  compactVideo,
1392
1392
  videoNormalizer,
1393
1393
  testimonialNormalizer,
1394
+ compactWinningAd,
1395
+ fullWinningAd,
1394
1396
  winningAdNormalizer,
1395
1397
  adContentNormalizer,
1398
+ applyFieldMask,
1396
1399
  writeJson,
1397
1400
  writeOutput,
1398
1401
  getEnv,
@@ -1412,4 +1415,4 @@ export {
1412
1415
  captureVimeoCookie,
1413
1416
  childEnvWith
1414
1417
  };
1415
- //# sourceMappingURL=chunk-5JVAP5DC.js.map
1418
+ //# sourceMappingURL=chunk-FQOKJYKN.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  debugLogSetting
3
- } from "./chunk-5JVAP5DC.js";
3
+ } from "./chunk-FQOKJYKN.js";
4
4
 
5
5
  // src/debugLog.ts
6
6
  import { appendFileSync, mkdirSync, renameSync, statSync } from "fs";
@@ -212,4 +212,4 @@ export {
212
212
  readBodyForLog,
213
213
  installStreamTaps
214
214
  };
215
- //# sourceMappingURL=chunk-S36N4SOX.js.map
215
+ //# sourceMappingURL=chunk-GCTR4MDE.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  debugLogHttp,
3
3
  readBodyForLog
4
- } from "./chunk-S36N4SOX.js";
4
+ } from "./chunk-GCTR4MDE.js";
5
5
  import {
6
6
  API_KEY_FORMAT_MESSAGE,
7
7
  DIRECT_ROUTE,
@@ -22,7 +22,7 @@ import {
22
22
  refuseNonPublicUrl,
23
23
  requireConnection,
24
24
  shouldEscalate
25
- } from "./chunk-5JVAP5DC.js";
25
+ } from "./chunk-FQOKJYKN.js";
26
26
 
27
27
  // ../../node_modules/.pnpm/safe-stable-stringify@2.5.0/node_modules/safe-stable-stringify/index.js
28
28
  var require_safe_stable_stringify = __commonJS({
@@ -1040,10 +1040,15 @@ var winnersSearchFields = z2.object({
1040
1040
  // Pagination offset for infinite scroll. The browse view (no query) scrolls
1041
1041
  // the whole library; a text/similar search scrolls its bounded ranked pool.
1042
1042
  offset: z2.number().int().min(0).optional(),
1043
- // Per-advertiser cap. `0` = no cap (the library browse view sends it so a
1044
- // facet-filtered slice shows every winner and matches the facet-rail count);
1045
- // omit it to keep the service default cap for diverse cross-brand discovery.
1043
+ // Per-advertiser cap: past it a brand's ads are dropped. `0` = no cap (the
1044
+ // library browse view sends it so a facet-filtered slice shows every winner
1045
+ // and matches the facet-rail count); omit it to spread the brands instead,
1046
+ // three each at the top and none dropped.
1046
1047
  max_per_advertiser: z2.number().int().min(0).max(50).optional(),
1048
+ // ad-dna reads one advertiser in `advertiser_ids` as browsing that brand, and
1049
+ // keeps its measured failures. `false` keeps it a reference search: what
1050
+ // Baker sends when it narrowed to the company's followed brands itself.
1051
+ brand_browse: z2.boolean().optional(),
1047
1052
  min_relevance: z2.number().min(0).max(1).optional(),
1048
1053
  // One page picked for variety (different brands, containers and hooks)
1049
1054
  // instead of rank order: a reference set for N concepts. Ignores offset.
@@ -24633,6 +24638,7 @@ export {
24633
24638
  actionTempIdSchema,
24634
24639
  ACTION_COMPLETE_NOTE_MIN,
24635
24640
  adLibraryPlatformSchema,
24641
+ staticFormatPatternSchema,
24636
24642
  winnersSortSchema,
24637
24643
  winnerSearchScopeSchema,
24638
24644
  scopedWinnersSearchRequestSchema,
@@ -24916,4 +24922,4 @@ export {
24916
24922
  defaultRegistry,
24917
24923
  createEngineFromEnv
24918
24924
  };
24919
- //# sourceMappingURL=chunk-SWYBHYB5.js.map
24925
+ //# sourceMappingURL=chunk-IR4ZOEZV.js.map