@koda-sl/baker-cli 0.233.0 → 0.235.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -108,7 +108,7 @@ import {
108
108
  } from "./chunk-DZUVUGEP.js";
109
109
 
110
110
  // src/cli.ts
111
- import { defineCommand as defineCommand225, runMain } from "citty";
111
+ import { defineCommand as defineCommand226, runMain } from "citty";
112
112
 
113
113
  // src/cache-flag.ts
114
114
  var NO_CACHE_ARG = {
@@ -7679,7 +7679,7 @@ Full guide: __tooling__/docs/tools/baker/actions.md`
7679
7679
  });
7680
7680
 
7681
7681
  // src/commands/ads/index.ts
7682
- import { defineCommand as defineCommand86 } from "citty";
7682
+ import { defineCommand as defineCommand87 } from "citty";
7683
7683
 
7684
7684
  // src/commands/ads/google/index.ts
7685
7685
  import { defineCommand as defineCommand31 } from "citty";
@@ -16554,7 +16554,7 @@ Full guide: __tooling__/docs/tools/baker/ads-linkedin.md`
16554
16554
  });
16555
16555
 
16556
16556
  // src/commands/ads/meta/index.ts
16557
- import { defineCommand as defineCommand68 } from "citty";
16557
+ import { defineCommand as defineCommand69 } from "citty";
16558
16558
 
16559
16559
  // src/commands/ads/meta/account.ts
16560
16560
  import { defineCommand as defineCommand52 } from "citty";
@@ -16698,6 +16698,13 @@ import { defineCommand as defineCommand55 } from "citty";
16698
16698
  // src/commands/ads/meta/write-shared.ts
16699
16699
  import { readFileSync as readFileSync8 } from "fs";
16700
16700
 
16701
+ // ../api/src/ads-meta/leadAds.ts
16702
+ var META_LEAD_ADS_NOT_ENABLED_MESSAGE = "Reading Meta instant forms and their leads is not switched on for this company. Everything else on Meta keeps working. Tell the user this needs switching on by the Baker team, and carry on with the rest of the job.";
16703
+ var META_LEAD_ADS_RECONNECT_MESSAGE = "This Meta connection was made before lead ads were switched on for this company, so it cannot work with instant forms or read their leads. Ask the user to reconnect Meta in the dashboard \u2014 that grants the extra permissions \u2014 then ask for this again. Everything else on Meta keeps working meanwhile.";
16704
+ function isMetaLeadAdsRefusal(message) {
16705
+ return message === META_LEAD_ADS_NOT_ENABLED_MESSAGE || message === META_LEAD_ADS_RECONNECT_MESSAGE;
16706
+ }
16707
+
16701
16708
  // ../api/src/ads-meta/limits.ts
16702
16709
  var META_LIMITS = {
16703
16710
  campaign: {
@@ -19069,9 +19076,177 @@ Async is automatic for heavy queries; pass --async to force it, or --no-async to
19069
19076
  }
19070
19077
  });
19071
19078
 
19072
- // src/commands/ads/meta/media.ts
19079
+ // src/commands/ads/meta/leads.ts
19073
19080
  import { defineCommand as defineCommand64 } from "citty";
19074
- var metaMediaCommand = defineCommand64({
19081
+ registerSchema({
19082
+ command: "ads.meta.lead-forms",
19083
+ description: "List the instant (lead) forms on a Facebook Page, with how many leads each has collected. Start here: a lead is fetched by form id, and `baker ads meta pages` gives the page id.",
19084
+ args: {
19085
+ "page-id": { type: "string", description: "Facebook Page ID \u2014 from `baker ads meta pages`", required: true },
19086
+ full: { type: "boolean", description: "Include each form's questions", required: false },
19087
+ output: { type: "string", description: "json|csv", required: false, default: "json" }
19088
+ }
19089
+ });
19090
+ registerSchema({
19091
+ command: "ads.meta.leads",
19092
+ description: "Read the leads an instant form collected. Contact details (email, phone) come back masked; pass --full only when the raw values are genuinely needed, e.g. handing them to a CRM.",
19093
+ args: {
19094
+ "form-id": { type: "string", description: "Instant form ID \u2014 from `baker ads meta lead-forms`", required: false },
19095
+ "ad-id": { type: "string", description: "Read the leads of one ad instead of a whole form", required: false },
19096
+ since: { type: "string", description: "Earliest submission date, YYYY-MM-DD", required: false },
19097
+ until: { type: "string", description: "Latest submission date, YYYY-MM-DD (inclusive)", required: false },
19098
+ limit: { type: "string", description: "Leads per page (default 100, max 500)", required: false },
19099
+ after: {
19100
+ type: "string",
19101
+ description: "Cursor from a previous call's nextCursor \u2014 fetches the following page",
19102
+ required: false
19103
+ },
19104
+ full: { type: "boolean", description: "Return raw contact details instead of masked ones", required: false },
19105
+ output: { type: "string", description: "json|csv", required: false, default: "json" }
19106
+ }
19107
+ });
19108
+ var LEAD_FORMS_CAP = 500;
19109
+ function leadFormHints(forms) {
19110
+ if (forms.length === 0) {
19111
+ return ["This Page has NO instant forms. Nothing to read leads from \u2014 the form has to be created first."];
19112
+ }
19113
+ if (forms.length >= LEAD_FORMS_CAP) {
19114
+ return [
19115
+ `PARTIAL LIST \u2014 this Page has at least ${LEAD_FORMS_CAP} instant forms and only the first ${LEAD_FORMS_CAP} came back. Do not describe this as every form on the Page.`
19116
+ ];
19117
+ }
19118
+ const empty = forms.filter((form) => (form.leads_count ?? 0) === 0);
19119
+ if (empty.length === forms.length) {
19120
+ return [
19121
+ "Every form on this Page has collected 0 leads. That is a real, readable answer \u2014 the connection works. Do not retry and do not report it as a permissions problem."
19122
+ ];
19123
+ }
19124
+ return [];
19125
+ }
19126
+ function handleLeadsError(err) {
19127
+ if (err instanceof ApiError && err.code === "FORBIDDEN" && isMetaLeadAdsRefusal(err.message)) {
19128
+ writeAdsJson({
19129
+ ok: false,
19130
+ error: {
19131
+ code: err.code,
19132
+ message: err.message,
19133
+ fix: { action: "reject", explanation: err.message },
19134
+ retryable: false
19135
+ }
19136
+ });
19137
+ process.exit(1);
19138
+ }
19139
+ handleMetaError(err);
19140
+ }
19141
+ function leadPageHints(page, full) {
19142
+ const hints = [];
19143
+ if (page.nextCursor) {
19144
+ hints.push(
19145
+ `PARTIAL PAGE \u2014 more leads exist. This is ${page.leads.length} of an unknown larger number; do NOT report it as a total. Fetch the next page with \`--after ${page.nextCursor}\` (repeat until no nextCursor), or narrow the window with --since/--until.`
19146
+ );
19147
+ }
19148
+ if (!full) {
19149
+ hints.push(
19150
+ "Email and phone answers are masked. Report on them as they are; pass --full only when the raw values have to leave Baker (a CRM hand-off), and never paste them into the chat otherwise."
19151
+ );
19152
+ }
19153
+ return hints;
19154
+ }
19155
+ var leadFormsCommand2 = defineCommand64({
19156
+ meta: {
19157
+ name: "lead-forms",
19158
+ description: `List the instant (lead) forms on a Facebook Page, with each form's lead count. A lead is read by form id, so start here \u2014 get the Page id from \`baker ads meta pages\`.
19159
+
19160
+ Examples:
19161
+ baker ads meta lead-forms --page-id 100635183117758
19162
+ baker ads meta lead-forms --page-id 100635183117758 --full # also lists each form's questions`
19163
+ },
19164
+ args: {
19165
+ "page-id": { type: "string", description: "Facebook Page ID" },
19166
+ full: { type: "boolean", description: "Include each form's questions" },
19167
+ output: { type: "string", description: "Output format", default: "json" }
19168
+ },
19169
+ run: async ({ args }) => {
19170
+ try {
19171
+ const pageId = args["page-id"];
19172
+ if (!pageId) {
19173
+ handleLeadsError(new Error("--page-id is required. Run `baker ads meta pages` to find it."));
19174
+ }
19175
+ const params = { "page-id": pageId };
19176
+ if (args.full) params.full = "true";
19177
+ const data = await apiGet("/api/ads/meta/lead-forms", params);
19178
+ const fmt = csvOrJson(args);
19179
+ if (fmt !== "json") {
19180
+ writeAdsOutput(data, fmt);
19181
+ return;
19182
+ }
19183
+ const hints = leadFormHints(data);
19184
+ writeJsonEnvelope(hints.length > 0 ? { ok: true, data, hints } : { ok: true, data });
19185
+ } catch (err) {
19186
+ handleLeadsError(err);
19187
+ }
19188
+ }
19189
+ });
19190
+ var leadsCommand2 = defineCommand64({
19191
+ meta: {
19192
+ name: "leads",
19193
+ description: `Read the leads an instant form collected. Every question comes back; email and phone answers are MASKED unless you pass --full, so you can report on what a form is collecting without moving contact details around.
19194
+
19195
+ Examples:
19196
+ baker ads meta leads --form-id 987654321
19197
+ baker ads meta leads --form-id 987654321 --since 2026-08-01 --until 2026-08-31
19198
+ baker ads meta leads --ad-id 6123456789 --limit 50
19199
+ baker ads meta leads --form-id 987654321 --after <nextCursor> # the next page
19200
+ baker ads meta leads --form-id 987654321 --full # raw contact details \u2014 only when handing leads over
19201
+
19202
+ Results are PAGED. A response carrying \`nextCursor\` is not the whole set \u2014 follow it before reporting any total.`
19203
+ },
19204
+ args: {
19205
+ "form-id": { type: "string", description: "Instant form ID (from `baker ads meta lead-forms`)" },
19206
+ "ad-id": { type: "string", description: "Read one ad's leads instead of a whole form" },
19207
+ since: { type: "string", description: "Earliest submission date, YYYY-MM-DD" },
19208
+ until: { type: "string", description: "Latest submission date, YYYY-MM-DD (inclusive)" },
19209
+ limit: { type: "string", description: "Leads per page (default 100, max 500)" },
19210
+ after: { type: "string", description: "Cursor from a previous call's nextCursor" },
19211
+ full: { type: "boolean", description: "Return raw contact details instead of masked ones" },
19212
+ output: { type: "string", description: "Output format", default: "json" }
19213
+ },
19214
+ run: async ({ args }) => {
19215
+ try {
19216
+ const formId = args["form-id"];
19217
+ const adId = args["ad-id"];
19218
+ if (!formId && !adId) {
19219
+ handleLeadsError(new Error("Pass --form-id (from `baker ads meta lead-forms`) or --ad-id."));
19220
+ }
19221
+ const params = {};
19222
+ if (formId) params["form-id"] = formId;
19223
+ if (adId) params["ad-id"] = adId;
19224
+ if (args.since) params.since = args.since;
19225
+ if (args.until) params.until = args.until;
19226
+ if (args.limit) params.limit = String(args.limit);
19227
+ if (args.after) params.after = String(args.after);
19228
+ if (args.full) params.full = "true";
19229
+ const page = await apiGet("/api/ads/meta/leads", params);
19230
+ const fmt = csvOrJson(args);
19231
+ if (fmt !== "json") {
19232
+ writeAdsOutput(page.leads, fmt);
19233
+ return;
19234
+ }
19235
+ writeJsonEnvelope({
19236
+ ok: true,
19237
+ data: page.leads,
19238
+ ...page.nextCursor ? { nextCursor: page.nextCursor } : {},
19239
+ hints: leadPageHints(page, args.full === true)
19240
+ });
19241
+ } catch (err) {
19242
+ handleLeadsError(err);
19243
+ }
19244
+ }
19245
+ });
19246
+
19247
+ // src/commands/ads/meta/media.ts
19248
+ import { defineCommand as defineCommand65 } from "citty";
19249
+ var metaMediaCommand = defineCommand65({
19075
19250
  meta: {
19076
19251
  name: "media",
19077
19252
  description: "Stage Baker library media uploads to Meta so creatives can reference them. Subcommand: upload. Publishes an ad-image hash or video id a creative binds via --image-ref/--video-ref."
@@ -19080,7 +19255,7 @@ var metaMediaCommand = defineCommand64({
19080
19255
  });
19081
19256
 
19082
19257
  // src/commands/ads/meta/pages.ts
19083
- import { defineCommand as defineCommand65 } from "citty";
19258
+ import { defineCommand as defineCommand66 } from "citty";
19084
19259
  function advertisablePages(data) {
19085
19260
  return data.filter((p) => Array.isArray(p.tasks) && p.tasks.includes("ADVERTISE"));
19086
19261
  }
@@ -19098,7 +19273,7 @@ function pageSelectionHints(data) {
19098
19273
  }
19099
19274
  return [];
19100
19275
  }
19101
- var pagesCommand = defineCommand65({
19276
+ var pagesCommand = defineCommand66({
19102
19277
  meta: {
19103
19278
  name: "pages",
19104
19279
  description: `List the Facebook Pages the connected user manages. Every Meta ad publishes from a Page, so use this to identify the Page an ad should run from. The 'tasks' field shows what the user can do on each Page (ADVERTISE means it can back ads). If exactly one Page can ADVERTISE, use it; if more than one can, confirm with the user which Page to use; if none can, ask the user to grant Advertise access \u2014 a wrong or non-advertising Page publishes under the wrong brand identity.
@@ -19129,8 +19304,8 @@ Examples:
19129
19304
  });
19130
19305
 
19131
19306
  // src/commands/ads/meta/pixels.ts
19132
- import { defineCommand as defineCommand66 } from "citty";
19133
- var pixelsCommand = defineCommand66({
19307
+ import { defineCommand as defineCommand67 } from "citty";
19308
+ var pixelsCommand = defineCommand67({
19134
19309
  meta: {
19135
19310
  name: "pixels",
19136
19311
  description: `List Meta Pixels for an ad account, or fetch firing stats for one pixel.
@@ -19212,7 +19387,7 @@ function emit(data, args, warnings = []) {
19212
19387
 
19213
19388
  // src/commands/ads/meta/preview.ts
19214
19389
  import { writeFileSync as writeFileSync2 } from "fs";
19215
- import { defineCommand as defineCommand67 } from "citty";
19390
+ import { defineCommand as defineCommand68 } from "citty";
19216
19391
  var VALID_AD_FORMATS = [
19217
19392
  "DESKTOP_FEED_STANDARD",
19218
19393
  "MOBILE_FEED_STANDARD",
@@ -19274,7 +19449,7 @@ function listPlacements() {
19274
19449
  const instagram = Object.keys(INSTAGRAM_PREVIEW_FORMATS).join(", ");
19275
19450
  return `facebook \u2014 ${facebook}; instagram \u2014 ${instagram}`;
19276
19451
  }
19277
- var previewCommand2 = defineCommand67({
19452
+ var previewCommand2 = defineCommand68({
19278
19453
  meta: {
19279
19454
  name: "preview",
19280
19455
  description: `Generate a Meta-hosted preview iframe for a creative or ad. Returns iframe HTML which you
@@ -19353,7 +19528,7 @@ Examples:
19353
19528
  });
19354
19529
 
19355
19530
  // src/commands/ads/meta/index.ts
19356
- var metaCommand = defineCommand68({
19531
+ var metaCommand = defineCommand69({
19357
19532
  meta: {
19358
19533
  name: "meta",
19359
19534
  description: `Meta Marketing API \u2014 AI-first command surface (Facebook + Instagram ads).
@@ -19363,6 +19538,8 @@ Discovery:
19363
19538
  baker ads meta accounts --include-all \u2014 every account the token can see
19364
19539
  baker ads meta businesses \u2014 Business Manager IDs
19365
19540
  baker ads meta pages \u2014 Facebook Pages the user manages (an ad's identity)
19541
+ baker ads meta lead-forms --page-id 100635183117758 \u2014 instant (lead) forms on a Page, with lead counts
19542
+ baker ads meta leads --form-id 987654321 \u2014 the leads one form collected (contact details masked)
19366
19543
 
19367
19544
  Snapshot a running account (default = ACTIVE only):
19368
19545
  baker ads meta campaigns --account-id act_123
@@ -19395,6 +19572,8 @@ Full guide: __tooling__/docs/tools/baker/ads-meta.md`
19395
19572
  account: accountCommand2,
19396
19573
  businesses: businessesCommand,
19397
19574
  pages: pagesCommand,
19575
+ "lead-forms": leadFormsCommand2,
19576
+ leads: leadsCommand2,
19398
19577
  campaigns: campaignsCommand3,
19399
19578
  adsets: adsetsCommand,
19400
19579
  ads: adsListCommand,
@@ -19410,10 +19589,10 @@ Full guide: __tooling__/docs/tools/baker/ads-meta.md`
19410
19589
  });
19411
19590
 
19412
19591
  // src/commands/ads/x/index.ts
19413
- import { defineCommand as defineCommand85 } from "citty";
19592
+ import { defineCommand as defineCommand86 } from "citty";
19414
19593
 
19415
19594
  // src/commands/ads/x/accounts.ts
19416
- import { defineCommand as defineCommand69 } from "citty";
19595
+ import { defineCommand as defineCommand70 } from "citty";
19417
19596
  registerSchema({
19418
19597
  command: "ads.x.accounts",
19419
19598
  description: "List the X Ads accounts this company connected \u2014 there can be several, and every one of them is yours to work in. Returns accounts with id (base36), name, approval_status, timezone, currency. Run this first to find account IDs for other commands.",
@@ -19450,7 +19629,7 @@ function handleAccountsError2(err) {
19450
19629
  writeAdsJson({ ok: false, error: { code: "NETWORK_ERROR", message: "Unexpected error" } });
19451
19630
  process.exit(1);
19452
19631
  }
19453
- var accountsCommand4 = defineCommand69({
19632
+ var accountsCommand4 = defineCommand70({
19454
19633
  meta: {
19455
19634
  name: "accounts",
19456
19635
  description: `List accessible X Ads accounts. Returns account IDs needed for all other commands.
@@ -19490,7 +19669,7 @@ Examples:
19490
19669
  });
19491
19670
 
19492
19671
  // src/commands/ads/x/active-entities.ts
19493
- import { defineCommand as defineCommand70 } from "citty";
19672
+ import { defineCommand as defineCommand71 } from "citty";
19494
19673
 
19495
19674
  // src/commands/ads/x/error-parser.ts
19496
19675
  function mapXErrorCode(message) {
@@ -19641,7 +19820,7 @@ function parseCsv(v) {
19641
19820
  const parts = v.split(",").map((s) => s.trim()).filter(Boolean);
19642
19821
  return parts.length > 0 ? parts : void 0;
19643
19822
  }
19644
- var activeEntitiesCommand = defineCommand70({
19823
+ var activeEntitiesCommand = defineCommand71({
19645
19824
  meta: {
19646
19825
  name: "active-entities",
19647
19826
  description: `List entities with metric activity in a time range.
@@ -19699,7 +19878,7 @@ Examples:
19699
19878
  });
19700
19879
 
19701
19880
  // src/commands/ads/x/audiences.ts
19702
- import { defineCommand as defineCommand71 } from "citty";
19881
+ import { defineCommand as defineCommand72 } from "citty";
19703
19882
  registerSchema({
19704
19883
  command: "ads.x.audiences",
19705
19884
  description: "List custom audiences for an X Ads account. Returns id, name, audience_size, audience_type, targetable status. Audiences need 100+ active users in the past 90 days to be targetable.",
@@ -19709,7 +19888,7 @@ registerSchema({
19709
19888
  output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" }
19710
19889
  }
19711
19890
  });
19712
- var audiencesCommand4 = defineCommand71({
19891
+ var audiencesCommand4 = defineCommand72({
19713
19892
  meta: {
19714
19893
  name: "audiences",
19715
19894
  description: `List X Ads custom audiences.
@@ -19758,7 +19937,7 @@ Examples:
19758
19937
  });
19759
19938
 
19760
19939
  // src/commands/ads/x/campaigns.ts
19761
- import { defineCommand as defineCommand72 } from "citty";
19940
+ import { defineCommand as defineCommand73 } from "citty";
19762
19941
 
19763
19942
  // src/commands/ads/x/run-list.ts
19764
19943
  function buildCleanParams(opts) {
@@ -19822,7 +20001,7 @@ registerSchema({
19822
20001
  output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" }
19823
20002
  }
19824
20003
  });
19825
- var campaignsCommand4 = defineCommand72({
20004
+ var campaignsCommand4 = defineCommand73({
19826
20005
  meta: {
19827
20006
  name: "campaigns",
19828
20007
  description: `List X Ads campaigns. Returns budget, schedule, funding instrument, status.
@@ -19864,7 +20043,7 @@ Examples:
19864
20043
  });
19865
20044
 
19866
20045
  // src/commands/ads/x/cards.ts
19867
- import { defineCommand as defineCommand73 } from "citty";
20046
+ import { defineCommand as defineCommand74 } from "citty";
19868
20047
  registerSchema({
19869
20048
  command: "ads.x.cards",
19870
20049
  description: "List website cards, video cards, and carousels for an X Ads account.",
@@ -19874,7 +20053,7 @@ registerSchema({
19874
20053
  output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" }
19875
20054
  }
19876
20055
  });
19877
- var cardsCommand = defineCommand73({
20056
+ var cardsCommand = defineCommand74({
19878
20057
  meta: {
19879
20058
  name: "cards",
19880
20059
  description: `List X Ads cards (rich creatives).
@@ -19923,7 +20102,7 @@ Examples:
19923
20102
  });
19924
20103
 
19925
20104
  // src/commands/ads/x/funding.ts
19926
- import { defineCommand as defineCommand74 } from "citty";
20105
+ import { defineCommand as defineCommand75 } from "citty";
19927
20106
  registerSchema({
19928
20107
  command: "ads.x.funding",
19929
20108
  description: "List funding instruments for an X Ads account. Returns id, type, currency, credit_limit_local_micro, funded_amount_local_micro, status. Falls back to BAKER_X_ADS_ACCOUNT_ID env var.",
@@ -19933,7 +20112,7 @@ registerSchema({
19933
20112
  output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" }
19934
20113
  }
19935
20114
  });
19936
- var fundingCommand = defineCommand74({
20115
+ var fundingCommand = defineCommand75({
19937
20116
  meta: {
19938
20117
  name: "funding",
19939
20118
  description: `List funding instruments for an X Ads account.
@@ -19982,7 +20161,7 @@ Examples:
19982
20161
  });
19983
20162
 
19984
20163
  // src/commands/ads/x/line-items.ts
19985
- import { defineCommand as defineCommand75 } from "citty";
20164
+ import { defineCommand as defineCommand76 } from "citty";
19986
20165
  registerSchema({
19987
20166
  command: "ads.x.lineItems",
19988
20167
  description: "List line items (ad groups) for an X Ads account. Returns bid, product_type, objective, placements, schedule. Filter by campaign-ids or line-item-ids (CSV).",
@@ -19994,7 +20173,7 @@ registerSchema({
19994
20173
  "no-cache": { type: "boolean", description: "Skip cache", required: false }
19995
20174
  }
19996
20175
  });
19997
- var lineItemsCommand = defineCommand75({
20176
+ var lineItemsCommand = defineCommand76({
19998
20177
  meta: {
19999
20178
  name: "line-items",
20000
20179
  description: `List X Ads line items (ad groups).
@@ -20035,7 +20214,7 @@ Examples:
20035
20214
  });
20036
20215
 
20037
20216
  // src/commands/ads/x/media.ts
20038
- import { defineCommand as defineCommand76 } from "citty";
20217
+ import { defineCommand as defineCommand77 } from "citty";
20039
20218
  registerSchema({
20040
20219
  command: "ads.x.media",
20041
20220
  description: "List media assets in the X Ads media library (images, GIFs, videos). Filter by media-type (IMAGE, GIF, VIDEO).",
@@ -20046,7 +20225,7 @@ registerSchema({
20046
20225
  output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" }
20047
20226
  }
20048
20227
  });
20049
- var mediaCommand = defineCommand76({
20228
+ var mediaCommand = defineCommand77({
20050
20229
  meta: {
20051
20230
  name: "media",
20052
20231
  description: `List media assets in the X Ads media library.
@@ -20098,7 +20277,7 @@ Examples:
20098
20277
  });
20099
20278
 
20100
20279
  // src/commands/ads/x/promoted-tweets.ts
20101
- import { defineCommand as defineCommand77 } from "citty";
20280
+ import { defineCommand as defineCommand78 } from "citty";
20102
20281
  registerSchema({
20103
20282
  command: "ads.x.promotedTweets",
20104
20283
  description: "List promoted tweets for an X Ads account. Returns id, line_item_id, tweet_id, approval_status. Filter by line-item-ids (CSV).",
@@ -20109,7 +20288,7 @@ registerSchema({
20109
20288
  "no-cache": { type: "boolean", description: "Skip cache", required: false }
20110
20289
  }
20111
20290
  });
20112
- var promotedTweetsCommand = defineCommand77({
20291
+ var promotedTweetsCommand = defineCommand78({
20113
20292
  meta: {
20114
20293
  name: "promoted-tweets",
20115
20294
  description: `List X Ads promoted tweets.
@@ -20163,11 +20342,11 @@ Examples:
20163
20342
  });
20164
20343
 
20165
20344
  // src/commands/ads/x/stats/index.ts
20166
- import { defineCommand as defineCommand82 } from "citty";
20345
+ import { defineCommand as defineCommand83 } from "citty";
20167
20346
 
20168
20347
  // src/commands/ads/x/stats/job.ts
20169
20348
  import { gunzipSync } from "zlib";
20170
- import { defineCommand as defineCommand78 } from "citty";
20349
+ import { defineCommand as defineCommand79 } from "citty";
20171
20350
  var POLL_INTERVAL_MS2 = 1e4;
20172
20351
  var DEADLINE_MS = 12 * 60 * 1e3;
20173
20352
  var RESULT_CACHE_TTL_MS = 6 * 60 * 60 * 1e3;
@@ -20237,7 +20416,7 @@ async function pollUntilDone(accountId, jobId) {
20237
20416
  function buildCacheKey(body) {
20238
20417
  return `stats-job:${JSON.stringify(body)}`;
20239
20418
  }
20240
- var statsJobCommand = defineCommand78({
20419
+ var statsJobCommand = defineCommand79({
20241
20420
  meta: {
20242
20421
  name: "job",
20243
20422
  description: `Async X Ads stats job, sync from the CLI's perspective. Creates \u2192 polls \u2192 downloads \u2192 returns.
@@ -20342,7 +20521,7 @@ For fine-grained control (don't wait, poll yourself), use:
20342
20521
  });
20343
20522
 
20344
20523
  // src/commands/ads/x/stats/job-create.ts
20345
- import { defineCommand as defineCommand79 } from "citty";
20524
+ import { defineCommand as defineCommand80 } from "citty";
20346
20525
  registerSchema({
20347
20526
  command: "ads.x.statsJobCreate",
20348
20527
  description: "Create an asynchronous X Ads stats job (range up to 90 days non-segmented, 45 days segmented). Returns a job id; poll with `stats job-status`. Times must be ISO 8601 hour-aligned.",
@@ -20365,7 +20544,7 @@ function parseCsv3(v) {
20365
20544
  const parts = v.split(",").map((s) => s.trim()).filter(Boolean);
20366
20545
  return parts.length > 0 ? parts : void 0;
20367
20546
  }
20368
- var statsJobCreateCommand = defineCommand79({
20547
+ var statsJobCreateCommand = defineCommand80({
20369
20548
  meta: {
20370
20549
  name: "job-create",
20371
20550
  description: `Create an async X Ads stats job (up to 90 days, supports segmentation).
@@ -20428,7 +20607,7 @@ Examples:
20428
20607
  });
20429
20608
 
20430
20609
  // src/commands/ads/x/stats/job-status.ts
20431
- import { defineCommand as defineCommand80 } from "citty";
20610
+ import { defineCommand as defineCommand81 } from "citty";
20432
20611
  registerSchema({
20433
20612
  command: "ads.x.statsJobStatus",
20434
20613
  description: "Check the status of one or more X Ads stats jobs. Returns status (PROCESSING|SUCCESS|FAILED) and a downloadable url when SUCCESS. Pass --job-id or --job-ids (CSV).",
@@ -20438,7 +20617,7 @@ registerSchema({
20438
20617
  "job-ids": { type: "string", description: "CSV of job IDs", required: false }
20439
20618
  }
20440
20619
  });
20441
- var statsJobStatusCommand = defineCommand80({
20620
+ var statsJobStatusCommand = defineCommand81({
20442
20621
  meta: {
20443
20622
  name: "job-status",
20444
20623
  description: `Poll the status of an async X Ads stats job.
@@ -20479,7 +20658,7 @@ Examples:
20479
20658
  });
20480
20659
 
20481
20660
  // src/commands/ads/x/stats/sync.ts
20482
- import { defineCommand as defineCommand81 } from "citty";
20661
+ import { defineCommand as defineCommand82 } from "citty";
20483
20662
 
20484
20663
  // src/commands/ads/x/presets.ts
20485
20664
  var X_STATS_PRESETS = [
@@ -20638,7 +20817,7 @@ async function runSync(args, q) {
20638
20817
  process.exit(1);
20639
20818
  }
20640
20819
  }
20641
- var statsSyncCommand = defineCommand81({
20820
+ var statsSyncCommand = defineCommand82({
20642
20821
  meta: {
20643
20822
  name: "sync",
20644
20823
  description: `Synchronous X Ads analytics (max 7-day window).
@@ -20681,7 +20860,7 @@ Examples:
20681
20860
  });
20682
20861
 
20683
20862
  // src/commands/ads/x/stats/index.ts
20684
- var statsCommand = defineCommand82({
20863
+ var statsCommand = defineCommand83({
20685
20864
  meta: {
20686
20865
  name: "stats",
20687
20866
  description: `X Ads analytics. Sync (\u22647 days, no segmentation) or async jobs (\u226490 days, segmentable).
@@ -20709,7 +20888,7 @@ Examples:
20709
20888
  });
20710
20889
 
20711
20890
  // src/commands/ads/x/targeting-constants.ts
20712
- import { defineCommand as defineCommand83 } from "citty";
20891
+ import { defineCommand as defineCommand84 } from "citty";
20713
20892
  var ALLOWED_CONSTANTS = [
20714
20893
  "locations",
20715
20894
  "interests",
@@ -20737,7 +20916,7 @@ registerSchema({
20737
20916
  "no-cache": { type: "boolean", description: "Skip cache", required: false }
20738
20917
  }
20739
20918
  });
20740
- var targetingConstantsCommand = defineCommand83({
20919
+ var targetingConstantsCommand = defineCommand84({
20741
20920
  meta: {
20742
20921
  name: "targeting-constants",
20743
20922
  description: `Lookup X Ads targeting constants.
@@ -20787,7 +20966,7 @@ Examples:
20787
20966
  });
20788
20967
 
20789
20968
  // src/commands/ads/x/targeting-criteria.ts
20790
- import { defineCommand as defineCommand84 } from "citty";
20969
+ import { defineCommand as defineCommand85 } from "citty";
20791
20970
  registerSchema({
20792
20971
  command: "ads.x.targetingCriteria",
20793
20972
  description: "List targeting criteria attached to line items in an X Ads account. Returns targeting_type, targeting_value, name, operator_type per criterion. Filter by line-item-ids.",
@@ -20797,7 +20976,7 @@ registerSchema({
20797
20976
  "no-cache": { type: "boolean", description: "Skip cache", required: false }
20798
20977
  }
20799
20978
  });
20800
- var targetingCriteriaCommand = defineCommand84({
20979
+ var targetingCriteriaCommand = defineCommand85({
20801
20980
  meta: {
20802
20981
  name: "targeting-criteria",
20803
20982
  description: `List targeting criteria attached to line items.
@@ -20848,7 +21027,7 @@ Examples:
20848
21027
  });
20849
21028
 
20850
21029
  // src/commands/ads/x/index.ts
20851
- var xCommand = defineCommand85({
21030
+ var xCommand = defineCommand86({
20852
21031
  meta: {
20853
21032
  name: "x",
20854
21033
  description: `X (Twitter) Ads commands. Read campaigns, line items, promoted tweets, creatives, audiences, and analytics.
@@ -20887,7 +21066,7 @@ Full guide: __tooling__/docs/tools/baker/ads-x.md`
20887
21066
  });
20888
21067
 
20889
21068
  // src/commands/ads/index.ts
20890
- var adsCommand2 = defineCommand86({
21069
+ var adsCommand2 = defineCommand87({
20891
21070
  meta: {
20892
21071
  name: "ads",
20893
21072
  description: `Ad platform commands. Each platform exposes its own native command surface \u2014 no forced parity.
@@ -20918,10 +21097,10 @@ Full guides: __tooling__/docs/tools/baker/ads-<platform>.md (google|meta|linkedi
20918
21097
  });
20919
21098
 
20920
21099
  // src/commands/avatars/index.ts
20921
- import { defineCommand as defineCommand92 } from "citty";
21100
+ import { defineCommand as defineCommand93 } from "citty";
20922
21101
 
20923
21102
  // src/commands/avatars/create.ts
20924
- import { defineCommand as defineCommand87 } from "citty";
21103
+ import { defineCommand as defineCommand88 } from "citty";
20925
21104
 
20926
21105
  // src/commands/avatars/casting.ts
20927
21106
  var VERBATIM_RULE = "Copy `subjectDescription` into the prompt VERBATIM, word for word. Re-phrasing it per generation is the other reason a face drifts across a set \u2014 treat it as an identifier that happens to read as prose.";
@@ -21188,7 +21367,7 @@ registerSchema({
21188
21367
  "voice-description": { type: "string", description: "How the voice should sound", required: false }
21189
21368
  }
21190
21369
  });
21191
- var createCommand2 = defineCommand87({
21370
+ var createCommand2 = defineCommand88({
21192
21371
  meta: {
21193
21372
  name: "create",
21194
21373
  description: 'Cast a new avatar (reusable AI presenter). Example: baker avatars create --name "Marta" --subject "woman in her early 40s, shoulder-length dark hair, light olive skin, warm open face" --persona "friendly product expert". Returns while the identity sheet is still building.'
@@ -21269,7 +21448,7 @@ var createCommand2 = defineCommand87({
21269
21448
  });
21270
21449
 
21271
21450
  // src/commands/avatars/delete.ts
21272
- import { defineCommand as defineCommand88 } from "citty";
21451
+ import { defineCommand as defineCommand89 } from "citty";
21273
21452
  registerSchema({
21274
21453
  command: "avatars.delete",
21275
21454
  description: "Remove an avatar. Prefer --archive: it retires the avatar so it stops showing in the roster and must not be cast again, while past work and @handle mentions still resolve. Without --archive the avatar is gone for good and the mention resolves nowhere. Confirm with the user first \u2014 this is their cast, and it is not yours to retire. --dry-run previews.",
@@ -21284,7 +21463,7 @@ registerSchema({
21284
21463
  "dry-run": { type: "boolean", description: "Preview without removing anything", required: false, default: false }
21285
21464
  }
21286
21465
  });
21287
- var deleteCommand = defineCommand88({
21466
+ var deleteCommand = defineCommand89({
21288
21467
  meta: {
21289
21468
  name: "delete",
21290
21469
  description: "Remove an avatar. Prefer --archive (retire, past work still resolves) over a hard delete. Example: baker avatars delete marta --archive --dry-run"
@@ -21318,7 +21497,7 @@ var deleteCommand = defineCommand88({
21318
21497
  });
21319
21498
 
21320
21499
  // src/commands/avatars/get.ts
21321
- import { defineCommand as defineCommand89 } from "citty";
21500
+ import { defineCommand as defineCommand90 } from "citty";
21322
21501
  registerSchema({
21323
21502
  command: "avatars.get",
21324
21503
  description: "Read one avatar by handle \u2014 the command you run before casting it. Returns its status (only `ready` can be cast), the identity sheet URL every render must be grounded on via --reference, and the subject description that goes into the prompt VERBATIM. Add --full for the whole written profile (persona, speech, motion, wardrobe, setting, guardrails, voice, source photos).",
@@ -21332,7 +21511,7 @@ registerSchema({
21332
21511
  }
21333
21512
  }
21334
21513
  });
21335
- var getCommand2 = defineCommand89({
21514
+ var getCommand2 = defineCommand90({
21336
21515
  meta: {
21337
21516
  name: "get",
21338
21517
  description: "Read one avatar by handle: status, identity sheet URL for --reference, and the subject description to reuse verbatim. Example: baker avatars get marta --full"
@@ -21373,7 +21552,7 @@ var getCommand2 = defineCommand89({
21373
21552
  });
21374
21553
 
21375
21554
  // src/commands/avatars/list.ts
21376
- import { defineCommand as defineCommand90 } from "citty";
21555
+ import { defineCommand as defineCommand91 } from "citty";
21377
21556
  var STATUSES = ["generating", "ready", "error", "archived"];
21378
21557
  registerSchema({
21379
21558
  command: "avatars.list",
@@ -21388,7 +21567,7 @@ registerSchema({
21388
21567
  limit: { type: "number", description: "Max avatars to return (1-100)", required: false }
21389
21568
  }
21390
21569
  });
21391
- var listCommand10 = defineCommand90({
21570
+ var listCommand10 = defineCommand91({
21392
21571
  meta: {
21393
21572
  name: "list",
21394
21573
  description: "List the company's avatars (reusable AI presenters). Only `ready` ones can be cast. Example: baker avatars list --status ready --output md"
@@ -21422,7 +21601,7 @@ var listCommand10 = defineCommand90({
21422
21601
  });
21423
21602
 
21424
21603
  // src/commands/avatars/update.ts
21425
- import { defineCommand as defineCommand91 } from "citty";
21604
+ import { defineCommand as defineCommand92 } from "citty";
21426
21605
  function readUpdateArgs(args) {
21427
21606
  const handle = (args.handle || args["avatar-handle"])?.trim();
21428
21607
  if (!handle) {
@@ -21483,7 +21662,7 @@ registerSchema({
21483
21662
  }
21484
21663
  }
21485
21664
  });
21486
- var updateCommand2 = defineCommand91({
21665
+ var updateCommand2 = defineCommand92({
21487
21666
  meta: {
21488
21667
  name: "update",
21489
21668
  description: 'Edit an avatar; profile flags merge over what is stored. Example: baker avatars update marta --subject "woman in her early 50s, silver bob" --regenerate-sheet'
@@ -21546,7 +21725,7 @@ var updateCommand2 = defineCommand91({
21546
21725
  });
21547
21726
 
21548
21727
  // src/commands/avatars/index.ts
21549
- var avatarsCommand = defineCommand92({
21728
+ var avatarsCommand = defineCommand93({
21550
21729
  meta: {
21551
21730
  name: "avatars",
21552
21731
  description: `Reusable AI presenters this company can cast into images and video. An avatar holds one settled identity, so the same face can carry a whole campaign. Subcommands: list, get, create, update, delete.
@@ -21576,12 +21755,12 @@ Full guide: __tooling__/docs/tools/baker/avatars.md`
21576
21755
  });
21577
21756
 
21578
21757
  // src/commands/brand/index.ts
21579
- import { defineCommand as defineCommand94 } from "citty";
21758
+ import { defineCommand as defineCommand95 } from "citty";
21580
21759
 
21581
21760
  // src/commands/brand/fonts.ts
21582
21761
  import { mkdir, readdir, readFile as readFile2, writeFile } from "fs/promises";
21583
21762
  import path2 from "path";
21584
- import { defineCommand as defineCommand93 } from "citty";
21763
+ import { defineCommand as defineCommand94 } from "citty";
21585
21764
 
21586
21765
  // src/engine/brand/fonts.ts
21587
21766
  import { posix } from "path";
@@ -22425,7 +22604,7 @@ async function unresolvedAction(css, unresolved) {
22425
22604
  }
22426
22605
  return `Run \`baker brand fonts fetch "${unresolved[0]}"\` to self-host it, which writes the @font-face for you. For a face no catalogue carries, add an @font-face pointing at a file in ${FONTS_DIR}.`;
22427
22606
  }
22428
- var fontsCheckCommand = defineCommand93({
22607
+ var fontsCheckCommand = defineCommand94({
22429
22608
  meta: {
22430
22609
  name: "check",
22431
22610
  description: "Verify the brand's fonts really exist. First: every --font-* family in src/styles/global.css must be provided by a local @font-face, or it renders as a fallback on every page \u2014 a Google @import does not provide one here, the build drops it before the page loads. Then, for families still requested from Google, ask Google what it actually serves \u2014 a weight nobody serves is silently synthesized."
@@ -22477,7 +22656,7 @@ var fontsCheckCommand = defineCommand93({
22477
22656
  });
22478
22657
  }
22479
22658
  });
22480
- var fontsFetchCommand = defineCommand93({
22659
+ var fontsFetchCommand = defineCommand94({
22481
22660
  meta: {
22482
22661
  name: "fetch",
22483
22662
  description: "Download a font from Google Fonts or Fontsource into src/brand/fonts/ and write its @font-face into src/styles/global.css above @theme, so the family actually loads. Use when a brand font should be self-hosted rather than requested from a third party on every page load."
@@ -22578,7 +22757,7 @@ async function astroSources() {
22578
22757
  }
22579
22758
  return out;
22580
22759
  }
22581
- var fontsAdoptCommand = defineCommand93({
22760
+ var fontsAdoptCommand = defineCommand94({
22582
22761
  meta: {
22583
22762
  name: "adopt",
22584
22763
  description: "Move brand faces a page already self-hosts into src/styles/global.css, so every page loads them instead of just that one. Use when `check` reports a family as not loaded but the font files are already in src/brand/fonts/ \u2014 downloading it again would hand that page a different build of the same face."
@@ -22658,7 +22837,7 @@ var fontsAdoptCommand = defineCommand93({
22658
22837
  });
22659
22838
  }
22660
22839
  });
22661
- var fontsCommand = defineCommand93({
22840
+ var fontsCommand = defineCommand94({
22662
22841
  meta: {
22663
22842
  name: "fonts",
22664
22843
  description: `Verify and self-host the brand's typefaces.
@@ -22678,7 +22857,7 @@ Subcommands:
22678
22857
  });
22679
22858
 
22680
22859
  // src/commands/brand/index.ts
22681
- var brandCommand = defineCommand94({
22860
+ var brandCommand = defineCommand95({
22682
22861
  meta: {
22683
22862
  name: "brand",
22684
22863
  description: `Brand asset verification for src/brand/.
@@ -22694,11 +22873,11 @@ Subcommands:
22694
22873
  });
22695
22874
 
22696
22875
  // src/commands/canvas/index.ts
22697
- import { defineCommand as defineCommand105 } from "citty";
22876
+ import { defineCommand as defineCommand106 } from "citty";
22698
22877
 
22699
22878
  // src/commands/canvas/catalog.ts
22700
- import { defineCommand as defineCommand95 } from "citty";
22701
- var catalogCommand = defineCommand95({
22879
+ import { defineCommand as defineCommand96 } from "citty";
22880
+ var catalogCommand = defineCommand96({
22702
22881
  meta: {
22703
22882
  name: "catalog",
22704
22883
  description: "Print the agent-facing node catalog (JSON Schema). Includes every registered node grouped by category."
@@ -22713,7 +22892,7 @@ var catalogCommand = defineCommand95({
22713
22892
  // src/commands/canvas/critique.ts
22714
22893
  import { readFile as readFile3 } from "fs/promises";
22715
22894
  import path3 from "path";
22716
- import { defineCommand as defineCommand96 } from "citty";
22895
+ import { defineCommand as defineCommand97 } from "citty";
22717
22896
 
22718
22897
  // src/engine/scaffold/lib/critique.ts
22719
22898
  var VIBE_CUE = /\b(light|lighting|golden|moody|warm|cool|tone|grade|contrast|shadow|glow|rim|backlit|neon|soft)\b/i;
@@ -22833,7 +23012,7 @@ function critiqueCanvas(canvas) {
22833
23012
  }
22834
23013
 
22835
23014
  // src/commands/canvas/critique.ts
22836
- var critiqueCommand = defineCommand96({
23015
+ var critiqueCommand = defineCommand97({
22837
23016
  meta: {
22838
23017
  name: "critique",
22839
23018
  description: "Pre-spend creative critic (ADVISORY \u2014 never blocks). Scores a scaffolded creative BEFORE the billed render, so weak spots get fixed for free. A VIDEO creative is scored on hook strength, sound-off first-frame legibility, retention risk, and mechanism clarity; a STATIC ad on baked-text legibility risk, identity grounding, brand-type fidelity, and mechanism clarity. Ground a video hook against `baker winning-ads hooks` for a proven pattern."
@@ -22875,9 +23054,9 @@ import { execFile } from "child_process";
22875
23054
  import { readdir as readdir2, readFile as readFile4, stat } from "fs/promises";
22876
23055
  import path4 from "path";
22877
23056
  import { promisify } from "util";
22878
- import { defineCommand as defineCommand97 } from "citty";
23057
+ import { defineCommand as defineCommand98 } from "citty";
22879
23058
  var execFileAsync = promisify(execFile);
22880
- var inspectCommand = defineCommand97({
23059
+ var inspectCommand = defineCommand98({
22881
23060
  meta: {
22882
23061
  name: "inspect",
22883
23062
  description: "Dump a one-page summary of a canvas run: per-node duration + cache status, list of output files in the run dir, and optionally three thumbnail frames per video output. Pass either a run_id (resolved against --outputs-dir) or an absolute run directory."
@@ -22985,12 +23164,12 @@ async function probeDuration(filePath) {
22985
23164
 
22986
23165
  // src/commands/canvas/rerun.ts
22987
23166
  import path16 from "path";
22988
- import { defineCommand as defineCommand99 } from "citty";
23167
+ import { defineCommand as defineCommand100 } from "citty";
22989
23168
 
22990
23169
  // src/commands/canvas/run.ts
22991
23170
  import { readFile as readFile11 } from "fs/promises";
22992
23171
  import path15 from "path";
22993
- import { defineCommand as defineCommand98 } from "citty";
23172
+ import { defineCommand as defineCommand99 } from "citty";
22994
23173
 
22995
23174
  // src/commands/canvas/normalize-paths.ts
22996
23175
  import { existsSync as existsSync3, realpathSync } from "fs";
@@ -27241,7 +27420,7 @@ async function restoreRunSnapshot(manifest, targetDir, opts = {}) {
27241
27420
  }
27242
27421
 
27243
27422
  // src/commands/canvas/run.ts
27244
- var runCommand = defineCommand98({
27423
+ var runCommand = defineCommand99({
27245
27424
  meta: { name: "run", description: "Validate and execute a canvas JSON file." },
27246
27425
  args: {
27247
27426
  file: { type: "positional", required: true, description: "Path to canvas JSON" },
@@ -27621,7 +27800,7 @@ async function postInitialRunRecord(client, payload) {
27621
27800
 
27622
27801
  // src/commands/canvas/rerun.ts
27623
27802
  var SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
27624
- var rerunCommand = defineCommand99({
27803
+ var rerunCommand = defineCommand100({
27625
27804
  meta: {
27626
27805
  name: "rerun",
27627
27806
  description: "Re-run a creative's latest recorded canvas. Restores its definition files from run history first, so it works in a fresh workspace that never had the source chat's files \u2014 an interrupted run resumes (in-flight jobs re-attach), a completed one re-renders from the cache."
@@ -27718,7 +27897,7 @@ async function fetchManifest(url) {
27718
27897
  // src/commands/canvas/scaffold-static-ad.ts
27719
27898
  import { access, mkdir as mkdir6, readFile as readFile13, writeFile as writeFile8 } from "fs/promises";
27720
27899
  import path20 from "path";
27721
- import { defineCommand as defineCommand101 } from "citty";
27900
+ import { defineCommand as defineCommand102 } from "citty";
27722
27901
 
27723
27902
  // src/engine/scaffold/staticAd.ts
27724
27903
  import { z as z26 } from "zod";
@@ -28068,7 +28247,7 @@ function isValidScaffoldSlug(slug) {
28068
28247
  // src/commands/canvas/sync-definition.ts
28069
28248
  import { readdir as readdir6, readFile as readFile12, stat as stat3 } from "fs/promises";
28070
28249
  import path19 from "path";
28071
- import { defineCommand as defineCommand100 } from "citty";
28250
+ import { defineCommand as defineCommand101 } from "citty";
28072
28251
 
28073
28252
  // src/commands/canvas/definition-graph.ts
28074
28253
  var MAX_NODES = 300;
@@ -28181,7 +28360,7 @@ async function resolveCanvasPath(inputPath) {
28181
28360
  const chosen = (slug ? canvases.find((name) => name === `${slug}.canvas.json`) : void 0) ?? canvases[0];
28182
28361
  return chosen ? path19.join(dir, chosen) : null;
28183
28362
  }
28184
- var syncDefinitionCommand = defineCommand100({
28363
+ var syncDefinitionCommand = defineCommand101({
28185
28364
  meta: {
28186
28365
  name: "sync-definition",
28187
28366
  description: "Push a creative's current node-graph + input thumbnails to the dashboard without rendering. Runs automatically when you edit a creative's canvas.json or prompt.json."
@@ -28411,7 +28590,7 @@ async function runVisionPasses(canvas) {
28411
28590
  return fail3("read_outputs", e instanceof Error ? e.message : String(e));
28412
28591
  }
28413
28592
  }
28414
- var scaffoldStaticAdCommand = defineCommand101({
28593
+ var scaffoldStaticAdCommand = defineCommand102({
28415
28594
  meta: {
28416
28595
  name: "scaffold-static-ad",
28417
28596
  description: "Turn a source/inspiration image into a runnable static-ad canvas. Runs billed passes \u2014 image_describe (the blueprint, baked to prompt.json as the editable 'prompt'), an AI selection of the image's MAIN identity elements, and a structured global-layout pass (the column/row grid with per-region bounds and text sizes) \u2014 then scaffolds a canvas that wires one [TODO] ingest slot per element (logo/product/subject/badge + brand font) into image_generate. By default it also fans the hero out to the platform's placement ratios (via image_aspect_adapt \u2014 the hero ratio is free, the rest are billed AI recompositions); pass --placements none for a single base ad, or a preset to pick the set. Edit prompt.json and drop the real assets, then `baker canvas run` it."
@@ -28600,7 +28779,7 @@ var scaffoldStaticAdCommand = defineCommand101({
28600
28779
  import { access as access2, cp, mkdir as mkdir7, readFile as readFile16, rm as rm6, writeFile as writeFile9 } from "fs/promises";
28601
28780
  import { tmpdir as tmpdir2 } from "os";
28602
28781
  import path23 from "path";
28603
- import { defineCommand as defineCommand102 } from "citty";
28782
+ import { defineCommand as defineCommand103 } from "citty";
28604
28783
 
28605
28784
  // src/engine/scaffold/lib/model-router.ts
28606
28785
  var SEEDANCE = "bytedance/seedance-2.0";
@@ -29061,7 +29240,7 @@ async function runAnalysisPasses(deconstructCanvas, selectModel) {
29061
29240
  return fail4("deconstruct", e instanceof Error ? e.message : String(e));
29062
29241
  }
29063
29242
  }
29064
- var scaffoldVideoCommand = defineCommand102({
29243
+ var scaffoldVideoCommand = defineCommand103({
29065
29244
  meta: {
29066
29245
  name: "scaffold-video",
29067
29246
  description: "Turn a reference video into a runnable reproduction canvas in one command. Runs billed passes \u2014 video_deconstruct (the full scene-by-scene blueprint + transcript, baked to a split, editable blueprint: a global prompt.json plus one small scenes/sNN.json per scene) and an AI selection of the video's RECURRING identity elements (person/animal/product/logo) \u2014 then scaffolds a pipeline where every scene boundary is a static-ad-grade frame (the blueprint as target_blueprint, a reference legend, the real frame as anchor) and each recurring element gets ONE shared [TODO] ingest slot wired into every frame it appears in. The clips feed Seedance an ultra-detailed motion brief (action, camera, dialogue, transcript). Edit a scene's scenes/sNN.json (or prompt.json for global cast/palette/brand), drop the real source images, then `baker canvas run`."
@@ -29371,7 +29550,7 @@ var scaffoldVideoCommand = defineCommand102({
29371
29550
  // src/commands/canvas/set-prompt.ts
29372
29551
  import { readFile as readFile17, writeFile as writeFile10 } from "fs/promises";
29373
29552
  import path24 from "path";
29374
- import { defineCommand as defineCommand103 } from "citty";
29553
+ import { defineCommand as defineCommand104 } from "citty";
29375
29554
  function setNodePrompt(canvas, nodeId, text2) {
29376
29555
  const nodes = canvas?.nodes;
29377
29556
  if (!Array.isArray(nodes)) throw new Error("canvas has no nodes array");
@@ -29386,7 +29565,7 @@ function setNodePrompt(canvas, nodeId, text2) {
29386
29565
  newNodes[idx] = newNode;
29387
29566
  return { ...canvas, nodes: newNodes };
29388
29567
  }
29389
- var setPromptCommand = defineCommand103({
29568
+ var setPromptCommand = defineCommand104({
29390
29569
  meta: {
29391
29570
  name: "set-prompt",
29392
29571
  description: "Safely set a node's params.prompt (a frame description, motion prompt, etc.) without hand-editing the JSON. Prefer --text-file for multi-line/accented copy \u2014 it preserves UTF-8 exactly, unlike shell-quoted jq."
@@ -29446,8 +29625,8 @@ var setPromptCommand = defineCommand103({
29446
29625
  // src/commands/canvas/validate.ts
29447
29626
  import { readFile as readFile18 } from "fs/promises";
29448
29627
  import path25 from "path";
29449
- import { defineCommand as defineCommand104 } from "citty";
29450
- var validateCommand = defineCommand104({
29628
+ import { defineCommand as defineCommand105 } from "citty";
29629
+ var validateCommand = defineCommand105({
29451
29630
  meta: {
29452
29631
  name: "validate",
29453
29632
  description: "Validate a canvas JSON file (no execution). Includes a per-node cost preview and runs each node's deep validators (composition meta checks for hyperframe_render/_snapshot)."
@@ -29520,7 +29699,7 @@ var validateCommand = defineCommand104({
29520
29699
  });
29521
29700
 
29522
29701
  // src/commands/canvas/index.ts
29523
- var canvasCommand = defineCommand105({
29702
+ var canvasCommand = defineCommand106({
29524
29703
  meta: {
29525
29704
  name: "canvas",
29526
29705
  description: `Run Baker creative canvas JSON files locally. Local nodes execute in-process; remote nodes POST to the Convex backend gateway.
@@ -29554,7 +29733,7 @@ Full guide: __tooling__/docs/tools/baker/canvas.md`
29554
29733
  });
29555
29734
 
29556
29735
  // src/commands/capabilities/index.ts
29557
- import { defineCommand as defineCommand106 } from "citty";
29736
+ import { defineCommand as defineCommand107 } from "citty";
29558
29737
  registerSchema({
29559
29738
  command: "capabilities",
29560
29739
  description: "Start here, before promising the user anything on an ad platform, in Analytics, or in Tag Manager. Answers three questions in one call: what is connected and with what access, what a write on each surface actually does when it lands, and what CANNOT be done here and why. Run it with no arguments for every surface; name one surface to also get the exact fields every change on it accepts.",
@@ -29597,7 +29776,7 @@ function capabilityHints(surfaces) {
29597
29776
  }
29598
29777
  return hints;
29599
29778
  }
29600
- var runCapabilities = defineCommand106({
29779
+ var runCapabilities = defineCommand107({
29601
29780
  meta: {
29602
29781
  name: "capabilities",
29603
29782
  description: `What Baker can and cannot do for this company, before any work starts.
@@ -29653,7 +29832,7 @@ Full guide: __tooling__/docs/tools/baker/capabilities.md`
29653
29832
  var capabilitiesCommand = runCapabilities;
29654
29833
 
29655
29834
  // src/commands/chats/index.ts
29656
- import { defineCommand as defineCommand107 } from "citty";
29835
+ import { defineCommand as defineCommand108 } from "citty";
29657
29836
  var STATUS_GROUPS = ["active", "archived", "all"];
29658
29837
  var REPO_SURFACES = ["knowledge", "company", "brand", "landings", "flows", "creatives"];
29659
29838
  function parseBoundedInt(raw, name, min, max) {
@@ -29675,7 +29854,7 @@ registerSchema({
29675
29854
  full: { type: "boolean", description: "Include each Session's full change list", required: false, default: false }
29676
29855
  }
29677
29856
  });
29678
- var listCommand11 = defineCommand107({
29857
+ var listCommand11 = defineCommand108({
29679
29858
  meta: { name: "list", description: "List other Sessions on this account, newest first." },
29680
29859
  args: {
29681
29860
  status: { type: "string", description: "Filter: active|archived|all (default: all)", required: false },
@@ -29730,7 +29909,7 @@ registerSchema({
29730
29909
  }
29731
29910
  }
29732
29911
  });
29733
- var viewCommand = defineCommand107({
29912
+ var viewCommand = defineCommand108({
29734
29913
  meta: {
29735
29914
  name: "view",
29736
29915
  description: "Inspect one Session's full effects \u2014 git content + actions/tags/ads, kickoff, commits."
@@ -29774,7 +29953,7 @@ registerSchema({
29774
29953
  }
29775
29954
  }
29776
29955
  });
29777
- var transcriptCommand = defineCommand107({
29956
+ var transcriptCommand = defineCommand108({
29778
29957
  meta: { name: "transcript", description: "Read another Session's conversation." },
29779
29958
  args: {
29780
29959
  id: { type: "positional", description: "The Session id", required: true },
@@ -29826,7 +30005,7 @@ registerSchema({
29826
30005
  }
29827
30006
  }
29828
30007
  });
29829
- var diffCommand = defineCommand107({
30008
+ var diffCommand = defineCommand108({
29830
30009
  meta: { name: "diff", description: "See a published Session's real file-level changes." },
29831
30010
  args: {
29832
30011
  id: { type: "positional", description: "The Session id", required: true },
@@ -29870,7 +30049,7 @@ var diffCommand = defineCommand107({
29870
30049
  }
29871
30050
  }
29872
30051
  });
29873
- var chatsCommand = defineCommand107({
30052
+ var chatsCommand = defineCommand108({
29874
30053
  meta: {
29875
30054
  name: "chats",
29876
30055
  description: `Inspect other Sessions on this account (read-only): list them, view what they produced, read their conversation, and see their real file changes \u2014 so you can reuse past work for a new goal.
@@ -29885,10 +30064,10 @@ Full guide: __tooling__/docs/tools/baker/chats.md`
29885
30064
  });
29886
30065
 
29887
30066
  // src/commands/creatives/index.ts
29888
- import { defineCommand as defineCommand109 } from "citty";
30067
+ import { defineCommand as defineCommand110 } from "citty";
29889
30068
 
29890
30069
  // src/commands/creatives/publish.ts
29891
- import { defineCommand as defineCommand108 } from "citty";
30070
+ import { defineCommand as defineCommand109 } from "citty";
29892
30071
 
29893
30072
  // src/commands/images/api.ts
29894
30073
  import { readFile as readFile19 } from "fs/promises";
@@ -30035,7 +30214,7 @@ async function publishCreative(args, deps = defaultImageApiDeps) {
30035
30214
  chatId: chatIdFromEnv2()
30036
30215
  });
30037
30216
  }
30038
- var publishCommand = defineCommand108({
30217
+ var publishCommand = defineCommand109({
30039
30218
  meta: {
30040
30219
  name: "publish",
30041
30220
  description: "Publish a final static creative image to Baker Creatives and print the creative reference JSON."
@@ -30093,7 +30272,7 @@ var publishCommand = defineCommand108({
30093
30272
  });
30094
30273
 
30095
30274
  // src/commands/creatives/index.ts
30096
- var creativesCommand3 = defineCommand109({
30275
+ var creativesCommand3 = defineCommand110({
30097
30276
  meta: {
30098
30277
  name: "creatives",
30099
30278
  description: `Publish static ad creatives as first-class Baker outputs.
@@ -30110,11 +30289,11 @@ Full guide: __tooling__/docs/tools/baker/creatives.md`
30110
30289
  });
30111
30290
 
30112
30291
  // src/commands/flows/index.ts
30113
- import { defineCommand as defineCommand114 } from "citty";
30292
+ import { defineCommand as defineCommand115 } from "citty";
30114
30293
 
30115
30294
  // src/commands/flows/add.ts
30116
30295
  import { randomUUID } from "crypto";
30117
- import { defineCommand as defineCommand110 } from "citty";
30296
+ import { defineCommand as defineCommand111 } from "citty";
30118
30297
 
30119
30298
  // src/commands/flows/shared.ts
30120
30299
  import { existsSync as existsSync5, readdirSync as readdirSync2, readFileSync as readFileSync9, writeFileSync as writeFileSync3 } from "fs";
@@ -30324,7 +30503,7 @@ registerSchema({
30324
30503
  parent: { type: "string", description: "Parent node id. Omit to append to the root's children.", required: false }
30325
30504
  }
30326
30505
  });
30327
- var addNodeCommand = defineCommand110({
30506
+ var addNodeCommand = defineCommand111({
30328
30507
  meta: {
30329
30508
  name: "add-node",
30330
30509
  description: 'Add a step to a form, with the skeleton its type requires. Example: baker flows add-node contact --type customForm --name "Contact Info"'
@@ -30420,7 +30599,7 @@ registerSchema({
30420
30599
  }
30421
30600
  }
30422
30601
  });
30423
- var addSideEffectCommand = defineCommand110({
30602
+ var addSideEffectCommand = defineCommand111({
30424
30603
  meta: {
30425
30604
  name: "add-side-effect",
30426
30605
  description: "Add a side effect to a step, with the skeleton its type requires. Example: baker flows add-side-effect contact --node <id> --type googleSpreadsheet"
@@ -30502,7 +30681,7 @@ var addSideEffectCommand = defineCommand110({
30502
30681
 
30503
30682
  // src/commands/flows/map.ts
30504
30683
  import { readFileSync as readFileSync11 } from "fs";
30505
- import { defineCommand as defineCommand111 } from "citty";
30684
+ import { defineCommand as defineCommand112 } from "citty";
30506
30685
 
30507
30686
  // src/commands/flows/value-expression.ts
30508
30687
  import { existsSync as existsSync6, readFileSync as readFileSync10 } from "fs";
@@ -31275,7 +31454,7 @@ async function mapOptions(args, fromFile, into) {
31275
31454
  destinationFields: hubspotForm ? await hubspotFieldCatalog(hubspotForm) : void 0
31276
31455
  };
31277
31456
  }
31278
- var mapCommand = defineCommand111({
31457
+ var mapCommand = defineCommand112({
31279
31458
  meta: {
31280
31459
  name: "map",
31281
31460
  description: "Map form fields onto any value a side effect sends \u2014 never hand-write a mapping. Start here: baker flows map contact --from map.json --write"
@@ -31373,7 +31552,7 @@ var mapCommand = defineCommand111({
31373
31552
  });
31374
31553
 
31375
31554
  // src/commands/flows/normalize.ts
31376
- import { defineCommand as defineCommand112 } from "citty";
31555
+ import { defineCommand as defineCommand113 } from "citty";
31377
31556
  var OPTIONAL_STRINGS = ["oauthProviderId"];
31378
31557
  var ARRAY_FIELDS = [
31379
31558
  "fieldMapping",
@@ -31442,7 +31621,7 @@ registerSchema({
31442
31621
  }
31443
31622
  }
31444
31623
  });
31445
- var normalizeCommand = defineCommand112({
31624
+ var normalizeCommand = defineCommand113({
31446
31625
  meta: {
31447
31626
  name: "normalize",
31448
31627
  description: "Repair the shapes a form file is allowed to get slightly wrong. Example: baker flows normalize contact --write"
@@ -31473,7 +31652,7 @@ var normalizeCommand = defineCommand112({
31473
31652
  });
31474
31653
 
31475
31654
  // src/commands/flows/schema.ts
31476
- import { defineCommand as defineCommand113 } from "citty";
31655
+ import { defineCommand as defineCommand114 } from "citty";
31477
31656
  registerSchema({
31478
31657
  command: "flows.schema",
31479
31658
  description: "The shape of one node or side-effect type: a pasteable skeleton, who fills each part, and the reference file with the craft. Start here before authoring anything in a form's _data.json.",
@@ -31498,7 +31677,7 @@ function triggerHints(triggers) {
31498
31677
  `A side effect on this step carries \`triggerId: "${triggers.completion}"\`, and \`baker flows add-side-effect\` writes it for you. The trigger belongs to the STEP, not to the side-effect type: one that does not match is valid, ships, and never runs.` + (others.length > 0 ? ` Other moments this step raises: ${others.join(", ")}.` : "")
31499
31678
  ];
31500
31679
  }
31501
- var schemaCommand = defineCommand113({
31680
+ var schemaCommand = defineCommand114({
31502
31681
  meta: {
31503
31682
  name: "schema",
31504
31683
  description: "Show a node or side-effect type's shape. Start here: baker flows schema node customForm \xB7 baker flows schema side-effect googleSpreadsheet \xB7 baker flows schema (lists both)"
@@ -31632,7 +31811,7 @@ function displayName(slug) {
31632
31811
  const name = tree.displayName;
31633
31812
  return typeof name === "string" && name.trim() ? name.trim() : slug;
31634
31813
  }
31635
- var listCommand12 = defineCommand114({
31814
+ var listCommand12 = defineCommand115({
31636
31815
  meta: {
31637
31816
  name: "list",
31638
31817
  description: "List Forms in this workspace with the count of confidential fields still needing setup. Example: baker flows list"
@@ -31653,7 +31832,7 @@ var listCommand12 = defineCommand114({
31653
31832
  });
31654
31833
  }
31655
31834
  });
31656
- var showCommand3 = defineCommand114({
31835
+ var showCommand3 = defineCommand115({
31657
31836
  meta: {
31658
31837
  name: "show",
31659
31838
  description: "Show a Form's confidential fields and their configuration status (never secret values). Example: baker flows show contact"
@@ -31681,7 +31860,7 @@ var showCommand3 = defineCommand114({
31681
31860
  });
31682
31861
  }
31683
31862
  });
31684
- var flowsCommand = defineCommand114({
31863
+ var flowsCommand = defineCommand115({
31685
31864
  meta: {
31686
31865
  name: "flows",
31687
31866
  description: `Read and shape this workspace's Forms (flows).
@@ -31715,10 +31894,10 @@ Full guide: __tooling__/docs/tools/baker/flows.md`
31715
31894
  });
31716
31895
 
31717
31896
  // src/commands/ga4/index.ts
31718
- import { defineCommand as defineCommand121 } from "citty";
31897
+ import { defineCommand as defineCommand122 } from "citty";
31719
31898
 
31720
31899
  // src/commands/ga4/audit.ts
31721
- import { defineCommand as defineCommand115 } from "citty";
31900
+ import { defineCommand as defineCommand116 } from "citty";
31722
31901
 
31723
31902
  // src/commands/ga4/resolve.ts
31724
31903
  async function fetchProperties(useCache = true) {
@@ -31784,7 +31963,7 @@ registerSchema({
31784
31963
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
31785
31964
  }
31786
31965
  });
31787
- var auditCommand2 = defineCommand115({
31966
+ var auditCommand2 = defineCommand116({
31788
31967
  meta: {
31789
31968
  name: "audit",
31790
31969
  description: `Run all GA4 admin health checks. Returns property config with playbook warnings.
@@ -31839,7 +32018,7 @@ Examples:
31839
32018
  });
31840
32019
 
31841
32020
  // src/commands/ga4/config.ts
31842
- import { defineCommand as defineCommand116 } from "citty";
32021
+ import { defineCommand as defineCommand117 } from "citty";
31843
32022
 
31844
32023
  // src/commands/ga4/shared.ts
31845
32024
  import { readFileSync as readFileSync12 } from "fs";
@@ -32003,10 +32182,14 @@ async function draftList(json, chat) {
32003
32182
  // src/commands/ga4/config.ts
32004
32183
  registerSchema({
32005
32184
  command: "ga4.config",
32006
- description: "Read how a Google Analytics property is configured to measure: key events (conversions), custom dimensions and metrics, custom events, data streams and the data retention window. Start here before staging any change \u2014 every id an update or removal targets comes from this, and `canWrite` says whether this connection may change anything at all. Compact by default; pass --full for the raw Analytics objects.",
32185
+ description: "Read how a Google Analytics property is configured to measure: key events (conversions), custom dimensions and metrics, custom events, audiences, linked Google Ads accounts, data streams and the data retention window. Start here before staging any change \u2014 every id an update or removal targets comes from this, and `canWrite` says whether this connection may change anything at all. Compact by default; pass --full for the raw Analytics objects AND each website stream's enhanced measurement settings (the automatic events), which are the only way to see what is on before changing a toggle.",
32007
32186
  args: {
32008
32187
  "property-id": { type: "string", description: "GA4 property id (optional when one is connected)", required: false },
32009
- full: { type: "boolean", description: "Include the raw Analytics object for each entity", required: false }
32188
+ full: {
32189
+ type: "boolean",
32190
+ description: "Include the raw Analytics object for each entity, plus each website stream's enhanced measurement settings",
32191
+ required: false
32192
+ }
32010
32193
  }
32011
32194
  });
32012
32195
  function configHints(config) {
@@ -32031,7 +32214,7 @@ function configHints(config) {
32031
32214
  }
32032
32215
  return hints;
32033
32216
  }
32034
- var configCommand = defineCommand116({
32217
+ var configCommand = defineCommand117({
32035
32218
  meta: {
32036
32219
  name: "config",
32037
32220
  description: `Read how the property is configured to measure \u2014 key events, custom definitions, custom events, retention
@@ -32039,11 +32222,15 @@ var configCommand = defineCommand116({
32039
32222
  Examples:
32040
32223
  baker ga4 config
32041
32224
  baker ga4 config --property-id 123456789
32042
- baker ga4 config --full`
32225
+ baker ga4 config --full # + the automatic events each website stream collects today`
32043
32226
  },
32044
32227
  args: {
32045
32228
  "property-id": { type: "string", description: "GA4 property id", required: false },
32046
- full: { type: "boolean", description: "Include raw Analytics objects", required: false }
32229
+ full: {
32230
+ type: "boolean",
32231
+ description: "Include raw Analytics objects and enhanced measurement settings",
32232
+ required: false
32233
+ }
32047
32234
  },
32048
32235
  run: async ({ args }) => {
32049
32236
  try {
@@ -32059,7 +32246,7 @@ Examples:
32059
32246
  });
32060
32247
 
32061
32248
  // src/commands/ga4/draft.ts
32062
- import { defineCommand as defineCommand117 } from "citty";
32249
+ import { defineCommand as defineCommand118 } from "citty";
32063
32250
  registerSchema({
32064
32251
  command: "ga4.draft",
32065
32252
  description: "Review and undo the Google Analytics changes staged on this chat. Use `list` to see everything staged, `show` to inspect one change in full before the chat completes, `amend` to correct one in place, and `remove`/`clear` to drop them. `list` and `show` take --chat <id> to read an earlier chat's changes instead.",
@@ -32068,13 +32255,13 @@ registerSchema({
32068
32255
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
32069
32256
  }
32070
32257
  });
32071
- var draftCommand3 = defineCommand117({
32258
+ var draftCommand3 = defineCommand118({
32072
32259
  meta: {
32073
32260
  name: "draft",
32074
32261
  description: "List, show, amend, remove or clear the Google Analytics changes staged on this chat. `list` and `show` take --chat <id> to read an earlier chat's changes instead."
32075
32262
  },
32076
32263
  subCommands: {
32077
- list: defineCommand117({
32264
+ list: defineCommand118({
32078
32265
  meta: { name: "list", description: "Review everything staged on this chat (--json for the raw envelope)" },
32079
32266
  args: {
32080
32267
  json: { type: "boolean", description: "Print the raw JSON envelope", required: false },
@@ -32084,7 +32271,7 @@ var draftCommand3 = defineCommand117({
32084
32271
  await draftList(args.json === true, args.chat);
32085
32272
  }
32086
32273
  }),
32087
- show: defineCommand117({
32274
+ show: defineCommand118({
32088
32275
  meta: {
32089
32276
  name: "show",
32090
32277
  description: "Print the full staged payload for one change, alongside how the property looks today \u2014 the receipt to verify it before the chat completes (never truncated)."
@@ -32101,7 +32288,7 @@ var draftCommand3 = defineCommand117({
32101
32288
  );
32102
32289
  }
32103
32290
  }),
32104
- amend: defineCommand117({
32291
+ amend: defineCommand118({
32105
32292
  meta: {
32106
32293
  name: "amend",
32107
32294
  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-runs every check. Use this instead of remove + re-create."
@@ -32118,7 +32305,7 @@ var draftCommand3 = defineCommand117({
32118
32305
  });
32119
32306
  }
32120
32307
  }),
32121
- remove: defineCommand117({
32308
+ remove: defineCommand118({
32122
32309
  meta: { name: "remove", description: "Remove one staged change" },
32123
32310
  args: { ref: { type: "positional", description: "Staged ref or target id", required: false } },
32124
32311
  run: async ({ args }) => {
@@ -32127,7 +32314,7 @@ var draftCommand3 = defineCommand117({
32127
32314
  });
32128
32315
  }
32129
32316
  }),
32130
- clear: defineCommand117({
32317
+ clear: defineCommand118({
32131
32318
  meta: { name: "clear", description: "Discard all Google Analytics changes staged on this chat" },
32132
32319
  run: async () => {
32133
32320
  await draftAction2("/api/ga4/draft/clear", {});
@@ -32137,7 +32324,7 @@ var draftCommand3 = defineCommand117({
32137
32324
  });
32138
32325
 
32139
32326
  // src/commands/ga4/properties.ts
32140
- import { defineCommand as defineCommand118 } from "citty";
32327
+ import { defineCommand as defineCommand119 } from "citty";
32141
32328
  registerSchema({
32142
32329
  command: "ga4.properties",
32143
32330
  description: "List the GA4 properties this company connected \u2014 there can be several, and every one of them is yours to query. Returns the property IDs the query and audit commands take. Run this first to find property IDs.",
@@ -32153,7 +32340,7 @@ function propertyHints(properties) {
32153
32340
  resources: properties.map((property) => ({ id: property.externalId, label: property.name }))
32154
32341
  });
32155
32342
  }
32156
- var propertiesCommand = defineCommand118({
32343
+ var propertiesCommand = defineCommand119({
32157
32344
  meta: {
32158
32345
  name: "properties",
32159
32346
  description: `List accessible GA4 properties.
@@ -32203,7 +32390,7 @@ Examples:
32203
32390
  // src/commands/ga4/query.ts
32204
32391
  import { appendFileSync as appendFileSync2, existsSync as existsSync7, readFileSync as readFileSync13, writeFileSync as writeFileSync4 } from "fs";
32205
32392
  import { resolve as resolve2 } from "path";
32206
- import { defineCommand as defineCommand119 } from "citty";
32393
+ import { defineCommand as defineCommand120 } from "citty";
32207
32394
 
32208
32395
  // src/commands/ga4/presets.ts
32209
32396
  var GA4_PRESETS = [
@@ -32338,7 +32525,7 @@ function handleError2(err) {
32338
32525
  });
32339
32526
  process.exit(1);
32340
32527
  }
32341
- var queryCommand2 = defineCommand119({
32528
+ var queryCommand2 = defineCommand120({
32342
32529
  meta: {
32343
32530
  name: "query",
32344
32531
  description: `Run GA4 Data API reports. Preset-first with free-form escape hatch.
@@ -32409,7 +32596,7 @@ Free-form (escape hatch):
32409
32596
  });
32410
32597
 
32411
32598
  // src/commands/ga4/write-commands.ts
32412
- import { defineCommand as defineCommand120 } from "citty";
32599
+ import { defineCommand as defineCommand121 } from "citty";
32413
32600
  var PROPERTY_ARG_DESCRIPTION = "GA4 property id (optional only when one property is connected \u2014 run `baker ga4 properties`)";
32414
32601
  var propertyArg = { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false };
32415
32602
  function createJsonDescription(noun) {
@@ -32427,7 +32614,7 @@ registerSchema({
32427
32614
  "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
32428
32615
  }
32429
32616
  });
32430
- var keyEventCommand = defineCommand120({
32617
+ var keyEventCommand = defineCommand121({
32431
32618
  meta: {
32432
32619
  name: "key-event",
32433
32620
  description: `Stage key-event (conversion) changes
@@ -32440,7 +32627,7 @@ Examples:
32440
32627
  baker ga4 key-event delete 4185`
32441
32628
  },
32442
32629
  subCommands: {
32443
- create: defineCommand120({
32630
+ create: defineCommand121({
32444
32631
  meta: {
32445
32632
  name: "create",
32446
32633
  description: "Stage a new key event. Needs eventName and countingMethod (ONCE_PER_EVENT or ONCE_PER_SESSION); defaultValue sets a monetary value when the event does not send one."
@@ -32461,7 +32648,7 @@ Examples:
32461
32648
  );
32462
32649
  }
32463
32650
  }),
32464
- update: defineCommand120({
32651
+ update: defineCommand121({
32465
32652
  meta: {
32466
32653
  name: "update",
32467
32654
  description: "Stage a change to an existing key event (pass its id). Only countingMethod and defaultValue can change \u2014 Google will not rename a key event."
@@ -32481,7 +32668,7 @@ Examples:
32481
32668
  });
32482
32669
  }
32483
32670
  }),
32484
- delete: defineCommand120({
32671
+ delete: defineCommand121({
32485
32672
  meta: {
32486
32673
  name: "delete",
32487
32674
  description: "Stage removing a key event, so the event stops counting as a conversion. The event itself keeps being collected. Irreversible once the chat completes \u2014 confirm with the user first."
@@ -32529,7 +32716,7 @@ for (const { kind, noun, createHint } of DEFINITIONS) {
32529
32716
  }
32530
32717
  function definitionCommand(definition) {
32531
32718
  const { command, kind, noun, example } = definition;
32532
- return defineCommand120({
32719
+ return defineCommand121({
32533
32720
  meta: {
32534
32721
  name: command,
32535
32722
  description: `Stage ${noun} changes
@@ -32541,7 +32728,7 @@ Examples:
32541
32728
  baker ga4 ${command} archive 12`
32542
32729
  },
32543
32730
  subCommands: {
32544
- create: defineCommand120({
32731
+ create: defineCommand121({
32545
32732
  meta: { name: "create", description: `Stage a new ${noun} (or a JSON array of them, staged together)` },
32546
32733
  args: {
32547
32734
  json: { type: "string", description: createJsonDescription(noun), required: false },
@@ -32559,7 +32746,7 @@ Examples:
32559
32746
  );
32560
32747
  }
32561
32748
  }),
32562
- update: defineCommand120({
32749
+ update: defineCommand121({
32563
32750
  meta: {
32564
32751
  name: "update",
32565
32752
  description: `Stage a change to an existing ${noun} (pass its id). The parameter name and scope cannot change \u2014 archive and recreate for that.`
@@ -32579,7 +32766,7 @@ Examples:
32579
32766
  });
32580
32767
  }
32581
32768
  }),
32582
- archive: defineCommand120({
32769
+ archive: defineCommand121({
32583
32770
  meta: {
32584
32771
  name: "archive",
32585
32772
  description: `Stage archiving a ${noun} (pass its id). It stops collecting and leaves reporting; past data stays. Irreversible once the chat completes \u2014 confirm with the user first.`
@@ -32624,7 +32811,7 @@ var dataStreamArg = {
32624
32811
  function withStream(args) {
32625
32812
  return typeof args["data-stream"] === "string" ? { dataStream: args["data-stream"] } : {};
32626
32813
  }
32627
- var customEventCommand = defineCommand120({
32814
+ var customEventCommand = defineCommand121({
32628
32815
  meta: {
32629
32816
  name: "custom-event",
32630
32817
  description: `Stage custom events \u2014 new events built from events the site already sends
@@ -32635,7 +32822,7 @@ Examples:
32635
32822
  baker ga4 custom-event delete 7`
32636
32823
  },
32637
32824
  subCommands: {
32638
- create: defineCommand120({
32825
+ create: defineCommand121({
32639
32826
  meta: {
32640
32827
  name: "create",
32641
32828
  description: "Stage a new custom event. Conditions match the source event: use field `event_name` to match the event itself, or any parameter name to match its value."
@@ -32658,7 +32845,7 @@ Examples:
32658
32845
  );
32659
32846
  }
32660
32847
  }),
32661
- update: defineCommand120({
32848
+ update: defineCommand121({
32662
32849
  meta: { name: "update", description: "Stage a change to an existing custom event (pass its id)" },
32663
32850
  args: {
32664
32851
  id: { type: "positional", description: "Custom event rule id", required: false },
@@ -32677,7 +32864,7 @@ Examples:
32677
32864
  });
32678
32865
  }
32679
32866
  }),
32680
- delete: defineCommand120({
32867
+ delete: defineCommand121({
32681
32868
  meta: {
32682
32869
  name: "delete",
32683
32870
  description: "Stage removing a custom event (pass its id). The event stops being created from then on; data already collected under it stays. Confirm with the user first."
@@ -32732,7 +32919,7 @@ function booleanArg(input, flag) {
32732
32919
  if (input === "false") return false;
32733
32920
  return failValidation3(`--${flag} must be true or false`);
32734
32921
  }
32735
- var dataRetentionCommand = defineCommand120({
32922
+ var dataRetentionCommand = defineCommand121({
32736
32923
  meta: {
32737
32924
  name: "data-retention",
32738
32925
  description: `Stage a change to how long Google Analytics keeps data
@@ -32742,7 +32929,7 @@ Examples:
32742
32929
  baker ga4 data-retention set --event-data 14 --user-data 14 --reset-on-activity true`
32743
32930
  },
32744
32931
  subCommands: {
32745
- set: defineCommand120({
32932
+ set: defineCommand121({
32746
32933
  meta: { name: "set", description: "Stage the retention window (months)" },
32747
32934
  args: {
32748
32935
  "event-data": { type: "string", description: "2, 14, 26, 38 or 50", required: false },
@@ -32769,9 +32956,330 @@ Examples:
32769
32956
  })
32770
32957
  }
32771
32958
  });
32959
+ registerSchema({
32960
+ command: "ga4.audience",
32961
+ description: "Create an audience (a saved group of users, e.g. everyone who started a demo but never finished), rename one, or archive one. Read `baker ga4 config` first to see the audiences that already exist. IMPORTANT: everything that defines who is in an audience \u2014 the conditions, the membership window \u2014 is frozen the moment it is created and cannot be edited afterwards, so get it right in one go. An audience only reaches Google Ads for retargeting if the property is linked to a Google Ads account.",
32962
+ args: {
32963
+ json: { type: "string", description: createJsonDescription("audience"), required: false },
32964
+ file: { type: "string", description: "Path to a JSON file with the definition", required: false },
32965
+ "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
32966
+ }
32967
+ });
32968
+ var audienceCommand = defineCommand121({
32969
+ meta: {
32970
+ name: "audience",
32971
+ description: `Stage audience changes (saved groups of users, for retargeting and analysis)
32972
+
32973
+ The definition is PERMANENT: conditions and membership window cannot be edited after creation.
32974
+ Fixing one means archiving it and building a replacement, which does not carry its users over.
32975
+
32976
+ Examples:
32977
+ # Everyone who visited but never submitted the demo form, kept for 90 days
32978
+ baker ga4 audience create --json '{
32979
+ "displayName":"Visited without demo",
32980
+ "description":"Reached the site, never submitted the demo form",
32981
+ "membershipDurationDays":90,
32982
+ "filterClauses":[
32983
+ {"clauseType":"INCLUDE","simpleFilter":{"scope":"AUDIENCE_FILTER_SCOPE_ACROSS_ALL_SESSIONS",
32984
+ "filterExpression":{"eventFilter":{"eventName":"page_view"}}}},
32985
+ {"clauseType":"EXCLUDE","simpleFilter":{"scope":"AUDIENCE_FILTER_SCOPE_ACROSS_ALL_SESSIONS",
32986
+ "filterExpression":{"eventFilter":{"eventName":"demo_form_submitted"}}}}
32987
+ ]}'
32988
+
32989
+ # Everyone who landed on a pricing page
32990
+ baker ga4 audience create --json '{"displayName":"Saw pricing","description":"Viewed a pricing page",
32991
+ "membershipDurationDays":60,
32992
+ "filterClauses":[{"clauseType":"INCLUDE","simpleFilter":{"scope":"AUDIENCE_FILTER_SCOPE_ACROSS_ALL_SESSIONS",
32993
+ "filterExpression":{"dimensionOrMetricFilter":{"fieldName":"pagePath",
32994
+ "stringFilter":{"matchType":"CONTAINS","value":"/pricing"}}}}}]}'
32995
+
32996
+ baker ga4 audience update 8813 --json '{"displayName":"Visited without demo (90d)"}' \u2014 name/description only
32997
+ baker ga4 audience archive 8813`
32998
+ },
32999
+ subCommands: {
33000
+ create: defineCommand121({
33001
+ meta: { name: "create", description: createJsonDescription("audience") },
33002
+ args: {
33003
+ json: { type: "string", description: createJsonDescription("audience"), required: false },
33004
+ file: { type: "string", description: "Path to a JSON file", required: false },
33005
+ "property-id": propertyArg
33006
+ },
33007
+ run: async ({ args }) => {
33008
+ const payloads = loadJsonPayloads(args);
33009
+ await stageOps(
33010
+ payloads.map((payload) => ({
33011
+ kind: "ga4.audience.create",
33012
+ payload,
33013
+ ...withProperty(args)
33014
+ }))
33015
+ );
33016
+ }
33017
+ }),
33018
+ update: defineCommand121({
33019
+ meta: {
33020
+ name: "update",
33021
+ description: "Stage a new name or description (pass the audience id). Who is in it cannot be changed."
33022
+ },
33023
+ args: {
33024
+ json: { type: "string", description: 'Inline JSON, e.g. {"displayName":"\u2026"}', required: false },
33025
+ file: { type: "string", description: "Path to a JSON file", required: false },
33026
+ "property-id": propertyArg
33027
+ },
33028
+ run: async ({ args }) => {
33029
+ const target = requireTarget4(args, "audience id");
33030
+ const payload = loadJsonArg(args);
33031
+ await stageOp3({
33032
+ kind: "ga4.audience.update",
33033
+ target,
33034
+ payload,
33035
+ ...withProperty(args)
33036
+ });
33037
+ }
33038
+ }),
33039
+ archive: defineCommand121({
33040
+ meta: {
33041
+ name: "archive",
33042
+ description: "Stage retiring an audience. Cannot be undone \u2014 the users it gathered do not come back."
33043
+ },
33044
+ args: { "property-id": propertyArg },
33045
+ run: async ({ args }) => {
33046
+ await stageOp3({
33047
+ kind: "ga4.audience.archive",
33048
+ target: requireTarget4(args, "audience id"),
33049
+ ...withProperty(args)
33050
+ });
33051
+ }
33052
+ })
33053
+ }
33054
+ });
33055
+ registerSchema({
33056
+ command: "ga4.property",
33057
+ description: "Set the property's name or industry category. The industry decides which businesses Google benchmarks this property against, so a property left on OTHER is being compared to nothing useful. Time zone and currency are deliberately not changeable here \u2014 both re-bucket every future day without reprocessing history, so they belong to a person who knows the reporting calendar.",
33058
+ args: {
33059
+ name: { type: "string", description: "New property display name", required: false },
33060
+ industry: {
33061
+ type: "string",
33062
+ description: "Industry category, e.g. TECHNOLOGY, FINANCE, HEALTHCARE, REAL_ESTATE, JOBS_AND_EDUCATION",
33063
+ required: false
33064
+ },
33065
+ "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
33066
+ }
33067
+ });
33068
+ var propertyCommand = defineCommand121({
33069
+ meta: {
33070
+ name: "property",
33071
+ description: `Stage a change to the property's own settings
33072
+
33073
+ Examples:
33074
+ baker ga4 property set --industry TECHNOLOGY
33075
+ baker ga4 property set --name "Acme \u2014 Web" --industry REAL_ESTATE`
33076
+ },
33077
+ subCommands: {
33078
+ set: defineCommand121({
33079
+ meta: { name: "set", description: "Stage the property name and/or industry category" },
33080
+ args: {
33081
+ name: { type: "string", description: "New property display name", required: false },
33082
+ industry: { type: "string", description: "Industry category, e.g. TECHNOLOGY", required: false },
33083
+ "property-id": propertyArg
33084
+ },
33085
+ run: async ({ args }) => {
33086
+ const payload = {};
33087
+ if (typeof args.name === "string" && args.name.length > 0) {
33088
+ payload.displayName = args.name;
33089
+ }
33090
+ if (typeof args.industry === "string" && args.industry.length > 0) {
33091
+ payload.industryCategory = args.industry.trim().toUpperCase();
33092
+ }
33093
+ if (Object.keys(payload).length === 0) {
33094
+ failValidation3("pass --name, --industry, or both");
33095
+ }
33096
+ await stageOp3({ kind: "ga4.property.update", payload, ...withProperty(args) });
33097
+ }
33098
+ })
33099
+ }
33100
+ });
33101
+ registerSchema({
33102
+ command: "ga4.adsLink",
33103
+ description: "Link this Analytics property to a Google Ads account, or unlink it. This is what lets Google Ads import the property's key events for bidding and makes audiences built here targetable \u2014 `baker ga4 audit` reports the gap as NO_ADS_LINK. It reaches outside Analytics and moves the client's data between two products, so agree it with the user before staging it.",
33104
+ args: {
33105
+ "customer-id": {
33106
+ type: "string",
33107
+ description: "Google Ads customer id, with or without dashes (123-456-7890)",
33108
+ required: false
33109
+ },
33110
+ "ads-personalization": {
33111
+ type: "string",
33112
+ description: "true|false \u2014 may this property's audiences be used for ads personalisation",
33113
+ required: false
33114
+ },
33115
+ "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
33116
+ }
33117
+ });
33118
+ var adsLinkCommand = defineCommand121({
33119
+ meta: {
33120
+ name: "ads-link",
33121
+ description: `Stage linking this property to a Google Ads account
33122
+
33123
+ Without this link, Google Ads imports no key events from the property and audiences built
33124
+ here cannot be retargeted. It moves the client's data between two products \u2014 agree it first.
33125
+
33126
+ Examples:
33127
+ baker ga4 ads-link create --customer-id 123-456-7890
33128
+ baker ga4 ads-link create --customer-id 1234567890 --ads-personalization true
33129
+ baker ga4 ads-link update L1234 --ads-personalization false
33130
+ baker ga4 ads-link delete L1234`
33131
+ },
33132
+ subCommands: {
33133
+ create: defineCommand121({
33134
+ meta: { name: "create", description: "Stage linking the property to a Google Ads account" },
33135
+ args: {
33136
+ "customer-id": { type: "string", description: "Google Ads customer id (123-456-7890)", required: false },
33137
+ "ads-personalization": { type: "string", description: "true|false", required: false },
33138
+ "property-id": propertyArg
33139
+ },
33140
+ run: async ({ args }) => {
33141
+ const customerId = args["customer-id"];
33142
+ if (typeof customerId !== "string" || customerId.length === 0) {
33143
+ failValidation3("pass --customer-id, the Google Ads account to link (123-456-7890)");
33144
+ }
33145
+ const payload = { customerId };
33146
+ if (typeof args["ads-personalization"] === "string") {
33147
+ payload.adsPersonalizationEnabled = booleanArg(args["ads-personalization"], "ads-personalization");
33148
+ }
33149
+ await stageOp3({ kind: "ga4.googleAdsLink.create", payload, ...withProperty(args) });
33150
+ }
33151
+ }),
33152
+ update: defineCommand121({
33153
+ meta: {
33154
+ name: "update",
33155
+ description: "Stage the ads-personalisation setting on an existing link (pass its id)"
33156
+ },
33157
+ args: {
33158
+ "ads-personalization": { type: "string", description: "true|false", required: false },
33159
+ "property-id": propertyArg
33160
+ },
33161
+ run: async ({ args }) => {
33162
+ const target = requireTarget4(args, "Google Ads link id");
33163
+ if (typeof args["ads-personalization"] !== "string") {
33164
+ failValidation3("pass --ads-personalization true|false \u2014 it is the only thing a link update can change");
33165
+ }
33166
+ await stageOp3({
33167
+ kind: "ga4.googleAdsLink.update",
33168
+ target,
33169
+ payload: { adsPersonalizationEnabled: booleanArg(args["ads-personalization"], "ads-personalization") },
33170
+ ...withProperty(args)
33171
+ });
33172
+ }
33173
+ }),
33174
+ delete: defineCommand121({
33175
+ meta: {
33176
+ name: "delete",
33177
+ description: "Stage unlinking. Stops conversion imports and strands every audience on this property."
33178
+ },
33179
+ args: { "property-id": propertyArg },
33180
+ run: async ({ args }) => {
33181
+ await stageOp3({
33182
+ kind: "ga4.googleAdsLink.delete",
33183
+ target: requireTarget4(args, "Google Ads link id"),
33184
+ ...withProperty(args)
33185
+ });
33186
+ }
33187
+ })
33188
+ }
33189
+ });
33190
+ registerSchema({
33191
+ command: "ga4.enhancedMeasurement",
33192
+ description: "Turn the automatic web-stream events on or off: scrolls, outbound clicks, site search, video engagement, file downloads, page changes (single-page apps), form interactions. These are collected by Google Analytics itself with no tag to add, so this is usually the cheapest measurement win available. Run `baker ga4 config --full` to see what is on today.",
33193
+ args: {
33194
+ scrolls: { type: "string", description: "true|false", required: false },
33195
+ "outbound-clicks": { type: "string", description: "true|false", required: false },
33196
+ "site-search": { type: "string", description: "true|false \u2014 needs --search-parameters", required: false },
33197
+ "search-parameters": {
33198
+ type: "string",
33199
+ description: "URL parameters carrying the search term, e.g. q,s,search,query,keyword",
33200
+ required: false
33201
+ },
33202
+ video: { type: "string", description: "true|false", required: false },
33203
+ "file-downloads": { type: "string", description: "true|false", required: false },
33204
+ "page-changes": { type: "string", description: "true|false \u2014 page views in a single-page app", required: false },
33205
+ "form-interactions": { type: "string", description: "true|false", required: false },
33206
+ enabled: { type: "string", description: "true|false \u2014 the master switch for the whole feature", required: false },
33207
+ "data-stream": {
33208
+ type: "string",
33209
+ description: "Only when the property has several website streams",
33210
+ required: false
33211
+ },
33212
+ "property-id": { type: "string", description: PROPERTY_ARG_DESCRIPTION, required: false }
33213
+ }
33214
+ });
33215
+ var MEASUREMENT_FLAGS = {
33216
+ enabled: "streamEnabled",
33217
+ scrolls: "scrollsEnabled",
33218
+ "outbound-clicks": "outboundClicksEnabled",
33219
+ "site-search": "siteSearchEnabled",
33220
+ video: "videoEngagementEnabled",
33221
+ "file-downloads": "fileDownloadsEnabled",
33222
+ "page-changes": "pageChangesEnabled",
33223
+ "form-interactions": "formInteractionsEnabled"
33224
+ };
33225
+ var enhancedMeasurementCommand = defineCommand121({
33226
+ meta: {
33227
+ name: "enhanced-measurement",
33228
+ description: `Stage the automatic events GA4 collects on a website stream
33229
+
33230
+ No tag to add \u2014 Google Analytics collects these itself. Usually the cheapest measurement win there is.
33231
+
33232
+ Examples:
33233
+ baker ga4 enhanced-measurement set --scrolls true --outbound-clicks true --file-downloads true
33234
+ baker ga4 enhanced-measurement set --site-search true --search-parameters "q,s,search,query,keyword"
33235
+ baker ga4 enhanced-measurement set --page-changes true # page views in a single-page app
33236
+ baker ga4 enhanced-measurement set --video false`
33237
+ },
33238
+ subCommands: {
33239
+ set: defineCommand121({
33240
+ meta: { name: "set", description: "Stage which automatic events the website stream collects" },
33241
+ args: {
33242
+ scrolls: { type: "string", description: "true|false", required: false },
33243
+ "outbound-clicks": { type: "string", description: "true|false", required: false },
33244
+ "site-search": { type: "string", description: "true|false", required: false },
33245
+ "search-parameters": { type: "string", description: "e.g. q,s,search,query,keyword", required: false },
33246
+ video: { type: "string", description: "true|false", required: false },
33247
+ "file-downloads": { type: "string", description: "true|false", required: false },
33248
+ "page-changes": { type: "string", description: "true|false", required: false },
33249
+ "form-interactions": { type: "string", description: "true|false", required: false },
33250
+ enabled: { type: "string", description: "true|false \u2014 master switch", required: false },
33251
+ "data-stream": { type: "string", description: "Stream id, when there are several", required: false },
33252
+ "property-id": propertyArg
33253
+ },
33254
+ run: async ({ args }) => {
33255
+ const payload = {};
33256
+ for (const [flag, field] of Object.entries(MEASUREMENT_FLAGS)) {
33257
+ const value = args[flag];
33258
+ if (typeof value === "string") {
33259
+ payload[field] = booleanArg(value, flag);
33260
+ }
33261
+ }
33262
+ if (typeof args["search-parameters"] === "string" && args["search-parameters"].length > 0) {
33263
+ payload.searchQueryParameter = args["search-parameters"];
33264
+ }
33265
+ if (Object.keys(payload).length === 0) {
33266
+ failValidation3(
33267
+ "pass at least one setting, e.g. --scrolls true --outbound-clicks true. Run `baker ga4 config --full` to see what is on today."
33268
+ );
33269
+ }
33270
+ await stageOp3({
33271
+ kind: "ga4.enhancedMeasurement.update",
33272
+ payload,
33273
+ ...typeof args["data-stream"] === "string" ? { dataStream: args["data-stream"] } : {},
33274
+ ...withProperty(args)
33275
+ });
33276
+ }
33277
+ })
33278
+ }
33279
+ });
32772
33280
 
32773
33281
  // src/commands/ga4/index.ts
32774
- var ga4Command = defineCommand121({
33282
+ var ga4Command = defineCommand122({
32775
33283
  meta: {
32776
33284
  name: "ga4",
32777
33285
  description: `Google Analytics 4. Report on a property, audit its config, and change what it measures.
@@ -32790,6 +33298,10 @@ Then stage changes (nothing is sent to Google Analytics until the chat completes
32790
33298
  baker ga4 key-event create --json '{"eventName":"generate_lead","countingMethod":"ONCE_PER_EVENT"}'
32791
33299
  baker ga4 custom-event create --json '{"destinationEvent":"quote_request","eventConditions":[...]}'
32792
33300
  baker ga4 custom-dimension create --json '{"parameterName":"plan_tier","displayName":"Plan tier","scope":"EVENT"}'
33301
+ baker ga4 audience create --json '{"displayName":"Visited without demo", \u2026}' \u2014 a group to retarget
33302
+ baker ga4 property set --industry TECHNOLOGY \u2014 benchmarking cohort
33303
+ baker ga4 ads-link create --customer-id 123-456-7890 \u2014 what makes audiences targetable
33304
+ baker ga4 enhanced-measurement set --scrolls true --outbound-clicks true \u2014 automatic events, no tag needed
32793
33305
  baker ga4 draft list \u2014 review everything staged
32794
33306
 
32795
33307
  An applied change takes effect on the property immediately \u2014 there is no version to publish afterwards
@@ -32807,17 +33319,21 @@ Full guide: __tooling__/docs/tools/baker/ga4.md`
32807
33319
  "custom-metric": customMetricCommand,
32808
33320
  "custom-event": customEventCommand,
32809
33321
  "data-retention": dataRetentionCommand,
33322
+ audience: audienceCommand,
33323
+ property: propertyCommand,
33324
+ "ads-link": adsLinkCommand,
33325
+ "enhanced-measurement": enhancedMeasurementCommand,
32810
33326
  draft: draftCommand3
32811
33327
  }
32812
33328
  });
32813
33329
 
32814
33330
  // src/commands/gsc/index.ts
32815
- import { defineCommand as defineCommand125 } from "citty";
33331
+ import { defineCommand as defineCommand126 } from "citty";
32816
33332
 
32817
33333
  // src/commands/gsc/query.ts
32818
33334
  import { appendFileSync as appendFileSync3, existsSync as existsSync8, readFileSync as readFileSync14, writeFileSync as writeFileSync5 } from "fs";
32819
33335
  import { resolve as resolve3 } from "path";
32820
- import { defineCommand as defineCommand122 } from "citty";
33336
+ import { defineCommand as defineCommand123 } from "citty";
32821
33337
 
32822
33338
  // src/commands/gsc/presets.ts
32823
33339
  var GSC_PRESETS = [
@@ -33011,7 +33527,7 @@ function handleError3(err) {
33011
33527
  });
33012
33528
  process.exit(1);
33013
33529
  }
33014
- var queryCommand3 = defineCommand122({
33530
+ var queryCommand3 = defineCommand123({
33015
33531
  meta: {
33016
33532
  name: "query",
33017
33533
  description: `Run GSC Search Analytics queries. Preset-first with free-form escape hatch.
@@ -33089,7 +33605,7 @@ Free-form (escape hatch):
33089
33605
  });
33090
33606
 
33091
33607
  // src/commands/gsc/sitemaps.ts
33092
- import { defineCommand as defineCommand123 } from "citty";
33608
+ import { defineCommand as defineCommand124 } from "citty";
33093
33609
  registerSchema({
33094
33610
  command: "gsc.sitemaps",
33095
33611
  description: "List sitemaps for a Search Console site. Check sitemap health and errors.",
@@ -33098,7 +33614,7 @@ registerSchema({
33098
33614
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
33099
33615
  }
33100
33616
  });
33101
- var sitemapsCommand = defineCommand123({
33617
+ var sitemapsCommand = defineCommand124({
33102
33618
  meta: {
33103
33619
  name: "sitemaps",
33104
33620
  description: `List sitemaps for a site. Check health and errors.
@@ -33151,7 +33667,7 @@ Examples:
33151
33667
  });
33152
33668
 
33153
33669
  // src/commands/gsc/sites.ts
33154
- import { defineCommand as defineCommand124 } from "citty";
33670
+ import { defineCommand as defineCommand125 } from "citty";
33155
33671
  registerSchema({
33156
33672
  command: "gsc.sites",
33157
33673
  description: "List the Search Console sites this company connected \u2014 there can be several, and every one of them is yours to query. Returns the site URLs the query and sitemaps commands take.",
@@ -33167,7 +33683,7 @@ function siteHints(sites) {
33167
33683
  resources: sites.map((site) => ({ id: site.siteUrl, label: site.permissionLevel }))
33168
33684
  });
33169
33685
  }
33170
- var sitesCommand = defineCommand124({
33686
+ var sitesCommand = defineCommand125({
33171
33687
  meta: {
33172
33688
  name: "sites",
33173
33689
  description: `List verified Search Console sites.
@@ -33215,7 +33731,7 @@ Examples:
33215
33731
  });
33216
33732
 
33217
33733
  // src/commands/gsc/index.ts
33218
- var gscCommand = defineCommand125({
33734
+ var gscCommand = defineCommand126({
33219
33735
  meta: {
33220
33736
  name: "gsc",
33221
33737
  description: `Google Search Console commands. PPC-SEO arbitrage, brand halo analysis, negative keyword discovery.
@@ -33239,7 +33755,7 @@ Full guide: __tooling__/docs/tools/baker/gsc.md`
33239
33755
  });
33240
33756
 
33241
33757
  // src/commands/history/index.ts
33242
- import { defineCommand as defineCommand126 } from "citty";
33758
+ import { defineCommand as defineCommand127 } from "citty";
33243
33759
  registerSchema({
33244
33760
  command: "history.list",
33245
33761
  description: "Start here: unified account history (audit log) \u2014 everything that changed on this account, newest first: publishes, chat lifecycle, backlog actions, team changes, setup links, tags, schedules, ad-platform writes, followed advertisers, media, creatives, reports, domains, and integrations. Use it to see what happened recently before planning work. Compact by default; add --full for raw metadata per entry.",
@@ -33294,7 +33810,7 @@ function parseBoundedInt2(raw, name, min, max) {
33294
33810
  }
33295
33811
  return value;
33296
33812
  }
33297
- var listCommand13 = defineCommand126({
33813
+ var listCommand13 = defineCommand127({
33298
33814
  meta: {
33299
33815
  name: "list",
33300
33816
  description: "List recent account changes (unified audit log), newest first."
@@ -33340,7 +33856,7 @@ var listCommand13 = defineCommand126({
33340
33856
  }
33341
33857
  }
33342
33858
  });
33343
- var historyCommand = defineCommand126({
33859
+ var historyCommand = defineCommand127({
33344
33860
  meta: {
33345
33861
  name: "history",
33346
33862
  description: `Unified account history (audit log): what changed, who did it, and when.
@@ -33350,7 +33866,7 @@ Full guide: __tooling__/docs/tools/baker/history.md`
33350
33866
  });
33351
33867
 
33352
33868
  // src/commands/hubspot/index.ts
33353
- import { defineCommand as defineCommand127 } from "citty";
33869
+ import { defineCommand as defineCommand128 } from "citty";
33354
33870
  var EMBED_TYPES = ["legacy", "v4", "unknown"];
33355
33871
  function failNotConnected(err) {
33356
33872
  if (err instanceof ApiError && err.code === "FORBIDDEN" && err.message.includes(HUBSPOT_MISSING_GRANT_MARKER)) {
@@ -33504,7 +34020,7 @@ registerSchema({
33504
34020
  }
33505
34021
  }
33506
34022
  });
33507
- var formsListCommand = defineCommand127({
34023
+ var formsListCommand = defineCommand128({
33508
34024
  meta: {
33509
34025
  name: "list",
33510
34026
  description: "List HubSpot forms with embed type and post-submit action. Example: baker hubspot forms list --redirecting-only"
@@ -33549,7 +34065,7 @@ var formsListCommand = defineCommand127({
33549
34065
  }
33550
34066
  }
33551
34067
  });
33552
- var formsViewCommand = defineCommand127({
34068
+ var formsViewCommand = defineCommand128({
33553
34069
  meta: {
33554
34070
  name: "view",
33555
34071
  description: "Show one HubSpot form's fields and configuration. Example: baker hubspot forms view 1a2b3c"
@@ -33601,7 +34117,7 @@ var formsViewCommand = defineCommand127({
33601
34117
  }
33602
34118
  }
33603
34119
  });
33604
- var meetingsListCommand = defineCommand127({
34120
+ var meetingsListCommand = defineCommand128({
33605
34121
  meta: {
33606
34122
  name: "list",
33607
34123
  description: "List HubSpot meeting links (calendars). Example: baker hubspot meetings list"
@@ -33643,7 +34159,7 @@ var meetingsListCommand = defineCommand127({
33643
34159
  }
33644
34160
  }
33645
34161
  });
33646
- var meetingsViewCommand = defineCommand127({
34162
+ var meetingsViewCommand = defineCommand128({
33647
34163
  meta: {
33648
34164
  name: "view",
33649
34165
  description: "Show one HubSpot meeting link's booking fields. Example: baker hubspot meetings view discovery-call"
@@ -33687,7 +34203,7 @@ var meetingsViewCommand = defineCommand127({
33687
34203
  }
33688
34204
  }
33689
34205
  });
33690
- var formsSubmissionsCommand = defineCommand127({
34206
+ var formsSubmissionsCommand = defineCommand128({
33691
34207
  meta: {
33692
34208
  name: "submissions",
33693
34209
  description: "How many leads a form received, and when. Example: baker hubspot forms submissions <formId> --days 30"
@@ -33736,7 +34252,7 @@ var formsSubmissionsCommand = defineCommand127({
33736
34252
  }
33737
34253
  }
33738
34254
  });
33739
- var workflowsListCommand = defineCommand127({
34255
+ var workflowsListCommand = defineCommand128({
33740
34256
  meta: {
33741
34257
  name: "list",
33742
34258
  description: "List HubSpot workflows. Example: baker hubspot workflows list --enabled-only"
@@ -33801,7 +34317,7 @@ function workflowViewHints(workflow) {
33801
34317
  }
33802
34318
  return hints;
33803
34319
  }
33804
- var workflowsViewCommand = defineCommand127({
34320
+ var workflowsViewCommand = defineCommand128({
33805
34321
  meta: {
33806
34322
  name: "view",
33807
34323
  description: "Read one workflow's real configuration \u2014 enrolment, branches in order, and what each step writes. Example: baker hubspot workflows view 121183594 --full"
@@ -33828,7 +34344,7 @@ var workflowsViewCommand = defineCommand127({
33828
34344
  }
33829
34345
  }
33830
34346
  });
33831
- var pipelinesListCommand = defineCommand127({
34347
+ var pipelinesListCommand = defineCommand128({
33832
34348
  meta: {
33833
34349
  name: "list",
33834
34350
  description: "List HubSpot deal pipelines and their stages. Example: baker hubspot pipelines list"
@@ -33845,7 +34361,7 @@ var pipelinesListCommand = defineCommand127({
33845
34361
  }
33846
34362
  }
33847
34363
  });
33848
- var contactsSummaryCommand = defineCommand127({
34364
+ var contactsSummaryCommand = defineCommand128({
33849
34365
  meta: {
33850
34366
  name: "summary",
33851
34367
  description: "Whether recent leads are being worked, as counts. Example: baker hubspot contacts summary --days 30"
@@ -33915,7 +34431,7 @@ function contactLookupHints(data) {
33915
34431
  }
33916
34432
  return hints;
33917
34433
  }
33918
- var contactsLookupCommand = defineCommand127({
34434
+ var contactsLookupCommand = defineCommand128({
33919
34435
  meta: {
33920
34436
  name: "lookup",
33921
34437
  description: "Find one contact by email and see whether it was worked. Example: baker hubspot contacts lookup a@b.com"
@@ -33939,27 +34455,27 @@ var contactsLookupCommand = defineCommand127({
33939
34455
  }
33940
34456
  }
33941
34457
  });
33942
- var contactsCommand = defineCommand127({
34458
+ var contactsCommand = defineCommand128({
33943
34459
  meta: { name: "contacts", description: "Contacts on the connected HubSpot account." },
33944
34460
  subCommands: { summary: contactsSummaryCommand, lookup: contactsLookupCommand }
33945
34461
  });
33946
- var formsCommand = defineCommand127({
34462
+ var formsCommand = defineCommand128({
33947
34463
  meta: { name: "forms", description: "HubSpot forms on the connected account." },
33948
34464
  subCommands: { list: formsListCommand, view: formsViewCommand, submissions: formsSubmissionsCommand }
33949
34465
  });
33950
- var workflowsCommand = defineCommand127({
34466
+ var workflowsCommand = defineCommand128({
33951
34467
  meta: { name: "workflows", description: "HubSpot workflows on the connected account." },
33952
34468
  subCommands: { list: workflowsListCommand, view: workflowsViewCommand }
33953
34469
  });
33954
- var pipelinesCommand = defineCommand127({
34470
+ var pipelinesCommand = defineCommand128({
33955
34471
  meta: { name: "pipelines", description: "HubSpot deal pipelines on the connected account." },
33956
34472
  subCommands: { list: pipelinesListCommand }
33957
34473
  });
33958
- var meetingsCommand = defineCommand127({
34474
+ var meetingsCommand = defineCommand128({
33959
34475
  meta: { name: "meetings", description: "HubSpot meeting links (calendars) on the connected account." },
33960
34476
  subCommands: { list: meetingsListCommand, view: meetingsViewCommand }
33961
34477
  });
33962
- var hubspotCommand = defineCommand127({
34478
+ var hubspotCommand = defineCommand128({
33963
34479
  meta: {
33964
34480
  name: "hubspot",
33965
34481
  description: `Read the connected HubSpot account \u2014 forms, the leads they received, workflows, deal pipelines and
@@ -33997,10 +34513,10 @@ Full guide: __tooling__/docs/tools/baker/hubspot.md`
33997
34513
  });
33998
34514
 
33999
34515
  // src/commands/images/index.ts
34000
- import { defineCommand as defineCommand153 } from "citty";
34516
+ import { defineCommand as defineCommand154 } from "citty";
34001
34517
 
34002
34518
  // src/commands/images/crop.ts
34003
- import { defineCommand as defineCommand128 } from "citty";
34519
+ import { defineCommand as defineCommand129 } from "citty";
34004
34520
 
34005
34521
  // src/lib/image/crop-sprite.ts
34006
34522
  import sharp from "sharp";
@@ -34122,7 +34638,7 @@ function emitError2(err) {
34122
34638
  }
34123
34639
  process.exit(1);
34124
34640
  }
34125
- var cropCommand = defineCommand128({
34641
+ var cropCommand = defineCommand129({
34126
34642
  meta: {
34127
34643
  name: "crop",
34128
34644
  description: "Crop a rectangular region from an image.\n\nExample: baker images crop sprite.png --x 0 --y 0 --width 64 --height 64 --output icon.png"
@@ -34158,7 +34674,7 @@ var cropCommand = defineCommand128({
34158
34674
  });
34159
34675
 
34160
34676
  // src/commands/images/delete.ts
34161
- import { defineCommand as defineCommand129 } from "citty";
34677
+ import { defineCommand as defineCommand130 } from "citty";
34162
34678
  registerSchema({
34163
34679
  command: "images.delete",
34164
34680
  description: "Delete an image by ID",
@@ -34172,7 +34688,7 @@ registerSchema({
34172
34688
  }
34173
34689
  }
34174
34690
  });
34175
- var deleteCommand2 = defineCommand129({
34691
+ var deleteCommand2 = defineCommand130({
34176
34692
  meta: {
34177
34693
  name: "delete",
34178
34694
  description: "Delete an image by ID. Use --dry-run to preview. Example: baker images delete j571abc123 --dry-run"
@@ -34213,7 +34729,7 @@ var deleteCommand2 = defineCommand129({
34213
34729
  });
34214
34730
 
34215
34731
  // src/commands/images/dimensions.ts
34216
- import { defineCommand as defineCommand130 } from "citty";
34732
+ import { defineCommand as defineCommand131 } from "citty";
34217
34733
 
34218
34734
  // src/lib/image/dimensions.ts
34219
34735
  import { imageSize } from "image-size";
@@ -34242,7 +34758,7 @@ registerSchema({
34242
34758
  }
34243
34759
  }
34244
34760
  });
34245
- var dimensionsCommand = defineCommand130({
34761
+ var dimensionsCommand = defineCommand131({
34246
34762
  meta: {
34247
34763
  name: "dimensions",
34248
34764
  description: "Read image dimensions without decoding the full file.\n\nExample: baker images dimensions ./logo.png\nExample: baker images dimensions https://acme.com/hero.png"
@@ -34298,7 +34814,7 @@ var dimensionsCommand = defineCommand130({
34298
34814
  });
34299
34815
 
34300
34816
  // src/commands/images/download.ts
34301
- import { defineCommand as defineCommand131 } from "citty";
34817
+ import { defineCommand as defineCommand132 } from "citty";
34302
34818
 
34303
34819
  // src/commands/images/downloadPaths.ts
34304
34820
  import { basename as basename2, extname as extname3, join as join6 } from "path";
@@ -34523,7 +35039,7 @@ function emitError3(err) {
34523
35039
  writeJson({ ok: false, error: { code: "INTERNAL_ERROR", message: "Unexpected error" } });
34524
35040
  process.exit(1);
34525
35041
  }
34526
- var downloadCommand = defineCommand131({
35042
+ var downloadCommand = defineCommand132({
34527
35043
  meta: {
34528
35044
  name: "download",
34529
35045
  description: "Download image URLs and/or library images to local files \u2014 the missing first half of `source \u2192 download \u2192 normalize \u2192 place`. Never use `curl` for this.\n\nExamples:\n baker images download https://media.withbaker.com/\u2026/logo.webp\n baker images download j57abc123 j57def456 --out src/pages/pricing/_images/\n baker images download https://\u2026/hero.png --out ./hero.png"
@@ -34556,7 +35072,7 @@ var downloadCommand = defineCommand131({
34556
35072
  });
34557
35073
 
34558
35074
  // src/commands/images/extract.ts
34559
- import { defineCommand as defineCommand132 } from "citty";
35075
+ import { defineCommand as defineCommand133 } from "citty";
34560
35076
 
34561
35077
  // src/commands/images/autoIngest.ts
34562
35078
  var AUTO_INGEST_MAX = {
@@ -34603,7 +35119,7 @@ registerSchema({
34603
35119
  }
34604
35120
  }
34605
35121
  });
34606
- var extractCommand = defineCommand132({
35122
+ var extractCommand = defineCommand133({
34607
35123
  meta: {
34608
35124
  name: "extract",
34609
35125
  description: "Pull every image from a single URL via Firecrawl. ~$0.001/scrape. Cap auto-ingest at 20.\n\nExample: baker images extract https://stripe.com --auto-ingest 5"
@@ -34658,7 +35174,7 @@ var extractCommand = defineCommand132({
34658
35174
  });
34659
35175
 
34660
35176
  // src/commands/images/find.ts
34661
- import { defineCommand as defineCommand133 } from "citty";
35177
+ import { defineCommand as defineCommand134 } from "citty";
34662
35178
 
34663
35179
  // src/commands/images/providerHits.ts
34664
35180
  function asRecord3(value) {
@@ -34796,7 +35312,7 @@ registerSchema({
34796
35312
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
34797
35313
  }
34798
35314
  });
34799
- var findCommand = defineCommand133({
35315
+ var findCommand = defineCommand134({
34800
35316
  meta: {
34801
35317
  name: "find",
34802
35318
  description: "Library-first fanout image search. Opt in to providers with --sources. `--fallback` short-circuits to externals only when library is thin. With --auto-ingest, ingested external hits return Baker-owned URLs.\n\nExample: baker images find 'office' --sources library,magnific --limit 20"
@@ -34869,7 +35385,7 @@ var findCommand = defineCommand133({
34869
35385
  });
34870
35386
 
34871
35387
  // src/commands/images/get.ts
34872
- import { defineCommand as defineCommand134 } from "citty";
35388
+ import { defineCommand as defineCommand135 } from "citty";
34873
35389
  registerSchema({
34874
35390
  command: "images.get",
34875
35391
  description: "Get a single image by ID",
@@ -34877,7 +35393,7 @@ registerSchema({
34877
35393
  id: { type: "string", description: "Image ID", required: true }
34878
35394
  }
34879
35395
  });
34880
- var getCommand3 = defineCommand134({
35396
+ var getCommand3 = defineCommand135({
34881
35397
  meta: { name: "get", description: "Get a single image by ID. Example: baker images get j571abc123" },
34882
35398
  args: {
34883
35399
  id: { type: "positional", description: "Image ID", required: false },
@@ -34913,7 +35429,7 @@ var getCommand3 = defineCommand134({
34913
35429
  });
34914
35430
 
34915
35431
  // src/commands/images/gif.ts
34916
- import { defineCommand as defineCommand135 } from "citty";
35432
+ import { defineCommand as defineCommand136 } from "citty";
34917
35433
  registerSchema({
34918
35434
  command: "images.gif",
34919
35435
  description: "Search Giphy for GIFs / reaction memes (paid social creative).",
@@ -34945,7 +35461,7 @@ registerSchema({
34945
35461
  }
34946
35462
  }
34947
35463
  });
34948
- var gifCommand = defineCommand135({
35464
+ var gifCommand = defineCommand136({
34949
35465
  meta: {
34950
35466
  name: "gif",
34951
35467
  description: "Search Giphy for GIFs / reaction memes \u2014 built for paid-social creative (Meta, TikTok, LinkedIn, X). Free API. Each hit carries WebP + GIF + MP4 URLs in providerMeta so you can pick the right format per platform.\n\nExample: baker images gif 'this is fine' --limit 10\nExample: baker images gif 'office reaction' --rating pg --auto-ingest 2\nExample: baker images gif --trending --limit 25"
@@ -34992,7 +35508,7 @@ var gifCommand = defineCommand135({
34992
35508
  });
34993
35509
 
34994
35510
  // src/commands/images/google.ts
34995
- import { defineCommand as defineCommand136 } from "citty";
35511
+ import { defineCommand as defineCommand137 } from "citty";
34996
35512
  var GOOGLE_ERROR_FIX = {
34997
35513
  action: "use_different_resource",
34998
35514
  explanation: "Generate the asset instead of retrying Google. Google is the last-resort image provider. Run `baker studio generate` to make the asset. Never sleep-and-retry this command \u2014 the CLI already backs off on rate limits. If no image can be sourced, continue the rest of the task with a placeholder rather than aborting it."
@@ -35032,7 +35548,7 @@ registerSchema({
35032
35548
  }
35033
35549
  }
35034
35550
  });
35035
- var googleCommand2 = defineCommand136({
35551
+ var googleCommand2 = defineCommand137({
35036
35552
  meta: {
35037
35553
  name: "google",
35038
35554
  description: "Google Images via the official Custom Search JSON API ($0.005/query, free 100/day). \u26A0 Source unverified \u2014 watermarks, low-res, mislabeled results are common. Use as last resort. With --auto-ingest, ingested hits return Baker-owned URLs.\n\nExample: baker images google 'industrial workshop' --type photo --size large --limit 20"
@@ -35105,7 +35621,7 @@ var googleCommand2 = defineCommand136({
35105
35621
  });
35106
35622
 
35107
35623
  // src/commands/images/group.ts
35108
- import { defineCommand as defineCommand137 } from "citty";
35624
+ import { defineCommand as defineCommand138 } from "citty";
35109
35625
 
35110
35626
  // src/commands/mediaGroup.ts
35111
35627
  async function runMediaGroupLookup(input) {
@@ -35158,7 +35674,7 @@ registerSchema({
35158
35674
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
35159
35675
  }
35160
35676
  });
35161
- var groupCommand = defineCommand137({
35677
+ var groupCommand = defineCommand138({
35162
35678
  meta: {
35163
35679
  name: "group",
35164
35680
  description: "List every asset that arrived in the same set \u2014 the slides of one Instagram carousel, the images off one scraped page. Start here whenever a hit looks like part of a sequence: carousel slides are authored to be read in order and usually only make sense together. Takes an image or a video id, since one carousel can contain both. Example: baker images group <imageId>"
@@ -35178,7 +35694,7 @@ var groupCommand = defineCommand137({
35178
35694
  });
35179
35695
 
35180
35696
  // src/commands/images/icon.ts
35181
- import { defineCommand as defineCommand138 } from "citty";
35697
+ import { defineCommand as defineCommand139 } from "citty";
35182
35698
 
35183
35699
  // src/commands/images/brandVerification.ts
35184
35700
  function brandToken(domain) {
@@ -35275,7 +35791,7 @@ registerSchema({
35275
35791
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
35276
35792
  }
35277
35793
  });
35278
- var iconCommand = defineCommand138({
35794
+ var iconCommand = defineCommand139({
35279
35795
  meta: {
35280
35796
  name: "icon",
35281
35797
  description: "Icon via Iconify (simple-icons, logos, lucide, devicon, heroicons, tabler, phosphor, material-symbols, \u2026). Free CDN, no API key.\n\nExample: baker images icon react --set devicon\nExample: baker images icon lucide:check --color '#0a0a0a'"
@@ -35345,7 +35861,7 @@ var iconCommand = defineCommand138({
35345
35861
  });
35346
35862
 
35347
35863
  // src/commands/images/ingest.ts
35348
- import { defineCommand as defineCommand139 } from "citty";
35864
+ import { defineCommand as defineCommand140 } from "citty";
35349
35865
  var SOURCE_VALUES = imageSourceSchema.options.join(" | ");
35350
35866
  registerSchema({
35351
35867
  command: "images.ingest",
@@ -35360,7 +35876,7 @@ registerSchema({
35360
35876
  fields: { type: "string", description: "Comma-separated field names to include", required: false }
35361
35877
  }
35362
35878
  });
35363
- var ingestCommand = defineCommand139({
35879
+ var ingestCommand = defineCommand140({
35364
35880
  meta: {
35365
35881
  name: "ingest",
35366
35882
  description: "Download a remote URL and store it in the library. Hash-deduped on bytes + externalId.\n\nExample: baker images ingest https://img.freepik.com/free-photo/xyz.jpg --source magnific --external-id 12345"
@@ -35429,7 +35945,7 @@ var ingestCommand = defineCommand139({
35429
35945
  });
35430
35946
 
35431
35947
  // src/commands/images/layerize.ts
35432
- import { defineCommand as defineCommand140 } from "citty";
35948
+ import { defineCommand as defineCommand141 } from "citty";
35433
35949
  registerSchema({
35434
35950
  command: "images.layerize",
35435
35951
  description: "Split a library image into editable layers: transparent PNG cutouts for each element, plus any headline recovered as EDITABLE TEXT with its font, size, colour and position. Waits for completion by default. Costs credits.",
@@ -35493,7 +36009,7 @@ async function pollUntilSettled(imageId, maxWait) {
35493
36009
  }
35494
36010
  return null;
35495
36011
  }
35496
- var layerizeCommand = defineCommand140({
36012
+ var layerizeCommand = defineCommand141({
35497
36013
  meta: {
35498
36014
  name: "layerize",
35499
36015
  description: "Split a library image into editable layers \u2014 transparent cutouts per element, plus any baked-in headline recovered as editable text with its typography.\n\nStart here: baker images layerize j571abc123def\nExample: baker images layerize j571abc123def --full\nExample: baker images layerize j571abc123def --instructions 'keep the product and its shadow together'"
@@ -35562,7 +36078,7 @@ registerSchema({
35562
36078
  full: { type: "boolean", description: "Include geometry and typography for every layer", required: false }
35563
36079
  }
35564
36080
  });
35565
- var layersCommand = defineCommand140({
36081
+ var layersCommand = defineCommand141({
35566
36082
  meta: {
35567
36083
  name: "layers",
35568
36084
  description: "Read the layers of an image that has already been split. Free \u2014 no provider call.\n\nStart here: baker images layers j571abc123def\nExample: baker images layers j571abc123def --full"
@@ -35602,7 +36118,7 @@ var layersCommand = defineCommand140({
35602
36118
  });
35603
36119
 
35604
36120
  // src/commands/images/library.ts
35605
- import { defineCommand as defineCommand141 } from "citty";
36121
+ import { defineCommand as defineCommand142 } from "citty";
35606
36122
  registerSchema({
35607
36123
  command: "images.library",
35608
36124
  description: "Search the company image library. Returns only ready images.",
@@ -35628,7 +36144,7 @@ registerSchema({
35628
36144
  }
35629
36145
  }
35630
36146
  });
35631
- var libraryCommand = defineCommand141({
36147
+ var libraryCommand = defineCommand142({
35632
36148
  meta: {
35633
36149
  name: "library",
35634
36150
  description: "Search the company image library (hybrid BM25 + vector + Cohere rerank). Use this BEFORE any external provider.\n\nExample: baker images library 'hero banner' --aspect-ratio 16:9 --source magnific"
@@ -35691,7 +36207,7 @@ var libraryCommand = defineCommand141({
35691
36207
  });
35692
36208
 
35693
36209
  // src/commands/images/logo.ts
35694
- import { defineCommand as defineCommand142 } from "citty";
36210
+ import { defineCommand as defineCommand143 } from "citty";
35695
36211
  registerSchema({
35696
36212
  command: "images.logo",
35697
36213
  description: "Brand logo lookup via Brandfetch. Auto-ingests by default. Returns `brandMatch` \u2014 Brandfetch's own verdict on whose brand the domain is (confirmed | mismatch | unverified). Branch on it: `mismatch` means the mark is another company's, so do not place it. `confirmed` verifies the record, not the artwork \u2014 read the ingested row back to check the mark itself.",
@@ -35719,7 +36235,7 @@ registerSchema({
35719
36235
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
35720
36236
  }
35721
36237
  });
35722
- var logoCommand = defineCommand142({
36238
+ var logoCommand = defineCommand143({
35723
36239
  meta: {
35724
36240
  name: "logo",
35725
36241
  description: "Brand logo via Brandfetch. Returns up to 5 variants (icon, light/dark logo, light/dark symbol) plus `brandMatch`. Auto-ingests the first variant.\n\nStart here: check `brandMatch.verdict`.\n mismatch \u2192 the mark belongs to `brandMatch.name`, a different company. Do not place it.\n unverified \u2192 nothing confirmed whose logo this is. Treat as unchecked.\n confirmed \u2192 Brandfetch has this brand's record. That verifies the record, NOT the artwork \u2014 a confirmed domain has served another company's logo before.\n\n\u26A0 Whatever the verdict, read the ingested row back with `baker images get <imageId>` and check `textInImage`/`subject` before placing it. That is the only check that looks at the mark.\n\nExample: baker images logo stripe.com --variant logo"
@@ -35792,7 +36308,7 @@ var logoCommand = defineCommand142({
35792
36308
  });
35793
36309
 
35794
36310
  // src/commands/images/normalize.ts
35795
- import { defineCommand as defineCommand143 } from "citty";
36311
+ import { defineCommand as defineCommand144 } from "citty";
35796
36312
 
35797
36313
  // src/lib/image/color-changer.ts
35798
36314
  import quantize from "quantize";
@@ -36524,7 +37040,7 @@ function coerceRawArgs(args) {
36524
37040
  "dry-run": bool(args["dry-run"])
36525
37041
  };
36526
37042
  }
36527
- var normalizeCommand2 = defineCommand143({
37043
+ var normalizeCommand2 = defineCommand144({
36528
37044
  meta: {
36529
37045
  name: "normalize",
36530
37046
  description: `Normalize logos / images: declarative recolor + bg removal + trim + resize. Operates on local files; writes in-place by default.
@@ -36579,7 +37095,7 @@ Examples:
36579
37095
  });
36580
37096
 
36581
37097
  // src/commands/images/pinterest.ts
36582
- import { defineCommand as defineCommand144 } from "citty";
37098
+ import { defineCommand as defineCommand145 } from "citty";
36583
37099
  registerSchema({
36584
37100
  command: "images.pinterest",
36585
37101
  description: "Pinterest image search via ScrapeCreators. Reference-grade real-world photography, product styling, interiors, fashion, food, and aesthetic mood boards. Inspect before placing \u2014 Pinterest is unverified, trademark-bearing web content.",
@@ -36599,7 +37115,7 @@ registerSchema({
36599
37115
  }
36600
37116
  }
36601
37117
  });
36602
- var pinterestCommand = defineCommand144({
37118
+ var pinterestCommand = defineCommand145({
36603
37119
  meta: {
36604
37120
  name: "pinterest",
36605
37121
  description: "Pinterest image search via ScrapeCreators ($0.00188/request). Best for photo-realistic reference imagery \u2014 lifestyle, interiors, fashion, food, product styling, and mood boards to brief AI generation against. \u26A0 Unverified, trademark-bearing web content \u2014 inspect and respect rights before placing on a customer page. Browse first; auto-ingest only the pins you commit to.\n\nExamples:\n baker images pinterest 'scandinavian living room'\n baker images pinterest 'minimalist skincare product photography' --limit 20\n baker images pinterest 'cozy coffee shop interior' --auto-ingest 2 --context 'Mood reference for hero photography'"
@@ -36656,7 +37172,7 @@ var pinterestCommand = defineCommand144({
36656
37172
  });
36657
37173
 
36658
37174
  // src/commands/images/screenshot.ts
36659
- import { defineCommand as defineCommand145 } from "citty";
37175
+ import { defineCommand as defineCommand146 } from "citty";
36660
37176
  registerSchema({
36661
37177
  command: "images.screenshot",
36662
37178
  description: "Capture a website screenshot via ScreenshotOne. Auto-ingests on success.",
@@ -36675,7 +37191,7 @@ registerSchema({
36675
37191
  full: { type: "boolean", description: "Include full metadata", required: false, default: false }
36676
37192
  }
36677
37193
  });
36678
- var screenshotCommand = defineCommand145({
37194
+ var screenshotCommand = defineCommand146({
36679
37195
  meta: {
36680
37196
  name: "screenshot",
36681
37197
  description: "Screenshot a URL via ScreenshotOne. $0.009/capture. Auto-ingests to library.\n\nExample: baker images screenshot https://stripe.com --full-page"
@@ -36739,7 +37255,7 @@ var screenshotCommand = defineCommand145({
36739
37255
  });
36740
37256
 
36741
37257
  // src/commands/images/search.ts
36742
- import { defineCommand as defineCommand146 } from "citty";
37258
+ import { defineCommand as defineCommand147 } from "citty";
36743
37259
  registerSchema({
36744
37260
  command: "images.search",
36745
37261
  description: "Search images by text query. Only returns ready images.",
@@ -36755,7 +37271,7 @@ registerSchema({
36755
37271
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
36756
37272
  }
36757
37273
  });
36758
- var searchCommand = defineCommand146({
37274
+ var searchCommand = defineCommand147({
36759
37275
  meta: {
36760
37276
  name: "search",
36761
37277
  description: "Semantic search images by text query. Uses hybrid BM25 + vector + reranking. Example: baker images search 'hero banner' --aspect-ratio 16:9 --tags logo"
@@ -36815,7 +37331,7 @@ var searchCommand = defineCommand146({
36815
37331
  });
36816
37332
 
36817
37333
  // src/commands/images/sticker.ts
36818
- import { defineCommand as defineCommand147 } from "citty";
37334
+ import { defineCommand as defineCommand148 } from "citty";
36819
37335
  registerSchema({
36820
37336
  command: "images.sticker",
36821
37337
  description: "Search Giphy stickers \u2014 transparent-background overlays for ad creative.",
@@ -36847,7 +37363,7 @@ registerSchema({
36847
37363
  }
36848
37364
  }
36849
37365
  });
36850
- var stickerCommand = defineCommand147({
37366
+ var stickerCommand = defineCommand148({
36851
37367
  meta: {
36852
37368
  name: "sticker",
36853
37369
  description: "Search Giphy's sticker corpus \u2014 transparent-background WebPs / GIFs ideal for overlaying on ad creative (Meta, TikTok, Stories). Same Giphy free API as `baker images gif`; results carry WebP + GIF + MP4 URLs in providerMeta.\n\nExample: baker images sticker 'thumbs up' --limit 10\nExample: baker images sticker celebration --rating g --auto-ingest 3\nExample: baker images sticker --trending --limit 25"
@@ -36894,7 +37410,7 @@ var stickerCommand = defineCommand147({
36894
37410
  });
36895
37411
 
36896
37412
  // src/commands/images/stock.ts
36897
- import { defineCommand as defineCommand148 } from "citty";
37413
+ import { defineCommand as defineCommand149 } from "citty";
36898
37414
  var STOCK_ERROR_FIX = {
36899
37415
  action: "use_different_resource",
36900
37416
  explanation: "Switch provider instead of retrying stock search. Stock search is one of several image sources. Run `baker images find <query> --sources library,pinterest,google` (`--sources` is required \u2014 `find` alone searches the library only) or `baker studio generate` to make the asset. Never sleep-and-retry this command \u2014 the CLI already backs off on rate limits. If no image can be sourced, continue the rest of the task with a placeholder rather than aborting it."
@@ -36971,7 +37487,7 @@ function buildStockRequest(query, args) {
36971
37487
  if (args.context) body.descriptionContext = args.context;
36972
37488
  return body;
36973
37489
  }
36974
- var stockCommand = defineCommand148({
37490
+ var stockCommand = defineCommand149({
36975
37491
  meta: {
36976
37492
  name: "stock",
36977
37493
  description: "Stock search via Magnific \u2014 Freepik's developer API (~250M assets: photos, vectors, illustrations, icons, PSDs). $0.002/req. With --auto-ingest, ingested hits return Baker-owned URLs.\n\nExamples:\n baker images stock 'minimalist office'\n baker images stock 'flat office workers' --type vector\n baker images stock 'hero photo of a kitchen' --type photo --orientation landscape --ai exclude\n baker images stock 'brand pattern' --color '#0a0a0a' --license freemium --auto-ingest 2"
@@ -37044,7 +37560,7 @@ var stockCommand = defineCommand148({
37044
37560
  });
37045
37561
 
37046
37562
  // src/lib/tags-command.ts
37047
- import { defineCommand as defineCommand149 } from "citty";
37563
+ import { defineCommand as defineCommand150 } from "citty";
37048
37564
  function makeTagsCommand(command, label, endpoint) {
37049
37565
  registerSchema({
37050
37566
  command: `${command}.tags`,
@@ -37053,7 +37569,7 @@ function makeTagsCommand(command, label, endpoint) {
37053
37569
  output: { type: "string", description: "Output format: md|json", required: false, default: "md" }
37054
37570
  }
37055
37571
  });
37056
- return defineCommand149({
37572
+ return defineCommand150({
37057
37573
  meta: {
37058
37574
  name: "tags",
37059
37575
  description: `List the available ${label} tag names (defaults + company custom tags). Use before filtering with --tags. Example: baker ${command} tags`
@@ -37089,7 +37605,7 @@ function makeTagsCommand(command, label, endpoint) {
37089
37605
  var tagsCommand2 = makeTagsCommand("images", "image", "/api/images/tags");
37090
37606
 
37091
37607
  // src/commands/images/upload.ts
37092
- import { defineCommand as defineCommand150 } from "citty";
37608
+ import { defineCommand as defineCommand151 } from "citty";
37093
37609
  registerSchema({
37094
37610
  command: "images.upload",
37095
37611
  description: "Upload an image to the library \u2014 local file path or remote http(s) URL.",
@@ -37127,7 +37643,7 @@ registerSchema({
37127
37643
  function isRemoteUrl2(value) {
37128
37644
  return /^https?:\/\//i.test(value);
37129
37645
  }
37130
- var uploadCommand = defineCommand150({
37646
+ var uploadCommand = defineCommand151({
37131
37647
  meta: {
37132
37648
  name: "upload",
37133
37649
  description: "Upload an image to the library \u2014 accepts a local file path OR a remote http(s) URL.\n\nLocal: reads bytes, sends to /api/images/upload, content-type auto-detected from extension.\nRemote: dispatches to /api/images/ingest with hash-dedup on bytes + externalId.\n\nExamples:\n baker images upload ./logo.png --source uploaded\n baker images upload ./cert.png --context 'ISO 27001 badge \u2014 enterprise tier'\n baker images upload https://acme.com/hero.png --source firecrawl --context 'Acme competitor pricing hero'"
@@ -37220,7 +37736,7 @@ async function uploadLocal(target, args) {
37220
37736
  }
37221
37737
 
37222
37738
  // src/commands/images/upscale.ts
37223
- import { defineCommand as defineCommand151 } from "citty";
37739
+ import { defineCommand as defineCommand152 } from "citty";
37224
37740
  registerSchema({
37225
37741
  command: "images.upscale",
37226
37742
  description: "Upscale a library image via the backend (Replicate, cost-tracked). Waits for completion by default. The image must be status 'ready' and raster (not SVG/AVIF).",
@@ -37235,7 +37751,7 @@ registerSchema({
37235
37751
  }
37236
37752
  });
37237
37753
  var POLL_INTERVAL_MS4 = 1500;
37238
- var upscaleCommand = defineCommand151({
37754
+ var upscaleCommand = defineCommand152({
37239
37755
  meta: {
37240
37756
  name: "upscale",
37241
37757
  description: "Upscale a library image via the Convex backend (Replicate, cost-tracked at $0.05/image). Waits for completion by default.\n\nExample: baker images upscale j571abc123def\nExample: baker images upscale j571abc123def --max-wait 0 # fire-and-forget"
@@ -37290,7 +37806,7 @@ var upscaleCommand = defineCommand151({
37290
37806
  });
37291
37807
 
37292
37808
  // src/commands/images/use.ts
37293
- import { defineCommand as defineCommand152 } from "citty";
37809
+ import { defineCommand as defineCommand153 } from "citty";
37294
37810
  registerSchema({
37295
37811
  command: "images.use",
37296
37812
  description: "Ingest a URL and wait for the library record to be ready.",
@@ -37319,7 +37835,7 @@ function emitReady(ingestResult, doc, args) {
37319
37835
  args.full === true
37320
37836
  );
37321
37837
  }
37322
- var useCommand = defineCommand152({
37838
+ var useCommand = defineCommand153({
37323
37839
  meta: {
37324
37840
  name: "use",
37325
37841
  description: "Sugar over `ingest`: download \u2192 store \u2192 wait until describe + embed complete \u2192 return ready library record.\n\nExample: baker images use https://cdn.example.com/hero.png --source uploaded"
@@ -37368,7 +37884,7 @@ var useCommand = defineCommand152({
37368
37884
  });
37369
37885
 
37370
37886
  // src/commands/images/index.ts
37371
- var imagesCommand = defineCommand153({
37887
+ var imagesCommand = defineCommand154({
37372
37888
  meta: {
37373
37889
  name: "images",
37374
37890
  description: `Find, source, and normalize images. Subcommands route by provider so cost + license are explicit.
@@ -37446,12 +37962,12 @@ Full guide: __tooling__/docs/tools/baker/images.md`
37446
37962
  });
37447
37963
 
37448
37964
  // src/commands/landing/index.ts
37449
- import { defineCommand as defineCommand164 } from "citty";
37965
+ import { defineCommand as defineCommand165 } from "citty";
37450
37966
 
37451
37967
  // src/commands/landing/critique.ts
37452
37968
  import { readdir as readdir9, stat as stat6 } from "fs/promises";
37453
37969
  import path29 from "path";
37454
- import { defineCommand as defineCommand154 } from "citty";
37970
+ import { defineCommand as defineCommand155 } from "citty";
37455
37971
 
37456
37972
  // src/engine/landing/lib/constants.ts
37457
37973
  var OVERUSED_FONTS = /* @__PURE__ */ new Set([
@@ -38634,7 +39150,7 @@ function fail5(code, message, fix) {
38634
39150
  );
38635
39151
  process.exit(2);
38636
39152
  }
38637
- var critiqueCommand2 = defineCommand154({
39153
+ var critiqueCommand2 = defineCommand155({
38638
39154
  meta: {
38639
39155
  name: "critique",
38640
39156
  description: "Start here: `baker landing critique <slug>` after building or editing a landing. Deterministic design-quality critic (ADVISORY \u2014 findings never fail it). Flags the known AI design tells (gradient text, overused fonts, side-tab borders, cream palettes, buzzword copy, broken images) tiered block/warn/advisory, respecting the client's BRAND.md as the allowlist. Also records the critique that publishing requires \u2014 run it before finishing a landing."
@@ -38743,10 +39259,10 @@ async function isDir(p) {
38743
39259
  }
38744
39260
 
38745
39261
  // src/commands/landing/inspiration/index.ts
38746
- import { defineCommand as defineCommand163 } from "citty";
39262
+ import { defineCommand as defineCommand164 } from "citty";
38747
39263
 
38748
39264
  // src/commands/landing/inspiration/add.ts
38749
- import { defineCommand as defineCommand155 } from "citty";
39265
+ import { defineCommand as defineCommand156 } from "citty";
38750
39266
 
38751
39267
  // src/commands/landing/inspiration/shared.ts
38752
39268
  var INSPIRATION_HINTS = {
@@ -38828,7 +39344,7 @@ registerSchema({
38828
39344
  note: { type: "string", description: "Why this page is worth keeping", required: false }
38829
39345
  }
38830
39346
  });
38831
- var addCommand = defineCommand155({
39347
+ var addCommand = defineCommand156({
38832
39348
  meta: {
38833
39349
  name: "add",
38834
39350
  description: "Add someone else's landing page to the reference library. Example: baker landing inspiration add https://linear.app --note 'the client likes this density'"
@@ -38870,7 +39386,7 @@ var addCommand = defineCommand155({
38870
39386
  // src/commands/landing/inspiration/code.ts
38871
39387
  import { mkdir as mkdir10, writeFile as writeFile14 } from "fs/promises";
38872
39388
  import path30 from "path";
38873
- import { defineCommand as defineCommand156 } from "citty";
39389
+ import { defineCommand as defineCommand157 } from "citty";
38874
39390
  registerSchema({
38875
39391
  command: "landing.inspiration.code",
38876
39392
  description: "Write a reference section's standalone HTML+CSS to .baker/inspiration/<id>/ so you can read how it is built. Reference only \u2014 the structure is the lesson, the words are not yours to reuse. Consulting a section records it, and `baker landing critique` blocks a publish that ships its copy verbatim.",
@@ -38879,7 +39395,7 @@ registerSchema({
38879
39395
  full: { type: "boolean", description: "Print the markup inline as well as writing it", required: false }
38880
39396
  }
38881
39397
  });
38882
- var codeCommand = defineCommand156({
39398
+ var codeCommand = defineCommand157({
38883
39399
  meta: {
38884
39400
  name: "code",
38885
39401
  description: "Write one reference section's standalone markup to disk. Example: baker landing inspiration code k57abc\u2026 \u2014 read it for structure, then build your own."
@@ -38936,7 +39452,7 @@ var codeCommand = defineCommand156({
38936
39452
  });
38937
39453
 
38938
39454
  // src/commands/landing/inspiration/favorites.ts
38939
- import { defineCommand as defineCommand157 } from "citty";
39455
+ import { defineCommand as defineCommand158 } from "citty";
38940
39456
  registerSchema({
38941
39457
  command: "landing.inspiration.favorites",
38942
39458
  description: "List the reference sections this company has saved. This is what `search` looks at by default, so it is the client's own taste profile \u2014 read it before proposing a direction.",
@@ -38950,7 +39466,7 @@ registerSchema({
38950
39466
  }
38951
39467
  }
38952
39468
  });
38953
- var favoritesCommand = defineCommand157({
39469
+ var favoritesCommand = defineCommand158({
38954
39470
  meta: {
38955
39471
  name: "favorites",
38956
39472
  description: "List this company's saved reference sections. Example: baker landing inspiration favorites --type hero,pricing"
@@ -39030,7 +39546,7 @@ registerSchema({
39030
39546
  note: { type: "string", description: "Why this is worth keeping", required: false }
39031
39547
  }
39032
39548
  });
39033
- var favoriteCommand = defineCommand157({
39549
+ var favoriteCommand = defineCommand158({
39034
39550
  meta: {
39035
39551
  name: "favorite",
39036
39552
  description: "Save a reference section to this company. Example: baker landing inspiration favorite k57abc\u2026"
@@ -39068,7 +39584,7 @@ registerSchema({
39068
39584
  page: { type: "boolean", description: "Treat the id as a page rather than a section", required: false }
39069
39585
  }
39070
39586
  });
39071
- var unfavoriteCommand = defineCommand157({
39587
+ var unfavoriteCommand = defineCommand158({
39072
39588
  meta: {
39073
39589
  name: "unfavorite",
39074
39590
  description: "Remove a reference section from this company's saved set. Example: baker landing inspiration unfavorite k57abc\u2026"
@@ -39090,7 +39606,7 @@ var unfavoriteCommand = defineCommand157({
39090
39606
  });
39091
39607
 
39092
39608
  // src/commands/landing/inspiration/page.ts
39093
- import { defineCommand as defineCommand158 } from "citty";
39609
+ import { defineCommand as defineCommand159 } from "citty";
39094
39610
  registerSchema({
39095
39611
  command: "landing.inspiration.page",
39096
39612
  description: "Show a whole reference page as a sequence: every section top to bottom with its type and the idea behind it. This is the view to use when the question is how a good page is ORDERED rather than what one section looks like.",
@@ -39107,7 +39623,7 @@ registerSchema({
39107
39623
  }
39108
39624
  }
39109
39625
  });
39110
- var pageCommand = defineCommand158({
39626
+ var pageCommand = defineCommand159({
39111
39627
  meta: {
39112
39628
  name: "page",
39113
39629
  description: "Show how a reference page sequences its sections. Example: baker landing inspiration page j91xyz\u2026 \u2014 the blueprint, not the pixels."
@@ -39172,7 +39688,7 @@ var pageCommand = defineCommand158({
39172
39688
  // src/commands/landing/inspiration/scrape.ts
39173
39689
  import { readFile as readFile23 } from "fs/promises";
39174
39690
  import path33 from "path";
39175
- import { defineCommand as defineCommand159 } from "citty";
39691
+ import { defineCommand as defineCommand160 } from "citty";
39176
39692
 
39177
39693
  // src/engine/landing/lib/capturedReferences.ts
39178
39694
  var MAX_STRINGS_PER_SECTION = 40;
@@ -41313,7 +41829,7 @@ registerSchema({
41313
41829
  report: { type: "boolean", description: "Write report.html. `--no-report` to skip", required: false }
41314
41830
  }
41315
41831
  });
41316
- var scrapeCommand = defineCommand159({
41832
+ var scrapeCommand = defineCommand160({
41317
41833
  meta: {
41318
41834
  name: "scrape",
41319
41835
  description: "Capture a landing page to a directory, now. Example: baker landing inspiration scrape https://linear.app --out .baker/inspiration/linear.app"
@@ -41415,7 +41931,7 @@ var scrapeCommand = defineCommand159({
41415
41931
 
41416
41932
  // src/commands/landing/inspiration/search.ts
41417
41933
  import path35 from "path";
41418
- import { defineCommand as defineCommand160 } from "citty";
41934
+ import { defineCommand as defineCommand161 } from "citty";
41419
41935
 
41420
41936
  // src/commands/landing/inspiration/shot.ts
41421
41937
  import { mkdir as mkdir12, writeFile as writeFile17 } from "fs/promises";
@@ -41552,7 +42068,7 @@ async function downloadShots(results) {
41552
42068
  );
41553
42069
  return saved;
41554
42070
  }
41555
- var searchCommand2 = defineCommand160({
42071
+ var searchCommand2 = defineCommand161({
41556
42072
  meta: {
41557
42073
  name: "search",
41558
42074
  description: "Search real landing-page sections for reference. Example: baker landing inspiration search 'dark developer hero with a terminal' --register dev-tool-minimal --scope all"
@@ -41650,7 +42166,7 @@ var searchCommand2 = defineCommand160({
41650
42166
  });
41651
42167
 
41652
42168
  // src/commands/landing/inspiration/sequences.ts
41653
- import { defineCommand as defineCommand161 } from "citty";
42169
+ import { defineCommand as defineCommand162 } from "citty";
41654
42170
  var COMPACT_TRANSITIONS = 12;
41655
42171
  var COMPACT_ENDS = 5;
41656
42172
  var MAX_PAGES = 50;
@@ -41724,7 +42240,7 @@ function sequencesHints(data, { scope, full }) {
41724
42240
  if (scope === "favorites") hints.push(...favoritesScopeHints(data.favoritesHealth, data.pagesReturned));
41725
42241
  return hints;
41726
42242
  }
41727
- var sequencesCommand = defineCommand161({
42243
+ var sequencesCommand = defineCommand162({
41728
42244
  meta: {
41729
42245
  name: "sequences",
41730
42246
  description: "What section follows what, across many real pages at once. Example: baker landing inspiration sequences 'developer tool pricing page' --scope all \u2014 the evidence for how to order a page you are about to build."
@@ -41774,7 +42290,7 @@ var sequencesCommand = defineCommand161({
41774
42290
 
41775
42291
  // src/commands/landing/inspiration/view.ts
41776
42292
  import path36 from "path";
41777
- import { defineCommand as defineCommand162 } from "citty";
42293
+ import { defineCommand as defineCommand163 } from "citty";
41778
42294
  registerSchema({
41779
42295
  command: "landing.inspiration.view",
41780
42296
  description: "Everything known about one section: composition, motion, design tokens, the copy it uses, why it works, and what must change to make it yours. Downloads the desktop and mobile screenshots plus the motion filmstrip so you can look at them.",
@@ -41787,7 +42303,7 @@ registerSchema({
41787
42303
  }
41788
42304
  }
41789
42305
  });
41790
- var viewCommand2 = defineCommand162({
42306
+ var viewCommand2 = defineCommand163({
41791
42307
  meta: {
41792
42308
  name: "view",
41793
42309
  description: "Full detail for one reference section. Example: baker landing inspiration view k57abc\u2026 \u2014 read the screenshots it saves before you build."
@@ -41871,7 +42387,7 @@ var viewCommand2 = defineCommand162({
41871
42387
  });
41872
42388
 
41873
42389
  // src/commands/landing/inspiration/index.ts
41874
- var inspirationCommand = defineCommand163({
42390
+ var inspirationCommand = defineCommand164({
41875
42391
  meta: {
41876
42392
  name: "inspiration",
41877
42393
  description: `Reference library of real landing-page sections \u2014 look at how good pages actually solve a problem before you design one.
@@ -41916,7 +42432,7 @@ Full guide: __tooling__/docs/tools/baker/landing.md`
41916
42432
  });
41917
42433
 
41918
42434
  // src/commands/landing/index.ts
41919
- var landingCommand = defineCommand164({
42435
+ var landingCommand = defineCommand165({
41920
42436
  meta: {
41921
42437
  name: "landing",
41922
42438
  description: `Design-quality tools for landing pages (src/pages/<slug>/).
@@ -41934,7 +42450,7 @@ Subcommands:
41934
42450
  });
41935
42451
 
41936
42452
  // src/commands/mcp/index.ts
41937
- import { defineCommand as defineCommand165 } from "citty";
42453
+ import { defineCommand as defineCommand166 } from "citty";
41938
42454
 
41939
42455
  // src/commands/mcp/platforms.ts
41940
42456
  function readsKey(label) {
@@ -42003,7 +42519,7 @@ registerSchema({
42003
42519
  description: "List everything this chat can reach: managed integrations (Attio, Slack, Gmail, Google Sheets, \u2026), custom MCP servers, and the platforms the company signed in to (HubSpot, Google Ads, GA4, Search Console, Tag Manager) which you read through their own `baker` commands. Start here when the user mentions an external tool or platform.",
42004
42520
  args: {}
42005
42521
  });
42006
- var connectedCommand = defineCommand165({
42522
+ var connectedCommand = defineCommand166({
42007
42523
  meta: {
42008
42524
  name: "connected",
42009
42525
  description: `Everything this chat can reach \u2014 managed integrations, custom MCP servers, and connected platforms.
@@ -42062,7 +42578,7 @@ registerSchema({
42062
42578
  description: "List the custom MCP servers this company's chats see (org + company + your own user scope).",
42063
42579
  args: {}
42064
42580
  });
42065
- var listCommand14 = defineCommand165({
42581
+ var listCommand14 = defineCommand166({
42066
42582
  meta: { name: "list", description: "List custom MCP servers visible to this company's chats." },
42067
42583
  run: async () => {
42068
42584
  try {
@@ -42099,7 +42615,7 @@ registerSchema({
42099
42615
  header: { type: "string", description: 'Auth header "Key: Value" (repeatable)', required: false }
42100
42616
  }
42101
42617
  });
42102
- var addCommand2 = defineCommand165({
42618
+ var addCommand2 = defineCommand166({
42103
42619
  meta: {
42104
42620
  name: "add",
42105
42621
  description: `Register a custom MCP server. Tools appear as mcp__<name>__* on the NEXT message.
@@ -42151,7 +42667,7 @@ registerSchema({
42151
42667
  description: "Remove a company custom MCP server by name.",
42152
42668
  args: { name: { type: "string", description: "Server name to remove", required: true } }
42153
42669
  });
42154
- var removeCommand4 = defineCommand165({
42670
+ var removeCommand4 = defineCommand166({
42155
42671
  meta: {
42156
42672
  name: "remove",
42157
42673
  description: `Remove a company custom MCP server by name.
@@ -42173,7 +42689,7 @@ Example:
42173
42689
  }
42174
42690
  }
42175
42691
  });
42176
- var mcpCommand = defineCommand165({
42692
+ var mcpCommand = defineCommand166({
42177
42693
  meta: {
42178
42694
  name: "mcp",
42179
42695
  description: `Third-party tools for this company \u2014 see what's connected, register custom HTTPS MCP endpoints.
@@ -42199,10 +42715,10 @@ Full guide: __tooling__/docs/tools/baker/mcp.md`
42199
42715
  });
42200
42716
 
42201
42717
  // src/commands/research/index.ts
42202
- import { defineCommand as defineCommand177 } from "citty";
42718
+ import { defineCommand as defineCommand178 } from "citty";
42203
42719
 
42204
42720
  // src/commands/research/advertisers.ts
42205
- import { defineCommand as defineCommand166 } from "citty";
42721
+ import { defineCommand as defineCommand167 } from "citty";
42206
42722
 
42207
42723
  // src/commands/research/hints.ts
42208
42724
  var AD_COPY_ROUTE = 'This returns competing DOMAINS and their SERP economics \u2014 no ad copy, no headlines, no creative. For the actual copy of a competitor\'s ads: `baker winning-ads advertisers "<brand>"` \u2192 `baker winning-ads search "<brief>" --advertiser-id <id>` \u2192 `baker winning-ads content <adId>` (`primary_text` / `headline` / `cta`, plus the spoken transcript and on-screen text for video). That corpus is Meta and LinkedIn only \u2014 Google SERP ad copy is not available through any Baker command, so do not keep querying for it here.';
@@ -42385,7 +42901,7 @@ var FIELDS3 = {
42385
42901
  etv: "Estimated traffic value (USD)",
42386
42902
  visibility: "SERP visibility score (0-1)"
42387
42903
  };
42388
- var advertisersCommand = defineCommand166({
42904
+ var advertisersCommand = defineCommand167({
42389
42905
  meta: {
42390
42906
  name: "advertisers",
42391
42907
  description: `Domains competing for a keyword in Google SERPs, with position, relevance, traffic value and visibility. Returns NO ad copy \u2014 for a competitor's headlines and body copy use \`baker winning-ads content <adId>\` (Meta/LinkedIn only).
@@ -42441,7 +42957,7 @@ Examples:
42441
42957
  });
42442
42958
 
42443
42959
  // src/commands/research/autocomplete.ts
42444
- import { defineCommand as defineCommand167 } from "citty";
42960
+ import { defineCommand as defineCommand168 } from "citty";
42445
42961
  registerSchema({
42446
42962
  command: "research.autocomplete",
42447
42963
  description: "Get Google Autocomplete suggestions for a seed keyword. Useful for keyword expansion and discovering what people actually search for. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).",
@@ -42464,7 +42980,7 @@ registerSchema({
42464
42980
  var FIELDS4 = {
42465
42981
  suggestion: "Autocomplete suggestion from Google"
42466
42982
  };
42467
- var autocompleteCommand = defineCommand167({
42983
+ var autocompleteCommand = defineCommand168({
42468
42984
  meta: {
42469
42985
  name: "autocomplete",
42470
42986
  description: `Get Google Autocomplete suggestions for keyword expansion.
@@ -42519,7 +43035,7 @@ Examples:
42519
43035
  });
42520
43036
 
42521
43037
  // src/commands/research/countries.ts
42522
- import { defineCommand as defineCommand168 } from "citty";
43038
+ import { defineCommand as defineCommand169 } from "citty";
42523
43039
  registerSchema({
42524
43040
  command: "research.countries",
42525
43041
  description: "List all supported country codes for --location flag in research commands.",
@@ -42576,7 +43092,7 @@ var FIELDS5 = {
42576
43092
  code: "Country code to pass as --location",
42577
43093
  name: "Country name"
42578
43094
  };
42579
- var countriesCommand = defineCommand168({
43095
+ var countriesCommand = defineCommand169({
42580
43096
  meta: {
42581
43097
  name: "countries",
42582
43098
  description: "List all supported country codes for --location flag."
@@ -42587,7 +43103,7 @@ var countriesCommand = defineCommand168({
42587
43103
  });
42588
43104
 
42589
43105
  // src/commands/research/fetch.ts
42590
- import { defineCommand as defineCommand169 } from "citty";
43106
+ import { defineCommand as defineCommand170 } from "citty";
42591
43107
  var CONTENT_PREVIEW_CHARS = 2e4;
42592
43108
  var TIMEOUT_MS = 18e4;
42593
43109
  registerSchema({
@@ -42660,7 +43176,7 @@ function fetchFix(code) {
42660
43176
  explanation: "This read failed. Don't build a retry ladder around it \u2014 finish the rest of the job with what you can reach and name this page as a gap."
42661
43177
  };
42662
43178
  }
42663
- var fetchCommand = defineCommand169({
43179
+ var fetchCommand = defineCommand170({
42664
43180
  meta: {
42665
43181
  name: "fetch",
42666
43182
  description: `Read a page an ordinary web fetch could not. Bot walls and JavaScript-rendered pages are resolved for you \u2014 you never have to retry, wait, or drive a browser yourself.
@@ -42737,7 +43253,7 @@ Examples:
42737
43253
  });
42738
43254
 
42739
43255
  // src/commands/research/intent.ts
42740
- import { defineCommand as defineCommand170 } from "citty";
43256
+ import { defineCommand as defineCommand171 } from "citty";
42741
43257
  registerSchema({
42742
43258
  command: "research.intent",
42743
43259
  description: "Classify Google Search intent for keywords. Determines if someone searching is looking to buy, research, or navigate. IMPORTANT: If --language is omitted, defaults to English (en). The response includes a query_context object showing which language was used.",
@@ -42760,7 +43276,7 @@ var FIELDS7 = {
42760
43276
  intent: "Primary Google Search intent: informational, navigational, commercial, transactional",
42761
43277
  probability: "Confidence score 0.0-1.0"
42762
43278
  };
42763
- var intentCommand = defineCommand170({
43279
+ var intentCommand = defineCommand171({
42764
43280
  meta: {
42765
43281
  name: "intent",
42766
43282
  description: `Classify Google Search intent for keywords. Returns intent type and confidence.
@@ -42808,7 +43324,7 @@ Examples:
42808
43324
  });
42809
43325
 
42810
43326
  // src/commands/research/keyword-gap.ts
42811
- import { defineCommand as defineCommand171 } from "citty";
43327
+ import { defineCommand as defineCommand172 } from "citty";
42812
43328
  registerSchema({
42813
43329
  command: "research.keyword-gap",
42814
43330
  description: "Find keywords a competitor ranks for (organic or paid) that you don't. Discovers expansion opportunities. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
@@ -42837,7 +43353,7 @@ var FIELDS8 = {
42837
43353
  cpc: "Cost per click USD",
42838
43354
  their_position: "Competitor's ranking position"
42839
43355
  };
42840
- var keywordGapCommand = defineCommand171({
43356
+ var keywordGapCommand = defineCommand172({
42841
43357
  meta: {
42842
43358
  name: "keyword-gap",
42843
43359
  description: `Find keywords a competitor has that you don't. Supports pagination via --offset.
@@ -42912,7 +43428,7 @@ Examples:
42912
43428
  });
42913
43429
 
42914
43430
  // src/commands/research/keywords-for-site.ts
42915
- import { defineCommand as defineCommand172 } from "citty";
43431
+ import { defineCommand as defineCommand173 } from "citty";
42916
43432
  registerSchema({
42917
43433
  command: "research.keywords-for-site",
42918
43434
  description: "Get keywords a competitor targets in Google. Use --type paid to see only paid keywords, --type organic for organic only. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
@@ -42945,7 +43461,7 @@ var FIELDS9 = {
42945
43461
  competition: "LOW, MEDIUM, or HIGH",
42946
43462
  competition_index: "Competition score 0-100"
42947
43463
  };
42948
- var keywordsForSiteCommand = defineCommand172({
43464
+ var keywordsForSiteCommand = defineCommand173({
42949
43465
  meta: {
42950
43466
  name: "keywords-for-site",
42951
43467
  description: `Get keywords a competitor targets in Google. Use --type to filter paid/organic.
@@ -43007,7 +43523,7 @@ Examples:
43007
43523
  });
43008
43524
 
43009
43525
  // src/commands/research/languages.ts
43010
- import { defineCommand as defineCommand173 } from "citty";
43526
+ import { defineCommand as defineCommand174 } from "citty";
43011
43527
  registerSchema({
43012
43528
  command: "research.languages",
43013
43529
  description: "List all supported language codes for --language flag in research commands.",
@@ -43037,7 +43553,7 @@ var FIELDS10 = {
43037
43553
  code: "Language code to pass as --language",
43038
43554
  name: "Language name (also accepted by --language)"
43039
43555
  };
43040
- var languagesCommand2 = defineCommand173({
43556
+ var languagesCommand2 = defineCommand174({
43041
43557
  meta: {
43042
43558
  name: "languages",
43043
43559
  description: "List all supported language codes for --language flag."
@@ -43048,7 +43564,7 @@ var languagesCommand2 = defineCommand173({
43048
43564
  });
43049
43565
 
43050
43566
  // src/commands/research/lighthouse.ts
43051
- import { defineCommand as defineCommand174 } from "citty";
43567
+ import { defineCommand as defineCommand175 } from "citty";
43052
43568
  registerSchema({
43053
43569
  command: "research.lighthouse",
43054
43570
  description: "Landing page performance audit. Returns metrics that affect Google Ads Quality Score and CPC.",
@@ -43067,7 +43583,7 @@ var FIELDS11 = {
43067
43583
  speed_index_ms: "Speed Index in ms (good: < 3400)",
43068
43584
  interactive_ms: "Time to Interactive in ms (good: < 3800)"
43069
43585
  };
43070
- var lighthouseCommand = defineCommand174({
43586
+ var lighthouseCommand = defineCommand175({
43071
43587
  meta: {
43072
43588
  name: "lighthouse",
43073
43589
  description: `Landing page performance audit. Metrics affecting Google Ads Quality Score.
@@ -43105,7 +43621,7 @@ Examples:
43105
43621
  });
43106
43622
 
43107
43623
  // src/commands/research/relevant-pages.ts
43108
- import { defineCommand as defineCommand175 } from "citty";
43624
+ import { defineCommand as defineCommand176 } from "citty";
43109
43625
  registerSchema({
43110
43626
  command: "research.relevant-pages",
43111
43627
  description: "Get the top pages of a competitor domain with organic traffic and ranking data. Shows which pages drive the most traffic. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en).",
@@ -43131,7 +43647,7 @@ var FIELDS12 = {
43131
43647
  keywords: "Total organic keywords the page ranks for",
43132
43648
  top_10: "Keywords in positions 1-10"
43133
43649
  };
43134
- var relevantPagesCommand = defineCommand175({
43650
+ var relevantPagesCommand = defineCommand176({
43135
43651
  meta: {
43136
43652
  name: "relevant-pages",
43137
43653
  description: `Get the top pages of a competitor domain with traffic data.
@@ -43178,7 +43694,7 @@ Examples:
43178
43694
  });
43179
43695
 
43180
43696
  // src/commands/research/web.ts
43181
- import { defineCommand as defineCommand176 } from "citty";
43697
+ import { defineCommand as defineCommand177 } from "citty";
43182
43698
  registerSchema({
43183
43699
  command: "research.web",
43184
43700
  description: "Search the web with AI to answer marketing questions \u2014 competitors, ICP, pricing, pain points, market trends. Three depth levels: medium (quick, default), high (thorough), xhigh (exhaustive deep research).",
@@ -43229,7 +43745,7 @@ async function runDeepResearch(question) {
43229
43745
  }
43230
43746
  throw new Error("Deep research timed out");
43231
43747
  }
43232
- var webCommand = defineCommand176({
43748
+ var webCommand = defineCommand177({
43233
43749
  meta: {
43234
43750
  name: "web",
43235
43751
  description: `Search the web with AI to answer any open-ended marketing question. Uses live internet data via Google Search.
@@ -43291,7 +43807,7 @@ Examples:
43291
43807
  });
43292
43808
 
43293
43809
  // src/commands/research/index.ts
43294
- var researchCommand = defineCommand177({
43810
+ var researchCommand = defineCommand178({
43295
43811
  meta: {
43296
43812
  name: "research",
43297
43813
  description: `Competitive intelligence and AI-powered research commands.
@@ -43335,10 +43851,10 @@ Full guide: __tooling__/docs/tools/baker/research.md`
43335
43851
  });
43336
43852
 
43337
43853
  // src/commands/scheduled-actions/index.ts
43338
- import { defineCommand as defineCommand185 } from "citty";
43854
+ import { defineCommand as defineCommand186 } from "citty";
43339
43855
 
43340
43856
  // src/commands/scheduled-actions/create.ts
43341
- import { defineCommand as defineCommand178 } from "citty";
43857
+ import { defineCommand as defineCommand179 } from "citty";
43342
43858
 
43343
43859
  // src/commands/scheduled-actions/shared.ts
43344
43860
  var TEMP_SCHEDULED_ACTION_PREFIX = "temp_sched_";
@@ -43485,7 +44001,7 @@ registerSchema({
43485
44001
  }
43486
44002
  }
43487
44003
  });
43488
- var createCommand3 = defineCommand178({
44004
+ var createCommand3 = defineCommand179({
43489
44005
  meta: {
43490
44006
  name: "create",
43491
44007
  description: 'Stage a scheduled action. Example: baker scheduled-actions create --name "Weekly report" --description "..." --cron "0 9 * * MON"'
@@ -43544,7 +44060,7 @@ var createCommand3 = defineCommand178({
43544
44060
  });
43545
44061
 
43546
44062
  // src/commands/scheduled-actions/delete.ts
43547
- import { defineCommand as defineCommand179 } from "citty";
44063
+ import { defineCommand as defineCommand180 } from "citty";
43548
44064
  registerSchema({
43549
44065
  command: "scheduled-actions.delete",
43550
44066
  description: "Stage deletion of a published scheduled action or cancellation of a temp_sched_* draft creation.",
@@ -43552,7 +44068,7 @@ registerSchema({
43552
44068
  id: { type: "string", description: "Published scheduled action ID or temp_sched_* draft ID", required: true }
43553
44069
  }
43554
44070
  });
43555
- var deleteCommand3 = defineCommand179({
44071
+ var deleteCommand3 = defineCommand180({
43556
44072
  meta: {
43557
44073
  name: "delete",
43558
44074
  description: "Stage scheduled action deletion. Example: baker scheduled-actions delete <id-or-temp_sched_id>"
@@ -43581,7 +44097,7 @@ var deleteCommand3 = defineCommand179({
43581
44097
  });
43582
44098
 
43583
44099
  // src/commands/scheduled-actions/get.ts
43584
- import { defineCommand as defineCommand180 } from "citty";
44100
+ import { defineCommand as defineCommand181 } from "citty";
43585
44101
  registerSchema({
43586
44102
  command: "scheduled-actions.get",
43587
44103
  description: "Get a published scheduled action or a temp_sched_* draft-created scheduled action.",
@@ -43590,7 +44106,7 @@ registerSchema({
43590
44106
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
43591
44107
  }
43592
44108
  });
43593
- var getCommand4 = defineCommand180({
44109
+ var getCommand4 = defineCommand181({
43594
44110
  meta: {
43595
44111
  name: "get",
43596
44112
  description: "Get a scheduled action. Example: baker scheduled-actions get <id-or-temp_sched_id>"
@@ -43629,7 +44145,7 @@ var getCommand4 = defineCommand180({
43629
44145
  });
43630
44146
 
43631
44147
  // src/commands/scheduled-actions/list.ts
43632
- import { defineCommand as defineCommand181 } from "citty";
44148
+ import { defineCommand as defineCommand182 } from "citty";
43633
44149
  registerSchema({
43634
44150
  command: "scheduled-actions.list",
43635
44151
  description: "List published scheduled actions. Includes draft state when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged schedules instead.",
@@ -43637,7 +44153,7 @@ registerSchema({
43637
44153
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
43638
44154
  }
43639
44155
  });
43640
- var listCommand15 = defineCommand181({
44156
+ var listCommand15 = defineCommand182({
43641
44157
  meta: {
43642
44158
  name: "list",
43643
44159
  description: "List scheduled actions. Includes staged draft ops when BAKER_CHAT_ID is set, or --chat <id> to read an earlier chat's staged schedules instead."
@@ -43662,7 +44178,7 @@ var listCommand15 = defineCommand181({
43662
44178
  // src/commands/scheduled-actions/templates.ts
43663
44179
  import { readFile as readFile24 } from "fs/promises";
43664
44180
  import path37 from "path";
43665
- import { defineCommand as defineCommand182 } from "citty";
44181
+ import { defineCommand as defineCommand183 } from "citty";
43666
44182
  registerSchema({
43667
44183
  command: "scheduled-actions.templates",
43668
44184
  description: "The recipes available to this company: the ones Baker ships plus the ones they wrote themselves, each with its id, what it produces and how often it is meant to run. Read this before proposing a company's automation, so every recipe you name is one that exists. Also how a company gets a recipe of its own \u2014 save a brief, prove it runs, then publish it.",
@@ -43717,7 +44233,7 @@ registerSchema({
43717
44233
  }
43718
44234
  }
43719
44235
  });
43720
- var templatesCommand = defineCommand182({
44236
+ var templatesCommand = defineCommand183({
43721
44237
  meta: {
43722
44238
  name: "templates",
43723
44239
  description: `The recipes this company can run \u2014 Baker's own plus theirs, with what each one produces.
@@ -43809,7 +44325,7 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
43809
44325
  });
43810
44326
 
43811
44327
  // src/commands/scheduled-actions/trigger.ts
43812
- import { defineCommand as defineCommand183 } from "citty";
44328
+ import { defineCommand as defineCommand184 } from "citty";
43813
44329
  registerSchema({
43814
44330
  command: "scheduled-actions.trigger",
43815
44331
  description: "Immediately trigger a published scheduled action. Does not require BAKER_CHAT_ID and rejects temp_sched_* IDs.",
@@ -43817,7 +44333,7 @@ registerSchema({
43817
44333
  id: { type: "string", description: "Published scheduled action ID", required: true }
43818
44334
  }
43819
44335
  });
43820
- var triggerCommand = defineCommand183({
44336
+ var triggerCommand = defineCommand184({
43821
44337
  meta: {
43822
44338
  name: "trigger",
43823
44339
  description: "Immediately trigger a published scheduled action. Example: baker scheduled-actions trigger <id>"
@@ -43854,7 +44370,7 @@ var triggerCommand = defineCommand183({
43854
44370
  });
43855
44371
 
43856
44372
  // src/commands/scheduled-actions/update.ts
43857
- import { defineCommand as defineCommand184 } from "citty";
44373
+ import { defineCommand as defineCommand185 } from "citty";
43858
44374
  registerSchema({
43859
44375
  command: "scheduled-actions.update",
43860
44376
  description: "Stage an update to a published scheduled action or temp_sched_* draft-created scheduled action.",
@@ -43885,7 +44401,7 @@ registerSchema({
43885
44401
  prompt: { type: "string", description: "Replacement additional spawned-agent instructions", required: false }
43886
44402
  }
43887
44403
  });
43888
- var updateCommand3 = defineCommand184({
44404
+ var updateCommand3 = defineCommand185({
43889
44405
  meta: {
43890
44406
  name: "update",
43891
44407
  description: "Stage a scheduled action update. Examples: baker scheduled-actions update <id> --enabled false | baker scheduled-actions update <id> --mode publish"
@@ -43963,7 +44479,7 @@ var updateCommand3 = defineCommand184({
43963
44479
  });
43964
44480
 
43965
44481
  // src/commands/scheduled-actions/index.ts
43966
- var scheduledActionsCommand = defineCommand185({
44482
+ var scheduledActionsCommand = defineCommand186({
43967
44483
  meta: {
43968
44484
  name: "scheduled-actions",
43969
44485
  description: `Manage Scheduled Actions. Subcommands: list, get, create, update, delete, trigger, templates.
@@ -43992,14 +44508,14 @@ Full guide: __tooling__/docs/tools/baker/scheduled-actions.md`
43992
44508
  });
43993
44509
 
43994
44510
  // src/commands/schema.ts
43995
- import { defineCommand as defineCommand186 } from "citty";
44511
+ import { defineCommand as defineCommand187 } from "citty";
43996
44512
  function narrowToFamily(commandName, available) {
43997
44513
  const segments = commandName.split(".");
43998
44514
  const prefix = segments[0] === "ads" && segments[1] ? `ads.${segments[1]}.` : `${segments[0]}.`;
43999
44515
  const siblings = available.filter((name) => name.startsWith(prefix));
44000
44516
  return siblings.length > 0 ? siblings : available;
44001
44517
  }
44002
- var schemaCommand2 = defineCommand186({
44518
+ var schemaCommand2 = defineCommand187({
44003
44519
  meta: {
44004
44520
  name: "schema",
44005
44521
  description: "Inspect command argument schemas (for AI agent introspection). Lists all commands if no argument given. Example: baker schema images.search"
@@ -44043,10 +44559,10 @@ var schemaCommand2 = defineCommand186({
44043
44559
  });
44044
44560
 
44045
44561
  // src/commands/studio/index.ts
44046
- import { defineCommand as defineCommand195 } from "citty";
44562
+ import { defineCommand as defineCommand196 } from "citty";
44047
44563
 
44048
44564
  // src/commands/studio/animate.ts
44049
- import { defineCommand as defineCommand187 } from "citty";
44565
+ import { defineCommand as defineCommand188 } from "citty";
44050
44566
 
44051
44567
  // src/commands/studio/batch.ts
44052
44568
  function projectBatch(generation, full) {
@@ -44497,7 +45013,7 @@ function costHintsFor(body) {
44497
45013
  }
44498
45014
  return hints;
44499
45015
  }
44500
- var animateCommand = defineCommand187({
45016
+ var animateCommand = defineCommand188({
44501
45017
  meta: {
44502
45018
  name: "animate",
44503
45019
  description: "Render a clip. With an image the look is already fixed, so the prompt describes MOVEMENT \u2014 what the camera does, what the subject does, in what order. With --from text there is no image and the prompt is the whole shot.\n\nA rendered clip is NOT usable anywhere until you keep it: `baker studio keep <id> --slot N` is what puts it in the video library. Takes nobody keeps are never ingested, which is what makes a rejected batch cheap.\n\nFor anything longer than 15 seconds, or to build on footage that already exists, use --model bytedance/seedance-2.5: it renders 4-30s and is the only model that reads an existing clip or an existing soundtrack.\n\nExamples:\n baker studio animate 'slow push in, model turns to camera and smiles' --image j57abc123def456ghi789\n baker studio animate 'handheld drift right, steam rising from the cup' --image './out/hero.png' --duration 6 --quality 1080p\n baker studio animate 'product rotates once on a turntable' --image j57abc\u2026,j57def\u2026 --from references\n baker studio animate 'she keeps walking, camera stays with her, then she stops and looks up' --image j57abc\u2026 --from references --from-clip j57batch\u2026:0 --model bytedance/seedance-2.5 --duration 20\n baker studio animate 'hold on the product, then a slow push-in' --from references --from-video j57vid\u2026 --model bytedance/seedance-2.5\n baker studio animate 'slow drone pull-back over a solar farm at golden hour, no people' --from text --model bytedance/seedance-2.5 --duration 12"
@@ -44616,7 +45132,7 @@ var animateCommand = defineCommand187({
44616
45132
  });
44617
45133
 
44618
45134
  // src/commands/studio/generate.ts
44619
- import { defineCommand as defineCommand188 } from "citty";
45135
+ import { defineCommand as defineCommand189 } from "citty";
44620
45136
  var MODEL_LIST2 = IMAGE_MODEL_IDS;
44621
45137
  var DEFAULT_MAX_WAIT_MS2 = 24e4;
44622
45138
  registerSchema({
@@ -44752,7 +45268,7 @@ function buildGenerateBody(args, prompt) {
44752
45268
  }
44753
45269
  return body;
44754
45270
  }
44755
- var generateCommand = defineCommand188({
45271
+ var generateCommand = defineCommand189({
44756
45272
  meta: {
44757
45273
  name: "generate",
44758
45274
  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]]'"
@@ -44830,7 +45346,7 @@ var generateCommand = defineCommand188({
44830
45346
  });
44831
45347
 
44832
45348
  // src/commands/studio/get.ts
44833
- import { defineCommand as defineCommand189 } from "citty";
45349
+ import { defineCommand as defineCommand190 } from "citty";
44834
45350
  registerSchema({
44835
45351
  command: "studio.get",
44836
45352
  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.",
@@ -44839,7 +45355,7 @@ registerSchema({
44839
45355
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
44840
45356
  }
44841
45357
  });
44842
- var getCommand5 = defineCommand189({
45358
+ var getCommand5 = defineCommand190({
44843
45359
  meta: {
44844
45360
  name: "get",
44845
45361
  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"
@@ -44868,7 +45384,7 @@ var getCommand5 = defineCommand189({
44868
45384
  });
44869
45385
 
44870
45386
  // src/commands/studio/improve.ts
44871
- import { defineCommand as defineCommand190 } from "citty";
45387
+ import { defineCommand as defineCommand191 } from "citty";
44872
45388
  var DESCRIPTION = "Sharpen a rough brief into directed art direction \u2014 the same rewrite the client gets from the wand in the Studio prompt bar. Reach for it when you are relaying the CLIENT's own words and want them shaped without substituting your voice; when you are writing the art direction yourself, just write it, because you will do a better job than this does.";
44873
45389
  registerSchema({
44874
45390
  command: "studio.improve",
@@ -44893,7 +45409,7 @@ registerSchema({
44893
45409
  }
44894
45410
  }
44895
45411
  });
44896
- var improveCommand = defineCommand190({
45412
+ var improveCommand = defineCommand191({
44897
45413
  meta: {
44898
45414
  name: "improve",
44899
45415
  description: `${DESCRIPTION}
@@ -44937,7 +45453,7 @@ Examples:
44937
45453
  });
44938
45454
 
44939
45455
  // src/commands/studio/keep.ts
44940
- import { defineCommand as defineCommand191 } from "citty";
45456
+ import { defineCommand as defineCommand192 } from "citty";
44941
45457
  registerSchema({
44942
45458
  command: "studio.keep",
44943
45459
  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.",
@@ -44947,7 +45463,7 @@ registerSchema({
44947
45463
  undo: { type: "boolean", description: "Un-star an image, or take a kept clip back out", required: false }
44948
45464
  }
44949
45465
  });
44950
- var keepCommand = defineCommand191({
45466
+ var keepCommand = defineCommand192({
44951
45467
  meta: {
44952
45468
  name: "keep",
44953
45469
  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"
@@ -44998,7 +45514,7 @@ var keepCommand = defineCommand191({
44998
45514
  });
44999
45515
 
45000
45516
  // src/commands/studio/list.ts
45001
- import { defineCommand as defineCommand192 } from "citty";
45517
+ import { defineCommand as defineCommand193 } from "citty";
45002
45518
  registerSchema({
45003
45519
  command: "studio.list",
45004
45520
  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.",
@@ -45009,7 +45525,7 @@ registerSchema({
45009
45525
  full: { type: "boolean", description: "Include settings, references and attribution", required: false }
45010
45526
  }
45011
45527
  });
45012
- var listCommand16 = defineCommand192({
45528
+ var listCommand16 = defineCommand193({
45013
45529
  meta: {
45014
45530
  name: "list",
45015
45531
  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"
@@ -45043,7 +45559,7 @@ var listCommand16 = defineCommand192({
45043
45559
  });
45044
45560
 
45045
45561
  // src/commands/studio/models.ts
45046
- import { defineCommand as defineCommand193 } from "citty";
45562
+ import { defineCommand as defineCommand194 } from "citty";
45047
45563
  var DESCRIPTION2 = "What each Studio model actually accepts: its shapes, resolutions, clip lengths, prompt character cap, how many reference images it takes, and which knobs it has. Read this before a batch you care about \u2014 the models disagree far more than they look like they do, and a setting the chosen model does not have is REFUSED, not ignored.";
45048
45564
  registerSchema({
45049
45565
  command: "studio.models",
@@ -45130,7 +45646,7 @@ function buildModelCards(kind, model) {
45130
45646
  const selected = model ? ids.filter((id) => id === model) : ids;
45131
45647
  return selected.map((id) => build(id));
45132
45648
  }
45133
- var modelsCommand = defineCommand193({
45649
+ var modelsCommand = defineCommand194({
45134
45650
  meta: {
45135
45651
  name: "models",
45136
45652
  description: `${DESCRIPTION2}
@@ -45177,13 +45693,13 @@ Examples:
45177
45693
  });
45178
45694
 
45179
45695
  // src/commands/studio/skills.ts
45180
- import { defineCommand as defineCommand194 } from "citty";
45696
+ import { defineCommand as defineCommand195 } from "citty";
45181
45697
  registerSchema({
45182
45698
  command: "studio.skills",
45183
45699
  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.",
45184
45700
  args: {}
45185
45701
  });
45186
- var skillsCommand = defineCommand194({
45702
+ var skillsCommand = defineCommand195({
45187
45703
  meta: {
45188
45704
  name: "skills",
45189
45705
  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"
@@ -45207,7 +45723,7 @@ var skillsCommand = defineCommand194({
45207
45723
  });
45208
45724
 
45209
45725
  // src/commands/studio/index.ts
45210
- var studioCommand = defineCommand195({
45726
+ var studioCommand = defineCommand196({
45211
45727
  meta: {
45212
45728
  name: "studio",
45213
45729
  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.
@@ -45250,10 +45766,10 @@ Full guide: __tooling__/docs/tools/baker/studio.md`
45250
45766
  });
45251
45767
 
45252
45768
  // src/commands/tag-manager/index.ts
45253
- import { defineCommand as defineCommand199 } from "citty";
45769
+ import { defineCommand as defineCommand200 } from "citty";
45254
45770
 
45255
45771
  // src/commands/tag-manager/draft.ts
45256
- import { defineCommand as defineCommand196 } from "citty";
45772
+ import { defineCommand as defineCommand197 } from "citty";
45257
45773
 
45258
45774
  // src/commands/tag-manager/shared.ts
45259
45775
  import { readFileSync as readFileSync15 } from "fs";
@@ -45376,13 +45892,13 @@ registerSchema({
45376
45892
  chat: { type: "string", description: CHAT_READ_ARG.description, required: false }
45377
45893
  }
45378
45894
  });
45379
- var draftCommand4 = defineCommand196({
45895
+ var draftCommand4 = defineCommand197({
45380
45896
  meta: {
45381
45897
  name: "draft",
45382
45898
  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."
45383
45899
  },
45384
45900
  subCommands: {
45385
- list: defineCommand196({
45901
+ list: defineCommand197({
45386
45902
  meta: {
45387
45903
  name: "list",
45388
45904
  description: "Review everything staged on this chat (--json for the raw envelope)"
@@ -45395,7 +45911,7 @@ var draftCommand4 = defineCommand196({
45395
45911
  await draftList2(args.json === true, args.chat);
45396
45912
  }
45397
45913
  }),
45398
- show: defineCommand196({
45914
+ show: defineCommand197({
45399
45915
  meta: {
45400
45916
  name: "show",
45401
45917
  description: "Print the full staged payload for one change \u2014 the receipt to verify it looks right before publish (never truncated)."
@@ -45412,7 +45928,7 @@ var draftCommand4 = defineCommand196({
45412
45928
  );
45413
45929
  }
45414
45930
  }),
45415
- amend: defineCommand196({
45931
+ amend: defineCommand197({
45416
45932
  meta: {
45417
45933
  name: "amend",
45418
45934
  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."
@@ -45429,7 +45945,7 @@ var draftCommand4 = defineCommand196({
45429
45945
  });
45430
45946
  }
45431
45947
  }),
45432
- remove: defineCommand196({
45948
+ remove: defineCommand197({
45433
45949
  meta: { name: "remove", description: "Remove one staged change (cascades to anything depending on it)" },
45434
45950
  args: { ref: { type: "positional", description: "Staged ref (gtm_temp_*) or target", required: false } },
45435
45951
  run: async ({ args }) => {
@@ -45438,7 +45954,7 @@ var draftCommand4 = defineCommand196({
45438
45954
  });
45439
45955
  }
45440
45956
  }),
45441
- clear: defineCommand196({
45957
+ clear: defineCommand197({
45442
45958
  meta: { name: "clear", description: "Discard all Tag Manager changes staged on this chat" },
45443
45959
  run: async () => {
45444
45960
  await draftAction3("/api/tag-manager/draft/clear", {});
@@ -45448,7 +45964,7 @@ var draftCommand4 = defineCommand196({
45448
45964
  });
45449
45965
 
45450
45966
  // src/commands/tag-manager/read.ts
45451
- import { defineCommand as defineCommand197 } from "citty";
45967
+ import { defineCommand as defineCommand198 } from "citty";
45452
45968
  registerSchema({
45453
45969
  command: "tagManager.containers",
45454
45970
  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.",
@@ -45489,7 +46005,7 @@ function containersHints(containers) {
45489
46005
  }))
45490
46006
  });
45491
46007
  }
45492
- var containersCommand = defineCommand197({
46008
+ var containersCommand = defineCommand198({
45493
46009
  meta: {
45494
46010
  name: "containers",
45495
46011
  description: `List Tag Manager containers reachable by this company's connection.
@@ -45506,7 +46022,7 @@ Start here:
45506
46022
  }
45507
46023
  }
45508
46024
  });
45509
- var readCommand = defineCommand197({
46025
+ var readCommand = defineCommand198({
45510
46026
  meta: {
45511
46027
  name: "read",
45512
46028
  description: `Read the current contents of the Tag Manager container \u2014 always do this before staging changes.
@@ -45548,7 +46064,7 @@ Examples:
45548
46064
  });
45549
46065
 
45550
46066
  // src/commands/tag-manager/write-commands.ts
45551
- import { defineCommand as defineCommand198 } from "citty";
46067
+ import { defineCommand as defineCommand199 } from "citty";
45552
46068
  var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
45553
46069
  var ENTITIES = [
45554
46070
  {
@@ -45604,10 +46120,10 @@ for (const { entity, noun, createHint } of ENTITIES) {
45604
46120
  });
45605
46121
  }
45606
46122
  function entityCommand(entity, noun, example) {
45607
- return defineCommand198({
46123
+ return defineCommand199({
45608
46124
  meta: { name: entity, description: `Stage ${noun} changes on this chat's Tag Manager draft` },
45609
46125
  subCommands: {
45610
- create: defineCommand198({
46126
+ create: defineCommand199({
45611
46127
  meta: {
45612
46128
  name: "create",
45613
46129
  description: `Stage a new ${noun}
@@ -45629,7 +46145,7 @@ Examples:
45629
46145
  });
45630
46146
  }
45631
46147
  }),
45632
- update: defineCommand198({
46148
+ update: defineCommand199({
45633
46149
  meta: {
45634
46150
  name: "update",
45635
46151
  description: `Stage an update to an existing ${noun} (pass its id or path)`
@@ -45649,7 +46165,7 @@ Examples:
45649
46165
  });
45650
46166
  }
45651
46167
  }),
45652
- delete: defineCommand198({
46168
+ delete: defineCommand199({
45653
46169
  meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
45654
46170
  args: {
45655
46171
  id: { type: "positional", description: `${noun} id or path`, required: false },
@@ -45690,7 +46206,7 @@ function builtinTypes(args) {
45690
46206
  }
45691
46207
  return raw.split(",").map((entry) => entry.trim());
45692
46208
  }
45693
- var builtinCommand = defineCommand198({
46209
+ var builtinCommand = defineCommand199({
45694
46210
  meta: {
45695
46211
  name: "builtin",
45696
46212
  description: `Enable or disable built-in variables
@@ -45700,7 +46216,7 @@ Examples:
45700
46216
  baker tag-manager builtin disable --types formId`
45701
46217
  },
45702
46218
  subCommands: {
45703
- enable: defineCommand198({
46219
+ enable: defineCommand199({
45704
46220
  meta: { name: "enable", description: "Stage enabling built-in variables" },
45705
46221
  args: {
45706
46222
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -45714,7 +46230,7 @@ Examples:
45714
46230
  });
45715
46231
  }
45716
46232
  }),
45717
- disable: defineCommand198({
46233
+ disable: defineCommand199({
45718
46234
  meta: { name: "disable", description: "Stage disabling built-in variables" },
45719
46235
  args: {
45720
46236
  types: { type: "string", description: "Comma-separated types", required: false },
@@ -45732,7 +46248,7 @@ Examples:
45732
46248
  });
45733
46249
 
45734
46250
  // src/commands/tag-manager/index.ts
45735
- var tagManagerCommand = defineCommand199({
46251
+ var tagManagerCommand = defineCommand200({
45736
46252
  meta: {
45737
46253
  name: "tag-manager",
45738
46254
  description: `Read and change what lives inside the client's Google Tag Manager container \u2014 tags, triggers, variables, folders and built-in variables.
@@ -45769,7 +46285,7 @@ Full guide: __tooling__/docs/tools/baker/tag-manager.md`
45769
46285
  });
45770
46286
 
45771
46287
  // src/commands/tags/index.ts
45772
- import { defineCommand as defineCommand200 } from "citty";
46288
+ import { defineCommand as defineCommand201 } from "citty";
45773
46289
 
45774
46290
  // src/commands/tags/shared.ts
45775
46291
  function failApi3(err) {
@@ -45838,7 +46354,7 @@ async function listTags(json) {
45838
46354
  var listArgs9 = {
45839
46355
  json: { type: "boolean", description: "Print the raw JSON envelope instead of the readable list" }
45840
46356
  };
45841
- var listCommand17 = defineCommand200({
46357
+ var listCommand17 = defineCommand201({
45842
46358
  meta: {
45843
46359
  name: "list",
45844
46360
  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"
@@ -45857,7 +46373,7 @@ async function listDraft3(chat) {
45857
46373
  failApi3(err);
45858
46374
  }
45859
46375
  }
45860
- var draftCommand5 = defineCommand200({
46376
+ var draftCommand5 = defineCommand201({
45861
46377
  meta: {
45862
46378
  name: "draft",
45863
46379
  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."
@@ -45867,7 +46383,7 @@ var draftCommand5 = defineCommand200({
45867
46383
  await listDraft3(args.chat);
45868
46384
  }
45869
46385
  });
45870
- var tagsCommand3 = defineCommand200({
46386
+ var tagsCommand3 = defineCommand201({
45871
46387
  meta: {
45872
46388
  name: "tags",
45873
46389
  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.
@@ -45896,10 +46412,10 @@ Full guide: __tooling__/docs/tools/baker/tags.md`
45896
46412
  });
45897
46413
 
45898
46414
  // src/commands/testimonials/index.ts
45899
- import { defineCommand as defineCommand204 } from "citty";
46415
+ import { defineCommand as defineCommand205 } from "citty";
45900
46416
 
45901
46417
  // src/commands/testimonials/get.ts
45902
- import { defineCommand as defineCommand201 } from "citty";
46418
+ import { defineCommand as defineCommand202 } from "citty";
45903
46419
  registerSchema({
45904
46420
  command: "testimonials.get",
45905
46421
  description: "Get a single testimonial by ID",
@@ -45907,7 +46423,7 @@ registerSchema({
45907
46423
  id: { type: "string", description: "Testimonial ID", required: true }
45908
46424
  }
45909
46425
  });
45910
- var getCommand6 = defineCommand201({
46426
+ var getCommand6 = defineCommand202({
45911
46427
  meta: { name: "get", description: "Get a single testimonial by ID. Example: baker testimonials get j571abc123" },
45912
46428
  args: {
45913
46429
  id: { type: "positional", description: "Testimonial ID", required: false },
@@ -45944,7 +46460,7 @@ var getCommand6 = defineCommand201({
45944
46460
  });
45945
46461
 
45946
46462
  // src/commands/testimonials/list.ts
45947
- import { defineCommand as defineCommand202 } from "citty";
46463
+ import { defineCommand as defineCommand203 } from "citty";
45948
46464
 
45949
46465
  // src/commands/testimonials/emptyCorpusHints.ts
45950
46466
  function resolveEmptyReason({
@@ -46079,7 +46595,7 @@ function buildListParams(args) {
46079
46595
  }
46080
46596
  return params;
46081
46597
  }
46082
- var listCommand18 = defineCommand202({
46598
+ var listCommand18 = defineCommand203({
46083
46599
  meta: {
46084
46600
  name: "list",
46085
46601
  description: "List testimonials with optional filters. Example: baker testimonials list --source google --sentiment positive"
@@ -46131,7 +46647,7 @@ var listCommand18 = defineCommand202({
46131
46647
  });
46132
46648
 
46133
46649
  // src/commands/testimonials/search.ts
46134
- import { defineCommand as defineCommand203 } from "citty";
46650
+ import { defineCommand as defineCommand204 } from "citty";
46135
46651
  var FILTER_FLAGS2 = ["source", "rating-min", "rating-max", "status", "sentiment", "language", "tags"];
46136
46652
  function languageBiasHint(results, requestedLanguage) {
46137
46653
  if (requestedLanguage) {
@@ -46210,7 +46726,7 @@ function buildSearchRequest(query, args) {
46210
46726
  }
46211
46727
  return body;
46212
46728
  }
46213
- var searchCommand3 = defineCommand203({
46729
+ var searchCommand3 = defineCommand204({
46214
46730
  meta: {
46215
46731
  name: "search",
46216
46732
  description: "Semantic search testimonials by text query. Uses hybrid BM25 + vector + reranking. Example: baker testimonials search 'great service' --rating-min 4"
@@ -46274,7 +46790,7 @@ var searchCommand3 = defineCommand203({
46274
46790
  var tagsCommand4 = makeTagsCommand("testimonials", "testimonial", "/api/testimonials/tags");
46275
46791
 
46276
46792
  // src/commands/testimonials/index.ts
46277
- var testimonialsCommand = defineCommand204({
46793
+ var testimonialsCommand = defineCommand205({
46278
46794
  meta: {
46279
46795
  name: "testimonials",
46280
46796
  description: `Find and browse testimonials in Baker. Subcommands: search, get, list, tags.
@@ -46296,10 +46812,10 @@ Full guide: __tooling__/docs/tools/baker/testimonials.md`
46296
46812
  });
46297
46813
 
46298
46814
  // src/commands/videos/index.ts
46299
- import { defineCommand as defineCommand211 } from "citty";
46815
+ import { defineCommand as defineCommand212 } from "citty";
46300
46816
 
46301
46817
  // src/commands/videos/delete.ts
46302
- import { defineCommand as defineCommand205 } from "citty";
46818
+ import { defineCommand as defineCommand206 } from "citty";
46303
46819
  registerSchema({
46304
46820
  command: "videos.delete",
46305
46821
  description: "Delete a video by ID",
@@ -46313,7 +46829,7 @@ registerSchema({
46313
46829
  }
46314
46830
  }
46315
46831
  });
46316
- var deleteCommand4 = defineCommand205({
46832
+ var deleteCommand4 = defineCommand206({
46317
46833
  meta: {
46318
46834
  name: "delete",
46319
46835
  description: "Delete a video by ID. Use --dry-run to preview. Example: baker videos delete j571abc123 --dry-run"
@@ -46354,7 +46870,7 @@ var deleteCommand4 = defineCommand205({
46354
46870
  });
46355
46871
 
46356
46872
  // src/commands/videos/get.ts
46357
- import { defineCommand as defineCommand206 } from "citty";
46873
+ import { defineCommand as defineCommand207 } from "citty";
46358
46874
  registerSchema({
46359
46875
  command: "videos.get",
46360
46876
  description: "Get a single video by ID",
@@ -46362,7 +46878,7 @@ registerSchema({
46362
46878
  id: { type: "string", description: "Video ID", required: true }
46363
46879
  }
46364
46880
  });
46365
- var getCommand7 = defineCommand206({
46881
+ var getCommand7 = defineCommand207({
46366
46882
  meta: { name: "get", description: "Get a single video by ID. Example: baker videos get j571abc123" },
46367
46883
  args: {
46368
46884
  id: { type: "positional", description: "Video ID", required: false },
@@ -46399,7 +46915,7 @@ var getCommand7 = defineCommand206({
46399
46915
  });
46400
46916
 
46401
46917
  // src/commands/videos/group.ts
46402
- import { defineCommand as defineCommand207 } from "citty";
46918
+ import { defineCommand as defineCommand208 } from "citty";
46403
46919
  registerSchema({
46404
46920
  command: "videos.group",
46405
46921
  description: "List every clip and image that arrived in the same set as this video (carousel slides, one page)",
@@ -46408,7 +46924,7 @@ registerSchema({
46408
46924
  "group-key": { type: "string", description: "The set key directly, when you already have it", required: false }
46409
46925
  }
46410
46926
  });
46411
- var groupCommand2 = defineCommand207({
46927
+ var groupCommand2 = defineCommand208({
46412
46928
  meta: {
46413
46929
  name: "group",
46414
46930
  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>"
@@ -46431,7 +46947,7 @@ var groupCommand2 = defineCommand207({
46431
46947
  import { mkdtemp as mkdtemp2, rm as rm7, stat as stat7 } from "fs/promises";
46432
46948
  import { tmpdir as tmpdir3 } from "os";
46433
46949
  import path38 from "path";
46434
- import { defineCommand as defineCommand208 } from "citty";
46950
+ import { defineCommand as defineCommand209 } from "citty";
46435
46951
 
46436
46952
  // src/lib/streamUpload.ts
46437
46953
  import { createHash as createHash2 } from "crypto";
@@ -46595,7 +47111,7 @@ registerSchema({
46595
47111
  "dry-run": { type: "boolean", description: "Preview the operation without executing", required: false }
46596
47112
  }
46597
47113
  });
46598
- var ingestCommand2 = defineCommand208({
47114
+ var ingestCommand2 = defineCommand209({
46599
47115
  meta: {
46600
47116
  name: "ingest",
46601
47117
  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"
@@ -46857,7 +47373,7 @@ async function uploadToAssetStore(filePath, sizeBytes) {
46857
47373
  }
46858
47374
 
46859
47375
  // src/commands/videos/search.ts
46860
- import { defineCommand as defineCommand209 } from "citty";
47376
+ import { defineCommand as defineCommand210 } from "citty";
46861
47377
  registerSchema({
46862
47378
  command: "videos.search",
46863
47379
  description: "Search videos by text query. Only returns ready videos.",
@@ -46867,7 +47383,7 @@ registerSchema({
46867
47383
  tags: { type: "string", description: "Comma-separated tags to filter by", required: false }
46868
47384
  }
46869
47385
  });
46870
- var searchCommand4 = defineCommand209({
47386
+ var searchCommand4 = defineCommand210({
46871
47387
  meta: {
46872
47388
  name: "search",
46873
47389
  description: "Semantic search videos by text query. Uses hybrid BM25 + vector + reranking. Example: baker videos search 'product demo' --tags tutorial"
@@ -46919,7 +47435,7 @@ var tagsCommand5 = makeTagsCommand("videos", "video", "/api/videos/tags");
46919
47435
  // src/commands/videos/upload.ts
46920
47436
  import { readFile as readFile25, stat as stat8 } from "fs/promises";
46921
47437
  import { basename as basename3, extname as extname4 } from "path";
46922
- import { defineCommand as defineCommand210 } from "citty";
47438
+ import { defineCommand as defineCommand211 } from "citty";
46923
47439
  var MIME_MAP = {
46924
47440
  ".mp4": "video/mp4",
46925
47441
  ".mov": "video/quicktime",
@@ -46961,7 +47477,7 @@ function detectContentType(filePath) {
46961
47477
  function isRemoteUrl3(value) {
46962
47478
  return /^https?:\/\//i.test(value);
46963
47479
  }
46964
- var uploadCommand2 = defineCommand210({
47480
+ var uploadCommand2 = defineCommand211({
46965
47481
  meta: {
46966
47482
  name: "upload",
46967
47483
  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"
@@ -47045,7 +47561,7 @@ var uploadCommand2 = defineCommand210({
47045
47561
  });
47046
47562
 
47047
47563
  // src/commands/videos/index.ts
47048
- var videosCommand = defineCommand211({
47564
+ var videosCommand = defineCommand212({
47049
47565
  meta: {
47050
47566
  name: "videos",
47051
47567
  description: `Find and manage videos in Baker. Subcommands: search, get, upload, ingest, delete, tags.
@@ -47072,10 +47588,10 @@ Full guide: __tooling__/docs/tools/baker/videos.md`
47072
47588
  });
47073
47589
 
47074
47590
  // src/commands/winning-ads/index.ts
47075
- import { defineCommand as defineCommand224 } from "citty";
47591
+ import { defineCommand as defineCommand225 } from "citty";
47076
47592
 
47077
47593
  // src/commands/winning-ads/advertisers.ts
47078
- import { defineCommand as defineCommand212 } from "citty";
47594
+ import { defineCommand as defineCommand213 } from "citty";
47079
47595
 
47080
47596
  // src/commands/winning-ads/shared.ts
47081
47597
  function splitList2(value) {
@@ -47128,7 +47644,7 @@ function advertiserNormalizer(record, full) {
47128
47644
  last_synced_at: record.last_synced_at ?? null
47129
47645
  };
47130
47646
  }
47131
- var advertisersCommand2 = defineCommand212({
47647
+ var advertisersCommand2 = defineCommand213({
47132
47648
  meta: {
47133
47649
  name: "advertisers",
47134
47650
  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'
@@ -47186,7 +47702,7 @@ var advertisersCommand2 = defineCommand212({
47186
47702
  });
47187
47703
 
47188
47704
  // src/commands/winning-ads/brief.ts
47189
- import { defineCommand as defineCommand213 } from "citty";
47705
+ import { defineCommand as defineCommand214 } from "citty";
47190
47706
  registerSchema({
47191
47707
  command: "winning-ads.brief",
47192
47708
  description: "Generate a creative brief grounded in strategically-similar winning ads. Optionally describe the target creative with --dna (JSON) and steer with --notes.",
@@ -47232,7 +47748,7 @@ function parseDna(raw) {
47232
47748
  }
47233
47749
  return parsed;
47234
47750
  }
47235
- var briefCommand = defineCommand213({
47751
+ var briefCommand = defineCommand214({
47236
47752
  meta: {
47237
47753
  name: "brief",
47238
47754
  description: `Generate a creative brief from winning references. Example: baker winning-ads brief --dna '{"angle":"cost savings"}' --notes "B2B, LinkedIn video" --k 8`
@@ -47268,7 +47784,7 @@ var briefCommand = defineCommand213({
47268
47784
  });
47269
47785
 
47270
47786
  // src/commands/winning-ads/content.ts
47271
- import { defineCommand as defineCommand214 } from "citty";
47787
+ import { defineCommand as defineCommand215 } from "citty";
47272
47788
  registerSchema({
47273
47789
  command: "winning-ads.content",
47274
47790
  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.",
@@ -47281,7 +47797,7 @@ registerSchema({
47281
47797
  }
47282
47798
  }
47283
47799
  });
47284
- var contentCommand = defineCommand214({
47800
+ var contentCommand = defineCommand215({
47285
47801
  meta: {
47286
47802
  name: "content",
47287
47803
  description: "Read the transcript + on-screen text + copy of one winning ad. Example: baker winning-ads content adg_123 --platform meta --full --output md"
@@ -47330,7 +47846,7 @@ var contentCommand = defineCommand214({
47330
47846
  });
47331
47847
 
47332
47848
  // src/commands/winning-ads/feed.ts
47333
- import { defineCommand as defineCommand215 } from "citty";
47849
+ import { defineCommand as defineCommand216 } from "citty";
47334
47850
  function buildFeedParams(input) {
47335
47851
  const params = {};
47336
47852
  const advertiser = splitList2(input.advertiser);
@@ -47382,7 +47898,7 @@ registerSchema({
47382
47898
  format: { type: "string", description: "Comma-separated formats to include (e.g. static,video)", required: false }
47383
47899
  }
47384
47900
  });
47385
- var feedCommand = defineCommand215({
47901
+ var feedCommand = defineCommand216({
47386
47902
  meta: {
47387
47903
  name: "feed",
47388
47904
  description: "Winners across every brand you follow (browse, then trim per advertiser). Example: baker winning-ads feed --per-advertiser 5 --output md"
@@ -47467,7 +47983,7 @@ var feedCommand = defineCommand215({
47467
47983
  });
47468
47984
 
47469
47985
  // src/commands/winning-ads/follow.ts
47470
- import { defineCommand as defineCommand216 } from "citty";
47986
+ import { defineCommand as defineCommand217 } from "citty";
47471
47987
  var PLATFORMS = ["meta", "linkedin"];
47472
47988
  registerSchema({
47473
47989
  command: "winning-ads.follow",
@@ -47482,7 +47998,7 @@ registerSchema({
47482
47998
  label: { type: "string", description: "Optional display label (defaults to the resolved name)", required: false }
47483
47999
  }
47484
48000
  });
47485
- var followCommand = defineCommand216({
48001
+ var followCommand = defineCommand217({
47486
48002
  meta: {
47487
48003
  name: "follow",
47488
48004
  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 both Meta + LinkedIn. Example: baker winning-ads follow "deel.com" --platform meta'
@@ -47529,7 +48045,7 @@ var followCommand = defineCommand216({
47529
48045
  });
47530
48046
 
47531
48047
  // src/commands/winning-ads/follow-competitors.ts
47532
- import { defineCommand as defineCommand217 } from "citty";
48048
+ import { defineCommand as defineCommand218 } from "citty";
47533
48049
  var PLATFORMS2 = ["meta", "linkedin"];
47534
48050
  var BATCH_TIMEOUT_MS = 3e5;
47535
48051
  function buildFollowBatchBody(input) {
@@ -47562,7 +48078,7 @@ registerSchema({
47562
48078
  }
47563
48079
  }
47564
48080
  });
47565
- var followCompetitorsCommand = defineCommand217({
48081
+ var followCompetitorsCommand = defineCommand218({
47566
48082
  meta: {
47567
48083
  name: "follow-competitors",
47568
48084
  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"'
@@ -47637,7 +48153,7 @@ var followCompetitorsCommand = defineCommand217({
47637
48153
  });
47638
48154
 
47639
48155
  // src/commands/winning-ads/following.ts
47640
- import { defineCommand as defineCommand218 } from "citty";
48156
+ import { defineCommand as defineCommand219 } from "citty";
47641
48157
  registerSchema({
47642
48158
  command: "winning-ads.following",
47643
48159
  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.",
@@ -47691,7 +48207,7 @@ function followingNormalizer(record, full) {
47691
48207
  platforms: Array.isArray(record.platforms) ? record.platforms : []
47692
48208
  };
47693
48209
  }
47694
- var followingCommand = defineCommand218({
48210
+ var followingCommand = defineCommand219({
47695
48211
  meta: {
47696
48212
  name: "following",
47697
48213
  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"
@@ -47727,7 +48243,7 @@ var followingCommand = defineCommand218({
47727
48243
  });
47728
48244
 
47729
48245
  // src/commands/winning-ads/patterns.ts
47730
- import { defineCommand as defineCommand219 } from "citty";
48246
+ import { defineCommand as defineCommand220 } from "citty";
47731
48247
  registerSchema({
47732
48248
  command: "winning-ads.patterns",
47733
48249
  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.",
@@ -47766,7 +48282,7 @@ function discriminatorRow(record) {
47766
48282
  top_values_duds: Array.isArray(record.top_values_b) ? record.top_values_b.join(", ") : ""
47767
48283
  };
47768
48284
  }
47769
- var patternsCommand = defineCommand219({
48285
+ var patternsCommand = defineCommand220({
47770
48286
  meta: {
47771
48287
  name: "patterns",
47772
48288
  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"
@@ -47822,7 +48338,7 @@ var patternsCommand = defineCommand219({
47822
48338
  });
47823
48339
 
47824
48340
  // src/commands/winning-ads/search.ts
47825
- import { defineCommand as defineCommand220 } from "citty";
48341
+ import { defineCommand as defineCommand221 } from "citty";
47826
48342
  registerSchema({
47827
48343
  command: "winning-ads.search",
47828
48344
  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.",
@@ -47930,7 +48446,7 @@ function buildSearchBody2(args) {
47930
48446
  }
47931
48447
  return body;
47932
48448
  }
47933
- var searchCommand5 = defineCommand220({
48449
+ var searchCommand5 = defineCommand221({
47934
48450
  meta: {
47935
48451
  name: "search",
47936
48452
  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"
@@ -48045,7 +48561,7 @@ var searchCommand5 = defineCommand220({
48045
48561
  });
48046
48562
 
48047
48563
  // src/commands/winning-ads/seeds.ts
48048
- import { defineCommand as defineCommand221 } from "citty";
48564
+ import { defineCommand as defineCommand222 } from "citty";
48049
48565
  function leanRow(r) {
48050
48566
  return {
48051
48567
  key: r.key,
@@ -48073,7 +48589,7 @@ function makeSeedCommand(opts) {
48073
48589
  limit: { type: "number", description: "Max keys 1-100 (default 20)", required: false, default: 20 }
48074
48590
  }
48075
48591
  });
48076
- return defineCommand221({
48592
+ return defineCommand222({
48077
48593
  meta: { name: opts.name, description: opts.description },
48078
48594
  args: {
48079
48595
  platform: { type: "string", description: "Single platform to segment on", required: false },
@@ -48122,7 +48638,7 @@ var formatsCommand = makeSeedCommand({
48122
48638
  });
48123
48639
 
48124
48640
  // src/commands/winning-ads/unfollow.ts
48125
- import { defineCommand as defineCommand222 } from "citty";
48641
+ import { defineCommand as defineCommand223 } from "citty";
48126
48642
  registerSchema({
48127
48643
  command: "winning-ads.unfollow",
48128
48644
  description: "Stop following a brand \u2014 removes it from your ad-dna library by advertiser id.",
@@ -48130,7 +48646,7 @@ registerSchema({
48130
48646
  advertiser: { type: "string", description: "Advertiser id to unfollow", required: true }
48131
48647
  }
48132
48648
  });
48133
- var unfollowCommand = defineCommand222({
48649
+ var unfollowCommand = defineCommand223({
48134
48650
  meta: {
48135
48651
  name: "unfollow",
48136
48652
  description: "Stop following a brand by advertiser id. Example: baker winning-ads unfollow adv_123"
@@ -48151,7 +48667,7 @@ var unfollowCommand = defineCommand222({
48151
48667
  });
48152
48668
 
48153
48669
  // src/commands/winning-ads/winners.ts
48154
- import { defineCommand as defineCommand223 } from "citty";
48670
+ import { defineCommand as defineCommand224 } from "citty";
48155
48671
  registerSchema({
48156
48672
  command: "winning-ads.winners",
48157
48673
  description: "Top winning ads for one advertiser id (from `advertisers` or `following`). Returns lean winner cards; add --full for DNA + longevity.",
@@ -48161,7 +48677,7 @@ registerSchema({
48161
48677
  platform: { type: "string", description: "Filter to a single platform: meta|linkedin", required: false }
48162
48678
  }
48163
48679
  });
48164
- var winnersCommand = defineCommand223({
48680
+ var winnersCommand = defineCommand224({
48165
48681
  meta: {
48166
48682
  name: "winners",
48167
48683
  description: "Top winning ads for a specific advertiser id. Example: baker winning-ads winners adv_123 --top 15 --output md"
@@ -48211,7 +48727,7 @@ var winnersCommand = defineCommand223({
48211
48727
  });
48212
48728
 
48213
48729
  // src/commands/winning-ads/index.ts
48214
- var winningAdsCommand = defineCommand224({
48730
+ var winningAdsCommand = defineCommand225({
48215
48731
  meta: {
48216
48732
  name: "winning-ads",
48217
48733
  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.
@@ -48449,7 +48965,7 @@ function getCliVersion() {
48449
48965
  }
48450
48966
 
48451
48967
  // src/cli.ts
48452
- var main = defineCommand225({
48968
+ var main = defineCommand226({
48453
48969
  meta: {
48454
48970
  name: "baker",
48455
48971
  version: getCliVersion(),