mcpField
S
SpecForge

SpecForge

本地服务
github.com/leaderiop开发工具39今天更新

关于 SpecForge

SpecForge 为软件团队和编码 Agent 提供确定性的规范检查。它验证结构化需求、关联测试与承诺,并指出尚未证明的内容;检查过程不使用 AI。

主要功能

  1. 01确定性 .spec 验证
  2. 02发现引用错误与缺失规则
  3. 03关联测试与需求
  4. 04收集证明覆盖情况
  5. 05通过扩展定义领域规则

适用场景

  1. 01验证 Agent 起草的规范
  2. 02追踪测试证明了哪些需求
  3. 03审查未解决或未证明的规则

MCP 相关

SpecForge 提供 MCP 工具,供客户端读取和检查项目规范。

配置

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

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
mcpbspecforge-mcp-0.1.0-rc1-aarch64-apple-darwin.mcpb
mcpbspecforge-mcp-0.1.0-rc1-x86_64-apple-darwin.mcpb
mcpbspecforge-mcp-0.1.0-rc1-aarch64-unknown-linux-gnu.mcpb
mcpbspecforge-mcp-0.1.0-rc1-x86_64-unknown-linux-gnu.mcpb

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

SpecForge。将团队的专业知识转化为 AI 无法跳过的规则。AI 起草,SpecForge 检查,你来签字。

5 分钟内试用 · 工作原理 · 看看它如何发现问题 · 文档

一份规范写着退款行为会产生“refund_isued”,少了一个字母。specforge check 因 E003 未解析引用而失败,提示:你是不是想写“refund_issued”?修正这一个字母后:0 个错误、0 个警告、0 条提示。

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 无法跳过它,因为检查会失败。

一个循环动画。退款规则最初是 docs/refunds.md 中的建议。Agent 将其写成 spec/refund.spec 中的不变量。specforge check --strict 失败:W003,不变量 refund_within_capture 未被任何行为强制执行,Agent 因而受阻。specforge explain W003 提示,应从必须维持该不变量的行为中引用它。Agent 为 issue_refund 添加 invariants [refund_within_capture],检查通过,结果为 0 个错误、0 个警告、0 条提示,Agent 从不确定变得确信。

软技能
Markdown 规范、PRD、技能文件
硬技能
SpecForge 扩展
存放位置AI 的上下文窗口中,以散文形式呈现编译器中,以代码形式呈现
AI 能忽略它吗?能,而且不会有提示不能:检查会失败
两次得到相同结论?不一定一定。内部没有 AI
知道缺少什么吗?不能能:断开的链接、未强制执行的规则、未经测试证明的承诺
如何共享?在文件间复制像库一样进行版本管理和安装

**SpecForge 是用于硬技能的工具。**你(或者更常见的是,你的 Agent)将必须满足的条件写入小型结构化 .spec 文件。SpecForge 会像编译器检查代码一样检查这些文件:每个引用都必须指向真实内容,每条规则都必须由某种机制强制执行,每个承诺都必须由测试证明。然后,它会将检查结果作为上下文提供给你的 Agent。

可以把它看作用于检查你意图的类型检查器。

工作原理

围绕已检查规范的六步循环:1 描述(你),2 起草(你的 Agent),3 检查(SpecForge,将错误和修正建议反馈给草稿),4 构建(你的 Agent),5 验证(你的测试,通过 collect),6 审查(你)。

  1. 你描述想要什么,就像现在一样,通过对话进行。
  2. 你的 Agent 起草规范:操作、必须始终成立的规则、事件,以及每一项的证明方式。
  3. SpecForge 检查草稿。 错别字、无人执行的规则、缺失的内容:检查会失败,并指出确切行号和修正提示,随后由 Agent 修正。这一步不涉及 AI。相同的输入,每次都会得到相同的判定。
  4. 你的 Agent 根据已检查的规范进行构建。 它向 SpecForge 请求所需的确切部分,而不是重新读取你的代码库。
  5. 你的测试证明规范。 每项测试都会注明它证明了什么。specforge collect 会运行测试,并记录哪些内容已得到证明,哪些还没有。
  6. 你进行审查。 你不必阅读 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 的检查结果:

specforge check 检查草稿时报告 E003 未解决的引用“refund_isued”,并提示是否想写“refund_issued”;W003 不变量“refund_needs_reason”未被任何行为执行;W007 事件“refund_issued”未由任何行为产生;E006 不变量“refund_within_capture”缺少必需字段“guarantee”。Agent 应用修正后,第二次运行报告 0 个错误、0 个警告、0 条提示。

相同输出的文本形式
[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 collect 运行测试:三项通过,因此 issue_refund、refund_within_capture 和 refund_needs_reason 的覆盖状态变为 1/1。refund_issued 没有测试证明“每笔退款只发出一次”,因此仍未覆盖,为 0/1:4 项承诺中覆盖了 3 项,还有一项承诺尚无测试。

你刚刚看到的每条规则都来自扩展,而非 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})添加它:

将 SpecForge 添加到 Cursor

其他 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 核心;核心负责解析、链接和检查,不了解任何领域,包括软件、产品、治理、形式化、测试运行器,以及你自己的领域,例如制药质量、医疗器械或安全案例。

以下扩展内置于二进制文件中:

扩展可描述的内容
@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 才会运行测试,并记录测试证明的内容。

了解更多

许可证

你可以选择根据 Apache License, Version 2.0 或 MIT license 许可本项目。

评论

支持 Markdown

第一次接触 MCP?

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

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