name: CI on: push: branches: [main] pull_request: jobs: build-and-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - name: Install dependencies run: npm ci - name: Typecheck (front + shared tsconfig) run: npx tsc --noEmit - name: Build Angular app run: npm run build - name: Server tests (playlists visibility) run: npm run test:playlists - name: Server tests (download jobs) run: npm run test:downloads - name: Server tests (preferences) run: npm run test:preferences - name: Server tests (telemetry) run: npm run test:telemetry - name: Unit tests (search UX) run: npm run test:search - name: Search filters (offline) run: npm run test:filters - name: E2E scenarios (search UX) run: npm run test:search-e2e - name: Suggest typeahead (Step 15) run: npm run test:suggest - name: Transcripts (Step 16) run: npm run test:transcript - name: YouTube scrape-first (Step 17, offline) run: npm run test:ytscrape - name: Provider contract v2 (offline) run: npm run test:contract - name: Rumble parsing / JSON-LD (offline) run: npm run test:rumble - name: Search cache + provider metrics + YouTube failover (offline) run: npm run test:cache - name: Video catalog + likes denormalization (offline) run: npm run test:videos - name: Channel identity `channelRef` (offline) run: npm run test:channelref - name: Suggestion shape on frozen provider fixtures (offline) run: npm run test:shapes - name: Twitch parallel sections + section budget (offline) run: npm run test:twitch - name: YouTube channel page tokens persistence (offline) run: npm run test:tokens - name: Channel banners + descriptions across 6 providers (offline) run: npm run test:banners - name: Provenance `capturedAt`/`source` + `?debug=1` payload (offline) run: npm run test:provenance - name: Client-side provenance helpers (offline) run: npm run test:provenance-front - name: Provider health classification (offline) run: npm run test:provider-health - name: Search NDJSON transport (offline) run: npm run test:stream - name: Unified ProviderAdapter contract (offline) run: npm run test:adapter - name: Shorts catalogue bridge (offline) run: npm run test:shorts-catalog - name: Contract v2 strict + `FF_` feature flags (offline) run: npm run test:flags - name: Video kind classification (offline) run: npm run test:kind - name: YouTube InnerTube (Step 18, offline) run: npm run test:ytinnertube