chore(release): 0.19.1 (npm/NuGet) · 0.19.2 (PyPI) · 7.11.1 (Maven) —… #1039
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |