[tool.black] line-length = 100 target-version = ["py312"] extend-exclude = '(\.venv|migrations/versions)' [tool.isort] profile = "black" line_length = 100 skip = [".venv", "migrations/versions"] [project] name = "openclaw-agency-backend" version = "0.1.0" requires-python = ">=3.12" dependencies = [ "alembic==1.18.3", "clerk-backend-api==4.2.0", "fastapi==0.128.6", "fastapi-pagination==0.15.10", "jinja2==3.1.6", "psycopg[binary]==3.3.2", "pydantic-settings==2.12.0", "python-dotenv==1.2.1", "sqlalchemy[asyncio]==2.0.46", "sqlmodel==0.0.32", "sse-starlette==3.2.0", "uvicorn[standard]==0.40.0", "websockets==16.0", ] [project.optional-dependencies] dev = [ "aiosqlite==0.22.1", "black==26.1.0", "coverage[toml]==7.13.4", "flake8==7.3.0", "httpx==0.28.1", "isort==7.0.0", "mypy==1.19.1", "pytest==9.0.2", "pytest-asyncio==1.3.0", "pytest-cov==7.0.0", "ruff==0.15.0", ] [tool.mypy] python_version = "3.12" strict = true plugins = ["pydantic.mypy"] files = ["app", "scripts"] mypy_path = ["typings"] show_error_codes = true [[tool.mypy.overrides]] module = ["tests.*"] ignore_errors = true [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = ["ALL"] [tool.pytest.ini_options] asyncio_default_fixture_loop_scope = "function" [tool.coverage.run] branch = true source = ["app"] # Migrations are generated artifacts; testing them doesn't add coverage signal. omit = ["migrations/versions/*"] [tool.coverage.report] show_missing = true skip_covered = true # NOTE: Current baseline coverage is low; we publish coverage.xml in CI but # don't fail the build until the test suite expands. Tighten toward 100% in # follow-up PRs as coverage grows. fail_under = 0