关于 approvepath
approvepath 将 PR 修改文件映射到 CODEOWNERS 负责人,并根据提供的评审历史找出常见评审者。它仅使用本地输入,按明确的一组 CODEOWNERS 匹配规则计算,不查询代码仓库或托管 API。
主要功能
- 01按顺序匹配 CODEOWNERS 规则
- 02按最后匹配规则确定负责人
- 03按文件统计常见评审者
- 04列出无负责人文件和所需评审者
- 05提供带路径信息的输入校验
适用场景
- 01确定 PR 中各文件的负责人
- 02查找曾评审变更文件的人员
- 03查看哪些变更文件没有负责人
MCP 相关
MCP 服务提供 `map_approvals`,接收 CODEOWNERS 规则、变更文件和可选的评审历史,并返回文件负责人、常见评审者、无负责人文件及所需评审者。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| reviews | array | 否 | 过往审查活动(可选):{reviewer, files} |
| codeowners | array | 是 | 按文件顺序排列的 CODEOWNERS 规则:{pattern, owners} |
| changed_files | array | 是 | PR 变更的文件路径 |
详细介绍
approvepath
CODEOWNERS 文件会指出谁应该批准一项更改。 审核历史则会显示谁实际参与审核。approvepath 会针对一个拉取请求并列展示两者:你向它提供 CODEOWNERS 规则、PR 涉及的文件,以及已有的审核活动,它就会针对每个文件返回规则指定的所有者,以及此前审核过该具体文件的人。
模式匹配遵循固定的 CODEOWNERS 语义子集,因此结果不会受你设想的 CODEOWNERS 方言影响。比较前,会从模式和文件路径中去掉任何开头的 /。以 / 结尾的模式是目录前缀:它匹配该目录下的所有文件。包含 * 的模式是 glob,必须匹配整个路径——** 匹配包括 / 在内的任意字符序列,而单个 * 匹配不含 / 的任意字符序列。其他模式会匹配与其完全相同的文件,或其下级文件(以该模式加 / 为前缀);因此,单独的目录名会覆盖其整个子树。
如果有多条规则匹配同一个文件,则以文件中最后一条匹配规则为准——这与 CODEOWNERS 本身采用的覆盖规则一致,也正因如此,较早的宽泛规则可以将一个子树交给某个团队,而之后较窄的规则又能将其中一部分交还。如果某个文件没有匹配任何规则,则该文件没有所有者:其 owners 列表为空,pattern 为 null,并按输入顺序出现在 unowned_files 中。
审核历史按实际记录统计。对于每个更改的文件,frequent_reviewers 会统计每位审核者提供的审核条目中,准确列出该文件的次数——不按前缀匹配,也不按目录匹配。审核者按次数降序、名称升序排列,且只返回排名前三位。required_reviewers 汇总 PR 中所有生效规则的全部所有者,去重并排序,这是对“这个 PR 实际需要谁批准?”最简洁且准确的回答。
所有计算都仅依据传入的参数在本地完成:不会读取代码仓库,不会调用托管服务 API,也不会进行任何猜测。格式错误的输入——例如模式为空的规则、不是非空字符串的更改文件,或缺少 reviewer 的审核条目——会产生验证错误并指出有问题的路径,不会返回部分结果。
CLI
npx @reneturcios/approvepath map --input args.json
npx @reneturcios/approvepath --version
args.json 包含完整的参数对象:
{
"codeowners": [
{ "pattern": "src/", "owners": ["@core"] },
{ "pattern": "src/api/", "owners": ["@api-team", "sam"] }
],
"changed_files": ["src/api/handler.ts", "README.md"],
"reviews": [
{ "reviewer": "sam", "files": ["src/api/handler.ts"] },
{ "reviewer": "lee", "files": ["src/api/handler.ts"] }
]
}
reviews 为可选项,默认值为 []。结果以 JSON 格式打印:
{
"files": [
{
"file": "src/api/handler.ts",
"owners": ["@api-team", "sam"],
"pattern": "src/api/",
"frequent_reviewers": [
{ "reviewer": "lee", "reviews": 1 },
{ "reviewer": "sam", "reviews": 1 }
]
},
{
"file": "README.md",
"owners": [],
"pattern": null,
"frequent_reviewers": []
}
],
"unowned_files": ["README.md"],
"required_reviewers": ["@api-team", "sam"]
}
退出代码:成功时为 0,发生运行时错误时为 1(包括输入文件无法读取或无效,以及输入无效),用法错误时为 2。
MCP 服务
npx -y @reneturcios/approvepath mcp
MCP 客户端配置:
{
"mcpServers": {
"approvepath": {
"command": "npx",
"args": ["-y", "@reneturcios/approvepath", "mcp"]
}
}
}
工具
-
map_approvals— 映射拉取请求的审批路径。codeowners(数组,必需,可以为空)— 按文件顺序排列的 CODEOWNERS 规则;每个条目为{pattern, owners},其中pattern是非空字符串,owners是由非空字符串组成的数组(可以为空)changed_files(字符串数组,必需,不能为空)— PR 更改的文件路径reviews(数组,可选,默认值为[])— 过去的审核活动;每个条目为{reviewer, files},其中reviewer是非空字符串,files是字符串数组(可以为空)
返回
{files, unowned_files, required_reviewers},其中files按输入顺序为每个更改的文件包含一个{file, owners, pattern, frequent_reviewers}条目。
Docker
docker run -i ghcr.io/cloudcorprecords/approvepath
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/approvepath map --input /w/args.json
开发
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (pure local, no network)
npm run dev # run the CLI from source
许可证
MIT — 版权所有 (c) 2026 Rene Turcios
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。