Files
roboco/pyproject.toml
T
2025-12-13 18:09:23 +01:00

322 lines
7.8 KiB
TOML

[project]
name = "roboco"
version = "0.1.0"
description = "AI Agents Company - A virtual organization of AI agents functioning as a software development workforce"
authors = [
{name = "Renzo Franceschini", email = "rennf93@users.noreply.github.com"}
]
readme = "README.md"
license = { text = "MIT" }
requires-python = ">=3.13"
dependencies = [
# Core
"pydantic",
"pydantic-settings",
# API
"aiofiles",
"fastapi",
"uvicorn[standard]",
"websockets",
# Database
"sqlalchemy[asyncio]",
"asyncpg", # PostgreSQL async driver
"alembic", # Migrations
# Cache/Queue
"redis",
"hiredis", # Redis performance
# RAG (piragi with PostgreSQL/pgvector backend)
"piragi[postgres]",
# AI/LLM
"anthropic",
"openai", # For embeddings
"tiktoken", # Token counting
"python-toon", # Token-efficient LLM serialization
# MCP (Model Context Protocol)
"mcp",
# Utilities
"httpx",
"python-multipart",
"python-jose[cryptography]", # JWT
"passlib[bcrypt]", # Password hashing
"tenacity", # Retry logic
"structlog", # Structured logging
]
[project.optional-dependencies]
dev = [
# Testing
"pytest",
"pytest-asyncio",
"pytest-cov",
"pytest-xdist",
"httpx", # For TestClient
"factory-boy",
"faker",
# Code Quality
"ruff",
"mypy",
"vulture",
"bandit",
"safety",
"pip-audit",
"radon",
"xenon",
"deptry",
"semgrep",
# Type Stubs
"types-redis",
"types-passlib",
"types-python-jose",
# Development
"ipython",
"rich",
]
docs = [
"mkdocs",
"mkdocs-material",
"mkdocstrings[python]",
]
[project.scripts]
roboco = "roboco.cli:main"
roboco-bootstrap = "roboco.bootstrap:cli"
[project.urls]
Homepage = "https://github.com/renzof/roboco"
Documentation = "https://roboco.dev/docs"
Repository = "https://github.com/renzof/roboco"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["roboco"]
[tool.hatch.metadata]
allow-direct-references = true
# =============================================================================
# RUFF Configuration
# =============================================================================
[tool.ruff]
target-version = "py313"
src = ["src"]
exclude = ["vulture_whitelist.py", ".venv", "alembic"]
[tool.ruff.lint]
select = [
"E", # pycodestyle errors
"W", # pycodestyle warnings
"F", # Pyflakes
"I", # isort
"B", # flake8-bugbear
"C4", # flake8-comprehensions
"UP", # pyupgrade
"ARG", # flake8-unused-arguments
"SIM", # flake8-simplify
"TCH", # flake8-type-checking
"PTH", # flake8-use-pathlib
"PL", # Pylint
"RUF", # Ruff-specific
]
# MCP servers: Tool functions require explicit parameters for schema generation.
# PLC0415 - Lazy imports for circular import avoidance
#
# Services: Internal methods often need multiple related parameters for DB ops.
# PLC0415 - Lazy imports for circular import avoidance
[tool.ruff.lint.per-file-ignores]
"roboco/mcp/*.py" = ["PLC0415"]
"roboco/services/*.py" = ["PLC0415"]
# =============================================================================
# MyPy Configuration
# =============================================================================
[tool.mypy]
python_version = "3.13"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
strict_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
exclude = ["vulture_whitelist.py", ".venv", "alembic"]
plugins = ["pydantic.mypy"]
[[tool.mypy.overrides]]
module = [
"redis.*",
"anthropic.*",
"tiktoken.*",
"piragi.*",
"toon.*",
]
ignore_missing_imports = true
[tool.pydantic-mypy]
init_forbid_extra = true
init_typed = true
warn_required_dynamic_aliases = true
# =============================================================================
# Pytest Configuration
# =============================================================================
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
python_files = ["test_*.py"]
asyncio_default_fixture_loop_scope = "function"
addopts = "--cov=roboco --cov-report=term-missing"
markers = [
"asyncio: mark tests as async",
"slow: marks tests as slow",
"integration: marks tests as integration tests",
"unit: marks tests as unit tests",
]
# =============================================================================
# Vulture Configuration
# =============================================================================
[tool.vulture]
paths = ["roboco", "tests", "vulture_whitelist.py"]
exclude = ["**/conftest.py", ".venv", "alembic"]
min_confidence = 100
ignore_decorators = [
"@app.route",
"@app.get",
"@app.post",
"@app.put",
"@app.delete",
"@app.patch",
"@pytest.fixture",
"@pytest.mark.*",
"@validator",
"@root_validator",
"@field_validator",
"@model_validator",
]
ignore_names = [
"test_*",
"Test*",
"cleanup_*",
"mock_*",
"expected_*",
"exc_*",
"__*__",
"Config",
"Field",
]
sort_by_size = true
# =============================================================================
# Bandit Configuration
# =============================================================================
[tool.bandit]
skips = ["B101", "B601"]
exclude_dirs = ["tests", ".venv", "vulture_whitelist.py", "alembic"]
severity = "medium"
# =============================================================================
# Radon Configuration
# =============================================================================
[tool.radon]
exclude = "tests/*,.venv/*,vulture_whitelist.py,alembic/*"
cc_min = "C"
mi_min = "A"
no_assert = false
show_closures = true
total_average = true
# =============================================================================
# Xenon Configuration
# =============================================================================
[tool.xenon]
max_absolute = "B"
max_modules = "A"
max_average = "A"
exclude = ["tests/*", ".venv/*", "vulture_whitelist.py", "alembic/*"]
ignore = []
# =============================================================================
# Deptry Configuration
# =============================================================================
[tool.deptry]
exclude = ["tests", ".venv", "vulture_whitelist.py", "alembic"]
extend_exclude = ["conftest.py", "setup.py"]
known_first_party = ["roboco"]
[tool.deptry.per_rule_ignores]
# DEP002: Dependencies not directly imported but used at runtime or via CLI
DEP002 = [
# Runtime server/driver dependencies (used by frameworks, not imported)
"uvicorn",
"websockets",
"asyncpg",
"hiredis",
"python-multipart",
# Database migrations (CLI tool)
"alembic",
# Auth libraries (used via passlib[bcrypt], python-jose[cryptography])
"python-jose",
"passlib",
# LLM utilities (embeddings/token counting)
"openai",
"tiktoken",
# Retry logic (used in production services)
"tenacity",
# Dev tools (CLI, not imported)
"pytest",
"pytest-asyncio",
"pytest-cov",
"pytest-xdist",
"factory-boy",
"faker",
"ruff",
"mypy",
"vulture",
"bandit",
"safety",
"pip-audit",
"radon",
"xenon",
"deptry",
"semgrep",
"ipython",
"rich",
# Type stubs (used by mypy)
"types-redis",
"types-passlib",
"types-python-jose",
# Documentation (CLI tools)
"mkdocs",
"mkdocs-material",
"mkdocstrings",
]
# DEP003: Starlette is a transitive dep of FastAPI, but BaseHTTPMiddleware is needed
DEP003 = ["starlette"]
[dependency-groups]
dev = [
"types-aiofiles",
]