---
title: "Ernesto：Claude Code 的 QA 编程伙伴"
canonical: https://wavect.io/zh/tools/ernesto-claude-code/
language: zh
description: "认识 Claude Code 编程伙伴 Ernesto。开启可选 QA 模式后，可查看测试结果、后续代码变更，以及仍未验证的内容。"
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

Claude Code 模组 · 0.1.0

# Claude Code 编程伙伴 Ernesto

Claude 说完成了。Ernesto 想先看看测试。

Ernesto 是 Claude Code 的小型动画伙伴。开启可选 QA 模式后，他会显示受支持的测试结果、记录的检查范围，以及最近一次代码状态比较的信息。

[安装 Ernesto](#ernesto-install) [查看源代码](https://github.com/wavect/ernesto)

![Ernesto，Wavect 的青绿色编程伙伴](/img/ernesto/ernesto-sarcastic_hu_7ee93acc1f09652a.webp)Claude Code 模组 · 0.1.0

公开发布版本

## 阅读结果时，代码可能已经变了。

0.1.0 的真实终端运行录像，使用虚构的本地算术测试。运行时和辅助程序的字节与已发布标签一致。下方浏览器状态是独立的模拟预览，选择状态不会运行测试。

### 文字稿

本视频记录 macOS 26.5.1 上 Claude Code 2.1.296 CLI 的真实终端输出，使用 Ernesto 0.1.0、Node 24.3.0 和 Vitest 4.1.11。示例是虚构的本地算术测试。终端单元格忠实呈现，证据面板和伙伴栏经过裁切，停顿时间缩短。辅助程序在独立本地进程中显式运行。没有发送模型提示或调用模型。快照匹配仅描述显示的比较时间点的已审核输入，不涵盖外部服务，也不保证执行过程防篡改。

伙伴模式默认关闭 QA。

显式启动的本地 Vitest 辅助程序记录了一个所选测试的通过结果。

修改源代码后，之前的通过结果变为过期。

新的真实测试运行失败，宿主界面显示失败结果。

巧克力改变伙伴的心情，但失败的测试证据保持不变。

了解 QA 的四种状态

展开示例，了解结果含义和下一步操作。这些仅为说明示例，不会在浏览器中运行测试。

### 尚无记录

尚未记录受支持的结果。未知不等于通过。

### 查看示例

说明示例 · 一项本地检查

**结果**
尚无运行记录
**代码快照**
尚未捕获快照

**下一步:** 主动运行已配置的检查，以记录结果。

### 已记录通过

配置的检查在记录的代码状态下通过了其声明范围。这只说明该次检查。

### 查看示例

说明示例 · 一项本地检查

**结果**
一项已配置的检查通过
**代码快照**
声明的输入在上次比较时一致

**下一步:** 查看检查范围。通过仅说明该项检查覆盖的内容。

### 结果已过期

检查后，一项记录的输入发生变化。之前的通过结果仍是历史记录。请主动重新运行检查。

### 查看示例

说明示例 · 一项本地检查

**结果**
先前的一次运行通过
**代码快照**
运行后某项已捕获的输入发生了变化

**下一步:** 使用变更后的输入重新运行检查。先前的通过结果属于历史记录。

### 检查失败

配置的检查已失败。其他检查和验收标准仍需分别评估。

### 查看示例

说明示例 · 一项本地检查

**结果**
一项已配置的检查失败
**代码快照**
已记录失败运行的快照

**下一步:** 查看失败原因，修复代码后重新运行检查。

## 给开发过程添一点个性，无需配置项目。

让 Ernesto 陪你编程。需要安静时，可以隐藏他、关闭评论或减少动画。

## QA 模式需要单独启用。

伙伴模式无需项目测试集成。QA 模式请依照已发布源码文档配置本地辅助程序和受支持的运行器。由你决定何时运行测试。模组读取其记录，不会悄悄启动测试。

## 了解结果真正覆盖的范围。

可选 QA 模式读取一个工作区内受支持的结构化结果，将声明的输入和配置与捕获的状态进行比较。最近一次比较一致，不代表每个文件、依赖项、外部服务或业务要求都已测试。

## 安装、更新与移除

第三方代码以你的用户权限运行。安装前请检查源码、能力和要求。Ernesto 是 Wavect 独立开发的模组，不代表获得 Anthropic 推荐。

组合式终端命令要求 Claude Code 2.1.292 或更高版本；会话命令要求 2.1.275，并需确认来源。模组可能要求更新且已验证的主机版本。

### 系统终端

```
claude plugin install ernesto --marketplace wavect/ernesto
```

复制命令

### Claude Code 会话内

```
/plugin install ernesto --marketplace wavect/ernesto
```

复制命令

### 明确的两步备用方式

```
claude plugin marketplace add wavect/ernesto
claude plugin install ernesto@ernesto
```

复制命令

### 更新

已验证的 rc.1 到 0.1.0 更新先运行 `claude plugin marketplace update ernesto` ，再运行 `claude plugin update ernesto@ernesto --scope user` 。请使用安装时的作用域，之后重新加载插件或重启会话。尚未测试升级到后续版本。

```
claude plugin update ernesto@ernesto
```

复制命令

### 卸载

```
claude plugin uninstall ernesto@ernesto
```

复制命令

### 移除市场（可选）

```
claude plugin marketplace remove ernesto
```

复制命令

安装和卸载默认使用用户作用域。请匹配安装时选择的作用域。修改后重新加载插件或重启会话。第三方市场默认关闭自动更新。移除市场也会卸载来自该市场的插件。删除前分别检查 Ernesto 偏好设置、QA 辅助程序配置与本地记录，并保留项目文件。

[Claude Code 安装文档](https://code.claude.com/docs/en/plugins/install)

## 兼容性需要实际验证。

下表列出此版本实际测试过的主机、操作系统与运行器版本。仅支持这些组合。网站翻译不代表模组界面支持四种语言。普通 Claude 聊天和 Cowork 不显示 Code 模组界面。

Ernesto for Claude Code 0.1.0

Claude Code: 2.1.296

- CLI terminal · macOS 26.5.1, Apple M3 Pro, arm64 · 2.1.296
- Vitest (Node 24.3.0) · 4.1.11

## 隐私与限制

已审计的已发布版本运行时不会新增模型调用、遥测或外部网络请求。Claude 和你选择执行的测试仍遵循各自的网络、数据处理和费用规则。显式运行的辅助程序保存标量摘要和快照描述，项目测试可以生成自己的文件。其他本地进程可以修改证据。Ernesto 不是沙箱，也不是独立审计工具。 强制终止可能留下不完整的标量文件，模组会拒绝此类文件。

## 代码与图像的授权分别处理。

源代码采用 MIT 许可证。Wavect 保留美术素材和商标权利：根据单独的 ASSET_LICENSE.md 条款，允许在插件中展示素材、制作演示截图，以及注明 Wavect 的插件再分发。其他素材用途需要 Wavect 许可。Claude 访问和测试基础设施可能有各自的要求和费用。

MIT (source code) · Wavect artwork rights retained; plugin display and attributed redistribution permitted; see ASSET_LICENSE.md

## 安装前常见问题

### Ernesto 是什么？

Ernesto 是 Wavect 为 Claude Code 开发的伙伴模组，结合了趣味界面与可选的测试结果记录功能。

### Ernesto 会自动运行测试吗？

不会。由你决定何时运行已配置的本地集成。模组只读取受支持的记录，不会悄悄启动测试或安装工具。

### 结果“已过期”是什么意思？

记录的输入或检查配置已不再与上一次观察到的结果一致。该结果仍可作为历史记录，但不能代表修改后的代码已经接受了新检查。

### 测试通过是否代表代码可以直接上线？

不代表。结果只说明一次特定检查及其范围。未测试的行为、外部状态与业务验收仍需分别评估。

### Ernesto 可以在哪些环境中使用？

下表列出此版本实际测试过的主机、操作系统与运行器版本。仅支持这些组合。网站翻译不代表模组界面支持四种语言。普通 Claude 聊天和 Cowork 不显示 Code 模组界面。

### Ernesto 免费吗？

源代码采用 MIT 许可证。Wavect 保留美术素材和商标权利：根据单独的 ASSET_LICENSE.md 条款，允许在插件中展示素材、制作演示截图，以及注明 Wavect 的插件再分发。其他素材用途需要 Wavect 许可。Claude 访问和测试基础设施可能有各自的要求和费用。

### 可以卸载 Ernesto 吗？

安装和卸载默认使用用户作用域。请匹配安装时选择的作用域。修改后重新加载插件或重启会话。第三方市场默认关闭自动更新。移除市场也会卸载来自该市场的插件。删除前分别检查 Ernesto 偏好设置、QA 辅助程序配置与本地记录，并保留项目文件。

## 除了伙伴，还需要独立 QA？

可见的检查结果帮助你提出更准确的问题。发布决策仍需要独立测试、代码审查与人工验收。

[了解独立软件 QA](/zh/services/software-quality-assurance/) [联系 Wavect](/zh/contact/)

## 由 Wavect 开发 · 参考资料

- [认识 Wavect 吉祥物 Ernesto](/zh/ernesto/)
- [了解 Claude Mods 与 function hooks](/zh/blog/claude-mods-function-hooks/)
- [查看源代码](https://github.com/wavect/ernesto)
- [版本说明](https://github.com/wavect/ernesto/releases/tag/v0.1.0)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/zh/tools/ernesto-claude-code/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-10-14",
      "datePublished": "2026-10-14",
      "description": "认识 Claude Code 编程伙伴 Ernesto。开启可选 QA 模式后，可查看测试结果、后续代码变更，以及仍未验证的内容。",
      "inLanguage": "zh",
      "mainEntity": {
        "@id": "https://wavect.io/tools/ernesto-claude-code/#software"
      },
      "name": "Claude Code 编程伙伴 Ernesto",
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/zh/tools/ernesto-claude-code/"
    },
    {
      "@id": "https://wavect.io/tools/ernesto-claude-code/#software",
      "@type": "SoftwareApplication",
      "datePublished": "2026-10-14",
      "description": "认识 Claude Code 编程伙伴 Ernesto。开启可选 QA 模式后，可查看测试结果、后续代码变更，以及仍未验证的内容。",
      "license": {
        "@type": "CreativeWork",
        "name": "MIT (source code)"
      },
      "name": "Ernesto for Claude Code",
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "softwareVersion": "0.1.0",
      "url": "https://wavect.io/tools/ernesto-claude-code/"
    },
    {
      "@id": "https://wavect.io/tools/ernesto-claude-code/#software#source",
      "@type": "SoftwareSourceCode",
      "codeRepository": "https://github.com/wavect/ernesto",
      "license": {
        "@type": "CreativeWork",
        "name": "MIT (source code)"
      },
      "name": "Ernesto for Claude Code",
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "targetProduct": {
        "@id": "https://wavect.io/tools/ernesto-claude-code/#software"
      }
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/",
      "name": "首页",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/tools/",
      "name": "工具",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/zh/tools/ernesto-claude-code/",
      "name": "Claude Code 编程伙伴 Ernesto",
      "position": 3
    }
  ]
}
```
