[project] name = "tessera" version = "0.2.0" description = "Tessera: atomic work queue and atomic storage for agent swarms -- everything is a noun or a verb for clear organization and reusability, with every task claimed once, finished once, receipted." readme = "README.md" requires-python = ">=3.12" license = "MIT" authors = [{ name = "ta-amps" }] dependencies = [ "pydantic>=2.9", "httpx>=0.27", "fastapi>=0.115", "uvicorn>=0.30", "python-multipart>=0.0.9", ] [project.optional-dependencies] # The HTTP service and the MCP door are built from briefs L6 to L24; these extras hold their dependencies. server = ["fastapi>=0.115", "uvicorn>=0.30"] mcp = [ "mcp>=1.10", ] [project.scripts] tessera = "tessera.cli:main" [dependency-groups] dev = [ "pytest>=8.3", "pytest-timeout>=2.3", "hypothesis>=6.100", "ruff>=0.6", "mypy>=1.11", ] [build-system] requires = ["hatchling>=1.25"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/tessera"] [tool.ruff] line-length = 100 target-version = "py312" src = ["src", "tests", "conformance-draft", "tools", "scripts"] [tool.ruff.lint] select = ["E", "F", "W", "I", "B", "UP", "SIM", "RUF", "S", "PT"] # S101 asserts are the test idiom; S311 random is for backoff jitter, not security; # S603/S607 subprocess calls run fixed, trusted commands. E501: `ruff format` owns code width, # and a long line of prose in a docstring is fine. ignore = ["S101", "S311", "S603", "S607", "E501"] [tool.ruff.lint.per-file-ignores] "tests/**" = ["S105", "S106", "S108", "PT018"] "conformance-draft/**" = ["S105", "S106", "S108", "PT018"] [tool.mypy] strict = true python_version = "3.12" files = ["src/tessera"] plugins = ["pydantic.mypy"] [tool.pytest.ini_options] testpaths = ["tests", "conformance-draft"] timeout = 180 markers = [ "fabric_all: conformance test that applies to every backend, including the in-process store", "fabric_service: conformance test that applies only to the networked service (HTTP, keys, MCP)", "slow: takes more than a few seconds", ]