
开发自动化:代码审查、测试、日报、周报全自动——7×24 小时的 AI 开发者助手
夜间自动审 PR、凌晨跑测试、晨间汇总全项目动态,一次配置终身受益
前言:为什么你的代码仓库需要一个“永不停机的 AI 管家”?
深夜十一点,你终于提交了最后一个 PR,正准备休息。然而你的 CI 流水线还在排队,代码审查还在等待团队 review,测试报告还要等明天早上才能看到……这样的场景每天都在上演。
但问题来了:AI 大模型已经把代码写得比我好了,但为什么我的重复性开发工作还是没有解脱?
答案是——你用对了模型,但没有用对 AI Agent 的“系统化能力”。
Hermes Agent 自 2026 年 2 月开源以来,GitHub Star 突破 11 万,成为 AI Agent 赛道上增长最快的框架之一。它不仅会写代码,更是一个会定时工作、会自主学习、会跨平台汇报的 7×24 小时开发者助手。
2026 年 4 月中旬的 GitHub 数据揭示了这一趋势的加速——Hermes 在短短两周内完成了从 9.5k Star 到 10.5k Star 的跨越,社区爆发式增长。大量开发者正在从“玩一玩 AI 聊天”转向“把 AI 嵌入完整的 DevOps 流水线”。
本文将手把手带你搭建一套完全自动化的开发助手体系:
- GitHub MCP + cron 配置:让 Hermes 具备读取和操作 GitHub 的权限与定时能力
- 自动 PR 审查:夜间自动对每一个新 PR 做语义级审查
- 自动测试生成:对新代码自动生成 pytest 用例并检查覆盖率
- 日报/周报自动汇总:每日整理 commit/PR/issue 动态,推送到飞书/微信/Telegram
- 与 Claude Code 的分工协作:谁做 IDE 内的深度编码,谁做仓库级的自动化运营
- 完整自动化流水线:将所有环节串成一条生产线
一、场景:为什么你的团队需要夜间自动化?
在讲技术细节之前,先明确我们要解决的真实开发痛点。
1.1 七个“沉睡的浪费”
| PR 积压 | 等第二天上班才人工 review | 8+ 小时 |
| CI 构建失败 | 等 CI 跑完才能知道 | 10-30 分钟 |
| 测试覆盖率不足 | 手动编写测试脚本 | 30 分钟/模块 |
| 项目进展不透明 | 手动整理 commit 日志 | 15 分钟/天 |
| 代码 Review 标准不一 | 依赖 reviewer 个人判断 | 不可控 |
| 技术债务沉淀 | 无人主动关注 | 累积性 |
| 第二天上班失忆 | 从头回忆昨天的进度 | 10-15 分钟 |
1.2 自动化的目标
Hermes 将把这些痛点转化为一次性配置、永久生效的自动化工作流。
下面是夜间自动化的完整时间线:
#mermaid-svg-Ko7STN1Y5EBCUTwO{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ko7STN1Y5EBCUTwO .error-icon{fill:#552222;}#mermaid-svg-Ko7STN1Y5EBCUTwO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ko7STN1Y5EBCUTwO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .marker.cross{stroke:#333333;}#mermaid-svg-Ko7STN1Y5EBCUTwO svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ko7STN1Y5EBCUTwO p{margin:0;}#mermaid-svg-Ko7STN1Y5EBCUTwO .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .cluster-label text{fill:#333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .cluster-label span{color:#333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .cluster-label span p{background-color:transparent;}#mermaid-svg-Ko7STN1Y5EBCUTwO .label text,#mermaid-svg-Ko7STN1Y5EBCUTwO span{fill:#333;color:#333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .node rect,#mermaid-svg-Ko7STN1Y5EBCUTwO .node circle,#mermaid-svg-Ko7STN1Y5EBCUTwO .node ellipse,#mermaid-svg-Ko7STN1Y5EBCUTwO .node polygon,#mermaid-svg-Ko7STN1Y5EBCUTwO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ko7STN1Y5EBCUTwO .rough-node .label text,#mermaid-svg-Ko7STN1Y5EBCUTwO .node .label text,#mermaid-svg-Ko7STN1Y5EBCUTwO .image-shape .label,#mermaid-svg-Ko7STN1Y5EBCUTwO .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ko7STN1Y5EBCUTwO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ko7STN1Y5EBCUTwO .rough-node .label,#mermaid-svg-Ko7STN1Y5EBCUTwO .node .label,#mermaid-svg-Ko7STN1Y5EBCUTwO .image-shape .label,#mermaid-svg-Ko7STN1Y5EBCUTwO .icon-shape .label{text-align:center;}#mermaid-svg-Ko7STN1Y5EBCUTwO .node.clickable{cursor:pointer;}#mermaid-svg-Ko7STN1Y5EBCUTwO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .arrowheadPath{fill:#333333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ko7STN1Y5EBCUTwO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ko7STN1Y5EBCUTwO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ko7STN1Y5EBCUTwO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ko7STN1Y5EBCUTwO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ko7STN1Y5EBCUTwO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ko7STN1Y5EBCUTwO .cluster text{fill:#333;}#mermaid-svg-Ko7STN1Y5EBCUTwO .cluster span{color:#333;}#mermaid-svg-Ko7STN1Y5EBCUTwO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Ko7STN1Y5EBCUTwO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ko7STN1Y5EBCUTwO rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ko7STN1Y5EBCUTwO .icon-shape,#mermaid-svg-Ko7STN1Y5EBCUTwO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ko7STN1Y5EBCUTwO .icon-shape p,#mermaid-svg-Ko7STN1Y5EBCUTwO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ko7STN1Y5EBCUTwO .icon-shape .label rect,#mermaid-svg-Ko7STN1Y5EBCUTwO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ko7STN1Y5EBCUTwO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ko7STN1Y5EBCUTwO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ko7STN1Y5EBCUTwO :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
输出
夜间自动化时间线
23:00PR 代码审查
23:30CI 状态监控
02:00测试生成与覆盖率检查
08:30日报/周报生成
审查意见评论到 PR
构建失败 → Telegram 告警
覆盖率报告存入 Wiki
日报推送至飞书/微信/Slack
前置工作主要有两步:配置 GitHub MCP 获取仓库读写权限,以及配置 cron 定时调度。
二、GitHub MCP + cron 配置
Hermes 对 GitHub 的自动化访问通过 MCP(模型上下文协议) 实现——这是一种标准化的外部系统接入协议,Hermes 通过 MCP Server 将 GitHub 的工具(如 create_issue、create_pull_request、list_commits 等)注册为 Agent 的原生工具,Agent 就能像调用本地函数一样直接操作 GitHub。
2.1 GitHub Token 申请(Fine-Grained PAT)
使用 GitHub MCP 的第一步是申请一个 Fine-Grained Personal Access Token。相比经典 PAT,Fine-Grained Token 可以精确控制授权范围——例如只授权某个特定仓库的 Pull Request 写权限,而不是所有仓库。
步骤:
- Contents:Read & write(读取代码、创建/修改文件)
- Pull requests:Read & write(创建/审查 PR)
- Issues:Read & write(创建/回复 Issue)
- Metadata:Read
- Workflows:Read(监控 CI 状态,只读即可)
⚠️ 安全警钟:遵循“最小权限”原则。不要一股脑把所有权限都打钩,只需要给自动化真正需要的权限就够了。
2.2 配置 config.yaml 接入 GitHub MCP
在 ~/.hermes/.env 中添加 Token:
GITHUB_PERSONAL_ACCESS_TOKEN=github_pat_your_fine_grained_token_here
然后在 ~/.hermes/config.yaml 中注册 GitHub MCP Server:
mcp_servers:
github:
command: "npx"
args:
– "-y"
– "@modelcontextprotocol/server-github"
env:
GITHUB_PERSONAL_ACCESS_TOKEN: ${GITHUB_PERSONAL_ACCESS_TOKEN}
GITHUB_READ_ONLY: "false"
connect_timeout: 60
timeout: 180
2.3 配置 cron 执行定时任务
Hermes 内置自然语言 Cron 调度器,配置起来非常简单:
# 设置每天凌晨 1 点执行代码审查
hermes cron add "0 1 * * *" "对最近 24 小时内创建的所有 PR 执行代码审查"
# 设置每天凌晨 2 点生成测试
hermes cron add "0 2 * * *" "检查最近一天提交的代码,对没有测试覆盖的文件自动生成 pytest 用例"
# 设置每天上午 9 点发送日报
hermes cron add "0 9 * * *" "汇总昨日 GitHub 仓库的 commits、PR 和 issues,生成日报推送到 Telegram"
在 Kubernetes 环境中,也可以使用 CronJob 的方式实现定时任务,通过 ConfigMap 注入日报模板、配置 ServiceAccount 与 RBAC 权限。
Hermes 的 API 调用成本通常只有 OpenClaw 的 30%-50%,四层渐进式 Skill 加载确保日常运行仅需约 3000 token。对于定时任务这类对延迟不敏感的场景,建议在 ~/.hermes/config.yaml 中配置 auxiliary_models 使用性价比高的模型(如 DeepSeek、GPT-4o-mini),Token 成本可再节省 40%-60%。
三、自动 PR 审查 Skill 配置与自定义
PR 审查是开发自动化中最有价值的一环。Hermes 将这个场景提炼为技能,一键安装即可使用。
3.1 安装 GitHub 代码审查技能
# 安装技能
hermes skills install github-code-review
# 验证安装
hermes skills list | grep "github-code-review"
如果技能未显示,请确认 gh CLI 是否已登录:
gh auth status
# 如未登录,执行 gh auth login 并按提示完成 OAuth 流程
3.2 对指定 PR 执行自动化审查
# 语法:hermes skills run github-code-review –pr=编号 –repo=用户名/仓库名
hermes skills run github-code-review –pr=42 –repo=myteam/backend-api
审查结果将包含:
- ✅ 带行号标注的问题点
- ✅ 修复建议
- ✅ 严重性分级(High/Medium/Low)
如需导出为 Markdown 报告:追加参数 –output=review-report.md。
3.3 本地代码变更预检
在推送代码到远程仓库之前,可以先在本地执行审查,避免问题进入 CI 流水线:
# 确保当前目录是 Git 仓库根路径
cd /path/to/your/repo
# 暂存待审查的变更
git add .
# 触发本地审查
hermes skills run github-code-review –local
# 审查完成后,Agent 会提示是否自动创建修正 commit
# 输入 y 确认,或手动执行 git commit
3.4 配置 CI/CD 流水线集成
将 Hermes 嵌入 GitHub Actions 工作流,实现每次 push 或 PR 创建时的自动审查:
# .github/workflows/hermes-review.yml
name: Hermes PR Review
on:
pull_request:
types: [opened, synchronize, reopened]
jobs:
review:
runs-on: ubuntu–latest
steps:
– name: Checkout code
uses: actions/checkout@v4
– name: Install Hermes Agent
run: |
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
source ~/.bashrc
– name: Run GitHub code review
run: |
hermes skills run github-code-review \\
–pr=${{ github.event.number }} \\
–repo=${{ github.repository }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
– name: Fail pipeline on review issues
if: ${{ failure() }}
run: exit 1
3.5 自定义审查规则集
默认的审查规则可能不完全符合你的团队规范。可以通过覆盖提示模板来定制审查规则:
# 定位模板文件
ls ~/.hermes/skills/github-code-review/templates/
# 备份原文件(重要!)
cp default.md default.md.bak
# 编辑 default.md,在“检查项”章节下新增自定义条目
# 例如:
# – 确保所有导出函数均配有 @returns JSDoc 注释
# – 禁止在代码中出现 eval() 调用
# – 限定 React Hook 的使用方式(Hook 规则只在函数组件最顶层调用)
# 保存后重启 Agent 使变更生效
hermes restart
Hermes 的审查结果会受记忆系统的影响。它的三层记忆体系(会话记忆、持久记忆、Skill 记忆)中,持久记忆(MEMORY.md + USER.md) 会在每个会话开始时自动加载。如果你在 USER.md 中记录了“代码中禁用 eval()”、“优先使用类型注解”等偏好,这些偏好会自动注入所有 PR 审查流程,使审查结果与团队规范保持一致。
四、测试生成与覆盖率自动检查
如果说 PR 审查是在“防御”,那么自动生成测试就是在“建设”。Hermes 可以读取你刚刚提交的代码,自主生成 pytest 单元测试,并检查覆盖率是否达标。
4.1 使用自动化测试模板生成用例
Hermes 内置了测试生成能力,可以基于函数签名和 docstring 自动推导输入输出边界:
# 进入项目根目录,激活虚拟环境
cd /path/to/your/project
source venv/bin/activate
# 为指定模块生成测试用例
hermes test –generate –target src/my_module.py
执行后,Hermes 会:
验证生成的测试能否通过:
pytest tests/test_my_module.py -v
4.2 ProCode 模式:批量生成多场景测试
对于复杂函数,可以使用 ProCode 模式生成覆盖更全面的多场景测试。ProCode 模式允许 Hermes 将测试生成任务编译为可执行 Python 脚本,一次性调用 terminal、file 等多个工具完成数据准备、断言注入与覆盖率采集,避免多轮交互导致的语义漂移:
hermes chat -q "Generate exhaustive pytest cases for function parse_json(input_str: str) -> dict, including malformed inputs and edge cases"
Agent 会输出一个完整的 Python 脚本,保存后执行即可:
python gen_parse_json_tests.py –output tests/test_parse_json.py
确认输出文件中通常包含以下输入组合:
- 空字符串
- JSON 数组
- 嵌套对象
- 编码错误字节流
- 超长字符串截断
4.3 覆盖率自动检查
# 运行测试并生成覆盖率报告
pytest –cov=src –cov-report=html tests/
# 让 Hermes 检查覆盖率是否达标并输出报告
hermes chat -q "检查项目测试覆盖率,如果低于 80%,列出未覆盖的代码行并给出补充测试的建议"
4.4 夜间自动测试调度
将测试生成和覆盖率检查集成到夜间自动任务中:
hermes cron add "0 3 * * *" "检查项目根目录下 tests/ 文件夹中的测试文件数量,对比昨日新增的 Python 文件,对尚未有对应测试的文件自动生成 pytest 用例,并输出覆盖率报告"
下面是完整的夜间测试自动生成工作流:
#mermaid-svg-fodh9IuL6sYSTmIE{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fodh9IuL6sYSTmIE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fodh9IuL6sYSTmIE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fodh9IuL6sYSTmIE .error-icon{fill:#552222;}#mermaid-svg-fodh9IuL6sYSTmIE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fodh9IuL6sYSTmIE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fodh9IuL6sYSTmIE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fodh9IuL6sYSTmIE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fodh9IuL6sYSTmIE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fodh9IuL6sYSTmIE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fodh9IuL6sYSTmIE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fodh9IuL6sYSTmIE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fodh9IuL6sYSTmIE .marker.cross{stroke:#333333;}#mermaid-svg-fodh9IuL6sYSTmIE svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fodh9IuL6sYSTmIE p{margin:0;}#mermaid-svg-fodh9IuL6sYSTmIE .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-fodh9IuL6sYSTmIE .cluster-label text{fill:#333;}#mermaid-svg-fodh9IuL6sYSTmIE .cluster-label span{color:#333;}#mermaid-svg-fodh9IuL6sYSTmIE .cluster-label span p{background-color:transparent;}#mermaid-svg-fodh9IuL6sYSTmIE .label text,#mermaid-svg-fodh9IuL6sYSTmIE span{fill:#333;color:#333;}#mermaid-svg-fodh9IuL6sYSTmIE .node rect,#mermaid-svg-fodh9IuL6sYSTmIE .node circle,#mermaid-svg-fodh9IuL6sYSTmIE .node ellipse,#mermaid-svg-fodh9IuL6sYSTmIE .node polygon,#mermaid-svg-fodh9IuL6sYSTmIE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fodh9IuL6sYSTmIE .rough-node .label text,#mermaid-svg-fodh9IuL6sYSTmIE .node .label text,#mermaid-svg-fodh9IuL6sYSTmIE .image-shape .label,#mermaid-svg-fodh9IuL6sYSTmIE .icon-shape .label{text-anchor:middle;}#mermaid-svg-fodh9IuL6sYSTmIE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fodh9IuL6sYSTmIE .rough-node .label,#mermaid-svg-fodh9IuL6sYSTmIE .node .label,#mermaid-svg-fodh9IuL6sYSTmIE .image-shape .label,#mermaid-svg-fodh9IuL6sYSTmIE .icon-shape .label{text-align:center;}#mermaid-svg-fodh9IuL6sYSTmIE .node.clickable{cursor:pointer;}#mermaid-svg-fodh9IuL6sYSTmIE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fodh9IuL6sYSTmIE .arrowheadPath{fill:#333333;}#mermaid-svg-fodh9IuL6sYSTmIE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fodh9IuL6sYSTmIE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fodh9IuL6sYSTmIE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fodh9IuL6sYSTmIE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fodh9IuL6sYSTmIE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fodh9IuL6sYSTmIE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fodh9IuL6sYSTmIE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fodh9IuL6sYSTmIE .cluster text{fill:#333;}#mermaid-svg-fodh9IuL6sYSTmIE .cluster span{color:#333;}#mermaid-svg-fodh9IuL6sYSTmIE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fodh9IuL6sYSTmIE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fodh9IuL6sYSTmIE rect.text{fill:none;stroke-width:0;}#mermaid-svg-fodh9IuL6sYSTmIE .icon-shape,#mermaid-svg-fodh9IuL6sYSTmIE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fodh9IuL6sYSTmIE .icon-shape p,#mermaid-svg-fodh9IuL6sYSTmIE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fodh9IuL6sYSTmIE .icon-shape .label rect,#mermaid-svg-fodh9IuL6sYSTmIE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fodh9IuL6sYSTmIE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fodh9IuL6sYSTmIE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fodh9IuL6sYSTmIE :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
输出
测试生成
检查与过滤
有
无
输入:昨日变更检测
git diff –name-only昨日新增/修改的 Python 文件
tests/ 目录下已有对应测试?
跳过该文件
无 -> 进入生成流程
分析函数签名 + docstring
生成 pytest 测试用例骨架
生成参数化测试
覆盖边界+异常路径
写入 tests/test_*.py
报告:新增文件数、待补充测试
五、日报/周报自动汇总
日报、周报的痛点在于“手动统计太麻烦”,而自动化的价值在于“零成本获取项目全貌”。
5.1 配置日报生成 Skill
# 第一步:手动初次执行,让 Hermes 学会生成日报
hermes chat -q "查询团队仓库 myteam/backend-api 最近 24 小时的 commits、PR 和 issues,按变动类型汇总,生成 Markdown 格式的日报"
# Hermes 会自动将这套流程沉淀为 Skill
5.2 自定义日报 Skill 模板
如果你希望日报格式更符合团队风格,可以编写一个专门的 SKILL.md:
—
name: daily-report
description: 生成昨日 GitHub 项目动态日报,包括 commits、PR 和 issues,推送到团队消息平台
—
## 触发条件
用户提到“日报”、“每日汇总”、“项目动态”时自动触发
## 执行步骤
1. 调用 GitHub MCP 的 `list_commits` 获取最近 24 小时 commits
2. 调用 `list_pull_requests` 获取 PR 状态变化
3. 调用 `list_issues` 获取新增 Issue
4. 分类统计:
– commits:按作者分组,列出关键提交信息
– PR 摘要:待审查、已合并、需修复
– Issues:待处理、进行中、已关闭
5. 按严重程度排序后,生成 Markdown 格式报告
6. 通过 Gateway 推送到指定频道
## 示例输出
### 📊 昨日项目动态 (2026-04-24)
– **Commits**: 12 次 (张三 5, 李四 7)
– **PR**: 新增 3 个 / 合并 2 个
– **Issues**: 新增 3 个 / 待处理 3 个
5.3 配置 Cron 定时任务
# 每天上午 9 点发送日报
hermes cron add "0 9 * * *" "使用 daily-report 技能生成日报并推送到 #team-daily 频道"
# 每周一上午 10 点发送周报
hermes cron add "0 10 * * 1" "汇总上周的 commits、PR 和 issues,生成周报推送到 #weekly 频道"
# 每天下午 5 点发送当日工作待办提醒
hermes cron add "0 17 * * *" "检查今日未合并的 PR 和未关闭的 Issue,推送给相关负责人"
5.4 将 Gateway 连接到消息平台
要让日报推送到飞书、企业微信或 Telegram,需要先配置 Gateway。
在 ~/.hermes/config.yaml 中配置:
gateway:
enabled: true
platforms:
telegram:
bot_token: ${env:TELEGRAM_BOT_TOKEN}
home_channel: -1001234567890 # 默认推送频道
feishu:
app_id: ${env:FEISHU_APP_ID}
app_secret: ${env:FEISHU_APP_SECRET}
home_channel: "your_channel_id"
这样,所有 cron 任务生成的结果会自动通过 Gateway 推送到对应的消息平台。
六、与 Claude Code 的分工:工匠 + 管家
很多开发者会纠结:我应该用 Claude Code 还是 Hermes?答案是——两者不是竞争关系,而是分工协作。
6.1 核心定位差异
| 核心定位 | IDE/终端内的代码编码助手 | 持久的 Agent 运行时与自动化平台 |
| 运行环境 | 在你的代码仓库里运行 | 可以在 VPS、服务器、容器中长期运行 |
| 工作方式 | 你提问 → 它执行 | 配置好参数 → 它定时/持续工作 |
| 记忆能力 | 当前会话内 | 跨会话持久记忆 + 技能自动沉淀 |
| 多平台接入 | 仅 CLI / IDE | CLI + Telegram/飞书/微信/Discord/Slack |
| 部署方式 | 本地运行 | 本地/VPS/Docker/Serverless |
| 成本结构 | 按用量计费(商业产品) | 开源免费 + API 成本 |
| 最佳场景 | 软件工程的深度编码 | 长期运行的自动化工作流 |
Claude Code 活在你的代码仓库里——它读代码、写代码、跑测试、提交变更,是目前最强的编码智能体之一,但它不会在服务器上独立运行。根据 Pragmatic Engineer 调查,Anthropic 内部约 90% 的代码由 Claude Code 编写,工程师效率提升了 200%;截至 2026 年 2 月,Claude Code 在 VS Code 中日安装量高达 2900 万次,全球约 4% 的公开 GitHub 提交由它生成。
Hermes 的优势在另一端——持久性(跨会话记忆、跨平台运行、自动技能固化)。它更适合长期运行的自动化工作流:夜间 PR 审查、定时日报、CI 监控。
#mermaid-svg-DSEIpyfhJJWxxeZi{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DSEIpyfhJJWxxeZi .error-icon{fill:#552222;}#mermaid-svg-DSEIpyfhJJWxxeZi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DSEIpyfhJJWxxeZi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DSEIpyfhJJWxxeZi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DSEIpyfhJJWxxeZi .marker.cross{stroke:#333333;}#mermaid-svg-DSEIpyfhJJWxxeZi svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DSEIpyfhJJWxxeZi p{margin:0;}#mermaid-svg-DSEIpyfhJJWxxeZi .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-DSEIpyfhJJWxxeZi .cluster-label text{fill:#333;}#mermaid-svg-DSEIpyfhJJWxxeZi .cluster-label span{color:#333;}#mermaid-svg-DSEIpyfhJJWxxeZi .cluster-label span p{background-color:transparent;}#mermaid-svg-DSEIpyfhJJWxxeZi .label text,#mermaid-svg-DSEIpyfhJJWxxeZi span{fill:#333;color:#333;}#mermaid-svg-DSEIpyfhJJWxxeZi .node rect,#mermaid-svg-DSEIpyfhJJWxxeZi .node circle,#mermaid-svg-DSEIpyfhJJWxxeZi .node ellipse,#mermaid-svg-DSEIpyfhJJWxxeZi .node polygon,#mermaid-svg-DSEIpyfhJJWxxeZi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DSEIpyfhJJWxxeZi .rough-node .label text,#mermaid-svg-DSEIpyfhJJWxxeZi .node .label text,#mermaid-svg-DSEIpyfhJJWxxeZi .image-shape .label,#mermaid-svg-DSEIpyfhJJWxxeZi .icon-shape .label{text-anchor:middle;}#mermaid-svg-DSEIpyfhJJWxxeZi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DSEIpyfhJJWxxeZi .rough-node .label,#mermaid-svg-DSEIpyfhJJWxxeZi .node .label,#mermaid-svg-DSEIpyfhJJWxxeZi .image-shape .label,#mermaid-svg-DSEIpyfhJJWxxeZi .icon-shape .label{text-align:center;}#mermaid-svg-DSEIpyfhJJWxxeZi .node.clickable{cursor:pointer;}#mermaid-svg-DSEIpyfhJJWxxeZi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DSEIpyfhJJWxxeZi .arrowheadPath{fill:#333333;}#mermaid-svg-DSEIpyfhJJWxxeZi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DSEIpyfhJJWxxeZi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DSEIpyfhJJWxxeZi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DSEIpyfhJJWxxeZi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DSEIpyfhJJWxxeZi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DSEIpyfhJJWxxeZi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DSEIpyfhJJWxxeZi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DSEIpyfhJJWxxeZi .cluster text{fill:#333;}#mermaid-svg-DSEIpyfhJJWxxeZi .cluster span{color:#333;}#mermaid-svg-DSEIpyfhJJWxxeZi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DSEIpyfhJJWxxeZi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DSEIpyfhJJWxxeZi rect.text{fill:none;stroke-width:0;}#mermaid-svg-DSEIpyfhJJWxxeZi .icon-shape,#mermaid-svg-DSEIpyfhJJWxxeZi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DSEIpyfhJJWxxeZi .icon-shape p,#mermaid-svg-DSEIpyfhJJWxxeZi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DSEIpyfhJJWxxeZi .icon-shape .label rect,#mermaid-svg-DSEIpyfhJJWxxeZi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DSEIpyfhJJWxxeZi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DSEIpyfhJJWxxeZi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DSEIpyfhJJWxxeZi :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Hermes – 管家
开发者
发现问题
审查意见
汇总动态
日常编码
设定规则
Push 代码
Claude Code – 工匠
日常编码
本地测试
代码重构
调试 Bug
开发者
npm 审计扫描
PR 自动审查
CI 状态监控
定时推日报/周报
跨会话记忆助手
6.2 实践分工方案
顶级团队的真实选择:Claude Code 负责代码层的“工匠”工作,Hermes 负责系统层的“管家”工作。
| 编写一个复杂函数的实现 | Claude Code |
| 对该函数生成单元测试 | Hermes(自动测试生成) |
| 本地调试 Bug | Claude Code |
| 提交 PR 后,让 AI 自动 review | Hermes(GitHub 技能 + cron) |
| 每天上班前了解项目进展 | Hermes(日报推送) |
| 代码重构、依赖升级 | Claude Code |
| NPM/Cargo 依赖安全审计 | Hermes(cron + 告警) |
一句话总结:当一个复杂任务需要深度理解代码结构时(比如重构一个大函数),Claude Code 无人能及;当一个任务需要“每天、每 PR、每 Issue”自动触发时,Hermes 是唯一答案。两者互补、分工协作,而非二选一。
七、完整自动化流水线搭建
到这里,我们已经拆解了所有组件。现在是时候把它们拼成一条完整的 7×24 小时 自动化流水线。
7.1 一次配置,永久生效的完整流程
#mermaid-svg-U4U6P5TtDMLyY5fB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-U4U6P5TtDMLyY5fB .error-icon{fill:#552222;}#mermaid-svg-U4U6P5TtDMLyY5fB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-U4U6P5TtDMLyY5fB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-U4U6P5TtDMLyY5fB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-U4U6P5TtDMLyY5fB .marker.cross{stroke:#333333;}#mermaid-svg-U4U6P5TtDMLyY5fB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-U4U6P5TtDMLyY5fB p{margin:0;}#mermaid-svg-U4U6P5TtDMLyY5fB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-U4U6P5TtDMLyY5fB .cluster-label text{fill:#333;}#mermaid-svg-U4U6P5TtDMLyY5fB .cluster-label span{color:#333;}#mermaid-svg-U4U6P5TtDMLyY5fB .cluster-label span p{background-color:transparent;}#mermaid-svg-U4U6P5TtDMLyY5fB .label text,#mermaid-svg-U4U6P5TtDMLyY5fB span{fill:#333;color:#333;}#mermaid-svg-U4U6P5TtDMLyY5fB .node rect,#mermaid-svg-U4U6P5TtDMLyY5fB .node circle,#mermaid-svg-U4U6P5TtDMLyY5fB .node ellipse,#mermaid-svg-U4U6P5TtDMLyY5fB .node polygon,#mermaid-svg-U4U6P5TtDMLyY5fB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-U4U6P5TtDMLyY5fB .rough-node .label text,#mermaid-svg-U4U6P5TtDMLyY5fB .node .label text,#mermaid-svg-U4U6P5TtDMLyY5fB .image-shape .label,#mermaid-svg-U4U6P5TtDMLyY5fB .icon-shape .label{text-anchor:middle;}#mermaid-svg-U4U6P5TtDMLyY5fB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-U4U6P5TtDMLyY5fB .rough-node .label,#mermaid-svg-U4U6P5TtDMLyY5fB .node .label,#mermaid-svg-U4U6P5TtDMLyY5fB .image-shape .label,#mermaid-svg-U4U6P5TtDMLyY5fB .icon-shape .label{text-align:center;}#mermaid-svg-U4U6P5TtDMLyY5fB .node.clickable{cursor:pointer;}#mermaid-svg-U4U6P5TtDMLyY5fB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-U4U6P5TtDMLyY5fB .arrowheadPath{fill:#333333;}#mermaid-svg-U4U6P5TtDMLyY5fB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-U4U6P5TtDMLyY5fB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-U4U6P5TtDMLyY5fB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-U4U6P5TtDMLyY5fB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-U4U6P5TtDMLyY5fB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-U4U6P5TtDMLyY5fB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-U4U6P5TtDMLyY5fB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-U4U6P5TtDMLyY5fB .cluster text{fill:#333;}#mermaid-svg-U4U6P5TtDMLyY5fB .cluster span{color:#333;}#mermaid-svg-U4U6P5TtDMLyY5fB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-U4U6P5TtDMLyY5fB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-U4U6P5TtDMLyY5fB rect.text{fill:none;stroke-width:0;}#mermaid-svg-U4U6P5TtDMLyY5fB .icon-shape,#mermaid-svg-U4U6P5TtDMLyY5fB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-U4U6P5TtDMLyY5fB .icon-shape p,#mermaid-svg-U4U6P5TtDMLyY5fB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-U4U6P5TtDMLyY5fB .icon-shape .label rect,#mermaid-svg-U4U6P5TtDMLyY5fB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-U4U6P5TtDMLyY5fB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-U4U6P5TtDMLyY5fB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-U4U6P5TtDMLyY5fB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
输出层
自动化流水线
输入层
是
否
是
否
开发者 Push Code
PR 事件?
PR 创建/更新
PR 审查(hermes skills run github-code-review)
定时 crond(自然语言调度)
审查通过?
合并 PR
评论 PR + 建议修改
退回开发者
夜间/凌晨执行
测试生成(hermes test –generate)
覆盖率检查(pytest –cov)
日报/周报生成(daily-report skill)
Gateway 统一推送
Telegram
飞书/企业微信
Slack
GitHub PR 状态更新
7.2 设置 Cron 任务汇总
用三条命令跑通整个流水线:
# 1. 夜间 PR 审查:每小时检查一次新 PR
hermes cron add "0 * * * *" "检查仓库中最近 1 小时内创建的新 PR,对每个 PR 执行自动代码审查,将审查意见评论到 PR 下方"
# 2. 凌晨测试生成:每天凌晨 2 点,为昨日提交的代码自动生成测试
hermes cron add "0 2 * * *" "检查项目根目录下tests/文件夹中的测试文件数量,对比昨日新增的Python文件,对尚未有对应测试的文件自动生成pytest用例"
# 3. 晨间日报汇总:每天上午 8:30 推送项目动态
hermes cron add "30 8 * * *" "汇总团队仓库昨日 commits、PR 和 issues,按开发者分组生成 Markdown 日报,推送到企业微信 #daily 频道"
7.3 质量门禁设置
如果希望 PR 审查不通过时阻止合并(质量门禁),可以在 GitHub 分支保护规则中设置:
这样,任何未通过 Hermes 审查的 PR 都被禁止合并。
八、总结:7×24 开发者助手
通过本文的完整配置,你可以实现下列全天候自动化:
#mermaid-svg-5Tw6nOCmGsWJtlzu{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5Tw6nOCmGsWJtlzu .error-icon{fill:#552222;}#mermaid-svg-5Tw6nOCmGsWJtlzu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5Tw6nOCmGsWJtlzu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5Tw6nOCmGsWJtlzu .marker.cross{stroke:#333333;}#mermaid-svg-5Tw6nOCmGsWJtlzu svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5Tw6nOCmGsWJtlzu p{margin:0;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge{stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section–1 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section–1 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section–1 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section–1 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section–1 text{fill:#ffffff;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth–1{stroke-width:17;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-0 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-0 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-0 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-0 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-0 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-0{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-0{stroke-width:14;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-1 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-1 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-1 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-1 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-1 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-1{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-1{stroke-width:11;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 text{fill:#ffffff;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-2{stroke-width:8;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-3 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-3 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-3 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-3 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-3 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-3{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-3{stroke-width:5;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-4 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-4 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-4 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-4 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-4 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-4{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-4{stroke-width:2;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-5 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-5 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-5 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-5 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-5 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-5{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-5{stroke-width:-1;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-6 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-6 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-6 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-6 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-6 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-6{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-6{stroke-width:-4;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-7 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-7 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-7 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-7 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-7 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-7{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-7{stroke-width:-7;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-8 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-8 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-8 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-8 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-8 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-8{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-8{stroke-width:-10;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-9 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-9 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-9 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-9 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-9 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-9{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-9{stroke-width:-13;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-10 rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-10 path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-10 circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-10 polygon,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-10 text{fill:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .node-icon-10{font-size:40px;color:black;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge-depth-10{stroke-width:-16;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:lightgray;}#mermaid-svg-5Tw6nOCmGsWJtlzu .disabled text{fill:#efefef;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-root rect,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-root path,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-root circle,#mermaid-svg-5Tw6nOCmGsWJtlzu .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-root text{fill:#ffffff;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-root span{color:#ffffff;}#mermaid-svg-5Tw6nOCmGsWJtlzu .section-2 span{color:#ffffff;}#mermaid-svg-5Tw6nOCmGsWJtlzu .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-5Tw6nOCmGsWJtlzu .edge{fill:none;}#mermaid-svg-5Tw6nOCmGsWJtlzu .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-5Tw6nOCmGsWJtlzu :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Hermes7x24 开发者助手
代码质量
PR 自动审查
语义级代码检查
自定义审查规则集
覆盖率门禁
测试自动化
自动生成测试用例
多场景测试生成
缺少文件自动检测
项目管理
Commit 自动汇总
PR 状态追踪
Issue 动态推送
日报/周报生成
集成与部署
GitHub Actions 流水线
CI 状态监控告警
Gateway 消息平台
AI 协作
Claude Code 深度编码
Hermes 运营自动化
技能自动沉淀
自动化带来的核心收益:
| GitHub MCP | 无需手敲 GitHub 命令 |
| PR 审查自动化 | 代码质量门禁前移,人工 Review 负担显著降低 |
| Cron + GitHub | 日报自动生成 + 推送,信息透明 |
| 自动测试生成 | 避免手动编写重复测试 |
| 质量门禁 | PR 自动审查不通过 → 禁止合并 |
| 分层记忆 | 跨会话记住你的编码偏好 |
Hermes 不是“又一个会写代码的 AI”,它是一个 7×24 小时认真工作的 AI 运维工程师。它的存在不是为了替代你,而是为了让你每天走进办公室时,杂活已经被默默搞定,那些复杂的上下文已经提前整理好,你可以直接进入心流状态、专注核心业务。
而当你与 Claude Code 形成“工匠 + 管家”的双 AI 协作模式后,你的开发效率将进入一个全新的维度——代码质量有审查、自动化测试有补充、项目进展有日报、AI 技能会自我进化——这就是 2026 年 AI 原生开发工程师的标准配置。
📌 延伸阅读
- Hermes Agent GitHub 官方仓库
- Hermes 三层记忆机制彻底拆解(系列前作)
- Hermes cronjob 定时任务大全(系列前作)
- GitHub MCP Server 官方文档
- agentskills.io 开放标准规范
💬 你的项目中有哪些重复性开发任务亟待自动化?欢迎在评论区分享你的流水线搭建经验!
本文作者:[RickyIT] 原创不易,欢迎点赞、收藏、转发


