name: CI

on:
  pull_request:
  push:
    branches:
      - main

concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

jobs:
  verify:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v7

      - name: Setup Node
        uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm

      - name: Install dependencies
        run: npm ci

      - name: Verify static checks
        run: npm run lint && npm run typecheck

      - name: Test clean-terminal Auto fallback
        run: env -u TERM_PROGRAM -u KITTY_WINDOW_ID -u ALACRITTY_SOCKET -u ZENTUI_NERD_FONTS TERM=dumb CI=true npm test

      - name: Test forced ASCII override
        run: env -u TERM_PROGRAM -u KITTY_WINDOW_ID -u ALACRITTY_SOCKET TERM=dumb CI=true ZENTUI_NERD_FONTS=0 npm test

      - name: Test known Nerd terminal
        run: env -u KITTY_WINDOW_ID -u ALACRITTY_SOCKET -u ZENTUI_NERD_FONTS TERM=dumb CI=true TERM_PROGRAM=WezTerm npm test

      - name: Test forced Nerd override
        run: env -u TERM_PROGRAM -u KITTY_WINDOW_ID -u ALACRITTY_SOCKET TERM=dumb CI=true ZENTUI_NERD_FONTS=1 npm test

      - name: Dry-run pack
        run: npm run pack:check

  thinking-experimental-tui:
    runs-on: ubuntu-latest
    timeout-minutes: 20

    steps:
      - name: Checkout
        uses: actions/checkout@v7

      - name: Setup Node
        uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm

      - name: Install dependencies
        run: npm ci

      - name: Test all-mode experimental actual TUI compatibility
        run: timeout --signal=TERM --kill-after=30s 15m npm run test:thinking-experimental-tui

  behavior-component-compatibility:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    steps:
      - name: Checkout
        uses: actions/checkout@v7

      - name: Setup Node
        uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm

      - name: Install dependencies
        run: npm ci

      # Focused behavior coverage, not private-adapter or full-package certification.
      - name: Test matched Pi 0.85.0 and 0.87.1 behavior components
        run: npm run test:behavior-compatibility

  supported-pi-compatibility:
    runs-on: ubuntu-latest
    timeout-minutes: 20
    strategy:
      fail-fast: false
      matrix:
        pi-version: ["0.85.0", "0.87.1"]

    steps:
      - name: Checkout
        uses: actions/checkout@v7

      - name: Setup Node
        uses: actions/setup-node@v7
        with:
          node-version: 24
          cache: npm

      - name: Pin matching Pi package versions
        env:
          PI_VERSION: ${{ matrix.pi-version }}
        run: |
          npm pkg set "devDependencies.@earendil-works/pi-ai=$PI_VERSION"
          npm pkg set "devDependencies.@earendil-works/pi-coding-agent=$PI_VERSION"
          npm pkg set "devDependencies.@earendil-works/pi-tui=$PI_VERSION"

      - name: Install dependencies
        run: npm install --no-audit --no-fund

      # Pi 0.85.0's unbundled exports import pi-server but omit its dependency.
      - name: Supply missing Pi 0.85.0 test dependency
        if: matrix.pi-version == '0.85.0'
        run: npm install --no-save --ignore-scripts --no-audit --no-fund @earendil-works/pi-server@0.85.0

      - name: Attest Pi package versions
        env:
          PI_VERSION: ${{ matrix.pi-version }}
        run: |
          npm ls --depth=0 @earendil-works/pi-ai @earendil-works/pi-coding-agent @earendil-works/pi-tui
          node - <<'NODE'
          const names = ["pi-ai", "pi-coding-agent", "pi-tui"]
          if (process.env.PI_VERSION === "0.85.0") names.push("pi-server")
          for (const name of names) {
            const pkg = require(`./node_modules/@earendil-works/${name}/package.json`)
            if (pkg.version !== process.env.PI_VERSION) throw new Error(`${pkg.name}: ${pkg.version}`)
            console.log(pkg.name, pkg.version)
          }
          NODE

      - name: Typecheck supported Pi version
        run: npm run typecheck

      - name: Test supported Pi version
        run: timeout --signal=TERM --kill-after=30s 15m npm test
