@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
@@ -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":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,cAAc,CAAC;IACb,OAAO,EAAE,WAAW;IACpB,WAAW,EACT,oIAAoI;IACtI,IAAI,EAAE;QACJ,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE,QAAQ,EAAE,KAAK,EAAE;QACxG,MAAM,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EACT,uGAAuG;YACzG,QAAQ,EAAE,KAAK;SAChB;QACD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6CAA6C,EAAE,QAAQ,EAAE,KAAK,EAAE;QACtG,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+EAA+E;YAC5F,QAAQ,EAAE,KAAK;SAChB;QACD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC/F,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAClG,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gCAAgC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC9F,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE,QAAQ,EAAE,KAAK,EAAE;QACrG,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2DAA2D,EAAE,QAAQ,EAAE,KAAK,EAAE;QACnH,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wCAAwC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAClG,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3F,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE,QAAQ,EAAE,KAAK,EAAE;QACjG,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,yBAAyB,EAAE,QAAQ,EAAE,KAAK,EAAE;QACpF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;QACtG,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC5E;CACF,CAAC,CAAC;AASH,SAAS,aAAa,CAAC,IAAoC;IACzD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB,EAAE,IAAoC,EAAE,MAAe;IAC9F,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IACrD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrC,aAAa,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,cAAc,CAAC,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACzE,IAAI,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,cAAc,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAc,CAAC;QAC1E,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpF,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CACjB,IAAoC,EACpC,IAA6B,EAC7B,QAA0B,EAC1B,MAAe;IAEf,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,GAAa,CAAC,CAAC;QAC7C,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/C,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACpG,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAI,IAAI,CAAC,MAAiB,IAAI,MAAM,CAAC;IACjD,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IACD,iBAAiB,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,gBAAgB,CAAC,IAA6B,EAAE,OAAe,EAAE,QAAiB;IACzF,MAAM,IAAI,GAA4B,EAAE,OAAO,EAAE,CAAC;IAClD,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACxC,IAAI,IAAI,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAI,IAAI,CAAC,UAAqB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnG,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,YAAY,CAAC;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,UAAU,CAAC;QAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,WAAW,CAAC;QAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;QAC5B,iBAAiB,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,iBAAiB,CAAC;QAChB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE;KACnG,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,OAAO;QACb,WAAW,EAAE;;;;;;;;;4EAS2D;KACzE;IACD,IAAI,EAAE;QACJ,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;QACxE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE;QACxE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3F,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC1F,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,KAAK,EAAE;QACrF,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,KAAK,EAAE;QACrF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,KAAK,EAAE;QACjF,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,0BAA0B,EAAE,QAAQ,EAAE,KAAK,EAAE;QACzF,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,KAAK,EAAE;QACpF,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;QACvE,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE;QACjF,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE;QACzE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE;QAC3E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;QACtG,UAAU,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;KAC5E;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACzB,iBAAiB,CAAC;gBAChB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;oBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;oBACpB,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBAChD,CAAC,CAAC;aACJ,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,iBAAiB,CAAC;gBAChB,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE;oBACL,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,sEAAsE;iBAChF;aACF,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAEnE,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,QAAQ,CAAmB,aAAa,EAAE,QAAQ,CAAC,CAAC;YACnE,IAAI,MAAM,EAAE,CAAC;gBACX,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC5D,OAAO;YACT,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAmB,gBAAgB,EAAE,IAAI,CAAC,CAAC;YACzE,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,UAAU,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
@@ -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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/research/index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,eAAe,qDAoC1B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/research/index.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,eAAe,qDAqC1B,CAAC"}
@@ -8,12 +8,14 @@ import { keywordsForSiteCommand } from "./keywords-for-site.js";
8
8
  import { languagesCommand } from "./languages.js";
9
9
  import { lighthouseCommand } from "./lighthouse.js";
10
10
  import { relevantPagesCommand } from "./relevant-pages.js";
11
+ import { webCommand } from "./web.js";
11
12
  export const researchCommand = defineCommand({
12
13
  meta: {
13
14
  name: "research",
14
- description: `Competitive intelligence commands powered by DataForSEO. Shows market/competitor data — who's bidding on keywords, search intent, competitor keyword lists, keyword gaps, and landing page performance.
15
+ description: `Competitive intelligence and AI-powered research commands.
15
16
 
16
17
  Commands:
18
+ web — Search the web with AI (ask any question)
17
19
  advertisers — Who's bidding on a keyword?
18
20
  autocomplete — Google Autocomplete suggestions
19
21
  intent — Google Search intent classification
@@ -25,15 +27,15 @@ Commands:
25
27
  languages — List supported language codes
26
28
 
27
29
  Examples:
30
+ baker research web "Who are the main competitors of HubSpot?"
31
+ baker research web "What is the ICP for CRM buyers?" --depth high
28
32
  baker research advertisers "running shoes"
29
- baker research autocomplete "running shoes"
30
33
  baker research intent "buy running shoes,best running shoes 2026"
31
34
  baker research keywords-for-site "competitor.com"
32
- baker research keyword-gap "them.com" "us.com"
33
- baker research relevant-pages "competitor.com"
34
- baker research lighthouse "https://example.com/landing"`,
35
+ baker research keyword-gap "them.com" "us.com"`,
35
36
  },
36
37
  subCommands: {
38
+ web: webCommand,
37
39
  advertisers: advertisersCommand,
38
40
  autocomplete: autocompleteCommand,
39
41
  countries: countriesCommand,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/research/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;0DAoByC;KACvD;IACD,WAAW,EAAE;QACX,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,mBAAmB;QACjC,SAAS,EAAE,gBAAgB;QAC3B,MAAM,EAAE,aAAa;QACrB,mBAAmB,EAAE,sBAAsB;QAC3C,aAAa,EAAE,iBAAiB;QAChC,SAAS,EAAE,gBAAgB;QAC3B,UAAU,EAAE,iBAAiB;QAC7B,gBAAgB,EAAE,oBAAoB;KACvC;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/research/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;iDAoBgC;KAC9C;IACD,WAAW,EAAE;QACX,GAAG,EAAE,UAAU;QACf,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,mBAAmB;QACjC,SAAS,EAAE,gBAAgB;QAC3B,MAAM,EAAE,aAAa;QACrB,mBAAmB,EAAE,sBAAsB;QAC3C,aAAa,EAAE,iBAAiB;QAChC,SAAS,EAAE,gBAAgB;QAC3B,UAAU,EAAE,iBAAiB;QAC7B,gBAAgB,EAAE,oBAAoB;KACvC;CACF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const webCommand: import("citty").CommandDef<{
2
+ readonly question: {
3
+ readonly type: "positional";
4
+ readonly description: "The research question";
5
+ readonly required: true;
6
+ };
7
+ readonly depth: {
8
+ readonly type: "string";
9
+ readonly description: "Research depth: medium|high|xhigh (default: medium)";
10
+ readonly required: false;
11
+ };
12
+ readonly output: {
13
+ readonly type: "string";
14
+ readonly description: "Format: json|md (default: json)";
15
+ readonly required: false;
16
+ readonly default: "json";
17
+ };
18
+ }>;
19
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../../src/commands/research/web.ts"],"names":[],"mappings":"AAsEA,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;EA6DrB,CAAC"}