@koda-sl/baker-cli 0.23.0 → 0.25.0-dev.55a07065

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.
Files changed (98) hide show
  1. package/README.md +96 -0
  2. package/dist/cli.js +1 -1
  3. package/dist/commands/ads/index.d.ts.map +1 -1
  4. package/dist/commands/ads/index.js +8 -2
  5. package/dist/commands/ads/index.js.map +1 -1
  6. package/dist/commands/ads/meta/account.d.ts +11 -0
  7. package/dist/commands/ads/meta/account.d.ts.map +1 -0
  8. package/dist/commands/ads/meta/account.js +32 -0
  9. package/dist/commands/ads/meta/account.js.map +1 -0
  10. package/dist/commands/ads/meta/accounts.d.ts +20 -0
  11. package/dist/commands/ads/meta/accounts.d.ts.map +1 -0
  12. package/dist/commands/ads/meta/accounts.js +55 -0
  13. package/dist/commands/ads/meta/accounts.js.map +1 -0
  14. package/dist/commands/ads/meta/activities.d.ts +24 -0
  15. package/dist/commands/ads/meta/activities.d.ts.map +1 -0
  16. package/dist/commands/ads/meta/activities.js +44 -0
  17. package/dist/commands/ads/meta/activities.js.map +1 -0
  18. package/dist/commands/ads/meta/ads.d.ts +36 -0
  19. package/dist/commands/ads/meta/ads.d.ts.map +1 -0
  20. package/dist/commands/ads/meta/ads.js +57 -0
  21. package/dist/commands/ads/meta/ads.js.map +1 -0
  22. package/dist/commands/ads/meta/adsets.d.ts +32 -0
  23. package/dist/commands/ads/meta/adsets.d.ts.map +1 -0
  24. package/dist/commands/ads/meta/adsets.js +50 -0
  25. package/dist/commands/ads/meta/adsets.js.map +1 -0
  26. package/dist/commands/ads/meta/audiences.d.ts +20 -0
  27. package/dist/commands/ads/meta/audiences.d.ts.map +1 -0
  28. package/dist/commands/ads/meta/audiences.js +41 -0
  29. package/dist/commands/ads/meta/audiences.js.map +1 -0
  30. package/dist/commands/ads/meta/businesses.d.ts +12 -0
  31. package/dist/commands/ads/meta/businesses.d.ts.map +1 -0
  32. package/dist/commands/ads/meta/businesses.js +35 -0
  33. package/dist/commands/ads/meta/businesses.js.map +1 -0
  34. package/dist/commands/ads/meta/campaigns.d.ts +28 -0
  35. package/dist/commands/ads/meta/campaigns.d.ts.map +1 -0
  36. package/dist/commands/ads/meta/campaigns.js +51 -0
  37. package/dist/commands/ads/meta/campaigns.js.map +1 -0
  38. package/dist/commands/ads/meta/catalogs.d.ts +17 -0
  39. package/dist/commands/ads/meta/catalogs.d.ts.map +1 -0
  40. package/dist/commands/ads/meta/catalogs.js +37 -0
  41. package/dist/commands/ads/meta/catalogs.js.map +1 -0
  42. package/dist/commands/ads/meta/creatives.d.ts +24 -0
  43. package/dist/commands/ads/meta/creatives.d.ts.map +1 -0
  44. package/dist/commands/ads/meta/creatives.js +51 -0
  45. package/dist/commands/ads/meta/creatives.js.map +1 -0
  46. package/dist/commands/ads/meta/currency.d.ts +11 -0
  47. package/dist/commands/ads/meta/currency.d.ts.map +1 -0
  48. package/dist/commands/ads/meta/currency.js +31 -0
  49. package/dist/commands/ads/meta/currency.js.map +1 -0
  50. package/dist/commands/ads/meta/high-demand-periods.d.ts +17 -0
  51. package/dist/commands/ads/meta/high-demand-periods.d.ts.map +1 -0
  52. package/dist/commands/ads/meta/high-demand-periods.js +33 -0
  53. package/dist/commands/ads/meta/high-demand-periods.js.map +1 -0
  54. package/dist/commands/ads/meta/images.d.ts +24 -0
  55. package/dist/commands/ads/meta/images.d.ts.map +1 -0
  56. package/dist/commands/ads/meta/images.js +45 -0
  57. package/dist/commands/ads/meta/images.js.map +1 -0
  58. package/dist/commands/ads/meta/index.d.ts +17 -0
  59. package/dist/commands/ads/meta/index.d.ts.map +1 -0
  60. package/dist/commands/ads/meta/index.js +79 -0
  61. package/dist/commands/ads/meta/index.js.map +1 -0
  62. package/dist/commands/ads/meta/insights.d.ts +93 -0
  63. package/dist/commands/ads/meta/insights.d.ts.map +1 -0
  64. package/dist/commands/ads/meta/insights.js +254 -0
  65. package/dist/commands/ads/meta/insights.js.map +1 -0
  66. package/dist/commands/ads/meta/labels.d.ts +16 -0
  67. package/dist/commands/ads/meta/labels.d.ts.map +1 -0
  68. package/dist/commands/ads/meta/labels.js +34 -0
  69. package/dist/commands/ads/meta/labels.js.map +1 -0
  70. package/dist/commands/ads/meta/pixels.d.ts +33 -0
  71. package/dist/commands/ads/meta/pixels.d.ts.map +1 -0
  72. package/dist/commands/ads/meta/pixels.js +69 -0
  73. package/dist/commands/ads/meta/pixels.js.map +1 -0
  74. package/dist/commands/ads/meta/presets.d.ts +30 -0
  75. package/dist/commands/ads/meta/presets.d.ts.map +1 -0
  76. package/dist/commands/ads/meta/presets.js +86 -0
  77. package/dist/commands/ads/meta/presets.js.map +1 -0
  78. package/dist/commands/ads/meta/preview.d.ts +32 -0
  79. package/dist/commands/ads/meta/preview.d.ts.map +1 -0
  80. package/dist/commands/ads/meta/preview.js +90 -0
  81. package/dist/commands/ads/meta/preview.js.map +1 -0
  82. package/dist/commands/ads/meta/shared.d.ts +18 -0
  83. package/dist/commands/ads/meta/shared.d.ts.map +1 -0
  84. package/dist/commands/ads/meta/shared.js +74 -0
  85. package/dist/commands/ads/meta/shared.js.map +1 -0
  86. package/dist/commands/ads/meta/studies.d.ts +24 -0
  87. package/dist/commands/ads/meta/studies.d.ts.map +1 -0
  88. package/dist/commands/ads/meta/studies.js +56 -0
  89. package/dist/commands/ads/meta/studies.js.map +1 -0
  90. package/dist/env.d.ts +1 -0
  91. package/dist/env.d.ts.map +1 -1
  92. package/dist/env.js +1 -0
  93. package/dist/env.js.map +1 -1
  94. package/dist/error-handler.d.ts +1 -1
  95. package/dist/error-handler.d.ts.map +1 -1
  96. package/dist/error-handler.js +3 -0
  97. package/dist/error-handler.js.map +1 -1
  98. package/package.json +1 -1
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Insights field bundles. Picked for AI agent ergonomics: small, focused field
3
+ * lists that answer one specific question without forcing the AI to enumerate
4
+ * Meta's 500+ insights fields.
5
+ *
6
+ * Two-axis design:
7
+ * --intent (field bundle, default: baseline) — what data to ask for
8
+ * --level (object granularity, default: account) — at what granularity
9
+ *
10
+ * Intents are independent of level — pass `--intent ranking --level ad` to flag
11
+ * creatives, or `--intent revenue --level campaign` for ROAS by campaign.
12
+ *
13
+ * Identity fields (campaign_name etc.) are appended automatically based on
14
+ * level so the AI can read rows without joining.
15
+ */
16
+ const INSIGHTS_INTENTS = {
17
+ baseline: {
18
+ name: "baseline",
19
+ description: "Spend, impressions, clicks, CTR, CPC, CPM. The default question: 'how is delivery?'",
20
+ fields: ["impressions", "reach", "frequency", "spend", "clicks", "ctr", "cpc", "cpm"],
21
+ },
22
+ revenue: {
23
+ name: "revenue",
24
+ description: "Spend, conversions, action_values, purchase_roas. 'How much money are we making?'",
25
+ fields: ["spend", "actions", "action_values", "conversions", "conversion_values", "purchase_roas"],
26
+ actionBreakdowns: ["action_type"],
27
+ },
28
+ funnel: {
29
+ name: "funnel",
30
+ description: "Impression → click → landing page → action. 'Where do users drop off?'",
31
+ fields: ["impressions", "clicks", "inline_link_clicks", "outbound_clicks", "actions", "spend"],
32
+ actionBreakdowns: ["action_type"],
33
+ },
34
+ ranking: {
35
+ name: "ranking",
36
+ description: "Quality, engagement, conversion-rate rankings. 'Which creatives need a refresh?'",
37
+ fields: ["impressions", "spend", "ctr", "quality_ranking", "engagement_rate_ranking", "conversion_rate_ranking"],
38
+ },
39
+ video: {
40
+ name: "video",
41
+ description: "Watch funnel, thruplay cost. 'How are video creatives holding attention?'",
42
+ fields: [
43
+ "impressions",
44
+ "spend",
45
+ "video_play_actions",
46
+ "video_p25_watched_actions",
47
+ "video_p50_watched_actions",
48
+ "video_p75_watched_actions",
49
+ "video_p100_watched_actions",
50
+ "video_thruplay_watched_actions",
51
+ "cost_per_thruplay",
52
+ ],
53
+ },
54
+ identity: {
55
+ name: "identity",
56
+ description: "Just the names + spend — for cheap roll-up summaries.",
57
+ fields: ["spend", "impressions"],
58
+ },
59
+ };
60
+ const IDENTITY_FIELDS_BY_LEVEL = {
61
+ account: ["account_id", "account_name", "account_currency"],
62
+ campaign: ["campaign_id", "campaign_name", "objective"],
63
+ adset: ["adset_id", "adset_name", "campaign_id", "campaign_name"],
64
+ ad: ["ad_id", "ad_name", "adset_id", "adset_name", "campaign_id", "campaign_name"],
65
+ };
66
+ /** Compose final field list: intent metrics + level-specific identity fields, deduplicated. */
67
+ export function composeFields(intent, level) {
68
+ const intentFields = INSIGHTS_INTENTS[intent].fields;
69
+ const identity = IDENTITY_FIELDS_BY_LEVEL[level];
70
+ const seen = new Set();
71
+ const out = [];
72
+ for (const f of [...identity, ...intentFields]) {
73
+ if (!seen.has(f)) {
74
+ seen.add(f);
75
+ out.push(f);
76
+ }
77
+ }
78
+ return out;
79
+ }
80
+ export function getIntent(name) {
81
+ return INSIGHTS_INTENTS[name];
82
+ }
83
+ export function listIntents() {
84
+ return Object.values(INSIGHTS_INTENTS);
85
+ }
86
+ //# sourceMappingURL=presets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,MAAM,gBAAgB,GAA6C;IACjE,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,qFAAqF;QAClG,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;KACtF;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,mFAAmF;QAChG,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,CAAC;QAClG,gBAAgB,EAAE,CAAC,aAAa,CAAC;KAClC;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,wEAAwE;QACrF,MAAM,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,SAAS,EAAE,OAAO,CAAC;QAC9F,gBAAgB,EAAE,CAAC,aAAa,CAAC;KAClC;IACD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,kFAAkF;QAC/F,MAAM,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,yBAAyB,CAAC;KACjH;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,2EAA2E;QACxF,MAAM,EAAE;YACN,aAAa;YACb,OAAO;YACP,oBAAoB;YACpB,2BAA2B;YAC3B,2BAA2B;YAC3B,2BAA2B;YAC3B,4BAA4B;YAC5B,gCAAgC;YAChC,mBAAmB;SACpB;KACF;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,uDAAuD;QACpE,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;KACjC;CACF,CAAC;AAEF,MAAM,wBAAwB,GAAoC;IAChE,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,kBAAkB,CAAC;IAC3D,QAAQ,EAAE,CAAC,aAAa,EAAE,eAAe,EAAE,WAAW,CAAC;IACvD,KAAK,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC;IACjE,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC;CACnF,CAAC;AAEF,+FAA+F;AAC/F,MAAM,UAAU,aAAa,CAAC,MAAsB,EAAE,KAAoB;IACxE,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACZ,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,gBAAgB,CAAC,IAAsB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,32 @@
1
+ export declare const previewCommand: import("citty").CommandDef<{
2
+ readonly "creative-id": {
3
+ readonly type: "string";
4
+ readonly description: "Existing creative ID";
5
+ };
6
+ readonly "ad-id": {
7
+ readonly type: "string";
8
+ readonly description: "Existing ad ID";
9
+ };
10
+ readonly "account-id": {
11
+ readonly type: "string";
12
+ readonly description: "Required when previewing an unpublished --creative spec";
13
+ };
14
+ readonly creative: {
15
+ readonly type: "string";
16
+ readonly description: "JSON spec of an unpublished creative (e.g. object_story_spec)";
17
+ };
18
+ readonly "ad-format": {
19
+ readonly type: "string";
20
+ readonly description: "Meta ad_format enum value";
21
+ readonly required: true;
22
+ };
23
+ readonly "out-file": {
24
+ readonly type: "string";
25
+ readonly description: "Save iframe HTML to this path";
26
+ };
27
+ readonly "skip-cache": {
28
+ readonly type: "boolean";
29
+ readonly description: "Bypass server-side cache";
30
+ };
31
+ }>;
32
+ //# sourceMappingURL=preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/preview.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CzB,CAAC"}
@@ -0,0 +1,90 @@
1
+ import { writeFileSync } from "node:fs";
2
+ import { defineCommand } from "citty";
3
+ import { apiPost } from "../../../client.js";
4
+ import { writeAdsJson } from "../output.js";
5
+ import { handleMetaError } from "./shared.js";
6
+ const VALID_AD_FORMATS = [
7
+ "DESKTOP_FEED_STANDARD",
8
+ "MOBILE_FEED_STANDARD",
9
+ "MOBILE_FEED_BASIC",
10
+ "RIGHT_COLUMN_STANDARD",
11
+ "MOBILE_FULLWIDTH",
12
+ "MOBILE_INTERSTITIAL",
13
+ "MOBILE_BANNER",
14
+ "MOBILE_MEDIUM_RECTANGLE",
15
+ "MOBILE_NATIVE",
16
+ "FACEBOOK_STORY_MOBILE",
17
+ "FACEBOOK_REELS_MOBILE",
18
+ "INSTAGRAM_STORY",
19
+ "INSTAGRAM_REELS",
20
+ "INSTAGRAM_REELS_OVERLAY",
21
+ "INSTAGRAM_STANDARD",
22
+ "INSTAGRAM_EXPLORE_CONTEXTUAL",
23
+ "INSTAGRAM_EXPLORE_GRID_HOME",
24
+ "INSTAGRAM_SHOP",
25
+ "INSTAGRAM_PROFILE_FEED",
26
+ "INSTREAM_VIDEO_DESKTOP",
27
+ "INSTREAM_VIDEO_MOBILE",
28
+ "FACEBOOK_REELS_BANNER",
29
+ "FACEBOOK_REELS_STICKER",
30
+ "MESSENGER_MOBILE_INBOX_MEDIA",
31
+ "MESSENGER_MOBILE_STORY_MEDIA",
32
+ "AUDIENCE_NETWORK_OUTSTREAM_VIDEO",
33
+ "AUDIENCE_NETWORK_INSTREAM_VIDEO_MOBILE",
34
+ "AUDIENCE_NETWORK_REWARDED_VIDEO",
35
+ "INSTANT_ARTICLE_STANDARD",
36
+ "MARKETPLACE_MOBILE",
37
+ "BIZ_DISCO_FEED_MOBILE",
38
+ ];
39
+ export const previewCommand = defineCommand({
40
+ meta: {
41
+ name: "preview",
42
+ description: `Generate a Meta-hosted preview iframe for a creative or ad. Returns iframe HTML which you
43
+ can embed or save to a file. The iframe URL contains a short-lived access token — treat as secret.
44
+
45
+ Examples:
46
+ baker ads meta preview --creative-id 6123 --ad-format MOBILE_FEED_STANDARD
47
+ baker ads meta preview --ad-id 9988 --ad-format INSTAGRAM_REELS --out-file /tmp/preview.html
48
+ baker ads meta preview --account-id act_123 --creative '{"object_story_spec":{...}}' --ad-format MOBILE_FEED_STANDARD`,
49
+ },
50
+ args: {
51
+ "creative-id": { type: "string", description: "Existing creative ID" },
52
+ "ad-id": { type: "string", description: "Existing ad ID" },
53
+ "account-id": { type: "string", description: "Required when previewing an unpublished --creative spec" },
54
+ creative: { type: "string", description: "JSON spec of an unpublished creative (e.g. object_story_spec)" },
55
+ "ad-format": { type: "string", description: "Meta ad_format enum value", required: true },
56
+ "out-file": { type: "string", description: "Save iframe HTML to this path" },
57
+ "skip-cache": { type: "boolean", description: "Bypass server-side cache" },
58
+ },
59
+ run: async ({ args }) => {
60
+ const adFormat = args["ad-format"];
61
+ if (!VALID_AD_FORMATS.includes(adFormat)) {
62
+ process.stderr.write(`Warning: ad-format "${adFormat}" not in known list — Meta may reject it\n`);
63
+ }
64
+ const body = { adFormat };
65
+ if (args["creative-id"])
66
+ body.creativeId = args["creative-id"];
67
+ if (args["ad-id"])
68
+ body.adId = args["ad-id"];
69
+ if (args["account-id"])
70
+ body.accountId = args["account-id"];
71
+ if (args.creative)
72
+ body.creative = args.creative;
73
+ if (args["skip-cache"])
74
+ body.skipCache = true;
75
+ try {
76
+ const data = await apiPost("/api/ads/meta/preview", body);
77
+ const html = data.map((d) => d.body).join("\n");
78
+ if (args["out-file"]) {
79
+ writeFileSync(args["out-file"], html, "utf-8");
80
+ writeAdsJson({ ok: true, data: { file: args["out-file"], rows: data.length } });
81
+ return;
82
+ }
83
+ writeAdsJson({ ok: true, data });
84
+ }
85
+ catch (err) {
86
+ handleMetaError(err);
87
+ }
88
+ },
89
+ });
90
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare function handleMetaError(err: unknown): never;
2
+ /** Pull the default Meta ad account ID from `--account-id` arg or `BAKER_META_AD_ACCOUNT_ID` env. */
3
+ export declare function resolveAccountIdArg(args: Record<string, unknown>): string;
4
+ export declare function getDateRange(args: Record<string, unknown>): {
5
+ datePreset?: string;
6
+ since?: string;
7
+ until?: string;
8
+ };
9
+ export declare function todayIso(): string;
10
+ export declare function daysAgoIso(days: number): string;
11
+ export declare function csvOrJson(args: Record<string, unknown>): string;
12
+ /**
13
+ * Default to ACTIVE-only on listings — that's almost always what an AI agent or
14
+ * a human glance wants. Pass `--effective-status ACTIVE,PAUSED` to override, or
15
+ * `--all-statuses` to drop the filter entirely.
16
+ */
17
+ export declare function resolveEffectiveStatus(args: Record<string, unknown>): string | undefined;
18
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/shared.ts"],"names":[],"mappings":"AAQA,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK,CAmBnD;AAED,qGAAqG;AACrG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAczE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAMnH;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAE/D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CASxF"}
@@ -0,0 +1,74 @@
1
+ import { ApiError } from "../../../client.js";
2
+ import { getEnv } from "../../../env.js";
3
+ import { handleConnectionError } from "../../../error-handler.js";
4
+ import { writeAdsJson } from "../output.js";
5
+ const DAY_MS = 86_400_000;
6
+ export function handleMetaError(err) {
7
+ if (err instanceof ApiError) {
8
+ if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
9
+ handleConnectionError("meta_ads", err.message);
10
+ }
11
+ const envelope = {
12
+ ok: false,
13
+ error: {
14
+ code: err.code,
15
+ message: err.message,
16
+ fix: { action: "reject", explanation: err.message },
17
+ retryable: err.code === "RATE_LIMITED" || err.code === "INTERNAL_ERROR",
18
+ },
19
+ };
20
+ writeAdsJson(envelope);
21
+ process.exit(1);
22
+ }
23
+ writeAdsJson({ ok: false, error: { code: "NETWORK_ERROR", message: "Unexpected error" } });
24
+ process.exit(1);
25
+ }
26
+ /** Pull the default Meta ad account ID from `--account-id` arg or `BAKER_META_AD_ACCOUNT_ID` env. */
27
+ export function resolveAccountIdArg(args) {
28
+ const fromArgs = args["account-id"];
29
+ const id = fromArgs || getEnv().BAKER_META_AD_ACCOUNT_ID;
30
+ if (!id) {
31
+ writeAdsJson({
32
+ ok: false,
33
+ error: {
34
+ code: "MISSING_ACCOUNT_ID",
35
+ message: "Pass --account-id or set BAKER_META_AD_ACCOUNT_ID. Run `baker ads meta accounts` to find IDs.",
36
+ },
37
+ });
38
+ process.exit(1);
39
+ }
40
+ return id.startsWith("act_") ? id : `act_${id}`;
41
+ }
42
+ export function getDateRange(args) {
43
+ const datePreset = args["date-preset"];
44
+ const since = args.since;
45
+ const until = args.until;
46
+ if (since && until)
47
+ return { since, until };
48
+ return { datePreset: datePreset ?? "last_7d" };
49
+ }
50
+ export function todayIso() {
51
+ return new Date().toISOString().slice(0, 10);
52
+ }
53
+ export function daysAgoIso(days) {
54
+ return new Date(Date.now() - days * DAY_MS).toISOString().slice(0, 10);
55
+ }
56
+ export function csvOrJson(args) {
57
+ return args.output ?? "json";
58
+ }
59
+ /**
60
+ * Default to ACTIVE-only on listings — that's almost always what an AI agent or
61
+ * a human glance wants. Pass `--effective-status ACTIVE,PAUSED` to override, or
62
+ * `--all-statuses` to drop the filter entirely.
63
+ */
64
+ export function resolveEffectiveStatus(args) {
65
+ if (args["all-statuses"]) {
66
+ return undefined;
67
+ }
68
+ const explicit = args["effective-status"];
69
+ if (explicit) {
70
+ return explicit;
71
+ }
72
+ return "ACTIVE";
73
+ }
74
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export declare const studiesCommand: import("citty").CommandDef<{
2
+ readonly "business-id": {
3
+ readonly type: "string";
4
+ readonly description: "Meta Business Manager ID";
5
+ };
6
+ readonly "study-id": {
7
+ readonly type: "string";
8
+ readonly description: "Single study ID";
9
+ };
10
+ readonly results: {
11
+ readonly type: "boolean";
12
+ readonly description: "Fetch objective results for --study-id";
13
+ };
14
+ readonly "skip-cache": {
15
+ readonly type: "boolean";
16
+ readonly description: "Bypass server-side cache";
17
+ };
18
+ readonly output: {
19
+ readonly type: "string";
20
+ readonly description: "Output format";
21
+ readonly default: "json";
22
+ };
23
+ }>;
24
+ //# sourceMappingURL=studies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studies.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/studies.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;EA+CzB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import { defineCommand } from "citty";
2
+ import { apiGet } from "../../../client.js";
3
+ import { writeAdsJson, writeAdsOutput } from "../output.js";
4
+ import { csvOrJson, handleMetaError } from "./shared.js";
5
+ export const studiesCommand = defineCommand({
6
+ meta: {
7
+ name: "studies",
8
+ description: `List ad studies (split tests, conversion lift, brand lift) under a Business Manager,
9
+ or fetch results for a single study.
10
+
11
+ Examples:
12
+ baker ads meta studies --business-id 1234567890
13
+ baker ads meta studies --study-id 9988 --results`,
14
+ },
15
+ args: {
16
+ "business-id": { type: "string", description: "Meta Business Manager ID" },
17
+ "study-id": { type: "string", description: "Single study ID" },
18
+ results: { type: "boolean", description: "Fetch objective results for --study-id" },
19
+ "skip-cache": { type: "boolean", description: "Bypass server-side cache" },
20
+ output: { type: "string", description: "Output format", default: "json" },
21
+ },
22
+ run: async ({ args }) => {
23
+ try {
24
+ const fmt = csvOrJson(args);
25
+ if (args["study-id"] && args.results) {
26
+ const params = { "study-id": args["study-id"] };
27
+ if (args["skip-cache"])
28
+ params["skip-cache"] = "true";
29
+ const data = await apiGet("/api/ads/meta/study-results", params);
30
+ if (fmt !== "json") {
31
+ writeAdsOutput(data, fmt);
32
+ return;
33
+ }
34
+ writeAdsJson({ ok: true, data });
35
+ return;
36
+ }
37
+ const businessId = args["business-id"];
38
+ if (!businessId) {
39
+ handleMetaError(new Error("--business-id is required (run `baker ads meta businesses` to find IDs)"));
40
+ }
41
+ const params = { "business-id": businessId };
42
+ if (args["skip-cache"])
43
+ params["skip-cache"] = "true";
44
+ const data = await apiGet("/api/ads/meta/studies", params);
45
+ if (fmt !== "json") {
46
+ writeAdsOutput(data, fmt);
47
+ return;
48
+ }
49
+ writeAdsJson({ ok: true, data });
50
+ }
51
+ catch (err) {
52
+ handleMetaError(err);
53
+ }
54
+ },
55
+ });
56
+ //# sourceMappingURL=studies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studies.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/studies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;;;;;mDAKkC;KAChD;IACD,IAAI,EAAE;QACJ,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAC1E,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;QAC9D,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wCAAwC,EAAE;QACnF,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAC1E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1E;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,MAAM,GAA2B,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,CAAW,EAAE,CAAC;gBAClF,IAAI,IAAI,CAAC,YAAY,CAAC;oBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;gBACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,6BAA6B,EAAE,MAAM,CAAC,CAAC;gBACjG,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACnB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBACD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAuB,CAAC;YAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,eAAe,CAAC,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC,CAAC;YACxG,CAAC;YACD,MAAM,MAAM,GAA2B,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;YACrE,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YAC3F,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAe,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
package/dist/env.d.ts CHANGED
@@ -5,6 +5,7 @@ type Env = {
5
5
  BAKER_GOOGLE_ADS_CUSTOMER_ID?: string;
6
6
  BAKER_GA4_PROPERTY_ID?: string;
7
7
  BAKER_GSC_SITE_URL?: string;
8
+ BAKER_META_AD_ACCOUNT_ID?: string;
8
9
  };
9
10
  export declare function getEnv(): Env;
10
11
  export declare function requireChatId(): string;
package/dist/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,KAAK,GAAG,GAAG;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF,wBAAgB,MAAM,IAAI,GAAG,CAkB5B;AAED,wBAAgB,aAAa,IAAI,MAAM,CAQtC"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,KAAK,GAAG,GAAG;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC;AAIF,wBAAgB,MAAM,IAAI,GAAG,CAmB5B;AAED,wBAAgB,aAAa,IAAI,MAAM,CAQtC"}
package/dist/env.js CHANGED
@@ -14,6 +14,7 @@ export function getEnv() {
14
14
  .optional(),
15
15
  BAKER_GA4_PROPERTY_ID: z.string().optional(),
16
16
  BAKER_GSC_SITE_URL: z.string().optional(),
17
+ BAKER_META_AD_ACCOUNT_ID: z.string().optional(),
17
18
  },
18
19
  runtimeEnv: process.env,
19
20
  });
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB,IAAI,MAAuB,CAAC;AAE5B,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,SAAS,CAAC;YACjB,MAAM,EAAE;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,+BAA+B,CAAC;gBAC5E,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,mCAAmC,CAAC;gBACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACpC,4BAA4B,EAAE,CAAC;qBAC5B,MAAM,EAAE;qBACR,KAAK,CAAC,UAAU,CAAC;qBACjB,QAAQ,EAAE;gBACb,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1C;YACD,UAAU,EAAE,OAAO,CAAC,GAAG;SACxB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,aAAa,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAYxB,IAAI,MAAuB,CAAC;AAE5B,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,SAAS,CAAC;YACjB,MAAM,EAAE;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,+BAA+B,CAAC;gBAC5E,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,mCAAmC,CAAC;gBACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACpC,4BAA4B,EAAE,CAAC;qBAC5B,MAAM,EAAE;qBACR,KAAK,CAAC,UAAU,CAAC;qBACjB,QAAQ,EAAE;gBACb,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBACzC,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAChD;YACD,UAAU,EAAE,OAAO,CAAC,GAAG;SACxB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,iHAAiH,CAClH,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,aAAa,CAAC;AAC3B,CAAC"}
@@ -1,4 +1,4 @@
1
- type ConnectionPlatform = "google_ads" | "ga4" | "gsc";
1
+ type ConnectionPlatform = "google_ads" | "ga4" | "gsc" | "meta_ads";
2
2
  /**
3
3
  * Shared error handler for "No Connection" scenarios.
4
4
  * Provides a structured error for AI agents with a suggested fix and alternative commands.
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAEA,KAAK,kBAAkB,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAkCnG"}
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAEA,KAAK,kBAAkB,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAqCnG"}
@@ -8,16 +8,19 @@ export function handleConnectionError(platform, originalMessage) {
8
8
  google_ads: "Google Ads",
9
9
  ga4: "Google Analytics 4",
10
10
  gsc: "Google Search Console",
11
+ meta_ads: "Meta Ads",
11
12
  }[platform];
12
13
  const alternative = {
13
14
  google_ads: "keywords-for-site or research advertisers",
14
15
  ga4: "lighthouse for page performance",
15
16
  gsc: "keywords-for-site or research keyword-gap",
17
+ meta_ads: "research advertisers or research keyword-ideas",
16
18
  }[platform];
17
19
  const code = {
18
20
  google_ads: "NO_GOOGLE_ADS_CONNECTION",
19
21
  ga4: "NO_GA4_CONNECTION",
20
22
  gsc: "NO_GSC_CONNECTION",
23
+ meta_ads: "NO_META_ADS_CONNECTION",
21
24
  }[platform];
22
25
  const envelope = {
23
26
  ok: false,
@@ -1 +1 @@
1
- {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA4B,EAAE,eAAwB;IAC1F,MAAM,YAAY,GAAG;QACnB,UAAU,EAAE,YAAY;QACxB,GAAG,EAAE,oBAAoB;QACzB,GAAG,EAAE,uBAAuB;KAC7B,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG;QAClB,UAAU,EAAE,2CAA2C;QACvD,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,2CAA2C;KACjD,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,0BAA0B;QACtC,GAAG,EAAE,mBAAmB;QACxB,GAAG,EAAE,mBAAmB;KACzB,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,QAAQ,GAAG;QACf,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,IAAI;YACJ,OAAO,EAAE,eAAe,IAAI,MAAM,YAAY,qCAAqC;YACnF,GAAG,EAAE;gBACH,MAAM,EAAE,cAAc;gBACtB,WAAW,EAAE,uGAAuG,YAAY,4DAA4D,YAAY,8PAA8P,WAAW,qCAAqC;aACvf;YACD,SAAS,EAAE,KAAK;SACjB;KACF,CAAC;IAEF,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA4B,EAAE,eAAwB;IAC1F,MAAM,YAAY,GAAG;QACnB,UAAU,EAAE,YAAY;QACxB,GAAG,EAAE,oBAAoB;QACzB,GAAG,EAAE,uBAAuB;QAC5B,QAAQ,EAAE,UAAU;KACrB,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG;QAClB,UAAU,EAAE,2CAA2C;QACvD,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,2CAA2C;QAChD,QAAQ,EAAE,gDAAgD;KAC3D,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,0BAA0B;QACtC,GAAG,EAAE,mBAAmB;QACxB,GAAG,EAAE,mBAAmB;QACxB,QAAQ,EAAE,wBAAwB;KACnC,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,QAAQ,GAAG;QACf,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,IAAI;YACJ,OAAO,EAAE,eAAe,IAAI,MAAM,YAAY,qCAAqC;YACnF,GAAG,EAAE;gBACH,MAAM,EAAE,cAAc;gBACtB,WAAW,EAAE,uGAAuG,YAAY,4DAA4D,YAAY,8PAA8P,WAAW,qCAAqC;aACvf;YACD,SAAS,EAAE,KAAK;SACjB;KACF,CAAC;IAEF,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-cli",
3
- "version": "0.23.0",
3
+ "version": "0.25.0-dev.55a07065",
4
4
  "description": "AI-agent-first CLI for interacting with Baker",
5
5
  "type": "module",
6
6
  "bin": {