@koda-sl/baker-cli 0.15.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 (67) hide show
  1. package/README.md +167 -3
  2. package/dist/cli.js +5 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/ads/google/accounts.d.ts.map +1 -1
  5. package/dist/commands/ads/google/accounts.js +7 -4
  6. package/dist/commands/ads/google/accounts.js.map +1 -1
  7. package/dist/commands/ads/output.d.ts +1 -0
  8. package/dist/commands/ads/output.d.ts.map +1 -1
  9. package/dist/commands/ads/output.js +18 -15
  10. package/dist/commands/ads/output.js.map +1 -1
  11. package/dist/commands/ga4/audit.d.ts +13 -0
  12. package/dist/commands/ga4/audit.d.ts.map +1 -0
  13. package/dist/commands/ga4/audit.js +67 -0
  14. package/dist/commands/ga4/audit.js.map +1 -0
  15. package/dist/commands/ga4/index.d.ts +2 -0
  16. package/dist/commands/ga4/index.d.ts.map +1 -0
  17. package/dist/commands/ga4/index.js +26 -0
  18. package/dist/commands/ga4/index.js.map +1 -0
  19. package/dist/commands/ga4/presets.d.ts +8 -0
  20. package/dist/commands/ga4/presets.d.ts.map +1 -0
  21. package/dist/commands/ga4/presets.js +33 -0
  22. package/dist/commands/ga4/presets.js.map +1 -0
  23. package/dist/commands/ga4/properties.d.ts +14 -0
  24. package/dist/commands/ga4/properties.d.ts.map +1 -0
  25. package/dist/commands/ga4/properties.js +61 -0
  26. package/dist/commands/ga4/properties.js.map +1 -0
  27. package/dist/commands/ga4/query.d.ts +69 -0
  28. package/dist/commands/ga4/query.d.ts.map +1 -0
  29. package/dist/commands/ga4/query.js +184 -0
  30. package/dist/commands/ga4/query.js.map +1 -0
  31. package/dist/commands/ga4/resolve.d.ts +2 -0
  32. package/dist/commands/ga4/resolve.d.ts.map +1 -0
  33. package/dist/commands/ga4/resolve.js +57 -0
  34. package/dist/commands/ga4/resolve.js.map +1 -0
  35. package/dist/commands/gsc/index.d.ts +2 -0
  36. package/dist/commands/gsc/index.d.ts.map +1 -0
  37. package/dist/commands/gsc/index.js +26 -0
  38. package/dist/commands/gsc/index.js.map +1 -0
  39. package/dist/commands/gsc/presets.d.ts +9 -0
  40. package/dist/commands/gsc/presets.d.ts.map +1 -0
  41. package/dist/commands/gsc/presets.js +34 -0
  42. package/dist/commands/gsc/presets.js.map +1 -0
  43. package/dist/commands/gsc/query.d.ts +79 -0
  44. package/dist/commands/gsc/query.d.ts.map +1 -0
  45. package/dist/commands/gsc/query.js +196 -0
  46. package/dist/commands/gsc/query.js.map +1 -0
  47. package/dist/commands/gsc/resolve.d.ts +2 -0
  48. package/dist/commands/gsc/resolve.d.ts.map +1 -0
  49. package/dist/commands/gsc/resolve.js +57 -0
  50. package/dist/commands/gsc/resolve.js.map +1 -0
  51. package/dist/commands/gsc/sitemaps.d.ts +19 -0
  52. package/dist/commands/gsc/sitemaps.d.ts.map +1 -0
  53. package/dist/commands/gsc/sitemaps.js +65 -0
  54. package/dist/commands/gsc/sitemaps.js.map +1 -0
  55. package/dist/commands/gsc/sites.d.ts +14 -0
  56. package/dist/commands/gsc/sites.d.ts.map +1 -0
  57. package/dist/commands/gsc/sites.js +61 -0
  58. package/dist/commands/gsc/sites.js.map +1 -0
  59. package/dist/env.d.ts +2 -0
  60. package/dist/env.d.ts.map +1 -1
  61. package/dist/env.js +2 -0
  62. package/dist/env.js.map +1 -1
  63. package/dist/error-handler.d.ts +8 -0
  64. package/dist/error-handler.d.ts.map +1 -0
  65. package/dist/error-handler.js +37 -0
  66. package/dist/error-handler.js.map +1 -0
  67. package/package.json +1 -1
@@ -0,0 +1,196 @@
1
+ import { appendFileSync, existsSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { defineCommand } from "citty";
4
+ import { ApiError, apiPost } from "../../client.js";
5
+ import { registerSchema } from "../../schemas.js";
6
+ import { buildQueryCacheKey, cacheGet, cacheSet, getQueryTtl } from "../ads/cache.js";
7
+ import { toCsvRow, writeAdsOutput, writeJsonEnvelope } from "../ads/output.js";
8
+ import { GSC_PRESETS } from "./presets.js";
9
+ import { resolveSiteUrl } from "./resolve.js";
10
+ registerSchema({
11
+ command: "gsc.query",
12
+ description: "Run GSC Search Analytics queries. Use --preset for playbook-aligned queries (primary usage) or --dimensions for free-form queries.",
13
+ args: {
14
+ "site-url": { type: "string", description: "Site URL (auto-resolved if not provided)", required: false },
15
+ preset: {
16
+ type: "string",
17
+ description: "Named preset (cannibalization, missed-revenue, brand-halo, negative-keywords, top-pages, top-queries)",
18
+ required: false,
19
+ },
20
+ brand: { type: "string", description: "Brand name (required for brand-halo preset)", required: false },
21
+ dimensions: {
22
+ type: "string",
23
+ description: "Comma-separated dimensions (escape hatch: query, page, country, device, date)",
24
+ required: false,
25
+ },
26
+ days: { type: "string", description: "Lookback window in days (default: 28)", required: false },
27
+ "start-date": { type: "string", description: "Explicit start date (YYYY-MM-DD)", required: false },
28
+ "end-date": { type: "string", description: "Explicit end date (YYYY-MM-DD)", required: false },
29
+ "row-limit": { type: "string", description: "Max rows (default: 1000, max: 25000)", required: false },
30
+ type: { type: "string", description: "Search type: web|image|video|news|discover (default: web)", required: false },
31
+ filter: { type: "string", description: "Dimension filter groups as JSON string", required: false },
32
+ "list-presets": { type: "boolean", description: "List available presets", required: false },
33
+ out: { type: "string", description: "Write data to file (.csv, .jsonl, .json)", required: false },
34
+ append: { type: "boolean", description: "Append to existing file", required: false },
35
+ output: { type: "string", description: "Format: json|csv|jsonl|md", required: false, default: "json" },
36
+ "no-cache": { type: "boolean", description: "Skip cache", required: false },
37
+ },
38
+ });
39
+ function extractFields(rows) {
40
+ const first = rows[0];
41
+ return first ? Object.keys(first) : [];
42
+ }
43
+ function writeRowsToFile(filePath, rows, append) {
44
+ const fields = extractFields(rows);
45
+ const ext = filePath.split(".").pop()?.toLowerCase();
46
+ if (ext === "csv") {
47
+ if (!append || !existsSync(filePath)) {
48
+ writeFileSync(filePath, `${toCsvRow(fields)}\n`, "utf-8");
49
+ }
50
+ const csvRows = rows.map((row) => toCsvRow(fields.map((f) => String(row[f] ?? ""))));
51
+ appendFileSync(filePath, `${csvRows.join("\n")}\n`, "utf-8");
52
+ }
53
+ else if (ext === "jsonl") {
54
+ const content = `${rows.map((row) => JSON.stringify(row)).join("\n")}\n`;
55
+ if (append && existsSync(filePath)) {
56
+ appendFileSync(filePath, content, "utf-8");
57
+ }
58
+ else {
59
+ writeFileSync(filePath, content, "utf-8");
60
+ }
61
+ }
62
+ else if (append && existsSync(filePath)) {
63
+ const existing = JSON.parse(readFileSync(filePath, "utf-8"));
64
+ writeFileSync(filePath, JSON.stringify([...existing, ...rows], null, 2), "utf-8");
65
+ }
66
+ else {
67
+ writeFileSync(filePath, JSON.stringify(rows, null, 2), "utf-8");
68
+ }
69
+ }
70
+ function outputRows(rows, args, response, cached) {
71
+ if (args.out) {
72
+ const filePath = resolve(args.out);
73
+ writeRowsToFile(filePath, rows, !!args.append);
74
+ writeJsonEnvelope({ ok: true, file: filePath, rows: rows.length, ...(cached && { cached: true }) });
75
+ return;
76
+ }
77
+ const format = args.output || "json";
78
+ if (format !== "json") {
79
+ writeAdsOutput(rows, format);
80
+ return;
81
+ }
82
+ writeJsonEnvelope({ ...response, ...(cached && { cached: true }) });
83
+ }
84
+ function buildRequestBody(args, siteUrl, useCache) {
85
+ const body = { siteUrl };
86
+ if (args.preset)
87
+ body.preset = args.preset;
88
+ if (args.brand)
89
+ body.brand = args.brand;
90
+ if (args.dimensions)
91
+ body.dimensions = args.dimensions.split(",").map((d) => d.trim());
92
+ if (args.days)
93
+ body.days = Number(args.days);
94
+ if (args["start-date"])
95
+ body.startDate = args["start-date"];
96
+ if (args["end-date"])
97
+ body.endDate = args["end-date"];
98
+ if (args["row-limit"])
99
+ body.rowLimit = Number(args["row-limit"]);
100
+ if (args.type)
101
+ body.type = args.type;
102
+ if (args.filter)
103
+ body.filter = args.filter;
104
+ if (!useCache)
105
+ body.skipCache = true;
106
+ return body;
107
+ }
108
+ function handleError(err) {
109
+ if (err instanceof ApiError) {
110
+ writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
111
+ process.exit(1);
112
+ }
113
+ writeJsonEnvelope({
114
+ ok: false,
115
+ error: { code: "NETWORK_ERROR", message: err instanceof Error ? err.message : "Unexpected error" },
116
+ });
117
+ process.exit(1);
118
+ }
119
+ export const queryCommand = defineCommand({
120
+ meta: {
121
+ name: "query",
122
+ description: `Run GSC Search Analytics queries. Preset-first with free-form escape hatch.
123
+
124
+ Presets (primary usage):
125
+ baker gsc query --preset cannibalization
126
+ baker gsc query --preset brand-halo --brand "Acme" --days 90
127
+ baker gsc query --list-presets
128
+
129
+ Free-form (escape hatch):
130
+ baker gsc query --dimensions "query,page" --days 28
131
+ baker gsc query --dimensions "query" --row-limit 25000 --out keywords.csv`,
132
+ },
133
+ args: {
134
+ "site-url": { type: "string", description: "Site URL", required: false },
135
+ preset: { type: "string", description: "Named preset", required: false },
136
+ brand: { type: "string", description: "Brand name for brand-halo preset", required: false },
137
+ dimensions: { type: "string", description: "Comma-separated dimensions", required: false },
138
+ days: { type: "string", description: "Lookback days (default: 28)", required: false },
139
+ "start-date": { type: "string", description: "Start date override", required: false },
140
+ "end-date": { type: "string", description: "End date override", required: false },
141
+ "row-limit": { type: "string", description: "Max rows (default: 1000)", required: false },
142
+ type: { type: "string", description: "Search type (default: web)", required: false },
143
+ filter: { type: "string", description: "Filter JSON", required: false },
144
+ "list-presets": { type: "boolean", description: "List presets", required: false },
145
+ out: { type: "string", description: "Output file path", required: false },
146
+ append: { type: "boolean", description: "Append to file", required: false },
147
+ output: { type: "string", description: "Format: json|csv|jsonl|md", required: false, default: "json" },
148
+ "no-cache": { type: "boolean", description: "Skip cache", required: false },
149
+ },
150
+ run: async ({ args }) => {
151
+ if (args["list-presets"]) {
152
+ writeJsonEnvelope({
153
+ ok: true,
154
+ data: GSC_PRESETS.map((p) => ({
155
+ name: p.name,
156
+ description: p.description,
157
+ playbook: p.playbook,
158
+ ...(p.requiresBrand && { requiresBrand: true }),
159
+ })),
160
+ });
161
+ return;
162
+ }
163
+ if (!args.preset && !args.dimensions) {
164
+ writeJsonEnvelope({
165
+ ok: false,
166
+ error: {
167
+ code: "VALIDATION_ERROR",
168
+ message: "Provide --preset or --dimensions. Run --list-presets to see options.",
169
+ },
170
+ });
171
+ process.exit(1);
172
+ }
173
+ const siteUrl = await resolveSiteUrl(args);
174
+ const useCache = !args["no-cache"];
175
+ const body = buildRequestBody(args, siteUrl, useCache);
176
+ const cacheKey = buildQueryCacheKey(siteUrl, JSON.stringify(body));
177
+ if (useCache) {
178
+ const cached = cacheGet("gsc-queries", cacheKey);
179
+ if (cached) {
180
+ outputRows(cached.data.data ?? [], args, cached.data, true);
181
+ return;
182
+ }
183
+ }
184
+ try {
185
+ const response = await apiPost("/api/gsc/query", body);
186
+ if (useCache) {
187
+ cacheSet("gsc-queries", cacheKey, response, getQueryTtl(JSON.stringify(body)));
188
+ }
189
+ outputRows(response.data ?? [], args, response, false);
190
+ }
191
+ catch (err) {
192
+ handleError(err);
193
+ }
194
+ },
195
+ });
196
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/commands/gsc/query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function resolveSiteUrl(args: Record<string, unknown>): Promise<string>;
2
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/commands/gsc/resolve.ts"],"names":[],"mappings":"AAyBA,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCnF"}
@@ -0,0 +1,57 @@
1
+ import { apiGet } from "../../client.js";
2
+ import { getEnv } from "../../env.js";
3
+ import { cacheGet, cacheSet } from "../ads/cache.js";
4
+ import { writeJsonEnvelope } from "../ads/output.js";
5
+ async function fetchSites(useCache = true) {
6
+ if (useCache) {
7
+ const cached = cacheGet("gsc-sites", "list");
8
+ if (cached)
9
+ return cached.data;
10
+ }
11
+ const params = !useCache ? { "skip-cache": "true" } : undefined;
12
+ const data = await apiGet("/api/gsc/sites", params);
13
+ if (useCache) {
14
+ cacheSet("gsc-sites", "list", data, 60 * 60 * 1000);
15
+ }
16
+ return data;
17
+ }
18
+ import { handleConnectionError } from "../../error-handler.js";
19
+ export async function resolveSiteUrl(args) {
20
+ const fromArgs = args["site-url"];
21
+ const fromEnv = getEnv().BAKER_GSC_SITE_URL;
22
+ const siteUrl = fromArgs || fromEnv;
23
+ if (siteUrl)
24
+ return siteUrl;
25
+ const useCache = !args["no-cache"];
26
+ try {
27
+ const sites = await fetchSites(useCache);
28
+ const [single] = sites;
29
+ if (sites.length === 1 && single) {
30
+ process.stderr.write(`Using site "${single.siteUrl}"\n`);
31
+ return single.siteUrl;
32
+ }
33
+ if (sites.length === 0) {
34
+ handleConnectionError("gsc");
35
+ }
36
+ const list = sites.map((s) => ` ${s.siteUrl} (${s.permissionLevel})`).join("\n");
37
+ writeJsonEnvelope({
38
+ ok: false,
39
+ error: {
40
+ code: "MULTIPLE_SITES",
41
+ message: `Multiple sites found. Pass --site-url or set BAKER_GSC_SITE_URL:\n${list}`,
42
+ },
43
+ });
44
+ process.exit(1);
45
+ }
46
+ catch {
47
+ writeJsonEnvelope({
48
+ ok: false,
49
+ error: {
50
+ code: "RESOLUTION_ERROR",
51
+ message: "Could not auto-detect site. Pass --site-url or set BAKER_GSC_SITE_URL.",
52
+ },
53
+ });
54
+ process.exit(1);
55
+ }
56
+ }
57
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../src/commands/gsc/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,KAAK,UAAU,UAAU,CAAC,QAAQ,GAAG,IAAI;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,QAAQ,CAAY,WAAW,EAAE,MAAM,CAAC,CAAC;QACxD,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC;IACjC,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAY,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC/D,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAA6B;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAuB,CAAC;IACxD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,kBAAkB,CAAC;IAC5C,MAAM,OAAO,GAAG,QAAQ,IAAI,OAAO,CAAC;IAEpC,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAE5B,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;QACvB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;YACzD,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,iBAAiB,CAAC;YAChB,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,qEAAqE,IAAI,EAAE;aACrF;SACF,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB,CAAC;YAChB,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,wEAAwE;aAClF;SACF,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const sitemapsCommand: import("citty").CommandDef<{
2
+ readonly "site-url": {
3
+ readonly type: "string";
4
+ readonly description: "Site URL";
5
+ readonly required: false;
6
+ };
7
+ readonly "no-cache": {
8
+ readonly type: "boolean";
9
+ readonly description: "Skip cache";
10
+ readonly required: false;
11
+ };
12
+ readonly output: {
13
+ readonly type: "string";
14
+ readonly description: "Format: json|csv|md";
15
+ readonly required: false;
16
+ readonly default: "json";
17
+ };
18
+ }>;
19
+ //# sourceMappingURL=sitemaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemaps.d.ts","sourceRoot":"","sources":["../../../src/commands/gsc/sitemaps.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;EAiD1B,CAAC"}
@@ -0,0 +1,65 @@
1
+ import { defineCommand } from "citty";
2
+ import { ApiError, apiGet } from "../../client.js";
3
+ import { registerSchema } from "../../schemas.js";
4
+ import { cacheGet, cacheSet } from "../ads/cache.js";
5
+ import { writeAdsOutput, writeJsonEnvelope } from "../ads/output.js";
6
+ import { resolveSiteUrl } from "./resolve.js";
7
+ registerSchema({
8
+ command: "gsc.sitemaps",
9
+ description: "List sitemaps for a Search Console site. Check sitemap health and errors.",
10
+ args: {
11
+ "site-url": { type: "string", description: "Site URL (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 sitemapsCommand = defineCommand({
16
+ meta: {
17
+ name: "sitemaps",
18
+ description: `List sitemaps for a site. Check health and errors.
19
+
20
+ Examples:
21
+ baker gsc sitemaps
22
+ baker gsc sitemaps --site-url "https://example.com/"`,
23
+ },
24
+ args: {
25
+ "site-url": { type: "string", description: "Site URL", required: false },
26
+ "no-cache": { type: "boolean", description: "Skip cache", required: false },
27
+ output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" },
28
+ },
29
+ run: async ({ args }) => {
30
+ const siteUrl = await resolveSiteUrl(args);
31
+ const useCache = !args["no-cache"];
32
+ const cacheKey = `sitemaps:${siteUrl}`;
33
+ if (useCache) {
34
+ const cached = cacheGet("gsc-sitemaps", cacheKey);
35
+ if (cached) {
36
+ writeJsonEnvelope({ ok: true, data: cached.data, cached: true });
37
+ return;
38
+ }
39
+ }
40
+ try {
41
+ const params = { "site-url": siteUrl };
42
+ if (!useCache)
43
+ params["skip-cache"] = "true";
44
+ const data = await apiGet("/api/gsc/sitemaps", params);
45
+ if (useCache) {
46
+ cacheSet("gsc-sitemaps", cacheKey, data, 6 * 60 * 60 * 1000);
47
+ }
48
+ const format = args.output || "json";
49
+ if (format !== "json") {
50
+ writeAdsOutput(data, format);
51
+ return;
52
+ }
53
+ writeJsonEnvelope({ ok: true, data });
54
+ }
55
+ catch (err) {
56
+ if (err instanceof ApiError) {
57
+ writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
58
+ process.exit(1);
59
+ }
60
+ writeJsonEnvelope({ ok: false, error: { code: "NETWORK_ERROR", message: "Unexpected error" } });
61
+ process.exit(1);
62
+ }
63
+ },
64
+ });
65
+ //# sourceMappingURL=sitemaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemaps.js","sourceRoot":"","sources":["../../../src/commands/gsc/sitemaps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare const sitesCommand: 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=sites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sites.d.ts","sourceRoot":"","sources":["../../../src/commands/gsc/sites.ts"],"names":[],"mappings":"AAsBA,eAAO,MAAM,YAAY;;;;;;;;;;;;EA+CvB,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { defineCommand } from "citty";
2
+ import { ApiError, apiGet } from "../../client.js";
3
+ import { registerSchema } from "../../schemas.js";
4
+ import { cacheGet, cacheSet } from "../ads/cache.js";
5
+ import { writeAdsOutput, writeJsonEnvelope } from "../ads/output.js";
6
+ registerSchema({
7
+ command: "gsc.sites",
8
+ description: "List all verified Google Search Console sites. Returns site URLs needed for query and sitemaps commands.",
9
+ args: {
10
+ "no-cache": { type: "boolean", description: "Skip cache, hit API directly", required: false },
11
+ },
12
+ });
13
+ import { handleConnectionError } from "../../error-handler.js";
14
+ export const sitesCommand = defineCommand({
15
+ meta: {
16
+ name: "sites",
17
+ description: `List verified Search Console sites.
18
+
19
+ Examples:
20
+ baker gsc sites`,
21
+ },
22
+ args: {
23
+ "no-cache": { type: "boolean", description: "Skip cache", required: false },
24
+ output: { type: "string", description: "Format: json|csv|md", required: false, default: "json" },
25
+ },
26
+ run: async ({ args }) => {
27
+ const useCache = !args["no-cache"];
28
+ if (useCache) {
29
+ const cached = cacheGet("gsc-sites", "list");
30
+ if (cached) {
31
+ writeJsonEnvelope({ ok: true, data: cached.data, cached: true });
32
+ return;
33
+ }
34
+ }
35
+ try {
36
+ const params = !useCache ? { "skip-cache": "true" } : undefined;
37
+ const data = await apiGet("/api/gsc/sites", params);
38
+ if (useCache) {
39
+ cacheSet("gsc-sites", "list", data, 60 * 60 * 1000);
40
+ }
41
+ const format = args.output || "json";
42
+ if (format !== "json") {
43
+ writeAdsOutput(data, format);
44
+ return;
45
+ }
46
+ writeJsonEnvelope({ ok: true, data });
47
+ }
48
+ catch (err) {
49
+ if (err instanceof ApiError) {
50
+ if (err.code === "UNAUTHORIZED" || err.code === "NOT_FOUND") {
51
+ handleConnectionError("gsc", err.message);
52
+ }
53
+ writeJsonEnvelope({ ok: false, error: { code: err.code, message: err.message } });
54
+ process.exit(1);
55
+ }
56
+ writeJsonEnvelope({ ok: false, error: { code: "NETWORK_ERROR", message: "Unexpected error" } });
57
+ process.exit(1);
58
+ }
59
+ },
60
+ });
61
+ //# sourceMappingURL=sites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sites.js","sourceRoot":"","sources":["../../../src/commands/gsc/sites.ts"],"names":[],"mappings":"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"}
package/dist/env.d.ts CHANGED
@@ -2,6 +2,8 @@ type Env = {
2
2
  BAKER_API_KEY: string;
3
3
  BAKER_API_URL: string;
4
4
  BAKER_GOOGLE_ADS_CUSTOMER_ID?: string;
5
+ BAKER_GA4_PROPERTY_ID?: string;
6
+ BAKER_GSC_SITE_URL?: string;
5
7
  };
6
8
  export declare function getEnv(): Env;
7
9
  export {};
package/dist/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,KAAK,GAAG,GAAG;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B,CAAC,EAAE,MAAM,CAAC;CACvC,CAAC;AAIF,wBAAgB,MAAM,IAAI,GAAG,CAe5B"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,KAAK,GAAG,GAAG;IACT,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAIF,wBAAgB,MAAM,IAAI,GAAG,CAiB5B"}
package/dist/env.js CHANGED
@@ -11,6 +11,8 @@ export function getEnv() {
11
11
  .string()
12
12
  .regex(/^\d{10}$/)
13
13
  .optional(),
14
+ BAKER_GA4_PROPERTY_ID: z.string().optional(),
15
+ BAKER_GSC_SITE_URL: z.string().optional(),
14
16
  },
15
17
  runtimeEnv: process.env,
16
18
  });
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,IAAI,MAAuB,CAAC;AAE5B,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,SAAS,CAAC;YACjB,MAAM,EAAE;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,+BAA+B,CAAC;gBAC5E,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,mCAAmC,CAAC;gBACzD,4BAA4B,EAAE,CAAC;qBAC5B,MAAM,EAAE;qBACR,KAAK,CAAC,UAAU,CAAC;qBACjB,QAAQ,EAAE;aACd;YACD,UAAU,EAAE,OAAO,CAAC,GAAG;SACxB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,IAAI,MAAuB,CAAC;AAE5B,MAAM,UAAU,MAAM;IACpB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,SAAS,CAAC;YACjB,MAAM,EAAE;gBACN,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,+BAA+B,CAAC;gBAC5E,aAAa,EAAE,CAAC,CAAC,GAAG,CAAC,mCAAmC,CAAC;gBACzD,4BAA4B,EAAE,CAAC;qBAC5B,MAAM,EAAE;qBACR,KAAK,CAAC,UAAU,CAAC;qBACjB,QAAQ,EAAE;gBACb,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC1C;YACD,UAAU,EAAE,OAAO,CAAC,GAAG;SACxB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,8 @@
1
+ type ConnectionPlatform = "google_ads" | "ga4" | "gsc";
2
+ /**
3
+ * Shared error handler for "No Connection" scenarios.
4
+ * Provides a structured error for AI agents with a suggested fix and alternative commands.
5
+ */
6
+ export declare function handleConnectionError(platform: ConnectionPlatform, originalMessage?: string): never;
7
+ export {};
8
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAEA,KAAK,kBAAkB,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,KAAK,CAkCnG"}
@@ -0,0 +1,37 @@
1
+ import { writeJsonEnvelope } from "./commands/ads/output.js";
2
+ /**
3
+ * Shared error handler for "No Connection" scenarios.
4
+ * Provides a structured error for AI agents with a suggested fix and alternative commands.
5
+ */
6
+ export function handleConnectionError(platform, originalMessage) {
7
+ const platformName = {
8
+ google_ads: "Google Ads",
9
+ ga4: "Google Analytics 4",
10
+ gsc: "Google Search Console",
11
+ }[platform];
12
+ const alternative = {
13
+ google_ads: "keywords-for-site or research advertisers",
14
+ ga4: "lighthouse for page performance",
15
+ gsc: "keywords-for-site or research keyword-gap",
16
+ }[platform];
17
+ const code = {
18
+ google_ads: "NO_GOOGLE_ADS_CONNECTION",
19
+ ga4: "NO_GA4_CONNECTION",
20
+ gsc: "NO_GSC_CONNECTION",
21
+ }[platform];
22
+ const envelope = {
23
+ ok: false,
24
+ error: {
25
+ code,
26
+ message: originalMessage || `No ${platformName} connection found for this company.`,
27
+ fix: {
28
+ action: "authenticate",
29
+ explanation: `AGENT INSTRUCTION: You cannot resolve this error programmatically. The user has not connected their ${platformName} account. Step 1: Inform the user that they must connect ${platformName} in their Baker dashboard settings for direct data queries. Step 2: Do not fail the overall audit or playbook. Document the missing connection, skip this specific check, and proceed with the rest of your tasks. (Optional fallback: use 'baker research ${alternative}' for estimated external insights).`,
30
+ },
31
+ retryable: false,
32
+ },
33
+ };
34
+ writeJsonEnvelope(envelope);
35
+ process.exit(1);
36
+ }
37
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAA4B,EAAE,eAAwB;IAC1F,MAAM,YAAY,GAAG;QACnB,UAAU,EAAE,YAAY;QACxB,GAAG,EAAE,oBAAoB;QACzB,GAAG,EAAE,uBAAuB;KAC7B,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,WAAW,GAAG;QAClB,UAAU,EAAE,2CAA2C;QACvD,GAAG,EAAE,iCAAiC;QACtC,GAAG,EAAE,2CAA2C;KACjD,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,IAAI,GAAG;QACX,UAAU,EAAE,0BAA0B;QACtC,GAAG,EAAE,mBAAmB;QACxB,GAAG,EAAE,mBAAmB;KACzB,CAAC,QAAQ,CAAC,CAAC;IAEZ,MAAM,QAAQ,GAAG;QACf,EAAE,EAAE,KAAK;QACT,KAAK,EAAE;YACL,IAAI;YACJ,OAAO,EAAE,eAAe,IAAI,MAAM,YAAY,qCAAqC;YACnF,GAAG,EAAE;gBACH,MAAM,EAAE,cAAc;gBACtB,WAAW,EAAE,uGAAuG,YAAY,4DAA4D,YAAY,8PAA8P,WAAW,qCAAqC;aACvf;YACD,SAAS,EAAE,KAAK;SACjB;KACF,CAAC;IAEF,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koda-sl/baker-cli",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "AI-agent-first CLI for interacting with Baker",
5
5
  "type": "module",
6
6
  "bin": {