@aotter/mantle 0.0.11-alpha.63 → 0.0.11-alpha.64

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 (41) hide show
  1. package/README.md +87 -12
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +52 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/generate.d.ts +2 -0
  7. package/dist/generate.d.ts.map +1 -0
  8. package/dist/generate.js +181 -0
  9. package/dist/generate.js.map +1 -0
  10. package/dist/skills.d.ts +2 -0
  11. package/dist/skills.d.ts.map +1 -0
  12. package/dist/skills.js +80 -0
  13. package/dist/skills.js.map +1 -0
  14. package/dist/update.d.ts +2 -0
  15. package/dist/update.d.ts.map +1 -0
  16. package/dist/update.js +387 -0
  17. package/dist/update.js.map +1 -0
  18. package/docs/adr/0001-four-atom-manifest-model.md +6 -7
  19. package/docs/adr/0007-ai-as-primary-author.md +100 -138
  20. package/docs/adr/0008-structured-diagnostic-shape.md +79 -99
  21. package/docs/adr/0009-consumer-supplied-manifests.md +101 -228
  22. package/docs/adr/0012-views-as-public-rest.md +43 -15
  23. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +43 -17
  24. package/docs/adr/0018-core-starters-repository-boundary.md +155 -0
  25. package/docs/adr/README.md +8 -6
  26. package/docs/cloudflare-low-level-composition.md +94 -0
  27. package/docs/design-atoms.md +59 -57
  28. package/docs/design-references/editorial-blog-2026-05-05.md +7 -7
  29. package/docs/labels.md +1 -1
  30. package/docs/media-uploads.md +1 -1
  31. package/docs/release-process.md +156 -523
  32. package/package.json +9 -6
  33. package/skills/README.md +20 -16
  34. package/skills/develop/SKILL.md +4 -4
  35. package/skills/install/SKILL.md +16 -2
  36. package/skills/plugin/SKILL.md +1 -1
  37. package/skills/provision/SKILL.md +1 -1
  38. package/skills/theme/SKILL.md +12 -10
  39. package/skills/update/SKILL.md +31 -19
  40. package/skills/customize-design/SKILL.md +0 -215
  41. package/skills/extend/SKILL.md +0 -257
package/dist/update.js ADDED
@@ -0,0 +1,387 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, lstatSync, readFileSync, readdirSync, writeFileSync, } from "node:fs";
3
+ import { join, posix } from "node:path";
4
+ import { cwd, stderr, stdout } from "node:process";
5
+ import { parseArgs } from "node:util";
6
+ const REPORT_PATH = ".mantle/update-report.json";
7
+ const IGNORE_DIRS = new Set([".git", "node_modules", ".wrangler", ".wrangler-test", "dist"]);
8
+ const IGNORE_FILES = new Set([".mantle/features.json", ".mantle/launch-state.json", REPORT_PATH]);
9
+ export async function runUpdate(rawArgs) {
10
+ let values;
11
+ try {
12
+ ({ values } = parseArgs({
13
+ args: [...rawArgs],
14
+ options: {
15
+ ref: { type: "string" },
16
+ "bundle-base-url": { type: "string" },
17
+ help: { type: "boolean", short: "h" },
18
+ },
19
+ }));
20
+ }
21
+ catch (error) {
22
+ stderr.write(`${message(error)}\n`);
23
+ return 2;
24
+ }
25
+ if (values.help) {
26
+ printHelp();
27
+ return 0;
28
+ }
29
+ const root = cwd();
30
+ try {
31
+ const launchState = readJson(join(root, ".mantle", "launch-state.json"));
32
+ const features = readJson(join(root, ".mantle", "features.json"));
33
+ const registry = recordField(features, "registry");
34
+ const sourceRef = stringField(launchState, "starter_ref");
35
+ const targetRef = values.ref ?? stringField(registry, "version");
36
+ const bundleBaseUrl = values["bundle-base-url"] ?? stringField(registry, "bundleBaseUrl");
37
+ if (!sourceRef)
38
+ throw new UsageError(".mantle/launch-state.json is missing starter_ref");
39
+ if (!targetRef)
40
+ throw new UsageError("pass --ref or configure registry.version");
41
+ if (!bundleBaseUrl) {
42
+ throw new UsageError("pass --bundle-base-url or configure registry.bundleBaseUrl");
43
+ }
44
+ if (!bundleBaseUrl.includes("{ref}")) {
45
+ throw new UsageError("bundle base URL must contain {ref}");
46
+ }
47
+ const archetype = launchArchetype(launchState, features);
48
+ const sourceBundle = await fetchBundle(bundleBaseUrl, sourceRef, archetype);
49
+ const targetBundle = sourceRef === targetRef
50
+ ? sourceBundle
51
+ : await fetchBundle(bundleBaseUrl, targetRef, archetype);
52
+ const timestamp = new Date().toISOString();
53
+ const turnstileSiteKey = optionalStringField(launchState, "turnstile_site_key")
54
+ ?? readWranglerStringVar(root, "TURNSTILE_SITE_KEY")
55
+ ?? "";
56
+ const source = materializeBundle(sourceBundle, placeholders(launchState, archetype, sourceRef, timestamp, turnstileSiteKey));
57
+ const target = materializeBundle(targetBundle, placeholders(launchState, archetype, targetRef, timestamp, turnstileSiteKey));
58
+ const upstream = compareSnapshots(source, target);
59
+ const local = compareProject(root, source);
60
+ const report = {
61
+ schema_version: 3,
62
+ generated_at: timestamp,
63
+ source_ref: sourceRef,
64
+ target_ref: targetRef,
65
+ bundle_base_url: bundleBaseUrl,
66
+ bundle_version: targetBundle.version ?? null,
67
+ upstream,
68
+ local,
69
+ metadata_migration: metadataMigration(sourceRef, targetRef, bundleBaseUrl, registry),
70
+ next_step: "Port reviewed upstream changes only, then apply the reported metadata migration while preserving all other instance state.",
71
+ };
72
+ writeReport(root, `${JSON.stringify(report, null, 2)}\n`);
73
+ stdout.write(`mantle update report: ${REPORT_PATH}\n`);
74
+ stdout.write(`${sourceRef} → ${targetRef}: ${upstream.counts.differing} changed, `
75
+ + `${upstream.counts.missing_current} added, ${upstream.counts.removed_upstream} removed; `
76
+ + `local: ${local.counts.differing} modified, ${local.counts.missing_current} missing, `
77
+ + `${local.counts.removed_upstream} project-only\n`);
78
+ return 0;
79
+ }
80
+ catch (error) {
81
+ stderr.write(`mantle update: ${message(error)}\n`);
82
+ return error instanceof UsageError ? 2 : 1;
83
+ }
84
+ }
85
+ function printHelp() {
86
+ stdout.write(`mantle update — compare this site with another provision bundle
87
+
88
+ Usage: mantle update [options]
89
+
90
+ Options:
91
+ --ref <ref> Target immutable starter ref; defaults to registry.version
92
+ --bundle-base-url <url> Bundle root containing {ref}; defaults to registry.bundleBaseUrl
93
+ -h, --help This help
94
+ `);
95
+ }
96
+ async function fetchBundle(baseTemplate, ref, archetype) {
97
+ let lastUrl = "";
98
+ let lastStatus = 404;
99
+ for (const candidate of bundleRefCandidates(ref)) {
100
+ const base = baseTemplate.replaceAll("{ref}", encodeURIComponent(candidate)).replace(/\/+$/, "");
101
+ const url = new URL(`${base}/${encodeURIComponent(archetype)}.json`);
102
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
103
+ throw new Error("bundle base URL must use http or https");
104
+ }
105
+ lastUrl = url.toString();
106
+ const response = await fetch(url, { headers: { accept: "application/json" } });
107
+ lastStatus = response.status;
108
+ if (!response.ok && response.status === 404)
109
+ continue;
110
+ if (!response.ok)
111
+ throw new Error(`failed to fetch ${url}: HTTP ${response.status}`);
112
+ const value = await response.json();
113
+ if (!isRecord(value) || !isStringRecord(value.files)) {
114
+ throw new Error(`invalid provision bundle at ${url}`);
115
+ }
116
+ if (typeof value.archetype === "string" && value.archetype !== archetype) {
117
+ throw new Error(`provision bundle at ${url} is ${value.archetype}, expected ${archetype}`);
118
+ }
119
+ return {
120
+ version: typeof value.version === "string" ? value.version : undefined,
121
+ files: value.files,
122
+ };
123
+ }
124
+ throw new Error(`failed to fetch ${lastUrl}: HTTP ${lastStatus}`);
125
+ }
126
+ function bundleRefCandidates(ref) {
127
+ return /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(ref) ? [ref, `v${ref}`] : [ref];
128
+ }
129
+ function materializeBundle(bundle, values) {
130
+ const files = new Map();
131
+ for (const [sourcePath, source] of Object.entries(bundle.files).sort(([a], [b]) => a.localeCompare(b))) {
132
+ const path = safeBundlePath(sourcePath);
133
+ if (files.has(path))
134
+ throw new Error(`duplicate provision bundle path: ${path}`);
135
+ let text = substitute(source, values);
136
+ if (path === "wrangler.toml")
137
+ text = materializeLegacyWranglerToml(text, values);
138
+ files.set(path, text);
139
+ }
140
+ return files;
141
+ }
142
+ function safeBundlePath(source) {
143
+ const slashPath = source.replaceAll("\\", "/");
144
+ if (/^(?:\/|[A-Za-z]:\/)/.test(slashPath) || slashPath.split("/").includes("..")) {
145
+ throw new Error(`bundle path escapes project root: ${source}`);
146
+ }
147
+ const path = posix.normalize(slashPath.replace(/\.template$/, ""));
148
+ if (path === "." || path.startsWith("../")) {
149
+ throw new Error(`bundle path escapes project root: ${source}`);
150
+ }
151
+ return path;
152
+ }
153
+ function substitute(source, values) {
154
+ return source.replace(/\{\{([A-Z_][A-Z0-9_]*)\}\}/g, (token, key) => {
155
+ const value = values[key];
156
+ if (value === undefined)
157
+ throw new Error(`unknown provision placeholder ${token}`);
158
+ return value;
159
+ });
160
+ }
161
+ function materializeLegacyWranglerToml(text, values) {
162
+ const envStart = text.search(/\n\[env\./);
163
+ const tail = envStart === -1 ? "" : text.slice(envStart);
164
+ let head = envStart === -1 ? text : text.slice(0, envStart);
165
+ head = head.replace(/^name = ".*"$/m, `name = ${JSON.stringify(values.PROJECT_NAME)}`);
166
+ head = head.replace(/^database_name = ".*"$/m, `database_name = ${JSON.stringify(`${values.PROJECT_NAME}-db`)}`);
167
+ head = upsertWranglerStringVar(head, "PUBLIC_ORIGIN", values.SITE_URL ?? "");
168
+ if (values.TURNSTILE_SITE_KEY?.trim()) {
169
+ head = upsertWranglerStringVar(head, "TURNSTILE_SITE_KEY", values.TURNSTILE_SITE_KEY.trim());
170
+ }
171
+ return `${head}${tail}`;
172
+ }
173
+ function upsertWranglerStringVar(text, name, value) {
174
+ const line = `${name} = ${JSON.stringify(value)}`;
175
+ const existing = new RegExp(`^\\s*#?\\s*${escapeRegExp(name)}\\s*=.*$`, "m");
176
+ if (existing.test(text))
177
+ return text.replace(existing, line);
178
+ const vars = text.match(/^\[vars\]\s*$/m);
179
+ if (!vars || vars.index === undefined)
180
+ return `${text.trimEnd()}\n\n[vars]\n${line}\n`;
181
+ const index = vars.index + vars[0].length;
182
+ return `${text.slice(0, index)}\n${line}${text.slice(index)}`;
183
+ }
184
+ function readWranglerStringVar(root, name) {
185
+ const path = join(root, "wrangler.toml");
186
+ if (!existsSync(path) || !lstatSync(path).isFile())
187
+ return null;
188
+ const source = readFileSync(path, "utf8");
189
+ const match = source.match(new RegExp(`^\\s*${escapeRegExp(name)}\\s*=\\s*("(?:[^"\\\\]|\\\\.)*")\\s*$`, "m"));
190
+ if (!match?.[1])
191
+ return null;
192
+ try {
193
+ const value = JSON.parse(match[1]);
194
+ return typeof value === "string" ? value.trim() : null;
195
+ }
196
+ catch {
197
+ return null;
198
+ }
199
+ }
200
+ function escapeRegExp(value) {
201
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
202
+ }
203
+ function placeholders(launchState, archetype, targetRef, timestamp, turnstileSiteKey) {
204
+ const github = recordField(launchState, "github");
205
+ const repo = recordField(launchState, "repo");
206
+ const siteOwner = recordField(launchState, "site_owner");
207
+ const locales = arrayField(launchState, "locales");
208
+ const owner = optionalStringField(repo, "owner")
209
+ ?? optionalStringField(github, "owner")
210
+ ?? "unknown-owner";
211
+ const projectName = stringField(launchState, "project_name")
212
+ ?? stringField(repo, "name")
213
+ ?? "mantle-site";
214
+ const siteUrl = stringField(launchState, "site_url") ?? "https://example.com";
215
+ const locale = stringField(launchState, "canonical_locale") ?? locales[0] ?? "en";
216
+ const description = stringField(launchState, "description")
217
+ ?? stringField(launchState, "purpose")
218
+ ?? `${projectName} site.`;
219
+ return {
220
+ PROJECT_NAME: projectName,
221
+ ARCHETYPE: archetype,
222
+ BRAND: stringField(launchState, "brand") ?? projectName,
223
+ DESCRIPTION: description,
224
+ INSTALL_SUMMARY: stringField(launchState, "summary") ?? description,
225
+ LOCALES: JSON.stringify(locales.length ? locales : ["en"]),
226
+ CANONICAL_LOCALE: locale,
227
+ STARTER_REF: targetRef,
228
+ GITHUB_OWNER: owner,
229
+ ADMIN_GITHUB_LOGIN: optionalStringField(github, "admin_login")
230
+ ?? optionalStringField(siteOwner, "github_login")
231
+ ?? owner,
232
+ SITE_OWNER_EMAIL: optionalStringField(siteOwner, "email") ?? "",
233
+ AUTH_MODE: stringField(launchState, "authMode") ?? "self-managed",
234
+ SITE_URL: siteUrl,
235
+ TURNSTILE_SITE_KEY: turnstileSiteKey,
236
+ AFTER_LAUNCH_SKILL_URL: stringField(launchState, "after_launch_skill_url") ?? "",
237
+ INSTALL_TIMESTAMP: timestamp,
238
+ };
239
+ }
240
+ function compareSnapshots(current, upstream) {
241
+ const differing = [];
242
+ const missingCurrent = [];
243
+ for (const [path, source] of [...upstream].sort(([a], [b]) => a.localeCompare(b))) {
244
+ if (IGNORE_FILES.has(path))
245
+ continue;
246
+ const existing = current.get(path);
247
+ if (existing === undefined)
248
+ missingCurrent.push({ path, upstream_sha256: sha256(source) });
249
+ else if (existing !== source) {
250
+ differing.push({ path, current_sha256: sha256(existing), upstream_sha256: sha256(source) });
251
+ }
252
+ }
253
+ const removedUpstream = [...current]
254
+ .filter(([path]) => !IGNORE_FILES.has(path) && !upstream.has(path))
255
+ .sort(([a], [b]) => a.localeCompare(b))
256
+ .map(([path, source]) => ({ path, current_sha256: sha256(source) }));
257
+ return diffReport(differing, missingCurrent, removedUpstream);
258
+ }
259
+ function compareProject(root, upstream) {
260
+ const differing = [];
261
+ const missingCurrent = [];
262
+ for (const [path, source] of [...upstream].sort(([a], [b]) => a.localeCompare(b))) {
263
+ if (IGNORE_FILES.has(path))
264
+ continue;
265
+ const currentPath = join(root, path);
266
+ if (!existsSync(currentPath) || !lstatSync(currentPath).isFile()) {
267
+ missingCurrent.push({ path, upstream_sha256: sha256(source) });
268
+ continue;
269
+ }
270
+ const current = readFileSync(currentPath);
271
+ if (sha256(current) !== sha256(source)) {
272
+ differing.push({ path, current_sha256: sha256(current), upstream_sha256: sha256(source) });
273
+ }
274
+ }
275
+ const removedUpstream = listProjectFiles(root)
276
+ .filter((path) => !upstream.has(path))
277
+ .map((path) => ({ path, current_sha256: sha256(readFileSync(join(root, path))) }));
278
+ return diffReport(differing, missingCurrent, removedUpstream);
279
+ }
280
+ function listProjectFiles(root, prefix = "") {
281
+ const files = [];
282
+ for (const entry of readdirSync(join(root, prefix), { withFileTypes: true })) {
283
+ if (IGNORE_DIRS.has(entry.name))
284
+ continue;
285
+ const path = prefix ? `${prefix}/${entry.name}` : entry.name;
286
+ if (entry.isDirectory())
287
+ files.push(...listProjectFiles(root, path));
288
+ else if (entry.isFile() && !IGNORE_FILES.has(path))
289
+ files.push(path);
290
+ }
291
+ return files.sort();
292
+ }
293
+ function diffReport(differing, missingCurrent, removedUpstream) {
294
+ return {
295
+ counts: {
296
+ differing: differing.length,
297
+ missing_current: missingCurrent.length,
298
+ removed_upstream: removedUpstream.length,
299
+ },
300
+ differing,
301
+ missing_current: missingCurrent,
302
+ removed_upstream: removedUpstream,
303
+ };
304
+ }
305
+ function metadataMigration(sourceRef, targetRef, bundleBaseUrl, registry) {
306
+ return {
307
+ required: sourceRef !== targetRef
308
+ || stringField(registry, "version") !== targetRef
309
+ || stringField(registry, "bundleBaseUrl") !== bundleBaseUrl,
310
+ apply_after_reviewed_port: true,
311
+ files: [
312
+ {
313
+ path: ".mantle/launch-state.json",
314
+ set: { starter_ref: targetRef },
315
+ },
316
+ {
317
+ path: ".mantle/features.json",
318
+ set: {
319
+ "registry.version": targetRef,
320
+ "registry.bundleBaseUrl": bundleBaseUrl,
321
+ },
322
+ },
323
+ ],
324
+ };
325
+ }
326
+ function writeReport(root, source) {
327
+ const directory = join(root, ".mantle");
328
+ if (!existsSync(directory) || !lstatSync(directory).isDirectory()) {
329
+ throw new Error(".mantle must be a real directory");
330
+ }
331
+ const path = join(root, REPORT_PATH);
332
+ if (existsSync(path) && !lstatSync(path).isFile()) {
333
+ throw new Error(`${REPORT_PATH} must be a regular file`);
334
+ }
335
+ writeFileSync(path, source, "utf8");
336
+ }
337
+ function sha256(value) {
338
+ return createHash("sha256").update(value).digest("hex");
339
+ }
340
+ function readJson(path) {
341
+ if (!existsSync(path))
342
+ return {};
343
+ const value = JSON.parse(readFileSync(path, "utf8"));
344
+ return isRecord(value) ? value : {};
345
+ }
346
+ function launchArchetype(launchState, features) {
347
+ const archetype = stringField(launchState, "archetype")
348
+ ?? stringField(recordField(features, "archetype"), "name")
349
+ ?? "blank";
350
+ if (!/^[a-z0-9-]+$/.test(archetype))
351
+ throw new Error(`invalid archetype: ${archetype}`);
352
+ return archetype;
353
+ }
354
+ function recordField(value, key) {
355
+ if (!isRecord(value))
356
+ return {};
357
+ return isRecord(value[key]) ? value[key] : {};
358
+ }
359
+ function stringField(value, key) {
360
+ if (!isRecord(value))
361
+ return null;
362
+ const field = value[key];
363
+ return typeof field === "string" && field.trim() ? field.trim() : null;
364
+ }
365
+ function optionalStringField(value, key) {
366
+ if (!isRecord(value))
367
+ return null;
368
+ const field = value[key];
369
+ return typeof field === "string" ? field.trim() : null;
370
+ }
371
+ function arrayField(value, key) {
372
+ if (!isRecord(value) || !Array.isArray(value[key]))
373
+ return [];
374
+ return value[key].filter((item) => typeof item === "string");
375
+ }
376
+ function isRecord(value) {
377
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
378
+ }
379
+ function isStringRecord(value) {
380
+ return isRecord(value) && Object.values(value).every((item) => typeof item === "string");
381
+ }
382
+ function message(error) {
383
+ return error instanceof Error ? error.message : String(error);
384
+ }
385
+ class UsageError extends Error {
386
+ }
387
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
@@ -209,12 +209,11 @@ See § Authoring shape below for the full retirement rationale.
209
209
 
210
210
  ## Implementation status
211
211
 
212
- Names + PG-1:1 framing are documented in this ADR and the
213
- manifest grammar reference. Manifest TS types live in
214
- `packages/mantle-spec/`. Starter manifests under
215
- `starters/` declare instances of each. Runtime dispatcher /
216
- View executor / Procedure dispatcher are tracked under the
217
- v0.1.0 ship list in [aotter/mantle](https://github.com/aotter/mantle).
212
+ Names + PG-1:1 framing are documented in this ADR and the manifest grammar
213
+ reference. Manifest TS types live in `packages/mantle-spec/`. The external
214
+ [`aotter/mantle-starters`](https://github.com/aotter/mantle-starters)
215
+ repository declares consumer instances of each atom. Runtime dispatcher, View
216
+ executor, and Procedure dispatcher live in this repository.
218
217
 
219
218
  ---
220
219
 
@@ -500,7 +499,7 @@ YAML's standard `---` separator allows multiple documents in
500
499
  one file. A "feature file" carries all atoms for that feature:
501
500
 
502
501
  ```yaml
503
- # starters/<starter>/manifests/contact.yaml
502
+ # manifests/contact.yaml
504
503
  apiVersion: cms.mantle.aotter.net/v1
505
504
  kind: Schema
506
505
  metadata: { name: contact-messages }