[build-system] requires = ["setuptools>=69"] build-backend = "setuptools.build_meta" [project] name = "memory-fabric" dynamic = ["version"] description = "File-first MCP memory fabric for AI coding assistants" readme = "README.md" requires-python = ">=3.11" license = { text = "MIT" } authors = [{ name = "Memory Fabric Contributors" }] dependencies = [] [project.optional-dependencies] # Pinned below 2.0: the MCP SDK's 2.0.0 removed `mcp.server.fastmcp`, which # `server.py` is built on (FastMCP is replaced by `mcp.server.mcpserver`). The # open `>=1.0.0` range meant every fresh install silently picked up the new # major and left `memory-fabric[mcp]` with a server that cannot start — and it # turned CI red on unchanged commits the day 2.0.0 shipped. Porting to the 2.0 # API is its own piece of work; this pin is the stopgap that keeps installs # working, not the destination. mcp = ["mcp>=1.0.0,<2"] test = ["pytest>=8", "pytest-cov>=5"] [project.scripts] ai-memory = "memory_fabric.cli:main" memory-fabric-mcp = "memory_fabric.server:main" [tool.setuptools.dynamic] version = { attr = "memory_fabric.version.__version__" } [tool.setuptools.packages.find] where = ["src"] [tool.setuptools.package-data] memory_fabric = ["py.typed"] [tool.ruff] line-length = 100 target-version = "py311" extend-exclude = ["scratch", "build"] [tool.ruff.lint] # E4/E7/E9/F: pyflakes baseline. I: import order. B: bugbear. UP: pyupgrade. # SIM: flake8-simplify. RUF: ruff-specific. BLE001: no blind `except Exception` # without a `noqa` explaining why (ROADMAP.md Phase 0 "silent-failure audit" — # every remaining broad catch is either narrowed or annotated on purpose). # S110/S112: try/except-pass/continue, cherry-picked from flake8-bandit rather # than enabling the full `S` family (unreviewed — a separate pass). select = ["E4", "E7", "E9", "F", "I", "B", "UP", "SIM", "RUF", "BLE", "S110", "S112"] [tool.mypy] python_version = "3.11" disallow_untyped_defs = true warn_unused_ignores = true warn_redundant_casts = true [tool.coverage.run] source = ["memory_fabric"] [tool.coverage.report] # Baseline measured 2026-07-12: 83%. Ratchet +1 per release toward >=85% # (ROADMAP.md Phase 0 "Coverage gate"). fail_under = 82 exclude_lines = [ "pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError", "def __repr__", ]