@clize/clize 0.35.3 → 0.35.5
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/package.json +1 -1
- package/skills/clize-seo/SKILL.md +74 -38
package/package.json
CHANGED
|
@@ -43,8 +43,8 @@ on our own tenant zero, 2026-09): every funded row is a head term — `stretch`
|
|
|
43
43
|
`no_volume` / `pre_emergence` cell. Eleven weeks, 45 pages, 0 clicks, and the only cluster with
|
|
44
44
|
impressions was one Google picked for us. The read is `keywords.byBand` against the ledger's
|
|
45
45
|
`format` column: if the ledger holds no row your authority can win, placement is not the fix
|
|
46
|
-
either — re-derive the ledger toward tool, long-tail and locale cells (§1.2, §7.2)
|
|
47
|
-
pitching a roundup. The counter-evidence sits in the same dogfood: tabledi and kunavo earned
|
|
46
|
+
either — re-derive the ledger toward tool, long-tail and locale cells (§1.2, §7.2), building
|
|
47
|
+
the tools if the site has none, before pitching a roundup. The counter-evidence sits in the same dogfood: tabledi and kunavo earned
|
|
48
48
|
page-1 positions with zero links, on tool and long-tail pages. Settle it per site with one round
|
|
49
49
|
of such rows enrolled in `check`, not by argument.
|
|
50
50
|
|
|
@@ -78,17 +78,32 @@ One free source comes before the paid ones: **the entry read's own gsc face** (
|
|
|
78
78
|
`gsc.topQueries` / `newQueries` are Google's list of what it already considers you relevant for.
|
|
79
79
|
On a site with history it is the best-fitted word source there is; on a new site it is empty.
|
|
80
80
|
|
|
81
|
-
### 1.1
|
|
81
|
+
### 1.1 The sweep — exhaust the competitor space once, then top it up
|
|
82
|
+
|
|
83
|
+
`competitors` is the one command that hands you keywords you did not think of, and it is cheap
|
|
84
|
+
enough to run to exhaustion — which no round had done before 2026-09-03: three sites, a dozen
|
|
85
|
+
rivals torn down in total at `--limit 25`, ledgers of 40–60 rows on sites whose honest cell
|
|
86
|
+
space is a few hundred. Do it once per site, and again whenever a product line is added:
|
|
82
87
|
|
|
83
88
|
```
|
|
84
|
-
clize seo competitors
|
|
89
|
+
clize seo competitors a.com b.com c.com --limit 100 # one call per market: --locale
|
|
85
90
|
```
|
|
86
91
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
+
| step | size | cost |
|
|
93
|
+
| --- | --- | --- |
|
|
94
|
+
| list every rival: every host on every SERP you have bought (`items[].host`) plus each product line's direct rivals — sites your size or one step up, not category leaders (their list is head terms you cannot have) | 15–25 domains | $0 |
|
|
95
|
+
| `competitors --limit 100`, per relevant market | 1,500–2,500 keywords, ~800 after dedupe | ~$0.04 a domain |
|
|
96
|
+
| `seo keywords` on all of them, one call per market | ~800 | ~$0.20 |
|
|
97
|
+
| `seo serp` on every `attackable`, `no_volume` and `no_data` survivor (§5) | ~300 | ~$6 |
|
|
98
|
+
| rows into the ledger, each with a verdict | 80–120 buildable | — |
|
|
99
|
+
|
|
100
|
+
About $8 and one session, and the ledger goes from forty rows to a hundred-plus. Read
|
|
101
|
+
`topKeywords[].keyword`, drop their brand terms, keep the rest. Two things the sweep is not: it
|
|
102
|
+
is not re-run every round (the 30-day cache makes that free and pointless — top up with the new
|
|
103
|
+
hosts each round's SERPs reveal), and it does not replace §1.2 (a rival's list is what *they*
|
|
104
|
+
rank for; your capability cells are what *you* can serve). Expect the SERP step to kill a third
|
|
105
|
+
to a half of the low-KD survivors — walls the difficulty score cannot see (§4): PDF→Excel at KD 0
|
|
106
|
+
in five markets was Adobe and iLovePDF in all five. That is the funnel working, not failing.
|
|
92
107
|
|
|
93
108
|
### 1.2 Capability-surface enumeration — cross the axes, don't brainstorm
|
|
94
109
|
|
|
@@ -102,7 +117,7 @@ the cross-product. Mechanical is the point.
|
|
|
102
117
|
| Competitor displacement | each competitor brand | `alternative` / `vs <you>` / `pricing` / `review` | `openrouter alternative` |
|
|
103
118
|
| New-thing window | model / API / spec names released in the last 90 days | `api`, `pricing`, `how to use` | `seedance api pricing` |
|
|
104
119
|
| Host × capability | each agent host you have actually tested | each thing the product does for it | `openclaw email`, `codex deploy site` |
|
|
105
|
-
| Tool × locale | each browser-side tool you can honestly ship | each market you can serve | `hreflang generator` in `ja-JP` |
|
|
120
|
+
| Tool × locale | each browser-side tool you can honestly ship — built, or not built yet (§7.2, deriving the tool set) | each market you can serve | `hreflang generator` in `ja-JP` |
|
|
106
121
|
| Locale × head term | your two or three head terms | each market you can serve | `de-DE` pricing cluster (price it; §7.2 on whether to build it) |
|
|
107
122
|
|
|
108
123
|
- **Write every cell, then filter.** Filtering while enumerating is recalling again.
|
|
@@ -126,7 +141,7 @@ A round is a funnel with a known size and a known price — and there is no such
|
|
|
126
141
|
"analysis round": every round ends in pages or in a blocker the human must clear (§10).
|
|
127
142
|
|
|
128
143
|
```
|
|
129
|
-
|
|
144
|
+
500–1,000 candidates once (§1.1 sweep), then 30–100 a round (§1.2 matrix + top-ups)
|
|
130
145
|
→ seo keywords price the whole list in one batched call
|
|
131
146
|
→ drop `wall`; keep `attackable`, `no_volume` and `no_data` (§5: the SERP decides, not the volume table)
|
|
132
147
|
→ seo serp each survivor the SERP check that KD cannot replace (§4)
|
|
@@ -140,12 +155,13 @@ A round is a funnel with a known size and a known price — and there is no such
|
|
|
140
155
|
| step | price | note |
|
|
141
156
|
| --- | --- | --- |
|
|
142
157
|
| `seo keywords`, 40 words | **~$0.10** | one batched call; per-word cost is negligible next to the fixed cost, so **always send the whole list at once** |
|
|
143
|
-
| `seo competitors`,
|
|
158
|
+
| `seo competitors`, one domain × `--limit 100` | **~$0.04** | the cheapest words you will ever buy — a 20-domain sweep is under a dollar |
|
|
144
159
|
| `seo serp`, one keyword | **~$0.02** | every survivor gets one, `no_data` cells included — 20–100 of these is $0.40–2.00 |
|
|
145
160
|
| `seo check` | **free**, plus ~$0.005/word to price words it has never priced | the metrics are reused for 30 days, so a re-check costs nothing |
|
|
146
161
|
| `seo spend` | **free** | itemized ledger of every charge — **copy it into the deliverable, never hand-tally** |
|
|
147
162
|
|
|
148
|
-
**
|
|
163
|
+
**The sweep is about $8, once; a round after it is about $1.** Those are the *cost priors* —
|
|
164
|
+
carry them.
|
|
149
165
|
|
|
150
166
|
Three behaviours follow, and all matter:
|
|
151
167
|
|
|
@@ -199,10 +215,10 @@ find out where every bet stands. `check` remembers the keyword list, the brand a
|
|
|
199
215
|
property; it does not remember whether you shipped the page or sent the pitch, and it never
|
|
200
216
|
will — it cannot measure those. That half of the state exists only here.
|
|
201
217
|
|
|
202
|
-
| keyword | locale | sv | kd | serp verdict | intent | target page | page | placement | format | priority |
|
|
218
|
+
| keyword | locale | sv | kd | serp verdict | intent | target page | page | placement | format · angle | priority |
|
|
203
219
|
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
|
204
|
-
| openrouter alternative | en-US | 1,300 | 1 | listicle_window | commercial | /compare/openrouter/ | shipped:/compare/openrouter/, 08-30 | pitched: apidog roundup, 08-31 | comparison + pitch 8 roundups | P0 |
|
|
205
|
-
| email api for ai agents | en-US | 0 (no_volume) | — | listicle_window | commercial | /inbox/ | shipped:/inbox/, 08-27 | none | landing + pitch 4 roundups | P0 |
|
|
220
|
+
| openrouter alternative | en-US | 1,300 | 1 | listicle_window | commercial | /compare/openrouter/ | shipped:/compare/openrouter/, 08-30 | pitched: apidog roundup, 08-31 | comparison · *the only gateway that publishes its failover log* + pitch 8 roundups | P0 |
|
|
221
|
+
| email api for ai agents | en-US | 0 (no_volume) | — | listicle_window | commercial | /inbox/ | shipped:/inbox/, 08-27 | none | landing · *an inbox the agent owns, not a Gmail it borrows* + pitch 4 roundups | P0 |
|
|
206
222
|
| メッセージストリームでエラー | ja-JP | 2,900 | 0 | definition_wall (UGC) | informational | — | none | none | skip: Reddit/Zenn own it | — |
|
|
207
223
|
|
|
208
224
|
- **`target page` is the intent; `page` and `placement` are the facts.** `target page` says which
|
|
@@ -216,8 +232,10 @@ will — it cannot measure those. That half of the state exists only here.
|
|
|
216
232
|
- **A row with a page and no placement is half a bet.** Building the page and not placing it is
|
|
217
233
|
manufacturing stock and never shipping it — the failure shape in the formula up top. The
|
|
218
234
|
`placement` column is there so that half is visible at a glance instead of buried in prose.
|
|
219
|
-
- **`target page
|
|
220
|
-
work; "write /compare/openrouter/ as a comparison page and pitch these eight
|
|
235
|
+
- **`target page`, `format` and the angle are part of the row.** "This keyword is good" is not
|
|
236
|
+
a unit of work; "write /compare/openrouter/ as a comparison page and pitch these eight
|
|
237
|
+
roundups" is — and the angle (§7.1 ①) is the one line that says why that page and not a
|
|
238
|
+
competent copy of the occupants.
|
|
221
239
|
- **Rows you decided against stay in the table**, with the reason. That is what stops the next
|
|
222
240
|
session from re-buying the same keyword — and a `skip` row with a reason is a real finding.
|
|
223
241
|
- **Opening the ledger on a site that already has analysis documents** (a plan, an older
|
|
@@ -299,6 +317,11 @@ run* — all six have been observed in real runs that read as finished.
|
|
|
299
317
|
URLs, not qualified rows; a ledger of twenty rows and two pages is a session that spent itself
|
|
300
318
|
on the analysis. Observed on kunavo: five rounds, five pages, three of the rounds at zero; and on clize.ai
|
|
301
319
|
the opposite failure — eleven weeks in which no round ran at all. If a page costs a session, the first deliverable is the generator (§7).
|
|
320
|
+
7. **Pages without a brief.** A page whose row names no occupant gap and no product asset is a
|
|
321
|
+
competent copy of the top 10, and at zero authority a competent copy does not rank: kunavo's
|
|
322
|
+
five model spec pages, built from the query alone against a page of opinion pieces, read zero
|
|
323
|
+
for three to eight weeks. The brief (§7.1 ①) is written before the page, and its angle sits in
|
|
324
|
+
the ledger row; no angle, no page.
|
|
302
325
|
|
|
303
326
|
---
|
|
304
327
|
|
|
@@ -550,7 +573,8 @@ a family generator existed, and tabledi shipped forty in two days from one. Buil
|
|
|
550
573
|
before the second page of any family, and never machine-translate a family page.
|
|
551
574
|
|
|
552
575
|
**On a site that already has tools, this round's page count is the locale siblings of the tools
|
|
553
|
-
it has**, and the gate is each cell's own SERP (§7.2)
|
|
576
|
+
it has**, and the gate is each cell's own SERP (§7.2); a site without tools derives the set
|
|
577
|
+
first (§7.2). Siblings come in two prices. A *format*
|
|
554
578
|
tool (viewer, merge, split, convert) is one strings entry (tabledi: a `DICT` table in
|
|
555
579
|
`tools/apps.js`; clize.ai: a `strings.<loc>.mjs`) — ten in a session is ordinary. A *text* tool
|
|
556
580
|
(duplicates, compare, clean) carries locale semantics — full-width and half-width forms in
|
|
@@ -576,7 +600,7 @@ pages built across two sessions, zero live. A session does not end with built, u
|
|
|
576
600
|
|
|
577
601
|
| step | act | it passed if |
|
|
578
602
|
| --- | --- | --- |
|
|
579
|
-
| ①
|
|
603
|
+
| ① brief | five fields, written into the row before a word of the page: **intent** — what the searcher wants, from the query, the shapes in the top 10, and Search Console when the site already earns on it (§4); **occupants** — open and *read* the top 3–5 pages, not their titles: structure, length, what each answers, promises and lacks (you fetch them yourself; there is no command for this and $0); **product truth** — what the product actually does for this intent (gate 3) and what only it has: first-party data, a working tool, a capability the occupants lack; **angle** — one sentence naming an occupant gap that a product truth fills; **form** — page type from what the top 10 is, length ≈ closest-shaped rival × 1.1–1.2, every H2 mapped to an occupant or a gap, the first 200 words, the FAQ in that market's phrasing. One brief per family; locale siblings change terminology and FAQ only | the angle names a gap *and* an asset — no angle, no page, and the row becomes `skip: no angle`. The three pages that worked had one (clize's OpenClaw page: "an inbox the agent owns" against two "borrow your Gmail" occupants; tabledi's Japanese dedupe: full-width forms, which a wall of tutorials never mentions; kunavo's 529 page: real failover numbers nobody on the page had); the five that read zero did not |
|
|
580
604
|
| ② produce | skeleton from `build site start`, judgment from here, words and code from you | first 200 words answer the query completely; your definition sentence is verbatim-identical site-wide |
|
|
581
605
|
| ③ self-check | against the spec sheet — there is deliberately no audit command | visible FAQ ↔ JSON-LD strictly 1:1; ≥2 internal links with varied anchors |
|
|
582
606
|
| ④ deploy | ship it | page live, in sitemap |
|
|
@@ -588,6 +612,21 @@ intent row → use-case; tool-intent row → tool page.
|
|
|
588
612
|
### 7.2 Tool pages
|
|
589
613
|
|
|
590
614
|
The one page type where the content *is* the function — and the strongest link asset (§6.1).
|
|
615
|
+
|
|
616
|
+
**A site with fewer than five tools has no multiplier, and inventing the tool set is its first
|
|
617
|
+
production task** — not a product decision to wait for. Three sources, all paid for already or
|
|
618
|
+
free: (1) the sweep (§1.1) — every rival keyword shaped like a calculator, converter, counter,
|
|
619
|
+
checker, estimator or generator; tabledi's teardown found rows.com, formulabot and quadratic
|
|
620
|
+
earn their organic traffic from free calculators, not product pages, and that finding sat in a
|
|
621
|
+
ledger for three days without becoming a rule; (2) the product's own data — a catalog with
|
|
622
|
+
prices is a cost calculator, a limits table is a context-window checker, a media catalog is a
|
|
623
|
+
generation-cost estimator, a list of formats is a converter; every number the product already
|
|
624
|
+
maintains is a tool nobody else can keep current; (3) the neighbours of the tools you have.
|
|
625
|
+
Each candidate gets an English SERP ($0.02) before a line of code; two or three tools per
|
|
626
|
+
session is the honest rate; once the family exists, §7's sibling rule multiplies it by every
|
|
627
|
+
verified market. kunavo, 2026-09-03: two tool URLs, 43 hand-written locale guides, six pages a
|
|
628
|
+
round — the page-type mix set that ceiling, not the process.
|
|
629
|
+
|
|
591
630
|
Judgment calls that matter:
|
|
592
631
|
|
|
593
632
|
- **Three words are the whole quality bar: free, instant, no signup.** Tool above the fold,
|
|
@@ -696,17 +735,13 @@ the 3–5 questions your money pages answer in the engines themselves (~15 minut
|
|
|
696
735
|
and note who gets named. Zero is a reading.
|
|
697
736
|
|
|
698
737
|
**Do not build a citation-probe cron** — a saved prompt set fired at N engines on a schedule.
|
|
699
|
-
Field-tested and rejected
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
engine name the competitor and not us?"), or a before/after comparison around a content-pack
|
|
707
|
-
launch. Until one of those fires, referrers plus the spot-check are the honest instruments.
|
|
708
|
-
And all AI-citation measurement is sampling — trust trends against your own baseline, never
|
|
709
|
-
absolute share.
|
|
738
|
+
Field-tested and rejected: self-authored prompts carry self-confirmation bias, a low-authority
|
|
739
|
+
site's probe is a flat zero line that still costs keys and upkeep, and a measurement nobody is
|
|
740
|
+
present to act on is inventory (one such cron sat dark for two weeks without a decision
|
|
741
|
+
changing). A probe earns its keep only when there is something to *attribute* — sustained AI
|
|
742
|
+
referrals, a real attribution question, a before/after around a launch. Until then, referrers
|
|
743
|
+
plus the spot-check; and all AI-citation measurement is sampling — trends against your own
|
|
744
|
+
baseline, never absolute share.
|
|
710
745
|
|
|
711
746
|
---
|
|
712
747
|
|
|
@@ -841,7 +876,8 @@ appeared, stop where none did, and keep enumerating cells the ledger has not pri
|
|
|
841
876
|
|
|
842
877
|
**A round is a pipeline, and it opens by building.** ⓪ **ship the qualified batch** — every
|
|
843
878
|
`to build` row from the last round and every plan cell with its own SERP verdict (§3), in every
|
|
844
|
-
ledger file — before reading a single number, while the
|
|
879
|
+
ledger file, each built from its brief (§7.1 ①) — before reading a single number, while the
|
|
880
|
+
session's budget is whole → ① read the
|
|
845
881
|
feedback (`check`, free) → ② allocate (double down / stop loss / new bet) → ③ execute what is
|
|
846
882
|
cheap now (siblings, retargets, placement drafts) and write the rest as the next session's
|
|
847
883
|
`to build` rows → ④ book it (§3) → ⑤ report it (two tables, below). This round's analysis
|
|
@@ -873,7 +909,7 @@ and on a site with history it hands you free seeds (`gsc.topQueries` / `newQueri
|
|
|
873
909
|
| a `rank.movers` row whose impressions collapsed with a flat position, or a `gsc.pages.movers` row with `status` ≠ 200 | **technical round, no keyword work**: restore or redirect the URL, request indexing, re-read next window. Shape B (top of this file) — links and new pages do not fix a dead URL |
|
|
874
910
|
| `gsc.pages.unseen` rows whose `index` is not indexed | **indexing round**: internal links into them, sitemap `lastmod`, indexing requests; do not judge their keywords until a window after they are indexed. This row is also the batch gate (§7.3 gate 4): last batch mostly indexed → ship the next family; mostly `Crawled - currently not indexed` → no new pages this round, and retire what Google has refused twice |
|
|
875
911
|
| `rank.pending` non-empty | those words are not measured yet — no branch applies to them this round; do not read their zero as "missed" |
|
|
876
|
-
| `authority_limited` | placement only **on that theme** — another page on it will not move it (§6). The label is per keyword, not per site: production continues on every other theme. If every funded theme reads this way, the site is Shape C (top of this file): re-derive the ledger toward tool, long-tail and locale rows before pitching |
|
|
912
|
+
| `authority_limited` | placement only **on that theme** — another page on it will not move it (§6). The label is per keyword, not per site: production continues on every other theme. If every funded theme reads this way, the site is Shape C (top of this file): re-derive the ledger toward tool, long-tail and locale rows before pitching — and a site with no tools builds them first (§7.2) |
|
|
877
913
|
| `gsc.newQueries` non-empty | mini-discovery: fold them into the matrix, price the new cells, extend the tracked list if they survive the SERP check |
|
|
878
914
|
| no movers two rounds running | the plan is stale, not slow — back to §1 and re-derive toward new page types; more waiting will not convert a flat line. The placement queue does not gate this: a queue that has waited on a human for two rounds is recorded as `blocked:` and handed over, and production goes on without it — placement is human-gated, building is not, and one must never hold the other (kunavo's four ready pitches held production for seven rounds) |
|
|
879
915
|
|
|
@@ -908,11 +944,11 @@ to fill in. That state lives in the ledger or nowhere.
|
|
|
908
944
|
What the human reads ends with two tables, not with findings. First, **this round's pages** —
|
|
909
945
|
every row the round touched, one line each:
|
|
910
946
|
|
|
911
|
-
| keyword | locale | serp | target URL | type | status |
|
|
912
|
-
| --- | --- | --- | --- | --- | --- |
|
|
913
|
-
| hreflang 生成 | ja-JP | open (small sites) | /ja/seo/hreflang-tag-generator/ | tool | built |
|
|
914
|
-
| open webui api key | en-US | open | /docs/integrations/open-webui | integration doc | to build: generator first |
|
|
915
|
-
| claude code preise | de-DE | official_wall | — | — | skip |
|
|
947
|
+
| keyword | locale | serp | target URL | type | angle | status |
|
|
948
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
949
|
+
| hreflang 生成 | ja-JP | open (small sites) | /ja/seo/hreflang-tag-generator/ | tool | also emits the sitemap `xhtml:link` block — no occupant does | built |
|
|
950
|
+
| open webui api key | en-US | open | /docs/integrations/open-webui | integration doc | the one setup page that states the model-routing limit | to build: generator first |
|
|
951
|
+
| claude code preise | de-DE | official_wall | — | — | — | skip |
|
|
916
952
|
|
|
917
953
|
`status` is one of `built` (shipped this round), `to build`, `exists` (a page already carries
|
|
918
954
|
it), `skip` (with the reason). A `to build` row carries a blocker, and only three exist:
|