@clize/clize 0.26.1 → 0.28.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 +1 -0
- package/dist/cli.js +53 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -1
- package/dist/core/seo-classify.js +116 -0
- package/dist/core/seo-classify.js.map +1 -0
- package/dist/core/seo-traffic.js +102 -0
- package/dist/core/seo-traffic.js.map +1 -0
- package/dist/core/seo.js +595 -0
- package/dist/core/seo.js.map +1 -0
- package/dist/providers/seo/dataforseo.js +218 -0
- package/dist/providers/seo/dataforseo.js.map +1 -0
- package/dist/providers/seo/gsc.js +167 -0
- package/dist/providers/seo/gsc.js.map +1 -0
- package/dist/remote.js +6 -0
- package/dist/remote.js.map +1 -1
- package/package.json +6 -3
- package/skills/clize-seo/SKILL.md +219 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: clize-seo
|
|
3
|
+
description: >-
|
|
4
|
+
Read what `clize seo` returns and decide what to do about it. The commands give facts —
|
|
5
|
+
keyword metrics, who occupies a results page, your positions, where your traffic comes
|
|
6
|
+
from, what Search Console is showing you. This skill is the judgment layer: which keywords
|
|
7
|
+
are worth attacking at your authority level, what a results page is actually telling you,
|
|
8
|
+
where to place content so it gets found, how to write so AI engines can quote you, and how
|
|
9
|
+
to read a `seo check` without fooling yourself.
|
|
10
|
+
Triggers: "should I go after this keyword", "why aren't we ranking", "what does this SERP
|
|
11
|
+
mean", "read my seo check", "how do I get cited by ChatGPT", "write this page for AI search",
|
|
12
|
+
"where should I publish this", "is our SEO working".
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Reading and acting on `clize seo`
|
|
16
|
+
|
|
17
|
+
The commands are deliberately dumb: they compress facts, they never advise. `serp` will tell
|
|
18
|
+
you a page is a `listicle_window`; it will not tell you to pitch those listicles. That call is
|
|
19
|
+
yours, and this file is how to make it.
|
|
20
|
+
|
|
21
|
+
Run `clize seo <cmd> --help` for exact flags. Everything below assumes you have the output.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 1. Reading a results page (`seo serp`)
|
|
26
|
+
|
|
27
|
+
`verdict` compresses **who occupies the page**. Four values, and what each one means for
|
|
28
|
+
whether you can get in:
|
|
29
|
+
|
|
30
|
+
| verdict | what it means | what it implies |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `official_wall` | The brand named in the query owns ≥3 of the top 5 | You are not getting in on this query. It is a navigational query wearing a category costume. |
|
|
33
|
+
| `definition_wall` | Big vendors / encyclopedias hold ≥4 of the top 10 with "what is X" content | Do not write another definition. Go long-tail, or go where the discussion is (Reddit, HN). |
|
|
34
|
+
| `listicle_window` | Roundups hold ≥3 of the top 10 | **The only shape you can enter without authority.** `parasiteTargets` lists the roundups — getting included in one is cheaper than outranking them. |
|
|
35
|
+
| `open` | No single occupancy pattern the classifier can identify | **Not the same as "there's room."** Read `items` yourself. |
|
|
36
|
+
|
|
37
|
+
### `open` is the one that will fool you
|
|
38
|
+
|
|
39
|
+
`open` means *the machine found no mechanical pattern*, not *the page is winnable*. Measured
|
|
40
|
+
case: `agentic payments` came back `open`, but the top eight were ACI Worldwide, AWS,
|
|
41
|
+
Fireblocks, Accenture, Mastercard and Kearney — an enterprise definition wall in everything
|
|
42
|
+
but the classifier's domain list. Whenever you see `open`, read the hosts. If they are all
|
|
43
|
+
large vendors publishing thought-leadership, treat it as `definition_wall`.
|
|
44
|
+
|
|
45
|
+
### KD and the SERP are different questions — check both
|
|
46
|
+
|
|
47
|
+
`seo keywords` says `stripe mcp server` is KD 4, `band: attackable`. `seo serp` on the same
|
|
48
|
+
keyword returns `official_wall`: three of the top five are Stripe's own properties. **A low
|
|
49
|
+
difficulty score on a page nobody can enter is not an opportunity.** Never pick keywords from
|
|
50
|
+
`band` alone; run `serp` on anything you are about to invest a page in.
|
|
51
|
+
|
|
52
|
+
### The classifier does not judge intent — you do
|
|
53
|
+
|
|
54
|
+
`ai agent deployment` returns `open`. Read the items and you find they are all about deploying
|
|
55
|
+
*agent runtimes*, not about agents deploying *websites*. That is an intent mismatch, and it is
|
|
56
|
+
invisible to a rule engine because it requires knowing what your product is. Same for
|
|
57
|
+
`ai domain registration`, which turns out to mean "buy a .ai domain". **Always read `items`
|
|
58
|
+
before committing to a keyword**, whatever the verdict says.
|
|
59
|
+
|
|
60
|
+
### `aiOverview: true`
|
|
61
|
+
|
|
62
|
+
An AI Overview sits above the organic results and answers the query in place. Position 3 under
|
|
63
|
+
an AI Overview is worth much less than position 3 without one, and some of your impressions will
|
|
64
|
+
never become clicks no matter what you do. Note it, factor it into expectations, and lean harder
|
|
65
|
+
on being *quotable* (§4) than on being *ranked*.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 2. Picking keywords at your authority level (`seo keywords`)
|
|
70
|
+
|
|
71
|
+
`band` is a mechanical bucket of keyword difficulty: `attackable` (<10), `stretch` (10–30),
|
|
72
|
+
`wall` (>30), `no_volume`.
|
|
73
|
+
|
|
74
|
+
For a site with near-zero authority (new domain, few referring domains):
|
|
75
|
+
|
|
76
|
+
- Attack `attackable` **that also pass the SERP check** (§1).
|
|
77
|
+
- `stretch` is a 6–12 month bet; take at most one or two, and only if the SERP is a
|
|
78
|
+
`listicle_window` you can parasitize meanwhile.
|
|
79
|
+
- `wall` is not a plan. Skip it.
|
|
80
|
+
- `no_volume` is not automatically worthless: a keyword with no recorded volume whose SERP is
|
|
81
|
+
already full of category roundups is a **pre-emergence** signal — the searches exist, the
|
|
82
|
+
keyword tools have not caught up. `email api for ai agents` had no volume and a
|
|
83
|
+
`listicle_window` with four roundups on it. That is a keyword worth an early page.
|
|
84
|
+
|
|
85
|
+
`--ai` adds `aiSv`, the volume inside AI engines. **It is a different unit from `sv`.** Measured:
|
|
86
|
+
`agent mail` is 5,400 on Google and 125 in AI engines; `ai email agent` is 140 and 5. Compare a
|
|
87
|
+
keyword to itself over time, or rank keywords against each other — never put `sv` and `aiSv` in
|
|
88
|
+
the same sentence as if they were the same quantity, and never add them.
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 3. Where to place content
|
|
93
|
+
|
|
94
|
+
Priority order, most effective first for a low-authority site:
|
|
95
|
+
|
|
96
|
+
1. **Third-party trust positions.** Registries and directories that accept submissions, and the
|
|
97
|
+
roundups in `parasiteTargets`. Getting listed in a page that already ranks beats trying to
|
|
98
|
+
outrank it. This is manual outreach — the product produces the target list, it does not send
|
|
99
|
+
anything.
|
|
100
|
+
2. **Where the discussion already is.** Reddit and HN rank on a large share of these queries
|
|
101
|
+
(they appear in nearly every SERP fixture we have). Participating is legitimate; astroturfing
|
|
102
|
+
is not, and it will cost you the account and the credibility.
|
|
103
|
+
3. **Your own site last.** Not because it doesn't matter, but because on a new domain it is the
|
|
104
|
+
slowest of the three. Publish there, then go get the first two.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 4. Writing so AI engines can quote you
|
|
109
|
+
|
|
110
|
+
Retrieval-augmented engines quote passages, not pages. What survives extraction:
|
|
111
|
+
|
|
112
|
+
- **Answer completely in the first 200 words.** Assume the extractor never reaches your second
|
|
113
|
+
section.
|
|
114
|
+
- **One-sentence extractables.** Each key claim should stand alone when lifted out of context.
|
|
115
|
+
Pronouns and "as mentioned above" destroy quotability.
|
|
116
|
+
- **Statistics and named sources.** Concrete numbers with attribution get quoted; adjectives
|
|
117
|
+
don't.
|
|
118
|
+
- **Define your terms verbatim and identically everywhere.** If your definition sentence varies
|
|
119
|
+
between pages, no single phrasing accumulates authority.
|
|
120
|
+
- **Machine-readable surface**: `llms.txt`, schema.org markup, a sitemap, and IndexNow pings.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 5. Reading a `seo check`
|
|
125
|
+
|
|
126
|
+
### `rank`
|
|
127
|
+
|
|
128
|
+
`rank.source` is always `"gsc"`: positions come from Search Console, free, and `check` makes no
|
|
129
|
+
upstream calls at all. Read them accordingly.
|
|
130
|
+
|
|
131
|
+
- `position` is the **impression-weighted average over `rank.window`**, not your rank at a moment.
|
|
132
|
+
A 62.4 means "across the window, the average slot Google gave you was ~62". Two consequences:
|
|
133
|
+
a single good day barely moves it, and it is **not comparable** to a scraped SERP position
|
|
134
|
+
(or to any number a pre-0.28.0 check reported).
|
|
135
|
+
- `delta` is **positive when you moved up** (the number got smaller), measured against
|
|
136
|
+
`rank.prevWindow` — the equal-length window right before this one. `movers` shifted by 3+;
|
|
137
|
+
anything smaller is averaging noise. `series` is weekly, newest first; weeks with no
|
|
138
|
+
impressions are simply absent, so read the dates, not the spacing.
|
|
139
|
+
- `unseen` lists the keywords on your list that **Search Console did not see this window**.
|
|
140
|
+
This is not "not ranking" — GSC only has a row once you get impressions. It is the honest
|
|
141
|
+
statement "no data yet", and it costs nothing to say. **If you need one of these words' real
|
|
142
|
+
position, that is a separate, deliberate act: `clize seo serp <keyword>`** (~$0.02, and its
|
|
143
|
+
`items` carry both your position and your competitors'). Do not ask for all of them: for a
|
|
144
|
+
word with no demand signal yet, the answer is a slow, expensive way to keep reading "still
|
|
145
|
+
not there".
|
|
146
|
+
- `rank: null` means **this round had nothing to synthesise from** (no Search Console access, or
|
|
147
|
+
no keyword list) — read `notes`. It is not "you rank nowhere".
|
|
148
|
+
- **Competitor positions are not in `check`.** `--competitors` is remembered configuration only;
|
|
149
|
+
a head-to-head on one keyword is `seo serp <keyword>`, where the whole page comes back at once.
|
|
150
|
+
|
|
151
|
+
### `traffic`
|
|
152
|
+
|
|
153
|
+
- `ai` is always present, **including when it is all zeros — zero is the finding.** First
|
|
154
|
+
non-zero AI referral is a real milestone; note the date.
|
|
155
|
+
- The numbers are **adaptively sampled and rounded by magnitude**. Compare them over time.
|
|
156
|
+
Never quote them as exact counts, to yourself or to anyone else.
|
|
157
|
+
- Same-host referrers are internal navigation and already excluded.
|
|
158
|
+
|
|
159
|
+
### `gsc`
|
|
160
|
+
|
|
161
|
+
- `newQueries` is the feedback loop closing: Google is telling you which queries it *considers*
|
|
162
|
+
you relevant for. Queries you never targeted showing real impressions are the most valuable
|
|
163
|
+
output of the whole command.
|
|
164
|
+
- **Impressions with zero clicks at position 60–90 is not a content problem.** It means Google
|
|
165
|
+
is offering you the keyword surface and withholding the position. That is an authority
|
|
166
|
+
bottleneck; writing another page on the same theme will not move it. Go do §3.1.
|
|
167
|
+
- `gsc: null` is not an error. Read `notes` — usually it means the service account has not been
|
|
168
|
+
added to that property yet.
|
|
169
|
+
|
|
170
|
+
### The one rule that ties it together
|
|
171
|
+
|
|
172
|
+
When `rank` puts you at ~70 on a keyword, `gsc` shows hundreds of impressions and almost no
|
|
173
|
+
clicks on it, and `serp` says that page is a `listicle_window` — that is a complete, actionable
|
|
174
|
+
picture: **the demand exists, the position is authority-limited, and the way in is the roundups,
|
|
175
|
+
not another page.** This exact configuration is what clize.ai looked like on 2026-08-30.
|
|
176
|
+
|
|
177
|
+
The mirror image is a word sitting in `unseen` round after round: no impressions at all means
|
|
178
|
+
Google is not even offering you the surface. That is a **discovery** question (is this word
|
|
179
|
+
reachable at your authority? what occupies it? — `seo serp`), not a measurement one. Running
|
|
180
|
+
the measurement again will not answer it.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 6. Two playbooks
|
|
185
|
+
|
|
186
|
+
**New site, cold start.** `seo keywords` on your seed set → drop `wall`, keep `attackable` and
|
|
187
|
+
interesting `no_volume` → `seo serp` each survivor → discard `official_wall` and
|
|
188
|
+
`definition_wall` → for `listicle_window`, collect `parasiteTargets` and start outreach → write
|
|
189
|
+
one page per surviving keyword following §4 → deploy → `seo check --keywords <the survivors>
|
|
190
|
+
--brand <you> --competitors <the two you keep seeing>`. That first check is your baseline.
|
|
191
|
+
|
|
192
|
+
**Recheck.** `clize seo check` with no flags (it remembers everything) → read `movers` first,
|
|
193
|
+
then `traffic.ai`, then `gsc.newQueries`, then what is still in `unseen` → decide: keep waiting,
|
|
194
|
+
add the new queries to the tracked list, or change approach. The check is free, so nothing stops
|
|
195
|
+
you running it — but **SEO is a weeks-to-months system, and the window it measures is 4 weeks
|
|
196
|
+
wide: checking daily just re-reads the same window.** Every two weeks is plenty.
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## 7. Calibration discipline
|
|
201
|
+
|
|
202
|
+
Every measurement here is a sample, not a census. Rank sampling is one fetch of a personalized,
|
|
203
|
+
rotating results page. Traffic is adaptively sampled. AI-engine visibility measured by any tool
|
|
204
|
+
is a sample of a non-deterministic system — one independent evaluation found a major commercial
|
|
205
|
+
tool undercounting by 40×.
|
|
206
|
+
|
|
207
|
+
So: **promise time series against yourself, never absolute share.** "Our AI referrals went from
|
|
208
|
+
0 to 40 a month" is defensible. "We have 3% AI visibility" is not, no matter which tool printed
|
|
209
|
+
it. Breaking this rule in customer-facing copy is a product-integrity failure, not a rounding
|
|
210
|
+
error.
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## What this skill will not do
|
|
215
|
+
|
|
216
|
+
Generate the content (that's your job — clize is the hands, you're the brain), submit to
|
|
217
|
+
directories or post to forums (manual, on purpose), or promise rankings. And there is no
|
|
218
|
+
automatic monitoring: measurement only pays off when someone can act on it, so a recheck happens
|
|
219
|
+
when you show up to run one.
|