@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.
- package/README.md +469 -5
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -3
- package/dist/client.js.map +1 -1
- package/dist/commands/ads/google/accounts.d.ts.map +1 -1
- package/dist/commands/ads/google/accounts.js +7 -4
- package/dist/commands/ads/google/accounts.js.map +1 -1
- package/dist/commands/ads/google/index.d.ts.map +1 -1
- package/dist/commands/ads/google/index.js +5 -1
- package/dist/commands/ads/google/index.js.map +1 -1
- package/dist/commands/ads/google/library/index.d.ts +2 -0
- package/dist/commands/ads/google/library/index.d.ts.map +1 -0
- package/dist/commands/ads/google/library/index.js +271 -0
- package/dist/commands/ads/google/library/index.js.map +1 -0
- package/dist/commands/ads/output.d.ts +1 -0
- package/dist/commands/ads/output.d.ts.map +1 -1
- package/dist/commands/ads/output.js +18 -15
- package/dist/commands/ads/output.js.map +1 -1
- package/dist/commands/ga4/audit.d.ts +13 -0
- package/dist/commands/ga4/audit.d.ts.map +1 -0
- package/dist/commands/ga4/audit.js +67 -0
- package/dist/commands/ga4/audit.js.map +1 -0
- package/dist/commands/ga4/index.d.ts +2 -0
- package/dist/commands/ga4/index.d.ts.map +1 -0
- package/dist/commands/ga4/index.js +26 -0
- package/dist/commands/ga4/index.js.map +1 -0
- package/dist/commands/ga4/presets.d.ts +8 -0
- package/dist/commands/ga4/presets.d.ts.map +1 -0
- package/dist/commands/ga4/presets.js +33 -0
- package/dist/commands/ga4/presets.js.map +1 -0
- package/dist/commands/ga4/properties.d.ts +14 -0
- package/dist/commands/ga4/properties.d.ts.map +1 -0
- package/dist/commands/ga4/properties.js +61 -0
- package/dist/commands/ga4/properties.js.map +1 -0
- package/dist/commands/ga4/query.d.ts +69 -0
- package/dist/commands/ga4/query.d.ts.map +1 -0
- package/dist/commands/ga4/query.js +184 -0
- package/dist/commands/ga4/query.js.map +1 -0
- package/dist/commands/ga4/resolve.d.ts +2 -0
- package/dist/commands/ga4/resolve.d.ts.map +1 -0
- package/dist/commands/ga4/resolve.js +57 -0
- package/dist/commands/ga4/resolve.js.map +1 -0
- package/dist/commands/gsc/index.d.ts +2 -0
- package/dist/commands/gsc/index.d.ts.map +1 -0
- package/dist/commands/gsc/index.js +26 -0
- package/dist/commands/gsc/index.js.map +1 -0
- package/dist/commands/gsc/presets.d.ts +9 -0
- package/dist/commands/gsc/presets.d.ts.map +1 -0
- package/dist/commands/gsc/presets.js +34 -0
- package/dist/commands/gsc/presets.js.map +1 -0
- package/dist/commands/gsc/query.d.ts +79 -0
- package/dist/commands/gsc/query.d.ts.map +1 -0
- package/dist/commands/gsc/query.js +196 -0
- package/dist/commands/gsc/query.js.map +1 -0
- package/dist/commands/gsc/resolve.d.ts +2 -0
- package/dist/commands/gsc/resolve.d.ts.map +1 -0
- package/dist/commands/gsc/resolve.js +57 -0
- package/dist/commands/gsc/resolve.js.map +1 -0
- package/dist/commands/gsc/sitemaps.d.ts +19 -0
- package/dist/commands/gsc/sitemaps.d.ts.map +1 -0
- package/dist/commands/gsc/sitemaps.js +65 -0
- package/dist/commands/gsc/sitemaps.js.map +1 -0
- package/dist/commands/gsc/sites.d.ts +14 -0
- package/dist/commands/gsc/sites.d.ts.map +1 -0
- package/dist/commands/gsc/sites.js +61 -0
- package/dist/commands/gsc/sites.js.map +1 -0
- package/dist/commands/research/index.d.ts.map +1 -1
- package/dist/commands/research/index.js +7 -5
- package/dist/commands/research/index.js.map +1 -1
- package/dist/commands/research/web.d.ts +19 -0
- package/dist/commands/research/web.d.ts.map +1 -0
- package/dist/commands/research/web.js +112 -0
- package/dist/commands/research/web.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +2 -0
- package/dist/env.js.map +1 -1
- package/dist/error-handler.d.ts +8 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +37 -0
- package/dist/error-handler.js.map +1 -0
- package/package.json +1 -1
|
@@ -3,6 +3,7 @@ import { accountsCommand } from "./accounts.js";
|
|
|
3
3
|
import { changesCommand } from "./changes.js";
|
|
4
4
|
import { currencyCommand } from "./currency.js";
|
|
5
5
|
import { keywordsCommand } from "./keywords/index.js";
|
|
6
|
+
import { library } from "./library/index.js";
|
|
6
7
|
import { queryCommand } from "./query.js";
|
|
7
8
|
export const googleCommand = defineCommand({
|
|
8
9
|
meta: {
|
|
@@ -12,12 +13,14 @@ export const googleCommand = defineCommand({
|
|
|
12
13
|
Start here:
|
|
13
14
|
baker ads google accounts — list accessible accounts
|
|
14
15
|
baker ads google query --list-presets — see available query templates
|
|
16
|
+
baker ads google library --help — manage and search the Google Ads Library
|
|
15
17
|
|
|
16
18
|
Examples:
|
|
17
19
|
baker ads google query "SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS" --customer-id 1234567890
|
|
18
20
|
baker ads google query --preset campaign-performance --customer-id 1234567890
|
|
19
21
|
baker ads google currency --customer-id 1234567890
|
|
20
|
-
baker ads google keywords discover --customer-id 1234567890 --seeds "running shoes"
|
|
22
|
+
baker ads google keywords discover --customer-id 1234567890 --seeds "running shoes"
|
|
23
|
+
baker ads google library list-advertisers — list tracked Google advertisers`,
|
|
21
24
|
},
|
|
22
25
|
subCommands: {
|
|
23
26
|
accounts: accountsCommand,
|
|
@@ -25,6 +28,7 @@ Examples:
|
|
|
25
28
|
changes: changesCommand,
|
|
26
29
|
query: queryCommand,
|
|
27
30
|
keywords: keywordsCommand,
|
|
31
|
+
library: library,
|
|
28
32
|
},
|
|
29
33
|
});
|
|
30
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/ads/google/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE;;;;;;;;;;;;iFAYgE;KAC9E;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,eAAe;QACzB,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,cAAc;QACvB,KAAK,EAAE,YAAY;QACnB,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,OAAO;KACjB;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/commands/ads/google/library/index.ts"],"names":[],"mappings":"AA0RA,eAAO,MAAM,OAAO,qDAclB,CAAC"}
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet, apiPost } from "../../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../../output.js";
|
|
4
|
+
const listAdvertisers = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "list-advertisers",
|
|
7
|
+
description: "List tracked Google advertisers and their accounts",
|
|
8
|
+
},
|
|
9
|
+
args: {
|
|
10
|
+
output: { type: "string", description: "Format: json|csv|md", default: "json" },
|
|
11
|
+
},
|
|
12
|
+
async run({ args }) {
|
|
13
|
+
const data = await apiGet("/api/ads/google/library/advertisers");
|
|
14
|
+
if (args.output !== "json") {
|
|
15
|
+
writeAdsOutput(data, args.output);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
writeAdsJson({ ok: true, data });
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
const syncStatus = defineCommand({
|
|
23
|
+
meta: {
|
|
24
|
+
name: "sync-status",
|
|
25
|
+
description: "Check the sync status and ad counts of a Google account",
|
|
26
|
+
},
|
|
27
|
+
args: {
|
|
28
|
+
accountId: {
|
|
29
|
+
type: "positional",
|
|
30
|
+
description: "Account ID to check",
|
|
31
|
+
required: true,
|
|
32
|
+
},
|
|
33
|
+
output: { type: "string", description: "Format: json", default: "json" },
|
|
34
|
+
},
|
|
35
|
+
async run({ args }) {
|
|
36
|
+
const data = await apiGet("/api/ads/google/library/account-status", {
|
|
37
|
+
accountId: args.accountId,
|
|
38
|
+
});
|
|
39
|
+
writeAdsJson({ ok: true, data });
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
const searchAds = defineCommand({
|
|
43
|
+
meta: {
|
|
44
|
+
name: "search-ads",
|
|
45
|
+
description: "Search and filter Google ads for an account",
|
|
46
|
+
},
|
|
47
|
+
args: {
|
|
48
|
+
accountId: {
|
|
49
|
+
type: "positional",
|
|
50
|
+
description: "Account ID to search in",
|
|
51
|
+
required: true,
|
|
52
|
+
},
|
|
53
|
+
search: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Search term for ad text",
|
|
56
|
+
},
|
|
57
|
+
isActive: {
|
|
58
|
+
type: "boolean",
|
|
59
|
+
description: "Filter by active ads only",
|
|
60
|
+
},
|
|
61
|
+
mediaType: {
|
|
62
|
+
type: "string",
|
|
63
|
+
description: "Filter by media type (image, video, text)",
|
|
64
|
+
},
|
|
65
|
+
sort: {
|
|
66
|
+
type: "string",
|
|
67
|
+
description: "Sort by newest or oldest",
|
|
68
|
+
},
|
|
69
|
+
limit: {
|
|
70
|
+
type: "string",
|
|
71
|
+
description: "Maximum number of ads to return (default 20)",
|
|
72
|
+
},
|
|
73
|
+
cursor: {
|
|
74
|
+
type: "string",
|
|
75
|
+
description: "Pagination cursor",
|
|
76
|
+
},
|
|
77
|
+
output: { type: "string", description: "Format: json|csv|md", default: "json" },
|
|
78
|
+
},
|
|
79
|
+
async run({ args }) {
|
|
80
|
+
const data = await apiPost("/api/ads/google/library/ads/search", {
|
|
81
|
+
accountId: args.accountId,
|
|
82
|
+
search: args.search,
|
|
83
|
+
isActive: args.isActive,
|
|
84
|
+
mediaType: args.mediaType,
|
|
85
|
+
sort: args.sort,
|
|
86
|
+
numItems: args.limit ? Number.parseInt(args.limit, 10) : undefined,
|
|
87
|
+
cursor: args.cursor,
|
|
88
|
+
});
|
|
89
|
+
if (args.output !== "json" && Array.isArray(data.page)) {
|
|
90
|
+
writeAdsOutput(data.page, args.output);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
writeAdsJson({ ok: true, data });
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
const searchAdvertiser = defineCommand({
|
|
98
|
+
meta: {
|
|
99
|
+
name: "search-advertiser",
|
|
100
|
+
description: "Search for an advertiser on the Google Ads Transparency Center",
|
|
101
|
+
},
|
|
102
|
+
args: {
|
|
103
|
+
query: {
|
|
104
|
+
type: "positional",
|
|
105
|
+
description: "Company name or domain to search for",
|
|
106
|
+
required: true,
|
|
107
|
+
},
|
|
108
|
+
output: { type: "string", description: "Format: json|csv|md", default: "json" },
|
|
109
|
+
},
|
|
110
|
+
async run({ args }) {
|
|
111
|
+
const data = await apiPost("/api/ads/google/library/search-advertiser", {
|
|
112
|
+
query: args.query,
|
|
113
|
+
});
|
|
114
|
+
if (args.output !== "json" && Array.isArray(data.results)) {
|
|
115
|
+
writeAdsOutput(data.results, args.output);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
writeAdsJson({ ok: true, data });
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
function sleep(ms) {
|
|
123
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
124
|
+
}
|
|
125
|
+
const track = defineCommand({
|
|
126
|
+
meta: {
|
|
127
|
+
name: "track",
|
|
128
|
+
description: "Track a new Google advertiser (from search results). Waits for initial sync to complete before returning.",
|
|
129
|
+
},
|
|
130
|
+
args: {
|
|
131
|
+
id: {
|
|
132
|
+
type: "positional",
|
|
133
|
+
description: "Google Advertiser ID (e.g. AR123...)",
|
|
134
|
+
required: true,
|
|
135
|
+
},
|
|
136
|
+
name: {
|
|
137
|
+
type: "positional",
|
|
138
|
+
description: "Display name for the advertiser",
|
|
139
|
+
required: true,
|
|
140
|
+
},
|
|
141
|
+
json: {
|
|
142
|
+
type: "boolean",
|
|
143
|
+
description: "Output in JSON format",
|
|
144
|
+
},
|
|
145
|
+
},
|
|
146
|
+
async run({ args }) {
|
|
147
|
+
const data = await apiPost("/api/ads/google/library/track", {
|
|
148
|
+
id: args.id,
|
|
149
|
+
name: args.name,
|
|
150
|
+
});
|
|
151
|
+
process.stderr.write(`Tracking "${args.name}" (${args.id}). Syncing ads...\n`);
|
|
152
|
+
const deadline = Date.now() + 600_000;
|
|
153
|
+
while (Date.now() < deadline) {
|
|
154
|
+
await sleep(5_000);
|
|
155
|
+
const status = await apiGet("/api/ads/google/library/account-status", {
|
|
156
|
+
accountId: data.accountId,
|
|
157
|
+
});
|
|
158
|
+
if (!status.syncStatus) {
|
|
159
|
+
process.stderr.write(`Sync complete. ${status.totalAdCount ?? 0} ads (${status.activeAdCount ?? 0} active)\n`);
|
|
160
|
+
if (args.json) {
|
|
161
|
+
writeAdsJson({ ok: true, data: { ...data, ...status } });
|
|
162
|
+
}
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
if (status.syncStatus === "error") {
|
|
166
|
+
process.stderr.write("Sync failed.\n");
|
|
167
|
+
writeAdsJson({ ok: false, error: { code: "SYNC_ERROR", message: "Initial sync failed" } });
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
process.stderr.write(` syncing...\n`);
|
|
171
|
+
}
|
|
172
|
+
process.stderr.write("Sync timed out after 10 minutes.\n");
|
|
173
|
+
writeAdsJson({
|
|
174
|
+
ok: false,
|
|
175
|
+
error: { code: "TIMEOUT", message: "Sync did not complete within 10 minutes" },
|
|
176
|
+
});
|
|
177
|
+
process.exit(1);
|
|
178
|
+
},
|
|
179
|
+
});
|
|
180
|
+
const sync = defineCommand({
|
|
181
|
+
meta: {
|
|
182
|
+
name: "sync",
|
|
183
|
+
description: "Trigger an immediate sync for a Google account. Waits for completion before returning.",
|
|
184
|
+
},
|
|
185
|
+
args: {
|
|
186
|
+
accountId: {
|
|
187
|
+
type: "positional",
|
|
188
|
+
description: "Account ID to sync",
|
|
189
|
+
required: true,
|
|
190
|
+
},
|
|
191
|
+
output: { type: "string", description: "Format: json", default: "json" },
|
|
192
|
+
},
|
|
193
|
+
async run({ args }) {
|
|
194
|
+
await apiPost("/api/ads/google/library/sync", {
|
|
195
|
+
accountId: args.accountId,
|
|
196
|
+
});
|
|
197
|
+
process.stderr.write("Sync started. Polling...\n");
|
|
198
|
+
const deadline = Date.now() + 600_000;
|
|
199
|
+
while (Date.now() < deadline) {
|
|
200
|
+
await sleep(5_000);
|
|
201
|
+
const status = await apiGet("/api/ads/google/library/account-status", {
|
|
202
|
+
accountId: args.accountId,
|
|
203
|
+
});
|
|
204
|
+
if (!status.syncStatus) {
|
|
205
|
+
process.stderr.write(`Sync complete. ${status.totalAdCount ?? 0} ads (${status.activeAdCount ?? 0} active)\n`);
|
|
206
|
+
if (args.output === "json") {
|
|
207
|
+
writeAdsJson({ ok: true, data: status });
|
|
208
|
+
}
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (status.syncStatus === "error") {
|
|
212
|
+
process.stderr.write("Sync failed.\n");
|
|
213
|
+
writeAdsJson({ ok: false, error: { code: "SYNC_ERROR", message: "Sync failed" } });
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
process.stderr.write(" syncing...\n");
|
|
217
|
+
}
|
|
218
|
+
process.stderr.write("Sync timed out after 10 minutes.\n");
|
|
219
|
+
writeAdsJson({ ok: false, error: { code: "TIMEOUT", message: "Sync did not complete within 10 minutes" } });
|
|
220
|
+
process.exit(1);
|
|
221
|
+
},
|
|
222
|
+
});
|
|
223
|
+
const searchCompetitors = defineCommand({
|
|
224
|
+
meta: {
|
|
225
|
+
name: "search-competitors",
|
|
226
|
+
description: "Search for competitors running Google ads for a keyword (DataForSEO)",
|
|
227
|
+
},
|
|
228
|
+
args: {
|
|
229
|
+
keyword: {
|
|
230
|
+
type: "positional",
|
|
231
|
+
description: "Keyword to search for",
|
|
232
|
+
required: true,
|
|
233
|
+
},
|
|
234
|
+
location: {
|
|
235
|
+
type: "string",
|
|
236
|
+
description: "Location (name or code)",
|
|
237
|
+
},
|
|
238
|
+
json: {
|
|
239
|
+
type: "boolean",
|
|
240
|
+
description: "Output in JSON format",
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
async run({ args }) {
|
|
244
|
+
const data = await apiPost("/api/research/advertisers", {
|
|
245
|
+
keyword: args.keyword,
|
|
246
|
+
location: args.location,
|
|
247
|
+
});
|
|
248
|
+
if (args.json) {
|
|
249
|
+
writeAdsJson({ ok: true, data });
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
writeAdsOutput(data, "md");
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
export const library = defineCommand({
|
|
257
|
+
meta: {
|
|
258
|
+
name: "library",
|
|
259
|
+
description: "Manage and search the Google Ads Library",
|
|
260
|
+
},
|
|
261
|
+
subCommands: {
|
|
262
|
+
"list-advertisers": listAdvertisers,
|
|
263
|
+
"sync-status": syncStatus,
|
|
264
|
+
"search-ads": searchAds,
|
|
265
|
+
"search-advertiser": searchAdvertiser,
|
|
266
|
+
"search-competitors": searchCompetitors,
|
|
267
|
+
track: track,
|
|
268
|
+
sync: sync,
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/commands/ads/google/library/index.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;
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/ga4/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,qDAoBrB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { auditCommand } from "./audit.js";
|
|
3
|
+
import { propertiesCommand } from "./properties.js";
|
|
4
|
+
import { queryCommand } from "./query.js";
|
|
5
|
+
export const ga4Command = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "ga4",
|
|
8
|
+
description: `Google Analytics 4 commands. Audit property config, run playbook-aligned reports.
|
|
9
|
+
|
|
10
|
+
Start here:
|
|
11
|
+
baker ga4 properties — list accessible properties
|
|
12
|
+
baker ga4 query --list-presets — see available report presets
|
|
13
|
+
|
|
14
|
+
Examples:
|
|
15
|
+
baker ga4 audit — full property health check
|
|
16
|
+
baker ga4 query --preset tracking-health — compare GA4 vs GAds data
|
|
17
|
+
baker ga4 query --preset lp-performance --days 14 — landing page UX audit
|
|
18
|
+
baker ga4 query --dimensions "date" --metrics "sessions" --days 7 — free-form query`,
|
|
19
|
+
},
|
|
20
|
+
subCommands: {
|
|
21
|
+
properties: propertiesCommand,
|
|
22
|
+
audit: auditCommand,
|
|
23
|
+
query: queryCommand,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/ga4/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;IACtC,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK;QACX,WAAW,EAAE;;;;;;;;;;uFAUsE;KACpF;IACD,WAAW,EAAE;QACX,UAAU,EAAE,iBAAiB;QAC7B,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,YAAY;KACpB;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../src/commands/ga4/presets.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,EA+BlC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const GA4_PRESETS = [
|
|
2
|
+
{
|
|
3
|
+
name: "tracking-health",
|
|
4
|
+
description: "Compare GA4 sessions to GAds clicks — flag >20% discrepancy",
|
|
5
|
+
playbook: "[07] Discrepancy Check",
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
name: "lp-performance",
|
|
9
|
+
description: "Landing page UX diagnostic — flag duration <10s as message mismatch",
|
|
10
|
+
playbook: "[06] LP Diagnostic",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: "traffic-quality",
|
|
14
|
+
description: "Warm traffic trap — flag >40% returning user conversions",
|
|
15
|
+
playbook: "[06] Warm Traffic Trap",
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "funnel-leakage",
|
|
19
|
+
description: "Funnel drop-off analysis between form events",
|
|
20
|
+
playbook: "[06] Funnel Analysis",
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "first-touch",
|
|
24
|
+
description: "First-touch attribution — true acquisition value of channels",
|
|
25
|
+
playbook: "First-Touch Attribution",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "traffic-overview",
|
|
29
|
+
description: "General traffic trends by date and source",
|
|
30
|
+
playbook: "General",
|
|
31
|
+
},
|
|
32
|
+
];
|
|
33
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../src/commands/ga4/presets.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,6DAA6D;QAC1E,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,qEAAqE;QAClF,QAAQ,EAAE,oBAAoB;KAC/B;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EAAE,0DAA0D;QACvE,QAAQ,EAAE,wBAAwB;KACnC;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,8CAA8C;QAC3D,QAAQ,EAAE,sBAAsB;KACjC;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,8DAA8D;QAC3E,QAAQ,EAAE,yBAAyB;KACpC;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,2CAA2C;QACxD,QAAQ,EAAE,SAAS;KACpB;CACF,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const propertiesCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "no-cache": {
|
|
3
|
+
readonly type: "boolean";
|
|
4
|
+
readonly description: "Skip cache";
|
|
5
|
+
readonly required: false;
|
|
6
|
+
};
|
|
7
|
+
readonly output: {
|
|
8
|
+
readonly type: "string";
|
|
9
|
+
readonly description: "Format: json|csv|md";
|
|
10
|
+
readonly required: false;
|
|
11
|
+
readonly default: "json";
|
|
12
|
+
};
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=properties.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../../src/commands/ga4/properties.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;EA+C5B,CAAC"}
|