[tool.poetry]
name = "mcp-souschef"
version = "2.1.2"
description = "AI-powered MCP server for Chef to Ansible conversion"
readme = "README.md"
authors = ["SousChef Contributors"]
license = "MIT"
packages = [{include = "souschef"}]
[tool.poetry.dependencies]
python = ">=3.14,<4.0"
anthropic = ">=0.75.0"
click = ">=8.1.0"
mcp = ">=1.25.0"
python-dotenv = ">=1.2.1"
zod = ">=0.8.0"
[tool.poetry.group.dev.dependencies]
pytest = ">=9.0.2"
pytest-cov = ">=7.0.0"
pytest-benchmark = ">=5.1.0"
hypothesis = ">=6.125.0"
ruff = ">=0.14.10"
mypy = ">=1.14.0"
pip-audit = ">=2.7.0"
twine = ">=6.0.0"
pre-commit = ">=4.5.1"
mutmut = ">=3.4.0"
syrupy = "^5.0.0"
ansible-lint = "^25.12.2"
pytest-timeout = "^2.4.0"
types-pyyaml = "^6.0.12.20250915"
[tool.poetry.scripts]
souschef = "souschef.server:main"
souschef-cli = "souschef.cli:main"
[build-system]
requires = ["poetry-core>=2.0.0"]
build-backend = "poetry.core.masonry.api"
[tool.ruff]
line-length = 88
[tool.ruff.lint]
select = ["E", "F", "W", "C90", "I", "N", "UP", "B", "A", "C4", "T20", "SIM", "PTH", "ISC"]
# Docstring rules - use categories for maintainability; ignore specific exceptions
extend-select = ["D2", "D3", "D4"]
ignore = ["D100", "D104", "D105", "D107", "D203", "D212"]
[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"]
"tests/*" = ["S101", "E501"] # Allow assert statements, long lines in test data
"souschef/server.py" = ["T201", "E501"] # Allow print in main entry, long lines in templates/reports
[tool.pytest.ini_options]
minversion = "6.0"
addopts = "-ra -q --cov=souschef --cov-report=term-missing"
testpaths = [
"tests",
]
[tool.mutmut]
backup = false
[tool.mypy]
python_version = "3.14"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = false
check_untyped_defs = true
warn_redundant_casts = true
warn_unused_ignores = true
strict_optional = true
no_implicit_optional = true
[[tool.mypy.overrides]]
module = "tests.*"
disallow_untyped_defs = false
check_untyped_defs = false