@koda-sl/baker-cli 0.296.0 → 0.297.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/dist/cli.js CHANGED
@@ -109,7 +109,7 @@ import {
109
109
  } from "./chunk-DZUVUGEP.js";
110
110
 
111
111
  // src/cli.ts
112
- import { defineCommand as defineCommand237, runMain } from "citty";
112
+ import { defineCommand as defineCommand239, runMain } from "citty";
113
113
 
114
114
  // src/cache-flag.ts
115
115
  var NO_CACHE_ARG = {
@@ -6155,6 +6155,24 @@ var imagesGroupResponseSchema = z18.object({
6155
6155
  });
6156
6156
  var imagesDeleteRequestSchema = z18.object({ id: z18.string().min(1, "Missing image ID") });
6157
6157
  var imagesDeleteResponseSchema = z18.object({ ok: z18.literal(true) });
6158
+ var imagesDescribeRequestSchema = z18.object({
6159
+ id: z18.string().min(1, "Missing image ID"),
6160
+ name: z18.string().min(1).optional(),
6161
+ description: z18.string().min(1).optional(),
6162
+ tags: z18.array(z18.string()).optional(),
6163
+ /** Return the whole library row alongside the three fields that changed. */
6164
+ full: z18.boolean().optional()
6165
+ }).refine((body) => body.name !== void 0 || body.description !== void 0 || body.tags !== void 0, {
6166
+ message: "Pass at least one of name, description or tags"
6167
+ });
6168
+ var imagesDescribeResponseSchema = z18.object({
6169
+ id: z18.string(),
6170
+ name: z18.string(),
6171
+ description: z18.string(),
6172
+ tags: z18.array(z18.string()),
6173
+ /** Present only when the request asked for it. */
6174
+ image: imagesGetResponseSchema.optional()
6175
+ });
6158
6176
  var imagesUpscaleRequestSchema = z18.object({ imageId: z18.string().min(1, "Missing image ID") });
6159
6177
  var imagesUpscaleResponseSchema = z18.object({
6160
6178
  imageId: z18.string(),
@@ -7078,6 +7096,24 @@ var videosIngestResponseSchema = z24.object({
7078
7096
  videoId: z24.string(),
7079
7097
  deduped: z24.boolean()
7080
7098
  });
7099
+ var videosDescribeRequestSchema = z24.object({
7100
+ id: z24.string().min(1, "Missing video ID"),
7101
+ name: z24.string().min(1).optional(),
7102
+ description: z24.string().min(1).optional(),
7103
+ tags: z24.array(z24.string()).optional(),
7104
+ /** Return the whole library row alongside the three fields that changed. */
7105
+ full: z24.boolean().optional()
7106
+ }).refine((body) => body.name !== void 0 || body.description !== void 0 || body.tags !== void 0, {
7107
+ message: "Pass at least one of name, description or tags"
7108
+ });
7109
+ var videosDescribeResponseSchema = z24.object({
7110
+ id: z24.string(),
7111
+ name: z24.string(),
7112
+ description: z24.string(),
7113
+ tags: z24.array(z24.string()),
7114
+ /** Present only when the request asked for it. */
7115
+ video: videosGetResponseSchema.optional()
7116
+ });
7081
7117
  var videosDeleteRequestSchema = z24.object({ id: z24.string().min(1, "Missing video ID") });
7082
7118
  var videosDeleteResponseSchema = z24.object({ ok: z24.literal(true) });
7083
7119
 
@@ -45204,7 +45240,7 @@ Full guide: __tooling__/docs/tools/baker/hubspot.md`
45204
45240
  });
45205
45241
 
45206
45242
  // src/commands/images/index.ts
45207
- import { defineCommand as defineCommand163 } from "citty";
45243
+ import { defineCommand as defineCommand164 } from "citty";
45208
45244
 
45209
45245
  // src/commands/images/crop.ts
45210
45246
  import { defineCommand as defineCommand138 } from "citty";
@@ -45419,9 +45455,118 @@ var deleteCommand2 = defineCommand139({
45419
45455
  }
45420
45456
  });
45421
45457
 
45422
- // src/commands/images/dimensions.ts
45458
+ // src/commands/images/describe.ts
45423
45459
  import { defineCommand as defineCommand140 } from "citty";
45424
45460
 
45461
+ // src/lib/describeArgs.ts
45462
+ function describeTags(rawArgs, parsed) {
45463
+ const given = repeatedValues(rawArgs, "tags", parsed);
45464
+ if (given.length === 0) return void 0;
45465
+ return given.flatMap((chunk) => chunk.split(",").map((tag) => tag.trim())).filter(Boolean);
45466
+ }
45467
+ function describeHints(noun, body) {
45468
+ const search = noun === "images" ? "baker images library" : "baker videos search";
45469
+ const hints2 = [];
45470
+ if (body.description !== void 0) {
45471
+ hints2.push(
45472
+ `The semantic index rebuilds in the background \u2014 a \`${search}\` run right now may still rank on the old description.`
45473
+ );
45474
+ }
45475
+ if (body.tags !== void 0) {
45476
+ hints2.push(`--tags replaced the whole tag set. Run \`baker ${noun} get <id>\` first if you meant to add to it.`);
45477
+ }
45478
+ return hints2.length > 0 ? hints2 : void 0;
45479
+ }
45480
+ function describeFields(args, rawArgs) {
45481
+ const fields = {};
45482
+ if (args.description) fields.description = args.description;
45483
+ if (args.name) fields.name = args.name;
45484
+ const tags = describeTags(rawArgs, args.tags);
45485
+ if (tags !== void 0) fields.tags = tags;
45486
+ return fields;
45487
+ }
45488
+ function describeErrorFix(code, noun) {
45489
+ if (code !== "CONFLICT") return void 0;
45490
+ return `Poll \`baker ${noun} get <id>\` until \`status\` reads "ready", then run this again. Do not retry immediately \u2014 the answer will not change until the analysis lands.`;
45491
+ }
45492
+
45493
+ // src/commands/images/describe.ts
45494
+ var DESCRIPTION_HELP = "What the image actually shows, in the words someone would search for it by. This is what `baker images library` retrieves on.";
45495
+ registerSchema({
45496
+ command: "images.describe",
45497
+ description: "Correct a library image's stored name, description or tags. Start here when an image's description is wrong \u2014 it is what semantic search reads.",
45498
+ args: {
45499
+ id: { type: "string", description: "Image ID", required: true },
45500
+ description: { type: "string", description: DESCRIPTION_HELP, required: false },
45501
+ name: { type: "string", description: "Short human label for the image", required: false },
45502
+ tags: {
45503
+ type: "string",
45504
+ description: "Tags for the image \u2014 repeatable (`--tags a --tags b`) or one comma list. **Replaces** the existing set",
45505
+ required: false
45506
+ },
45507
+ full: { type: "boolean", description: "Return the whole library row, not just what changed", required: false }
45508
+ }
45509
+ });
45510
+ var describeCommand = defineCommand140({
45511
+ meta: {
45512
+ name: "describe",
45513
+ description: `Correct what the library says an image is. Only the fields you pass change; the rest keep their current values.
45514
+
45515
+ Start here when a search keeps missing an image you know is there, or when the AI description got the subject wrong.
45516
+
45517
+ Example: baker images describe j571abc123 --description "Founder speaking on stage at SaaStr, blue backdrop" --tags event,team`
45518
+ },
45519
+ args: {
45520
+ id: { type: "positional", description: "Image ID", required: false },
45521
+ "image-id": { type: "string", description: "Image ID (alternative to positional)", required: false },
45522
+ description: { type: "string", description: DESCRIPTION_HELP, required: false },
45523
+ name: { type: "string", description: "Short human label for the image", required: false },
45524
+ tags: {
45525
+ type: "string",
45526
+ description: "Tags for the image \u2014 repeatable (`--tags a --tags b`) or one comma list. **Replaces** the existing set",
45527
+ required: false
45528
+ },
45529
+ full: { type: "boolean", description: "Return the whole library row", required: false, default: false }
45530
+ },
45531
+ run: async ({ args, rawArgs }) => {
45532
+ const id = args.id || args["image-id"];
45533
+ if (!id) {
45534
+ writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message: "Image ID is required" } });
45535
+ process.exit(1);
45536
+ }
45537
+ const fields = describeFields(args, rawArgs);
45538
+ if (fields.name === void 0 && fields.description === void 0 && fields.tags === void 0) {
45539
+ writeJson({
45540
+ ok: false,
45541
+ error: {
45542
+ code: "VALIDATION_ERROR",
45543
+ message: "Nothing to change",
45544
+ fix: "Pass at least one of --description, --name or --tags."
45545
+ }
45546
+ });
45547
+ process.exit(1);
45548
+ }
45549
+ try {
45550
+ validateConvexId(id);
45551
+ const body = { id, ...fields };
45552
+ if (args.full) body.full = true;
45553
+ const data = await apiPost("/api/images/describe", body);
45554
+ writeJson({ ok: true, data, hints: describeHints("images", fields) });
45555
+ } catch (err) {
45556
+ if (err instanceof ApiError) {
45557
+ const fix = describeErrorFix(err.code, "images");
45558
+ writeJson({ ok: false, error: { code: err.code, message: err.message, ...fix ? { fix } : {} } });
45559
+ process.exit(1);
45560
+ }
45561
+ writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
45562
+ process.exit(1);
45563
+ }
45564
+ }
45565
+ });
45566
+
45567
+ // src/commands/images/dimensions.ts
45568
+ import { defineCommand as defineCommand141 } from "citty";
45569
+
45425
45570
  // src/lib/image/dimensions.ts
45426
45571
  import { imageSize } from "image-size";
45427
45572
  function getDimensionsFromBuffer(buffer) {
@@ -45449,7 +45594,7 @@ registerSchema({
45449
45594
  }
45450
45595
  }
45451
45596
  });
45452
- var dimensionsCommand = defineCommand140({
45597
+ var dimensionsCommand = defineCommand141({
45453
45598
  meta: {
45454
45599
  name: "dimensions",
45455
45600
  description: "Read image dimensions without decoding the full file.\n\nExample: baker images dimensions ./logo.png\nExample: baker images dimensions https://acme.com/hero.png"
@@ -45505,7 +45650,7 @@ var dimensionsCommand = defineCommand140({
45505
45650
  });
45506
45651
 
45507
45652
  // src/commands/images/download.ts
45508
- import { defineCommand as defineCommand141 } from "citty";
45653
+ import { defineCommand as defineCommand142 } from "citty";
45509
45654
 
45510
45655
  // src/commands/images/downloadPaths.ts
45511
45656
  import { basename as basename2, extname as extname3, join as join6 } from "path";
@@ -45746,7 +45891,7 @@ function emitError3(err) {
45746
45891
  writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
45747
45892
  process.exit(1);
45748
45893
  }
45749
- var downloadCommand = defineCommand141({
45894
+ var downloadCommand = defineCommand142({
45750
45895
  meta: {
45751
45896
  name: "download",
45752
45897
  description: "Download image URLs and/or library images to local files \u2014 the missing first half of `source \u2192 download \u2192 normalize \u2192 place`. Never use `curl` for this.\n\nExamples:\n baker images download https://media.withbaker.com/\u2026/logo.webp\n baker images download j57abc123 j57def456 --out src/pages/pricing/_images/\n baker images download https://\u2026/hero.png --out ./hero.png"
@@ -45779,7 +45924,7 @@ var downloadCommand = defineCommand141({
45779
45924
  });
45780
45925
 
45781
45926
  // src/commands/images/extract.ts
45782
- import { defineCommand as defineCommand142 } from "citty";
45927
+ import { defineCommand as defineCommand143 } from "citty";
45783
45928
 
45784
45929
  // src/commands/images/autoIngest.ts
45785
45930
  var AUTO_INGEST_MAX = {
@@ -45826,7 +45971,7 @@ registerSchema({
45826
45971
  }
45827
45972
  }
45828
45973
  });
45829
- var extractCommand = defineCommand142({
45974
+ var extractCommand = defineCommand143({
45830
45975
  meta: {
45831
45976
  name: "extract",
45832
45977
  description: "Pull every image from a single URL via Firecrawl. ~$0.001/scrape. Cap auto-ingest at 20.\n\nExample: baker images extract https://stripe.com --auto-ingest 5"
@@ -45881,7 +46026,7 @@ var extractCommand = defineCommand142({
45881
46026
  });
45882
46027
 
45883
46028
  // src/commands/images/find.ts
45884
- import { defineCommand as defineCommand143 } from "citty";
46029
+ import { defineCommand as defineCommand144 } from "citty";
45885
46030
 
45886
46031
  // src/commands/images/providerHits.ts
45887
46032
  function asRecord3(value) {
@@ -46019,7 +46164,7 @@ registerSchema({
46019
46164
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
46020
46165
  }
46021
46166
  });
46022
- var findCommand = defineCommand143({
46167
+ var findCommand = defineCommand144({
46023
46168
  meta: {
46024
46169
  name: "find",
46025
46170
  description: "Library-first fanout image search. Opt in to providers with --sources. `--fallback` short-circuits to externals only when library is thin. With --auto-ingest, ingested external hits return Baker-owned URLs.\n\nExample: baker images find 'office' --sources library,pexels --limit 20"
@@ -46092,7 +46237,7 @@ var findCommand = defineCommand143({
46092
46237
  });
46093
46238
 
46094
46239
  // src/commands/images/get.ts
46095
- import { defineCommand as defineCommand144 } from "citty";
46240
+ import { defineCommand as defineCommand145 } from "citty";
46096
46241
  registerSchema({
46097
46242
  command: "images.get",
46098
46243
  description: "Get a single image by ID",
@@ -46100,7 +46245,7 @@ registerSchema({
46100
46245
  id: { type: "string", description: "Image ID", required: true }
46101
46246
  }
46102
46247
  });
46103
- var getCommand3 = defineCommand144({
46248
+ var getCommand3 = defineCommand145({
46104
46249
  meta: { name: "get", description: "Get a single image by ID. Example: baker images get j571abc123" },
46105
46250
  args: {
46106
46251
  id: { type: "positional", description: "Image ID", required: false },
@@ -46136,7 +46281,7 @@ var getCommand3 = defineCommand144({
46136
46281
  });
46137
46282
 
46138
46283
  // src/commands/images/gif.ts
46139
- import { defineCommand as defineCommand145 } from "citty";
46284
+ import { defineCommand as defineCommand146 } from "citty";
46140
46285
  registerSchema({
46141
46286
  command: "images.gif",
46142
46287
  description: "Search Giphy for GIFs / reaction memes (paid social creative).",
@@ -46168,7 +46313,7 @@ registerSchema({
46168
46313
  }
46169
46314
  }
46170
46315
  });
46171
- var gifCommand = defineCommand145({
46316
+ var gifCommand = defineCommand146({
46172
46317
  meta: {
46173
46318
  name: "gif",
46174
46319
  description: "Search Giphy for GIFs / reaction memes \u2014 built for paid-social creative (Meta, TikTok, LinkedIn, X). Free API. Each hit carries WebP + GIF + MP4 URLs in providerMeta so you can pick the right format per platform.\n\nExample: baker images gif 'this is fine' --limit 10\nExample: baker images gif 'office reaction' --rating pg --auto-ingest 2\nExample: baker images gif --trending --limit 25"
@@ -46215,7 +46360,7 @@ var gifCommand = defineCommand145({
46215
46360
  });
46216
46361
 
46217
46362
  // src/commands/images/google.ts
46218
- import { defineCommand as defineCommand146 } from "citty";
46363
+ import { defineCommand as defineCommand147 } from "citty";
46219
46364
  var GOOGLE_ERROR_FIX = {
46220
46365
  action: "use_different_resource",
46221
46366
  explanation: "Generate the asset instead of retrying Google. Google is the last-resort image provider. Run `baker studio generate` to make the asset. Never sleep-and-retry this command \u2014 the CLI already backs off on rate limits. If no image can be sourced, continue the rest of the task with a placeholder rather than aborting it."
@@ -46255,7 +46400,7 @@ registerSchema({
46255
46400
  }
46256
46401
  }
46257
46402
  });
46258
- var googleCommand2 = defineCommand146({
46403
+ var googleCommand2 = defineCommand147({
46259
46404
  meta: {
46260
46405
  name: "google",
46261
46406
  description: "Google Images via the official Custom Search JSON API ($0.005/query, free 100/day). \u26A0 Source unverified \u2014 watermarks, low-res, mislabeled results are common. Use as last resort. With --auto-ingest, ingested hits return Baker-owned URLs.\n\nExample: baker images google 'industrial workshop' --type photo --size large --limit 20"
@@ -46328,7 +46473,7 @@ var googleCommand2 = defineCommand146({
46328
46473
  });
46329
46474
 
46330
46475
  // src/commands/images/group.ts
46331
- import { defineCommand as defineCommand147 } from "citty";
46476
+ import { defineCommand as defineCommand148 } from "citty";
46332
46477
 
46333
46478
  // src/commands/mediaGroup.ts
46334
46479
  async function runMediaGroupLookup(input) {
@@ -46381,7 +46526,7 @@ registerSchema({
46381
46526
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
46382
46527
  }
46383
46528
  });
46384
- var groupCommand = defineCommand147({
46529
+ var groupCommand = defineCommand148({
46385
46530
  meta: {
46386
46531
  name: "group",
46387
46532
  description: "List every asset that arrived in the same set \u2014 the slides of one Instagram carousel, the images off one scraped page. Start here whenever a hit looks like part of a sequence: carousel slides are authored to be read in order and usually only make sense together. Takes an image or a video id, since one carousel can contain both. Example: baker images group <imageId>"
@@ -46401,7 +46546,7 @@ var groupCommand = defineCommand147({
46401
46546
  });
46402
46547
 
46403
46548
  // src/commands/images/icon.ts
46404
- import { defineCommand as defineCommand148 } from "citty";
46549
+ import { defineCommand as defineCommand149 } from "citty";
46405
46550
 
46406
46551
  // src/commands/images/brandVerification.ts
46407
46552
  function brandToken(domain) {
@@ -46498,7 +46643,7 @@ registerSchema({
46498
46643
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
46499
46644
  }
46500
46645
  });
46501
- var iconCommand = defineCommand148({
46646
+ var iconCommand = defineCommand149({
46502
46647
  meta: {
46503
46648
  name: "icon",
46504
46649
  description: "Icon via Iconify (simple-icons, logos, lucide, devicon, heroicons, tabler, phosphor, material-symbols, \u2026). Free CDN, no API key.\n\nExample: baker images icon react --set devicon\nExample: baker images icon lucide:check --color '#0a0a0a'"
@@ -46568,7 +46713,7 @@ var iconCommand = defineCommand148({
46568
46713
  });
46569
46714
 
46570
46715
  // src/commands/images/ingest.ts
46571
- import { defineCommand as defineCommand149 } from "citty";
46716
+ import { defineCommand as defineCommand150 } from "citty";
46572
46717
  var SOURCE_VALUES = imageSourceSchema.options.join(" | ");
46573
46718
  registerSchema({
46574
46719
  command: "images.ingest",
@@ -46583,7 +46728,7 @@ registerSchema({
46583
46728
  fields: { type: "string", description: "Comma-separated field names to include", required: false }
46584
46729
  }
46585
46730
  });
46586
- var ingestCommand = defineCommand149({
46731
+ var ingestCommand = defineCommand150({
46587
46732
  meta: {
46588
46733
  name: "ingest",
46589
46734
  description: "Download a remote URL and store it in the library. Hash-deduped on bytes + externalId.\n\nExample: baker images ingest https://images.pexels.com/photos/13219418/pexels-photo-13219418.jpeg --source pexels --external-id 13219418"
@@ -46652,7 +46797,7 @@ var ingestCommand = defineCommand149({
46652
46797
  });
46653
46798
 
46654
46799
  // src/commands/images/layerize.ts
46655
- import { defineCommand as defineCommand150 } from "citty";
46800
+ import { defineCommand as defineCommand151 } from "citty";
46656
46801
  registerSchema({
46657
46802
  command: "images.layerize",
46658
46803
  description: "Split a library image into editable layers: transparent PNG cutouts for each element, plus any headline recovered as EDITABLE TEXT with its font, size, colour and position. Waits for completion by default. Costs credits.",
@@ -46716,7 +46861,7 @@ async function pollUntilSettled(imageId, maxWait) {
46716
46861
  }
46717
46862
  return null;
46718
46863
  }
46719
- var layerizeCommand = defineCommand150({
46864
+ var layerizeCommand = defineCommand151({
46720
46865
  meta: {
46721
46866
  name: "layerize",
46722
46867
  description: "Split a library image into editable layers \u2014 transparent cutouts per element, plus any baked-in headline recovered as editable text with its typography.\n\nStart here: baker images layerize j571abc123def\nExample: baker images layerize j571abc123def --full\nExample: baker images layerize j571abc123def --instructions 'keep the product and its shadow together'"
@@ -46785,7 +46930,7 @@ registerSchema({
46785
46930
  full: { type: "boolean", description: "Include geometry and typography for every layer", required: false }
46786
46931
  }
46787
46932
  });
46788
- var layersCommand = defineCommand150({
46933
+ var layersCommand = defineCommand151({
46789
46934
  meta: {
46790
46935
  name: "layers",
46791
46936
  description: "Read the layers of an image that has already been split. Free \u2014 no provider call.\n\nStart here: baker images layers j571abc123def\nExample: baker images layers j571abc123def --full"
@@ -46825,7 +46970,7 @@ var layersCommand = defineCommand150({
46825
46970
  });
46826
46971
 
46827
46972
  // src/commands/images/library.ts
46828
- import { defineCommand as defineCommand151 } from "citty";
46973
+ import { defineCommand as defineCommand152 } from "citty";
46829
46974
  registerSchema({
46830
46975
  command: "images.library",
46831
46976
  description: "Search the company image library. Returns only ready images.",
@@ -46851,7 +46996,7 @@ registerSchema({
46851
46996
  }
46852
46997
  }
46853
46998
  });
46854
- var libraryCommand = defineCommand151({
46999
+ var libraryCommand = defineCommand152({
46855
47000
  meta: {
46856
47001
  name: "library",
46857
47002
  description: "Search the company image library (hybrid BM25 + vector + Cohere rerank). Use this BEFORE any external provider.\n\nExample: baker images library 'hero banner' --aspect-ratio 16:9 --source magnific"
@@ -46914,7 +47059,7 @@ var libraryCommand = defineCommand151({
46914
47059
  });
46915
47060
 
46916
47061
  // src/commands/images/logo.ts
46917
- import { defineCommand as defineCommand152 } from "citty";
47062
+ import { defineCommand as defineCommand153 } from "citty";
46918
47063
  registerSchema({
46919
47064
  command: "images.logo",
46920
47065
  description: "Brand logo lookup via Brandfetch. Auto-ingests by default. Returns `brandMatch` \u2014 Brandfetch's own verdict on whose brand the domain is (confirmed | mismatch | unverified). Branch on it: `mismatch` means the mark is another company's, so do not place it. `confirmed` verifies the record, not the artwork \u2014 read the ingested row back to check the mark itself.",
@@ -46942,7 +47087,7 @@ registerSchema({
46942
47087
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
46943
47088
  }
46944
47089
  });
46945
- var logoCommand = defineCommand152({
47090
+ var logoCommand = defineCommand153({
46946
47091
  meta: {
46947
47092
  name: "logo",
46948
47093
  description: "Brand logo via Brandfetch. Returns up to 5 variants (icon, light/dark logo, light/dark symbol) plus `brandMatch`. Auto-ingests the first variant.\n\nStart here: check `brandMatch.verdict`.\n mismatch \u2192 the mark belongs to `brandMatch.name`, a different company. Do not place it.\n unverified \u2192 nothing confirmed whose logo this is. Treat as unchecked.\n confirmed \u2192 Brandfetch has this brand's record. That verifies the record, NOT the artwork \u2014 a confirmed domain has served another company's logo before.\n\n\u26A0 Whatever the verdict, read the ingested row back with `baker images get <imageId>` and check `textInImage`/`subject` before placing it. That is the only check that looks at the mark.\n\nExample: baker images logo stripe.com --variant logo"
@@ -47015,7 +47160,7 @@ var logoCommand = defineCommand152({
47015
47160
  });
47016
47161
 
47017
47162
  // src/commands/images/normalize.ts
47018
- import { defineCommand as defineCommand153 } from "citty";
47163
+ import { defineCommand as defineCommand154 } from "citty";
47019
47164
 
47020
47165
  // src/lib/image/color-changer.ts
47021
47166
  import quantize from "quantize";
@@ -47747,7 +47892,7 @@ function coerceRawArgs(args) {
47747
47892
  "dry-run": bool(args["dry-run"])
47748
47893
  };
47749
47894
  }
47750
- var normalizeCommand2 = defineCommand153({
47895
+ var normalizeCommand2 = defineCommand154({
47751
47896
  meta: {
47752
47897
  name: "normalize",
47753
47898
  description: `Normalize logos / images: declarative recolor + bg removal + trim + resize. Operates on local files; writes in-place by default.
@@ -47802,7 +47947,7 @@ Examples:
47802
47947
  });
47803
47948
 
47804
47949
  // src/commands/images/pinterest.ts
47805
- import { defineCommand as defineCommand154 } from "citty";
47950
+ import { defineCommand as defineCommand155 } from "citty";
47806
47951
  registerSchema({
47807
47952
  command: "images.pinterest",
47808
47953
  description: "Pinterest image search via ScrapeCreators. Reference-grade real-world photography, product styling, interiors, fashion, food, and aesthetic mood boards. Inspect before placing \u2014 Pinterest is unverified, trademark-bearing web content.",
@@ -47822,7 +47967,7 @@ registerSchema({
47822
47967
  }
47823
47968
  }
47824
47969
  });
47825
- var pinterestCommand = defineCommand154({
47970
+ var pinterestCommand = defineCommand155({
47826
47971
  meta: {
47827
47972
  name: "pinterest",
47828
47973
  description: "Pinterest image search via ScrapeCreators ($0.00188/request). Best for photo-realistic reference imagery \u2014 lifestyle, interiors, fashion, food, product styling, and mood boards to brief AI generation against. \u26A0 Unverified, trademark-bearing web content \u2014 inspect and respect rights before placing on a customer page. Browse first; auto-ingest only the pins you commit to.\n\nExamples:\n baker images pinterest 'scandinavian living room'\n baker images pinterest 'minimalist skincare product photography' --limit 20\n baker images pinterest 'cozy coffee shop interior' --auto-ingest 2 --context 'Mood reference for hero photography'"
@@ -47879,7 +48024,7 @@ var pinterestCommand = defineCommand154({
47879
48024
  });
47880
48025
 
47881
48026
  // src/commands/images/screenshot.ts
47882
- import { defineCommand as defineCommand155 } from "citty";
48027
+ import { defineCommand as defineCommand156 } from "citty";
47883
48028
  registerSchema({
47884
48029
  command: "images.screenshot",
47885
48030
  description: "Capture a website screenshot via ScreenshotOne. Auto-ingests on success.",
@@ -47898,7 +48043,7 @@ registerSchema({
47898
48043
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
47899
48044
  }
47900
48045
  });
47901
- var screenshotCommand = defineCommand155({
48046
+ var screenshotCommand = defineCommand156({
47902
48047
  meta: {
47903
48048
  name: "screenshot",
47904
48049
  description: "Screenshot a URL via ScreenshotOne. $0.009/capture. Auto-ingests to library.\n\nExample: baker images screenshot https://stripe.com --full-page"
@@ -47962,7 +48107,7 @@ var screenshotCommand = defineCommand155({
47962
48107
  });
47963
48108
 
47964
48109
  // src/commands/images/search.ts
47965
- import { defineCommand as defineCommand156 } from "citty";
48110
+ import { defineCommand as defineCommand157 } from "citty";
47966
48111
  registerSchema({
47967
48112
  command: "images.search",
47968
48113
  description: "Search images by text query. Only returns ready images.",
@@ -47978,7 +48123,7 @@ registerSchema({
47978
48123
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
47979
48124
  }
47980
48125
  });
47981
- var searchCommand = defineCommand156({
48126
+ var searchCommand = defineCommand157({
47982
48127
  meta: {
47983
48128
  name: "search",
47984
48129
  description: "Semantic search images by text query. Uses hybrid BM25 + vector + reranking. Example: baker images search 'hero banner' --aspect-ratio 16:9 --tags logo"
@@ -48038,7 +48183,7 @@ var searchCommand = defineCommand156({
48038
48183
  });
48039
48184
 
48040
48185
  // src/commands/images/sticker.ts
48041
- import { defineCommand as defineCommand157 } from "citty";
48186
+ import { defineCommand as defineCommand158 } from "citty";
48042
48187
  registerSchema({
48043
48188
  command: "images.sticker",
48044
48189
  description: "Search Giphy stickers \u2014 transparent-background overlays for ad creative.",
@@ -48070,7 +48215,7 @@ registerSchema({
48070
48215
  }
48071
48216
  }
48072
48217
  });
48073
- var stickerCommand = defineCommand157({
48218
+ var stickerCommand = defineCommand158({
48074
48219
  meta: {
48075
48220
  name: "sticker",
48076
48221
  description: "Search Giphy's sticker corpus \u2014 transparent-background WebPs / GIFs ideal for overlaying on ad creative (Meta, TikTok, Stories). Same Giphy free API as `baker images gif`; results carry WebP + GIF + MP4 URLs in providerMeta.\n\nExample: baker images sticker 'thumbs up' --limit 10\nExample: baker images sticker celebration --rating g --auto-ingest 3\nExample: baker images sticker --trending --limit 25"
@@ -48117,7 +48262,7 @@ var stickerCommand = defineCommand157({
48117
48262
  });
48118
48263
 
48119
48264
  // src/commands/images/stock.ts
48120
- import { defineCommand as defineCommand158 } from "citty";
48265
+ import { defineCommand as defineCommand159 } from "citty";
48121
48266
  var STOCK_ERROR_FIX = {
48122
48267
  action: "use_different_resource",
48123
48268
  explanation: "Switch provider instead of retrying stock search. Stock search is one of several image sources. Run `baker images find <query> --sources library,pinterest,google` (`--sources` is required \u2014 `find` alone searches the library only) or `baker studio generate` to make the asset. Never sleep-and-retry this command \u2014 the CLI already backs off on rate limits. If no image can be sourced, continue the rest of the task with a placeholder rather than aborting it."
@@ -48197,7 +48342,7 @@ function partialLibraryHints(errors, hitCount) {
48197
48342
  `These results are partial: ${names} did not answer, so they come from the remaining library alone. Treat a thin result as unproven rather than as "stock does not have this", and report the outage rather than re-running the search.`
48198
48343
  ];
48199
48344
  }
48200
- var stockCommand = defineCommand158({
48345
+ var stockCommand = defineCommand159({
48201
48346
  meta: {
48202
48347
  name: "stock",
48203
48348
  description: "Stock search across the free libraries \u2014 Pexels photographs plus Pixabay photographs, illustrations and vectors. No per-request cost. With --auto-ingest, ingested hits return Baker-owned URLs.\n\nExamples:\n baker images stock 'minimalist office'\n baker images stock 'hero photo of a kitchen' --orientation landscape --size large\n baker images stock 'flat office workers' --type illustration\n baker images stock 'leaf outline mark' --type vector\n baker images stock 'smiling carpenter portrait' --orientation portrait"
@@ -48272,7 +48417,7 @@ var stockCommand = defineCommand158({
48272
48417
  });
48273
48418
 
48274
48419
  // src/lib/tags-command.ts
48275
- import { defineCommand as defineCommand159 } from "citty";
48420
+ import { defineCommand as defineCommand160 } from "citty";
48276
48421
  function makeTagsCommand(command, label, endpoint) {
48277
48422
  registerSchema({
48278
48423
  command: `${command}.tags`,
@@ -48281,7 +48426,7 @@ function makeTagsCommand(command, label, endpoint) {
48281
48426
  output: { type: "string", description: "Output format: md|json", required: false, default: "md" }
48282
48427
  }
48283
48428
  });
48284
- return defineCommand159({
48429
+ return defineCommand160({
48285
48430
  meta: {
48286
48431
  name: "tags",
48287
48432
  description: `List the available ${label} tag names (defaults + company custom tags). Use before filtering with --tags. Example: baker ${command} tags`
@@ -48317,7 +48462,7 @@ function makeTagsCommand(command, label, endpoint) {
48317
48462
  var tagsCommand3 = makeTagsCommand("images", "image", "/api/images/tags");
48318
48463
 
48319
48464
  // src/commands/images/upload.ts
48320
- import { defineCommand as defineCommand160 } from "citty";
48465
+ import { defineCommand as defineCommand161 } from "citty";
48321
48466
  registerSchema({
48322
48467
  command: "images.upload",
48323
48468
  description: "Upload an image to the library \u2014 local file path or remote http(s) URL.",
@@ -48355,7 +48500,7 @@ registerSchema({
48355
48500
  function isRemoteUrl2(value) {
48356
48501
  return /^https?:\/\//i.test(value);
48357
48502
  }
48358
- var uploadCommand = defineCommand160({
48503
+ var uploadCommand = defineCommand161({
48359
48504
  meta: {
48360
48505
  name: "upload",
48361
48506
  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'"
@@ -48448,7 +48593,7 @@ async function uploadLocal(target, args) {
48448
48593
  }
48449
48594
 
48450
48595
  // src/commands/images/upscale.ts
48451
- import { defineCommand as defineCommand161 } from "citty";
48596
+ import { defineCommand as defineCommand162 } from "citty";
48452
48597
  registerSchema({
48453
48598
  command: "images.upscale",
48454
48599
  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).",
@@ -48463,7 +48608,7 @@ registerSchema({
48463
48608
  }
48464
48609
  });
48465
48610
  var POLL_INTERVAL_MS4 = 1500;
48466
- var upscaleCommand = defineCommand161({
48611
+ var upscaleCommand = defineCommand162({
48467
48612
  meta: {
48468
48613
  name: "upscale",
48469
48614
  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"
@@ -48518,7 +48663,7 @@ var upscaleCommand = defineCommand161({
48518
48663
  });
48519
48664
 
48520
48665
  // src/commands/images/use.ts
48521
- import { defineCommand as defineCommand162 } from "citty";
48666
+ import { defineCommand as defineCommand163 } from "citty";
48522
48667
  registerSchema({
48523
48668
  command: "images.use",
48524
48669
  description: "Ingest a URL and wait for the library record to be ready.",
@@ -48547,7 +48692,7 @@ function emitReady(ingestResult, doc, args) {
48547
48692
  args.full === true
48548
48693
  );
48549
48694
  }
48550
- var useCommand = defineCommand162({
48695
+ var useCommand = defineCommand163({
48551
48696
  meta: {
48552
48697
  name: "use",
48553
48698
  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"
@@ -48596,7 +48741,7 @@ var useCommand = defineCommand162({
48596
48741
  });
48597
48742
 
48598
48743
  // src/commands/images/index.ts
48599
- var imagesCommand = defineCommand163({
48744
+ var imagesCommand = defineCommand164({
48600
48745
  meta: {
48601
48746
  name: "images",
48602
48747
  description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.
@@ -48625,6 +48770,7 @@ Library writes (run on the Convex backend):
48625
48770
  baker images get <id> Get a single record
48626
48771
  baker images group <id> Every image that arrived in the same set (carousel, page scrape)
48627
48772
  baker images delete <id> Delete a record
48773
+ baker images describe <id> --description "\u2026" Correct a wrong name/description/tags \u2014 what library search reads on
48628
48774
 
48629
48775
  Local transforms (operate on files in the sandbox, before upload):
48630
48776
  baker images download <url|imageId\u2026> [--out \u2026] Remote URL or library image \u2192 local file (never use curl)
@@ -48662,6 +48808,7 @@ Full guide: __tooling__/docs/tools/baker/images.md`
48662
48808
  search: searchCommand,
48663
48809
  upload: uploadCommand,
48664
48810
  delete: deleteCommand2,
48811
+ describe: describeCommand,
48665
48812
  download: downloadCommand,
48666
48813
  normalize: normalizeCommand2,
48667
48814
  crop: cropCommand,
@@ -48674,12 +48821,12 @@ Full guide: __tooling__/docs/tools/baker/images.md`
48674
48821
  });
48675
48822
 
48676
48823
  // src/commands/landing/index.ts
48677
- import { defineCommand as defineCommand175 } from "citty";
48824
+ import { defineCommand as defineCommand176 } from "citty";
48678
48825
 
48679
48826
  // src/commands/landing/critique.ts
48680
48827
  import { readdir as readdir12, readFile as readFile27, stat as stat8 } from "fs/promises";
48681
48828
  import path34 from "path";
48682
- import { defineCommand as defineCommand164 } from "citty";
48829
+ import { defineCommand as defineCommand165 } from "citty";
48683
48830
 
48684
48831
  // src/engine/landing/lib/constants.ts
48685
48832
  var OVERUSED_FONTS = /* @__PURE__ */ new Set([
@@ -49987,7 +50134,7 @@ function fail6(code, message, fix) {
49987
50134
  );
49988
50135
  process.exit(2);
49989
50136
  }
49990
- var critiqueCommand2 = defineCommand164({
50137
+ var critiqueCommand2 = defineCommand165({
49991
50138
  meta: {
49992
50139
  name: "critique",
49993
50140
  description: "Start here: `baker landing critique <slug>` after building or editing a landing. Deterministic design-quality critic (ADVISORY \u2014 findings never fail it). Flags the known AI design tells (gradient text, overused fonts, side-tab borders, cream palettes, buzzword copy, broken images) and positioning integrity (a concession ranking a competitor above the client, a rival named in a comparison) tiered block/warn/advisory, respecting the client's BRAND.md as the allowlist. Also records the critique that publishing requires \u2014 run it before finishing a landing."
@@ -50121,10 +50268,10 @@ async function isDir2(p) {
50121
50268
  }
50122
50269
 
50123
50270
  // src/commands/landing/inspiration/index.ts
50124
- import { defineCommand as defineCommand173 } from "citty";
50271
+ import { defineCommand as defineCommand174 } from "citty";
50125
50272
 
50126
50273
  // src/commands/landing/inspiration/add.ts
50127
- import { defineCommand as defineCommand165 } from "citty";
50274
+ import { defineCommand as defineCommand166 } from "citty";
50128
50275
 
50129
50276
  // src/commands/landing/inspiration/shared.ts
50130
50277
  var INSPIRATION_HINTS = {
@@ -50206,7 +50353,7 @@ registerSchema({
50206
50353
  note: { type: "string", description: "Why this page is worth keeping", required: false }
50207
50354
  }
50208
50355
  });
50209
- var addCommand = defineCommand165({
50356
+ var addCommand = defineCommand166({
50210
50357
  meta: {
50211
50358
  name: "add",
50212
50359
  description: "Add someone else's landing page to the reference library. Example: baker landing inspiration add https://linear.app --note 'the client likes this density'"
@@ -50248,7 +50395,7 @@ var addCommand = defineCommand165({
50248
50395
  // src/commands/landing/inspiration/code.ts
50249
50396
  import { mkdir as mkdir10, writeFile as writeFile14 } from "fs/promises";
50250
50397
  import path35 from "path";
50251
- import { defineCommand as defineCommand166 } from "citty";
50398
+ import { defineCommand as defineCommand167 } from "citty";
50252
50399
  registerSchema({
50253
50400
  command: "landing.inspiration.code",
50254
50401
  description: "Write a reference section's standalone HTML+CSS to .baker/inspiration/<id>/ so you can read how it is built. Reference only \u2014 the structure is the lesson, the words are not yours to reuse.",
@@ -50257,7 +50404,7 @@ registerSchema({
50257
50404
  full: { type: "boolean", description: "Print the markup inline as well as writing it", required: false }
50258
50405
  }
50259
50406
  });
50260
- var codeCommand = defineCommand166({
50407
+ var codeCommand = defineCommand167({
50261
50408
  meta: {
50262
50409
  name: "code",
50263
50410
  description: "Write one reference section's standalone markup to disk. Example: baker landing inspiration code k57abc\u2026 \u2014 read it for structure, then build your own."
@@ -50303,7 +50450,7 @@ var codeCommand = defineCommand166({
50303
50450
  });
50304
50451
 
50305
50452
  // src/commands/landing/inspiration/favorites.ts
50306
- import { defineCommand as defineCommand167 } from "citty";
50453
+ import { defineCommand as defineCommand168 } from "citty";
50307
50454
  registerSchema({
50308
50455
  command: "landing.inspiration.favorites",
50309
50456
  description: "List the reference sections this company has saved. This is what `search` looks at by default, so it is the client's own taste profile \u2014 read it before proposing a direction.",
@@ -50317,7 +50464,7 @@ registerSchema({
50317
50464
  }
50318
50465
  }
50319
50466
  });
50320
- var favoritesCommand = defineCommand167({
50467
+ var favoritesCommand = defineCommand168({
50321
50468
  meta: {
50322
50469
  name: "favorites",
50323
50470
  description: "List this company's saved reference sections. Example: baker landing inspiration favorites --type hero,pricing"
@@ -50397,7 +50544,7 @@ registerSchema({
50397
50544
  note: { type: "string", description: "Why this is worth keeping", required: false }
50398
50545
  }
50399
50546
  });
50400
- var favoriteCommand = defineCommand167({
50547
+ var favoriteCommand = defineCommand168({
50401
50548
  meta: {
50402
50549
  name: "favorite",
50403
50550
  description: "Save a reference section to this company. Example: baker landing inspiration favorite k57abc\u2026"
@@ -50435,7 +50582,7 @@ registerSchema({
50435
50582
  page: { type: "boolean", description: "Treat the id as a page rather than a section", required: false }
50436
50583
  }
50437
50584
  });
50438
- var unfavoriteCommand = defineCommand167({
50585
+ var unfavoriteCommand = defineCommand168({
50439
50586
  meta: {
50440
50587
  name: "unfavorite",
50441
50588
  description: "Remove a reference section from this company's saved set. Example: baker landing inspiration unfavorite k57abc\u2026"
@@ -50457,7 +50604,7 @@ var unfavoriteCommand = defineCommand167({
50457
50604
  });
50458
50605
 
50459
50606
  // src/commands/landing/inspiration/page.ts
50460
- import { defineCommand as defineCommand168 } from "citty";
50607
+ import { defineCommand as defineCommand169 } from "citty";
50461
50608
  registerSchema({
50462
50609
  command: "landing.inspiration.page",
50463
50610
  description: "Show a whole reference page as a sequence: every section top to bottom with its type and the idea behind it. This is the view to use when the question is how a good page is ORDERED rather than what one section looks like.",
@@ -50474,7 +50621,7 @@ registerSchema({
50474
50621
  }
50475
50622
  }
50476
50623
  });
50477
- var pageCommand2 = defineCommand168({
50624
+ var pageCommand2 = defineCommand169({
50478
50625
  meta: {
50479
50626
  name: "page",
50480
50627
  description: "Show how a reference page sequences its sections. Example: baker landing inspiration page j91xyz\u2026 \u2014 the blueprint, not the pixels."
@@ -50537,7 +50684,7 @@ var pageCommand2 = defineCommand168({
50537
50684
  });
50538
50685
 
50539
50686
  // src/commands/landing/inspiration/scrape.ts
50540
- import { defineCommand as defineCommand169 } from "citty";
50687
+ import { defineCommand as defineCommand170 } from "citty";
50541
50688
 
50542
50689
  // src/engine/landing-library/proxyFailure.ts
50543
50690
  var PROXY_STATUS = 407;
@@ -52677,7 +52824,7 @@ registerSchema({
52677
52824
  report: { type: "boolean", description: "Write report.html. `--no-report` to skip", required: false }
52678
52825
  }
52679
52826
  });
52680
- var scrapeCommand = defineCommand169({
52827
+ var scrapeCommand = defineCommand170({
52681
52828
  meta: {
52682
52829
  name: "scrape",
52683
52830
  description: "Capture a landing page to a directory, now. Example: baker landing inspiration scrape https://linear.app --out .baker/inspiration/linear.app"
@@ -52786,7 +52933,7 @@ var scrapeCommand = defineCommand169({
52786
52933
 
52787
52934
  // src/commands/landing/inspiration/search.ts
52788
52935
  import path40 from "path";
52789
- import { defineCommand as defineCommand170 } from "citty";
52936
+ import { defineCommand as defineCommand171 } from "citty";
52790
52937
 
52791
52938
  // src/commands/landing/inspiration/shot.ts
52792
52939
  import { mkdir as mkdir12, writeFile as writeFile17 } from "fs/promises";
@@ -52923,7 +53070,7 @@ async function downloadShots(results) {
52923
53070
  );
52924
53071
  return saved;
52925
53072
  }
52926
- var searchCommand2 = defineCommand170({
53073
+ var searchCommand2 = defineCommand171({
52927
53074
  meta: {
52928
53075
  name: "search",
52929
53076
  description: "Search real landing-page sections for reference. Example: baker landing inspiration search 'dark developer hero with a terminal' --register dev-tool-minimal --scope all"
@@ -53021,7 +53168,7 @@ var searchCommand2 = defineCommand170({
53021
53168
  });
53022
53169
 
53023
53170
  // src/commands/landing/inspiration/sequences.ts
53024
- import { defineCommand as defineCommand171 } from "citty";
53171
+ import { defineCommand as defineCommand172 } from "citty";
53025
53172
  var COMPACT_TRANSITIONS = 12;
53026
53173
  var COMPACT_ENDS = 5;
53027
53174
  var MAX_PAGES = 50;
@@ -53095,7 +53242,7 @@ function sequencesHints(data, { scope, full }) {
53095
53242
  if (scope === "favorites") hints2.push(...favoritesScopeHints(data.favoritesHealth, data.pagesReturned));
53096
53243
  return hints2;
53097
53244
  }
53098
- var sequencesCommand = defineCommand171({
53245
+ var sequencesCommand = defineCommand172({
53099
53246
  meta: {
53100
53247
  name: "sequences",
53101
53248
  description: "What section follows what, across many real pages at once. Example: baker landing inspiration sequences 'developer tool pricing page' --scope all \u2014 the evidence for how to order a page you are about to build."
@@ -53145,7 +53292,7 @@ var sequencesCommand = defineCommand171({
53145
53292
 
53146
53293
  // src/commands/landing/inspiration/view.ts
53147
53294
  import path41 from "path";
53148
- import { defineCommand as defineCommand172 } from "citty";
53295
+ import { defineCommand as defineCommand173 } from "citty";
53149
53296
  registerSchema({
53150
53297
  command: "landing.inspiration.view",
53151
53298
  description: "Everything known about one section: composition, motion, design tokens, the copy it uses, why it works, and what must change to make it yours. Downloads the desktop and mobile screenshots plus the motion filmstrip so you can look at them.",
@@ -53158,7 +53305,7 @@ registerSchema({
53158
53305
  }
53159
53306
  }
53160
53307
  });
53161
- var viewCommand2 = defineCommand172({
53308
+ var viewCommand2 = defineCommand173({
53162
53309
  meta: {
53163
53310
  name: "view",
53164
53311
  description: "Full detail for one reference section. Example: baker landing inspiration view k57abc\u2026 \u2014 read the screenshots it saves before you build."
@@ -53242,7 +53389,7 @@ var viewCommand2 = defineCommand172({
53242
53389
  });
53243
53390
 
53244
53391
  // src/commands/landing/inspiration/index.ts
53245
- var inspirationCommand = defineCommand173({
53392
+ var inspirationCommand = defineCommand174({
53246
53393
  meta: {
53247
53394
  name: "inspiration",
53248
53395
  description: `Reference library of real landing-page sections \u2014 look at how good pages actually solve a problem before you design one.
@@ -53290,7 +53437,7 @@ Full guide: __tooling__/docs/tools/baker/landing.md`
53290
53437
  import { randomUUID as randomUUID2 } from "crypto";
53291
53438
  import { mkdir as mkdir13, readdir as readdir13, readFile as readFile28, stat as stat9, writeFile as writeFile18 } from "fs/promises";
53292
53439
  import path42 from "path";
53293
- import { defineCommand as defineCommand174 } from "citty";
53440
+ import { defineCommand as defineCommand175 } from "citty";
53294
53441
  registerSchema({
53295
53442
  command: "landing.variant",
53296
53443
  description: "Create a new variant of a page, for an A/B test. The variant shares the page's sections instead of copying them, so the only difference between the two is the one you fork \u2014 which is the only way the test measures what you think it measures. Run `baker experiment plan` FIRST: most pages cannot settle most questions.",
@@ -53518,7 +53665,7 @@ async function writeVariant(opts) {
53518
53665
  await writeFile18(path42.join(variantDir, "_images", ".gitkeep"), "", "utf8");
53519
53666
  return written;
53520
53667
  }
53521
- var variantCommand = defineCommand174({
53668
+ var variantCommand = defineCommand175({
53522
53669
  meta: {
53523
53670
  name: "variant",
53524
53671
  description: "Create a new variant of a page, for an A/B test. The variant SHARES the page's sections and forks only the component you name, so the two versions differ by exactly the thing you are testing. It is a version of that page, not a page of its own: it is never indexed, never listed, and has no public URL \u2014 both versions answer at the page's own address. Run `baker experiment plan` first \u2014 most pages do not have the traffic to settle most questions."
@@ -53598,7 +53745,7 @@ var variantCommand = defineCommand174({
53598
53745
  });
53599
53746
 
53600
53747
  // src/commands/landing/index.ts
53601
- var landingCommand = defineCommand175({
53748
+ var landingCommand = defineCommand176({
53602
53749
  meta: {
53603
53750
  name: "landing",
53604
53751
  description: `Design-quality tools for landing pages (src/pages/<slug>/).
@@ -53618,7 +53765,7 @@ Subcommands:
53618
53765
  });
53619
53766
 
53620
53767
  // src/commands/mcp/index.ts
53621
- import { defineCommand as defineCommand176 } from "citty";
53768
+ import { defineCommand as defineCommand177 } from "citty";
53622
53769
 
53623
53770
  // src/commands/mcp/platforms.ts
53624
53771
  function readsKey(label) {
@@ -53687,7 +53834,7 @@ registerSchema({
53687
53834
  description: "List everything this chat can reach: managed integrations (Attio, Slack, Gmail, Google Sheets, \u2026), custom MCP servers, and the platforms the company signed in to (HubSpot, Google Ads, GA4, Search Console, Tag Manager) which you read through their own `baker` commands. Start here when the user mentions an external tool or platform.",
53688
53835
  args: {}
53689
53836
  });
53690
- var connectedCommand = defineCommand176({
53837
+ var connectedCommand = defineCommand177({
53691
53838
  meta: {
53692
53839
  name: "connected",
53693
53840
  description: `Everything this chat can reach \u2014 managed integrations, custom MCP servers, and connected platforms.
@@ -53746,7 +53893,7 @@ registerSchema({
53746
53893
  description: "List the custom MCP servers this company's chats see (org + company + your own user scope).",
53747
53894
  args: {}
53748
53895
  });
53749
- var listCommand15 = defineCommand176({
53896
+ var listCommand15 = defineCommand177({
53750
53897
  meta: { name: "list", description: "List custom MCP servers visible to this company's chats." },
53751
53898
  run: async () => {
53752
53899
  try {
@@ -53783,7 +53930,7 @@ registerSchema({
53783
53930
  header: { type: "string", description: 'Auth header "Key: Value" (repeatable)', required: false }
53784
53931
  }
53785
53932
  });
53786
- var addCommand2 = defineCommand176({
53933
+ var addCommand2 = defineCommand177({
53787
53934
  meta: {
53788
53935
  name: "add",
53789
53936
  description: `Register a custom MCP server. Tools appear as mcp__<name>__* on the NEXT message.
@@ -53835,7 +53982,7 @@ registerSchema({
53835
53982
  description: "Remove a company custom MCP server by name.",
53836
53983
  args: { name: { type: "string", description: "Server name to remove", required: true } }
53837
53984
  });
53838
- var removeCommand5 = defineCommand176({
53985
+ var removeCommand5 = defineCommand177({
53839
53986
  meta: {
53840
53987
  name: "remove",
53841
53988
  description: `Remove a company custom MCP server by name.
@@ -53857,7 +54004,7 @@ Example:
53857
54004
  }
53858
54005
  }
53859
54006
  });
53860
- var mcpCommand = defineCommand176({
54007
+ var mcpCommand = defineCommand177({
53861
54008
  meta: {
53862
54009
  name: "mcp",
53863
54010
  description: `Third-party tools for this company \u2014 see what's connected, register custom HTTPS MCP endpoints.
@@ -53883,10 +54030,10 @@ Full guide: __tooling__/docs/tools/baker/mcp.md`
53883
54030
  });
53884
54031
 
53885
54032
  // src/commands/research/index.ts
53886
- import { defineCommand as defineCommand189 } from "citty";
54033
+ import { defineCommand as defineCommand190 } from "citty";
53887
54034
 
53888
54035
  // src/commands/research/advertisers.ts
53889
- import { defineCommand as defineCommand177 } from "citty";
54036
+ import { defineCommand as defineCommand178 } from "citty";
53890
54037
 
53891
54038
  // src/commands/research/hints.ts
53892
54039
  var AD_COPY_ROUTE = 'This returns competing DOMAINS and their SERP economics \u2014 no ad copy, no headlines, no creative. For the actual copy of a competitor\'s ads: `baker winning-ads advertisers "<brand>"` \u2192 `baker winning-ads search "<brief>" --advertiser-id <id>` \u2192 `baker winning-ads content <adId>` (`primary_text` / `headline` / `cta`, plus the spoken transcript and on-screen text for video). That corpus is Meta and LinkedIn only \u2014 Google SERP ad copy is not available through any Baker command, so do not keep querying for it here.';
@@ -54088,7 +54235,7 @@ var FIELDS3 = {
54088
54235
  etv: "Estimated traffic value (USD)",
54089
54236
  visibility: "SERP visibility score (0-1)"
54090
54237
  };
54091
- var advertisersCommand = defineCommand177({
54238
+ var advertisersCommand = defineCommand178({
54092
54239
  meta: {
54093
54240
  name: "advertisers",
54094
54241
  description: `Domains competing for a keyword in Google SERPs, with position, relevance, traffic value and visibility. Returns NO ad copy \u2014 for a competitor's headlines and body copy use \`baker winning-ads content <adId>\` (Meta/LinkedIn only).
@@ -54144,7 +54291,7 @@ Examples:
54144
54291
  });
54145
54292
 
54146
54293
  // src/commands/research/autocomplete.ts
54147
- import { defineCommand as defineCommand178 } from "citty";
54294
+ import { defineCommand as defineCommand179 } from "citty";
54148
54295
  registerSchema({
54149
54296
  command: "research.autocomplete",
54150
54297
  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).",
@@ -54167,7 +54314,7 @@ registerSchema({
54167
54314
  var FIELDS4 = {
54168
54315
  suggestion: "Autocomplete suggestion from Google"
54169
54316
  };
54170
- var autocompleteCommand = defineCommand178({
54317
+ var autocompleteCommand = defineCommand179({
54171
54318
  meta: {
54172
54319
  name: "autocomplete",
54173
54320
  description: `Get Google Autocomplete suggestions for keyword expansion.
@@ -54222,7 +54369,7 @@ Examples:
54222
54369
  });
54223
54370
 
54224
54371
  // src/commands/research/countries.ts
54225
- import { defineCommand as defineCommand179 } from "citty";
54372
+ import { defineCommand as defineCommand180 } from "citty";
54226
54373
  registerSchema({
54227
54374
  command: "research.countries",
54228
54375
  description: "List all supported country codes for --location flag in research commands.",
@@ -54279,7 +54426,7 @@ var FIELDS5 = {
54279
54426
  code: "Country code to pass as --location",
54280
54427
  name: "Country name"
54281
54428
  };
54282
- var countriesCommand = defineCommand179({
54429
+ var countriesCommand = defineCommand180({
54283
54430
  meta: {
54284
54431
  name: "countries",
54285
54432
  description: "List all supported country codes for --location flag."
@@ -54290,7 +54437,7 @@ var countriesCommand = defineCommand179({
54290
54437
  });
54291
54438
 
54292
54439
  // src/commands/research/fetch.ts
54293
- import { defineCommand as defineCommand180 } from "citty";
54440
+ import { defineCommand as defineCommand181 } from "citty";
54294
54441
  var CONTENT_PREVIEW_CHARS = 2e4;
54295
54442
  var TIMEOUT_MS = 18e4;
54296
54443
  registerSchema({
@@ -54363,7 +54510,7 @@ function fetchFix(code) {
54363
54510
  explanation: "This read failed. Don't build a retry ladder around it \u2014 finish the rest of the job with what you can reach and name this page as a gap."
54364
54511
  };
54365
54512
  }
54366
- var fetchCommand = defineCommand180({
54513
+ var fetchCommand = defineCommand181({
54367
54514
  meta: {
54368
54515
  name: "fetch",
54369
54516
  description: `Read a page an ordinary web fetch could not. Bot walls and JavaScript-rendered pages are resolved for you \u2014 you never have to retry, wait, or drive a browser yourself.
@@ -54440,7 +54587,7 @@ Examples:
54440
54587
  });
54441
54588
 
54442
54589
  // src/commands/research/intent.ts
54443
- import { defineCommand as defineCommand181 } from "citty";
54590
+ import { defineCommand as defineCommand182 } from "citty";
54444
54591
  registerSchema({
54445
54592
  command: "research.intent",
54446
54593
  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.",
@@ -54463,7 +54610,7 @@ var FIELDS7 = {
54463
54610
  intent: "Primary Google Search intent: informational, navigational, commercial, transactional",
54464
54611
  probability: "Confidence score 0.0-1.0"
54465
54612
  };
54466
- var intentCommand = defineCommand181({
54613
+ var intentCommand = defineCommand182({
54467
54614
  meta: {
54468
54615
  name: "intent",
54469
54616
  description: `Classify Google Search intent for keywords. Returns intent type and confidence.
@@ -54511,7 +54658,7 @@ Examples:
54511
54658
  });
54512
54659
 
54513
54660
  // src/commands/research/keyword-gap.ts
54514
- import { defineCommand as defineCommand182 } from "citty";
54661
+ import { defineCommand as defineCommand183 } from "citty";
54515
54662
  registerSchema({
54516
54663
  command: "research.keyword-gap",
54517
54664
  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.",
@@ -54540,7 +54687,7 @@ var FIELDS8 = {
54540
54687
  cpc: "Cost per click USD",
54541
54688
  their_position: "Competitor's ranking position"
54542
54689
  };
54543
- var keywordGapCommand = defineCommand182({
54690
+ var keywordGapCommand = defineCommand183({
54544
54691
  meta: {
54545
54692
  name: "keyword-gap",
54546
54693
  description: `Find keywords a competitor has that you don't. Supports pagination via --offset.
@@ -54615,7 +54762,7 @@ Examples:
54615
54762
  });
54616
54763
 
54617
54764
  // src/commands/research/keyword-metrics.ts
54618
- import { defineCommand as defineCommand183 } from "citty";
54765
+ import { defineCommand as defineCommand184 } from "citty";
54619
54766
 
54620
54767
  // src/commands/research/keyword-metrics-rows.ts
54621
54768
  var KEYWORD_METRICS_SOURCE = "keyword_planner_estimate_via_dataforseo";
@@ -54695,7 +54842,7 @@ registerSchema({
54695
54842
  "no-cache": { type: "boolean", description: "Skip server cache, hit API directly", required: false }
54696
54843
  }
54697
54844
  });
54698
- var keywordMetricsCommand = defineCommand183({
54845
+ var keywordMetricsCommand = defineCommand184({
54699
54846
  meta: {
54700
54847
  name: "keyword-metrics",
54701
54848
  description: `Volume, CPC and competition for keywords you name. No domain required.
@@ -54777,7 +54924,7 @@ Examples:
54777
54924
  });
54778
54925
 
54779
54926
  // src/commands/research/keywords-for-site.ts
54780
- import { defineCommand as defineCommand184 } from "citty";
54927
+ import { defineCommand as defineCommand185 } from "citty";
54781
54928
  registerSchema({
54782
54929
  command: "research.keywords-for-site",
54783
54930
  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.",
@@ -54810,7 +54957,7 @@ var FIELDS9 = {
54810
54957
  competition: "LOW, MEDIUM, or HIGH",
54811
54958
  competition_index: "Competition score 0-100"
54812
54959
  };
54813
- var keywordsForSiteCommand = defineCommand184({
54960
+ var keywordsForSiteCommand = defineCommand185({
54814
54961
  meta: {
54815
54962
  name: "keywords-for-site",
54816
54963
  description: `Get keywords a competitor targets in Google. Use --type to filter paid/organic.
@@ -54872,7 +55019,7 @@ Examples:
54872
55019
  });
54873
55020
 
54874
55021
  // src/commands/research/languages.ts
54875
- import { defineCommand as defineCommand185 } from "citty";
55022
+ import { defineCommand as defineCommand186 } from "citty";
54876
55023
  registerSchema({
54877
55024
  command: "research.languages",
54878
55025
  description: "List all supported language codes for --language flag in research commands.",
@@ -54902,7 +55049,7 @@ var FIELDS10 = {
54902
55049
  code: "Language code to pass as --language",
54903
55050
  name: "Language name (also accepted by --language)"
54904
55051
  };
54905
- var languagesCommand2 = defineCommand185({
55052
+ var languagesCommand2 = defineCommand186({
54906
55053
  meta: {
54907
55054
  name: "languages",
54908
55055
  description: "List all supported language codes for --language flag."
@@ -54913,7 +55060,7 @@ var languagesCommand2 = defineCommand185({
54913
55060
  });
54914
55061
 
54915
55062
  // src/commands/research/lighthouse.ts
54916
- import { defineCommand as defineCommand186 } from "citty";
55063
+ import { defineCommand as defineCommand187 } from "citty";
54917
55064
  registerSchema({
54918
55065
  command: "research.lighthouse",
54919
55066
  description: "Landing page performance audit. Returns metrics that affect Google Ads Quality Score and CPC.",
@@ -54932,7 +55079,7 @@ var FIELDS11 = {
54932
55079
  speed_index_ms: "Speed Index in ms (good: < 3400)",
54933
55080
  interactive_ms: "Time to Interactive in ms (good: < 3800)"
54934
55081
  };
54935
- var lighthouseCommand = defineCommand186({
55082
+ var lighthouseCommand = defineCommand187({
54936
55083
  meta: {
54937
55084
  name: "lighthouse",
54938
55085
  description: `Landing page performance audit. Metrics affecting Google Ads Quality Score.
@@ -54970,7 +55117,7 @@ Examples:
54970
55117
  });
54971
55118
 
54972
55119
  // src/commands/research/relevant-pages.ts
54973
- import { defineCommand as defineCommand187 } from "citty";
55120
+ import { defineCommand as defineCommand188 } from "citty";
54974
55121
  registerSchema({
54975
55122
  command: "research.relevant-pages",
54976
55123
  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).",
@@ -54996,7 +55143,7 @@ var FIELDS12 = {
54996
55143
  keywords: "Total organic keywords the page ranks for",
54997
55144
  top_10: "Keywords in positions 1-10"
54998
55145
  };
54999
- var relevantPagesCommand = defineCommand187({
55146
+ var relevantPagesCommand = defineCommand188({
55000
55147
  meta: {
55001
55148
  name: "relevant-pages",
55002
55149
  description: `Get the top pages of a competitor domain with traffic data.
@@ -55043,7 +55190,7 @@ Examples:
55043
55190
  });
55044
55191
 
55045
55192
  // src/commands/research/web.ts
55046
- import { defineCommand as defineCommand188 } from "citty";
55193
+ import { defineCommand as defineCommand189 } from "citty";
55047
55194
  registerSchema({
55048
55195
  command: "research.web",
55049
55196
  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).",
@@ -55094,7 +55241,7 @@ async function runDeepResearch(question) {
55094
55241
  }
55095
55242
  throw new Error("Deep research timed out");
55096
55243
  }
55097
- var webCommand = defineCommand188({
55244
+ var webCommand = defineCommand189({
55098
55245
  meta: {
55099
55246
  name: "web",
55100
55247
  description: `Search the web with AI to answer any open-ended marketing question. Uses live internet data via Google Search.
@@ -55156,7 +55303,7 @@ Examples:
55156
55303
  });
55157
55304
 
55158
55305
  // src/commands/research/index.ts
55159
- var researchCommand = defineCommand189({
55306
+ var researchCommand = defineCommand190({
55160
55307
  meta: {
55161
55308
  name: "research",
55162
55309
  description: `Competitive intelligence and AI-powered research commands.
@@ -55203,10 +55350,10 @@ Full guide: __tooling__/docs/tools/baker/research.md`
55203
55350
  });
55204
55351
 
55205
55352
  // src/commands/scheduled-actions/index.ts
55206
- import { defineCommand as defineCommand197 } from "citty";
55353
+ import { defineCommand as defineCommand198 } from "citty";
55207
55354
 
55208
55355
  // src/commands/scheduled-actions/create.ts
55209
- import { defineCommand as defineCommand190 } from "citty";
55356
+ import { defineCommand as defineCommand191 } from "citty";
55210
55357
 
55211
55358
  // src/commands/scheduled-actions/shared.ts
55212
55359
  var TEMP_SCHEDULED_ACTION_PREFIX = "temp_sched_";
@@ -55362,7 +55509,7 @@ registerSchema({
55362
55509
  }
55363
55510
  }
55364
55511
  });
55365
- var createCommand3 = defineCommand190({
55512
+ var createCommand3 = defineCommand191({
55366
55513
  meta: {
55367
55514
  name: "create",
55368
55515
  description: 'Stage a scheduled action. Example: baker scheduled-actions create --name "Weekly report" --description "..." --cron "0 9 * * MON"'
@@ -55421,7 +55568,7 @@ var createCommand3 = defineCommand190({
55421
55568
  });
55422
55569
 
55423
55570
  // src/commands/scheduled-actions/delete.ts
55424
- import { defineCommand as defineCommand191 } from "citty";
55571
+ import { defineCommand as defineCommand192 } from "citty";
55425
55572
  registerSchema({
55426
55573
  command: "scheduled-actions.delete",
55427
55574
  description: "Stage deletion of a published scheduled action or cancellation of a temp_sched_* draft creation.",
@@ -55429,7 +55576,7 @@ registerSchema({
55429
55576
  id: { type: "string", description: "Published scheduled action ID or temp_sched_* draft ID", required: true }
55430
55577
  }
55431
55578
  });
55432
- var deleteCommand3 = defineCommand191({
55579
+ var deleteCommand3 = defineCommand192({
55433
55580
  meta: {
55434
55581
  name: "delete",
55435
55582
  description: "Stage scheduled action deletion. Example: baker scheduled-actions delete <id-or-temp_sched_id>"
@@ -55458,7 +55605,7 @@ var deleteCommand3 = defineCommand191({
55458
55605
  });
55459
55606
 
55460
55607
  // src/commands/scheduled-actions/get.ts
55461
- import { defineCommand as defineCommand192 } from "citty";
55608
+ import { defineCommand as defineCommand193 } from "citty";
55462
55609
  registerSchema({
55463
55610
  command: "scheduled-actions.get",
55464
55611
  description: "Get a published scheduled action or a temp_sched_* draft-created scheduled action.",
@@ -55467,7 +55614,7 @@ registerSchema({
55467
55614
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
55468
55615
  }
55469
55616
  });
55470
- var getCommand4 = defineCommand192({
55617
+ var getCommand4 = defineCommand193({
55471
55618
  meta: {
55472
55619
  name: "get",
55473
55620
  description: "Get a scheduled action. Example: baker scheduled-actions get <id-or-temp_sched_id>"
@@ -55506,7 +55653,7 @@ var getCommand4 = defineCommand192({
55506
55653
  });
55507
55654
 
55508
55655
  // src/commands/scheduled-actions/list.ts
55509
- import { defineCommand as defineCommand193 } from "citty";
55656
+ import { defineCommand as defineCommand194 } from "citty";
55510
55657
  registerSchema({
55511
55658
  command: "scheduled-actions.list",
55512
55659
  description: "List published scheduled actions. Includes draft state when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged schedules instead.",
@@ -55514,7 +55661,7 @@ registerSchema({
55514
55661
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
55515
55662
  }
55516
55663
  });
55517
- var listCommand16 = defineCommand193({
55664
+ var listCommand16 = defineCommand194({
55518
55665
  meta: {
55519
55666
  name: "list",
55520
55667
  description: "List scheduled actions. Includes staged draft ops when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged schedules instead."
@@ -55539,7 +55686,7 @@ var listCommand16 = defineCommand193({
55539
55686
  // src/commands/scheduled-actions/templates.ts
55540
55687
  import { readFile as readFile29 } from "fs/promises";
55541
55688
  import path43 from "path";
55542
- import { defineCommand as defineCommand194 } from "citty";
55689
+ import { defineCommand as defineCommand195 } from "citty";
55543
55690
  registerSchema({
55544
55691
  command: "scheduled-actions.templates",
55545
55692
  description: "The recipes available to this company: the ones Baker ships plus the ones they wrote themselves, each with its id, what it produces and how often it is meant to run. Read this before proposing a company's automation, so every recipe you name is one that exists. Also how a company gets a recipe of its own \u2014 save a brief, prove it runs, then publish it.",
@@ -55594,7 +55741,7 @@ registerSchema({
55594
55741
  }
55595
55742
  }
55596
55743
  });
55597
- var templatesCommand = defineCommand194({
55744
+ var templatesCommand = defineCommand195({
55598
55745
  meta: {
55599
55746
  name: "templates",
55600
55747
  description: `The recipes this company can run \u2014 Baker's own plus theirs, with what each one produces.
@@ -55686,7 +55833,7 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
55686
55833
  });
55687
55834
 
55688
55835
  // src/commands/scheduled-actions/trigger.ts
55689
- import { defineCommand as defineCommand195 } from "citty";
55836
+ import { defineCommand as defineCommand196 } from "citty";
55690
55837
  registerSchema({
55691
55838
  command: "scheduled-actions.trigger",
55692
55839
  description: "Immediately trigger a published scheduled action. Does not require BAKER_CHAT_ID and rejects temp_sched_* IDs.",
@@ -55694,7 +55841,7 @@ registerSchema({
55694
55841
  id: { type: "string", description: "Published scheduled action ID", required: true }
55695
55842
  }
55696
55843
  });
55697
- var triggerCommand = defineCommand195({
55844
+ var triggerCommand = defineCommand196({
55698
55845
  meta: {
55699
55846
  name: "trigger",
55700
55847
  description: "Immediately trigger a published scheduled action. Example: baker scheduled-actions trigger <id>"
@@ -55731,7 +55878,7 @@ var triggerCommand = defineCommand195({
55731
55878
  });
55732
55879
 
55733
55880
  // src/commands/scheduled-actions/update.ts
55734
- import { defineCommand as defineCommand196 } from "citty";
55881
+ import { defineCommand as defineCommand197 } from "citty";
55735
55882
  registerSchema({
55736
55883
  command: "scheduled-actions.update",
55737
55884
  description: "Stage an update to a published scheduled action or temp_sched_* draft-created scheduled action.",
@@ -55762,7 +55909,7 @@ registerSchema({
55762
55909
  prompt: { type: "string", description: "Replacement additional spawned-agent instructions", required: false }
55763
55910
  }
55764
55911
  });
55765
- var updateCommand4 = defineCommand196({
55912
+ var updateCommand4 = defineCommand197({
55766
55913
  meta: {
55767
55914
  name: "update",
55768
55915
  description: "Stage a scheduled action update. Examples: baker scheduled-actions update <id> --enabled false | baker scheduled-actions update <id> --mode publish"
@@ -55840,7 +55987,7 @@ var updateCommand4 = defineCommand196({
55840
55987
  });
55841
55988
 
55842
55989
  // src/commands/scheduled-actions/index.ts
55843
- var scheduledActionsCommand = defineCommand197({
55990
+ var scheduledActionsCommand = defineCommand198({
55844
55991
  meta: {
55845
55992
  name: "scheduled-actions",
55846
55993
  description: `Manage Scheduled Actions. Subcommands: list, get, create, update, delete, trigger, templates.
@@ -55869,14 +56016,14 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
55869
56016
  });
55870
56017
 
55871
56018
  // src/commands/schema.ts
55872
- import { defineCommand as defineCommand198 } from "citty";
56019
+ import { defineCommand as defineCommand199 } from "citty";
55873
56020
  function narrowToFamily(commandName, available) {
55874
56021
  const segments = commandName.split(".");
55875
56022
  const prefix = segments[0] === "ads" && segments[1] ? `ads.${segments[1]}.` : `${segments[0]}.`;
55876
56023
  const siblings = available.filter((name) => name.startsWith(prefix));
55877
56024
  return siblings.length > 0 ? siblings : available;
55878
56025
  }
55879
- var schemaCommand2 = defineCommand198({
56026
+ var schemaCommand2 = defineCommand199({
55880
56027
  meta: {
55881
56028
  name: "schema",
55882
56029
  description: "Inspect command argument schemas (for AI agent introspection). Lists all commands if no argument given. Example: baker schema images.search"
@@ -55920,10 +56067,10 @@ var schemaCommand2 = defineCommand198({
55920
56067
  });
55921
56068
 
55922
56069
  // src/commands/studio/index.ts
55923
- import { defineCommand as defineCommand207 } from "citty";
56070
+ import { defineCommand as defineCommand208 } from "citty";
55924
56071
 
55925
56072
  // src/commands/studio/animate.ts
55926
- import { defineCommand as defineCommand199 } from "citty";
56073
+ import { defineCommand as defineCommand200 } from "citty";
55927
56074
 
55928
56075
  // src/commands/studio/batch.ts
55929
56076
  function projectBatch(generation, full) {
@@ -56374,7 +56521,7 @@ function costHintsFor(body) {
56374
56521
  }
56375
56522
  return hints2;
56376
56523
  }
56377
- var animateCommand = defineCommand199({
56524
+ var animateCommand = defineCommand200({
56378
56525
  meta: {
56379
56526
  name: "animate",
56380
56527
  description: "Render a clip. With an image the look is already fixed, so the prompt describes MOVEMENT \u2014 what the camera does, what the subject does, in what order. With --from text there is no image and the prompt is the whole shot.\n\nA rendered clip is NOT usable anywhere until you keep it: `baker studio keep <id> --slot N` is what puts it in the video library. Takes nobody keeps are never ingested, which is what makes a rejected batch cheap.\n\nFor anything longer than 15 seconds, or to build on footage that already exists, use --model bytedance/seedance-2.5: it renders 4-30s and is the only model that reads an existing clip or an existing soundtrack.\n\nExamples:\n baker studio animate 'slow push in, model turns to camera and smiles' --image j57abc123def456ghi789\n baker studio animate 'handheld drift right, steam rising from the cup' --image './out/hero.png' --duration 6 --quality 1080p\n baker studio animate 'product rotates once on a turntable' --image j57abc\u2026,j57def\u2026 --from references\n baker studio animate 'she keeps walking, camera stays with her, then she stops and looks up' --image j57abc\u2026 --from references --from-clip j57batch\u2026:0 --model bytedance/seedance-2.5 --duration 20\n baker studio animate 'hold on the product, then a slow push-in' --from references --from-video j57vid\u2026 --model bytedance/seedance-2.5\n baker studio animate 'slow drone pull-back over a solar farm at golden hour, no people' --from text --model bytedance/seedance-2.5 --duration 12"
@@ -56493,7 +56640,7 @@ var animateCommand = defineCommand199({
56493
56640
  });
56494
56641
 
56495
56642
  // src/commands/studio/generate.ts
56496
- import { defineCommand as defineCommand200 } from "citty";
56643
+ import { defineCommand as defineCommand201 } from "citty";
56497
56644
  var MODEL_LIST2 = IMAGE_MODEL_IDS;
56498
56645
  var DEFAULT_MAX_WAIT_MS2 = 24e4;
56499
56646
  registerSchema({
@@ -56629,7 +56776,7 @@ function buildGenerateBody(args, prompt) {
56629
56776
  }
56630
56777
  return body;
56631
56778
  }
56632
- var generateCommand = defineCommand200({
56779
+ var generateCommand = defineCommand201({
56633
56780
  meta: {
56634
56781
  name: "generate",
56635
56782
  description: "Start here to make an image. Renders 1-8 takes of one brief, ingests each into the media library as it lands, and shows the batch in the dashboard Studio next to the ones the client ran.\n\nModel choice: google/gemini-3.1-flash-image-preview (default \u2014 fast, best at editing a reference and at extreme ratios), google/gemini-3-pro-image-preview (highest fidelity, slower), openai/gpt-image-2 (photoreal and the cleanest in-image text \u2014 no --image-size, no 4:5 / 5:4), recraft/recraft-v4.1-pro-vector (vector/flat marks with palette control).\n\n--reference is the biggest quality lever there is: a real logo, product shot, Pinterest pin or sandbox screenshot beats any amount of adjectives.\n\nExamples:\n baker studio generate 'matte black bottle on wet marble, hard studio light, 35mm' --aspect-ratio 3:2 --count 3\n baker studio generate 'this bottle on a sunlit kitchen counter' --reference './src/brand/product.png,https://\u2026/kitchen.jpg'\n baker studio generate 'founder-style selfie, kitchen background, natural light' --skill ugc-selfie-hook\n baker studio generate 'flat geometric mascot, brand palette' --model recraft/recraft-v4.1-pro-vector --rgb-colors '[[10,10,10],[255,80,0]]'"
@@ -56707,7 +56854,7 @@ var generateCommand = defineCommand200({
56707
56854
  });
56708
56855
 
56709
56856
  // src/commands/studio/get.ts
56710
- import { defineCommand as defineCommand201 } from "citty";
56857
+ import { defineCommand as defineCommand202 } from "citty";
56711
56858
  registerSchema({
56712
56859
  command: "studio.get",
56713
56860
  description: "Read one Studio batch: every take, where it lives, and why a take is missing. This is how you pick up a batch that was still rendering when the start command returned.",
@@ -56716,7 +56863,7 @@ registerSchema({
56716
56863
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
56717
56864
  }
56718
56865
  });
56719
- var getCommand5 = defineCommand201({
56866
+ var getCommand5 = defineCommand202({
56720
56867
  meta: {
56721
56868
  name: "get",
56722
56869
  description: "Read one Studio batch \u2014 the takes, their urls, whether each is in the library, and the reason for any that failed.\n\nExample: baker studio get j57abc123def456ghi789\nExample: baker studio get j57abc123def456ghi789 --full"
@@ -56745,7 +56892,7 @@ var getCommand5 = defineCommand201({
56745
56892
  });
56746
56893
 
56747
56894
  // src/commands/studio/improve.ts
56748
- import { defineCommand as defineCommand202 } from "citty";
56895
+ import { defineCommand as defineCommand203 } from "citty";
56749
56896
  var DESCRIPTION = "Sharpen a rough brief into directed art direction \u2014 the same rewrite the client gets from the wand in the Studio prompt bar. Reach for it when you are relaying the CLIENT's own words and want them shaped without substituting your voice; when you are writing the art direction yourself, just write it, because you will do a better job than this does.";
56750
56897
  registerSchema({
56751
56898
  command: "studio.improve",
@@ -56770,7 +56917,7 @@ registerSchema({
56770
56917
  }
56771
56918
  }
56772
56919
  });
56773
- var improveCommand = defineCommand202({
56920
+ var improveCommand = defineCommand203({
56774
56921
  meta: {
56775
56922
  name: "improve",
56776
56923
  description: `${DESCRIPTION}
@@ -56814,7 +56961,7 @@ Examples:
56814
56961
  });
56815
56962
 
56816
56963
  // src/commands/studio/keep.ts
56817
- import { defineCommand as defineCommand203 } from "citty";
56964
+ import { defineCommand as defineCommand204 } from "citty";
56818
56965
  registerSchema({
56819
56966
  command: "studio.keep",
56820
56967
  description: "Mark one take as the keeper. For an image this stars it, so the client reviewing the batch sees which one you used. For a CLIP it is the step that puts it in the video library \u2014 until then the clip cannot be used in a canvas, a landing, or an ad.",
@@ -56824,7 +56971,7 @@ registerSchema({
56824
56971
  undo: { type: "boolean", description: "Un-star an image, or take a kept clip back out", required: false }
56825
56972
  }
56826
56973
  });
56827
- var keepCommand = defineCommand203({
56974
+ var keepCommand = defineCommand204({
56828
56975
  meta: {
56829
56976
  name: "keep",
56830
56977
  description: "Mark one take as the keeper. An image gets starred (it was already in the library); a clip gets INGESTED into the video library, which is what makes it usable anywhere else.\n\nExample: baker studio keep j57abc123def456ghi789 --slot 2\nExample: baker studio keep j57abc123def456ghi789 --slot 2 --undo"
@@ -56875,7 +57022,7 @@ var keepCommand = defineCommand203({
56875
57022
  });
56876
57023
 
56877
57024
  // src/commands/studio/list.ts
56878
- import { defineCommand as defineCommand204 } from "citty";
57025
+ import { defineCommand as defineCommand205 } from "citty";
56879
57026
  registerSchema({
56880
57027
  command: "studio.list",
56881
57028
  description: "Recent Studio batches for THIS conversation, newest first \u2014 what you have already generated, so you re-use a take instead of paying for it twice. `--all` widens it to everything the company generated, including what people ran themselves in the dashboard.",
@@ -56886,7 +57033,7 @@ registerSchema({
56886
57033
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
56887
57034
  }
56888
57035
  });
56889
- var listCommand17 = defineCommand204({
57036
+ var listCommand17 = defineCommand205({
56890
57037
  meta: {
56891
57038
  name: "list",
56892
57039
  description: "Recent Studio batches, newest first. Scoped to this conversation unless you pass --all.\n\nExample: baker studio list\nExample: baker studio list --kind video --limit 5\nExample: baker studio list --all # includes batches the client ran in the dashboard"
@@ -56920,7 +57067,7 @@ var listCommand17 = defineCommand204({
56920
57067
  });
56921
57068
 
56922
57069
  // src/commands/studio/models.ts
56923
- import { defineCommand as defineCommand205 } from "citty";
57070
+ import { defineCommand as defineCommand206 } from "citty";
56924
57071
  var DESCRIPTION2 = "What each Studio model actually accepts: its shapes, resolutions, clip lengths, prompt character cap, how many reference images it takes, and which knobs it has. Read this before a batch you care about \u2014 the models disagree far more than they look like they do, and a setting the chosen model does not have is REFUSED, not ignored.";
56925
57072
  registerSchema({
56926
57073
  command: "studio.models",
@@ -57007,7 +57154,7 @@ function buildModelCards(kind, model) {
57007
57154
  const selected = model ? ids.filter((id) => id === model) : ids;
57008
57155
  return selected.map((id) => build(id));
57009
57156
  }
57010
- var modelsCommand = defineCommand205({
57157
+ var modelsCommand = defineCommand206({
57011
57158
  meta: {
57012
57159
  name: "models",
57013
57160
  description: `${DESCRIPTION2}
@@ -57054,13 +57201,13 @@ Examples:
57054
57201
  });
57055
57202
 
57056
57203
  // src/commands/studio/skills.ts
57057
- import { defineCommand as defineCommand206 } from "citty";
57204
+ import { defineCommand as defineCommand207 } from "citty";
57058
57205
  registerSchema({
57059
57206
  command: "studio.skills",
57060
57207
  description: "The craft directions `studio generate --skill <id>` accepts. Each one carries directed art direction plus the model, shape and take count it wants, so you pick a look by name instead of writing the boilerplate yourself.",
57061
57208
  args: {}
57062
57209
  });
57063
- var skillsCommand = defineCommand206({
57210
+ var skillsCommand = defineCommand207({
57064
57211
  meta: {
57065
57212
  name: "skills",
57066
57213
  description: "List the craft directions available to `baker studio generate --skill <id>` \u2014 what each one is for, whether it wants a reference image, and the model/shape/count it defaults to.\n\nExample: baker studio skills"
@@ -57084,7 +57231,7 @@ var skillsCommand = defineCommand206({
57084
57231
  });
57085
57232
 
57086
57233
  // src/commands/studio/index.ts
57087
- var studioCommand = defineCommand207({
57234
+ var studioCommand = defineCommand208({
57088
57235
  meta: {
57089
57236
  name: "studio",
57090
57237
  description: `Make new imagery and clips. Every batch is recorded and shows up in the dashboard Studio for the client to review, labelled with this conversation.
@@ -57127,10 +57274,10 @@ Full guide: __tooling__/docs/tools/baker/studio.md`
57127
57274
  });
57128
57275
 
57129
57276
  // src/commands/tag-manager/index.ts
57130
- import { defineCommand as defineCommand211 } from "citty";
57277
+ import { defineCommand as defineCommand212 } from "citty";
57131
57278
 
57132
57279
  // src/commands/tag-manager/draft.ts
57133
- import { defineCommand as defineCommand208 } from "citty";
57280
+ import { defineCommand as defineCommand209 } from "citty";
57134
57281
 
57135
57282
  // src/commands/tag-manager/shared.ts
57136
57283
  import { readFileSync as readFileSync18 } from "fs";
@@ -57253,13 +57400,13 @@ registerSchema({
57253
57400
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
57254
57401
  }
57255
57402
  });
57256
- var draftCommand5 = defineCommand208({
57403
+ var draftCommand5 = defineCommand209({
57257
57404
  meta: {
57258
57405
  name: "draft",
57259
57406
  description: "List, show, amend, remove, or clear staged Tag Manager changes for this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead."
57260
57407
  },
57261
57408
  subCommands: {
57262
- list: defineCommand208({
57409
+ list: defineCommand209({
57263
57410
  meta: {
57264
57411
  name: "list",
57265
57412
  description: "Review everything staged on this chat (--json for the raw envelope)"
@@ -57272,7 +57419,7 @@ var draftCommand5 = defineCommand208({
57272
57419
  await draftList2(args.json === true, args.chat);
57273
57420
  }
57274
57421
  }),
57275
- show: defineCommand208({
57422
+ show: defineCommand209({
57276
57423
  meta: {
57277
57424
  name: "show",
57278
57425
  description: "Print the full staged payload for one change \u2014 the receipt to verify it looks right before publish (never truncated)."
@@ -57289,7 +57436,7 @@ var draftCommand5 = defineCommand208({
57289
57436
  );
57290
57437
  }
57291
57438
  }),
57292
- amend: defineCommand208({
57439
+ amend: defineCommand209({
57293
57440
  meta: {
57294
57441
  name: "amend",
57295
57442
  description: "Update a staged change in place \u2014 merges a JSON patch into its payload (objects deep-merge, null deletes a key, arrays/scalars replace) and re-validates. Use this instead of remove + re-create."
@@ -57306,7 +57453,7 @@ var draftCommand5 = defineCommand208({
57306
57453
  });
57307
57454
  }
57308
57455
  }),
57309
- remove: defineCommand208({
57456
+ remove: defineCommand209({
57310
57457
  meta: { name: "remove", description: "Remove one staged change (cascades to anything depending on it)" },
57311
57458
  args: { ref: { type: "positional", description: "Staged ref (gtm_temp_*) or target", required: false } },
57312
57459
  run: async ({ args }) => {
@@ -57315,7 +57462,7 @@ var draftCommand5 = defineCommand208({
57315
57462
  });
57316
57463
  }
57317
57464
  }),
57318
- clear: defineCommand208({
57465
+ clear: defineCommand209({
57319
57466
  meta: { name: "clear", description: "Discard all Tag Manager changes staged on this chat" },
57320
57467
  run: async () => {
57321
57468
  await draftAction3("/api/tag-manager/draft/clear", {});
@@ -57325,7 +57472,7 @@ var draftCommand5 = defineCommand208({
57325
57472
  });
57326
57473
 
57327
57474
  // src/commands/tag-manager/read.ts
57328
- import { defineCommand as defineCommand209 } from "citty";
57475
+ import { defineCommand as defineCommand210 } from "citty";
57329
57476
  registerSchema({
57330
57477
  command: "tagManager.containers",
57331
57478
  description: "List the Google Tag Manager containers this company's connection can reach. Every container the company connected is flagged `connected: true` \u2014 there can be several, and Baker may read and change all of them. Start here to confirm which containers you are managing.",
@@ -57366,7 +57513,7 @@ function containersHints(containers) {
57366
57513
  }))
57367
57514
  });
57368
57515
  }
57369
- var containersCommand = defineCommand209({
57516
+ var containersCommand = defineCommand210({
57370
57517
  meta: {
57371
57518
  name: "containers",
57372
57519
  description: `List Tag Manager containers reachable by this company's connection.
@@ -57383,7 +57530,7 @@ Start here:
57383
57530
  }
57384
57531
  }
57385
57532
  });
57386
- var readCommand = defineCommand209({
57533
+ var readCommand = defineCommand210({
57387
57534
  meta: {
57388
57535
  name: "read",
57389
57536
  description: `Read the current contents of the Tag Manager container \u2014 always do this before staging changes.
@@ -57425,7 +57572,7 @@ Examples:
57425
57572
  });
57426
57573
 
57427
57574
  // src/commands/tag-manager/write-commands.ts
57428
- import { defineCommand as defineCommand210 } from "citty";
57575
+ import { defineCommand as defineCommand211 } from "citty";
57429
57576
  var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
57430
57577
  var ENTITIES = [
57431
57578
  {
@@ -57481,10 +57628,10 @@ for (const { entity, noun, createHint } of ENTITIES) {
57481
57628
  });
57482
57629
  }
57483
57630
  function entityCommand(entity, noun, example) {
57484
- return defineCommand210({
57631
+ return defineCommand211({
57485
57632
  meta: { name: entity, description: `Stage ${noun} changes on this chat's Tag Manager draft` },
57486
57633
  subCommands: {
57487
- create: defineCommand210({
57634
+ create: defineCommand211({
57488
57635
  meta: {
57489
57636
  name: "create",
57490
57637
  description: `Stage a new ${noun}
@@ -57506,7 +57653,7 @@ Examples:
57506
57653
  });
57507
57654
  }
57508
57655
  }),
57509
- update: defineCommand210({
57656
+ update: defineCommand211({
57510
57657
  meta: {
57511
57658
  name: "update",
57512
57659
  description: `Stage an update to an existing ${noun} (pass its id or path)`
@@ -57526,7 +57673,7 @@ Examples:
57526
57673
  });
57527
57674
  }
57528
57675
  }),
57529
- delete: defineCommand210({
57676
+ delete: defineCommand211({
57530
57677
  meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
57531
57678
  args: {
57532
57679
  id: { type: "positional", description: `${noun} id or path`, required: false },
@@ -57567,7 +57714,7 @@ function builtinTypes(args) {
57567
57714
  }
57568
57715
  return raw.split(",").map((entry) => entry.trim());
57569
57716
  }
57570
- var builtinCommand = defineCommand210({
57717
+ var builtinCommand = defineCommand211({
57571
57718
  meta: {
57572
57719
  name: "builtin",
57573
57720
  description: `Enable or disable built-in variables
@@ -57577,7 +57724,7 @@ Examples:
57577
57724
  baker tag-manager builtin disable --types formId`
57578
57725
  },
57579
57726
  subCommands: {
57580
- enable: defineCommand210({
57727
+ enable: defineCommand211({
57581
57728
  meta: { name: "enable", description: "Stage enabling built-in variables" },
57582
57729
  args: {
57583
57730
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -57591,7 +57738,7 @@ Examples:
57591
57738
  });
57592
57739
  }
57593
57740
  }),
57594
- disable: defineCommand210({
57741
+ disable: defineCommand211({
57595
57742
  meta: { name: "disable", description: "Stage disabling built-in variables" },
57596
57743
  args: {
57597
57744
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -57609,7 +57756,7 @@ Examples:
57609
57756
  });
57610
57757
 
57611
57758
  // src/commands/tag-manager/index.ts
57612
- var tagManagerCommand = defineCommand211({
57759
+ var tagManagerCommand = defineCommand212({
57613
57760
  meta: {
57614
57761
  name: "tag-manager",
57615
57762
  description: `Read and change what lives inside the client's Google Tag Manager container \u2014 tags, triggers, variables, folders and built-in variables.
@@ -57646,7 +57793,7 @@ Full guide: __tooling__/docs/tools/baker/tag-manager.md`
57646
57793
  });
57647
57794
 
57648
57795
  // src/commands/tags/index.ts
57649
- import { defineCommand as defineCommand212 } from "citty";
57796
+ import { defineCommand as defineCommand213 } from "citty";
57650
57797
 
57651
57798
  // src/commands/tags/shared.ts
57652
57799
  function failApi3(err) {
@@ -57715,7 +57862,7 @@ async function listTags(json) {
57715
57862
  var listArgs10 = {
57716
57863
  json: { type: "boolean", description: "Print the raw JSON envelope instead of the readable list" }
57717
57864
  };
57718
- var listCommand18 = defineCommand212({
57865
+ var listCommand18 = defineCommand213({
57719
57866
  meta: {
57720
57867
  name: "list",
57721
57868
  description: "Effective tags for this chat (production + staged), with each tag's full readable config (secrets excluded) \u2014 reuse a stored value to pre-fill a change rather than asking the user. Refs printed here are what flow side-effect tagIds should use. Example: baker tags list"
@@ -57734,7 +57881,7 @@ async function listDraft4(chat) {
57734
57881
  failApi3(err);
57735
57882
  }
57736
57883
  }
57737
- var draftCommand6 = defineCommand212({
57884
+ var draftCommand6 = defineCommand213({
57738
57885
  meta: {
57739
57886
  name: "draft",
57740
57887
  description: "Review the tag changes staged in this chat (read-only). Staged changes were approved via request_tag_input and apply when the chat is published; to amend or drop one, propose a follow-up change through the same tool (a delete on a tag_temp_* ref drops the staged create). Takes --chat <id> to read an earlier chat's staged changes instead."
@@ -57744,7 +57891,7 @@ var draftCommand6 = defineCommand212({
57744
57891
  await listDraft4(args.chat);
57745
57892
  }
57746
57893
  });
57747
- var tagsCommand4 = defineCommand212({
57894
+ var tagsCommand4 = defineCommand213({
57748
57895
  meta: {
57749
57896
  name: "tags",
57750
57897
  description: `Read the client's marketing/analytics tags (Meta pixel, GA4, Google Ads, GTM, Clarity, Hotjar, \u2026) \u2014 production tags plus the changes staged in this chat.
@@ -57773,10 +57920,10 @@ Full guide: __tooling__/docs/tools/baker/tags.md`
57773
57920
  });
57774
57921
 
57775
57922
  // src/commands/testimonials/index.ts
57776
- import { defineCommand as defineCommand216 } from "citty";
57923
+ import { defineCommand as defineCommand217 } from "citty";
57777
57924
 
57778
57925
  // src/commands/testimonials/get.ts
57779
- import { defineCommand as defineCommand213 } from "citty";
57926
+ import { defineCommand as defineCommand214 } from "citty";
57780
57927
  registerSchema({
57781
57928
  command: "testimonials.get",
57782
57929
  description: "Get a single testimonial by ID",
@@ -57784,7 +57931,7 @@ registerSchema({
57784
57931
  id: { type: "string", description: "Testimonial ID", required: true }
57785
57932
  }
57786
57933
  });
57787
- var getCommand6 = defineCommand213({
57934
+ var getCommand6 = defineCommand214({
57788
57935
  meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
57789
57936
  args: {
57790
57937
  id: { type: "positional", description: "Testimonial ID", required: false },
@@ -57821,7 +57968,7 @@ var getCommand6 = defineCommand213({
57821
57968
  });
57822
57969
 
57823
57970
  // src/commands/testimonials/list.ts
57824
- import { defineCommand as defineCommand214 } from "citty";
57971
+ import { defineCommand as defineCommand215 } from "citty";
57825
57972
 
57826
57973
  // src/commands/testimonials/emptyCorpusHints.ts
57827
57974
  function resolveEmptyReason({
@@ -57978,7 +58125,7 @@ function buildListParams(args) {
57978
58125
  }
57979
58126
  return params;
57980
58127
  }
57981
- var listCommand19 = defineCommand214({
58128
+ var listCommand19 = defineCommand215({
57982
58129
  meta: {
57983
58130
  name: "list",
57984
58131
  description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
@@ -58038,7 +58185,7 @@ var listCommand19 = defineCommand214({
58038
58185
  });
58039
58186
 
58040
58187
  // src/commands/testimonials/search.ts
58041
- import { defineCommand as defineCommand215 } from "citty";
58188
+ import { defineCommand as defineCommand216 } from "citty";
58042
58189
  var FILTER_FLAGS2 = ["source", "rating-min", "rating-max", "status", "sentiment", "language", "tags"];
58043
58190
  function languageBiasHint(results, requestedLanguage) {
58044
58191
  if (requestedLanguage) {
@@ -58117,7 +58264,7 @@ function buildSearchRequest(query, args) {
58117
58264
  }
58118
58265
  return body;
58119
58266
  }
58120
- var searchCommand3 = defineCommand215({
58267
+ var searchCommand3 = defineCommand216({
58121
58268
  meta: {
58122
58269
  name: "search",
58123
58270
  description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
@@ -58181,7 +58328,7 @@ var searchCommand3 = defineCommand215({
58181
58328
  var tagsCommand5 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
58182
58329
 
58183
58330
  // src/commands/testimonials/index.ts
58184
- var testimonialsCommand = defineCommand216({
58331
+ var testimonialsCommand = defineCommand217({
58185
58332
  meta: {
58186
58333
  name: "testimonials",
58187
58334
  description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
@@ -58203,10 +58350,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
58203
58350
  });
58204
58351
 
58205
58352
  // src/commands/videos/index.ts
58206
- import { defineCommand as defineCommand223 } from "citty";
58353
+ import { defineCommand as defineCommand225 } from "citty";
58207
58354
 
58208
58355
  // src/commands/videos/delete.ts
58209
- import { defineCommand as defineCommand217 } from "citty";
58356
+ import { defineCommand as defineCommand218 } from "citty";
58210
58357
  registerSchema({
58211
58358
  command: "videos.delete",
58212
58359
  description: "Delete a video by ID",
@@ -58220,7 +58367,7 @@ registerSchema({
58220
58367
  }
58221
58368
  }
58222
58369
  });
58223
- var deleteCommand4 = defineCommand217({
58370
+ var deleteCommand4 = defineCommand218({
58224
58371
  meta: {
58225
58372
  name: "delete",
58226
58373
  description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
@@ -58260,8 +58407,83 @@ var deleteCommand4 = defineCommand217({
58260
58407
  }
58261
58408
  });
58262
58409
 
58410
+ // src/commands/videos/describe.ts
58411
+ import { defineCommand as defineCommand219 } from "citty";
58412
+ var DESCRIPTION_HELP2 = "What the clip actually shows, in the words someone would search for it by. This is what `baker videos search` retrieves on.";
58413
+ registerSchema({
58414
+ command: "videos.describe",
58415
+ description: "Correct a library video's stored name, description or tags. Start here when a clip's description is wrong \u2014 it is what semantic search reads.",
58416
+ args: {
58417
+ id: { type: "string", description: "Video ID", required: true },
58418
+ description: { type: "string", description: DESCRIPTION_HELP2, required: false },
58419
+ name: { type: "string", description: "Short human label for the clip", required: false },
58420
+ tags: {
58421
+ type: "string",
58422
+ description: "Tags for the clip \u2014 repeatable (`--tags a --tags b`) or one comma list. **Replaces** the existing set",
58423
+ required: false
58424
+ },
58425
+ full: { type: "boolean", description: "Return the whole library row, not just what changed", required: false }
58426
+ }
58427
+ });
58428
+ var describeCommand2 = defineCommand219({
58429
+ meta: {
58430
+ name: "describe",
58431
+ description: `Correct what the library says a video is. Only the fields you pass change; the rest keep their current values.
58432
+
58433
+ Start here when a search keeps missing a clip you know is there, or when the AI description got the subject wrong.
58434
+
58435
+ Example: baker videos describe j571abc123 --description "Customer explaining how onboarding cut their setup from a week to a day" --tags testimonial`
58436
+ },
58437
+ args: {
58438
+ id: { type: "positional", description: "Video ID", required: false },
58439
+ "video-id": { type: "string", description: "Video ID (alternative to positional)", required: false },
58440
+ description: { type: "string", description: DESCRIPTION_HELP2, required: false },
58441
+ name: { type: "string", description: "Short human label for the clip", required: false },
58442
+ tags: {
58443
+ type: "string",
58444
+ description: "Tags for the clip \u2014 repeatable (`--tags a --tags b`) or one comma list. **Replaces** the existing set",
58445
+ required: false
58446
+ },
58447
+ full: { type: "boolean", description: "Return the whole library row", required: false, default: false }
58448
+ },
58449
+ run: async ({ args, rawArgs }) => {
58450
+ const id = args.id || args["video-id"];
58451
+ if (!id) {
58452
+ writeJson({ ok: false, error: { code: "VALIDATION_ERROR", message: "Video ID is required" } });
58453
+ process.exit(1);
58454
+ }
58455
+ const fields = describeFields(args, rawArgs);
58456
+ if (fields.name === void 0 && fields.description === void 0 && fields.tags === void 0) {
58457
+ writeJson({
58458
+ ok: false,
58459
+ error: {
58460
+ code: "VALIDATION_ERROR",
58461
+ message: "Nothing to change",
58462
+ fix: "Pass at least one of --description, --name or --tags."
58463
+ }
58464
+ });
58465
+ process.exit(1);
58466
+ }
58467
+ try {
58468
+ validateConvexId(id);
58469
+ const body = { id, ...fields };
58470
+ if (args.full) body.full = true;
58471
+ const data = await apiPost("/api/videos/describe", body);
58472
+ writeJson({ ok: true, data, hints: describeHints("videos", fields) });
58473
+ } catch (err) {
58474
+ if (err instanceof ApiError) {
58475
+ const fix = describeErrorFix(err.code, "videos");
58476
+ writeJson({ ok: false, error: { code: err.code, message: err.message, ...fix ? { fix } : {} } });
58477
+ process.exit(1);
58478
+ }
58479
+ writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
58480
+ process.exit(1);
58481
+ }
58482
+ }
58483
+ });
58484
+
58263
58485
  // src/commands/videos/get.ts
58264
- import { defineCommand as defineCommand218 } from "citty";
58486
+ import { defineCommand as defineCommand220 } from "citty";
58265
58487
  registerSchema({
58266
58488
  command: "videos.get",
58267
58489
  description: "Get a single video by ID",
@@ -58269,7 +58491,7 @@ registerSchema({
58269
58491
  id: { type: "string", description: "Video ID", required: true }
58270
58492
  }
58271
58493
  });
58272
- var getCommand7 = defineCommand218({
58494
+ var getCommand7 = defineCommand220({
58273
58495
  meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
58274
58496
  args: {
58275
58497
  id: { type: "positional", description: "Video ID", required: false },
@@ -58306,7 +58528,7 @@ var getCommand7 = defineCommand218({
58306
58528
  });
58307
58529
 
58308
58530
  // src/commands/videos/group.ts
58309
- import { defineCommand as defineCommand219 } from "citty";
58531
+ import { defineCommand as defineCommand221 } from "citty";
58310
58532
  registerSchema({
58311
58533
  command: "videos.group",
58312
58534
  description: "List every clip and image that arrived in the same set as this video (carousel slides, one page)",
@@ -58315,7 +58537,7 @@ registerSchema({
58315
58537
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
58316
58538
  }
58317
58539
  });
58318
- var groupCommand2 = defineCommand219({
58540
+ var groupCommand2 = defineCommand221({
58319
58541
  meta: {
58320
58542
  name: "group",
58321
58543
  description: "List every asset that arrived in the same set as this clip \u2014 the other slides of the Instagram post it came from, stills included. A carousel is authored to be read in order, so a clip pulled out of one is usually missing half its meaning. Example: baker videos group <videoId>"
@@ -58338,7 +58560,7 @@ var groupCommand2 = defineCommand219({
58338
58560
  import { mkdtemp as mkdtemp2, rm as rm8, stat as stat10 } from "fs/promises";
58339
58561
  import { tmpdir as tmpdir3 } from "os";
58340
58562
  import path44 from "path";
58341
- import { defineCommand as defineCommand220 } from "citty";
58563
+ import { defineCommand as defineCommand222 } from "citty";
58342
58564
 
58343
58565
  // src/lib/streamUpload.ts
58344
58566
  import { createHash as createHash2 } from "crypto";
@@ -58502,7 +58724,7 @@ registerSchema({
58502
58724
  "dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
58503
58725
  }
58504
58726
  });
58505
- var ingestCommand2 = defineCommand220({
58727
+ var ingestCommand2 = defineCommand222({
58506
58728
  meta: {
58507
58729
  name: "ingest",
58508
58730
  description: "Add a video to the library from a URL. A direct file URL is handed straight to Baker, which fetches it. A page URL (YouTube, TikTok, Vimeo, Instagram) is downloaded here first, then uploaded \u2014 and a direct URL that Baker cannot fetch falls back to that same path automatically.\n\nExample: baker videos ingest https://www.youtube.com/watch?v=abc123"
@@ -58764,7 +58986,7 @@ async function uploadToAssetStore(filePath, sizeBytes) {
58764
58986
  }
58765
58987
 
58766
58988
  // src/commands/videos/search.ts
58767
- import { defineCommand as defineCommand221 } from "citty";
58989
+ import { defineCommand as defineCommand223 } from "citty";
58768
58990
  registerSchema({
58769
58991
  command: "videos.search",
58770
58992
  description: "Search videos by text query. Only returns ready videos.",
@@ -58774,7 +58996,7 @@ registerSchema({
58774
58996
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
58775
58997
  }
58776
58998
  });
58777
- var searchCommand4 = defineCommand221({
58999
+ var searchCommand4 = defineCommand223({
58778
59000
  meta: {
58779
59001
  name: "search",
58780
59002
  description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
@@ -58826,7 +59048,7 @@ var tagsCommand6 = makeTagsCommand("videos", "video", "/api/videos/tags");
58826
59048
  // src/commands/videos/upload.ts
58827
59049
  import { readFile as readFile30, stat as stat11 } from "fs/promises";
58828
59050
  import { basename as basename3, extname as extname4 } from "path";
58829
- import { defineCommand as defineCommand222 } from "citty";
59051
+ import { defineCommand as defineCommand224 } from "citty";
58830
59052
  var MIME_MAP = {
58831
59053
  ".mp4": "video/mp4",
58832
59054
  ".mov": "video/quicktime",
@@ -58868,7 +59090,7 @@ function detectContentType(filePath) {
58868
59090
  function isRemoteUrl3(value) {
58869
59091
  return /^https?:\/\//i.test(value);
58870
59092
  }
58871
- var uploadCommand2 = defineCommand222({
59093
+ var uploadCommand2 = defineCommand224({
58872
59094
  meta: {
58873
59095
  name: "upload",
58874
59096
  description: "Upload a video to Baker \u2014 accepts a local file path OR a remote http(s) URL.\n\nLocal: auto-detects content type and uploads via Mux direct upload.\nRemote: hands off to `videos ingest` (direct fetch, or download-then-upload for a YouTube/TikTok/Vimeo page).\n\nExamples:\n baker videos upload ./demo.mp4\n baker videos upload https://www.youtube.com/watch?v=abc123"
@@ -58952,10 +59174,10 @@ var uploadCommand2 = defineCommand222({
58952
59174
  });
58953
59175
 
58954
59176
  // src/commands/videos/index.ts
58955
- var videosCommand = defineCommand223({
59177
+ var videosCommand = defineCommand225({
58956
59178
  meta: {
58957
59179
  name: "videos",
58958
- description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, delete, tags.
59180
+ description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, describe, delete, tags.
58959
59181
 
58960
59182
  Examples:
58961
59183
  baker videos search "product demo" --limit 5
@@ -58963,6 +59185,7 @@ Examples:
58963
59185
  baker videos get <video-id>
58964
59186
  baker videos upload ./demo.mp4
58965
59187
  baker videos ingest https://www.youtube.com/watch?v=abc123
59188
+ baker videos describe <video-id> --description "Customer testimonial, 30s"
58966
59189
  baker videos delete <video-id> --dry-run
58967
59190
  baker videos tags
58968
59191
  Full guide: __tooling__/docs/tools/baker/videos.md`
@@ -58973,16 +59196,17 @@ Full guide: __tooling__/docs/tools/baker/videos.md`
58973
59196
  search: searchCommand4,
58974
59197
  upload: uploadCommand2,
58975
59198
  ingest: ingestCommand2,
59199
+ describe: describeCommand2,
58976
59200
  delete: deleteCommand4,
58977
59201
  tags: tagsCommand6
58978
59202
  }
58979
59203
  });
58980
59204
 
58981
59205
  // src/commands/winning-ads/index.ts
58982
- import { defineCommand as defineCommand236 } from "citty";
59206
+ import { defineCommand as defineCommand238 } from "citty";
58983
59207
 
58984
59208
  // src/commands/winning-ads/advertisers.ts
58985
- import { defineCommand as defineCommand224 } from "citty";
59209
+ import { defineCommand as defineCommand226 } from "citty";
58986
59210
 
58987
59211
  // src/commands/winning-ads/shared.ts
58988
59212
  function splitList2(value) {
@@ -59035,7 +59259,7 @@ function advertiserNormalizer(record, full) {
59035
59259
  last_synced_at: record.last_synced_at ?? null
59036
59260
  };
59037
59261
  }
59038
- var advertisersCommand2 = defineCommand224({
59262
+ var advertisersCommand2 = defineCommand226({
59039
59263
  meta: {
59040
59264
  name: "advertisers",
59041
59265
  description: 'List corpus advertisers by name or domain. Find your own advertiser for --exclude-advertiser, or a competitor for --advertiser-id / winners. Example: baker winning-ads advertisers "Deel" --output md'
@@ -59093,7 +59317,7 @@ var advertisersCommand2 = defineCommand224({
59093
59317
  });
59094
59318
 
59095
59319
  // src/commands/winning-ads/brief.ts
59096
- import { defineCommand as defineCommand225 } from "citty";
59320
+ import { defineCommand as defineCommand227 } from "citty";
59097
59321
  registerSchema({
59098
59322
  command: "winning-ads.brief",
59099
59323
  description: "Generate a creative brief grounded in strategically-similar winning ads. Optionally describe the target creative with --dna (JSON) and steer with --notes.",
@@ -59139,7 +59363,7 @@ function parseDna(raw) {
59139
59363
  }
59140
59364
  return parsed;
59141
59365
  }
59142
- var briefCommand = defineCommand225({
59366
+ var briefCommand = defineCommand227({
59143
59367
  meta: {
59144
59368
  name: "brief",
59145
59369
  description: `Generate a creative brief from winning references. Example: baker winning-ads brief --dna '{"angle":"cost savings"}' --notes "B2B, LinkedIn video" --k 8`
@@ -59175,7 +59399,7 @@ var briefCommand = defineCommand225({
59175
59399
  });
59176
59400
 
59177
59401
  // src/commands/winning-ads/content.ts
59178
- import { defineCommand as defineCommand226 } from "citty";
59402
+ import { defineCommand as defineCommand228 } from "citty";
59179
59403
  registerSchema({
59180
59404
  command: "winning-ads.content",
59181
59405
  description: "Read what's INSIDE one winning ad: the spoken transcript, the on-screen text, and the ad copy. Use this after `search`/`winners`/`feed` return a shortlist \u2014 pass an ad_id to understand a reference before reproducing it. Add --full for speech, pacing, and soundtrack detail. Video ads carry the transcript/on-screen text; static ads carry only the copy.",
@@ -59188,7 +59412,7 @@ registerSchema({
59188
59412
  }
59189
59413
  }
59190
59414
  });
59191
- var contentCommand = defineCommand226({
59415
+ var contentCommand = defineCommand228({
59192
59416
  meta: {
59193
59417
  name: "content",
59194
59418
  description: "Read the transcript + on-screen text + copy of one winning ad. Example: baker winning-ads content adg_123 --platform meta --full --output md"
@@ -59237,7 +59461,7 @@ var contentCommand = defineCommand226({
59237
59461
  });
59238
59462
 
59239
59463
  // src/commands/winning-ads/feed.ts
59240
- import { defineCommand as defineCommand227 } from "citty";
59464
+ import { defineCommand as defineCommand229 } from "citty";
59241
59465
  function buildFeedParams(input) {
59242
59466
  const params = {};
59243
59467
  const advertiser = splitList2(input.advertiser);
@@ -59289,7 +59513,7 @@ registerSchema({
59289
59513
  format: { type: "string", description: "Comma-separated formats to include (e.g. static,video)", required: false }
59290
59514
  }
59291
59515
  });
59292
- var feedCommand = defineCommand227({
59516
+ var feedCommand = defineCommand229({
59293
59517
  meta: {
59294
59518
  name: "feed",
59295
59519
  description: "Winners across every brand you follow (browse, then trim per advertiser). Example: baker winning-ads feed --per-advertiser 5 --output md"
@@ -59374,7 +59598,7 @@ var feedCommand = defineCommand227({
59374
59598
  });
59375
59599
 
59376
59600
  // src/commands/winning-ads/follow.ts
59377
- import { defineCommand as defineCommand228 } from "citty";
59601
+ import { defineCommand as defineCommand230 } from "citty";
59378
59602
  var PLATFORMS = adLibraryPlatformSchema.options;
59379
59603
  registerSchema({
59380
59604
  command: "winning-ads.follow",
@@ -59389,7 +59613,7 @@ registerSchema({
59389
59613
  label: { type: "string", description: "Optional display label (defaults to the resolved name)", required: false }
59390
59614
  }
59391
59615
  });
59392
- var followCommand = defineCommand228({
59616
+ var followCommand = defineCommand230({
59393
59617
  meta: {
59394
59618
  name: "follow",
59395
59619
  description: 'Follow a brand to track ALL its ads \u2014 every platform and country. --platform is how we read your input, not a limit. A domain tracks every platform we can resolve. Example: baker winning-ads follow "deel.com" --platform meta'
@@ -59436,7 +59660,7 @@ var followCommand = defineCommand228({
59436
59660
  });
59437
59661
 
59438
59662
  // src/commands/winning-ads/follow-competitors.ts
59439
- import { defineCommand as defineCommand229 } from "citty";
59663
+ import { defineCommand as defineCommand231 } from "citty";
59440
59664
  var PLATFORMS2 = adLibraryPlatformSchema.options;
59441
59665
  var BATCH_TIMEOUT_MS = 3e5;
59442
59666
  function buildFollowBatchBody(input) {
@@ -59469,7 +59693,7 @@ registerSchema({
59469
59693
  }
59470
59694
  }
59471
59695
  });
59472
- var followCompetitorsCommand = defineCommand229({
59696
+ var followCompetitorsCommand = defineCommand231({
59473
59697
  meta: {
59474
59698
  name: "follow-competitors",
59475
59699
  description: 'Follow many brands at once by domain \u2014 add every competitor in one call. Example: baker winning-ads follow-competitors "deel.com,notion.so,hubspot.com"'
@@ -59544,7 +59768,7 @@ var followCompetitorsCommand = defineCommand229({
59544
59768
  });
59545
59769
 
59546
59770
  // src/commands/winning-ads/following.ts
59547
- import { defineCommand as defineCommand230 } from "citty";
59771
+ import { defineCommand as defineCommand232 } from "citty";
59548
59772
  registerSchema({
59549
59773
  command: "winning-ads.following",
59550
59774
  description: "List the brands you follow in your ad-dna library, with each one's status (ready vs still adding) and cached ad counts. A brand still adding has counts that are a lie in progress; one with `discovery_failed` has counts that are short because we couldn't finish looking, which is not the same as it running no ads.",
@@ -59598,7 +59822,7 @@ function followingNormalizer(record, full) {
59598
59822
  platforms: Array.isArray(record.platforms) ? record.platforms : []
59599
59823
  };
59600
59824
  }
59601
- var followingCommand = defineCommand230({
59825
+ var followingCommand = defineCommand232({
59602
59826
  meta: {
59603
59827
  name: "following",
59604
59828
  description: "List brands you follow, with status (ready / adding\u2026) and cached counts. A brand's counts are only final once it is ready. Example: baker winning-ads following --output md"
@@ -59634,7 +59858,7 @@ var followingCommand = defineCommand230({
59634
59858
  });
59635
59859
 
59636
59860
  // src/commands/winning-ads/patterns.ts
59637
- import { defineCommand as defineCommand231 } from "citty";
59861
+ import { defineCommand as defineCommand233 } from "citty";
59638
59862
  registerSchema({
59639
59863
  command: "winning-ads.patterns",
59640
59864
  description: "Mine what separates two cohorts of ads: pass a comma-list of winning ad ids (--winners) and a comma-list of weaker ad ids (--duds). Returns the discriminating DNA fields.",
@@ -59673,7 +59897,7 @@ function discriminatorRow(record) {
59673
59897
  top_values_duds: Array.isArray(record.top_values_b) ? record.top_values_b.join(", ") : ""
59674
59898
  };
59675
59899
  }
59676
- var patternsCommand = defineCommand231({
59900
+ var patternsCommand = defineCommand233({
59677
59901
  meta: {
59678
59902
  name: "patterns",
59679
59903
  description: "Discover what separates winning ads from weak ones. Example: baker winning-ads patterns --winners a_1,a_2,a_3 --duds a_9,a_8 --output md"
@@ -59729,7 +59953,7 @@ var patternsCommand = defineCommand231({
59729
59953
  });
59730
59954
 
59731
59955
  // src/commands/winning-ads/search.ts
59732
- import { defineCommand as defineCommand232 } from "citty";
59956
+ import { defineCommand as defineCommand234 } from "citty";
59733
59957
  registerSchema({
59734
59958
  command: "winning-ads.search",
59735
59959
  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.",
@@ -59837,7 +60061,7 @@ function buildSearchBody2(args) {
59837
60061
  }
59838
60062
  return body;
59839
60063
  }
59840
- var searchCommand5 = defineCommand232({
60064
+ var searchCommand5 = defineCommand234({
59841
60065
  meta: {
59842
60066
  name: "search",
59843
60067
  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"
@@ -59952,7 +60176,7 @@ var searchCommand5 = defineCommand232({
59952
60176
  });
59953
60177
 
59954
60178
  // src/commands/winning-ads/seeds.ts
59955
- import { defineCommand as defineCommand233 } from "citty";
60179
+ import { defineCommand as defineCommand235 } from "citty";
59956
60180
  function leanRow(r) {
59957
60181
  return {
59958
60182
  key: r.key,
@@ -59980,7 +60204,7 @@ function makeSeedCommand(opts) {
59980
60204
  limit: { type: "number", description: "Max keys 1-100 (default 20)", required: false, default: 20 }
59981
60205
  }
59982
60206
  });
59983
- return defineCommand233({
60207
+ return defineCommand235({
59984
60208
  meta: { name: opts.name, description: opts.description },
59985
60209
  args: {
59986
60210
  platform: { type: "string", description: "Single platform to segment on", required: false },
@@ -60029,7 +60253,7 @@ var formatsCommand = makeSeedCommand({
60029
60253
  });
60030
60254
 
60031
60255
  // src/commands/winning-ads/unfollow.ts
60032
- import { defineCommand as defineCommand234 } from "citty";
60256
+ import { defineCommand as defineCommand236 } from "citty";
60033
60257
  registerSchema({
60034
60258
  command: "winning-ads.unfollow",
60035
60259
  description: "Stop following a brand \u2014 removes it from your ad-dna library by advertiser id.",
@@ -60037,7 +60261,7 @@ registerSchema({
60037
60261
  advertiser: { type: "string", description: "Advertiser id to unfollow", required: true }
60038
60262
  }
60039
60263
  });
60040
- var unfollowCommand = defineCommand234({
60264
+ var unfollowCommand = defineCommand236({
60041
60265
  meta: {
60042
60266
  name: "unfollow",
60043
60267
  description: "Stop following a brand by advertiser id. Example: baker winning-ads unfollow adv_123"
@@ -60058,7 +60282,7 @@ var unfollowCommand = defineCommand234({
60058
60282
  });
60059
60283
 
60060
60284
  // src/commands/winning-ads/winners.ts
60061
- import { defineCommand as defineCommand235 } from "citty";
60285
+ import { defineCommand as defineCommand237 } from "citty";
60062
60286
  registerSchema({
60063
60287
  command: "winning-ads.winners",
60064
60288
  description: "Top winning ads for one advertiser id (from `advertisers` or `following`). Returns lean winner cards; add --full for DNA + longevity.",
@@ -60068,7 +60292,7 @@ registerSchema({
60068
60292
  platform: { type: "string", description: "Filter to a single platform: meta|linkedin|tiktok", required: false }
60069
60293
  }
60070
60294
  });
60071
- var winnersCommand = defineCommand235({
60295
+ var winnersCommand = defineCommand237({
60072
60296
  meta: {
60073
60297
  name: "winners",
60074
60298
  description: "Top winning ads for a specific advertiser id. Example: baker winning-ads winners adv_123 --top 15 --output md"
@@ -60118,7 +60342,7 @@ var winnersCommand = defineCommand235({
60118
60342
  });
60119
60343
 
60120
60344
  // src/commands/winning-ads/index.ts
60121
- var winningAdsCommand = defineCommand236({
60345
+ var winningAdsCommand = defineCommand238({
60122
60346
  meta: {
60123
60347
  name: "winning-ads",
60124
60348
  description: `Search the ad-dna corpus of scored "winning" ads for reference creatives to reproduce, and manage the brands your library tracks. Proxied through the Baker backend (BAKER_API_KEY) \u2014 no separate token needed.
@@ -60356,7 +60580,7 @@ function getCliVersion() {
60356
60580
  }
60357
60581
 
60358
60582
  // src/cli.ts
60359
- var main = defineCommand237({
60583
+ var main = defineCommand239({
60360
60584
  meta: {
60361
60585
  name: "baker",
60362
60586
  version: getCliVersion(),