[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "tether-memory" version = "0.6.1" description = "A shared memory layer for personal agents, across devices: an MCP server over local SQLite with opt-in libSQL/Turso sync." readme = "README.md" license = { file = "LICENSE" } requires-python = ">=3.10" authors = [{ name = "sidyellur", email = "20009719+sidyellur@users.noreply.github.com" }] keywords = ["mcp", "memory", "agent", "sqlite", "libsql", "turso", "claude", "claude-code"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: Microsoft :: Windows", "Programming Language :: Python :: 3", "Topic :: Database", ] dependencies = ["mcp>=1.0"] [project.optional-dependencies] # Mainline libsql supersedes libsql-experimental, which is frozen at 0.0.55 # (#63). sync.py imports either one - an existing libsql-experimental install # keeps working - but new installs get the maintained client. sync = ["libsql>=0.1"] semantic = ["model2vec>=0.3", "numpy>=1.21"] dev = ["pytest>=7", "build", "numpy>=1.21"] [project.scripts] tether-memory = "tether.server:main" tether = "tether.cli:main" [tool.pytest.ini_options] testpaths = ["tests"] [project.urls] Homepage = "https://github.com/sidyellur/tether" Issues = "https://github.com/sidyellur/tether/issues" [tool.hatch.build.targets.wheel] packages = ["src/tether"] [tool.ruff] line-length = 100 src = ["src"] [tool.ruff.lint] # Deliberately NOT a maximal rule set. tether's degrade-never contract means # broad `except Exception: return ` is the intended idiom in the # store/graph/sync layers, so BLE001/S110 are left unselected rather than # suppressed line-by-line 40+ times. What's selected here is the subset that # catches real defects: undefined names, unused code, import hygiene, # mutable-default and implicit-Optional footguns, and py3.10+ modernization. select = ["E", "F", "W", "I", "UP", "RUF"] ignore = [ ] [tool.ruff.lint.per-file-ignores] # Tests bind ids/handles for readability at the point of setup even when a # given assertion doesn't consume them (F841/RUF059) - that's documentation, # not dead code. The rest here are style-only rules whose "violations" are # how compact table-driven test setup is meant to read; correctness rules # (E4/E7/E9/F) stay fully enabled in tests. "tests/*" = [ "F841", # assigned-but-unused: setup bindings that name what they are "RUF059", # same, for unpacked tuples "E501", # long lines: mostly inline expectation comments "E701", # `if x: return` one-liners in tiny fakes "E702", # `a = 1; b = 2` paired setup "E731", # lambda stubs standing in for injected callables "RUF012", # ClassVar annotations on throwaway fake classes "RUF015", # hits[0]["id"] reads better than next(...) in assertions "RUF005", # explicit list concat is clearer than unpacking in fixtures ]