[project] name = "yet-another-agentic-chat" version = "0.6.5" description = "Messaging between concurrent AI coding sessions, across clients, over MCP. Zero infrastructure. (YAAC: Yet Another Agentic Chat.)" readme = "README.md" license = "MIT" # PyPI ranks search on the summary and these. The project's name is a joke and carries no searchable term, so # every word someone might actually type has to live here instead. keywords = [ "mcp", "model-context-protocol", "agent-communication", "multi-agent", "cross-session", "claude-code", "codex", "chat", "messaging", "zeromq", ] authors = [ { name = "Alex Myodov", email = "amyodov@gmail.com" } ] requires-python = ">=3.14" classifiers = [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "Operating System :: OS Independent", "Programming Language :: Python :: 3.14", "Topic :: Communications :: Chat", ] dependencies = [ "pyzmq~=27.0", "mcp~=2.0", ] [project.scripts] yaac = "yaac.frontend:main" # Same entry point under the distribution name, so bare `uvx yet-another-agentic-chat` finds an executable to run. yet-another-agentic-chat = "yaac.frontend:main" # What a Codex hook runs: that client's hooks cannot call an MCP tool, so a program asks the notice socket instead # and prints the hook contract. Stdlib only, because its startup cost is paid on every hook the session fires. yaac-hook = "yaac.hook:main" # The terminal client, deliberately not a flag on the server: one writes nothing to stdout because stdout is the # transport, the other owns the screen. Its textual dependency is the `chat` extra, so an MCP-only install stays # to pyzmq and mcp -- `uvx --from "yet-another-agentic-chat[chat]" yaac-chat`. yaac-chat = "yaac.chat:main" [project.urls] Homepage = "https://github.com/amyodov/yet-another-agentic-chat" Repository = "https://github.com/amyodov/yet-another-agentic-chat" Issues = "https://github.com/amyodov/yet-another-agentic-chat/issues" [project.optional-dependencies] chat = [ "textual>=1.0", ] [dependency-groups] dev = [ "pytest>=8", # >=1.4 for the pytest_asyncio_loop_factories hook, which conftest.py uses to pick loop flavors on Windows. "pytest-asyncio>=1.4", "ruff>=0.8", ] [build-system] requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/yaac"] [tool.ruff] line-length = 120 src = ["src", "tests"] [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM"] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto"