欢迎光临
我们一直在努力

【Hermes:实战场景】34、开发自动化:代码审查、测试、日报、周报全自动——7×24 小时的 AI 开发者助手

在这里插入图片描述

开发自动化:代码审查、测试、日报、周报全自动——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 写权限,而不是所有仓库。

步骤:

  • GitHub 右上角头像 → Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token
  • Token name:HERMES-AUTOMATION
  • Repository access:Select repositories → 勾选目标仓库
  • Permissions 设置(最小权限原则):
    • Contents:Read & write(读取代码、创建/修改文件)
    • Pull requests:Read & write(创建/审查 PR)
    • Issues:Read & write(创建/回复 Issue)
    • Metadata:Read
    • Workflows:Read(监控 CI 状态,只读即可)
  • 点击 Generate token,立即复制保存(刷新后不可见)
  • ⚠️ 安全警钟:遵循“最小权限”原则。不要一股脑把所有权限都打钩,只需要给自动化真正需要的权限就够了。

    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: ubuntulatest
    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 会:

  • 分析 src/my_module.py 中的函数签名、类型注解和 docstring
  • 自动生成对应的 tests/test_my_module.py
  • 包含参数化测试用例与异常路径覆盖
  • 验证生成的测试能否通过:

    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 核心定位差异

    维度Claude CodeHermes Agent
    核心定位 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

    Email

    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 分支保护规则中设置:

  • 进入 GitHub 仓库 Settings → Branches → Add rule
  • Branch name pattern:main 或 master
  • 勾选 Require status checks to pass before merging
  • 在搜索框中选择 Hermes PR Review
  • 点击 Save changes
  • 这样,任何未通过 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] 原创不易,欢迎点赞、收藏、转发

    赞(0)
    未经允许不得转载:171主机测评 » 【Hermes:实战场景】34、开发自动化:代码审查、测试、日报、周报全自动——7×24 小时的 AI 开发者助手
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址