name: CI on: push: branches: [main] pull_request: branches: [main] jobs: typescript: name: TypeScript (Node ${{ matrix.node-version }}) runs-on: ubuntu-latest strategy: matrix: node-version: [20, 22] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9 - name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: pnpm - name: Install dependencies run: pnpm install - name: Typecheck run: pnpm typecheck - name: Format check run: pnpm format:check - name: Install Playwright browsers run: pnpm exec playwright install --with-deps chromium - name: Run tests run: pnpm test rust: name: Rust (${{ matrix.os }} - ${{ matrix.target }}) runs-on: ${{ matrix.os }} strategy: matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu - os: macos-latest target: aarch64-apple-darwin - os: macos-latest target: x86_64-apple-darwin - os: windows-latest target: x86_64-pc-windows-msvc steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Cache Cargo dependencies uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ cli/target/ key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('cli/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-${{ matrix.target }}- - name: Build release binary run: cargo build --release --manifest-path cli/Cargo.toml --target ${{ matrix.target }} - name: Run Rust tests run: cargo test --manifest-path cli/Cargo.toml --target ${{ matrix.target }} windows-integration: name: Windows Integration Test runs-on: windows-latest needs: rust steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 cache: pnpm - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable with: targets: x86_64-pc-windows-msvc - name: Cache Cargo dependencies uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ cli/target/ key: windows-cargo-x86_64-pc-windows-msvc-${{ hashFiles('cli/Cargo.lock') }} restore-keys: | windows-cargo-x86_64-pc-windows-msvc- - name: Build Rust CLI run: cargo build --release --manifest-path cli/Cargo.toml --target x86_64-pc-windows-msvc - name: Install npm dependencies run: pnpm install - name: Build TypeScript run: pnpm build - name: Copy CLI binary to bin directory run: | Copy-Item cli/target/x86_64-pc-windows-msvc/release/agent-browser.exe bin/agent-browser-win32-x64.exe - name: Test agent-browser install command run: | $env:PATH = "$pwd\bin;$env:PATH" for ($i = 1; $i -le 3; $i++) { bin/agent-browser-win32-x64.exe install if ($LASTEXITCODE -eq 0) { exit 0 } Write-Host "Attempt $i failed, retrying in 10 seconds..." Start-Sleep -Seconds 10 } exit 1 shell: pwsh timeout-minutes: 10 - name: Verify Chromium was installed run: | $playwrightPath = "$env:LOCALAPPDATA\ms-playwright" if (Test-Path $playwrightPath) { Write-Host "Playwright browsers installed at: $playwrightPath" Get-ChildItem $playwrightPath -Recurse -Depth 2 | Select-Object -First 20 } else { Write-Error "Playwright browsers not found!" exit 1 } shell: pwsh serverless-chromium: name: Serverless Chromium (@sparticuz/chromium) runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 cache: pnpm - name: Install dependencies run: pnpm install - name: Install @sparticuz/chromium run: pnpm add -D @sparticuz/chromium - name: Build TypeScript run: pnpm build - name: Run serverless integration test run: pnpm exec vitest run test/serverless.test.ts global-install: name: Global Install (${{ matrix.os }}) runs-on: ${{ matrix.os }} needs: rust strategy: matrix: include: - os: ubuntu-latest target: x86_64-unknown-linux-gnu binary: agent-browser-linux-x64 - os: macos-latest target: aarch64-apple-darwin binary: agent-browser-darwin-arm64 - os: windows-latest target: x86_64-pc-windows-msvc binary: agent-browser-win32-x64.exe steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup pnpm uses: pnpm/action-setup@v4 with: version: 9 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 22 cache: pnpm - name: Setup Rust toolchain uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} - name: Cache Cargo dependencies uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ cli/target/ key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('cli/Cargo.lock') }} restore-keys: | ${{ runner.os }}-cargo-${{ matrix.target }}- - name: Build Rust CLI run: cargo build --release --manifest-path cli/Cargo.toml --target ${{ matrix.target }} - name: Install npm dependencies run: pnpm install - name: Build TypeScript run: pnpm build - name: Copy CLI binary to bin directory (Unix) if: runner.os != 'Windows' run: cp cli/target/${{ matrix.target }}/release/agent-browser bin/${{ matrix.binary }} - name: Copy CLI binary to bin directory (Windows) if: runner.os == 'Windows' run: Copy-Item cli/target/${{ matrix.target }}/release/agent-browser.exe bin/${{ matrix.binary }} - name: Test npm global install run: | npm pack npm install -g agent-browser-*.tgz agent-browser --version shell: bash - name: Verify symlink points to native binary (Unix) if: runner.os != 'Windows' run: | SYMLINK=$(npm prefix -g)/bin/agent-browser TARGET=$(readlink "$SYMLINK") echo "Symlink: $SYMLINK" echo "Target: $TARGET" if [[ "$TARGET" != *"${{ matrix.binary }}"* ]]; then echo "ERROR: Symlink should point to native binary, not JS wrapper" exit 1 fi echo "✓ Symlink correctly points to native binary" shell: bash - name: Verify shim points to native binary (Windows) if: runner.os == 'Windows' run: | $shimPath = "$(npm prefix -g)\agent-browser.cmd" $content = Get-Content $shimPath -Raw echo "Shim path: $shimPath" echo "Shim content:" echo $content if ($content -notmatch "agent-browser-win32-x64\.exe") { echo "ERROR: Shim should point to native .exe, not JS wrapper" exit 1 } echo "✓ Shim correctly points to native binary" shell: pwsh