参与hermes agent贡献需依次完成:一、搭建本地开发环境(克隆仓库、创建虚拟环境、安装依赖及pre-commit);二、精准定位并复现问题;三、编写代码与对应测试;四、提交规范pr;五、同步更新文档与技能包。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您希望为Hermes Agent项目提交代码改进、修复缺陷或新增功能,则需遵循其开源协作规范。以下是参与贡献的具体路径与操作流程:
一、准备开发环境
贡献代码前,必须在本地构建可运行、可调试的完整开发环境,确保能复现问题、验证修改并运行测试套件。该环境需完整复现主仓库结构与依赖关系,避免因配置差异导致PR被拒。
1、克隆官方仓库至本地:git clone https://github.com/NousResearch/hermes-agent.git
2、进入项目目录:cd hermes-agent
3、使用uv创建隔离虚拟环境(推荐):uv venv && source .venv/bin/activate
4、安装可编辑模式依赖(含开发依赖):uv pip install -e ".[dev]"
5、安装预提交钩子以自动格式化与检查:pre-commit install
二、定位与复现问题
有效贡献始于对问题的精准理解。所有待修复项应有明确上下文:是否已在GitHub Issues中登记?是否可稳定复现?日志输出是否完整?跳过此步将极大降低PR被合入的可能性。
1、访问 https://github.com/NousResearch/hermes-agent/issues 查看已标记为 good first issue 或 help wanted 的任务
2、在本地复现该问题:启动hermes CLI或gateway进程,执行对应操作路径,捕获终端错误堆栈与~/.hermes/logs/errors.log内容
3、确认问题未被近期PR解决:查看 https://github.com/NousResearch/hermes-agent/pulls?q=is%3Apr+is%3Aclosed 中关闭的合并记录
三、编写与测试修改
代码修改必须附带对应测试用例,核心逻辑变更需覆盖单元测试(tests/)与集成测试(integration_tests/)。无测试覆盖的PR将被自动拒绝。
1、基于main分支新建特性分支:git checkout -b fix/memory-persistence-bug-123
2、编写代码修改,严格遵守PEP 8风格与项目已有命名约定(如使用memory_manager.py而非mem_mgr.py)
3、在tests/下添加对应测试模块,调用pytest tests/test_memory_manager.py::test_persist_memory_across_sessions验证行为
4、运行全部测试:pytest --cov=hermes --cov-report=html,确保覆盖率未下降且无新失败项
四、提交符合规范的Pull Request
PR是贡献落地的关键接口,标题与描述需清晰传达意图,使维护者无需猜测修改动机与影响范围。不规范的PR将被要求重写或直接关闭。
1、提交代码前运行:git add . && git commit -m "fix(memory): persist MEMORY.md on agent shutdown"
2、推送分支至个人Fork:git push origin fix/memory-persistence-bug-123
3、访问GitHub页面,点击 Compare & pull request,选择目标分支为 NousResearch:main
4、填写PR模板:包含问题描述、复现步骤、修改摘要、测试结果截图(如适用)、是否影响现有API或配置文件
五、参与文档与技能生态建设
除代码外,高质量文档更新与社区技能包(Skills)提交同样属于核心贡献范畴。Hermes强调“可复用知识沉淀”,因此技能文档与用户指南的完善具有与代码同等权重。
1、更新docs/目录下的Markdown文件时,需同步更新对应CLI help文本(如hermes setup --help输出)
2、新增Skill需放入skills/目录,命名为skill_<name>.md</name>,包含## Description、## Usage、## Examples三段式结构
3、向skills/community/提交技能前,先运行hermes skill_manage validate skills/community/skill_web_scraping.md校验格式
4、所有文档类PR必须通过markdownlint检查:npx markdownlint "**/*.md"











