[project] name = "yt-mem-ai" dynamic = ["version"] description = "Local-first YouTube AI CLI: download, transcribe (captions -> whisper), embed in LanceDB, discover subscriptions, and summarize/highlight/Q&A." readme = "README.md" requires-python = ">=3.11" license = "MIT" authors = [{ name = "dasein" }] keywords = ["youtube", "transcription", "whisper", "lancedb", "summarization", "cli", "ai"] classifiers = [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Topic :: Multimedia :: Video", "Topic :: Text Processing :: Linguistic", ] dependencies = [ "typer>=0.12", "yt-dlp>=2024.8", "youtube-transcript-api>=1.0", "faster-whisper>=1.0", "python-dotenv>=1.0", "lancedb>=0.15", "sentence-transformers>=3.0", "openai>=1.40", "numpy>=1.26", ] [project.optional-dependencies] dev = ["pytest>=8.0", "ruff>=0.6", "httpx>=0.27", "mcp>=1.2,<2"] # mcp 2.0 dropped mcp.server.fastmcp, which mcp_server.py is built on — pin # until the server is ported to the 2.x API. mcp = ["mcp>=1.2,<2"] [project.urls] Homepage = "https://github.com/dasein108/yt-mem-ai" Repository = "https://github.com/dasein108/yt-mem-ai" Issues = "https://github.com/dasein108/yt-mem-ai/issues" [project.scripts] yt-ai = "yt_mem_ai.cli:app" yt-mem-ai = "yt_mem_ai.cli:app" yt-ai-mcp = "yt_mem_ai.mcp_server:main" [build-system] requires = ["hatchling", "hatch-vcs"] build-backend = "hatchling.build" [tool.hatch.version] source = "vcs" [tool.hatch.build.targets.wheel] packages = ["yt_mem_ai"] # Ship the scenario playbooks inside the wheel so the MCP server's prompts work # from an installed package (loaded by mcp_server._load_skill). force-include = { "skills/yt/SKILL.md" = "yt_mem_ai/_skills/yt.md", "skills/yt-agent/SKILL.md" = "yt_mem_ai/_skills/yt-agent.md" } [tool.hatch.build.targets.sdist] # The sdist must carry skills/ so the wheel's force-include resolves when the # wheel is built *from the sdist* (uv build / pip install from source). # force-include is deterministic where a plain `include` glob of skills/ was not. include = ["/yt_mem_ai", "/tests", "/README.md", "/LICENSE", "/pyproject.toml"] force-include = { "skills/yt/SKILL.md" = "skills/yt/SKILL.md", "skills/yt-agent/SKILL.md" = "skills/yt-agent/SKILL.md" } [tool.pytest.ini_options] testpaths = ["tests"] [tool.ruff] # generated book artifacts (figure scripts) are not part of the package extend-exclude = ["books/"]