[tools] python = "3.14" node = "24" ruff = "0.16.10" biome = "2.5.15" uv = "0.12.21" [tasks.lock] description = "Re-resolve backend/requirements.in into the pinned, hashed backend/requirements.txt" run = "uv pip compile --quiet --universal --generate-hashes backend/requirements.in -o backend/requirements.txt" [tasks.setup] description = "Create the venv and install backend and frontend dependencies" run = [ "python -m venv .venv", ".venv/bin/pip install -q --disable-pip-version-check -r backend/requirements.txt", "npm install --no-fund --no-audit", ] [tasks.db] description = "Start local Postgres and wait until it accepts connections" run = [ "docker compose up -d db", "until docker compose exec -T db pg_isready -q -U postgres; do sleep 1; done", ] [tasks."dev:api"] description = "Flask API on :5000" depends = ["setup", "db"] run = ".venv/bin/python backend/app.py" [tasks."dev:web"] description = "Vite UI; /api is proxied to Flask" depends = ["setup"] run = "npm run dev" [tasks.dev] description = "Start the app for local testing (API + UI)" depends = ["dev:api", "dev:web"] [tasks."format:py"] description = "Sort imports and format the backend" run = ["ruff check --select I --fix backend", "ruff format backend"] [tasks."format:ts"] description = "Sort imports and format the frontend" run = "biome check --write --linter-enabled=false src vite.config.ts" [tasks.format] description = "Format and auto-fix Python and TypeScript" depends = ["format:py", "format:ts"] [tasks."lint:py"] description = "Lint, type-check and verify formatting of the backend (no writes)" run = [ "ruff check backend", "ruff format --check backend", "uvx --quiet --with-requirements backend/requirements.txt --with types-psycopg2==2.9.21.20260911 mypy@2.4.0 --strict backend --exclude backend/tests", ] [tasks."lint:ts"] description = "Lint the frontend and verify formatting (no writes)" run = "biome check src vite.config.ts" [tasks.lint] description = "Lint and format-check Python and TypeScript (CI-safe, no writes)" depends = ["lint:py", "lint:ts"] [tasks."test:py"] description = "Backend integration tests against real Postgres (books_test)" depends = ["setup", "db"] run = ".venv/bin/python -W error -m unittest discover -s backend/tests -t backend" [tasks."test:ts"] description = "Frontend component tests and typecheck" depends = ["setup"] run = ["npm test", "npm run typecheck"] [tasks.test] description = "Run backend and frontend tests" depends = ["test:py", "test:ts"]