umbot
    Preparing search index...

    CLI утилита umbot для создания голосовых навыков и чат-ботов

    CLI утилита для быстрого создания и настройки проектов на базе мультиплатформенного фреймворка umbot. Позволяет генерировать готовую структуру для голосовых навыков (Алиса, Сбер SmartApp, Маруся) или чат-ботов (Telegram, VK, Viber, MAX) одной командой.

    Также позволяет:

    • Создавать новые проекты по готовым шаблонам
    • Настраивать конфигурацию проекта
    • Генерировать базовую структуру приложения

    Установите фреймворк и создайте новый проект:

    npx umbot create my-bot
    cd my-bot
    npm install
    npm run build
    npm start

    npm install создаёт package-lock.json. Сохраните его в репозитории вместе с исходным кодом: он фиксирует проверенные версии зависимостей для CI и Docker-сборки.

    После этого приложение будет доступно локально. Для запуска используйте npm run build && npm start — это справедливо и для шаблонов default/quiz, и для проектов, сгенерированных через create from-flow. Для интерактивной отладки в консоли (без HTTP-сервера) создайте проект с режимом dev — тогда index.ts будет использовать BotTest и метод test().

    Команда Описание Параметры
    create Создание нового проекта <project-name> или <config-file.json>
    create from-flow Создание проекта из визуального редактора <flow.json> [--output ./path] [--usecloud] [--force]
    validate Проверить корректность flow.json <flow.json>
    stats Агрегировать метрики из лога --log <path>
    generateenv Сгенерировать файл .env в текущей папке [--force]
    doctor Проверить проект, токены и вебхуки [--env <path>] [--offline]
    webhook Зарегистрировать вебхук Telegram/MAX с секретом <telegram|max> <https-url>
    add docker Добавить Dockerfile и .dockerignore в текущую папку -
    add deploy Добавить .github/workflows/deploy.yml -
    add env Сгенерировать .env в текущей папке [--force]
    add platform Каркас адаптера своей платформы с тестом <Name> [--force]
    add db Каркас адаптера базы данных с тестом <Name> [--force]
    add middleware Каркас middleware с тестом <name> [--force]
    -v, version Узнать версию CLI -

    Команды запускаются в корне проекта (там, где папка src/) и создают модуль вместе с тестом:

    Команда Файлы
    npx umbot add platform <Name> src/platforms/<Name>Adapter.ts, <Name>Adapter.test.ts
    npx umbot add db <Name> src/db/<Name>DbAdapter.ts, <Name>DbAdapter.test.ts
    npx umbot add middleware <n> src/middleware/<name>.ts, <name>.test.ts (функция-фабрика)

    Имя пишется латиницей: discord, my-chat, Postgres. Суффикс Adapter можно не писать. У адаптера платформы platformName получается из имени (my-chat → my_chat).

    Каркас сразу компилируется и проходит свои тесты. Места, которые нужно заполнить под свою платформу или базу, отмечены комментарием TODO:

    • платформа — чат-платформа с вебхуком: распознаёт запрос, передаёт текст в команды и отправляет ответ через Request (запрос ограничен по времени). Неизвестные события получают ответ без вызова команд: на ошибку платформа повторила бы доставку. Заполнить нужно формат запроса, адрес API, авторизацию и формат кнопок;
    • база данных — рабочий адаптер, который хранит данные в памяти процесса. Методы заменяются на вызовы драйвера своей базы. Тесты проверяют ответы, которых ждёт фреймворк, в том числе раздельные записи одного userId на разных платформах (uniqueKeys);
    • middleware — фабрика с настройками на примере блокировки пользователей.

    Тесты написаны на встроенном node:test и не требуют дополнительных зависимостей. Запуск — командой, которую CLI печатает после генерации:

    npx umbot add platform discord
    npm run build && node --test dist/platforms/DiscordAdapter.test.js

    CLI не меняет src/index.ts: строки подключения (bot.use(...)) он печатает в консоль. Существующие файлы без --force не перезаписываются. Как устроен каждый метод, описано в руководствах по адаптеру платформы, адаптеру БД и middleware.

    npx umbot webhook <telegram|max> <https-url> включает проверку подписи вебхука одной командой. Запускайте её в папке проекта: токен берётся из .env (TELEGRAM_TOKEN / MAX_TOKEN) или окружения. Команда генерирует секрет, регистрирует вебхук сразу с ним (setWebhook у Telegram, POST /subscriptions у MAX) и сохраняет секрет в .env как TELEGRAM_WEBHOOK_SECRET / MAX_WEBHOOK_SECRET. Фреймворк читает эти переменные сам и начинает отклонять запросы без верного секрета. Секрет пишется в .env только после успешной регистрации, а если он там уже есть — используется существующий. Для VK секретный ключ задаётся в настройках Callback API сообщества (VK_SECRET_KEY в .env).

    npx umbot webhook telegram https://bot.example.com/webhook
    

    npx umbot doctor в папке проекта проверяет, готов ли бот к запуску, и печатает отчёт:

    • версия Node.js подходит umbot, пакет umbot установлен;
    • .env есть и указан в .gitignore (иначе токены попадут в git — это ошибка);
    • токены платформ из .env и окружения рабочие: запрос к API (Telegram getMe, MAX GET /me, VK groups.getById, Viber get_account_info, Алиса — квота загрузки файлов). Для SmartApp и Маруси проверяется только наличие токена;
    • вебхуки: адрес, число недоставленных обновлений и последняя ошибка доставки Telegram, подписки MAX, вебхук Viber; предупреждение, если вебхук зарегистрирован без секрета. Без вебхука — подсказка про bot.startPolling().

    Токены в отчёт не попадают. --offline отключает запросы к API, --env <path> задаёт другой файл .env. При ошибках команда завершается с кодом 1 — её можно запускать в CI перед деплоем.

    npx umbot doctor
    
    Флаг Описание
    --minimal Создаёт минимальный рабочий проект без класса-контроллера: вся логика описывается прямо в index.ts через addCommand (конфиги проекта генерируются как обычно). Подходит для быстрого прототипа. Работает только с типом default.
    --prod Создаёт production-готовый проект: Dockerfile, .dockerignore и .github/workflows/deploy.yml. Файл .env создаётся в любом проекте, см. ниже.
    --usecloud Генерирует Yandex Cloud Functions-приложение: добавляет serverless.yml, отключает локальный HTTP-listener. Применяется только с create from-flow.
    --force Разрешает перезапись непустой целевой директории. Иначе CLI останавливается с ошибкой, чтобы не стереть ваши файлы.

    💡 Важно: флаг --minimal не применяется к типу quiz, так как викторина требует сложной логики и хранения состояния.

    Файл .env. Проект, созданный create, всегда читает .env (env: './.env' в src/config/*Config.ts), и CLI создаёт его с пустыми переменными токенов, секретов вебхука и MongoDB — заполните те, что нужны. Пустые значения фреймворк пропускает. Существующий .env не перезаписывается. Если файла нет (Docker, serverless), переменные берутся из окружения процесса. Команды generateenv и add env пишут тот же шаблон в текущую папку.

    Для быстрого создания приложения выполните следующую команду:

    npx umbot create my-bot-project
    

    После выполнения команды приложение успешно создастся, и останется только выполнить команду:

    npm i
    npm run build
    npm start

    Для быстрого создания приложения с дополнительными настройками выполните следующие шаги.

    Создайте файл config.json

    {
    "name": "quiz-bot",
    "type": "quiz",
    "mode": "dev",
    "path": "./bots/quiz",
    "config": {
    "json": "./data",
    "error_log": "./logs",
    "isLocalStorage": true,
    "tokens": {
    "alisa": {
    "token": "..."
    },
    "telegram": {
    "token": "..."
    }
    }
    },
    "isEnv": true
    }

    ⚠️ Безопасность: поля вроде tokens.*.token, db.host, db.pass и т.п. в вашем JSON-конфиге — это placeholder-значения. Не храните реальные токены в *.json (он попадёт в git), используйте .env или переменные окружения. Сгенерированный .env автоматически попадает в .gitignore, но если вы делаете его вручную — убедитесь, что .gitignore его покрывает.

    Затем выполните:

    npx umbot create config.json
    

    Утилита создаст проект в папке ./bots/quiz со всеми указанными настройками.

    npm i
    npm run build
    npm start

    При создании проекта через JSON можно передать следующие параметры:

    interface ProjectConfig {
    // Название проекта (обязательное поле)
    name: string;

    // Тип проекта: "default" или "quiz"
    type?: 'default' | 'quiz';

    // Режим работы: "prod", "dev", "dev-online", "build"
    mode?: 'prod' | 'dev' | 'dev-online' | 'build';

    // Конфигурация приложения (IAppConfig из umbot)
    // В CLI это объект, который будет слит с дефолтным конфигом шаблона.
    config?: Record<string, unknown>;

    // Параметры платформы/интенты (IAppParam из umbot)
    // В CLI это объект, который будет слит с дефолтными params шаблона.
    params?: Record<string, unknown>;

    // Путь для создания проекта
    path?: string;

    // Имя хоста на котором будет запущено приложение. По умолчанию 0.0.0.0
    hostname?: string;
    // Порт на котором будет запущено приложение. По умолчанию 3000
    port?: number;
    // Перенести токены и параметры БД из этого JSON в .env проекта (без флага они удаляются из конфигурации)
    isEnv?: boolean;
    }
    {
    "name": "my-quiz-bot",
    "type": "quiz",
    "mode": "dev",
    "path": "./bots/quiz",
    "config": {
    "json": "./data",
    "error_log": "./logs",
    "isLocalStorage": true,
    "db": {
    "host": "",
    "user": "",
    "pass": "",
    "database": ""
    },
    "tokens": {
    "alisa": {
    "token": "token"
    }
    }
    },
    "isEnv": true
    }

    ⚠️ В примере выше токены и параметры БД показаны как placeholder-строки. В реальном проекте рекомендуется оставлять их пустыми в конфиге и заполнять в .env, который CLI создаёт в каждом проекте (он уже в .gitignore). С { "isEnv": true } значения из JSON переносятся в .env сами.

    Тип Описание Особенности
    default Базовый шаблон Минимальная структура проекта
    quiz Шаблон викторины Готовая структура для создания викторин
    Режим Что генерируется в src/index.ts
    prod Bot в режиме strict_prod и bot.start() — сервер для вебхуков (по умолчанию, если mode нет)
    dev BotTest и bot.test() — диалог в консоли, без сервера
    dev-online Bot в режиме dev и bot.start() — сервер с подробными логами
    build Запуск через run(config, mode) из umbot/build; режим переключается одной строкой в файле

    Команда create from-flow позволяет создать проект umbot из JSON-файла, экспортированного из Umbot Flow — визуального редактора для фреймворка umbot.

    Цепочка: Визуальный редактор → JSON-конфигурация → npx umbot create from-flow → TypeScript-проект

    Подробное описание JSON-формата: src/docs/json-format.md

    npx umbot create from-flow flow.json
    npx umbot create from-flow flow.json --output ./my-bot
    Параметр Описание
    flow.json Путь к JSON-файлу, экспортированному из редактора
    --output ./path Путь для выходного проекта (по умолчанию: имя файла flow.json без расширения)
    my-bot/
    ├── src/
    │ ├── index.ts # Точка входа с регистрацией команд
    │ └── utils.ts # Вспомогательные функции setText/setTTS
    ├── package.json
    ├── tsconfig.json
    ├── README.md # Как установить, вписать токены, запустить и подключить платформы
    ├── .env # Переменные токенов выбранных платформ (не коммитится)
    └── .gitignore

    Файл .env создаётся всегда: переменные токенов выбранных платформ пустые, если токенов нет во flow.json. При повторной генерации (--force) заполненные значения сохраняются, недостающие переменные дописываются, а пустые заполняются токенами из flow.json. Сгенерированный бот читает .env из папки запуска.

    Строковые слоты генерируются в нижнем регистре: реплика пользователя приходит в бот уже в нижнем, и слот «Погода» из редактора иначе не сработал бы. Слоты-регулярки (isPattern) остаются как есть — пишите их под текст в нижнем регистре. Подробнее — в описании JSON-формата.

    Приветствие (нода welcome или текст и кнопки welcome из настроек, если ноды нет) срабатывает:

    • на /start (Telegram, в том числе с deep-link параметром) и на слоты «привет»/«здравст» (или собственные слоты ноды);
    • в начале диалога без команды — новая сессия Алисы/Маруси, «Начать» в MAX/Viber (messageId === 0): fallback-команда в этом случае вызывает приветствие.

    Шаг, ожидавший ответ в прошлой сессии, начало диалога пропускает (return false). Без приветствия старт уходит в fallback. Режим бота (mode во flow.json) генерируется вызовом bot.setAppMode(...) сразу после создания Bot — до регистрации команд. Без поля mode (или с неизвестным значением) генерируется strict_prod.

    • Простой (только команды): вся логика генерируется в index.ts
    • Сложный (шаги, условия, переменные): команды, шаги и условия также генерируются функциями в index.ts; отдельный файл контроллера не создаётся ни в одном режиме
    1. Откройте визуальный редактор: flow.maxim-m.ru
    2. Создайте флоу с командами, шагами и условиями
    3. Экспортируйте JSON-конфигурацию → скачайте flow.json
    4. Выполните: npx umbot create from-flow flow.json --output ./my-bot
    5. Зайдите в проект, впишите токены платформ в .env и запустите (подробности — в сгенерированном README.md):
    cd my-bot
    npm install
    npm run build
    npm start
    1. Именование проектов:

      • Используйте понятные имена
      • Избегайте пробелов и специальных символов
      • Учитывайте: CLI заменяет все не-буквенно-цифровые символы имени на _ (npx umbot create my-bot создаст директорию my_bot и такое же имя в package.json), поэтому используйте snake_case или имя одним словом
    2. Конфигурация:

      • Храните конфигурацию в отдельных файлах
      • Не включайте чувствительные данные в репозиторий
      • Используйте разные конфигурации для разных окружений
    3. Структура проекта:

      • Следуйте рекомендуемой структуре
      • Размещайте файлы в соответствующих директориях
      • Документируйте нестандартные решения