@clize/clize 0.35.3 → 0.35.4

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clize/clize",
3
- "version": "0.35.3",
3
+ "version": "0.35.4",
4
4
  "mcpName": "ai.clize/clize",
5
5
  "description": "The real-world capability layer for AI agents — domains, email, deploy, media, SEO/GEO. CLI + MCP.",
6
6
  "keywords": [
@@ -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 Competitor teardown — the only command that produces words
81
+ ### 1.1 The sweepexhaust 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 rival-one.com rival-two.com --limit 25
89
+ clize seo competitors a.com b.com c.com --limit 100 # one call per market: --locale
85
90
  ```
86
91
 
87
- Two or three competitors × `--limit 25` is 50–75 candidates for about $0.09 a domain, pre-filtered
88
- by the only filter that matters: somebody already ranks on them. Read `topKeywords[].keyword`,
89
- drop their brand terms, keep the rest. Pick rivals *your size or one step up* a category
90
- leader's list is head terms you cannot have; the site ranking #4 on your queries hands you the
91
- reachable tail. Run this **first**, before writing down a keyword of your own.
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
 
@@ -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
- 30100 candidates (§1: competitor teardown + capability matrix)
144
+ 5001,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`, 3 domains × 25 | **~$0.28** | the cheapest words you will ever buy |
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
- **A complete cold start runs about $0.70–1.00.** That number is the *cost prior* — carry it.
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` and `format` are part of the row.** "This keyword is good" is not a unit of
220
- work; "write /compare/openrouter/ as a comparison page and pitch these eight roundups" is.
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
 
@@ -576,7 +599,7 @@ pages built across two sessions, zero live. A session does not end with built, u
576
599
 
577
600
  | step | act | it passed if |
578
601
  | --- | --- | --- |
579
- | ① outline | derive structure from `serp`'s `items` (data you already paid for): page type from what the top 10 is, length ≈ closest-shaped rival × 1.1–1.2, topic list from what they cover plus the gap you fill | every H2 can name which SERP occupant or gap it answers; delete any H2 that can't |
602
+ | ① 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
603
  | ② 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
604
  | ③ 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
605
  | ④ deploy | ship it | page live, in sitemap |
@@ -696,17 +719,13 @@ the 3–5 questions your money pages answer in the engines themselves (~15 minut
696
719
  and note who gets named. Zero is a reading.
697
720
 
698
721
  **Do not build a citation-probe cron** — a saved prompt set fired at N engines on a schedule.
699
- Field-tested and rejected, for three reasons that don't age: self-authored prompts carry
700
- self-confirmation bias (hits on questions you wrote prove little about questions users ask); on
701
- a low-authority site the output is a flat zero line that still costs keys, spend caps and
702
- upkeep; and a scheduled measurement nobody is present to act on is inventory, not signalone
703
- such cron sat dark for two weeks without a single decision changing, which is the whole case in
704
- one sentence. A probe earns its keep only once there is something to *attribute*: sustained AI
705
- referrals (tens per month, holding for two months), a real attribution question ("why does the
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.
722
+ Field-tested and rejected: self-authored prompts carry self-confirmation bias, a low-authority
723
+ site's probe is a flat zero line that still costs keys and upkeep, and a measurement nobody is
724
+ present to act on is inventory (one such cron sat dark for two weeks without a decision
725
+ changing). A probe earns its keep only when there is something to *attribute*sustained AI
726
+ referrals, a real attribution question, a before/after around a launch. Until then, referrers
727
+ plus the spot-check; and all AI-citation measurement is sampling trends against your own
728
+ baseline, never absolute share.
710
729
 
711
730
  ---
712
731
 
@@ -841,7 +860,8 @@ appeared, stop where none did, and keep enumerating cells the ledger has not pri
841
860
 
842
861
  **A round is a pipeline, and it opens by building.** ⓪ **ship the qualified batch** — every
843
862
  `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 session's budget is whole → ① read the
863
+ ledger file, each built from its brief (§7.1 ①) — before reading a single number, while the
864
+ session's budget is whole → ① read the
845
865
  feedback (`check`, free) → ② allocate (double down / stop loss / new bet) → ③ execute what is
846
866
  cheap now (siblings, retargets, placement drafts) and write the rest as the next session's
847
867
  `to build` rows → ④ book it (§3) → ⑤ report it (two tables, below). This round's analysis
@@ -908,11 +928,11 @@ to fill in. That state lives in the ledger or nowhere.
908
928
  What the human reads ends with two tables, not with findings. First, **this round's pages** —
909
929
  every row the round touched, one line each:
910
930
 
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 |
931
+ | keyword | locale | serp | target URL | type | angle | status |
932
+ | --- | --- | --- | --- | --- | --- | --- |
933
+ | hreflang 生成 | ja-JP | open (small sites) | /ja/seo/hreflang-tag-generator/ | tool | also emits the sitemap `xhtml:link` block — no occupant does | built |
934
+ | 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 |
935
+ | claude code preise | de-DE | official_wall | — | — | — | skip |
916
936
 
917
937
  `status` is one of `built` (shipped this round), `to build`, `exists` (a page already carries
918
938
  it), `skip` (with the reason). A `to build` row carries a blocker, and only three exist: