sidebar_position: 4 title: "Contributing" description: "How to contribute to Hermes Agent — dev setup, code style, PR process" lang: ru
Вклад
Благодарим вас за вклад в развитие Hermes Agent! В этом руководстве рассказывается о настройке среды разработки, понимании кодовой базы и объединении вашего PR.
Приоритеты вклада
Мы оцениваем вклад в следующем порядке:
- Исправлены ошибки — сбои, некорректное поведение, потеря данных.
- Кроссплатформенная совместимость — macOS, различные дистрибутивы Linux, WSL2.
- Усиление безопасности — внедрение оболочки, быстрое внедрение, обход пути.
- Производительность и надежность — логика повторных попыток, обработка ошибок, постепенное ухудшение качества.
- Новые навыки — широко полезные (см. Создание навыков)
- Новые инструменты — нужны редко; большинство способностей должны быть навыками
- Документация — исправления, пояснения, новые примеры.
Общие пути вклада
- Создание собственного/локального инструмента без изменения ядра Hermes? Начните с Создать плагин Hermes
- Создаете новый встроенный основной инструмент для самого Hermes? Начните с Добавление инструментов
- Приобретение нового навыка? Начните с Создание навыков
- Создаете нового поставщика логических выводов? Начните с Добавление поставщиков
Настройка разработки
Предварительные условия
| Требование | Заметки |
|---|---|
| Гит | С поддержкой --recurse-submodules и установленным расширением git-lfs |
| Питон 3.11+ | uv установит его, если он отсутствует |
| УФ | Менеджер пакетов Fast Python (install) |
| Node.js 20+ | Необязательно — необходимо для инструментов браузера и моста WhatsApp (соответствует корневым движкам package.json) |
Клонировать и установить
git clone --recurse-submodules https://github.com/NousResearch/hermes-agent.git
cd hermes-agent
# Create venv with Python 3.11
uv venv venv --python 3.11
export VIRTUAL_ENV="$(pwd)/venv"
# Install with all extras (messaging, cron, CLI menus, dev tools)
uv pip install -e ".[all,dev]"
uv pip install -e "./tinker-atropos"
# Optional: browser tools
npm install
Настройка для разработки
mkdir -p ~/.hermes/{cron,sessions,logs,memories,skills}
cp cli-config.yaml.example ~/.hermes/config.yaml
touch ~/.hermes/.env
# Add at minimum an LLM provider key:
echo 'OPENROUTER_API_KEY=sk-or-v1-your-key' >> ~/.hermes/.env
Беги
# Symlink for global access
mkdir -p ~/.local/bin
ln -sf "$(pwd)/venv/bin/hermes" ~/.local/bin/hermes
# Verify
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 не поддерживается, но кодовая база включает в себя некоторые защитные шаблоны кодирования, позволяющие избежать серьезных сбоев в крайних случаях. Ключевые правила:
1. termios и fcntl предназначены только для Unix.
Всегда ловите ImportError и NotImplementedError:
try:
from simple_term_menu import TerminalMenu
menu = TerminalMenu(options)
idx = menu.show()
except (ImportError, NotImplementedError):
# Fallback: numbered menu
for i, opt in enumerate(options):
print(f" {i+1}. {opt}")
idx = int(input("Choice: ")) - 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/description # Bug fixes
feat/description # New features
docs/description # Documentation
test/description # Tests
refactor/description # Code restructuring
Перед отправкой
- Выполнить тесты:
pytest tests/ -v - Проверьте вручную: запустите
hermesи проверьте измененный путь кода. - Проверьте влияние кроссплатформенности: рассмотрите macOS и другие дистрибутивы Linux.
- Держите PR в фокусе: одно логическое изменение на каждый PR.
PR-описание
Включить: - Что изменилось и почему - Как проверить это – На каких платформах вы тестировали - Ссылаться на любые сопутствующие вопросы
Сообщения о фиксации
Мы используем Обычные фиксации:
<type>(<scope>): <description>
| Тип | Использовать для |
|---|---|
fix |
Исправления ошибок |
feat |
Новые возможности |
docs |
Документация |
test |
Тесты |
refactor |
Реструктуризация кода |
chore |
Сборка, CI, обновления зависимостей |
Области применения: cli, gateway, tools, skills, agent, install, whatsapp, security
Примеры:
fix(cli): prevent crash in save_config_value when model is a string
feat(gateway): add WhatsApp multi-user session isolation
fix(security): prevent shell injection in sudo password piping
Проблемы с отчетами
- Используйте Проблемы GitHub
- Включены: ОС, версия Python, версия Hermes (
hermes version), полная отслеживание ошибок. - Включите шаги для воспроизведения
- Проверьте существующие проблемы, прежде чем создавать дубликаты.
- Об уязвимостях безопасности сообщайте лично.
Сообщество
- Discord: discord.gg/NousResearch
- Обсуждения на GitHub: предложения по дизайну и обсуждения архитектуры.
- Центр навыков: загружайте специальные навыки и делитесь ими с сообществом.
Лицензия
Делая свой вклад, вы соглашаетесь с тем, что ваш вклад будет лицензироваться по Лицензии MIT.