Metadata-Version: 2.4
Name: anygarden
Version: 0.9.0
Summary: Multi-agent chat platform — unified CLI (server / machine / agent)
Author: Changyong Um
License-Expression: Apache-2.0
License-File: LICENSE
Requires-Python: >=3.11
Requires-Dist: click>=8.1
Provides-Extra: agent
Requires-Dist: anygarden-agent>=0.8; extra == 'agent'
Provides-Extra: dev
Requires-Dist: aiosqlite>=0.19; extra == 'dev'
Requires-Dist: alembic>=1.13; extra == 'dev'
Requires-Dist: anygarden-machine>=0.8; extra == 'dev'
Requires-Dist: argon2-cffi>=23.1; extra == 'dev'
Requires-Dist: croniter>=2.0; extra == 'dev'
Requires-Dist: cryptography>=42; extra == 'dev'
Requires-Dist: fastapi<0.120,>=0.110; extra == 'dev'
Requires-Dist: httpx>=0.27; extra == 'dev'
Requires-Dist: mypy>=1.9; extra == 'dev'
Requires-Dist: prometheus-client>=0.20; extra == 'dev'
Requires-Dist: pydantic-settings>=2.2; extra == 'dev'
Requires-Dist: pydantic<3.0,>=2.6; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: python-jose[cryptography]>=3.3; extra == 'dev'
Requires-Dist: python-multipart>=0.0.9; extra == 'dev'
Requires-Dist: pyyaml>=6.0; extra == 'dev'
Requires-Dist: ruff>=0.3; extra == 'dev'
Requires-Dist: sqlalchemy[asyncio]<2.1,>=2.0; extra == 'dev'
Requires-Dist: structlog>=24.1; extra == 'dev'
Requires-Dist: tomli-w>=1.0; extra == 'dev'
Requires-Dist: uvicorn[standard]>=0.29; extra == 'dev'
Provides-Extra: machine
Requires-Dist: anygarden-machine>=0.8; extra == 'machine'
Provides-Extra: server
Requires-Dist: aiosqlite>=0.19; extra == 'server'
Requires-Dist: alembic>=1.13; extra == 'server'
Requires-Dist: anygarden-machine>=0.8; extra == 'server'
Requires-Dist: argon2-cffi>=23.1; extra == 'server'
Requires-Dist: croniter>=2.0; extra == 'server'
Requires-Dist: cryptography>=42; extra == 'server'
Requires-Dist: fastapi<0.120,>=0.110; extra == 'server'
Requires-Dist: prometheus-client>=0.20; extra == 'server'
Requires-Dist: pydantic-settings>=2.2; extra == 'server'
Requires-Dist: pydantic<3.0,>=2.6; extra == 'server'
Requires-Dist: python-jose[cryptography]>=3.3; extra == 'server'
Requires-Dist: python-multipart>=0.0.9; extra == 'server'
Requires-Dist: pyyaml>=6.0; extra == 'server'
Requires-Dist: sqlalchemy[asyncio]<2.1,>=2.0; extra == 'server'
Requires-Dist: structlog>=24.1; extra == 'server'
Requires-Dist: tomli-w>=1.0; extra == 'server'
Requires-Dist: uvicorn[standard]>=0.29; extra == 'server'
Description-Content-Type: text/markdown

# anygarden (server)

Multi-agent chat server built with FastAPI, SQLite, and WebSocket. Published
as the `anygarden` distribution; run it through the unified `anygarden` CLI.

## Quick Start

```bash
# Install the server stack (the bare `anygarden` core is just the CLI
# dispatcher; the FastAPI/SQLAlchemy stack lives in the [server] extra).
pip install "anygarden[server]"

anygarden server init   # create ~/.anygarden/ and generate config
anygarden server        # start the server

# Run without installing:
uvx --from "anygarden[server]" anygarden server
```

> The legacy `anygarden-server` command still works for one release but is
> deprecated — it prints a warning and forwards to `anygarden server`.

Other components share the same dispatcher:

```bash
pip install "anygarden[machine]" && anygarden machine run
pip install "anygarden[agent]"   && anygarden agent --engine claude-code --room demo
```

## Development

```bash
pip install -e ".[dev]"
pytest
```

## Environment

All `ANYGARDEN_*` variables are optional — the cluster auto-persists
runtime secrets in `~/.anygarden/` on first boot. See `.env.example`
at the repo root for the full list. Highlights:

- `ANYGARDEN_JWT_SECRET` — session token signing key. Auto-generated
  at `~/.anygarden/jwt_secret` if unset.
- `ANYGARDEN_MCP_SECRETS_KEY` — Fernet key for encrypting MCP
  credentials (GitHub PATs, Linear keys, etc.) at rest in the DB.
  Auto-generated at `~/.anygarden/mcp_secrets_key` if unset so
  attached MCP instances survive restarts. Generate your own with:
  ```bash
  python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
  ```
  **Losing this key invalidates all stored MCP credentials** — they
  must be re-entered via the admin UI.
- `ANYGARDEN_DEV=1` enables dev-mode conveniences (ephemeral MCP key
  fallback when persistence fails). Production must leave this
  unset so misconfigurations fail loudly at boot.
