@koda-sl/baker-cli 0.376.0-dev.494d5fded → 0.376.0-dev.945f4ff53

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
@@ -133,7 +133,7 @@ import {
133
133
  } from "./chunk-7YNOGIWQ.js";
134
134
 
135
135
  // src/cli.ts
136
- import { defineCommand as defineCommand255, runMain } from "citty";
136
+ import { defineCommand as defineCommand256, runMain } from "citty";
137
137
 
138
138
  // src/cache-flag.ts
139
139
  var NO_CACHE_ARG = {
@@ -5111,6 +5111,20 @@ var FLOW_SIDE_EFFECT_CATALOG = [
5111
5111
  reference: SIDE_EFFECT_REF("httpWebhook")
5112
5112
  },
5113
5113
  crmSideEffect("googleSpreadsheet", "Appends a row to a Google Sheet.", "columnMapping", MAP_FIRST),
5114
+ {
5115
+ kind: "side-effect",
5116
+ type: "shopifyCustomer",
5117
+ summary: "Adds a sign-up to the connected Shopify store with the consent they ticked.",
5118
+ skeleton: {
5119
+ ...SIDE_EFFECT_ENVELOPE,
5120
+ type: "shopifyCustomer",
5121
+ customer: { email: null, phone: null, acceptsEmailMarketing: null, acceptsSmsMarketing: null },
5122
+ offer: null
5123
+ },
5124
+ owners: { customer: "agent", offer: "agent" },
5125
+ gotcha: "Map email to an email field with baker flows map. Email and SMS consent each need their own optional, visible, initially unticked checkbox; SMS also needs phone. No connection secret is needed. An optional offer names a published sign-up offer; read baker shopify signup-offers. Show its code with ShopifySignupCode.",
5126
+ reference: SIDE_EFFECT_REF("shopifyCustomer")
5127
+ },
5114
5128
  crmSideEffect("hubspotForm", "Submits to a HubSpot form endpoint.", "fieldMapping", MAP_FIRST),
5115
5129
  crmSideEffect("pipedrive", "Creates or updates a Pipedrive record.", "fieldMapping", MAP_FIRST),
5116
5130
  crmSideEffect("goHighlevelContact", "Creates or updates a GoHighLevel contact.", "fieldMapping", MAP_FIRST),
@@ -8541,9 +8555,9 @@ function parsePriority(value, { allowClear }) {
8541
8555
  `Unknown --priority "${value}". Expected one of: ${ACTION_PRIORITIES.join(", ")}${allowClear ? ", or 'none' to clear" : ""}.`
8542
8556
  );
8543
8557
  }
8544
- function looksScheduled(name, description) {
8558
+ function looksScheduled(name, description2) {
8545
8559
  const haystack = fold(`${name}
8546
- ${description}`);
8560
+ ${description2}`);
8547
8561
  return SCHEDULE_SIGNALS.some((re2) => re2.test(haystack));
8548
8562
  }
8549
8563
  var CAMPAIGN_ENTITY = String.raw`(?:campaigns?|campanas?|ad\s*sets?|adsets?|ad\s*groups?|adgroups?|ads?|anuncios?|conjuntos?\s+de\s+anuncios|grupos?\s+de\s+anuncios)`;
@@ -8701,10 +8715,10 @@ var SURFACE_RULES = [
8701
8715
  var FAN_OUT_NUDGE_THRESHOLD = 2;
8702
8716
  var FAN_OUT_THRESHOLD = 3;
8703
8717
  var SCHEDULED_HINT = 'This reads as recurring/scheduled work. If it should run on a cadence or a future date, create a Scheduled agent instead \u2014 baker scheduled-agents create --cron "0 9 * * MON" (or --run-at, or --trigger for a reaction rather than a clock; guide: `__tooling__/docs/tools/baker/scheduled-agents.md`). Do not capture "set up a schedule" as a Work Action.';
8704
- function looksExecutable(name, description) {
8718
+ function looksExecutable(name, description2) {
8705
8719
  const foldedName = fold(name);
8706
8720
  const full = `${foldedName}
8707
- ${fold(description)}`;
8721
+ ${fold(description2)}`;
8708
8722
  for (const rule of SURFACE_RULES) {
8709
8723
  const haystack = rule.nameOnly ? foldedName : full;
8710
8724
  if (rule.except?.some((re2) => re2.test(full))) {
@@ -8724,7 +8738,7 @@ ${fold(description)}`;
8724
8738
  }
8725
8739
  function buildCreateHints({
8726
8740
  name,
8727
- description,
8741
+ description: description2,
8728
8742
  tempId,
8729
8743
  tags,
8730
8744
  prioritySet,
@@ -8732,13 +8746,13 @@ function buildCreateHints({
8732
8746
  }) {
8733
8747
  const hints2 = [];
8734
8748
  const expanded = shellExpandedIn(`${name}
8735
- ${description}`);
8749
+ ${description2}`);
8736
8750
  if (expanded) {
8737
8751
  hints2.push(
8738
8752
  `The text says \u201C${expanded}\u201D: the shell replaced a $ amount (like $0) inside double quotes before Baker saw it. Fix it now: baker actions update ${tempId} --description '<the text, with the amounts as you read them>' (and --name '\u2026' if the name has it) \u2014 single quotes keep $ as written.`
8739
8753
  );
8740
8754
  }
8741
- const advisory = advisoryHint(name, description);
8755
+ const advisory = advisoryHint(name, description2);
8742
8756
  if (advisory) {
8743
8757
  hints2.push(
8744
8758
  `${advisory.hint} If nothing actually blocks it: baker actions draft remove ${tempId}, then do the work.`
@@ -8754,7 +8768,7 @@ ${description}`);
8754
8768
  );
8755
8769
  }
8756
8770
  hints2.push(`Link dependencies: baker actions link --blocker <id> --blocked ${tempId}`);
8757
- if (!description) {
8771
+ if (!description2) {
8758
8772
  hints2.push("Add description: baker actions update <tempId> --description '...' (what/why/where/done-when)");
8759
8773
  }
8760
8774
  if (!tags || tags.length === 0) {
@@ -8772,11 +8786,11 @@ ${description}`);
8772
8786
  function shellExpandedIn(text2) {
8773
8787
  return /(?:^|[\s(])((?:\/usr)?\/bin\/(?:ba|z|da|k)?sh|-?(?:ba|z|da|k)sh)\b/.exec(text2)?.[1] ?? null;
8774
8788
  }
8775
- function advisoryHint(name, description) {
8776
- if (looksScheduled(name, description)) {
8789
+ function advisoryHint(name, description2) {
8790
+ if (looksScheduled(name, description2)) {
8777
8791
  return { kind: "scheduled", hint: SCHEDULED_HINT };
8778
8792
  }
8779
- const executable = looksExecutable(name, description);
8793
+ const executable = looksExecutable(name, description2);
8780
8794
  return executable ? { kind: "executable", ...executable } : null;
8781
8795
  }
8782
8796
  var ACTIONS_LIST_DEFAULT_LIMIT = 500;
@@ -8862,9 +8876,9 @@ function parseSkillFrontmatter(md) {
8862
8876
  const lines = extractFrontmatterLines(md);
8863
8877
  if (!lines) return null;
8864
8878
  const name = readField(lines, "name");
8865
- const description = readField(lines, "description");
8866
- if (!name || !description) return null;
8867
- const trimmed = description.length > DESCRIPTION_MAX ? `${description.slice(0, DESCRIPTION_MAX)}\u2026` : description;
8879
+ const description2 = readField(lines, "description");
8880
+ if (!name || !description2) return null;
8881
+ const trimmed = description2.length > DESCRIPTION_MAX ? `${description2.slice(0, DESCRIPTION_MAX)}\u2026` : description2;
8868
8882
  return { name, description: trimmed };
8869
8883
  }
8870
8884
  function findSkillsDir(startDir) {
@@ -14989,6 +15003,7 @@ var DESTINATION_NAMES = {
14989
15003
  googleSpreadsheet: "Google Sheets",
14990
15004
  hubspotForm: "HubSpot Form",
14991
15005
  goHighlevelContact: "GoHighLevel",
15006
+ shopifyCustomer: "Shopify",
14992
15007
  crmble: "Crmble"
14993
15008
  };
14994
15009
  function destinationKey(type) {
@@ -19550,9 +19565,9 @@ var assetGroupsCommand = defineCommand31({
19550
19565
  ])
19551
19566
  }
19552
19567
  });
19553
- function fileCreateCommand(name, kind, description, hints2) {
19568
+ function fileCreateCommand(name, kind, description2, hints2) {
19554
19569
  return defineCommand31({
19555
- meta: { name, description },
19570
+ meta: { name, description: description2 },
19556
19571
  args: { ...customerIdArg, ...fileArg },
19557
19572
  run: async ({ args: args5 }) => {
19558
19573
  const customerId = requireCustomerId(args5);
@@ -34093,7 +34108,7 @@ var eventsCommand = presetCommand({
34093
34108
  }
34094
34109
  },
34095
34110
  resolve: (args5) => {
34096
- const steps = args5.steps ? String(args5.steps).split(",").map((step2) => step2.trim()).filter((step2) => step2 !== "") : void 0;
34111
+ const steps = args5.steps ? String(args5.steps).split(",").map((step) => step.trim()).filter((step) => step !== "") : void 0;
34097
34112
  if (args5.property && !args5.event) {
34098
34113
  return {
34099
34114
  error: "Breaking an event down by a property needs --event too, e.g. --event video --property milestone"
@@ -37870,8 +37885,8 @@ function castAvatarsOnElements(elementsInput, avatars) {
37870
37885
  if (!avatar) return el;
37871
37886
  next += 1;
37872
37887
  if (el.label) byLabel.set(el.label, avatar);
37873
- const description = avatar.subjectDescription?.trim();
37874
- return { ...el, ...description ? { description } : {}, source_image: avatar.sheetUrl, source_is_sheet: true };
37888
+ const description2 = avatar.subjectDescription?.trim();
37889
+ return { ...el, ...description2 ? { description: description2 } : {}, source_image: avatar.sheetUrl, source_is_sheet: true };
37875
37890
  });
37876
37891
  return cast.map((el) => {
37877
37892
  const avatar = el.same_as ? byLabel.get(el.same_as) : void 0;
@@ -38166,7 +38181,7 @@ function buildFramePrompt(edge, sceneIndex, framePrompt, present2, hasAnchor, mo
38166
38181
  "- ORIGINAL_FRAME \u2014 use ONLY for composition: framing, camera angle, shot size, subject placement, pose, and proportions. IGNORE its text, logo, brand name, colors, AND the identity of every person/animal/object in it \u2014 those come from the labeled reference images above, never from this frame. It is a DIFFERENT brand's footage with DIFFERENT actors, here ONLY to anchor where things sit and how the shot is framed (e.g. a profile/side angle stays a profile/side angle), never who they are or what palette to use."
38167
38182
  ] : []
38168
38183
  ].join("\n");
38169
- const description = framePrompt?.trim() || `the ${edge} frame of scene ${sceneIndex + 1} \u2014 describe the full composition, subjects, setting, action, lighting, and palette here. (Edit this line to change ONLY this frame.)`;
38184
+ const description2 = framePrompt?.trim() || `the ${edge} frame of scene ${sceneIndex + 1} \u2014 describe the full composition, subjects, setting, action, lighting, and palette here. (Edit this line to change ONLY this frame.)`;
38170
38185
  const isHookFrame = sceneIndex === 0 && edge === "start";
38171
38186
  const cleanPlateBlock = [
38172
38187
  "CRITICAL \u2014 RENDER A CLEAN PLATE WITH ZERO TEXT OR GRAPHIC OVERLAYS:",
@@ -38244,7 +38259,7 @@ function buildFramePrompt(edge, sceneIndex, framePrompt, present2, hasAnchor, mo
38244
38259
  ""
38245
38260
  ] : [],
38246
38261
  "FRAME DESCRIPTION (this frame's editable prompt):",
38247
- description,
38262
+ description2,
38248
38263
  "",
38249
38264
  "Render exactly what the FRAME DESCRIPTION and the SHARED AD SPEC specify \u2014 this is the authoritative ad: its cast identity (via the reference images), palette, brand, and intent are law. Keep every recurring element identical to its reference image across all frames. Again: clean plate only \u2014 no rendered text, and no icons/stickers/emojis/badges (those live on the overlay layer).",
38250
38265
  "",
@@ -39100,8 +39115,8 @@ function localizeNumeralsForNative(text2, langCode) {
39100
39115
  if (!langCode || !INTEGER_SPELLERS[langCode]) return text2;
39101
39116
  return text2.replace(/(?<![\w.,-])\d{1,9}(?![\w.,-])/g, (m) => spellNumber(langCode, Number.parseInt(m, 10)));
39102
39117
  }
39103
- function parseVoiceTraits(description) {
39104
- const d = description.toLowerCase();
39118
+ function parseVoiceTraits(description2) {
39119
+ const d = description2.toLowerCase();
39105
39120
  const out = {};
39106
39121
  if (/\b(female|woman|women|girl|lady)\b/.test(d)) out.gender = "female";
39107
39122
  else if (/\b(male|man|men|guy|boy)\b/.test(d)) out.gender = "male";
@@ -39312,11 +39327,11 @@ function makeVoiceFactory(blueprint, canonical2, nodes, voiceLanguage, pinnedVoi
39312
39327
  const existing = bySpeaker.get(speaker);
39313
39328
  if (existing) return existing;
39314
39329
  const id = sanitizeId(`voice_${speaker}`, `voice_${bySpeaker.size}`);
39315
- const description = describe(speaker);
39316
- const traits = parseVoiceTraits(description);
39330
+ const description2 = describe(speaker);
39331
+ const traits = parseVoiceTraits(description2);
39317
39332
  if (voiceLanguage) traits.language = voiceLanguage;
39318
39333
  nodes.push(
39319
- pinnedVoiceId ? { id, type: "voice_select", params: { description, voice_id: pinnedVoiceId, ...traits } } : { id, type: "voice_select", params: { description, ...traits } }
39334
+ pinnedVoiceId ? { id, type: "voice_select", params: { description: description2, voice_id: pinnedVoiceId, ...traits } } : { id, type: "voice_select", params: { description: description2, ...traits } }
39320
39335
  );
39321
39336
  bySpeaker.set(speaker, id);
39322
39337
  return id;
@@ -41497,8 +41512,8 @@ function sceneAt(windows, atS) {
41497
41512
  function reviewFrameTimes(durationS, frames) {
41498
41513
  const n = Math.max(2, frames);
41499
41514
  const last = Math.max(0, durationS - 0.15);
41500
- const step2 = last / (n - 1);
41501
- return Array.from({ length: n }, (_, i) => Math.round(i * step2 * 100) / 100);
41515
+ const step = last / (n - 1);
41516
+ return Array.from({ length: n }, (_, i) => Math.round(i * step * 100) / 100);
41502
41517
  }
41503
41518
  function buildFrameGrabArgs(video, atS, out) {
41504
41519
  return [
@@ -42608,8 +42623,8 @@ function castAvatarsOnStaticElements(elementsInput, avatars) {
42608
42623
  const avatar = isPerson(el) ? avatars[next] : void 0;
42609
42624
  if (!avatar) return el;
42610
42625
  next += 1;
42611
- const description = avatar.subjectDescription?.trim();
42612
- return { ...el, ...description ? { description } : {}, source_image: avatar.sheetUrl };
42626
+ const description2 = avatar.subjectDescription?.trim();
42627
+ return { ...el, ...description2 ? { description: description2 } : {}, source_image: avatar.sheetUrl };
42613
42628
  });
42614
42629
  }
42615
42630
  function staticAvatarsNotCast(elementsInput, handles) {
@@ -43915,8 +43930,8 @@ function adSpecCastElements(spec, avatar) {
43915
43930
  ...spec.set?.image?.trim() ? { source_image: spec.set.image.trim() } : {}
43916
43931
  });
43917
43932
  }
43918
- const description = (avatar?.subjectDescription ?? spec.cast?.description)?.trim();
43919
- if (!description) return elements;
43933
+ const description2 = (avatar?.subjectDescription ?? spec.cast?.description)?.trim();
43934
+ if (!description2) return elements;
43920
43935
  const scenes = spec.beats.map((beat, i) => ({ beat, i })).filter(({ beat, i }) => beat.cast !== false && !(endCardWanted(spec) && i === lastIndex)).map(({ i }) => i);
43921
43936
  if (scenes.length === 0) return elements;
43922
43937
  const sheet = avatar?.sheetUrl?.trim();
@@ -43926,7 +43941,7 @@ function adSpecCastElements(spec, avatar) {
43926
43941
  // Same id the dialogue names as speaker: that pairing is what lets the engine see
43927
43942
  // the presenter as present in a scene and route it to native audio.
43928
43943
  cast_id: AD_CAST_ID,
43929
- description,
43944
+ description: description2,
43930
43945
  scenes,
43931
43946
  // An avatar's identity sheet IS the turnaround the engine would otherwise render,
43932
43947
  // so it is handed over as one. Left unmarked, the run paid to generate a sheet OF
@@ -48815,11 +48830,11 @@ function titleize(value) {
48815
48830
  return value.split(/[_-]+/).filter(Boolean).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ");
48816
48831
  }
48817
48832
  function resolveField(tree, ref) {
48818
- const { step: step2, name } = splitRef(ref, "customForm");
48833
+ const { step, name } = splitRef(ref, "customForm");
48819
48834
  const owners = fieldOwners(tree);
48820
48835
  const inventory = owners.map((owner2) => ` ${owner2.name} (${owner2.id}): ${owner2.fields.join(", ") || "(no fields)"}`).join("\n");
48821
48836
  const candidates = owners.filter(
48822
- (owner2) => owner2.fields.includes(name) && (!step2 || owner2.name === step2 || owner2.id === step2)
48837
+ (owner2) => owner2.fields.includes(name) && (!step || owner2.name === step || owner2.id === step)
48823
48838
  );
48824
48839
  if (candidates.length === 0) {
48825
48840
  throw new MappingError(`Form field "${ref}" does not exist in this form.`, inventory);
@@ -48858,14 +48873,14 @@ function resolveGlobal(tree, name) {
48858
48873
  return mention(id, id);
48859
48874
  }
48860
48875
  function resolveCode(tree, ref) {
48861
- const { step: step2, name } = splitRef(ref, "codeExecution");
48876
+ const { step, name } = splitRef(ref, "codeExecution");
48862
48877
  const owners = walkNodes(tree).flatMap((node) => {
48863
48878
  const exposed = externalOf(node).codeExecution?.exposedValues ?? [];
48864
48879
  const names = exposed.map((value) => value?.name).filter((value) => typeof value === "string");
48865
48880
  return names.length > 0 ? [{ id: String(node.id ?? ""), name: String(node.name ?? "step"), names }] : [];
48866
48881
  });
48867
48882
  const candidates = owners.filter(
48868
- (owner2) => owner2.names.includes(name) && (!step2 || owner2.name === step2 || owner2.id === step2)
48883
+ (owner2) => owner2.names.includes(name) && (!step || owner2.name === step || owner2.id === step)
48869
48884
  );
48870
48885
  if (candidates.length !== 1) {
48871
48886
  throw new MappingError(
@@ -48922,6 +48937,9 @@ var ADS_MATCHING = [
48922
48937
  "country"
48923
48938
  ];
48924
48939
  var MAPPING_SLOTS = {
48940
+ shopifyCustomer: [
48941
+ { kind: "record", key: "customer", allowed: ["email", "phone", "acceptsEmailMarketing", "acceptsSmsMarketing"] }
48942
+ ],
48925
48943
  googleSpreadsheet: [{ kind: "list", key: "columnMapping", addressedBy: "column" }],
48926
48944
  hubspotForm: [
48927
48945
  {
@@ -50090,7 +50108,7 @@ function formsNamedHere(forms) {
50090
50108
  }
50091
50109
  function unplacedFormHints(steps, forms, counted) {
50092
50110
  const onAStep = new Set(
50093
- steps.flatMap((step2) => (step2.triggers ?? []).flatMap((trigger) => trigger.eventKey ? [trigger.eventKey] : []))
50111
+ steps.flatMap((step) => (step.triggers ?? []).flatMap((trigger) => trigger.eventKey ? [trigger.eventKey] : []))
50094
50112
  );
50095
50113
  const unplaced = [];
50096
50114
  for (const form of forms) {
@@ -50568,12 +50586,12 @@ var FunnelArgsError = class extends Error {
50568
50586
  };
50569
50587
  function parseFunnelArgs(raw) {
50570
50588
  const steps = parseSteps(raw.steps);
50571
- const step2 = parseStep(raw.step);
50589
+ const step = parseStep(raw.step);
50572
50590
  const removeStep = parseRemoveStep(raw["remove-step"] ?? raw.removeStep);
50573
50591
  const preset = parsePreset(raw.preset);
50574
50592
  const addTrigger = parseWayIn(raw["add-trigger"] ?? raw.addTrigger, raw.event, "--add-trigger");
50575
50593
  const removeTrigger = parseWayIn(raw["remove-trigger"] ?? raw.removeTrigger, raw.event, "--remove-trigger");
50576
- const doors = [steps, step2, removeStep, preset, addTrigger, removeTrigger].filter(
50594
+ const doors = [steps, step, removeStep, preset, addTrigger, removeTrigger].filter(
50577
50595
  (door) => door !== void 0
50578
50596
  ).length;
50579
50597
  if (doors > 1) {
@@ -50587,7 +50605,7 @@ function parseFunnelArgs(raw) {
50587
50605
  }
50588
50606
  return {
50589
50607
  ...steps === void 0 ? {} : { steps },
50590
- ...step2 === void 0 ? {} : { step: step2 },
50608
+ ...step === void 0 ? {} : { step },
50591
50609
  ...removeStep === void 0 ? {} : { removeStep },
50592
50610
  ...preset === void 0 ? {} : { preset },
50593
50611
  ...addTrigger === void 0 ? {} : { addTrigger },
@@ -50676,16 +50694,16 @@ function parseRemoveStep(raw) {
50676
50694
  return raw.trim();
50677
50695
  }
50678
50696
  function refuseRetiredShapes(steps) {
50679
- for (const step2 of steps) {
50680
- if (typeof step2 !== "object" || step2 === null) continue;
50681
- const key = String(step2.key ?? "?");
50682
- if ("offlineConversions" in step2) {
50697
+ for (const step of steps) {
50698
+ if (typeof step !== "object" || step === null) continue;
50699
+ const key = String(step.key ?? "?");
50700
+ if ("offlineConversions" in step) {
50683
50701
  throw new FunnelArgsError(`Step "${key}" puts sends on the step, and a send belongs to the conversion.`, {
50684
50702
  action: "set_sends_on_the_conversion",
50685
50703
  explanation: "Drop `offlineConversions`. Name the outcome with `baker analytics conversions`, then `baker analytics sends --set --conversion <name> --platform <p> --tag <tagId> --event <e>`; the step reads its conversions' sends back as `sends[]`."
50686
50704
  });
50687
50705
  }
50688
- const triggers = step2.triggers;
50706
+ const triggers = step.triggers;
50689
50707
  if (!Array.isArray(triggers)) continue;
50690
50708
  const kinds = triggers.map(
50691
50709
  (trigger) => typeof trigger === "object" && trigger !== null ? trigger.kind : void 0
@@ -53257,7 +53275,7 @@ function workflowViewHints(workflow) {
53257
53275
  "This workflow is switched off, so nothing below it is running now \u2014 it may still have run while it was on. Say so before reporting on what it does."
53258
53276
  );
53259
53277
  }
53260
- const ordered = workflow.steps.filter((step2) => step2.type === "LIST_BRANCH" && (step2.branches?.length ?? 0) > 1);
53278
+ const ordered = workflow.steps.filter((step) => step.type === "LIST_BRANCH" && (step.branches?.length ?? 0) > 1);
53261
53279
  if (ordered.length > 0) {
53262
53280
  hints2.push(
53263
53281
  "Branches are listed in evaluation order and the first match wins. Check that no broad branch sits above a narrower one \u2014 if it does, the narrow branch never runs and nothing in HubSpot reports it."
@@ -60070,10 +60088,10 @@ async function scrollThroughPage(page) {
60070
60088
  await acrossNavigation(
60071
60089
  page,
60072
60090
  () => page.evaluate(async () => {
60073
- const step2 = 600;
60091
+ const step = 600;
60074
60092
  const pause = () => new Promise((resolve5) => setTimeout(resolve5, 250));
60075
60093
  for (let i = 0; i < 40; i++) {
60076
- window.scrollBy(0, step2);
60094
+ window.scrollBy(0, step);
60077
60095
  await pause();
60078
60096
  const reachedBottom = window.scrollY + window.innerHeight >= document.documentElement.scrollHeight - 2;
60079
60097
  if (reachedBottom) break;
@@ -64096,13 +64114,13 @@ var createCommand3 = defineCommand197({
64096
64114
  try {
64097
64115
  refuseAutoPublish(args5);
64098
64116
  const name = args5.name;
64099
- const description = args5.description;
64117
+ const description2 = args5.description;
64100
64118
  const prompt = args5.prompt;
64101
64119
  const template = typeof args5.template === "string" ? args5.template.trim() : "";
64102
64120
  if (template.length === 0 && (!name || name.trim().length === 0)) {
64103
64121
  failValidation4("--name is required. Or pass --template to use a recipe's name.");
64104
64122
  }
64105
- if (template.length === 0 && (!description || description.trim().length === 0)) {
64123
+ if (template.length === 0 && (!description2 || description2.trim().length === 0)) {
64106
64124
  failValidation4("--description is required. Or pass --template to use a recipe's line.");
64107
64125
  }
64108
64126
  if (template.length === 0 && (!prompt || prompt.trim().length === 0)) {
@@ -64113,7 +64131,7 @@ var createCommand3 = defineCommand197({
64113
64131
  const body = {
64114
64132
  chatId: requireChatId(),
64115
64133
  ...name?.trim() ? { name } : {},
64116
- ...description?.trim() ? { description } : {},
64134
+ ...description2?.trim() ? { description: description2 } : {},
64117
64135
  enabled: !args5.disabled,
64118
64136
  ...trigger,
64119
64137
  ...prompt ? { prompt } : {},
@@ -64793,7 +64811,7 @@ var schemaCommand2 = defineCommand208({
64793
64811
  });
64794
64812
 
64795
64813
  // src/commands/shopify/index.ts
64796
- import { defineCommand as defineCommand215 } from "citty";
64814
+ import { defineCommand as defineCommand216 } from "citty";
64797
64815
 
64798
64816
  // src/commands/shopify/buyers.ts
64799
64817
  import { defineCommand as defineCommand209 } from "citty";
@@ -65820,7 +65838,8 @@ var shopifyWriteEntitySchema = z52.enum([
65820
65838
  "discountCode",
65821
65839
  "urlRedirect",
65822
65840
  "marketingActivity",
65823
- "webPixel"
65841
+ "webPixel",
65842
+ "signupOffer"
65824
65843
  ]);
65825
65844
  var shopifyDraftOpKindSchema = z52.enum([
65826
65845
  "shopify.product.update",
@@ -65841,7 +65860,9 @@ var shopifyDraftOpKindSchema = z52.enum([
65841
65860
  "shopify.urlRedirect.delete",
65842
65861
  "shopify.marketingActivity.upsert",
65843
65862
  "shopify.marketingActivity.delete",
65844
- "shopify.webPixel.update"
65863
+ "shopify.webPixel.update",
65864
+ "shopify.signupOffer.set",
65865
+ "shopify.signupOffer.end"
65845
65866
  ]);
65846
65867
  var shopifyDecimalSchema = z52.string().regex(/^\d{1,12}(\.\d{1,4})?$/, 'write amounts as a decimal string, e.g. "19.95"');
65847
65868
  var tagSchema = z52.string().trim().min(1).max(255);
@@ -65963,6 +65984,27 @@ var marketingUpsertSchema = z52.object({
65963
65984
  medium: z52.string().trim().min(1).max(255)
65964
65985
  }).strict()
65965
65986
  }).strict();
65987
+ var signupOfferHandleSchema = z52.string().regex(/^[a-z0-9][a-z0-9-]{1,39}$/, "2\u201340 lowercase letters, digits and dashes, e.g. welcome-10");
65988
+ var signupOfferSetSchema = z52.object({
65989
+ /** What the store's staff see in front of each code, and the Store page's row. */
65990
+ name: z52.string().trim().min(1).max(80),
65991
+ value: discountValueSchema,
65992
+ appliesTo: discountAppliesToSchema,
65993
+ minimumSubtotal: shopifyDecimalSchema.optional(),
65994
+ /** Each code's life, from the moment it is given. */
65995
+ validForDays: z52.number().int().min(1).max(365),
65996
+ /** The offer stops giving codes after this; no code outlives it. */
65997
+ endsAt: isoDateTimeSchema.optional(),
65998
+ /** How many codes the offer gives in all. */
65999
+ maxCodes: z52.number().int().min(1).max(1e5).optional(),
66000
+ /** The start of every code (WELCOME-7Q2M9XKD); default: the handle in capitals. */
66001
+ codePrefix: z52.string().regex(/^[A-Z0-9]{2,12}$/, "2\u201312 capital letters or digits, e.g. WELCOME").optional(),
66002
+ combinesWith: z52.object({
66003
+ productDiscounts: z52.boolean().optional(),
66004
+ orderDiscounts: z52.boolean().optional(),
66005
+ shippingDiscounts: z52.boolean().optional()
66006
+ }).strict().optional()
66007
+ }).strict();
65966
66008
  var emptySchema = z52.object({}).strict();
65967
66009
  var opFields = {
65968
66010
  /** Optional caller-chosen ref for a create, so later ops in the batch can name it (`shopify_temp_…`). */
@@ -66008,7 +66050,19 @@ var shopifyDraftOpInputSchema = z52.discriminatedUnion("kind", [
66008
66050
  payload: emptySchema.optional(),
66009
66051
  ...opFields
66010
66052
  }),
66011
- z52.object({ kind: z52.literal("shopify.webPixel.update"), payload: emptySchema.optional(), ...opFields })
66053
+ z52.object({ kind: z52.literal("shopify.webPixel.update"), payload: emptySchema.optional(), ...opFields }),
66054
+ z52.object({
66055
+ kind: z52.literal("shopify.signupOffer.set"),
66056
+ target: signupOfferHandleSchema,
66057
+ payload: signupOfferSetSchema,
66058
+ ...opFields
66059
+ }),
66060
+ z52.object({
66061
+ kind: z52.literal("shopify.signupOffer.end"),
66062
+ target: signupOfferHandleSchema,
66063
+ payload: emptySchema.optional(),
66064
+ ...opFields
66065
+ })
66012
66066
  ]);
66013
66067
  var PAYLOAD_KEYS = new Map(
66014
66068
  shopifyDraftOpInputSchema.options.map((option) => {
@@ -67169,18 +67223,18 @@ var collectionUpdate = leaf(
67169
67223
  () => target3(args5, "collection")
67170
67224
  )
67171
67225
  );
67172
- function collectionVerb(verb, kind, description) {
67226
+ function collectionVerb(verb, kind, description2) {
67173
67227
  return leaf(
67174
67228
  `shopify.change.collection.${verb}`,
67175
- { name: verb, description },
67229
+ { name: verb, description: description2 },
67176
67230
  { collection: TARGET("Collection id, handle, link or a shopify_temp_ ref staged in this chat") },
67177
67231
  async (args5) => await stage([{ kind, target: target3(args5, "collection") }])
67178
67232
  );
67179
67233
  }
67180
- function membership(verb, kind, description) {
67234
+ function membership(verb, kind, description2) {
67181
67235
  return leaf(
67182
67236
  `shopify.change.collection.${verb}`,
67183
- { name: verb, description },
67237
+ { name: verb, description: description2 },
67184
67238
  {
67185
67239
  collection: TARGET("Collection id, handle, link or a shopify_temp_ ref"),
67186
67240
  products: TARGET("Products (ids, handles or links), space separated")
@@ -67230,6 +67284,60 @@ function discountPayload(args5) {
67230
67284
  combinesWith: combinesOf(args5.combines)
67231
67285
  });
67232
67286
  }
67287
+ function signupOfferPayload(args5) {
67288
+ return defined({
67289
+ name: args5.name,
67290
+ value: discountValue(args5),
67291
+ appliesTo: appliesToOf(args5),
67292
+ minimumSubtotal: args5.minimum,
67293
+ validForDays: numberOf3(args5["valid-days"]),
67294
+ endsAt: args5.ends,
67295
+ maxCodes: numberOf3(args5["max-codes"]),
67296
+ codePrefix: args5.prefix,
67297
+ combinesWith: combinesOf(args5.combines)
67298
+ });
67299
+ }
67300
+ var signupOfferSet = leaf(
67301
+ "shopify.change.signupOffer.set",
67302
+ {
67303
+ name: "set",
67304
+ description: 'Stage a sign-up offer. Changes money: ask the exact approval question returned by this command. Example: baker shopify change signup-offer set welcome-10 --name "Welcome" --percent 10 --valid-days 14 --max-codes 1000'
67305
+ },
67306
+ {
67307
+ handle: TARGET("Offer handle, e.g. welcome-10"),
67308
+ name: { type: "string", description: "Offer name", required: false },
67309
+ percent: { type: "string", description: "Percentage off (choose percent or amount)", required: false },
67310
+ amount: { type: "string", description: "Amount off in the store currency", required: false },
67311
+ products: { type: "string", description: "Product handles or ids, comma separated", required: false },
67312
+ collections: { type: "string", description: "Collection handles or ids, comma separated", required: false },
67313
+ minimum: { type: "string", description: "Minimum subtotal", required: false },
67314
+ "valid-days": { type: "string", description: "Each code lasts 1\u2013365 days", required: false },
67315
+ ends: { type: "string", description: "Offer end as ISO date and time; no code outlives it", required: false },
67316
+ "max-codes": { type: "string", description: "Total codes the offer may give, 1\u2013100000", required: false },
67317
+ prefix: { type: "string", description: "Code prefix: 2\u201312 uppercase letters or digits", required: false },
67318
+ combines: {
67319
+ type: "string",
67320
+ description: "Comma-separated product,order,shipping discounts to combine",
67321
+ required: false
67322
+ },
67323
+ ...JSON_ARGS
67324
+ },
67325
+ async (args5) => await stageFor(
67326
+ "shopify.signupOffer.set",
67327
+ args5,
67328
+ () => signupOfferPayload(args5),
67329
+ () => target3(args5, "offer handle")
67330
+ )
67331
+ );
67332
+ var signupOfferEnd = leaf(
67333
+ "shopify.change.signupOffer.end",
67334
+ {
67335
+ name: "end",
67336
+ description: "End a sign-up offer at Publish. Existing codes keep their terms. Example: baker shopify change signup-offer end welcome-10"
67337
+ },
67338
+ { handle: TARGET("Offer handle") },
67339
+ async (args5) => await stage([{ kind: "shopify.signupOffer.end", target: target3(args5, "offer handle") }])
67340
+ );
67233
67341
  var discountCreate = leaf(
67234
67342
  "shopify.change.discount.create",
67235
67343
  {
@@ -67355,7 +67463,7 @@ var measurementReconnect = leaf(
67355
67463
  {},
67356
67464
  async () => await stage([{ kind: "shopify.webPixel.update" }])
67357
67465
  );
67358
- var group = (name, description, subCommands) => defineCommand211({ meta: { name, description }, subCommands });
67466
+ var group = (name, description2, subCommands) => defineCommand211({ meta: { name, description: description2 }, subCommands });
67359
67467
  var changeCommand = defineCommand211({
67360
67468
  meta: {
67361
67469
  name: "change",
@@ -67372,6 +67480,7 @@ change can be put back with \`baker shopify undo\`. Prices and discounts need th
67372
67480
  baker shopify change measurement reconnect`
67373
67481
  },
67374
67482
  subCommands: {
67483
+ "signup-offer": group("signup-offer", "Stage or end a sign-up offer", { set: signupOfferSet, end: signupOfferEnd }),
67375
67484
  product: group("product", "Change a product's title, description, SEO, tags or type", { update: productUpdate }),
67376
67485
  variant: group("variant", "Change an option's SKU, barcode, weight or price", { update: variantUpdate }),
67377
67486
  field: group("field", "Set or remove a custom field", { set: fieldSet, remove: fieldRemove }),
@@ -67582,39 +67691,46 @@ import { defineCommand as defineCommand213 } from "citty";
67582
67691
  // src/commands/shopify/landingLinks.ts
67583
67692
  import { readdir as readdir16, readFile as readFile33, stat as stat11 } from "fs/promises";
67584
67693
  import path47 from "path";
67694
+ import { parse } from "@astrojs/compiler/sync";
67585
67695
  var PAGES_MAX = 300;
67586
67696
  var FILE_BYTES_MAX = 256 * 1024;
67587
67697
  function escaped(text2) {
67588
67698
  return text2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
67589
67699
  }
67590
- var BUY_COMPONENT = /<(?:ShopifyProduct|ShopifyBuyButton)\b/g;
67591
- var NAMED_PRODUCT = /\bproduct\s*(?:=\s*\{?\s*|:\s*)(["'`])([^"'`]*)\1/g;
67592
- function step(scan, char) {
67593
- if (scan.quote) return char === scan.quote ? { ...scan, quote: null } : scan;
67594
- if (char === '"' || char === "'" || char === "`") return { ...scan, quote: char };
67595
- if (char === "{") return { ...scan, depth: scan.depth + 1 };
67596
- if (char === "}") return { ...scan, depth: Math.max(0, scan.depth - 1) };
67597
- return scan;
67598
- }
67599
- function tagText(text2, start) {
67600
- let scan = { depth: 0, quote: null };
67601
- for (let index = start + 1; index < text2.length; index += 1) {
67602
- const char = text2[index];
67603
- if (char === ">" && scan.depth === 0 && !scan.quote) return text2.slice(start, index + 1);
67604
- scan = step(scan, char);
67605
- }
67606
- return text2.slice(start);
67607
- }
67608
- function namesProduct(text2, keys) {
67609
- const wanted = new Set([keys.handle.toLowerCase(), ...keys.productId ? [keys.productId] : []].filter(Boolean));
67610
- for (const tag of text2.matchAll(BUY_COMPONENT)) {
67611
- for (const named of tagText(text2, tag.index).matchAll(NAMED_PRODUCT)) {
67612
- if (wanted.has((named[2] ?? "").trim().toLowerCase())) return true;
67613
- }
67700
+ var BUY_COMPONENTS = /* @__PURE__ */ new Set(["ShopifyProduct", "ShopifyBuyButton"]);
67701
+ var STRING_LITERAL = /^\s*(["'`])([^"'`]*)\1\s*$/;
67702
+ var ITEM_PRODUCT = /\bproduct\s*:\s*(["'`])([^"'`]*)\1/g;
67703
+ function namedBy(attribute) {
67704
+ if (attribute.name === "product") {
67705
+ if (attribute.kind === "quoted" || attribute.kind === "template-literal") return [attribute.value];
67706
+ if (attribute.kind === "expression") return [STRING_LITERAL.exec(attribute.value)?.[2] ?? ""];
67707
+ }
67708
+ if (attribute.name === "items" && attribute.kind === "expression") {
67709
+ return [...attribute.value.matchAll(ITEM_PRODUCT)].map((match) => match[2] ?? "");
67710
+ }
67711
+ return [];
67712
+ }
67713
+ function componentProducts(node, into) {
67714
+ if (node.type === "component" && BUY_COMPONENTS.has(node.name)) {
67715
+ for (const attribute of node.attributes) into.push(...namedBy(attribute));
67716
+ }
67717
+ if ("children" in node) for (const child of node.children) componentProducts(child, into);
67718
+ return into;
67719
+ }
67720
+ function buyComponentProducts(file) {
67721
+ if (!file.path.endsWith(".astro")) return [];
67722
+ try {
67723
+ return componentProducts(parse(file.text, void 0).ast, []);
67724
+ } catch {
67725
+ return [];
67614
67726
  }
67615
- return false;
67616
67727
  }
67617
- function evidenceIn(text2, keys) {
67728
+ function namesProduct(file, keys) {
67729
+ const wanted = new Set([keys.handle.toLowerCase(), ...keys.productId ? [keys.productId] : []].filter(Boolean));
67730
+ return buyComponentProducts(file).some((named) => wanted.has(named.trim().toLowerCase()));
67731
+ }
67732
+ function evidenceIn(file, keys) {
67733
+ const { text: text2 } = file;
67618
67734
  const evidence = [];
67619
67735
  if (keys.buyUrls.some((url) => url && text2.includes(url))) evidence.push("buy_link");
67620
67736
  const page = new RegExp(`/products/${escaped(keys.handle)}(?![A-Za-z0-9_-])`, "i");
@@ -67623,13 +67739,13 @@ function evidenceIn(text2, keys) {
67623
67739
  (id) => new RegExp(`(?:/cart/(?:\\d+:\\d+,)*${id}:|variant=${id}(?!\\d))`).test(text2)
67624
67740
  );
67625
67741
  if (option) evidence.push("variant_id");
67626
- if (namesProduct(text2, keys)) evidence.push("buy_button");
67742
+ if (namesProduct(file, keys)) evidence.push("buy_button");
67627
67743
  return evidence;
67628
67744
  }
67629
67745
  function landingLinksOf(pages, keys) {
67630
67746
  const bySlug = /* @__PURE__ */ new Map();
67631
67747
  for (const page of pages) {
67632
- const found = new Set(page.files.flatMap((file) => evidenceIn(file.text, keys)));
67748
+ const found = new Set(page.files.flatMap((file) => evidenceIn(file, keys)));
67633
67749
  if (found.size === 0) continue;
67634
67750
  const slug = page.slug.replace(/--\d+$/, "");
67635
67751
  const held = bySlug.get(slug) ?? /* @__PURE__ */ new Set();
@@ -67937,8 +68053,94 @@ var stockHoldsCommand = defineCommand213({
67937
68053
  }
67938
68054
  });
67939
68055
 
67940
- // src/commands/shopify/tracking.ts
68056
+ // ../api/src/shopify/signups.ts
68057
+ import { z as z53 } from "zod";
68058
+ var SIGNUP_CODE_PATTERN = /^[A-Z0-9]{2,12}-[0-9A-HJKMNP-TV-Z]{8}$/;
68059
+ var SIGNUP_STATES = [
68060
+ "waiting",
68061
+ "ready",
68062
+ "used",
68063
+ "expired",
68064
+ "already",
68065
+ "ended",
68066
+ "none",
68067
+ "unavailable"
68068
+ ];
68069
+ var CODE_STATES = /* @__PURE__ */ new Set(["ready", "used", "expired"]);
68070
+ var shopifySignupReplySchema = z53.object({
68071
+ state: z53.enum(SIGNUP_STATES),
68072
+ code: z53.string().regex(SIGNUP_CODE_PATTERN).optional(),
68073
+ endsAt: z53.string().min(1).max(40).optional()
68074
+ }).strict().refine(
68075
+ (reply) => CODE_STATES.has(reply.state) ? reply.code !== void 0 && reply.endsAt !== void 0 : true,
68076
+ "a code state carries the code and when it ends"
68077
+ ).refine(
68078
+ (reply) => CODE_STATES.has(reply.state) ? true : reply.code === void 0 && reply.endsAt === void 0,
68079
+ "only the browser the code was given to is told it"
68080
+ );
68081
+ var shopifySignupResponseSchema = z53.union([
68082
+ z53.object({ ok: z53.literal(true), signup: shopifySignupReplySchema }).passthrough(),
68083
+ z53.object({ error: z53.string(), signup: shopifySignupReplySchema }).passthrough()
68084
+ ]);
68085
+ var signupOfferStatusSchema = z53.enum(["active", "ended", "staged"]);
68086
+ var shopifySignupOfferViewSchema = z53.object({
68087
+ handle: z53.string(),
68088
+ name: z53.string(),
68089
+ /** "10% off everything, each code valid 14 days, at most 1,000 codes". */
68090
+ summary: z53.string(),
68091
+ status: signupOfferStatusSchema,
68092
+ validForDays: z53.number(),
68093
+ endsAt: z53.string().optional(),
68094
+ maxCodes: z53.number().optional(),
68095
+ codesGiven: z53.number()
68096
+ });
68097
+ var shopifySignupOffersResponseSchema = z53.object({
68098
+ /** The store allows Baker to add customers (sign-ups work). */
68099
+ canAddCustomers: z53.boolean(),
68100
+ /** The store allows Baker to make discount codes (offers give codes). */
68101
+ canGiveCodes: z53.boolean(),
68102
+ offers: z53.array(shopifySignupOfferViewSchema),
68103
+ /** Sign-ups the store didn't take in the last 7 days: for a missing permission, and for anything else. */
68104
+ refusedLast7Days: z53.object({ permission: z53.number(), other: z53.number() })
68105
+ });
68106
+
68107
+ // src/commands/shopify/signupOffers.ts
67941
68108
  import { defineCommand as defineCommand214 } from "citty";
68109
+ var description = "Start here for landing sign-ups: published and this chat's staged offers, codes given and store permissions. Example: baker shopify signup-offers. Forms name an offer handle; terms are staged with baker shopify change signup-offer set.";
68110
+ registerSchema({ command: "shopify.signupOffers", description, args: {} });
68111
+ var signupOffersCommand = defineCommand214({
68112
+ meta: { name: "signup-offers", description },
68113
+ async run() {
68114
+ try {
68115
+ const data = shopifySignupOffersResponseSchema.parse(
68116
+ await apiGet("/api/shopify/signup-offers", params({ chatId: optionalChatId() }))
68117
+ );
68118
+ const hints2 = [];
68119
+ if (!data.canAddCustomers)
68120
+ hints2.push(
68121
+ 'Sign-ups cannot be added to the store yet: call request_connection with { platform: "shopify", reason: "Add sign-ups from your landing" }. Keep building the page; the Form works once allowed.'
68122
+ );
68123
+ if (!data.canGiveCodes)
68124
+ hints2.push(
68125
+ "Codes need the store to allow discounts: use request_connection for Shopify and keep building the page."
68126
+ );
68127
+ if (data.offers.some((offer) => offer.status === "ended"))
68128
+ hints2.push(
68129
+ "Forms naming ended offers still add customers but give no code: stage a new offer or remove offer from the Form."
68130
+ );
68131
+ if (data.offers.length === 0)
68132
+ hints2.push(
68133
+ "No sign-up offer exists yet. Omit offer for sign-ups without a code, or stage one after the user approves its terms."
68134
+ );
68135
+ writeJson({ ok: true, hints: hints2, data });
68136
+ } catch (error) {
68137
+ fail9(error);
68138
+ }
68139
+ }
68140
+ });
68141
+
68142
+ // src/commands/shopify/tracking.ts
68143
+ import { defineCommand as defineCommand215 } from "citty";
67942
68144
  var audit = leaf(
67943
68145
  "shopify.tracking.audit",
67944
68146
  {
@@ -67955,7 +68157,7 @@ var audit = leaf(
67955
68157
  }
67956
68158
  }
67957
68159
  );
67958
- var trackingCommand2 = defineCommand214({
68160
+ var trackingCommand2 = defineCommand215({
67959
68161
  meta: { name: "tracking", description: "Check how the store is measured: baker shopify tracking audit" },
67960
68162
  subCommands: { audit }
67961
68163
  });
@@ -68088,7 +68290,7 @@ registerSchema({
68088
68290
  }
68089
68291
  }
68090
68292
  });
68091
- var salesCommand = defineCommand215({
68293
+ var salesCommand = defineCommand216({
68092
68294
  meta: {
68093
68295
  name: "sales",
68094
68296
  description: "What the store sold: orders, sales, refunds and net, by day, product, campaign or landing \u2014 or when buyers order (weekday, hour, month). Example: baker shopify sales --days 7 --by campaign"
@@ -68126,7 +68328,7 @@ var salesCommand = defineCommand215({
68126
68328
  }
68127
68329
  }
68128
68330
  });
68129
- var storeCommand = defineCommand215({
68331
+ var storeCommand = defineCommand216({
68130
68332
  meta: {
68131
68333
  name: "store",
68132
68334
  description: "The connected Shopify store: currency, countries, how many products, what is out of stock. Example: baker shopify store"
@@ -68144,7 +68346,7 @@ var storeCommand = defineCommand215({
68144
68346
  }
68145
68347
  }
68146
68348
  });
68147
- var productsCommand = defineCommand215({
68349
+ var productsCommand = defineCommand216({
68148
68350
  meta: {
68149
68351
  name: "products",
68150
68352
  description: 'What the store sells, with price and stock. Example: baker shopify products --search "snowboard" --stock out_of_stock'
@@ -68190,7 +68392,7 @@ var productsCommand = defineCommand215({
68190
68392
  }
68191
68393
  }
68192
68394
  });
68193
- var productCommand = defineCommand215({
68395
+ var productCommand = defineCommand216({
68194
68396
  meta: {
68195
68397
  name: "product",
68196
68398
  description: "One product: options with buy links, prices by country, stock, photo imageIds, video playbackIds. Accepts an id, handle or link. Example: baker shopify product the-complete-snowboard --content"
@@ -68253,7 +68455,7 @@ var productCommand = defineCommand215({
68253
68455
  }
68254
68456
  }
68255
68457
  });
68256
- var collectionsCommand = defineCommand215({
68458
+ var collectionsCommand = defineCommand216({
68257
68459
  meta: {
68258
68460
  name: "collections",
68259
68461
  description: "The store's collections, with the handles --collection takes. Example: baker shopify collections --full"
@@ -68278,7 +68480,7 @@ var collectionsCommand = defineCommand215({
68278
68480
  }
68279
68481
  }
68280
68482
  });
68281
- var stockCommand2 = defineCommand215({
68483
+ var stockCommand2 = defineCommand216({
68282
68484
  meta: {
68283
68485
  name: "stock",
68284
68486
  description: "Every product with options out of stock, naming them. Example: baker shopify stock"
@@ -68302,7 +68504,7 @@ var stockCommand2 = defineCommand215({
68302
68504
  }
68303
68505
  }
68304
68506
  });
68305
- var shopifyCommand = defineCommand215({
68507
+ var shopifyCommand = defineCommand216({
68306
68508
  meta: {
68307
68509
  name: "shopify",
68308
68510
  description: `Read the connected Shopify store as Baker keeps it \u2014 products, prices by country, stock, collections,
@@ -68346,6 +68548,7 @@ connected here yet: carry on without it.
68346
68548
  Full guide: __tooling__/docs/tools/baker/shopify.md`
68347
68549
  },
68348
68550
  subCommands: {
68551
+ "signup-offers": signupOffersCommand,
68349
68552
  store: storeCommand,
68350
68553
  products: productsCommand,
68351
68554
  product: productCommand,
@@ -68369,10 +68572,10 @@ Full guide: __tooling__/docs/tools/baker/shopify.md`
68369
68572
  });
68370
68573
 
68371
68574
  // src/commands/studio/index.ts
68372
- import { defineCommand as defineCommand224 } from "citty";
68575
+ import { defineCommand as defineCommand225 } from "citty";
68373
68576
 
68374
68577
  // src/commands/studio/animate.ts
68375
- import { defineCommand as defineCommand216 } from "citty";
68578
+ import { defineCommand as defineCommand217 } from "citty";
68376
68579
 
68377
68580
  // src/commands/studio/spokenPace.ts
68378
68581
  var WORDS_PER_SECOND3 = SPOKEN_WORDS_PER_SECOND;
@@ -68885,7 +69088,7 @@ async function adByHandHintFor(body) {
68885
69088
  return null;
68886
69089
  }
68887
69090
  }
68888
- var animateCommand = defineCommand216({
69091
+ var animateCommand = defineCommand217({
68889
69092
  meta: {
68890
69093
  name: "animate",
68891
69094
  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 'she looks to camera and says: \"Hola, soy Elena\"' --avatar elena --quality 720p --aspect-ratio 9:16\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"
@@ -69010,7 +69213,7 @@ var animateCommand = defineCommand216({
69010
69213
  });
69011
69214
 
69012
69215
  // src/commands/studio/generate.ts
69013
- import { defineCommand as defineCommand217 } from "citty";
69216
+ import { defineCommand as defineCommand218 } from "citty";
69014
69217
  var MODEL_LIST2 = IMAGE_MODEL_IDS;
69015
69218
  var DEFAULT_MAX_WAIT_MS2 = 24e4;
69016
69219
  registerSchema({
@@ -69146,7 +69349,7 @@ function buildGenerateBody(args5, prompt) {
69146
69349
  }
69147
69350
  return body;
69148
69351
  }
69149
- var generateCommand = defineCommand217({
69352
+ var generateCommand = defineCommand218({
69150
69353
  meta: {
69151
69354
  name: "generate",
69152
69355
  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]]'"
@@ -69229,7 +69432,7 @@ var generateCommand = defineCommand217({
69229
69432
  });
69230
69433
 
69231
69434
  // src/commands/studio/get.ts
69232
- import { defineCommand as defineCommand218 } from "citty";
69435
+ import { defineCommand as defineCommand219 } from "citty";
69233
69436
  registerSchema({
69234
69437
  command: "studio.get",
69235
69438
  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.",
@@ -69238,7 +69441,7 @@ registerSchema({
69238
69441
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
69239
69442
  }
69240
69443
  });
69241
- var getCommand5 = defineCommand218({
69444
+ var getCommand5 = defineCommand219({
69242
69445
  meta: {
69243
69446
  name: "get",
69244
69447
  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"
@@ -69267,7 +69470,7 @@ var getCommand5 = defineCommand218({
69267
69470
  });
69268
69471
 
69269
69472
  // src/commands/studio/improve.ts
69270
- import { defineCommand as defineCommand219 } from "citty";
69473
+ import { defineCommand as defineCommand220 } from "citty";
69271
69474
  var DESCRIPTION2 = "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.";
69272
69475
  registerSchema({
69273
69476
  command: "studio.improve",
@@ -69292,7 +69495,7 @@ registerSchema({
69292
69495
  }
69293
69496
  }
69294
69497
  });
69295
- var improveCommand = defineCommand219({
69498
+ var improveCommand = defineCommand220({
69296
69499
  meta: {
69297
69500
  name: "improve",
69298
69501
  description: `${DESCRIPTION2}
@@ -69336,7 +69539,7 @@ Examples:
69336
69539
  });
69337
69540
 
69338
69541
  // src/commands/studio/keep.ts
69339
- import { defineCommand as defineCommand220 } from "citty";
69542
+ import { defineCommand as defineCommand221 } from "citty";
69340
69543
  registerSchema({
69341
69544
  command: "studio.keep",
69342
69545
  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.",
@@ -69346,7 +69549,7 @@ registerSchema({
69346
69549
  undo: { type: "boolean", description: "Un-star an image, or take a kept clip back out", required: false }
69347
69550
  }
69348
69551
  });
69349
- var keepCommand = defineCommand220({
69552
+ var keepCommand = defineCommand221({
69350
69553
  meta: {
69351
69554
  name: "keep",
69352
69555
  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"
@@ -69397,7 +69600,7 @@ var keepCommand = defineCommand220({
69397
69600
  });
69398
69601
 
69399
69602
  // src/commands/studio/list.ts
69400
- import { defineCommand as defineCommand221 } from "citty";
69603
+ import { defineCommand as defineCommand222 } from "citty";
69401
69604
  registerSchema({
69402
69605
  command: "studio.list",
69403
69606
  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.",
@@ -69408,7 +69611,7 @@ registerSchema({
69408
69611
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
69409
69612
  }
69410
69613
  });
69411
- var listCommand18 = defineCommand221({
69614
+ var listCommand18 = defineCommand222({
69412
69615
  meta: {
69413
69616
  name: "list",
69414
69617
  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"
@@ -69442,7 +69645,7 @@ var listCommand18 = defineCommand221({
69442
69645
  });
69443
69646
 
69444
69647
  // src/commands/studio/models.ts
69445
- import { defineCommand as defineCommand222 } from "citty";
69648
+ import { defineCommand as defineCommand223 } from "citty";
69446
69649
  var DESCRIPTION3 = "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.";
69447
69650
  registerSchema({
69448
69651
  command: "studio.models",
@@ -69529,7 +69732,7 @@ function buildModelCards(kind, model) {
69529
69732
  const selected = model ? ids.filter((id) => id === model) : ids;
69530
69733
  return selected.map((id) => build(id));
69531
69734
  }
69532
- var modelsCommand = defineCommand222({
69735
+ var modelsCommand = defineCommand223({
69533
69736
  meta: {
69534
69737
  name: "models",
69535
69738
  description: `${DESCRIPTION3}
@@ -69576,13 +69779,13 @@ Examples:
69576
69779
  });
69577
69780
 
69578
69781
  // src/commands/studio/skills.ts
69579
- import { defineCommand as defineCommand223 } from "citty";
69782
+ import { defineCommand as defineCommand224 } from "citty";
69580
69783
  registerSchema({
69581
69784
  command: "studio.skills",
69582
69785
  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.",
69583
69786
  args: {}
69584
69787
  });
69585
- var skillsCommand = defineCommand223({
69788
+ var skillsCommand = defineCommand224({
69586
69789
  meta: {
69587
69790
  name: "skills",
69588
69791
  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"
@@ -69606,7 +69809,7 @@ var skillsCommand = defineCommand223({
69606
69809
  });
69607
69810
 
69608
69811
  // src/commands/studio/index.ts
69609
- var studioCommand = defineCommand224({
69812
+ var studioCommand = defineCommand225({
69610
69813
  meta: {
69611
69814
  name: "studio",
69612
69815
  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.
@@ -69649,10 +69852,10 @@ Full guide: __tooling__/docs/tools/baker/studio.md`
69649
69852
  });
69650
69853
 
69651
69854
  // src/commands/tag-manager/index.ts
69652
- import { defineCommand as defineCommand228 } from "citty";
69855
+ import { defineCommand as defineCommand229 } from "citty";
69653
69856
 
69654
69857
  // src/commands/tag-manager/draft.ts
69655
- import { defineCommand as defineCommand225 } from "citty";
69858
+ import { defineCommand as defineCommand226 } from "citty";
69656
69859
 
69657
69860
  // src/commands/tag-manager/shared.ts
69658
69861
  import { readFileSync as readFileSync20 } from "fs";
@@ -69775,13 +69978,13 @@ registerSchema({
69775
69978
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
69776
69979
  }
69777
69980
  });
69778
- var draftCommand6 = defineCommand225({
69981
+ var draftCommand6 = defineCommand226({
69779
69982
  meta: {
69780
69983
  name: "draft",
69781
69984
  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."
69782
69985
  },
69783
69986
  subCommands: {
69784
- list: defineCommand225({
69987
+ list: defineCommand226({
69785
69988
  meta: {
69786
69989
  name: "list",
69787
69990
  description: "Review everything staged on this chat (--json for the raw envelope)"
@@ -69794,7 +69997,7 @@ var draftCommand6 = defineCommand225({
69794
69997
  await draftList2(args5.json === true, args5.chat);
69795
69998
  }
69796
69999
  }),
69797
- show: defineCommand225({
70000
+ show: defineCommand226({
69798
70001
  meta: {
69799
70002
  name: "show",
69800
70003
  description: "Print the full staged payload for one change \u2014 the receipt to verify it looks right before publish (never truncated)."
@@ -69811,7 +70014,7 @@ var draftCommand6 = defineCommand225({
69811
70014
  );
69812
70015
  }
69813
70016
  }),
69814
- amend: defineCommand225({
70017
+ amend: defineCommand226({
69815
70018
  meta: {
69816
70019
  name: "amend",
69817
70020
  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."
@@ -69828,7 +70031,7 @@ var draftCommand6 = defineCommand225({
69828
70031
  });
69829
70032
  }
69830
70033
  }),
69831
- remove: defineCommand225({
70034
+ remove: defineCommand226({
69832
70035
  meta: { name: "remove", description: "Remove one staged change (cascades to anything depending on it)" },
69833
70036
  args: { ref: { type: "positional", description: "Staged ref (gtm_temp_*) or target", required: false } },
69834
70037
  run: async ({ args: args5 }) => {
@@ -69837,7 +70040,7 @@ var draftCommand6 = defineCommand225({
69837
70040
  });
69838
70041
  }
69839
70042
  }),
69840
- clear: defineCommand225({
70043
+ clear: defineCommand226({
69841
70044
  meta: { name: "clear", description: "Discard all Tag Manager changes staged on this chat" },
69842
70045
  run: async () => {
69843
70046
  await draftAction3("/api/tag-manager/draft/clear", {});
@@ -69847,7 +70050,7 @@ var draftCommand6 = defineCommand225({
69847
70050
  });
69848
70051
 
69849
70052
  // src/commands/tag-manager/read.ts
69850
- import { defineCommand as defineCommand226 } from "citty";
70053
+ import { defineCommand as defineCommand227 } from "citty";
69851
70054
  registerSchema({
69852
70055
  command: "tagManager.containers",
69853
70056
  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.",
@@ -69888,7 +70091,7 @@ function containersHints(containers) {
69888
70091
  }))
69889
70092
  });
69890
70093
  }
69891
- var containersCommand = defineCommand226({
70094
+ var containersCommand = defineCommand227({
69892
70095
  meta: {
69893
70096
  name: "containers",
69894
70097
  description: `List Tag Manager containers reachable by this company's connection.
@@ -69905,7 +70108,7 @@ Start here:
69905
70108
  }
69906
70109
  }
69907
70110
  });
69908
- var readCommand = defineCommand226({
70111
+ var readCommand = defineCommand227({
69909
70112
  meta: {
69910
70113
  name: "read",
69911
70114
  description: `Read the current contents of the Tag Manager container \u2014 always do this before staging changes.
@@ -69947,7 +70150,7 @@ Examples:
69947
70150
  });
69948
70151
 
69949
70152
  // src/commands/tag-manager/write-commands.ts
69950
- import { defineCommand as defineCommand227 } from "citty";
70153
+ import { defineCommand as defineCommand228 } from "citty";
69951
70154
  var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
69952
70155
  var ENTITIES = [
69953
70156
  {
@@ -70003,10 +70206,10 @@ for (const { entity, noun, createHint } of ENTITIES) {
70003
70206
  });
70004
70207
  }
70005
70208
  function entityCommand(entity, noun, example) {
70006
- return defineCommand227({
70209
+ return defineCommand228({
70007
70210
  meta: { name: entity, description: `Stage ${noun} changes on this chat's Tag Manager draft` },
70008
70211
  subCommands: {
70009
- create: defineCommand227({
70212
+ create: defineCommand228({
70010
70213
  meta: {
70011
70214
  name: "create",
70012
70215
  description: `Stage a new ${noun}
@@ -70028,7 +70231,7 @@ Examples:
70028
70231
  });
70029
70232
  }
70030
70233
  }),
70031
- update: defineCommand227({
70234
+ update: defineCommand228({
70032
70235
  meta: {
70033
70236
  name: "update",
70034
70237
  description: `Stage an update to an existing ${noun} (pass its id or path)`
@@ -70048,7 +70251,7 @@ Examples:
70048
70251
  });
70049
70252
  }
70050
70253
  }),
70051
- delete: defineCommand227({
70254
+ delete: defineCommand228({
70052
70255
  meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
70053
70256
  args: {
70054
70257
  id: { type: "positional", description: `${noun} id or path`, required: false },
@@ -70089,7 +70292,7 @@ function builtinTypes(args5) {
70089
70292
  }
70090
70293
  return raw.split(",").map((entry) => entry.trim());
70091
70294
  }
70092
- var builtinCommand = defineCommand227({
70295
+ var builtinCommand = defineCommand228({
70093
70296
  meta: {
70094
70297
  name: "builtin",
70095
70298
  description: `Enable or disable built-in variables
@@ -70099,7 +70302,7 @@ Examples:
70099
70302
  baker tag-manager builtin disable --types formId`
70100
70303
  },
70101
70304
  subCommands: {
70102
- enable: defineCommand227({
70305
+ enable: defineCommand228({
70103
70306
  meta: { name: "enable", description: "Stage enabling built-in variables" },
70104
70307
  args: {
70105
70308
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -70113,7 +70316,7 @@ Examples:
70113
70316
  });
70114
70317
  }
70115
70318
  }),
70116
- disable: defineCommand227({
70319
+ disable: defineCommand228({
70117
70320
  meta: { name: "disable", description: "Stage disabling built-in variables" },
70118
70321
  args: {
70119
70322
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -70131,7 +70334,7 @@ Examples:
70131
70334
  });
70132
70335
 
70133
70336
  // src/commands/tag-manager/index.ts
70134
- var tagManagerCommand = defineCommand228({
70337
+ var tagManagerCommand = defineCommand229({
70135
70338
  meta: {
70136
70339
  name: "tag-manager",
70137
70340
  description: `Read and change what lives inside the client's Google Tag Manager container \u2014 tags, triggers, variables, folders and built-in variables.
@@ -70168,7 +70371,7 @@ Full guide: __tooling__/docs/tools/baker/tag-manager.md`
70168
70371
  });
70169
70372
 
70170
70373
  // src/commands/tags/index.ts
70171
- import { defineCommand as defineCommand229 } from "citty";
70374
+ import { defineCommand as defineCommand230 } from "citty";
70172
70375
 
70173
70376
  // src/commands/tags/shared.ts
70174
70377
  function failApi3(err) {
@@ -70248,7 +70451,7 @@ async function listTags(json) {
70248
70451
  var listArgs11 = {
70249
70452
  json: { type: "boolean", description: "Print the raw JSON envelope instead of the readable list" }
70250
70453
  };
70251
- var listCommand19 = defineCommand229({
70454
+ var listCommand19 = defineCommand230({
70252
70455
  meta: {
70253
70456
  name: "list",
70254
70457
  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"
@@ -70267,7 +70470,7 @@ async function listDraft4(chat) {
70267
70470
  failApi3(err);
70268
70471
  }
70269
70472
  }
70270
- var draftCommand7 = defineCommand229({
70473
+ var draftCommand7 = defineCommand230({
70271
70474
  meta: {
70272
70475
  name: "draft",
70273
70476
  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."
@@ -70277,7 +70480,7 @@ var draftCommand7 = defineCommand229({
70277
70480
  await listDraft4(args5.chat);
70278
70481
  }
70279
70482
  });
70280
- var tagsCommand4 = defineCommand229({
70483
+ var tagsCommand4 = defineCommand230({
70281
70484
  meta: {
70282
70485
  name: "tags",
70283
70486
  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.
@@ -70306,10 +70509,10 @@ Full guide: __tooling__/docs/tools/baker/tags.md`
70306
70509
  });
70307
70510
 
70308
70511
  // src/commands/testimonials/index.ts
70309
- import { defineCommand as defineCommand233 } from "citty";
70512
+ import { defineCommand as defineCommand234 } from "citty";
70310
70513
 
70311
70514
  // src/commands/testimonials/get.ts
70312
- import { defineCommand as defineCommand230 } from "citty";
70515
+ import { defineCommand as defineCommand231 } from "citty";
70313
70516
  registerSchema({
70314
70517
  command: "testimonials.get",
70315
70518
  description: "Get a single testimonial by ID",
@@ -70317,7 +70520,7 @@ registerSchema({
70317
70520
  id: { type: "string", description: "Testimonial ID", required: true }
70318
70521
  }
70319
70522
  });
70320
- var getCommand6 = defineCommand230({
70523
+ var getCommand6 = defineCommand231({
70321
70524
  meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
70322
70525
  args: {
70323
70526
  id: { type: "positional", description: "Testimonial ID", required: false },
@@ -70354,7 +70557,7 @@ var getCommand6 = defineCommand230({
70354
70557
  });
70355
70558
 
70356
70559
  // src/commands/testimonials/list.ts
70357
- import { defineCommand as defineCommand231 } from "citty";
70560
+ import { defineCommand as defineCommand232 } from "citty";
70358
70561
 
70359
70562
  // src/commands/testimonials/emptyCorpusHints.ts
70360
70563
  function resolveEmptyReason({
@@ -70511,7 +70714,7 @@ function buildListParams(args5) {
70511
70714
  }
70512
70715
  return params2;
70513
70716
  }
70514
- var listCommand20 = defineCommand231({
70717
+ var listCommand20 = defineCommand232({
70515
70718
  meta: {
70516
70719
  name: "list",
70517
70720
  description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
@@ -70571,7 +70774,7 @@ var listCommand20 = defineCommand231({
70571
70774
  });
70572
70775
 
70573
70776
  // src/commands/testimonials/search.ts
70574
- import { defineCommand as defineCommand232 } from "citty";
70777
+ import { defineCommand as defineCommand233 } from "citty";
70575
70778
  var FILTER_FLAGS2 = ["source", "rating-min", "rating-max", "status", "sentiment", "language", "tags"];
70576
70779
  function languageBiasHint(results, requestedLanguage) {
70577
70780
  if (requestedLanguage) {
@@ -70650,7 +70853,7 @@ function buildSearchRequest(query, args5) {
70650
70853
  }
70651
70854
  return body;
70652
70855
  }
70653
- var searchCommand3 = defineCommand232({
70856
+ var searchCommand3 = defineCommand233({
70654
70857
  meta: {
70655
70858
  name: "search",
70656
70859
  description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
@@ -70714,7 +70917,7 @@ var searchCommand3 = defineCommand232({
70714
70917
  var tagsCommand5 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
70715
70918
 
70716
70919
  // src/commands/testimonials/index.ts
70717
- var testimonialsCommand = defineCommand233({
70920
+ var testimonialsCommand = defineCommand234({
70718
70921
  meta: {
70719
70922
  name: "testimonials",
70720
70923
  description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
@@ -70736,10 +70939,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
70736
70939
  });
70737
70940
 
70738
70941
  // src/commands/videos/index.ts
70739
- import { defineCommand as defineCommand241 } from "citty";
70942
+ import { defineCommand as defineCommand242 } from "citty";
70740
70943
 
70741
70944
  // src/commands/videos/delete.ts
70742
- import { defineCommand as defineCommand234 } from "citty";
70945
+ import { defineCommand as defineCommand235 } from "citty";
70743
70946
  registerSchema({
70744
70947
  command: "videos.delete",
70745
70948
  description: "Delete a video by ID",
@@ -70753,7 +70956,7 @@ registerSchema({
70753
70956
  }
70754
70957
  }
70755
70958
  });
70756
- var deleteCommand4 = defineCommand234({
70959
+ var deleteCommand4 = defineCommand235({
70757
70960
  meta: {
70758
70961
  name: "delete",
70759
70962
  description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
@@ -70794,7 +70997,7 @@ var deleteCommand4 = defineCommand234({
70794
70997
  });
70795
70998
 
70796
70999
  // src/commands/videos/describe.ts
70797
- import { defineCommand as defineCommand235 } from "citty";
71000
+ import { defineCommand as defineCommand236 } from "citty";
70798
71001
  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.";
70799
71002
  registerSchema({
70800
71003
  command: "videos.describe",
@@ -70811,7 +71014,7 @@ registerSchema({
70811
71014
  full: { type: "boolean", description: "Return the whole library row, not just what changed", required: false }
70812
71015
  }
70813
71016
  });
70814
- var describeCommand2 = defineCommand235({
71017
+ var describeCommand2 = defineCommand236({
70815
71018
  meta: {
70816
71019
  name: "describe",
70817
71020
  description: `Correct what the library says a video is. Only the fields you pass change; the rest keep their current values.
@@ -70869,7 +71072,7 @@ Example: baker videos describe j571abc123 --description "Customer explaining how
70869
71072
  });
70870
71073
 
70871
71074
  // src/commands/videos/get.ts
70872
- import { defineCommand as defineCommand236 } from "citty";
71075
+ import { defineCommand as defineCommand237 } from "citty";
70873
71076
  registerSchema({
70874
71077
  command: "videos.get",
70875
71078
  description: "Get a single video by ID",
@@ -70877,7 +71080,7 @@ registerSchema({
70877
71080
  id: { type: "string", description: "Video ID", required: true }
70878
71081
  }
70879
71082
  });
70880
- var getCommand7 = defineCommand236({
71083
+ var getCommand7 = defineCommand237({
70881
71084
  meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
70882
71085
  args: {
70883
71086
  id: { type: "positional", description: "Video ID", required: false },
@@ -70914,7 +71117,7 @@ var getCommand7 = defineCommand236({
70914
71117
  });
70915
71118
 
70916
71119
  // src/commands/videos/group.ts
70917
- import { defineCommand as defineCommand237 } from "citty";
71120
+ import { defineCommand as defineCommand238 } from "citty";
70918
71121
  registerSchema({
70919
71122
  command: "videos.group",
70920
71123
  description: "List every clip and image that arrived in the same set as this video (carousel slides, one page)",
@@ -70923,7 +71126,7 @@ registerSchema({
70923
71126
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
70924
71127
  }
70925
71128
  });
70926
- var groupCommand2 = defineCommand237({
71129
+ var groupCommand2 = defineCommand238({
70927
71130
  meta: {
70928
71131
  name: "group",
70929
71132
  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>"
@@ -70946,7 +71149,7 @@ var groupCommand2 = defineCommand237({
70946
71149
  import { mkdtemp as mkdtemp3, rm as rm9, stat as stat12 } from "fs/promises";
70947
71150
  import { tmpdir as tmpdir4 } from "os";
70948
71151
  import path48 from "path";
70949
- import { defineCommand as defineCommand238 } from "citty";
71152
+ import { defineCommand as defineCommand239 } from "citty";
70950
71153
 
70951
71154
  // src/lib/streamUpload.ts
70952
71155
  import { createHash as createHash2 } from "crypto";
@@ -71110,7 +71313,7 @@ registerSchema({
71110
71313
  "dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
71111
71314
  }
71112
71315
  });
71113
- var ingestCommand2 = defineCommand238({
71316
+ var ingestCommand2 = defineCommand239({
71114
71317
  meta: {
71115
71318
  name: "ingest",
71116
71319
  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"
@@ -71372,7 +71575,7 @@ async function uploadToAssetStore(filePath, sizeBytes) {
71372
71575
  }
71373
71576
 
71374
71577
  // src/commands/videos/search.ts
71375
- import { defineCommand as defineCommand239 } from "citty";
71578
+ import { defineCommand as defineCommand240 } from "citty";
71376
71579
  registerSchema({
71377
71580
  command: "videos.search",
71378
71581
  description: "Search videos by text query. Only returns ready videos.",
@@ -71382,7 +71585,7 @@ registerSchema({
71382
71585
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
71383
71586
  }
71384
71587
  });
71385
- var searchCommand4 = defineCommand239({
71588
+ var searchCommand4 = defineCommand240({
71386
71589
  meta: {
71387
71590
  name: "search",
71388
71591
  description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
@@ -71434,7 +71637,7 @@ var tagsCommand6 = makeTagsCommand("videos", "video", "/api/videos/tags");
71434
71637
  // src/commands/videos/upload.ts
71435
71638
  import { readFile as readFile34, stat as stat13 } from "fs/promises";
71436
71639
  import { basename as basename3, extname as extname4 } from "path";
71437
- import { defineCommand as defineCommand240 } from "citty";
71640
+ import { defineCommand as defineCommand241 } from "citty";
71438
71641
  var MIME_MAP = {
71439
71642
  ".mp4": "video/mp4",
71440
71643
  ".mov": "video/quicktime",
@@ -71476,7 +71679,7 @@ function detectContentType(filePath) {
71476
71679
  function isRemoteUrl3(value) {
71477
71680
  return /^https?:\/\//i.test(value);
71478
71681
  }
71479
- var uploadCommand2 = defineCommand240({
71682
+ var uploadCommand2 = defineCommand241({
71480
71683
  meta: {
71481
71684
  name: "upload",
71482
71685
  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"
@@ -71560,7 +71763,7 @@ var uploadCommand2 = defineCommand240({
71560
71763
  });
71561
71764
 
71562
71765
  // src/commands/videos/index.ts
71563
- var videosCommand = defineCommand241({
71766
+ var videosCommand = defineCommand242({
71564
71767
  meta: {
71565
71768
  name: "videos",
71566
71769
  description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, describe, delete, tags.
@@ -71589,10 +71792,10 @@ Full guide: __tooling__/docs/tools/baker/videos.md`
71589
71792
  });
71590
71793
 
71591
71794
  // src/commands/winning-ads/index.ts
71592
- import { defineCommand as defineCommand254 } from "citty";
71795
+ import { defineCommand as defineCommand255 } from "citty";
71593
71796
 
71594
71797
  // src/commands/winning-ads/advertisers.ts
71595
- import { defineCommand as defineCommand242 } from "citty";
71798
+ import { defineCommand as defineCommand243 } from "citty";
71596
71799
 
71597
71800
  // src/commands/winning-ads/shared.ts
71598
71801
  function splitList3(value) {
@@ -71645,7 +71848,7 @@ function advertiserNormalizer(record, full) {
71645
71848
  last_synced_at: record.last_synced_at ?? null
71646
71849
  };
71647
71850
  }
71648
- var advertisersCommand2 = defineCommand242({
71851
+ var advertisersCommand2 = defineCommand243({
71649
71852
  meta: {
71650
71853
  name: "advertisers",
71651
71854
  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'
@@ -71703,7 +71906,7 @@ var advertisersCommand2 = defineCommand242({
71703
71906
  });
71704
71907
 
71705
71908
  // src/commands/winning-ads/brief.ts
71706
- import { defineCommand as defineCommand243 } from "citty";
71909
+ import { defineCommand as defineCommand244 } from "citty";
71707
71910
  registerSchema({
71708
71911
  command: "winning-ads.brief",
71709
71912
  description: "Generate a creative brief grounded in strategically-similar winning ads. Optionally describe the target creative with --dna (JSON) and steer with --notes.",
@@ -71749,7 +71952,7 @@ function parseDna(raw) {
71749
71952
  }
71750
71953
  return parsed;
71751
71954
  }
71752
- var briefCommand = defineCommand243({
71955
+ var briefCommand = defineCommand244({
71753
71956
  meta: {
71754
71957
  name: "brief",
71755
71958
  description: `Generate a creative brief from winning references. Example: baker winning-ads brief --dna '{"angle":"cost savings"}' --notes "B2B, LinkedIn video" --k 8`
@@ -71785,7 +71988,7 @@ var briefCommand = defineCommand243({
71785
71988
  });
71786
71989
 
71787
71990
  // src/commands/winning-ads/content.ts
71788
- import { defineCommand as defineCommand244 } from "citty";
71991
+ import { defineCommand as defineCommand245 } from "citty";
71789
71992
  registerSchema({
71790
71993
  command: "winning-ads.content",
71791
71994
  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.",
@@ -71798,7 +72001,7 @@ registerSchema({
71798
72001
  }
71799
72002
  }
71800
72003
  });
71801
- var contentCommand = defineCommand244({
72004
+ var contentCommand = defineCommand245({
71802
72005
  meta: {
71803
72006
  name: "content",
71804
72007
  description: "Read the transcript + on-screen text + copy of one winning ad. Example: baker winning-ads content adg_123 --platform meta --full --output md"
@@ -71847,7 +72050,7 @@ var contentCommand = defineCommand244({
71847
72050
  });
71848
72051
 
71849
72052
  // src/commands/winning-ads/feed.ts
71850
- import { defineCommand as defineCommand245 } from "citty";
72053
+ import { defineCommand as defineCommand246 } from "citty";
71851
72054
  function buildFeedParams(input) {
71852
72055
  const params2 = {};
71853
72056
  const advertiser = splitList3(input.advertiser);
@@ -71899,7 +72102,7 @@ registerSchema({
71899
72102
  format: { type: "string", description: "Comma-separated formats to include (e.g. static,video)", required: false }
71900
72103
  }
71901
72104
  });
71902
- var feedCommand2 = defineCommand245({
72105
+ var feedCommand2 = defineCommand246({
71903
72106
  meta: {
71904
72107
  name: "feed",
71905
72108
  description: "Winners across every brand you follow (browse, then trim per advertiser). Example: baker winning-ads feed --per-advertiser 5 --output md"
@@ -71984,7 +72187,7 @@ var feedCommand2 = defineCommand245({
71984
72187
  });
71985
72188
 
71986
72189
  // src/commands/winning-ads/follow.ts
71987
- import { defineCommand as defineCommand246 } from "citty";
72190
+ import { defineCommand as defineCommand247 } from "citty";
71988
72191
  var PLATFORMS = adLibraryPlatformSchema.options;
71989
72192
  registerSchema({
71990
72193
  command: "winning-ads.follow",
@@ -71999,7 +72202,7 @@ registerSchema({
71999
72202
  label: { type: "string", description: "Optional display label (defaults to the resolved name)", required: false }
72000
72203
  }
72001
72204
  });
72002
- var followCommand = defineCommand246({
72205
+ var followCommand = defineCommand247({
72003
72206
  meta: {
72004
72207
  name: "follow",
72005
72208
  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'
@@ -72046,7 +72249,7 @@ var followCommand = defineCommand246({
72046
72249
  });
72047
72250
 
72048
72251
  // src/commands/winning-ads/follow-competitors.ts
72049
- import { defineCommand as defineCommand247 } from "citty";
72252
+ import { defineCommand as defineCommand248 } from "citty";
72050
72253
  var PLATFORMS2 = adLibraryPlatformSchema.options;
72051
72254
  var BATCH_TIMEOUT_MS = 3e5;
72052
72255
  function buildFollowBatchBody(input) {
@@ -72079,7 +72282,7 @@ registerSchema({
72079
72282
  }
72080
72283
  }
72081
72284
  });
72082
- var followCompetitorsCommand = defineCommand247({
72285
+ var followCompetitorsCommand = defineCommand248({
72083
72286
  meta: {
72084
72287
  name: "follow-competitors",
72085
72288
  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"'
@@ -72154,7 +72357,7 @@ var followCompetitorsCommand = defineCommand247({
72154
72357
  });
72155
72358
 
72156
72359
  // src/commands/winning-ads/following.ts
72157
- import { defineCommand as defineCommand248 } from "citty";
72360
+ import { defineCommand as defineCommand249 } from "citty";
72158
72361
  registerSchema({
72159
72362
  command: "winning-ads.following",
72160
72363
  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.",
@@ -72208,7 +72411,7 @@ function followingNormalizer(record, full) {
72208
72411
  platforms: Array.isArray(record.platforms) ? record.platforms : []
72209
72412
  };
72210
72413
  }
72211
- var followingCommand = defineCommand248({
72414
+ var followingCommand = defineCommand249({
72212
72415
  meta: {
72213
72416
  name: "following",
72214
72417
  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"
@@ -72244,7 +72447,7 @@ var followingCommand = defineCommand248({
72244
72447
  });
72245
72448
 
72246
72449
  // src/commands/winning-ads/patterns.ts
72247
- import { defineCommand as defineCommand249 } from "citty";
72450
+ import { defineCommand as defineCommand250 } from "citty";
72248
72451
  registerSchema({
72249
72452
  command: "winning-ads.patterns",
72250
72453
  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.",
@@ -72283,7 +72486,7 @@ function discriminatorRow(record) {
72283
72486
  top_values_duds: Array.isArray(record.top_values_b) ? record.top_values_b.join(", ") : ""
72284
72487
  };
72285
72488
  }
72286
- var patternsCommand = defineCommand249({
72489
+ var patternsCommand = defineCommand250({
72287
72490
  meta: {
72288
72491
  name: "patterns",
72289
72492
  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"
@@ -72339,7 +72542,7 @@ var patternsCommand = defineCommand249({
72339
72542
  });
72340
72543
 
72341
72544
  // src/commands/winning-ads/search.ts
72342
- import { defineCommand as defineCommand250 } from "citty";
72545
+ import { defineCommand as defineCommand251 } from "citty";
72343
72546
  registerSchema({
72344
72547
  command: "winning-ads.search",
72345
72548
  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.",
@@ -72477,7 +72680,7 @@ function reportSearchError(err) {
72477
72680
  }
72478
72681
  reportError2(err);
72479
72682
  }
72480
- var searchCommand5 = defineCommand250({
72683
+ var searchCommand5 = defineCommand251({
72481
72684
  meta: {
72482
72685
  name: "search",
72483
72686
  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"
@@ -72597,7 +72800,7 @@ var searchCommand5 = defineCommand250({
72597
72800
  });
72598
72801
 
72599
72802
  // src/commands/winning-ads/seeds.ts
72600
- import { defineCommand as defineCommand251 } from "citty";
72803
+ import { defineCommand as defineCommand252 } from "citty";
72601
72804
  function leanRow(r) {
72602
72805
  return {
72603
72806
  key: r.key,
@@ -72625,7 +72828,7 @@ function makeSeedCommand(opts) {
72625
72828
  limit: { type: "number", description: "Max keys 1-100 (default 20)", required: false, default: 20 }
72626
72829
  }
72627
72830
  });
72628
- return defineCommand251({
72831
+ return defineCommand252({
72629
72832
  meta: { name: opts.name, description: opts.description },
72630
72833
  args: {
72631
72834
  platform: { type: "string", description: "Single platform to segment on", required: false },
@@ -72674,7 +72877,7 @@ var formatsCommand = makeSeedCommand({
72674
72877
  });
72675
72878
 
72676
72879
  // src/commands/winning-ads/unfollow.ts
72677
- import { defineCommand as defineCommand252 } from "citty";
72880
+ import { defineCommand as defineCommand253 } from "citty";
72678
72881
  registerSchema({
72679
72882
  command: "winning-ads.unfollow",
72680
72883
  description: "Stop following a brand \u2014 removes it from your ad-dna library by advertiser id.",
@@ -72682,7 +72885,7 @@ registerSchema({
72682
72885
  advertiser: { type: "string", description: "Advertiser id to unfollow", required: true }
72683
72886
  }
72684
72887
  });
72685
- var unfollowCommand = defineCommand252({
72888
+ var unfollowCommand = defineCommand253({
72686
72889
  meta: {
72687
72890
  name: "unfollow",
72688
72891
  description: "Stop following a brand by advertiser id. Example: baker winning-ads unfollow adv_123"
@@ -72703,7 +72906,7 @@ var unfollowCommand = defineCommand252({
72703
72906
  });
72704
72907
 
72705
72908
  // src/commands/winning-ads/winners.ts
72706
- import { defineCommand as defineCommand253 } from "citty";
72909
+ import { defineCommand as defineCommand254 } from "citty";
72707
72910
  registerSchema({
72708
72911
  command: "winning-ads.winners",
72709
72912
  description: "Top winning ads for one advertiser id (from `advertisers` or `following`). Returns lean winner cards; add --full for DNA + longevity.",
@@ -72713,7 +72916,7 @@ registerSchema({
72713
72916
  platform: { type: "string", description: "Filter to a single platform: meta|linkedin|tiktok", required: false }
72714
72917
  }
72715
72918
  });
72716
- var winnersCommand = defineCommand253({
72919
+ var winnersCommand = defineCommand254({
72717
72920
  meta: {
72718
72921
  name: "winners",
72719
72922
  description: "Top winning ads for a specific advertiser id. Example: baker winning-ads winners adv_123 --top 15 --output md"
@@ -72763,7 +72966,7 @@ var winnersCommand = defineCommand253({
72763
72966
  });
72764
72967
 
72765
72968
  // src/commands/winning-ads/index.ts
72766
- var winningAdsCommand = defineCommand254({
72969
+ var winningAdsCommand = defineCommand255({
72767
72970
  meta: {
72768
72971
  name: "winning-ads",
72769
72972
  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.
@@ -72963,8 +73166,8 @@ function suggestFlag(unknown, command) {
72963
73166
  const name = flag3.slice(2);
72964
73167
  const def = args5[name] ?? args5[camel(name)];
72965
73168
  const described = def && typeof def === "object" ? def.description : void 0;
72966
- const description = typeof described === "string" ? described.split(/(?<!\b(?:e\.g|i\.e|vs))\.\s/)[0]?.trim().replace(/\.$/, "") : "";
72967
- return description ? { flag: flag3, description } : { flag: flag3 };
73169
+ const description2 = typeof described === "string" ? described.split(/(?<!\b(?:e\.g|i\.e|vs))\.\s/)[0]?.trim().replace(/\.$/, "") : "";
73170
+ return description2 ? { flag: flag3, description: description2 } : { flag: flag3 };
72968
73171
  }
72969
73172
  function suggestionText(suggestion) {
72970
73173
  if (!suggestion) {
@@ -73090,7 +73293,7 @@ function getCliVersion() {
73090
73293
  }
73091
73294
 
73092
73295
  // src/cli.ts
73093
- var main = defineCommand255({
73296
+ var main = defineCommand256({
73094
73297
  meta: {
73095
73298
  name: "baker",
73096
73299
  version: getCliVersion(),