[project] name = "piia-engram" version = "4.20.0" description = "Local-first personal AI identity and memory for MCP-compatible coding tools — lessons, decisions, playbooks, and project context you can see, edit, and override." readme = "README.md" license = "AGPL-3.0-or-later" requires-python = ">=3.10" authors = [ {name = "Engram Contributors"}, ] keywords = ["ai", "identity", "mcp", "memory", "persistent-memory", "personal-knowledge", "llm", "context", "claude-code", "cursor", "codex", "mcp-server", "ai-agent", "local-first", "cross-tool", "cross-session", "developer-preferences", "user-profile", "knowledge-management", "vibe-coding"] classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Scientific/Engineering :: Artificial Intelligence", ] dependencies = [ # mcp 2.0.0 removed mcp.server.fastmcp — piia-engram's server entry point # breaks on import. Stay on 1.x until an explicit 2.x migration ships. "mcp>=1.0,<2", "portalocker>=2.0", ] [project.urls] Homepage = "https://github.com/Patdolitse/piia-engram" Repository = "https://github.com/Patdolitse/piia-engram" "Bug Tracker" = "https://github.com/Patdolitse/piia-engram/issues" [project.scripts] piia-engram = "piia_engram.setup_wizard:main" # MCP server entry point — lets any client launch via `piia-engram-mcp` or # `uvx --from piia-engram piia-engram-mcp` (zero pre-install), instead of # `python -m ...`. piia-engram-mcp = "piia_engram.mcp_server:main" # Backward-compat alias — `engram` will be removed in a future major release. engram = "piia_engram.setup_wizard:main" [project.optional-dependencies] dev = [ "pytest>=7.0", "tomli>=2.0; python_version < \"3.11\"", ] remote = [ "uvicorn>=0.20", ] # Local browser Dock GUI (`engram serve --ui`): a loopback-only ASGI app served by # Starlette + uvicorn. Static assets (dock_ui/static) ship via package-data below. ui = [ "starlette>=0.40", "uvicorn>=0.20", ] secure = [ "cryptography>=41.0", ] # v4.0 hybrid search (optional): semantic vector layer on top of the # zero-dep FTS5 index. ~230-280MB once the embedding model is fetched. # Absent install => search_index falls back to FTS5 + keyword only. vector = [ "sqlite-vec>=0.1.0", "fastembed>=0.3.0", ] # Self-contained web reader (Round 4): `read_web_content` extracts article text # without the external sidecar. trafilatura pulls a parsing stack (lxml, etc.); # absent install => read_web_content uses the sidecar or returns an install hint. reader = [ "httpx>=0.27,<1", "trafilatura>=2.0,<3", ] all = [ "starlette>=0.40", "uvicorn>=0.20", "cryptography>=41.0", "sqlite-vec>=0.1.0", "fastembed>=0.3.0", "httpx>=0.27,<1", "trafilatura>=2.0,<3", ] [build-system] requires = ["setuptools>=68.0"] build-backend = "setuptools.build_meta" [tool.setuptools.packages.find] where = ["src"] # Ship the Dock GUI's static assets (HTML/CSS/JS) inside the wheel + sdist. They live # under the dock_ui package (not a Python package themselves), so StaticFiles can find # them next to app.py in an installed package, exactly like in a source checkout. [tool.setuptools.package-data] "piia_engram.dock_ui" = ["static/*.html", "static/*.css", "static/*.js"] [tool.pytest.ini_options] testpaths = ["tests"] pythonpath = ["src"]