Skip to content

Commit 849018b

Browse files
committed
docs: restamp first-touch versions to 1.1.3 / 8.1.3; test: give server-backed D1/SQLite report tests load headroom
1 parent d56da6b commit 849018b

8 files changed

Lines changed: 33 additions & 24 deletions

File tree

‎AGENTS.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ because a conformance corpus gates the ports against each other and never agains
3939
in ADR-0035 **Amendment 3**. Do not reintroduce a waiting gate in any form.
4040

4141

42-
**Where the versions are.** `latest` is **`1.1.2`** on npm, **`8.1.2`** on Maven Central,
43-
**`1.1.2`** on PyPI and **`1.1.2`** on NuGet (the Maven major is always **npm major + 7**, so
44-
1.1.2 is 8.1.2). **1.1.0, 1.1.1 and 1.1.2 are released.** 1.0.13 is the last 1.0.x release; the four registries moved together on 1.0.13, 1.0.12, 1.0.11, 1.0.10 and 1.0.9 (Maven skipped 8.0.8), and earlier Maven alone took 1.0.6 (8.0.6) while the other three skipped that
42+
**Where the versions are.** `latest` is **`1.1.3`** on npm, **`8.1.3`** on Maven Central,
43+
**`1.1.3`** on PyPI and **`1.1.3`** on NuGet (the Maven major is always **npm major + 7**, so
44+
1.1.3 is 8.1.3). **1.1.0, 1.1.1, 1.1.2 and 1.1.3 are released.** 1.0.13 is the last 1.0.x release; the four registries moved together on 1.0.13, 1.0.12, 1.0.11, 1.0.10 and 1.0.9 (Maven skipped 8.0.8), and earlier Maven alone took 1.0.6 (8.0.6) while the other three skipped that
4545
number. Both patterns are the convergent-publishing rule working as intended. **1.0 is CUT** and **1.1 is released**: the 1.0.0-rc candidates through 1.0.13 are superseded, and npm's `next` tag is REPOINTED onto each release — not deleted, because
4646
`dist-tag rm` 403s for every token we hold (`docs/RELEASING.md` §4).
4747
`metamodelVersion` read **`1.0`** through 1.0.13 — C4 landed and G4 shipped it, and no 1.0.x patch
@@ -80,7 +80,7 @@ PyPI has had no product change since `0.25.0` — nothing is broken.
8080

8181
**Key cross-language features shipped:** FR5 family (a/b/c/d/e + WARN envelope-shape — actionable loader errors per ADR-0009); FR-003 (Java RDB runtime persistence + projections; schema migrations are TS-only — the Java migration engine was removed); FR-006 (template.output parser-on-receipt codegen per ADR-0010 in all 5 ports); FR-008 + FR-009 (cross-port REST API contract + the nine filter operators); FR-018 (M:N relationship codegen in all 5 ports — entity navigation + idiomatic ORM wiring [Drizzle m2m / EF Core `UsingEntity` / Spring repo+JPA / Exposed / Pydantic+route as the SQLAlchemy-secondary equivalent] + REST traversal `GET /<source-plural>/{id}/<relation>` + Tier-2 docs, gated by the shared api-contract m2m corpus in both lanes + persistence-conformance; the TanStack M:N client hook is a deferred client-ergonomics follow-up); SP-H (field-subtype end-to-end hardening: every concrete `field.*` subtype write+read round-trips cross-port via the persistence `op: roundtrip` gate; cut `field.byte`/`field.short`/`field.class` non-functional stubs; cross-port filter-op reconciliation for uuid/currency); source v2 paradigm (ADR-0007); metadata-ktx Kotlin facade; per-target output directories (TS codegen); FR-044 (the reporting vocabulary — `dimension.attribute`/`dimension.time`, `measure.aggregate`/`measure.ratio`, `segment.filter`, `object.report`, `@spine` on a report to take rows from a to-one dimension entity, `@default` on a measure for empty aggregates, plus the relative-date filter value — registered and loader-validated in all five ports; a report that declares a read-only `source.rdb @kind: view` is lowered to a SQL view by `meta migrate` and read by every port, and served by a generated read-only list route in every port, gated by the api-contract `report/` sub-corpus; the TypeScript `cube-model` reference generator writes the vocabulary as Cube data-model files, gated by the `fixtures/cube-model/` corpus and a `cube` lane that loads the output into a real Cube; a served report gets the generated TanStack list hook (`use<R>List`) but no grid or form, see [docs/features/reporting.md](docs/features/reporting.md) and [docs/features/cube-export.md](docs/features/cube-export.md)).
8282

83-
**Release 1.1.0** (released; npm `1.1.0`, PyPI `1.1.0`, NuGet `1.1.0` and Maven Central `8.1.0`; the latest is 1.1.2 / 8.1.2). The reporting release (FR-044): declare dimensions, measures, segments and an `object.report`, and get a SQL view, a served read-only list route in every port, a generated TanStack list hook, and a Cube data model, with `@spine` for rows that have no facts and `@default` for an empty measure. Also carries the first slice of requirements (the gate in every port's `verify`), the derived-key parity fix across the ports, and the list-hook and nested-average fixes found by the first adopter. See the `CHANGELOG.md` 1.1.0 section for the full scope, pre-release RC history, and the diffs to expect when you upgrade (ejected generators and keyless projections). It also makes documentation a set of generators in every port (ADR-0034 Amendment 9): the docs commands are removed, and `docs/features/migrations/docs-are-generators.md` is the upgrade path. The last 1.0.x release, 1.0.13 (2026-10-03), was a PATCH on 1.0.x.
83+
**Release 1.1.0** (released; npm `1.1.0`, PyPI `1.1.0`, NuGet `1.1.0` and Maven Central `8.1.0`; the latest is 1.1.3 / 8.1.3). The reporting release (FR-044): declare dimensions, measures, segments and an `object.report`, and get a SQL view, a served read-only list route in every port, a generated TanStack list hook, and a Cube data model, with `@spine` for rows that have no facts and `@default` for an empty measure. Also carries the first slice of requirements (the gate in every port's `verify`), the derived-key parity fix across the ports, and the list-hook and nested-average fixes found by the first adopter. See the `CHANGELOG.md` 1.1.0 section for the full scope, pre-release RC history, and the diffs to expect when you upgrade (ejected generators and keyless projections). It also makes documentation a set of generators in every port (ADR-0034 Amendment 9): the docs commands are removed, and `docs/features/migrations/docs-are-generators.md` is the upgrade path. The last 1.0.x release, 1.0.13 (2026-10-03), was a PATCH on 1.0.x.
8484

8585
Active and planned work lives in GitHub: issues labelled `FR`, milestones for releases, and the MetaObjects Roadmap project board. `spec/roadmap.md` keeps the release direction and the FR → issue → spec index. Process: `docs/ROADMAP-PROCESS.md`.
8686

‎README.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,11 @@ first-week wedge plan — and `meta init` picks up from there.
146146

147147
| Language | Status | Quickstart | Source |
148148
|---|---|---|---|
149-
| TypeScript | **npm `1.1.2`** — the `@metaobjectsdev/*` packages | [`docs/ports/typescript.md`](docs/ports/typescript.md) | [`server/typescript/`](server/typescript/) · [`client/web/`](client/web/) |
150-
| Java | **Maven Central `8.1.2`** (`com.metaobjects:*` — the JVM major is npm major + 7) — loader + OMDB + render + Maven plugin all shipped; full conformance green | [`docs/ports/java.md`](docs/ports/java.md) | [`server/java/`](server/java/) |
151-
| Kotlin | **Maven Central `8.1.2`** — codegen tier on top of Java: 16 generators (entity, Exposed table, names, relations, repository, output-parser, output-prompt, render-helper, extractor, filter-allowlist, validator, Spring config, storedProc, Spring controller, requirement-tests, api-docs); 24 / 24 persistence-conformance | [`docs/ports/kotlin.md`](docs/ports/kotlin.md) | [`server/java/codegen-kotlin/`](server/java/codegen-kotlin/) · [`server/java/metadata-ktx/`](server/java/metadata-ktx/) |
152-
| C# | **NuGet `1.1.2`** — loader + conformance + EF Core codegen + render engine + `dotnet meta` CLI all shipped | [`docs/ports/csharp.md`](docs/ports/csharp.md) | [`server/csharp/`](server/csharp/) |
153-
| Python | **PyPI `1.1.2`** — loader + conformance + render + entity-model codegen + ObjectManager runtime shipped; schema migrations are TS-owned (ADR-0015) | [`docs/ports/python.md`](docs/ports/python.md) | [`server/python/`](server/python/) |
149+
| TypeScript | **npm `1.1.3`** — the `@metaobjectsdev/*` packages | [`docs/ports/typescript.md`](docs/ports/typescript.md) | [`server/typescript/`](server/typescript/) · [`client/web/`](client/web/) |
150+
| Java | **Maven Central `8.1.3`** (`com.metaobjects:*` — the JVM major is npm major + 7) — loader + OMDB + render + Maven plugin all shipped; full conformance green | [`docs/ports/java.md`](docs/ports/java.md) | [`server/java/`](server/java/) |
151+
| Kotlin | **Maven Central `8.1.3`** — codegen tier on top of Java: 16 generators (entity, Exposed table, names, relations, repository, output-parser, output-prompt, render-helper, extractor, filter-allowlist, validator, Spring config, storedProc, Spring controller, requirement-tests, api-docs); 24 / 24 persistence-conformance | [`docs/ports/kotlin.md`](docs/ports/kotlin.md) | [`server/java/codegen-kotlin/`](server/java/codegen-kotlin/) · [`server/java/metadata-ktx/`](server/java/metadata-ktx/) |
152+
| C# | **NuGet `1.1.3`** — loader + conformance + EF Core codegen + render engine + `dotnet meta` CLI all shipped | [`docs/ports/csharp.md`](docs/ports/csharp.md) | [`server/csharp/`](server/csharp/) |
153+
| Python | **PyPI `1.1.3`** — loader + conformance + render + entity-model codegen + ObjectManager runtime shipped; schema migrations are TS-owned (ADR-0015) | [`docs/ports/python.md`](docs/ports/python.md) | [`server/python/`](server/python/) |
154154

155155
## Capability matrix
156156

‎docs/ports/csharp.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Postgres + Npgsql.
66

77
## Install
88

9-
Published to [NuGet](https://www.nuget.org/packages/MetaObjects) at `1.1.2` — four
9+
Published to [NuGet](https://www.nuget.org/packages/MetaObjects) at `1.1.3` — four
1010
packages, version-locked to the C# port version: `MetaObjects` (loader), `MetaObjects.Codegen`,
1111
`MetaObjects.Render` and the `MetaObjects.Cli` tool.
1212

@@ -33,7 +33,7 @@ SQLite so it runs with nothing else installed; the same generated code runs on P
3333
<Nullable>enable</Nullable>
3434
</PropertyGroup>
3535
<ItemGroup>
36-
<PackageReference Include="MetaObjects.Codegen" Version="1.1.2" />
36+
<PackageReference Include="MetaObjects.Codegen" Version="1.1.3" />
3737
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.11" />
3838
</ItemGroup>
3939
<ItemGroup>

‎docs/ports/java.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ Prompt / template drift is still checked via the `metaobjects-render` `Verify` A
1212

1313
## Install
1414

15-
Set `${metaobjects.version}` to the current Maven Central release (`8.1.2`) — both
15+
Set `${metaobjects.version}` to the current Maven Central release (`8.1.3`) — both
1616
the dependency and plugin blocks below resolve it from one `<properties>` entry. The
1717
generated records need Java 17 or newer, so set the compiler level here too (Maven
1818
defaults to Java 8, where `mvn compile` fails with "records are not supported in -source 8"):
1919

2020
```xml
2121
<!-- pom.xml -->
2222
<properties>
23-
<metaobjects.version>8.1.2</metaobjects.version>
23+
<metaobjects.version>8.1.3</metaobjects.version>
2424
<spring-boot.version>3.3.5</spring-boot.version>
2525
<maven.compiler.release>21</maven.compiler.release>
2626
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

‎docs/ports/kotlin.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ your own `<groupId>`, `<artifactId>` and `<version>`:
2525
```xml
2626
<!-- pom.xml -->
2727
<properties>
28-
<metaobjects.version>8.1.2</metaobjects.version>
28+
<metaobjects.version>8.1.3</metaobjects.version>
2929
<kotlin.version>2.0.21</kotlin.version>
3030
<spring-boot.version>3.3.5</spring-boot.version>
3131
<exposed.version>0.55.0</exposed.version>

‎docs/ports/typescript.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# TypeScript port
22

3-
The reference implementation. Published to npm at `1.1.2` as 14
3+
The reference implementation. Published to npm at `1.1.3` as 14
44
`@metaobjectsdev/*` packages on the `latest` tag. Targets Node-compatible
55
runtimes; Bun-first dev workflow.
66

‎server/typescript/packages/integration-tests/test/api-contract-report-sqlite.test.ts‎

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ import { startSqliteReportServer, type SqliteReportEngine, type SqliteReportServ
2525
const SEED = JSON.parse(readFileSync(join(API_CONTRACT_REPORT_DIR, "seed.json"), "utf8")) as ReportSeed;
2626
const META_PATH = join(API_CONTRACT_REPORT_DIR, "meta.json");
2727

28+
// Every test boots its own server; on D1 that is a Miniflare (workerd) process. Under the default
29+
// parallel lane load (8 lanes) that start-up alone can pass bun's 5000ms default, so these
30+
// server-backed tests get the same headroom as the other server-backed integration tests.
31+
const SERVER_TEST_TIMEOUT_MS = 120_000;
32+
2833
const ENGINES: readonly SqliteReportEngine[] = ["sqlite", "d1"];
2934

3035
async function withServer(
@@ -58,7 +63,7 @@ for (const engine of ENGINES) describe(`api contract report (FR-044) — GENERAT
5863
expect(row["invoices"]).toBe(5);
5964
expect(row["totalCents"]).toBe(315500);
6065
});
61-
});
66+
}, { timeout: SERVER_TEST_TIMEOUT_MS });
6267

6368
test("a ratio is a string in the withCount envelope too", async () => {
6469
await withServer(engine, async (server) => {
@@ -68,14 +73,14 @@ for (const engine of ENGINES) describe(`api contract report (FR-044) — GENERAT
6873
expect(body.total).toBe(1);
6974
expect(typeof body.rows[0]!["paidShare"]).toBe("string");
7075
});
71-
});
76+
}, { timeout: SERVER_TEST_TIMEOUT_MS });
7277

7378
test("a ratio over zero rows is null, not the string 'null' or 0", async () => {
7479
await withServer(engine, async (server) => {
7580
const rows = (await getJson(server, "/api/invoice_totals")) as Array<Record<string, unknown>>;
7681
expect(rows).toEqual([{ invoices: 0, totalCents: null, paidShare: null }]);
7782
}, { invoices: [] });
78-
});
83+
}, { timeout: SERVER_TEST_TIMEOUT_MS });
7984

8085
test("a report with no decimal field is untouched: every value keeps its type", async () => {
8186
await withServer(engine, async (server) => {
@@ -89,7 +94,7 @@ for (const engine of ENGINES) describe(`api contract report (FR-044) — GENERAT
8994
SEED.reports!["ProductRevenue"],
9095
);
9196
});
92-
});
97+
}, { timeout: SERVER_TEST_TIMEOUT_MS });
9398

9499
test("the filter and the sort on a ratio still compare numerically after the wire change", async () => {
95100
await withServer(engine, async (server) => {
@@ -101,11 +106,11 @@ for (const engine of ENGINES) describe(`api contract report (FR-044) — GENERAT
101106
expect(await hit("/api/invoice_totals?filter[paidShare][eq]=0.4")).toBe(1);
102107
expect(await hit("/api/invoice_totals?sort=paidShare:desc")).toBe(1);
103108
});
104-
});
109+
}, { timeout: SERVER_TEST_TIMEOUT_MS });
105110

106111
for (const scenario of loadScenarios(API_CONTRACT_REPORT_SCENARIOS_DIR)) {
107112
test(`shared scenario: ${scenario.name}`, async () => {
108113
await withServer(engine, (server) => runScenario(scenario, server.baseUrl));
109-
});
114+
}, { timeout: SERVER_TEST_TIMEOUT_MS });
110115
}
111116
});

‎server/typescript/packages/integration-tests/test/view-recreate-drift-sqlite.test.ts‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ function literalColumns<T>(root: T): T {
3434
return root;
3535
}
3636

37+
// Each test opens its own libsql file database and runs migrate + diff on it; under the default
38+
// parallel lane load that can pass bun's 5000ms default ("Unable to connect").
39+
const DB_TEST_TIMEOUT_MS = 60_000;
40+
3741
let tmpDir: string;
3842
let k: Kysely<Record<string, unknown>>;
3943
let canonical: MetaRoot;
@@ -87,7 +91,7 @@ describe("D3 — a view recreated only around a table rebuild is not drift", ()
8791
expect(drift.changes.some((c) => c.kind === "add-fk" && c.table === "weeks")).toBe(true);
8892
expect(drift.changes.filter(isViewChange)).toEqual([]);
8993
expect(drift.blocked.filter(isViewChange)).toEqual([]);
90-
});
94+
}, { timeout: DB_TEST_TIMEOUT_MS });
9195

9296
test(`${dialect}: the diff still plans each pair, marked unchanged`, async () => {
9397
await migrateWithWeeksFkMissing();
@@ -101,7 +105,7 @@ describe("D3 — a view recreated only around a table rebuild is not drift", ()
101105
const recreated = views.flatMap((c) => c.kind === "create-view" ? [c.view.name] : []);
102106
expect(recreated).toContain("v_program_minutes");
103107
expect(recreated).toContain("v_program_roster");
104-
});
108+
}, { timeout: DB_TEST_TIMEOUT_MS });
105109
}
106110

107111
test("sqlite: the pair applies, and the database then matches the metadata", async () => {
@@ -119,5 +123,5 @@ describe("D3 — a view recreated only around a table rebuild is not drift", ()
119123
await applyRaw(up);
120124
const followup = await diff({ expected, actual: await introspectSqlite(k), dialect: "sqlite" });
121125
expect(followup.changes.filter((c) => !isInetResidue(c))).toEqual([]);
122-
});
126+
}, { timeout: DB_TEST_TIMEOUT_MS });
123127
});

0 commit comments

Comments
 (0)