@clize/clize 0.9.1 → 0.10.1

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 (46) hide show
  1. package/README.md +19 -8
  2. package/dist/cli.js +386 -108
  3. package/dist/cli.js.map +1 -1
  4. package/dist/context.js +20 -2
  5. package/dist/context.js.map +1 -1
  6. package/dist/core/addresses.js +10 -3
  7. package/dist/core/addresses.js.map +1 -1
  8. package/dist/core/autopay.js +6 -0
  9. package/dist/core/autopay.js.map +1 -1
  10. package/dist/core/billing.js +9 -0
  11. package/dist/core/billing.js.map +1 -1
  12. package/dist/core/domains.js +84 -26
  13. package/dist/core/domains.js.map +1 -1
  14. package/dist/core/email.js +54 -11
  15. package/dist/core/email.js.map +1 -1
  16. package/dist/core/handle.js +19 -3
  17. package/dist/core/handle.js.map +1 -1
  18. package/dist/core/media.js +55 -10
  19. package/dist/core/media.js.map +1 -1
  20. package/dist/core/projects.js +217 -0
  21. package/dist/core/projects.js.map +1 -0
  22. package/dist/core/serve.js +170 -0
  23. package/dist/core/serve.js.map +1 -0
  24. package/dist/core/setup.js +89 -6
  25. package/dist/core/setup.js.map +1 -1
  26. package/dist/core/sites.js +3 -0
  27. package/dist/core/sites.js.map +1 -1
  28. package/dist/core/video.js +387 -0
  29. package/dist/core/video.js.map +1 -0
  30. package/dist/index.js +52 -11
  31. package/dist/index.js.map +1 -1
  32. package/dist/providers/email/cloudflare-inbound.js +30 -12
  33. package/dist/providers/email/cloudflare-inbound.js.map +1 -1
  34. package/dist/providers/media/google.js +3 -0
  35. package/dist/providers/media/google.js.map +1 -1
  36. package/dist/providers/media/kunavo.js +11 -4
  37. package/dist/providers/media/kunavo.js.map +1 -1
  38. package/dist/providers/media/openai.js +1 -0
  39. package/dist/providers/media/openai.js.map +1 -1
  40. package/dist/remote.js +63 -12
  41. package/dist/remote.js.map +1 -1
  42. package/dist/state/file-store.js +75 -5
  43. package/dist/state/file-store.js.map +1 -1
  44. package/package.json +18 -5
  45. package/skills/clize/SKILL.md +23 -8
  46. package/skills/clize-site-build/SKILL.md +12 -11
@@ -0,0 +1,217 @@
1
+ import { ClizeError } from "../lib/errors.js";
2
+ /** slug 规整:小写、非字母数字转连字符、去首尾连字符。 */
3
+ function slugify(s) {
4
+ return s
5
+ .toLowerCase()
6
+ .trim()
7
+ .replace(/[^a-z0-9]+/g, "-")
8
+ .replace(/^-+|-+$/g, "");
9
+ }
10
+ /** 列出当前租户的全部项目,带各项目域名数(惰性补 default,保证至少返回一个)。
11
+ * 输出瘦身:只回 slug / name / domains —— 所有命令以 slug 寻址,id / tenantId / createdAt
12
+ * 是内部细节,进 agent transcript 纯属噪音(列表越长省越多)。 */
13
+ export async function listProjects(ctx) {
14
+ const def = await ctx.store.ensureDefaultProject(ctx.tenantId);
15
+ const [projects, identities] = await Promise.all([
16
+ ctx.store.listProjects(ctx.tenantId),
17
+ ctx.store.listIdentities(ctx.tenantId),
18
+ ]);
19
+ const counts = new Map();
20
+ for (const i of identities) {
21
+ const pid = i.projectId ?? def.id;
22
+ counts.set(pid, (counts.get(pid) ?? 0) + 1);
23
+ }
24
+ return projects.map((p) => ({ slug: p.slug, name: p.name, domains: counts.get(p.id) ?? 0 }));
25
+ }
26
+ /** 新建一个项目;name 必填,slug 缺省由 name 规整。重名抛错。 */
27
+ export async function createProject(ctx, opts) {
28
+ const name = (opts.name || "").trim();
29
+ if (!name)
30
+ throw new ClizeError("项目名不能为空", 400);
31
+ const slug = (opts.slug ? opts.slug : slugify(name)).trim();
32
+ if (!slug)
33
+ throw new ClizeError("项目标识(slug)不能为空", 400);
34
+ if (await ctx.store.getProject(ctx.tenantId, slug))
35
+ throw new ClizeError(`项目 "${slug}" 已存在`, 409);
36
+ return ctx.store.createProject(ctx.tenantId, { name, slug });
37
+ }
38
+ /** 「将建未建」哨兵 id:checkout 检出的项目还没落库(init 即项目,首次写资源才建)时,
39
+ * 读路径用它过滤 → 匹配不到任何记录 = 空项目视图,与「目录即项目」心智一致。
40
+ * 固定串,不可能与真实 id(prj_<hex> / prj_default_<tenant>)相撞。 */
41
+ export const PENDING_PROJECT_ID = "prj_pending_checkout";
42
+ /** 解析当前检出项目的 id(读写共用)。未检出 → undefined(全租户);
43
+ * checkout 来源(clize.json)且项目未建 → PENDING_PROJECT_ID(空项目视图,首次写资源时自动建);
44
+ * flag 来源(-p / 工具参数)且不存在 → 读写一致**报错** ——
45
+ * 读路径给错数据(把全租户当成该项目)比报错危险得多,typo 防线两路同闸。 */
46
+ export async function currentProjectId(ctx) {
47
+ if (!ctx.projectSlug)
48
+ return undefined;
49
+ if (ctx.projectSlug === "default")
50
+ return (await ctx.store.ensureDefaultProject(ctx.tenantId)).id;
51
+ const p = await ctx.store.getProject(ctx.tenantId, ctx.projectSlug);
52
+ if (p)
53
+ return p.id;
54
+ if (ctx.projectSlugSource === "checkout")
55
+ return PENDING_PROJECT_ID;
56
+ throw new ClizeError(`项目 "${ctx.projectSlug}" 不存在(-p 单次指定要求项目已存在,防打错字;` +
57
+ `clize projects 看列表,clize projects new "<名字>" 新建)`, 404);
58
+ }
59
+ /** 写路径:解析当前检出项目的 id,资源创建(buy / claim / import / gen)的归属必须确定。
60
+ * flag 来源(-p)不存在 → currentProjectId 已报错(读写同闸);
61
+ * checkout 来源未建(PENDING)→ 自动创建落库(「init 即项目」:init 只写本地文件,
62
+ * 项目实体在这里 —— 首次写资源时 —— 落库)。花钱动作在扣费前调用(fail fast)。 */
63
+ export async function requireProjectId(ctx) {
64
+ if (!ctx.projectSlug)
65
+ return undefined; // 未检出:store 落 default(对单项目用户透明)
66
+ const id = await currentProjectId(ctx); // flag + 不存在在这里就抛
67
+ if (id && id !== PENDING_PROJECT_ID)
68
+ return id;
69
+ // 只剩 checkout 未建(PENDING 哨兵本身就编码了 checkout 来源):自动建拿真 id
70
+ const rec = await ctx.store.createProject(ctx.tenantId, {
71
+ name: ctx.projectSlug,
72
+ slug: ctx.projectSlug,
73
+ });
74
+ await ctx.store.appendAudit(ctx.tenantId, {
75
+ action: "project_autocreate",
76
+ detail: { slug: rec.slug, via: "checkout" },
77
+ });
78
+ return rec.id;
79
+ }
80
+ /** 项目过滤器:未检出 → 恒真;检出 → 只留该项目的记录(projectId 缺失 ≡ default)。 */
81
+ export async function projectFilter(ctx) {
82
+ const checked = await currentProjectId(ctx);
83
+ if (!checked)
84
+ return () => true;
85
+ const def = await ctx.store.ensureDefaultProject(ctx.tenantId);
86
+ return (projectId) => (projectId ?? def.id) === checked;
87
+ }
88
+ /** 项目开销 / 审计的查询作用域:检出 → [项目 id, 是否 default(无归属旧记录归它)];未检出 → []。
89
+ * 直接 spread 进 store.spentThisMonth / recentAudit 的 (projectId?, includeUnassigned?) 尾参。 */
90
+ export async function auditScope(ctx) {
91
+ const checked = await currentProjectId(ctx);
92
+ if (!checked)
93
+ return [];
94
+ const def = await ctx.store.ensureDefaultProject(ctx.tenantId);
95
+ return [checked, checked === def.id];
96
+ }
97
+ /** 把域名挪进某项目(唯一的存量分组动作)。挂在域名下的邮箱地址随域名走(地址按 domain 间接归属);
98
+ * 媒体资产直挂项目、不随域名动。 */
99
+ export async function moveDomain(ctx, domain, targetSlug) {
100
+ const d = domain.toLowerCase();
101
+ const identity = await ctx.store.getIdentity(ctx.tenantId, d);
102
+ if (!identity)
103
+ throw new ClizeError(`未找到域名 ${d}(clize domain list 看全部)`, 404);
104
+ const target = targetSlug === "default"
105
+ ? await ctx.store.ensureDefaultProject(ctx.tenantId)
106
+ : await ctx.store.getProject(ctx.tenantId, targetSlug);
107
+ if (!target)
108
+ throw new ClizeError(`项目 "${targetSlug}" 不存在(clize projects 看列表)`, 404);
109
+ const def = await ctx.store.ensureDefaultProject(ctx.tenantId);
110
+ const fromId = identity.projectId ?? def.id;
111
+ if (fromId === target.id)
112
+ return { domain: d, project: target.slug, message: `${d} 已在项目 "${target.slug}",无需移动。` };
113
+ const fromSlug = (await ctx.store.listProjects(ctx.tenantId)).find((p) => p.id === fromId)?.slug ?? "default";
114
+ await ctx.store.upsertIdentity(ctx.tenantId, { domain: d, projectId: target.id });
115
+ await ctx.store.appendAudit(ctx.tenantId, {
116
+ action: "project_move",
117
+ detail: { domain: d, from: fromSlug, to: target.slug },
118
+ });
119
+ return {
120
+ domain: d,
121
+ from: fromSlug,
122
+ to: target.slug,
123
+ message: `已把 ${d} 挪到项目 "${target.slug}"(它的邮箱地址跟着走;媒体资产不动)。`,
124
+ };
125
+ }
126
+ /** 改项目显示名 / slug。default 不能改 slug(它是无归属旧资源的兜底锚点)。 */
127
+ export async function renameProject(ctx, slug, patch) {
128
+ const name = patch.name?.trim() || undefined;
129
+ const newSlug = patch.slug?.trim() || undefined;
130
+ if (!name && !newSlug)
131
+ throw new ClizeError("指定 --name / --slug 至少一个", 400);
132
+ const existing = slug === "default"
133
+ ? await ctx.store.ensureDefaultProject(ctx.tenantId)
134
+ : await ctx.store.getProject(ctx.tenantId, slug);
135
+ if (!existing)
136
+ throw new ClizeError(`项目 "${slug}" 不存在(clize projects 看列表)`, 404);
137
+ if (newSlug && slug === "default")
138
+ throw new ClizeError("default 项目不能改 slug(它是无归属旧资源的兜底锚点);改 --name 可以", 400);
139
+ if (newSlug && newSlug !== slug && (await ctx.store.getProject(ctx.tenantId, newSlug)))
140
+ throw new ClizeError(`项目 "${newSlug}" 已存在`, 409);
141
+ const rec = await ctx.store.updateProject(ctx.tenantId, slug, { name, slug: newSlug });
142
+ await ctx.store.appendAudit(ctx.tenantId, {
143
+ action: "project_rename",
144
+ detail: { from: slug, to: rec.slug, name: rec.name },
145
+ });
146
+ return {
147
+ slug: rec.slug,
148
+ name: rec.name,
149
+ ...(newSlug && newSlug !== slug
150
+ ? { note: `slug 已改;检出过 "${slug}" 的目录要重新 clize use ${rec.slug}` }
151
+ : {}),
152
+ };
153
+ }
154
+ /** 删项目。default 不可删;非空项目必须 --into 指定资源去向(域名 + 媒体资产归并过去,绝不级联删资源)。 */
155
+ export async function removeProject(ctx, slug, opts = {}) {
156
+ if (slug === "default")
157
+ throw new ClizeError("default 项目不能删(它是无归属旧资源的兜底锚点)", 400);
158
+ const target = await ctx.store.getProject(ctx.tenantId, slug);
159
+ if (!target)
160
+ throw new ClizeError(`项目 "${slug}" 不存在(clize projects 看列表)`, 404);
161
+ const domains = await ctx.store.listIdentities(ctx.tenantId, target.id);
162
+ const jobs = (await ctx.store.listJobs(ctx.tenantId).catch(() => [])).filter((j) => j.projectId === target.id);
163
+ let movedTo;
164
+ if (domains.length || jobs.length) {
165
+ if (!opts.into)
166
+ throw new ClizeError(`项目 "${slug}" 非空(${domains.length} 个域名、${jobs.length} 个媒体资产);` +
167
+ `用 --into <项目> 指定资源去向(如 --into default),不会级联删除资源`, 400);
168
+ const into = opts.into === "default"
169
+ ? await ctx.store.ensureDefaultProject(ctx.tenantId)
170
+ : await ctx.store.getProject(ctx.tenantId, opts.into);
171
+ if (!into)
172
+ throw new ClizeError(`归并目标项目 "${opts.into}" 不存在`, 404);
173
+ if (into.id === target.id)
174
+ throw new ClizeError("不能把项目归并到它自己", 400);
175
+ for (const d of domains)
176
+ await ctx.store.upsertIdentity(ctx.tenantId, { domain: d.domain, projectId: into.id });
177
+ for (const j of jobs)
178
+ await ctx.store.upsertJob(ctx.tenantId, { ...j, projectId: into.id }).catch(() => { });
179
+ movedTo = into.slug;
180
+ }
181
+ await ctx.store.deleteProject(ctx.tenantId, slug);
182
+ await ctx.store.appendAudit(ctx.tenantId, {
183
+ action: "project_remove",
184
+ detail: { slug, movedDomains: domains.length, movedJobs: jobs.length, into: movedTo },
185
+ });
186
+ return {
187
+ removed: slug,
188
+ ...(movedTo
189
+ ? { movedTo, movedDomains: domains.length, movedJobs: jobs.length }
190
+ : {}),
191
+ message: movedTo
192
+ ? `已删项目 "${slug}";${domains.length} 个域名、${jobs.length} 个媒体资产已归并到 "${movedTo}"。检出过它的目录要重新 clize use。`
193
+ : `已删空项目 "${slug}"。检出过它的目录要重新 clize use。`,
194
+ };
195
+ }
196
+ /** 串台护栏:检出项目时,domain 必须归属当前项目,否则拒绝 ——
197
+ * 防 agent 在 A 项目目录里用 B 项目的身份发信 / 部署(多项目下最危险的误操作)。
198
+ * 未检出 / 检出名无效 / 该域无身份记录(BYO 未纳管域)→ 放行,保持单项目行为不变。 */
199
+ export async function assertDomainInProject(ctx, domain, action) {
200
+ if (!ctx.projectSlug)
201
+ return;
202
+ const checked = await currentProjectId(ctx); // flag + 不存在在这里就抛(读写同闸)
203
+ if (!checked)
204
+ return;
205
+ const identity = await ctx.store.getIdentity(ctx.tenantId, domain.toLowerCase());
206
+ if (!identity)
207
+ return;
208
+ const def = await ctx.store.ensureDefaultProject(ctx.tenantId);
209
+ const pid = identity.projectId ?? def.id;
210
+ if (pid === checked)
211
+ return;
212
+ const owner = (await ctx.store.listProjects(ctx.tenantId)).find((p) => p.id === pid);
213
+ const ownerSlug = owner?.slug ?? "default";
214
+ throw new ClizeError(`${domain} 属于项目 "${ownerSlug}",当前检出的是 "${ctx.projectSlug}" —— 防串台,已拦下(${action})。` +
215
+ `确认要跨项目操作就显式指定:加 -p ${ownerSlug},或 cd 到该项目目录(clize use ${ownerSlug})。`, 409);
216
+ }
217
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/core/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ // ============================================================
2
+ // 本地预览 server —— 为"预览含媒体的站点 / 视频"而正确配置的静态服务。
3
+ // 和 deploy 是一对:deploy 推上线看,serve 在本地看(ARCHITECTURE §2.6,deploy 的本地对偶)。
4
+ //
5
+ // 两条铁律(从一次真实事故里长出来的——裸静态服务器跑视频踩的坑):
6
+ // • 视频 / 音频走 HTTP Range(206):否则 Safari / iOS 不播、进度条不能 seek。
7
+ // • 缓存头按资源分:HTML / JS / CSS 用 no-cache(改完刷新即生效),
8
+ // 媒体放行、**绝不灌 no-store** —— no-store 会让 Chromium 的 <video> 直接报
9
+ // MEDIA_ERR_SRC_NOT_SUPPORTED(视频加载失败,且常被误诊成"服务器单线程")。
10
+ //
11
+ // 裸 `python -m http.server` 既不支持 Range、又(若自定义还)给媒体灌 no-store,
12
+ // 所以预览(含)视频内容别手搓 server,用这个。
13
+ // ============================================================
14
+ import http from "node:http";
15
+ import fs from "node:fs";
16
+ import path from "node:path";
17
+ const MIME = {
18
+ ".html": "text/html; charset=utf-8",
19
+ ".htm": "text/html; charset=utf-8",
20
+ ".js": "text/javascript; charset=utf-8",
21
+ ".mjs": "text/javascript; charset=utf-8",
22
+ ".css": "text/css; charset=utf-8",
23
+ ".json": "application/json; charset=utf-8",
24
+ ".svg": "image/svg+xml",
25
+ ".png": "image/png",
26
+ ".jpg": "image/jpeg",
27
+ ".jpeg": "image/jpeg",
28
+ ".webp": "image/webp",
29
+ ".gif": "image/gif",
30
+ ".avif": "image/avif",
31
+ ".ico": "image/x-icon",
32
+ ".mp4": "video/mp4",
33
+ ".m4v": "video/mp4",
34
+ ".webm": "video/webm",
35
+ ".mov": "video/quicktime",
36
+ ".mp3": "audio/mpeg",
37
+ ".m4a": "audio/mp4",
38
+ ".wav": "audio/wav",
39
+ ".ogg": "audio/ogg",
40
+ ".woff": "font/woff",
41
+ ".woff2": "font/woff2",
42
+ ".ttf": "font/ttf",
43
+ ".txt": "text/plain; charset=utf-8",
44
+ };
45
+ // 媒体扩展名:这些**不灌 no-store**(否则 <video>/<audio> 在 Chromium 报 SRC_NOT_SUPPORTED),且允许缓冲。
46
+ const MEDIA_EXT = new Set([".mp4", ".m4v", ".webm", ".mov", ".mp3", ".m4a", ".wav", ".ogg"]);
47
+ function contentType(fp) {
48
+ return MIME[path.extname(fp).toLowerCase()] || "application/octet-stream";
49
+ }
50
+ function isMedia(fp) {
51
+ return MEDIA_EXT.has(path.extname(fp).toLowerCase());
52
+ }
53
+ // 把请求 URL 安全映射到 root 内的真实文件(挡目录穿越);目录补 index.html。
54
+ function resolveFile(root, urlPath) {
55
+ const clean = decodeURIComponent(urlPath.split("?")[0].split("#")[0]);
56
+ const abs = path.normalize(path.join(root, clean));
57
+ if (abs !== root && !abs.startsWith(root + path.sep))
58
+ return null; // 穿越拦截
59
+ let st;
60
+ try {
61
+ st = fs.statSync(abs);
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ if (st.isDirectory()) {
67
+ const idx = path.join(abs, "index.html");
68
+ return fs.existsSync(idx) ? idx : null;
69
+ }
70
+ return abs;
71
+ }
72
+ // 缓存头按资源分:媒体允许缓冲(关键:不发 no-store);其余文本即时刷新(改完普通刷新即生效)。
73
+ function cacheHeaders(media) {
74
+ return media
75
+ ? { "Cache-Control": "public, max-age=3600" }
76
+ : { "Cache-Control": "no-cache, no-store, must-revalidate", Pragma: "no-cache", Expires: "0" };
77
+ }
78
+ function handle(root, req, res) {
79
+ const fp = resolveFile(root, req.url || "/");
80
+ if (!fp) {
81
+ res.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
82
+ res.end("404 Not Found");
83
+ return;
84
+ }
85
+ const type = contentType(fp);
86
+ const cache = cacheHeaders(isMedia(fp));
87
+ const size = fs.statSync(fp).size;
88
+ const range = req.headers.range;
89
+ // Range 请求(视频 seek / 流式分段) → 206 Partial Content。
90
+ const m = range ? /^bytes=(\d*)-(\d*)/.exec(range) : null;
91
+ if (m) {
92
+ let start = m[1] ? parseInt(m[1], 10) : 0;
93
+ let end = m[2] ? parseInt(m[2], 10) : size - 1;
94
+ if (Number.isNaN(start))
95
+ start = 0;
96
+ if (Number.isNaN(end) || end >= size)
97
+ end = size - 1;
98
+ if (start > end || start >= size) {
99
+ res.writeHead(416, { "Content-Range": `bytes */${size}` });
100
+ res.end();
101
+ return;
102
+ }
103
+ res.writeHead(206, {
104
+ ...cache,
105
+ "Content-Type": type,
106
+ "Accept-Ranges": "bytes",
107
+ "Content-Range": `bytes ${start}-${end}/${size}`,
108
+ "Content-Length": end - start + 1,
109
+ });
110
+ if (req.method === "HEAD") {
111
+ res.end();
112
+ return;
113
+ }
114
+ fs.createReadStream(fp, { start, end }).pipe(res);
115
+ return;
116
+ }
117
+ res.writeHead(200, {
118
+ ...cache,
119
+ "Content-Type": type,
120
+ "Accept-Ranges": "bytes",
121
+ "Content-Length": size,
122
+ });
123
+ if (req.method === "HEAD") {
124
+ res.end();
125
+ return;
126
+ }
127
+ fs.createReadStream(fp).pipe(res);
128
+ }
129
+ // 起一个本地预览 server,起好即 resolve(不阻塞;由调用方决定怎么等 / 何时 close)。
130
+ // 端口被占用时自动顺延(最多 20 次)。
131
+ export function serve(root, opts = {}) {
132
+ const absRoot = path.resolve(root);
133
+ if (!fs.existsSync(absRoot)) {
134
+ return Promise.reject(new Error(`目录不存在:${absRoot}`));
135
+ }
136
+ const host = opts.host || "127.0.0.1";
137
+ let port = opts.port && opts.port > 0 ? opts.port : 8000;
138
+ return new Promise((resolve, reject) => {
139
+ const server = http.createServer((req, res) => {
140
+ try {
141
+ handle(absRoot, req, res);
142
+ }
143
+ catch (e) {
144
+ if (!res.headersSent)
145
+ res.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
146
+ res.end(`500 ${e.message}`);
147
+ }
148
+ });
149
+ let tries = 0;
150
+ server.on("error", (e) => {
151
+ if (e.code === "EADDRINUSE" && tries < 20) {
152
+ tries++;
153
+ port++;
154
+ server.listen(port, host);
155
+ }
156
+ else {
157
+ reject(e);
158
+ }
159
+ });
160
+ server.listen(port, host, () => {
161
+ resolve({
162
+ url: `http://${host}:${port}`,
163
+ port,
164
+ root: absRoot,
165
+ close: () => new Promise((r) => server.close(() => r())),
166
+ });
167
+ });
168
+ });
169
+ }
170
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/core/serve.ts"],"names":[],"mappings":"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"}
@@ -71,33 +71,116 @@ export function clearRemoteLogin() {
71
71
  fs.writeFileSync(p, JSON.stringify(cfg, null, 2));
72
72
  return { ok: true, message: "已登出(已清除本机 clize key)。" };
73
73
  }
74
- /** 在当前目录绑定一个 clize 身份(写 ./clize.json)。 */
74
+ /** cwd 向上找最近的 clize.json(像 git 找 .git;agent 在项目子目录跑命令也认得绑定)。 */
75
+ function findProjectFile() {
76
+ let dir = process.cwd();
77
+ for (;;) {
78
+ const f = path.join(dir, "clize.json");
79
+ if (fs.existsSync(f))
80
+ return f;
81
+ const parent = path.dirname(dir);
82
+ if (parent === dir)
83
+ return undefined;
84
+ dir = parent;
85
+ }
86
+ }
87
+ /** 从身份推导项目 slug:handle 直接用(本就是 slug 格式);自定义域取首段;规整兜底。 */
88
+ function deriveProjectSlug(opts) {
89
+ const base = opts.handle || opts.domain?.split(".")[0] || "";
90
+ const slug = base
91
+ .toLowerCase()
92
+ .replace(/[^a-z0-9]+/g, "-")
93
+ .replace(/^-+|-+$/g, "");
94
+ return slug || undefined;
95
+ }
96
+ /** 在当前目录绑定一个 clize 身份(写 ./clize.json)。「init 即项目」:同时写 project 检出字段
97
+ * (slug 由 handle / 域名首段推导;已有 project 字段 —— use 或上次 init 写的 —— 保留不覆盖);
98
+ * 项目实体不在这里建(init 免登录、纯本地),首次写资源(claim / buy / gen)时自动创建。 */
75
99
  export function initProject(opts) {
76
100
  const p = path.resolve("clize.json");
101
+ let existing = {};
102
+ try {
103
+ existing = JSON.parse(fs.readFileSync(p, "utf8"));
104
+ }
105
+ catch {
106
+ /* 无则新建 */
107
+ }
108
+ const keepProject = typeof existing.project === "string" && existing.project ? existing.project : undefined;
109
+ const project = keepProject ?? deriveProjectSlug(opts);
77
110
  const proj = {
111
+ ...(project ? { project } : {}),
78
112
  handle: opts.handle,
79
113
  domain: opts.domain,
80
- createdAt: new Date().toISOString(),
114
+ createdAt: typeof existing.createdAt === "string" ? existing.createdAt : new Date().toISOString(),
81
115
  };
82
116
  fs.writeFileSync(p, JSON.stringify(proj, null, 2));
83
117
  const next = [];
84
118
  if (!opts.handle && !opts.domain)
85
119
  next.push("占个免费 handle:clize claim <slug>");
86
- next.push("发上线:clize deploy ./site --domain <handle 或自定义域>");
120
+ next.push("发上线:clize deploy ./site(已绑定,--domain 可省;email send 同理免 --from)");
87
121
  next.push("搭客服:clize email address add support@<域> --tag 客服 --knowledge ./docs");
88
- return { project: p, ...proj, nextSteps: next };
122
+ return {
123
+ file: p,
124
+ ...proj,
125
+ ...(project
126
+ ? {
127
+ projectNote: keepProject
128
+ ? `本目录检出在项目 "${project}"(沿用已有检出)`
129
+ : `本目录即项目 "${project}"(首次 claim/buy 时自动创建;此后命令默认只作用于它)`,
130
+ }
131
+ : {}),
132
+ nextSteps: next,
133
+ };
134
+ }
135
+ /** 把当前目录检出到某个项目(写 project 字段;已有 clize.json —— 含上层目录的 —— 就更新它,否则在 cwd 新建)。 */
136
+ export function useProject(slug) {
137
+ const p = findProjectFile() ?? path.resolve("clize.json");
138
+ let existing = {};
139
+ try {
140
+ existing = JSON.parse(fs.readFileSync(p, "utf8"));
141
+ }
142
+ catch {
143
+ /* 无则新建 */
144
+ }
145
+ const proj = {
146
+ ...existing,
147
+ project: slug,
148
+ updatedAt: new Date().toISOString(),
149
+ };
150
+ if (!proj.createdAt)
151
+ proj.createdAt = new Date().toISOString();
152
+ fs.writeFileSync(p, JSON.stringify(proj, null, 2));
153
+ return { project: slug, file: p, message: `已切到项目 "${slug}"(本目录的命令默认作用于它)。` };
154
+ }
155
+ /** 读当前检出的项目 slug(就近 clize.json 的 project 字段,向上查找);无则 undefined。 */
156
+ export function currentProject() {
157
+ const p = readProject()?.project;
158
+ return typeof p === "string" && p ? p : undefined;
89
159
  }
90
160
  /** 免费 handle 根域(与 core/handle 一致)。 */
91
161
  const HANDLE_ROOT = process.env.CLIZE_HANDLE_ROOT || "clize.app";
92
- /** 读当前目录的项目绑定(clize.json);没有则 undefined。 */
162
+ /** 读当前目录的项目绑定(就近 clize.json,向上查找);没有则 undefined。 */
93
163
  export function readProject() {
164
+ const f = findProjectFile();
165
+ if (!f)
166
+ return undefined;
94
167
  try {
95
- return JSON.parse(fs.readFileSync(path.resolve("clize.json"), "utf8"));
168
+ return JSON.parse(fs.readFileSync(f, "utf8"));
96
169
  }
97
170
  catch {
98
171
  return undefined;
99
172
  }
100
173
  }
174
+ /** 从项目(clize.json)推默认部署域:handle → <slug>.<root>;自定义域原样。
175
+ * deploy 缺 --domain 时用它兜底 —— init 过的目录免显式传参(与 email send 推 from 对称)。 */
176
+ export function projectDomain() {
177
+ const p = readProject();
178
+ if (p?.handle)
179
+ return `${p.handle}.${HANDLE_ROOT}`;
180
+ if (p?.domain)
181
+ return p.domain;
182
+ return undefined;
183
+ }
101
184
  /** 从项目(clize.json)推默认发信身份:
102
185
  * handle → 发件 `<slug>@mail.<root>`、回信落 `support@<slug>.<root>`;
103
186
  * 自定义域 → 发件 `support@mail.<domain>`、回信落 `support@<domain>`。
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/core/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/core/setup.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  // 不用 per-handle worker、不用被 token 拦的 wildcard 路由。
5
5
  import fs from "node:fs";
6
6
  import path from "node:path";
7
+ import { assertDomainInProject } from "./projects.js";
7
8
  const SITE_WORKER = "clize-handle-site";
8
9
  const SITE_KV_TITLE = "clize-sites";
9
10
  /** 共享站点 worker 源码:KV 取 `${host}${path}`,SPA/根回退 index.html,无内容→占位页。 */
@@ -120,6 +121,8 @@ export async function deployFilesToHandle(ctx, handle, files) {
120
121
  const host = handle.toLowerCase();
121
122
  if (!files.length)
122
123
  throw new Error("没有文件可部署");
124
+ // 串台护栏:检出项目时,目标域必须属于当前项目(防把 A 项目的站部到 B 项目的域上)。
125
+ await assertDomainInProject(ctx, host, "deploy");
123
126
  // 自带 bootstrap:确保共享 worker + KV 就位(幂等)
124
127
  const kvId = (await ensureSiteInfra(ctx)).kvNamespaceId;
125
128
  const items = files.map((f) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"sites.js","sourceRoot":"","sources":["../../src/core/sites.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sites.js","sourceRoot":"","sources":["../../src/core/sites.ts"],"names":[],"mappings":"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"}