@koda-sl/baker-cli 0.161.0 → 0.162.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
@@ -4265,14 +4265,40 @@ import { defineCommand as defineCommand31 } from "citty";
4265
4265
 
4266
4266
  // src/commands/ads/google/accounts.ts
4267
4267
  import { defineCommand as defineCommand19 } from "citty";
4268
+
4269
+ // src/connected-resources.ts
4270
+ function listed(resources) {
4271
+ return resources.map((resource) => resource.label ? `${resource.id} (${resource.label})` : resource.id).join("; ");
4272
+ }
4273
+ function connectedResourceHints({ plural, singular, flag, resources }) {
4274
+ if (resources.length === 0) {
4275
+ return [];
4276
+ }
4277
+ if (resources.length === 1) {
4278
+ return [`This company connected one ${singular}: ${listed(resources)}. Commands use it unless you pass ${flag}.`];
4279
+ }
4280
+ return [
4281
+ `This company connected ${resources.length} ${plural}: ${listed(resources)}. Each command works on one, so pass ${flag} \u2014 nothing is picked for you. A question about the whole business covers all ${resources.length}: answering from one and reporting it as the total is wrong.`
4282
+ ];
4283
+ }
4284
+
4285
+ // src/commands/ads/google/accounts.ts
4268
4286
  registerSchema({
4269
4287
  command: "ads.google.accounts",
4270
- description: "List all accessible Google Ads customer accounts. Returns accounts with id, name, access_type (direct or managed), level in the hierarchy, and optional manager_id for managed accounts. Run this first to find account IDs for other commands.",
4288
+ description: "List the Google Ads accounts this company connected \u2014 there can be several, and every one of them is yours to work in. Returns accounts with id, name, access_type (direct or managed), level in the hierarchy, and optional manager_id for managed accounts. Run this first to find account IDs for other commands.",
4271
4289
  args: {
4272
4290
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false },
4273
4291
  output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" }
4274
4292
  }
4275
4293
  });
4294
+ function accountHints(accounts) {
4295
+ return connectedResourceHints({
4296
+ plural: "Google Ads accounts",
4297
+ singular: "Google Ads account",
4298
+ flag: "--customer-id",
4299
+ resources: accounts.map((account) => ({ id: account.id, label: account.name }))
4300
+ });
4301
+ }
4276
4302
  function handleAccountsError(err) {
4277
4303
  if (err instanceof ApiError) {
4278
4304
  if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
@@ -4313,7 +4339,7 @@ Examples:
4313
4339
  if (useCache) {
4314
4340
  const cached = cacheGet("accounts", "list");
4315
4341
  if (cached) {
4316
- writeAdsJson({ ok: true, data: cached.data, cached: true });
4342
+ writeJsonEnvelope({ ok: true, data: cached.data, cached: true, hints: accountHints(cached.data) });
4317
4343
  return;
4318
4344
  }
4319
4345
  }
@@ -4328,7 +4354,7 @@ Examples:
4328
4354
  writeAdsOutput(data, format);
4329
4355
  return;
4330
4356
  }
4331
- writeAdsJson({ ok: true, data });
4357
+ writeJsonEnvelope({ ok: true, data, hints: accountHints(data) });
4332
4358
  } catch (err) {
4333
4359
  handleAccountsError(err);
4334
4360
  }
@@ -4491,6 +4517,16 @@ var GOOGLE_ADS_LIMITS = {
4491
4517
  descriptionTextMax: 90,
4492
4518
  businessNameMax: 25
4493
4519
  },
4520
+ appAd: {
4521
+ headlinesMin: 1,
4522
+ headlinesMax: 5,
4523
+ headlineTextMax: 30,
4524
+ descriptionsMin: 1,
4525
+ descriptionsMax: 5,
4526
+ descriptionTextMax: 90,
4527
+ imagesMax: 20,
4528
+ youtubeVideosMax: 20
4529
+ },
4494
4530
  sharedSet: {
4495
4531
  nameMax: 255
4496
4532
  },
@@ -4843,15 +4879,15 @@ var callAdSchema = z13.strictObject({
4843
4879
  });
4844
4880
  var appAdSchema = z13.strictObject({
4845
4881
  format: z13.literal("app"),
4846
- headlines: z13.array(z13.object({ text: z13.string().min(1).max(30) })).min(1),
4847
- descriptions: z13.array(z13.object({ text: z13.string().min(1).max(90) })).min(1),
4882
+ headlines: z13.array(z13.object({ text: z13.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.headlineTextMax) })).min(GOOGLE_ADS_LIMITS.appAd.headlinesMin).max(GOOGLE_ADS_LIMITS.appAd.headlinesMax),
4883
+ descriptions: z13.array(z13.object({ text: z13.string().min(1).max(GOOGLE_ADS_LIMITS.appAd.descriptionTextMax) })).min(GOOGLE_ADS_LIMITS.appAd.descriptionsMin).max(GOOGLE_ADS_LIMITS.appAd.descriptionsMax),
4848
4884
  // An App campaign ad carries its images on its own content (`AppAdInfo.images`), not as
4849
4885
  // campaign-level asset links — same shape as a responsive display ad's marketing images.
4850
- images: z13.array(refSchema).optional(),
4886
+ images: z13.array(refSchema).max(GOOGLE_ADS_LIMITS.appAd.imagesMax).optional(),
4851
4887
  // `AppAdInfo.youtube_videos` — an App ad's videos live on its content too. Without this field
4852
4888
  // there is no way to express "keep these videos on the ad", so a content update that only
4853
4889
  // restated headlines silently left the ad's videos to whatever the mask happened to omit.
4854
- youtubeVideos: z13.array(refSchema).optional()
4890
+ youtubeVideos: z13.array(refSchema).max(GOOGLE_ADS_LIMITS.appAd.youtubeVideosMax).optional()
4855
4891
  });
4856
4892
  var videoAdSchema = z13.strictObject({
4857
4893
  format: z13.literal("video"),
@@ -10106,6 +10142,17 @@ Examples:
10106
10142
  // src/commands/ads/linkedin/accounts.ts
10107
10143
  import { defineCommand as defineCommand33 } from "citty";
10108
10144
  var ACCOUNTS_TTL_MS = 60 * 60 * 1e3;
10145
+ function accountHints2(accounts, includeAll) {
10146
+ if (includeAll) {
10147
+ return [];
10148
+ }
10149
+ return connectedResourceHints({
10150
+ plural: "LinkedIn ad accounts",
10151
+ singular: "LinkedIn ad account",
10152
+ flag: "--account-id",
10153
+ resources: accounts.map((account) => ({ id: account.externalId, label: account.name }))
10154
+ });
10155
+ }
10109
10156
  var accountsCommand2 = defineCommand33({
10110
10157
  meta: {
10111
10158
  name: "accounts",
@@ -10129,7 +10176,12 @@ Examples:
10129
10176
  if (useCache) {
10130
10177
  const cached = cacheGet("linkedin-accounts", cacheKey);
10131
10178
  if (cached) {
10132
- writeAdsJson({ ok: true, data: cached.data, cached: true });
10179
+ writeJsonEnvelope({
10180
+ ok: true,
10181
+ data: cached.data,
10182
+ cached: true,
10183
+ hints: accountHints2(cached.data, includeAll)
10184
+ });
10133
10185
  return;
10134
10186
  }
10135
10187
  }
@@ -10146,7 +10198,7 @@ Examples:
10146
10198
  writeAdsOutput(data, fmt);
10147
10199
  return;
10148
10200
  }
10149
- writeAdsJson({ ok: true, data });
10201
+ writeJsonEnvelope({ ok: true, data, hints: accountHints2(data, includeAll) });
10150
10202
  } catch (err) {
10151
10203
  handleLinkedinError(err);
10152
10204
  }
@@ -13118,6 +13170,20 @@ Examples:
13118
13170
 
13119
13171
  // src/commands/ads/meta/accounts.ts
13120
13172
  import { defineCommand as defineCommand53 } from "citty";
13173
+ function accountHints3(accounts, includeAll) {
13174
+ if (includeAll) {
13175
+ return [];
13176
+ }
13177
+ return connectedResourceHints({
13178
+ plural: "Meta ad accounts",
13179
+ singular: "Meta ad account",
13180
+ flag: "--account-id",
13181
+ resources: accounts.flatMap((account) => {
13182
+ const id = account.externalId ?? account.id;
13183
+ return id ? [{ id, ...account.name ? { label: account.name } : {} }] : [];
13184
+ })
13185
+ });
13186
+ }
13121
13187
  var accountsCommand3 = defineCommand53({
13122
13188
  meta: {
13123
13189
  name: "accounts",
@@ -13141,7 +13207,12 @@ Examples:
13141
13207
  if (useCache) {
13142
13208
  const cached = cacheGet("meta-accounts", cacheKey);
13143
13209
  if (cached) {
13144
- writeAdsJson({ ok: true, data: cached.data, cached: true });
13210
+ writeJsonEnvelope({
13211
+ ok: true,
13212
+ data: cached.data,
13213
+ cached: true,
13214
+ hints: accountHints3(cached.data, includeAll)
13215
+ });
13145
13216
  return;
13146
13217
  }
13147
13218
  }
@@ -13158,7 +13229,7 @@ Examples:
13158
13229
  writeAdsOutput(data, fmt);
13159
13230
  return;
13160
13231
  }
13161
- writeAdsJson({ ok: true, data });
13232
+ writeJsonEnvelope({ ok: true, data, hints: accountHints3(data, includeAll) });
13162
13233
  } catch (err) {
13163
13234
  handleMetaError(err);
13164
13235
  }
@@ -15620,12 +15691,20 @@ import { defineCommand as defineCommand85 } from "citty";
15620
15691
  import { defineCommand as defineCommand69 } from "citty";
15621
15692
  registerSchema({
15622
15693
  command: "ads.x.accounts",
15623
- description: "List all accessible X Ads accounts. Returns accounts with id (base36), name, approval_status, timezone, currency. Run this first to find account IDs for other commands.",
15694
+ 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.",
15624
15695
  args: {
15625
15696
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false },
15626
15697
  output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" }
15627
15698
  }
15628
15699
  });
15700
+ function accountHints4(accounts) {
15701
+ return connectedResourceHints({
15702
+ plural: "X Ads accounts",
15703
+ singular: "X Ads account",
15704
+ flag: "--account-id",
15705
+ resources: accounts.map((account) => ({ id: account.id, label: account.name }))
15706
+ });
15707
+ }
15629
15708
  function handleAccountsError2(err) {
15630
15709
  if (err instanceof ApiError) {
15631
15710
  if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
@@ -15663,7 +15742,7 @@ Examples:
15663
15742
  if (useCache) {
15664
15743
  const cached = cacheGet("x-accounts", "list");
15665
15744
  if (cached) {
15666
- writeAdsJson({ ok: true, data: cached.data, cached: true });
15745
+ writeJsonEnvelope({ ok: true, data: cached.data, cached: true, hints: accountHints4(cached.data) });
15667
15746
  return;
15668
15747
  }
15669
15748
  }
@@ -15678,7 +15757,7 @@ Examples:
15678
15757
  writeAdsOutput(data, format);
15679
15758
  return;
15680
15759
  }
15681
- writeAdsJson({ ok: true, data });
15760
+ writeJsonEnvelope({ ok: true, data, hints: accountHints4(data) });
15682
15761
  } catch (err) {
15683
15762
  handleAccountsError2(err);
15684
15763
  }
@@ -24961,11 +25040,19 @@ Examples:
24961
25040
  import { defineCommand as defineCommand105 } from "citty";
24962
25041
  registerSchema({
24963
25042
  command: "ga4.properties",
24964
- description: "List all accessible GA4 properties. Returns property IDs needed for query and audit commands. Run this first to find property IDs.",
25043
+ 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.",
24965
25044
  args: {
24966
25045
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
24967
25046
  }
24968
25047
  });
25048
+ function propertyHints(properties) {
25049
+ return connectedResourceHints({
25050
+ plural: "GA4 properties",
25051
+ singular: "GA4 property",
25052
+ flag: "--property-id",
25053
+ resources: properties.map((property) => ({ id: property.externalId, label: property.name }))
25054
+ });
25055
+ }
24969
25056
  var propertiesCommand = defineCommand105({
24970
25057
  meta: {
24971
25058
  name: "properties",
@@ -24983,7 +25070,7 @@ Examples:
24983
25070
  if (useCache) {
24984
25071
  const cached = cacheGet("ga4-properties", "list");
24985
25072
  if (cached) {
24986
- writeJsonEnvelope({ ok: true, data: cached.data, cached: true });
25073
+ writeJsonEnvelope({ ok: true, data: cached.data, cached: true, hints: propertyHints(cached.data) });
24987
25074
  return;
24988
25075
  }
24989
25076
  }
@@ -24998,7 +25085,7 @@ Examples:
24998
25085
  writeAdsOutput(data, format);
24999
25086
  return;
25000
25087
  }
25001
- writeJsonEnvelope({ ok: true, data });
25088
+ writeJsonEnvelope({ ok: true, data, hints: propertyHints(data) });
25002
25089
  } catch (err) {
25003
25090
  if (err instanceof ApiError) {
25004
25091
  if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
@@ -25588,11 +25675,19 @@ Examples:
25588
25675
  import { defineCommand as defineCommand110 } from "citty";
25589
25676
  registerSchema({
25590
25677
  command: "gsc.sites",
25591
- description: "List all verified Google Search Console sites. Returns site URLs needed for query and sitemaps commands.",
25678
+ 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.",
25592
25679
  args: {
25593
25680
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false }
25594
25681
  }
25595
25682
  });
25683
+ function siteHints(sites) {
25684
+ return connectedResourceHints({
25685
+ plural: "Search Console sites",
25686
+ singular: "Search Console site",
25687
+ flag: "--site-url",
25688
+ resources: sites.map((site) => ({ id: site.siteUrl, label: site.permissionLevel }))
25689
+ });
25690
+ }
25596
25691
  var sitesCommand = defineCommand110({
25597
25692
  meta: {
25598
25693
  name: "sites",
@@ -25610,7 +25705,7 @@ Examples:
25610
25705
  if (useCache) {
25611
25706
  const cached = cacheGet("gsc-sites", "list");
25612
25707
  if (cached) {
25613
- writeJsonEnvelope({ ok: true, data: cached.data, cached: true });
25708
+ writeJsonEnvelope({ ok: true, data: cached.data, cached: true, hints: siteHints(cached.data) });
25614
25709
  return;
25615
25710
  }
25616
25711
  }
@@ -25625,7 +25720,7 @@ Examples:
25625
25720
  writeAdsOutput(data, format);
25626
25721
  return;
25627
25722
  }
25628
- writeJsonEnvelope({ ok: true, data });
25723
+ writeJsonEnvelope({ ok: true, data, hints: siteHints(data) });
25629
25724
  } catch (err) {
25630
25725
  if (err instanceof ApiError) {
25631
25726
  if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
@@ -31803,7 +31898,7 @@ function handleError3(err) {
31803
31898
  ...err.code === "UNAUTHORIZED" ? {
31804
31899
  fix: {
31805
31900
  action: "request_connection",
31806
- explanation: 'Tag Manager is not connected for this company yet, or no container has been picked. Do NOT send the user to Settings \u2014 call the `request_connection` tool with { platform: "google-tag-manager", reason } and they connect and pick the container from inside the chat. `request_tag_input` is NOT the route: that form manages the container snippet on the site, not what runs inside the container, and it cannot pick a container. If `request_connection` is not available to you, say so plainly and point them at dashboard \u2192 Brain \u2192 Integrations \u2192 Tools \u2192 Google Tag Manager, where they also pick the container. Carry on with the rest of the task meanwhile.'
31901
+ explanation: 'Tag Manager is not connected for this company yet, or no container has been picked. Do NOT send the user to Settings \u2014 call the `request_connection` tool with { platform: "google-tag-manager", reason } and they connect and pick their containers (they can pick more than one) from inside the chat. `request_tag_input` is NOT the route: that form manages the container snippet on the site, not what runs inside the container, and it cannot pick a container. If `request_connection` is not available to you, say so plainly and point them at dashboard \u2192 Brain \u2192 Integrations \u2192 Tools \u2192 Google Tag Manager, where they also pick the container. Carry on with the rest of the task meanwhile.'
31807
31902
  }
31808
31903
  } : {},
31809
31904
  retryable: RETRYABLE_CODES.has(err.code)
@@ -31948,14 +32043,18 @@ var draftCommand3 = defineCommand160({
31948
32043
  import { defineCommand as defineCommand161 } from "citty";
31949
32044
  registerSchema({
31950
32045
  command: "tagManager.containers",
31951
- description: "List the Google Tag Manager containers this company's connection can reach. The connected container is flagged. Start here to confirm which container you are managing.",
32046
+ 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.",
31952
32047
  args: {}
31953
32048
  });
31954
32049
  registerSchema({
31955
32050
  command: "tagManager.read",
31956
- description: "Read what is currently inside a Tag Manager container: tags, triggers, variables, folders and enabled built-in variables. Start here before proposing any change, so you edit what exists instead of duplicating it. Compact by default; pass --full for raw Tag Manager objects.",
32051
+ description: "Read what is currently inside a Tag Manager container: tags, triggers, variables, folders and enabled built-in variables. Start here before proposing any change, so you edit what exists instead of duplicating it. Pass --container when the company connected more than one. Compact by default; pass --full for raw Tag Manager objects.",
31957
32052
  args: {
31958
- container: { type: "string", description: "Numeric container id (defaults to the connected one)", required: false },
32053
+ container: {
32054
+ type: "string",
32055
+ description: "Numeric container id (optional only when one container is connected)",
32056
+ required: false
32057
+ },
31959
32058
  workspace: { type: "string", description: "Workspace id (defaults to the default workspace)", required: false },
31960
32059
  entities: {
31961
32060
  type: "string",
@@ -31965,6 +32064,23 @@ registerSchema({
31965
32064
  full: { type: "boolean", description: "Include the raw Tag Manager object for each entity", required: false }
31966
32065
  }
31967
32066
  });
32067
+ function containersHints(containers) {
32068
+ const connected = containers.filter((container) => container.connected);
32069
+ if (connected.length === 0) {
32070
+ return [
32071
+ "None of the containers this company connected came back from Tag Manager. The connected Google account may have lost access to them \u2014 ask the user to reconnect or pick a container again."
32072
+ ];
32073
+ }
32074
+ return connectedResourceHints({
32075
+ plural: "Tag Manager containers",
32076
+ singular: "Tag Manager container",
32077
+ flag: "--container",
32078
+ resources: connected.map((container) => ({
32079
+ id: container.containerId,
32080
+ label: `${container.publicId} \xB7 ${container.name}`
32081
+ }))
32082
+ });
32083
+ }
31968
32084
  var containersCommand = defineCommand161({
31969
32085
  meta: {
31970
32086
  name: "containers",
@@ -31976,7 +32092,7 @@ Start here:
31976
32092
  run: async () => {
31977
32093
  try {
31978
32094
  const data = await apiGet("/api/tag-manager/containers");
31979
- writeJsonEnvelope({ ok: true, data });
32095
+ writeJsonEnvelope({ ok: true, data, hints: containersHints(data.containers) });
31980
32096
  } catch (err) {
31981
32097
  handleError3(err);
31982
32098
  }
@@ -32007,7 +32123,9 @@ Examples:
32007
32123
  entities,
32008
32124
  full: args.full === true
32009
32125
  });
32010
- const hints = [];
32126
+ const hints = [
32127
+ `This is container ${data.container.containerId} ${data.container.publicId} (${data.container.name}). Stage changes for it with --container ${data.container.containerId}.`
32128
+ ];
32011
32129
  if (data.installedContainerMismatch) {
32012
32130
  hints.push(data.installedContainerMismatch);
32013
32131
  }
@@ -32023,6 +32141,7 @@ Examples:
32023
32141
 
32024
32142
  // src/commands/tag-manager/write-commands.ts
32025
32143
  import { defineCommand as defineCommand162 } from "citty";
32144
+ var CONTAINER_ARG_DESCRIPTION = "Numeric container id (optional only when one container is connected \u2014 run `baker tag-manager containers`)";
32026
32145
  var ENTITIES = [
32027
32146
  {
32028
32147
  entity: "tag",
@@ -32056,7 +32175,7 @@ for (const { entity, noun, createHint } of ENTITIES) {
32056
32175
  args: {
32057
32176
  json: { type: "string", description: `Inline JSON ${noun} definition`, required: false },
32058
32177
  file: { type: "string", description: `Path to a JSON file with the ${noun} definition`, required: false },
32059
- container: { type: "string", description: "Numeric container id", required: false }
32178
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32060
32179
  }
32061
32180
  });
32062
32181
  registerSchema({
@@ -32064,13 +32183,16 @@ for (const { entity, noun, createHint } of ENTITIES) {
32064
32183
  description: `Stage an update to an existing Tag Manager ${noun}. Pass the ${noun} id or path as the positional argument and the changed fields as JSON. Read the container first so you send the fields you mean to change.`,
32065
32184
  args: {
32066
32185
  json: { type: "string", description: "Inline JSON with the changed fields", required: false },
32067
- file: { type: "string", description: "Path to a JSON file with the changed fields", required: false }
32186
+ file: { type: "string", description: "Path to a JSON file with the changed fields", required: false },
32187
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32068
32188
  }
32069
32189
  });
32070
32190
  registerSchema({
32071
32191
  command: `tagManager.${entity}.delete`,
32072
32192
  description: `Stage the deletion of a Tag Manager ${noun}. Pass its id or path as the positional argument. Deleting is irreversible once the resulting version is published \u2014 confirm with the user first.`,
32073
- args: {}
32193
+ args: {
32194
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32195
+ }
32074
32196
  });
32075
32197
  }
32076
32198
  function entityCommand(entity, noun, example) {
@@ -32089,7 +32211,7 @@ Examples:
32089
32211
  args: {
32090
32212
  json: { type: "string", description: "Inline JSON definition", required: false },
32091
32213
  file: { type: "string", description: "Path to a JSON file", required: false },
32092
- container: { type: "string", description: "Numeric container id", required: false }
32214
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32093
32215
  },
32094
32216
  run: async ({ args }) => {
32095
32217
  await stageOp3({
@@ -32108,7 +32230,7 @@ Examples:
32108
32230
  id: { type: "positional", description: `${noun} id or path`, required: false },
32109
32231
  json: { type: "string", description: "Inline JSON with changed fields", required: false },
32110
32232
  file: { type: "string", description: "Path to a JSON file", required: false },
32111
- container: { type: "string", description: "Numeric container id", required: false }
32233
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32112
32234
  },
32113
32235
  run: async ({ args }) => {
32114
32236
  await stageOp3({
@@ -32123,7 +32245,7 @@ Examples:
32123
32245
  meta: { name: "delete", description: `Stage the deletion of a ${noun} (pass its id or path)` },
32124
32246
  args: {
32125
32247
  id: { type: "positional", description: `${noun} id or path`, required: false },
32126
- container: { type: "string", description: "Numeric container id", required: false }
32248
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32127
32249
  },
32128
32250
  run: async ({ args }) => {
32129
32251
  await stageOp3({
@@ -32145,7 +32267,8 @@ registerSchema({
32145
32267
  command: "tagManager.builtin",
32146
32268
  description: "Enable or disable Tag Manager built-in variables by type (e.g. clickUrl, pageUrl, formId). Built-in variables must be enabled before a trigger or tag can reference them as {{Click URL}}.",
32147
32269
  args: {
32148
- types: { type: "string", description: "Comma-separated built-in variable types", required: true }
32270
+ types: { type: "string", description: "Comma-separated built-in variable types", required: true },
32271
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32149
32272
  }
32150
32273
  });
32151
32274
  function builtinTypes(args) {
@@ -32173,7 +32296,7 @@ Examples:
32173
32296
  meta: { name: "enable", description: "Stage enabling built-in variables" },
32174
32297
  args: {
32175
32298
  types: { type: "string", description: "Comma-separated types", required: false },
32176
- container: { type: "string", description: "Numeric container id", required: false }
32299
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32177
32300
  },
32178
32301
  run: async ({ args }) => {
32179
32302
  await stageOp3({
@@ -32187,7 +32310,7 @@ Examples:
32187
32310
  meta: { name: "disable", description: "Stage disabling built-in variables" },
32188
32311
  args: {
32189
32312
  types: { type: "string", description: "Comma-separated types", required: false },
32190
- container: { type: "string", description: "Numeric container id", required: false }
32313
+ container: { type: "string", description: CONTAINER_ARG_DESCRIPTION, required: false }
32191
32314
  },
32192
32315
  run: async ({ args }) => {
32193
32316
  await stageOp3({