OpenSpec 教程:CLI 安装、命令、AGENTS.md 与实战示例
在 Windows、macOS 和 Linux 安装 OpenSpec
2026 年 10 月 26 日更新:npm 的 latest 已发布 1.15.0。独立程序不需要 Node.js;npm 包需要 Node.js 20.19.0+。选择一种安装方式即可,平台要求见官方安装文档。
Windows PowerShell 使用官方独立程序安装脚本:
irm https://raw.githubusercontent.com/Fission-AI/OpenSpec/main/scripts/binary/install.ps1 | iex
macOS 或 Linux 使用:
curl -fsSL https://raw.githubusercontent.com/Fission-AI/OpenSpec/main/scripts/binary/install.sh | sh
这些命令执行 main 分支上的官方安装器,下载发布版二进制并核对 SHA256SUMS,不是编译 main。要固定二进制版本,先在当前 shell 设置环境变量 OPENSPEC_VERSION=v1.15.0。Windows 默认安装到 %LOCALAPPDATA%\Programs\openspec 并加入用户 PATH;macOS 和 Linux 默认安装到 ~/.local/bin。安装后打开新终端。
已有 Node.js 和 pnpm 时,也可以选择发布包:
node --version
pnpm add -g @fission-ai/[email protected]
openspec --version
固定安装成功后,最后一条命令应输出 1.15.0。不想全局安装,可运行 pnpm dlx @fission-ai/[email protected] --version。dlx 成功不代表裸命令 openspec 已经可用。
排查找不到命令或版本不对
Windows 先检查匹配到的程序,再直接运行独立程序:
Get-Command openspec -All
where.exe openspec
& "$env:LOCALAPPDATA\Programs\openspec\openspec.exe" --version
完整路径能运行、裸命令找不到时,重新打开终端并检查用户 PATH。裸命令输出旧版本时,通常是较早的 PATH 项或 shell 别名选中了另一份程序。pnpm 安装可用 pnpm bin -g 找到全局可执行目录;缺少 global bin 的错误需要修复 pnpm 设置,练习期间可先使用 dlx。
macOS 或 Linux 使用:
command -v openspec
which -a openspec
"$HOME/.local/bin/openspec" --version
按实际安装位置补充 shell 的 PATH。使用 nvm 或 fnm 时,先确认当前 Node 版本,因为全局包可能属于另一个版本;版本管理器的 shim 也可能需要刷新。确定程序归哪个安装方式管理后,再处理重复副本。
按原安装方式升级和卸载
openspec version --check 查询更新。pnpm 安装使用 pnpm add -g @fission-ai/openspec@latest 升级,再进入每个项目运行 openspec update,刷新已配置工具的集成文件并检查差异。选择 CLI 包版本和更新项目指令是两个步骤。
独立程序重新运行安装器即可升级。openspec install 会把包管理器安装切换为独立程序,并提示如何移除旧副本;操作后在新终端确认实际选中的可执行文件。
卸载 pnpm 安装用 pnpm remove -g @fission-ai/openspec。独立程序只删除已核实安装路径下的可执行文件和对应 PATH 项。没有 openspec uninstall 命令。需要保留规格历史时,留下 openspec/specs/ 和 openspec/changes/archive/;卸载 CLI 不要求删除项目文档。
按任务查 OpenSpec CLI 命令
下面是 1.15.0 的终端命令,请在目标项目中执行。没有全局安装时,把 openspec 前缀换成 pnpm dlx @fission-ai/[email protected]。
| 任务 | 命令 | 检查什么 |
|---|---|---|
| 确认版本 | openspec --version | 当前运行的版本 |
| 查参数 | openspec new change --help | 当前安装版本支持的选项 |
| 不生成助手文件地初始化 | openspec init . --tools none | openspec/ 结构和配置 |
| 创建变更 | openspec new change add-magic-link-login | 变更目录,不是完整提案 |
| 列出变更 | openspec list --json | 活跃变更 |
| 检查产物状态 | openspec status --change add-magic-link-login --json | 文档状态,不是应用测试结果 |
| 取得提案指令 | openspec instructions proposal --change add-magic-link-login --json | 模板与依赖 |
| 验证增量 | openspec validate add-magic-link-login --strict --json --no-interactive | 验证结果与退出码 |
| 查看主规范 | openspec show auth --type spec | 主规范内容 |
| 归档已评审的工作 | openspec archive add-magic-link-login | 归档位置和主规范更新 |
/opsx:propose、/opsx:apply 应输入助手聊天框,不是 PowerShell 或 Bash。调用形式因集成而异,例如 Codex 使用 $openspec-propose 这样的技能名;以实际生成的文件为准,不要假设所有工具使用同一套斜杠命令。完整选项见1.15.0 CLI 参考。
多个代码仓库共享规范时,接着看Stores 双仓库流程。1.15.0 发布包包含 Stores,但功能仍标为 Beta;npm 的 beta 标签是另一条分发渠道,使用 Stores 不需要安装它。
OpenSpec 快速开始
以下练习保留 1.13.2 固定版本,方便已有读者复现,不直接替换原命令。相同的 proposal、delta、design 和 tasks 也已在 1.15.0 下验证。可下载的 CLI 检查脚本只执行本地文件流程,不调用模型;安装器和助手实施需要单独验证。
本文使用 npm 已发布的 OpenSpec 1.13.2,需要 Node.js 20.19.0+ 和 pnpm。验证环境为 Node.js 26.7.0、pnpm 10.28.2;在仓库外空目录验证文件工作流,没有调用模型。先进入新建的练习目录,再运行:
pnpm dlx @fission-ai/[email protected] --help
pnpm dlx @fission-ai/[email protected] init . --tools none
--tools none 只初始化规范目录,不安装编码助手集成。熟悉生成文件后,再决定如何引入现有项目。定义、适用边界和文件关系见OpenSpec 独立指南;本教程专门完成第一个变更。
什么是 OpenSpec?
OpenSpec 是一个面向 AI 原生的规范驱动开发系统。在实际使用中,它为你的 AI 编码工作流提供了持久化的结构:你不再需要让 Agent 去”直接实现这个功能”,而是将预期的变更描述为一个提案,验证规范,让 Agent 依据规范实现,最后将已完成的变更归档回主要的知识源。
这使得 OpenSpec 在棕地项目中尤为实用:在现有代码库中,大多数工作并非从零重写,而是持续不断的 Bug 修复、功能迭代、重构和产品变更。
如果你想对比更广泛的方案,可以阅读 SDD 比较文章:BMAD vs spec-kit vs OpenSpec vs PromptX。本教程仅聚焦于 OpenSpec 的日常使用。
什么时候应该使用 OpenSpec?
当你希望 AI 编码 Agent 以更高的确定性运行、减少提示漂移时,请使用 OpenSpec。
适合的场景:
- 你已有一个可运行的代码库,希望 AI 辅助变更更加安全。
- 你需要一个轻量级的规范工作流,而不想引入繁重的企业级流程。
- 你希望清晰记录改了什么、为什么改、哪些需求被更新了。
- 你使用多种 AI 工具,希望共享项目指令。
- 你希望评审者在代码生成之前,先评估意图和验收标准。
对于一次性的临时原型,OpenSpec 并非必须。但当一个仓库需要持续积累可靠的决策时,它的价值就体现出来了。
安装或运行 OpenSpec CLI
npm 包名为:
@fission-ai/openspec
使用 pnpm 运行固定版本:
pnpm dlx @fission-ai/[email protected] --help
CLI 入口命令为 openspec。后文速查表与可选 AGENTS.md 示例中的裸命令,要求已经单独安装同版本 CLI;否则都使用 pnpm dlx @fission-ai/[email protected] 前缀:
openspec --help
顶级帮助包含如下命令:
init 在项目中初始化 OpenSpec
update 更新 OpenSpec 指令文件
list 列出变更或规范
view 显示交互式仪表板
new change 创建新的变更目录
validate 验证变更和规范
show 显示某个变更或规范
archive 归档已完成的变更并更新主规范
status 显示制品完成状态
instructions 输出增强的制品/任务指令
在项目中初始化 OpenSpec
如果希望交互选择编码工具,在目标项目根目录执行下面的命令。它是练习中 --tools none 的替代选项,不是必须再次初始化:
pnpm dlx @fission-ai/[email protected] init .
如果你想以非交互方式配置 AI 工具,使用 --tools:
pnpm dlx @fission-ai/[email protected] init . --tools claude,codex,cursor,gemini,github-copilot
也可以使用:
pnpm dlx @fission-ai/[email protected] init . --tools all
pnpm dlx @fission-ai/[email protected] init . --tools none
CLI 帮助中目前列出了众多支持的工具,包括 claude、codex、cursor、gemini、github-copilot、kilocode、qwen、windsurf、cline、continue、opencode、roocode、trae 等。
OpenSpec 核心工作流
一个简单的 OpenSpec 循环如下:
- 初始化 OpenSpec 到仓库。
- 为一个功能、Bug 修复或重构创建一个变更。
- 在实现之前撰写提案和规范增量。
- 验证变更。
- 让 AI Agent 依据已批准的变更实现代码。
- 评审并测试代码。
- 归档已完成的变更,使主规范保持最新。
本教程采用先评审规范,再实现代码的项目约定。OpenSpec 的产物工作流可以反复修改:实现中发现新约束时,返回更新 proposal、delta、design 和 tasks,再次验证。CLI 不强制不可回头的线性顺序。
创建新的 OpenSpec 变更
使用 openspec new change <name>:
pnpm dlx @fission-ai/[email protected] new change add-user-login
可以附带描述:
pnpm dlx @fission-ai/[email protected] new change add-user-login \
--description "Add email/password login with session persistence"
已发布的 1.13.2 中,new change --help 列出:
--goal <text> 随变更存储的可选目标元数据
--schema <name> 使用的工作流 schema,默认:spec-driven
--json 以 JSON 格式输出
不要把旧 workspace 示例中的 --areas、--initiative 复制到此版本。--goal 仍然有效,但它是可选元数据,不是必需的工作区配置。判断参数时使用同版本帮助,不混用 npm 发布包与官方 main。
好的变更名称应该具体且面向行动:
add-user-login
fix-billing-retry-idempotency
refactor-search-indexing
improve-onboarding-empty-state
避免模糊的名称:
updates
misc-fixes
new-stuff
ai-work
示例:棕地功能变更
假设你在维护一个 SaaS 应用,想添加魔法链接登录功能。
创建变更:
pnpm dlx @fission-ai/[email protected] new change add-magic-link-login --description "Allow users to sign in with one-time email magic links"
然后在编码之前定义意图。一个好的提案需要回答:
- 这解决了什么用户问题?
- 哪些现有流程受到影响?
- 什么必须保持向后兼容?
- 验收标准是什么?
- AI Agent 不应该修改什么?
将下面内容保存为 openspec/changes/add-magic-link-login/proposal.md。上面的命令只生成元数据和带描述的 README,不会自动补齐 proposal 与 delta。示例保留工具模板的英文结构标题,解释与评审使用中文:
# Change: add-magic-link-login
## Why
本例假定用户忘记密码,支持团队频繁收到重置请求。希望在保留现有密码登录的同时,增加一次性邮件链接供已有用户使用;不把注册或账户恢复扩展到本次变更中。
## What Changes
- 添加魔法链接请求表单。
- 发送一次性邮件 token。
- 验证 token 并创建会话。
- 保持现有的邮箱/密码登录不变。
## Capabilities
### New Capabilities
- `auth`:在密码登录之外提供一次性链接登录。
### Modified Capabilities
- 无。练习项目尚无现存 auth 规范。
## Impact
认证路由、token 存储、邮件发送和登录测试。
## Non-goals
- 不删除密码登录。
- 不重新设计整个认证页面。
- 不修改账单或账户设置。
## Acceptance criteria
- 有效链接只能让用户登录一次。
- 过期或已使用的链接安全失败。
- 现有密码登录测试仍然通过。
真实项目如果已有 auth 规范,需要先检查原文:已有需求可能应使用 MODIFIED,而不是再添加一个 ADDED。本练习特意从没有主 auth 规范的目录开始。
补齐实际的规范增量文件
创建 openspec/changes/add-magic-link-login/specs/auth/ 目录,把下列完整内容保存为 openspec/changes/add-magic-link-login/specs/auth/spec.md:
## Purpose
Allow existing users to sign in with a single-use email link while preserving the existing password sign-in flow.
## ADDED Requirements
### Requirement: Single-use magic-link sign-in
The system SHALL allow an existing user to sign in with a valid, unexpired, unused email link, consume it atomically, and reject expired or reused links without creating a session.
#### Scenario: Valid link
- **WHEN** an existing user submits a valid, unexpired, unused link
- **THEN** the system creates a session and marks the link as used
#### Scenario: Expired link
- **WHEN** a user submits an expired link
- **THEN** the system rejects it without creating a session
#### Scenario: Reused link
- **WHEN** a user submits a previously used link
- **THEN** the system rejects it without creating a session
### Requirement: Preserve password sign-in
The system SHALL retain the existing email and password sign-in behavior.
#### Scenario: Existing password login
- **WHEN** an existing user submits correct email and password credentials
- **THEN** the system signs the user in through the existing flow
两条需求分别要求一次性链接登录和保留密码登录;四个场景覆盖有效、过期、已使用的链接,以及原有密码登录。## ADDED Requirements、### Requirement:、#### Scenario: 是解析器识别的结构,示例保留英文标记和 SHALL。提案里的验收列表不能替代这个文件。格式验证也不能证明 token 消费确实具有原子性。
补齐设计和实施任务
保存为 openspec/changes/add-magic-link-login/design.md:
## Context
增加魔法链接登录,保留现有密码登录。
## Goals / Non-Goals
只支持已有用户;注册、账单和页面重新设计不在范围内。
## Decisions
保存随机 token 的哈希值、用户 ID、到期时间与使用状态。
先原子地消费未过期 token,再创建会话。
保留密码流程,使用本地邮件测试替身。
## Risks / Trade-offs
非原子消费可能让并发请求重放 token。
需要覆盖过期、重用和并发请求的应用测试。
## Migration Plan
使用功能开关引入 token 存储;关闭后仍保留密码登录。
保存为 openspec/changes/add-magic-link-login/tasks.md:
## 1. Implementation
- [ ] 1.1 添加 token 存储和请求端点,使用本地邮件测试替身。
- [ ] 1.2 实现原子 token 消费与会话创建。
## 2. Verification
- [ ] 2.1 测试有效、过期、重用和并发提交 token 的情况。
- [ ] 2.2 运行现有密码登录回归测试并检查变更差异。
文档齐备意味着可以评审,不代表功能已经交付。只有实现和测试有了证据,才勾选对应任务。检查 schema 产物状态:
pnpm dlx @fission-ai/[email protected] status --change add-magic-link-login --json
验证变更和规范
实现之前,运行验证:
pnpm dlx @fission-ai/[email protected] validate add-magic-link-login
更严格的检查:
pnpm dlx @fission-ai/[email protected] validate add-magic-link-login --strict --json --no-interactive
验证全部内容:
pnpm dlx @fission-ai/[email protected] validate --all
常用验证参数:
--all 验证所有变更和规范
--changes 验证所有变更
--specs 验证所有规范
--type <type> 在有歧义时指定变更或规范
--strict 启用严格验证模式
--json 以 JSON 格式输出验证结果
--no-interactive 禁用交互式提示
在 CI 中,--json 和 --no-interactive 特别有用:
pnpm dlx @fission-ai/[email protected] validate --all --strict --json --no-interactive
列出和检查 OpenSpec 条目
列出活跃变更:
pnpm dlx @fission-ai/[email protected] list
列出规范:
pnpm dlx @fission-ai/[email protected] list --specs
获取机器可读输出:
pnpm dlx @fission-ai/[email protected] list --json
显示某个变更或规范:
pnpm dlx @fission-ai/[email protected] show add-magic-link-login
以 JSON 格式显示:
pnpm dlx @fission-ai/[email protected] show add-magic-link-login --json
如果名称有歧义,指定类型:
pnpm dlx @fission-ai/[email protected] show add-magic-link-login --type change
对于变更评审自动化,--deltas-only 可能很有用:
pnpm dlx @fission-ai/[email protected] show add-magic-link-login --json --deltas-only
AGENTS.md 在 OpenSpec 中的角色
许多 AI 编码工具会读取仓库指令文件。AGENTS.md 已成为告知 Agent 如何在代码库中行为的通用约定。
OpenSpec 生成的是工具对应的 skills 和命令文件。例如,另一次 1.13.2 初始化选择 --tools claude 后,会生成 .claude/skills/openspec-propose/SKILL.md 和 .claude/commands/opsx/propose.md,不要求存在自动生成的 openspec/AGENTS.md。下面这些是可以手写的可选项目约束:
- 在阅读变更提案之前不要实现。
- 将实现范围限定在已批准的变更内。
- 在规范要求时更新测试和文档。
- 在声明任务完成之前运行验证。
- 只有在实现和评审都完成后才归档。
一个针对 OpenSpec 的 AGENTS.md 实用示例如下:
## OpenSpec 工作流
- 编码前,用 `openspec list` 检查活跃的 OpenSpec 变更。
- 对于新功能或行为变更,在 `openspec/changes/` 下创建或使用一个变更。
- 不要在功能变更中实现大范围的无关重构。
- 在交付实现前运行 `openspec validate <change-name> --strict`。
- 代码和测试通过后,使用 `openspec archive <change-name>` 归档。
AGENTS.md 的价值不在于它能神奇地让 AI 完美运行。它的价值在于,每个兼容的助手都从相同的操作契约出发。
使用 AI 编码 Agent 实现
一旦变更已撰写并验证,给 Agent 一条聚焦的指令:
实现 OpenSpec 变更 `add-magic-link-login`。
先阅读提案和规范增量。
将实现范围限定在此变更内。
运行相关测试,并报告任何与规范的偏差。
这比以下提示要好得多:
添加魔法链接登录。
OpenSpec 版本为 Agent 提供了持久的知识源、明确的边界和可评审的目标。
归档已完成的变更
在实现、评审和测试完成后,归档变更:
pnpm dlx @fission-ai/[email protected] archive add-magic-link-login
跳过确认提示:
pnpm dlx @fission-ai/[email protected] archive add-magic-link-login --yes
检查活跃变更已移至 openspec/changes/archive/YYYY-MM-DD-add-magic-link-login/,并确认 openspec/specs/auth/spec.md 已包含两条需求。随后验证主规范:
pnpm dlx @fission-ai/[email protected] validate auth --type spec --strict --json --no-interactive
本次在隔离目录使用上述文件验证了 init、new、严格验证和 archive,没有实现认证,也没有发送邮件。演练保留未勾选的应用任务,archive 会发出警告;归档成功不能证明这些任务完成。真实项目必须先完成实现、测试和任务状态更新,再归档,不应跳过验证来让示例通过。
delta 中的 ## Purpose 会在首次创建能力规范时提供用途说明。缺少它时,archive 可能生成占位文字,导致主规范严格验证失败;已有主规范的占位文字需要直接修改主规范。--skip-specs 只适用于确实无需更新规范的变更,本登录示例需要合并 delta,不能跳过。
OpenSpec 命令速查表
| 任务 | 命令 |
|---|---|
| 显示 CLI 帮助 | openspec --help |
| 初始化仓库 | openspec init . |
| 初始化并指定工具 | openspec init . --tools claude,codex,cursor |
| 创建变更 | openspec new change add-user-login |
| 列出活跃变更 | openspec list |
| 列出规范 | openspec list --specs |
| 显示变更或规范 | openspec show <name> |
| 验证单个条目 | openspec validate <name> |
| 严格验证 | openspec validate <name> --strict |
| 验证全部 | openspec validate --all --strict |
| 归档已完成变更 | openspec archive <name> |
| 归档(跳过提示) | openspec archive <name> --yes |
| 更新指令文件 | openspec update . |
OpenSpec 最佳实践
1. 保持每个变更足够小
当一个变更对应一个连贯的功能、Bug 修复或重构时,OpenSpec 效果最佳。如果一个提案包含了认证、定价、引导和重新设计,请拆分它。
2. 明确写出非目标
AI Agent 可能超出范围。非目标 章节让评审更容易发现范围变化,但它不是文件写入权限控制。
3. 实现前先验证
验证在 AI 编写代码之前捕获结构性问题。这比基于薄弱规范调试生成代码要便宜得多。
4. 使用 JSON 输出进行自动化
openspec list --json、openspec show --json 和 openspec validate --json 等命令在脚本和 CI 检查中非常有用。
5. 坚持归档
如果已完成的变更从不归档,仓库会积累过期的提案。归档步骤才能保证主规范与现实保持一致。
常见错误
错误:把 OpenSpec 当成文档仓库
OpenSpec 不仅仅是存放随机文档的地方。它是一个受控变更的工作流。
错误:创建一个巨大的变更
大型变更使 AI 实现难以评审。优先选择多个带有明确验收标准的小变更。
错误:跳过验证
如果规范无效,生成的代码可能会偏离。尽早验证。
错误:让 Agent 自行推断一切
不要让 Agent 猜测产品意图。撰写提案、定义非目标、明确验收标准。
OpenSpec vs spec-kit vs BMAD:快速定位
- OpenSpec:最适合轻量级、棕地、以变更为中心的工作流。
- GitHub spec-kit:更适合结构化的绿地或企业级门控流程。
- BMAD:在开发前需要基于角色的 AI 规划团队时有用。
- PromptX:更像一个上下文/角色平台,而非严格的规范工作流。
如果你的团队在问”我们如何在现有仓库中安全地使用 AI Agent?“,OpenSpec 是最实用的起点之一。
版本化参考资料
总结
OpenSpec 的价值在于,它将 AI 编码从纯聊天式活动转变为可评审的变更管理循环:
提案 -> 规范增量 -> 验证 -> 实现 -> 评审 -> 归档
这个循环很简单,但它解决了一个真实的问题:AI Agent 需要持久的上下文和明确的边界。OpenSpec 同时提供了这两者。