Вклад в проект
Спасибо, что решили внести вклад в агента Гермеса! Это руководство приводит к уменьшению окружения разработчика, понимания кодовой базы и процесса слияния вашего PR.
Приоритеты вклада
Мы ценим вклад в следующем порядке:
- Исправление ошибок — краши, некорректное поведение, потеря данных.
- Кросс-платформенная совместимость — macOS, различные дистрибутивы Linux, WSL2.
- Безопасность крепления — внедрение команд, внедрение промптов, обход пути.
- Производительность и надежность — логика повторных операций, обработка ошибок, плавная деградация.
- Новые навыки — широко полезны (см. Создание навыков)
- Новые инструменты — требуются редко; большинство возможностей должны быть навыками
- Документация — исправления, уточнения, новые образцы.
Типичные способы внесения вклада
- Создаете пользовательский/локальный инструмент без изменений ядра Hermes? начать с Создание плагина Hermes
- Создаёте новый встроенный инструмент-ядро для самого Гермеса? Начало с Добавление инструментов
- Создаёте новые навыки? продолжаем с Создание навыков
- Создаёте новый провайдер инференса? начать с Добавление провайдеров
Настройка окружения разработчика
Предварительные требования
| Требование | Примечания |
|---|---|
| Гит | С поддержкой --recurse-submodules и установленными расширениями git-lfs |
| Питон 3.11+ | уф установить его, если отсутствует |
| УФ | Быстрый менеджер пакета Python (установка) |
| Node.js 20+ | Опционально — требуется для инструментов браузера и моста WhatsApp (соответствует «engine» в корневом «package.json») |
Клонирование и установка
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]"
# tinker-atropos является git submodule — сначала требуется `git submodule update --init`
# если вы клонировали без `--recurse-submodules`
uv pip install -e "./tinker-atropos"
# Опционально: инструменты браузера
npm install
Настройка для разработки
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
Запуск
# Символическая ссылка для глобального доступа
mkdir -p ~/.local/bin
ln -sf "$(pwd)/venv/bin/hermes" ~/.local/bin/hermes
# Проверка
hermes doctor
hermes chat -q "Hello"
Запуск тестов
pytest tests/ -v
Стиль кода
- 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 (ранняя бета-версия — установка через PowerShell). Нативный Windows использует Git Bash (из Git for Windows) для управления контролем. Некоторые функции требуют примитивов ядра POSIX и ограничены: встроенная панель терминала PTY в приборной панели (вкладка /chat) доступна только в WSL2. Путь нативного Windows нового и быстрого развития — если вы активно разрабатываете под Windows, ожидайте появления недоделанных мест и исправляйте их.
При внесении кода помните следующие правила:
- Не добавляйте незащищённые ссылки на
signal.SIGKILL. Он не определен в Windows. Либо воспользуйтесьgateway.status.terminate_pid(pid, Force=True)(централизованный примитив, работающийtaskkill /T /Fв Windows и SIGKILL в POSIX), либо воспользуйтесь запасной вариантgetattr(signal, "SIGKILL", signal.SIGTERM). - Перехватывайте
OSErrorвместе сProcessLookupErrorпри проверкеos.kill(pid, 0). Windows выдаетOSError(WinError 87, "параметр неверен") для уже завершённого PID вместоProcessLookupError. - Не принуждайте терминал к семантике POSIX.
os.setsid,os.killpg,os.getpgid,os.forkвызывает ошибку в Windows — закройте их условияif sys.platform!= "win32":илиif os.name!= "nt":. - Открывайте файлы с явным
encoding="utf-8". По умолчанию в Python в Windows используется системная локаль (часто cp1252), что приводит к кракозябрам или сбоям при работе с нелатинским текстом. - Используйте
pathlib.Path/os.path.join— никогда не конкатенируйте вручную с/. Это менее важно для строк, которые получают ОС, и более важно для строк, которые мы конструируем для передачи в подпроцессы.
Ключевые шаблоны:
1. termios и fcntl доступны только в Unix
Всегда перехватывайте и ImportError, и NotImplementedError:
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
2. Кодировка файлов
Некоторые окружения могут сохранять файлы .env в кодировках, отличных от UTF-8:
try:
load_dotenv(env_path)
except UnicodeDecodeError:
load_dotenv(env_path, encoding="latin-1")
3. Управление процессами
os.setsid(), os.killpg() и обработка сигналов различаются на разных платформах:
import platform
if platform.system()!= "Windows":
kwargs["preexec_fn"] = os.setsid
4. Разделители путей
Используйте pathlib.Path вместо строк конкатенации с /.
Вопросы безопасности
Гермес имеет доступ к терминалу. Безопасность важна.
Существующие механизмы защиты
| Уровень | Реализация |
|---|---|
| Передача пароля sudo | Использует shlex.quote() для предотвращения повреждения команда |
| Обнаружение игрока | Регулярные выражения в tools/approval.py с запросом подтверждения пользователя |
| Защита от промптов в cron | Сканер блокирует шаблоны инструкции по переопределению |
| Список запрета записи | Защищённые пути разрешаются через os.path.realpath() для предотвращения обхода симлинков |
| Навыки охраны | Сканер безопасности для функций, настроенный из хаба |
| Песочница выполнения кода | Дочерний процесс запускается с удаленными ключами API |
| Укрепление контейнера | Docker: все возможности отключены, без изменения привилегий, ограничения PID |
Внесение кода, чувствительного к безопасности
- Всегда используйте
shlex.quote()при интерполяции пользовательского ввода в команды управления. - Разрешайте символические ссылки с помощью
os.path.realpath()перед проверкой контроля доступа. - Не логичите секреты
- Перехватите общие правила, касающиеся инструментов для выполнения работ.
- Тестируйте на всех платформах, если ваши изменения затрагивают пути или процессы файлов.
Процесс запроса на извлечение
Именование веток
fix/описание # Исправление ошибок
feat/описание # Новые функции
docs/описание # Документация
test/описание # Тесты
refactor/описание # Реструктуризация кода
Перед отправкой
- Запустите тесты:
pytesttests/ -v - Протестируйте вручную: запустите
hermesи проверьте изменённый код участка. - Проверьте влияние на разных платформах: Учтите macOS и различные дистрибутивы Linux.
- Представлен сфокусированный на PR: Одно логическое изменение на PR.
Описание PR
Включите: - изменились и почему - Как тестировать это - На каких платформах вытестировали - Ссылки на сопутствующие вопросы
Сообщения коммитов
Мы используем Conventional Commits:
<тип>(<область>): <описание>
| Тип | Используется для |
|---|---|
исправить |
Исправление ошибок |
подвиг |
Новые функции |
документы |
Документация |
тест |
Тесты |
рефакторинг |
Реструктуризация кода |
работа |
Сборка, CI, обновление зависимостей |
Области: cli, шлюз, инструменты, навыки, агент, установка, whatsapp, безопасность
Примеры:
fix(cli): предотвратить краш в save_config_value, когда model является строкой
feat(gateway): добавить изоляцию сессий для нескольких пользователей WhatsApp
fix(security): предотвратить внедрение команд в передаче пароля sudo
Сообщение о проблемах
- Используйте Проблемы GitHub
- Укажите: ОС, версия Python, версия Hermes (
hermes version), полная ошибка трассировки. - Укажите шаги для следования
- Проверяйте возможные проблемы перед созданием дубликата.
- Об уязвимостях безопасности сообщайте конфиденциально.
Сообщество
- Discord: discord.gg/NousResearch
- Обсуждения на GitHub: Для предложений по дизайну и обсуждению архитектуры.
- Центр навыков: Загружайте специализированные навыки и делитесь с сообществом.
Лицензия
Внося вклад, вы соглашаетесь, что ваш вклад будет соответствовать MIT License.