@ultimat3/cli 29.3.2 → 30.0.0
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/CLAUDE.md +64 -40
- package/README.md +61 -11
- package/package.json +42 -28
- package/src/affected-tests.ts +97 -0
- package/src/affected-unowned.ts +43 -0
- package/src/affected.ts +25 -6
- package/src/app-boundaries.ts +29 -1
- package/src/app-evals.ts +12 -4
- package/src/app-load-unresolved.ts +62 -0
- package/src/app-load.ts +30 -37
- package/src/app-mcp.ts +14 -2
- package/src/app-module-graph.ts +232 -0
- package/src/app-reload-graph.ts +2 -2
- package/src/app-root.ts +37 -1
- package/src/bin.ts +1 -0
- package/src/boundary-findings.ts +6 -0
- package/src/budgets-freshness.ts +32 -0
- package/src/budgets.ts +20 -1
- package/src/build-capture-env.ts +9 -0
- package/src/cdp-shot-a11y.ts +2 -39
- package/src/ci-tested.ts +243 -0
- package/src/client-emit-customer-runtime.ts +139 -0
- package/src/client-emit-customer.ts +108 -0
- package/src/client-emit-drift.ts +72 -0
- package/src/client-emit-header.ts +67 -0
- package/src/client-emit-schemas.ts +175 -0
- package/src/client-emit-types.ts +121 -0
- package/src/client-emit-vendor.ts +146 -0
- package/src/client-errors-routes.ts +229 -0
- package/src/client-errors-script.ts +74 -0
- package/src/client-vitals-route.ts +197 -0
- package/src/client-vitals-script.ts +56 -0
- package/src/cmd-affected.ts +23 -0
- package/src/cmd-build-spec.ts +7 -1
- package/src/cmd-build.ts +35 -9
- package/src/cmd-ci-spec.ts +42 -6
- package/src/cmd-ci.ts +99 -2
- package/src/cmd-client-customer.ts +134 -0
- package/src/cmd-client-source.ts +81 -0
- package/src/cmd-client-spec.ts +48 -0
- package/src/cmd-client-write.ts +41 -0
- package/src/cmd-client.ts +111 -0
- package/src/cmd-db-recount.ts +120 -0
- package/src/cmd-db-spec.ts +36 -6
- package/src/cmd-db.ts +13 -3
- package/src/cmd-deploy-compose.ts +61 -3
- package/src/cmd-deploy-drain.ts +10 -2
- package/src/cmd-deploy-helm.ts +11 -0
- package/src/cmd-deploy-preflight.ts +118 -0
- package/src/cmd-deploy-spec.ts +58 -6
- package/src/cmd-deploy-verify.ts +380 -0
- package/src/cmd-deploy.ts +42 -9
- package/src/cmd-docs.ts +34 -4
- package/src/cmd-doctor.ts +66 -9
- package/src/cmd-drill-spec.ts +25 -0
- package/src/cmd-drill.ts +176 -0
- package/src/cmd-env-init.ts +102 -0
- package/src/cmd-env-spec.ts +10 -3
- package/src/cmd-env.ts +15 -10
- package/src/cmd-errors-recent.ts +60 -0
- package/src/cmd-errors-spec.ts +9 -1
- package/src/cmd-errors.ts +4 -0
- package/src/cmd-exercise-spec.ts +19 -0
- package/src/cmd-exercise.ts +129 -0
- package/src/cmd-generate-spec.ts +9 -1
- package/src/cmd-generate.ts +32 -27
- package/src/cmd-graph-load.ts +97 -0
- package/src/cmd-graph-spec.ts +16 -0
- package/src/cmd-graph.ts +73 -0
- package/src/cmd-i18n.ts +4 -1
- package/src/cmd-impact-spec.ts +13 -0
- package/src/cmd-impact.ts +64 -0
- package/src/cmd-jobs-resolve.ts +76 -0
- package/src/cmd-jobs-spec.ts +21 -2
- package/src/cmd-jobs.ts +10 -6
- package/src/cmd-mail-spec.ts +28 -0
- package/src/cmd-mail.ts +70 -0
- package/src/cmd-mcp-lock.ts +69 -0
- package/src/cmd-mcp-spec.ts +23 -4
- package/src/cmd-mcp.ts +17 -3
- package/src/cmd-new-spec.ts +8 -1
- package/src/cmd-new.ts +61 -9
- package/src/cmd-planned.ts +0 -6
- package/src/cmd-repro-spec.ts +31 -0
- package/src/cmd-repro.ts +174 -0
- package/src/cmd-stop-spec.ts +21 -0
- package/src/cmd-stop.ts +166 -0
- package/src/cmd-test-spec.ts +17 -4
- package/src/cmd-test.ts +70 -14
- package/src/cmd-upgrade-spec.ts +26 -0
- package/src/cmd-upgrade.ts +274 -0
- package/src/cmd-verify-spec.ts +3 -3
- package/src/db-backfill.ts +6 -0
- package/src/db-diagnostics.ts +106 -0
- package/src/db-generate.ts +28 -8
- package/src/db-reset-template.ts +1 -1
- package/src/db-rolling.ts +45 -0
- package/src/db-seed-generate.ts +188 -0
- package/src/deploy-verify-findings.ts +98 -0
- package/src/deploy-verify-flags.ts +109 -0
- package/src/deploy-verify-grade.ts +185 -0
- package/src/deploy-verify-queues.ts +53 -0
- package/src/dev-boot.ts +35 -15
- package/src/dev-child-watch.ts +16 -4
- package/src/dev-dashboard-guard.ts +8 -1
- package/src/dev-dashboard.ts +7 -0
- package/src/dev-lock-identity.ts +61 -0
- package/src/dev-lock-port-holder.ts +80 -0
- package/src/dev-lock-steal.ts +124 -0
- package/src/dev-lock.ts +92 -120
- package/src/dev-mail-templates.ts +51 -0
- package/src/dev-rebuild.ts +26 -2
- package/src/dev-route-table.ts +17 -0
- package/src/dev-supervisor.ts +5 -2
- package/src/dev-watch-tree.ts +11 -10
- package/src/dev-watch.ts +1 -1
- package/src/dispatch.ts +29 -6
- package/src/docs-section.ts +69 -0
- package/src/docs-sources.ts +100 -0
- package/src/doctor-auth.ts +11 -2
- package/src/doctor-chart-alerts.ts +55 -0
- package/src/doctor-pooler.ts +107 -0
- package/src/doctor-rolling.ts +35 -0
- package/src/doctor-row-security.ts +40 -0
- package/src/document-options.ts +13 -0
- package/src/drill-sync-lane.ts +25 -0
- package/src/drill-targets.ts +39 -0
- package/src/duplicate-packages.ts +1 -1
- package/src/env-production.ts +93 -0
- package/src/error-codes-shot.ts +59 -0
- package/src/error-codes-tooling.ts +29 -0
- package/src/error-codes.ts +100 -54
- package/src/error-contract.ts +2 -2
- package/src/errors.ts +22 -3
- package/src/exercise-database.ts +99 -0
- package/src/exercise-findings.ts +159 -0
- package/src/exercise-overrides.ts +42 -0
- package/src/exercise-registration.ts +58 -0
- package/src/exercise-static.ts +88 -0
- package/src/exercise-subject.ts +69 -0
- package/src/failure-capture-boot.ts +30 -0
- package/src/framework-env.ts +7 -1
- package/src/framework-schema.ts +72 -5
- package/src/generate-catalog-locales.ts +19 -0
- package/src/generate-chart-alerts.ts +156 -0
- package/src/generate-feature-required.ts +65 -0
- package/src/generate-feature.ts +83 -6
- package/src/generate-files.ts +24 -0
- package/src/generate-format-written.ts +32 -0
- package/src/generate-kinds.ts +6 -0
- package/src/generate-sign-in-config.ts +100 -0
- package/src/generate-sign-in-manifest.ts +28 -0
- package/src/generate-sign-in-mode.ts +101 -0
- package/src/generate-sign-in.ts +250 -0
- package/src/generate-write.ts +44 -7
- package/src/hand-rolled-socket.ts +72 -0
- package/src/i18n-app-key-shapes.ts +29 -0
- package/src/i18n-audit.ts +10 -3
- package/src/i18n-registration.ts +18 -3
- package/src/index.ts +2 -0
- package/src/island-bundle.ts +4 -3
- package/src/island-disposer.ts +116 -0
- package/src/island-realtime-state.ts +34 -6
- package/src/island-realtime.ts +6 -2
- package/src/island-routes.ts +3 -2
- package/src/isr-query-advice.ts +6 -11
- package/src/isr-query-guard.ts +4 -3
- package/src/job-budget.ts +95 -0
- package/src/jobs-json.ts +11 -0
- package/src/lint-findings.ts +104 -0
- package/src/local-cli.ts +34 -4
- package/src/loopback-host.ts +2 -2
- package/src/mail-preview-findings.ts +24 -0
- package/src/mcp-errors.ts +82 -2
- package/src/mcp-host.ts +11 -1
- package/src/mcp-lock-findings.ts +57 -0
- package/src/measure-paths.ts +12 -4
- package/src/measure-scope.ts +27 -13
- package/src/messages-client.ts +23 -0
- package/src/messages-db.ts +56 -0
- package/src/messages-gate.ts +107 -0
- package/src/messages-repro.ts +11 -0
- package/src/messages-shot.ts +51 -0
- package/src/messages-upgrade.ts +45 -0
- package/src/messages.ts +53 -178
- package/src/metrics-endpoint.ts +23 -5
- package/src/new-shapes-generate.ts +71 -0
- package/src/new-shapes.ts +63 -0
- package/src/openapi-compile-ir.ts +68 -0
- package/src/openapi-compile-schema.ts +284 -0
- package/src/openapi-compile.ts +273 -0
- package/src/openapi-refuse.ts +45 -0
- package/src/otlp-export.ts +2 -1
- package/src/output-findings.ts +123 -0
- package/src/output.ts +32 -8
- package/src/package-boundaries.ts +110 -0
- package/src/page-pins.ts +23 -0
- package/src/plain-routes.ts +13 -0
- package/src/prerender-entries.ts +59 -0
- package/src/prerender-heaviest.ts +27 -0
- package/src/prerender-preload.ts +6 -0
- package/src/prerender-report.ts +12 -0
- package/src/prerender-seo-reads.ts +38 -0
- package/src/prerender-served.ts +22 -7
- package/src/prerender-vitals.ts +42 -0
- package/src/prerender.ts +61 -32
- package/src/pwa-artifacts.ts +4 -3
- package/src/pwa-manifest-locales.ts +1 -1
- package/src/registry.ts +18 -0
- package/src/repro-bundle.ts +65 -0
- package/src/repro-errors.ts +47 -0
- package/src/repro-job.ts +72 -0
- package/src/repro-literal.ts +41 -0
- package/src/repro-request.ts +48 -0
- package/src/repro-write.ts +100 -0
- package/src/retain-sweep.ts +27 -0
- package/src/retained-assets-boot.ts +113 -0
- package/src/retained-assets-layout.ts +110 -0
- package/src/retained-assets-read.ts +142 -0
- package/src/retained-assets-sweep.ts +70 -0
- package/src/retained-assets.ts +171 -0
- package/src/revalidated-response.ts +8 -5
- package/src/role-replicator.ts +7 -1
- package/src/role-start-devices.ts +119 -0
- package/src/role-start-types.ts +6 -0
- package/src/role-start.ts +22 -5
- package/src/role-sync.ts +7 -1
- package/src/route-islands.ts +42 -0
- package/src/route-table.ts +2 -1
- package/src/row-security-boot.ts +58 -0
- package/src/row-security-wanted.ts +32 -0
- package/src/runtime-admin.ts +0 -1
- package/src/runtime-assets-site-cache.ts +55 -0
- package/src/runtime-assets-site.ts +136 -0
- package/src/runtime-assets.ts +99 -55
- package/src/runtime-bindings.ts +19 -3
- package/src/runtime-cache.ts +23 -14
- package/src/runtime-isr-outcome.ts +114 -60
- package/src/runtime-purge.ts +14 -2
- package/src/runtime-queue.ts +31 -4
- package/src/runtime-render-document.ts +204 -0
- package/src/runtime-render.ts +48 -198
- package/src/runtime-replica-position.ts +62 -0
- package/src/runtime-replica.ts +18 -3
- package/src/runtime-s3-path-style.ts +17 -0
- package/src/runtime-services.ts +19 -6
- package/src/runtime-statement-bound.ts +22 -0
- package/src/runtime-storage-upload.ts +9 -0
- package/src/runtime-storage.ts +42 -138
- package/src/schema-diff-views.ts +54 -0
- package/src/schema-diff.ts +21 -3
- package/src/schema-drift.ts +28 -9
- package/src/schema-dump-drift.ts +91 -7
- package/src/script-csp.ts +1 -1
- package/src/seo-cards.ts +26 -0
- package/src/seo-routes.ts +22 -8
- package/src/serve-boot.ts +54 -21
- package/src/serve-drain.ts +1 -0
- package/src/serve-env.ts +26 -8
- package/src/serve-retire.ts +12 -6
- package/src/serve-web.ts +42 -4
- package/src/serve.ts +9 -7
- package/src/site-asset-routes.ts +17 -27
- package/src/site-config.ts +4 -0
- package/src/site-llms-pages.ts +106 -0
- package/src/site-llms.ts +64 -0
- package/src/site-seo-write.ts +4 -2
- package/src/site-seo.ts +55 -6
- package/src/source-mtime.ts +50 -0
- package/src/static-capture-errors.ts +41 -0
- package/src/static-capture.ts +56 -0
- package/src/static-cards-serve.ts +39 -0
- package/src/static-cards.ts +93 -0
- package/src/static-document.ts +14 -13
- package/src/static-images.ts +115 -0
- package/src/stream-hole-scope.ts +55 -0
- package/src/style-bundle.ts +1 -1
- package/src/style-routes.ts +3 -2
- package/src/sw-precache-plan.ts +2 -2
- package/src/sw-routes.ts +2 -2
- package/src/templates/action-tests.ts +306 -0
- package/src/templates/action.ts +81 -269
- package/src/templates/backfill.ts +1 -1
- package/src/templates/entity.ts +21 -5
- package/src/templates/github/ci.yml.ts +8 -9
- package/src/templates/guard-bare-error.ts +2 -2
- package/src/templates/guard-error-declared.ts +263 -0
- package/src/templates/guard-native-confirm.ts +132 -0
- package/src/templates/guard-raw-fetch.ts +151 -0
- package/src/templates/guard-raw-interval.ts +121 -0
- package/src/templates/guard-repo-raw-sql.ts +71 -2
- package/src/templates/job.ts +1 -1
- package/src/templates/naming.ts +5 -0
- package/src/templates/pinned/docker-compose.yml +6 -0
- package/src/templates/pinned-images.ts +8 -0
- package/src/templates/policy.ts +85 -2
- package/src/templates/query.ts +70 -13
- package/src/templates/resource-create.ts +3 -1
- package/src/templates/resource-form-island.ts +15 -4
- package/src/templates/resource-page-db.ts +83 -0
- package/src/templates/resource-page.ts +161 -52
- package/src/templates/route.ts +4 -6
- package/src/templates/scaffold-app.ts +3 -0
- package/src/templates/scaffold-auth.ts +2 -1
- package/src/templates/scaffold-bin.ts +5 -52
- package/src/templates/scaffold-claude-agents.ts +19 -19
- package/src/templates/scaffold-claude-commands.ts +28 -31
- package/src/templates/scaffold-claude.ts +26 -23
- package/src/templates/scaffold-container-compose.ts +6 -1
- package/src/templates/scaffold-container.ts +24 -4
- package/src/templates/scaffold-dashboard-bare.ts +3 -3
- package/src/templates/scaffold-dashboard-example-tests.ts +49 -9
- package/src/templates/scaffold-dashboard-example-view.ts +156 -0
- package/src/templates/scaffold-dashboard-example.ts +43 -131
- package/src/templates/scaffold-dashboard-shared.ts +3 -7
- package/src/templates/scaffold-db-client.ts +20 -6
- package/src/templates/scaffold-db-package.ts +5 -14
- package/src/templates/scaffold-docs.ts +73 -57
- package/src/templates/scaffold-domain-package.ts +18 -14
- package/src/templates/scaffold-entries.ts +7 -2
- package/src/templates/scaffold-exercise.ts +37 -0
- package/src/templates/scaffold-guards.ts +13 -1
- package/src/templates/scaffold-helm-alerts.ts +234 -0
- package/src/templates/scaffold-helm-templates.ts +7 -5
- package/src/templates/scaffold-helm.ts +46 -12
- package/src/templates/scaffold-i18n.ts +6 -2
- package/src/templates/scaffold-mcp-endpoint.ts +182 -0
- package/src/templates/scaffold-mcp-json.ts +31 -0
- package/src/templates/scaffold-mcp-package.ts +59 -56
- package/src/templates/scaffold-repo.ts +7 -2
- package/src/templates/scaffold-shell.ts +45 -79
- package/src/templates/scaffold-test-services.ts +13 -5
- package/src/templates/shapes/api-keys.ts +170 -0
- package/src/templates/shapes/api.ts +101 -0
- package/src/templates/shapes/blog-site.ts +340 -0
- package/src/templates/shapes/blog-slice.ts +265 -0
- package/src/templates/shapes/blog.ts +114 -0
- package/src/templates/shapes/dashboard-detail.ts +242 -0
- package/src/templates/shapes/dashboard.ts +53 -0
- package/src/templates/shapes/index.ts +17 -0
- package/src/templates/shapes/overlay.ts +99 -0
- package/src/templates/shapes/shared-edits.ts +46 -0
- package/src/templates/sign-in-action-tests.ts +237 -0
- package/src/templates/sign-in-authenticator.ts +112 -0
- package/src/templates/sign-in-oidc.ts +189 -0
- package/src/templates/sign-in-pages.ts +148 -0
- package/src/templates/sign-in-password.ts +216 -0
- package/src/templates/sign-in-shared.ts +268 -0
- package/src/templates/slice-foundation.ts +70 -15
- package/src/test-batches.ts +1 -1
- package/src/test-database.ts +1 -1
- package/src/test-shards.ts +7 -1
- package/src/test-workers.ts +18 -12
- package/src/tool-gate-names.ts +34 -0
- package/src/upgrade-agents-link.ts +49 -0
- package/src/upgrade-bun-floor.ts +225 -0
- package/src/upgrade-gate.ts +228 -0
- package/src/upgrade-pins.ts +63 -0
- package/src/upgrade-plan.ts +214 -0
- package/src/upgrade-registry.ts +53 -0
- package/src/upgrade-report.ts +139 -0
- package/src/upgrade-root.ts +74 -0
- package/src/verify-budgets-build.ts +118 -0
- package/src/verify-checks.ts +67 -24
- package/src/verify-coverage-run.ts +1 -1
- package/src/verify-e2e-lane.ts +41 -0
- package/src/verify-exercise.ts +64 -0
- package/src/verify-floor.ts +41 -0
- package/src/verify-merge.ts +19 -4
- package/src/verify-role-load.ts +2 -0
- package/src/verify-run.ts +28 -8
- package/src/verify-shard.ts +12 -2
- package/src/verify-skip-ceiling.ts +87 -0
- package/src/verify-step.ts +5 -0
- package/src/verify-tests.ts +25 -5
- package/src/view-drift.ts +55 -0
- package/src/worker-bundle.ts +3 -2
- package/src/workspace-graph.ts +38 -19
- package/src/write-generated.ts +43 -0
- package/src/zone-boot.ts +20 -0
- package/wiki/Actions.md +342 -0
- package/wiki/Admin-Dashboard.md +432 -0
- package/wiki/Agents.md +958 -0
- package/wiki/Auth.md +195 -0
- package/wiki/Bare-VM.md +111 -0
- package/wiki/Batching-And-Preloading.md +136 -0
- package/wiki/Building-Your-Own-Base.md +203 -0
- package/wiki/CI-Parallel-Gate.md +220 -0
- package/wiki/CLI-Reference.md +1894 -0
- package/wiki/Caching-And-Invalidation.md +255 -0
- package/wiki/Client-Data.md +194 -0
- package/wiki/Client-Navigation.md +513 -0
- package/wiki/Compared.md +93 -0
- package/wiki/Configuration.md +868 -0
- package/wiki/Contributing.md +12 -0
- package/wiki/Deploy-Recipes.md +122 -0
- package/wiki/Deployment.md +508 -0
- package/wiki/Entities-And-Migrations.md +1116 -0
- package/wiki/FAQ.md +175 -0
- package/wiki/Feature-Flags.md +65 -0
- package/wiki/Getting-Started.md +221 -0
- package/wiki/Home.md +160 -0
- package/wiki/I18n.md +239 -0
- package/wiki/Installation.md +206 -0
- package/wiki/Interface-Rules.md +339 -0
- package/wiki/Jobs-And-Workflows.md +783 -0
- package/wiki/Known-Gaps.md +185 -0
- package/wiki/MCP-And-AI.md +753 -0
- package/wiki/Mail.md +138 -0
- package/wiki/Migrating-An-Existing-App.md +594 -0
- package/wiki/Migrating-From-Django.md +54 -0
- package/wiki/Migrating-From-Laravel.md +53 -0
- package/wiki/Migrating-From-Node-Drizzle.md +53 -0
- package/wiki/Migrating-From-Rails.md +53 -0
- package/wiki/Migrations-And-Backfills.md +552 -0
- package/wiki/Money.md +338 -0
- package/wiki/N-Plus-One-Detection.md +197 -0
- package/wiki/Notify.md +208 -0
- package/wiki/Observability.md +245 -0
- package/wiki/Outbound-HTTP.md +109 -0
- package/wiki/PWA-And-Offline.md +343 -0
- package/wiki/Policies-And-Authz.md +251 -0
- package/wiki/Project-Layout.md +150 -0
- package/wiki/Queries-And-Live-Queries.md +429 -0
- package/wiki/Realtime.md +734 -0
- package/wiki/Resource-Management.md +121 -0
- package/wiki/Routes-And-Render-Modes.md +521 -0
- package/wiki/SEO.md +288 -0
- package/wiki/Scheduled-Tasks.md +175 -0
- package/wiki/Scraping.md +493 -0
- package/wiki/Shapes.md +63 -0
- package/wiki/Stability.md +97 -0
- package/wiki/Static-Assets.md +166 -0
- package/wiki/Storage-And-Uploads.md +404 -0
- package/wiki/Testing.md +1313 -0
- package/wiki/The-Eight-Primitives.md +247 -0
- package/wiki/Theming.md +362 -0
- package/wiki/Timezones-And-Dates.md +194 -0
- package/wiki/Troubleshooting.md +163 -0
- package/wiki/Tutorial-01-First-App.md +289 -0
- package/wiki/Tutorial-02-First-Feature.md +339 -0
- package/wiki/Tutorial-03-Auth-And-Admin.md +379 -0
- package/wiki/Tutorial-04-Jobs-And-Realtime.md +263 -0
- package/wiki/Tutorial-05-Deploy-Free.md +231 -0
- package/wiki/Tutorial-06-Growing-Up.md +158 -0
- package/wiki/UI-Components.md +156 -0
- package/wiki/Upgrading.md +3667 -0
- package/src/stored-object-headers.ts +0 -43
package/wiki/FAQ.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# FAQ
|
|
2
|
+
|
|
3
|
+
Honest answers. Where something is not built yet, it says so.
|
|
4
|
+
|
|
5
|
+
## Status
|
|
6
|
+
|
|
7
|
+
### Is it production ready?
|
|
8
|
+
|
|
9
|
+
**Yes, for a single-region app on one Postgres, `As of 2026-11`, on the evidence below.** What you can check: [the live demo](https://social-media.ultimate.demo.developerz.ai), built from `dummy/social-media-clone/` and deployed on every push to `main` (`deploy-social-demo.yml`). Two apps in the repository build on it and gate on every push, the demo and the reference app `examples/dummy/` (`scripts/lib/gated-apps.ts`); no production use and no outside adopter is claimed. The API is under semver, and the window and the next major's date are on [Stability](Stability).
|
|
10
|
+
|
|
11
|
+
| Proven | By |
|
|
12
|
+
|---|---|
|
|
13
|
+
| a rolling restart on Kubernetes drops no request | `ci.yml`'s `deploy-proof` job, `docker/deploy-proof/run.sh`: 0 of 9,028 requests failed, `As of 2026-09-24` |
|
|
14
|
+
| a fresh scaffold is green on its first gate run | `ci.yml`'s `scaffold-smoke` job, every push |
|
|
15
|
+
| every package is on npm at one version, published by the workflow over OIDC, attested | `bun run scripts/registry-audit.ts --json`, and `registry-audit.yml` daily |
|
|
16
|
+
| one `sync` node reconnects all 50,000 clients after a forced restart | [`scripts/bench/results/`](https://github.com/developerz-ai/ultimate/tree/main/scripts/bench/results) |
|
|
17
|
+
|
|
18
|
+
What you can install is `npm view @ultimat3/core version`; only the [footer](_Footer) stamps it. How each release was published, the hand-published 2.0.0 included: [`PUBLISHING.md`](https://github.com/developerz-ai/ultimate/blob/main/PUBLISHING.md#publication-history).
|
|
19
|
+
|
|
20
|
+
What it does **not** claim:
|
|
21
|
+
|
|
22
|
+
| Not claimed | Detail |
|
|
23
|
+
|---|---|
|
|
24
|
+
| A multi-node realtime result | the 50k forced-restart benchmark **is** measured and committed, but on **one** `sync` node over `InProcessTransport` — it never crossed NATS. Fanout across nodes, throughput, and per-node socket capacity are all still targets, not results ([Realtime](Realtime)) |
|
|
25
|
+
| A rolling restart on **Compose** | Compose is the single-node rung: one published port has one binder, so a restart there is a restart. The invisible-restart proof is Kubernetes only ([Deployment](Deployment)) |
|
|
26
|
+
| Not shipped, `As of 2026-09-23` | the plugin API, multi-region replication, and the Redis **job** driver — all behind the interfaces that ship today (there is no NATS job driver since 25.0.0). The Redis driver throws `X_NOT_IMPLEMENTED` with a runnable `fix:` line rather than pretending to work |
|
|
27
|
+
|
|
28
|
+
### What is actually finished?
|
|
29
|
+
|
|
30
|
+
All 30 packages, implemented and tested — not skeletons. The eight primitives, HTTP, rendering, caching, realtime tiers 1–3 (tier 3 opt-in, since 21.0.0), auth, mail, storage, jobs, the AI-first surface (MCP, `llm()`, evals), and admin + generators + `x new`. Milestones 0–11 are ✅ and enforced by `x verify`'s `roadmap` step; milestone 11's deploy proof closed `As of 2026-09-24`, when `ci.yml`'s `deploy-proof` job upgraded an app in kind with 0 of 9,028 requests failed (Compose is the single-node rung and makes no invisible-restart claim). Each milestone ends in a **working demo app plus green `x verify`**, and the same demo app grows through all twelve. [`docs/idea/14-roadmap.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/14-roadmap.md) is the source of truth for those markers.
|
|
31
|
+
|
|
32
|
+
### What is left?
|
|
33
|
+
|
|
34
|
+
**No milestone is open**: milestone 11's two-platform deploy proof closed `As of 2026-09-24` (`deploy-proof`, above). The other item that was open at 1.0.0, the **50k-socket forced-restart benchmark**, is measured and committed at 1.1.0: 50,000 sockets, forced `sync` restart, first patch on the reconnected socket at p50 54.0s / p90 105.5s, on one node ([Realtime](Realtime)). Everything in milestones 0–11 is shipped and gated. Scope cuts come off the back, never the middle (M4's budgets). The open defects the current release shipped with are listed on [Known gaps](Known-Gaps).
|
|
35
|
+
|
|
36
|
+
## The stack
|
|
37
|
+
|
|
38
|
+
### Why Bun only?
|
|
39
|
+
|
|
40
|
+
Portability costs a lowest-common-denominator API. Bun-only makes `Bun.sql`, `Bun.redis`, `Bun.s3`, `Bun.serve` WebSockets, `Bun.build`, and `bun test` **language features** instead of dependencies — roughly a thousand transitive packages that never enter the lockfile. Target: under 40 direct dependencies for the whole framework.
|
|
41
|
+
|
|
42
|
+
### Why no Node or Deno support?
|
|
43
|
+
|
|
44
|
+
Multi-runtime means every native gets an adapter, every adapter gets a second behavior, and the second behavior is where bugs live. It would also make the WebSocket cost model — the thing `sync`'s economics depend on — a per-runtime variable. Stated cost: no native-addon packages, and long-running Bun processes are less battle-proven than Node's.
|
|
45
|
+
|
|
46
|
+
### Why no GraphQL?
|
|
47
|
+
|
|
48
|
+
A second schema language, a second authz surface, and a resolver-shaped N+1 factory. Typed `action` + `query` cover the need, and `openapi.json` is generated from them. One authz system is the whole point ([Policies and authz](Policies-And-Authz)).
|
|
49
|
+
|
|
50
|
+
### Why no Tailwind?
|
|
51
|
+
|
|
52
|
+
Tailwind plus modules plus CSS-in-JS in one repo is three token systems and three ways to theme. SCSS modules + design tokens is build-time only, zero runtime, and dark theme is a token flip. See [Theming](Theming).
|
|
53
|
+
|
|
54
|
+
### Why no React, and no RSC?
|
|
55
|
+
|
|
56
|
+
Wrong runtime for RSC, and the mental model taxes exactly the audience being optimized for. Solid's fine-grained reactivity makes streaming shells cost ~0 hydration, and `stream` + `<Hole>` gets the same payoff with no new component dialect.
|
|
57
|
+
|
|
58
|
+
### Why SolidJS and your own router?
|
|
59
|
+
|
|
60
|
+
The router must own render mode, offline strategy, and metadata — those are framework concerns, so it cannot be a third-party dependency that disagrees with the build. `As of 2026-08` the pin is **`solid-js@1.9.14`, the stable line**: Solid 2 is still pre-release (`2.0.0-beta.N`, DOM renderer split out into `@solidjs/web`), and every app inherits whatever reactive core this repo pins, so a beta core is a risk handed downstream. The ecosystem around Solid is thin either way, which is why the UI kit is ours too.
|
|
61
|
+
|
|
62
|
+
### Which schema library?
|
|
63
|
+
|
|
64
|
+
None. `@ultimat3/schema` ships its own dependency-free validators (`vendor: 'ultimate'`), exposed as `t`. One schema drives runtime parse, TS type, OpenAPI, and the MCP tool's JSON Schema.
|
|
65
|
+
|
|
66
|
+
Everything sits behind the Standard Schema v1 interface, so the default is swappable at the framework level — not per app. No ArkType, Zod or Valibot adapter ships; swapping to one means writing the ~40-line `configureSchemaProvider()` adapter yourself ([`packages/schema/README.md`](https://github.com/developerz-ai/ultimate/blob/main/packages/schema/README.md)). A dependency the framework does not need is a dependency every app pays for.
|
|
67
|
+
|
|
68
|
+
## Design decisions people push back on
|
|
69
|
+
|
|
70
|
+
### Why is `idempotencyKey` required on every job?
|
|
71
|
+
|
|
72
|
+
At-least-once is the only honest guarantee any queue provides, so every handler must be replay-safe. "Remember to add a key" is exactly the instruction that gets dropped under pressure — by a human at 2am and by an agent always. Making it a required field converts a duplicate-charge incident into a red squiggle. Keys derive from `input` only: no timestamps, no random, no `ctx`.
|
|
73
|
+
|
|
74
|
+
### Why is every action an MCP tool?
|
|
75
|
+
|
|
76
|
+
Because the alternative is two authorization systems. An MCP call and an HTTP call reach the same `policy` with the same actor resolution — no MCP permission table, no "trusted tool" mode, no broad-rights service account. Actions still opt in per-action with `mcp: { expose: true }`; what is not optional is that exposure reuses the existing authz.
|
|
77
|
+
|
|
78
|
+
### Why does `x verify` block on budgets and SEO?
|
|
79
|
+
|
|
80
|
+
A convention that isn't a build error doesn't exist. A missing `description`, a blown JS budget, or a drifted migration is discovered in production otherwise — usually by someone who did not write the change. `x verify --json` names the route, the metric, the actual value, and the import chain that caused it.
|
|
81
|
+
|
|
82
|
+
### Is `x verify` really the only gate?
|
|
83
|
+
|
|
84
|
+
Yes. CI runs exactly `x verify` — no bespoke pipeline steps, because a check that lives only in CI is a check you cannot run locally. All 21 steps, in this order: typecheck, lint, boundaries, filesize, package-shape, errors, unit, contract, live, job, exercise, e2e, eval, drift, contract-diff, budgets, seo, i18n, policy, manifest, roadmap. No `--skip`; `--only <step>[,<step>…]` is an iteration loop that prints `NOT A GATE RUN`. See [Testing](Testing).
|
|
85
|
+
|
|
86
|
+
### Why are there only eight primitives?
|
|
87
|
+
|
|
88
|
+
`entity`, `policy`, `action`, `mutator`, `query`, `job`, `route`, `task`. If a feature doesn't fit one of them, it doesn't ship. A push notification is a `job`; a share target is a `route` with a policy; an admin screen is a `query` plus actions. No PWA-specific or realtime-specific concept escapes into your mental model.
|
|
89
|
+
|
|
90
|
+
## Running it
|
|
91
|
+
|
|
92
|
+
### Do I need Docker to develop?
|
|
93
|
+
|
|
94
|
+
No. `x dev` uses embedded PGlite, in-process events, and a local directory in place of S3. `bunx create-ultimate myapp && cd myapp && bun run setup && bun run dev` — no Docker install, no `.env` scavenger hunt. `bun run setup` is six steps — `bun install`, an `.env.development.local` touch, `x db gen "initial"`, `x db migrate`, `x db seed`, `x manifest` — and is not optional: `x new` installs nothing ([Getting started](Getting-Started), [Bare VM](Bare-VM)). The compose files exist for parity debugging and CI jobs that want real services ([Deployment](Deployment)).
|
|
95
|
+
|
|
96
|
+
### Do I need Redis or NATS?
|
|
97
|
+
|
|
98
|
+
No. Postgres covers the job queue (`SELECT ... FOR UPDATE SKIP LOCKED`) and pubsub, and a local volume covers files. Redis is a cache tier you opt into; NATS is fanout you need once `sync` runs on more than one node. Both are drivers behind one interface — job code and query code never change.
|
|
99
|
+
|
|
100
|
+
### Can I deploy serverless or to the edge?
|
|
101
|
+
|
|
102
|
+
No, by design. Containers only. Edge runtimes, function-per-route, and vendor KV/queue/cron primitives would each need a second implementation of a framework primitive, and the second implementation is where behavior diverges. Requirement: something that runs containers, plus Postgres.
|
|
103
|
+
|
|
104
|
+
### How much infrastructure does a small app need?
|
|
105
|
+
|
|
106
|
+
One container running `ROLE=web` and one Postgres — there is **no** `ROLE=all`, and `x dev` is what co-locates roles locally. Split roles when a signal tells you to: RPS for `web`, connection count for `sync`, queue demand (jobs held plus jobs due) for `worker`. `scheduler` and `replicator` are fixed at one replica — a second is a warm standby, not throughput.
|
|
107
|
+
|
|
108
|
+
### Can I use it without the realtime tiers?
|
|
109
|
+
|
|
110
|
+
Yes. `realtime: { enabled: false }` in `app.config.ts` is the opt-out (its default: [Configuration → `realtime`](Configuration#realtime)), and there is no tier key to set — a tier is what your app **declares** (a `channel()` topic, a `live: true` query), never a config value. An app that declares none needs no `sync` role, no `replicator`, and no NATS. That is a complete product without any realtime at all: entities, actions, a typed client, five render modes, a 0kb static path, and durable jobs.
|
|
111
|
+
|
|
112
|
+
## Risk
|
|
113
|
+
|
|
114
|
+
### What happens if the sync engine doesn't work out?
|
|
115
|
+
|
|
116
|
+
It is roughly **70% of total effort** and the single largest risk. Tiers 1–2 shipped in milestone 6 and are under semver; tier 3 local-first shipped in 21.0.0, opt-in per entity (`entity(name, { persist: true })`). The reconnect benchmark that gated topology — 50k sockets, a forced `sync` restart, recovery time and DB load — **is measured at 1.1.0**: all 50,000 reconnected, 49,981 received a channel patch inside the window, p50 54.0s / p90 105.5s, 156,851 connect attempts shed before any query path ([Realtime](Realtime)). That is **reachability** — first patch on the reconnected socket — not consistency; the delivery half is a separate 10,000-client run, **1,666,882 patches received, 0 observed sequence gaps** — a lower bound, since a hole is only visible between two frames one connection received ([Realtime](Realtime)) — and `As of 2026-08` the only run that counts lost patches at all. Both were run on **one** node, so multi-node fanout is still unproven. If the incremental matcher turns out to be the bottleneck, wrapping an existing protocol (Zero's) is an accepted fallback.
|
|
117
|
+
|
|
118
|
+
### Why ship realtime last if it's the differentiator?
|
|
119
|
+
|
|
120
|
+
A half-built sync engine is worth nothing: it cannot be shipped partially, demoed honestly, or tested against a real app, and it consumes the attention everything else needs. Starting there is how this project would die with 40 packages and no users.
|
|
121
|
+
|
|
122
|
+
### What if Bun has a problem under sustained load?
|
|
123
|
+
|
|
124
|
+
Stated risk, not a hidden one. `As of 2026-08` long-running Bun processes are less proven than Node's, so memory profiling under sustained socket load is explicit roadmap work. See [`docs/idea/15-risks.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/15-risks.md).
|
|
125
|
+
|
|
126
|
+
## Scope
|
|
127
|
+
|
|
128
|
+
### Where do plugins fit?
|
|
129
|
+
|
|
130
|
+
Nowhere — there is no plugin API and there has never been one, `As of 2026-08`. Semver covers the documented surface, not internals, and a plugin API freezes internals permanently. Fork the blessed path if you need something else; extension points earn their existence from real forks, not from speculation.
|
|
131
|
+
|
|
132
|
+
### Can I publish a package for other Ultimate apps?
|
|
133
|
+
|
|
134
|
+
Yes: a factory over the eight primitives, published as `ultimate-<name>` with the keyword `ultimate-package` and `@ultimat3/*` as `peerDependencies` at `^<major>`. There is no marketplace or registry; `npm search keywords:ultimate-package` is the directory. How, and what a consumer's gate sees: [Building your own base](Building-Your-Own-Base#publish-it).
|
|
135
|
+
|
|
136
|
+
### Does Ultimate collect anything?
|
|
137
|
+
|
|
138
|
+
Nothing in `x` is written to: no telemetry, analytics, crash report or update check. What the gate proves is narrower, and exactly this: every host a non-test file in `packages/cli/src` spells is either a reserved name (`.invalid`, `.test`, `example.com`, `localhost`) or a row with its reason in `CLI_OUTBOUND_ALLOWLIST` (`scripts/cli-outbound.ts`), and a new one fails the gate's `boundaries` step with `X_CLI_OUTBOUND_UNDECLARED`. It reads literals only, in the CLI's own source: a host assembled at run time, and the other packages, are not covered. The network `x` does touch is the network you asked for: `x upgrade` reads your configured npm registry through `bun pm view`, `x pr` and `x ci` go through your own `gh`, `x deploy verify` polls your own origin. If telemetry is ever added it is opt-in, off by default, and a major.
|
|
139
|
+
|
|
140
|
+
### Will you add an adapter for my host or my ORM?
|
|
141
|
+
|
|
142
|
+
No. Multi-ORM means two migration stories and two sets of generated SQL for an agent to learn. Vendor deploy adapters violate the containers-only axiom. Removing an alternative is treated as a feature.
|
|
143
|
+
|
|
144
|
+
### Is it overkill for a small project?
|
|
145
|
+
|
|
146
|
+
No, and it is measured rather than argued. `x new` asks **0** questions (all five flags carry a
|
|
147
|
+
default), writes **134** files you never edit, installs **104** packages, and reaches a running app
|
|
148
|
+
in **4** commands with **0** env values supplied and nothing to install first — no Docker, no
|
|
149
|
+
Postgres, no Redis, no NATS. There is no lite mode to pick, because there is no second path to pick
|
|
150
|
+
between ([axiom 1](Home#the-rules-everything-else-follows)). The whole range, both ends, with the
|
|
151
|
+
command behind every number: [`docs/idea/21-the-range.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/21-the-range.md).
|
|
152
|
+
|
|
153
|
+
### Is it enough for a very large project?
|
|
154
|
+
|
|
155
|
+
The capability answer is [`docs/idea/20-large-app-readiness.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/20-large-app-readiness.md) — graded against what a very large product needs, including what it must still build itself — and the deployment answer is [`docs/idea/17-scale-ladder.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/17-scale-ladder.md), rung by rung, naming where the "no app code change" invariant breaks today. What is **not** claimed: nobody has shipped a very large app on it yet, and this wiki will say so until somebody has.
|
|
156
|
+
|
|
157
|
+
### Who is it for?
|
|
158
|
+
|
|
159
|
+
Primary user: **an AI agent** — one correct way per task, machine-readable errors, generated facts to read. Secondary: **a tired senior engineer, working through their own AI agent and AI reviewer** — no glue code, no config archaeology, no 3am pager. Both want the same thing: fewer decisions with consequences.
|
|
160
|
+
|
|
161
|
+
### How is this different from Rails, Next.js, Meteor, or Phoenix?
|
|
162
|
+
|
|
163
|
+
Rails, Next.js, Meteor, Phoenix and Inngest / Zero each get a section on [Compared](Compared): when to pick that stack instead, first, then when to pick this one, and what you give up here.
|
|
164
|
+
|
|
165
|
+
Nothing here is novel in isolation. See [Home](Home) for the full "steal explicitly" table.
|
|
166
|
+
|
|
167
|
+
## Getting unstuck
|
|
168
|
+
|
|
169
|
+
### Where do I report a bug?
|
|
170
|
+
|
|
171
|
+
Run `x verify --json` and `x doctor --json`, attach both, and open an issue. The JSON is the report. Security issues go through [`SECURITY.md`](https://github.com/developerz-ai/ultimate/blob/main/SECURITY.md), never a public issue.
|
|
172
|
+
|
|
173
|
+
### An error code is unclear — where do I look?
|
|
174
|
+
|
|
175
|
+
`x errors explain <CODE> --json`, then [Error codes](Error-Codes). Every `X_*` code carries a cause, an exact fix command, and a docs URL, rendered identically in the terminal, the browser overlay, and `--json`. Symptom-first: [Troubleshooting](Troubleshooting).
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Feature flags
|
|
2
|
+
|
|
3
|
+
**Permanent switches, and temporary ones that cannot be forgotten.** Package `@ultimat3/flags`
|
|
4
|
+
(tier 1) — the full reference is
|
|
5
|
+
[`packages/flags/README.md`](https://github.com/developerz-ai/ultimate/blob/main/packages/flags/README.md).
|
|
6
|
+
|
|
7
|
+
N flags are 2^N states nothing tested. This package takes that trade only on terms that bound the
|
|
8
|
+
exponent: every flag declares one of two kinds, and a `temporary` flag cannot be declared without an
|
|
9
|
+
expiry.
|
|
10
|
+
|
|
11
|
+
| Kind | Meaning | Lifecycle |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| `permanent` | a real product or ops switch — a plan capability, a kill switch | none |
|
|
14
|
+
| `temporary` | scaffolding around an in-progress change | `expiresAt` and `owner` are required **by the type**; past the expiry every evaluation reports `X_FLAG_EXPIRED` to the app's error monitor |
|
|
15
|
+
|
|
16
|
+
`defineFlag()` is a `define*` helper, not a ninth primitive: a flag has no handler, no input schema
|
|
17
|
+
and no surface of its own ([The eight primitives](The-Eight-Primitives)).
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
import { defineFlag, isEnabled } from '@ultimat3/flags';
|
|
21
|
+
|
|
22
|
+
export const newTaxEngine = defineFlag({
|
|
23
|
+
kind: 'temporary',
|
|
24
|
+
key: 'checkout.new-tax-engine',
|
|
25
|
+
description: 'routes checkout through the rewritten tax engine',
|
|
26
|
+
owner: 'payments',
|
|
27
|
+
expiresAt: '2026-12-01',
|
|
28
|
+
targeting: { default: false, rollout: 10, roles: ['staff'] },
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
if (isEnabled('checkout.new-tax-engine', actor)) {
|
|
32
|
+
// …
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`isEnabled` is **synchronous**, for the reason `can()` is: it runs inside policy predicates and
|
|
37
|
+
render passes. An undeclared key throws `X_FLAG_UNKNOWN` rather than answering `false` — a typo read
|
|
38
|
+
as "off" is a branch that never runs in production.
|
|
39
|
+
|
|
40
|
+
## Targeting
|
|
41
|
+
|
|
42
|
+
Allow lists first, then the rollout, then `default`:
|
|
43
|
+
|
|
44
|
+
| Field | Meaning |
|
|
45
|
+
|---|---|
|
|
46
|
+
| `actors`, `roles`, `orgs` | always on for these ids, roles or tenants |
|
|
47
|
+
| `subjects` | allow lists for the app's own record kinds — `{ bank: ['bank_integration:bbva'] }`, read from the call site's third argument |
|
|
48
|
+
| `rollout` | whole percentage 0–100, stable per subject: `fnv1a(key + ':' + id) % 100`, never `Math.random()` |
|
|
49
|
+
| `bucketBy` | what the rollout divides — `'actor'` (default), `'org'`, or any subject kind, so a tenant is on one side **whole** |
|
|
50
|
+
|
|
51
|
+
Targeting by a subject kind the call does not carry throws `X_FLAG_SUBJECT_REQUIRED` — never a
|
|
52
|
+
fallback to the actor or to `default`.
|
|
53
|
+
|
|
54
|
+
## Overrides and reporting
|
|
55
|
+
|
|
56
|
+
`applyFlagSnapshot({ key: targeting })` lands targeting from outside — a poller, a job, a channel —
|
|
57
|
+
so evaluation never loads anything. Keys this build does not declare come back in `unknown` rather
|
|
58
|
+
than throwing: a control plane is often ahead of a deploy. An overdue flag is reported through
|
|
59
|
+
core's one error-reporting seam (`configureErrorReporting`), at most once an hour per flag.
|
|
60
|
+
|
|
61
|
+
`flagsReport()` projects every flag with its kind, owner and expiry. Nothing reads it yet: no CLI
|
|
62
|
+
command prints it and no manifest section carries it.
|
|
63
|
+
|
|
64
|
+
Codes: `X_FLAG_DUPLICATE`, `X_FLAG_EXPIRED`, `X_FLAG_EXPIRY_INVALID`, `X_FLAG_SUBJECT_REQUIRED`,
|
|
65
|
+
`X_FLAG_TARGETING_INVALID`, `X_FLAG_UNKNOWN` — [Error codes](Error-Codes).
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Getting started
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
bunx create-ultimate myapp && cd myapp && bun run setup && bun run dev
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
Building a blog or an API rather than a dashboard? Add `--shape blog` or `--shape api` to the
|
|
8
|
+
first command: [Shapes](Shapes) says what each writes and leaves out.
|
|
9
|
+
|
|
10
|
+
**Four commands, and `bun run setup` is one of them.** It is the scaffold's own script, six steps —
|
|
11
|
+
`bun install`, an `.env.development.local` touch, `x db gen "initial"` when
|
|
12
|
+
`packages/db/migrations` holds no `.sql`, `x db migrate`, `x db seed`, `x manifest` — idempotent, so
|
|
13
|
+
re-running it after a pull is safe. The last step is not optional either: `x.manifest.json` is a
|
|
14
|
+
projection of the loaded app, nothing else ever runs the command, and `x verify`'s `manifest` step
|
|
15
|
+
refuses its absence with `X_MANIFEST_MISSING`. `bunx create-ultimate myapp && cd myapp && x dev` is what this page said until 2026-08-23 and
|
|
16
|
+
it does not work: `x new` writes files and installs nothing, so the app has no `node_modules`, no `x`
|
|
17
|
+
of its own, and `x dev` stops on `X_BUILD_FAILED` — *"Could not resolve `@ultimat3/ui`. Maybe you
|
|
18
|
+
need to `bun install`?"*
|
|
19
|
+
|
|
20
|
+
**PowerShell and cmd run the same commands.** `bun run setup` runs the app's `bin/setup.ts` —
|
|
21
|
+
TypeScript that Bun executes, no bash and no WSL — and `bun run dev` and `bun run verify` are
|
|
22
|
+
`x dev` and `x verify`. Windows PowerShell 5.1 has no `&&`: type the commands one per line there
|
|
23
|
+
(PowerShell 7 and cmd take the line as written).
|
|
24
|
+
|
|
25
|
+
No Docker daemon, no `.env` scavenger hunt, no service to provision — `.env.development` ships
|
|
26
|
+
committed non-secret defaults and an empty `DATABASE_URL` means embedded PGlite.
|
|
27
|
+
|
|
28
|
+
No service to install either — bun and git are the whole prerequisite list → [Bare VM](Bare-VM).
|
|
29
|
+
|
|
30
|
+
`bun run setup`, then `x dev`, measured on a fresh scaffold `As of 2026-08-23` (6.7s for setup on a warm
|
|
31
|
+
Bun cache) — recorded **before** the `.env.development.local` touch and `x manifest` joined the
|
|
32
|
+
script, so neither is in the transcript or the number, and the closing line now reads
|
|
33
|
+
`next: bun run dev`:
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
$ bun run setup
|
|
37
|
+
packages/db/migrations/20260823155026_initial.sql
|
|
38
|
+
✓ migration 20260823155026_initial generated
|
|
39
|
+
✓ migrations applied
|
|
40
|
+
✓ 1 seed(s): 2 inserted, 0 updated, 0 already stored
|
|
41
|
+
setup complete — next: x dev
|
|
42
|
+
|
|
43
|
+
$ x dev
|
|
44
|
+
roles web, sync, worker, scheduler
|
|
45
|
+
panels routes, timeline, live, jobs, db, mail, cache, policy, manifest, services, boundaries
|
|
46
|
+
manifest /path/to/myapp/x.manifest.json
|
|
47
|
+
introspect http://localhost:3000/_x
|
|
48
|
+
✓ dev ready on http://localhost:3000 — /_x mounted (11 panels), db=embedded events=embedded storage=embedded mail=embedded cdn=none
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`replicator` is the fifth role and is **opt-in** — it takes a replication slot, which is not
|
|
52
|
+
something every `x dev` should do by starting: `x dev --role web,sync,worker,scheduler,replicator`.
|
|
53
|
+
|
|
54
|
+
## What you get before writing a line
|
|
55
|
+
|
|
56
|
+
Measured on a fresh scaffold, `As of 2026-08-23`.
|
|
57
|
+
|
|
58
|
+
| Thing | Where | Detail |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| Embedded Postgres | `.x/pgdata` | PGlite in-process, no local install; `bun run setup` migrates and seeds it |
|
|
61
|
+
| In-process events | same process | `events=embedded`; the same seam NATS fills in prod |
|
|
62
|
+
| S3 | `./.x/storage` | real S3 API surface via `Bun.s3` |
|
|
63
|
+
| Mail | `/_x` inbox | captured, never sent |
|
|
64
|
+
| Redis (the shared cache tier) | not started | the scaffold's `cache.tiers` is `['request-memo', 'lru']`; adding `'redis'` is what builds the shared rung |
|
|
65
|
+
| `/_x` dev panel | `http://localhost:3000/_x` | 11 panels: routes, timeline, live, jobs, db, mail, cache, policy, manifest, services, boundaries |
|
|
66
|
+
| MCP server | `x mcp serve` | 19 dev tools over `stdio` or `http` (14 framework tools plus five `ui.*`). **Not started by `x dev`** — `/mcp` on the dev server is 404 |
|
|
67
|
+
| Landing page | `apps/web/site/page.tsx` | `render: 'static'`, `hydrate: 'never'`, `budget: { js: '0kb' }`, real meta + JSON-LD |
|
|
68
|
+
| Dashboard | `apps/web/app/dashboard/page.tsx` | `render: 'stream'`, `hydrate: 'visible'`, `budget: { js: '60kb' }` (one island, the theme toggle), behind `policy: { permission: 'dashboard:read' }`. A `<Hole>` is the next read it does not wait for ([Routes and render modes](Routes-And-Render-Modes#what-a-hole-does)) |
|
|
69
|
+
| Admin app | `apps/admin/` | one `ssr` page; your actions reach an agent through `mcp: { expose: true }` and `x mcp serve`, not through this app |
|
|
70
|
+
| Green gate | `bun run verify` — `x verify` | 21 steps, in this order: typecheck, lint, boundaries, filesize, package-shape, errors, unit, contract, live, job, exercise, e2e, eval, drift, contract-diff, budgets, seo, i18n, policy, manifest, roadmap. `budgets` weighs `.x/build-stats.json` and runs `x build --target static` itself when that file is missing or older than the source, so `x verify` alone is the gate on an app nobody has built (`As of 30.0`). The first-run verdict on a fresh scaffold is measured by CI, never asserted here |
|
|
71
|
+
|
|
72
|
+
`x dev` runs **every role in one process** with isolation simulated, not skipped: separate ALS contexts, a real Postgres queue, real logical replication, a real SIGTERM drain on `x dev restart`. Nothing in the framework branches on `if (dev)` — only the drivers differ.
|
|
73
|
+
|
|
74
|
+
## 1. Write your first action
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
x g action publish-post
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
export const publishPost = action({
|
|
82
|
+
input: t.object({ postId: t.uuid, notify: t.boolean.default(true) }),
|
|
83
|
+
output: PostView,
|
|
84
|
+
policy: can('post:publish', ({ input, actor }) => ownsPost(actor, input.postId)),
|
|
85
|
+
cache: { invalidates: [tag.post, tag.feed] },
|
|
86
|
+
mcp: { expose: true, description: 'Publish a draft post' },
|
|
87
|
+
async handle({ input, ctx }) {
|
|
88
|
+
const post = await ctx.posts.publish(input.postId);
|
|
89
|
+
if (input.notify) await notifySubscribers.enqueue({ postId: post.id, orgId: post.orgId });
|
|
90
|
+
return post;
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
That one declaration emits six artifacts — HTTP route, OpenAPI operation, typed client function, job handle, MCP tool, test scaffold. See [Actions](Actions).
|
|
96
|
+
|
|
97
|
+
Register it, with every other primitive, in one call. Importing `api/index.ts` IS the boot.
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
// apps/web/api/index.ts
|
|
101
|
+
import { defineApi } from '@ultimat3/action';
|
|
102
|
+
import * as postActions from '../app/posts/actions';
|
|
103
|
+
import * as postJobs from '../app/posts/jobs';
|
|
104
|
+
import * as postQueries from '../app/posts/live';
|
|
105
|
+
import * as postMutators from '../app/posts/mutator';
|
|
106
|
+
import * as scheduledTasks from './tasks';
|
|
107
|
+
|
|
108
|
+
export const api = defineApi({
|
|
109
|
+
actions: [postActions],
|
|
110
|
+
mutators: [postMutators],
|
|
111
|
+
queries: [postQueries],
|
|
112
|
+
jobs: [postJobs],
|
|
113
|
+
tasks: [scheduledTasks],
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
export type Api = typeof api;
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 2. Call it from `app/`
|
|
120
|
+
|
|
121
|
+
`app/` may import `api/` **types only**. The typed client is derived from those types; there is no codegen step to remember and no `fetch`.
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
// apps/web/shared/client.ts
|
|
125
|
+
import { rpc } from '@ultimat3/action';
|
|
126
|
+
import type { Api } from '../api';
|
|
127
|
+
|
|
128
|
+
export const api = rpc<Api['actions']>({ baseUrl: '/' });
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
// apps/web/app/posts/ui/publish-button.tsx
|
|
133
|
+
import { api } from '../../../shared/client';
|
|
134
|
+
import { t as translate } from '@ultimat3/i18n';
|
|
135
|
+
import type { PostView } from '@myapp/domain';
|
|
136
|
+
|
|
137
|
+
export function PublishButton(props: { post: PostView }) {
|
|
138
|
+
const publish = async (): Promise<void> => {
|
|
139
|
+
await api.publishPost({ postId: props.post.id, notify: true });
|
|
140
|
+
};
|
|
141
|
+
return (
|
|
142
|
+
<button type="button" onClick={publish}>
|
|
143
|
+
{translate('post.publish')}
|
|
144
|
+
</button>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Rename `postId` in the action and this file fails typecheck. One rename, N errors, all real work.
|
|
150
|
+
|
|
151
|
+
## 3. Drive it from an agent over MCP
|
|
152
|
+
|
|
153
|
+
**`x dev` does not serve MCP** — measured `As of 2026-08-23`, `GET /mcp` on the dev server answers
|
|
154
|
+
404 and nothing listens on 9229. The MCP server is its own command, and it prints the bearer token
|
|
155
|
+
your client must send:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
x mcp serve --transport stdio # a client that spawns the server
|
|
159
|
+
x mcp serve --transport http --port 9229 # POST /mcp, bearer token printed at boot
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
`stdio` and `http` are the two transports (`x help mcp`); there is no `ws` transport, and a client
|
|
163
|
+
configured for one gets no connection. Register the printed URL and token with whatever MCP client
|
|
164
|
+
you use.
|
|
165
|
+
|
|
166
|
+
The agent now sees `publishPost` as a tool with JSON Schema from `input`, the description from `mcp.description`, and **the action's own `policy` as its authorization** — unwrapped, identical to the HTTP path. A denial is the same code in all three encodings:
|
|
167
|
+
|
|
168
|
+
```json
|
|
169
|
+
{ "code": "X_FORBIDDEN", "cause": "actor user_2 lacks post:publish on post_9",
|
|
170
|
+
"fix": "grant post:publish to the actor's role, or call as the post owner",
|
|
171
|
+
"docs": "https://github.com/developerz-ai/ultimate/wiki/Error-Codes" }
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Introspection an agent should use instead of grepping:
|
|
175
|
+
|
|
176
|
+
| Want | Command | MCP tool |
|
|
177
|
+
|---|---|---|
|
|
178
|
+
| every action + schemas | `x actions list --json` | `actions.describe` (no arguments — every action and query) |
|
|
179
|
+
| one action in detail | `x actions show publishPost --json` | `actions.describe`, then pick the entry |
|
|
180
|
+
| is this protected | `x policy explain publishPost --json` | none — `policies.list` returns the catalog, not the per-declaration matrix |
|
|
181
|
+
| the whole app as data | `x manifest --json` | `manifest.read` |
|
|
182
|
+
| what an `X_*` code means | `x errors explain X_FORBIDDEN` | `errors.explain` |
|
|
183
|
+
| how the framework does X — **ask this first**, before stating a limit | `x docs "send email"` (offline: the installed packages and this wiki) | none |
|
|
184
|
+
|
|
185
|
+
## 4. `x verify`
|
|
186
|
+
|
|
187
|
+
One command. Green means shippable.
|
|
188
|
+
|
|
189
|
+
```text
|
|
190
|
+
$ x verify
|
|
191
|
+
✓ typecheck ✓ lint ✓ boundaries ✓ filesize ✓ package-shape ✓ errors
|
|
192
|
+
✓ unit ✓ contract ✓ live ✓ job ✓ e2e ✓ eval
|
|
193
|
+
✗ drift
|
|
194
|
+
X_DB_DRIFT: schema differs from migrations
|
|
195
|
+
cause: table "posts" has column "publish_at" not present in any migration
|
|
196
|
+
fix: x db gen "add publish_at"
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
`x verify --json` emits the same content machine-readably. CI runs exactly `x verify` — a check that lives only in CI is a check you cannot run.
|
|
200
|
+
|
|
201
|
+
## Where next
|
|
202
|
+
|
|
203
|
+
| Page | Read it for |
|
|
204
|
+
|---|---|
|
|
205
|
+
| [Installation](Installation) | prerequisites, `x new` flags, typed env, MCP client setup |
|
|
206
|
+
| [Project layout](Project-Layout) | the generated tree, surfaces, the `site/` → `app/` boundary |
|
|
207
|
+
| [The eight primitives](The-Eight-Primitives) | the whole conceptual surface, in eight lines |
|
|
208
|
+
| [Actions](Actions) | every field, all six projections, introspection |
|
|
209
|
+
| [Entities and migrations](Entities-And-Migrations) | schema, drift, branch DBs |
|
|
210
|
+
| [Policies and authz](Policies-And-Authz) | one authz system, tenancy, denials |
|
|
211
|
+
| [Queries and live queries](Queries-And-Live-Queries) | reads, `live: true` |
|
|
212
|
+
| [Jobs and workflows](Jobs-And-Workflows) | durable steps, idempotency |
|
|
213
|
+
| [Routes and render modes](Routes-And-Render-Modes) | `static` / `isr` / `ssr` / `stream` |
|
|
214
|
+
| [Testing](Testing) | six test types, DB-clone parallelism |
|
|
215
|
+
| [CLI reference](CLI-Reference) | every command, every `--json` |
|
|
216
|
+
| [Error codes](Error-Codes) | code → cause → fix |
|
|
217
|
+
| [Troubleshooting](Troubleshooting) | first-run failures |
|
|
218
|
+
|
|
219
|
+
## Status
|
|
220
|
+
|
|
221
|
+
`As of 2026-08-23`. Stable API — semver from here ([Upgrading](Upgrading); `x upgrade` moves one major per run). The repository holds 30 `@ultimat3/*` packages plus the unscoped `create-ultimate` and versions all 30 in lockstep. Every major so far has been a correctness sweep with no codemod, so each `BREAKING —` entry names its own manual edit; [Upgrading](Upgrading) walks all of them, oldest first, and each section states its own count. Only the [footer](_Footer) stamps a version number, and this page states none. **What `bunx create-ultimate myapp` installs is npm's `latest`**, one version for all 31 workspaces, each published by the release workflow over OIDC with a provenance attestation. Resolve it, do not trust this line — `npm view @ultimat3/core version`, and `npm view @ultimat3/core dist.attestations` for the attestation. **No publication holes**: `@ultimat3/scraping` was the last never-published package, bootstrapped by hand at 2.0.0, so `bun add @ultimat3/scraping` resolves. Milestones 0–10 are ✅; milestone 11 is 🚧, open on its two-platform deploy proof. Realtime tiers 1–2 ship, and tier 3 (local-first) shipped in 21.0.0, opt-in per entity (`entity(name, { persist: true })`). The 50k-socket forced-restart benchmark **is measured and committed** — first patch on the reconnected socket at p50 54.0s / p90 105.5s, on one node; delivery is a second run, 10,000 clients, 1,666,882 patches, 0 observed sequence gaps ([Realtime](Realtime)). Status markers come from [`docs/idea/14-roadmap.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/14-roadmap.md). See [FAQ](FAQ).
|
package/wiki/Home.md
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Ultimate wiki
|
|
2
|
+
|
|
3
|
+
**The full-stack framework where the primary developer is an AI agent.** Rails' philosophy on Bun + Postgres + SolidJS: everything is one of [eight primitives](The-Eight-Primitives), and one `action` declaration projects into an HTTP route, an OpenAPI operation, a typed client, a job handle, an MCP tool and a test, all behind one `policy`. `x verify` is the contract: green means shippable.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
bunx create-ultimate myapp && cd myapp && bun run setup && bun run dev
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
No Docker and no service: embedded Postgres, in-process NATS, local storage, a seeded database and a dev dashboard at `/_x`. `bun run setup` is not optional: `x new` installs nothing, so `x dev` straight after `cd` stops on `X_BUILD_FAILED` naming `bun install` → [Getting started](Getting-Started) · [Bare VM](Bare-VM).
|
|
10
|
+
|
|
11
|
+
**Look first: [the live demo](https://social-media.ultimate.demo.developerz.ai)**, a social network deployed from `main` on every green push. Fabricated data, every row decided by a policy. Source: [`dummy/social-media-clone/`](https://github.com/developerz-ai/ultimate/tree/main/dummy/social-media-clone).
|
|
12
|
+
|
|
13
|
+
## Why pick it, and when not to
|
|
14
|
+
|
|
15
|
+
| Pick it when | Do not pick it when |
|
|
16
|
+
|---|---|
|
|
17
|
+
| an agent writes most of your code: one way per task, `--json` everywhere, every error a code, a cause and a `fix:` command | you need Node.js or Deno: Bun only |
|
|
18
|
+
| you want authz written once: one `policy` guards HTTP, live queries, jobs, MCP and admin | your database is not Postgres, or your UI is not SolidJS |
|
|
19
|
+
| you want jobs, realtime, auth, mail, storage, i18n, SEO, admin and MCP decided and gated | you deploy to Vercel functions, Lambda or Workers: containers only |
|
|
20
|
+
| the app may grow: the same code from one PaaS process to Kubernetes | you want a plugin API (an app wraps a primitive instead), or multi-node realtime proven today ([Known gaps](Known-Gaps)) |
|
|
21
|
+
|
|
22
|
+
## Is it for a project this size
|
|
23
|
+
|
|
24
|
+
**Yes at both ends, and that is the design.** A homework assignment or a weekend idea gets a running app in four commands with nothing to install and nothing to choose; a very large product gets the scale ladder, the tier boundaries and the same 21-step gate the beginner's app already ran — the list is `VERIFY_STEP_NAMES` in [`packages/cli/src/verify-step.ts`](https://github.com/developerz-ai/ultimate/blob/main/packages/cli/src/verify-step.ts), whole or not at all. One framework, no lite mode — [axiom 1](#the-rules-everything-else-follows) forbids the second path a lite mode would be.
|
|
25
|
+
|
|
26
|
+
The measured version of that claim, with the command behind every number: [`docs/idea/21-the-range.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/21-the-range.md).
|
|
27
|
+
|
|
28
|
+
**Proof, each with a command:** what npm serves is `npm view @ultimat3/core version`; that every package is published and attested, `bun run scripts/registry-audit.ts --json` in the repository; the rolling-restart proof is `ci.yml`'s `deploy-proof` job; realtime recovery on one node is measured in [`scripts/bench/results/`](https://github.com/developerz-ai/ultimate/tree/main/scripts/bench/results) → [Realtime](Realtime). How each release was published, attestations included: [`PUBLISHING.md`](https://github.com/developerz-ai/ultimate/blob/main/PUBLISHING.md#publication-history). This wiki is the only public documentation surface.
|
|
29
|
+
|
|
30
|
+
Those facts are repeated on several pages because the wiki is plain markdown with no build step. Change them at the source first, then here: [`docs/idea/14-roadmap.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/14-roadmap.md) owns milestone status, [`CHANGELOG.md`](https://github.com/developerz-ai/ultimate/blob/main/CHANGELOG.md) owns the version, `scripts/bench/results/` owns the benchmark, and `VERIFY_STEP_NAMES` in [`packages/cli/src/verify-step.ts`](https://github.com/developerz-ai/ultimate/blob/main/packages/cli/src/verify-step.ts) owns the `x verify` step list.
|
|
31
|
+
|
|
32
|
+
| If you are | Read, in order |
|
|
33
|
+
|---|---|
|
|
34
|
+
| Evaluating it | [Getting started](Getting-Started) → [Bare VM](Bare-VM) → [The eight primitives](The-Eight-Primitives) → [FAQ](FAQ) |
|
|
35
|
+
| Moving a production app off another stack | [Migrating an existing app](Migrating-An-Existing-App) → [Known gaps](Known-Gaps) → [Entities and migrations](Entities-And-Migrations) |
|
|
36
|
+
| Building an app | [Installation](Installation) → [Project layout](Project-Layout) → [Actions](Actions) → [Testing](Testing) |
|
|
37
|
+
| An agent driving the framework | `x docs "<question>"` first, offline from the install → [CLI reference](CLI-Reference) → [Error codes](Error-Codes) → [MCP and AI](MCP-And-AI) → [Agents](Agents) |
|
|
38
|
+
| Operating it | [Configuration](Configuration) → [Deployment](Deployment) → [Observability](Observability) → [Troubleshooting](Troubleshooting) |
|
|
39
|
+
| Deciding whether to trust it | [Known gaps](Known-Gaps) → [FAQ](FAQ) → [Stability](Stability) → [Upgrading](Upgrading) |
|
|
40
|
+
| Contributing | [Contributing](Contributing) → [Project layout](Project-Layout) → [Testing](Testing) |
|
|
41
|
+
|
|
42
|
+
## Start
|
|
43
|
+
|
|
44
|
+
| Page | What it covers |
|
|
45
|
+
|---|---|
|
|
46
|
+
| [Getting started](Getting-Started) | zero to a running app, one action, one green `x verify` |
|
|
47
|
+
| [Installation](Installation) | prerequisites, `x new`, typed env, editor and MCP client setup |
|
|
48
|
+
| [Bare VM](Bare-VM) | the four commands a fresh Ubuntu box with bun and git runs, and why no Docker and no service is needed |
|
|
49
|
+
| [Project layout](Project-Layout) | the generated monorepo, the four surfaces, feature slices, the hard boundaries |
|
|
50
|
+
| [Migrating an existing app](Migrating-An-Existing-App) | strangler fig off Rails/Node/Django, adopting a live schema, identity during cutover, and what does not work yet |
|
|
51
|
+
| [Compared](Compared) | each stack this gets compared to: when to pick it instead, what you give up here, and the measured figures with the commands that reproduce them |
|
|
52
|
+
| [Shapes](Shapes) | `x new --shape api`, `blog` and `dashboard`: what each writes and what it leaves out |
|
|
53
|
+
|
|
54
|
+
## Tutorials
|
|
55
|
+
|
|
56
|
+
Follow in order. Each page states what it was executed against in its own first line — tutorial 1 its own measurement. `As of 2026-11-03`, 2–4 were re-run by hand, whole, in the app tutorial 1 leaves, and 5 with Docker up to the point a real host is needed. `scripts/tutorial-run.ts` (workflow `tutorial-run.yml`, on `main`) runs 1–4 in order and never 5; it has not yet run green. A workaround for a gap fixed since has been removed rather than left to mislead.
|
|
57
|
+
|
|
58
|
+
| Page | You end with |
|
|
59
|
+
|---|---|
|
|
60
|
+
| [1 · First app](Tutorial-01-First-App) | a scaffolded app running on `x dev`, green gate, no Docker |
|
|
61
|
+
| [2 · First feature](Tutorial-02-First-Feature) | one `action` projected into five surfaces, with tests |
|
|
62
|
+
| [3 · Auth and admin](Tutorial-03-Auth-And-Admin) | roles, policies, a real login flow, and the admin's detail pages, actions and batches |
|
|
63
|
+
| [4 · Jobs and realtime](Tutorial-04-Jobs-And-Realtime) | a durable job, a cron task, a live query |
|
|
64
|
+
| [5 · Deploy free](Tutorial-05-Deploy-Free) | the image running on a free PaaS tier, migrations on release |
|
|
65
|
+
| [6 · Growing up](Tutorial-06-Growing-Up) | the rung you should be on, and the signal to climb |
|
|
66
|
+
|
|
67
|
+
## The primitives
|
|
68
|
+
|
|
69
|
+
| Page | What it covers |
|
|
70
|
+
|---|---|
|
|
71
|
+
| [The eight primitives](The-Eight-Primitives) | `entity`, `policy`, `action`, `mutator`, `query`, `job`, `route`, `task` — the whole vocabulary |
|
|
72
|
+
| [Building your own base](Building-Your-Own-Base) | wrap a primitive in your own factory: `tenantEntity`, `auditedMutator`, the two caveats, and why nothing downstream notices |
|
|
73
|
+
| [Actions](Actions) | every field, the six generated artifacts, the mutator twin, contract tests |
|
|
74
|
+
| [Entities and migrations](Entities-And-Migrations) | tables, invariants, tenancy, the typed-handle repo, `.sealed()` columns, `x db gen`, the schema dump, drift, branch databases |
|
|
75
|
+
| [Policies and authz](Policies-And-Authz) | `can()`, where a policy is evaluated, denials, tenancy scoping |
|
|
76
|
+
| [Queries and live queries](Queries-And-Live-Queries) | reads, `live: true`, per-row policy, bounded SQL |
|
|
77
|
+
| [Jobs and workflows](Jobs-And-Workflows) | transactional outbox, durable steps, idempotency, keyed concurrency, `onSettled`, operating a queue, `webhook()`, drivers |
|
|
78
|
+
| [Scheduled tasks](Scheduled-Tasks) | cron with an explicit tz, leader election, next-run introspection |
|
|
79
|
+
| [Routes and render modes](Routes-And-Render-Modes) | five render modes, hydration timing, budgets, enforced SEO |
|
|
80
|
+
|
|
81
|
+
## Capabilities
|
|
82
|
+
|
|
83
|
+
| Page | What it covers |
|
|
84
|
+
|---|---|
|
|
85
|
+
| [Realtime](Realtime) | channels → live queries → local-first, the pipeline, the reconnect problem |
|
|
86
|
+
| [Caching and invalidation](Caching-And-Invalidation) | four tiers, one tag graph, one-hop fanout |
|
|
87
|
+
| [Batching and preloading](Batching-And-Preloading) | JIT preload, `.preload()`, `insertAll`/`upsertAll`/`updateWhere`, `inBatches`, the tenancy guarantee |
|
|
88
|
+
| [N+1 detection](N-Plus-One-Detection) | the two codes, `expectedQueryLoop`, four surfaces, why prod pays nothing |
|
|
89
|
+
| [PWA and offline](PWA-And-Offline) | generated `sw.js`, precache budgets, version skew |
|
|
90
|
+
| [Client data](Client-Data) | the one browser transport (`browserClient`, `useQuery`), the record store, and the gate that refuses a raw `fetch(` |
|
|
91
|
+
| [Client navigation](Client-Navigation) | soft navigation over server-rendered pages: one config line per surface, swap, prefetch, history, focus |
|
|
92
|
+
| [MCP and AI](MCP-And-AI) | the dev MCP server, every action as a tool, the `llm()` gateway, evals |
|
|
93
|
+
| [Agents](Agents) | `agent()` as an action factory, tools as real actions, `hive()`, `agentJob()`, and the at-least-once trap |
|
|
94
|
+
| [Admin dashboard](Admin-Dashboard) | `defineAdmin()` serving list, detail and form per entity with no host code; filters, scopes, sections, related rows, actions with `when` and `batch`, the audit log, the jobs dashboard; zero JavaScript; its MCP surface |
|
|
95
|
+
| [Scraping](Scraping) | `scrape()` as a job factory, the driver-blind page vocabulary, robots and host gates, per-run egress, a rented CDP browser, usage, sealed sessions, mid-run prompts |
|
|
96
|
+
| [Auth](Auth) | sessions, OAuth, MFA, API keys and service tokens — the output is an `Actor` |
|
|
97
|
+
| [Mail](Mail) | one template renders HTML and text, every string a key, sending is a job |
|
|
98
|
+
| [Notify](Notify) | `notifier()` as a job factory: fan-out, preference gate, digest window, ledger, inbox |
|
|
99
|
+
| [Storage and uploads](Storage-And-Uploads) | named disks, safe keys, the three-call signed upload, quarantine, orphans |
|
|
100
|
+
| [Feature flags](Feature-Flags) | permanent switches and temporary ones that cannot be forgotten |
|
|
101
|
+
| [SEO](SEO) | enforced meta, typed JSON-LD, sitemaps, fail-closed robots, feeds, responsive images |
|
|
102
|
+
|
|
103
|
+
## Cross-cutting
|
|
104
|
+
|
|
105
|
+
| Page | What it covers |
|
|
106
|
+
|---|---|
|
|
107
|
+
| [I18n](I18n) | flat catalogs, loud misses, locale routing, `hreflang` |
|
|
108
|
+
| [Theming](Theming) | 24 semantic colour roles as RGB channels, every token scale, breakpoint and layout mixins, `defineTheme()`, what contrast is gated |
|
|
109
|
+
| [Interface rules](Interface-Rules) | how a screen must behave, and which of the app's `guards/` refuses each rule |
|
|
110
|
+
| [UI components](UI-Components) | the four page composites, and the generated UI component catalog |
|
|
111
|
+
| [Timezones and dates](Timezones-And-Dates) | store UTC, format with an explicit IANA zone, frozen clocks in tests |
|
|
112
|
+
| [Money](Money) | `Money = { minor, currency }`, never a float |
|
|
113
|
+
| [Outbound HTTP](Outbound-HTTP) | `outbound()`: one vendor call with a whole-call deadline, the caller's signal, safe-only retry, idle and byte bounds, `dial: 'public'` pinning, and `breaker()` |
|
|
114
|
+
| [Resource management](Resource-Management) | `Disposable` db resources, `using`/`await using`, idempotent release, compile-time pins |
|
|
115
|
+
| [Migrations and backfills](Migrations-And-Backfills) | one migration engine and ledger, concurrent index builds and drops outside a transaction, the destructive-migration rail, `backfill()` as a `job` factory |
|
|
116
|
+
| [Testing](Testing) | six test types, cloned databases, sealed network, the coverage floor, silent runs, `x verify` |
|
|
117
|
+
|
|
118
|
+
## Reference
|
|
119
|
+
|
|
120
|
+
| Page | What it covers |
|
|
121
|
+
|---|---|
|
|
122
|
+
| [CLI reference](CLI-Reference) | every `x` command and flag, with `--json` examples |
|
|
123
|
+
| [Error codes](Error-Codes) | every `X_*` code: meaning, cause, exact fix |
|
|
124
|
+
| [Configuration](Configuration) | every `app.config.ts` field and every env var |
|
|
125
|
+
| [Deployment](Deployment) | one image, six roles, `ROLE`/`PORT`, drain, compose, Helm, targets, the prebuilt island store, `docs/ops/` |
|
|
126
|
+
| [Deploy recipes](Deploy-Recipes) | per host — Compose, the chart, Fly.io, Render, Railway, Heroku, bare VM — the build source, port, health path, release command and services, each marked executed or not |
|
|
127
|
+
| [Observability](Observability) | counters, gauges, histograms, process and pool gauges, `MetricExporter`, the Prometheus body, `/metrics` on its own port, and what the chart still cannot reach |
|
|
128
|
+
| [Known gaps](Known-Gaps) | every defect and unfinished seam in the published release, named |
|
|
129
|
+
| [Upgrading](Upgrading) | one section per major with every manual edit, the in-flight major as a checklist under `[Unreleased]`, version skew — and how `x upgrade` walks them, one major per run |
|
|
130
|
+
| [Stability](Stability) | what semver covers and what it does not, one major per 90 days from v30, the support window, deprecation, the security exception |
|
|
131
|
+
| [Troubleshooting](Troubleshooting) | symptom → cause → fix |
|
|
132
|
+
| [FAQ](FAQ) | why Bun only, why no GraphQL, is it production ready |
|
|
133
|
+
| [Contributing](Contributing) | a pointer: `CONTRIBUTING.md` is the one contributor guide |
|
|
134
|
+
|
|
135
|
+
## The rules everything else follows
|
|
136
|
+
|
|
137
|
+
| Axiom | Consequence |
|
|
138
|
+
|---|---|
|
|
139
|
+
| One way to do each thing | no adapter zoo, no `mode:` escape hatches. Removing an alternative is a feature |
|
|
140
|
+
| Define once, project everywhere | one `action` → HTTP route + OpenAPI + typed client + job handle + MCP tool + tests |
|
|
141
|
+
| Enforced, not documented | a convention that isn't a build error doesn't exist |
|
|
142
|
+
| Errors are instructions | stable `X_*` code + cause + exact fix command + `--json` |
|
|
143
|
+
| One command means shippable | `x verify` green = deployable |
|
|
144
|
+
| The static path never pays for the app path | `site/` cannot import `app/`; 0kb JS is structural |
|
|
145
|
+
| Deploy anywhere = containers only | zero platform primitives |
|
|
146
|
+
| Ultimate ships mechanism; your app ships convention | mechanisms and structural conventions ship; business conventions never do. Tenancy ships, an org model does not — primitives are functions returning values, so an app wraps one → [Building your own base](Building-Your-Own-Base) |
|
|
147
|
+
| Useful, then efficient | working function first, bytes second. A budget is a measurement, not a ceiling to game: raise it by the measured amount, with the reason, rather than cut a feature. The static path still pays nothing for the app path |
|
|
148
|
+
|
|
149
|
+
## Source docs in the repo
|
|
150
|
+
|
|
151
|
+
| Where | What it is |
|
|
152
|
+
|---|---|
|
|
153
|
+
| [`docs/idea/`](https://github.com/developerz-ai/ultimate/tree/main/docs/idea) | **why** — the design spec |
|
|
154
|
+
| [`docs/architecture/`](https://github.com/developerz-ai/ultimate/tree/main/docs/architecture) | **how** — the internals |
|
|
155
|
+
| [`docs/ops/`](https://github.com/developerz-ai/ultimate/tree/main/docs/ops) | running an app for real: the PaaS → Compose → Kubernetes ladder, secrets, observability, datastore sizing, disaster recovery, runbooks. **Recommendations only** — the framework depends on none of it |
|
|
156
|
+
| [`docs/idea/16-app-targets.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/16-app-targets.md) | three targets, one backend, two view layers — **design only, not shipped behaviour** |
|
|
157
|
+
| [`docs/idea/17-scale-ladder.md`](https://github.com/developerz-ai/ultimate/blob/main/docs/idea/17-scale-ladder.md) | why the app code is identical at rung 0 and rung 4 — **shipped, not design only**: 24 of its 26 seam rows are marked shipped, rungs 0–2 are real, and the places the invariant breaks today are named |
|
|
158
|
+
| [`packages/ui/CATALOG.md`](https://github.com/developerz-ai/ultimate/blob/main/packages/ui/CATALOG.md) | the full component catalog with every prop, generated from source and drift-tested |
|
|
159
|
+
| [`framework.manifest.json`](https://github.com/developerz-ai/ultimate/blob/main/framework.manifest.json) | every package, tier, and `X_*` code with its owner — generated |
|
|
160
|
+
| [llms.txt](https://github.com/developerz-ai/ultimate/blob/main/llms.txt) | the machine-readable repo map for agents |
|