[project] name = "zaxy-memory" version = "3.2.0" description = "Coordinator memory for auditable multi-agent projects" readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } authors = [ { name = "Zaxy Contributors" } ] classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", ] keywords = [ "agent-memory", "auditable-memory", "coordinator-memory", "embedded-memory", "event-sourcing", "knowledge-graph", "ladybugdb", "local-first", "mcp", "multi-agent", "temporal-graph", ] dependencies = [ "pydantic>=2.7.0", "pydantic-settings>=2.0.0", # Floor at the 2.x line: the migration (spec # docs/superpowers/specs/2026-08-10-mcp-2-migration-design.md) ported the # server to constructor on_* handlers and snake_case wire types. "mcp>=2.0.0,<3", "typer>=0.12.0", "httpx>=0.27.0", "prometheus-client>=0.20.0", "PyJWT[crypto]>=2.8.0", "tomlkit>=0.13.0", "PyYAML>=6.0.0", # Exact pin, deliberately: LadybugDB is the maintained fork of the archived # Kuzu engine, but it is a bus-factor-1 project with monthly releases and # early dialect divergence; every defect verdict and lane number in # docs/research/artifacts/2-3-research/ was verified against exactly this # version. Bump only with a fresh workaround-matrix and lane rerun. # (Pin the `ladybug` name, never the stale pre-rename `real-ladybug`.) "ladybug==0.17.1", "numpy>=1.26.0", ] [project.optional-dependencies] langgraph = [ "langgraph>=0.6", ] crewai = [ "crewai>=0.100", ] autogen = [ "autogen-agentchat>=0.7", ] local-embeddings = [ "sentence-transformers>=3.0.0", ] pggraph = [ "psycopg[binary]>=3.2.0", ] neo4j = [ "neo4j>=5.20.0", ] pathlight = [ "pathlight>=0.1.0", ] embedded = [ ] latticedb = [ "latticedb>=0.9.6", ] export = [ # Portable signed export. Ed25519 works with the cryptography that PyJWT[crypto] # already pulls in; ML-DSA-65 (post-quantum) requires cryptography >= 46. "cryptography>=46.0", ] frameworks = [ "langgraph>=0.6", "crewai>=0.100", "autogen-agentchat>=0.7", ] dev = [ "pytest>=8.0.0", "pytest-asyncio>=0.23.0", "pytest-cov>=5.0.0", "pytest-benchmark>=4.0.0", "factory-boy>=3.3.0", "freezegun>=1.5.0", "build>=1.2.0", "twine>=5.0.0", "ruff>=0.4.0", "mypy>=2.0", # Dev/type-check toolchain only: numpy >=2.5 requires Python 3.12+ and ships # PEP 695 `type` stubs that mypy rejects under our python_version = 3.11 # floor, so pin the type-check env to numpy with 3.11-valid stubs. Runtime # numpy is intentionally unconstrained (see [project.dependencies]). "numpy>=1.26.0,<2.5", "neo4j>=5.20.0", "latticedb>=0.9.6", "types-requests>=2.32.0", "types-PyYAML>=6.0.12", ] [project.scripts] zaxy = "zaxy.__main__:main" # Alias so directory auto-installers that assume the console-script name matches # the package name can launch it: `uvx zaxy-memory serve`. zaxy-memory = "zaxy.__main__:main" [project.urls] Homepage = "https://syndicalt.github.io/zaxy/" Documentation = "https://syndicalt.github.io/zaxy/docs/getting-started.html" Repository = "https://github.com/syndicalt/zaxy" Issues = "https://github.com/syndicalt/zaxy/issues" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/zaxy"] artifacts = ["src/zaxy/py.typed"] [tool.hatch.build.targets.sdist] include = [ "AGENTS.md", "CHANGELOG.md", "README.md", "docs", "examples", "site", "scripts", "src", "tests", "zaxy_benchmarks", "pyproject.toml", "docker-compose.yml", "docker-compose.prod.yml", "Dockerfile", ] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["."] asyncio_mode = "auto" addopts = "-m 'not integration' --cov=zaxy --cov-report=term-missing --cov-fail-under=90" markers = [ "integration: marks tests that require Docker services (Neo4j)", "unit: marks fast unit tests with no external dependencies", ] [tool.coverage.run] source = ["src/zaxy"] omit = ["*/tests/*", "*/__main__.py"] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "if __name__ == .__main__.:", "raise NotImplementedError", "pass", ] fail_under = 92 [tool.zaxy.coverage] min_total_percent = "92.00" [tool.ruff] target-version = "py311" line-length = 100 src = ["src", "tests", "."] [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 length handled by formatter [tool.ruff.lint.pydocstyle] convention = "google" [tool.ruff.format] quote-style = "double" indent-style = "space" [tool.mypy] python_version = "3.11" files = ["src/zaxy", "zaxy_benchmarks"] strict = true warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true disallow_incomplete_defs = true check_untyped_defs = true show_error_codes = true [[tool.mypy.overrides]] module = ["pathlight", "psycopg", "psycopg.rows", "pyarrow"] ignore_missing_imports = true