diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..c3684c0 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,58 @@ +# ABOUTME: Gitea Actions workflow for CI quality gates on pull requests. +# ABOUTME: Runs lint, typecheck, and unit tests before merge is allowed. + +name: CI + +on: + pull_request: + branches: [main] + push: + branches: [main] + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '24' + + - name: Setup pnpm + uses: pnpm/action-setup@v4 + with: + version: 10 + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache + uses: actions/cache@v4 + with: + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Run linter + run: pnpm lint + + - name: Run typecheck + run: pnpm tsc --noEmit + + - name: Run unit tests + run: pnpm test:run + env: + # Required env vars for tests (dummy values for CI) + NEXT_PUBLIC_POCKETBASE_URL: http://localhost:8090 + RESEND_API_KEY: re_test_key + ENCRYPTION_KEY: 12345678901234567890123456789012 + CRON_SECRET: test_cron_secret diff --git a/IMPLEMENTATION_PLAN.md b/IMPLEMENTATION_PLAN.md index f0e322c..3160780 100644 --- a/IMPLEMENTATION_PLAN.md +++ b/IMPLEMENTATION_PLAN.md @@ -876,11 +876,11 @@ P4.* UX Polish ────────> After core functionality complete | Done | P4.5 Period Prediction | Complete | Prediction tracking with feedback loop | | Done | P4.6 Rate Limiting | Complete | Client-side rate limiting implemented | | Done | P5.1 Period History UI | Complete | Page + 3 API routes with 61 tests | +| Done | P5.3 CI Pipeline | Complete | Lint, typecheck, tests in Gitea Actions | | **Low** | P5.2 Toast Notifications | Low | Install library + integrate | -| **Low** | P5.3 CI Pipeline | Low | Single workflow file | | **Low** | P5.4 E2E Tests | Medium | 6 missing test files | -**All P0-P4 items are complete. P5.1 complete. Remaining P5 items: Toast Notifications, CI Pipeline, E2E Tests.** +**All P0-P4 items are complete. P5.1 and P5.3 complete. Remaining P5 items: Toast Notifications, E2E Tests.** @@ -1069,22 +1069,20 @@ These items were identified during gap analysis and remain pending. - Various page components (replace inline errors) - **Why:** Better UX for transient feedback per spec requirements -### P5.3: CI Pipeline (PARTIALLY COMPLETE) -- [ ] Add test/lint/build to CI pipeline +### P5.3: CI Pipeline ✅ COMPLETE +- [x] Add test/lint/build to CI pipeline - **Spec Reference:** specs/testing.md mentions CI pipeline - **Required:** "All tests (unit, integration, E2E) pass in CI before merge" -- **Current State:** - - Gitea Actions exists for deployment (services/phaseflow.hcl) - - Lefthook runs pre-commit hooks locally (lint + tests) - - No CI pipeline running tests on push/PR -- **Gap:** Tests/lint/build are enforced locally via Lefthook but not in CI -- **Implementation Tasks:** - 1. Create `.gitea/workflows/ci.yml` (or equivalent for Gitea Actions) - 2. Add jobs for: pnpm install, pnpm lint, pnpm tsc --noEmit, pnpm test:run - 3. Configure to run on push to main and on PRs - 4. (Optional) Add build step: pnpm build -- **Files to Create:** - - `.gitea/workflows/ci.yml` +- **Files Created:** + - `.gitea/workflows/ci.yml` - CI workflow with lint, typecheck, and unit tests +- **Features Implemented:** + - Runs on pull requests to main and pushes to main + - Node.js 24 with pnpm 10 setup + - pnpm dependency caching for faster CI runs + - Linting with `pnpm lint` + - Type checking with `pnpm tsc --noEmit` + - Unit tests with `pnpm test:run` + - Required environment variables provided for CI context - **Why:** CI enforcement prevents broken code from being merged ### P5.4: E2E Tests (PARTIALLY COMPLETE)