@koda-sl/baker-cli 0.13.0 → 0.16.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.
Files changed (82) hide show
  1. package/README.md +243 -3
  2. package/dist/cli.js +5 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client.d.ts +1 -1
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +8 -0
  7. package/dist/client.js.map +1 -1
  8. package/dist/commands/ads/google/accounts.d.ts.map +1 -1
  9. package/dist/commands/ads/google/accounts.js +7 -4
  10. package/dist/commands/ads/google/accounts.js.map +1 -1
  11. package/dist/commands/ads/output.d.ts +1 -0
  12. package/dist/commands/ads/output.d.ts.map +1 -1
  13. package/dist/commands/ads/output.js +18 -15
  14. package/dist/commands/ads/output.js.map +1 -1
  15. package/dist/commands/ga4/audit.d.ts +13 -0
  16. package/dist/commands/ga4/audit.d.ts.map +1 -0
  17. package/dist/commands/ga4/audit.js +67 -0
  18. package/dist/commands/ga4/audit.js.map +1 -0
  19. package/dist/commands/ga4/index.d.ts +2 -0
  20. package/dist/commands/ga4/index.d.ts.map +1 -0
  21. package/dist/commands/ga4/index.js +26 -0
  22. package/dist/commands/ga4/index.js.map +1 -0
  23. package/dist/commands/ga4/presets.d.ts +8 -0
  24. package/dist/commands/ga4/presets.d.ts.map +1 -0
  25. package/dist/commands/ga4/presets.js +33 -0
  26. package/dist/commands/ga4/presets.js.map +1 -0
  27. package/dist/commands/ga4/properties.d.ts +14 -0
  28. package/dist/commands/ga4/properties.d.ts.map +1 -0
  29. package/dist/commands/ga4/properties.js +61 -0
  30. package/dist/commands/ga4/properties.js.map +1 -0
  31. package/dist/commands/ga4/query.d.ts +69 -0
  32. package/dist/commands/ga4/query.d.ts.map +1 -0
  33. package/dist/commands/ga4/query.js +184 -0
  34. package/dist/commands/ga4/query.js.map +1 -0
  35. package/dist/commands/ga4/resolve.d.ts +2 -0
  36. package/dist/commands/ga4/resolve.d.ts.map +1 -0
  37. package/dist/commands/ga4/resolve.js +57 -0
  38. package/dist/commands/ga4/resolve.js.map +1 -0
  39. package/dist/commands/gsc/index.d.ts +2 -0
  40. package/dist/commands/gsc/index.d.ts.map +1 -0
  41. package/dist/commands/gsc/index.js +26 -0
  42. package/dist/commands/gsc/index.js.map +1 -0
  43. package/dist/commands/gsc/presets.d.ts +9 -0
  44. package/dist/commands/gsc/presets.d.ts.map +1 -0
  45. package/dist/commands/gsc/presets.js +34 -0
  46. package/dist/commands/gsc/presets.js.map +1 -0
  47. package/dist/commands/gsc/query.d.ts +79 -0
  48. package/dist/commands/gsc/query.d.ts.map +1 -0
  49. package/dist/commands/gsc/query.js +196 -0
  50. package/dist/commands/gsc/query.js.map +1 -0
  51. package/dist/commands/gsc/resolve.d.ts +2 -0
  52. package/dist/commands/gsc/resolve.d.ts.map +1 -0
  53. package/dist/commands/gsc/resolve.js +57 -0
  54. package/dist/commands/gsc/resolve.js.map +1 -0
  55. package/dist/commands/gsc/sitemaps.d.ts +19 -0
  56. package/dist/commands/gsc/sitemaps.d.ts.map +1 -0
  57. package/dist/commands/gsc/sitemaps.js +65 -0
  58. package/dist/commands/gsc/sitemaps.js.map +1 -0
  59. package/dist/commands/gsc/sites.d.ts +14 -0
  60. package/dist/commands/gsc/sites.d.ts.map +1 -0
  61. package/dist/commands/gsc/sites.js +61 -0
  62. package/dist/commands/gsc/sites.js.map +1 -0
  63. package/dist/commands/research/autocomplete.d.ts +34 -0
  64. package/dist/commands/research/autocomplete.d.ts.map +1 -0
  65. package/dist/commands/research/autocomplete.js +73 -0
  66. package/dist/commands/research/autocomplete.js.map +1 -0
  67. package/dist/commands/research/index.d.ts.map +1 -1
  68. package/dist/commands/research/index.js +8 -0
  69. package/dist/commands/research/index.js.map +1 -1
  70. package/dist/commands/research/relevant-pages.d.ts +34 -0
  71. package/dist/commands/research/relevant-pages.d.ts.map +1 -0
  72. package/dist/commands/research/relevant-pages.js +76 -0
  73. package/dist/commands/research/relevant-pages.js.map +1 -0
  74. package/dist/env.d.ts +2 -0
  75. package/dist/env.d.ts.map +1 -1
  76. package/dist/env.js +2 -0
  77. package/dist/env.js.map +1 -1
  78. package/dist/error-handler.d.ts +8 -0
  79. package/dist/error-handler.d.ts.map +1 -0
  80. package/dist/error-handler.js +37 -0
  81. package/dist/error-handler.js.map +1 -0
  82. package/package.json +1 -1
package/README.md CHANGED
@@ -20,11 +20,19 @@ export BAKER_API_URL="https://your-baker-instance.convex.site"
20
20
 
21
21
  # Optional: default customer ID for Google Ads commands
22
22
  export BAKER_GOOGLE_ADS_CUSTOMER_ID="1234567890"
23
+
24
+ # Optional: default GA4 property ID
25
+ export BAKER_GA4_PROPERTY_ID="properties/123456789"
26
+
27
+ # Optional: default GSC site URL
28
+ export BAKER_GSC_SITE_URL="https://example.com/"
23
29
  ```
24
30
 
25
31
  - `BAKER_API_KEY` must start with `bk_`
26
32
  - `BAKER_API_URL` is your Convex site URL
27
33
  - `BAKER_GOOGLE_ADS_CUSTOMER_ID` — default Google Ads customer ID (10 digits). Used when `--customer-id` is not passed. If neither is set and the account has exactly one Google Ads customer, it is auto-selected.
34
+ - `BAKER_GA4_PROPERTY_ID` — default GA4 property ID. Used when `--property-id` is not passed. If neither is set and exactly one property is connected, it is auto-selected.
35
+ - `BAKER_GSC_SITE_URL` — default GSC site URL. Used when `--site-url` is not passed. If neither is set and exactly one site is verified, it is auto-selected.
28
36
 
29
37
  ## Output Format
30
38
 
@@ -421,6 +429,162 @@ All errors include a `fix` object with `action`, `correctedCommand` (when applic
421
429
 
422
430
  ---
423
431
 
432
+ ### Google Analytics 4 (`baker ga4`)
433
+
434
+ GA4 commands for multi-channel audits. Playbook-aligned presets, property health audits, and free-form Data API queries.
435
+
436
+ ---
437
+
438
+ ### `baker ga4 properties`
439
+
440
+ List accessible GA4 properties. Run this first to find property IDs.
441
+
442
+ ```bash
443
+ baker ga4 properties
444
+ ```
445
+
446
+ ---
447
+
448
+ ### `baker ga4 audit`
449
+
450
+ Run all GA4 admin health checks at once. Checks data retention, Google Ads linkage, phantom conversions, audience defaults, data streams, and attribution settings.
451
+
452
+ ```bash
453
+ baker ga4 audit
454
+ baker ga4 audit --property-id properties/123456789
455
+ ```
456
+
457
+ Returns raw config data plus playbook-aligned warnings:
458
+
459
+ ```json
460
+ {
461
+ "ok": true,
462
+ "data": { "property": {...}, "dataRetention": {...}, "conversionEvents": [...] },
463
+ "warnings": [
464
+ { "code": "SHORT_RETENTION", "message": "Data retention is TWO_MONTHS — should be FOURTEEN_MONTHS" },
465
+ { "code": "PHANTOM_CONVERSION", "message": "\"page_view\" is marked as a conversion event" }
466
+ ]
467
+ }
468
+ ```
469
+
470
+ ---
471
+
472
+ ### `baker ga4 query`
473
+
474
+ Run GA4 Data API reports. Presets are the primary interface; free-form dimensions/metrics is the escape hatch.
475
+
476
+ ```bash
477
+ # Playbook presets
478
+ baker ga4 query --preset tracking-health
479
+ baker ga4 query --preset lp-performance --days 14
480
+ baker ga4 query --preset funnel-leakage --out funnel.csv
481
+ baker ga4 query --list-presets
482
+
483
+ # Free-form
484
+ baker ga4 query --dimensions "date,sessionSourceMedium" --metrics "sessions,conversions"
485
+ ```
486
+
487
+ **Flags:**
488
+
489
+ | Flag | Description |
490
+ |------|-------------|
491
+ | `--preset` | Named preset (see below) |
492
+ | `--dimensions` | Comma-separated GA4 dimension names |
493
+ | `--metrics` | Comma-separated GA4 metric names |
494
+ | `--days` | Lookback window in days (default: 30) |
495
+ | `--start-date` | Start date (YYYY-MM-DD or GA4 relative like "30daysAgo") |
496
+ | `--end-date` | End date (YYYY-MM-DD or "yesterday") |
497
+ | `--limit` | Max rows (default: 1000) |
498
+ | `--property-id` | GA4 property ID (auto-resolved if not provided) |
499
+ | `--out` | Write to file (.csv, .jsonl, .json) |
500
+ | `--output` | Format: json\|csv\|jsonl\|md |
501
+ | `--no-cache` | Skip cache |
502
+
503
+ **Presets:**
504
+
505
+ | Preset | Playbook | What it answers |
506
+ |--------|----------|-----------------|
507
+ | `tracking-health` | [07] Discrepancy | Is GA4 tracking matching GAds? (>20% gap = broken) |
508
+ | `lp-performance` | [06] LP Diagnostic | Which LPs have bad UX? (<10s = message mismatch) |
509
+ | `traffic-quality` | [06] Warm Traffic | Is Smart Bidding cherry-picking returning users? |
510
+ | `funnel-leakage` | [06] Funnel Analysis | Where do users drop off in the funnel? |
511
+ | `first-touch` | First-Touch | What channels actually acquire new users? |
512
+ | `traffic-overview` | General | General traffic trends |
513
+
514
+ ---
515
+
516
+ ### Google Search Console (`baker gsc`)
517
+
518
+ GSC commands for PPC-SEO arbitrage, brand halo analysis, and negative keyword discovery.
519
+
520
+ ---
521
+
522
+ ### `baker gsc sites`
523
+
524
+ List verified Search Console sites.
525
+
526
+ ```bash
527
+ baker gsc sites
528
+ ```
529
+
530
+ ---
531
+
532
+ ### `baker gsc query`
533
+
534
+ Run Search Analytics queries. Presets are the primary interface.
535
+
536
+ ```bash
537
+ # Playbook presets
538
+ baker gsc query --preset cannibalization
539
+ baker gsc query --preset brand-halo --brand "Acme" --days 90
540
+ baker gsc query --preset negative-keywords --out negatives.csv
541
+ baker gsc query --list-presets
542
+
543
+ # Free-form
544
+ baker gsc query --dimensions "query,page" --days 28
545
+ baker gsc query --dimensions "query" --row-limit 25000 --out keywords.csv
546
+ ```
547
+
548
+ **Flags:**
549
+
550
+ | Flag | Description |
551
+ |------|-------------|
552
+ | `--preset` | Named preset (see below) |
553
+ | `--brand` | Brand name (required for brand-halo preset) |
554
+ | `--dimensions` | Comma-separated: query, page, country, device, date |
555
+ | `--days` | Lookback window (default: 28) |
556
+ | `--start-date` / `--end-date` | Explicit date range |
557
+ | `--row-limit` | Max rows (default: 1000, max: 25000) |
558
+ | `--type` | Search type: web\|image\|video\|news\|discover |
559
+ | `--site-url` | Site URL (auto-resolved if not provided) |
560
+ | `--out` | Write to file |
561
+ | `--output` | Format: json\|csv\|jsonl\|md |
562
+ | `--no-cache` | Skip cache |
563
+
564
+ **Presets:**
565
+
566
+ | Preset | Playbook | What it answers |
567
+ |--------|----------|-----------------|
568
+ | `cannibalization` | [05] PPC-SEO Arbitrage | Which queries rank #1-2 organically where you also pay? |
569
+ | `missed-revenue` | [05] Opportunity | High-impression queries with no PPC coverage? |
570
+ | `brand-halo` | [21] YouTube/DG ROI | Is upper-funnel spend driving brand searches? |
571
+ | `negative-keywords` | Negative Discovery | Queries to add as negative keywords |
572
+ | `top-pages` | General | Top performing pages |
573
+ | `top-queries` | General | Top search queries |
574
+
575
+ ---
576
+
577
+ ### `baker gsc sitemaps`
578
+
579
+ Check sitemap health for a site.
580
+
581
+ ```bash
582
+ baker gsc sitemaps
583
+ baker gsc sitemaps --site-url "https://example.com/"
584
+ ```
585
+
586
+ ---
587
+
424
588
  ### Competitive Intelligence (`baker research`)
425
589
 
426
590
  Market and competitor research powered by DataForSEO. Shows who's competing for keywords, search intent classification, competitor keyword strategies, keyword gaps, and landing page performance.
@@ -470,6 +634,80 @@ baker research advertisers "crm software" --location uk --limit 10
470
634
 
471
635
  ---
472
636
 
637
+ ### `baker research autocomplete "seed keyword"`
638
+
639
+ Get Google Autocomplete suggestions for keyword expansion.
640
+
641
+ ```bash
642
+ baker research autocomplete "running shoes"
643
+ baker research autocomplete "crm" --location uk --limit 5
644
+ ```
645
+
646
+ **Response:**
647
+
648
+ ```json
649
+ {
650
+ "ok": true,
651
+ "data": [
652
+ { "suggestion": "running shoes for men" },
653
+ { "suggestion": "running shoes near me" }
654
+ ],
655
+ "fields": {
656
+ "suggestion": "Autocomplete suggestion from Google"
657
+ }
658
+ }
659
+ ```
660
+
661
+ **Flags:**
662
+
663
+ | Flag | Description |
664
+ |--------------|--------------------------------------|
665
+ | `--location` | Country code (us, uk, es, de...). **Defaults to us** |
666
+ | `--language` | Language code or name. **Defaults to en** |
667
+ | `--limit` | Max suggestions (default: 10, max: 20) |
668
+ | `--no-cache` | Skip cache (24h TTL) |
669
+ | `--output` | Format: json\|csv\|md\|jsonl |
670
+
671
+ ---
672
+
673
+ ### `baker research relevant-pages "domain.com"`
674
+
675
+ Get the top pages of a competitor domain with organic traffic data.
676
+
677
+ ```bash
678
+ baker research relevant-pages "competitor.com"
679
+ baker research relevant-pages "competitor.com" --location es --limit 10
680
+ ```
681
+
682
+ **Response:**
683
+
684
+ ```json
685
+ {
686
+ "ok": true,
687
+ "data": [
688
+ { "page": "https://competitor.com/best-product", "etv": 12500, "keywords": 340, "top_10": 85 }
689
+ ],
690
+ "fields": {
691
+ "page": "Page URL",
692
+ "etv": "Estimated monthly organic traffic",
693
+ "keywords": "Total organic keywords the page ranks for",
694
+ "top_10": "Keywords in positions 1-10"
695
+ }
696
+ }
697
+ ```
698
+
699
+ **Flags:**
700
+
701
+ | Flag | Description |
702
+ |--------------|--------------------------------------|
703
+ | `--location` | Country code (us, uk, es, de...). **Defaults to us** |
704
+ | `--language` | Language code or name. **Defaults to en** |
705
+ | `--limit` | Max results (default: 20, max: 1000) |
706
+ | `--no-cache` | Skip cache (6h TTL) |
707
+ | `--output` | Format: json\|csv\|md\|jsonl |
708
+
709
+ ---
710
+
473
711
  ### `baker research intent "kw1,kw2,kw3"`
474
712
 
475
713
  Classify Google Search intent for keywords.
@@ -702,9 +940,11 @@ Research data is cached server-side (shared across all callers). No local cache
702
940
  | Command | TTL | Reason |
703
941
  |-------------------|---------|-------------------------------------|
704
942
  | advertisers | 6 hours | SERP landscape changes slowly |
943
+ | autocomplete | 24 hours| Suggestions change daily at most |
705
944
  | intent | 7 days | Intent classification is very stable |
706
945
  | keywords-for-site | 6 hours | Keyword targeting changes weekly |
707
946
  | keyword-gap | 6 hours | Same |
947
+ | relevant-pages | 6 hours | Traffic data updates weekly |
708
948
  | lighthouse | 24 hours| Page performance stable day-to-day |
709
949
 
710
950
  ---
@@ -841,9 +1081,9 @@ For machine-readable introspection, use `baker schema` (see below).
841
1081
 
842
1082
  This CLI is designed for AI agent consumption. Key patterns:
843
1083
 
844
- 1. **Start with `baker ads google accounts`** to discover available Google Ads accounts
845
- 2. **Use `baker ads google query --list-presets`** to see available query templates (saves tokens)
846
- 3. **Use presets** (`--preset campaign-performance`) instead of writing full GAQL when possible
1084
+ 1. **Start with account discovery** — `baker ads google accounts`, `baker ga4 properties`, `baker gsc sites`
1085
+ 2. **Use presets** (`--preset campaign-performance`, `--preset tracking-health`, `--preset cannibalization`) saves tokens, answers playbook questions
1086
+ 3. **Run `--list-presets`** on query commands to see available templates
847
1087
  4. **Read the `fields` object** in responses to understand what each column means
848
1088
  5. **Check `fix.correctedCommand`** on errors — copy-paste it to retry
849
1089
  6. **Use `--all --out file.csv`** for large exports to avoid filling context window
package/dist/cli.js CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { defineCommand, runMain } from "citty";
3
3
  import { adsCommand } from "./commands/ads/index.js";
4
+ import { ga4Command } from "./commands/ga4/index.js";
5
+ import { gscCommand } from "./commands/gsc/index.js";
4
6
  import { imagesCommand } from "./commands/images/index.js";
5
7
  import { researchCommand } from "./commands/research/index.js";
6
8
  import { schemaCommand } from "./commands/schema.js";
@@ -9,7 +11,7 @@ import { videosCommand } from "./commands/videos/index.js";
9
11
  const main = defineCommand({
10
12
  meta: {
11
13
  name: "baker",
12
- version: "0.13.0",
14
+ version: "0.16.0",
13
15
  description: `AI-agent CLI for finding and managing images, videos, testimonials, and ad platform data in Baker.
14
16
 
15
17
  Auth: Set BAKER_API_KEY (starts with bk_) and BAKER_API_URL environment variables.
@@ -19,6 +21,8 @@ Introspection: Run 'baker schema <command>' to inspect argument schemas.`,
19
21
  },
20
22
  subCommands: {
21
23
  ads: adsCommand,
24
+ ga4: ga4Command,
25
+ gsc: gscCommand,
22
26
  research: researchCommand,
23
27
  images: imagesCommand,
24
28
  videos: videosCommand,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE;;;;;yEAKwD;KACtE;IACD,WAAW,EAAE;QACX,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,YAAY,EAAE,mBAAmB;QACjC,MAAM,EAAE,aAAa;KACtB;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,MAAM,IAAI,GAAG,aAAa,CAAC;IACzB,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE;;;;;yEAKwD;KACtE;IACD,WAAW,EAAE;QACX,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,UAAU;QACf,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,YAAY,EAAE,mBAAmB;QACjC,MAAM,EAAE,aAAa;KACtB;CACF,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,CAAC"}
package/dist/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- type ErrorCode = "UNAUTHORIZED" | "NOT_FOUND" | "VALIDATION_ERROR" | "RATE_LIMITED" | "INTERNAL_ERROR" | "NETWORK_ERROR";
1
+ type ErrorCode = "UNAUTHORIZED" | "NOT_FOUND" | "VALIDATION_ERROR" | "RATE_LIMITED" | "INTERNAL_ERROR" | "NETWORK_ERROR" | "TIMEOUT";
2
2
  export declare class ApiError extends Error {
3
3
  code: ErrorCode;
4
4
  constructor(code: ErrorCode, message: string);
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,KAAK,SAAS,GACV,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,cAAc,GACd,gBAAgB,GAChB,eAAe,CAAC;AAEpB,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,SAAS,CAAC;gBAEJ,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;CAK7C;AAqBD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIjD;AAsDD,wBAAsB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwBzF;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAkBxE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,KAAK,SAAS,GACV,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,SAAS,CAAC;AAEd,qBAAa,QAAS,SAAQ,KAAK;IACjC,IAAI,EAAE,SAAS,CAAC;gBAEJ,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM;CAK7C;AAqBD,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAIjD;AAsDD,wBAAsB,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA4BzF;AAED,wBAAsB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAsBxE"}
package/dist/client.js CHANGED
@@ -96,9 +96,13 @@ export async function apiGet(path, params) {
96
96
  Authorization: `Bearer ${env.BAKER_API_KEY}`,
97
97
  Accept: "application/json",
98
98
  },
99
+ signal: AbortSignal.timeout(60_000),
99
100
  });
100
101
  }
101
102
  catch (err) {
103
+ if (err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError")) {
104
+ throw new ApiError("TIMEOUT", "Request timed out after 60 seconds");
105
+ }
102
106
  throw new ApiError("NETWORK_ERROR", `Request failed: ${err instanceof Error ? err.message : "Unknown error"}`);
103
107
  }
104
108
  return handleResponse(response);
@@ -115,9 +119,13 @@ export async function apiPost(path, body) {
115
119
  Accept: "application/json",
116
120
  },
117
121
  body: JSON.stringify(body),
122
+ signal: AbortSignal.timeout(60_000),
118
123
  });
119
124
  }
120
125
  catch (err) {
126
+ if (err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError")) {
127
+ throw new ApiError("TIMEOUT", "Request timed out after 60 seconds");
128
+ }
121
129
  throw new ApiError("NETWORK_ERROR", `Request failed: ${err instanceof Error ? err.message : "Unknown error"}`);
122
130
  }
123
131
  return handleResponse(response);
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/google/accounts.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,eAAe;;;;;;;;;;;;EAuC1B,CAAC"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/google/accounts.ts"],"names":[],"mappings":"AAkDA,eAAO,MAAM,eAAe;;;;;;;;;;;;EAuC1B,CAAC"}
@@ -10,17 +10,20 @@ registerSchema({
10
10
  "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false },
11
11
  },
12
12
  });
13
+ import { handleConnectionError } from "../../../error-handler.js";
13
14
  function handleAccountsError(err) {
14
15
  if (err instanceof ApiError) {
15
- const isAuth = err.code === "UNAUTHORIZED";
16
+ if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
17
+ handleConnectionError("google_ads", err.message);
18
+ }
16
19
  const envelope = {
17
20
  ok: false,
18
21
  error: {
19
- code: isAuth ? "AUTH_ERROR" : err.code,
22
+ code: err.code,
20
23
  message: err.message,
21
24
  fix: {
22
- action: isAuth ? "authenticate" : "reject",
23
- explanation: isAuth ? "Connect Google Ads in dashboard settings first" : err.message,
25
+ action: "reject",
26
+ explanation: err.message,
24
27
  },
25
28
  retryable: false,
26
29
  },
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/accounts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accounts.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/accounts.ts"],"names":[],"mappings":"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"}
@@ -14,6 +14,7 @@ type AdsOutput = AdsSuccessEnvelope<unknown> | AdsErrorEnvelope | AdsFileSummary
14
14
  };
15
15
  };
16
16
  export declare function writeAdsJson(envelope: AdsOutput): void;
17
+ export declare function writeJsonEnvelope(envelope: Record<string, unknown>): void;
17
18
  export declare function toCsvRow(values: string[]): string;
18
19
  export declare function writeAdsOutput(data: Array<Record<string, unknown>>, format: string, fields?: string[]): void;
19
20
  export declare function resolveCustomerId(args: Record<string, unknown>): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/commands/ads/output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvF,KAAK,SAAS,GACV,kBAAkB,CAAC,OAAO,CAAC,GAC3B,gBAAgB,GAChB,cAAc,GACd;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACzG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAEtD;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CASjD;AAqCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAc5G;AAkBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDtF"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/commands/ads/output.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvF,KAAK,SAAS,GACV,kBAAkB,CAAC,OAAO,CAAC,GAC3B,gBAAgB,GAChB,cAAc,GACd;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,YAAY,CAAC;IAAC,MAAM,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACzG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAE5D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAEzE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CASjD;AAqCD,wBAAgB,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAc5G;AAyBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAkDtF"}
@@ -4,6 +4,9 @@ import { cacheGet, cacheSet } from "./cache.js";
4
4
  export function writeAdsJson(envelope) {
5
5
  process.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
6
6
  }
7
+ export function writeJsonEnvelope(envelope) {
8
+ process.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
9
+ }
7
10
  export function toCsvRow(values) {
8
11
  return values
9
12
  .map((v) => {
@@ -62,14 +65,20 @@ export function writeAdsOutput(data, format, fields) {
62
65
  writeAdsJson({ ok: true, data });
63
66
  }
64
67
  }
65
- async function fetchAccounts() {
66
- const cached = cacheGet("accounts", "list");
67
- if (cached)
68
- return cached.data;
69
- const data = await apiGet("/api/ads/google/accounts");
70
- cacheSet("accounts", "list", data, 60 * 60 * 1000);
68
+ async function fetchAccounts(useCache = true) {
69
+ if (useCache) {
70
+ const cached = cacheGet("accounts", "list");
71
+ if (cached)
72
+ return cached.data;
73
+ }
74
+ const params = !useCache ? { "skip-cache": "true" } : undefined;
75
+ const data = await apiGet("/api/ads/google/accounts", params);
76
+ if (useCache) {
77
+ cacheSet("accounts", "list", data, 60 * 60 * 1000);
78
+ }
71
79
  return data;
72
80
  }
81
+ import { handleConnectionError } from "../../error-handler.js";
73
82
  export async function resolveCustomerId(args) {
74
83
  const fromArgs = args["customer-id"];
75
84
  const customerId = fromArgs || getEnv().BAKER_GOOGLE_ADS_CUSTOMER_ID;
@@ -86,22 +95,16 @@ export async function resolveCustomerId(args) {
86
95
  }
87
96
  return customerId;
88
97
  }
98
+ const useCache = !args["no-cache"];
89
99
  try {
90
- const accounts = await fetchAccounts();
100
+ const accounts = await fetchAccounts(useCache);
91
101
  const [single] = accounts;
92
102
  if (accounts.length === 1 && single) {
93
103
  process.stderr.write(`Using account "${single.name}" (${single.id})\n`);
94
104
  return single.id;
95
105
  }
96
106
  if (accounts.length === 0) {
97
- writeAdsJson({
98
- ok: false,
99
- error: {
100
- code: "NO_ACCOUNTS",
101
- message: "No Google Ads accounts found. Connect Google Ads in dashboard settings first.",
102
- },
103
- });
104
- process.exit(1);
107
+ handleConnectionError("google_ads");
105
108
  }
106
109
  const list = accounts.map((a) => ` ${a.id} ${a.name}`).join("\n");
107
110
  writeAdsJson({
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/commands/ads/output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/commands/ads/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare const auditCommand: import("citty").CommandDef<{
2
+ readonly "property-id": {
3
+ readonly type: "string";
4
+ readonly description: "GA4 property ID";
5
+ readonly required: false;
6
+ };
7
+ readonly "no-cache": {
8
+ readonly type: "boolean";
9
+ readonly description: "Skip cache";
10
+ readonly required: false;
11
+ };
12
+ }>;
13
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/commands/ga4/audit.ts"],"names":[],"mappings":"AAiBA,eAAO,MAAM,YAAY;;;;;;;;;;;EAmDvB,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { defineCommand } from "citty";
2
+ import { ApiError, apiPost } from "../../client.js";
3
+ import { registerSchema } from "../../schemas.js";
4
+ import { cacheGet, cacheSet } from "../ads/cache.js";
5
+ import { writeJsonEnvelope } from "../ads/output.js";
6
+ import { resolvePropertyId } from "./resolve.js";
7
+ registerSchema({
8
+ command: "ga4.audit",
9
+ description: "Run all GA4 admin health checks at once. Checks data retention, Google Ads linkage, phantom conversions, audience defaults, data streams, and attribution settings. Returns raw data plus playbook-aligned warnings.",
10
+ args: {
11
+ "property-id": { type: "string", description: "GA4 property ID (auto-resolved if not provided)", required: false },
12
+ "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false },
13
+ },
14
+ });
15
+ export const auditCommand = defineCommand({
16
+ meta: {
17
+ name: "audit",
18
+ description: `Run all GA4 admin health checks. Returns property config with playbook warnings.
19
+
20
+ Checks:
21
+ - Data retention (should be FOURTEEN_MONTHS)
22
+ - Google Ads linkage (must match audited account)
23
+ - Phantom conversions (page_view, scroll as conversions)
24
+ - Audience membership defaults (30-day B2B traps)
25
+ - Data streams and filters
26
+ - Attribution settings
27
+
28
+ Examples:
29
+ baker ga4 audit
30
+ baker ga4 audit --property-id properties/123456789`,
31
+ },
32
+ args: {
33
+ "property-id": { type: "string", description: "GA4 property ID", required: false },
34
+ "no-cache": { type: "boolean", description: "Skip cache", required: false },
35
+ },
36
+ run: async ({ args }) => {
37
+ const propertyId = await resolvePropertyId(args);
38
+ const useCache = !args["no-cache"];
39
+ const cacheKey = `audit:${propertyId}`;
40
+ if (useCache) {
41
+ const cached = cacheGet("ga4-audit", cacheKey);
42
+ if (cached) {
43
+ writeJsonEnvelope({ ...cached.data, cached: true });
44
+ return;
45
+ }
46
+ }
47
+ try {
48
+ const body = { propertyId };
49
+ if (!useCache)
50
+ body.skipCache = true;
51
+ const data = await apiPost("/api/ga4/audit", body);
52
+ if (useCache) {
53
+ cacheSet("ga4-audit", cacheKey, data, 6 * 60 * 60 * 1000);
54
+ }
55
+ writeJsonEnvelope(data);
56
+ }
57
+ catch (err) {
58
+ if (err instanceof ApiError) {
59
+ writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
60
+ process.exit(1);
61
+ }
62
+ writeJsonEnvelope({ ok: false, error: { code: "NETWORK_ERROR", message: "Unexpected error" } });
63
+ process.exit(1);
64
+ }
65
+ },
66
+ });
67
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/commands/ga4/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const ga4Command: import("citty").CommandDef<import("citty").ArgsDef>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ga4/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,qDAoBrB,CAAC"}