chore(release): prepare 0.2.0 #82

Merged
Zayin_Admin merged 1 commits from chore/release-0.2.0 into main 2026-10-08 22:36:19 +00:00
33 changed files with 85 additions and 77 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/api", "name": "@ekklesia/api",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"private": true, "private": true,
"type": "module", "type": "module",
+9 -9
View File
@@ -221,9 +221,9 @@ async function applyCoreMigrations(url: string): Promise<void> {
const aggregate = await discoverAllMigrations({ const aggregate = await discoverAllMigrations({
coreMigrationsDirectory, coreMigrationsDirectory,
moduleDiscovery: { moduleDiscovery: {
moduleSdkVersion: "0.1.0", moduleSdkVersion: "0.2.0",
modulesDirectory: emptyModulesDirectory, modulesDirectory: emptyModulesDirectory,
platformVersion: "0.1.0", platformVersion: "0.2.0",
}, },
}); });
// Phase 4A's and Phase 4C pass 1's committed migrations must not have drifted while building // Phase 4A's and Phase 4C pass 1's committed migrations must not have drifted while building
@@ -339,7 +339,7 @@ async function createGatedRouteModule(
writeFile( writeFile(
path.join(moduleDirectory, "ekklesia.module.json"), path.join(moduleDirectory, "ekklesia.module.json"),
JSON.stringify({ JSON.stringify({
compatibility: { moduleSdk: "^0.1.0", platform: "^0.1.0" }, compatibility: { moduleSdk: "^0.2.0", platform: "^0.2.0" },
entrypoints: { server: "./dist/server/index.js" }, entrypoints: { server: "./dist/server/index.js" },
id, id,
manifestVersion: 8, manifestVersion: 8,
@@ -390,7 +390,7 @@ async function createFixtureModule(
id, id,
name: `${id} module`, name: `${id} module`,
version: "0.1.0", version: "0.1.0",
compatibility: { platform: "^0.1.0", moduleSdk: "^0.1.0" }, compatibility: { platform: "^0.2.0", moduleSdk: "^0.2.0" },
permissions: [], permissions: [],
entrypoints: { server: "./dist/server/index.js" }, entrypoints: { server: "./dist/server/index.js" },
...manifestOverrides, ...manifestOverrides,
@@ -521,7 +521,7 @@ async function createUiModule(
writeFile( writeFile(
path.join(moduleDirectory, "ekklesia.module.json"), path.join(moduleDirectory, "ekklesia.module.json"),
JSON.stringify({ JSON.stringify({
compatibility: { moduleSdk: "^0.1.0", platform: "^0.1.0" }, compatibility: { moduleSdk: "^0.2.0", platform: "^0.2.0" },
entrypoints: { server: "./dist/server/index.js", ui: "./dist/ui/index.js" }, entrypoints: { server: "./dist/server/index.js", ui: "./dist/ui/index.js" },
id, id,
manifestVersion: 8, manifestVersion: 8,
@@ -2592,9 +2592,9 @@ describe.sequential("live API — installed module permission end-to-end", () =>
const report = await diagnoseEkklesia({ const report = await diagnoseEkklesia({
coreMigrationsDirectory, coreMigrationsDirectory,
moduleDiscovery: { moduleDiscovery: {
moduleSdkVersion: "0.1.0", moduleSdkVersion: "0.2.0",
modulesDirectory, modulesDirectory,
platformVersion: "0.1.0", platformVersion: "0.2.0",
}, },
runtimeRange: ">=0.0.0", runtimeRange: ">=0.0.0",
runtimeVersion: process.versions.node, runtimeVersion: process.versions.node,
@@ -3906,9 +3906,9 @@ describe.sequential("live API — module lifecycle governs what actually runs",
const aggregate = await discoverAllMigrations({ const aggregate = await discoverAllMigrations({
coreMigrationsDirectory, coreMigrationsDirectory,
moduleDiscovery: { moduleDiscovery: {
moduleSdkVersion: "0.1.0", moduleSdkVersion: "0.2.0",
modulesDirectory, modulesDirectory,
platformVersion: "0.1.0", platformVersion: "0.2.0",
}, },
}); });
expect(aggregate.discoveredModules.map((module) => module.manifest.id)).toEqual(["calendar"]); expect(aggregate.discoveredModules.map((module) => module.manifest.id)).toEqual(["calendar"]);
+1 -1
View File
@@ -118,7 +118,7 @@ async function createDisplayModuleDirectory(): Promise<string> {
writeFile( writeFile(
path.join(moduleDirectory, "ekklesia.module.json"), path.join(moduleDirectory, "ekklesia.module.json"),
JSON.stringify({ JSON.stringify({
compatibility: { moduleSdk: "^0.1.0", platform: "^0.1.0" }, compatibility: { moduleSdk: "^0.2.0", platform: "^0.2.0" },
entrypoints: { entrypoints: {
display: { artifact: "./dist/ui/display.js", permission: displayPermission }, display: { artifact: "./dist/ui/display.js", permission: displayPermission },
server: "./dist/server/index.js", server: "./dist/server/index.js",
+4 -4
View File
@@ -108,7 +108,7 @@ async function createFixtureModule(
id, id,
name: `${id} module`, name: `${id} module`,
version: "0.1.0", version: "0.1.0",
compatibility: { platform: "^0.1.0", moduleSdk: "^0.1.0" }, compatibility: { platform: "^0.2.0", moduleSdk: "^0.2.0" },
permissions: [], permissions: [],
entrypoints: { server: "./dist/server/index.js" }, entrypoints: { server: "./dist/server/index.js" },
...manifestOverrides, ...manifestOverrides,
@@ -267,7 +267,7 @@ function fakeDiscoveredModule(
): DiscoveredModule { ): DiscoveredModule {
const manifest = parseModuleManifest({ const manifest = parseModuleManifest({
capabilities: [], capabilities: [],
compatibility: { moduleSdk: "^0.1.0", platform: "^0.1.0" }, compatibility: { moduleSdk: "^0.2.0", platform: "^0.2.0" },
entrypoints: { server: "./dist/does-not-exist/index.js" }, entrypoints: { server: "./dist/does-not-exist/index.js" },
id, id,
manifestVersion: 8, manifestVersion: 8,
@@ -1435,9 +1435,9 @@ describe("Ekklesia API module runtime startup and shutdown", () => {
const recorder = createEventRecorder(); const recorder = createEventRecorder();
await createWorkingFixtureModule(modulesDirectory, "calendar", recorder, { withRoute: true }); await createWorkingFixtureModule(modulesDirectory, "calendar", recorder, { withRoute: true });
const discovered = await (await import("@ekklesia/core/modules")).discoverModules({ const discovered = await (await import("@ekklesia/core/modules")).discoverModules({
moduleSdkVersion: "0.1.0", moduleSdkVersion: "0.2.0",
modulesDirectory, modulesDirectory,
platformVersion: "0.1.0", platformVersion: "0.2.0",
}); });
mockPoolAndAuth(); mockPoolAndAuth();
mockSuccessfulServe(); mockSuccessfulServe();
@@ -212,9 +212,9 @@ async function applyCoreMigrations(url: string): Promise<void> {
const aggregate = await discoverAllMigrations({ const aggregate = await discoverAllMigrations({
coreMigrationsDirectory, coreMigrationsDirectory,
moduleDiscovery: { moduleDiscovery: {
moduleSdkVersion: "0.1.0", moduleSdkVersion: "0.2.0",
modulesDirectory: emptyModulesDirectory, modulesDirectory: emptyModulesDirectory,
platformVersion: "0.1.0", platformVersion: "0.2.0",
}, },
}); });
expect(aggregate.migrations.map((entry) => entry.identity)).toEqual([ expect(aggregate.migrations.map((entry) => entry.identity)).toEqual([
@@ -241,9 +241,9 @@ async function applyMigrationsWithModule(url: string): Promise<void> {
const aggregate = await discoverAllMigrations({ const aggregate = await discoverAllMigrations({
coreMigrationsDirectory, coreMigrationsDirectory,
moduleDiscovery: { moduleDiscovery: {
moduleSdkVersion: "0.1.0", moduleSdkVersion: "0.2.0",
modulesDirectory: fixtureModulesDirectory, modulesDirectory: fixtureModulesDirectory,
platformVersion: "0.1.0", platformVersion: "0.2.0",
}, },
}); });
// Core migrations aggregate first, exactly once each, and always before any module migration. // Core migrations aggregate first, exactly once each, and always before any module migration.
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/core", "name": "@ekklesia/core",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"private": true, "private": true,
"type": "module", "type": "module",
@@ -5,8 +5,8 @@
"description": "Test-only installed module fixture proving ModuleDatabase against real PostgreSQL. Never discovered by production startup, Doctor, or normal migration aggregation — only apps/api/tests/module-database.integration.ts points discovery at it explicitly.", "description": "Test-only installed module fixture proving ModuleDatabase against real PostgreSQL. Never discovered by production startup, Doctor, or normal migration aggregation — only apps/api/tests/module-database.integration.ts points discovery at it explicitly.",
"version": "0.1.0", "version": "0.1.0",
"compatibility": { "compatibility": {
"platform": "^0.1.0", "platform": "^0.2.0",
"moduleSdk": "^0.1.0" "moduleSdk": "^0.2.0"
}, },
"permissions": [ "permissions": [
{ {
@@ -35,9 +35,9 @@ async function createModulesDirectory(): Promise<string> {
function discoveryOptions(modulesDirectory: string) { function discoveryOptions(modulesDirectory: string) {
return { return {
moduleSdkVersion: "0.1.0", moduleSdkVersion: "0.2.0",
modulesDirectory, modulesDirectory,
platformVersion: "0.1.0", platformVersion: "0.2.0",
}; };
} }
@@ -18,8 +18,8 @@ import {
const platform = { const platform = {
databaseRuntime: { "drizzle-orm": "0.45.2" }, databaseRuntime: { "drizzle-orm": "0.45.2" },
moduleSdkVersion: "0.1.2", moduleSdkVersion: "0.2.0",
platformVersion: "0.1.2", platformVersion: "0.2.0",
} as const; } as const;
const temporaryDirectories: string[] = []; const temporaryDirectories: string[] = [];
+1 -1
View File
@@ -1905,7 +1905,7 @@ describe.sequential("live PostgreSQL migration timeout precedence", () => {
describe.sequential("live PostgreSQL retained history for an uninstalled module", () => { describe.sequential("live PostgreSQL retained history for an uninstalled module", () => {
const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", ".."); const repositoryRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
const templateModule = path.join(repositoryRoot, "templates", "module"); const templateModule = path.join(repositoryRoot, "templates", "module");
const versions = { moduleSdkVersion: "0.1.0", platformVersion: "0.1.0" } as const; const versions = { moduleSdkVersion: "0.2.0", platformVersion: "0.2.0" } as const;
async function coreWithoutNewestMigration(directory: string): Promise<string> { async function coreWithoutNewestMigration(directory: string): Promise<string> {
const target = path.join(directory, "core-drizzle"); const target = path.join(directory, "core-drizzle");
@@ -54,7 +54,7 @@ export function manifestFor(
id, id,
name: `${id} module`, name: `${id} module`,
version: "0.1.0", version: "0.1.0",
compatibility: { platform: "^0.1.0", moduleSdk: "^0.1.0" }, compatibility: { platform: "^0.2.0", moduleSdk: "^0.2.0" },
...(options.dependencies ? { dependencies: options.dependencies } : {}), ...(options.dependencies ? { dependencies: options.dependencies } : {}),
capabilities: [], capabilities: [],
permissions: [], permissions: [],
+2 -2
View File
@@ -180,9 +180,9 @@ export async function modulePackageFixture(
runtime: { node: ">=20" }, runtime: { node: ">=20" },
provenance: { provenance: {
revision: "86ae907f59458508e3277666cdd214f5bd7c1078", revision: "86ae907f59458508e3277666cdd214f5bd7c1078",
packager: { name: "@ekklesia/module-pack", version: "0.1.2" }, packager: { name: "@ekklesia/module-pack", version: "0.2.0" },
}, },
incorporates: { "@ekklesia/module-sdk": "0.1.2" }, incorporates: { "@ekklesia/module-sdk": "0.2.0" },
files: listed, files: listed,
}; };
const metadata = options.metadata ? options.metadata(baseMetadata) : baseMetadata; const metadata = options.metadata ? options.metadata(baseMetadata) : baseMetadata;
+2 -2
View File
@@ -500,10 +500,10 @@ finds its files:
```sh ```sh
docker build \ docker build \
--file deploy/Dockerfile \ --file deploy/Dockerfile \
--build-arg VERSION=0.1.2 \ --build-arg VERSION=0.2.0 \
--build-arg REVISION="$(git rev-parse HEAD)" \ --build-arg REVISION="$(git rev-parse HEAD)" \
--build-arg SOURCE=https://git.example.org/your-org/ekklesia \ --build-arg SOURCE=https://git.example.org/your-org/ekklesia \
--tag ekklesia:0.1.2 \ --tag ekklesia:0.2.0 \
. .
``` ```
+14 -6
View File
@@ -25,8 +25,16 @@ version set ─▶ build ─▶ test ─▶ pack the public package train ─▶
1. **Version set.** A `chore(release): prepare X` pull request sets the release version: the root 1. **Version set.** A `chore(release): prepare X` pull request sets the release version: the root
`package.json`, every platform workspace package (the module template versions as a module, not `package.json`, every platform workspace package (the module template versions as a module, not
with the platform), the image build example in `deploy/README.md`, and the standalone fixture's with the platform), the image build example in `deploy/README.md`, and the standalone fixture's
exact `@ekklesia/module-pack` pin (`tests/fixtures/standalone-module/package.json`). The tag exact `@ekklesia/module-pack` pin and `@ekklesia/*` ranges
must point at a commit that carries the version it names. (`tests/fixtures/standalone-module/package.json`). The tag must point at a commit that carries
the version it names.
A minor version (0.x → 0.(x+1)) is a breaking release before 1.0, so manifests that declare
`compatibility.platform` and `compatibility.moduleSdk` as `^0.x.0` no longer match it. In the
same pull request, move to the new range every module built for this release (the template, the
standalone fixture, the native proof module), the test fixtures that model a module of the
current release or the current platform, and the module-development guide's examples. A patch
version changes none of these.
2. **Build and test.** `pnpm verify`, the integration suite, and the deploy smoke, as for any change. 2. **Build and test.** `pnpm verify`, the integration suite, and the deploy smoke, as for any change.
3. **Pack the public package train.** `pnpm packages:release` (below). 3. **Pack the public package train.** `pnpm packages:release` (below).
4. **Standalone consumer proof.** A module outside the repository consumes exactly those 4. **Standalone consumer proof.** A module outside the repository consumes exactly those
@@ -111,17 +119,17 @@ registry and is not a registry catalog.
```json ```json
{ {
"packageTrain": 1, "packageTrain": 1,
"version": "0.1.2", "version": "0.2.0",
"source": { "modified": false, "revision": "<full commit id>" }, "source": { "modified": false, "revision": "<full commit id>" },
"packages": [ "packages": [
{ {
"file": "ekklesia-contracts-0.1.2.tgz", "file": "ekklesia-contracts-0.2.0.tgz",
"integrity": "sha512-<base64>", "integrity": "sha512-<base64>",
"name": "@ekklesia/contracts", "name": "@ekklesia/contracts",
"role": "implementation", "role": "implementation",
"sha256": "<hex>", "sha256": "<hex>",
"size": 87379, "size": 87379,
"version": "0.1.2" "version": "0.2.0"
} }
] ]
} }
@@ -343,7 +351,7 @@ public owners, a publisher team, and an outsider. In CI it publishes the very ar
### The first publication ### The first publication
The first train published is the **next** platform release version, not 0.1.2. The `v0.1.2` tag The first train published is **0.2.0**, the next platform release, not 0.1.2. The `v0.1.2` tag
predates the curated SDK and this release tooling, so packages built now and called 0.1.2 would predates the curated SDK and this release tooling, so packages built now and called 0.1.2 would
claim to be source that 0.1.2 never contained. claim to be source that 0.1.2 never contained.
+10 -10
View File
@@ -76,7 +76,7 @@ entrypoints. A module in its own repository depends on the published packages in
> **Status:** the packages are published by release > **Status:** the packages are published by release
> ([ADR 0053](../architecture/decisions/0053-standalone-module-development-packages.md), > ([ADR 0053](../architecture/decisions/0053-standalone-module-development-packages.md),
> [Releases and the public package train](../development/releases.md)). The first published train > [Releases and the public package train](../development/releases.md)). The first published train
> is the next platform release after 0.1.2. > is 0.2.0, the platform release after 0.1.2.
A module does not need an Ekklesia checkout. Do not clone Ekklesia and put your module in its A module does not need an Ekklesia checkout. Do not clone Ekklesia and put your module in its
`modules/` directory: your module is its own repository, and it depends on Ekklesia's `modules/` directory: your module is its own repository, and it depends on Ekklesia's
@@ -131,17 +131,17 @@ import it yourself, because what it exports is the platform's, not a supported a
"build": "tsc --project tsconfig.build.json && ekklesia-build-module-ui" "build": "tsc --project tsconfig.build.json && ekklesia-build-module-ui"
}, },
"dependencies": { "dependencies": {
"@ekklesia/module-database": "^0.1.2", "@ekklesia/module-database": "^0.2.0",
"@ekklesia/module-sdk": "^0.1.2", "@ekklesia/module-sdk": "^0.2.0",
"@ekklesia/module-ui-sdk": "^0.1.2", "@ekklesia/module-ui-sdk": "^0.2.0",
"@ekklesia/ui": "^0.1.2", "@ekklesia/ui": "^0.2.0",
"react": "19.2.8", "react": "19.2.8",
"react-dom": "19.2.8" "react-dom": "19.2.8"
}, },
"devDependencies": { "devDependencies": {
"@ekklesia/module-pack": "0.1.2", "@ekklesia/module-pack": "0.2.0",
"@ekklesia/module-ui-build": "^0.1.2", "@ekklesia/module-ui-build": "^0.2.0",
"@ekklesia/typescript-config": "^0.1.2", "@ekklesia/typescript-config": "^0.2.0",
"typescript": "7.0.2" "typescript": "7.0.2"
} }
} }
@@ -366,8 +366,8 @@ without executing module code:
"name": "Calendar", "name": "Calendar",
"version": "0.1.0", "version": "0.1.0",
"compatibility": { "compatibility": {
"platform": "^0.1.0", "platform": "^0.2.0",
"moduleSdk": "^0.1.0" "moduleSdk": "^0.2.0"
}, },
"dependencies": { "dependencies": {
"modules": { "modules": {
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "ekklesia", "name": "ekklesia",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"private": true, "private": true,
"type": "module", "type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/contracts", "name": "@ekklesia/contracts",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/design-tokens", "name": "@ekklesia/design-tokens",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/module-database", "name": "@ekklesia/module-database",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/module-pack", "name": "@ekklesia/module-pack",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
@@ -5,8 +5,8 @@
"description": "A minimal native module: its backend uses sharp, so it packages for linux-x64-glibc.", "description": "A minimal native module: its backend uses sharp, so it packages for linux-x64-glibc.",
"version": "0.1.0", "version": "0.1.0",
"compatibility": { "compatibility": {
"platform": "^0.1.0", "platform": "^0.2.0",
"moduleSdk": "^0.1.0" "moduleSdk": "^0.2.0"
}, },
"database": { "database": {
"abi": 1 "abi": 1
@@ -183,8 +183,8 @@ describe.runIf(onTargetHost)("the linux-x64-glibc target, proven with sharp", ()
extractTo, extractTo,
platform: { platform: {
databaseRuntime: { "drizzle-orm": "0.45.2" }, databaseRuntime: { "drizzle-orm": "0.45.2" },
moduleSdkVersion: "0.1.2", moduleSdkVersion: "0.2.0",
platformVersion: "0.1.2", platformVersion: "0.2.0",
}, },
}), }),
).resolves.toMatchObject({ moduleId: "native-proof", target: "linux-x64-glibc" }); ).resolves.toMatchObject({ moduleId: "native-proof", target: "linux-x64-glibc" });
@@ -109,7 +109,7 @@ export async function fixtureModule(options: FixtureModuleOptions = {}): Promise
id, id,
name: `${id} module`, name: `${id} module`,
version, version,
compatibility: { platform: "^0.1.0", moduleSdk: "^0.1.0" }, compatibility: { platform: "^0.2.0", moduleSdk: "^0.2.0" },
...(options.databaseAbi === 1 ? { database: { abi: 1 } } : {}), ...(options.databaseAbi === 1 ? { database: { abi: 1 } } : {}),
capabilities: [], capabilities: [],
permissions: [], permissions: [],
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/module-sdk", "name": "@ekklesia/module-sdk",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/module-ui-build", "name": "@ekklesia/module-ui-build",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/module-ui-host", "name": "@ekklesia/module-ui-host",
"version": "0.1.2", "version": "0.2.0",
"private": true, "private": true,
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/module-ui-sdk", "name": "@ekklesia/module-ui-sdk",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/typescript-config", "name": "@ekklesia/typescript-config",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"files": [ "files": [
"base.json", "base.json",
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/ui", "name": "@ekklesia/ui",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"type": "module", "type": "module",
"files": [ "files": [
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@ekklesia/shell", "name": "@ekklesia/shell",
"version": "0.1.2", "version": "0.2.0",
"license": "AGPL-3.0-or-later", "license": "AGPL-3.0-or-later",
"private": true, "private": true,
"type": "module", "type": "module",
+2 -2
View File
@@ -5,8 +5,8 @@
"description": "A minimal Ekklesia module template with backend behavior and optional primary and display UI.", "description": "A minimal Ekklesia module template with backend behavior and optional primary and display UI.",
"version": "0.1.0", "version": "0.1.0",
"compatibility": { "compatibility": {
"platform": "^0.1.0", "platform": "^0.2.0",
"moduleSdk": "^0.1.0" "moduleSdk": "^0.2.0"
}, },
"database": { "database": {
"abi": 1 "abi": 1
+2 -2
View File
@@ -5,8 +5,8 @@
"description": "Proves a module builds, packages, and verifies from published Ekklesia packages alone.", "description": "Proves a module builds, packages, and verifies from published Ekklesia packages alone.",
"version": "0.1.0", "version": "0.1.0",
"compatibility": { "compatibility": {
"platform": "^0.1.0", "platform": "^0.2.0",
"moduleSdk": "^0.1.0" "moduleSdk": "^0.2.0"
}, },
"database": { "database": {
"abi": 1 "abi": 1
+8 -8
View File
@@ -13,18 +13,18 @@
"typecheck": "tsc --noEmit --project tsconfig.json && tsc --noEmit --project tsconfig.ui.json" "typecheck": "tsc --noEmit --project tsconfig.json && tsc --noEmit --project tsconfig.ui.json"
}, },
"dependencies": { "dependencies": {
"@ekklesia/design-tokens": "^0.1.2", "@ekklesia/design-tokens": "^0.2.0",
"@ekklesia/module-database": "^0.1.2", "@ekklesia/module-database": "^0.2.0",
"@ekklesia/module-sdk": "^0.1.2", "@ekklesia/module-sdk": "^0.2.0",
"@ekklesia/module-ui-sdk": "^0.1.2", "@ekklesia/module-ui-sdk": "^0.2.0",
"@ekklesia/ui": "^0.1.2", "@ekklesia/ui": "^0.2.0",
"react": "19.2.8", "react": "19.2.8",
"react-dom": "19.2.8" "react-dom": "19.2.8"
}, },
"devDependencies": { "devDependencies": {
"@ekklesia/module-pack": "0.1.2", "@ekklesia/module-pack": "0.2.0",
"@ekklesia/module-ui-build": "^0.1.2", "@ekklesia/module-ui-build": "^0.2.0",
"@ekklesia/typescript-config": "^0.1.2", "@ekklesia/typescript-config": "^0.2.0",
"@types/node": "24.13.3", "@types/node": "24.13.3",
"@types/react": "19.2.18", "@types/react": "19.2.18",
"@types/react-dom": "19.2.4", "@types/react-dom": "19.2.4",