@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,258 +1,88 @@
1
1
  ---
2
2
  name: develop
3
- description: Work on any Mantle project using the Core SDK contract. Use for manifest, runtime, content model, handler, adapter, validation, and MCP work after a project already exists.
3
+ description: Work on an existing Mantle 0.2 project — manifests, SQL Views and Procedures, ref handlers, the service entry, surfaces, identity, MCP tool design and independent acceptance — using the installed package's contract.
4
4
  metadata:
5
5
  source: "@aotter/mantle"
6
6
  sourcePath: docs/skills/develop/SKILL.md
7
- applies_to: mantle grammar v0.1
8
- projection: project
7
+ applies_to: mantle 0.2
8
+ projection: package
9
9
  ---
10
10
 
11
11
  # Mantle Develop
12
12
 
13
- This is the Core workflow skill for an existing Mantle project. Repo-local
14
- copies are byte-for-byte projections from the installed package; its embedded
15
- docs govern runtime/API behavior.
16
-
17
- ## First Read
18
-
19
- 1. `package.json` for the installed `@aotter/mantle*` versions.
20
- 2. The manifest directory selected by the project scripts, the actual host
21
- entry and adapter config (for example `wrangler.jsonc` on Cloudflare).
22
- Read custom Auth construction there when present.
23
- 3. Optional local context: `.mantle/plugins.json`, `.mantle/plugins.lock.json`,
24
- and `.mantle/recipes/`. Legacy launch/handoff files are context only.
25
- 4. Installed Core docs in `node_modules/@aotter/mantle/docs/`.
26
-
27
- If `node_modules/` is missing, run `pnpm install --frozen-lockfile` before
28
- falling back to remote docs. Remote docs must use a tag matching the installed
29
- version; never use `develop` branch docs for a versioned consumer project.
30
-
31
- ## Existing Examples
32
-
33
- Read installed `docs/handbook/start/project-and-cli.md` and
34
- `docs/examples/README.md`. Use `docs/examples/host-minimal-worker/` for Spec +
35
- adapter without Admin. Read `docs/examples/host-local-admin-otp/` only when the
36
- project already has Admin or the human asked for Dev UI — that path is opt-in.
37
- Ingest only `docs/examples/builtin-*.md` Manifests as grammar for new domains.
38
- Read `docs/examples/cf-primitives-*.md` before inventing Durable Object, Queue,
39
- cron, or `ref` handler patterns.
40
- References are test/documentation, not a Starter or a fixed application shape.
41
-
42
- Public rendering is opt-in consumer wiring: `mountPublicRoutes`, a
43
- `TemplateRegistry`, and a matching `publicPathResolver` must agree on the
44
- exposed collections. Do not auto-publish every Schema. Applications document their mounted URL surface in their own README.
45
- Import the registry and resolver from `@aotter/mantle/web`; Core runtime does
46
- not install public rendering by itself.
47
-
48
- ## Authoring CLI
49
-
50
- Use the project's scripts first; applications use the shipping
51
- `mantle` authoring CLI from `@aotter/mantle`. Ask the installed CLI for its
52
- command list instead of trusting one copied into prose — the surface is
53
- version-matched and changes between releases:
54
-
55
- ```bash
56
- pnpm exec mantle --help
57
- pnpm validate
58
- ```
59
-
60
- On 0.1.5 and newer, `generate --host cf|chatgpt-sites` assembles a new blank
61
- app; no `--features` selects Spec, Runtime, API, MCP, Admin and Web. Explicit
62
- `--features` selects a smaller composition. It never invents a business
63
- Schema. Existing authored apps keep compile mode, and older installed CLIs
64
- may not support project generation. Check this project's CLI help first.
65
-
66
- ## Core Model
67
-
68
- Mantle exposes exactly four declarative atoms:
69
-
70
- | Atom | Purpose |
71
- |---|---|
72
- | `Schema` | Stored entity/table shape. |
73
- | `View` | Read/query surface. |
74
- | `Procedure` | Typed mutation or operation. |
75
- | `Trigger` | HTTP/lifecycle/MCP invocation binding. |
76
-
77
- Do not invent manifest kinds such as `Form`, `Feature`, `Workflow`, or
78
- `Membership`. Compose those from the four atoms plus TypeScript only where
79
- the atoms cannot express the behavior.
80
-
81
- ## Choose the manifest feature first
82
-
83
- Read installed `docs/handbook/reference/features.md` to map the requested
84
- behavior to fields before adding handlers or a custom UI. For host-only reads,
85
- `surface: internal` keeps a View out of REST/MCP/Admin while preserving its
86
- `requires` checks. Read `docs/handbook/guides/typed-queries.md` for generated
87
- View params/results, indexed entry reads, and their authorization boundary.
88
- Use `from` for portable typed projections; SQL is for queries needing native
89
- SQLite and produces `unknown` row types.
90
-
91
- For Admin labels, inputs, collection columns/tabs, reports or action buttons,
92
- read `docs/handbook/guides/admin-ui.md`. Prefer supported Schema/Procedure/View
93
- metadata and `uiSchema` before custom frontend code. These control the Admin
94
- console, not the visitor frontend. Regenerate and verify the actual console;
95
- never edit generated `public/_mantle/admin/` assets.
96
-
97
- ## Content Edits
98
-
99
- - Follow the actual frontend content source. Use Admin or Staff MCP for
100
- runtime-backed content. Do not invent an overlay/seed homepage.
101
- - For a new submitted field, update the stored `Schema` and the public
102
- `Procedure.spec.input` before any form UI. Keep public mutation inputs
103
- `additionalProperties: false`; otherwise JSON Schema's default may strip an
104
- undeclared field while returning success.
105
- - Use `lifecycle: operational` for submissions, inquiries, orders, and other
106
- Procedure-created operational records that staff inspect or correct. Reserve
107
- `publishing` for content a person stages and publishes.
108
- - Lifecycle `before_update` / `after_update` hooks also fire for unpublish,
109
- archive, and every other status transition whose target is not `published`;
110
- do not use them for edit-only work.
111
- - When a form's fixed option values change, update the stored Schema and public
112
- Procedure input `enum` together. Keep translated labels in the frontend content source;
113
- Admin and Staff MCP derive their typed controls from the manifest values.
114
- - If the application has a `page` Schema with sections, update its declared
115
- section properties when adding display fields; an undeclared property has no
116
- runtime-backed Admin or Staff MCP path.
117
- - Update notification handlers when they need the new field. Test the stored
118
- entry, not only the HTTP `{ "ok": true }` response.
119
-
120
- ## Locales
121
-
122
- - `data.locale` is reserved for `localized: true` Schemas. A non-localized
123
- Schema must use a domain field such as `replyLocale`.
124
- - Use a standalone localized Schema only for independent locale rows. For
125
- versions of one entity, use a non-localized parent plus a localized child
126
- with `translates: { parent, on }`. The child must own at least one field
127
- besides `locale` and the join field.
128
- - Parallel locale blocks must keep field names, option values, step IDs, and
129
- result keys identical; translate display strings only.
130
- - `siteDefaults.origin`, `siteDefaults.locales`, and `siteDefaults.icons` are
131
- code-owned and boot-synced. The icon list is shared by browser favicons,
132
- Admin chrome, and MCP `serverInfo.icons`; keep its static files under
133
- `public/`. Brand, title, and description seed once, then change through site
134
- settings.
135
- - When changing an existing collection from `[slug]` to `[slug, locale]`,
136
- boot with a Mantle version that reconciles obsolete unique indexes and test
137
- the same slug in two locales. Do not patch D1 manually.
138
-
139
- ## Adapter Boundary
140
-
141
- The runtime is adapter-neutral. A `MantleStorageAdapter` prepares the compiled
142
- plan into semantic storage ports; `createMantleRuntime` binds that prepared
143
- storage and selected capabilities. Database drivers and asset serving belong
144
- to the host/optional composition. Follow the installed adapter guide.
145
-
146
- Do not assume Cloudflare unless the project imports `@aotter/mantle/cloudflare`
147
- or its adapter config is visible. A future Netlify adapter should satisfy the
148
- same Core workflow through its own ports and provider setup.
149
-
150
- Site code is a consumer of this abstraction. Use Manifests, runtime use cases,
151
- `runtime.entries`, and optional `runtime.siteConfig`; do not query Mantle-owned `entries` or
152
- `site_config`, reach through deprecated `runtime.db`, copy generated-column
153
- names, or construct SDK KV keys. Cloudflare bindings belong only at the
154
- composition root. If a normal feature cannot be expressed through a
155
- purpose-shaped surface, treat that as a Core abstraction gap instead of
156
- teaching the project Mantle internals.
157
-
158
- ## Auth Composition
159
-
160
- Generated full apps select Admin by default; smaller selections can omit it.
161
- A project without `@aotter/mantle-admin-ui` is complete when Admin was not
162
- selected. If Admin was selected but its package is missing, install the
163
- CLI-declared exact version and rerun generation.
164
- When Admin is installed, `createMantleWorker({ auth })` with `email-otp`
165
- and `ConsoleEmailSender` is the local human path (OTP in wrangler logs).
166
- That override owns Auth construction; Core still owns `/admin` and
167
- `/api/auth/*`. Admin also requires wrangler `assets.directory=./public`
168
- and an `ASSETS` binding. A white screen at `/admin` with HTML 200 and
169
- `/_mantle/admin/assets/*` 404 is a missing assets binding, not a missing
170
- frontend build.
171
-
172
- Generated Cloudflare apps use `MANTLE_AUTH_MODE=local-otp` on loopback after
173
- copying `.dev.vars.example` to `.dev.vars` and setting a real owner email and
174
- random secret. Production uses `hosted` or `self-managed` with provider
175
- credentials and `ADMIN_GITHUB_LOGIN`. Conventional Cloudflare projects that
176
- do not replace Auth use those two production modes; Core owns that standard
177
- composition and rejects partial or mixed bindings. Preserve the explicit
178
- mode recorded in Worker config, keep provider secrets out of source, and
179
- do not infer a mode from whichever credentials happen to be present.
180
-
181
- ## Performance Loop
182
-
183
- After changing a Schema index, View filter/order, public API, or rendered page,
184
- run the project's index check when present. Otherwise run the installed
185
- harness directly:
186
-
187
- ```bash
188
- pnpm exec mantle-harness indexes --require-public --format text
189
- ```
190
-
191
- The check uses crowded real SQLite and the shipped compiler. It complements
192
- `pnpm validate`; it does not replace correctness validation. Declare the
193
- smallest ordered index justified by the measured path and respect SQLite's
194
- leftmost-prefix rule; which columns an index may name and how a public View's
195
- status predicate shapes it is in the handbook (`reference/schema.md#indexes`).
196
- Do not change user-visible filter or ordering semantics
197
- just to make the gate pass. Do not add every permutation or cache every read.
198
-
199
- For relevant Cloudflare serving changes, start the project and sample the
200
- actual routes:
201
-
202
- ```bash
203
- pnpm exec mantle-harness http \
204
- --base-url http://127.0.0.1:8787 \
205
- --route page=/en/example \
206
- --rounds 20 --warmup 2 --format text
207
- ```
208
-
209
- Prefer query plan, query count, `rows_read` scaling, and cache MISS/HIT
210
- evidence. Do not create CI gates from absolute local milliseconds.
211
-
212
- ## Loop
213
-
214
- ```bash
215
- pnpm install --frozen-lockfile
216
- pnpm validate
217
- pnpm check:indexes # when the project provides it
218
- pnpm typecheck
219
- pnpm check
220
- ```
221
-
222
- Use `pnpm dev` for local preview when the project provides it.
223
-
224
- ## Connect a Local MCP Client
225
-
226
- Start the project with `pnpm dev`, then use the exact local origin it prints.
227
- The conventional Cloudflare adapter exposes:
228
-
229
- - `http://localhost:8787/mcp` for public tools;
230
- - `http://localhost:8787/mcp/staff` for authenticated authoring tools.
231
-
232
- Prefer the client's native remote HTTP + OAuth support. Use a standard
233
- HTTP-to-stdio bridge such as `npx -y mcp-remote <url>` only when the client
234
- accepts stdio MCP servers but cannot connect to remote HTTP directly. Mantle
235
- does not own a separate local proxy or an auth-bypass mode.
236
-
237
- Before changing client config, confirm the Worker is reachable:
238
-
239
- ```bash
240
- curl -i http://localhost:8787/mcp
241
- ```
242
-
243
- An OAuth-protected endpoint should respond with `401` and a
244
- `WWW-Authenticate` resource-metadata challenge before sign-in. After
245
- connecting, inspect `tools/list`; make one read-only `query_view_*` call when
246
- available before invoking any mutation. Use project-scoped client config when
247
- the client offers it, and never commit OAuth tokens or the bridge's token
248
- cache.
249
-
250
- ## Rules
251
-
252
- - Keep content models in the configured manifest directory; its immediate
253
- `.yaml` and `.yml` files are loaded together.
254
- - Add TypeScript only for handlers, rendering, adapter wiring, or real behavior.
255
- - Do not write directly to D1, KV, Postgres, or object storage for content
256
- authoring. Use runtime use cases, admin APIs, or Staff MCP.
257
- - Do not commit provider secrets.
258
- - If the work is an installable capability, switch to `mantle:plugin`.
13
+ ## Workflow
14
+
15
+ Read the installed SDK README, then follow the version-matched [project and CLI
16
+ workflow](../../handbook/start/project-and-cli.md) before editing.
17
+
18
+ Use the native Store/query/surface entries and app-owned fetch from the [service
19
+ composition guide](../../handbook/cloudflare/service-entry.md).
20
+ Pair every HTTP Trigger with an MCP Trigger by default; see [Trigger](../../handbook/reference/trigger.md)
21
+ for the generate warning and deliberate asymmetry exception.
22
+ Keep optional modules out of unused entry imports and auth dynamically loaded.
23
+ Run actual public/member/admin HTTP, MCP and UI scenarios; verify stored state,
24
+ visibility, OCC and restart persistence, not just a 200 response.
25
+ Before reporting any new app or feature as done, follow the [independent
26
+ acceptance guide](../../handbook/guides/agent-workflow-acceptance.md): write a
27
+ private rubric, then give one fresh agent per role (`admin`, `user`) only its
28
+ role and entry points, across every surface it uses. This is not limited to
29
+ MCP; if it was not run, say so explicitly and report the work as UNVERIFIED
30
+ rather than done. For MCP workflows, also run the guide's design audit before implementing
31
+ tools.
32
+
33
+ For native Admin, read the [current guide](../../handbook/guides/native-admin.md):
34
+ the app builds Admin with `mantle bundle`. To customise pages, slots, hooks or
35
+ MCP-host-safe components, follow [Customising Admin](../../handbook/guides/native-admin.md#customising-admin).
36
+ Keep matching SDK, Admin and UI versions. Ref handlers retain caller-bound
37
+ `ctx.store`; generic Admin reads use shared generated View templates and writes
38
+ use native Procedure fragments.
39
+ Check actual member/Admin OTP, private scope/TTL/translation visibility, paging,
40
+ statistics, safe/exact OCC and no automatic retry after unknown 503 outcomes.
41
+
42
+ For application-owned MCP App entries and host checks, follow the [MCP Apps
43
+ guide](../../handbook/guides/mcp-apps.md).
44
+
45
+ Build a custom frontend with `App` from `@modelcontextprotocol/ext-apps`: register
46
+ `ontoolinput`/`ontoolresult` before `connect()`, and use `callServerTool` for
47
+ host-proxied calls. Keep protocol negotiation and message routing in the official
48
+ client; importing its types while writing a second `postMessage` bridge is
49
+ insufficient.
50
+
51
+ For Admin UI upgrades, follow the installed handbook's
52
+ [retained-page recipe](../../handbook/guides/mcp-apps.md#keep-old-conversations-working-after-an-upgrade).
53
+ Keep deployed snapshots in source/artifact storage and pass `previous` to
54
+ `adminMcpApps`; verify old conversations after a changed UI build without host
55
+ tool refresh, reconnection or cache clearing. Keep tool contracts compatible
56
+ through the declared retention window.
57
+
58
+
59
+ Place admin MCP Procedures in Admin deliberately: `spec.uiSchema.collectionAction:
60
+ <schema-name>` adds a collection-header action; `spec.target: { schema, id,
61
+ version? }` selects row actions and binds the row id / reviewed OCC version to
62
+ the named inputs. Other admin operations appear under Operations in the sidebar.
63
+ Keep state conditions in the SQL WHERE: simple AND equality/IN literals become
64
+ row-menu hints, while the Procedure remains the authority. Required-ref child
65
+ collections fold under their parent's sidebar group; with two or more required
66
+ `id` refs, set Schema `uiSchema.nav.parentField` to the parent's ref (generate
67
+ refuses otherwise); use `uiSchema.nav.standalone: true` for a top-level entry.
68
+
69
+ ## Database changes
70
+
71
+ The runtime never creates, alters or checks tables. Boot and requests run no DDL, introspection or schema checks.
72
+
73
+ For the first install, apply generated `schema.sql`, including selected auth/site DDL, to an empty database. Apply selected seed SQL explicitly.
74
+
75
+ For every later schema change, the application's coding agent diffs the regenerated `schema.sql`, writes a migration with the host's native tool (`wrangler d1 migrations` or the app's PostgreSQL migration tool), rehearses it on a copy, and applies it before deploying the new code.
76
+
77
+ Destructive changes and type changes need explicit data migration. Mantle drops nothing. Initial `schema.sql` is not an upgrade script.
78
+
79
+ ## Data paths
80
+
81
+ Writes use Store `insert` / `update` / `delete`, `batch`, `transaction`, or declared Procedures. Never use raw SQL writes: they bypass scope, TTL, publishing and system-column rules. For reads beyond an id lookup or simple AND filter (joins, aggregates, OR, reuse), declare an internal View so the SQL is reviewable and typed. Store `findById`, `find` and `first` remain suitable for handler lookups and embedding in an existing app. Ref handlers receive `ctx.store` bound to the same Caller and transaction.
82
+
83
+ For simple creates/partial updates, prefer Store-backed ref Procedures; keep
84
+ Procedure `requires`/generated input checks, use only allowed patch fields and
85
+ return safe business fields with the actual returned ID/version. Preserve
86
+ omitted fields and document null semantics. Retain SQL for atomic conditional
87
+ or related writes; D1 batches cannot consume an earlier result. Follow the
88
+ [Store write guidance](../../handbook/guides/typed-queries.md#prefer-store-backed-ref-procedures-for-simple-writes).
@@ -1,60 +1,49 @@
1
1
  ---
2
2
  name: integrate
3
- description: Integrate Mantle into an existing application. Use when the application has its own code, routes, storage or deployment and the owner wants to add Mantle, replace part of it, or rebuild with Mantle while migrating frontend and data.
3
+ description: Add Mantle 0.2 to an existing application, or rebuild one on Mantle and migrate its data. Use when the application already has its own code, routes, users, storage or deployment.
4
4
  metadata:
5
5
  source: "@aotter/mantle"
6
6
  sourcePath: docs/skills/integrate/SKILL.md
7
- applies_to: mantle grammar v0.1
7
+ applies_to: mantle 0.2
8
8
  projection: package
9
- projectionReason: Existing-project migration is opt-in; a fresh generated app does not need this brief.
10
9
  ---
11
10
 
12
11
  # Integrate Mantle into an existing application
13
12
 
14
- Work in the target application. Read its installed `@aotter/mantle` version,
15
- CLI help and package-local docs before editing. If Mantle is absent, inspect
16
- the application first, then install an exact SDK version only after choosing an
17
- integration strategy. Use the installed version's contract; do not copy
18
- `develop` branch examples into an older consumer.
19
-
20
- ## Inspect and decide
21
-
22
- Map the actual entry points, router, frontend, auth, storage, data volume and
23
- relationships, deployment pipeline, URLs, background jobs and existing tests.
24
- Identify which behavior the owner wants Mantle to own and what must remain
25
- stable. Compare three approaches using the application's evidence:
26
-
27
- 1. **Embed selectively:** keep the host and call Mantle's parser, Runtime or
28
- selected surfaces through its documented package APIs. The host owns wiring.
29
- 2. **Replace incrementally:** move one bounded capability at a time. Define
30
- where reads and writes go during coexistence and how each step is checked.
31
- 3. **Rebuild and migrate:** create a separate new Mantle application, port the
32
- frontend and business behavior, and transform/import existing data. Prefer
33
- this when adapting the old structure costs more than rebuilding. Preserve
34
- relevant IDs, relations, URLs and identity semantics; rehearse the data
35
- transfer before a production cutover.
36
-
37
- Explain the chosen path and its concrete tradeoffs to the owner. A small
38
- prototype or read-only inventory may resolve uncertainty. Do not run a generic
39
- project converter or assume the current application's shape matches a
40
- generated Cloudflare or ChatGPT Sites skeleton.
41
-
42
- ## Implement and verify
43
-
44
- - For embedding, retain user-owned entry/config/build files. Use the installed
45
- direct-authoring docs and CLI to validate manifests and emit bindings; wire
46
- the selected Mantle capabilities into the existing host explicitly.
47
- - For incremental replacement, establish a clear owner for each data write
48
- and request route at every stage. Verify old and new behavior together.
49
- - For rebuilding, generate in a **separate directory** with the installed
50
- CLI, move frontend and handlers deliberately, and plan data mapping and
51
- import separately. Review database migrations before application or cutover.
52
- - Run the application's build and representative behavior checks for the
53
- changed routes, auth and data. `mantle generate --check` checks generated
54
- output against its declared selection; it cannot certify host integration.
55
- For live data, record migration counts and a rollback or recovery path
56
- appropriate to the project.
57
-
58
- Leave existing data and deployment untouched until the requested migration
59
- and release steps are ready. Report which capabilities Mantle now owns,
60
- what was verified, and what remains for application deployment or cutover.
13
+ ## Workflow
14
+
15
+ Read the installed SDK README, then follow the version-matched [project and CLI
16
+ workflow](../../handbook/start/project-and-cli.md) before editing.
17
+
18
+ Keep the application router, database/pool, identity and frontend. Replace
19
+ Core consumers explicitly and compose only selected generated entries. Resolve
20
+ one Caller per request with the shared cookie-session origin check. Rehearse
21
+ data-preserving schema/auth/role migrations on a copy and retain rollback artifacts.
22
+ Initial schema.sql is for an empty database, not an in-place upgrade. Requests run
23
+ no DDL or storage checks; the only request-time write outside app operations is
24
+ the configured OAuth resource row (see [OAuth](../../handbook/guides/oauth.md)).
25
+ Verify cutover with actual app tests.
26
+
27
+ Preserve the app router, verified identity and native resources. For selected
28
+ Admin, follow the [native guide](../../handbook/guides/native-admin.md) for its
29
+ application-built bundle and service composition.
30
+ Do not import old `/spec`, `/core` or runtime surface APIs. Review data/role
31
+ migrations explicitly; full cross-target int64 parity and automated transfer
32
+ are not this release's upgrade contract.
33
+
34
+ ## Partial adoption in TypeScript/Node
35
+
36
+ Keep the app's router, pool/handle, identity and frontend. Declare only the Schemas and operations being adopted; import selected `views/<encoded-name>.ts` or `procedures/<encoded-name>.ts`, then call `(appHandle, verifiedCaller, validatedInput)`. Bun.SQL and postgres.js fit directly; [node-postgres can adapt](../../handbook/guides/postgres-adapters.md). No Admin/auth/surface module is required for direct queries.
37
+
38
+ Existing tables need explicit migration into the declared storage shape, including system columns and constraints. Initial schema.sql must not be applied over an occupied database. Rehearse on a copy and test scope, TTL, publication, OCC and persisted state with the app's own identity.
39
+
40
+ Writes use Store or declared Procedures; never raw SQL writes to adopted collections. Use internal Views for joins, aggregates, OR and reusable reads. Store findById/find/first remain useful for simple AND lookups in existing handlers.
41
+
42
+ Direct declared Schema-column outputs in Views and SQL Procedure `RETURNING`
43
+ keep their authored field names; explicit aliases keep SQL casing rules. Store
44
+ rows and nested SQL relations use storage names. Boundary validators support a
45
+ permissive `format: email` check (one `@`, non-empty parts, no whitespace). For
46
+ LEFT JOIN paging, join on the joined Schema's id or single-field unique key and
47
+ keep the base indexed, non-null order/id tuple. Generation always emits `Handlers`
48
+ (empty without ref Procedures); pass `handlers` at `adminBindings()`, generated REST/MCP options and
49
+ `webmcpRoutes(catalogue, tools, handlers)`, as the app shell does.
@@ -1,41 +1,65 @@
1
1
  ---
2
2
  name: media-gc
3
- description: Audit and safely remove stale, uncommitted public media uploads from a Mantle Cloudflare R2 bucket. Use when a Mantle operator asks to inspect or clean orphan media objects left after create_media_upload without commit_media_upload.
3
+ description: Audit and safely remove stale, uncommitted media uploads from a Mantle 0.2 Cloudflare R2 bucket. Use when an operator asks to inspect or clean objects left under uploads/ by an upload that was created but never committed.
4
4
  metadata:
5
5
  source: "@aotter/mantle"
6
6
  sourcePath: docs/skills/media-gc/SKILL.md
7
- applies_to: mantle grammar v0.1
7
+ applies_to: mantle 0.2
8
8
  projection: package
9
9
  projectionReason: Destructive remote object deletion and Cloudflare-specific; opt-in only.
10
10
  ---
11
11
 
12
12
  # Mantle Media GC
13
13
 
14
+ ## Generated native applications (alpha.7 and later)
15
+
16
+ If the installed README describes generated native queries, read
17
+ `docs/handbook/cloudflare/media-r2.md` and app-owned site/media wiring instead of Core storage
18
+ options. Resolve the exact configured bucket and declared purposes. The
19
+ `uploads/` candidate audit below still applies. Committed copies live under
20
+ `committed/` and must never be candidates. Attempt-isolated committed copies
21
+ retained after an uncertain DB outcome require reconciliation with live DB
22
+ references before any separately authorized cleanup.
23
+
14
24
  Use the connected Cloudflare API. Audit by default; delete only the exact
15
25
  objects approved by the user.
16
26
 
17
27
  ## Preflight
18
28
 
19
- 1. Read the project's Wrangler config and Mantle config. Resolve the R2 bucket
20
- binding, bucket name, and declared public media purpose names.
29
+ 1. Read `wrangler.jsonc`, the app-owned entry (`src/worker.ts` by default,
30
+ or the generation command's `--entry`) and its media wiring. Resolve the R2
31
+ bucket that `r2MediaStorage` uses and the media purpose names in
32
+ `siteDefaults.media.purposes` selected by `--site`.
21
33
  2. Confirm the exact Cloudflare account and bucket. If either is ambiguous,
22
34
  ask; never choose by name similarity.
23
35
  3. Use the Cloudflare OpenAPI search before execution to resolve the current
24
36
  R2 List Objects and Delete Objects endpoints. If the connected account lacks
25
37
  access, stop. Do not create, request, or store credentials.
26
- 4. Stop when the project has no public R2 media binding or no declared purpose.
38
+ 4. Stop when the service passes no `r2MediaStorage` or declares no purpose.
39
+
40
+ ## How 0.2 lays out media
41
+
42
+ `POST /admin/api/media/uploads` issues presigned PUT URLs that expire after 15
43
+ minutes, for keys under `uploads/<purpose>/<group>/<role>.<ext>`. Commit
44
+ copies each checked object to `committed/<group>/<attempt>/<role>.<ext>` (with
45
+ `committedAt` metadata); the attempt UUID isolates concurrent commits. Upload
46
+ keys are removed after the database commit succeeds, or when a group is
47
+ rejected. An old upload key may also be leftover cleanup from a successful or
48
+ uncertain commit: it is not evidence that the media row is absent. Once expired,
49
+ it cannot create a new asset. Objects outside `uploads/` are never candidates;
50
+ reconcile attempt copies separately with live database references.
27
51
 
28
52
  ## Audit
29
53
 
30
54
  For each declared purpose, list up to 1,000 objects per page under the exact
31
- `<purpose>/` prefix. Use the API cursor until `is_truncated` is false.
55
+ `uploads/<purpose>/` prefix. Use the API cursor until `is_truncated` is false.
32
56
 
33
57
  An object is a deletion candidate only when all conditions hold:
34
58
 
35
59
  - `last_modified` is more than 24 hours old;
36
60
  - `custom_metadata.committedAt` is absent or empty;
37
- - the key matches the exact Mantle layout
38
- `<purpose>/<group>/(primary|alternate|fallback).(png|jpg|webp|avif|gif|svg)`,
61
+ - the key matches the exact upload layout
62
+ `uploads/<purpose>/<group>/(primary|alternate|fallback).(png|jpg|webp|avif|gif|bin)`,
39
63
  where `<purpose>` is declared by this project and `<group>` contains only
40
64
  letters, digits, `_`, or `-`.
41
65
 
@@ -65,8 +89,8 @@ filenames, public URLs, signed URLs, or secrets.
65
89
 
66
90
  - Don't create a Worker, Cron Trigger, lifecycle rule, D1 table, or local script.
67
91
  - Don't use prefix deletion or empty-bucket operations.
68
- - Don't delete private-media buckets or objects outside declared purpose
69
- prefixes.
92
+ - Don't delete objects outside `uploads/<declared purpose>/`, and never
93
+ committed media.
70
94
  - Don't treat missing pagination pages, metadata, or permissions as an empty
71
95
  result.
72
96