@koda-sl/baker-cli 0.94.0 → 0.95.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/dist/cli.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-RCPMJKI7.js";
13
13
 
14
14
  // src/cli.ts
15
- import { defineCommand as defineCommand143, runMain } from "citty";
15
+ import { defineCommand as defineCommand144, runMain } from "citty";
16
16
 
17
17
  // src/commands/actions/index.ts
18
18
  import { defineCommand as defineCommand13 } from "citty";
@@ -853,7 +853,7 @@ var linkCommand = defineCommand7({
853
853
  import { defineCommand as defineCommand8 } from "citty";
854
854
  registerSchema({
855
855
  command: "actions.list",
856
- description: "List actions for the current company. Default: pre-bucketed (claimable/myClaims/blocked/claimedByOthers/completed/discarded). Set --bucketed=false for a flat list filterable by --status.",
856
+ description: "List actions for the current company. Default: pre-bucketed (claimable/myClaims/blocked/claimedByOthers/completed/discarded), each bucket ordered do-first (blockers before blocked, then highest-leverage). Set --bucketed=false for a flat list filterable by --status and orderable by --sort.",
857
857
  args: {
858
858
  bucketed: {
859
859
  type: "boolean",
@@ -865,6 +865,11 @@ registerSchema({
865
865
  type: "string",
866
866
  description: "Filter by status (only with --bucketed=false): pending|in_progress|completed|discarded",
867
867
  required: false
868
+ },
869
+ sort: {
870
+ type: "string",
871
+ description: "Order a flat list (only with --bucketed=false): priority (do-first: blockers before blocked, then highest-leverage) | recent. Default: priority.",
872
+ required: false
868
873
  }
869
874
  }
870
875
  });
@@ -875,7 +880,8 @@ var listCommand2 = defineCommand8({
875
880
  },
876
881
  args: {
877
882
  bucketed: { type: "boolean", description: "Pre-bucket by chat", required: false, default: true },
878
- status: { type: "string", description: "Status filter (raw mode)", required: false }
883
+ status: { type: "string", description: "Status filter (raw mode)", required: false },
884
+ sort: { type: "string", description: "Order (raw mode): priority|recent", required: false }
879
885
  },
880
886
  run: async ({ args }) => {
881
887
  try {
@@ -889,6 +895,7 @@ var listCommand2 = defineCommand8({
889
895
  if (args.status) {
890
896
  body.status = args.status;
891
897
  }
898
+ body.sort = args.sort === "recent" ? "recent" : "priority";
892
899
  }
893
900
  const response = await apiPost("/api/actions/list", body);
894
901
  writeJson(response);
@@ -9096,7 +9103,8 @@ function buildElementSlots(elements) {
9096
9103
  "spine",
9097
9104
  "overlaid",
9098
9105
  "captions",
9099
- "captions_transcript",
9106
+ "captions_premux",
9107
+ "captions_transcribe",
9100
9108
  "audio_mix",
9101
9109
  "final",
9102
9110
  "music_bed"
@@ -9762,7 +9770,8 @@ function makePresenterPresent(slots, canonical, opts = {}) {
9762
9770
  };
9763
9771
  }
9764
9772
  var PAUSE_GAP_S = 0.6;
9765
- var PHRASE_MAX_S = SEEDANCE_DURATIONS[SEEDANCE_DURATIONS.length - 1];
9773
+ var SEEDANCE_SAFE_MAX_S = SEEDANCE_DURATIONS.find((d) => d >= 10) ?? 10;
9774
+ var PHRASE_MAX_S = SEEDANCE_SAFE_MAX_S;
9766
9775
  function collapseVoiceover(blueprint) {
9767
9776
  const casts = castIdSet(blueprint);
9768
9777
  const cameraOn = onCameraDialogue(blueprint);
@@ -10564,22 +10573,8 @@ function scaffoldVideoCanvas(input, elementsInput, opts) {
10564
10573
  videoRef = "$ref:overlaid.video";
10565
10574
  videoNode = "overlaid";
10566
10575
  }
10567
- if (opts.captionsCompositionPath && opts.transcriptPath) {
10568
- nodes.push({
10569
- id: "captions_transcript",
10570
- type: "ingest",
10571
- params: { source: "path", path: opts.transcriptPath, expect: "json" }
10572
- });
10573
- nodes.push({
10574
- id: "captions",
10575
- type: "hyperframe_render",
10576
- inputs: { background: videoRef, transcript: "$ref:captions_transcript.asset" },
10577
- params: { composition: opts.captionsCompositionPath }
10578
- });
10579
- videoRef = "$ref:captions.video";
10580
- videoNode = "captions";
10581
- }
10582
10576
  const tracks = [...voTracks, ...buildSfxMusic(blueprint, nodes)];
10577
+ let audioMixRef;
10583
10578
  if (tracks.length > 0) {
10584
10579
  const mixInputs = {};
10585
10580
  for (const t of tracks) mixInputs[t.slot] = t.ref;
@@ -10600,10 +10595,54 @@ function scaffoldVideoCanvas(input, elementsInput, opts) {
10600
10595
  ...duck
10601
10596
  }
10602
10597
  });
10598
+ audioMixRef = "$ref:audio_mix.audio";
10599
+ }
10600
+ if (opts.captionsCompositionPath && audioMixRef) {
10601
+ nodes.push({
10602
+ id: "captions_premux",
10603
+ type: "ffmpeg",
10604
+ inputs: { video: videoRef, audio: audioMixRef },
10605
+ params: {
10606
+ args: [
10607
+ "-i",
10608
+ "{{in.video}}",
10609
+ "-i",
10610
+ "{{in.audio}}",
10611
+ "-map",
10612
+ "0:v:0",
10613
+ "-map",
10614
+ "1:a:0",
10615
+ "-c:v",
10616
+ "copy",
10617
+ "-c:a",
10618
+ "aac",
10619
+ "-shortest",
10620
+ "{{out.video}}"
10621
+ ],
10622
+ outputs: { video: { kind: "video", ext: "mp4" } }
10623
+ }
10624
+ });
10625
+ const captionLanguage = deriveTtsLanguageCode(blueprint);
10626
+ nodes.push({
10627
+ id: "captions_transcribe",
10628
+ type: "video_transcribe",
10629
+ inputs: { video: "$ref:captions_premux.video" },
10630
+ params: captionLanguage ? { language: captionLanguage } : {}
10631
+ });
10632
+ nodes.push({
10633
+ id: "captions",
10634
+ type: "hyperframe_render",
10635
+ inputs: { background: videoRef, transcript: "$ref:captions_transcribe.transcript" },
10636
+ params: { composition: opts.captionsCompositionPath }
10637
+ });
10638
+ videoRef = "$ref:captions.video";
10639
+ videoNode = "captions";
10640
+ }
10641
+ if (audioMixRef) {
10603
10642
  nodes.push({
10604
10643
  id: "final",
10605
10644
  type: "ffmpeg",
10606
- inputs: { video: videoRef, audio: "$ref:audio_mix.audio" },
10645
+ inputs: { video: videoRef, audio: audioMixRef },
10607
10646
  params: {
10608
10647
  args: [
10609
10648
  "-i",
@@ -10845,14 +10884,36 @@ function buildVideoTodo(report, overlayCount, floatingCount, opts, blueprint) {
10845
10884
  // "none detected" — re-watch the reference and fill the gaps with the right tool.
10846
10885
  completeness_check: 'The scaffold mirrors the deconstruct\'s catalog, which UNDER-DETECTS \u2014 never trust a 0 count. Re-watch the reference frame-by-frame and add anything missing: (1) ON-IMAGE GRAPHICS not in floating_elements (dollar/coin icons, emojis, checkmarks, rating stars, price tags, arrows, progress bars, app UI) \u2192 source each with `baker images icon "<desc>"` / `baker images sticker` / `baker images gif` / `baker images logo <domain>` and add it as an <img class="ov pos-* " data-start data-dur> in video-overlay-composition/index.html (NEVER bake graphics into the frame plates). (2) SOUND CUES not in sound_effects (cha-ching/coin, whoosh, ding, pop, notification, keyboard) \u2192 add a `sound_effect` node (eleven_text_to_sound) and wire it onto `audio_mix` at its timestamp. (3) RECURRING people/animals/products/logos/sets with no el_* slot \u2192 add an `ingest` [TODO] slot and reference it from the frames they appear in. (4) Burned-in captions/text not in text_overlays \u2192 add an <img>-free <div class="ov"> in index.html. (5) ONE person playing MULTIPLE personas/wardrobes (skeptic vs believer, before vs after, two outfits) collapsed into a single el_* slot \u2192 split into one el_* slot PER look, each linked as the SAME individual via `same_as` so every outfit has its own reference image but the face/identity stays identical.',
10847
10886
  scenes_clamped_to_15s: report.clamped_scenes,
10887
+ oversize_scenes: report.oversize_scenes.length > 0 ? {
10888
+ scenes: report.oversize_scenes,
10889
+ fix: "Each listed scene's own footage is longer than the gateway-safe ~10s clip ceiling, so its clip will fail the gateway (HTTP 524) \u2014 and the scaffold can't auto-split a single scene. Split each into two scenes in prompt.json (scene N+1's start frame = scene N's end frame, so the action stays continuous) before rendering."
10890
+ } : "none \u2014 every scene fits within the gateway-safe clip ceiling.",
10891
+ overstuffed_scenes: report.overstuffed_scenes.length > 0 ? {
10892
+ scenes: report.overstuffed_scenes,
10893
+ fix: "Each listed scene's estimated speech runs well past its window \u2014 the line will overrun the scene and push the picture off the audio timeline (lips fall behind). Shorten the copy in prompt.json or lengthen the scene before rendering."
10894
+ } : "none \u2014 every scene's spoken length fits its window.",
10848
10895
  run_warning: "`baker canvas run` generates many billed image/video/audio assets \u2014 validate first, it is not free."
10849
10896
  };
10850
10897
  }
10898
+ var OVERSTUFF_RATIO = 1.3;
10899
+ function collectClipAdvisories(scene, i, out) {
10900
+ const round22 = (n) => Math.round(n * 100) / 100;
10901
+ const original = scene.duration_s ?? 5;
10902
+ if (original > 15) out.clamped.push({ scene: i, original_s: original, clip_s: snapToSeedance(original) });
10903
+ const window = sceneDurationS(scene);
10904
+ if (window > SEEDANCE_SAFE_MAX_S)
10905
+ out.oversize.push({ scene: i, scene_s: round22(window), clip_s: ceilToSeedance(window) });
10906
+ const speech = (scene.dialogue ?? []).reduce((s, line) => s + (line.line ? estSpeechS(line.line) : 0), 0);
10907
+ if (speech > window * OVERSTUFF_RATIO)
10908
+ out.overstuffed.push({ scene: i, scene_s: round22(window), est_speech_s: round22(speech) });
10909
+ }
10851
10910
  function videoReport(input, elementsInput) {
10852
10911
  const blueprint = VideoBlueprint.parse(input);
10853
10912
  const elements = RecurringElements.parse(elementsInput);
10854
10913
  const dialogue = [];
10855
10914
  const clamped = [];
10915
+ const oversize = [];
10916
+ const overstuffed = [];
10856
10917
  let sfxCount = 0;
10857
10918
  let overlayCount = 0;
10858
10919
  blueprint.scenes.forEach((scene, i) => {
@@ -10868,9 +10929,7 @@ function videoReport(input, elementsInput) {
10868
10929
  }
10869
10930
  sfxCount += (scene.sfx ?? []).length;
10870
10931
  overlayCount += (scene.overlays ?? []).length;
10871
- const original = scene.duration_s ?? 5;
10872
- const clip = snapToSeedance(original);
10873
- if (original > 15) clamped.push({ scene: i, original_s: original, clip_s: clip });
10932
+ collectClipAdvisories(scene, i, { clamped, oversize, overstuffed });
10874
10933
  });
10875
10934
  return {
10876
10935
  scene_count: blueprint.scenes.length,
@@ -10885,6 +10944,8 @@ function videoReport(input, elementsInput) {
10885
10944
  sfx_count: sfxCount,
10886
10945
  overlay_count: overlayCount,
10887
10946
  clamped_scenes: clamped,
10947
+ oversize_scenes: oversize,
10948
+ overstuffed_scenes: overstuffed,
10888
10949
  has_music: Boolean(blueprint.global?.music?.music_prompt)
10889
10950
  };
10890
10951
  }
@@ -10950,12 +11011,9 @@ async function loadTranscriptBestEffort(ref) {
10950
11011
  async function stageCaptions(outDir, transcript) {
10951
11012
  const text = transcript?.trim();
10952
11013
  if (!text || text === "[]") return {};
10953
- const transcriptPath = path5.join(outDir, "transcript.json");
10954
- await writeFile2(transcriptPath, `${text}
10955
- `, "utf8");
10956
11014
  const compositionPath = path5.join(outDir, "tiktok-captions-composition");
10957
11015
  await cp(SHIPPED_CAPTIONS_DIR, compositionPath, { recursive: true });
10958
- return { compositionPath, transcriptPath };
11016
+ return { compositionPath };
10959
11017
  }
10960
11018
  function parseElements2(raw) {
10961
11019
  const parsed = JSON.parse(raw);
@@ -11161,7 +11219,6 @@ var scaffoldVideoCommand = defineCommand78({
11161
11219
  videoModel,
11162
11220
  overlayCompositionPath: compositionDest,
11163
11221
  captionsCompositionPath: captions.compositionPath,
11164
- transcriptPath: captions.transcriptPath,
11165
11222
  blueprintPath,
11166
11223
  frames,
11167
11224
  ambient: Boolean(args.ambient),
@@ -11214,6 +11271,8 @@ var scaffoldVideoCommand = defineCommand78({
11214
11271
  overlay_count: report.overlay_count,
11215
11272
  has_music: report.has_music,
11216
11273
  scenes_clamped_to_15s: report.clamped_scenes,
11274
+ oversize_scenes: report.oversize_scenes,
11275
+ overstuffed_scenes: report.overstuffed_scenes,
11217
11276
  note: "Drop ONE real source image at each el_* [TODO] (reused across every frame that element appears in), confirm each voice_select casting, then `baker canvas validate` and `baker canvas run`. Running generates many billed image/video/audio assets \u2014 it is not free."
11218
11277
  }
11219
11278
  },
@@ -12108,7 +12167,7 @@ Examples:
12108
12167
  });
12109
12168
 
12110
12169
  // src/commands/images/index.ts
12111
- import { defineCommand as defineCommand111 } from "citty";
12170
+ import { defineCommand as defineCommand112 } from "citty";
12112
12171
 
12113
12172
  // src/commands/images/crop.ts
12114
12173
  import { defineCommand as defineCommand89 } from "citty";
@@ -14329,10 +14388,55 @@ var stockCommand = defineCommand107({
14329
14388
  }
14330
14389
  });
14331
14390
 
14391
+ // src/lib/tags-command.ts
14392
+ import { defineCommand as defineCommand108 } from "citty";
14393
+ function makeTagsCommand(command, label, endpoint) {
14394
+ registerSchema({
14395
+ command: `${command}.tags`,
14396
+ description: `List the available ${label} tag taxonomy (built-in defaults + this company's custom tags).`,
14397
+ args: {
14398
+ output: { type: "string", description: "Output format: md|json", required: false, default: "md" }
14399
+ }
14400
+ });
14401
+ return defineCommand108({
14402
+ meta: {
14403
+ name: "tags",
14404
+ description: `List the available ${label} tag names (defaults + company custom tags). Use before filtering with --tags. Example: baker ${command} tags`
14405
+ },
14406
+ args: {
14407
+ output: { type: "string", description: "Output format: md|json", required: false, default: "md" }
14408
+ },
14409
+ run: async ({ args }) => {
14410
+ try {
14411
+ const { markdown } = await apiGet(endpoint);
14412
+ if (args.output === "json") {
14413
+ writeJson({ ok: true, data: { markdown } });
14414
+ return;
14415
+ }
14416
+ process.stdout.write(`${markdown.trimEnd()}
14417
+ `);
14418
+ } catch (err) {
14419
+ const code = err instanceof ApiError ? err.code : "INTERNAL_ERROR";
14420
+ const message = err instanceof ApiError ? err.message : "Unexpected error";
14421
+ if (args.output === "json") {
14422
+ writeJson({ ok: false, error: { code, message } });
14423
+ } else {
14424
+ process.stderr.write(`Error: ${message}
14425
+ `);
14426
+ }
14427
+ process.exit(1);
14428
+ }
14429
+ }
14430
+ });
14431
+ }
14432
+
14433
+ // src/commands/images/tags.ts
14434
+ var tagsCommand = makeTagsCommand("images", "image", "/api/images/tags");
14435
+
14332
14436
  // src/commands/images/upload.ts
14333
14437
  import { readFile as readFile9 } from "fs/promises";
14334
14438
  import { extname as extname2 } from "path";
14335
- import { defineCommand as defineCommand108 } from "citty";
14439
+ import { defineCommand as defineCommand109 } from "citty";
14336
14440
  var MIME_MAP = {
14337
14441
  ".png": "image/png",
14338
14442
  ".jpg": "image/jpeg",
@@ -14387,7 +14491,7 @@ function detectContentType(filePath) {
14387
14491
  }
14388
14492
  return mime;
14389
14493
  }
14390
- var uploadCommand = defineCommand108({
14494
+ var uploadCommand = defineCommand109({
14391
14495
  meta: {
14392
14496
  name: "upload",
14393
14497
  description: "Upload an image to the library \u2014 accepts a local file path OR a remote http(s) URL.\n\nLocal: reads bytes, sends to /api/images/upload, content-type auto-detected from extension.\nRemote: dispatches to /api/images/ingest with hash-dedup on bytes + externalId.\n\nExamples:\n baker images upload ./logo.png --source uploaded\n baker images upload ./cert.png --context 'ISO 27001 badge \u2014 enterprise tier'\n baker images upload https://acme.com/hero.png --source firecrawl --context 'Acme competitor pricing hero'"
@@ -14480,7 +14584,7 @@ async function uploadLocal(target, args) {
14480
14584
  }
14481
14585
 
14482
14586
  // src/commands/images/upscale.ts
14483
- import { defineCommand as defineCommand109 } from "citty";
14587
+ import { defineCommand as defineCommand110 } from "citty";
14484
14588
  registerSchema({
14485
14589
  command: "images.upscale",
14486
14590
  description: "Upscale a library image via the backend (Replicate, cost-tracked). Waits for completion by default. The image must be status 'ready' and raster (not SVG/AVIF).",
@@ -14495,7 +14599,7 @@ registerSchema({
14495
14599
  }
14496
14600
  });
14497
14601
  var POLL_INTERVAL_MS3 = 1500;
14498
- var upscaleCommand = defineCommand109({
14602
+ var upscaleCommand = defineCommand110({
14499
14603
  meta: {
14500
14604
  name: "upscale",
14501
14605
  description: "Upscale a library image via the Convex backend (Replicate, cost-tracked at $0.05/image). Waits for completion by default.\n\nExample: baker images upscale j571abc123def\nExample: baker images upscale j571abc123def --max-wait 0 # fire-and-forget"
@@ -14550,7 +14654,7 @@ var upscaleCommand = defineCommand109({
14550
14654
  });
14551
14655
 
14552
14656
  // src/commands/images/use.ts
14553
- import { defineCommand as defineCommand110 } from "citty";
14657
+ import { defineCommand as defineCommand111 } from "citty";
14554
14658
  registerSchema({
14555
14659
  command: "images.use",
14556
14660
  description: "Ingest a URL and wait for the library record to be ready.",
@@ -14566,7 +14670,7 @@ registerSchema({
14566
14670
  }
14567
14671
  });
14568
14672
  var POLL_INTERVAL_MS4 = 1500;
14569
- var useCommand = defineCommand110({
14673
+ var useCommand = defineCommand111({
14570
14674
  meta: {
14571
14675
  name: "use",
14572
14676
  description: "Sugar over `ingest`: download \u2192 store \u2192 wait until describe + embed complete \u2192 return ready library record.\n\nExample: baker images use https://cdn.example.com/hero.png --source uploaded"
@@ -14612,7 +14716,7 @@ var useCommand = defineCommand110({
14612
14716
  });
14613
14717
 
14614
14718
  // src/commands/images/index.ts
14615
- var imagesCommand = defineCommand111({
14719
+ var imagesCommand = defineCommand112({
14616
14720
  meta: {
14617
14721
  name: "images",
14618
14722
  description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.
@@ -14648,6 +14752,9 @@ Local transforms (operate on files in the sandbox, before upload):
14648
14752
  Coordinate-based rectangular extract
14649
14753
  baker images dimensions <file-or-url> Width / height / aspect / format without decoding the full image
14650
14754
 
14755
+ Taxonomy:
14756
+ baker images tags List available image tag names (defaults + company custom tags)
14757
+
14651
14758
  Paid transforms (run on the Convex backend, cost-tracked):
14652
14759
  baker images upscale <imageId> Real-ESRGAN super-resolution ($0.05/image, waits for completion)`
14653
14760
  },
@@ -14673,15 +14780,16 @@ Paid transforms (run on the Convex backend, cost-tracked):
14673
14780
  normalize: normalizeCommand,
14674
14781
  crop: cropCommand,
14675
14782
  dimensions: dimensionsCommand,
14676
- upscale: upscaleCommand
14783
+ upscale: upscaleCommand,
14784
+ tags: tagsCommand
14677
14785
  }
14678
14786
  });
14679
14787
 
14680
14788
  // src/commands/research/index.ts
14681
- import { defineCommand as defineCommand122 } from "citty";
14789
+ import { defineCommand as defineCommand123 } from "citty";
14682
14790
 
14683
14791
  // src/commands/research/advertisers.ts
14684
- import { defineCommand as defineCommand112 } from "citty";
14792
+ import { defineCommand as defineCommand113 } from "citty";
14685
14793
 
14686
14794
  // src/commands/research/output.ts
14687
14795
  var RESEARCH_DATA_NOTE = "Estimates based on third-party SERP data \u2014 not exact figures. Use for directional insights, not precise measurement.";
@@ -14794,7 +14902,7 @@ var FIELDS3 = {
14794
14902
  etv: "Estimated traffic value (USD)",
14795
14903
  visibility: "SERP visibility score (0-1)"
14796
14904
  };
14797
- var advertisersCommand = defineCommand112({
14905
+ var advertisersCommand = defineCommand113({
14798
14906
  meta: {
14799
14907
  name: "advertisers",
14800
14908
  description: `Find domains competing for a keyword in Google SERPs.
@@ -14841,7 +14949,7 @@ Examples:
14841
14949
  });
14842
14950
 
14843
14951
  // src/commands/research/autocomplete.ts
14844
- import { defineCommand as defineCommand113 } from "citty";
14952
+ import { defineCommand as defineCommand114 } from "citty";
14845
14953
  registerSchema({
14846
14954
  command: "research.autocomplete",
14847
14955
  description: "Get Google Autocomplete suggestions for a seed keyword. Useful for keyword expansion and discovering what people actually search for. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).",
@@ -14864,7 +14972,7 @@ registerSchema({
14864
14972
  var FIELDS4 = {
14865
14973
  suggestion: "Autocomplete suggestion from Google"
14866
14974
  };
14867
- var autocompleteCommand = defineCommand113({
14975
+ var autocompleteCommand = defineCommand114({
14868
14976
  meta: {
14869
14977
  name: "autocomplete",
14870
14978
  description: `Get Google Autocomplete suggestions for keyword expansion.
@@ -14910,7 +15018,7 @@ Examples:
14910
15018
  });
14911
15019
 
14912
15020
  // src/commands/research/countries.ts
14913
- import { defineCommand as defineCommand114 } from "citty";
15021
+ import { defineCommand as defineCommand115 } from "citty";
14914
15022
  registerSchema({
14915
15023
  command: "research.countries",
14916
15024
  description: "List all supported country codes for --location flag in research commands.",
@@ -14967,7 +15075,7 @@ var FIELDS5 = {
14967
15075
  code: "Country code to pass as --location",
14968
15076
  name: "Country name"
14969
15077
  };
14970
- var countriesCommand = defineCommand114({
15078
+ var countriesCommand = defineCommand115({
14971
15079
  meta: {
14972
15080
  name: "countries",
14973
15081
  description: "List all supported country codes for --location flag."
@@ -14978,7 +15086,7 @@ var countriesCommand = defineCommand114({
14978
15086
  });
14979
15087
 
14980
15088
  // src/commands/research/intent.ts
14981
- import { defineCommand as defineCommand115 } from "citty";
15089
+ import { defineCommand as defineCommand116 } from "citty";
14982
15090
  registerSchema({
14983
15091
  command: "research.intent",
14984
15092
  description: "Classify Google Search intent for keywords. Determines if someone searching is looking to buy, research, or navigate. IMPORTANT: If --language is omitted, defaults to English (en). The response includes a query_context object showing which language was used.",
@@ -15001,7 +15109,7 @@ var FIELDS6 = {
15001
15109
  intent: "Primary Google Search intent: informational, navigational, commercial, transactional",
15002
15110
  probability: "Confidence score 0.0-1.0"
15003
15111
  };
15004
- var intentCommand = defineCommand115({
15112
+ var intentCommand = defineCommand116({
15005
15113
  meta: {
15006
15114
  name: "intent",
15007
15115
  description: `Classify Google Search intent for keywords. Returns intent type and confidence.
@@ -15049,7 +15157,7 @@ Examples:
15049
15157
  });
15050
15158
 
15051
15159
  // src/commands/research/keyword-gap.ts
15052
- import { defineCommand as defineCommand116 } from "citty";
15160
+ import { defineCommand as defineCommand117 } from "citty";
15053
15161
  registerSchema({
15054
15162
  command: "research.keyword-gap",
15055
15163
  description: "Find keywords a competitor ranks for (organic or paid) that you don't. Discovers expansion opportunities. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
@@ -15078,7 +15186,7 @@ var FIELDS7 = {
15078
15186
  cpc: "Cost per click USD",
15079
15187
  their_position: "Competitor's ranking position"
15080
15188
  };
15081
- var keywordGapCommand = defineCommand116({
15189
+ var keywordGapCommand = defineCommand117({
15082
15190
  meta: {
15083
15191
  name: "keyword-gap",
15084
15192
  description: `Find keywords a competitor has that you don't. Supports pagination via --offset.
@@ -15152,7 +15260,7 @@ Examples:
15152
15260
  });
15153
15261
 
15154
15262
  // src/commands/research/keywords-for-site.ts
15155
- import { defineCommand as defineCommand117 } from "citty";
15263
+ import { defineCommand as defineCommand118 } from "citty";
15156
15264
  registerSchema({
15157
15265
  command: "research.keywords-for-site",
15158
15266
  description: "Get keywords a competitor targets in Google. Use --type paid to see only paid keywords, --type organic for organic only. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
@@ -15185,7 +15293,7 @@ var FIELDS8 = {
15185
15293
  competition: "LOW, MEDIUM, or HIGH",
15186
15294
  competition_index: "Competition score 0-100"
15187
15295
  };
15188
- var keywordsForSiteCommand = defineCommand117({
15296
+ var keywordsForSiteCommand = defineCommand118({
15189
15297
  meta: {
15190
15298
  name: "keywords-for-site",
15191
15299
  description: `Get keywords a competitor targets in Google. Use --type to filter paid/organic.
@@ -15238,7 +15346,7 @@ Examples:
15238
15346
  });
15239
15347
 
15240
15348
  // src/commands/research/languages.ts
15241
- import { defineCommand as defineCommand118 } from "citty";
15349
+ import { defineCommand as defineCommand119 } from "citty";
15242
15350
  registerSchema({
15243
15351
  command: "research.languages",
15244
15352
  description: "List all supported language codes for --language flag in research commands.",
@@ -15268,7 +15376,7 @@ var FIELDS9 = {
15268
15376
  code: "Language code to pass as --language",
15269
15377
  name: "Language name (also accepted by --language)"
15270
15378
  };
15271
- var languagesCommand2 = defineCommand118({
15379
+ var languagesCommand2 = defineCommand119({
15272
15380
  meta: {
15273
15381
  name: "languages",
15274
15382
  description: "List all supported language codes for --language flag."
@@ -15279,7 +15387,7 @@ var languagesCommand2 = defineCommand118({
15279
15387
  });
15280
15388
 
15281
15389
  // src/commands/research/lighthouse.ts
15282
- import { defineCommand as defineCommand119 } from "citty";
15390
+ import { defineCommand as defineCommand120 } from "citty";
15283
15391
  registerSchema({
15284
15392
  command: "research.lighthouse",
15285
15393
  description: "Landing page performance audit. Returns metrics that affect Google Ads Quality Score and CPC.",
@@ -15298,7 +15406,7 @@ var FIELDS10 = {
15298
15406
  speed_index_ms: "Speed Index in ms (good: < 3400)",
15299
15407
  interactive_ms: "Time to Interactive in ms (good: < 3800)"
15300
15408
  };
15301
- var lighthouseCommand = defineCommand119({
15409
+ var lighthouseCommand = defineCommand120({
15302
15410
  meta: {
15303
15411
  name: "lighthouse",
15304
15412
  description: `Landing page performance audit. Metrics affecting Google Ads Quality Score.
@@ -15336,7 +15444,7 @@ Examples:
15336
15444
  });
15337
15445
 
15338
15446
  // src/commands/research/relevant-pages.ts
15339
- import { defineCommand as defineCommand120 } from "citty";
15447
+ import { defineCommand as defineCommand121 } from "citty";
15340
15448
  registerSchema({
15341
15449
  command: "research.relevant-pages",
15342
15450
  description: "Get the top pages of a competitor domain with organic traffic and ranking data. Shows which pages drive the most traffic. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).",
@@ -15362,7 +15470,7 @@ var FIELDS11 = {
15362
15470
  keywords: "Total organic keywords the page ranks for",
15363
15471
  top_10: "Keywords in positions 1-10"
15364
15472
  };
15365
- var relevantPagesCommand = defineCommand120({
15473
+ var relevantPagesCommand = defineCommand121({
15366
15474
  meta: {
15367
15475
  name: "relevant-pages",
15368
15476
  description: `Get the top pages of a competitor domain with traffic data.
@@ -15408,7 +15516,7 @@ Examples:
15408
15516
  });
15409
15517
 
15410
15518
  // src/commands/research/web.ts
15411
- import { defineCommand as defineCommand121 } from "citty";
15519
+ import { defineCommand as defineCommand122 } from "citty";
15412
15520
  registerSchema({
15413
15521
  command: "research.web",
15414
15522
  description: "Search the web with AI to answer marketing questions \u2014 competitors, ICP, pricing, pain points, market trends. Three depth levels: medium (quick, default), high (thorough), xhigh (exhaustive deep research).",
@@ -15459,7 +15567,7 @@ async function runDeepResearch(question) {
15459
15567
  }
15460
15568
  throw new Error("Deep research timed out");
15461
15569
  }
15462
- var webCommand = defineCommand121({
15570
+ var webCommand = defineCommand122({
15463
15571
  meta: {
15464
15572
  name: "web",
15465
15573
  description: `Search the web with AI to answer any open-ended marketing question. Uses live internet data via Google Search.
@@ -15519,7 +15627,7 @@ Examples:
15519
15627
  });
15520
15628
 
15521
15629
  // src/commands/research/index.ts
15522
- var researchCommand = defineCommand122({
15630
+ var researchCommand = defineCommand123({
15523
15631
  meta: {
15524
15632
  name: "research",
15525
15633
  description: `Competitive intelligence and AI-powered research commands.
@@ -15559,10 +15667,10 @@ Examples:
15559
15667
  });
15560
15668
 
15561
15669
  // src/commands/scheduled-actions/index.ts
15562
- import { defineCommand as defineCommand129 } from "citty";
15670
+ import { defineCommand as defineCommand130 } from "citty";
15563
15671
 
15564
15672
  // src/commands/scheduled-actions/create.ts
15565
- import { defineCommand as defineCommand123 } from "citty";
15673
+ import { defineCommand as defineCommand124 } from "citty";
15566
15674
 
15567
15675
  // src/commands/scheduled-actions/shared.ts
15568
15676
  var TEMP_SCHEDULED_ACTION_PREFIX = "temp_sched_";
@@ -15667,7 +15775,7 @@ registerSchema({
15667
15775
  prompt: { type: "string", description: "Additional prompt instructions for the spawned agent", required: false }
15668
15776
  }
15669
15777
  });
15670
- var createCommand2 = defineCommand123({
15778
+ var createCommand2 = defineCommand124({
15671
15779
  meta: {
15672
15780
  name: "create",
15673
15781
  description: 'Stage a scheduled action. Example: baker scheduled-actions create --name "Weekly report" --description "..." --cron "0 9 * * MON"'
@@ -15715,7 +15823,7 @@ var createCommand2 = defineCommand123({
15715
15823
  });
15716
15824
 
15717
15825
  // src/commands/scheduled-actions/delete.ts
15718
- import { defineCommand as defineCommand124 } from "citty";
15826
+ import { defineCommand as defineCommand125 } from "citty";
15719
15827
  registerSchema({
15720
15828
  command: "scheduled-actions.delete",
15721
15829
  description: "Stage deletion of a published scheduled action or cancellation of a temp_sched_* draft creation.",
@@ -15723,7 +15831,7 @@ registerSchema({
15723
15831
  id: { type: "string", description: "Published scheduled action ID or temp_sched_* draft ID", required: true }
15724
15832
  }
15725
15833
  });
15726
- var deleteCommand2 = defineCommand124({
15834
+ var deleteCommand2 = defineCommand125({
15727
15835
  meta: {
15728
15836
  name: "delete",
15729
15837
  description: "Stage scheduled action deletion. Example: baker scheduled-actions delete <id-or-temp_sched_id>"
@@ -15752,7 +15860,7 @@ var deleteCommand2 = defineCommand124({
15752
15860
  });
15753
15861
 
15754
15862
  // src/commands/scheduled-actions/get.ts
15755
- import { defineCommand as defineCommand125 } from "citty";
15863
+ import { defineCommand as defineCommand126 } from "citty";
15756
15864
  registerSchema({
15757
15865
  command: "scheduled-actions.get",
15758
15866
  description: "Get a published scheduled action or a temp_sched_* draft-created scheduled action.",
@@ -15760,7 +15868,7 @@ registerSchema({
15760
15868
  id: { type: "string", description: "Published scheduled action ID or temp_sched_* draft ID", required: true }
15761
15869
  }
15762
15870
  });
15763
- var getCommand3 = defineCommand125({
15871
+ var getCommand3 = defineCommand126({
15764
15872
  meta: {
15765
15873
  name: "get",
15766
15874
  description: "Get a scheduled action. Example: baker scheduled-actions get <id-or-temp_sched_id>"
@@ -15797,13 +15905,13 @@ var getCommand3 = defineCommand125({
15797
15905
  });
15798
15906
 
15799
15907
  // src/commands/scheduled-actions/list.ts
15800
- import { defineCommand as defineCommand126 } from "citty";
15908
+ import { defineCommand as defineCommand127 } from "citty";
15801
15909
  registerSchema({
15802
15910
  command: "scheduled-actions.list",
15803
15911
  description: "List published scheduled actions. Includes draft state when BAKER_CHAT_ID is set.",
15804
15912
  args: {}
15805
15913
  });
15806
- var listCommand3 = defineCommand126({
15914
+ var listCommand3 = defineCommand127({
15807
15915
  meta: {
15808
15916
  name: "list",
15809
15917
  description: "List scheduled actions. Includes staged draft ops when BAKER_CHAT_ID is set."
@@ -15824,7 +15932,7 @@ var listCommand3 = defineCommand126({
15824
15932
  });
15825
15933
 
15826
15934
  // src/commands/scheduled-actions/trigger.ts
15827
- import { defineCommand as defineCommand127 } from "citty";
15935
+ import { defineCommand as defineCommand128 } from "citty";
15828
15936
  registerSchema({
15829
15937
  command: "scheduled-actions.trigger",
15830
15938
  description: "Immediately trigger a published scheduled action. Does not require BAKER_CHAT_ID and rejects temp_sched_* IDs.",
@@ -15832,7 +15940,7 @@ registerSchema({
15832
15940
  id: { type: "string", description: "Published scheduled action ID", required: true }
15833
15941
  }
15834
15942
  });
15835
- var triggerCommand = defineCommand127({
15943
+ var triggerCommand = defineCommand128({
15836
15944
  meta: {
15837
15945
  name: "trigger",
15838
15946
  description: "Immediately trigger a published scheduled action. Example: baker scheduled-actions trigger <id>"
@@ -15869,7 +15977,7 @@ var triggerCommand = defineCommand127({
15869
15977
  });
15870
15978
 
15871
15979
  // src/commands/scheduled-actions/update.ts
15872
- import { defineCommand as defineCommand128 } from "citty";
15980
+ import { defineCommand as defineCommand129 } from "citty";
15873
15981
  registerSchema({
15874
15982
  command: "scheduled-actions.update",
15875
15983
  description: "Stage an update to a published scheduled action or temp_sched_* draft-created scheduled action.",
@@ -15894,7 +16002,7 @@ registerSchema({
15894
16002
  prompt: { type: "string", description: "Replacement additional spawned-agent instructions", required: false }
15895
16003
  }
15896
16004
  });
15897
- var updateCommand2 = defineCommand128({
16005
+ var updateCommand2 = defineCommand129({
15898
16006
  meta: {
15899
16007
  name: "update",
15900
16008
  description: "Stage a scheduled action update. Example: baker scheduled-actions update <id> --enabled false"
@@ -15964,7 +16072,7 @@ var updateCommand2 = defineCommand128({
15964
16072
  });
15965
16073
 
15966
16074
  // src/commands/scheduled-actions/index.ts
15967
- var scheduledActionsCommand = defineCommand129({
16075
+ var scheduledActionsCommand = defineCommand130({
15968
16076
  meta: {
15969
16077
  name: "scheduled-actions",
15970
16078
  description: `Manage Scheduled Actions. Subcommands: list, get, create, update, delete, trigger.
@@ -15990,8 +16098,8 @@ Examples:
15990
16098
  });
15991
16099
 
15992
16100
  // src/commands/schema.ts
15993
- import { defineCommand as defineCommand130 } from "citty";
15994
- var schemaCommand = defineCommand130({
16101
+ import { defineCommand as defineCommand131 } from "citty";
16102
+ var schemaCommand = defineCommand131({
15995
16103
  meta: {
15996
16104
  name: "schema",
15997
16105
  description: "Inspect command argument schemas (for AI agent introspection). Lists all commands if no argument given. Example: baker schema images.search"
@@ -16027,10 +16135,10 @@ var schemaCommand = defineCommand130({
16027
16135
  });
16028
16136
 
16029
16137
  // src/commands/testimonials/index.ts
16030
- import { defineCommand as defineCommand134 } from "citty";
16138
+ import { defineCommand as defineCommand135 } from "citty";
16031
16139
 
16032
16140
  // src/commands/testimonials/get.ts
16033
- import { defineCommand as defineCommand131 } from "citty";
16141
+ import { defineCommand as defineCommand132 } from "citty";
16034
16142
  registerSchema({
16035
16143
  command: "testimonials.get",
16036
16144
  description: "Get a single testimonial by ID",
@@ -16038,7 +16146,7 @@ registerSchema({
16038
16146
  id: { type: "string", description: "Testimonial ID", required: true }
16039
16147
  }
16040
16148
  });
16041
- var getCommand4 = defineCommand131({
16149
+ var getCommand4 = defineCommand132({
16042
16150
  meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
16043
16151
  args: {
16044
16152
  id: { type: "positional", description: "Testimonial ID", required: false },
@@ -16075,7 +16183,7 @@ var getCommand4 = defineCommand131({
16075
16183
  });
16076
16184
 
16077
16185
  // src/commands/testimonials/list.ts
16078
- import { defineCommand as defineCommand132 } from "citty";
16186
+ import { defineCommand as defineCommand133 } from "citty";
16079
16187
  registerSchema({
16080
16188
  command: "testimonials.list",
16081
16189
  description: "List testimonials with optional filters.",
@@ -16105,7 +16213,7 @@ registerSchema({
16105
16213
  limit: { type: "number", description: "Max results (default 50)", required: false, default: 50 }
16106
16214
  }
16107
16215
  });
16108
- var listCommand4 = defineCommand132({
16216
+ var listCommand4 = defineCommand133({
16109
16217
  meta: {
16110
16218
  name: "list",
16111
16219
  description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
@@ -16154,7 +16262,7 @@ var listCommand4 = defineCommand132({
16154
16262
  });
16155
16263
 
16156
16264
  // src/commands/testimonials/search.ts
16157
- import { defineCommand as defineCommand133 } from "citty";
16265
+ import { defineCommand as defineCommand134 } from "citty";
16158
16266
  registerSchema({
16159
16267
  command: "testimonials.search",
16160
16268
  description: "Search testimonials by text query. Uses hybrid BM25 + vector + reranking.",
@@ -16185,7 +16293,7 @@ registerSchema({
16185
16293
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
16186
16294
  }
16187
16295
  });
16188
- var searchCommand2 = defineCommand133({
16296
+ var searchCommand2 = defineCommand134({
16189
16297
  meta: {
16190
16298
  name: "search",
16191
16299
  description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
@@ -16255,30 +16363,35 @@ var searchCommand2 = defineCommand133({
16255
16363
  }
16256
16364
  });
16257
16365
 
16366
+ // src/commands/testimonials/tags.ts
16367
+ var tagsCommand2 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
16368
+
16258
16369
  // src/commands/testimonials/index.ts
16259
- var testimonialsCommand = defineCommand134({
16370
+ var testimonialsCommand = defineCommand135({
16260
16371
  meta: {
16261
16372
  name: "testimonials",
16262
- description: `Find and browse testimonials in Baker. Subcommands: search, get, list.
16373
+ description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
16263
16374
 
16264
16375
  Examples:
16265
16376
  baker testimonials search "great customer service" --limit 5
16266
16377
  baker testimonials search "value for money" --rating-min 4
16267
16378
  baker testimonials get <testimonial-id>
16268
- baker testimonials list --source google --sentiment positive`
16379
+ baker testimonials list --source google --sentiment positive
16380
+ baker testimonials tags`
16269
16381
  },
16270
16382
  subCommands: {
16271
16383
  get: getCommand4,
16272
16384
  search: searchCommand2,
16273
- list: listCommand4
16385
+ list: listCommand4,
16386
+ tags: tagsCommand2
16274
16387
  }
16275
16388
  });
16276
16389
 
16277
16390
  // src/commands/videos/index.ts
16278
- import { defineCommand as defineCommand139 } from "citty";
16391
+ import { defineCommand as defineCommand140 } from "citty";
16279
16392
 
16280
16393
  // src/commands/videos/delete.ts
16281
- import { defineCommand as defineCommand135 } from "citty";
16394
+ import { defineCommand as defineCommand136 } from "citty";
16282
16395
  registerSchema({
16283
16396
  command: "videos.delete",
16284
16397
  description: "Delete a video by ID",
@@ -16292,7 +16405,7 @@ registerSchema({
16292
16405
  }
16293
16406
  }
16294
16407
  });
16295
- var deleteCommand3 = defineCommand135({
16408
+ var deleteCommand3 = defineCommand136({
16296
16409
  meta: {
16297
16410
  name: "delete",
16298
16411
  description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
@@ -16333,7 +16446,7 @@ var deleteCommand3 = defineCommand135({
16333
16446
  });
16334
16447
 
16335
16448
  // src/commands/videos/get.ts
16336
- import { defineCommand as defineCommand136 } from "citty";
16449
+ import { defineCommand as defineCommand137 } from "citty";
16337
16450
  registerSchema({
16338
16451
  command: "videos.get",
16339
16452
  description: "Get a single video by ID",
@@ -16341,7 +16454,7 @@ registerSchema({
16341
16454
  id: { type: "string", description: "Video ID", required: true }
16342
16455
  }
16343
16456
  });
16344
- var getCommand5 = defineCommand136({
16457
+ var getCommand5 = defineCommand137({
16345
16458
  meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
16346
16459
  args: {
16347
16460
  id: { type: "positional", description: "Video ID", required: false },
@@ -16378,7 +16491,7 @@ var getCommand5 = defineCommand136({
16378
16491
  });
16379
16492
 
16380
16493
  // src/commands/videos/search.ts
16381
- import { defineCommand as defineCommand137 } from "citty";
16494
+ import { defineCommand as defineCommand138 } from "citty";
16382
16495
  registerSchema({
16383
16496
  command: "videos.search",
16384
16497
  description: "Search videos by text query. Only returns ready videos.",
@@ -16388,7 +16501,7 @@ registerSchema({
16388
16501
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
16389
16502
  }
16390
16503
  });
16391
- var searchCommand3 = defineCommand137({
16504
+ var searchCommand3 = defineCommand138({
16392
16505
  meta: {
16393
16506
  name: "search",
16394
16507
  description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
@@ -16434,10 +16547,13 @@ var searchCommand3 = defineCommand137({
16434
16547
  }
16435
16548
  });
16436
16549
 
16550
+ // src/commands/videos/tags.ts
16551
+ var tagsCommand3 = makeTagsCommand("videos", "video", "/api/videos/tags");
16552
+
16437
16553
  // src/commands/videos/upload.ts
16438
16554
  import { readFile as readFile10, stat as stat3 } from "fs/promises";
16439
16555
  import { extname as extname3 } from "path";
16440
- import { defineCommand as defineCommand138 } from "citty";
16556
+ import { defineCommand as defineCommand139 } from "citty";
16441
16557
  var MIME_MAP2 = {
16442
16558
  ".mp4": "video/mp4",
16443
16559
  ".mov": "video/quicktime",
@@ -16471,7 +16587,7 @@ function detectContentType2(filePath) {
16471
16587
  }
16472
16588
  return mime;
16473
16589
  }
16474
- var uploadCommand2 = defineCommand138({
16590
+ var uploadCommand2 = defineCommand139({
16475
16591
  meta: {
16476
16592
  name: "upload",
16477
16593
  description: "Upload a video file to Baker via Mux direct upload. Auto-detects content type. Example: baker videos upload ./demo.mp4"
@@ -16525,31 +16641,33 @@ var uploadCommand2 = defineCommand138({
16525
16641
  });
16526
16642
 
16527
16643
  // src/commands/videos/index.ts
16528
- var videosCommand = defineCommand139({
16644
+ var videosCommand = defineCommand140({
16529
16645
  meta: {
16530
16646
  name: "videos",
16531
- description: `Find and manage videos in Baker. Subcommands: search, get, upload, delete.
16647
+ description: `Find and manage videos in Baker. Subcommands: search, get, upload, delete, tags.
16532
16648
 
16533
16649
  Examples:
16534
16650
  baker videos search "product demo" --limit 5
16535
16651
  baker videos search "tutorial" --tags explainer
16536
16652
  baker videos get <video-id>
16537
16653
  baker videos upload ./demo.mp4
16538
- baker videos delete <video-id> --dry-run`
16654
+ baker videos delete <video-id> --dry-run
16655
+ baker videos tags`
16539
16656
  },
16540
16657
  subCommands: {
16541
16658
  get: getCommand5,
16542
16659
  search: searchCommand3,
16543
16660
  upload: uploadCommand2,
16544
- delete: deleteCommand3
16661
+ delete: deleteCommand3,
16662
+ tags: tagsCommand3
16545
16663
  }
16546
16664
  });
16547
16665
 
16548
16666
  // src/commands/winning-ads/index.ts
16549
- import { defineCommand as defineCommand142 } from "citty";
16667
+ import { defineCommand as defineCommand143 } from "citty";
16550
16668
 
16551
16669
  // src/commands/winning-ads/advertisers.ts
16552
- import { defineCommand as defineCommand140 } from "citty";
16670
+ import { defineCommand as defineCommand141 } from "citty";
16553
16671
  registerSchema({
16554
16672
  command: "winning-ads.advertisers",
16555
16673
  description: "Resolve a brand name to advertiser_id(s) in the ad-dna corpus \u2014 to find your OWN advertiser (to --exclude-advertiser) or a competitor (to --advertiser-id).",
@@ -16562,7 +16680,7 @@ registerSchema({
16562
16680
  function identity(record) {
16563
16681
  return record;
16564
16682
  }
16565
- var advertisersCommand2 = defineCommand140({
16683
+ var advertisersCommand2 = defineCommand141({
16566
16684
  meta: {
16567
16685
  name: "advertisers",
16568
16686
  description: 'Resolve a brand name to advertiser_id(s). Use it to find your own advertiser for --exclude-advertiser, or a competitor for --advertiser-id. Example: baker winning-ads advertisers "Deel" --output md'
@@ -16613,7 +16731,7 @@ var advertisersCommand2 = defineCommand140({
16613
16731
  });
16614
16732
 
16615
16733
  // src/commands/winning-ads/search.ts
16616
- import { defineCommand as defineCommand141 } from "citty";
16734
+ import { defineCommand as defineCommand142 } from "citty";
16617
16735
  registerSchema({
16618
16736
  command: "winning-ads.search",
16619
16737
  description: "Search the ad-dna corpus of scored winning ads. Returns a lean shortlist (advertiser, summary, scores, media_url) to pick a reference to reproduce.",
@@ -16721,7 +16839,7 @@ function buildSearchBody(args) {
16721
16839
  }
16722
16840
  return body;
16723
16841
  }
16724
- var searchCommand4 = defineCommand141({
16842
+ var searchCommand4 = defineCommand142({
16725
16843
  meta: {
16726
16844
  name: "search",
16727
16845
  description: "Search winning reference ads. Example: baker winning-ads search 'B2B SaaS before/after AI automation' --platform meta --format static --winner-category winner --exclude-advertiser adv_123 --output md"
@@ -16833,7 +16951,7 @@ var searchCommand4 = defineCommand141({
16833
16951
  });
16834
16952
 
16835
16953
  // src/commands/winning-ads/index.ts
16836
- var winningAdsCommand = defineCommand142({
16954
+ var winningAdsCommand = defineCommand143({
16837
16955
  meta: {
16838
16956
  name: "winning-ads",
16839
16957
  description: `Search the ad-dna corpus of scored "winning" ads for reference creatives to reproduce. Proxied through the Baker backend (BAKER_API_KEY) \u2014 no separate token needed.
@@ -16873,7 +16991,7 @@ function getCliVersion() {
16873
16991
  }
16874
16992
 
16875
16993
  // src/cli.ts
16876
- var main = defineCommand143({
16994
+ var main = defineCommand144({
16877
16995
  meta: {
16878
16996
  name: "baker",
16879
16997
  version: getCliVersion(),