[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"] [dependency-groups] dev = [ "types-aiofiles", ]