[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.131.0",
    "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",
    "redis==6.3.0",
    "rq==2.6.0",
    "cryptography==45.0.7",
]

[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
