mcpField
C
cidiff

cidiff

本地服务
github.com/CloudCorpRecords版本控制03 天前更新

关于 cidiff

cidiff 是一个 CLI 和 MCP 服务,用于比较拉取请求头部与基准提交上的 CI 证据。它会分类失败和其他检查状态,在证据缺失或不稳定时避免臆断,帮助开发者判断问题是否由该 PR 引入。

主要功能

  1. 01比较 PR 头部与基准提交的检查
  2. 02分类新引入、既有、外部、已修复和待处理检查
  3. 03合并检查运行记录与旧式提交状态
  4. 04标记不稳定结果和证据不足
  5. 05提供 CLI 与 JSON 报告

适用场景

  1. 01排查拉取请求中的失败检查
  2. 02区分新故障与既有 CI 问题
  3. 03根据新引入的失败设置 CI 门禁
  4. 04比较两个提交之间的 CI 运行

MCP 相关

MCP 服务提供 `diff_pr_ci`,用于分类拉取请求检查;以及 `diff_ci_runs`,用于直接比较头部和基准 SHA。两者均返回分类报告。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"cloudcorprecords-cidiff": {
"command": "npx",
"args": [
"-y",
"@reneturcios/cidiff"
]
}
}
}
启动命令npx -y @reneturcios/cidiff

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@reneturcios/cidiff0.1.2
ocighcr.io/cloudcorprecords/cidiff:0.1.2

工具

2

收录的工具列表 · 更新于 2 天前

参数类型必填说明
prnumber是拉取请求编号
repostring是采用 owner/repo 格式的仓库,例如 usebruno/bruno

详细介绍

cidiff

这些 CI 失败中,哪些确实是你的问题?

一个 PR 上有 12 项检查失败,通常只有一个是真正的问题。其他失败可能在基础分支上就已存在,属于部署预览服务,或者正在等待维护者批准工作流运行。如今,你得先后点击 PR 和基础分支上的每项检查,再逐一对照,才能弄清楚原因。

cidiff 会为你完成这项对比。它会读取 PR 头部提交和基础提交上的检查运行及提交状态,并对每项检查进行分类:

类别含义
introduced基础分支上通过,头部提交上失败。这项需要由 PR 修复
pre-existing头部提交和基础分支上都失败,且检查名称相同
external托管或部署预览服务(Vercel、Netlify、Cloudflare 等,根据检查名称匹配),或正在等待维护者批准的检查(action_required)
fixed基础分支上失败,头部提交上通过;或者头部提交运行了其他检查,但该项检查已消失
passing头部提交上通过
indeterminate检查失败,但没有可用的基础分支证据来确认具体情况
pending头部提交的运行尚未完成

存在新引入的失败时,退出代码为 1;否则为 0,因此可以直接用于 CI 门禁或维护者的分类脚本。

诚实原则

cidiff 从 Greenlight 中的 CI 分类功能提取而来。在一次扫描中,它对 46 个未关闭 PR 中的 89 项失败检查进行了分类,发现没有新引入的失败。要确保这个结果准确,就必须拒绝猜测:

  • 没有基础分支证据,就标记为无法判定,绝不妄下结论。 如果头部提交上的检查失败,但没有基础分支运行记录,就会报告为无法证实,不论结果对你是否有利。
  • 只有头部提交实际运行过检查,基础分支上的失败才会被标记为“已修复”。 第一天针对真实的派生仓库 PR(usebruno/bruno #9569)进行试用时,我们发现了这个陷阱:PR 的检查套件卡在 action_required,等待维护者批准工作流,因此头部提交没有任何检查运行记录。简单的差异比较工具会把基础分支上的所有失败都报告为已修复,并把基础分支上的所有通过都报告为通过。cidiff 会检测头部提交上没有检查运行记录的情况,读取检查套件,并通过清晰的警告说明:CI 尚未在此头部提交上运行,因此目前还无法对这些失败进行分类。
  • 旧版提交状态也算作证据。 Snyk、CodeRabbit 和较早的 CI 系统通过 Statuses API 而不是检查运行上报状态。cidiff 会合并两者;名称冲突时,以实际检查运行记录为准。
  • 先分类外部阻碍。 Vercel 预览失败并不代表测试失败,等待维护者批准的检查也不代表代码有问题。这两种情况都会在进行任何基础分支比较之前标记为外部问题。
  • 不稳定的证据不能用于归因。 如果同一提交上同一项检查的已完成运行结果不一致(相同代码有时通过、有时失败),则该检查不稳定。如果比较结论依赖不稳定一侧的单次结果(新引入、既有、已修复),cidiff 会将其标记为无法判定并暂不下结论,同时在报告中标记 flaky 并记录尝试次数;如果最新结果是通过,则保留通过结论并标记该项。文本报告会在 [FLAKY] 行列出不稳定的检查。

用法

CLI
# Classify a PR's checks against its base
npx @reneturcios/cidiff pr usebruno/bruno 9569

# Machine readable output
npx @reneturcios/cidiff pr owner/repo 123 --json

# Compare two commits directly
npx @reneturcios/cidiff runs owner/repo --head <sha> --base <sha>

输出示例(上述派生仓库 PR 案例的真实输出):

cidiff usebruno/bruno PR #9569: 0 introduced, 0 pre-existing, 0 external, 0 fixed, 6 indeterminate, 0 pending, 2 passing
  [WARNING] No check runs on head commit 885c6fafed1e (only 2 commit status(es)). The workflow system has produced no evidence to diff against; base check failures below are indeterminate, not fixed.
  [WARNING] 3 check suite(s) on the head commit are action_required: CI is waiting on maintainer approval to run (typical for fork PRs). The failures cannot be classified until CI actually runs.
  [INDETERMINATE] Unit Tests (Linux): Failing on base, and the head commit has no check runs, so there is nothing to compare. CI may not have run on the head yet
  [PASSING] CodeRabbit, security/snyk (Bruno)
Verdict: no introduced failures. Any failing checks are pre-existing, external, or unproven either way (indeterminate).

明确说明已知限制:基础分支比较使用 PR 基础提交(PR 对象中存储的基础分支尖端)所记录的检查证据,并按完全相同的名称匹配检查。重命名的检查会被视为一项移除和一项新增。输出中会清楚显示这两项限制,不会隐藏它们。

设置 GITHUB_TOKEN,以获得更高的 GitHub API 认证速率限制。访问公开仓库不需要其他凭据。

MCP 服务

添加到你的 MCP 客户端配置中:

{
  "mcpServers": {
    "cidiff": {
      "command": "npx",
      "args": ["-y", "@reneturcios/cidiff", "mcp"]
    }
  }
}

工具:

  • diff_pr_ci:提供仓库和 PR 编号,返回完整的分类报告(JSON)。
  • diff_ci_runs:提供仓库以及头部和基础 SHA,执行相同的分类,但不需要 PR。
Docker
docker run -i ghcr.io/cloudcorprecords/cidiff mcp
docker run --rm ghcr.io/cloudcorprecords/cidiff pr owner/repo 123

工具包

cidiff 是同一作者计划打造的一系列小型单一用途开发者工具中的 Wave 1、package 2。它们都采用相同的构建方式:一个 bin 同时提供 CLI 和 MCP 服务,执行确定性检查并给出证据,不编造答案。它的同系列工具 shipcheck 用于验证已完成的发布,而它也会反过来验证 cidiff 自身的发布。

  • greenlight:开源贡献的预检:这个 issue 真的能合并吗?
  • shipcheck:发布验证:git tag、release、npm、MCP Registry 和 GHCR 必须保持一致,否则就是 NO-GO。
  • prwatch:开放 PR 的关注报告:当前有哪些事项需要你处理。
  • claimcheck:跟踪过期声明的状态,以及分叉仓库中搁置的修复。
  • gatefile:将隐藏的贡献门槛提取为机器可读的 contribution-gates.json。
  • pkgverdict:npm 软件包的安装前判定:GO、RISKY、FAKE 或 MISSING。

开发

npm install
npm run build
npm test   # 31 tests, classification logic runs on fixtures, no network

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。