From 7fc3fc87a6d4652ce878a6303314a7088d48961b Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 17:35:03 +0000 Subject: [PATCH] ci: add required ci.yml workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the mandatory CI workflow as required by the compliance standard. Implements all quality gates per AGENTS.md §7: - Type check (tsc --noEmit) - Lint (eslint --max-warnings 0) - Format (prettier --check) - Tests with coverage (vitest, ≥90%) - Mutation testing (stryker, ≥80%) - E2E tests on macOS and Windows (playwright) Closes #40 Co-authored-by: don-petry --- .github/workflows/ci.yml | 150 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..d5e36931 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,150 @@ +# Continuous Integration +# +# Runs quality gates on every push to main and every pull request targeting main. +# All gates must pass before merging. +# +# Gates (per AGENTS.md §7): +# typecheck → tsc --noEmit (zero errors) +# lint → eslint --max-warnings 0 (zero warnings) +# format → prettier --check (all files formatted) +# test → vitest run (all tests pass) +# coverage → vitest run --coverage (≥90% branch/fn/line/stmt) +# mutation → stryker run (≥80% score) +# e2e → playwright test (macOS + Windows) +# +# Standard: https://github.com/petry-projects/.github/blob/main/standards/ci-standards.md#required-workflows +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: {} + +jobs: + # ── Static analysis ──────────────────────────────────────────────────────── + typecheck: + name: Type check + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Type check + run: npm run typecheck + + lint: + name: Lint + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + + format: + name: Format + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Check formatting + run: npx prettier --check . + + # ── Tests & coverage ─────────────────────────────────────────────────────── + test: + name: Test & Coverage + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run tests with coverage + run: npm test -- --coverage + + # ── Mutation testing ─────────────────────────────────────────────────────── + mutation: + name: Mutation Testing + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Run mutation tests + run: npm run test:mutate + + # ── End-to-end tests ─────────────────────────────────────────────────────── + e2e: + name: E2E (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + permissions: + contents: read + strategy: + fail-fast: false + matrix: + os: [macos-latest, windows-latest] + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 + with: + node-version: '24' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Install Playwright browsers + run: npx playwright install --with-deps + + - name: Run E2E tests + run: npm run test:e2e