@nuxtseo/cli 0.2.1 → 0.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.
@@ -10,6 +10,11 @@ Pass `--json` and `--site <site-id>` on every command below, except `whoami`,
10
10
  `Mutation` marks a command that changes server state. A mutation needs `--yes`
11
11
  in a non-interactive shell.
12
12
 
13
+ Global options work on every command: `--site`, `--json`, `--yes` (`-y`),
14
+ `--timeout-ms` (1 to 300000, default 30000), `--api-url` for a non-production
15
+ host, and `--no-input` to disable prompts in a TTY. `--json` already implies
16
+ `--no-input`.
17
+
13
18
  `Needs a Site URL` marks a command that reads the Site's own domain. If the Site
14
19
  has no URL, the command exits `2`. Set the Site URL first; retrying will not
15
20
  help.
@@ -17,10 +22,15 @@ help.
17
22
  `--all` repeats a paged read until every page is written, one envelope per line.
18
23
  It is available on `actions list`, `page inspect`, `page issues`, `vitals
19
24
  findings`, `backlinks recoverable`, `search analytics` row views, `search
20
- indexing urls`, `sitemaps urls` and `content briefs list`.
25
+ indexing urls` and `sitemaps urls`.
26
+
27
+ The `search analytics` row views are `pages`, `keywords`, `countries`,
28
+ `devices`, and `analysis`. `--all` on any other view exits `2`.
21
29
 
22
30
  ## Contents
23
31
 
32
+ - Which command answers which question
33
+ - One invocation for the whole Site
24
34
  - Account and Site
25
35
  - Assessment and Actions
26
36
  - Pages, Scans, and lab performance
@@ -29,9 +39,69 @@ indexing urls`, `sitemaps urls` and `content briefs list`.
29
39
  - Web Analytics
30
40
  - Research, backlinks, and mentions
31
41
  - Crawl audit
32
- - Content Briefs, Timeline, and annotations
42
+ - Timeline and annotations
33
43
  - Ask the CLI for its own help
34
44
 
45
+ ## Which command answers which question
46
+
47
+ Ask one question, run one command. Stop when it is answered. Every command in
48
+ this table reads stored evidence. None of them mutates, and none of them spends
49
+ a research unit.
50
+
51
+ | Question | Command |
52
+ | --- | --- |
53
+ | Is my token valid, and what may it do | `whoami` |
54
+ | Which Site am I working on | `sites list` |
55
+ | What is wrong with this Site | `status` |
56
+ | What should I fix first | `actions list` |
57
+ | Why does this action exist | `actions show <action-id>` |
58
+ | Which exact URLs does it affect | `page issues`, with `--action-id` |
59
+ | What does Nuxt SEO know about one URL | `page inspect <url>` |
60
+ | Did my last deploy break anything | `audit changes` |
61
+ | How much of the Site is indexed | `search indexing summary` |
62
+ | Which route family is Google declining | `search cohorts` |
63
+ | Why is this one URL not indexed | `search inspect <url>` |
64
+ | When did this URL change index state | `search index-history`, with `--url` |
65
+ | Which pages earn the clicks | `search analytics pages` |
66
+ | Which terms is the Site visible for | `search analytics keywords` |
67
+ | Which pages are losing clicks | `audit content-decay` |
68
+ | Where does internal link equity go | `audit link-structure` |
69
+ | Is the Site slow for real users | `vitals summary`, then `vitals findings` |
70
+ | Is the Site slow in the lab | `performance`, then `scans list` |
71
+ | Which lab check failed | `scans show <scan-id>` |
72
+ | Have I spent my limits | `usage` |
73
+
74
+ Start at `status` for a Site you do not know. It carries the verdict and one
75
+ ranked Next Action, so it replaces several of the rows below it.
76
+
77
+ ## One invocation for the whole Site
78
+
79
+ | Command | What it returns, and its flags |
80
+ | --- | --- |
81
+ | `pull` | Every stored-evidence read for one Site, as NDJSON on stdout. One complete protocol envelope per line, with the `command` it came from beside `data` and `meta`. Requires `--json`. `--include` and `--exclude` take comma separated command names or a command prefix, for example `audit`. `--with-research` adds the reads that can start live research. `--period 7d\|28d\|3m\|6m\|12m` sets the Search Console window. `--concurrency 1..8` (default 4) |
82
+
83
+ Read this first when you need the whole picture. It replaces about forty single
84
+ reads with one invocation.
85
+
86
+ `pull` excludes every mutation, and every read that needs an argument it cannot
87
+ invent, such as `page inspect`, `page issues`, `search inspect`, `actions show`,
88
+ and `scans show`. Run those yourself with the IDs `pull`
89
+ returned.
90
+
91
+ `pull` makes one request per read. It never follows pages, so a run costs
92
+ exactly as many requests as it names on stderr. When a line reports more pages,
93
+ run that one command again with `--all`.
94
+
95
+ One failing read does not stop the run. It writes its error envelope on its own
96
+ line and the others continue. The exit code reports the worst outcome, and the
97
+ last line is a `CliError` value with `command: "pull"` that repeats it. An
98
+ authentication failure stops the run early, because every later read would fail
99
+ the same way.
100
+
101
+ Progress, warnings and the spend notice go to stderr. Line order follows
102
+ completion, not the catalogue, so read the `command` field rather than counting
103
+ lines.
104
+
35
105
  ## Account and Site
36
106
 
37
107
  | Command | What it returns, and its flags |
@@ -84,7 +154,7 @@ indexing urls`, `sitemaps urls` and `content briefs list`.
84
154
  | Command | What it returns, and its flags |
85
155
  | --- | --- |
86
156
  | `search status` | Stored Search Console connection state. Provider free. Never waits for Google |
87
- | `search analytics <view>` | Search Console rows, trend, detail, or analysis. Views: `pages`, `keywords`, `countries`, `devices`, `timeseries`, `page-detail`, `keyword-detail`, `analysis`. `--period`, `--limit`, `--page`, `--search`, `--sort`, `--filter`, `--min-clicks`, `--max-clicks`, `--min-impressions`, `--max-impressions`, `--min-position`, `--max-position`, `--max-ctr`. The `analysis` view needs `--preset`, and the brand presets also need `--brand-terms` |
157
+ | `search analytics <view>` | Search Console rows, trend, detail, or analysis. Views: `pages`, `keywords`, `countries`, `devices`, `timeseries`, `page-detail`, `keyword-detail`, `analysis`. `--period 7d\|28d\|3m\|6m\|12m` (default `28d`). No other period value is accepted; `90d` exits `2`, and `3m` is the three-month window. `--limit 1..100` (default 25), `--page` (default 1), `--search`, `--sort clicks\|impressions\|ctr\|position` (default `clicks`), `--sort-dir asc\|desc` (default `desc`), `--filter top-level\|new\|lost\|improving\|declining`, `--min-clicks`, `--max-clicks`, `--min-impressions`, `--max-impressions`, `--min-position 1..100`, `--max-position 1..100`, `--max-ctr 0..1`. The `page-detail` view needs `--page-url`, `keyword-detail` needs `--keyword`, and `analysis` needs `--preset`. The brand presets also need `--brand-terms` |
88
158
  | `search indexing <summary\|urls>` | Retained URL Inspection coverage. `summary` returns indexed counts. `urls` supports `--issue`, `--status`, `--limit 1..500` (default 50), `--offset` |
89
159
  | `search index-history` | Retained indexing changes and candidate causes. `--url`, `--field`, `--days 1..730`. Dates a regression against a release |
90
160
  | `search inspect <url>` | Google's own verdict for one URL. Takes an absolute URL or a site-relative path |
@@ -99,11 +169,37 @@ Analysis presets for `search analytics analysis` are `striking-distance`,
99
169
  `movers-rising`, and `movers-declining`. `brand-only` and `non-brand` also need
100
170
  `--brand-terms`. A missing argument exits `2` before any request.
101
171
 
172
+ ### Three totals on one `search analytics` response
173
+
174
+ The `pages`, `keywords`, `countries`, and `devices` views return three
175
+ different numbers. Read the one that answers your question.
176
+
177
+ | Field | What it counts |
178
+ | --- | --- |
179
+ | `total` | The number of rows the query matched, not clicks or impressions |
180
+ | `totals` | Clicks, impressions, CTR and position for the full upstream query population. `totalsScope` says so in words. It may include rows outside this page. `null` when the server has no total |
181
+ | `representedTotals` | Clicks and impressions for the rows in this response only, after local filtering. `representedTotalsScope` says so in words |
182
+
183
+ So `representedTotals` is at or below `totals`, and raising `--limit` moves
184
+ `representedTotals` while leaving `totals` still. Never sum `rows` by hand when
185
+ `totals` is present.
186
+
187
+ ### Never compare a keyword total with a page total
188
+
189
+ Google suppresses query rows below a privacy threshold. So the `keywords` view
190
+ sees a fraction of the traffic the `pages` view sees. On a typical property
191
+ that is roughly half the impressions. Query-dimension totals are therefore
192
+ always at or below page-dimension totals for the same Site and period. Never
193
+ compare the two, and never report one as the Site total.
194
+
195
+ Read the `pages` view for "how much traffic". Read the `keywords` view for
196
+ "which terms are visible". A missing query row is never evidence of no demand.
197
+
102
198
  ## Web Analytics
103
199
 
104
200
  | Command | What it returns, and its flags |
105
201
  | --- | --- |
106
- | `analytics <view>` | Web Analytics from the connected provider. Views: `performance`, `top-pages`, `source-medium`, `key-events`, `countries`, `devices`, `dimension`. `--period`, `--compare`, `--dimension`, `--filters` |
202
+ | `analytics <view>` | Web Analytics from the connected provider. Views: `performance`, `top-pages`, `source-medium`, `key-events`, `countries`, `devices`, `dimension`. `--period` is a free string, for example `28d` (default `28d`); an empty value exits `2`. `--compare previous\|year\|none` (default `previous`), `--dimension` (required for the `dimension` view; one of `date`, `page`, `hostname`, `source`, `medium`, `campaign`, `country`, `region`, `city`, `deviceCategory`, `browser`, `operatingSystem`), `--filters` as a JSON array, `--phase current\|prior\|full` (default `full`), `--no-stable-data` to include unstable recent days, `--no-host-scope` to include every host, `--no-compare-prior` to skip the prior window, `--fresh` to bypass the server cache |
107
203
 
108
204
  ## Research, backlinks, and mentions
109
205
 
@@ -113,36 +209,33 @@ research boundary in SKILL.md first.
113
209
 
114
210
  | Command | What it returns, and its flags |
115
211
  | --- | --- |
116
- | `research overview` | Stored Site and competitor research: metrics, history, gaps, quick wins |
117
- | `research keywords <topic>` | Live keyword ideas, with volume, difficulty, intent, and cost data |
118
- | `research serp <keyword>` | A live SERP snapshot: results, features, fetch time |
119
- | `research rankings <domain>` | Live domain rankings: current keywords and domain metrics |
212
+ | `research overview` | Stored Site and competitor research: metrics, history, gaps, quick wins. Takes no flags. Returns `data.competitors` and `data.summary` |
213
+ | `research keywords <topic>` | Live keyword ideas, with volume, difficulty, intent, and cost data. The seed must be 1 to 3 words. The server refuses a longer seed. The refusal arrives as exit `0` with an empty `data.keywords`, so read `data.message` first. Comma-separate several short seeds instead. Special characters are stripped before the lookup. If a seed is under 2 characters after stripping, the server refuses it the same way. The server applies default filters and echoes them in `data.filters`: `--min-volume` (default 10), `--max-volume` (default 10000), `--min-difficulty 0..100` (default 0), `--max-difficulty 0..100` (default 60). So a default run hides keywords over difficulty 60 or under 10 searches. Also `--limit 1..100` (default 20), `--intent`, `--location-code` (default 2840), `--no-related` to drop related keywords, and `--verbose` for full evidence. If `--max-volume` is under `--min-volume`, the run exits `2`. The same holds for `--max-difficulty` under `--min-difficulty` |
214
+ | `research serp <keyword>` | A live SERP snapshot: results, features, fetch time. `--depth 1..20` (default 10) sets how many organic results return. `--location-code` (default 2840). The keyword must be 2 to 200 characters. `data.cached` reports cache use |
215
+ | `research rankings <domain>` | Live domain rankings: current keywords and domain metrics. `--limit 1..100` (default 50), `--min-position 1..100` (default 1), `--max-position 1..100` (default 20), `--location-code` (default 2840), `--order position\|traffic` (default `position`). So a default run returns only the top 20 positions. If `--max-position` is under `--min-position`, the run exits `2`. An unusable domain also exits `2`, with `invalid_request`. An empty `data.keywords` with exit `0` carries the reason in `data.message`. `data.cached` reports cache use |
120
216
  | `research domain-traffic <domain>` | A live organic traffic estimate for any domain: trend, top pages, top countries. The domain does not have to be one of your Sites |
121
217
  | `research domain-availability <domains>` | Registration status. One comma-separated positional, up to 10 domains |
122
- | `backlinks summary` | Whole-domain inbound link totals. `evidence` reports cache use. Needs a Site URL |
218
+ | `backlinks summary` | Whole-domain inbound link totals for the Site's own domain: `backlinks`, `referringDomains`, `referringPages`, `brokenBacklinks`, `brokenPages`, `crawledPages`, `spamScore`, `rank`. Takes no flags; it always reads the registered Site URL, so use `research domain-traffic` for any other domain. Every count is nullable. A `null` count means the provider returned no value. Never read it as zero. `evidence` reports cache use. Needs a Site URL |
123
219
  | `backlinks referring-domains` | Domains that link to the Site. `--limit 1..1000` (default 100). `sessions` is 90-day referral traffic, or null when no Web Analytics property is linked. Needs a Site URL |
124
220
  | `backlinks anchors` | Anchor text distribution of inbound links. `--limit 1..1000` (default 100). Needs a Site URL |
125
221
  | `backlinks history` | A monthly inbound link series. `--from YYYY-MM-DD`. Defaults to about twelve months. Needs a Site URL |
126
222
  | `backlinks recoverable` | Stored recoverable backlinks. `--limit 1..200`, `--offset`. Reads retained rows |
127
- | `mentions list` | Stored mentions. `--limit 1..200`. Reads retained rows |
223
+ | `mentions list` | Stored mentions. `--limit 1..200` (default 100), `--include-filtered` to keep the Mentions AI triage marked a false positive. Reads retained rows |
128
224
 
129
225
  ## Crawl audit
130
226
 
131
227
  | Command | What it returns, and its flags |
132
228
  | --- | --- |
133
229
  | `audit changes` | The latest crawl compared with its baseline. `--from`, `--to`. The read for "did my deploy break anything" |
134
- | `audit link-opportunities` | Stored internal link opportunities, with crawl coverage |
135
- | `audit link-structure` | Template links, dead ends, and generic anchors. Shows where link equity goes |
136
- | `audit content-decay` | Stored decaying Pages, with Search Console loss evidence |
137
- | `audit duplicates` | Stored duplicate clusters, with members and keep candidate |
230
+ | `audit link-opportunities` | Stored internal link opportunities, with crawl coverage. Takes no flags. Read `connected` and `pagesScanned` before quoting `total` |
231
+ | `audit link-structure` | Template links, dead ends, and generic anchors. Shows where link equity goes. Takes no flags. It returns three separate lists: `templateSlots`, `deadEnds`, and `genericAnchors`. Each carries its own total. `deadEndScanTruncated: true` marks the dead-end list as a floor |
232
+ | `audit content-decay` | Stored decaying Pages, with Search Console loss evidence. Takes no flags. If `connected` is `false`, the Site has no Search Console data. Never report that as clean. `truncated: true` marks the list as a floor |
233
+ | `audit duplicates` | Stored duplicate clusters, with members and keep candidate. Takes no flags. `crawlSettingsId: null` means the Site never completed a crawl. Then `total: 0` proves nobody looked. Never report it as a clean Site |
138
234
 
139
- ## Content Briefs, Timeline, and annotations
235
+ ## Timeline and annotations
140
236
 
141
237
  | Command | What it returns, and its flags |
142
238
  | --- | --- |
143
- | `content briefs list` | Content Brief summaries. `--status`, `--limit`, `--offset` |
144
- | `content briefs show <brief-id>` | One Content Brief, including its grounded payload |
145
- | `content briefs create <keyword>` | Mutation. Creates one Content Brief. `--target-page` is optional |
146
239
  | `timeline list` | Stored Timeline Entries. `--kind`, `--feature`, `--severity`, `--since`, `--limit`, `--cursor`, `--include-closed` |
147
240
  | `annotations list` | This Site's own chart annotations: date-anchored markers on traffic and ranking charts |
148
241
  | `annotations create` | Mutation, so it needs `--yes`. Marks the day you shipped a fix. `--date YYYY-MM-DD` and `--title` are required. `--note` and `--url` are optional |
@@ -45,8 +45,9 @@ Page row:
45
45
  nuxtseo search analytics pages --site <site-id> --period 7d --all --json
46
46
  ```
47
47
 
48
- Keep rows where `row.impressions > 0`. Count those rows, and report `row.url`
49
- when the user asks which URLs appeared. Do not use `data.total` for this count.
48
+ Keep rows where `row.impressions > 0`. Count distinct `row.gscPage` values,
49
+ not rows. `row.url` is canonicalised, so one URL can span several rows. Report
50
+ distinct `row.url` values when the user asks which URLs appeared. Do not use `data.total` for this count.
50
51
  It also includes comparison-period rows with zero current impressions.
51
52
 
52
53
  Keep these reads separate:
@@ -18,6 +18,29 @@ Protocol failure, still on stdout, with recovery details on stderr:
18
18
 
19
19
  Read `data`. The CLI does not unwrap, rename, rank, or enrich fields.
20
20
 
21
+ ## A soft failure looks like an empty result
22
+
23
+ Some commands refuse the argument and still exit `0` with an empty list. The
24
+ reason sits in `data.message`. A repair hint sits in `data.tip`. Read both
25
+ before you read the list. Otherwise you report "nothing found" for a request
26
+ the server never ran.
27
+
28
+ These fields carry the reason:
29
+
30
+ | Command | Fields |
31
+ | --- | --- |
32
+ | `research keywords` | `data.message`, `data.tip` |
33
+ | `research rankings` | `data.message` |
34
+ | `research domain-traffic` | `data.message` |
35
+ | `research domain-availability` | `data.message` |
36
+ | `page issues` | `data.message`, plus `availableKeys` |
37
+ | `search cohorts` | `data.message`, plus `reason` |
38
+ | `vitals findings` | `data.message`, plus `source` |
39
+
40
+ `evidence._tag: "no-provider"` does not prove the data is absent. On `research
41
+ keywords` it also marks a refused argument. The provider was never asked. Read
42
+ `data.message` to tell the two cases apart.
43
+
21
44
  Local outcomes have no server body. They carry one tag and their own schema
22
45
  version. `CliHelp` uses version 2. The other values use version 1.
23
46
 
@@ -58,6 +81,10 @@ One invocation makes one request by default. The CLI never merges responses.
58
81
  writes one complete envelope per page, newline delimited, so parse the stream
59
82
  one JSON value per line. Nothing is merged, unwrapped, or re-ranked.
60
83
 
84
+ `pull` writes the same stream for a whole Site. Each line is one operation's
85
+ envelope with a `command` field beside `data` and `meta`. `pull` makes one
86
+ request per operation and never follows pages, so it needs no cap of its own.
87
+
61
88
  The `--all` loop stops after 50 requests. If pages remain, the CLI exits `9`
62
89
  and stderr names the argument that resumes the read, for example `--offset 50`.
63
90
  Treat exit `9` as a stop, never as the end of the data.
@@ -65,6 +92,62 @@ Treat exit `9` as a stop, never as the end of the data.
65
92
  Pass the reported `offset` or opaque `cursor` for another page. Never edit or
66
93
  infer a cursor. Keep server order for actions. Never re-rank merged results.
67
94
 
95
+ ## List key and paging shape per command
96
+
97
+ Lists are converging on one envelope: `data.rows` plus `data.page`, where
98
+ `data.page` holds `total`, `limit`, `offset`, and `hasMore`. `page.total` counts
99
+ the whole result set, not this page. Prefer that envelope when the command has
100
+ it. If `data.rows` is absent, the server is older than the CLI; read the domain
101
+ key in the table instead.
102
+
103
+ The domain keys `data.sites`, `data.actions`, `data.clusters`, `data.items` on
104
+ `backlinks recoverable` and `mentions list`, and `data.observations.pagination`
105
+ are deprecated aliases. They are removed in a later minor version. Do not build
106
+ on them.
107
+
108
+ Commands without the envelope have no single list key. Read the key this
109
+ command returns; never guess a chain. Verified against the response schemas.
110
+
111
+ | Command | List key | Paging fields |
112
+ | --- | --- | --- |
113
+ | `sites list` | `data.rows` (alias `data.sites`) | `data.page`; `meta.total` |
114
+ | `usage` | `data.meters` | none |
115
+ | `actions list` | `data.rows` (alias `data.actions`) | `data.page.total`, `.limit`, `.offset`, `.hasMore` |
116
+ | `actions show` | `data.evidenceGroups[].items` | `data.evidenceGroups[].nextCursor` |
117
+ | `page inspect` | `data.observations.rows` | `data.observations.page` (alias `data.observations.pagination`); `data.observations.total` |
118
+ | `page issues` | `data.issues` | `data.total`, `data.limit`, `data.offset` |
119
+ | `scans list` | `data.scans` | `data.total`, `data.limit` |
120
+ | `scans pages` | `data.pages` | `data.total` |
121
+ | `vitals findings` | `data.findings` | `data.total`, `data.limit`, `data.offset` |
122
+ | `search analytics` `pages`, `keywords`, `countries`, `devices` | `data.rows` | `data.page`; `data.total`; page with `--page` |
123
+ | `search analytics` `analysis` | `data.rows` | `data.total`; page with `--page` |
124
+ | `search analytics` `page-detail`, `keyword-detail` | `data.rows` | none |
125
+ | `search analytics timeseries` | `data.daily` | none |
126
+ | `search indexing urls` | `data.urls` | `data.total`, `data.limit`, `data.offset`, `data.hasMore` |
127
+ | `search index-history` | `data.changes` | none |
128
+ | `search cohorts` | `data.established` and `data.ranked` | `data.rankedTotal` |
129
+ | `sitemaps list` | `data.sitemaps` | none |
130
+ | `sitemaps urls` | `data.items` | `data.page.nextCursor`, `data.page.limit` |
131
+ | `audit content-decay` | `data.rows` | `data.page`; `data.total`, `data.truncated` |
132
+ | `audit link-opportunities` | `data.rows` | `data.page`; `data.total` |
133
+ | `audit duplicates` | `data.rows` (alias `data.clusters`) | `data.page`; `data.total` |
134
+ | `audit link-structure` | `data.templateSlots`, `data.deadEnds`, `data.genericAnchors` | `data.templateSlotTotal`; `data.deadEndGroupTotal` and `data.deadEndPageTotal`; `data.genericAnchorTotal` |
135
+ | `research keywords` | `data.keywords` | `data.totalFound` |
136
+ | `research serp` | `data.results` | none; `data.depth` |
137
+ | `research rankings` | `data.keywords` | `data.totalFound` |
138
+ | `research domain-availability` | `data.results` | none |
139
+ | `backlinks referring-domains` | `data.items` | `data.total`, `data.limit` |
140
+ | `backlinks anchors` | `data.items` | `data.total`, `data.limit` |
141
+ | `backlinks history` | `data.items` | `data.total` |
142
+ | `backlinks recoverable` | `data.rows` (alias `data.items`) | `data.page`; `data.total`, `data.limit`, `data.offset` |
143
+ | `mentions list` | `data.rows` (alias `data.items`) | `data.page`; `data.total`, `data.limit` |
144
+ | `timeline list` | `data.entries` | `data.nextCursor` |
145
+ | `annotations list` | `data.annotations` | `data.total`, `data.limit` |
146
+
147
+ Four paging shapes appear above: a nested `data.page` object, flat `total`,
148
+ `limit` and `offset` fields, an opaque `nextCursor`, and no paging at all. The
149
+ table is today's reality, so re-read it after a CLI update.
150
+
68
151
  ## Exit codes
69
152
 
70
153
  Branch on the exit code, not message text.
@@ -77,7 +160,7 @@ Branch on the exit code, not message text.
77
160
  | `4` | Forbidden, scope, or entitlement failure | Report the plan or token blocker |
78
161
  | `5` | Conflict, stale evidence, or ambiguous Site | Re-read. Pass `--site` if ambiguous |
79
162
  | `6` | Rate limit, `quota_exhausted`, provider outage, or timeout | Read retry metadata, then wait |
80
- | `7` | Local state, network, contract, or infrastructure failure | Report it with the request ID. If the message names `contract_violation`, update the CLI first |
163
+ | `7` | Local state, network, contract, or infrastructure failure | Report it with the request ID. If the message names `contract_violation`, follow its contract version lines |
81
164
  | `8` | Resource or Site not found | Run `sites list` for a valid Site ID |
82
165
  | `9` | `--all` reached its request cap | Resume with the argument stderr names |
83
166
  | `127` | Shell cannot find `nuxtseo` | Install the CLI |