3.0 KiB
3.0 KiB
AGENTS.md — agent-news
Telegram-бот на Dart: по команде /news [тема] спавнит Claude Code CLI как сабпроцесс для
ресёрча, финальную выжимку (и промежуточные статусы) Claude сам шлёт в Telegram через
собственный MCP-сервер. Полное описание архитектуры — README.md.
Структура (монорепо, 3 части)
bot/— Dart, long-polling Telegram-бот. Точка входаbot/bin/agent_news_bot.dart. Спавнитclaudeкак сабпроцесс (bot/lib/claude_runner.dart).mcp_server/— Dart, stdio MCP-сервер. Спавнится самимclaude(не ботом напрямую), экспортирует тулsend_to_telegram. Точка входаmcp_server/bin/agent_news_mcp.dart.runner/—Dockerfile(3-стадийная сборка: bot-build → mcp-build → runtime сclaude-codeCLI) +claude-config/mcp.json(конфиг MCP для Claude Code внутри контейнера).
Все тексты, которые бот показывает пользователю или подставляет в промпт Claude — в одном
месте: bot/lib/lexicon.dart. Новый текст/сообщение — туда, не разбрасывать по коду.
Сборка и проверка
cd bot && dart pub get && dart analyze
cd ../mcp_server && dart pub get && dart analyze
Тестов (dart test) нет — только dart analyze. Полная сборка — через Docker
(docker compose up -d --build), см. README.md §Запуск локально.
Конвенции
- SDK
^3.11.0в обоихpubspec.yaml— держать одинаковым междуbot/иmcp_server/. - Комментарии в коде — по-русски, только там, где неочевидная причина (не «что», а «почему»),
см. стиль в
runner/Dockerfile.
Грабли
~/.claude.jsonживёт вне~/.claude/. Авторизация Claude Code CLI пишет не только в~/.claude/, но и в отдельный файл~/.claude.json— поэтому вdocker-compose.ymlпримонтирован volume на весь/home/agent, не только~/.claude/. Если когда-нибудь захочется сузить volume до~/.claude/— логин будет слетать при каждом рестарте.claude-config/скопирован вне/home/agent(в/app/claude-config) по той же причине — положи его внутрь home, и он потеряется под пустым volume при первом старте контейнера.- Ресёрч занимает несколько минут (
CLAUDE_TIMEOUT_SECONDS, по умолчанию 600) — это нормально, не таймаут/баг.