Files
roboco/pyproject.toml
T

319 lines
7.6 KiB
TOML
Raw Normal View History

2025-12-10 02:49:54 +01:00
[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"}
]
2025-12-10 02:49:54 +01:00
readme = "README.md"
license = { text = "MIT" }
requires-python = ">=3.13"
2025-12-10 02:49:54 +01:00
dependencies = [
# Core
"pydantic",
"pydantic-settings",
2025-12-10 02:49:54 +01:00
# API
2025-12-12 02:45:47 +01:00
"aiofiles",
"fastapi",
"uvicorn[standard]",
"websockets",
2025-12-10 02:49:54 +01:00
# Database
"sqlalchemy[asyncio]",
"asyncpg", # PostgreSQL async driver
"alembic", # Migrations
2025-12-10 02:49:54 +01:00
# Cache/Queue
"redis",
"hiredis", # Redis performance
2025-12-10 02:49:54 +01:00
# RAG (piragi with PostgreSQL/pgvector backend)
"piragi[postgres]",
2025-12-10 02:49:54 +01:00
# AI/LLM
"anthropic",
"openai", # For embeddings
"tiktoken", # Token counting
2025-12-12 18:08:06 +01:00
"python-toon", # Token-efficient LLM serialization
# MCP (Model Context Protocol)
"mcp",
2025-12-10 02:49:54 +01:00
# Utilities
"httpx",
"python-multipart",
"python-jose[cryptography]", # JWT
"passlib[bcrypt]", # Password hashing
"tenacity", # Retry logic
"structlog", # Structured logging
2025-12-10 02:49:54 +01:00
]
[project.optional-dependencies]
dev = [
# Testing
"pytest",
"pytest-asyncio",
"pytest-cov",
"pytest-xdist",
"httpx", # For TestClient
"factory-boy",
"faker",
2025-12-10 02:49:54 +01:00
# Code Quality
"ruff",
"mypy",
2025-12-13 13:25:37 +01:00
"vulture",
"bandit",
"safety",
"pip-audit",
"radon",
"xenon",
"deptry",
"semgrep",
2025-12-10 02:49:54 +01:00
# Type Stubs
"types-redis",
"types-passlib",
"types-python-jose",
2025-12-10 02:49:54 +01:00
# Development
"ipython",
"rich",
2025-12-10 02:49:54 +01:00
]
docs = [
"mkdocs",
"mkdocs-material",
"mkdocstrings[python]",
2025-12-10 02:49:54 +01:00
]
[project.scripts]
roboco = "roboco.cli:main"
roboco-bootstrap = "roboco.bootstrap:cli"
2025-12-10 02:49:54 +01:00
[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]
2025-12-10 17:37:24 +01:00
packages = ["roboco"]
2025-12-10 02:49:54 +01:00
[tool.hatch.metadata]
allow-direct-references = true
2025-12-10 02:49:54 +01:00
# =============================================================================
# RUFF Configuration
# =============================================================================
[tool.ruff]
target-version = "py313"
2025-12-10 02:49:54 +01:00
src = ["src"]
2025-12-11 01:05:20 +01:00
exclude = ["vulture_whitelist.py", ".venv", "alembic"]
2025-12-10 02:49:54 +01:00
[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
]
2025-12-24 04:23:16 +01:00
# Lazy imports to avoid circular dependencies
2025-12-12 18:08:06 +01:00
[tool.ruff.lint.per-file-ignores]
2025-12-24 04:23:16 +01:00
"roboco/mcp/**/*.py" = ["PLC0415"]
2025-12-13 05:53:19 +01:00
"roboco/services/*.py" = ["PLC0415"]
2025-12-27 21:53:38 +01:00
"roboco/api/routes/*.py" = ["PLC0415"]
2025-12-12 18:08:06 +01:00
2025-12-10 02:49:54 +01:00
# =============================================================================
# MyPy Configuration
# =============================================================================
[tool.mypy]
python_version = "3.13"
2025-12-10 02:49:54 +01:00
warn_return_any = true
warn_unused_configs = true
2025-12-10 02:49:54 +01:00
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
disallow_untyped_decorators = true
no_implicit_optional = true
strict_optional = true
2025-12-13 05:53:19 +01:00
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
2025-12-11 01:05:20 +01:00
exclude = ["vulture_whitelist.py", ".venv", "alembic"]
2025-12-10 02:49:54 +01:00
plugins = ["pydantic.mypy"]
[[tool.mypy.overrides]]
module = [
"redis.*",
"anthropic.*",
"tiktoken.*",
"piragi.*",
2025-12-13 05:50:34 +01:00
"toon.*",
2025-12-10 02:49:54 +01:00
]
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"
2025-12-10 02:49:54 +01:00
markers = [
"asyncio: mark tests as async",
2025-12-10 02:49:54 +01:00
"slow: marks tests as slow",
"integration: marks tests as integration tests",
"unit: marks tests as unit tests",
]
# =============================================================================
# Vulture Configuration
# =============================================================================
[tool.vulture]
2025-12-10 17:37:24 +01:00
paths = ["roboco", "tests", "vulture_whitelist.py"]
2025-12-11 01:05:20 +01:00
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",
2025-12-10 02:49:54 +01:00
]
ignore_names = [
"test_*",
"Test*",
"cleanup_*",
"mock_*",
"expected_*",
"exc_*",
"__*__",
"Config",
"Field",
]
sort_by_size = true
2025-12-10 02:49:54 +01:00
# =============================================================================
# Bandit Configuration
# =============================================================================
[tool.bandit]
skips = ["B101", "B601"]
2025-12-11 01:05:20 +01:00
exclude_dirs = ["tests", ".venv", "vulture_whitelist.py", "alembic"]
severity = "medium"
# =============================================================================
# Radon Configuration
# =============================================================================
[tool.radon]
2025-12-11 01:05:20 +01:00
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"
2025-12-11 01:05:20 +01:00
exclude = ["tests/*", ".venv/*", "vulture_whitelist.py", "alembic/*"]
ignore = []
# =============================================================================
# Deptry Configuration
# =============================================================================
[tool.deptry]
2025-12-11 01:05:20 +01:00
exclude = ["tests", ".venv", "vulture_whitelist.py", "alembic"]
extend_exclude = ["conftest.py", "setup.py"]
2025-12-10 17:37:24 +01:00
known_first_party = ["roboco"]
2025-12-13 13:25:37 +01:00
2025-12-13 18:09:23 +01:00
[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"]
2025-12-13 13:25:37 +01:00
[dependency-groups]
dev = [
"types-aiofiles",
]