Adds Core-owned identity contracts, a Core-owned Better Auth database schema (ekklesia_core_user/session/account/verification), a first-class Core-owned migration source that coexists with module-owned migrations under the exact existing migration system, and an explicit Better Auth construction boundary. No authentication endpoint or sign-in UI is exposed yet (ADR 0010). Co-Authored-By: Claude Sonnet 5 <[email protected]>
138 lines
6.1 KiB
Markdown
138 lines
6.1 KiB
Markdown
# Ekklesia
|
|
|
|
Ekklesia is an open, modular church technology platform for composing backend capabilities
|
|
into independently developed dashboards, websites, mobile apps, kiosks, displays, and other
|
|
surfaces.
|
|
|
|
## Current status
|
|
|
|
Phase 3 is complete and Phase 4A (Core identity foundation) has landed. The repository includes
|
|
public module contracts, independently versioned capabilities, static module manifests,
|
|
deterministic automatic discovery, compiled server loading, a staged capability registry,
|
|
dependency-ordered lifecycle with rollback, module-owned Drizzle table contracts, deterministic
|
|
schema aggregation, and a cloneable backend-only module template. Migration artifacts have
|
|
module-owned Drizzle contracts, deterministic offline discovery, explicit destructive-change
|
|
declarations, and exact checksums. Core provides read-only applied-history planning and a locked,
|
|
whole-batch transactional PostgreSQL runner with exact external destructive approval matching. A
|
|
hermetic live PostgreSQL suite proves history, rollback, statement breakpoints, advisory-lock
|
|
concurrency and release, exact destructive approvals, and sanitization against the production
|
|
adapter. A Core-owned `pnpm doctor` dashboard combines the existing static discovery and read-only
|
|
migration-planning services into one concise readiness report.
|
|
|
|
Phase 4A adds Core-owned identity foundations: a Core-owned Better Auth database schema
|
|
(`ekklesia_core_user`, `ekklesia_core_session`, `ekklesia_core_account`,
|
|
`ekklesia_core_verification`), a first-class Core-owned migration source that coexists with
|
|
module-owned migrations under the exact same migration system, minimal opaque-identity contracts
|
|
in `@ekklesia/contracts`, and an explicit Better Auth construction boundary in Core. See
|
|
[Identity](docs/development/identity.md) and
|
|
[ADR 0010](docs/architecture/decisions/0010-core-identity-and-better-auth-adoption.md) for details.
|
|
**No authentication endpoint or sign-in UI exists yet** — that, along with production
|
|
approval-provider composition, HTTP routing, jobs, physical storage provisioning, surfaces, and
|
|
feature modules, remains later vertical slices.
|
|
|
|
## Quick start
|
|
|
|
Prerequisites: Node.js 24 LTS, pnpm 11.12, and Docker with Compose.
|
|
|
|
```bash
|
|
pnpm install --frozen-lockfile
|
|
cp .env.example .env
|
|
pnpm infrastructure:up
|
|
pnpm modules:validate
|
|
pnpm migrations:validate
|
|
pnpm identity:schema:validate
|
|
pnpm doctor
|
|
pnpm migrations:plan
|
|
pnpm test:migrations:integration
|
|
pnpm verify
|
|
```
|
|
|
|
`pnpm doctor` builds the workspace first, then reports the supported Node.js runtime, installed
|
|
modules and dependency order, schema and migration inventories, optional read-only PostgreSQL
|
|
planning, and the current object-storage integration state. It never applies migrations, creates a
|
|
history table, starts module servers, or performs storage operations. Schema discovery does import
|
|
compiled schema-definition entrypoints; those entrypoints are contractually side-effect-free.
|
|
|
|
With no installed modules and no `DATABASE_URL`, the current repository produces a report shaped
|
|
like this:
|
|
|
|
```text
|
|
Ekklesia Doctor
|
|
|
|
Platform
|
|
✓ Runtime version supported
|
|
Active Node.js satisfies the declared supported range.
|
|
|
|
Modules
|
|
✓ Module discovery complete
|
|
0 modules installed
|
|
✓ Dependency graph valid
|
|
Dependency order is empty.
|
|
|
|
Data definitions
|
|
✓ Schemas validated
|
|
0 modules · 0 tables
|
|
✓ Migrations validated
|
|
1 migration · checksums valid
|
|
core:0000_identity_core_tables · f8f2086ef06f
|
|
|
|
PostgreSQL
|
|
○ Connection check skipped
|
|
DATABASE_URL is not configured.
|
|
○ Migration plan skipped
|
|
A validated migration inventory and configured PostgreSQL connection are required.
|
|
|
|
Identity
|
|
○ Identity configuration skipped
|
|
Core identity schema defines 4 tables (ekklesia_core_account, ekklesia_core_session, ekklesia_core_user, ekklesia_core_verification).
|
|
Identity runtime configuration (signing key, base URL, trusted origins) is not set.
|
|
|
|
Object storage
|
|
○ Check unavailable
|
|
Core storage integration has not been implemented yet.
|
|
|
|
Result: READY WITH WARNINGS
|
|
```
|
|
|
|
Checks have stable pass, warning, failure, or skipped states. Warnings and skipped optional checks
|
|
produce `READY WITH WARNINGS` and exit zero; any failure produces `NOT READY` and exit one. The
|
|
dashboard is human-readable local guidance, not a replacement for automated CI evidence.
|
|
|
|
`pnpm migrations:plan` uses `DATABASE_URL` from the uncommitted `.env` and is read-only.
|
|
`pnpm migrations:apply` uses the same validated inventory but mutates PostgreSQL under Core's
|
|
advisory lock and one transaction. Review the plan before applying. Destructive migrations are
|
|
blocked by default and require an exact externally supplied approval; there is no force flag.
|
|
|
|
The runner has both deterministic unit coverage through a narrow database port and a separate live
|
|
PostgreSQL integration suite. The live command creates and destroys disposable Docker
|
|
infrastructure; it remains separate from the Docker-free `pnpm verify` gate.
|
|
|
|
`pnpm identity:schema:validate` regenerates Better Auth's canonical schema with the pinned local
|
|
CLI into a temporary location and structurally compares it against the checked-in
|
|
`core/src/identity/schema.ts`, then removes the temporary output. It requires no `DATABASE_URL`
|
|
and is part of `pnpm verify`. See [Identity](docs/development/identity.md) for the full upgrade
|
|
workflow.
|
|
|
|
Run `pnpm infrastructure:smoke` for an isolated end-to-end PostgreSQL and authenticated S3 check.
|
|
|
|
The development services bind only to loopback:
|
|
|
|
- PostgreSQL: `127.0.0.1:5432`
|
|
- S3-compatible object storage: `127.0.0.1:8333`
|
|
|
|
The values in `.env.example` are development-only and must never be reused in a deployed
|
|
environment.
|
|
|
|
## Architecture
|
|
|
|
- [Platform architecture](docs/architecture/platform-architecture.md)
|
|
- [Repository boundaries](docs/architecture/repository-boundaries.md)
|
|
- [Repository workflow](docs/development/repository-workflow.md)
|
|
- [Testing](docs/development/testing.md)
|
|
- [Identity](docs/development/identity.md)
|
|
- [Module development](docs/module-development/README.md)
|
|
- [Architecture decisions](docs/architecture/decisions/README.md)
|
|
|
|
No open-source license has been selected yet. A license should be added only after the project
|
|
owner makes that decision.
|