[build-system] requires = ["setuptools>=69", "wheel"] build-backend = "setuptools.build_meta" [project] name = "dead-letter" version = "0.4.10" description = "Convert .eml email exports to clean, LLM-ready Markdown with YAML front matter" readme = "README.md" license = "PolyForm-Noncommercial-1.0.0" requires-python = ">=3.12" authors = [{ name = "Big Cactus Labs" }] keywords = [ "eml", "eml-to-markdown", "email", "email-export", "email-archive", "email-parser", "mime", "mime-parser", "markdown", "converter", "archive", "knowledge-base", "local-first", "obsidian", "gmail", "outlook", "mcp", "mcp-server", "llm", "rag", "agent", "digital-preservation", "yaml-frontmatter", ] classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", "Environment :: Web Environment", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3.12", "Topic :: Communications :: Email", "Topic :: Text Processing :: Markup :: Markdown", ] dependencies = [ "icalendar>=6.1.1", "mail-parser>=4.2.0", "mail-parser-reply>=1.35", "nh3>=0.2.20", "html-to-markdown>=3.1.0,<4.0", "selectolax>=1.0.0,<2", "pyyaml>=6.0.2", "mcp>=2.1,<3", ] [project.optional-dependencies] cli = ["watchfiles>=1.0.0"] # Compatibility alias: the MCP SDK is a core dependency since 0.4.7. mcp = [] ui = [ "dead-letter[cli]", "fastapi>=0.136.0", "httpx>=0.28.0", "python-multipart>=0.0.26", "uvicorn[standard]>=0.45.0", ] benchmark = ["tiktoken>=0.8.0"] typesafe = ["typesafe-sdk==0.7.5"] dev = [ "dead-letter[ui,mcp,benchmark]", "anyio>=4.0.0", "hypothesis>=6.100", "pytest>=9.0.3", "pytest-cov>=5.0.0", "ruff>=0.15.14", "pyright>=1.1.390", ] [project.urls] Homepage = "https://github.com/BigCactusLabs/dead-letter" Documentation = "https://github.com/BigCactusLabs/dead-letter/tree/main/docs" Repository = "https://github.com/BigCactusLabs/dead-letter" Issues = "https://github.com/BigCactusLabs/dead-letter/issues" Changelog = "https://github.com/BigCactusLabs/dead-letter/blob/main/CHANGELOG.md" [project.scripts] dead-letter = "dead_letter.backend.cli:main" dead-letter-mcp = "dead_letter.backend.mcp_server:main" dead-letter-ui = "dead_letter.backend.ui_server:main" [tool.setuptools] package-dir = {"" = "src"} [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] "dead_letter" = ["frontend/**/*", "backend/assets/*.png"] [tool.pytest.ini_options] addopts = "--import-mode=importlib" [tool.pyright] include = ["src"] venvPath = "." venv = ".venv" pythonVersion = "3.12" [tool.ruff.lint] # Keep the lint contract stable across Ruff releases. select = ["E4", "E7", "E9", "F"] [tool.ruff.lint.per-file-ignores] # Test modules group imports next to their section dividers by design. "tests/**" = ["E402"]