@siteoshq/cli 2.3.1 → 2.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  # SiteOS CLI
2
2
 
3
3
  `@siteoshq/cli` exposes one `siteos` binary for Auth, common Projects, Pulse, Cookie, Forms,
4
- Search, Trace, SEO/GEO and Integrations. This source is version 2.2.0; source changes require a separate release to reach npm.
4
+ Search, Trace, SEO/GEO and Integrations. This source is version 2.4.0; source changes require a separate release to reach npm.
5
5
 
6
6
  CLI 2 requires `siteos project use <id-or-slug> --environment <slug>` once per repository.
7
7
  It stores only the common selection in private `projects.json`; older service bindings are not
@@ -230,6 +230,11 @@ siteos seo gsc export --dataset queries --format csv --output ./gsc-queries.csv
230
230
 
231
231
  Run `siteos seo --help` for request JSON, limits, saved inputs, cancellation and GSC settings.
232
232
  Research supports keywords, Domain Overview (`domain`), rankings, backlinks, brand and AI visibility without GSC.
233
+ AI Visibility category history uses `--kind ai-rankings`; Prompt checks stays separate under
234
+ `--kind ai-visibility`. Category requests use `kind: ai-visibility` with a `category-aeo-v2`
235
+ category. Reports and exports preserve AEO scores, recommendation roles, first choices, objections,
236
+ model settings and the exact supporting answers. See the SEO skill's AI visibility reference for
237
+ the versioned request and scoring method; historical v1 reports remain readable without inferred scores.
233
238
  Domain Overview collects domain totals, up to 100 ranking keywords, pages and competitors for a market.
234
239
  `--kind domain` includes legacy `competitors` history; existing `competitors` inputs keep their original two-part plan.
235
240
  New request example: `{"kind":"domain","target":"example.com","country":"US","language":"en"}`.
package/dist/cli.js CHANGED
@@ -9012,17 +9012,19 @@ var RESEARCH_HELP = `
9012
9012
  siteos seo research saved save --input <request.json> --name <name> [--id <saved-id>] [--environment <slug>] [--json]
9013
9013
  siteos seo research saved remove <saved-id> [--environment <slug>] [--json]
9014
9014
 
9015
- Research kinds: keywords, domain, rankings, backlinks, brand, ai-visibility.
9015
+ Research request kinds: keywords, domain, rankings, backlinks, brand, ai-visibility.
9016
+ Read sections also accept --kind ai-rankings for category comparisons; --kind ai-visibility selects Prompt checks.
9017
+ Category run/plan inputs use kind ai-visibility with category-aeo-v2; both sections share AI request execution.
9016
9018
  Domain Overview: {"kind":"domain","target":"example.com","country":"US","language":"en"}.
9017
9019
  Domain collects summary, ranking keywords, top pages and competitors. The legacy competitors kind retains its two-part plan; domain history includes those reports.
9018
9020
  Request JSON: {"kind":"keywords","target":"example.com","keywords":["website analytics"],"country":"US","language":"en"}.
9019
- Rankings accepts up to 10 keywords and 5 competitors. AI visibility requires brand, prompt and platforms.
9021
+ Rankings accepts up to 10 keywords and 5 competitors. AI visibility accepts brand, platforms and either prompt or a category-aeo-v2 category with products and questions.
9020
9022
  Markets: US, GB, ES, DE, FR, CA, AU. Languages: en, es, de, fr, pt, it, nl, ru.
9021
9023
  Platforms: chat_gpt, claude, gemini, perplexity. Brand lookup uses brandPlatform chat_gpt|google and brandMatch domain|brand.
9022
9024
  Plan validates the request and shows planned parts and available research credits without enqueueing work.
9023
9025
  Run consumes Organization research credits through the same worker as the interface. Preserve the retry key after an uncertain response.
9024
9026
  SERP ensure collects one saved organic snapshot for a keyword returned by the selected completed Keyword Research report. It uses research credits once; repeating the same report/word returns the saved job, including failures. Show/wait/export only read and never spend. New reports can collect fresh snapshots.
9025
- History returns the latest 30 checks per kind; show/export can address older retained run IDs. Saved checks are limited to 100 per resource.
9027
+ History returns the latest 30 checks per section; show/export can address older retained run IDs. Saved checks are limited to 100 per resource.
9026
9028
  Wait defaults to 120 seconds (maximum 900); exit 3 means still pending, exit 4 means failed or cancelled. Partial evidence stays accessible.
9027
9029
  Exports preserve scope, dates and partial state. CSV stores one dataset row as JSON per row, including failed parts; it never converts missing metrics to zero.
9028
9030
  `;
@@ -9034,6 +9036,8 @@ var kinds = [
9034
9036
  "brand",
9035
9037
  "ai-visibility"
9036
9038
  ];
9039
+ var sections = [...kinds, "ai-rankings"];
9040
+ var sectionOf = (request) => request.kind === "ai-visibility" && request.category ? "ai-rankings" : request.kind;
9037
9041
  var requestSchema = z17.object({
9038
9042
  kind: z17.enum(["domain", ...kinds]).transform((kind) => kind === "domain" ? "competitors" : kind),
9039
9043
  target: z17.string().min(1).max(253)
@@ -9104,7 +9108,7 @@ async function runSeoResearchCommand(options) {
9104
9108
  "Provide --keyword with 1 to 200 characters from the selected keyword report."
9105
9109
  );
9106
9110
  if (values.kind === "domain") values.kind = "competitors";
9107
- if (operation.flags.includes("kind") && !kinds.includes(values.kind))
9111
+ if (operation.flags.includes("kind") && !sections.includes(values.kind))
9108
9112
  throw new Error("Choose a documented --kind.");
9109
9113
  if (operation.flags.includes("input") && !values.input)
9110
9114
  throw new Error("Provide --input with a research request JSON file.");
@@ -9312,7 +9316,7 @@ async function runSeoResearchCommand(options) {
9312
9316
  } else if (action === "summary") {
9313
9317
  record = await get("/summary");
9314
9318
  resourceSchema.parse(record.resource);
9315
- z17.array(z17.object({ kind: z17.enum(kinds), summary: z17.unknown() })).parse(
9319
+ z17.array(z17.object({ kind: z17.enum(sections), summary: z17.unknown() })).parse(
9316
9320
  record.checks
9317
9321
  );
9318
9322
  } else if (["status", "history", "saved list"].includes(action)) {
@@ -9326,13 +9330,13 @@ async function runSeoResearchCommand(options) {
9326
9330
  request: requestSchema
9327
9331
  }).passthrough()
9328
9332
  ).parse(view.saved);
9329
- if (runs.some((r) => r.request.kind !== values.kind) || saved.some((r) => r.request.kind !== values.kind))
9333
+ if (runs.some((r) => sectionOf(r.request) !== values.kind) || saved.some((r) => sectionOf(r.request) !== values.kind))
9330
9334
  throw new Error(
9331
9335
  "The response does not match the requested research kind."
9332
9336
  );
9333
9337
  if (view.run != null) {
9334
9338
  const selected = runSchema.parse(view.run);
9335
- if (selected.request.kind !== values.kind)
9339
+ if (sectionOf(selected.request) !== values.kind)
9336
9340
  throw new Error("The selected report has a different research kind.");
9337
9341
  }
9338
9342
  record = {
@@ -9395,6 +9399,25 @@ async function runSeoResearchCommand(options) {
9395
9399
  row
9396
9400
  ]);
9397
9401
  });
9402
+ if (run.categoryReport) {
9403
+ rows.push([
9404
+ run.id,
9405
+ run.websiteUrl,
9406
+ run.request.kind,
9407
+ run.request.target,
9408
+ run.createdAt,
9409
+ run.state,
9410
+ run.error,
9411
+ null,
9412
+ null,
9413
+ null,
9414
+ null,
9415
+ "category-report",
9416
+ run.request,
9417
+ { version: run.categoryReport.version },
9418
+ run.categoryReport
9419
+ ]);
9420
+ }
9398
9421
  const content = values.format === "json" ? JSON.stringify(record, null, 2) : [
9399
9422
  [
9400
9423
  "run_id",
@@ -9888,7 +9911,7 @@ var SEO_HELP = `SEO/GEO: audit your website and research search-engine and AI vi
9888
9911
 
9889
9912
  Site Audit checks public HTML, canonical, robots.txt, sitemap and technical GEO signals.
9890
9913
  Performance measures selected pages with Lighthouse and compares response/rendered HTML.
9891
- Research covers keywords, rankings, competitors, backlinks, Brand lookup and Prompt checks.
9914
+ Research covers keywords, rankings, competitors, backlinks, Brand lookup and AI visibility.
9892
9915
  GSC Insights reads your connected property's Google Search Console data; other research needs no GSC.
9893
9916
  Technical GEO checks crawler policies, content, snippets and structured-data syntax/shape.
9894
9917
  These checks do not measure autonomous agent journeys or guarantee AI inclusion or citations.