# pyproject.toml
[project]
name = "manual_slop"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
    "imgui-bundle~=1.92.5",
    "pyopengl~=3.1.10",

    "tomli-w~=1.2.0",
    "tree-sitter~=0.25.2",
    "tree-sitter-python~=0.25.0",
    "tree-sitter-c~=0.24.2",
    "tree-sitter-cpp~=0.23.4",

    "psutil~=7.2.2",
    "fastapi~=0.133.0",
    "mcp~=1.26.0",
    "pytest-timeout~=2.4.0",
    "uvicorn~=0.41.0",

    "anthropic~=0.83.0",
    "dashscope>=1.14.0,<2.0.0",
    "google-genai~=1.64.0",
    "openai~=2.26.0",

    "chromadb~=1.5.8",
    "typing_extensions>=4.5.0,<5.0.0",
]

[project.optional-dependencies]
local-rag = [
    "sentence-transformers~=5.4.1",
]

[dependency-groups]
dev = [
    "pytest>=9.0.2",
    "pytest-cov>=7.0.0",
    "pytest-asyncio>=0.25.3",
    "pytest-xdist>=3.6.0",
    "sentence-transformers~=5.4.1",
]

[tool.pytest.ini_options]
addopts = "--basetemp=tests/artifacts/_pytest_tmp"
markers = [
    "integration: marks tests as integration tests (requires live GUI)",
    "clean_install: clean install verification (opt-in via RUN_CLEAN_INSTALL_TEST=1)",
    "docker: docker build and run test (opt-in via RUN_DOCKER_TEST=1)",
    "live: marks tests as live visualization tests (not in CI by default)",
    "clean_baseline: opt-in marker that resets controller state via /api/reset_session before the test starts (FR5, Phase 6 of test_infrastructure_hardening_20260609)",
    "tier2_sandbox: opt-in sandbox tests (set TIER2_SANDBOX_TESTS=1)",
    "tier2_smoke: opt-in full e2e (set TIER2_SANDBOX_TESTS=1 TIER2_SMOKE=1)",
]

[tool.mypy]
strict = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
ignore_missing_imports = true
explicit_package_bases = true

[tool.ruff]
# Target version
target-version = "py311"
exclude = [
    "scripts/ai_style_formatter.py",
    "scripts/temp_def.py",
]

[tool.ruff.lint]
# Enable McCabe complexity check for nesting depth enforcement
# PLR = complexity rules for methods/functions
select = ["E", "F", "W", "C90", "C4", "PLR0912", "PLR6301", "PLR0206"]

# Ignore style choices that conflict with project's compact style
ignore = [
    "E701", # Multiple statements on one line (colon)
    "E702", # Multiple statements on one line (semicolon)
    "E402", # Module level import not at top of file
    "E501", # Line too long
    "W291", # Trailing whitespace
    "W293", # Blank line contains whitespace
]

[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["PLR"]  # Allow init to export classes

[tool.ruff.lint.mccabe]
max-complexity = 5
