[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "little-loops"
version = "1.67.2"
description = "Development workflow toolkit for Claude Code with issue management, code quality commands, and automated processing"
readme = "../README.md"
license = "MIT"
requires-python = ">=3.11"
authors = [
    { name = "Brennon Williams", email = "brennon@brenentech.com" }
]
maintainers = [
    { name = "Brennon Williams", email = "brennon@brenentech.com" }
]
keywords = [
    "claude-code",
    "development",
    "workflow",
    "issue-management",
    "automation"
]
classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Environment :: Console",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Topic :: Software Development :: Build Tools",
    "Topic :: Software Development :: Quality Assurance",
]
dependencies = [
    "pyyaml>=6.0",
    "wcwidth>=0.2",
]

[project.urls]
Homepage = "https://github.com/BrennonTWilliams/little-loops"
Documentation = "https://docs.little-loops.ai"
Repository = "https://github.com/BrennonTWilliams/little-loops"
"Bug Tracker" = "https://github.com/BrennonTWilliams/little-loops/issues"

[project.scripts]
ll-auto = "little_loops.cli:main_auto"
ll-parallel = "little_loops.cli:main_parallel"
ll-messages = "little_loops.cli:main_messages"
ll-loop = "little_loops.cli:main_loop"
ll-sprint = "little_loops.cli:main_sprint"
ll-sync = "little_loops.cli:main_sync"
ll-workflows = "little_loops.workflow_sequence:main"
ll-history = "little_loops.cli:main_history"
ll-verify-docs = "little_loops.cli:main_verify_docs"
ll-check-links = "little_loops.cli:main_check_links"
ll-issues = "little_loops.cli:main_issues"
ll-deps = "little_loops.cli:main_deps"
ll-gitignore = "little_loops.cli:main_gitignore"
mcp-call = "little_loops.mcp_call:main"

[project.optional-dependencies]
dev = [
    "pytest>=7.0",
    "pytest-cov>=4.0",
    "hypothesis>=6.0",
    "mutmut>=3.0",
    "ruff>=0.1.0",
    "mypy>=1.0",
    "hatch>=1.0",
]
llm = []

[tool.hatch.build.targets.wheel]
packages = ["little_loops"]
include = ["little_loops/**", "LICENSE"]

[tool.ruff]
line-length = 100
target-version = "py311"

[tool.ruff.lint]
select = ["E", "F", "W", "I", "UP", "B", "C4"]
ignore = ["E501"]

[tool.mypy]
python_version = "3.11"
warn_return_any = true
warn_unused_ignores = true
ignore_missing_imports = true

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
addopts = [
    "--strict-markers",
    "--strict-config",
    "--cov=little_loops",
    "--cov-report=term-missing:skip-covered",
    "--cov-report=html",
]
markers = [
    "integration: marks tests as integration tests (deselect with '-m \"not integration\"')",
    "slow: marks tests as slow running (deselect with '-m \"not slow\"')",
]

[tool.coverage.run]
source = ["little_loops"]
omit = [
    "*/tests/*",
    "*/__init__.py",
]

[tool.coverage.report]
exclude_lines = [
    "pragma: no cover",
    "def __repr__",
    "raise AssertionError",
    "raise NotImplementedError",
    "if __name__ == .__main__.:",
    "if TYPE_CHECKING:",
]
fail_under = 80

[tool.mutmut]
paths_to_mutate = ["little_loops/"]
pytest_add_cli_args_test_selection = ["tests/"]
pytest_add_cli_args = ["-x", "-q"]
