# agent-news Telegram-бот на Dart: по команде `/news` (или `/news <тема>`) запускает Claude Code для ресёрча и присылает выжимку в чат. Тестовый/учебный проект — пока гоняем локально в Docker, без деплоя в кластер. ## Как это работает Один контейнер, три процесса: 1. `agent-news-bot` (Dart, long polling) — слушает `/news`, спавнит `claude` как сабпроцесс. 2. `claude` (Claude Code CLI) — делает ресёрч, в конце вызывает MCP-тул `send_to_telegram`. 3. `agent-news-mcp` (Dart, stdio MCP-сервер) — спавнится самим `claude`, шлёт готовый текст в Telegram Bot API. ## Запуск локально ```bash cp .env.example .env # заполнить TELEGRAM_BOT_TOKEN и ALLOWED_CHAT_IDS (через запятую) docker compose up -d --build ``` `~/.claude` (авторизация Claude Code) хранится в именованном volume `claude-home` — переживает пересборку и рестарт контейнера. ### Первичная авторизация Claude Code Claude Code CLI использует OAuth-логин через Claude.ai (подписка, не API-ключ). Один раз после первого запуска нужно зайти в контейнер и залогиниться: ```bash docker compose exec agent-news claude ``` CLI напечатает ссылку — открой её в браузере, авторизуйся. Токен сохранится в `~/.claude` на volume, так что после `docker compose restart` логин не слетит. ### Проверка Напиши боту `/news` (или `/news <тема>`) из чата с id из `ALLOWED_CHAT_IDS` — бот ответит "ищу…", а через 1-3 минуты Claude сам пришлёт выжимку через `send_to_telegram`. ```bash docker compose logs -f agent-news ``` ## Локальная разработка (без Docker) ```bash cd bot && dart pub get && dart analyze cd ../mcp_server && dart pub get && dart analyze ``` ## Переменные окружения | Переменная | Обязательна | Назначение | |---|---|---| | `TELEGRAM_BOT_TOKEN` | да | токен бота, используется и ботом, и MCP-сервером | | `ALLOWED_CHAT_IDS` | да | список chat_id через запятую — кому отвечает бот | | `NEWS_PROMPT` | нет | промпт по умолчанию для `/news` без темы | | `CLAUDE_TIMEOUT_SECONDS` | нет | таймаут на ресёрч (по умолчанию 360) | | `MCP_CONFIG_PATH` | нет | путь к `mcp.json` (по умолчанию `/home/agent/claude-config/mcp.json`) |