Skip to content

chore(release): 0.19.1 (npm/NuGet) · 0.19.2 (PyPI) · 7.11.1 (Maven) —… #1039

chore(release): 0.19.1 (npm/NuGet) · 0.19.2 (PyPI) · 7.11.1 (Maven) —…

chore(release): 0.19.1 (npm/NuGet) · 0.19.2 (PyPI) · 7.11.1 (Maven) —… #1039

Workflow file for this run

name: conformance
# COST: the cross-port conformance matrix + full Java reactor + drift/mutation gates
# are heavy, so they NO LONGER run on every push/PR — release gate (tag `v*`) +
# on-demand (workflow_dispatch) only. Run them LOCALLY before opening/merging a PR:
# scripts/ci-local.sh # full parity (this + integration suite + drift)
# scripts/ci-local.sh --quick # everything except the docker integration suite
# The .githooks/pre-push hook also runs the TS build+typecheck gate locally, and the
# cheap public-repo SECURITY gate (hygiene / leak-scan) still runs on every PR.
# Push-to-main coverage now comes from local-ci.yml on the self-hosted runner.
on:
push:
tags:
- 'v*'
workflow_dispatch:
jobs:
fixture-lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
- name: Cache Bun install cache
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- run: bun install
- run: cd server/typescript/packages/conformance && bun bin/conformance.ts lint ../../../../fixtures/conformance
# TS type-safety gate. `bun test` transpiles per-file and does NOT typecheck,
# so a `tsc` error (e.g. a TS2300 duplicate-identifier, or a real type break)
# passes the test suite and ships green. This job runs the real compiler over
# the whole workspace. `build` first: cross-package imports resolve through each
# package's `dist/` (the `types`/`main` fields), so typecheck needs the deps
# built or it reports spurious TS2307 "cannot find module" across packages.
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
- name: Cache Bun install cache
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- run: bun install
- name: Build all workspace packages (emit dist/ for cross-package types)
run: bun run --filter '*' build
- name: Typecheck the whole workspace (fails on any tsc error)
run: bun run --filter '*' typecheck
conformance:
needs: fixture-lint
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [typescript, csharp, java, python]
steps:
- uses: actions/checkout@v4
- name: Set up Bun (TS)
if: matrix.language == 'typescript'
uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
- name: Cache Bun install cache (TS)
if: matrix.language == 'typescript'
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- name: Set up .NET (C#)
if: matrix.language == 'csharp'
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Cache NuGet packages (C#)
if: matrix.language == 'csharp'
uses: actions/cache@v4
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('server/csharp/**/*.csproj') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Set up JDK (Java)
if: matrix.language == 'java'
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
cache: maven
- name: Set up uv (Python)
if: matrix.language == 'python'
uses: astral-sh/setup-uv@v3
with:
enable-cache: true
- name: TypeScript conformance
if: matrix.language == 'typescript'
run: |
bun install
# Loader + YAML + object-model corpora (packages/metadata).
cd server/typescript/packages/metadata && bun test test/conformance.test.ts test/yaml-conformance.test.ts test/object-model-conformance.test.ts
# Registry-conformance gate (TS is the reference emitter — byte-matches
# the committed canonical) + untested-vocabulary coverage report.
# All five ports run the gate now (SP-G reconciliation landed): C#/Python
# via the whole-project/whole-dir scope below; Java + Kotlin via the
# RegistryManifestConformanceTest added to their scoped -Dtest= lists.
bun test test/registry-conformance.test.ts test/registry-coverage.test.ts
# Byte-exact render / verify / extract / output-prompt corpora (packages/render).
cd ../render && bun test test/render-conformance.test.ts test/verify-conformance.test.ts test/extract/extract-conformance.test.ts test/output-prompt-conformance.test.ts
# Validator-parity corpus (generated input validation). No Docker.
cd ../integration-tests && bun test test/validation-conformance.test.ts
# migrate-ts — the sole cross-port schema-migration engine (ADR-0015).
# Its unit + integrity suites need no DB; the PG integration tests
# (gated on MIGRATE_TS_PG_URL) self-skip here and run in integration-tests.yml.
cd ../migrate-ts && bun test
# Doc-template + CLI suites: byte-identity template gate, embedded-template
# gate, neutrality / collision guards, and the docs golden corpus +
# `meta docs` command. Whole-package so future tests auto-run. No Docker.
cd ../codegen-ts && bun test
cd ../cli && bun test
- name: C# conformance
if: matrix.language == 'csharp'
run: |
# Loader + YAML + object-model corpora (Conformance.Tests project).
cd server/csharp && dotnet test MetaObjects.Conformance.Tests/MetaObjects.Conformance.Tests.csproj --nologo --verbosity quiet
# Byte-exact render / verify / extract / output-prompt corpora (Render.Tests project).
dotnet test MetaObjects.Render.Tests/MetaObjects.Render.Tests.csproj --nologo --verbosity quiet
# Validator-parity corpus (generated DataAnnotations input validation).
dotnet test MetaObjects.Codegen.Tests/MetaObjects.Codegen.Tests.csproj --filter "FullyQualifiedName~ValidationConformance" --nologo --verbosity quiet
# Generator stable-name registry conformance (ADR-0021 D3).
dotnet test MetaObjects.Codegen.Tests/MetaObjects.Codegen.Tests.csproj --filter "FullyQualifiedName~GeneratorRegistryConformance" --nologo --verbosity quiet
# CLI (`dotnet meta`) — compiles MetaObjects.Cli + runs its tests. Without
# this the CLI is never built by any CI job, so a CLI compile break (or a
# gen --list registry drift) ships green. `dotnet test` only compiles the
# projects it actually runs, so this is what brings the CLI into the gate.
dotnet test MetaObjects.Cli.Tests/MetaObjects.Cli.Tests.csproj --nologo --verbosity quiet
# Cross-port api/csharp SDK-docs surface — execs `dotnet meta docs` end-to-end
# against the shared api-docs-cross-port manifest. MUST run AFTER the CLI build
# above: the test skips if the CLI dll is absent, so it only gates for real once
# the CLI exists. TS + Java + Python + Kotlin gate their own surfaces; this is C#.
dotnet test MetaObjects.Codegen.Tests/MetaObjects.Codegen.Tests.csproj --filter "FullyQualifiedName~ApiDocsCrossPort" --nologo --verbosity quiet
- name: Java conformance
if: matrix.language == 'java'
run: |
cd server/java
# Install metadata + render first to avoid the SNAPSHOT-resolution race
# ("No type registered for: field.uuid") when the render module's tests
# reference the freshly-built metadata artifact.
mvn -pl metadata,render,codegen-spring -am install -DskipTests -q
# Loader + YAML + object-model corpora (metadata module)
# + registry-conformance gate (metamodel-vocabulary manifest byte-match, SP-G).
mvn -pl metadata test -Dtest='ConformanceTest,YamlConformanceTest,ObjectModelConformanceTest,RegistryManifestConformanceTest' -q
# Byte-exact render / verify / extract / output-prompt corpora (render module).
mvn -pl render test -Dtest='RenderCrossPortReportTest,VerifyConformanceTest,ExtractConformanceTest,OutputPromptConformanceTest' -q
# Validator-parity corpus (generated DTO jakarta.validation, codegen-spring module)
# + generator stable-name registry conformance (ADR-0021 D3).
mvn -pl codegen-spring test -Dtest='ValidationConformanceTest,GeneratorRegistryConformanceTest' -q
- name: Python conformance
if: matrix.language == 'python'
run: |
cd server/python
# Loader + YAML corpora.
uv run pytest tests/conformance -q
# Byte-exact render / verify / extract / output-prompt corpora.
uv run pytest tests/render -q
# Validator-parity corpus (generated Pydantic input validation).
uv run pytest tests/codegen/test_validation_conformance.py -q
# Generator registry CLI ergonomics (gen --list / --generators selection, ADR-0021 D3).
uv run pytest tests/codegen/test_cli_registry.py -q
conformance-kotlin:
# Kotlin (codegen-kotlin, KotlinPoet on the JVM) ships no loader / YAML /
# render / verify of its own — it reuses the shared JVM render engine. It
# runs the corpora it actually has: object-model + output-prompt +
# validator-parity (generated payload jakarta.validation).
needs: fixture-lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
cache: maven
- name: Kotlin conformance
run: |
cd server/java
# Build the metadata/render/codegen-kotlin chain first to avoid the
# SNAPSHOT-resolution race when the test module references freshly-built
# artifacts.
mvn -pl codegen-kotlin -am install -DskipTests -q
# object-model + output-prompt + validator-parity corpora (the corpora Kotlin has)
# + generator stable-name registry conformance (ADR-0021 D3)
# + registry-conformance gate (metamodel-vocabulary manifest byte-match, SP-G;
# composes the metamodel provider set so codegen-base/om classpath SPI does not pollute it).
mvn -pl codegen-kotlin test -Dtest='ObjectModelConformanceTest,OutputPromptConformanceTest,ValidationConformanceTest,GeneratorRegistryConformanceTest,RegistryManifestConformanceTest' -q
java-reactor:
# FULL-REACTOR build AND test of the Java parent reactor (server/java).
#
# The scoped `mvn -pl ... test` jobs above run ONLY a curated `-Dtest=` subset
# in metadata / render / codegen-spring / codegen-kotlin (+ their -am deps).
# Every other reactor module's tests are otherwise NEVER run by CI — most
# notably the `maven-plugin` mojo tests (MetaDataGeneratorMojoTest, DocsMojoTest,
# MetaDataVerifyMojoTest, ...). That gap let issue #37 ship: a mojo-test fixture
# broke `mvn clean install` on `main` while every PR showed green, because this
# job used to run `install -DskipTests` (compile only, no tests).
#
# Running a full-reactor `mvn install` (tests ON) compiles, packages, AND tests
# every module in the parent reactor — so a red reactor can no longer slip past
# green PR checks. No reactor module's tests need Docker/Testcontainers (verified:
# the only Testcontainers suites are integration-tests* and integration-tests-kotlin,
# which are INTENTIONALLY out-of-reactor and gated separately by integration-tests.yml).
#
# Intentionally still OUT of this gate (documented):
# - integration-tests / integration-tests-kotlin — out-of-reactor Docker/
# Testcontainers persistence + api-contract corpora; gated by integration-tests.yml.
# - fatjar-smoke — standalone Spring Boot fat-jar bootstrap smoke (no tests);
# out-of-reactor by design, run on demand via scripts/fatjar-smoke.sh.
needs: fixture-lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
cache: maven
- name: Full-reactor build + test (all modules, tests on)
run: cd server/java && mvn -q clean install
completeness-gate:
needs: [conformance, conformance-kotlin]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
- name: Cache Bun install cache
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- run: bun install
- run: cd server/typescript/packages/metadata && bun run conformance:mutation
doc-template-drift:
# Fails if the bundled package copy of the canonical doc templates, or the
# embedded-templates TS module (used by the standalone `meta` binary), is
# stale. sync-doc-templates.sh reproduces both from the canonical root
# templates/docs/ source; a non-empty diff means a dev forgot to run it.
needs: fixture-lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
- name: Cache Bun install cache
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- run: bun install
- name: Regenerate bundled + embedded doc templates from canonical
run: bash scripts/sync-doc-templates.sh
- name: Fail if synced/generated doc-template artifacts are stale
run: git diff --exit-code -- server/typescript/packages/codegen-ts/templates server/typescript/packages/codegen-ts/src/render-engine/embedded-templates.generated.ts
embedded-library-drift:
# Fails if the embedded library metadata TS module is stale relative to the
# canonical library/**/*.yaml sources. generate-embedded-library.ts
# reproduces the module from the YAML sources; a non-empty diff means a dev
# updated a library YAML file without regenerating the embedded module.
needs: fixture-lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v2
with:
bun-version: '1.3.14'
- name: Cache Bun install cache
uses: actions/cache@v4
with:
path: ~/.bun/install/cache
key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
restore-keys: |
${{ runner.os }}-bun-
- run: bun install
- name: Regenerate embedded library metadata from canonical
run: bun run scripts/generate-embedded-library.ts
- name: Fail if the embedded library module is stale
run: git diff --exit-code -- server/typescript/packages/metadata/src/library/embedded-library.generated.ts