diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b54ca5c..2496464 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,12 +3,28 @@ name: Tests on: pull_request: -permissions: - contents: read - jobs: test: runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: "24" + cache: "pnpm" + + - run: pnpm install --frozen-lockfile + - run: pnpm typecheck + - run: pnpm test + + agents: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + agent: [claude, codex, cursor, gemini, opencode] + test: [smoke, nobash] env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} @@ -16,29 +32,12 @@ jobs: CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }} GOOGLE_API_KEY: ${{ secrets.GOOGLE_API_KEY }} steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Setup pnpm - uses: pnpm/action-setup@v4 - - - name: Setup Node.js - uses: actions/setup-node@v4 + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 with: node-version: "24" cache: "pnpm" - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Run type check - run: pnpm typecheck - - - name: Run tests - run: pnpm test - - - name: Run smoke tests - run: pnpm smoke - - - name: Run nobash tests - run: pnpm nobash + - run: pnpm install --frozen-lockfile + - run: pnpm ${{ matrix.test }} ${{ matrix.agent }} diff --git a/test/utils.ts b/test/utils.ts index 3a21c94..0a87ac5 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -21,9 +21,20 @@ interface Spinner { } function startSpinner(message: string): Spinner { - let frameIndex = 0; const startTime = Date.now(); + // skip animated spinner in CI + if (process.env.CI) { + console.log(`${message}...`); + return { + stop: () => { + const elapsed = formatElapsed(Date.now() - startTime); + console.log(`✓ completed in ${elapsed}\n`); + }, + }; + } + + let frameIndex = 0; const interval = setInterval(() => { const elapsed = formatElapsed(Date.now() - startTime); const frame = SPINNER_FRAMES[frameIndex % SPINNER_FRAMES.length];