关于 speccheck
speccheck 将调用方提供的规格需求与 Issue、PR 和代码声明进行核对。它在不访问网络或代码仓库的情况下,报告覆盖情况、声明数量、悬空引用和结论。
主要功能
- 01核查需求覆盖情况
- 02支持 Issue、PR 和代码声明
- 03检测悬空声明
- 04提供覆盖数和结论
- 05本地 CLI 与输入校验
适用场景
- 01检查规格条目是否有实现声明
- 02查找指向不存在需求 ID 的声明
- 03发布前审查需求覆盖情况
- 04通过 JSON 在本地运行核查
MCP 相关
向 MCP 客户端提供 `check_spec_coverage` 工具。客户端传入需求和声明,工具返回已覆盖与未覆盖条目、悬空声明、数量及结论。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 1 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| claims | array | 是 | 声称某个 issue、拉取请求或代码引用对应某项需求的声明 |
| requirements | array | 是 | 规范中的需求 |
详细介绍
speccheck
规范只有在实际落实它的工作完成后才有价值。需求被写下,问题被提交,拉取请求被合并,代码被提交——而在这一堆工作中,“规范要求做什么”与“声称已完成什么”之间的对应关系,会悄然腐化。speccheck 会审计这种对应关系。你提供规范中的需求,以及针对这些需求提出的声明,它会报告哪些需求已覆盖、哪些未覆盖、哪些声明指向不存在的需求,以及每项需求收到了多少条声明。
不会获取任何内容。只要至少一条声明提到了某项需求的 id,该需求就算已覆盖;声明来源可以是问题、拉取请求或代码引用,重复声明都会计数——三个问题都声称解决了同一项需求,这个事实值得在计数中体现,而不是作为重复项去重。若声明提及的 id 不属于任何需求,则该声明为悬空声明:它会按原样完整回显,并保持声明到达时的顺序,且不计入任何地方——既不计入覆盖情况,也不计入任何需求的总数。这通常意味着需求已重命名或存在拼写错误;无论是哪种情况,都应该由规范所有者发现,而不是让工具猜测。
判定结果会用一个词概括报告。如果每项需求都有声明,则规范为 fully_covered。否则,覆盖率百分比——已覆盖需求数除以需求总数,四舍五入到最接近的整数——决定判定结果:80 及以上为 mostly_covered,50 及以上为 partial,低于 50 则为 sparse。判定结果始终附带计数,因此无需盲目相信这个词。
格式错误的输入会产生一条指出出错路径的验证错误,不会返回部分结果:requirements 必须是非空对象数组,每个对象都必须包含非空的 id 和 text;需求 id 必须唯一(重复时会指出该 id 并报错);claims 必须是对象数组,可以为空,每个对象都必须包含非空的 requirement_id 和 source_ref,以及值为 issue、pr 或 code 的 source_kind。未知的额外字段会被忽略。整个计算是纯粹的本地操作:不会联网,不需要配置,也不会读取或触碰任何代码仓库。
CLI
npx @reneturcios/speccheck check --input args.json
npx @reneturcios/speccheck --version
args.json 包含完整的参数对象:
{
"requirements": [
{ "id": "REQ-1", "text": "Users can sign in with a passkey" },
{ "id": "REQ-2", "text": "Sessions expire after 24 hours" },
{ "id": "REQ-3", "text": "Admins can revoke any session" }
],
"claims": [
{ "requirement_id": "REQ-1", "source_kind": "pr", "source_ref": "PR #412" },
{ "requirement_id": "REQ-1", "source_kind": "issue", "source_ref": "issue #388" },
{ "requirement_id": "REQ-2", "source_kind": "code", "source_ref": "src/session.ts" },
{ "requirement_id": "REQ-9", "source_kind": "issue", "source_ref": "issue #401" }
]
}
结果会以 JSON 格式打印:
{
"covered": ["REQ-1", "REQ-2"],
"uncovered": ["REQ-3"],
"dangling_claims": [
{ "requirement_id": "REQ-9", "source_kind": "issue", "source_ref": "issue #401" }
],
"claim_counts": { "REQ-1": 2, "REQ-2": 1, "REQ-3": 0 },
"coverage_percent": 67,
"verdict": "partial",
"requirement_count": 3,
"claim_count": 4
}
claim_counts 会为每项需求提供一个条目,包括计数为零的需求;键的顺序与需求提供时的顺序一致。退出代码:成功时为 0,发生运行时错误时为 1(包括输入文件无法读取或无效,以及输入无效),用法错误时为 2。
MCP 服务
npx -y @reneturcios/speccheck mcp
MCP 客户端配置:
{
"mcpServers": {
"speccheck": {
"command": "npx",
"args": ["-y", "@reneturcios/speccheck", "mcp"]
}
}
}
工具
-
check_spec_coverage— 根据调用方提供的需求和声明事实,验证问题、拉取请求或代码是否声明解决了规范中的需求。requirements(数组,必填,至少 1 项)— 规范中的需求;每项都是包含非空id和text的对象,且 id 必须唯一claims(数组,必填,可以为空)— 声明某个问题、拉取请求或代码引用解决了某项需求;每项都是包含非空requirement_id、值为issue、pr或code的source_kind,以及非空source_ref的对象
返回
{covered, uncovered, dangling_claims, claim_counts, coverage_percent, verdict, requirement_count, claim_count}。
Docker
docker run -i ghcr.io/cloudcorprecords/speccheck
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/speccheck 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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。