[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "sift-cli" version = "1.1.0" description = "Runs your command, then gives the model only the lines that matter." readme = "README.md" requires-python = ">=3.12" license = "MIT" authors = [{ name = "slmnys" }] keywords = ["mcp", "llm", "context", "distillation", "cli"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Build Tools", ] dependencies = [] [project.optional-dependencies] # Only the server needs this; `sift` at a terminal has no dependencies at all. # Pinned at 2 because that is where `mcp.server.mcpserver` lives -- on 1.x the # same class was `mcp.server.fastmcp`, and importing the server would fail. mcp = ["mcp>=2"] [project.scripts] sift = "sift.cli:main" sift-mcp = "sift.server:main" # The package name, spelled as a command, because that is the only name a # registry entry can carry: `uvx ` is how a client starts one. sift-cli = "sift.cli:main" [project.urls] Homepage = "https://github.com/slymnysr/sift" [dependency-groups] dev = [ "mcp>=2", "pytest>=8", "pytest-asyncio>=1.4.0", "ruff>=0.6", ] [tool.hatch.build.targets.wheel] packages = ["src/sift"] [tool.pytest.ini_options] testpaths = ["test"] addopts = "-q" # The stdio tests talk to a real server over a real pipe, which is async all # the way down. Without this every one of them would be collected and skipped. asyncio_mode = "auto" [tool.ruff] line-length = 96 src = ["src", "test"] [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM", "RUF"]