🚀 feat(push): add Supabase database migrations for cloud push feature #16
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: Claude Code Build Feature Tests | |
| on: | |
| push: | |
| branches: [main, feat/build-claude] | |
| paths: | |
| - 'src/modules/build/**' | |
| - 'src/modules/build/services/claude-code/**' | |
| - 'src/modules/build/services/cloud/**' | |
| - 'test/**' | |
| - 'vitest.config.ts' | |
| - 'package.json' | |
| pull_request: | |
| branches: [main] | |
| paths: | |
| - 'src/modules/build/**' | |
| - 'src/modules/build/services/claude-code/**' | |
| - 'src/modules/build/services/cloud/**' | |
| - 'test/**' | |
| jobs: | |
| test-unit: | |
| name: Unit Tests | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| node-version: [18.x, 20.x] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: ${{ matrix.node-version }} | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 8 | |
| - name: Get pnpm store directory | |
| id: pnpm-cache | |
| shell: bash | |
| run: | | |
| echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT | |
| - name: Setup pnpm cache | |
| uses: actions/cache@v3 | |
| with: | |
| path: ${{ steps.pnpm-cache.outputs.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 linting | |
| run: pnpm run lint:check | |
| - name: Run type checking | |
| run: pnpm run typecheck | |
| - name: Run unit tests | |
| run: pnpm run test:run -- --reporter=verbose | |
| - name: Generate coverage report | |
| run: pnpm run test:coverage | |
| - name: Upload coverage to Codecov | |
| if: matrix.node-version == '20.x' | |
| uses: codecov/codecov-action@v3 | |
| with: | |
| files: ./coverage/coverage-final.json | |
| flags: unittests | |
| name: claude-code-build-coverage | |
| fail_ci_if_error: false | |
| test-integration: | |
| name: Integration Tests | |
| runs-on: ubuntu-latest | |
| needs: test-unit | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20.x | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 8 | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Run integration tests | |
| run: pnpm run test:run -- **/*.integration.spec.ts | |
| env: | |
| NODE_ENV: test | |
| SUPABASE_URL: ${{ secrets.SUPABASE_URL_TEST }} | |
| SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY_TEST }} | |
| test-e2e: | |
| name: E2E Tests | |
| runs-on: ubuntu-latest | |
| needs: test-integration | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20.x | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 8 | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Build project | |
| run: pnpm run build | |
| - name: Run E2E tests | |
| run: pnpm run test:e2e | |
| env: | |
| NODE_ENV: test | |
| test-performance: | |
| name: Performance Tests | |
| runs-on: ubuntu-latest | |
| needs: test-unit | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20.x | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 8 | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Run performance tests | |
| run: | | |
| pnpm run test:run -- --grep "performance" --reporter=verbose | |
| env: | |
| NODE_ENV: test | |
| PERFORMANCE_TEST: true | |
| coverage-check: | |
| name: Coverage Validation | |
| runs-on: ubuntu-latest | |
| needs: [test-unit, test-integration] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20.x | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 8 | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Check coverage thresholds | |
| run: | | |
| pnpm run test:coverage | |
| # Extract coverage percentages | |
| COVERAGE_REPORT=$(cat coverage/coverage-summary.json) | |
| # Check if coverage meets thresholds | |
| node -e " | |
| const coverage = $COVERAGE_REPORT; | |
| const total = coverage.total; | |
| const thresholds = { | |
| lines: 80, | |
| statements: 80, | |
| functions: 60, | |
| branches: 60 | |
| }; | |
| let failed = false; | |
| for (const [metric, threshold] of Object.entries(thresholds)) { | |
| const pct = total[metric].pct; | |
| if (pct < threshold) { | |
| console.error(\`❌ \${metric} coverage (\${pct}%) is below threshold (\${threshold}%)\`); | |
| failed = true; | |
| } else { | |
| console.log(\`✅ \${metric} coverage (\${pct}%) meets threshold (\${threshold}%)\`); | |
| } | |
| } | |
| if (failed) { | |
| process.exit(1); | |
| } | |
| " | |
| security-scan: | |
| name: Security Scan | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: 20.x | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v2 | |
| with: | |
| version: 8 | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Run security audit | |
| run: pnpm audit --production | |
| continue-on-error: true | |
| - name: Check for sensitive data patterns | |
| run: | | |
| # Check for common sensitive data patterns | |
| echo "Checking for sensitive data patterns..." | |
| # Define patterns to check | |
| PATTERNS=( | |
| "api[_-]?key" | |
| "secret" | |
| "password" | |
| "token" | |
| "private[_-]?key" | |
| ) | |
| # Check source files | |
| for pattern in "${PATTERNS[@]}"; do | |
| echo "Checking for pattern: $pattern" | |
| if grep -r -i "$pattern" src/ --include="*.ts" --include="*.js" --exclude-dir=node_modules --exclude-dir=test-fixtures; then | |
| echo "⚠️ Warning: Found potential sensitive data pattern: $pattern" | |
| fi | |
| done |