@aotter/mantle 0.0.11-alpha.62 → 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 (52) hide show
  1. package/README.md +96 -11
  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/harness-cli.d.ts +3 -0
  11. package/dist/harness-cli.d.ts.map +1 -0
  12. package/dist/harness-cli.js +209 -0
  13. package/dist/harness-cli.js.map +1 -0
  14. package/dist/runtime-testing.d.ts +2 -0
  15. package/dist/runtime-testing.d.ts.map +1 -0
  16. package/dist/runtime-testing.js +2 -0
  17. package/dist/runtime-testing.js.map +1 -0
  18. package/dist/skills.d.ts +2 -0
  19. package/dist/skills.d.ts.map +1 -0
  20. package/dist/skills.js +80 -0
  21. package/dist/skills.js.map +1 -0
  22. package/dist/update.d.ts +2 -0
  23. package/dist/update.d.ts.map +1 -0
  24. package/dist/update.js +387 -0
  25. package/dist/update.js.map +1 -0
  26. package/docs/adapter-guide.md +8 -0
  27. package/docs/adr/0001-four-atom-manifest-model.md +6 -7
  28. package/docs/adr/0007-ai-as-primary-author.md +100 -138
  29. package/docs/adr/0008-structured-diagnostic-shape.md +79 -99
  30. package/docs/adr/0009-consumer-supplied-manifests.md +101 -228
  31. package/docs/adr/0012-views-as-public-rest.md +43 -15
  32. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +43 -17
  33. package/docs/adr/0018-core-starters-repository-boundary.md +155 -0
  34. package/docs/adr/README.md +8 -6
  35. package/docs/cloudflare-low-level-composition.md +94 -0
  36. package/docs/design-atoms.md +59 -57
  37. package/docs/design-references/editorial-blog-2026-05-05.md +7 -7
  38. package/docs/labels.md +1 -1
  39. package/docs/media-uploads.md +1 -1
  40. package/docs/performance-harness.md +104 -0
  41. package/docs/release-process.md +156 -523
  42. package/docs/schema-indexes.md +14 -1
  43. package/package.json +16 -6
  44. package/skills/README.md +20 -16
  45. package/skills/develop/SKILL.md +42 -4
  46. package/skills/install/SKILL.md +16 -2
  47. package/skills/plugin/SKILL.md +1 -1
  48. package/skills/provision/SKILL.md +1 -1
  49. package/skills/theme/SKILL.md +12 -10
  50. package/skills/update/SKILL.md +31 -19
  51. package/skills/customize-design/SKILL.md +0 -215
  52. package/skills/extend/SKILL.md +0 -257
@@ -0,0 +1,2 @@
1
+ export * from "@aotter/mantle-runtime/testing";
2
+ //# sourceMappingURL=runtime-testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-testing.d.ts","sourceRoot":"","sources":["../src/runtime-testing.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "@aotter/mantle-runtime/testing";
2
+ //# sourceMappingURL=runtime-testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-testing.js","sourceRoot":"","sources":["../src/runtime-testing.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function runSkills(rawArgs: readonly string[]): Promise<number>;
2
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"AAQA,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgD3E"}
package/dist/skills.js ADDED
@@ -0,0 +1,80 @@
1
+ import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
2
+ import { dirname, join, relative, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { cwd, stderr, stdout } from "node:process";
5
+ import { parseArgs } from "node:util";
6
+ const PROJECT_SKILLS = ["develop", "plugin", "theme", "update"];
7
+ export async function runSkills(rawArgs) {
8
+ let check;
9
+ try {
10
+ const { values } = parseArgs({
11
+ args: [...rawArgs],
12
+ options: {
13
+ check: { type: "boolean" },
14
+ help: { type: "boolean", short: "h" },
15
+ },
16
+ });
17
+ if (values.help) {
18
+ printHelp();
19
+ return 0;
20
+ }
21
+ check = values.check === true;
22
+ }
23
+ catch (error) {
24
+ stderr.write(`${message(error)}\n`);
25
+ return 2;
26
+ }
27
+ try {
28
+ const sourceRoot = await skillSourceRoot();
29
+ let stale = false;
30
+ for (const skill of PROJECT_SKILLS) {
31
+ const expected = await readFile(join(sourceRoot, skill, "SKILL.md"), "utf8");
32
+ for (const tool of [".agent", ".claude"]) {
33
+ const target = resolve(cwd(), tool, "skills", `mantle-${skill}`, "SKILL.md");
34
+ const current = await readFile(target, "utf8").catch(() => null);
35
+ if (current === expected)
36
+ continue;
37
+ stale = true;
38
+ if (check) {
39
+ stderr.write(`Mantle skill is stale: ${relative(cwd(), target)}\n`);
40
+ continue;
41
+ }
42
+ await mkdir(dirname(target), { recursive: true });
43
+ await writeFile(target, expected, "utf8");
44
+ }
45
+ }
46
+ if (stale && check) {
47
+ stderr.write("Mantle skills are stale; run `mantle skills`.\n");
48
+ return 1;
49
+ }
50
+ if (!check)
51
+ stdout.write("Mantle skills projected.\n");
52
+ return 0;
53
+ }
54
+ catch (error) {
55
+ stderr.write(`mantle skills: ${message(error)}\n`);
56
+ return 2;
57
+ }
58
+ }
59
+ function printHelp() {
60
+ stdout.write(`mantle skills — project version-matched Core skills
61
+
62
+ Usage: mantle skills [--check]
63
+
64
+ Options:
65
+ --check Fail without writing when projected skills are stale
66
+ -h, --help This help
67
+ `);
68
+ }
69
+ async function skillSourceRoot() {
70
+ const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
71
+ for (const candidate of [join(packageRoot, "skills"), resolve(packageRoot, "../../skills")]) {
72
+ if ((await stat(candidate).catch(() => null))?.isDirectory())
73
+ return candidate;
74
+ }
75
+ throw new Error("Core skills are missing from the installed package");
76
+ }
77
+ function message(error) {
78
+ return error instanceof Error ? error.message : String(error);
79
+ }
80
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runUpdate(rawArgs: readonly string[]): Promise<number>;
2
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAwBA,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAkF3E"}
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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"}
@@ -61,6 +61,14 @@ await runtime.bootInit();
61
61
 
62
62
  `bootInit()` runs canonical migrations, seeds `siteDefaults`, and validates the manifest set. Call it once before serving CMS traffic. The Cloudflare adapter's reference pattern is `packages/adapters/cloudflare/src/mount/bootRuntimeOnce.ts`.
63
63
 
64
+ Use purpose-shaped runtime surfaces for canonical data: `runtime.entryReader`
65
+ applies Schema index declarations, locale semantics, and the public `Entry`
66
+ projection; `runtime.siteConfig` owns site settings. `runtime.db` remains only
67
+ for source compatibility and is deprecated. An adapter that owns additional
68
+ tables should retain the `DatabaseDriver` it injected instead of reaching back
69
+ through the assembled runtime. Authoring continues through the pre-wired
70
+ content use cases.
71
+
64
72
  ## HTTP and MCP surfaces
65
73
 
66
74
  The runtime is a library, not an HTTP server. A new adapter must mount equivalent framework routes:
@@ -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 }