关于 linkedcheck
linkedcheck 根据 PR 文本、提交信息、目标 issue 标题和变更文件,检查 PR 是否确实支持其关闭声明。它结合关闭关键词与文件路径中的标题词匹配,给出关联强度判断,且仅处理提供的文本和路径。
主要功能
- 01扫描 PR 与提交中的关闭引用
- 02区分提及与关闭声明
- 03匹配 issue 标题词和文件路径
- 04输出四类关联判断
- 05纯本地校验输入
适用场景
- 01审核 PR 是否真正解决目标 issue
- 02发现有关闭声明但缺少范围证据的 PR
- 03从变更文件检查标题词重合
MCP 相关
作为 MCP 服务,提供 check_pr_issue_link 工具;客户端提交 PR 文本、issue 信息、变更文件及可选提交信息,以获取关联判断和匹配词。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pr_body | string | 是 | 拉取请求正文文本 |
| issue_title | string | 是 | PR 声称要关闭的问题的标题 |
| issue_number | integer | 是 | PR 声称要关闭的问题编号 |
| changed_files | array | 是 | PR 变更的文件路径 |
| commit_messages | array | 否 | PR 的提交消息(可选) |
详细介绍
linkedcheck
描述中写着“fixes #123”的拉取请求 提出的是一个主张,而不是证明。它修改的文件可能 与该问题毫无关系,而在一长串待审请求中快速浏览的审阅者 也没有简单的方法判断这是真正的关联,还是一厢情愿。linkedcheck 会根据两项独立信号核验 这一主张:PR 本身的文字,以及其差异的范围。
第一项信号是文本中的关联。首先扫描 PR 正文,
然后按顺序扫描每条提交消息,查找关闭引用:以下关闭关键词之一:close、
closes、closed、fix、fixes、fixed、resolve、
resolves 或 resolved(不区分大小写,且必须是完整
单词),后面可以有空白字符,再接 #<issue_number>。
编号必须是完整标记,因此 #12 不会被视为对 issue 123 的引用,而 #1234 也不会。任何单独出现的 #<issue_number>,无论是否带关键词,都算作提及;关闭引用也始终算作提及。
第二项信号是范围。issue 标题会转换为小写,
并按 [a-z0-9] 以外字符组成的连续片段拆分;长度不足 3 个字符的标记和固定停用词列表
(the、a、an、in、on、of、for、to、when、
with、and、or、is、are、be、by、at、as、
it、this、that)会被删除。剩余部分即为标题中的词项。每个变更文件路径也会用相同方式进行标记化,而 matched_terms 是同时出现在文件标记中的词项排序列表——因此,关于登录重定向的问题与 src/login/redirect.ts 匹配,是实际的重叠,而非文字上的巧合。
这两项信号合并为一个判定:
linked— 存在关闭引用,且至少有 一个词项匹配。weak— 存在关闭引用,但没有词项 匹配:提出了主张,却没有范围证据支持。mentioned_only— 提及了该 issue,但没有 关闭关键词声称要解决它。unlinked— 既没有关闭引用,也没有 提及。
格式错误的输入——缺少 pr_body 或其值不是字符串、issue_number 不是大于或等于 1 的整数、缺少 issue_title,或其值为空或不是字符串、缺少 changed_files 列表,或其值不是数组,或其中包含非字符串或空条目,或者 commit_messages 的值不是字符串数组——会导致验证错误,并指出出错路径;不会返回部分结果。计算是纯本地的:不访问网络、不需要配置,也不会读取仓库——linkedcheck 只检查你提供的文本和路径。
命令行界面
npx @reneturcios/linkedcheck check --input args.json
npx @reneturcios/linkedcheck --version
args.json 包含完整的参数对象:
{
"pr_body": "Fixes #123",
"issue_number": 123,
"issue_title": "Fix login redirect loop",
"changed_files": ["src/login/redirect.ts"],
"commit_messages": []
}
结果以 JSON 格式打印:
{
"verdict": "linked",
"closing_reference": true,
"mentioned": true,
"matched_terms": ["login", "redirect"],
"term_count": 4
}
退出代码:成功时为 0,发生运行时错误(包括输入文件无法读取或无效,或输入无效)时为 1,用法错误时为 2。
MCP 服务
npx -y @reneturcios/linkedcheck mcp
MCP 客户端配置:
{
"mcpServers": {
"linkedcheck": {
"command": "npx",
"args": ["-y", "@reneturcios/linkedcheck", "mcp"]
}
}
}
工具
-
check_pr_issue_link— 验证拉取请求是否确实解决了它声称要关闭的问题。pr_body(字符串,必填,可为空)— 拉取 请求正文文本issue_number(整数,必填,至少为 1)— PR 声称要关闭的 issue 编号issue_title(字符串,必填,不可为空)— PR 声称要关闭的 issue 标题changed_files(字符串数组,必填,可为空)— PR 修改的文件路径commit_messages(字符串数组,可选, 默认值为[])— PR 的提交消息
返回
{verdict, closing_reference, mentioned, matched_terms, term_count},其中term_count是 issue 标题中不同词项的数量,而matched_terms是其中在变更文件中找到的词项子集,按排序排列。
Docker
docker run -i ghcr.io/cloudcorprecords/linkedcheck
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/linkedcheck check --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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。