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

[project]
name = "tactus"
version = "0.35.0"
description = "Tactus: Lua-based DSL for agentic workflows"
readme = "README.md"
requires-python = ">=3.11"
license = {text = "MIT"}
authors = [
    {name = "Anthus", email = "info@anthus.ai"}
]
keywords = ["ai", "agents", "workflows", "lua", "dsl", "llm"]
classifiers = [
    "Development Status :: 3 - Alpha",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
]

dependencies = [
    "lupa>=2.6",
    "pyyaml",
    "pydantic>=2.0",
    "pydantic-ai-slim[bedrock,evals]",
    # NOTE: We use LiteLLM (via DSPy) for all LLM calls - do not add provider-specific SDKs
    "boto3>=1.28.0",
    "rich>=13.9.4",
    "typer",
    "dotyaml>=0.1.0",
    "antlr4-python3-runtime==4.13.1",
    "behave>=1.2.6",
    "gherkin-official>=28.0.0",
    "rapidfuzz>=3.0.0",
    "nanoid>=2.0.0",
    "nest-asyncio>=1.5.0",
    # File I/O support
    "pyarrow>=14.0",
    "h5py>=3.10",
    "openpyxl>=3.1",
    # DSPy for prompt optimization and LLM abstraction
    "dspy>=2.5",
    # IDE server dependencies
    "flask>=3.0.0",
    "flask-cors>=4.0.0",
    # Documentation rendering
    "markdown>=3.0",
    "jinja2>=3.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=8.0",
    "pytest-asyncio>=0.23",
    "pytest-xdist>=3.0",
    "behave>=1.2.6",
    "coverage>=7.4",
    "black==25.12.0",
    "ruff",
    "python-semantic-release>=9.0.0",
    "antlr4-tools>=0.2.1",
    "fastmcp>=2.3.5",
]
# Notification channel optional dependencies
slack = [
    "slack-sdk>=3.0",
]
discord = [
    "discord.py>=2.0",
]
email = [
    "aiosmtplib>=3.0",
]
# Install all notification channels
notifications = [
    "tactus[slack,discord,email]",
]

[project.scripts]
tactus = "tactus.cli.app:main"

[project.urls]
Homepage = "https://github.com/AnthusAI/Tactus"
Documentation = "https://github.com/AnthusAI/Tactus/tree/main/docs"
Repository = "https://github.com/AnthusAI/Tactus"
Issues = "https://github.com/AnthusAI/Tactus/issues"

[tool.hatch.build.targets.wheel]
packages = ["tactus"]

[tool.pytest.ini_options]
testpaths = ["tests"]
python_files = ["test_*.py"]
python_classes = ["Test*"]
python_functions = ["test_*"]
asyncio_mode = "auto"
addopts = "-v --tb=short"
markers = [
    "integration: Integration tests (may be slower than unit tests)",
    "execution: End-to-end execution tests",
    "bdd: Behavior-driven (Gherkin) tests",
    "examples: Example procedure tests",
    "docker: Requires a running Docker daemon (opt-in; see TACTUS_RUN_DOCKER_TESTS)",
    "xdist_group: pytest-xdist grouping marker",
]

[tool.black]
line-length = 100
target-version = ['py311']

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

[tool.ruff.lint.per-file-ignores]
"features/steps/*.py" = ["F811"]  # Allow step_impl redefinition in behave steps
"tactus/validation/generated/*.py" = ["F401", "F403", "F405", "F811", "E711"]  # Ignore ANTLR generated code
"tactus/validation/LuaLexerBase.py" = ["F401", "F403", "F405", "F811"]  # Ignore ANTLR base files
"tactus/validation/LuaParserBase.py" = ["F401", "F403", "F405"]  # Ignore ANTLR base files

[tool.semantic_release]
version_toml = ["pyproject.toml:project.version"]
version_variables = ["tactus/__init__.py:__version__"]
branch = "main"
build_command = "pip install build && python -m build"
commit_parser = "angular"
changelog_file = "CHANGELOG.md"
upload_to_vcs_release = true
upload_to_pypi = true
commit_author = "github-actions[bot] <github-actions[bot]@users.noreply.github.com>"
commit_message = "chore(release): {version}\n\n[skip ci]"
tag_format = "v{version}"
major_on_zero = false
allow_zero_version = true

[tool.semantic_release.remote]
type = "github"
