@aotter/mantle 0.1.5-alpha.1 → 0.2.0-alpha.10

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 (495) hide show
  1. package/README.md +166 -298
  2. package/dist/auth/adapter.d.ts +32 -0
  3. package/dist/auth/adapter.js +288 -0
  4. package/dist/auth/admin.d.ts +3 -0
  5. package/dist/auth/admin.js +21 -0
  6. package/dist/auth/caller.d.ts +86 -0
  7. package/dist/auth/caller.js +155 -0
  8. package/dist/auth/hardening.d.ts +24 -0
  9. package/dist/auth/hardening.js +40 -0
  10. package/dist/auth/identity.d.ts +121 -0
  11. package/dist/auth/identity.js +203 -0
  12. package/dist/auth/oauth.d.ts +63 -0
  13. package/dist/auth/oauth.js +217 -0
  14. package/dist/auth/resource-seeds.js +10 -0
  15. package/dist/auth/routes.d.ts +32 -0
  16. package/dist/auth/routes.js +226 -0
  17. package/dist/build/compiler.d.ts +721 -0
  18. package/dist/build/compiler.js +7029 -0
  19. package/dist/build/spec/domain/model/ManifestGrammar.d.ts +439 -0
  20. package/dist/build/spec/domain/model/RuntimePlan.d.ts +168 -0
  21. package/dist/build/spec/domain/model/SqlIr.d.ts +129 -0
  22. package/dist/build/spec/domain/model/UserFields.d.ts +21 -0
  23. package/dist/build/spec/domain/service/PlanFingerprint.d.ts +7 -0
  24. package/dist/build/spec/kernel/diagnostic.d.ts +108 -0
  25. package/dist/bun/assets.d.ts +2 -0
  26. package/dist/bun/assets.js +24 -0
  27. package/dist/domain/adminOrder.js +24 -0
  28. package/dist/domain/columns.js +57 -0
  29. package/dist/domain/describe/chunk-ZVXBGP7Y.js +424 -0
  30. package/dist/domain/describe/index.d.ts +58 -0
  31. package/dist/domain/describe/index.js +115 -0
  32. package/dist/domain/describe/target-hash.d.ts +8 -0
  33. package/dist/domain/describe/target-hash.js +12 -0
  34. package/dist/domain/describe/targets.d.ts +40 -0
  35. package/dist/domain/entry.js +33 -0
  36. package/dist/domain/generated-tools.js +19 -0
  37. package/dist/domain/generation.d.ts +16 -0
  38. package/dist/domain/generation.js +1 -0
  39. package/dist/domain/input.js +17 -0
  40. package/dist/domain/model.js +1 -0
  41. package/dist/domain/paging.js +230 -0
  42. package/dist/domain/recipes.js +24 -0
  43. package/dist/domain/userReferences.js +5 -0
  44. package/dist/domain/wireScalars.js +47 -0
  45. package/dist/infrastructure/adminEntries.js +153 -0
  46. package/dist/infrastructure/adminPaging.js +72 -0
  47. package/dist/infrastructure/artifacts.js +71 -0
  48. package/dist/infrastructure/authSchema.js +83 -0
  49. package/dist/infrastructure/bundle.js +188 -0
  50. package/dist/infrastructure/cli.js +118 -0
  51. package/dist/infrastructure/generate.d.ts +12 -0
  52. package/dist/infrastructure/generate.js +189 -0
  53. package/dist/infrastructure/generateAuth.d.ts +8 -0
  54. package/dist/infrastructure/generateAuth.js +74 -0
  55. package/dist/infrastructure/help.js +60 -0
  56. package/dist/infrastructure/init.js +54 -0
  57. package/dist/infrastructure/inputs.js +41 -0
  58. package/dist/infrastructure/mounts.js +25 -0
  59. package/dist/infrastructure/wrangler.js +109 -0
  60. package/dist/kernel/authorization.d.ts +4 -0
  61. package/dist/kernel/authorization.js +16 -0
  62. package/dist/kernel/binds.d.ts +60 -0
  63. package/dist/kernel/binds.js +49 -0
  64. package/dist/kernel/caller-identity.d.ts +24 -0
  65. package/dist/kernel/caller-identity.js +22 -0
  66. package/dist/kernel/contract-error.d.ts +12 -0
  67. package/dist/kernel/contract-error.js +14 -0
  68. package/dist/kernel/contracts.d.ts +143 -0
  69. package/dist/kernel/contracts.js +97 -0
  70. package/dist/kernel/cron.d.ts +1 -0
  71. package/dist/kernel/cron.js +58 -0
  72. package/dist/kernel/dialect/common.d.ts +38 -0
  73. package/dist/kernel/dialect/common.js +6 -0
  74. package/dist/kernel/dialect/postgres.d.ts +16 -0
  75. package/dist/kernel/dialect/postgres.js +18 -0
  76. package/dist/kernel/dialect/sqlite.d.ts +20 -0
  77. package/dist/kernel/dialect/sqlite.js +34 -0
  78. package/dist/kernel/drain.d.ts +5 -0
  79. package/dist/kernel/drain.js +35 -0
  80. package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
  81. package/dist/kernel/driver/bun-sqlite.js +77 -0
  82. package/dist/kernel/driver/d1.d.ts +24 -0
  83. package/dist/kernel/driver/d1.js +22 -0
  84. package/dist/kernel/driver/postgres.d.ts +25 -0
  85. package/dist/kernel/driver/postgres.js +99 -0
  86. package/dist/kernel/driver/transaction-context.d.ts +10 -0
  87. package/dist/kernel/driver/transaction-context.js +29 -0
  88. package/dist/kernel/email.d.ts +28 -0
  89. package/dist/kernel/email.js +38 -0
  90. package/dist/kernel/host-access.d.ts +10 -0
  91. package/dist/kernel/host-access.js +65 -0
  92. package/dist/kernel/host-caller.d.ts +39 -0
  93. package/dist/kernel/host-caller.js +56 -0
  94. package/dist/kernel/json-body.d.ts +4 -0
  95. package/dist/kernel/json-body.js +44 -0
  96. package/dist/kernel/mcp-apps.d.ts +69 -0
  97. package/dist/kernel/mcp-apps.js +40 -0
  98. package/dist/kernel/mcp-call.d.ts +5 -0
  99. package/dist/kernel/mcp-call.js +25 -0
  100. package/dist/kernel/mcp-handler.js +371 -0
  101. package/dist/kernel/mcp.d.ts +110 -0
  102. package/dist/kernel/mcp.js +50 -0
  103. package/dist/kernel/media.d.ts +27 -0
  104. package/dist/kernel/media.js +216 -0
  105. package/dist/kernel/paging.d.ts +55 -0
  106. package/dist/kernel/paging.js +95 -0
  107. package/dist/kernel/publishing.d.ts +4 -0
  108. package/dist/kernel/publishing.js +16 -0
  109. package/dist/kernel/r2-media.d.ts +42 -0
  110. package/dist/kernel/r2-media.js +78 -0
  111. package/dist/kernel/rest-dispatch.js +38 -0
  112. package/dist/kernel/rest-router.js +64 -0
  113. package/dist/kernel/rest.d.ts +58 -0
  114. package/dist/kernel/rest.js +41 -0
  115. package/dist/kernel/scalars.d.ts +6 -0
  116. package/dist/kernel/scalars.js +44 -0
  117. package/dist/kernel/search.js +5 -0
  118. package/dist/kernel/site-types.d.ts +146 -0
  119. package/dist/kernel/site-types.js +1 -0
  120. package/dist/kernel/site.d.ts +39 -0
  121. package/dist/kernel/site.js +32 -0
  122. package/dist/kernel/store.d.ts +175 -0
  123. package/dist/kernel/store.js +269 -0
  124. package/dist/kernel/surface.d.ts +10 -0
  125. package/dist/kernel/surface.js +19 -0
  126. package/dist/kernel/sweep.d.ts +17 -0
  127. package/dist/kernel/sweep.js +27 -0
  128. package/dist/kernel/translations.d.ts +1 -0
  129. package/dist/kernel/translations.js +13 -0
  130. package/dist/kernel/user-caller.d.ts +31 -0
  131. package/dist/kernel/user-caller.js +67 -0
  132. package/dist/kernel/user-field-name.js +3 -0
  133. package/dist/kernel/user-fields.d.ts +35 -0
  134. package/dist/kernel/user-fields.js +81 -0
  135. package/dist/kernel/validation.d.ts +15 -0
  136. package/dist/kernel/validation.js +54 -0
  137. package/dist/kernel/web-gateway.js +68 -0
  138. package/dist/kernel/web-head.js +15 -0
  139. package/dist/kernel/web-index.js +40 -0
  140. package/dist/kernel/web-response.js +8 -0
  141. package/dist/kernel/web.d.ts +77 -0
  142. package/dist/kernel/web.js +124 -0
  143. package/dist/kernel/where.js +27 -0
  144. package/dist/testing/index.d.ts +1 -0
  145. package/dist/testing/index.js +1 -0
  146. package/dist/usecase/adminBindings.js +143 -0
  147. package/dist/usecase/adminClient.js +87 -0
  148. package/dist/usecase/adminDescriptors.js +107 -0
  149. package/dist/usecase/generate.js +166 -0
  150. package/dist/usecase/handlers.js +21 -0
  151. package/dist/usecase/mcp-media.js +17 -0
  152. package/dist/usecase/mcp.js +100 -0
  153. package/dist/usecase/paging.js +71 -0
  154. package/dist/usecase/publishing.js +63 -0
  155. package/dist/usecase/refusals.js +27 -0
  156. package/dist/usecase/rest.js +54 -0
  157. package/dist/usecase/search.js +7 -0
  158. package/dist/usecase/site.js +39 -0
  159. package/dist/usecase/stores.js +64 -0
  160. package/dist/usecase/tool-version.js +9 -0
  161. package/dist/usecase/translations.js +78 -0
  162. package/dist/usecase/ttl.js +20 -0
  163. package/dist/usecase/validation.js +241 -0
  164. package/dist/usecase/web.js +23 -0
  165. package/docs/examples/README.md +39 -18
  166. package/docs/examples/app-shell/.dev.vars.example +4 -0
  167. package/docs/examples/app-shell/README.md +121 -0
  168. package/docs/examples/app-shell/accept.mjs +91 -0
  169. package/docs/examples/app-shell/gitignore +7 -0
  170. package/docs/examples/app-shell/package.json +43 -0
  171. package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
  172. package/docs/examples/app-shell/smoke-kit.mjs +168 -0
  173. package/docs/examples/app-shell/src/auth.ts +58 -0
  174. package/docs/examples/app-shell/src/handlers.ts +5 -0
  175. package/docs/examples/app-shell/src/index.ts +4 -0
  176. package/docs/examples/app-shell/src/routes.ts +14 -0
  177. package/docs/examples/app-shell/src/schedule.ts +8 -0
  178. package/docs/examples/app-shell/src/service.ts +70 -0
  179. package/docs/examples/app-shell/src/sign-in.ts +41 -0
  180. package/docs/examples/app-shell/src/signup.ts +8 -0
  181. package/docs/examples/app-shell/tsconfig.json +26 -0
  182. package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
  183. package/docs/examples/app-shell/wrangler.jsonc +62 -0
  184. package/docs/examples/club-events/README.md +65 -0
  185. package/docs/examples/club-events/manifests/club-events.yaml +247 -0
  186. package/docs/examples/club-events/smoke.mjs +127 -0
  187. package/docs/examples/club-events/src/handlers.ts +25 -0
  188. package/docs/examples/club-events/src/signup.ts +9 -0
  189. package/docs/examples/generated-web/README.md +78 -0
  190. package/docs/examples/generated-web/posts.yaml +38 -0
  191. package/docs/examples/generated-web/seed.sql +6 -0
  192. package/docs/examples/generated-web/src/worker.ts +43 -0
  193. package/docs/examples/generated-web/tsconfig.json +8 -0
  194. package/docs/examples/generated-web/wrangler.jsonc +8 -0
  195. package/docs/examples/purchasing/.dev.vars.example +6 -0
  196. package/docs/examples/purchasing/README.md +99 -0
  197. package/docs/examples/purchasing/manifests/purchasing.yaml +374 -0
  198. package/docs/examples/purchasing/seed.sql +4 -0
  199. package/docs/examples/purchasing/smoke.mjs +191 -0
  200. package/docs/examples/purchasing/src/admin.tsx +13 -0
  201. package/docs/examples/purchasing/src/handlers.ts +33 -0
  202. package/docs/examples/purchasing/src/notify.ts +29 -0
  203. package/docs/examples/purchasing/src/requests-page.ts +57 -0
  204. package/docs/examples/purchasing/src/routes.ts +53 -0
  205. package/docs/examples/purchasing/src/schedule.ts +31 -0
  206. package/docs/examples/purchasing/src/signup.ts +5 -0
  207. package/docs/examples/purchasing/src/supplier.ts +32 -0
  208. package/docs/examples/purchasing/wrangler.jsonc +69 -0
  209. package/docs/examples/recipes/README.md +60 -0
  210. package/docs/examples/recipes/manifests/recipes.yaml +75 -0
  211. package/docs/examples/recipes/smoke.mjs +102 -0
  212. package/docs/examples/recipes/src/media.ts +13 -0
  213. package/docs/examples/recipes/src/pages.ts +99 -0
  214. package/docs/examples/recipes/src/routes.ts +71 -0
  215. package/docs/examples/recipes/src/site-config.ts +12 -0
  216. package/docs/examples/recipes/wrangler.jsonc +74 -0
  217. package/docs/handbook/cloudflare/authentication.md +180 -322
  218. package/docs/handbook/cloudflare/chatgpt-sites.md +5 -23
  219. package/docs/handbook/cloudflare/deploy-and-operate.md +55 -77
  220. package/docs/handbook/cloudflare/media-r2.md +61 -205
  221. package/docs/handbook/cloudflare/service-entry.md +239 -0
  222. package/docs/handbook/concepts/authorization.md +10 -107
  223. package/docs/handbook/concepts/four-atoms.md +9 -168
  224. package/docs/handbook/concepts/lifecycle-and-locales.md +9 -132
  225. package/docs/handbook/concepts/mcp-and-agents.md +24 -121
  226. package/docs/handbook/concepts/procedures-and-triggers.md +5 -217
  227. package/docs/handbook/concepts/runtime-and-adapters.md +15 -169
  228. package/docs/handbook/concepts/views.md +10 -185
  229. package/docs/handbook/examples/hub.md +3 -8
  230. package/docs/handbook/guides/adapter-guide.md +11 -0
  231. package/docs/handbook/guides/admin-ui.md +115 -133
  232. package/docs/handbook/guides/agent-setup.md +64 -74
  233. package/docs/handbook/guides/agent-workflow-acceptance.md +232 -0
  234. package/docs/handbook/guides/email.md +86 -0
  235. package/docs/handbook/guides/local-testing.md +40 -0
  236. package/docs/handbook/guides/mcp-apps.md +560 -0
  237. package/docs/handbook/guides/native-admin.md +566 -0
  238. package/docs/handbook/guides/native-execution.md +133 -0
  239. package/docs/handbook/guides/oauth.md +219 -0
  240. package/docs/handbook/guides/postgres-adapters.md +56 -0
  241. package/docs/handbook/guides/public-pages.md +87 -0
  242. package/docs/handbook/guides/size-and-startup.md +9 -0
  243. package/docs/handbook/guides/sql-patterns.md +266 -0
  244. package/docs/handbook/guides/typed-queries.md +211 -107
  245. package/docs/handbook/navigation.json +176 -55
  246. package/docs/handbook/reference/admin-descriptors.md +53 -0
  247. package/docs/handbook/reference/authorization.md +39 -266
  248. package/docs/handbook/reference/describe.md +56 -0
  249. package/docs/handbook/reference/diagnostics.md +19 -186
  250. package/docs/handbook/reference/features.md +45 -55
  251. package/docs/handbook/reference/manifest.md +6 -129
  252. package/docs/handbook/reference/procedure.md +11 -303
  253. package/docs/handbook/reference/schema.md +64 -240
  254. package/docs/handbook/reference/site-config.md +5 -218
  255. package/docs/handbook/reference/sql.md +64 -0
  256. package/docs/handbook/reference/surface.md +392 -201
  257. package/docs/handbook/reference/trigger.md +56 -192
  258. package/docs/handbook/reference/view.md +24 -243
  259. package/docs/handbook/releases/index.md +244 -77
  260. package/docs/handbook/start/agents.md +45 -0
  261. package/docs/handbook/start/overview.md +9 -48
  262. package/docs/handbook/start/project-and-cli.md +51 -104
  263. package/docs/handbook/start/quickstart-worker.md +43 -178
  264. package/docs/skills/develop/SKILL.md +79 -249
  265. package/docs/skills/integrate/SKILL.md +39 -50
  266. package/docs/skills/media-gc/SKILL.md +34 -10
  267. package/docs/skills/provision/SKILL.md +36 -186
  268. package/docs/skills/update/SKILL.md +23 -38
  269. package/docs/source/scripts/postgres-adapter.ts +101 -0
  270. package/docs/upgrade-0.1-to-0.2.md +227 -0
  271. package/package.json +120 -131
  272. package/skills/README.md +48 -108
  273. package/skills/mantle/SKILL.md +76 -0
  274. package/dist/admin-ui.d.ts +0 -2
  275. package/dist/admin-ui.d.ts.map +0 -1
  276. package/dist/admin-ui.js +0 -2
  277. package/dist/admin-ui.js.map +0 -1
  278. package/dist/admin.d.ts +0 -2
  279. package/dist/admin.d.ts.map +0 -1
  280. package/dist/admin.js +0 -2
  281. package/dist/admin.js.map +0 -1
  282. package/dist/auth.d.ts +0 -2
  283. package/dist/auth.d.ts.map +0 -1
  284. package/dist/auth.js +0 -2
  285. package/dist/auth.js.map +0 -1
  286. package/dist/bun.d.ts +0 -2
  287. package/dist/bun.d.ts.map +0 -1
  288. package/dist/bun.js +0 -2
  289. package/dist/bun.js.map +0 -1
  290. package/dist/cli/generate-cloudflare.d.ts +0 -7
  291. package/dist/cli/generate-cloudflare.d.ts.map +0 -1
  292. package/dist/cli/generate-cloudflare.js +0 -123
  293. package/dist/cli/generate-cloudflare.js.map +0 -1
  294. package/dist/cli/generate-project.d.ts +0 -25
  295. package/dist/cli/generate-project.d.ts.map +0 -1
  296. package/dist/cli/generate-project.js +0 -282
  297. package/dist/cli/generate-project.js.map +0 -1
  298. package/dist/cli/generate-sites.d.ts +0 -8
  299. package/dist/cli/generate-sites.d.ts.map +0 -1
  300. package/dist/cli/generate-sites.js +0 -273
  301. package/dist/cli/generate-sites.js.map +0 -1
  302. package/dist/cli/generate.d.ts +0 -20
  303. package/dist/cli/generate.d.ts.map +0 -1
  304. package/dist/cli/generate.js +0 -299
  305. package/dist/cli/generate.js.map +0 -1
  306. package/dist/cli/harness.d.ts +0 -3
  307. package/dist/cli/harness.d.ts.map +0 -1
  308. package/dist/cli/harness.js +0 -214
  309. package/dist/cli/harness.js.map +0 -1
  310. package/dist/cli/main.d.ts +0 -3
  311. package/dist/cli/main.d.ts.map +0 -1
  312. package/dist/cli/main.js +0 -77
  313. package/dist/cli/main.js.map +0 -1
  314. package/dist/cli/skills.d.ts +0 -3
  315. package/dist/cli/skills.d.ts.map +0 -1
  316. package/dist/cli/skills.js +0 -128
  317. package/dist/cli/skills.js.map +0 -1
  318. package/dist/cloudflare.d.ts +0 -2
  319. package/dist/cloudflare.d.ts.map +0 -1
  320. package/dist/cloudflare.js +0 -2
  321. package/dist/cloudflare.js.map +0 -1
  322. package/dist/codegen/emitMantleModule.d.ts +0 -22
  323. package/dist/codegen/emitMantleModule.d.ts.map +0 -1
  324. package/dist/codegen/emitMantleModule.js +0 -291
  325. package/dist/codegen/emitMantleModule.js.map +0 -1
  326. package/dist/codegen.d.ts +0 -2
  327. package/dist/codegen.d.ts.map +0 -1
  328. package/dist/codegen.js +0 -2
  329. package/dist/codegen.js.map +0 -1
  330. package/dist/runtime-testing.d.ts +0 -2
  331. package/dist/runtime-testing.d.ts.map +0 -1
  332. package/dist/runtime-testing.js +0 -2
  333. package/dist/runtime-testing.js.map +0 -1
  334. package/dist/runtime.d.ts +0 -2
  335. package/dist/runtime.d.ts.map +0 -1
  336. package/dist/runtime.js +0 -2
  337. package/dist/runtime.js.map +0 -1
  338. package/dist/spec.d.ts +0 -2
  339. package/dist/spec.d.ts.map +0 -1
  340. package/dist/spec.js +0 -2
  341. package/dist/spec.js.map +0 -1
  342. package/dist/vercel-libsql.d.ts +0 -2
  343. package/dist/vercel-libsql.d.ts.map +0 -1
  344. package/dist/vercel-libsql.js +0 -2
  345. package/dist/vercel-libsql.js.map +0 -1
  346. package/dist/vercel.d.ts +0 -2
  347. package/dist/vercel.d.ts.map +0 -1
  348. package/dist/vercel.js +0 -2
  349. package/dist/vercel.js.map +0 -1
  350. package/dist/web.d.ts +0 -2
  351. package/dist/web.d.ts.map +0 -1
  352. package/dist/web.js +0 -2
  353. package/dist/web.js.map +0 -1
  354. package/docs/adapter-guide.md +0 -222
  355. package/docs/adr/0001-four-atom-manifest-model.md +0 -440
  356. package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
  357. package/docs/adr/0007-ai-as-primary-author.md +0 -473
  358. package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
  359. package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
  360. package/docs/adr/0010-locale-and-translates.md +0 -453
  361. package/docs/adr/0011-adapter-port-spec.md +0 -281
  362. package/docs/adr/0012-views-as-public-rest.md +0 -161
  363. package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
  364. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -900
  365. package/docs/adr/0016-site-semantic-layer.md +0 -70
  366. package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
  367. package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
  368. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -240
  369. package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
  370. package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
  371. package/docs/adr/0022-caller-observed-version-occ.md +0 -212
  372. package/docs/adr/0023-port-failure-contract.md +0 -69
  373. package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
  374. package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
  375. package/docs/adr/0026-progressive-generate.md +0 -36
  376. package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
  377. package/docs/adr/0028-schema-ttl-expiry.md +0 -33
  378. package/docs/adr/README.md +0 -81
  379. package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
  380. package/docs/adr/adr-lite-808-route-readiness.md +0 -47
  381. package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
  382. package/docs/adr/adr-lite-812-native-parity.md +0 -150
  383. package/docs/adr/adr-lite-823-home-statistics.md +0 -64
  384. package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
  385. package/docs/adr/adr-lite-845-frontend-client.md +0 -38
  386. package/docs/adr/adr-lite-861-admin-webmcp.md +0 -42
  387. package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
  388. package/docs/agent-prompts.md +0 -64
  389. package/docs/api-mcp-authorization.md +0 -5
  390. package/docs/assets/mantle-admin-developer.png +0 -0
  391. package/docs/assets/mantle-admin-operations.png +0 -0
  392. package/docs/assets/mantle-hero.jpg +0 -0
  393. package/docs/auth-hosting-model.md +0 -166
  394. package/docs/cloudflare-low-level-composition.md +0 -5
  395. package/docs/consumer-onboarding-audit.md +0 -65
  396. package/docs/deferred-lifecycle-queues.md +0 -5
  397. package/docs/design-atoms.md +0 -16
  398. package/docs/design-references/editorial-blog-2026-05-05.md +0 -218
  399. package/docs/direct-authoring.md +0 -5
  400. package/docs/examples/builtin-commerce.md +0 -269
  401. package/docs/examples/builtin-intake.md +0 -143
  402. package/docs/examples/builtin-legal-documents.md +0 -189
  403. package/docs/examples/builtin-procurement.md +0 -241
  404. package/docs/examples/builtin-publication.md +0 -241
  405. package/docs/examples/builtin-reservation.md +0 -149
  406. package/docs/examples/cf-primitives-commerce-inventory.md +0 -809
  407. package/docs/examples/cf-primitives-guarded-api.md +0 -429
  408. package/docs/examples/cf-primitives-intake-hooks.md +0 -319
  409. package/docs/examples/host-chatgpt-sites/.openai/hosting.json +0 -1
  410. package/docs/examples/host-chatgpt-sites/README.md +0 -70
  411. package/docs/examples/host-chatgpt-sites/drizzle/0000_sites_users.sql +0 -8
  412. package/docs/examples/host-chatgpt-sites/drizzle/0001_mantle.sql +0 -294
  413. package/docs/examples/host-chatgpt-sites/drizzle/0002_article_cover.sql +0 -5
  414. package/docs/examples/host-chatgpt-sites/drizzle/0003_store_instance_id.sql +0 -1
  415. package/docs/examples/host-chatgpt-sites/drizzle/0004_mantle.sql +0 -10
  416. package/docs/examples/host-chatgpt-sites/drizzle/0005_mantle.sql +0 -24
  417. package/docs/examples/host-chatgpt-sites/drizzle/meta/_journal.json +0 -1
  418. package/docs/examples/host-chatgpt-sites/drizzle/meta/mantle-state.json +0 -60
  419. package/docs/examples/host-chatgpt-sites/manifests/site.yaml +0 -27
  420. package/docs/examples/host-chatgpt-sites/package.json +0 -1
  421. package/docs/examples/host-chatgpt-sites/public/site.css +0 -1
  422. package/docs/examples/host-chatgpt-sites/scripts/build.mjs +0 -13
  423. package/docs/examples/host-chatgpt-sites/scripts/check.mjs +0 -101
  424. package/docs/examples/host-chatgpt-sites/scripts/migration.mjs +0 -43
  425. package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -66
  426. package/docs/examples/host-chatgpt-sites/src/index.ts +0 -46
  427. package/docs/examples/host-chatgpt-sites/src/mcp.ts +0 -49
  428. package/docs/examples/host-chatgpt-sites/src/media.ts +0 -109
  429. package/docs/examples/host-chatgpt-sites/src/r2-lab.ts +0 -38
  430. package/docs/examples/host-chatgpt-sites/src/storage-fingerprint.json +0 -1
  431. package/docs/examples/host-chatgpt-sites/src/web.ts +0 -35
  432. package/docs/examples/host-chatgpt-sites/tsconfig.json +0 -1
  433. package/docs/examples/host-chatgpt-sites/wrangler.jsonc +0 -10
  434. package/docs/examples/host-local-admin-otp/.dev.vars.example +0 -3
  435. package/docs/examples/host-local-admin-otp/README.md +0 -80
  436. package/docs/examples/host-local-admin-otp/ensure-dev-vars.mjs +0 -5
  437. package/docs/examples/host-local-admin-otp/manifests/site.yaml +0 -25
  438. package/docs/examples/host-local-admin-otp/package.json +0 -29
  439. package/docs/examples/host-local-admin-otp/public/.gitkeep +0 -1
  440. package/docs/examples/host-local-admin-otp/smoke.mjs +0 -141
  441. package/docs/examples/host-local-admin-otp/src/index.ts +0 -54
  442. package/docs/examples/host-local-admin-otp/tsconfig.json +0 -17
  443. package/docs/examples/host-local-admin-otp/wrangler.jsonc +0 -23
  444. package/docs/examples/host-minimal-worker/README.md +0 -41
  445. package/docs/examples/host-minimal-worker/manifests/site.yaml +0 -25
  446. package/docs/examples/host-minimal-worker/package.json +0 -26
  447. package/docs/examples/host-minimal-worker/smoke.mjs +0 -23
  448. package/docs/examples/host-minimal-worker/src/index.ts +0 -4
  449. package/docs/examples/host-minimal-worker/tsconfig.json +0 -17
  450. package/docs/examples/host-minimal-worker/wrangler.jsonc +0 -22
  451. package/docs/handbook/chatgpt-sites/equipment-checkout.md +0 -231
  452. package/docs/handbook/chatgpt-sites/generated-app.md +0 -84
  453. package/docs/handbook/chatgpt-sites/host-reference.md +0 -113
  454. package/docs/handbook/chatgpt-sites/index.md +0 -133
  455. package/docs/handbook/cloudflare/bindings.md +0 -291
  456. package/docs/handbook/cloudflare/conventional-worker.md +0 -166
  457. package/docs/handbook/cloudflare/deferred-hooks-queues.md +0 -170
  458. package/docs/handbook/cloudflare/low-level-composition.md +0 -169
  459. package/docs/handbook/cloudflare/public-web.md +0 -144
  460. package/docs/handbook/cloudflare/site-chrome.md +0 -75
  461. package/docs/handbook/examples/commerce-transaction.md +0 -11
  462. package/docs/handbook/examples/commerce.md +0 -11
  463. package/docs/handbook/examples/guarded-api.md +0 -10
  464. package/docs/handbook/examples/intake-form.md +0 -12
  465. package/docs/handbook/examples/intake-hooks.md +0 -11
  466. package/docs/handbook/examples/legal-documents.md +0 -10
  467. package/docs/handbook/examples/procurement-approvals.md +0 -10
  468. package/docs/handbook/examples/publication.md +0 -10
  469. package/docs/handbook/examples/reservation.md +0 -10
  470. package/docs/handbook/start/quickstart-admin.md +0 -52
  471. package/docs/labels.md +0 -71
  472. package/docs/media-uploads.md +0 -5
  473. package/docs/migration-0.1.2.md +0 -13
  474. package/docs/performance-harness.md +0 -228
  475. package/docs/release-process.md +0 -244
  476. package/docs/schema-indexes.md +0 -5
  477. package/docs/sealed-pipeline-ownership.md +0 -101
  478. package/docs/skills/plugin/SKILL.md +0 -132
  479. package/docs/skills/theme/SKILL.md +0 -77
  480. package/docs/spec-only-host-adoption.md +0 -157
  481. package/docs/transaction-patterns.md +0 -5
  482. package/skills/develop/SKILL.md +0 -258
  483. package/skills/install/SKILL.md +0 -112
  484. package/skills/integrate/SKILL.md +0 -60
  485. package/skills/media-gc/SKILL.md +0 -85
  486. package/skills/plugin/SKILL.md +0 -132
  487. package/skills/provision/SKILL.md +0 -194
  488. package/skills/theme/SKILL.md +0 -77
  489. package/skills/update/SKILL.md +0 -51
  490. package/templates/chatgpt-sites/auth.ts +0 -66
  491. package/templates/chatgpt-sites/build.mjs +0 -14
  492. package/templates/chatgpt-sites/env.ts +0 -1
  493. package/templates/chatgpt-sites/mcp.ts +0 -48
  494. package/templates/chatgpt-sites/public-mcp.ts +0 -29
  495. package/templates/chatgpt-sites/smoke-local.mjs +0 -20
@@ -1,338 +0,0 @@
1
- # ADR-0008: Structured diagnostic shape for AI-parseable errors
2
-
3
- **Status:** Carried over from POC v0.0.x; amended for the shipped v0.1
4
- diagnostic emitters and measured harnesses.
5
-
6
- **Date:** 2026-04-30 (POC); last amended 2026-08-31.
7
-
8
- **Deciders**: phsu
9
-
10
- **Related**: [ADR-0007](0007-ai-as-primary-author.md) (the AI-as-primary-author contract this diagnostic format serves); the zod runtime is described in [`docs/design-atoms.md`](../design-atoms.md) § "Manifest validation — JSON Schema in, zod at runtime".
11
-
12
- ---
13
-
14
- ## Context
15
-
16
- ADR-0007 commits the SDK to three pre-serve feedback loops (static
17
- validation, local tests/measurements, and boot-time fail-fast) before the
18
- runtime layer. Authoring/runtime failures need one stable record shape; the
19
- measured index and HTTP harnesses use their own purpose-shaped JSON reports.
20
- If each failure emitter used an ad-hoc shape, the consumer agent reading those
21
- errors would need multiple parsers — defeating the
22
- "deterministic feedback" property that justified the contract in
23
- the first place.
24
-
25
- An earlier runtime error vocabulary (`INPUT_VALIDATION_FAILED`,
26
- `AUTH_DENIED`, `HANDLER_NOT_REGISTERED`, `DISPATCHER_NOT_BUILT`,
27
- `INTERNAL_ERROR`) was HTTP-shaped: a short code + a status + a
28
- free-form message. That is under-specified for the new loops:
29
-
30
- - A static-validation error needs to point to **a file path and
31
- manifest pointer**, not an HTTP status.
32
- - A "you used an unknown Schema name" error needs to carry the
33
- **list of known Schemas** and a **best-guess suggestion**, so
34
- the AI author can fix without doing its own grep.
35
- - A boot error needs to declare **what was checked and what was
36
- missing**, so the deploy log is self-explanatory.
37
- - Validation, boot, runtime, and consumer-authored test diagnostics should
38
- agree on **severity** (error vs warning) so integrations do not need
39
- per-phase logic.
40
-
41
- A free-form message field carries all of this in prose, but
42
- forces the AI author to do natural-language parsing on every
43
- diagnostic before it can route a fix. Structure is cheaper.
44
-
45
- ## Decision
46
-
47
- Core validation, boot, and runtime emit diagnostics in the following shape.
48
- The public `test` phase is reserved for consumer test diagnostics; the shipped
49
- `mantle-harness` commands emit `IndexCoverageReport` and `HttpBenchmarkReport`
50
- instead. The canonical type, diagnostic-code constants, and shipped phase
51
- helpers live in `@aotter/mantle-spec`; every other package imports from there.
52
-
53
- ```ts
54
- type Phase = "validate" | "test" | "boot" | "runtime";
55
-
56
- interface Diagnostic {
57
- /** Stable machine code. UPPER_SNAKE, no prefix. */
58
- code: string;
59
- /** Which feedback loop emitted this diagnostic. */
60
- phase: Phase;
61
- /** "error" blocks the loop's exit-zero / serve-loop / etc.
62
- * "warning" surfaces but does not block. */
63
- severity: "error" | "warning";
64
- /** Filesystem path or manifest pointer (JSON Pointer style)
65
- * identifying where the issue is. */
66
- path: string;
67
- /** What the validator/dispatcher saw. */
68
- value?: unknown;
69
- /** One-line description of what was expected. */
70
- expected?: string;
71
- /** Valid alternatives, when the expected set is enumerable. */
72
- candidates?: string[];
73
- /** Best-guess fix string, when one is high-confidence. */
74
- suggestion?: string;
75
- /** Human-readable fallback prose. AI authors should prefer
76
- * the structured fields; humans reading TTY output read this. */
77
- message: string;
78
- }
79
- ```
80
-
81
- ### Code naming convention
82
-
83
- Codes are **UPPER_SNAKE, unprefixed**. The `phase` field
84
- disambiguates which feedback loop emitted the diagnostic.
85
-
86
- When the same root cause surfaces in multiple loops, the same
87
- `code` is reused with a different `phase`. AI consumers can
88
- group by `code` (root-cause grouping across loops) or filter
89
- by `phase` (this-loop-only handling). Concrete examples:
90
-
91
- | code | phases | example contexts |
92
- |---|---|---|
93
- | `HANDLER_NOT_REGISTERED` | `validate`, `boot`, `runtime` | textual grep miss (warning, validate); registry lookup miss (error, boot); dispatch attempt miss (error, runtime, defense-in-depth) |
94
- | `TRIGGER_TARGET_PROCEDURE_UNKNOWN` | `validate`, `boot` | dangling reference caught by either loop |
95
- | `TRIGGER_PATH_COLLISION` | `validate`, `boot` | two http Triggers on same method+path |
96
- | `NOT_FOUND` | `runtime` (`test` reserved) | unknown name in queryView / GET /api/views/X |
97
- | `INPUT_VALIDATION_FAILED` | `runtime` (`test` reserved) | zod validation failure at the serving boundary |
98
-
99
- Codes that are phase-exclusive simply never appear with another phase.
100
- `INVALID_MANIFEST_ENVELOPE` is validate-only. The catalog reserves
101
- `FIXTURE_SCHEMA_VIOLATION` for consumer-authored `phase: "test"` diagnostics;
102
- Core does not currently emit it.
103
-
104
- ### Why no prefixes
105
-
106
- Earlier drafts of this ADR proposed per-loop prefixes on the
107
- code string. That was retired because:
108
-
109
- - **It bakes provenance into the symbol** when a structured
110
- field already carries it cleaner. `phase` is the right place;
111
- prefix in the code string is redundant.
112
- - **It forces three different codes for the same root cause**
113
- (one per loop), fragmenting consumer error handling. A
114
- consumer that wants "treat any 'handler not registered' issue
115
- uniformly" had to parse the prefix off the symbol — defeating
116
- the parseability argument that justified structure in the
117
- first place.
118
- - **It's not a standard convention** — closest cousins are
119
- PHP's `E_*` legacy constants and PostgreSQL SQLSTATE class
120
- prefixes; both are artefacts of language eras when structured
121
- records weren't ergonomic. Modern systems (gRPC, OAuth 2.0
122
- RFC 6749, Stripe API, AWS) use plain UPPER_SNAKE or
123
- lower_snake without prefixes and identify source through
124
- separate fields.
125
-
126
- ### `path` format
127
-
128
- - For static validation: filesystem path + JSON Pointer fragment,
129
- e.g. `manifests/site.yaml#/3/spec/from`.
130
- - For a consumer test diagnostic: test file path + assertion location when
131
- available, e.g. `tests/handlers/contact.test.ts:42`.
132
- - For boot-time: manifest pointer (no on-disk path because boot
133
- reads parsed manifests, not files), e.g.
134
- `manifest:View/recent-published#/spec/from`.
135
- - For runtime: HTTP request path + JSON Pointer into request
136
- body, e.g. `POST /api/contact#/body/email`.
137
-
138
- The convention is "the most specific locator the loop has access
139
- to." All four are strings; AI parsers can dispatch on prefix
140
- (`/`, `manifest:`, HTTP method, test runner format).
141
-
142
- ### `candidates` — when to populate
143
-
144
- Populate when the expected set is **finite and known at
145
- diagnostic time**:
146
- - `VIEW_FROM_UNKNOWN_SCHEMA` → list all declared Schemas
147
- - `BIND_VALUE_NOT_IN_ENUM` → list `["ctx.user", "ctx.staff", "now"]`
148
- - `HANDLER_NOT_REGISTERED` (`phase: boot`) → list registered ref names
149
- - `AUTH_DENIED` (`phase: runtime`) → **do not populate**
150
- (security: don't tell the caller which roles would have worked)
151
-
152
- Omit when the expected set is open (e.g. "any non-empty string"
153
- for `metadata.name`).
154
-
155
- ### `suggestion` — when to populate
156
-
157
- Populate when one candidate is high-confidence (e.g. typo via
158
- edit-distance ≤ 2 on a short identifier). Otherwise omit.
159
- Suggestions are advisory; the AI author should still verify
160
- before applying.
161
-
162
- ### CLI output mode
163
-
164
- - `--format=json` (default when stdout is **not** a TTY, e.g. CI,
165
- AI-author): emits `{ phase, diagnostics, errorCount, warningCount }` on
166
- stdout; exit code 1 if any diagnostic has `severity: "error"`, else 0.
167
- - `--format=text` (default when stdout **is** a TTY, i.e. human
168
- at terminal): prints severity, code, path, structured details, prose message,
169
- and suggestion when present.
170
-
171
- The same diagnostic objects power both modes; text mode is a
172
- formatter, not a separate code path. AI authors invoking the CLI
173
- get JSON automatically because they pipe through subprocess; no
174
- flag needed.
175
-
176
- ### Consumer test diagnostic surface
177
-
178
- Runtime use cases return result objects carrying runtime-phase diagnostics, so
179
- consumer tests can assert stable `diagnostic.code` values without matching
180
- exception prose. A consumer that emits its own fixture/setup diagnostic may use
181
- `makeDiagnostic({ phase: "test", ... })`. Core currently exports no
182
- `testDiagnostic` helper and its measured planner/HTTP harnesses return their
183
- purpose-shaped reports instead of `Diagnostic` objects.
184
-
185
- ### Runtime diagnostic surface
186
-
187
- Runtime HTTP responses on error paths wrap the same redacted object as
188
- `{ ok: false, diagnostic }`, plus the HTTP status from the shared error-code
189
- table. The `path` carries the most specific request/use-case locator available.
190
- The `candidates` field is **always omitted** at wire egress to avoid leaking
191
- schema information to untrusted callers.
192
-
193
- ```http
194
- HTTP/1.1 400 Bad Request
195
- Content-Type: application/json
196
-
197
- {
198
- "ok": false,
199
- "diagnostic": {
200
- "code": "INPUT_VALIDATION_FAILED",
201
- "phase": "runtime",
202
- "severity": "error",
203
- "path": "POST /api/contact#/body/email",
204
- "message": "Field 'email' must be a valid email address."
205
- }
206
- }
207
- ```
208
-
209
- ### Validator translation (zod, not Ajv)
210
-
211
- The POC originally translated Ajv `ErrorObject[]` into
212
- `Diagnostic[]` for `INPUT_VALIDATION_FAILED`. Late in the POC
213
- (PR #81) the runtime validator was swapped to **zod** so the
214
- admin SPA and CF Workers could share a CSP-safe path with no
215
- `Function`-constructor codegen. The v0.1.0 rebuild inherits zod
216
- from day 1 — manifest authoring stays JSON Schema, but the
217
- runtime validator a manifest author's request body hits is a
218
- zod schema, produced by Zod's official `z.fromJSONSchema` importer behind the
219
- compatibility boundary in
220
- `@aotter/mantle-spec` (see [`docs/design-atoms.md`](../design-atoms.md) § "Manifest validation — JSON Schema in, zod at runtime").
221
- Mantle validates its supported keyword/ref policy before import and emits
222
- `JSON_SCHEMA_UNSUPPORTED`, `JSON_SCHEMA_REF_INVALID`, or
223
- `JSON_SCHEMA_LIMIT_EXCEEDED`; Zod owns the accepted keywords' validation
224
- semantics.
225
-
226
- Concretely, runtime entry validation consumes `ZodError.issues`:
227
-
228
- - `issue.path: PropertyKey[]` becomes an RFC 6901 JSON Pointer (`~` and `/`
229
- escaped, numeric segments preserved);
230
- - every issue stays in the stable `INPUT_VALIDATION_FAILED` family rather than
231
- exposing zod's internal issue-code vocabulary;
232
- - `issue.message` supplies fallback human prose. Call sites with known
233
- trust-boundary context may additionally populate `value`, `expected`, or a
234
- more specific message before wire redaction.
235
-
236
- The same rule that retired Ajv's per-validator error format as a
237
- Diagnostic candidate (alternative (d) below) applies to zod —
238
- `ZodError` is internal plumbing, `Diagnostic` is the public surface.
239
-
240
- ## Consequences
241
-
242
- ### Pros
243
-
244
- - One parser handles diagnostics from any phase. AI consumer code branches on
245
- the exact `code` and optionally `phase`, without per-emitter adapters.
246
- - `candidates` + `suggestion` make the most common author errors
247
- (typo, unknown name, wrong enum value) one-step fixes — the AI
248
- author reads the diagnostic and writes the corrected manifest
249
- in the same turn, no grep or human prompting needed.
250
- - `severity: warning` gives the validator a way to surface "this
251
- is fishy but legal" without blocking — preserves the
252
- permissive-validator discipline (see ADR-0007 risks).
253
- - Same shape for HTTP responses keeps the runtime layer
254
- consistent with the contract layers; consumers' app frontends
255
- and AI authors see the same structure.
256
- - Single source of truth. The interface, code constants, and
257
- formatter all live in `@aotter/mantle-spec`; the runtime
258
- package and adapters import them. A future adapter
259
- inherits the shape for free.
260
-
261
- ### Costs
262
-
263
- - Shape locked early: any field-shape change forces a doc revise and code
264
- change across CLI, runtime, adapters, and consumer parsers.
265
- - Implementing `candidates` and `suggestion` correctly requires
266
- the validator/dispatcher to track richer context (the set of
267
- declared Schema names, the registered ref list, etc.). More
268
- bookkeeping, more code.
269
- - Stable codes are a public surface. Renaming `VIEW_FROM_UNKNOWN_SCHEMA`
270
- to a "better" name later is a breaking change for any
271
- consumer-side error handling.
272
-
273
- ### Risks
274
-
275
- - **Codes proliferate**. Without discipline, every assertion
276
- becomes its own code (`NAME_TOO_LONG`, `NAME_TOO_SHORT`,
277
- `NAME_HAS_UPPERCASE`...). Mitigation: codes are scoped by
278
- failure mode, not by individual assertion. `INVALID_NAME`
279
- with `expected: "kebab-case, 1-64 chars"` covers the family;
280
- the `value` and `expected` fields carry the specifics.
281
- - **`message` and structured fields drift**. Mitigation: `makeDiagnostic`
282
- derives a default message from the structured fields. Explicit contextual
283
- messages are allowed, but reviewers treat `code`, `phase`, `path`, `value`,
284
- and `expected` as authoritative and reject contradictions.
285
- - **`candidates` leaks information at runtime**. Already
286
- addressed: runtime responses omit `candidates`. Code review
287
- should treat any runtime path that populates `candidates` as a
288
- bug.
289
-
290
- ## Alternatives considered
291
-
292
- **(a) Free-form prose messages only**. Rejected: AI parsing
293
- burden, and "did you mean?" suggestions become inline text the
294
- AI must extract.
295
-
296
- **(b) Just exit code + count of errors**. Rejected: gives the AI
297
- no fixable information; turns every failure into a re-run-with-
298
- verbose-flag escalation.
299
-
300
- **(c) Reuse OpenAPI Problem+JSON (RFC 7807)**. Rejected: too
301
- HTTP-flavored (the `type` URI, the `instance` URI), doesn't
302
- carry path/candidates/suggestion structure cleanly. Adopting
303
- Problem+JSON for the runtime layer specifically might be
304
- considered later as an opt-in alternate output mode for
305
- HTTP-strict consumers.
306
-
307
- **(d) Surface validator-library error formats directly (Ajv
308
- `ErrorObject`, zod `ZodError`)**. Rejected: those formats are
309
- internal to the validator implementation, change between
310
- library versions, and don't fit non-validation errors (handler
311
- not registered, schema drift, etc.). The library's error
312
- objects feed *into* the Diagnostic translator described under
313
- "Validator translation"; they are never the public surface.
314
-
315
- ## How to apply
316
-
317
- - New error codes: choose a suffix that names the failure
318
- family, not the specific assertion. UPPER_SNAKE, no prefix.
319
- Add the constant to `@aotter/mantle-spec`'s diagnostic
320
- code module; do not redeclare per-package.
321
- - When the same root cause can be caught by multiple loops,
322
- reuse the code; let `phase` distinguish.
323
- - Implementation: use `makeDiagnostic` or the shipped phase helpers
324
- `validateDiagnostic`, `bootDiagnostic`, and `runtimeDiagnostic`, all exported
325
- from `@aotter/mantle-spec`. Consumer test diagnostics call `makeDiagnostic`
326
- with `phase: "test"` directly.
327
- - Documentation: keep phase/applicability prose in this ADR and the
328
- version-matched design/runtime references synchronized with the exported
329
- catalog.
330
-
331
- ## Implementation status
332
-
333
- Implemented. Canonical declarations live in
334
- `packages/mantle-spec/src/kernel/diagnostic.ts`; runtime, Cloudflare adapter,
335
- admin UI, and CLI import the public spec exports. `redactForWire` removes
336
- `candidates` before REST/MCP egress. The `test` phase and
337
- `FIXTURE_SCHEMA_VIOLATION` remain reserved compatibility surface; Core ships no
338
- test-phase helper or emitter today.
@@ -1,149 +0,0 @@
1
- # ADR-0009: Consumer-supplied manifests at SDK boot
2
-
3
- **Status:** Superseded by ADR-0019.
4
-
5
- **Date:** 2026-05-01 (POC); superseded 2026-08-16
6
-
7
- **Related:** [ADR-0001](0001-four-atom-manifest-model.md),
8
- [ADR-0007](0007-ai-as-primary-author.md),
9
- [ADR-0018](0018-core-starters-repository-boundary.md),
10
- [ADR-0019](0019-sealed-manifest-runtime-pipeline.md)
11
-
12
- > **Supersession note:** consumer ownership remains durable, but the exact
13
- > `site.yaml`, generated `site.ts`, and parser-free array workflow below is
14
- > historical. The sealed source → parse → link → compile pipeline in ADR-0019
15
- > is current; source names and generated code are optional caller concerns.
16
-
17
- ## Context
18
-
19
- The four-atom model promises that domain shape is authored in the consumer's
20
- project. Core therefore cannot ship a fixed manifest set: doing so would force
21
- every new Schema, View, Procedure, or Trigger through an SDK fork/release.
22
-
23
- The first v0.1 implementation imported YAML as Wrangler Text modules and parsed
24
- it during Worker startup. That kept ownership correct but leaked authoring-only
25
- YAML machinery into the runtime bundle and coupled consumers to Wrangler
26
- `[[rules]]`. The public CLI now provides one build-time compilation boundary.
27
-
28
- ## Decision
29
-
30
- Consumers own exactly `manifests/site.yaml`. The installed `mantle` CLI parses
31
- and validates its multi-document YAML, then writes the machine-owned runtime
32
- module and handler types. A missing or differently named file fails before
33
- generation:
34
-
35
- ```bash
36
- pnpm exec mantle generate
37
- pnpm exec mantle generate --check
38
- ```
39
-
40
- The outputs are:
41
-
42
- - `.mantle/generated/site.ts` — a parser-free `readonly Manifest[]` export;
43
- - `.mantle/generated/types.d.ts` — handler declarations derived from the same
44
- validated manifest set.
45
-
46
- The Worker imports the generated array rather than YAML text:
47
-
48
- ```ts
49
- import { createMantleWorker } from "@aotter/mantle/cloudflare";
50
- import { manifest } from "../.mantle/generated/site.js";
51
-
52
- export default createMantleWorker({ manifest });
53
- ```
54
-
55
- Low-level composition passes the same array as `CmsConfig.manifests`. Core and
56
- adapters ship zero application manifests. The registry, boot validator, View
57
- executor, HTTP/MCP mounts, and tool catalog are built only from the consumer's
58
- generated array.
59
-
60
- `mantle generate --check` must gate validation/deploy so authored YAML cannot
61
- drift from checked-in generated output. Generation never edits YAML, handlers,
62
- skills, package metadata, styles, or provider configuration.
63
-
64
- ### Adapter scope
65
-
66
- Compilation is adapter-independent and uses Node at author/build time. The
67
- Worker runtime receives plain typed objects, so Cloudflare needs no YAML Text
68
- module rule and a future adapter needs no equivalent bundler hook.
69
-
70
- ### Single authority
71
-
72
- YAML remains the authored source of truth. Generated TypeScript is a
73
- deterministic transport artifact and must not be hand-edited. Parser
74
- diagnostics point to the consumer manifest document/pointer before generation;
75
- runtime boot validation covers cross-manifest and registered-handler facts.
76
-
77
- ## Worked example
78
-
79
- The external [`aotter/mantle-starters`](https://github.com/aotter/mantle-starters)
80
- repository owns the blank project and typed overlays. Materialized projects
81
- carry their own `manifests/site.yaml`, generated module, handlers, and package scripts;
82
- they consume the exact packed Core artifact rather than a workspace link.
83
-
84
- ## Consequences
85
-
86
- ### Benefits
87
-
88
- - Consumers can compose all four atoms without forking or publishing Core.
89
- - One CLI parse/validation path drives runtime objects and handler types.
90
- - Worker bundles do not include the YAML parser or consumer YAML text imports.
91
- - Every REST/MCP catalog automatically reflects the generated consumer set.
92
- - Other adapters consume the same `readonly Manifest[]` with no filesystem or
93
- bundler-specific manifest loader.
94
-
95
- ### Costs
96
-
97
- - Projects keep deterministic generated files and must run `generate` after
98
- editing YAML.
99
- - CI/deploy must run `generate --check`; otherwise an old generated module can
100
- outlive its source YAML.
101
- - Merge conflicts in generated output are resolved by re-running the installed
102
- command, never by editing the artifact.
103
-
104
- ### Risks and controls
105
-
106
- - **Version skew:** always run the generator from the installed package and
107
- read its embedded docs. Do not generate a versioned project from `develop`.
108
- - **Hidden stale output:** keep `mantle generate --check` in the normal project
109
- validation gate.
110
- - **Runtime/parser divergence:** generated objects come from the same parser
111
- used by `validate`; focused packed-package tests compare the consumer output.
112
- - **Multi-tenancy pressure:** Core still sees one flat manifest set per Worker.
113
- Tenant isolation remains an application concern; this ADR adds no namespace.
114
-
115
- ## Alternatives considered
116
-
117
- **Runtime YAML Text imports.** Replaced. They require Wrangler-specific rules,
118
- ambient YAML modules, and ship authoring-only parse machinery in the Worker.
119
-
120
- **Runtime filesystem discovery.** Rejected. Workers have no runtime filesystem,
121
- and hidden discovery would make inputs and diagnostics less deterministic.
122
-
123
- **Application-specific manifest packages.** Rejected for the baseline. It adds
124
- publish/version overhead to files that belong in one consumer repo.
125
-
126
- **SDK-embedded manifests or override precedence.** Rejected. Core is
127
- content-agnostic, so there is no default manifest set and no merge policy.
128
-
129
- ## How to apply
130
-
131
- When a Core feature needs the manifest set, accept the parsed consumer-owned
132
- array; never hardcode starter collection names or read consumer files at
133
- runtime.
134
-
135
- When authoring or reviewing a generated project:
136
-
137
- 1. Edit only `manifests/site.yaml`; do not create feature-named manifest files.
138
- 2. Run the installed `pnpm exec mantle generate`.
139
- 3. Import `manifest` from `.mantle/generated/site.js` into the conventional
140
- Worker, or pass it as `CmsConfig.manifests` in low-level composition.
141
- 4. Run `pnpm exec mantle generate --check` in validation and before deploy.
142
- 5. Reject Wrangler YAML Text rules, runtime `parseManifests*` calls, or a second
143
- manifest loader in a new generated project.
144
-
145
- ## Implementation status
146
-
147
- Implemented by the umbrella `mantle generate` command and the conventional
148
- Cloudflare Worker facade. Exact commands and output paths are documented in the
149
- version-matched `@aotter/mantle` README and embedded Core skills.