Contributing
На этой странице
Спасибо за ваш вклад в Hermes Agent! Это руководство охватывает настройку среды разработки, понимание кодовой базы и процесс принятия вашего PR.
Приоритеты вклада¶
Мы ценим вклад в следующем порядке:
- Исправление ошибок — падения, некорректное поведение, потеря данных
- Кроссплатформенная совместимость — macOS, различные дистрибутивы Linux, WSL2
- Укрепление безопасности — инъекции в shell, инъекции в промпт, обход путей
- Производительность и надёжность — логика повторных попыток, обработка ошибок, плавная деградация
- Новые скиллы — общеполезные (см. Создание скиллов)
- Новые инструменты — редко требуется; большинство возможностей должны быть скиллами
- Документация — исправления, уточнения, новые примеры
Распространённые пути для вклада¶
- Создаёте пользовательский/локальный инструмент без изменения ядра Hermes? Начните с Создание плагина Hermes
- Создаёте новый встроенный инструмент ядра для самого Hermes? Начните с Добавление инструментов
- Создаёте новый скилл? Начните с Создание скиллов
- Создаёте нового провайдера инференса? Начните с Добавление провайдеров
Настройка разработки¶
Предварительные требования¶
| Требование | Примечания |
|---|---|
| Git | С поддержкой --recurse-submodules и установленным расширением git-lfs |
| Python 3.11+ | uv установит его, если отсутствует |
| uv | Быстрый менеджер пакетов Python (установка) |
| Node.js 20+ | Опционально — необходим для инструментов браузера и WhatsApp-моста (соответствует engines корневого package.json) |
Клонирование и установка¶
[code] git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git cd hermes-agent
# Создайте venv с Python 3.11
uv venv venv --python 3.11
export VIRTUAL_ENV="$(pwd)/venv"
# Установите со всеми расширениями (мессенджеры, cron, меню CLI, инструменты разработки)
uv pip install -e ".[all,dev]"
uv pip install -e "./tinker-atropos"
# Опционально: инструменты браузера
npm install
[/code]
Настройка для разработки¶
[code] mkdir -p ~/.hermes/{cron,sessions,logs,memories,skills} cp cli-config.yaml.example ~/.hermes/config.yaml touch ~/.hermes/.env
# Добавьте как минимум ключ LLM-провайдера:
echo 'OPENROUTER_API_KEY=sk-or-v1-your-key' >> ~/.hermes/.env
[/code]
Запуск¶
[code] # Символическая ссылка для глобального доступа mkdir -p ~/.local/bin ln -sf "$(pwd)/venv/bin/hermes" ~/.local/bin/hermes
# Проверка
hermes doctor
hermes chat -q "Hello"
[/code]
Запуск тестов¶
[code] pytest tests/ -v
[/code]
Стиль кода¶
- PEP 8 с практическими исключениями (нет строгого ограничения длины строк)
- Комментарии: Только когда нужно объяснить неочевидные намерения, компромиссы или особенности API
- Обработка ошибок: Перехватывайте конкретные исключения. Используйте
logger.warning()/logger.error()сexc_info=Trueдля неожиданных ошибок - Кроссплатформенность: Никогда не предполагайте Unix (см. ниже)
- Пути, безопасные для профилей: Никогда не жёстко кодируйте
~/.hermes— используйтеget_hermes_home()изhermes_constantsдля путей в коде иdisplay_hermes_home()для сообщений пользователю. См. AGENTS.md для полных правил.
Кроссплатформенная совместимость¶
Hermes официально поддерживает Linux, macOS и WSL2. Нативная Windows не поддерживается, но кодовая база включает некоторые защитные паттерны для предотвращения жёстких падений в пограничных случаях. Ключевые правила:
1\. termios и fcntl доступны только в Unix¶
Всегда перехватывайте как ImportError, так и NotImplementedError:
[code] try: from simple_term_menu import TerminalMenu menu = TerminalMenu(options) idx = menu.show() except (ImportError, NotImplementedError): # Запасной вариант: нумерованное меню for i, opt in enumerate(options): print(f" {i+1}. {opt}") idx = int(input("Выбор: ")) - 1
[/code]
2\. Кодировка файлов¶
Некоторые окружения могут сохранять .env файлы в кодировках, отличных от UTF-8:
[code] try: load_dotenv(env_path) except UnicodeDecodeError: load_dotenv(env_path, encoding="latin-1")
[/code]
3\. Управление процессами¶
os.setsid(), os.killpg() и обработка сигналов различаются на разных платформах:
[code] import platform if platform.system() != "Windows": kwargs["preexec_fn"] = os.setsid
[/code]
4\. Разделители путей¶
Используйте pathlib.Path вместо конкатенации строк с /.
Вопросы безопасности¶
Hermes имеет доступ к терминалу. Безопасность имеет значение.
Существующие защиты¶
| Уровень | Реализация |
|---|---|
| Передача sudo-пароля | Использует shlex.quote() для предотвращения инъекций в shell |
| Обнаружение опасных команд | Regex-паттерны в tools/approval.py с запросом одобрения пользователя |
| Защита от инъекций в cron-промпты | Сканер блокирует паттерны переопределения инструкций |
| Список запрета записи | Защищённые пути разрешаются через os.path.realpath() для предотвращения обхода через симлинки |
| Защита скиллов | Сканер безопасности для скиллов, установленных из хаба |
| Песочница выполнения кода | Дочерний процесс запускается с удалёнными ключами API |
| Укрепление контейнера | Docker: все возможности отозваны, нет повышения привилегий, ограничения PID |
Вклад кода, чувствительного к безопасности¶
- Всегда используйте
shlex.quote()при интерполяции пользовательского ввода в shell-команды - Разрешайте симлинки через
os.path.realpath()перед проверками контроля доступа - Не логируйте секреты
- Перехватывайте широкие исключения вокруг выполнения инструментов
- Тестируйте на всех платформах, если ваше изменение затрагивает файловые пути или процессы
Процесс Pull Request¶
Именование веток¶
[code] fix/описание # Исправление ошибок feat/описание # Новые функции docs/описание # Документация test/описание # Тесты refactor/описание # Реструктуризация кода
[/code]
Перед отправкой¶
- Запустите тесты:
pytest tests/ -v - Протестируйте вручную: Запустите
hermesи проверьте изменённый участок кода - Проверьте кроссплатформенное влияние: Учитывайте macOS и различные дистрибутивы Linux
- Держите PR сфокусированными: Одно логическое изменение на PR
Описание PR¶
Включите:
- Что изменилось и почему
- Как это тестировать
- На каких платформах вы тестировали
- Ссылки на связанные задачи (issues)
Сообщения коммитов¶
Мы используем Conventional Commits:
[code] <тип>(<область>): <описание>
[/code]
| Тип | Используется для |
|---|---|
fix |
Исправление ошибок |
feat |
Новые функции |
docs |
Документация |
test |
Тесты |
refactor |
Реструктуризация кода |
chore |
Сборка, CI, обновления зависимостей |
Области: cli, gateway, tools, skills, agent, install, whatsapp, security
Примеры:
[code] fix(cli): предотвращение падения в save_config_value когда модель является строкой feat(gateway): добавление изоляции многопользовательской сессии WhatsApp fix(security): предотвращение инъекции в shell при передаче sudo-пароля
[/code]
Сообщение о проблемах¶
- Используйте GitHub Issues
- Укажите: ОС, версию Python, версию Hermes (
hermes version), полный трейсбек ошибки - Укажите шаги для воспроизведения
- Проверьте существующие задачи перед созданием дубликата
- Для уязвимостей безопасности, пожалуйста, сообщайте приватно
Сообщество¶
- Discord: discord.gg/NousResearch
- GitHub Discussions: Для предложений по дизайну и обсуждений архитектуры
- Skills Hub: Загружайте специализированные скиллы и делитесь с сообществом
Лицензия¶
Внося вклад, вы соглашаетесь, что ваши изменения будут лицензированы в соответствии с MIT License.
- Приоритеты вклада
- Распространённые пути для вклада
- Настройка разработки
- Предварительные требования
- Клонирование и установка
- Настройка для разработки
- Запуск
- Запуск тестов
- Стиль кода
- Кроссплатформенная совместимость
- 1\.
termiosиfcntlдоступны только в Unix - 2\. Кодировка файлов
- 3\. Управление процессами
- 4\. Разделители путей
- Вопросы безопасности
- Существующие защиты
- Вклад кода, чувствительного к безопасности
- Процесс Pull Request
- Именование веток
- Перед отправкой
- Описание PR
- Сообщения коммитов
- Сообщение о проблемах
- Сообщество
- Лицензия