Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
af6e391
refactor: narrow the repository to the scraper
pras-ops Oct 7, 2026
507e529
docs: add technique-by-technique borrow list to the scraper plan
pras-ops Oct 7, 2026
a53e7ac
docs: add the user-flow part to the scraper plan
pras-ops Oct 7, 2026
7b84d94
fix: CSV export on uneven records, pagination selectors, timed progre…
pras-ops Oct 7, 2026
e4d1bf2
feat: add the recipe format and an LLM-free runtime
pras-ops Oct 7, 2026
ef8c69f
feat: build recipes from a page without an LLM
pras-ops Oct 7, 2026
ff40d46
feat: add 'scrapewizard <url>' and 'scrapewizard run' commands
pras-ops Oct 7, 2026
3d05d93
feat: keep named status values and add single-class selector fallbacks
pras-ops Oct 7, 2026
4e93262
feat: remember each run, report changes, and repair recipes when a si…
pras-ops Oct 7, 2026
48a9790
feat: follow "load more" buttons and infinite scroll
pras-ops Oct 7, 2026
1a3ca76
feat: follow each item into its own page (--follow)
pras-ops Oct 7, 2026
d053a99
feat: optional AI help when building a recipe (--ai, --ask)
pras-ops Oct 7, 2026
f6bcc7c
feat: sites that need a sign-in (--login)
pras-ops Oct 7, 2026
8ecca67
chore: smaller default install, early format check, docs for the new …
pras-ops Oct 7, 2026
2d1390b
feat: better list selection on real sites, paired rows, table headings
pras-ops Oct 7, 2026
c380110
ci: install the browser before running the tests
pras-ops Oct 7, 2026
c6481c7
fix: plain tables with a heading row, faster list detection, title na…
pras-ops Oct 7, 2026
b3f2e80
fix: pages with no ids or classes at all
pras-ops Oct 7, 2026
5a4f2cb
docs: current state, measured results on real sites, how it works
pras-ops Oct 7, 2026
0001a1c
feat: column names and selectors from what the page says, no AI
pras-ops Oct 7, 2026
6587f6d
feat: lists from data embedded in the page, frames, a shorter command…
pras-ops Oct 7, 2026
5a21280
fix: banners between cards no longer join the list; docs for this round
pras-ops Oct 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
167 changes: 68 additions & 99 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,99 +1,68 @@
name: CI

on:
push:
branches: [main]
pull_request:

jobs:
tests:
name: Unit tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Run test suite (offline)
run: pytest tests/ -v --ignore=tests/golden_sites

fresh-install:
name: Fresh install (${{ matrix.os }})
# Verification-ladder rung 2 (PLATFORM_PLAN.md §14.4): a clean machine must be able
# to install from requirements.txt and import/construct the core. Catches missing
# dependencies (e.g. the yaspin incident) before users do.
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install from requirements.txt only
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Import and construct core
shell: python
run: |
import json, tempfile
from pathlib import Path

import scrapewizard.cli.main # full CLI import chain
from scrapewizard.core.orchestrator import Orchestrator

d = Path(tempfile.mkdtemp())
(d / "session.json").write_text(json.dumps(
{"project_id": "ci", "url": "https://example.com", "state": "INIT"}
))
Orchestrator(d)
print("fresh-install check passed")

frontend:
name: Frontend Lint & Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: studio/frontend/package-lock.json

- name: Install dependencies
working-directory: studio/frontend
run: npm ci

- name: Run lint
working-directory: studio/frontend
run: npm run lint

- name: Run type-check
working-directory: studio/frontend
run: npm run type-check

- name: Run test
working-directory: studio/frontend
run: npm run test

- name: Run build
working-directory: studio/frontend
run: npm run build

name: CI

on:
push:
branches: [main]
pull_request:

jobs:
tests:
name: Unit tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

# Many tests drive a real browser (JavaScript pages, "load more", sign-in).
- name: Install the browser
run: python -m playwright install --with-deps chromium

- name: Run test suite (offline)
run: pytest tests/ -v --ignore=tests/golden_sites

fresh-install:
name: Fresh install (${{ matrix.os }})
# A clean machine must be able to install from requirements.txt and import the
# whole command line. Catches a missing dependency before users do.
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install from requirements.txt only
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Import and construct core
shell: python
run: |
import json, tempfile
from pathlib import Path

import scrapewizard.cli.main # full CLI import chain
from scrapewizard.core.orchestrator import Orchestrator

d = Path(tempfile.mkdtemp())
(d / "session.json").write_text(json.dumps(
{"project_id": "ci", "url": "https://example.com", "state": "INIT"}
))
Orchestrator(d)
print("fresh-install check passed")
91 changes: 38 additions & 53 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,53 +1,38 @@
name: Build & Release

on:
push:
tags:
- 'v*'


permissions:
contents: write

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: studio/frontend/package-lock.json

- name: Install frontend dependencies
working-directory: studio/frontend
run: npm ci

- name: Build frontend
working-directory: studio/frontend
run: npm run build

- name: Install build tools
run: |
python -m pip install --upgrade pip
pip install build

- name: Build package
run: python -m build

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: dist/*
generate_release_notes: true
draft: false
prerelease: false
name: Build & Release

on:
push:
tags:
- 'v*'


permissions:
contents: write

jobs:
build:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.12'

- name: Install build tools
run: |
python -m pip install --upgrade pip
pip install build

- name: Build package
run: python -m build

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: dist/*
generate_release_notes: true
draft: false
prerelease: false
Loading
Loading