@clize/clize 0.13.4 → 0.15.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/dist/cli.js +126 -5
- package/dist/cli.js.map +1 -1
- package/dist/core/env-detect.js +104 -0
- package/dist/core/env-detect.js.map +1 -0
- package/dist/core/install.js +276 -18
- package/dist/core/install.js.map +1 -1
- package/dist/core/sites.js +149 -6
- package/dist/core/sites.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/remote.js +6 -0
- package/dist/remote.js.map +1 -1
- package/package.json +1 -1
- package/skills/clize-site-build/SKILL.md +30 -0
package/dist/core/install.js
CHANGED
|
@@ -7,9 +7,10 @@
|
|
|
7
7
|
import fs from "node:fs";
|
|
8
8
|
import os from "node:os";
|
|
9
9
|
import path from "node:path";
|
|
10
|
-
import { spawnSync } from "node:child_process";
|
|
10
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
11
11
|
import { fileURLToPath } from "node:url";
|
|
12
12
|
import { VERSION } from "../version.js";
|
|
13
|
+
import { installEnv } from "./env-detect.js";
|
|
13
14
|
/** 定位包根(含 package.json 的目录)。dev(src/core/install.ts)与 prod(dist/core/install.js)同样适用。 */
|
|
14
15
|
function pkgRoot() {
|
|
15
16
|
let dir = path.dirname(fileURLToPath(import.meta.url));
|
|
@@ -28,6 +29,134 @@ function tilde(p) {
|
|
|
28
29
|
const home = os.homedir();
|
|
29
30
|
return p.startsWith(home) ? "~" + p.slice(home.length) : p;
|
|
30
31
|
}
|
|
32
|
+
// ───────── skill 版本戳(P2:让「装的 skill ≠ 当前 CLI」可检测)─────────
|
|
33
|
+
const SKILL_VERSION_KEY = "clize_version";
|
|
34
|
+
/** 在 SKILL.md 的 YAML frontmatter 里写入/更新 clize 版本戳(顶层 key,Claude Code 容忍额外字段)。 */
|
|
35
|
+
export function stampSkillVersion(raw, version) {
|
|
36
|
+
const stampLine = `${SKILL_VERSION_KEY}: ${version}`;
|
|
37
|
+
const fm = raw.match(/^(---\n[\s\S]*?\n)(---[ \t]*\r?\n?)/);
|
|
38
|
+
if (!fm)
|
|
39
|
+
return `---\n${stampLine}\n---\n\n${raw}`; // 无 frontmatter(极少见):补一个
|
|
40
|
+
const keyRe = new RegExp(`^${SKILL_VERSION_KEY}:.*$`, "m");
|
|
41
|
+
const head = keyRe.test(fm[1])
|
|
42
|
+
? fm[1].replace(keyRe, stampLine) // 已有戳 → 改值
|
|
43
|
+
: fm[1] + stampLine + "\n"; // 无戳 → 追加到 frontmatter 末尾(--- 之前)
|
|
44
|
+
return head + fm[2] + raw.slice(fm[0].length);
|
|
45
|
+
}
|
|
46
|
+
/** 从 SKILL.md 文本读 clize 版本戳;无戳(旧安装 / 未盖)→ null。 */
|
|
47
|
+
export function readSkillVersion(text) {
|
|
48
|
+
const m = text.match(new RegExp(`^${SKILL_VERSION_KEY}:\\s*(\\S+)\\s*$`, "m"));
|
|
49
|
+
return m ? m[1] : null;
|
|
50
|
+
}
|
|
51
|
+
/** 朴素 semver 比较:a 是否比 b 新(忽略 pre-release 尾巴)。 */
|
|
52
|
+
export function isNewer(a, b) {
|
|
53
|
+
const part = (v) => v
|
|
54
|
+
.split("-")[0]
|
|
55
|
+
.split(".")
|
|
56
|
+
.map((n) => parseInt(n, 10) || 0);
|
|
57
|
+
const pa = part(a);
|
|
58
|
+
const pb = part(b);
|
|
59
|
+
for (let i = 0; i < 3; i++) {
|
|
60
|
+
const x = pa[i] || 0;
|
|
61
|
+
const y = pb[i] || 0;
|
|
62
|
+
if (x !== y)
|
|
63
|
+
return x > y;
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
// ───────── 安装器探测 + 「实际生效版本」校验(P0)─────────
|
|
68
|
+
/** 当前运行时的路径线索(node 二进制 + 本模块 + 入口脚本)→ 推断安装器。 */
|
|
69
|
+
function runtimePaths() {
|
|
70
|
+
let here = "";
|
|
71
|
+
try {
|
|
72
|
+
here = fileURLToPath(import.meta.url);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
/* 取不到无妨 */
|
|
76
|
+
}
|
|
77
|
+
return [process.execPath, here, process.argv[1] || ""];
|
|
78
|
+
}
|
|
79
|
+
/** 本机这份 clize 的安装方式 + 「真正生效」的升级命令。 */
|
|
80
|
+
export function runtimeInstallEnv() {
|
|
81
|
+
return installEnv(runtimePaths());
|
|
82
|
+
}
|
|
83
|
+
/** 重新解析「实际会被调用的」clize 版本(spawn 真二进制,绕开当前进程的 VERSION)。
|
|
84
|
+
* 升级后校验「装的 = 跑的」靠它 —— 别信 npm/volta 命令的退出码。 */
|
|
85
|
+
function resolvedClizeVersion() {
|
|
86
|
+
const win = process.platform === "win32";
|
|
87
|
+
const r = spawnSync(win ? "clize.cmd" : "clize", ["--version"], {
|
|
88
|
+
encoding: "utf8",
|
|
89
|
+
shell: win,
|
|
90
|
+
timeout: 15000,
|
|
91
|
+
});
|
|
92
|
+
if (r.status !== 0)
|
|
93
|
+
return null;
|
|
94
|
+
const out = `${r.stdout || ""}`.trim();
|
|
95
|
+
const m = out.match(/\d+\.\d+\.\d+[\w.-]*/);
|
|
96
|
+
return m ? m[0] : out || null;
|
|
97
|
+
}
|
|
98
|
+
// ───────── 更新检查缓存(P1:正常调用时被动提示)─────────
|
|
99
|
+
function clizeHome() {
|
|
100
|
+
return path.join(os.homedir(), ".clize");
|
|
101
|
+
}
|
|
102
|
+
function updateCacheFile() {
|
|
103
|
+
return path.join(clizeHome(), "update-check.json");
|
|
104
|
+
}
|
|
105
|
+
/** 写「registry 最新版」缓存(被动提示读它,零延迟、零网络)。best-effort。 */
|
|
106
|
+
export function writeLatestCache(latest) {
|
|
107
|
+
try {
|
|
108
|
+
fs.mkdirSync(clizeHome(), { recursive: true });
|
|
109
|
+
fs.writeFileSync(updateCacheFile(), JSON.stringify({ latest, checkedAt: new Date().toISOString() }));
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
/* 缓存写不进无妨 */
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function readLatestCache() {
|
|
116
|
+
try {
|
|
117
|
+
const c = JSON.parse(fs.readFileSync(updateCacheFile(), "utf8"));
|
|
118
|
+
return c && typeof c.latest === "string" ? c : null;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** 同步、纯读缓存:有更新就给一行提示文案,否则 null(不联网,不阻塞)。 */
|
|
125
|
+
export function staleNudge() {
|
|
126
|
+
const c = readLatestCache();
|
|
127
|
+
if (!c?.latest || !isNewer(c.latest, VERSION))
|
|
128
|
+
return null;
|
|
129
|
+
const env = runtimeInstallEnv();
|
|
130
|
+
return `↑ clize 有新版 ${c.latest}(当前 ${VERSION})。升级:${env.upgradeCmd} · 体检:clize doctor`;
|
|
131
|
+
}
|
|
132
|
+
/** 后台节流刷新缓存(detached 子进程,一天至多一次,不阻塞当前命令)。 */
|
|
133
|
+
export function scheduleUpdateCheck() {
|
|
134
|
+
try {
|
|
135
|
+
const c = readLatestCache();
|
|
136
|
+
if (c?.checkedAt) {
|
|
137
|
+
const age = Date.now() - Date.parse(c.checkedAt);
|
|
138
|
+
if (age >= 0 && age < 24 * 3600 * 1000)
|
|
139
|
+
return; // 一天内查过 → 跳过
|
|
140
|
+
}
|
|
141
|
+
const entry = process.argv[1];
|
|
142
|
+
if (!entry)
|
|
143
|
+
return;
|
|
144
|
+
const child = spawn(process.execPath, [entry, "__refresh-update-cache"], {
|
|
145
|
+
detached: true,
|
|
146
|
+
stdio: "ignore",
|
|
147
|
+
});
|
|
148
|
+
child.unref();
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
/* 起不来无妨 */
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** 隐藏命令 `__refresh-update-cache` 的实现:拉 registry → 写缓存 → 退出。 */
|
|
155
|
+
export async function refreshUpdateCache() {
|
|
156
|
+
const latest = await latestVersion();
|
|
157
|
+
if (latest)
|
|
158
|
+
writeLatestCache(latest);
|
|
159
|
+
}
|
|
31
160
|
function harnesses() {
|
|
32
161
|
const home = os.homedir();
|
|
33
162
|
return [
|
|
@@ -108,10 +237,10 @@ export function install(opts = {}) {
|
|
|
108
237
|
for (const h of targets) {
|
|
109
238
|
const seen = fs.existsSync(h.homeDir);
|
|
110
239
|
out.push(`▸ ${h.name}${seen ? "" : "(未探测到配置目录,仍按你的要求安装)"}`);
|
|
111
|
-
// 1) 铺 skill
|
|
240
|
+
// 1) 铺 skill(盖上当前 clize 版本戳 → 之后 doctor 能看出「装的 skill ≠ 当前 CLI」)
|
|
112
241
|
for (const s of skills) {
|
|
113
242
|
const dest = path.join(h.skillsDir, s.name, "SKILL.md");
|
|
114
|
-
const next = fs.readFileSync(s.file, "utf8");
|
|
243
|
+
const next = stampSkillVersion(fs.readFileSync(s.file, "utf8"), VERSION);
|
|
115
244
|
let prev;
|
|
116
245
|
try {
|
|
117
246
|
prev = fs.readFileSync(dest, "utf8");
|
|
@@ -159,27 +288,156 @@ async function latestVersion() {
|
|
|
159
288
|
return null;
|
|
160
289
|
}
|
|
161
290
|
}
|
|
162
|
-
/**
|
|
291
|
+
/** 升级后刷新 skill。关键:用「新装好的」clize 重跑 install —— 而不是在当前(旧)进程里读旧包根。
|
|
292
|
+
* 旧实现就是在这翻车的:升级后立刻 install(),但本进程的 pkgRoot 仍是旧版目录 → 又把旧 skill 铺了一遍。 */
|
|
293
|
+
function refreshSkillsViaNewBinary(opts) {
|
|
294
|
+
const win = process.platform === "win32";
|
|
295
|
+
const args = ["install", ...(opts.mcp ? ["--mcp"] : [])];
|
|
296
|
+
const r = spawnSync(win ? "clize.cmd" : "clize", args, { encoding: "utf8", shell: win });
|
|
297
|
+
if (r.status === 0 && r.stdout)
|
|
298
|
+
return r.stdout.trim();
|
|
299
|
+
return install({ mcp: opts.mcp }); // 兜底:spawn 不到新二进制(罕见)→ 退回当前进程(已 verify 同版本)
|
|
300
|
+
}
|
|
301
|
+
/** 更新 clize 并刷新 skill。认得 volta/asdf/nodenv/pnpm/bun(裸 npm i -g 在这些下面是假成功),
|
|
302
|
+
* 且升级后**实测**「实际生效版本」,不信命令退出码。进度走 stderr,最终报告走 stdout。 */
|
|
163
303
|
export async function update(opts = {}) {
|
|
164
304
|
const current = VERSION;
|
|
165
305
|
const latest = await latestVersion();
|
|
166
|
-
|
|
306
|
+
if (latest)
|
|
307
|
+
writeLatestCache(latest);
|
|
308
|
+
const env = runtimeInstallEnv();
|
|
309
|
+
process.stderr.write(`clize update\n 当前 ${current}${latest ? ` · 最新 ${latest}` : " · (查不到 registry)"}\n` +
|
|
310
|
+
` 安装方式 ${env.manager}${env.npmNoop ? "(裸 npm i -g 不生效)" : ""}\n`);
|
|
167
311
|
if (opts.check)
|
|
168
|
-
return latest && latest
|
|
169
|
-
? `→ 有新版 ${latest}(当前 ${current})
|
|
312
|
+
return latest && isNewer(latest, current)
|
|
313
|
+
? `→ 有新版 ${latest}(当前 ${current});升级:${env.upgradeCmd}`
|
|
170
314
|
: `✓ 已是最新(${current})`;
|
|
171
|
-
if (latest && latest
|
|
172
|
-
process.stderr.write(" ✓
|
|
315
|
+
if (latest && !isNewer(latest, current)) {
|
|
316
|
+
process.stderr.write(" ✓ registry 已是最新,跳过下载;刷新 skill 保持同步…\n\n");
|
|
317
|
+
return install({ mcp: opts.mcp }); // 本进程即最新版,直接铺
|
|
318
|
+
}
|
|
319
|
+
// 用「该环境真正生效」的命令升级(volta→volta install,pnpm→pnpm add -g,…)。
|
|
320
|
+
process.stderr.write(` → 升级(${env.upgradeCmd})…\n`);
|
|
321
|
+
const r = spawnSync(env.argv.cmd, env.argv.args, {
|
|
322
|
+
stdio: "inherit",
|
|
323
|
+
shell: process.platform === "win32",
|
|
324
|
+
});
|
|
325
|
+
if (r.status !== 0)
|
|
326
|
+
throw new Error(`升级失败(${env.argv.cmd} 退出码 ${r.status ?? "?"});请手动跑:${env.upgradeCmd}`);
|
|
327
|
+
// asdf / nodenv 装完全局包要 reshim / rehash 才更新 shim,best-effort 自动补上。
|
|
328
|
+
if (env.manager === "asdf")
|
|
329
|
+
spawnSync("asdf", ["reshim", "nodejs"], { stdio: "inherit" });
|
|
330
|
+
if (env.manager === "nodenv")
|
|
331
|
+
spawnSync("nodenv", ["rehash"], { stdio: "inherit" });
|
|
332
|
+
process.stderr.write("\n");
|
|
333
|
+
// 别信退出码:重新解析「实际会被调用的」clize 版本,确认升级真生效(这一步专治 volta 假成功)。
|
|
334
|
+
const effective = resolvedClizeVersion();
|
|
335
|
+
if (latest && effective && effective !== latest) {
|
|
336
|
+
throw new Error(`升级「假成功」:命令跑完退出码 0,但 \`clize\` 实际仍是 ${effective}(期望 ${latest})。\n` +
|
|
337
|
+
(env.hint ? ` 原因:${env.hint}\n` : "") +
|
|
338
|
+
` 手动修:${env.upgradeCmd}\n` +
|
|
339
|
+
` 诊断:clize doctor`);
|
|
340
|
+
}
|
|
341
|
+
return refreshSkillsViaNewBinary(opts);
|
|
342
|
+
}
|
|
343
|
+
/** 三层体检:CLI(装的=跑的?)/ skill(agent 认知是否跟上)/ 控制面 worker(能力是否上线)。
|
|
344
|
+
* 把「过时但已 update」这类问题压成一条命令,而不是逐层翻 ~/.volta、~/.claude/skills、worker。 */
|
|
345
|
+
export async function doctor(opts = {}) {
|
|
346
|
+
const out = ["clize doctor · 「装的 ≠ 跑的」三层体检", ""];
|
|
347
|
+
// ── CLI 层 ──
|
|
348
|
+
const latest = await latestVersion();
|
|
349
|
+
if (latest)
|
|
350
|
+
writeLatestCache(latest);
|
|
351
|
+
const env = runtimeInstallEnv();
|
|
352
|
+
const effective = resolvedClizeVersion();
|
|
353
|
+
const running = effective || VERSION;
|
|
354
|
+
out.push("CLI");
|
|
355
|
+
out.push(` 打包版本 ${VERSION}`);
|
|
356
|
+
if (effective && effective !== VERSION)
|
|
357
|
+
out.push(` 实跑版本 ${effective} ⚠ 与打包版本不一致(疑多份安装 / shim 未更新)`);
|
|
358
|
+
out.push(` registry ${latest ?? "(查不到,离线?)"}`);
|
|
359
|
+
out.push(` 安装方式 ${env.manager}${env.npmNoop ? "(裸 npm i -g 不生效)" : ""}`);
|
|
360
|
+
out.push(` 升级命令 ${env.upgradeCmd}`);
|
|
361
|
+
if (latest && isNewer(latest, running)) {
|
|
362
|
+
out.push(` 状态 ⚠ 落后 ${running} → ${latest}`);
|
|
363
|
+
if (env.hint)
|
|
364
|
+
out.push(` ${env.hint}`);
|
|
365
|
+
}
|
|
366
|
+
else if (latest) {
|
|
367
|
+
out.push(` 状态 ✓ 最新(${running})`);
|
|
173
368
|
}
|
|
174
369
|
else {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
370
|
+
out.push(" 状态 ? 查不到 registry");
|
|
371
|
+
}
|
|
372
|
+
out.push("");
|
|
373
|
+
// ── Skill 层 ──
|
|
374
|
+
out.push("Skill(本机 agent 的能力认知来源)");
|
|
375
|
+
const skills = bundledSkills();
|
|
376
|
+
let drift = false;
|
|
377
|
+
for (const h of harnesses()) {
|
|
378
|
+
const present = fs.existsSync(h.homeDir);
|
|
379
|
+
const lines = [];
|
|
380
|
+
for (const s of skills) {
|
|
381
|
+
const dest = path.join(h.skillsDir, s.name, "SKILL.md");
|
|
382
|
+
let text = null;
|
|
383
|
+
try {
|
|
384
|
+
text = fs.readFileSync(dest, "utf8");
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
/* 未装 */
|
|
388
|
+
}
|
|
389
|
+
if (text === null) {
|
|
390
|
+
if (present) {
|
|
391
|
+
lines.push(` ✗ ${s.name} 未安装`);
|
|
392
|
+
drift = true;
|
|
393
|
+
}
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
const v = readSkillVersion(text);
|
|
397
|
+
if (v == null) {
|
|
398
|
+
lines.push(` ⚠ ${s.name} 无版本戳(旧安装)`);
|
|
399
|
+
drift = true;
|
|
400
|
+
}
|
|
401
|
+
else if (v !== VERSION) {
|
|
402
|
+
lines.push(` ⚠ ${s.name} ${v} → ${VERSION}`);
|
|
403
|
+
drift = true;
|
|
404
|
+
}
|
|
405
|
+
else {
|
|
406
|
+
lines.push(` ✓ ${s.name} ${v}`);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (present || lines.length) {
|
|
410
|
+
out.push(` ▸ ${h.name}${present ? "" : "(未探测到)"}`);
|
|
411
|
+
out.push(...lines);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
out.push(drift ? " → 有漂移:跑 `clize install` 刷新 skill" : " ✓ 全部跟上当前 CLI");
|
|
415
|
+
out.push("");
|
|
416
|
+
// ── 控制面 worker 层 ──
|
|
417
|
+
out.push("控制面 worker");
|
|
418
|
+
const base = (opts.apiBase || "").replace(/\/+$/, "");
|
|
419
|
+
out.push(` 端点 ${base || "(未知)"}`);
|
|
420
|
+
if (base) {
|
|
421
|
+
try {
|
|
422
|
+
const res = await fetch(`${base}/v1/version`, { signal: AbortSignal.timeout(6000) });
|
|
423
|
+
if (res.ok) {
|
|
424
|
+
const j = (await res.json());
|
|
425
|
+
out.push(` 可达 ✓ version ${j.version ?? "?"}`);
|
|
426
|
+
if (Array.isArray(j.capabilities) && j.capabilities.length)
|
|
427
|
+
out.push(` 能力 ${j.capabilities.join(" · ")}`);
|
|
428
|
+
}
|
|
429
|
+
else if (res.status === 404 || res.status === 401 || res.status === 403) {
|
|
430
|
+
// /v1/version 设计为公开;非 2xx(404 无此路由 / 401·403 落到鉴权闸)= worker 没有该端点 = 旧版。
|
|
431
|
+
out.push(` 可达 ⚠ HTTP ${res.status}:worker 没有公开 /v1/version(旧版,本次改动需 wrangler deploy 部署)`);
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
out.push(` 可达 ⚠ HTTP ${res.status}`);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
catch (e) {
|
|
438
|
+
out.push(` 可达 ✗ ${e.message}(网络 / DNS 污染?见 net-pin)`);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return out.join("\n");
|
|
184
442
|
}
|
|
185
443
|
//# sourceMappingURL=install.js.map
|
package/dist/core/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/core/install.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/core/install.ts"],"names":[],"mappings":"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"}
|
package/dist/core/sites.js
CHANGED
|
@@ -13,17 +13,30 @@ const SITE_KV_TITLE = "clize-sites";
|
|
|
13
13
|
* ① 该 host 没 index.html(站点没部署)→ 占位页;
|
|
14
14
|
* ② 已部署但路径不存在 → 按 not-found 模式处理:显式 per-host 配置(`::cfg::<host>`)优先,
|
|
15
15
|
* 否则自动判定 —— 有 404.html → 多页站 → 返 404.html + 真 404 状态;没有 → 当 SPA → 回退 index.html(200)。 */
|
|
16
|
+
/** 店面购物车运行时(同源 `/_clize/cart.js` 提供):localStorage 购物车 + data-clize-* 按钮委托 → `/_clize/checkout`。
|
|
17
|
+
* agent 只需在页里放 `<button data-clize-add="sku">` / `data-clize-checkout` / `data-clize-count` 并引这支脚本。 */
|
|
18
|
+
const SHOP_CART_JS = `(function(){var K="__clize_cart";function L(){try{return JSON.parse(localStorage.getItem(K))||[]}catch(e){return[]}}function S(c){localStorage.setItem(K,JSON.stringify(c));R()}function add(s,q){if(!s)return;var c=L(),f=c.find(function(i){return i.sku===s});if(f)f.quantity+=q||1;else c.push({sku:s,quantity:q||1});S(c)}function cnt(){return L().reduce(function(n,i){return n+i.quantity},0)}function R(){if(typeof document==="undefined")return;document.querySelectorAll("[data-clize-count]").forEach(function(el){el.textContent=String(cnt())})}async function co(){var items=L();if(!items.length){alert("购物车为空");return}try{var r=await fetch("/_clize/checkout",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({items:items})});var d=await r.json();if(d&&d.checkoutUrl){localStorage.removeItem(K);location.href=d.checkoutUrl}else alert((d&&d.error)||"结账失败")}catch(e){alert("结账失败")}}if(typeof document!=="undefined"){document.addEventListener("click",function(e){var t=e.target;if(!t||!t.closest)return;var a=t.closest("[data-clize-add]");if(a){e.preventDefault();add(a.getAttribute("data-clize-add"),parseInt(a.getAttribute("data-clize-qty")||"1",10))}var c=t.closest("[data-clize-checkout]");if(c){e.preventDefault();co()}});if(document.readyState!=="loading")R();else document.addEventListener("DOMContentLoaded",R)}window.clizeCart={add:add,checkout:co,count:cnt,clear:function(){localStorage.removeItem(K);R()}}})();`;
|
|
16
19
|
export const SITE_WORKER_SRC = `
|
|
20
|
+
// CF Web Analytics(统一属性 sites.clize.ai;后台按 hostname 拆分各托管站)。token 是公开值,直接内联。
|
|
21
|
+
var BEACON_TOKEN = "e8668558620746debcb72066f06f8ce2";
|
|
22
|
+
function beaconTag(){ return "<script defer src='https://static.cloudflareinsights.com/beacon.min.js' data-cf-beacon='" + JSON.stringify({ token: BEACON_TOKEN }) + "'></script>"; }
|
|
23
|
+
// 只对 HTML 响应注入:在 <head> 末尾追加 beacon。非 HTML(js/css/图片)不经过此函数。
|
|
24
|
+
function inject(resp){ if (typeof HTMLRewriter === "undefined") return resp; return new HTMLRewriter().on("head", { element: function(e){ e.append(beaconTag(), { html: true }); } }).transform(resp); }
|
|
17
25
|
export default {
|
|
18
26
|
async fetch(request, env) {
|
|
19
27
|
const url = new URL(request.url);
|
|
20
28
|
const host = url.hostname.toLowerCase();
|
|
21
29
|
let p = decodeURIComponent(url.pathname);
|
|
30
|
+
// clize 保留前缀:同源把店面动作转给控制面(密钥都在控制面;edge 只权威注入 host,不碰钱)。
|
|
31
|
+
if (p === "/_clize/cart.js") return new Response(${JSON.stringify(SHOP_CART_JS)}, { headers: { "content-type": "text/javascript; charset=utf-8", "cache-control": "public, max-age=300" } });
|
|
32
|
+
if (p === "/_clize/checkout" && request.method === "POST") return fetch("https://api.clize.ai/v1/shop/checkout", { method: "POST", headers: { "content-type": "application/json", "x-clize-site": host }, body: await request.text() });
|
|
33
|
+
if (p.indexOf("/_clize/data/") === 0 && request.method === "POST") return fetch("https://api.clize.ai/v1/data/submit?collection=" + encodeURIComponent(p.slice(13)), { method: "POST", headers: { "content-type": "application/json", "x-clize-site": host }, body: await request.text() });
|
|
22
34
|
if (p.endsWith("/")) p += "index.html";
|
|
23
35
|
const hit = await env.SITES.getWithMetadata(host + p, { type: "arrayBuffer" });
|
|
24
36
|
if (hit && hit.value) {
|
|
25
37
|
const ct = (hit.metadata && hit.metadata.ct) || "application/octet-stream";
|
|
26
|
-
|
|
38
|
+
const resp = new Response(hit.value, { headers: { "content-type": ct, "cache-control": "public, max-age=300" } });
|
|
39
|
+
return ct.indexOf("text/html") === 0 ? inject(resp) : resp;
|
|
27
40
|
}
|
|
28
41
|
// 精确路径 miss。先分「站点没部署(占位页)」与「已部署但路径不存在(真 404)」。
|
|
29
42
|
const idx = await env.SITES.getWithMetadata(host + "/index.html", { type: "arrayBuffer" });
|
|
@@ -40,13 +53,13 @@ export default {
|
|
|
40
53
|
if (!mode) mode = (nf && nf.value) ? "404-page" : "spa";
|
|
41
54
|
}
|
|
42
55
|
if (mode === "spa") {
|
|
43
|
-
return new Response(idx.value, { headers: { "content-type": "text/html; charset=utf-8" } });
|
|
56
|
+
return inject(new Response(idx.value, { headers: { "content-type": "text/html; charset=utf-8" } }));
|
|
44
57
|
}
|
|
45
58
|
if (mode === "404-page" && nf && nf.value) {
|
|
46
59
|
const ct = (nf.metadata && nf.metadata.ct) || "text/html; charset=utf-8";
|
|
47
|
-
return new Response(nf.value, { status: 404, headers: { "content-type": ct } });
|
|
60
|
+
return inject(new Response(nf.value, { status: 404, headers: { "content-type": ct } }));
|
|
48
61
|
}
|
|
49
|
-
return new Response(notFound(host, p), { status: 404, headers: { "content-type": "text/html; charset=utf-8" } });
|
|
62
|
+
return inject(new Response(notFound(host, p), { status: 404, headers: { "content-type": "text/html; charset=utf-8" } }));
|
|
50
63
|
}
|
|
51
64
|
};
|
|
52
65
|
function placeholder(host) {
|
|
@@ -107,6 +120,111 @@ export async function ensureSiteInfra(ctx) {
|
|
|
107
120
|
await ctx.cf.request("PUT", `/accounts/${ctx.cf.accountId}/workers/scripts/${SITE_WORKER}`, form);
|
|
108
121
|
return { worker: SITE_WORKER, kvNamespaceId: kvId, message: "站点基建就绪(共享 worker + KV)" };
|
|
109
122
|
}
|
|
123
|
+
/** 按目录核购物车:只认目录里的 sku + 目录价(客户端传的价一律忽略),返回可信 line items。
|
|
124
|
+
* 抛错 = 该单不该成(未知 sku / 价非正);纯函数,便于测。 */
|
|
125
|
+
export function priceCart(catalog, items) {
|
|
126
|
+
const bySku = new Map(catalog.products.map((p) => [p.sku, p]));
|
|
127
|
+
return items.map((it) => {
|
|
128
|
+
const p = it.sku ? bySku.get(it.sku) : undefined;
|
|
129
|
+
if (!p)
|
|
130
|
+
throw new Error(`无此商品:${it.sku ?? "(空)"}`);
|
|
131
|
+
if (!(Number(p.price) > 0))
|
|
132
|
+
throw new Error(`商品 ${p.sku} 价格无效`);
|
|
133
|
+
return {
|
|
134
|
+
name: p.name,
|
|
135
|
+
amountUsd: Number(p.price),
|
|
136
|
+
quantity: Math.max(1, Math.min(1000, Math.floor(Number(it.quantity) || 1))),
|
|
137
|
+
...(p.interval ? { interval: p.interval } : {}),
|
|
138
|
+
};
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/** 校验 _catalog.json 文本(deploy 前拦坏目录:非法 JSON / 缺 sku·name / 价非正 / 重复 sku)。抛错 = 不该上线。 */
|
|
142
|
+
export function validateCatalogText(text) {
|
|
143
|
+
let c;
|
|
144
|
+
try {
|
|
145
|
+
c = JSON.parse(text);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
throw new Error("_catalog.json 不是合法 JSON");
|
|
149
|
+
}
|
|
150
|
+
if (!c || !Array.isArray(c.products) || !c.products.length)
|
|
151
|
+
throw new Error("_catalog.json 需要非空 products 数组");
|
|
152
|
+
const seen = new Set();
|
|
153
|
+
for (const p of c.products) {
|
|
154
|
+
if (!p?.sku || typeof p.sku !== "string")
|
|
155
|
+
throw new Error("每个商品需要 string sku");
|
|
156
|
+
if (!p.name || typeof p.name !== "string")
|
|
157
|
+
throw new Error(`商品 ${p.sku} 缺 name`);
|
|
158
|
+
if (!(Number(p.price) > 0))
|
|
159
|
+
throw new Error(`商品 ${p.sku} 的 price 必须为正数`);
|
|
160
|
+
if (seen.has(p.sku))
|
|
161
|
+
throw new Error(`_catalog.json 有重复 sku:${p.sku}`);
|
|
162
|
+
seen.add(p.sku);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/** 读某站点部署的 `_catalog.json`(从共享 SITES KV,key=`host/_catalog.json`);无目录 → null。
|
|
166
|
+
* checkout 服务端核价用它 —— clize 读的是商家自己部署、被 clize 托管的那份,不查 Stripe。 */
|
|
167
|
+
export async function readCatalog(ctx, host) {
|
|
168
|
+
const kvId = await kvNamespaceId(ctx);
|
|
169
|
+
if (!kvId)
|
|
170
|
+
return null;
|
|
171
|
+
const key = encodeURIComponent(`${host.toLowerCase()}/_catalog.json`);
|
|
172
|
+
let raw;
|
|
173
|
+
try {
|
|
174
|
+
raw = await ctx.cf.getRaw(`/accounts/${ctx.cf.accountId}/storage/kv/namespaces/${kvId}/values/${key}`);
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null; // 该站没部署目录(KV 取值 404)
|
|
178
|
+
}
|
|
179
|
+
let parsed;
|
|
180
|
+
try {
|
|
181
|
+
parsed = JSON.parse(raw);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
throw new Error(`${host} 的 _catalog.json 不是合法 JSON`);
|
|
185
|
+
}
|
|
186
|
+
return parsed && Array.isArray(parsed.products) ? parsed : null;
|
|
187
|
+
}
|
|
188
|
+
// 店面/表单的少量配置存 SITES KV 保留键(低写、按 host;clize 不存业务数据,只存这点接线)。
|
|
189
|
+
const shopHookKey = (host) => `::shop::hook::${host.toLowerCase()}`;
|
|
190
|
+
const dataSinkKey = (host, collection) => `::data::${host.toLowerCase()}/${collection}`;
|
|
191
|
+
async function kvGet(ctx, kvId, key) {
|
|
192
|
+
try {
|
|
193
|
+
const v = await ctx.cf.getRaw(`/accounts/${ctx.cf.accountId}/storage/kv/namespaces/${kvId}/values/${encodeURIComponent(key)}`);
|
|
194
|
+
return v.trim() || null;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return null; // 取值 404 = 未配置
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/** 读店面履约 webhook(付款完成后 POST 订单摘要给商家端点);未配 → null。 */
|
|
201
|
+
export async function readShopHook(ctx, host) {
|
|
202
|
+
const kvId = await kvNamespaceId(ctx);
|
|
203
|
+
return kvId ? kvGet(ctx, kvId, shopHookKey(host)) : null;
|
|
204
|
+
}
|
|
205
|
+
/** 设/删店面履约 webhook(url=null 删除)。 */
|
|
206
|
+
export async function writeShopHook(ctx, host, url) {
|
|
207
|
+
const kvId = await ensureKv(ctx);
|
|
208
|
+
const key = shopHookKey(host);
|
|
209
|
+
if (url)
|
|
210
|
+
await ctx.cf.request("PUT", `/accounts/${ctx.cf.accountId}/storage/kv/namespaces/${kvId}/bulk`, [
|
|
211
|
+
{ key, value: url },
|
|
212
|
+
]);
|
|
213
|
+
else
|
|
214
|
+
await ctx.cf.request("DELETE", `/accounts/${ctx.cf.accountId}/storage/kv/namespaces/${kvId}/values/${encodeURIComponent(key)}`);
|
|
215
|
+
}
|
|
216
|
+
/** 读某 collection 的表单接收端(webhook url);未配 → null。 */
|
|
217
|
+
export async function readDataSink(ctx, host, collection) {
|
|
218
|
+
const kvId = await kvNamespaceId(ctx);
|
|
219
|
+
return kvId ? kvGet(ctx, kvId, dataSinkKey(host, collection)) : null;
|
|
220
|
+
}
|
|
221
|
+
/** 设某 collection 的表单接收端(店面提交转发到此 url)。 */
|
|
222
|
+
export async function writeDataSink(ctx, host, collection, url) {
|
|
223
|
+
const kvId = await ensureKv(ctx);
|
|
224
|
+
await ctx.cf.request("PUT", `/accounts/${ctx.cf.accountId}/storage/kv/namespaces/${kvId}/bulk`, [
|
|
225
|
+
{ key: dataSinkKey(host, collection), value: url },
|
|
226
|
+
]);
|
|
227
|
+
}
|
|
110
228
|
/**
|
|
111
229
|
* 确保 host 的 apex zone 在 CF 且 active —— 绑 custom domain 到站点 worker 的前提。
|
|
112
230
|
* zone 不存在则建;pending(NS 没委派给 CF)且域名是 Vercel 注册的 → 自动把 NS 切到 CF + 催激活。
|
|
@@ -218,6 +336,18 @@ export async function deployFilesToHandle(ctx, handle, files, opts = {}) {
|
|
|
218
336
|
const host = handle.toLowerCase();
|
|
219
337
|
if (!files.length)
|
|
220
338
|
throw new Error("没有文件可部署");
|
|
339
|
+
// 店面目录:deploy 前校验 _catalog.json,坏目录别上线(否则要到 checkout 才 422)。
|
|
340
|
+
const catFile = files.find((f) => f.path.replace(/^\//, "").toLowerCase() === "_catalog.json");
|
|
341
|
+
if (catFile) {
|
|
342
|
+
let text;
|
|
343
|
+
try {
|
|
344
|
+
text = new TextDecoder().decode(Uint8Array.from(atob(catFile.base64), (ch) => ch.charCodeAt(0)));
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
throw new Error("_catalog.json 解码失败");
|
|
348
|
+
}
|
|
349
|
+
validateCatalogText(text);
|
|
350
|
+
}
|
|
221
351
|
// 项目归属:deploy 跟随域名(目标域全局唯一,所属由服务端为真相)——
|
|
222
352
|
// 陈旧的 clize.json 检出不再 409,自动按域所属部署;只有显式 -p 点名不符才拦下。
|
|
223
353
|
const routed = await resolveDeployProject(ctx, host);
|
|
@@ -229,9 +359,22 @@ export async function deployFilesToHandle(ctx, handle, files, opts = {}) {
|
|
|
229
359
|
value: f.base64,
|
|
230
360
|
metadata: { ct: f.ct },
|
|
231
361
|
}));
|
|
232
|
-
|
|
233
|
-
|
|
362
|
+
// KV bulk 限制:单请求 ≤1 万 key 且 body <100MB;value 是 base64 文本(原始字节 ×4/3)。
|
|
363
|
+
// 按「≤5000 个 且 base64 累计 ≤60MB」切批 —— 给 100MB body 留足余量,免得大图站打爆单请求。
|
|
364
|
+
const putBulk = (batch) => ctx.cf.request("PUT", `/accounts/${ctx.cf.accountId}/storage/kv/namespaces/${kvId}/bulk`, batch);
|
|
365
|
+
let batch = [];
|
|
366
|
+
let batchBytes = 0;
|
|
367
|
+
for (const it of items) {
|
|
368
|
+
if (batch.length && (batch.length >= 5000 || batchBytes + it.value.length > 60 * 1024 * 1024)) {
|
|
369
|
+
await putBulk(batch);
|
|
370
|
+
batch = [];
|
|
371
|
+
batchBytes = 0;
|
|
372
|
+
}
|
|
373
|
+
batch.push(it);
|
|
374
|
+
batchBytes += it.value.length;
|
|
234
375
|
}
|
|
376
|
+
if (batch.length)
|
|
377
|
+
await putBulk(batch);
|
|
235
378
|
// 未知路径处理模式:显式传了就持久化到 per-host 配置键(worker serve 时读;auto 也写,worker 视作自动判定)。
|
|
236
379
|
const mode = (opts.notFound || "").toLowerCase();
|
|
237
380
|
if (mode) {
|