关于 SpecForge
SpecForge 为软件团队和编码 Agent 提供确定性的规范检查。它验证结构化需求、关联测试与承诺,并指出尚未证明的内容;检查过程不使用 AI。
主要功能
- 01确定性 .spec 验证
- 02发现引用错误与缺失规则
- 03关联测试与需求
- 04收集证明覆盖情况
- 05通过扩展定义领域规则
适用场景
- 01验证 Agent 起草的规范
- 02追踪测试证明了哪些需求
- 03审查未解决或未证明的规则
MCP 相关
SpecForge 提供 MCP 工具,供客户端读取和检查项目规范。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
5 分钟内试用 · 工作原理 · 看看它如何发现问题 · 文档
60 秒内见分晓,无需 Agent。安装、创建项目、删掉一个字母,然后检查:
curl -fsSL https://raw.githubusercontent.com/leaderiop/SpecForge/main/install.sh | sh
mkdir sf-demo && cd sf-demo
specforge init --extensions @specforge/software # spec/hello.spec, which checks clean
sed -i.bak 's/\[user_logged_in\]/[user_loged_in]/' spec/hello.spec # drop one letter
specforge check
[E003] Error: unresolved reference 'user_loged_in' in entity 'authenticate_user'
20 │ produces [user_loged_in]
│ Help: did you mean 'user_logged_in'?
[W007] Warning: event 'user_logged_in' is not produced by any behavior
1 error, 1 warning, 0 infos
审核者阅读,检查给出结论。
问题所在
你让 AI Agent 为支付服务添加退款功能。它写出的代码整洁,测试通过,拉取请求看起来也没问题。两周后,财务部门发现一笔退款金额超过了被退款的支付金额。
这条规则明明写在规范里:一个位于 docs/、与 PRD 放在一起的 Markdown 文件。Agent 可能三次会话前读过它,也可能根本没找到。因为一切看起来都正常,所以没人发现问题。
这不是模型的问题,而是规则存放位置的问题。如今,重要的知识都放在没有任何机制强制执行的地方:
- Markdown 中的规范(PRD、
docs/*.md、spec-kit 文件)都是散文。Agent 可能误读或悄悄跳过某条规则,也没有任何机制检查规范是否完整或各部分是否一致。 - 文档和 Wiki会与代码脱节,即使发生这种情况,也不会触发任何故障。
- 可追溯性(哪个需求有测试、哪条规则在哪里强制执行)依赖某人手动更新的电子表格,直到他们不再更新。
- **每次会话都从零开始。**Agent 会重新阅读几十个文件,试图弄清你的意思,却还是会猜错。
你交给 AI 的工作越多,情况就越糟。它写代码的速度超过任何人的审核速度。
理念:硬技能,而非软技能
教 AI 如何按照团队的方式工作,有两种方法。
软技能是放在 AI 上下文中的建议:Markdown 规范、PRD、技能文件。它有帮助,但本质上是散文。AI 可能遵循,也可能不遵循。
硬技能是由程序强制执行的规则。AI 无法跳过它,因为检查会失败。
| 软技能 Markdown 规范、PRD、技能文件 | 硬技能 SpecForge 扩展 | |
|---|---|---|
| 存放位置 | AI 的上下文窗口中,以散文形式呈现 | 编译器中,以代码形式呈现 |
| AI 能忽略它吗? | 能,而且不会有提示 | 不能:检查会失败 |
| 两次得到相同结论? | 不一定 | 一定。内部没有 AI |
| 知道缺少什么吗? | 不能 | 能:断开的链接、未强制执行的规则、未经测试证明的承诺 |
| 如何共享? | 在文件间复制 | 像库一样进行版本管理和安装 |
**SpecForge 是用于硬技能的工具。**你(或者更常见的是,你的 Agent)将必须满足的条件写入小型结构化 .spec 文件。SpecForge 会像编译器检查代码一样检查这些文件:每个引用都必须指向真实内容,每条规则都必须由某种机制强制执行,每个承诺都必须由测试证明。然后,它会将检查结果作为上下文提供给你的 Agent。
可以把它看作用于检查你意图的类型检查器。
工作原理
- 你描述想要什么,就像现在一样,通过对话进行。
- 你的 Agent 起草规范:操作、必须始终成立的规则、事件,以及每一项的证明方式。
- SpecForge 检查草稿。 错别字、无人执行的规则、缺失的内容:检查会失败,并指出确切行号和修正提示,随后由 Agent 修正。这一步不涉及 AI。相同的输入,每次都会得到相同的判定。
- 你的 Agent 根据已检查的规范进行构建。 它向 SpecForge 请求所需的确切部分,而不是重新读取你的代码库。
- 你的测试证明规范。 每项测试都会注明它证明了什么。
specforge collect会运行测试,并记录哪些内容已得到证明,哪些还没有。 - 你进行审查。 你不必阅读 Agent 写下的每一行,而是查看做出了哪些承诺、哪些已得到证明,以及还有哪些尚未解决。
看看它如何发现问题
你的 Agent 为退款功能起草了以下内容:
invariant refund_within_capture "Refunds never exceed the captured amount" {
risk high
verify unit "rejects a refund larger than the captured amount"
}
invariant refund_needs_reason "Every refund records a reason" {
guarantee "A refund without a reason is rejected"
risk medium
verify unit "rejects a refund with no reason"
}
behavior issue_refund "Refund a captured payment" {
category command
invariants [refund_within_capture]
produces [refund_isued]
contract "Given a captured payment, refunds up to the captured amount"
verify unit "refunds the requested amount"
}
event refund_issued "A refund was issued" {
verify unit "is emitted once per refund"
}
读起来没问题。以下是 specforge check 的检查结果:
相同输出的文本形式
[E003] Error: unresolved reference 'refund_isued' in entity 'issue_refund'
╭─[ refunds.spec:15:15 ]
15 │ produces [refund_isued]
│ Help: did you mean 'refund_issued'?
[W003] Warning: invariant 'refund_needs_reason' is not enforced by any behavior
[W007] Warning: event 'refund_issued' is not produced by any behavior
[E006] Error: invariant 'refund_within_capture' is missing required field 'guarantee'
2 errors, 2 warnings, 0 infos
人类审查者可能会漏掉的四个问题:
| 代码 | 发现的问题 | 重要原因 |
|---|---|---|
E003 | 事件名称中有一个字母拼错 | 退款代码会发布一个无人监听的事件 |
W003 | 一条没有任何内容执行的规则 | 在文档中,这条规则只会被搁置在那儿。这里会发出警告,直到有内容执行它为止 |
W007 | 一个没有任何内容产生的事件 | 同一个错字,只是从另一面看 |
E006 | 一条有名称却没有保证的规则 | “退款金额永远不会超过已捕获的金额”无法检查,直到明确说明 什么 永远不会超过 什么 |
错误总会导致检查失败。使用 specforge check --strict 时,警告也会导致检查失败;这正是你在 CI 中运行的命令。
Agent 修正全部四个问题后再次运行检查:0 errors, 0 warnings, 0 infos。此时规范内部一致,但还没有任何内容得到证明。这正是测试要做的事:每项测试都会注明它证明了哪项承诺,specforge collect 会运行测试,而 specforge review 会显示哪些内容已覆盖、哪些仍未解决。
你刚刚看到的每条规则都来自扩展,而非 SpecForge 本身(参见 硬技能是扩展)。
5 分钟上手
1. 安装。 SpecForge 是一个无需依赖的单文件可执行程序。
curl -fsSL https://raw.githubusercontent.com/leaderiop/SpecForge/main/install.sh | sh
其他安装方式
# Homebrew (once the tap is published)
brew install leaderiop/tap/specforge
# Prebuilt binary via cargo-binstall
cargo binstall --git https://github.com/leaderiop/SpecForge specforge-cli
# From source (stable Rust toolchain)
git clone https://github.com/leaderiop/SpecForge && cd SpecForge
cargo install --path crates/surfaces/cli
macOS、Linux 和 Windows 的预编译归档文件可在 Releases 页面获取。形式化证明(@specforge/formal)还需要将 z3 求解器加入 PATH;其他功能无需它也能正常运行。
2. 在你的仓库中创建项目:
specforge init --extensions @specforge/software
这会生成一个 specforge.json,并在 spec/ 中创建第一个文件。如果是 Cargo 或 vitest 项目,还会启用相应的测试运行器。
3. 连接你的 Agent。 SpecForge 支持 MCP,因此任何 MCP 客户端都能读取并检查你的规范。请使用绝对路径:
claude mcp add specforge -- specforge mcp /path/to/your/project
在 Cursor 中,单击一次即可为当前打开的项目(${workspaceFolder})添加它:
其他 MCP 客户端
{
"mcpServers": {
"specforge": { "command": "specforge", "args": ["mcp", "/path/to/your/project"] }
}
}
4. 让你的 Agent 编写规范。 例如:
在
spec/中为退款功能编写一份规范:说明其行为、绝不能违反的规则、发出的事件,以及证明每项内容的依据。使用 SpecForge 工具验证规范,并在展示给我之前修复所有错误。
5. 亲自查看结果。
specforge check # is the spec consistent?
specforge review # what is still unproven?
6. 关联测试。 每项测试都会说明它证明了哪个实体。在 Rust 中(使用 specforge-test crate):
use specforge_test::prelude::*;
#[specforge_test(behavior = "issue_refund", verify = "refunds the requested amount")]
fn refunds_the_requested_amount() { /* ... */ }
在 vitest 中:
test('refunds the requested amount',
{ meta: { specforge: { behavior: 'issue_refund', verify: 'refunds the requested amount' } } },
() => { /* ... */ })
然后运行 specforge collect。它会先征求一次许可,再运行你的测试命令,并记录每项测试证明的内容。请参阅 Rust 和 vitest 指南。
我必须学习一种新语言吗?
你需要阅读它,因为规范是由你审批的内容。但你很少需要编写它:你的 Agent 会编写和修复文件,而检查结果会告诉它哪里有误。
它的设计便于阅读。每个块只表示一项内容,包含类型、名称、标题和字段,就像填写好的表单:
invariant refund_within_capture "Refunds never exceed the captured amount" {
guarantee "The sum of refunds on a payment never exceeds the captured amount"
risk high
}
它与……有何不同?
| 你已在使用 | 它擅长的事 | SpecForge 能补充什么 |
|---|---|---|
| Markdown 中的规范和 PRD | 向人和 Agent 描述意图 | SpecForge 会取代它们:将相同意图写入 .spec 文件,并验证其结构。无效引用、缺失内容和未经证明的承诺都会导致检查失败 |
CLAUDE.md、AGENTS.md | 为 Agent 编写编码规则:约定、命令、风格 | 无需替换。把编码规则保留在那里;系统必须实现的内容,也就是规范,放在 SpecForge 中 |
| 测试 | 证明代码能完成某些事情 | 说明每项测试证明了哪项承诺,以及哪些承诺完全没有测试 |
| Issue 跟踪工具 | 跟踪进行中的工作 | 跟踪系统必须实现的内容,以及这些内容是否已得到证明 |
| 需求管理工具(DOORS、Polarion) | 为受监管团队提供可追溯性 | 将纯文本保存在仓库中,在 CI 中检查,便于 Agent 阅读,并可由你扩展 |
| 代码生成器 | 根据模型编写代码 | 无需替换。SpecForge 从不编写你的代码,而是由你的 Agent 根据 SpecForge 已检查的意图来编写 |
硬技能是扩展
SpecForge 本身不了解支付、软件或任何其他领域。规范中的每个词(behavior、invariant、event)以及每条规则(“不变量必须由行为强制执行”)都来自某个扩展。扩展是一种以代码打包的硬技能:它包含一套词汇,以及用于判定这些词汇的规则。
以下扩展内置于二进制文件中:
| 扩展 | 可描述的内容 |
|---|---|
@specforge/software | 行为、必须遵守的规则(不变量)、事件、类型和接口(端口) |
@specforge/product | 功能、用户角色、用户旅程、里程碑、版本发布,以及团队的词汇 |
@specforge/governance | 决策、约束和失效模式 |
@specforge/formal | 由 SMT 求解器证明或证伪的性质和公理 |
@specforge/cargo-test、@specforge/vitest | 哪些测试证明了哪些实体 |
使用 specforge add @specforge/product 启用扩展。完整列表见扩展清单。若要编写自己的硬技能,请参阅扩展 SpecForge。
未来方向
软件领域优先,是因为如今 AI 在这里编写的内容最多。但引擎本身有意不内置任何领域。它适用于任何专业知识都有规则且错误代价高昂的领域:受监管的软件(IEC 62304、GAMP 5)、制药质量(批次放行、偏差)和安全工程。在这些领域,“AI 起草,硬技能检查,合格人员签字”并非一句口号,而是工作必须遵循的方式。这些领域的扩展正在开发中,目前尚未内置。
此外,计划支持 Agent 通过类型化操作编辑规范,这样无论是人还是 AI,都不必手动编写 .spec 文本。
SpecForge 不是什么
- 不是 AI。 它不会调用模型。它是用 Rust 编写的确定性编译器。
- 不是代码生成器。 它检查意图,代码由你的 Agent 编写。
- 不是测试框架。 你的测试仍然由
cargo test或 vitest 运行。只有在你批准命令后,SpecForge 才会运行测试,并记录测试证明的内容。
了解更多
- 编写教程:从零开始编写
.spec文件,包含一个完整示例、一本指南、最佳实践和故障排除。 - Rust 测试追踪和vitest 测试追踪:将测试关联到它们所证明的实体。
- 形式化验证:由 SMT 求解器检查规范,并在确切位置提供反例。
- 快速参考:在一页中列出所有命令、实体类型和诊断代码。
- 愿景:宣言、原则和北极星。
- 架构、crate 结构图和贡献指南:了解 SpecForge 的构建方式、各 crate 的职责,以及如何参与开发。
- 文档中心:实体参考、可追溯链和研究资料。
许可证
你可以选择根据 Apache License, Version 2.0 或 MIT license 许可本项目。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。