1 line
12 KiB
JSON
1 line
12 KiB
JSON
{"repo": "alonegg/faro-research-pro", "files": {".github/workflows/ci.yml": {"a1502e0c22b8d6c49fa3621ca17ffa3f532c8de1": {"t": 1785746364.2319922, "n": 4007, "h": "0fabf800b92b9651", "c": "name: CI\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n workflow_dispatch:\n\npermissions:\n contents: read\n\njobs:\n python:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v5\n\n - uses: actions/setup-python@v6\n with:\n python-version: \"3.12\"\n cache: pip\n\n - name: System deps for xhtml2pdf → pycairo\n run: |\n sudo apt-get update -qq\n sudo apt-get install -y --no-install-recommends \\\n pkg-config libcairo2-dev libpango1.0-dev\n\n - name: Install package (server + dev extras)\n run: |\n python -m pip install --upgrade pip\n # OSS faro-research isn't on PyPI yet; install from GitHub then Pro\n # with --no-deps so pip doesn't try to re-resolve it.\n pip install \"faro-research[server,export] @ git+https://github.com/alonegg/faro-research.git@main\"\n pip install --no-deps -e \".[server,dev]\"\n pip install xhtml2pdf httpx ruff pytest\n\n - name: Ruff lint\n run: ruff check faro_research_pro\n\n - name: Smoke (no LLM, no network)\n env:\n FARO_OPENAI_API_KEY: ci-stub\n FARO_PROVIDER: openai_compat\n TUSHARE_TOKEN: ci-stub\n FARO_DB_PATH: /tmp/pro-ci.db\n run: |\n python - <<'PY'\n # 1) Branded export pipeline (no LLM)\n from faro_research_pro import BrandConfig, branded_markdown_to_pdf, branded_markdown\n md = \"\"\"# Test report\\n\\nA short body.\\n\\n| a | b |\\n|---|---|\\n| 1 | 2 |\"\"\"\n pdf = branded_markdown_to_pdf(md, brand=BrandConfig(author=\"ci\"))\n assert pdf[:5] == b\"%PDF-\", pdf[:20]\n assert len(pdf) > 2000, f\"too small: {len(pdf)}\"\n assert \"Test report\" in branded_markdown(md, brand=BrandConfig())\n\n # 2) Reviewer JSON parser (no LLM)\n from faro_research_pro.agents.reviewer import _parse_review\n r = _parse_review('{\"verdict\":\"approve\",\"score\":9,\"summary\":\"good\",\"issues\":[],\"must_fix\":[]}')\n assert r.is_approved and r.score == 9\n\n # 3) Server module imports cleanly\n from faro_research_pro.server import app\n assert app is not None\n\n print(\"pro smoke ok\")\n PY\n\n docker:\n runs-on: ubuntu-latest\n needs: python\n steps:\n - uses: actions/checkout@v5\n\n - uses: docker/setup-buildx-action@v3\n\n - name: Write CI .env (no real secrets)\n run: |\n cat > .env <<'EOF'\n FARO_PROVIDER=openai_compat\n FARO_OPENAI_BASE_URL=https://api.deepseek.com\n FARO_OPENAI_API_KEY=ci-stub\n FARO_OPENAI_MODEL=deepseek-chat\n TUSHARE_TOKEN=ci-stub\n FARO_DB_PATH=/app/data/faro.db\n FARO_CORS_ORIGINS=http://localhost:5174\n EOF\n\n - name: Build images\n run: docker compose build\n\n - name: Start stack\n run: docker compose up -d\n\n - name: Wait for backend health\n run: |\n for i in $(seq 1 30); do\n if docker compose exec -T backend python -c \"import httpx; r = httpx.get('http://localhost:8000/api/health'); r.raise_for_status(); print(r.json())\" 2>/dev/null; then\n echo \"backend healthy\"; exit 0\n fi\n echo \"waiting... ($i)\"; sleep 2\n done\n docker compose logs backend; exit 1\n\n - name: Verify Pro health endpoint\n run: |\n docker compose exec -T backend python - <<'PY'\n import httpx\n h = httpx.get(\"http://localhost:8000/api/pro/health\").json()\n assert \"pro_version\" in h, h\n assert \"oss_version\" in h, h\n print(\"pro/health ok:\", h)\n PY\n\n - name: Verify web container serves UI shell\n run: curl -fsS http://localhost:5174/ | grep -q \"Faro Research\" && echo \"ui ok\"\n\n - name: Tear down\n if: always()\n run: docker compose down -v\n\n - name: Dump logs on failure\n if: failure()\n run: docker compose logs\n"}, "6c346cc0736f9b3c20b23384a6deb334b9e3757c": {"t": 1785762585.9235687, "n": 4007, "h": "0fabf800b92b9651", "c": "name: CI\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n workflow_dispatch:\n\npermissions:\n contents: read\n\njobs:\n python:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v5\n\n - uses: actions/setup-python@v6\n with:\n python-version: \"3.12\"\n cache: pip\n\n - name: System deps for xhtml2pdf → pycairo\n run: |\n sudo apt-get update -qq\n sudo apt-get install -y --no-install-recommends \\\n pkg-config libcairo2-dev libpango1.0-dev\n\n - name: Install package (server + dev extras)\n run: |\n python -m pip install --upgrade pip\n # OSS faro-research isn't on PyPI yet; install from GitHub then Pro\n # with --no-deps so pip doesn't try to re-resolve it.\n pip install \"faro-research[server,export] @ git+https://github.com/alonegg/faro-research.git@main\"\n pip install --no-deps -e \".[server,dev]\"\n pip install xhtml2pdf httpx ruff pytest\n\n - name: Ruff lint\n run: ruff check faro_research_pro\n\n - name: Smoke (no LLM, no network)\n env:\n FARO_OPENAI_API_KEY: ci-stub\n FARO_PROVIDER: openai_compat\n TUSHARE_TOKEN: ci-stub\n FARO_DB_PATH: /tmp/pro-ci.db\n run: |\n python - <<'PY'\n # 1) Branded export pipeline (no LLM)\n from faro_research_pro import BrandConfig, branded_markdown_to_pdf, branded_markdown\n md = \"\"\"# Test report\\n\\nA short body.\\n\\n| a | b |\\n|---|---|\\n| 1 | 2 |\"\"\"\n pdf = branded_markdown_to_pdf(md, brand=BrandConfig(author=\"ci\"))\n assert pdf[:5] == b\"%PDF-\", pdf[:20]\n assert len(pdf) > 2000, f\"too small: {len(pdf)}\"\n assert \"Test report\" in branded_markdown(md, brand=BrandConfig())\n\n # 2) Reviewer JSON parser (no LLM)\n from faro_research_pro.agents.reviewer import _parse_review\n r = _parse_review('{\"verdict\":\"approve\",\"score\":9,\"summary\":\"good\",\"issues\":[],\"must_fix\":[]}')\n assert r.is_approved and r.score == 9\n\n # 3) Server module imports cleanly\n from faro_research_pro.server import app\n assert app is not None\n\n print(\"pro smoke ok\")\n PY\n\n docker:\n runs-on: ubuntu-latest\n needs: python\n steps:\n - uses: actions/checkout@v5\n\n - uses: docker/setup-buildx-action@v3\n\n - name: Write CI .env (no real secrets)\n run: |\n cat > .env <<'EOF'\n FARO_PROVIDER=openai_compat\n FARO_OPENAI_BASE_URL=https://api.deepseek.com\n FARO_OPENAI_API_KEY=ci-stub\n FARO_OPENAI_MODEL=deepseek-chat\n TUSHARE_TOKEN=ci-stub\n FARO_DB_PATH=/app/data/faro.db\n FARO_CORS_ORIGINS=http://localhost:5174\n EOF\n\n - name: Build images\n run: docker compose build\n\n - name: Start stack\n run: docker compose up -d\n\n - name: Wait for backend health\n run: |\n for i in $(seq 1 30); do\n if docker compose exec -T backend python -c \"import httpx; r = httpx.get('http://localhost:8000/api/health'); r.raise_for_status(); print(r.json())\" 2>/dev/null; then\n echo \"backend healthy\"; exit 0\n fi\n echo \"waiting... ($i)\"; sleep 2\n done\n docker compose logs backend; exit 1\n\n - name: Verify Pro health endpoint\n run: |\n docker compose exec -T backend python - <<'PY'\n import httpx\n h = httpx.get(\"http://localhost:8000/api/pro/health\").json()\n assert \"pro_version\" in h, h\n assert \"oss_version\" in h, h\n print(\"pro/health ok:\", h)\n PY\n\n - name: Verify web container serves UI shell\n run: curl -fsS http://localhost:5174/ | grep -q \"Faro Research\" && echo \"ui ok\"\n\n - name: Tear down\n if: always()\n run: docker compose down -v\n\n - name: Dump logs on failure\n if: failure()\n run: docker compose logs\n"}, "d7e922a8915d55d1f4a98c16ff7270fba32c77f1": {"t": 1785762587.537089, "n": 3696, "h": "58b4bd45aa979d0b", "c": "name: CI\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n workflow_dispatch:\n\npermissions:\n contents: read\n\njobs:\n python:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v5\n\n - uses: actions/setup-python@v6\n with:\n python-version: \"3.12\"\n cache: pip\n\n - name: System deps for xhtml2pdf → pycairo\n run: |\n sudo apt-get update -qq\n sudo apt-get install -y --no-install-recommends \\\n pkg-config libcairo2-dev libpango1.0-dev\n\n - name: Install package (server + dev extras)\n run: |\n python -m pip install --upgrade pip\n pip install -e \".[server,dev]\"\n\n - name: Ruff lint\n run: ruff check faro_research_pro\n\n - name: Smoke (no LLM, no network)\n env:\n FARO_OPENAI_API_KEY: ci-stub\n FARO_PROVIDER: openai_compat\n TUSHARE_TOKEN: ci-stub\n FARO_DB_PATH: /tmp/pro-ci.db\n run: |\n python - <<'PY'\n # 1) Branded export pipeline (no LLM)\n from faro_research_pro import BrandConfig, branded_markdown_to_pdf, branded_markdown\n md = \"\"\"# Test report\\n\\nA short body.\\n\\n| a | b |\\n|---|---|\\n| 1 | 2 |\"\"\"\n pdf = branded_markdown_to_pdf(md, brand=BrandConfig(author=\"ci\"))\n assert pdf[:5] == b\"%PDF-\", pdf[:20]\n assert len(pdf) > 2000, f\"too small: {len(pdf)}\"\n assert \"Test report\" in branded_markdown(md, brand=BrandConfig())\n\n # 2) Reviewer JSON parser (no LLM)\n from faro_research_pro.agents.reviewer import _parse_review\n r = _parse_review('{\"verdict\":\"approve\",\"score\":9,\"summary\":\"good\",\"issues\":[],\"must_fix\":[]}')\n assert r.is_approved and r.score == 9\n\n # 3) Server module imports cleanly\n from faro_research_pro.server import app\n assert app is not None\n\n print(\"pro smoke ok\")\n PY\n\n docker:\n runs-on: ubuntu-latest\n needs: python\n steps:\n - uses: actions/checkout@v5\n\n - uses: docker/setup-buildx-action@v3\n\n - name: Write CI .env (no real secrets)\n run: |\n cat > .env <<'EOF'\n FARO_PROVIDER=openai_compat\n FARO_OPENAI_BASE_URL=https://api.deepseek.com\n FARO_OPENAI_API_KEY=ci-stub\n FARO_OPENAI_MODEL=deepseek-chat\n TUSHARE_TOKEN=ci-stub\n FARO_DB_PATH=/app/data/faro.db\n FARO_CORS_ORIGINS=http://localhost:5174\n EOF\n\n - name: Build images\n run: docker compose build\n\n - name: Start stack\n run: docker compose up -d\n\n - name: Wait for backend health\n run: |\n for i in $(seq 1 30); do\n if docker compose exec -T backend python -c \"import httpx; r = httpx.get('http://localhost:8000/api/health'); r.raise_for_status(); print(r.json())\" 2>/dev/null; then\n echo \"backend healthy\"; exit 0\n fi\n echo \"waiting... ($i)\"; sleep 2\n done\n docker compose logs backend; exit 1\n\n - name: Verify Pro health endpoint\n run: |\n docker compose exec -T backend python - <<'PY'\n import httpx\n h = httpx.get(\"http://localhost:8000/api/pro/health\").json()\n assert \"pro_version\" in h, h\n assert \"oss_version\" in h, h\n print(\"pro/health ok:\", h)\n PY\n\n - name: Verify web container serves UI shell\n run: curl -fsS http://localhost:5174/ | grep -q \"Faro Research\" && echo \"ui ok\"\n\n - name: Tear down\n if: always()\n run: docker compose down -v\n\n - name: Dump logs on failure\n if: failure()\n run: docker compose logs\n"}}}} |