@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.
- package/README.md +96 -0
- package/dist/cli.js +1 -1
- package/dist/commands/ads/index.d.ts.map +1 -1
- package/dist/commands/ads/index.js +8 -2
- package/dist/commands/ads/index.js.map +1 -1
- package/dist/commands/ads/meta/account.d.ts +11 -0
- package/dist/commands/ads/meta/account.d.ts.map +1 -0
- package/dist/commands/ads/meta/account.js +32 -0
- package/dist/commands/ads/meta/account.js.map +1 -0
- package/dist/commands/ads/meta/accounts.d.ts +20 -0
- package/dist/commands/ads/meta/accounts.d.ts.map +1 -0
- package/dist/commands/ads/meta/accounts.js +55 -0
- package/dist/commands/ads/meta/accounts.js.map +1 -0
- package/dist/commands/ads/meta/activities.d.ts +24 -0
- package/dist/commands/ads/meta/activities.d.ts.map +1 -0
- package/dist/commands/ads/meta/activities.js +44 -0
- package/dist/commands/ads/meta/activities.js.map +1 -0
- package/dist/commands/ads/meta/ads.d.ts +36 -0
- package/dist/commands/ads/meta/ads.d.ts.map +1 -0
- package/dist/commands/ads/meta/ads.js +57 -0
- package/dist/commands/ads/meta/ads.js.map +1 -0
- package/dist/commands/ads/meta/adsets.d.ts +32 -0
- package/dist/commands/ads/meta/adsets.d.ts.map +1 -0
- package/dist/commands/ads/meta/adsets.js +50 -0
- package/dist/commands/ads/meta/adsets.js.map +1 -0
- package/dist/commands/ads/meta/audiences.d.ts +20 -0
- package/dist/commands/ads/meta/audiences.d.ts.map +1 -0
- package/dist/commands/ads/meta/audiences.js +41 -0
- package/dist/commands/ads/meta/audiences.js.map +1 -0
- package/dist/commands/ads/meta/businesses.d.ts +12 -0
- package/dist/commands/ads/meta/businesses.d.ts.map +1 -0
- package/dist/commands/ads/meta/businesses.js +35 -0
- package/dist/commands/ads/meta/businesses.js.map +1 -0
- package/dist/commands/ads/meta/campaigns.d.ts +28 -0
- package/dist/commands/ads/meta/campaigns.d.ts.map +1 -0
- package/dist/commands/ads/meta/campaigns.js +51 -0
- package/dist/commands/ads/meta/campaigns.js.map +1 -0
- package/dist/commands/ads/meta/catalogs.d.ts +17 -0
- package/dist/commands/ads/meta/catalogs.d.ts.map +1 -0
- package/dist/commands/ads/meta/catalogs.js +37 -0
- package/dist/commands/ads/meta/catalogs.js.map +1 -0
- package/dist/commands/ads/meta/creatives.d.ts +24 -0
- package/dist/commands/ads/meta/creatives.d.ts.map +1 -0
- package/dist/commands/ads/meta/creatives.js +51 -0
- package/dist/commands/ads/meta/creatives.js.map +1 -0
- package/dist/commands/ads/meta/currency.d.ts +11 -0
- package/dist/commands/ads/meta/currency.d.ts.map +1 -0
- package/dist/commands/ads/meta/currency.js +31 -0
- package/dist/commands/ads/meta/currency.js.map +1 -0
- package/dist/commands/ads/meta/high-demand-periods.d.ts +17 -0
- package/dist/commands/ads/meta/high-demand-periods.d.ts.map +1 -0
- package/dist/commands/ads/meta/high-demand-periods.js +33 -0
- package/dist/commands/ads/meta/high-demand-periods.js.map +1 -0
- package/dist/commands/ads/meta/images.d.ts +24 -0
- package/dist/commands/ads/meta/images.d.ts.map +1 -0
- package/dist/commands/ads/meta/images.js +45 -0
- package/dist/commands/ads/meta/images.js.map +1 -0
- package/dist/commands/ads/meta/index.d.ts +17 -0
- package/dist/commands/ads/meta/index.d.ts.map +1 -0
- package/dist/commands/ads/meta/index.js +79 -0
- package/dist/commands/ads/meta/index.js.map +1 -0
- package/dist/commands/ads/meta/insights.d.ts +93 -0
- package/dist/commands/ads/meta/insights.d.ts.map +1 -0
- package/dist/commands/ads/meta/insights.js +254 -0
- package/dist/commands/ads/meta/insights.js.map +1 -0
- package/dist/commands/ads/meta/labels.d.ts +16 -0
- package/dist/commands/ads/meta/labels.d.ts.map +1 -0
- package/dist/commands/ads/meta/labels.js +34 -0
- package/dist/commands/ads/meta/labels.js.map +1 -0
- package/dist/commands/ads/meta/pixels.d.ts +33 -0
- package/dist/commands/ads/meta/pixels.d.ts.map +1 -0
- package/dist/commands/ads/meta/pixels.js +69 -0
- package/dist/commands/ads/meta/pixels.js.map +1 -0
- package/dist/commands/ads/meta/presets.d.ts +30 -0
- package/dist/commands/ads/meta/presets.d.ts.map +1 -0
- package/dist/commands/ads/meta/presets.js +86 -0
- package/dist/commands/ads/meta/presets.js.map +1 -0
- package/dist/commands/ads/meta/preview.d.ts +32 -0
- package/dist/commands/ads/meta/preview.d.ts.map +1 -0
- package/dist/commands/ads/meta/preview.js +90 -0
- package/dist/commands/ads/meta/preview.js.map +1 -0
- package/dist/commands/ads/meta/shared.d.ts +18 -0
- package/dist/commands/ads/meta/shared.d.ts.map +1 -0
- package/dist/commands/ads/meta/shared.js +74 -0
- package/dist/commands/ads/meta/shared.js.map +1 -0
- package/dist/commands/ads/meta/studies.d.ts +24 -0
- package/dist/commands/ads/meta/studies.d.ts.map +1 -0
- package/dist/commands/ads/meta/studies.js +56 -0
- package/dist/commands/ads/meta/studies.js.map +1 -0
- package/dist/env.d.ts +1 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -0
- package/dist/env.js.map +1 -1
- package/dist/error-handler.d.ts +1 -1
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +3 -0
- package/dist/error-handler.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -688,6 +688,102 @@ All errors include a `fix` object with `action`, `correctedCommand` (when applic
|
|
|
688
688
|
|
|
689
689
|
---
|
|
690
690
|
|
|
691
|
+
### Meta Ads (`baker ads meta`)
|
|
692
|
+
|
|
693
|
+
Meta Marketing API (Facebook + Instagram). Connect via OAuth in the dashboard, pick which ad accounts to scope to, then call from the CLI. Account ID via `--account-id act_123` or `BAKER_META_AD_ACCOUNT_ID` env var.
|
|
694
|
+
|
|
695
|
+
The command surface is **curated for AI agents**, not 1:1 with the Marketing API. Smart defaults so an agent doesn't need to remember every flag.
|
|
696
|
+
|
|
697
|
+
#### Common AI questions, mapped to commands
|
|
698
|
+
|
|
699
|
+
```bash
|
|
700
|
+
# "How is account X doing this week?"
|
|
701
|
+
baker ads meta insights --object act_123
|
|
702
|
+
|
|
703
|
+
# "Which campaigns are profitable?"
|
|
704
|
+
baker ads meta insights --object act_123 --level campaign --intent revenue --date-preset last_28d
|
|
705
|
+
|
|
706
|
+
# "Which creatives need a refresh?"
|
|
707
|
+
baker ads meta insights --object act_123 --level ad --intent ranking --date-preset last_14d
|
|
708
|
+
|
|
709
|
+
# "Where do users drop off the funnel?"
|
|
710
|
+
baker ads meta insights --object act_123 --intent funnel
|
|
711
|
+
|
|
712
|
+
# "Should we shift budget to Instagram?"
|
|
713
|
+
baker ads meta insights --object act_123 --level adset \
|
|
714
|
+
--breakdowns publisher_platform,platform_position
|
|
715
|
+
|
|
716
|
+
# "Why did spend drop yesterday?"
|
|
717
|
+
baker ads meta activities --account-id act_123 --days 7
|
|
718
|
+
|
|
719
|
+
# "What are we running right now?"
|
|
720
|
+
baker ads meta campaigns --account-id act_123 # ACTIVE only by default
|
|
721
|
+
baker ads meta ads --account-id act_123 --all-statuses # widen to everything
|
|
722
|
+
|
|
723
|
+
# "Tell me about ad 9988"
|
|
724
|
+
baker ads meta creatives --creative-id 9988
|
|
725
|
+
baker ads meta preview --creative-id 9988 --ad-format MOBILE_FEED_STANDARD --out-file /tmp/p.html
|
|
726
|
+
|
|
727
|
+
# "What audience is this targeting?"
|
|
728
|
+
baker ads meta audiences --account-id act_123
|
|
729
|
+
|
|
730
|
+
# "Is the pixel firing?"
|
|
731
|
+
baker ads meta pixels --account-id act_123
|
|
732
|
+
baker ads meta pixels --pixel-id 9988 --stats --days 7
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
#### Smart defaults (so agents don't enumerate the API)
|
|
736
|
+
|
|
737
|
+
**`insights`** — the workhorse:
|
|
738
|
+
- `--level account` (override: `campaign|adset|ad`)
|
|
739
|
+
- `--intent baseline` field bundle. Intents available: `baseline`, `revenue`, `funnel`, `ranking`, `video`, `identity`. List with `--list-intents`.
|
|
740
|
+
- `--date-preset last_7d` unless you pass `--since`/`--until`.
|
|
741
|
+
- Filter: `impressions > 0` so undelivered rows don't pollute results. Pass `--include-undelivered` to keep them.
|
|
742
|
+
- Sort: `spend` descending — highest-impact rows first. `--no-sort` to disable.
|
|
743
|
+
- Attribution windows: `7d_click, 1d_view` (only `1d_view, 1d_click, 7d_click, 28d_click` work post Jan 2026).
|
|
744
|
+
- Identity columns (`campaign_name`, `ad_name`, etc.) appended automatically per `--level` so rows are self-describing.
|
|
745
|
+
- Auto-async when the query is heavy (level=ad with breakdowns over an account, >2 breakdowns, >90-day range). Pass `--async` to force it or `--no-async` to refuse fallback.
|
|
746
|
+
|
|
747
|
+
**Listings (`campaigns`/`adsets`/`ads`)** default to `effective_status=ACTIVE` — pass `--all-statuses` to widen, or `--effective-status ACTIVE,PAUSED` for a custom set.
|
|
748
|
+
|
|
749
|
+
**Pagination** is auto-drained (no manual cursor handling).
|
|
750
|
+
|
|
751
|
+
#### Full command surface
|
|
752
|
+
|
|
753
|
+
```
|
|
754
|
+
accounts # ad accounts in the connected scope
|
|
755
|
+
accounts --include-all # every account the token can see (admin/debug)
|
|
756
|
+
account # single-account detail (currency, balance, business, status)
|
|
757
|
+
businesses # /me/businesses
|
|
758
|
+
campaigns # ACTIVE-only by default
|
|
759
|
+
adsets # filter by --campaign-id
|
|
760
|
+
ads # filter by --adset-id or --campaign-id
|
|
761
|
+
creatives # list per account, or fetch single via --creative-id
|
|
762
|
+
audiences # custom audiences (incl. lookalikes)
|
|
763
|
+
pixels # list, or --stats for one --pixel-id
|
|
764
|
+
activities # account audit log, ~90d retention
|
|
765
|
+
insights # see "Smart defaults" above
|
|
766
|
+
preview # iframe HTML for a creative or ad in a given ad_format
|
|
767
|
+
```
|
|
768
|
+
|
|
769
|
+
The HTTP backend exposes more endpoints (catalogs, ad-studies, ad-images, labels, high-demand-periods, raw currency lookup). They're intentionally not surfaced as CLI commands because AI agents rarely need them. Hit them via curl against `/api/ads/meta/*` if needed.
|
|
770
|
+
|
|
771
|
+
#### Auth + caching
|
|
772
|
+
|
|
773
|
+
- Tokens auto-refresh server-side (60-day rolling long-lived user tokens). On `code 190` reconnect Meta from the dashboard.
|
|
774
|
+
- Account scoping: backend rejects any call against an account not in the picker selection — pick accounts via Settings → Connections → Meta Ads first.
|
|
775
|
+
- All cached actions are keyed per company; two companies that connect to the same Meta account never share cache entries.
|
|
776
|
+
- `--skip-cache` on any command forces a re-fetch.
|
|
777
|
+
|
|
778
|
+
#### Notes / gotchas
|
|
779
|
+
|
|
780
|
+
- `spend` is a decimal string in account currency, not an integer.
|
|
781
|
+
- `effective_status` ≠ `status`. The dashboard shows effective_status (e.g. `WITH_ISSUES`, `PENDING_REVIEW`, `DISAPPROVED`, `ADSET_PAUSED`).
|
|
782
|
+
- Meta creatives are effectively immutable once attached. Editing copy/image/CTA = create a new creative + reattach (writes are out of scope for now).
|
|
783
|
+
- Currency offsets are non-uniform (JPY/KRW = 1, KWD/BHD = 1000, most = 100). Read `account.currency` before doing budget math.
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
691
787
|
### Google Analytics 4 (`baker ga4`)
|
|
692
788
|
|
|
693
789
|
GA4 commands for multi-channel audits. Playbook-aligned presets, property health audits, and free-form Data API queries.
|
package/dist/cli.js
CHANGED
|
@@ -12,7 +12,7 @@ import { videosCommand } from "./commands/videos/index.js";
|
|
|
12
12
|
const main = defineCommand({
|
|
13
13
|
meta: {
|
|
14
14
|
name: "baker",
|
|
15
|
-
version: "0.
|
|
15
|
+
version: "0.25.0",
|
|
16
16
|
description: `AI-agent CLI for finding and managing images, videos, testimonials, action items, and ad platform data in Baker.
|
|
17
17
|
|
|
18
18
|
Auth: Set BAKER_API_KEY (starts with bk_) and BAKER_API_URL environment variables.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ads/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ads/index.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,qDAoBrB,CAAC"}
|
|
@@ -1,19 +1,25 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { googleCommand } from "./google/index.js";
|
|
3
|
+
import { metaCommand } from "./meta/index.js";
|
|
3
4
|
export const adsCommand = defineCommand({
|
|
4
5
|
meta: {
|
|
5
6
|
name: "ads",
|
|
6
|
-
description: `Ad platform commands.
|
|
7
|
+
description: `Ad platform commands. Each platform exposes its own native command surface — no forced parity.
|
|
7
8
|
|
|
8
9
|
Platforms:
|
|
9
10
|
google — Google Ads (GAQL queries, keywords, accounts)
|
|
11
|
+
meta — Meta Ads (campaigns, adsets, ads, insights, previews)
|
|
10
12
|
|
|
11
13
|
Examples:
|
|
12
14
|
baker ads google accounts
|
|
13
|
-
baker ads google query --preset campaign-performance --customer-id 1234567890
|
|
15
|
+
baker ads google query --preset campaign-performance --customer-id 1234567890
|
|
16
|
+
baker ads meta accounts
|
|
17
|
+
baker ads meta campaigns --account-id act_123 --effective-status ACTIVE
|
|
18
|
+
baker ads meta insights --object act_123 --level ad --date-preset last_7d --fields impressions,spend,ctr`,
|
|
14
19
|
},
|
|
15
20
|
subCommands: {
|
|
16
21
|
google: googleCommand,
|
|
22
|
+
meta: metaCommand,
|
|
17
23
|
},
|
|
18
24
|
});
|
|
19
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;IACtC,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE;;;;;;;;;;;2GAW0F;KACxG;IACD,WAAW,EAAE;QACX,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,WAAW;KAClB;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const accountCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "account-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Meta ad account ID (act_...)";
|
|
5
|
+
};
|
|
6
|
+
readonly "skip-cache": {
|
|
7
|
+
readonly type: "boolean";
|
|
8
|
+
readonly description: "Bypass server-side cache";
|
|
9
|
+
};
|
|
10
|
+
}>;
|
|
11
|
+
//# sourceMappingURL=account.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/account.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc;;;;;;;;;EAwBzB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson } from "../output.js";
|
|
4
|
+
import { handleMetaError, resolveAccountIdArg } from "./shared.js";
|
|
5
|
+
export const accountCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "account",
|
|
8
|
+
description: `Show single Meta ad account detail (currency, timezone, balance, business).
|
|
9
|
+
|
|
10
|
+
Examples:
|
|
11
|
+
baker ads meta account --account-id act_123
|
|
12
|
+
BAKER_META_AD_ACCOUNT_ID=act_123 baker ads meta account`,
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
"account-id": { type: "string", description: "Meta ad account ID (act_...)" },
|
|
16
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
17
|
+
},
|
|
18
|
+
run: async ({ args }) => {
|
|
19
|
+
const accountId = resolveAccountIdArg(args);
|
|
20
|
+
try {
|
|
21
|
+
const params = { "account-id": accountId };
|
|
22
|
+
if (args["skip-cache"])
|
|
23
|
+
params["skip-cache"] = "true";
|
|
24
|
+
const data = await apiGet("/api/ads/meta/account", params);
|
|
25
|
+
writeAdsJson({ ok: true, data });
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
handleMetaError(err);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEnE,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;;;;0DAIyC;KACvD;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;QAC7E,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0BAA0B,EAAE;KAC3E;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAA0B,uBAAuB,EAAE,MAAM,CAAC,CAAC;YACpF,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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const accountsCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "include-all": {
|
|
3
|
+
readonly type: "boolean";
|
|
4
|
+
readonly description: "List all accessible accounts, ignoring picker scope";
|
|
5
|
+
};
|
|
6
|
+
readonly "no-cache": {
|
|
7
|
+
readonly type: "boolean";
|
|
8
|
+
readonly description: "Skip CLI-side cache";
|
|
9
|
+
};
|
|
10
|
+
readonly "skip-cache": {
|
|
11
|
+
readonly type: "boolean";
|
|
12
|
+
readonly description: "Bypass server-side cache (force re-fetch)";
|
|
13
|
+
};
|
|
14
|
+
readonly output: {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly description: "Output format: json|csv|jsonl|md";
|
|
17
|
+
readonly default: "json";
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=accounts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/accounts.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;EA6C1B,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { cacheGet, cacheSet } from "../cache.js";
|
|
4
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
5
|
+
import { csvOrJson, handleMetaError } from "./shared.js";
|
|
6
|
+
export const accountsCommand = defineCommand({
|
|
7
|
+
meta: {
|
|
8
|
+
name: "accounts",
|
|
9
|
+
description: `List Meta ad accounts in this company's connected scope.
|
|
10
|
+
|
|
11
|
+
Examples:
|
|
12
|
+
baker ads meta accounts
|
|
13
|
+
baker ads meta accounts --include-all # ignore picker scope and list every account the token can see
|
|
14
|
+
baker ads meta accounts --output csv`,
|
|
15
|
+
},
|
|
16
|
+
args: {
|
|
17
|
+
"include-all": { type: "boolean", description: "List all accessible accounts, ignoring picker scope" },
|
|
18
|
+
"no-cache": { type: "boolean", description: "Skip CLI-side cache" },
|
|
19
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache (force re-fetch)" },
|
|
20
|
+
output: { type: "string", description: "Output format: json|csv|jsonl|md", default: "json" },
|
|
21
|
+
},
|
|
22
|
+
run: async ({ args }) => {
|
|
23
|
+
const includeAll = args["include-all"] === true;
|
|
24
|
+
const useCache = !args["no-cache"];
|
|
25
|
+
const cacheKey = `accounts:${includeAll ? "all" : "scoped"}`;
|
|
26
|
+
if (useCache) {
|
|
27
|
+
const cached = cacheGet("meta-accounts", cacheKey);
|
|
28
|
+
if (cached) {
|
|
29
|
+
writeAdsJson({ ok: true, data: cached.data, cached: true });
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const params = {};
|
|
35
|
+
if (includeAll)
|
|
36
|
+
params["include-all"] = "true";
|
|
37
|
+
if (args["skip-cache"])
|
|
38
|
+
params["skip-cache"] = "true";
|
|
39
|
+
const data = await apiGet("/api/ads/meta/accounts", params);
|
|
40
|
+
if (useCache) {
|
|
41
|
+
cacheSet("meta-accounts", cacheKey, data, 60 * 60 * 1000);
|
|
42
|
+
}
|
|
43
|
+
const fmt = csvOrJson(args);
|
|
44
|
+
if (fmt !== "json") {
|
|
45
|
+
writeAdsOutput(data, fmt);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
writeAdsJson({ ok: true, data });
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
handleMetaError(err);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=accounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAczD,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE;;;;;uCAKsB;KACpC;IACD,IAAI,EAAE;QACJ,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,qDAAqD,EAAE;QACtG,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,qBAAqB,EAAE;QACnE,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,2CAA2C,EAAE;QAC3F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE,OAAO,EAAE,MAAM,EAAE;KAC7F;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;QAChD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,YAAY,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC7D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,QAAQ,CAAgB,eAAe,EAAE,QAAQ,CAAC,CAAC;YAClE,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,UAAU;gBAAE,MAAM,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;YAC/C,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAgB,wBAAwB,EAAE,MAAM,CAAC,CAAC;YAC3E,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YAC5D,CAAC;YACD,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,cAAc,CAAC,IAAiD,EAAE,GAAG,CAAC,CAAC;gBACvE,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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare const activitiesCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "account-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Meta ad account ID";
|
|
5
|
+
};
|
|
6
|
+
readonly days: {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "Lookback days (default 7)";
|
|
9
|
+
};
|
|
10
|
+
readonly limit: {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly description: "Max rows";
|
|
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=activities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activities.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/activities.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;EAkC5B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
+
import { csvOrJson, handleMetaError, resolveAccountIdArg } from "./shared.js";
|
|
5
|
+
export const activitiesCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "activities",
|
|
8
|
+
description: `Audit log of recent ad-account changes (created, paused, edited). Default lookback 7 days,
|
|
9
|
+
~90 day retention server-side.
|
|
10
|
+
|
|
11
|
+
Examples:
|
|
12
|
+
baker ads meta activities --account-id act_123 --days 14`,
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
"account-id": { type: "string", description: "Meta ad account ID" },
|
|
16
|
+
days: { type: "string", description: "Lookback days (default 7)" },
|
|
17
|
+
limit: { type: "string", description: "Max rows" },
|
|
18
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
19
|
+
output: { type: "string", description: "Output format", default: "json" },
|
|
20
|
+
},
|
|
21
|
+
run: async ({ args }) => {
|
|
22
|
+
const accountId = resolveAccountIdArg(args);
|
|
23
|
+
try {
|
|
24
|
+
const params = { "account-id": accountId };
|
|
25
|
+
if (args.days)
|
|
26
|
+
params.days = args.days;
|
|
27
|
+
if (args.limit)
|
|
28
|
+
params.limit = args.limit;
|
|
29
|
+
if (args["skip-cache"])
|
|
30
|
+
params["skip-cache"] = "true";
|
|
31
|
+
const data = await apiGet("/api/ads/meta/activities", params);
|
|
32
|
+
const fmt = csvOrJson(args);
|
|
33
|
+
if (fmt !== "json") {
|
|
34
|
+
writeAdsOutput(data, fmt);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
writeAdsJson({ ok: true, data });
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
handleMetaError(err);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=activities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activities.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/activities.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,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;IAC7C,IAAI,EAAE;QACJ,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE;;;;2DAI0C;KACxD;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACnE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE;QAClE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE;QAClD,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,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAc,CAAC;YACjD,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;YACpD,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,0BAA0B,EAAE,MAAM,CAAC,CAAC;YAC9F,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const adsListCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "account-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Meta ad account ID";
|
|
5
|
+
};
|
|
6
|
+
readonly "adset-id": {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "Filter to one adset";
|
|
9
|
+
};
|
|
10
|
+
readonly "campaign-id": {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly description: "Filter to one campaign";
|
|
13
|
+
};
|
|
14
|
+
readonly "effective-status": {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly description: "Comma-separated effective_status filter (overrides default)";
|
|
17
|
+
};
|
|
18
|
+
readonly "all-statuses": {
|
|
19
|
+
readonly type: "boolean";
|
|
20
|
+
readonly description: "Drop the default ACTIVE filter";
|
|
21
|
+
};
|
|
22
|
+
readonly limit: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly description: "Max rows (default 1000)";
|
|
25
|
+
};
|
|
26
|
+
readonly "skip-cache": {
|
|
27
|
+
readonly type: "boolean";
|
|
28
|
+
readonly description: "Bypass server-side cache";
|
|
29
|
+
};
|
|
30
|
+
readonly output: {
|
|
31
|
+
readonly type: "string";
|
|
32
|
+
readonly description: "Output format";
|
|
33
|
+
readonly default: "json";
|
|
34
|
+
};
|
|
35
|
+
}>;
|
|
36
|
+
//# sourceMappingURL=ads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ads.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/ads.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CzB,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
+
import { csvOrJson, handleMetaError, resolveAccountIdArg, resolveEffectiveStatus } from "./shared.js";
|
|
5
|
+
export const adsListCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "ads",
|
|
8
|
+
description: `List ads in a Meta ad account. Defaults to ACTIVE only — pass --all-statuses to widen.
|
|
9
|
+
|
|
10
|
+
The dashboard shows effective_status (e.g. WITH_ISSUES, PENDING_REVIEW, DISAPPROVED, ADSET_PAUSED), not status.
|
|
11
|
+
preview_shareable_link returns a Meta-hosted URL useful for design review without calling generatepreviews.
|
|
12
|
+
|
|
13
|
+
Examples:
|
|
14
|
+
baker ads meta ads --account-id act_123
|
|
15
|
+
baker ads meta ads --adset-id 6123
|
|
16
|
+
baker ads meta ads --campaign-id 6123 --all-statuses
|
|
17
|
+
baker ads meta ads --account-id act_123 --output csv`,
|
|
18
|
+
},
|
|
19
|
+
args: {
|
|
20
|
+
"account-id": { type: "string", description: "Meta ad account ID" },
|
|
21
|
+
"adset-id": { type: "string", description: "Filter to one adset" },
|
|
22
|
+
"campaign-id": { type: "string", description: "Filter to one campaign" },
|
|
23
|
+
"effective-status": { type: "string", description: "Comma-separated effective_status filter (overrides default)" },
|
|
24
|
+
"all-statuses": { type: "boolean", description: "Drop the default ACTIVE filter" },
|
|
25
|
+
limit: { type: "string", description: "Max rows (default 1000)" },
|
|
26
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
27
|
+
output: { type: "string", description: "Output format", default: "json" },
|
|
28
|
+
},
|
|
29
|
+
run: async ({ args }) => {
|
|
30
|
+
const accountId = resolveAccountIdArg(args);
|
|
31
|
+
const effectiveStatus = resolveEffectiveStatus(args);
|
|
32
|
+
try {
|
|
33
|
+
const params = { "account-id": accountId };
|
|
34
|
+
if (args["adset-id"])
|
|
35
|
+
params["adset-id"] = args["adset-id"];
|
|
36
|
+
if (args["campaign-id"])
|
|
37
|
+
params["campaign-id"] = args["campaign-id"];
|
|
38
|
+
if (effectiveStatus)
|
|
39
|
+
params["effective-status"] = effectiveStatus;
|
|
40
|
+
if (args.limit)
|
|
41
|
+
params.limit = args.limit;
|
|
42
|
+
if (args["skip-cache"])
|
|
43
|
+
params["skip-cache"] = "true";
|
|
44
|
+
const data = await apiGet("/api/ads/meta/ads", params);
|
|
45
|
+
const fmt = csvOrJson(args);
|
|
46
|
+
if (fmt !== "json") {
|
|
47
|
+
writeAdsOutput(data, fmt);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
writeAdsJson({ ok: true, data });
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
handleMetaError(err);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=ads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ads.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/ads.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,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEtG,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE;;;;;;;;;uDASsC;KACpD;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACnE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;QAClE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACxE,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;QAClH,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gCAAgC,EAAE;QAClF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;QACjE,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,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,UAAU,CAAC;gBAAE,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,CAAW,CAAC;YACtE,IAAI,IAAI,CAAC,aAAa,CAAC;gBAAE,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,CAAW,CAAC;YAC/E,IAAI,eAAe;gBAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,eAAe,CAAC;YAClE,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;YACpD,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,mBAAmB,EAAE,MAAM,CAAC,CAAC;YACvF,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const adsetsCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "account-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Meta ad account ID";
|
|
5
|
+
};
|
|
6
|
+
readonly "campaign-id": {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "Filter to one campaign";
|
|
9
|
+
};
|
|
10
|
+
readonly "effective-status": {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly description: "Comma-separated effective_status filter (overrides default)";
|
|
13
|
+
};
|
|
14
|
+
readonly "all-statuses": {
|
|
15
|
+
readonly type: "boolean";
|
|
16
|
+
readonly description: "Drop the default ACTIVE filter";
|
|
17
|
+
};
|
|
18
|
+
readonly limit: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly description: "Max rows (default 1000)";
|
|
21
|
+
};
|
|
22
|
+
readonly "skip-cache": {
|
|
23
|
+
readonly type: "boolean";
|
|
24
|
+
readonly description: "Bypass server-side cache";
|
|
25
|
+
};
|
|
26
|
+
readonly output: {
|
|
27
|
+
readonly type: "string";
|
|
28
|
+
readonly description: "Output format";
|
|
29
|
+
readonly default: "json";
|
|
30
|
+
};
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=adsets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adsets.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/adsets.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCxB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
+
import { csvOrJson, handleMetaError, resolveAccountIdArg, resolveEffectiveStatus } from "./shared.js";
|
|
5
|
+
export const adsetsCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "adsets",
|
|
8
|
+
description: `List ad sets in a Meta ad account, optionally scoped to one campaign. Defaults to ACTIVE only.
|
|
9
|
+
|
|
10
|
+
Examples:
|
|
11
|
+
baker ads meta adsets --account-id act_123
|
|
12
|
+
baker ads meta adsets --campaign-id 6123456789
|
|
13
|
+
baker ads meta adsets --campaign-id 6123 --all-statuses`,
|
|
14
|
+
},
|
|
15
|
+
args: {
|
|
16
|
+
"account-id": { type: "string", description: "Meta ad account ID" },
|
|
17
|
+
"campaign-id": { type: "string", description: "Filter to one campaign" },
|
|
18
|
+
"effective-status": { type: "string", description: "Comma-separated effective_status filter (overrides default)" },
|
|
19
|
+
"all-statuses": { type: "boolean", description: "Drop the default ACTIVE filter" },
|
|
20
|
+
limit: { type: "string", description: "Max rows (default 1000)" },
|
|
21
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
22
|
+
output: { type: "string", description: "Output format", default: "json" },
|
|
23
|
+
},
|
|
24
|
+
run: async ({ args }) => {
|
|
25
|
+
const accountId = resolveAccountIdArg(args);
|
|
26
|
+
const effectiveStatus = resolveEffectiveStatus(args);
|
|
27
|
+
try {
|
|
28
|
+
const params = { "account-id": accountId };
|
|
29
|
+
if (args["campaign-id"])
|
|
30
|
+
params["campaign-id"] = args["campaign-id"];
|
|
31
|
+
if (effectiveStatus)
|
|
32
|
+
params["effective-status"] = effectiveStatus;
|
|
33
|
+
if (args.limit)
|
|
34
|
+
params.limit = args.limit;
|
|
35
|
+
if (args["skip-cache"])
|
|
36
|
+
params["skip-cache"] = "true";
|
|
37
|
+
const data = await apiGet("/api/ads/meta/adsets", params);
|
|
38
|
+
const fmt = csvOrJson(args);
|
|
39
|
+
if (fmt !== "json") {
|
|
40
|
+
writeAdsOutput(data, fmt);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
writeAdsJson({ ok: true, data });
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
handleMetaError(err);
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
//# sourceMappingURL=adsets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adsets.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/adsets.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,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEtG,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE;;;;;0DAKyC;KACvD;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACnE,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wBAAwB,EAAE;QACxE,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6DAA6D,EAAE;QAClH,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gCAAgC,EAAE;QAClF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;QACjE,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,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,aAAa,CAAC;gBAAE,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,aAAa,CAAW,CAAC;YAC/E,IAAI,eAAe;gBAAE,MAAM,CAAC,kBAAkB,CAAC,GAAG,eAAe,CAAC;YAClE,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAe,CAAC;YACpD,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAC1F,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare const audiencesCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "account-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Meta ad account ID";
|
|
5
|
+
};
|
|
6
|
+
readonly limit: {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "Max rows";
|
|
9
|
+
};
|
|
10
|
+
readonly "skip-cache": {
|
|
11
|
+
readonly type: "boolean";
|
|
12
|
+
readonly description: "Bypass server-side cache";
|
|
13
|
+
};
|
|
14
|
+
readonly output: {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly description: "Output format";
|
|
17
|
+
readonly default: "json";
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=audiences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audiences.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/audiences.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;EAgC3B,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
+
import { csvOrJson, handleMetaError, resolveAccountIdArg } from "./shared.js";
|
|
5
|
+
export const audiencesCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "audiences",
|
|
8
|
+
description: `List custom audiences for a Meta ad account. Includes lookalikes, website-pixel audiences,
|
|
9
|
+
customer-file audiences, etc. Note: Meta hides exact size when count < 1000 (privacy).
|
|
10
|
+
|
|
11
|
+
Examples:
|
|
12
|
+
baker ads meta audiences --account-id act_123`,
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
"account-id": { type: "string", description: "Meta ad account ID" },
|
|
16
|
+
limit: { type: "string", description: "Max rows" },
|
|
17
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
18
|
+
output: { type: "string", description: "Output format", default: "json" },
|
|
19
|
+
},
|
|
20
|
+
run: async ({ args }) => {
|
|
21
|
+
const accountId = resolveAccountIdArg(args);
|
|
22
|
+
try {
|
|
23
|
+
const params = { "account-id": accountId };
|
|
24
|
+
if (args.limit)
|
|
25
|
+
params.limit = args.limit;
|
|
26
|
+
if (args["skip-cache"])
|
|
27
|
+
params["skip-cache"] = "true";
|
|
28
|
+
const data = await apiGet("/api/ads/meta/audiences", params);
|
|
29
|
+
const fmt = csvOrJson(args);
|
|
30
|
+
if (fmt !== "json") {
|
|
31
|
+
writeAdsOutput(data, fmt);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
writeAdsJson({ ok: true, data });
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
handleMetaError(err);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=audiences.js.map
|