@koda-sl/baker-cli 0.13.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +243 -3
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -0
- 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/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/autocomplete.d.ts +34 -0
- package/dist/commands/research/autocomplete.d.ts.map +1 -0
- package/dist/commands/research/autocomplete.js +73 -0
- package/dist/commands/research/autocomplete.js.map +1 -0
- package/dist/commands/research/index.d.ts.map +1 -1
- package/dist/commands/research/index.js +8 -0
- package/dist/commands/research/index.js.map +1 -1
- package/dist/commands/research/relevant-pages.d.ts +34 -0
- package/dist/commands/research/relevant-pages.d.ts.map +1 -0
- package/dist/commands/research/relevant-pages.js +76 -0
- package/dist/commands/research/relevant-pages.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
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export declare const queryCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "site-url": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Site URL";
|
|
5
|
+
readonly required: false;
|
|
6
|
+
};
|
|
7
|
+
readonly preset: {
|
|
8
|
+
readonly type: "string";
|
|
9
|
+
readonly description: "Named preset";
|
|
10
|
+
readonly required: false;
|
|
11
|
+
};
|
|
12
|
+
readonly brand: {
|
|
13
|
+
readonly type: "string";
|
|
14
|
+
readonly description: "Brand name for brand-halo preset";
|
|
15
|
+
readonly required: false;
|
|
16
|
+
};
|
|
17
|
+
readonly dimensions: {
|
|
18
|
+
readonly type: "string";
|
|
19
|
+
readonly description: "Comma-separated dimensions";
|
|
20
|
+
readonly required: false;
|
|
21
|
+
};
|
|
22
|
+
readonly days: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly description: "Lookback days (default: 28)";
|
|
25
|
+
readonly required: false;
|
|
26
|
+
};
|
|
27
|
+
readonly "start-date": {
|
|
28
|
+
readonly type: "string";
|
|
29
|
+
readonly description: "Start date override";
|
|
30
|
+
readonly required: false;
|
|
31
|
+
};
|
|
32
|
+
readonly "end-date": {
|
|
33
|
+
readonly type: "string";
|
|
34
|
+
readonly description: "End date override";
|
|
35
|
+
readonly required: false;
|
|
36
|
+
};
|
|
37
|
+
readonly "row-limit": {
|
|
38
|
+
readonly type: "string";
|
|
39
|
+
readonly description: "Max rows (default: 1000)";
|
|
40
|
+
readonly required: false;
|
|
41
|
+
};
|
|
42
|
+
readonly type: {
|
|
43
|
+
readonly type: "string";
|
|
44
|
+
readonly description: "Search type (default: web)";
|
|
45
|
+
readonly required: false;
|
|
46
|
+
};
|
|
47
|
+
readonly filter: {
|
|
48
|
+
readonly type: "string";
|
|
49
|
+
readonly description: "Filter JSON";
|
|
50
|
+
readonly required: false;
|
|
51
|
+
};
|
|
52
|
+
readonly "list-presets": {
|
|
53
|
+
readonly type: "boolean";
|
|
54
|
+
readonly description: "List presets";
|
|
55
|
+
readonly required: false;
|
|
56
|
+
};
|
|
57
|
+
readonly out: {
|
|
58
|
+
readonly type: "string";
|
|
59
|
+
readonly description: "Output file path";
|
|
60
|
+
readonly required: false;
|
|
61
|
+
};
|
|
62
|
+
readonly append: {
|
|
63
|
+
readonly type: "boolean";
|
|
64
|
+
readonly description: "Append to file";
|
|
65
|
+
readonly required: false;
|
|
66
|
+
};
|
|
67
|
+
readonly output: {
|
|
68
|
+
readonly type: "string";
|
|
69
|
+
readonly description: "Format: json|csv|jsonl|md";
|
|
70
|
+
readonly required: false;
|
|
71
|
+
readonly default: "json";
|
|
72
|
+
};
|
|
73
|
+
readonly "no-cache": {
|
|
74
|
+
readonly type: "boolean";
|
|
75
|
+
readonly description: "Skip cache";
|
|
76
|
+
readonly required: false;
|
|
77
|
+
};
|
|
78
|
+
}>;
|
|
79
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/commands/gsc/query.ts"],"names":[],"mappings":"AA6HA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+EvB,CAAC"}
|
|
@@ -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 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export declare const autocompleteCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly keyword: {
|
|
3
|
+
readonly type: "positional";
|
|
4
|
+
readonly description: "Seed keyword";
|
|
5
|
+
readonly required: true;
|
|
6
|
+
};
|
|
7
|
+
readonly location: {
|
|
8
|
+
readonly type: "string";
|
|
9
|
+
readonly description: "Country code or location code (default: us)";
|
|
10
|
+
readonly required: false;
|
|
11
|
+
};
|
|
12
|
+
readonly language: {
|
|
13
|
+
readonly type: "string";
|
|
14
|
+
readonly description: "Language code or name (default: en)";
|
|
15
|
+
readonly required: false;
|
|
16
|
+
};
|
|
17
|
+
readonly limit: {
|
|
18
|
+
readonly type: "string";
|
|
19
|
+
readonly description: "Max suggestions (default: 10, max: 20)";
|
|
20
|
+
readonly required: false;
|
|
21
|
+
};
|
|
22
|
+
readonly output: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly description: "Format: json|csv|md|jsonl";
|
|
25
|
+
readonly required: false;
|
|
26
|
+
readonly default: "json";
|
|
27
|
+
};
|
|
28
|
+
readonly "no-cache": {
|
|
29
|
+
readonly type: "boolean";
|
|
30
|
+
readonly description: "Skip server cache, hit API directly";
|
|
31
|
+
readonly required: false;
|
|
32
|
+
};
|
|
33
|
+
}>;
|
|
34
|
+
//# sourceMappingURL=autocomplete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autocomplete.d.ts","sourceRoot":"","sources":["../../../src/commands/research/autocomplete.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6C9B,CAAC"}
|