# pyproject.toml [build-system] requires = ["setuptools>=45", "wheel"] build-backend = "setuptools.build_meta" [project] name = "xml-pipeline" version = "0.2.0" description = "Tamper-proof nervous system for multi-agent organisms" readme = "README.md" requires-python = ">=3.11" license = {text = "MIT"} keywords = ["xml", "multi-agent", "message-bus", "aiostream"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Framework :: AsyncIO", ] # ============================================================================= # CORE DEPENDENCIES - minimal, always installed # ============================================================================= dependencies = [ # XML processing "lxml", # Async streaming "aiostream>=0.5", # Config & serialization "pyyaml", "pyhumps", # Crypto (for identity keys) "cryptography", # Console "prompt_toolkit>=3.0", "termcolor", # HTTP client for LLM backends "httpx>=0.27", ] # ============================================================================= # OPTIONAL DEPENDENCIES - user opts into what they need # ============================================================================= [project.optional-dependencies] # LLM provider SDKs (alternative to raw httpx) anthropic = ["anthropic>=0.39"] openai = ["openai>=1.0"] # Tool backends redis = ["redis>=5.0"] # For distributed keyvalue search = ["duckduckgo-search"] # For search tool # Auth (only for multi-tenant/remote deployments) auth = [ "pyotp", # TOTP for privileged channel "argon2-cffi", # Password hashing ] # WebSocket server (for remote connections) server = ["websockets"] # LSP support for config editor (requires yaml-language-server: npm install -g yaml-language-server) lsp = ["lsp-client>=0.3.0"] # All optional features all = [ "xml-pipeline[anthropic,openai,redis,search,auth,server,lsp]", ] # Development test = [ "pytest>=7.0", "pytest-asyncio>=0.21", ] dev = [ "xml-pipeline[test,all]", "mypy", "ruff", ] # ============================================================================= # CLI ENTRY POINTS # ============================================================================= [project.scripts] xml-pipeline = "agentserver.cli:main" xp = "agentserver.cli:main" # ============================================================================= # TOOL CONFIGURATION # ============================================================================= [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" testpaths = ["tests"] python_files = ["test_*.py"] norecursedirs = [".git", "__pycache__", "*.egg-info"] [tool.setuptools.packages.find] where = ["."] include = ["agentserver*", "third_party*"] [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP"] ignore = ["E501"] [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_ignores = true disallow_untyped_defs = true