black (line length, target-version), isort (profile=black), mypy (strict, ignore_missing_imports for libraries), pytest (asyncio mode, markers for slow/integration), coverage (source, omit). One file, one source of truth.
[tool.ruff] line-length=100, target-version=py311.
[tool.mypy] strict=true, follow_imports=silent for stubs.
[tool.pytest.ini_options] asyncio_mode=auto, markers = [slow, integration].
pyproject.toml -> ruff, black, isort, mypy, pytest, coverage
One change touches every tool
Centralize Python tooling in pyproject.toml — no more .flake8, .isort.cfg, setup.cfg cross-tool drift.