[build-system] requires = ["setuptools==82.0.1", "wheel==0.46.3"] build-backend = "setuptools.build_meta" [project] name = "sugarai" version = "3.10.2" description = "Persistent memory for AI coding agents. Local-first, cross-session context, global knowledge, and optional autonomous task execution." readme = "README.md" requires-python = ">=3.11" license = {text = "AGPL-3.0-or-later"} authors = [ {name = "Steven Leggett", email = "contact@roboticforce.io"} ] keywords = ["claude", "memory", "ai", "coding-agent", "mcp", "context"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Software Development :: Quality Assurance" ] dependencies = [ "click==8.3.1", "pyyaml==6.0.3", "aiosqlite==0.22.1", "sqlalchemy==2.0.48", "python-dotenv==1.2.2", "asyncio-throttle==1.0.2", "setuptools==82.0.1", "claude-agent-sdk==0.1.49", ] [project.optional-dependencies] github = ["PyGithub==2.9.0"] dev = [ "pytest==9.0.2", "pytest-asyncio==1.3.0", "pytest-cov==7.1.0", "black==25.12.0", "flake8==7.3.0", "flake8-docstrings==1.7.0", "isort==8.0.1", "mypy==1.20.0", "bandit==1.9.4", "safety==3.7.0", "pre-commit==4.5.1", "types-PyYAML==6.0.12.20260408", "types-requests==2.33.0.20260408", "types-setuptools==82.0.0.20260408" ] test = [ "pytest==9.0.2", "pytest-asyncio==1.3.0", "pytest-cov==7.1.0" ] mcp = [ "mcp==1.26.0", "starlette==0.52.1", "uvicorn==0.42.0", ] memory = [ "sentence-transformers==5.3.0", "sqlite-vec==0.1.9", ] opencode = [ "aiohttp==3.13.3", ] all = [ "sugarai[github,mcp,memory,opencode]", ] [project.scripts] sugar = "sugar.main:cli" [project.urls] Homepage = "https://github.com/roboticforce/sugar" Documentation = "https://sugar.roboticforce.io/" Repository = "https://github.com/roboticforce/sugar" "Bug Tracker" = "https://github.com/roboticforce/sugar/issues" [tool.setuptools.packages.find] where = ["."] include = ["sugar*"] exclude = ["tests*"] [tool.black] line-length = 88 target-version = ['py311'] include = '\.pyi?$' extend-exclude = ''' ( /( \.eggs | \.git | \.hg | \.mypy_cache | \.tox | \.venv | _build | buck-out | build | dist )/ ) ''' [tool.isort] profile = "black" line_length = 88 multi_line_output = 3 include_trailing_comma = true force_grid_wrap = 0 use_parentheses = true ensure_newline_before_comments = true [tool.bandit] skips = ["B101", "B601"] [tool.coverage.run] source = ["sugar"] omit = [ "*/tests/*", "*/test_*", "setup.py", "venv/*", ".venv/*" ] [tool.coverage.report] exclude_lines = [ "pragma: no cover", "def __repr__", "if self.debug:", "if settings.DEBUG", "raise AssertionError", "raise NotImplementedError", "if 0:", "if __name__ == .__main__.:", "class .*\\bProtocol\\):", "@(abc\\.)?abstractmethod" ] [tool.mypy] python_version = "3.11" warn_return_any = true warn_unused_configs = true disallow_untyped_defs = true ignore_missing_imports = true strict = true [tool.pytest.ini_options] asyncio_mode = "auto" testpaths = ["tests"] python_files = ["test_*.py", "*_test.py"] addopts = "-v --cov=sugar --cov-branch --cov-report=term-missing --cov-report=xml" markers = [ "unit: Unit tests (no I/O, no database)", "integration: Integration tests (real database, aiosqlite)", "slow: Slow running tests (throughput, load)", "benchmark: Throughput benchmarks (skip in CI, run with: pytest -m benchmark)" ] # MCP Registry identification # The mcpName must match the name in server.json for registry publishing # See: https://github.com/modelcontextprotocol/registry [tool.mcp] mcpName = "io.github.cdnsteve/sugar"