scatter-proxy 0.1.0

Async request scheduler for unreliable SOCKS5 proxies — multi-path race for maximum throughput
Documentation
name: PR Check

on:
  pull_request:
    types: [opened, synchronize, reopened, labeled]

permissions:
  contents: read
  pull-requests: write

jobs:
  semver-check:
    name: Semver Compliance
    runs-on: ubuntu-latest
    # Only run if this isn't the first release (baseline exists)
    continue-on-error: true
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - name: Install cargo-semver-checks
        run: cargo install cargo-semver-checks --locked
      - name: Check semver compliance
        run: cargo semver-checks check-release

  label-check:
    name: Version Label
    runs-on: ubuntu-latest
    steps:
      - name: Check for version label
        uses: actions/github-script@v7
        with:
          script: |
            const validLabels = ['patch', 'minor', 'major'];
            const prLabels = context.payload.pull_request.labels.map(l => l.name);
            const hasVersionLabel = prLabels.some(l => validLabels.includes(l));
            if (!hasVersionLabel) {
              const marker = '<!-- version-label-check -->';
              const { data: comments } = await github.rest.issues.listComments({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: context.issue.number,
              });
              if (!comments.some(c => c.body.includes(marker))) {
                await github.rest.issues.createComment({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: context.issue.number,
                  body: `${marker}\n⚠️ **Version label missing.** Please add one of: \`patch\`, \`minor\`, \`major\`.\n\nThis determines the next release version.`,
                });
              }
              core.setFailed('Missing version label.');
            }

  test-summary:
    name: Test Summary
    runs-on: ubuntu-latest
    needs: []
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - name: Run tests and capture output
        id: tests
        run: |
          cargo test --all-features 2>&1 | tee test-output.txt
          echo "test_count=$(grep -oP '\d+ passed' test-output.txt | head -1)" >> $GITHUB_OUTPUT
      - name: Post test summary
        if: always()
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const output = fs.readFileSync('test-output.txt', 'utf8');
            const lines = output.split('\n');
            const resultLine = lines.find(l => l.includes('test result:')) || 'No test results found';
            const marker = '<!-- test-summary -->';
            const body = `${marker}\n### 🧪 Test Results\n\`\`\`\n${resultLine}\n\`\`\``;
            const { data: comments } = await github.rest.issues.listComments({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
            });
            const existing = comments.find(c => c.body.includes(marker));
            if (existing) {
              await github.rest.issues.updateComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                comment_id: existing.id,
                body,
              });
            } else {
              await github.rest.issues.createComment({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: context.issue.number,
                body,
              });
            }