name: KBX Quality Gate on: push: pull_request: jobs: architecture: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Validate KBX architecture run: node scripts/validate-kbx.mjs - name: Ensure generated manifests are committed run: git diff --exit-code -- generated/ apps/web/src/registry/screens.generated.ts packages/kbx-ui/src/tokens/kbx.css packages/kbx-contracts/src/generated/ backend/Shared/Contracts/Generated/ backend/Shared/Authorization/Generated/ backend/Shared/Telemetry/Generated/ backend/Shared/Experiments/Generated/ backend/Shared/Testing/Generated/ backend/Shared/Integrations/Generated/ backend/Shared/Providers/Generated/ backend/Shared/ExternalData/Generated/ backend/Shared/Configuration/Generated/ design/figma/ contracts/api/openapi.kbx.json deploy/kbx/ frontend: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Enable Corepack run: corepack enable - name: Install and test when lockfile exists shell: bash run: | if [ -f pnpm-lock.yaml ]; then pnpm install --frozen-lockfile pnpm -r --if-present run typecheck pnpm -r --if-present run test pnpm -r --if-present run build echo "KBX canonical scenario contract validated statically; Playwright host run belongs to product repository." else echo "Starter has no pnpm-lock.yaml yet; dependency build gate is intentionally deferred." fi backend: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Build/test when solution exists shell: bash run: | shopt -s nullglob solutions=( *.sln *.slnx ) if [ ${#solutions[@]} -gt 0 ]; then dotnet restore "${solutions[0]}" dotnet build "${solutions[0]}" --no-restore -c Release dotnet test "${solutions[0]}" --no-build -c Release else echo "Reference starter has no .NET solution file; backend compile gate is deferred to host repository." fi