# pyproject.toml — OSS xml-pipeline library # # This is the open-source core: message pump, handlers, LLM abstraction, tools. # Advanced features (TUI console, LSP, auth, WebSocket server) are in Nextra. [build-system] requires = ["setuptools>=45", "wheel"] build-backend = "setuptools.build_meta" [project] name = "xml-pipeline" version = "0.3.0" description = "Schema-driven XML message bus for multi-agent systems" readme = "README.md" requires-python = ">=3.11" license = {text = "MIT"} authors = [ {name = "Your Name", email = "you@example.com"}, ] keywords = [ "xml", "multi-agent", "message-bus", "llm", "pipeline", "async", ] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Framework :: AsyncIO", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Distributed Computing", ] # ============================================================================= # CORE DEPENDENCIES — minimal set for the library # ============================================================================= dependencies = [ # XML processing & validation "lxml>=4.9", # Async streaming pipeline "aiostream>=0.5", # Configuration "pyyaml>=6.0", # Case conversion (snake_case <-> camelCase) "pyhumps>=3.0", # Ed25519 identity keys for signing "cryptography>=41.0", # HTTP client for LLM backends "httpx>=0.27", # Colored terminal output (minimal, no TUI) "termcolor>=2.0", ] # ============================================================================= # OPTIONAL DEPENDENCIES — user opts in # ============================================================================= [project.optional-dependencies] # LLM provider SDKs (alternative to raw httpx calls) anthropic = ["anthropic>=0.39"] openai = ["openai>=1.0"] # Tool backends redis = ["redis>=5.0"] # Distributed key-value store search = ["duckduckgo-search>=6.0"] # Web search tool # Console example (optional, for interactive use) console = ["prompt_toolkit>=3.0"] # All LLM providers llm = ["xml-pipeline[anthropic,openai]"] # All tools tools = ["xml-pipeline[redis,search]"] # Everything (for local development) all = ["xml-pipeline[llm,tools,console]"] # Testing test = [ "pytest>=7.0", "pytest-asyncio>=0.23", "pytest-cov>=4.0", ] # Development (linting, type checking) dev = [ "xml-pipeline[test,all]", "mypy>=1.8", "ruff>=0.1", "types-PyYAML", ] # ============================================================================= # CLI ENTRY POINTS # ============================================================================= [project.scripts] xml-pipeline = "xml_pipeline.cli:main" xp = "xml_pipeline.cli:main" # Short alias # ============================================================================= # PROJECT URLS # ============================================================================= [project.urls] Homepage = "https://github.com/yourorg/xml-pipeline" Documentation = "https://xml-pipeline.org/docs" Repository = "https://github.com/yourorg/xml-pipeline" Issues = "https://github.com/yourorg/xml-pipeline/issues" Changelog = "https://github.com/yourorg/xml-pipeline/blob/main/CHANGELOG.md" # ============================================================================= # PACKAGE DISCOVERY # ============================================================================= [tool.setuptools.packages.find] where = ["."] include = [ "xml_pipeline*", "third_party*", "examples*", ] exclude = [ "tests*", "docs*", ] [tool.setuptools.package-data] xml_pipeline = [ "schema/*.xsd", "prompts/*.txt", ] # ============================================================================= # PYTEST # ============================================================================= [tool.pytest.ini_options] asyncio_mode = "auto" asyncio_default_fixture_loop_scope = "function" testpaths = ["tests"] python_files = ["test_*.py"] norecursedirs = [".git", "__pycache__", "*.egg-info", "build", "dist"] markers = [ "slow: marks tests as slow (deselect with '-m \"not slow\"')", "integration: marks tests requiring external services", ] # ============================================================================= # RUFF (linting) # ============================================================================= [tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = [ "E", # pycodestyle errors "F", # pyflakes "I", # isort "N", # pep8-naming "W", # pycodestyle warnings "UP", # pyupgrade "B", # flake8-bugbear "C4", # flake8-comprehensions "SIM", # flake8-simplify ] ignore = [ "E501", # line too long (handled by formatter) "B008", # function call in default argument ] [tool.ruff.lint.isort] known-first-party = ["xml_pipeline", "third_party"] # ============================================================================= # MYPY (type checking) # ============================================================================= [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_ignores = true disallow_untyped_defs = true strict_optional = true ignore_missing_imports = true [[tool.mypy.overrides]] module = "third_party.*" ignore_errors = true