@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clize/clize",
3
- "version": "0.35.3",
3
+ "version": "0.35.5",
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": [
@@ -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) before
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 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
 
@@ -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
- 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
 
@@ -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). Siblings come in two prices. A *format*
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
- | ① 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 |
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, 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.
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 session's budget is whole → ① read 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: