@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.
- package/README.md +166 -298
- package/dist/auth/adapter.d.ts +32 -0
- package/dist/auth/adapter.js +288 -0
- package/dist/auth/admin.d.ts +3 -0
- package/dist/auth/admin.js +21 -0
- package/dist/auth/caller.d.ts +86 -0
- package/dist/auth/caller.js +155 -0
- package/dist/auth/hardening.d.ts +24 -0
- package/dist/auth/hardening.js +40 -0
- package/dist/auth/identity.d.ts +121 -0
- package/dist/auth/identity.js +203 -0
- package/dist/auth/oauth.d.ts +63 -0
- package/dist/auth/oauth.js +217 -0
- package/dist/auth/resource-seeds.js +10 -0
- package/dist/auth/routes.d.ts +32 -0
- package/dist/auth/routes.js +226 -0
- package/dist/build/compiler.d.ts +721 -0
- package/dist/build/compiler.js +7029 -0
- package/dist/build/spec/domain/model/ManifestGrammar.d.ts +439 -0
- package/dist/build/spec/domain/model/RuntimePlan.d.ts +168 -0
- package/dist/build/spec/domain/model/SqlIr.d.ts +129 -0
- package/dist/build/spec/domain/model/UserFields.d.ts +21 -0
- package/dist/build/spec/domain/service/PlanFingerprint.d.ts +7 -0
- package/dist/build/spec/kernel/diagnostic.d.ts +108 -0
- package/dist/bun/assets.d.ts +2 -0
- package/dist/bun/assets.js +24 -0
- package/dist/domain/adminOrder.js +24 -0
- package/dist/domain/columns.js +57 -0
- package/dist/domain/describe/chunk-ZVXBGP7Y.js +424 -0
- package/dist/domain/describe/index.d.ts +58 -0
- package/dist/domain/describe/index.js +115 -0
- package/dist/domain/describe/target-hash.d.ts +8 -0
- package/dist/domain/describe/target-hash.js +12 -0
- package/dist/domain/describe/targets.d.ts +40 -0
- package/dist/domain/entry.js +33 -0
- package/dist/domain/generated-tools.js +19 -0
- package/dist/domain/generation.d.ts +16 -0
- package/dist/domain/generation.js +1 -0
- package/dist/domain/input.js +17 -0
- package/dist/domain/model.js +1 -0
- package/dist/domain/paging.js +230 -0
- package/dist/domain/recipes.js +24 -0
- package/dist/domain/userReferences.js +5 -0
- package/dist/domain/wireScalars.js +47 -0
- package/dist/infrastructure/adminEntries.js +153 -0
- package/dist/infrastructure/adminPaging.js +72 -0
- package/dist/infrastructure/artifacts.js +71 -0
- package/dist/infrastructure/authSchema.js +83 -0
- package/dist/infrastructure/bundle.js +188 -0
- package/dist/infrastructure/cli.js +118 -0
- package/dist/infrastructure/generate.d.ts +12 -0
- package/dist/infrastructure/generate.js +189 -0
- package/dist/infrastructure/generateAuth.d.ts +8 -0
- package/dist/infrastructure/generateAuth.js +74 -0
- package/dist/infrastructure/help.js +60 -0
- package/dist/infrastructure/init.js +54 -0
- package/dist/infrastructure/inputs.js +41 -0
- package/dist/infrastructure/mounts.js +25 -0
- package/dist/infrastructure/wrangler.js +109 -0
- package/dist/kernel/authorization.d.ts +4 -0
- package/dist/kernel/authorization.js +16 -0
- package/dist/kernel/binds.d.ts +60 -0
- package/dist/kernel/binds.js +49 -0
- package/dist/kernel/caller-identity.d.ts +24 -0
- package/dist/kernel/caller-identity.js +22 -0
- package/dist/kernel/contract-error.d.ts +12 -0
- package/dist/kernel/contract-error.js +14 -0
- package/dist/kernel/contracts.d.ts +143 -0
- package/dist/kernel/contracts.js +97 -0
- package/dist/kernel/cron.d.ts +1 -0
- package/dist/kernel/cron.js +58 -0
- package/dist/kernel/dialect/common.d.ts +38 -0
- package/dist/kernel/dialect/common.js +6 -0
- package/dist/kernel/dialect/postgres.d.ts +16 -0
- package/dist/kernel/dialect/postgres.js +18 -0
- package/dist/kernel/dialect/sqlite.d.ts +20 -0
- package/dist/kernel/dialect/sqlite.js +34 -0
- package/dist/kernel/drain.d.ts +5 -0
- package/dist/kernel/drain.js +35 -0
- package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
- package/dist/kernel/driver/bun-sqlite.js +77 -0
- package/dist/kernel/driver/d1.d.ts +24 -0
- package/dist/kernel/driver/d1.js +22 -0
- package/dist/kernel/driver/postgres.d.ts +25 -0
- package/dist/kernel/driver/postgres.js +99 -0
- package/dist/kernel/driver/transaction-context.d.ts +10 -0
- package/dist/kernel/driver/transaction-context.js +29 -0
- package/dist/kernel/email.d.ts +28 -0
- package/dist/kernel/email.js +38 -0
- package/dist/kernel/host-access.d.ts +10 -0
- package/dist/kernel/host-access.js +65 -0
- package/dist/kernel/host-caller.d.ts +39 -0
- package/dist/kernel/host-caller.js +56 -0
- package/dist/kernel/json-body.d.ts +4 -0
- package/dist/kernel/json-body.js +44 -0
- package/dist/kernel/mcp-apps.d.ts +69 -0
- package/dist/kernel/mcp-apps.js +40 -0
- package/dist/kernel/mcp-call.d.ts +5 -0
- package/dist/kernel/mcp-call.js +25 -0
- package/dist/kernel/mcp-handler.js +371 -0
- package/dist/kernel/mcp.d.ts +110 -0
- package/dist/kernel/mcp.js +50 -0
- package/dist/kernel/media.d.ts +27 -0
- package/dist/kernel/media.js +216 -0
- package/dist/kernel/paging.d.ts +55 -0
- package/dist/kernel/paging.js +95 -0
- package/dist/kernel/publishing.d.ts +4 -0
- package/dist/kernel/publishing.js +16 -0
- package/dist/kernel/r2-media.d.ts +42 -0
- package/dist/kernel/r2-media.js +78 -0
- package/dist/kernel/rest-dispatch.js +38 -0
- package/dist/kernel/rest-router.js +64 -0
- package/dist/kernel/rest.d.ts +58 -0
- package/dist/kernel/rest.js +41 -0
- package/dist/kernel/scalars.d.ts +6 -0
- package/dist/kernel/scalars.js +44 -0
- package/dist/kernel/search.js +5 -0
- package/dist/kernel/site-types.d.ts +146 -0
- package/dist/kernel/site-types.js +1 -0
- package/dist/kernel/site.d.ts +39 -0
- package/dist/kernel/site.js +32 -0
- package/dist/kernel/store.d.ts +175 -0
- package/dist/kernel/store.js +269 -0
- package/dist/kernel/surface.d.ts +10 -0
- package/dist/kernel/surface.js +19 -0
- package/dist/kernel/sweep.d.ts +17 -0
- package/dist/kernel/sweep.js +27 -0
- package/dist/kernel/translations.d.ts +1 -0
- package/dist/kernel/translations.js +13 -0
- package/dist/kernel/user-caller.d.ts +31 -0
- package/dist/kernel/user-caller.js +67 -0
- package/dist/kernel/user-field-name.js +3 -0
- package/dist/kernel/user-fields.d.ts +35 -0
- package/dist/kernel/user-fields.js +81 -0
- package/dist/kernel/validation.d.ts +15 -0
- package/dist/kernel/validation.js +54 -0
- package/dist/kernel/web-gateway.js +68 -0
- package/dist/kernel/web-head.js +15 -0
- package/dist/kernel/web-index.js +40 -0
- package/dist/kernel/web-response.js +8 -0
- package/dist/kernel/web.d.ts +77 -0
- package/dist/kernel/web.js +124 -0
- package/dist/kernel/where.js +27 -0
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.js +1 -0
- package/dist/usecase/adminBindings.js +143 -0
- package/dist/usecase/adminClient.js +87 -0
- package/dist/usecase/adminDescriptors.js +107 -0
- package/dist/usecase/generate.js +166 -0
- package/dist/usecase/handlers.js +21 -0
- package/dist/usecase/mcp-media.js +17 -0
- package/dist/usecase/mcp.js +100 -0
- package/dist/usecase/paging.js +71 -0
- package/dist/usecase/publishing.js +63 -0
- package/dist/usecase/refusals.js +27 -0
- package/dist/usecase/rest.js +54 -0
- package/dist/usecase/search.js +7 -0
- package/dist/usecase/site.js +39 -0
- package/dist/usecase/stores.js +64 -0
- package/dist/usecase/tool-version.js +9 -0
- package/dist/usecase/translations.js +78 -0
- package/dist/usecase/ttl.js +20 -0
- package/dist/usecase/validation.js +241 -0
- package/dist/usecase/web.js +23 -0
- package/docs/examples/README.md +39 -18
- package/docs/examples/app-shell/.dev.vars.example +4 -0
- package/docs/examples/app-shell/README.md +121 -0
- package/docs/examples/app-shell/accept.mjs +91 -0
- package/docs/examples/app-shell/gitignore +7 -0
- package/docs/examples/app-shell/package.json +43 -0
- package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
- package/docs/examples/app-shell/smoke-kit.mjs +168 -0
- package/docs/examples/app-shell/src/auth.ts +58 -0
- package/docs/examples/app-shell/src/handlers.ts +5 -0
- package/docs/examples/app-shell/src/index.ts +4 -0
- package/docs/examples/app-shell/src/routes.ts +14 -0
- package/docs/examples/app-shell/src/schedule.ts +8 -0
- package/docs/examples/app-shell/src/service.ts +70 -0
- package/docs/examples/app-shell/src/sign-in.ts +41 -0
- package/docs/examples/app-shell/src/signup.ts +8 -0
- package/docs/examples/app-shell/tsconfig.json +26 -0
- package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
- package/docs/examples/app-shell/wrangler.jsonc +62 -0
- package/docs/examples/club-events/README.md +65 -0
- package/docs/examples/club-events/manifests/club-events.yaml +247 -0
- package/docs/examples/club-events/smoke.mjs +127 -0
- package/docs/examples/club-events/src/handlers.ts +25 -0
- package/docs/examples/club-events/src/signup.ts +9 -0
- package/docs/examples/generated-web/README.md +78 -0
- package/docs/examples/generated-web/posts.yaml +38 -0
- package/docs/examples/generated-web/seed.sql +6 -0
- package/docs/examples/generated-web/src/worker.ts +43 -0
- package/docs/examples/generated-web/tsconfig.json +8 -0
- package/docs/examples/generated-web/wrangler.jsonc +8 -0
- package/docs/examples/purchasing/.dev.vars.example +6 -0
- package/docs/examples/purchasing/README.md +99 -0
- package/docs/examples/purchasing/manifests/purchasing.yaml +374 -0
- package/docs/examples/purchasing/seed.sql +4 -0
- package/docs/examples/purchasing/smoke.mjs +191 -0
- package/docs/examples/purchasing/src/admin.tsx +13 -0
- package/docs/examples/purchasing/src/handlers.ts +33 -0
- package/docs/examples/purchasing/src/notify.ts +29 -0
- package/docs/examples/purchasing/src/requests-page.ts +57 -0
- package/docs/examples/purchasing/src/routes.ts +53 -0
- package/docs/examples/purchasing/src/schedule.ts +31 -0
- package/docs/examples/purchasing/src/signup.ts +5 -0
- package/docs/examples/purchasing/src/supplier.ts +32 -0
- package/docs/examples/purchasing/wrangler.jsonc +69 -0
- package/docs/examples/recipes/README.md +60 -0
- package/docs/examples/recipes/manifests/recipes.yaml +75 -0
- package/docs/examples/recipes/smoke.mjs +102 -0
- package/docs/examples/recipes/src/media.ts +13 -0
- package/docs/examples/recipes/src/pages.ts +99 -0
- package/docs/examples/recipes/src/routes.ts +71 -0
- package/docs/examples/recipes/src/site-config.ts +12 -0
- package/docs/examples/recipes/wrangler.jsonc +74 -0
- package/docs/handbook/cloudflare/authentication.md +180 -322
- package/docs/handbook/cloudflare/chatgpt-sites.md +5 -23
- package/docs/handbook/cloudflare/deploy-and-operate.md +55 -77
- package/docs/handbook/cloudflare/media-r2.md +61 -205
- package/docs/handbook/cloudflare/service-entry.md +239 -0
- package/docs/handbook/concepts/authorization.md +10 -107
- package/docs/handbook/concepts/four-atoms.md +9 -168
- package/docs/handbook/concepts/lifecycle-and-locales.md +9 -132
- package/docs/handbook/concepts/mcp-and-agents.md +24 -121
- package/docs/handbook/concepts/procedures-and-triggers.md +5 -217
- package/docs/handbook/concepts/runtime-and-adapters.md +15 -169
- package/docs/handbook/concepts/views.md +10 -185
- package/docs/handbook/examples/hub.md +3 -8
- package/docs/handbook/guides/adapter-guide.md +11 -0
- package/docs/handbook/guides/admin-ui.md +115 -133
- package/docs/handbook/guides/agent-setup.md +64 -74
- package/docs/handbook/guides/agent-workflow-acceptance.md +232 -0
- package/docs/handbook/guides/email.md +86 -0
- package/docs/handbook/guides/local-testing.md +40 -0
- package/docs/handbook/guides/mcp-apps.md +560 -0
- package/docs/handbook/guides/native-admin.md +566 -0
- package/docs/handbook/guides/native-execution.md +133 -0
- package/docs/handbook/guides/oauth.md +219 -0
- package/docs/handbook/guides/postgres-adapters.md +56 -0
- package/docs/handbook/guides/public-pages.md +87 -0
- package/docs/handbook/guides/size-and-startup.md +9 -0
- package/docs/handbook/guides/sql-patterns.md +266 -0
- package/docs/handbook/guides/typed-queries.md +211 -107
- package/docs/handbook/navigation.json +176 -55
- package/docs/handbook/reference/admin-descriptors.md +53 -0
- package/docs/handbook/reference/authorization.md +39 -266
- package/docs/handbook/reference/describe.md +56 -0
- package/docs/handbook/reference/diagnostics.md +19 -186
- package/docs/handbook/reference/features.md +45 -55
- package/docs/handbook/reference/manifest.md +6 -129
- package/docs/handbook/reference/procedure.md +11 -303
- package/docs/handbook/reference/schema.md +64 -240
- package/docs/handbook/reference/site-config.md +5 -218
- package/docs/handbook/reference/sql.md +64 -0
- package/docs/handbook/reference/surface.md +392 -201
- package/docs/handbook/reference/trigger.md +56 -192
- package/docs/handbook/reference/view.md +24 -243
- package/docs/handbook/releases/index.md +244 -77
- package/docs/handbook/start/agents.md +45 -0
- package/docs/handbook/start/overview.md +9 -48
- package/docs/handbook/start/project-and-cli.md +51 -104
- package/docs/handbook/start/quickstart-worker.md +43 -178
- package/docs/skills/develop/SKILL.md +79 -249
- package/docs/skills/integrate/SKILL.md +39 -50
- package/docs/skills/media-gc/SKILL.md +34 -10
- package/docs/skills/provision/SKILL.md +36 -186
- package/docs/skills/update/SKILL.md +23 -38
- package/docs/source/scripts/postgres-adapter.ts +101 -0
- package/docs/upgrade-0.1-to-0.2.md +227 -0
- package/package.json +120 -131
- package/skills/README.md +48 -108
- package/skills/mantle/SKILL.md +76 -0
- package/dist/admin-ui.d.ts +0 -2
- package/dist/admin-ui.d.ts.map +0 -1
- package/dist/admin-ui.js +0 -2
- package/dist/admin-ui.js.map +0 -1
- package/dist/admin.d.ts +0 -2
- package/dist/admin.d.ts.map +0 -1
- package/dist/admin.js +0 -2
- package/dist/admin.js.map +0 -1
- package/dist/auth.d.ts +0 -2
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -2
- package/dist/auth.js.map +0 -1
- package/dist/bun.d.ts +0 -2
- package/dist/bun.d.ts.map +0 -1
- package/dist/bun.js +0 -2
- package/dist/bun.js.map +0 -1
- package/dist/cli/generate-cloudflare.d.ts +0 -7
- package/dist/cli/generate-cloudflare.d.ts.map +0 -1
- package/dist/cli/generate-cloudflare.js +0 -123
- package/dist/cli/generate-cloudflare.js.map +0 -1
- package/dist/cli/generate-project.d.ts +0 -25
- package/dist/cli/generate-project.d.ts.map +0 -1
- package/dist/cli/generate-project.js +0 -282
- package/dist/cli/generate-project.js.map +0 -1
- package/dist/cli/generate-sites.d.ts +0 -8
- package/dist/cli/generate-sites.d.ts.map +0 -1
- package/dist/cli/generate-sites.js +0 -273
- package/dist/cli/generate-sites.js.map +0 -1
- package/dist/cli/generate.d.ts +0 -20
- package/dist/cli/generate.d.ts.map +0 -1
- package/dist/cli/generate.js +0 -299
- package/dist/cli/generate.js.map +0 -1
- package/dist/cli/harness.d.ts +0 -3
- package/dist/cli/harness.d.ts.map +0 -1
- package/dist/cli/harness.js +0 -214
- package/dist/cli/harness.js.map +0 -1
- package/dist/cli/main.d.ts +0 -3
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -77
- package/dist/cli/main.js.map +0 -1
- package/dist/cli/skills.d.ts +0 -3
- package/dist/cli/skills.d.ts.map +0 -1
- package/dist/cli/skills.js +0 -128
- package/dist/cli/skills.js.map +0 -1
- package/dist/cloudflare.d.ts +0 -2
- package/dist/cloudflare.d.ts.map +0 -1
- package/dist/cloudflare.js +0 -2
- package/dist/cloudflare.js.map +0 -1
- package/dist/codegen/emitMantleModule.d.ts +0 -22
- package/dist/codegen/emitMantleModule.d.ts.map +0 -1
- package/dist/codegen/emitMantleModule.js +0 -291
- package/dist/codegen/emitMantleModule.js.map +0 -1
- package/dist/codegen.d.ts +0 -2
- package/dist/codegen.d.ts.map +0 -1
- package/dist/codegen.js +0 -2
- package/dist/codegen.js.map +0 -1
- package/dist/runtime-testing.d.ts +0 -2
- package/dist/runtime-testing.d.ts.map +0 -1
- package/dist/runtime-testing.js +0 -2
- package/dist/runtime-testing.js.map +0 -1
- package/dist/runtime.d.ts +0 -2
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -2
- package/dist/runtime.js.map +0 -1
- package/dist/spec.d.ts +0 -2
- package/dist/spec.d.ts.map +0 -1
- package/dist/spec.js +0 -2
- package/dist/spec.js.map +0 -1
- package/dist/vercel-libsql.d.ts +0 -2
- package/dist/vercel-libsql.d.ts.map +0 -1
- package/dist/vercel-libsql.js +0 -2
- package/dist/vercel-libsql.js.map +0 -1
- package/dist/vercel.d.ts +0 -2
- package/dist/vercel.d.ts.map +0 -1
- package/dist/vercel.js +0 -2
- package/dist/vercel.js.map +0 -1
- package/dist/web.d.ts +0 -2
- package/dist/web.d.ts.map +0 -1
- package/dist/web.js +0 -2
- package/dist/web.js.map +0 -1
- package/docs/adapter-guide.md +0 -222
- package/docs/adr/0001-four-atom-manifest-model.md +0 -440
- package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
- package/docs/adr/0007-ai-as-primary-author.md +0 -473
- package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
- package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
- package/docs/adr/0010-locale-and-translates.md +0 -453
- package/docs/adr/0011-adapter-port-spec.md +0 -281
- package/docs/adr/0012-views-as-public-rest.md +0 -161
- package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
- package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -900
- package/docs/adr/0016-site-semantic-layer.md +0 -70
- package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
- package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
- package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -240
- package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
- package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
- package/docs/adr/0022-caller-observed-version-occ.md +0 -212
- package/docs/adr/0023-port-failure-contract.md +0 -69
- package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
- package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
- package/docs/adr/0026-progressive-generate.md +0 -36
- package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
- package/docs/adr/0028-schema-ttl-expiry.md +0 -33
- package/docs/adr/README.md +0 -81
- package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
- package/docs/adr/adr-lite-808-route-readiness.md +0 -47
- package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
- package/docs/adr/adr-lite-812-native-parity.md +0 -150
- package/docs/adr/adr-lite-823-home-statistics.md +0 -64
- package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
- package/docs/adr/adr-lite-845-frontend-client.md +0 -38
- package/docs/adr/adr-lite-861-admin-webmcp.md +0 -42
- package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
- package/docs/agent-prompts.md +0 -64
- package/docs/api-mcp-authorization.md +0 -5
- package/docs/assets/mantle-admin-developer.png +0 -0
- package/docs/assets/mantle-admin-operations.png +0 -0
- package/docs/assets/mantle-hero.jpg +0 -0
- package/docs/auth-hosting-model.md +0 -166
- package/docs/cloudflare-low-level-composition.md +0 -5
- package/docs/consumer-onboarding-audit.md +0 -65
- package/docs/deferred-lifecycle-queues.md +0 -5
- package/docs/design-atoms.md +0 -16
- package/docs/design-references/editorial-blog-2026-05-05.md +0 -218
- package/docs/direct-authoring.md +0 -5
- package/docs/examples/builtin-commerce.md +0 -269
- package/docs/examples/builtin-intake.md +0 -143
- package/docs/examples/builtin-legal-documents.md +0 -189
- package/docs/examples/builtin-procurement.md +0 -241
- package/docs/examples/builtin-publication.md +0 -241
- package/docs/examples/builtin-reservation.md +0 -149
- package/docs/examples/cf-primitives-commerce-inventory.md +0 -809
- package/docs/examples/cf-primitives-guarded-api.md +0 -429
- package/docs/examples/cf-primitives-intake-hooks.md +0 -319
- package/docs/examples/host-chatgpt-sites/.openai/hosting.json +0 -1
- package/docs/examples/host-chatgpt-sites/README.md +0 -70
- package/docs/examples/host-chatgpt-sites/drizzle/0000_sites_users.sql +0 -8
- package/docs/examples/host-chatgpt-sites/drizzle/0001_mantle.sql +0 -294
- package/docs/examples/host-chatgpt-sites/drizzle/0002_article_cover.sql +0 -5
- package/docs/examples/host-chatgpt-sites/drizzle/0003_store_instance_id.sql +0 -1
- package/docs/examples/host-chatgpt-sites/drizzle/0004_mantle.sql +0 -10
- package/docs/examples/host-chatgpt-sites/drizzle/0005_mantle.sql +0 -24
- package/docs/examples/host-chatgpt-sites/drizzle/meta/_journal.json +0 -1
- package/docs/examples/host-chatgpt-sites/drizzle/meta/mantle-state.json +0 -60
- package/docs/examples/host-chatgpt-sites/manifests/site.yaml +0 -27
- package/docs/examples/host-chatgpt-sites/package.json +0 -1
- package/docs/examples/host-chatgpt-sites/public/site.css +0 -1
- package/docs/examples/host-chatgpt-sites/scripts/build.mjs +0 -13
- package/docs/examples/host-chatgpt-sites/scripts/check.mjs +0 -101
- package/docs/examples/host-chatgpt-sites/scripts/migration.mjs +0 -43
- package/docs/examples/host-chatgpt-sites/src/chatgpt-auth.ts +0 -66
- package/docs/examples/host-chatgpt-sites/src/index.ts +0 -46
- package/docs/examples/host-chatgpt-sites/src/mcp.ts +0 -49
- package/docs/examples/host-chatgpt-sites/src/media.ts +0 -109
- package/docs/examples/host-chatgpt-sites/src/r2-lab.ts +0 -38
- package/docs/examples/host-chatgpt-sites/src/storage-fingerprint.json +0 -1
- package/docs/examples/host-chatgpt-sites/src/web.ts +0 -35
- package/docs/examples/host-chatgpt-sites/tsconfig.json +0 -1
- package/docs/examples/host-chatgpt-sites/wrangler.jsonc +0 -10
- package/docs/examples/host-local-admin-otp/.dev.vars.example +0 -3
- package/docs/examples/host-local-admin-otp/README.md +0 -80
- package/docs/examples/host-local-admin-otp/ensure-dev-vars.mjs +0 -5
- package/docs/examples/host-local-admin-otp/manifests/site.yaml +0 -25
- package/docs/examples/host-local-admin-otp/package.json +0 -29
- package/docs/examples/host-local-admin-otp/public/.gitkeep +0 -1
- package/docs/examples/host-local-admin-otp/smoke.mjs +0 -141
- package/docs/examples/host-local-admin-otp/src/index.ts +0 -54
- package/docs/examples/host-local-admin-otp/tsconfig.json +0 -17
- package/docs/examples/host-local-admin-otp/wrangler.jsonc +0 -23
- package/docs/examples/host-minimal-worker/README.md +0 -41
- package/docs/examples/host-minimal-worker/manifests/site.yaml +0 -25
- package/docs/examples/host-minimal-worker/package.json +0 -26
- package/docs/examples/host-minimal-worker/smoke.mjs +0 -23
- package/docs/examples/host-minimal-worker/src/index.ts +0 -4
- package/docs/examples/host-minimal-worker/tsconfig.json +0 -17
- package/docs/examples/host-minimal-worker/wrangler.jsonc +0 -22
- package/docs/handbook/chatgpt-sites/equipment-checkout.md +0 -231
- package/docs/handbook/chatgpt-sites/generated-app.md +0 -84
- package/docs/handbook/chatgpt-sites/host-reference.md +0 -113
- package/docs/handbook/chatgpt-sites/index.md +0 -133
- package/docs/handbook/cloudflare/bindings.md +0 -291
- package/docs/handbook/cloudflare/conventional-worker.md +0 -166
- package/docs/handbook/cloudflare/deferred-hooks-queues.md +0 -170
- package/docs/handbook/cloudflare/low-level-composition.md +0 -169
- package/docs/handbook/cloudflare/public-web.md +0 -144
- package/docs/handbook/cloudflare/site-chrome.md +0 -75
- package/docs/handbook/examples/commerce-transaction.md +0 -11
- package/docs/handbook/examples/commerce.md +0 -11
- package/docs/handbook/examples/guarded-api.md +0 -10
- package/docs/handbook/examples/intake-form.md +0 -12
- package/docs/handbook/examples/intake-hooks.md +0 -11
- package/docs/handbook/examples/legal-documents.md +0 -10
- package/docs/handbook/examples/procurement-approvals.md +0 -10
- package/docs/handbook/examples/publication.md +0 -10
- package/docs/handbook/examples/reservation.md +0 -10
- package/docs/handbook/start/quickstart-admin.md +0 -52
- package/docs/labels.md +0 -71
- package/docs/media-uploads.md +0 -5
- package/docs/migration-0.1.2.md +0 -13
- package/docs/performance-harness.md +0 -228
- package/docs/release-process.md +0 -244
- package/docs/schema-indexes.md +0 -5
- package/docs/sealed-pipeline-ownership.md +0 -101
- package/docs/skills/plugin/SKILL.md +0 -132
- package/docs/skills/theme/SKILL.md +0 -77
- package/docs/spec-only-host-adoption.md +0 -157
- package/docs/transaction-patterns.md +0 -5
- package/skills/develop/SKILL.md +0 -258
- package/skills/install/SKILL.md +0 -112
- package/skills/integrate/SKILL.md +0 -60
- package/skills/media-gc/SKILL.md +0 -85
- package/skills/plugin/SKILL.md +0 -132
- package/skills/provision/SKILL.md +0 -194
- package/skills/theme/SKILL.md +0 -77
- package/skills/update/SKILL.md +0 -51
- package/templates/chatgpt-sites/auth.ts +0 -66
- package/templates/chatgpt-sites/build.mjs +0 -14
- package/templates/chatgpt-sites/env.ts +0 -1
- package/templates/chatgpt-sites/mcp.ts +0 -48
- package/templates/chatgpt-sites/public-mcp.ts +0 -29
- package/templates/chatgpt-sites/smoke-local.mjs +0 -20
package/README.md
CHANGED
|
@@ -1,319 +1,187 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
# Mantle
|
|
2
|
+
|
|
3
|
+
Mantle is an agent-native application SDK and backend compiler. Declare Schemas, Views, Procedures and Triggers in
|
|
4
|
+
YAML manifests; `mantle generate` compiles them at build time into native SQL and typed TypeScript for SQLite (Bun or
|
|
5
|
+
Cloudflare D1) and PostgreSQL (Bun or Cloudflare Workers). The compiler adds row policy to every query, and the closed v2
|
|
6
|
+
grammar reports actionable diagnostics. Your app keeps its own entry, routes and auth; Mantle adds only the surfaces
|
|
7
|
+
you select: REST, MCP, a web module, Better Auth sign-in and the native Admin.
|
|
8
|
+
|
|
9
|
+
**Start here:** `npx mantle help` prints the installed docs one topic at a time. `mantle init <directory>` writes a
|
|
10
|
+
complete app shell once (email OTP, `admin` + `user`, Admin, MCP, REST); [examples](./docs/examples/README.md) show
|
|
11
|
+
how to combine stock, own-records, approvals, callbacks, public pages and email into it.
|
|
12
|
+
|
|
13
|
+
Three packages: `@aotter/mantle` is the SDK with bin `mantle`; `@aotter/mantle-ui` is pure UI without an SDK dependency; `@aotter/mantle-admin` is the optional product with the SDK as a peer. Use matching installed versions and their own docs.
|
|
14
|
+
|
|
15
|
+
Select `--admin` / `admin: true` for [Native Admin](./docs/handbook/guides/native-admin.md).
|
|
16
|
+
Its generated adapter mounts with `entries(bindings.schemas, bindings.adapter)`;
|
|
17
|
+
shared read templates and generated Procedure fragments preserve the native
|
|
18
|
+
row policy and checks without importing generic Store into initial Admin reads.
|
|
19
|
+
|
|
20
|
+
Build and contributor checks: [CONTRIBUTING](https://github.com/aotter/mantle/blob/develop/CONTRIBUTING.md).
|
|
21
|
+
|
|
22
|
+
Outputs include `generated.ts`, `schema.sql` and direct operation entries.
|
|
23
|
+
Commit generated output and Wrangler edits; keep `dist/` untracked. Run the same
|
|
24
|
+
generate command with `--check` in CI. Never hand-edit generated files; merge
|
|
25
|
+
manifest/options changes and regenerate. See [service composition](./docs/handbook/cloudflare/service-entry.md)
|
|
26
|
+
for app-owned routing, assets, scheduling, Bun and the generated-output workflow.
|
|
27
|
+
Import `views/<encoded-name>.ts` or `procedures/<encoded-name>.ts` (default export
|
|
28
|
+
and types) to exclude other operations. Apply initial DDL to an empty development
|
|
29
|
+
database; it is not a production migration. Generation performs no database I/O.
|
|
30
|
+
Call `views[name](db, caller, input)` or `procedures[name](db, caller, input)` with
|
|
31
|
+
driver-ready inputs, a native handle (Bun.SQL, bun:sqlite Database or D1 binding)
|
|
32
|
+
and a verified Caller.
|
|
33
|
+
|
|
34
|
+
Validate untrusted input before calling queries and redact native errors at application
|
|
35
|
+
transports. The [query contract](./docs/handbook/guides/native-execution.md#query-inputs-values-and-outcomes)
|
|
36
|
+
defines driver-ready inputs, native results, date-time/date wire forms and failure handling.
|
|
37
|
+
|
|
38
|
+
For transports, `paged/views/<name>.ts` returns `{ rows, nextCursor? }` with keyset paging and
|
|
39
|
+
`validation/<kind>/<name>.ts` checks input against the declared JSON Schema subset; the
|
|
40
|
+
[surface deltas](./docs/handbook/reference/surface.md) define the REST/MCP wire contract.
|
|
41
|
+
Proved internal Views also get paging without a public route/tool: one SELECT
|
|
42
|
+
per page, validated scalar cursor keys and hidden-key removal. Schema tuples
|
|
43
|
+
need indexed order after fixed equality prefixes ([index prefixes](./docs/handbook/reference/schema.md#index-prefixes-for-paged-views)); complete groups and singleton
|
|
44
|
+
joins are supported. Grouping still scans/aggregates its source: inspect EXPLAIN.
|
|
45
|
+
Unsupported internal SQL retains its bare module.
|
|
46
|
+
|
|
47
|
+
Every Schema is a typed **Store** collection:
|
|
48
|
+
`store(db, caller).collection("purchase_requests")` with `findById`, `find` (AND-only `where`, `{ rows, cursor }` keyset pages), `first`,
|
|
49
|
+
`count`, `insert(values)`, OCC `update(id, set, { lock })` and `delete(id, { lock })`. Rows, `where`, `set` and `orderBy` use the
|
|
50
|
+
table's storage column names, lower-case (`requestnumber`, `created_at`), the keys a generated View returns; the generated types
|
|
51
|
+
state column names, value types and the writable columns, and the Store enforces the Schema's row rules (scope, TTL, version) but
|
|
52
|
+
**not** a View's or Procedure's `requires`: authorize before calling it. Design, limits and what the runtime still refuses are in
|
|
53
|
+
[Store guide](./docs/handbook/guides/typed-queries.md).
|
|
54
|
+
|
|
55
|
+
For simple creates and partial updates, prefer a declared Store-backed ref
|
|
56
|
+
Procedure: await the caller-bound insert/update, return an allowlist with the
|
|
57
|
+
actual returned `id`/`version`, and preserve omitted fields. Keep Procedure
|
|
58
|
+
`requires` and boundary validation; Store row policy is not operation
|
|
59
|
+
permission. Retain SQL Procedures for atomic conditional/multi-entity writes
|
|
60
|
+
such as stock/order changes and additive upserts. D1 batches cannot consume a
|
|
61
|
+
prior step's result and have no interactive transaction callback. See the
|
|
62
|
+
[write design guidance](./docs/handbook/guides/typed-queries.md#prefer-store-backed-ref-procedures-for-simple-writes).
|
|
63
|
+
|
|
64
|
+
Importing generated modules does not initialize the Store. The first `store()`
|
|
65
|
+
call prepares its metadata factory once; every call binds its own database,
|
|
66
|
+
Caller and handlers. Unused Stores still tree-shake out of direct operations.
|
|
67
|
+
|
|
68
|
+
`find({ search: "text" })` and `first({ search: "text" })` match an exact id or
|
|
69
|
+
the Schema's `searchableFields`. Search is trimmed, must be non-empty and cannot contain NUL; it
|
|
70
|
+
combines with `where`, scope, TTL and publication rules. SQLite/D1 use the
|
|
71
|
+
generated FTS5 trigram index with maintenance triggers (queries shorter than
|
|
72
|
+
three characters use LIKE); PostgreSQL uses ILIKE without requiring an extension.
|
|
73
|
+
`%`, `_`, quotes and FTS operators are literal text. Schemas without search fields
|
|
74
|
+
match id only. Non-ASCII case folding follows the dialect: SQLite/D1 FTS5
|
|
75
|
+
trigram folds searchable text for queries of three or more characters, while
|
|
76
|
+
shorter SQLite/D1 LIKE queries fold ASCII only; PostgreSQL ILIKE follows the
|
|
77
|
+
database locale/collation. These are the same native differences as 0.2.
|
|
78
|
+
Generated Views reuse Core's `mantle.search(alias, input.q)` and
|
|
79
|
+
`mantle.search_rank(alias)`; ranking requires search on the same alias/query.
|
|
80
|
+
Rank-ordered exposed Views still need supported keyset ordering; use an internal
|
|
81
|
+
View for arbitrary rank ordering. Applying changed search DDL remains the app's
|
|
82
|
+
migration responsibility; no request runs DDL or rebuilds indexes.
|
|
83
|
+
|
|
84
|
+
## Independently accept user-facing work
|
|
85
|
+
|
|
86
|
+
Before reporting any user-facing deliverable as done, follow the version-matched
|
|
87
|
+
[independent acceptance guide](./docs/handbook/guides/agent-workflow-acceptance.md)
|
|
88
|
+
with a fresh agent on the surface its user uses. For MCP work, also run the
|
|
89
|
+
guide's design audit before implementing tools; scripted checks remain separate
|
|
90
|
+
evidence.
|
|
91
|
+
|
|
92
|
+
## Publishing
|
|
93
|
+
|
|
94
|
+
Schemas default to `lifecycle: operational`. Opt-in `lifecycle: publishing` adds status
|
|
95
|
+
(`draft` default, `published`, `archived`), nullable `published_at` and a scope-aware
|
|
96
|
+
`(published_at, id)` index; `published_at` is selectable in Views and orders Store `find`
|
|
97
|
+
(`NULLS LAST`). Generated `<table>.publish`, `.unpublish` and `.archive` Procedures take
|
|
98
|
+
`{ id, expectedVersion }`, gate admin/system callers and run one atomic UPDATE; a failed guard is
|
|
99
|
+
`CONFLICT`. Store writes cannot set status or `published_at`. Public Views see published rows only;
|
|
100
|
+
other reads expose drafts only to admin or system callers.
|
|
101
|
+
|
|
102
|
+
## Ref Procedures
|
|
103
|
+
|
|
104
|
+
A Procedure with a `ref` handler generates a typed `Handlers` interface. `mantle generate` lists the
|
|
105
|
+
handlers to implement; pass them at `store(db, caller, { handlers })` (required by type when the
|
|
106
|
+
manifest declares ref Procedures) and run `tsc --noEmit`. A handler receives `{ caller, db, store }`
|
|
107
|
+
bound to the same caller and transaction; the exported `procedures` map holds SQL Procedures only.
|
|
108
|
+
|
|
109
|
+
## Workers build
|
|
110
|
+
|
|
111
|
+
In an application, run generation:
|
|
13
112
|
|
|
14
113
|
```sh
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
For a new application, resolve one published stable version and install it
|
|
19
|
-
exactly. `mantle generate` will declare matching selected packages:
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
MANTLE_VERSION=$(npm view @aotter/mantle@latest version)
|
|
23
|
-
npm install --save-exact "@aotter/mantle@$MANTLE_VERSION"
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## What's inside
|
|
27
|
-
|
|
28
|
-
The umbrella provides Spec and Runtime by default. Install an optional package
|
|
29
|
-
before importing its matching Web, Admin, Auth, Bun, Vercel, Cloudflare, or Admin UI
|
|
30
|
-
subpath. Every sub-package also remains directly installable.
|
|
31
|
-
|
|
32
|
-
| Subpath | Re-exports |
|
|
33
|
-
|---|---|
|
|
34
|
-
| `@aotter/mantle/spec` (or root) | Manifest grammar, validators, JSON-Schema→Zod, diagnostic catalog (no env / no IO) |
|
|
35
|
-
| `@aotter/mantle/runtime` | Hexagonal runtime: domain ports, use cases, infrastructure helpers (no adapter deps) |
|
|
36
|
-
| `@aotter/mantle/runtime/testing` | Node-only crowded SQLite planner and HTTP sampling helpers |
|
|
37
|
-
| `@aotter/mantle/codegen` | Pure linked manifests or compiled plan → typed runtime module emitter (no IO) |
|
|
38
|
-
| `@aotter/mantle/web` | Optional HTML, Markdown, `llms.txt`, sitemap, SEO, and preview composition (no routes or platform deps) |
|
|
39
|
-
| `@aotter/mantle/admin` | Optional Admin API, auth routes, and static-asset composition |
|
|
40
|
-
| `@aotter/mantle/auth` | Optional host-neutral Better Auth identity; adapters own IP headers and storage bindings |
|
|
41
|
-
| `@aotter/mantle/bun` | Bun adapter — caller-owned `bun:sqlite` and Web-standard View/Trigger transport |
|
|
42
|
-
| `@aotter/mantle/vercel` | Vercel Functions adapter — injected durable storage and platform `waitUntil` |
|
|
43
|
-
| `@aotter/mantle/vercel/libsql` | Optional application-owned Turso/libSQL driver |
|
|
44
|
-
| `@aotter/mantle/cloudflare` | Cloudflare Workers adapter — D1, Workers Cache, R2, and Better Auth 1.7 MCP/CIMD |
|
|
45
|
-
| `@aotter/mantle/admin-ui` | Pre-built React 19 admin SPA bundle |
|
|
46
|
-
|
|
47
|
-
```ts
|
|
48
|
-
import { linkManifestSet, parseManifestSources } from "@aotter/mantle/spec";
|
|
49
|
-
import { bootMantleRuntime, compileRuntimePlan } from "@aotter/mantle/runtime";
|
|
50
|
-
import { createMantleWeb } from "@aotter/mantle/web";
|
|
51
|
-
import { mountRuntimeEndpoints } from "@aotter/mantle/cloudflare";
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
The umbrella installs only Spec and Runtime. Web, Admin, Auth, Admin UI, Bun,
|
|
55
|
-
Vercel, and Cloudflare are optional peers; install only the subpaths selected
|
|
56
|
-
by the application.
|
|
57
|
-
|
|
58
|
-
The package also installs `mantle` and `mantle-harness`:
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
pnpm exec mantle generate
|
|
62
|
-
pnpm exec mantle generate --check
|
|
63
|
-
pnpm exec mantle skills
|
|
64
|
-
pnpm exec mantle skills --check
|
|
65
|
-
pnpm exec mantle-harness indexes --require-public
|
|
66
|
-
pnpm exec mantle-harness http --base-url http://127.0.0.1:8787 --route page=/en/example
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
`mantle generate --host cf` or `--host chatgpt-sites` assembles a new blank
|
|
70
|
-
app with Spec, Runtime, API, MCP, Admin and Web by default. Use `--features`
|
|
71
|
-
to select a smaller set, including host-free Spec-only. The first run declares
|
|
72
|
-
matching optional dependencies; install them, then rerun. In an existing
|
|
73
|
-
direct-authored app, `generate` keeps its compile behavior: validate
|
|
74
|
-
`./manifests/` and write `.mantle/generated/mantle.ts`. Selected Admin syncs
|
|
75
|
-
its prebuilt SPA to `public/_mantle/admin/`. Generation does not deploy.
|
|
76
|
-
The same pure emitter is available from `@aotter/mantle/codegen` when a host
|
|
77
|
-
wants to own parsing and filesystem IO. TypeScript-authored manifests can pass
|
|
78
|
-
their already-compiled `plan` directly:
|
|
79
|
-
|
|
80
|
-
```ts
|
|
81
|
-
import { emitMantleModule } from "@aotter/mantle/codegen";
|
|
82
|
-
|
|
83
|
-
const emitted = emitMantleModule({ plan });
|
|
84
|
-
if (!emitted.ok) throw new Error(emitted.diagnostics.map(({ message }) => message).join("\n"));
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
```ts
|
|
88
|
-
import { createMantle } from "../.mantle/generated/mantle.js";
|
|
89
|
-
|
|
90
|
-
const mantle = await createMantle({ storage, handlers, ports });
|
|
91
|
-
const notes = await mantle.views.publishedNotes();
|
|
92
|
-
const result = await mantle.procedures.expireOrder(
|
|
93
|
-
{ orderId },
|
|
94
|
-
{ user: null, staff: null, env },
|
|
95
|
-
);
|
|
96
|
-
await mantle.entries.orders.createDraft({ data, authorId: user.id });
|
|
97
|
-
|
|
98
|
-
// The typed projection never hides the underlying Core runtime.
|
|
99
|
-
await mantle.runtime.archive.execute({ id: noteId, ctx });
|
|
114
|
+
pnpm exec mantle generate cloudflare-d1 generated manifests/*.yaml --auth src/auth.ts
|
|
115
|
+
pnpm exec wrangler deploy
|
|
116
|
+
# or: pnpm exec wrangler dev --local
|
|
100
117
|
```
|
|
101
118
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
use generated `bindMantle(runtime)`, or skip code generation and call
|
|
106
|
-
`runtime.executeView({ view: "published-notes" })` directly.
|
|
107
|
-
|
|
108
|
-
Start with [Project layout and CLI](docs/handbook/start/project-and-cli.md).
|
|
109
|
-
The [local Admin OTP](docs/handbook/start/quickstart-admin.md) tutorial remains
|
|
110
|
-
for apps that own their Worker entry. Generated apps start with an editable
|
|
111
|
-
blank home and no invented business Schema.
|
|
119
|
+
For `cloudflare-d1` and `cloudflare-postgres`, generation configures Wrangler to run
|
|
120
|
+
`mantle bundle <entry> <outdir>` automatically. Node 22.22 or newer is required. Run from the project root;
|
|
121
|
+
regenerate after manifest or auth option changes.
|
|
112
122
|
|
|
113
|
-
`
|
|
114
|
-
`
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
target one platform stay out of that set and are opt-in. Both tool layouts
|
|
118
|
-
receive identical bytes; `--check` detects drift without writing. An older
|
|
119
|
-
project may also carry `.agent/skills/`, which is left untouched. Manifest
|
|
120
|
-
generation never rewrites agent instructions.
|
|
123
|
+
`--entry` defaults to `src/worker.ts`, `--outdir` to `dist`; with `--admin`, `--assets` (Wrangler's `assets.directory`) defaults to `<outdir>/client`. `--wrangler` defaults to the
|
|
124
|
+
existing `wrangler.jsonc`, `wrangler.json` or `wrangler.toml`, otherwise `wrangler.jsonc`.
|
|
125
|
+
JSONC edits preserve comments and unrelated settings and are idempotent. A new config
|
|
126
|
+
needs its `name`, `compatibility_date` and bindings filled in. TOML only prints instructions.
|
|
121
127
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
128
|
+
esbuild emits minified split ESM into `<outdir>/worker`; Wrangler uploads it with `no_bundle`,
|
|
129
|
+
`find_additional_modules`, `base_dir` and an ESModule rule. Generation ensures
|
|
130
|
+
`nodejs_compat` and defaults to `global_fetch_strictly_public`, including explicit
|
|
131
|
+
environment flag overrides; see [Workers deployment](./docs/handbook/cloudflare/deploy-and-operate.md).
|
|
132
|
+
The metafile guard rejects `better-auth` / `@better-auth/*` in the static startup graph:
|
|
133
|
+
use `authLoader(() => import(...))` ([Auth](./docs/handbook/cloudflare/authentication.md#worker-entry)).
|
|
134
|
+
The Worker directory is cleaned first; keep source and generated code elsewhere. A Worker that imports
|
|
135
|
+
`@aotter/mantle-admin/server` also gets Admin, built with Vite into `<assets>/admin` (default `<outdir>/client/admin`)
|
|
136
|
+
from `admin.tsx` beside the entry or the built-in entry. The built-in entry is skipped while the installed
|
|
137
|
+
Admin and its direct dependencies are unchanged; an `admin.tsx` entry builds every time.
|
|
126
138
|
|
|
127
|
-
##
|
|
139
|
+
## D1 Sessions
|
|
128
140
|
|
|
129
|
-
|
|
141
|
+
D1's session handle already satisfies generated Views/Procedures and the Store's structural `db` type:
|
|
130
142
|
|
|
131
143
|
```ts
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
`createMantleWorker` owns conventional D1/assets bindings, Auth, Admin,
|
|
139
|
-
manifest REST/HTTP routes, OAuth, MCP, cache safety, and rejection-safe
|
|
140
|
-
per-isolate boot. Use its single `extend` seam for application handlers and
|
|
141
|
-
new Hono routes; use the public low-level exports when the deployment does not
|
|
142
|
-
fit the conventional binding or lifecycle contract.
|
|
143
|
-
|
|
144
|
-
Conventional Auth requires an explicit `MANTLE_AUTH_MODE`: `self-managed`
|
|
145
|
-
uses the site's GitHub OAuth credentials, while `hosted` uses a same-origin
|
|
146
|
-
Mantle Hosted Auth PKCE client. Missing, invalid, partial, or mixed-mode
|
|
147
|
-
configuration keeps public routes available but returns `503 setup_incomplete`
|
|
148
|
-
from Auth-owned private routes. Pass `auth: (env) => Auth` only when the site
|
|
149
|
-
needs to replace this conventional factory; Core still owns the Auth routes.
|
|
150
|
-
The exact bindings and validation rules are in the
|
|
151
|
-
`node_modules/@aotter/mantle-cloudflare/README.md`, under “Conventional Auth”
|
|
152
|
-
(path relative to the application root).
|
|
153
|
-
|
|
154
|
-
Extensions may add routes but may not replace Core surfaces. These paths are
|
|
155
|
-
reserved:
|
|
156
|
-
|
|
157
|
-
- `/admin` and `/admin/*`
|
|
158
|
-
- `/_mantle` and `/_mantle/*`
|
|
159
|
-
- `/api/auth` and `/api/auth/*`
|
|
160
|
-
- `/api/views` and `/api/views/*`
|
|
161
|
-
- `/oauth` and `/oauth/*`
|
|
162
|
-
- `/mcp` and `/mcp/*`
|
|
163
|
-
- `/.well-known/oauth*`
|
|
164
|
-
- global `*` and `/*` handlers
|
|
165
|
-
|
|
166
|
-
A custom Auth factory's `basePath` and exact manifest-owned method/path pairs
|
|
167
|
-
are also reserved at assembly. Static literal conflicts fail TypeScript during
|
|
168
|
-
the consumer build. Computed paths cannot be proven statically, so the facade
|
|
169
|
-
checks Hono's assembled route table and fails closed before serving requests.
|
|
170
|
-
There is no standard-route override option.
|
|
171
|
-
|
|
172
|
-
Cloudflare projects may expose an independently installed Admin bundle and the
|
|
173
|
-
application's own frontend assets through one native binding:
|
|
174
|
-
|
|
175
|
-
```toml
|
|
176
|
-
[assets]
|
|
177
|
-
directory = "./public"
|
|
178
|
-
binding = "ASSETS"
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
Declare browser, Admin, and MCP identity once. Multiple renditions are allowed;
|
|
182
|
-
keep SVG as the source and add PNG renditions when a target MCP client requires
|
|
183
|
-
the baseline raster formats:
|
|
184
|
-
|
|
185
|
-
```ts
|
|
186
|
-
siteDefaults: {
|
|
187
|
-
icons: [
|
|
188
|
-
{ src: "/site-icon.png", mimeType: "image/png", sizes: ["64x64"] },
|
|
189
|
-
{ src: "/site-icon.svg", mimeType: "image/svg+xml", sizes: ["any"] },
|
|
190
|
-
],
|
|
191
|
-
}
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
Keep both files in the project's `public/` directory. They are one site
|
|
195
|
-
identity reused by browser favicons, Admin chrome, and MCP `serverInfo.icons`;
|
|
196
|
-
PNG is the compatibility rendition and SVG remains the editable source.
|
|
197
|
-
|
|
198
|
-
For an uncommon deployment that must own the top-level assembly, use the
|
|
199
|
-
embedded [`docs/handbook/cloudflare/low-level-composition.md`](docs/handbook/cloudflare/low-level-composition.md)
|
|
200
|
-
fixture. It composes the same public primitives without importing package
|
|
201
|
-
internals or rebuilding Mantle's adapters.
|
|
202
|
-
|
|
203
|
-
## Getting started
|
|
204
|
-
|
|
205
|
-
Cold start from GitHub or a marketplace host:
|
|
206
|
-
|
|
207
|
-
```sh
|
|
208
|
-
npx skills add aotter/mantle
|
|
144
|
+
const bookmark = request.headers.get("x-d1-bookmark");
|
|
145
|
+
const session = env.DB.withSession(bookmark ?? "first-unconstrained");
|
|
146
|
+
const rows = await views.catalog(session, caller, {});
|
|
147
|
+
const data = store(session, caller); // use the same handle for Store operations
|
|
148
|
+
return Response.json(rows, { headers: { "x-d1-bookmark": session.getBookmark() ?? "" } });
|
|
209
149
|
```
|
|
210
150
|
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
The [minimal Worker reference](docs/examples/host-minimal-worker/README.md) is
|
|
216
|
-
the embed / adapter path without Admin. The
|
|
217
|
-
[local Admin OTP reference](docs/examples/host-local-admin-otp/README.md) is the
|
|
218
|
-
opt-in Dev UI path. Neither is a scaffold command. Admin is optional.
|
|
151
|
+
Return `session.getBookmark()` in a header or cookie and have the client pass it back on the next request.
|
|
152
|
+
Keep `resolveCaller` and Better Auth on `env.DB`: revocation and roles must read the primary.
|
|
153
|
+
Enable [read replication](https://developers.cloudflare.com/d1/best-practices/read-replication/)
|
|
154
|
+
on the database (dashboard or REST); writes always go to the primary.
|
|
219
155
|
|
|
220
|
-
##
|
|
156
|
+
## Store transactions
|
|
221
157
|
|
|
222
|
-
|
|
223
|
-
|
|
158
|
+
Writes are lazy thenables: await `collection.insert/update/delete(...)` to execute once,
|
|
159
|
+
or pass unused Writes from the same Store to `store.batch([...])` for atomic results in input order;
|
|
160
|
+
a stale lock, excluded row or unique clash rolls back the whole batch with `CONFLICT`.
|
|
161
|
+
A batch step cannot use a previous step's result. D1 supports only batch.
|
|
162
|
+
On bun:sqlite and PostgreSQL, `store.transaction(async tx => { ... })` binds `collection`, `views`
|
|
163
|
+
and `procedures` to one transaction: resolve commits, throw rolls back; nested transactions and `tx.batch` are refused.
|
|
164
|
+
PostgreSQL defaults to serializable; `{ isolation: "read committed" }` selects another level. There is no automatic retry.
|
|
165
|
+
SQLite uses BEGIN IMMEDIATE and queues all Store/generated driver calls on the same Database until COMMIT/ROLLBACK;
|
|
166
|
+
Inside a transaction callback the outer Store or handle passed to a Mantle driver throws `INPUT_VALIDATION_FAILED`; use `tx`.
|
|
224
167
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
Claude Code and Codex can install the plugin, then run that skill:
|
|
168
|
+
Views return rows; Procedures return `{ results }`. See the [query contract](./docs/handbook/guides/native-execution.md#query-inputs-values-and-outcomes)
|
|
169
|
+
for atomicity and uncertain writes.
|
|
230
170
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
/
|
|
234
|
-
/plugin install mantle@mantle
|
|
171
|
+
PostgreSQL handles (Bun.SQL, postgres.js) satisfy the two-method `Postgres` shape as they are; see the [contract](./docs/handbook/guides/native-execution.md).
|
|
172
|
+
Unsupported declarations fail generation with diagnostics;
|
|
173
|
+
see the [supported/refused list](./docs/handbook/reference/features.md) for current scope and planned features.
|
|
235
174
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
175
|
+
Native contributor checks run all four hosts with independent SQL oracles and
|
|
176
|
+
fresh PostgreSQL schemas; behavior follows each engine. Local Cloudflare checks
|
|
177
|
+
create no cloud resources. Performance claims need a quiet machine and raw samples.
|
|
178
|
+
The [size and startup gates](./docs/handbook/guides/size-and-startup.md) cover the
|
|
179
|
+
bundle and package budgets. The private compiler ships in this SDK and stays outside request imports.
|
|
240
180
|
|
|
241
|
-
|
|
242
|
-
`.cursor-plugin/plugin.json` and `.copilot-plugin/plugin.json` after the repo
|
|
243
|
-
is cloned or opened. Still start from the `npx skills add` sentence (or open
|
|
244
|
-
`skills/install/SKILL.md`). Untagged `aotter/mantle` resolves to `main`, which
|
|
245
|
-
can contain a source-only hotfix ahead of the latest npm release. Add
|
|
246
|
-
`@vX.Y.Z` only to reproduce an older project; never point a consumer at
|
|
247
|
-
`develop` or another moving branch.
|
|
181
|
+
## Data paths and migrations
|
|
248
182
|
|
|
249
|
-
|
|
183
|
+
Writes use Store or declared Procedures, never raw SQL writes that bypass scope, TTL, publishing and system columns. Internal Views are for joins, aggregates, OR and reusable reads. Store findById/find/first remain useful for simple handler lookups and partial adoption in existing TypeScript/Node apps using their own native handle and verified Caller.
|
|
250
184
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
```txt
|
|
254
|
-
Use repo-local mantle:plugin to install <plugin slug or recipe URL> in this repo.
|
|
255
|
-
Use repo-local mantle:plugin to update <plugin id> in this repo.
|
|
256
|
-
Use repo-local mantle:plugin to remove <plugin id> from this repo.
|
|
257
|
-
```
|
|
185
|
+
The runtime never creates, alters or checks tables; boot and requests run no DDL. Apply initial schema.sql plus selected auth/site DDL to an empty database. For each later change, the app's agent diffs regenerated SQL, writes a native migration, rehearses it on a copy and applies it before deploying code. Destructive/type changes need explicit data migration; Mantle drops nothing.
|
|
258
186
|
|
|
259
|
-
|
|
260
|
-
plugin source, Mantle version range, files/atoms/routes/tools, adapter
|
|
261
|
-
requirements, secrets, and checks. The agent applies the recipe through the
|
|
262
|
-
Core-owned `mantle:plugin` skill and records it in `.mantle/plugins.json` plus
|
|
263
|
-
`.mantle/plugins.lock.json`. There is no `mantle plugin add` CLI yet.
|
|
264
|
-
|
|
265
|
-
## Adapter targets
|
|
266
|
-
|
|
267
|
-
| Adapter | Status |
|
|
268
|
-
|---|---|
|
|
269
|
-
| Bun | ✅ shipping |
|
|
270
|
-
| Vercel Functions (Node.js) | ✅ shipping |
|
|
271
|
-
| Cloudflare Workers | ✅ shipping |
|
|
272
|
-
|
|
273
|
-
The `mantle-runtime` package never imports platform-specific types — adapters
|
|
274
|
-
bind concrete storage and lifecycle primitives to Core ports, so adding a new
|
|
275
|
-
adapter is a port-implementation exercise, not a runtime refactor.
|
|
276
|
-
|
|
277
|
-
## Documentation
|
|
278
|
-
|
|
279
|
-
- The handbook is the user documentation and ships inside this npm package:
|
|
280
|
-
`node_modules/@aotter/mantle/docs/handbook/` (start, concepts, Cloudflare
|
|
281
|
-
guides, example redirects, reference; `navigation.json` lists every page in order).
|
|
282
|
-
Worked Manifests live in `node_modules/@aotter/mantle/docs/examples/`
|
|
283
|
-
([index](docs/examples/README.md)).
|
|
284
|
-
The copy in `node_modules` describes the installed release.
|
|
285
|
-
- Embedded docs and agent skills ship inside this npm package for
|
|
286
|
-
agents working from the installed package:
|
|
287
|
-
- `node_modules/@aotter/mantle/docs/handbook/reference/manifest.md`
|
|
288
|
-
- `node_modules/@aotter/mantle/docs/examples/cf-primitives-guarded-api.md` (anonymous,
|
|
289
|
-
API-key, paid guard, personal-token, OAuth, REST, and MCP examples)
|
|
290
|
-
- `node_modules/@aotter/mantle/docs/handbook/cloudflare/media-r2.md` (Cloudflare R2 adapter recipe)
|
|
291
|
-
- `node_modules/@aotter/mantle/docs/handbook/cloudflare/deferred-hooks-queues.md` (versioned
|
|
292
|
-
Queue wiring, retry/DLQ, idempotency, and delivery guarantees)
|
|
293
|
-
- `node_modules/@aotter/mantle/docs/handbook/reference/schema.md` (Schema grammar,
|
|
294
|
-
ordered composite JSON-field indexes and the safe Procedure SQL helper)
|
|
295
|
-
- `node_modules/@aotter/mantle/docs/performance-harness.md` (crowded SQLite,
|
|
296
|
-
Wrangler-local D1 origin paths and coding-agent guardrails)
|
|
297
|
-
- `node_modules/@aotter/mantle/docs/adr/`
|
|
298
|
-
- `node_modules/@aotter/mantle/skills/develop/SKILL.md`
|
|
299
|
-
- `node_modules/@aotter/mantle/skills/plugin/SKILL.md`
|
|
300
|
-
- `node_modules/@aotter/mantle/skills/theme/SKILL.md`
|
|
301
|
-
- `node_modules/@aotter/mantle/skills/update/SKILL.md`
|
|
302
|
-
- `node_modules/@aotter/mantle/skills/install/SKILL.md`
|
|
303
|
-
- `node_modules/@aotter/mantle/skills/provision/SKILL.md`
|
|
304
|
-
- [4-atom manifest model (ADR-0001)](docs/adr/0001-four-atom-manifest-model.md)
|
|
305
|
-
- [API and MCP authorization](docs/examples/cf-primitives-guarded-api.md)
|
|
306
|
-
- [Deferred lifecycle Queues](docs/handbook/cloudflare/deferred-hooks-queues.md)
|
|
307
|
-
- [Schema indexes on D1](docs/handbook/reference/schema.md)
|
|
308
|
-
- [Release process](docs/release-process.md)
|
|
309
|
-
- [Source repository](https://github.com/aotter/mantle)
|
|
310
|
-
- [Issues](https://github.com/aotter/mantle/issues)
|
|
311
|
-
|
|
312
|
-
## License
|
|
313
|
-
|
|
314
|
-
Apache-2.0
|
|
315
|
-
|
|
316
|
-
Pure extension routes do not await content preparation. Before an extension
|
|
317
|
-
uses Mantle data or database-backed Auth, await its supplied `getRuntime()`
|
|
318
|
-
(or `ref.get()`). Standard protected routes establish this readiness themselves;
|
|
319
|
-
queue/scheduled handlers continue to use `worker.getRuntime(env)`.
|
|
187
|
+
[Drivers are open structural handles; dialects are exactly postgres and sqlite](./docs/handbook/concepts/runtime-and-adapters.md#drivers-and-dialects).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { BetterAuthOptions } from "@better-auth/core";
|
|
2
|
+
import { type Postgres } from "../kernel/contracts.js";
|
|
3
|
+
import * as bunSql from "../kernel/driver/postgres.js";
|
|
4
|
+
import type { Reader } from "../kernel/driver/d1.js";
|
|
5
|
+
/** Runs one statement; `changes` is the affected-row count. */
|
|
6
|
+
type Exec = (text: string, values: unknown[], protectAdmin?: boolean) => ReturnType<typeof bunSql.run>;
|
|
7
|
+
/** Selected auth queries share this adapter's handle, dialect and Better Auth's physical model/field mapping. */
|
|
8
|
+
/** Better Auth's table and column names for these options (modelName/fieldName mapping); needs no database. */
|
|
9
|
+
export declare function authNames(options: BetterAuthOptions): {
|
|
10
|
+
table: (model: string) => string;
|
|
11
|
+
column: (model: string, field: string) => string;
|
|
12
|
+
has: (model: string, field: string) => boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function nativeAuthRead(options: BetterAuthOptions): {
|
|
15
|
+
table: (model: string) => string;
|
|
16
|
+
column: (model: string, field: string) => string;
|
|
17
|
+
has: (model: string, field: string) => boolean;
|
|
18
|
+
exec: Exec;
|
|
19
|
+
param(n: number): string;
|
|
20
|
+
now(ms: number): Date | string;
|
|
21
|
+
};
|
|
22
|
+
/** The slice of D1 the adapter calls (a real `D1Database` satisfies it). */
|
|
23
|
+
export type D1Like = Reader;
|
|
24
|
+
/** Cloudflare D1 (SQLite). D1 has no interactive transactions, so `transaction` is off and the atomic operations are single statements. */
|
|
25
|
+
export declare function d1Adapter(db: D1Like): (options: BetterAuthOptions) => import("better-auth").DBAdapter<BetterAuthOptions>;
|
|
26
|
+
/**
|
|
27
|
+
* PostgreSQL through Bun.SQL or postgres.js (the `Postgres` contract the data layer uses). Transactions use `begin`,
|
|
28
|
+
* which pins every statement to one connection. On Workers, create the postgres.js client per request (or per isolate
|
|
29
|
+
* with `max: 1`), as for the data layer.
|
|
30
|
+
*/
|
|
31
|
+
export declare function postgresAdapter(sql: Postgres): (options: BetterAuthOptions) => import("better-auth").DBAdapter<BetterAuthOptions>;
|
|
32
|
+
export {};
|