[project] name = "curate-ipsum" version = "2.5.1" description = "Mutation testing orchestration MCP server with belief revision" readme = "README.md" license = {text = "MIT"} requires-python = ">=3.11" authors = [ {name = "Erik Goughnour", email = "e.goughnour@gmail.com"} ] keywords = ["mutation-testing", "mcp", "belief-revision", "synthesis"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Testing", ] dependencies = [ "py-brs>=2.0.0", "pydantic>=2.0", "mcp>=1.0.0", ] [project.optional-dependencies] verify = [ "z3-solver>=4.12", ] rag = [ "chromadb>=0.4", "sentence-transformers>=2.2", ] graph = [ "scipy>=1.10", "networkx>=3.0", ] synthesis = [ "httpx>=0.24", ] graphdb = [ "kuzu>=0.11.0", ] embeddings-gpu = [ "sentence-transformers>=2.2", "torch>=2.0", # GPU-enabled PyTorch (user installs CUDA variant) ] embeddings-large = [ "sentence-transformers>=2.2", "InstructorEmbedding>=1.0", ] docs = [ "sphinx>=7.0", "furo>=2024.1", "myst-parser>=3.0", "sphinx-copybutton>=0.5", ] dev = [ "pytest>=7.0", "pytest-asyncio>=0.21", "ruff>=0.1.0", "mypy>=1.0", "pre-commit>=3.0", "scipy>=1.10", "networkx>=3.0", "httpx>=0.24", "kuzu>=0.11.0", ] [project.urls] Homepage = "https://github.com/egoughnour/curate-ipsum" Documentation = "https://curate-ipsum.readthedocs.io" Repository = "https://github.com/egoughnour/curate-ipsum" Changelog = "https://github.com/egoughnour/curate-ipsum/releases" [project.scripts] curate-ipsum = "curate_ipsum.server:main" [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["curate_ipsum"] [tool.ruff] line-length = 120 target-version = "py311" exclude = [ "quick-verification/", # prototype / scratch directory ] [tool.ruff.format] quote-style = "double" indent-style = "space" docstring-code-format = true [tool.ruff.lint] select = ["E", "F", "I", "N", "W", "UP", "B", "C4", "SIM"] ignore = [ "E501", # line length handled by formatter "UP007", # use X | Y for unions — pydantic model compatibility "UP037", # quoted annotations — needed for TYPE_CHECKING forward refs "SIM102", # collapsible-if — nested ifs often clearer for readability "SIM103", # return negated condition — explicit logic often clearer "SIM108", # ternary — readability preference "SIM105", # contextlib.suppress — readability preference, try/except clearer "SIM110", # use any() instead of for loop — explicit loop often clearer "B008", # function call in default arg — used in dataclass fields "N815", # mixed-case variable in class scope — API/Pydantic model field names ] [tool.ruff.lint.per-file-ignores] # MCP tool params are camelCase (protocol contract); lazy imports in annotations "curate_ipsum/server.py" = ["N803", "N815", "E402", "F821"] "curate_ipsum/tools.py" = ["N803", "N815"] # Mathematical code uses uppercase matrix/graph variables "curate_ipsum/graph/spectral.py" = ["N803", "N806"] "curate_ipsum/graph/planarity.py" = ["N803", "N806"] "curate_ipsum/graph/kameda.py" = ["N803", "N806"] "curate_ipsum/graph/hierarchy.py" = ["N803", "N806"] "curate_ipsum/graph/partitioner.py" = ["N803", "N806"] # Angr runner is standalone script, has its own style "curate_ipsum/verification/runners/run_angr.py" = ["N803", "N806", "E741", "E402"] # Abstract base classes with optional override methods "curate_ipsum/rag/vector_store.py" = ["B027"] "curate_ipsum/synthesis/llm_client.py" = ["B027"] "curate_ipsum/verification/backend.py" = ["B027"] # Mathematical code uses uppercase matrix/node variables "curate_ipsum/synthesis/ast_operators.py" = ["N806"] "tests/test_spectral.py" = ["N806"] # Test files use pytest.importorskip which requires imports after setup "tests/test_full_pipeline_end_to_end.py" = ["E402"] "tests/test_kuzu_graph_store.py" = ["E402"] "tests/test_m3_end_to_end.py" = ["E402"] "tests/test_m5_end_to_end.py" = ["E402"] "tests/test_m6_rag_end_to_end.py" = ["E402"] "tests/test_mcp_graph.py" = ["E402"] "tests/test_rollback.py" = ["E402"] [tool.ruff.lint.isort] known-first-party = ["curate_ipsum"] [tool.mypy] python_version = "3.11" strict = true warn_return_any = true warn_unused_ignores = true [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] markers = [ "integration: requires external services (Docker daemon + embedding model)", "docker: requires Docker daemon running", "embedding: requires sentence-transformers model available (all-MiniLM-L6-v2)", ]