@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
|
@@ -1,258 +1,88 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: develop
|
|
3
|
-
description: Work on
|
|
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
|
|
8
|
-
projection:
|
|
7
|
+
applies_to: mantle 0.2
|
|
8
|
+
projection: package
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Mantle Develop
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
`
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
the
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
|
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
|
|
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
|
|
20
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
38
|
-
|
|
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
|
|
69
|
-
|
|
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
|
|