@koda-sl/baker-cli 0.15.0 → 0.18.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 (85) hide show
  1. package/README.md +469 -5
  2. package/dist/cli.js +5 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/client.d.ts +3 -1
  5. package/dist/client.d.ts.map +1 -1
  6. package/dist/client.js +4 -3
  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/google/index.d.ts.map +1 -1
  12. package/dist/commands/ads/google/index.js +5 -1
  13. package/dist/commands/ads/google/index.js.map +1 -1
  14. package/dist/commands/ads/google/library/index.d.ts +2 -0
  15. package/dist/commands/ads/google/library/index.d.ts.map +1 -0
  16. package/dist/commands/ads/google/library/index.js +271 -0
  17. package/dist/commands/ads/google/library/index.js.map +1 -0
  18. package/dist/commands/ads/output.d.ts +1 -0
  19. package/dist/commands/ads/output.d.ts.map +1 -1
  20. package/dist/commands/ads/output.js +18 -15
  21. package/dist/commands/ads/output.js.map +1 -1
  22. package/dist/commands/ga4/audit.d.ts +13 -0
  23. package/dist/commands/ga4/audit.d.ts.map +1 -0
  24. package/dist/commands/ga4/audit.js +67 -0
  25. package/dist/commands/ga4/audit.js.map +1 -0
  26. package/dist/commands/ga4/index.d.ts +2 -0
  27. package/dist/commands/ga4/index.d.ts.map +1 -0
  28. package/dist/commands/ga4/index.js +26 -0
  29. package/dist/commands/ga4/index.js.map +1 -0
  30. package/dist/commands/ga4/presets.d.ts +8 -0
  31. package/dist/commands/ga4/presets.d.ts.map +1 -0
  32. package/dist/commands/ga4/presets.js +33 -0
  33. package/dist/commands/ga4/presets.js.map +1 -0
  34. package/dist/commands/ga4/properties.d.ts +14 -0
  35. package/dist/commands/ga4/properties.d.ts.map +1 -0
  36. package/dist/commands/ga4/properties.js +61 -0
  37. package/dist/commands/ga4/properties.js.map +1 -0
  38. package/dist/commands/ga4/query.d.ts +69 -0
  39. package/dist/commands/ga4/query.d.ts.map +1 -0
  40. package/dist/commands/ga4/query.js +184 -0
  41. package/dist/commands/ga4/query.js.map +1 -0
  42. package/dist/commands/ga4/resolve.d.ts +2 -0
  43. package/dist/commands/ga4/resolve.d.ts.map +1 -0
  44. package/dist/commands/ga4/resolve.js +57 -0
  45. package/dist/commands/ga4/resolve.js.map +1 -0
  46. package/dist/commands/gsc/index.d.ts +2 -0
  47. package/dist/commands/gsc/index.d.ts.map +1 -0
  48. package/dist/commands/gsc/index.js +26 -0
  49. package/dist/commands/gsc/index.js.map +1 -0
  50. package/dist/commands/gsc/presets.d.ts +9 -0
  51. package/dist/commands/gsc/presets.d.ts.map +1 -0
  52. package/dist/commands/gsc/presets.js +34 -0
  53. package/dist/commands/gsc/presets.js.map +1 -0
  54. package/dist/commands/gsc/query.d.ts +79 -0
  55. package/dist/commands/gsc/query.d.ts.map +1 -0
  56. package/dist/commands/gsc/query.js +196 -0
  57. package/dist/commands/gsc/query.js.map +1 -0
  58. package/dist/commands/gsc/resolve.d.ts +2 -0
  59. package/dist/commands/gsc/resolve.d.ts.map +1 -0
  60. package/dist/commands/gsc/resolve.js +57 -0
  61. package/dist/commands/gsc/resolve.js.map +1 -0
  62. package/dist/commands/gsc/sitemaps.d.ts +19 -0
  63. package/dist/commands/gsc/sitemaps.d.ts.map +1 -0
  64. package/dist/commands/gsc/sitemaps.js +65 -0
  65. package/dist/commands/gsc/sitemaps.js.map +1 -0
  66. package/dist/commands/gsc/sites.d.ts +14 -0
  67. package/dist/commands/gsc/sites.d.ts.map +1 -0
  68. package/dist/commands/gsc/sites.js +61 -0
  69. package/dist/commands/gsc/sites.js.map +1 -0
  70. package/dist/commands/research/index.d.ts.map +1 -1
  71. package/dist/commands/research/index.js +7 -5
  72. package/dist/commands/research/index.js.map +1 -1
  73. package/dist/commands/research/web.d.ts +19 -0
  74. package/dist/commands/research/web.d.ts.map +1 -0
  75. package/dist/commands/research/web.js +112 -0
  76. package/dist/commands/research/web.js.map +1 -0
  77. package/dist/env.d.ts +2 -0
  78. package/dist/env.d.ts.map +1 -1
  79. package/dist/env.js +2 -0
  80. package/dist/env.js.map +1 -1
  81. package/dist/error-handler.d.ts +8 -0
  82. package/dist/error-handler.d.ts.map +1 -0
  83. package/dist/error-handler.js +37 -0
  84. package/dist/error-handler.js.map +1 -0
  85. 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
 
@@ -375,6 +383,260 @@ baker ads google keywords metrics --customer-id 1234567890 --keywords "running s
375
383
 
376
384
  ---
377
385
 
386
+ ### Google Ads Library (`baker ads google library`)
387
+
388
+ Manage and search the Google Ads Transparency Center. Track competitor advertisers, browse their ad creatives, and discover who's bidding on keywords.
389
+
390
+ **Typical workflow:** `search-advertiser` → `track` → `search-ads`
391
+
392
+ ---
393
+
394
+ ### `baker ads google library search-advertiser "query"`
395
+
396
+ Search for an advertiser on the Google Ads Transparency Center.
397
+
398
+ ```bash
399
+ baker ads google library search-advertiser "Nike"
400
+ baker ads google library search-advertiser "example.com"
401
+ ```
402
+
403
+ **Response:**
404
+
405
+ ```json
406
+ {
407
+ "ok": true,
408
+ "data": {
409
+ "results": [
410
+ { "advertiserId": "AR12345678901234567", "name": "Nike, Inc.", "region": "US", "format": "TEXT_IMAGE_VIDEO" }
411
+ ]
412
+ }
413
+ }
414
+ ```
415
+
416
+ **Flags:**
417
+
418
+ | Flag | Description |
419
+ |------------|--------------------------------|
420
+ | `--output` | Format: `json` \| `csv` \| `md` |
421
+
422
+ ---
423
+
424
+ ### `baker ads google library track <id> <name>`
425
+
426
+ Track a new Google advertiser and wait for the initial ad sync to complete. Polls every 5 seconds with a 10-minute timeout. Progress is written to stderr.
427
+
428
+ ```bash
429
+ baker ads google library track AR12345678901234567 "Nike, Inc."
430
+ baker ads google library track AR12345678901234567 "Nike, Inc." --json
431
+ ```
432
+
433
+ **Response (with `--json`):**
434
+
435
+ ```json
436
+ {
437
+ "ok": true,
438
+ "data": {
439
+ "advertiserId": "ar_abc123",
440
+ "accountId": "acc_def456",
441
+ "totalAdCount": 342,
442
+ "activeAdCount": 89
443
+ }
444
+ }
445
+ ```
446
+
447
+ **Flags:**
448
+
449
+ | Flag | Description |
450
+ |----------|----------------------|
451
+ | `--json` | Output in JSON format |
452
+
453
+ ---
454
+
455
+ ### `baker ads google library list-advertisers`
456
+
457
+ List all tracked Google advertisers and their accounts.
458
+
459
+ ```bash
460
+ baker ads google library list-advertisers
461
+ baker ads google library list-advertisers --output md
462
+ ```
463
+
464
+ **Flags:**
465
+
466
+ | Flag | Description |
467
+ |------------|--------------------------------|
468
+ | `--output` | Format: `json` \| `csv` \| `md` |
469
+
470
+ ---
471
+
472
+ ### `baker ads google library sync-status <accountId>`
473
+
474
+ Check the sync status and ad counts of a tracked account.
475
+
476
+ ```bash
477
+ baker ads google library sync-status acc_def456
478
+ ```
479
+
480
+ **Response:**
481
+
482
+ ```json
483
+ {
484
+ "ok": true,
485
+ "data": {
486
+ "syncStatus": null,
487
+ "totalAdCount": 342,
488
+ "activeAdCount": 89
489
+ }
490
+ }
491
+ ```
492
+
493
+ `syncStatus` is `null` when idle, `"syncing"` during a sync, or `"error"` if the last sync failed.
494
+
495
+ ---
496
+
497
+ ### `baker ads google library search-ads <accountId>`
498
+
499
+ Search and filter ads for a tracked account. Supports pagination.
500
+
501
+ ```bash
502
+ baker ads google library search-ads acc_def456
503
+ baker ads google library search-ads acc_def456 --search "summer sale" --isActive --mediaType image
504
+ baker ads google library search-ads acc_def456 --sort newest --limit 50
505
+ baker ads google library search-ads acc_def456 --cursor "eyJwYWdl..."
506
+ ```
507
+
508
+ **Response:**
509
+
510
+ ```json
511
+ {
512
+ "ok": true,
513
+ "data": {
514
+ "page": [
515
+ {
516
+ "_id": "abc123",
517
+ "platform": "google",
518
+ "externalId": "CR_1234567890",
519
+ "isActive": true,
520
+ "mediaType": "image",
521
+ "headline": "Summer Sale — 50% Off Everything",
522
+ "description": "Shop our biggest sale of the year. Free shipping on all orders.",
523
+ "destinationUrl": "https://example.com/summer-sale",
524
+ "bodyText": "Summer Sale — 50% Off Everything",
525
+ "pageName": "Example Store",
526
+ "impressionsMin": 100000,
527
+ "impressionsMax": 200000,
528
+ "startDate": "2025-06-01",
529
+ "endDate": "2025-06-30",
530
+ "firstSeenAt": 1717200000000,
531
+ "lastSeenAt": 1719792000000,
532
+ "publisherPlatforms": ["GOOGLE_ADS"],
533
+ "regionCodes": ["US", "GB"],
534
+ "variations": [
535
+ {
536
+ "headline": "Summer Sale — 50% Off",
537
+ "description": "Shop our biggest sale of the year.",
538
+ "destinationUrl": "https://example.com/summer-sale",
539
+ "imageUrl": "https://...",
540
+ "visibleUrl": "example.com"
541
+ }
542
+ ],
543
+ "regions": [
544
+ { "code": "US", "name": "United States" }
545
+ ],
546
+ "analysisStatus": "completed",
547
+ "aiAnalysis": {
548
+ "aiSummary": "Promotional display ad for a seasonal sale with urgency-driven CTA",
549
+ "hookAngle": "Discount/Price",
550
+ "offerType": "Percentage Discount",
551
+ "ctaStrategy": "Shop Now",
552
+ "funnelStage": "Bottom",
553
+ "targetAudience": "Price-sensitive shoppers",
554
+ "adFormat": "responsive_display",
555
+ "tags": ["sale", "discount", "ecommerce"],
556
+ "trustSignals": ["Free shipping"],
557
+ "keyMessages": ["50% off", "Free shipping"],
558
+ "competitiveAngle": "Price leadership",
559
+ "dominantColors": ["#FF5733", "#FFFFFF"],
560
+ "analyzedAt": 1719792000000
561
+ }
562
+ }
563
+ ],
564
+ "continueCursor": "eyJwYWdl...",
565
+ "isDone": false
566
+ }
567
+ }
568
+ ```
569
+
570
+ **Key response fields:**
571
+
572
+ | Field | Description |
573
+ |-------|-------------|
574
+ | `headline`, `description` | Top-level ad copy (first variation) |
575
+ | `variations[]` | All ad variations with copy, images, videos, and URLs |
576
+ | `regions[]` | Geographic targeting regions |
577
+ | `impressionsMin/Max` | Estimated impression range (Google Ads Transparency data) |
578
+ | `publisherPlatforms` | Where the ad ran (GOOGLE_ADS, YOUTUBE, etc.) |
579
+ | `analysisStatus` | AI analysis state: `pending`, `processing`, `completed`, `failed` |
580
+ | `aiAnalysis` | AI-generated creative analysis (only present when `analysisStatus` is `completed`) |
581
+ | `aiAnalysis.aiSummary` | One-line AI summary of the ad |
582
+ | `aiAnalysis.hookAngle` | Creative hook (Discount, Fear, Social Proof, etc.) |
583
+ | `aiAnalysis.funnelStage` | Funnel position: Top, Middle, Bottom |
584
+ | `aiAnalysis.tags` | AI-generated tags for filtering |
585
+
586
+ **Flags:**
587
+
588
+ | Flag | Description |
589
+ |---------------|------------------------------------------------|
590
+ | `--search` | Search term for ad text |
591
+ | `--isActive` | Filter by active ads only |
592
+ | `--mediaType` | Filter by media type: `image`, `video`, `text` |
593
+ | `--sort` | Sort: `newest` or `oldest` |
594
+ | `--limit` | Max results per page (default 20, max 100) |
595
+ | `--cursor` | Pagination cursor from previous response |
596
+ | `--output` | Format: `json` \| `csv` \| `md` |
597
+
598
+ ---
599
+
600
+ ### `baker ads google library sync <accountId>`
601
+
602
+ Trigger an immediate re-sync for a tracked account. Polls every 5 seconds until complete (10-minute timeout). Progress is written to stderr.
603
+
604
+ ```bash
605
+ baker ads google library sync acc_def456
606
+ ```
607
+
608
+ **Response:**
609
+
610
+ ```json
611
+ {
612
+ "ok": true,
613
+ "data": {
614
+ "totalAdCount": 350,
615
+ "activeAdCount": 92
616
+ }
617
+ }
618
+ ```
619
+
620
+ ---
621
+
622
+ ### `baker ads google library search-competitors "keyword"`
623
+
624
+ Search for competitors running Google ads for a keyword. Uses DataForSEO (same data as `baker research advertisers`).
625
+
626
+ ```bash
627
+ baker ads google library search-competitors "running shoes"
628
+ baker ads google library search-competitors "crm software" --location uk
629
+ ```
630
+
631
+ **Flags:**
632
+
633
+ | Flag | Description |
634
+ |--------------|----------------------------|
635
+ | `--location` | Location name or code |
636
+ | `--json` | Output in JSON format |
637
+
638
+ ---
639
+
378
640
  ### Caching
379
641
 
380
642
  Google Ads data is cached at two levels:
@@ -421,11 +683,213 @@ All errors include a `fix` object with `action`, `correctedCommand` (when applic
421
683
 
422
684
  ---
423
685
 
686
+ ### Google Analytics 4 (`baker ga4`)
687
+
688
+ GA4 commands for multi-channel audits. Playbook-aligned presets, property health audits, and free-form Data API queries.
689
+
690
+ ---
691
+
692
+ ### `baker ga4 properties`
693
+
694
+ List accessible GA4 properties. Run this first to find property IDs.
695
+
696
+ ```bash
697
+ baker ga4 properties
698
+ ```
699
+
700
+ ---
701
+
702
+ ### `baker ga4 audit`
703
+
704
+ Run all GA4 admin health checks at once. Checks data retention, Google Ads linkage, phantom conversions, audience defaults, data streams, and attribution settings.
705
+
706
+ ```bash
707
+ baker ga4 audit
708
+ baker ga4 audit --property-id properties/123456789
709
+ ```
710
+
711
+ Returns raw config data plus playbook-aligned warnings:
712
+
713
+ ```json
714
+ {
715
+ "ok": true,
716
+ "data": { "property": {...}, "dataRetention": {...}, "conversionEvents": [...] },
717
+ "warnings": [
718
+ { "code": "SHORT_RETENTION", "message": "Data retention is TWO_MONTHS — should be FOURTEEN_MONTHS" },
719
+ { "code": "PHANTOM_CONVERSION", "message": "\"page_view\" is marked as a conversion event" }
720
+ ]
721
+ }
722
+ ```
723
+
724
+ ---
725
+
726
+ ### `baker ga4 query`
727
+
728
+ Run GA4 Data API reports. Presets are the primary interface; free-form dimensions/metrics is the escape hatch.
729
+
730
+ ```bash
731
+ # Playbook presets
732
+ baker ga4 query --preset tracking-health
733
+ baker ga4 query --preset lp-performance --days 14
734
+ baker ga4 query --preset funnel-leakage --out funnel.csv
735
+ baker ga4 query --list-presets
736
+
737
+ # Free-form
738
+ baker ga4 query --dimensions "date,sessionSourceMedium" --metrics "sessions,conversions"
739
+ ```
740
+
741
+ **Flags:**
742
+
743
+ | Flag | Description |
744
+ |------|-------------|
745
+ | `--preset` | Named preset (see below) |
746
+ | `--dimensions` | Comma-separated GA4 dimension names |
747
+ | `--metrics` | Comma-separated GA4 metric names |
748
+ | `--days` | Lookback window in days (default: 30) |
749
+ | `--start-date` | Start date (YYYY-MM-DD or GA4 relative like "30daysAgo") |
750
+ | `--end-date` | End date (YYYY-MM-DD or "yesterday") |
751
+ | `--limit` | Max rows (default: 1000) |
752
+ | `--property-id` | GA4 property ID (auto-resolved if not provided) |
753
+ | `--out` | Write to file (.csv, .jsonl, .json) |
754
+ | `--output` | Format: json\|csv\|jsonl\|md |
755
+ | `--no-cache` | Skip cache |
756
+
757
+ **Presets:**
758
+
759
+ | Preset | Playbook | What it answers |
760
+ |--------|----------|-----------------|
761
+ | `tracking-health` | [07] Discrepancy | Is GA4 tracking matching GAds? (>20% gap = broken) |
762
+ | `lp-performance` | [06] LP Diagnostic | Which LPs have bad UX? (<10s = message mismatch) |
763
+ | `traffic-quality` | [06] Warm Traffic | Is Smart Bidding cherry-picking returning users? |
764
+ | `funnel-leakage` | [06] Funnel Analysis | Where do users drop off in the funnel? |
765
+ | `first-touch` | First-Touch | What channels actually acquire new users? |
766
+ | `traffic-overview` | General | General traffic trends |
767
+
768
+ ---
769
+
770
+ ### Google Search Console (`baker gsc`)
771
+
772
+ GSC commands for PPC-SEO arbitrage, brand halo analysis, and negative keyword discovery.
773
+
774
+ ---
775
+
776
+ ### `baker gsc sites`
777
+
778
+ List verified Search Console sites.
779
+
780
+ ```bash
781
+ baker gsc sites
782
+ ```
783
+
784
+ ---
785
+
786
+ ### `baker gsc query`
787
+
788
+ Run Search Analytics queries. Presets are the primary interface.
789
+
790
+ ```bash
791
+ # Playbook presets
792
+ baker gsc query --preset cannibalization
793
+ baker gsc query --preset brand-halo --brand "Acme" --days 90
794
+ baker gsc query --preset negative-keywords --out negatives.csv
795
+ baker gsc query --list-presets
796
+
797
+ # Free-form
798
+ baker gsc query --dimensions "query,page" --days 28
799
+ baker gsc query --dimensions "query" --row-limit 25000 --out keywords.csv
800
+ ```
801
+
802
+ **Flags:**
803
+
804
+ | Flag | Description |
805
+ |------|-------------|
806
+ | `--preset` | Named preset (see below) |
807
+ | `--brand` | Brand name (required for brand-halo preset) |
808
+ | `--dimensions` | Comma-separated: query, page, country, device, date |
809
+ | `--days` | Lookback window (default: 28) |
810
+ | `--start-date` / `--end-date` | Explicit date range |
811
+ | `--row-limit` | Max rows (default: 1000, max: 25000) |
812
+ | `--type` | Search type: web\|image\|video\|news\|discover |
813
+ | `--site-url` | Site URL (auto-resolved if not provided) |
814
+ | `--out` | Write to file |
815
+ | `--output` | Format: json\|csv\|jsonl\|md |
816
+ | `--no-cache` | Skip cache |
817
+
818
+ **Presets:**
819
+
820
+ | Preset | Playbook | What it answers |
821
+ |--------|----------|-----------------|
822
+ | `cannibalization` | [05] PPC-SEO Arbitrage | Which queries rank #1-2 organically where you also pay? |
823
+ | `missed-revenue` | [05] Opportunity | High-impression queries with no PPC coverage? |
824
+ | `brand-halo` | [21] YouTube/DG ROI | Is upper-funnel spend driving brand searches? |
825
+ | `negative-keywords` | Negative Discovery | Queries to add as negative keywords |
826
+ | `top-pages` | General | Top performing pages |
827
+ | `top-queries` | General | Top search queries |
828
+
829
+ ---
830
+
831
+ ### `baker gsc sitemaps`
832
+
833
+ Check sitemap health for a site.
834
+
835
+ ```bash
836
+ baker gsc sitemaps
837
+ baker gsc sitemaps --site-url "https://example.com/"
838
+ ```
839
+
840
+ ---
841
+
424
842
  ### Competitive Intelligence (`baker research`)
425
843
 
426
- 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.
844
+ Market and competitor research powered by DataForSEO and AI-powered Google Search grounding. Shows who's competing for keywords, search intent classification, competitor keyword strategies, keyword gaps, landing page performance, and open-ended AI research.
845
+
846
+ All DataForSEO research responses include a `note` field indicating that data is estimated from third-party SERP scraping and should be used for directional insights, not precise measurement.
847
+
848
+ ---
849
+
850
+ ### `baker research web "question"`
851
+
852
+ Search the web with AI to answer any open-ended marketing question — competitors, ICP, pricing, pain points, market trends. Uses live internet data via Google Search.
853
+
854
+ ```bash
855
+ baker research web "Who are the main competitors of HubSpot CRM?"
856
+ baker research web "What are the top pain points for SMB CRM buyers?" --depth high
857
+ baker research web "Full competitive analysis of project management SaaS" --depth xhigh
858
+ baker research web "What is the pricing of monday.com?" --output md
859
+ ```
860
+
861
+ **Depth levels:**
862
+
863
+ | Depth | Model | Use case | Timeout |
864
+ |-------|-------|----------|---------|
865
+ | `medium` (default) | Gemini Flash + minimal thinking | Quick lookups | 3m |
866
+ | `high` | Gemini Flash + deep thinking | Thorough answers | 6m |
867
+ | `xhigh` | Gemini Deep Research | Exhaustive research (use sparingly) | 15m |
868
+
869
+ **Response:**
870
+
871
+ ```json
872
+ {
873
+ "ok": true,
874
+ "data": {
875
+ "answer": "## HubSpot CRM Competitors\n\n### 1. Salesforce\n...",
876
+ "sources": [
877
+ { "title": "HubSpot vs Salesforce", "url": "https://..." }
878
+ ]
879
+ },
880
+ "fields": {
881
+ "answer": "AI-generated research answer (markdown)",
882
+ "sources": "Array of {title, url} sources used for grounding"
883
+ }
884
+ }
885
+ ```
886
+
887
+ **Flags:**
427
888
 
428
- All research responses include a `note` field indicating that data is estimated from third-party SERP scraping and should be used for directional insights, not precise measurement.
889
+ | Flag | Description |
890
+ |------------|------------------------------------------------------|
891
+ | `--depth` | Research depth: medium (default), high, xhigh |
892
+ | `--output` | Format: json (default), md (raw markdown + sources) |
429
893
 
430
894
  ---
431
895
 
@@ -917,9 +1381,9 @@ For machine-readable introspection, use `baker schema` (see below).
917
1381
 
918
1382
  This CLI is designed for AI agent consumption. Key patterns:
919
1383
 
920
- 1. **Start with `baker ads google accounts`** to discover available Google Ads accounts
921
- 2. **Use `baker ads google query --list-presets`** to see available query templates (saves tokens)
922
- 3. **Use presets** (`--preset campaign-performance`) instead of writing full GAQL when possible
1384
+ 1. **Start with account discovery** — `baker ads google accounts`, `baker ga4 properties`, `baker gsc sites`
1385
+ 2. **Use presets** (`--preset campaign-performance`, `--preset tracking-health`, `--preset cannibalization`) saves tokens, answers playbook questions
1386
+ 3. **Run `--list-presets`** on query commands to see available templates
923
1387
  4. **Read the `fields` object** in responses to understand what each column means
924
1388
  5. **Check `fix.correctedCommand`** on errors — copy-paste it to retry
925
1389
  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.15.0",
14
+ version: "0.18.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
@@ -5,6 +5,8 @@ export declare class ApiError extends Error {
5
5
  }
6
6
  export declare function validateConvexId(id: string): void;
7
7
  export declare function apiGet<T>(path: string, params?: Record<string, string>): Promise<T>;
8
- export declare function apiPost<T>(path: string, body: unknown): Promise<T>;
8
+ export declare function apiPost<T>(path: string, body: unknown, opts?: {
9
+ timeoutMs?: number;
10
+ }): Promise<T>;
9
11
  export {};
10
12
  //# sourceMappingURL=client.d.ts.map
@@ -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,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"}
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,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBvG"}
package/dist/client.js CHANGED
@@ -107,8 +107,9 @@ export async function apiGet(path, params) {
107
107
  }
108
108
  return handleResponse(response);
109
109
  }
110
- export async function apiPost(path, body) {
110
+ export async function apiPost(path, body, opts) {
111
111
  const env = getEnv();
112
+ const timeoutMs = opts?.timeoutMs ?? 60_000;
112
113
  let response;
113
114
  try {
114
115
  response = await fetch(new URL(path, env.BAKER_API_URL).toString(), {
@@ -119,12 +120,12 @@ export async function apiPost(path, body) {
119
120
  Accept: "application/json",
120
121
  },
121
122
  body: JSON.stringify(body),
122
- signal: AbortSignal.timeout(60_000),
123
+ signal: AbortSignal.timeout(timeoutMs),
123
124
  });
124
125
  }
125
126
  catch (err) {
126
127
  if (err instanceof Error && (err.name === "TimeoutError" || err.name === "AbortError")) {
127
- throw new ApiError("TIMEOUT", "Request timed out after 60 seconds");
128
+ throw new ApiError("TIMEOUT", `Request timed out after ${Math.round(timeoutMs / 1000)} seconds`);
128
129
  }
129
130
  throw new ApiError("NETWORK_ERROR", `Request failed: ${err instanceof Error ? err.message : "Unknown error"}`);
130
131
  }
@@ -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":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG5D,cAAc,CAAC;IACb,OAAO,EAAE,qBAAqB;IAC9B,WAAW,EACT,iPAAiP;IACnP,IAAI,EAAE;QACJ,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,8BAA8B,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC9F;CACF,CAAC,CAAC;AAUH,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC5D,qBAAqB,CAAC,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,QAAQ,GAAqB;YACjC,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,GAAG,EAAE;oBACH,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,GAAG,CAAC,OAAO;iBACzB;gBACD,SAAS,EAAE,KAAK;aACjB;SACF,CAAC;QACF,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,YAAY,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE;;;4BAGW;KACzB;IACD,IAAI,EAAE;QACJ,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;KACjG;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEnC,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,QAAQ,CAAgB,UAAU,EAAE,MAAM,CAAC,CAAC;YAC3D,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;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAgB,0BAA0B,EAAE,MAAM,CAAC,CAAC;YAC7E,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;YACrD,CAAC;YACD,MAAM,MAAM,GAAI,IAAI,CAAC,MAAiB,IAAI,MAAM,CAAC;YACjD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,cAAc,CAAC,IAAiD,EAAE,MAAM,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YACD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/google/index.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,qDAsBxB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/google/index.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,aAAa,qDAyBxB,CAAC"}