captchaforge 0.2.36

[DO NOT USE — UNDER ACTIVE DEVELOPMENT, NOT PRODUCTION-READY] Captcha solver scaffolding for chromiumoxide-driven browsers. The architecture is in place (vendor solvers, retry-loop iframe walking, VLM provider abstraction, real-WAF bench harness) but the live-vendor success rate is still 0% — Cloudflare Turnstile / hCaptcha / reCAPTCHA detect us at a TLS / CDP fingerprint layer that no flag-based stealth has cleared. Watch the repo; do not depend on this for any real workload.
Documentation
name: Release

# Trigger: tag push matching v0.X.Y.
on:
  push:
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+"
  workflow_dispatch:

permissions:
  contents: write
  packages: write
  id-token: write

jobs:
  binaries:
    name: Build release binaries
    strategy:
      matrix:
        include:
          - target: x86_64-unknown-linux-gnu
            runner: ubuntu-latest
            ext: ""
          - target: aarch64-unknown-linux-gnu
            runner: ubuntu-latest
            ext: ""
            cross: true
          - target: x86_64-apple-darwin
            runner: macos-13
            ext: ""
          - target: aarch64-apple-darwin
            runner: macos-14
            ext: ""
          - target: x86_64-pc-windows-msvc
            runner: windows-latest
            ext: ".exe"
    runs-on: ${{ matrix.runner }}
    steps:
      - uses: actions/checkout@v4

      - uses: dtolnay/rust-toolchain@stable
        with:
          targets: ${{ matrix.target }}

      - name: Install cross (linux aarch64 only)
        if: matrix.cross
        run: cargo install cross --locked

      - name: Build (cross)
        if: matrix.cross
        run: cross build --release --target ${{ matrix.target }} --bin captchaforge

      - name: Build (native)
        if: ${{ !matrix.cross }}
        run: cargo build --release --target ${{ matrix.target }} --bin captchaforge

      - name: Package
        shell: bash
        run: |
          BIN=target/${{ matrix.target }}/release/captchaforge${{ matrix.ext }}
          PKG=captchaforge-${GITHUB_REF_NAME}-${{ matrix.target }}
          mkdir -p dist/$PKG
          cp $BIN dist/$PKG/
          cp README.md LICENSE-MIT LICENSE-APACHE CHANGELOG.md dist/$PKG/ 2>/dev/null || true
          cd dist
          if [[ "${{ matrix.target }}" == *windows* ]]; then
            7z a $PKG.zip $PKG
          else
            tar czf $PKG.tar.gz $PKG
          fi

      - uses: actions/upload-artifact@v4
        with:
          name: bin-${{ matrix.target }}
          path: dist/captchaforge-*

  publish-github-release:
    needs: binaries
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/download-artifact@v4
        with:
          path: dist
          merge-multiple: true
      - name: Create GitHub Release
        uses: softprops/action-gh-release@v2
        with:
          files: |
            dist/*.tar.gz
            dist/*.zip
          generate_release_notes: true
          body_path: CHANGELOG.md

  container:
    name: Build + push container
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-qemu-action@v3
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Extract tag
        id: tag
        run: echo "version=${GITHUB_REF_NAME#v}" >> $GITHUB_OUTPUT
      - uses: docker/build-push-action@v6
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: |
            ghcr.io/santhsecurity/captchaforge:latest
            ghcr.io/santhsecurity/captchaforge:${{ steps.tag.outputs.version }}
            ghcr.io/santhsecurity/captchaforge:0.2
          labels: |
            org.opencontainers.image.source=https://github.com/santhsecurity/captchaforge
            org.opencontainers.image.version=${{ steps.tag.outputs.version }}
            org.opencontainers.image.licenses=MIT OR Apache-2.0

  publish-crates-io:
    name: cargo publish
    needs: binaries
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}

  helm-chart:
    name: Package + publish Helm chart
    needs: binaries
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pages: write
    steps:
      - uses: actions/checkout@v4
      - uses: azure/setup-helm@v4
        with:
          version: v3.14.0
      - name: Lint chart
        run: helm lint deploy/charts/captchaforge
      - name: Package chart
        run: |
          mkdir -p chart-dist
          helm package deploy/charts/captchaforge -d chart-dist
      - uses: actions/upload-artifact@v4
        with:
          name: helm-chart
          path: chart-dist/*.tgz