codecov-coverage · git:20260905.751659e · 2026-09-05 · sha256 10bb6d9498fc043a

codecov-coverage git:20260905.751659eA

Immutable. This exact content never changes and is served at /api/v1/blob/10bb6d9498fc043a.

---
name: codecov-coverage
description: 在需要查询 Codecov 仓库、PR、提交、patch 或文件覆盖率,比较覆盖率变化,或诊断 codecov/project、codecov/patch 等覆盖率检查失败时使用。
allowed-tools: >-
  Bash(command -v:*) Bash(npm install -g mcporter:*) Bash(mcporter:*)
  Bash(npx -y mcporter:*) Bash(bash scripts/codecov-*:*)
  Bash(git remote get-url:*) Bash(git rev-parse:*) Bash(jq:*)
---

# Codecov 覆盖率

通过 `npx -y mcporter` 调用 `@egulatee/mcp-codecov`,查询 Codecov 覆盖率数据。默认只读,不修改 Codecov 或仓库数据。

## 何时使用

- 查看仓库整体覆盖率
- 分析 PR 的 base/head/patch 覆盖率影响
- 查看某个提交的覆盖率详情
- 查看某个文件的逐行覆盖率
- 比较两个分支、标签或提交之间的覆盖率变化
- 诊断 `codecov/project`、`codecov/patch`、flag 或 component 覆盖率检查失败

## 前置条件

- Node.js >= 18
- `mcporter` 可用;若用户说 `mcpporter`,按 `mcporter` 处理,因为 npm 包与可执行名都是 `mcporter`
- `jq` 可用;封装脚本依赖 `jq` 解析和格式化 JSON
- `CODECOV_TOKEN` 已设置,且必须是 Codecov API 访问令牌,不是上传令牌

获取令牌:<https://app.codecov.io/account> -> API 访问令牌。

若本机缺少 `mcporter`,先安装:

```bash
npm install -g mcporter
```

如果缺少 `jq`,提示用户安装 `jq` 后再继续。普通覆盖率查询缺少令牌时立即停止并提示用户配置,不要猜测或降级到网页抓取。诊断 GitHub 上的 Codecov 检查时,可以先读取连接器已提供的检查摘要;只有摘要足以支持结论时才能继续,否则仍需 Codecov API 访问令牌。

## 安全边界

- 永远不要输出 `CODECOV_TOKEN` 的值
- 不硬编码 owner/repo;封装脚本仅支持从 GitHub 远端自动检测,无法检测时让用户指定
- 只执行查询类操作,不修改 Codecov 上的任何数据
- 不把覆盖率下降直接定性为阻塞,除非用户或项目规则明确要求

## 推荐调用方式

优先使用 `scripts/` 下的封装脚本;脚本会处理令牌检查、owner/repo 检测和输出格式化。

```bash
# 仓库覆盖率
bash scripts/codecov-repo.sh [--owner OWNER] [--repo REPO] [--branch BRANCH] [--json]

# PR 覆盖率影响
bash scripts/codecov-pr.sh <PR_NUMBER> [--owner OWNER] [--repo REPO] [--json]

# commit 覆盖率
bash scripts/codecov-commit.sh [SHA] [--owner OWNER] [--repo REPO] [--json]

# 覆盖率对比
bash scripts/codecov-compare.sh <BASE> <HEAD> [--owner OWNER] [--repo REPO] [--json]

# 文件逐行覆盖率
bash scripts/codecov-file.sh <FILE_PATH> [--owner OWNER] [--repo REPO] [--ref REF] [--json]
```

## 原始 mcporter 调用

需要更细粒度控制时,直接调用 MCP 工具:

```bash
npx -y mcporter call \
  --stdio "npx -y @egulatee/mcp-codecov" \
  --env CODECOV_TOKEN="$CODECOV_TOKEN" \
  --name codecov \
  get_repo_coverage \
  owner:OWNER repo:REPO
```

可用工具:

- `get_repo_coverage owner: repo: [branch:]`
- `get_commit_coverage owner: repo: commit_sha:`
- `get_pull_request_coverage owner: repo: pull_number:`
- `get_file_coverage owner: repo: file_path: [ref:]`
- `compare_coverage owner: repo: base: head:`

## Codecov 检查失败诊断

1. 从 PR 或提交上下文确认失败的检查名称、来源分支提交 SHA 和详情 URL。优先使用可用的 GitHub 连接器,不把 `gh` CLI 作为默认入口。
2. 根据检查类型补齐 Codecov 数据:
   - `codecov/project`:查询仓库、提交和 PR 覆盖率,确认整体覆盖率是否低于项目阈值。
   - `codecov/patch`:查询 PR 覆盖率并比较 base/head;需要定位具体缺口时再查询变更文件覆盖率。
   - flag/component:确认失败状态对应的 flag 或 component,不用仓库总覆盖率替代它。
3. 将失败归入一个可验证类别:
   - 覆盖率确实低于阈值。
   - base、来源分支版本或 upload 数据缺失/尚未处理完成。
   - 提交 SHA、分支或 PR 映射不一致。
   - flag/component 没有对应报告或配置不匹配。
4. 只有日志、检查摘要或 Codecov API 数据能够直接支持时才下结论。需要本地覆盖率验证时遵循仓库测试规则,不主动运行未获授权的测试命令。
5. Codecov 数据不足时明确列出缺失项,不把普通测试通过等同于覆盖率门槛应当通过。

## 参数解析

`owner` 和 `repo` 按以下顺序解析:

1. 命令行 `--owner` / `--repo`
2. 当前目录 `git remote get-url origin`(仅支持 GitHub 远端自动解析)
3. 无法解析时停止并提示用户显式指定

`commit_sha` 必须使用完整或可解析的十六进制 SHA;若 Codecov 返回找不到提交,要求用户提供完整 40 位 SHA 再重试。

## 故障处理

- `CODECOV_TOKEN 未设置`:普通查询提示用户执行 `export CODECOV_TOKEN="..."`;检查诊断可先使用 GitHub 连接器摘要,但数据不足时必须停止,不要输出令牌
- `401 Unauthorized`:令牌无效或过期,提示重新生成 API 访问令牌
- `404 Not Found`:检查 owner/repo 是否正确、仓库是否已接入 Codecov、目标 ref 是否有覆盖率数据
- `commit_sha not found`:使用完整 40 位提交 SHA
- `jq: command not found`:提示安装 `jq`,不要继续执行封装脚本

## 输出要求

- 默认给中文摘要,包含覆盖率百分比和关键变化
- 百分比保留 Codecov 返回精度;需要手动计算时保留两位小数
- 涉及 PR 时说明 base/head/patch 三类覆盖率
- 涉及文件时优先指出未覆盖行或覆盖率最低的文件
- 涉及失败检查时说明检查类型、失败阈值或缺失数据,以及支持结论的来源
- 结论中区分事实与建议,不要把覆盖率变化夸大成业务风险

## 冒烟检查

```bash
bash scripts/codecov-repo.sh --help
bash scripts/codecov-pr.sh --help
bash scripts/codecov-commit.sh --help
bash scripts/codecov-compare.sh --help
bash scripts/codecov-file.sh --help
bash -n scripts/_common.sh scripts/codecov-*.sh
python3 ../_shared/lint-skills.py
```

预期:help 命令不需要 `CODECOV_TOKEN`;未设置 `CODECOV_TOKEN` 时执行查询类命令应明确报错且不泄露令牌。