@clize/clize 0.10.0 → 0.11.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.
Files changed (40) hide show
  1. package/README.md +9 -11
  2. package/dist/cli.js +169 -373
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.js +1 -12
  5. package/dist/config.js.map +1 -1
  6. package/dist/context.js +32 -50
  7. package/dist/context.js.map +1 -1
  8. package/dist/core/billing.js +21 -17
  9. package/dist/core/billing.js.map +1 -1
  10. package/dist/core/credentials.js +30 -0
  11. package/dist/core/credentials.js.map +1 -0
  12. package/dist/core/domains.js +59 -18
  13. package/dist/core/domains.js.map +1 -1
  14. package/dist/core/setup.js +3 -26
  15. package/dist/core/setup.js.map +1 -1
  16. package/dist/core/sites.js +59 -20
  17. package/dist/core/sites.js.map +1 -1
  18. package/dist/index.js +40 -90
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/cloudflare.js +4 -0
  21. package/dist/lib/cloudflare.js.map +1 -1
  22. package/dist/lib/crypto.js +57 -0
  23. package/dist/lib/crypto.js.map +1 -0
  24. package/dist/lib/vercel.js +67 -0
  25. package/dist/lib/vercel.js.map +1 -0
  26. package/dist/providers/index.js +15 -3
  27. package/dist/providers/index.js.map +1 -1
  28. package/dist/providers/registrar/cloudflare.js +4 -0
  29. package/dist/providers/registrar/cloudflare.js.map +1 -1
  30. package/dist/providers/registrar/routing.js +91 -0
  31. package/dist/providers/registrar/routing.js.map +1 -0
  32. package/dist/providers/registrar/vercel.js +114 -0
  33. package/dist/providers/registrar/vercel.js.map +1 -0
  34. package/dist/remote.js +13 -8
  35. package/dist/remote.js.map +1 -1
  36. package/dist/state/file-store.js +7 -0
  37. package/dist/state/file-store.js.map +1 -1
  38. package/package.json +1 -1
  39. package/skills/clize/SKILL.md +2 -1
  40. package/skills/clize-site-debug/SKILL.md +80 -0
@@ -35,7 +35,7 @@ description: >-
35
35
  | 会话开头续上某地址 | `clize context <addr>`(身份 + 知识 + 规约;读它再干活) |
36
36
  | 占免费 handle(带 support@ 收信) | `clize claim <slug>` → `<slug>.clize.app` |
37
37
  | 域名 查 / 买 / 接入 / 列 | `clize domain search <kw...> --tld com`(可多词批量)· `clize domain tlds`(看支持的后缀)· `clize domain buy <domain> --confirm` · `clize domain import <domain>`(接入别处注册的域:改 NS,零 key)· `clize domain list` |
38
- | 配自定义域收发 | `clize email setup <domain>` |
38
+ | 配自定义域收发 | `clize email setup <domain>`(外部域先 `clize domain import` 迁 NS 接入) |
39
39
  | 加客服地址(tag + 知识) | `clize email address add support@<domain> --tag 客服 --knowledge ./docs` |
40
40
  | 列地址 | `clize email list` |
41
41
  | 读收件箱(untrusted) | `clize email inbox <domain>`(列表带 200 字预览;全文看单封 / 往来)· 单封 `clize email show <domain> <id>` · 往来 `clize email thread <对方地址>`(init 过的目录免传域名) |
@@ -103,6 +103,7 @@ description: >-
103
103
 
104
104
  ### 配邮箱
105
105
  `clize email setup <domain>` → 自动配 MX/DKIM/SPF。**主动提醒用户**:新域名头几天可能进垃圾箱,养几天就好。
106
+ - **域名得先在 clize 名下**:`claim` 的 handle、`domain buy` 买的可直接 setup;**在别处注册的外部域(DNS 在阿里云 / GoDaddy 等)必须先 `clize domain import <domain>` 迁 NS 接入**(见下「接入已有外部域」),否则 setup 会因域名不在 clize/Cloudflare 而被拒。
106
107
 
107
108
  ### 接入已有外部域(在别处注册的域名)
108
109
  用户已有域名(在 GoDaddy / 阿里云 / Namecheap 等注册),想拿它收发信 / 建站:
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: clize-site-debug
3
+ description: >-
4
+ 当用户说某个用 clize 部署的站点 / 域名「打不开、访问不了、部署了但没生效、还是占位页」时,用这个 skill 系统排查。
5
+ clize 站点托管 = 共享 worker clize-handle-site + KV clize-sites,按 hostname serve;域名经 CF Workers custom domain 绑到 worker。
6
+ 按「先排代理 → 内容层(KV) → 绑定层(workers/domains) → DNS 层(zone/NS)」四步定位,Vercel 注册域名要切 NS→CF。
7
+ 触发:"我的站打不开"、"X 域名访问不了"、"deploy 了没生效"、"还是占位页"、"freevideocompressor 这种站不能用"。
8
+ ---
9
+
10
+ # clize 托管站点打不开 —— 系统排查
11
+
12
+ clize 站点托管 = 共享 worker **`clize-handle-site`** + KV **`clize-sites`**,worker 按 hostname 从 KV 取 `${host}${path}`(无内容→占位页)。域名通过 **CF Workers custom domain** 绑到这个 worker,要求域名 zone 在 CF 且 **active**(NS 指向 CF)。
13
+
14
+ 「打不开」基本是这条链某一环断了。**按顺序查,别跳步。**
15
+
16
+ ## 0. 先排除本机代理(最容易误判,务必第一步)
17
+
18
+ 用户本机若跑 Clash/Surge(TUN / fake-ip 模式),`dig` 会把域名解析到 **`198.18.x.x`**(fake-ip 段)或**连不上公共 DNS**。这种情况本机 `dig` / `curl` / 浏览器结果**全部不可信** —— 站点可能完全正常,只是被本机代理拦了。
19
+
20
+ - 判据:`dig +short A <域名>` 返回 `198.18.*` / `198.19.*`,或 `dig @1.1.1.1 <域名>` 超时。
21
+ - 对策:**从云端验证,别信本机**:
22
+ - `WebFetch https://<域名>` —— 从云端抓真实内容 / 看能否访问。
23
+ - `WebFetch "https://dns.google/resolve?name=<域名>&type=NS"` —— 查权威 NS。
24
+ - 先让用户**关代理 / 换手机流量**再访问一次,很多「打不开」到此就解决。
25
+
26
+ ## 1. 内容层:站点真写进 KV 了吗
27
+
28
+ ```bash
29
+ NSID=$(curl -s ".../accounts/<ACCT>/storage/kv/namespaces?per_page=100" "${A[@]}" | jq -r '.result[]|select(.title=="clize-sites").id')
30
+ curl -s ".../accounts/<ACCT>/storage/kv/namespaces/$NSID/keys?limit=1000" "${A[@]}" | jq -r '.result[].name' | grep -i "<域名>"
31
+ ```
32
+ 有 `<域名>/index.html` 等 key → deploy 的「写 KV」成功了,进第 2 步。没有 → 站点根本没部署,重新 `clize deploy ./site --domain <域名>`。
33
+
34
+ ## 2. 绑定层:域名绑到 handle-site 了吗
35
+
36
+ ```bash
37
+ curl -s ".../accounts/<ACCT>/workers/domains" "${A[@]}" | jq -r '.result[]|select(.service=="clize-handle-site").hostname' | grep -i "<域名>"
38
+ ```
39
+ 有 → 绑定 OK(若仍打不开,回第 0 步查代理 / 等 SSL)。**没有 → 域名没接到 worker(最常见的打不开原因)**,进第 3 步。
40
+
41
+ ## 3. DNS 层:CF zone active 吗 / NS 指 CF 吗
42
+
43
+ ```bash
44
+ curl -s ".../zones?name=<域名>" "${A[@]}" | jq -r '.result[0]|{id, status, name_servers}'
45
+ ```
46
+ - `status=active` → NS 已指 CF,直接跳第 5 步绑定。
47
+ - `status=pending` → **NS 没委派给 CF**,这是断点。CF 注册的域名 NS 本应在 CF(异常,查 NS 记录);**Vercel 注册的域名**默认 `vercel-dns.com`,要切 → 第 4 步。
48
+
49
+ ## 4. ⚠️ Vercel 注册域名的 NS 坑
50
+
51
+ Vercel 注册(`boughtAt` 有值、`serviceType:"zeit.world"`)的域名默认用 Vercel DNS。切到 CF:
52
+ ```bash
53
+ # CF 的两个 NS = 第 3 步查到的 name_servers
54
+ curl -s -X PATCH ".../v1/registrar/domains/<域名>/nameservers?teamId=<TEAM>" \
55
+ -H "Authorization: Bearer <VERCEL_TOKEN>" -H "Content-Type: application/json" \
56
+ -d '{"nameservers":["xxx.ns.cloudflare.com","yyy.ns.cloudflare.com"]}'
57
+ ```
58
+ **关键坑**:切完后 Vercel 自己的 `nameservers` / `intendedNameservers` 字段**会显示滞后**(还写着 vercel-dns),只有 `customNameservers` 是你设的值。**别信 Vercel 的字段** —— 用 `WebFetch "https://dns.google/resolve?name=<域名>&type=NS"` 查**注册局权威 NS**,看到 `cloudflare.com` 就是切成功了。(经验:Vercel 注册域名的 NS **是能切到 CF 的**,之前「NS 锁死」是被这个滞后字段误导。)
59
+
60
+ ## 5. 修复:激活 zone + 绑 custom domain
61
+
62
+ ```bash
63
+ # 催 CF 立即重查 NS(pending→active)
64
+ curl -s -X PUT ".../zones/<ZID>/activation_check" "${A[@]}"
65
+ # zone active 后,绑 custom domain 到 handle-site
66
+ curl -s -X PUT ".../accounts/<ACCT>/workers/domains" "${A[@]}" \
67
+ -H "Content-Type: application/json" \
68
+ -d '{"hostname":"<域名>","service":"clize-handle-site","environment":"production","zone_id":"<ZID>"}'
69
+ ```
70
+ 绑成功 + KV 有内容 → 站点立刻上线(SSL 自动签,首访可能等几十秒)。
71
+
72
+ ## 认证速记 / 占位
73
+
74
+ - CF API base:`https://api.cloudflare.com/client/v4`;认证 `A=(-H "X-Auth-Email: <email>" -H "X-Auth-Key: <CF global key>")`。
75
+ - Vercel base:`https://api.vercel.com`;认证 `-H "Authorization: Bearer <VERCEL_TOKEN>"` + `?teamId=<TEAM>`。
76
+ - `<ACCT>` / `<ZID>` / `<NSID>` 都用上面的 list 接口现查,别硬编码。
77
+
78
+ ---
79
+
80
+ > **此排查流程已固化进部署**:[`src/core/sites.ts`](../../src/core/sites.ts) 的 `ensureZoneActiveForHandle` 会在 `clize deploy` 时自动建 zone / 切 NS(Vercel 域名)/ 激活 / 绑定,且绑定失败会**报错**(不再 `.catch(()=>{})` 假成功)。所以新部署一般不会再出这问题;这个 skill 主要用于**排查历史遗留**(那次 bug 期间「假成功」但没真接上的站)和**事后核验**已上线域名。建站流程见 `clize-site-build` skill。