Ekklesia_Signage now builds on its own. A clean clone installs with pnpm install --frozen-lockfile and runs pnpm lint, typecheck, test, build and validate. The @ekklesia/* packages come from Ekklesia's public registry: no Ekklesia checkout, no workspace:*, no token. This is PR 2 of the Signage migration: dependencies and build only. Behaviour, schema and version (0.1.2) are unchanged.
Changes
Dependencies (ADR 0053).
workspace:* → ^0.2.0 for module-sdk, module-database, module-ui-sdk, ui and design-tokens (dependencies), and for module-ui-build and typescript-config (devDependencies).
@ekklesia/module-pack is added as a devDependency pinned exactly to 0.2.0. Nothing invokes it yet.
No @ekklesia/contracts dependency.
drizzle-orm stays a direct dependency; it satisfies the adapter's optional peer.
.npmrc:@ekklesia:registry=https://git.riverofglorymn.org/api/packages/River_of_Glory_Church/npm/. No credential, because reading needs none (ADR 0054).
pnpm-workspace.yaml holds this repository's pnpm settings only, and doesn't reference Ekklesia:
allowBuilds: esbuild: true, as the platform's standalone fixture does.
Exact-version minimumReleaseAgeExclude entries for the nine 0.2.0 packages in the lockfile. pnpm 11 holds back packages younger than its minimum release age, and refuses a lockfile that names one, and this train was published today. Everything else keeps the policy.
The platform's narrowly scoped override for GHSA-67mh-4wv8-2f99 (esbuild 0.18.20 via drizzle-kit). Signage inherited it while building inside Ekklesia's workspace; without it, going standalone would bring the advisory back.
Node and pnpm:engines.node">=24.11.0 <25" and packageManager[email protected], both exactly as in Ekklesia 0.2.0 (module-pack requires engines.node). .node-version is 24.18.0, as in Ekklesia, and CI uses it.
biome.json: inside the workspace, biome lint used the platform root's config. Signage now carries the same config, so lint rules are unchanged; it also excludes .pnpm-store/, which pnpm creates at the checkout root in Gitea CI.
pnpm-lock.yaml: Signage's own lockfile: registry tarball URLs with sha512 integrity, and no workspace, file: or link: entries or local paths.
Scripts:prepack is now pnpm run build, replacing the workspace-root turbo call. New pnpm validate (scripts/validate-module.mjs) checks the built package and its migrations using only the published SDK parsers:
the manifest, and that its identity matches package.json;
that every entrypoint exists in dist;
that the built runtime's id, version and database ABI match the manifest;
that the built schema entrypoint exports only plain metadata, with namespaced tables and module-internal foreign keys;
that the installed SDK satisfies compatibility.moduleSdk;
that the migration journal and policy parse and agree, and every migration's SQL is present.
I checked that it fails on a stale ^0.1.0 range and on a missing migration SQL file.
CI:lint, typecheck, test and build each run checkout → setup-node (.node-version) → Corepack → pnpm install --frozen-lockfile → their command. lint also runs ci/check-cleanup.sh, and build also runs pnpm validate. No job clones Ekklesia.
Integration job: still if: false. Its explanation now says it returns when Signage is built as a canonical linux-x64-glibc Module Package and installed into Ekklesia's generic image. Its first step is now an explicit failing placeholder instead of a call to the deleted assembly script, and ci/integration.sh's header says it isn't run.
Docs: the README's development section now covers cloning and building Signage with no Ekklesia knowledge: Corepack, pnpm install --frozen-lockfile, the public registry with no token, the Node requirement, the commands, and what pnpm validate can't check.
Not standalone-checkable (named, not worked around)
Core's own pnpm modules:validate and pnpm migrations:validate aren't published packages. pnpm validate covers what the published parsers can check. What only an Ekklesia installation can check:
platform-installation compatibility;
other installed modules' capabilities and dependencies;
migration checksums against applied history.
The packager and the platform verifier re-check everything in PR 3.
Verification
This checkout: frozen install, lint, typecheck, test (22 files, 261 tests), build, pnpm validate (20 checks) and ci/check-cleanup.sh all pass.
Clean-clone proof, run twice from two unrelated temporary paths. Each run cloned this commit anonymously over HTTPS, with an isolated empty HOME (no user .npmrc, no token, no pnpm config) and an empty pnpm store. In both runs:
no Ekklesia checkout or workspace in any parent directory;
frozen install, lint, typecheck, test (261), build and validate all pass;
no workspace:, file: or link: entries and no local path in package.json or pnpm-lock.yaml;
each of the nine @ekklesia packages was re-downloaded anonymously from the registry; its sha512 equals the lockfile's integrity, and the installed files are byte-identical to the tarball;
@ekklesia/module-pack is exactly 0.2.0 in both package.json and the lockfile;
pnpm store status reports only esbuild, whose allowed install script rewrites its own binary, and no @ekklesia package.
The two builds' dist/ outputs are byte-identical (148 files) and contain no local paths.
Found on the way (not changed here)
pnpm audit reports advisories in versions Signage already pinned on main, unchanged by this PR:
sharp 0.35.4: high, GHSA-wq5f-xc86-pv6w, librsvg;
happy-dom 20.0.11: high, test-only;
vitest 4.1.10: moderate, test-only.
The sharp fix (0.35.5) needs @img/[email protected], but [email protected] only carries the reviewed license supplement for libvips 1.3.3. Native packaging with the fixed sharp will therefore likely need a new reviewed supplement in an Ekklesia release, which PR 3 should plan for.
Not in this PR
linux-x64-glibc Module Package creation, native sharp packaging, a license field and LICENSE file (ADR 0051), and re-enabling the integration job: PR 3.
Ekklesia_Signage now builds on its own. A clean clone installs with `pnpm install --frozen-lockfile` and runs `pnpm lint`, `typecheck`, `test`, `build` and `validate`. The `@ekklesia/*` packages come from Ekklesia's public registry: no Ekklesia checkout, no `workspace:*`, no token. This is PR 2 of the Signage migration: dependencies and build only. Behaviour, schema and version (0.1.2) are unchanged.
## Changes
- **Dependencies (ADR 0053).**
- `workspace:*` → `^0.2.0` for `module-sdk`, `module-database`, `module-ui-sdk`, `ui` and `design-tokens` (dependencies), and for `module-ui-build` and `typescript-config` (devDependencies).
- **`@ekklesia/module-pack` is added as a devDependency pinned exactly to `0.2.0`.** Nothing invokes it yet.
- No `@ekklesia/contracts` dependency.
- `drizzle-orm` stays a direct dependency; it satisfies the adapter's optional peer.
- **`.npmrc`:** `@ekklesia:registry=https://git.riverofglorymn.org/api/packages/River_of_Glory_Church/npm/`. No credential, because reading needs none (ADR 0054).
- **`pnpm-workspace.yaml`** holds this repository's pnpm settings only, and doesn't reference Ekklesia:
- `allowBuilds: esbuild: true`, as the platform's standalone fixture does.
- Exact-version `minimumReleaseAgeExclude` entries for the nine 0.2.0 packages in the lockfile. pnpm 11 holds back packages younger than its minimum release age, and refuses a lockfile that names one, and this train was published today. Everything else keeps the policy.
- The platform's narrowly scoped override for **GHSA-67mh-4wv8-2f99** (esbuild 0.18.20 via `drizzle-kit`). Signage inherited it while building inside Ekklesia's workspace; without it, going standalone would bring the advisory back.
- **Node and pnpm:** `engines.node` `">=24.11.0 <25"` and `packageManager` `[email protected]`, both exactly as in Ekklesia 0.2.0 (module-pack requires `engines.node`). `.node-version` is 24.18.0, as in Ekklesia, and CI uses it.
- **`biome.json`:** inside the workspace, `biome lint` used the platform root's config. Signage now carries the same config, so lint rules are unchanged; it also excludes `.pnpm-store/`, which pnpm creates at the checkout root in Gitea CI.
- **`pnpm-lock.yaml`:** Signage's own lockfile: registry tarball URLs with sha512 integrity, and no workspace, `file:` or `link:` entries or local paths.
- **Scripts:** `prepack` is now `pnpm run build`, replacing the workspace-root turbo call. New **`pnpm validate`** (`scripts/validate-module.mjs`) checks the built package and its migrations using only the published SDK parsers:
- the manifest, and that its identity matches `package.json`;
- that every entrypoint exists in `dist`;
- that the built runtime's id, version and database ABI match the manifest;
- that the built schema entrypoint exports only plain metadata, with namespaced tables and module-internal foreign keys;
- that the installed SDK satisfies `compatibility.moduleSdk`;
- that the migration journal and policy parse and agree, and every migration's SQL is present.
I checked that it fails on a stale `^0.1.0` range and on a missing migration SQL file.
- **Deleted:** `ci/assemble.sh`, `ci/platform.env`, `ci/pnpm-lock.yaml`, `ci/update-lock.sh`.
- **CI:** `lint`, `typecheck`, `test` and `build` each run checkout → setup-node (`.node-version`) → Corepack → `pnpm install --frozen-lockfile` → their command. `lint` also runs `ci/check-cleanup.sh`, and `build` also runs `pnpm validate`. No job clones Ekklesia.
- **Integration job:** still `if: false`. Its explanation now says it returns when Signage is built as a canonical linux-x64-glibc Module Package and installed into Ekklesia's generic image. Its first step is now an explicit failing placeholder instead of a call to the deleted assembly script, and `ci/integration.sh`'s header says it isn't run.
- **Docs:** the README's development section now covers cloning and building Signage with no Ekklesia knowledge: Corepack, `pnpm install --frozen-lockfile`, the public registry with no token, the Node requirement, the commands, and what `pnpm validate` can't check.
## Not standalone-checkable (named, not worked around)
Core's own `pnpm modules:validate` and `pnpm migrations:validate` aren't published packages. `pnpm validate` covers what the published parsers can check. What only an Ekklesia installation can check:
- platform-installation compatibility;
- other installed modules' capabilities and dependencies;
- migration checksums against applied history.
The packager and the platform verifier re-check everything in PR 3.
## Verification
- **This checkout:** frozen install, lint, typecheck, test (22 files, 261 tests), build, `pnpm validate` (20 checks) and `ci/check-cleanup.sh` all pass.
- **Clean-clone proof**, run twice from two unrelated temporary paths. Each run cloned this commit anonymously over HTTPS, with an isolated empty `HOME` (no user `.npmrc`, no token, no pnpm config) and an empty pnpm store. In both runs:
- no Ekklesia checkout or workspace in any parent directory;
- frozen install, lint, typecheck, test (261), build and validate all pass;
- no `workspace:`, `file:` or `link:` entries and no local path in `package.json` or `pnpm-lock.yaml`;
- each of the nine `@ekklesia` packages was re-downloaded anonymously from the registry; its sha512 equals the lockfile's integrity, and the installed files are byte-identical to the tarball;
- `@ekklesia/module-pack` is exactly 0.2.0 in both `package.json` and the lockfile;
- `pnpm store status` reports only esbuild, whose allowed install script rewrites its own binary, and no `@ekklesia` package.
- The two builds' `dist/` outputs are byte-identical (148 files) and contain no local paths.
## Found on the way (not changed here)
`pnpm audit` reports advisories in versions Signage already pinned on main, unchanged by this PR:
- `sharp` 0.35.4: **high**, GHSA-wq5f-xc86-pv6w, librsvg;
- `happy-dom` 20.0.11: high, test-only;
- `vitest` 4.1.10: moderate, test-only.
The sharp fix (0.35.5) needs `@img/[email protected]`, but `[email protected]` only carries the reviewed license supplement for libvips **1.3.3**. Native packaging with the fixed sharp will therefore likely need a new reviewed supplement in an Ekklesia release, which PR 3 should plan for.
## Not in this PR
- linux-x64-glibc Module Package creation, native sharp packaging, a `license` field and `LICENSE` file (ADR 0051), and re-enabling the integration job: PR 3.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Signage no longer needs an Ekklesia checkout. A clean clone installs with
`pnpm install --frozen-lockfile` and runs lint, typecheck, test, build, and validate by itself, taking
Ekklesia's module-development packages from Ekklesia's public registry (ADRs 0053 and 0054).
- Dependencies: every `workspace:*` becomes `^0.2.0`. @ekklesia/module-pack is added as a
devDependency pinned exactly to 0.2.0, as ADR 0053 requires; it is not invoked yet. No
@ekklesia/contracts dependency. drizzle-orm stays a direct dependency, satisfying the adapter's
optional peer.
- .npmrc points the @ekklesia scope at
https://git.riverofglorymn.org/api/packages/River_of_Glory_Church/npm/ with no credential, because
reading needs none.
- pnpm-workspace.yaml holds this repository's pnpm settings only:
- `allowBuilds: esbuild: true`, as the platform's standalone fixture does;
- exact-version minimumReleaseAgeExclude entries for the 0.2.0 train, which pnpm 11 otherwise holds
back on its release day;
- the platform's narrowly scoped override for GHSA-67mh-4wv8-2f99 (esbuild via drizzle-kit), which
Signage inherited while it built inside Ekklesia's workspace.
- engines.node `>=24.11.0 <25` and packageManager `[email protected].0`, both from Ekklesia 0.2.0. Node
24.18.0 goes in .node-version for CI, as in Ekklesia.
- biome.json carries the platform's Biome configuration, which `biome lint` used to pick up from the
workspace root, so lint rules are unchanged.
- pnpm-lock.yaml is Signage's own: registry tarballs with integrity hashes, and no workspace or file
links.
- `prepack` runs this package's own build instead of the workspace root's turbo.
- `pnpm validate` (scripts/validate-module.mjs) checks the built package and its migrations with the
published SDK parsers only:
- the manifest, its identity, and its entrypoints;
- that the built runtime's id, version, and database ABI match the manifest;
- that the built schema metadata is plain, namespaced, and has module-internal foreign keys;
- the SDK compatibility range;
- that the migration journal and policy agree.
Core's own `modules:validate` and `migrations:validate` are not published. What only an Ekklesia
installation can check is named in the script.
Removed: ci/assemble.sh, ci/platform.env, ci/pnpm-lock.yaml, ci/update-lock.sh. The lint, typecheck,
test, and build jobs check out only this repository; build also runs `pnpm validate`. The integration
job stays disabled. Its first step is now an explicit placeholder rather than the deleted assembly,
and its explanation says it returns when Signage is a canonical linux-x64-glibc Module Package
installed into Ekklesia's generic image.
No source, behaviour, schema, or version change: Signage stays 0.1.2.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Ekklesia_Signage now builds on its own. A clean clone installs with
pnpm install --frozen-lockfileand runspnpm lint,typecheck,test,buildandvalidate. The@ekklesia/*packages come from Ekklesia's public registry: no Ekklesia checkout, noworkspace:*, no token. This is PR 2 of the Signage migration: dependencies and build only. Behaviour, schema and version (0.1.2) are unchanged.Changes
Dependencies (ADR 0053).
workspace:*→^0.2.0formodule-sdk,module-database,module-ui-sdk,uianddesign-tokens(dependencies), and formodule-ui-buildandtypescript-config(devDependencies).@ekklesia/module-packis added as a devDependency pinned exactly to0.2.0. Nothing invokes it yet.@ekklesia/contractsdependency.drizzle-ormstays a direct dependency; it satisfies the adapter's optional peer..npmrc:@ekklesia:registry=https://git.riverofglorymn.org/api/packages/River_of_Glory_Church/npm/. No credential, because reading needs none (ADR 0054).pnpm-workspace.yamlholds this repository's pnpm settings only, and doesn't reference Ekklesia:allowBuilds: esbuild: true, as the platform's standalone fixture does.minimumReleaseAgeExcludeentries for the nine 0.2.0 packages in the lockfile. pnpm 11 holds back packages younger than its minimum release age, and refuses a lockfile that names one, and this train was published today. Everything else keeps the policy.drizzle-kit). Signage inherited it while building inside Ekklesia's workspace; without it, going standalone would bring the advisory back.Node and pnpm:
engines.node">=24.11.0 <25"andpackageManager[email protected], both exactly as in Ekklesia 0.2.0 (module-pack requiresengines.node)..node-versionis 24.18.0, as in Ekklesia, and CI uses it.biome.json: inside the workspace,biome lintused the platform root's config. Signage now carries the same config, so lint rules are unchanged; it also excludes.pnpm-store/, which pnpm creates at the checkout root in Gitea CI.pnpm-lock.yaml: Signage's own lockfile: registry tarball URLs with sha512 integrity, and no workspace,file:orlink:entries or local paths.Scripts:
prepackis nowpnpm run build, replacing the workspace-root turbo call. Newpnpm validate(scripts/validate-module.mjs) checks the built package and its migrations using only the published SDK parsers:package.json;dist;compatibility.moduleSdk;I checked that it fails on a stale
^0.1.0range and on a missing migration SQL file.Deleted:
ci/assemble.sh,ci/platform.env,ci/pnpm-lock.yaml,ci/update-lock.sh.CI:
lint,typecheck,testandbuildeach run checkout → setup-node (.node-version) → Corepack →pnpm install --frozen-lockfile→ their command.lintalso runsci/check-cleanup.sh, andbuildalso runspnpm validate. No job clones Ekklesia.Integration job: still
if: false. Its explanation now says it returns when Signage is built as a canonical linux-x64-glibc Module Package and installed into Ekklesia's generic image. Its first step is now an explicit failing placeholder instead of a call to the deleted assembly script, andci/integration.sh's header says it isn't run.Docs: the README's development section now covers cloning and building Signage with no Ekklesia knowledge: Corepack,
pnpm install --frozen-lockfile, the public registry with no token, the Node requirement, the commands, and whatpnpm validatecan't check.Not standalone-checkable (named, not worked around)
Core's own
pnpm modules:validateandpnpm migrations:validatearen't published packages.pnpm validatecovers what the published parsers can check. What only an Ekklesia installation can check:The packager and the platform verifier re-check everything in PR 3.
Verification
pnpm validate(20 checks) andci/check-cleanup.shall pass.HOME(no user.npmrc, no token, no pnpm config) and an empty pnpm store. In both runs:workspace:,file:orlink:entries and no local path inpackage.jsonorpnpm-lock.yaml;@ekklesiapackages was re-downloaded anonymously from the registry; its sha512 equals the lockfile's integrity, and the installed files are byte-identical to the tarball;@ekklesia/module-packis exactly 0.2.0 in bothpackage.jsonand the lockfile;pnpm store statusreports only esbuild, whose allowed install script rewrites its own binary, and no@ekklesiapackage.dist/outputs are byte-identical (148 files) and contain no local paths.Found on the way (not changed here)
pnpm auditreports advisories in versions Signage already pinned on main, unchanged by this PR:sharp0.35.4: high, GHSA-wq5f-xc86-pv6w, librsvg;happy-dom20.0.11: high, test-only;vitest4.1.10: moderate, test-only.The sharp fix (0.35.5) needs
@img/[email protected], but[email protected]only carries the reviewed license supplement for libvips 1.3.3. Native packaging with the fixed sharp will therefore likely need a new reviewed supplement in an Ekklesia release, which PR 3 should plan for.Not in this PR
licensefield andLICENSEfile (ADR 0051), and re-enabling the integration job: PR 3.🤖 Generated with Claude Code