AI_OpenSpec
前言
Github:https://github.com/HealerJean
一、OpenSpec
1、基础定义与核心认知
1)OpenSpec 是什么
OpenSpec 是 AI 原生的「轻量规范驱动开发框架」,
核心定位:将口头需求、零散沟通转化为结构化、可落地、可追溯的正式规范文件,约束 AI 执行行为,保证人、AI、团队三方认知统一
核心理念:先定规范,再执行落地;所有变更同步生成文档,全流程可查阅、可追溯、可复盘
解决问题:
- 需求仅存在聊天记录中,换会话、换人员后信息断层,历史逻辑无人知晓
- AI 自由发挥,擅自增删功能、修改原有业务规则,偏离产品预期
- 迭代无正式记录,规则改动、逻辑调整无迹可查,问题复盘困难
- 产品、研发、测试对同一需求理解不一致,评审、沟通成本高
- 长期迭代后文档混乱,传统文档维护成本高,难以持续更新
2)诞生背景与应用价值
随着 AI 深度融入研发、产品、运维全流程,Prompt 工程、Harness 工程先后普及:
Prompt工程:优化指令话术,提升单次对话的输出质量,偏向单次临时交互Harness工程:搭建运行环境、行为护栏、校验闭环,约束AI长期工作行为,偏向运行层管控
但二者仍存在短板:需求传递无标准格式、迭代变更无正式存档、跨会话 / 跨人员协作易断层。
Harness 管过程不乱,OpenSpec 管内容不错,OpenSpec 在此基础上补齐需求与迭代标准化能力,形成完整的 AI 工程体系。
3)核心价值
- 认知统一:结构化规范作为唯一依据,产品、研发、AI 理解完全一致
- 降低返工:前置定义规则、边界、验收标准,减少落地后修改
- 全程追溯:所有需求、变更、设计、任务永久存档,支持问题复盘、历史查阅
- 轻量化落地:区别于传统重型
PRD、技术文档,精简冗余内容,聚焦核心规则,适配快速迭代 - 能力复用:规范模板、历史方案可复用,降低重复沟通与文档编写成本
2、OpenSpec 层级划分
完整链路:Prompt(指令)→ Harness(过程管控)→ OpenSpec(内容契约)
最佳实践:Harness 管住「做事的过程」,OpenSpec 管住「要做的内容」,双重保障 AI 协作质量。
1)Prompt 工程
定位:对话层指令优化
作用:打磨话术、示例、格式,让单次问答输出符合预期
特点:临时、单次、无存档、依赖沟通
2)Harness 工程
定位:运行环境与行为约束层
作用:搭建流程、护栏、校验、熵管理,管控 AI 全生命周期行为,防止失控、乱改架构、跳过流程
特点:长效、环境管控、保障执行过程合规稳定
3)OpenSpec
定位:需求与迭代契约层
作用:标准化需求、变更、设计、任务,定义「做什么、规则是什么、边界是什么、怎么验收」
特点:契约化、结构化、可追溯、保障执行内容不出错
二、整体架构
OpenSpec 将你的工作组织为两个主要区域:
┌────────────────────────────────────────────────────────────────────┐
│ openspec/ │
│ │
│ ┌─────────────────────┐ ┌───────────────────────────────┐ │
│ │ specs/ │ │ changes/ │ │
│ │ │ │ │ │
│ │ 单一事实来源 │◄─────│ 提议的修改 │ │
│ │ 描述系统当前的 │ 合并 │ 每个变更 = 一个文件夹 │ │
│ │ 工作方式 │ │ 包含制品 + 增量 │ │
│ │ │ │ │ │
│ └─────────────────────┘ └───────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────────┘
-
规范(
Specs) 是单一事实来源——它们描述系统当前的行为方式。 -
变更(
Changes) 是提议的修改——它们存在于独立的文件夹中,直到你准备好合并它们。
这种分离是关键。你可以并行处理多个变更而不会产生冲突。你可以在变更影响主规范之前进行审查。当你归档变更时,其增量会干净地合并到单一事实来源中。
1、规范(Specs)
1)目录结构
openspec/specs/
├── auth/
│ └── spec.md # 认证行为
├── payments/
│ └── spec.md # 支付处理
├── notifications/
│ └── spec.md # 通知系统
└── ui/
└── spec.md # UI 行为和主题
按领域组织规范——为你的系统创建有意义的逻辑分组。常见模式:
- 按功能区域:
auth/、payments/、search/ - 按组件:
api/、frontend/、workers/ - 按限界上下文:
ordering/、fulfillment/、inventory/
2)规范格式
一个规范包含需求,每个需求都有场景:
# 认证规范
## 目的
应用程序的认证和会话管理。
## 需求
### 需求:用户认证
系统应在成功登录时发放 JWT 令牌。
#### 场景:有效凭据
- 给定具有有效凭据的用户
- 当用户提交登录表单时
- 则返回 JWT 令牌
- 并且用户被重定向到仪表板
#### 场景:无效凭据
- 给定无效凭据
- 当用户提交登录表单时
- 则显示错误消息
- 并且不发放令牌
### 需求:会话过期
系统必须在 30 分钟不活动后使会话过期。
#### 场景:空闲超时
- 给定已认证的会话
- 当 30 分钟过去且没有活动时
- 则会话失效
- 并且用户必须重新认证
3)关键元素:
| 元素 | 目的 |
|---|---|
## 目的 |
此规范领域的高级描述 |
### 需求: |
系统必须具有的特定行为 |
#### 场景: |
需求在行动中的具体示例 |
SHALL/MUST/SHOULD |
RFC 2119 关键词,表示需求强度 |
### Requirement: User Authentication
系统 SHALL 在用户登录成功时签发 JWT Token<websource>source_group_web_1</websource>。
#### Scenario: Valid credentials (凭证有效)
- **GIVEN** 一个拥有正确账号密码的用户
- **WHEN** 用户提交登录表单
- **THEN** 系统返回 JWT token
- **AND** 用户被重定向到首页
#### Scenario: Invalid credentials (凭证无效)
- **GIVEN** 用户输入了错误的密码
- **WHEN** 用户提交登录表单
- **THEN** 系统显示“账号或密码错误”的提示
- **AND** 不签发任何 token
4)为什么这样结构化规范
需求是”做什么”——它们说明系统应该做什么而不指定实现。
场景是”何时”——它们提供可验证的具体示例。好的场景:
- 是可测试的(你可以为它们编写自动化测试)
- 涵盖正常路径和边缘情况
- 使用
Given/When/Then或类似结构化格式
RFC 2119 关键词(SHALL、MUST、SHOULD、MAY)传达意图:
MUST/SHALL——绝对需求SHOULD——推荐,但存在例外MAY——可选
2、变更(Changes)
变更是对系统的提议修改,打包为一个包含理解和实施所需所有内容的文件夹。
1)变更结构
openspec/changes/add-dark-mode/
├── proposal.md # 为什么和做什么
├── design.md # 如何做(技术方案)
├── tasks.md # 实施清单
├── .openspec.yaml # 变更元数据(可选)
└── specs/ # 增量规范
└── ui/
└── spec.md # ui/spec.md 中的更改内容
每个变更都是自包含的。它包含:
- 制品——捕获意图、设计和任务的文档
- 增量规范——对添加、修改或删除内容的规范
- 元数据——此特定变更的可选配置
2)为什么变更为文件夹
将变更打包为文件夹有几个好处:
- 一切在一起。 提案、设计、任务和规范位于同一位置。无需在不同位置查找。
- 并行工作。 多个变更可以同时存在而不会冲突。在
fix-auth-bug进行时,可以同时处理add-dark-mode。 - 清晰历史。 归档时,变更会移动到
changes/archive/并保留完整上下文。你可以回顾并理解不仅发生了什么变化,还有为什么变化。 - 便于审查。 变更文件夹易于审查——打开它,阅读提案,检查设计,查看规范增量。
3、归档(Archive)
归档前:
openspec/
├── specs/
│ └── auth/
│ └── spec.md ◄────────────────┐
└── changes/ │
└── add-2fa/ │
├── proposal.md │
├── design.md │ 合并
├── tasks.md │
└── specs/ │
└── auth/ │
└── spec.md ─────────┘
归档后:
openspec/
├── specs/
│ └── auth/
│ └── spec.md # 现在包含 2FA 需求
└── changes/
└── archive/
└── 2025-01-24-add-2fa/ # 为历史保留
├── proposal.md
├── design.md
├── tasks.md
└── specs/
└── auth/
└── spec.md
1)归档过程
- 合并增量。 每个增量规范部分(新增/修改/删除)应用到相应的主规范。
- ADDED 需求被追加到主规范
- MODIFIED 需求替换现有版本
- REMOVED 需求从主规范中删除
- 移动到归档。 变更文件夹移动到
changes/archive/,带有日期前缀以便按时间顺序排序。 - 保留上下文。 所有制品在归档中保持完整。你总是可以回顾以理解为什么进行变更。
2)为什么归档重要
-
清洁状态。 活动变更(
changes/)仅显示进行中的工作。已完成的工作移出视线。 - 审计追踪。 归档保留每个变更的完整上下文
- ——不仅是发生了什么变化,还有解释为什么的提案、解释如何的设计以及显示所做工作的任务。
- 规范演进。 随着变更被归档,规范有机地增长。每个归档合并其增量,随着时间的推移构建全面的规范。
三、工作原理
1、OpenSpec 创建的内容
在运行
openspec init后,你的项目会拥有如下结构:
─[$] openspec init
Cleaned up legacy files:
✓ Removed openspec/AGENTS.md
Migrated: custom profile with 4 workflows
New in this version: /opsx:propose. Try 'openspec config profile core' for the streamlined experience.
Welcome to OpenSpec
A lightweight spec-driven framework
████ This setup will configure:
██ ██ • Agent Skills for AI tools
██ ████ ██ • /opsx:* slash commands
██ ████ ██
██ ████ ██ Quick start after setup:
██ ██ /opsx:new Create a change
████ /opsx:continue Next artifact
/opsx:apply Implement tasks
Press Enter to select tools...
## 回车
OpenSpec Setup Complete
Refreshed: Claude Code
4 skills and 4 commands in .claude/
Config: openspec/config.yaml (exists)
Getting started:
Start your first change: /opsx:propose "your idea"
Learn more: https://github.com/Fission-AI/OpenSpec
Feedback: https://github.com/Fission-AI/OpenSpec/issues
1).claude 目录
.claude 目录是 Claude Code 的项目配置目录,存放了自定义命令和技能定义。整个目录围绕一个叫 OpenSpec 的工作流系统构建,用于规范化管理代码变更的提案→设计→任务→实施→归档全流程。
| 子目录 | 内容 | 作用 |
|---|---|---|
settings.local.json |
权限配置 | 允许执行 unzip -l 命令 |
commands/opsx/ |
4 个自定义命令 | 定义了4个用户可调用的斜杠命令 |
skills/ |
4 个技能定义 | 与命令对应的底层技能实现 |
4 个 OPSX 命令(斜杠命令)
| 命令 | 功能 | 简述 |
|---|---|---|
/opsx:explore |
探索模式 | 只思考不写代码,用于头脑风暴、问题分析、方案比较,会画 ASCII 图辅助思考 |
/opsx:propose |
提案模式 | 一键生成变更提案,创建 proposal.md(做什么+为什么)、design.md(怎么做)、tasks.md(实施步骤) |
/opsx:apply |
实施模式 | 按 tasks.md 中的任务逐条执行代码编写,每完成一个任务打勾标记 |
/opsx:archive |
归档模式 | 变更完成后归档到 openspec/changes/archive/,同步 delta spec 到主 spec,生成日期归档目录 |
2)openspec/ 目录
openspec/
├── specs/ # 单一事实来源(系统的行为)
│ └── <domain>/
│ └── spec.md
├── changes/ # 提议的更新(每个变更一个文件夹)
│ └── <change-name>/
│ ├── proposal.md
│ ├── design.md
│ ├── tasks.md
│ └── specs/ # 增量规范(正在变更的内容)
│ └── <domain>/
│ └── spec.md
└── config.yaml # 项目配置(可选)
关键目录:
specs/(真相之源):存放系统当前已上线功能的权威基准,按业务领域划分。changes/(施工工地):每个变更都有自己的文件夹,包含所有相关制品。当变更完成时,其规范会合并到主specs/目录中。archive/(历史博物馆):存放已完成需求的文档,支持后续审计与追溯。
2、.openspec/ 目录详解
.openspec/
├── specs/ # 已部署功能的权威基准(最终规范归档)
│ └── [capability]/ # 按功能模块划分(如返点单列表、返点单详情)
│ ├── spec.md # 需求说明与场景描述(核心规格文档)
│ └── design.md # 技术实现方案(可选,复杂功能补充)
├── changes/ # 正在进行的变更提案(开发中功能)
│ ├── [change-name]/ # 单个变更目录(如“rebate-order-list”,对应返点单列表)
│ │ ├── proposal.md # 提案背景与核心内容(为什么做、做什么)
│ │ ├── design.md # 技术设计文档(怎么做、技术选型)
│ │ ├── specs/ # 增量规格说明(功能细节、场景拆分)
│ │ └── tasks.md # 实现任务清单(开发步骤、验收标准)
│ └── archive/ # 已完成变更的归档目录(开发完成后迁移至此)
└── config.yaml # OpenSpec 核心配置文件(项目规范、技术栈等)
1)config.yaml —— 项目的“立法机构”
这是整个
OpenSpec工作的起点和全局约束。AI在生成任何文档或代码前,都会优先读取这里的规则。
- 作用:定义团队的技术栈、编码风格、文档模板要求以及业务红线。
- 生效方式:在运行
/opsx:propose等命令时,由OpenSpec CLI将这些规则注入给 AI,强制规范输出格式。
a、yaml 结构
# 必需:新变更的默认模式
schema: spec-driven
# 可选:项目上下文(最大 50KB)
# 注入到所有制品指令中
context: |
您的项目背景、技术栈、
约定和约束。
# 可选:每个制品规则
# 仅注入到匹配的制品中
rules:
proposal:
- 包含回滚计划
specs:
- 使用 Given/When/Then 格式
design:
- 记录降级策略
tasks:
- 拆分为最多 2 小时的工作块
schema: spec-driven
# ============================================================
# 项目上下文 — AI 创建产物时参考的核心信息
# 编码规约见 AGENTS.md,本文件只管产物怎么写
# ============================================================
context: |
## 项目定位
[项目名称]([英文代号]),[一句话描述项目的核心定位和业务价值]。
## 技术栈
- 语言/构建:[例如:Java 1.8 / Go 1.20、Maven / Gradle]
- 应用框架:[例如:Spring Boot 2.x、Gin、Express]
- 持久层:[例如:MyBatis-Plus、GORM、MySQL、MongoDB]
- RPC框架:[例如:JSF、Dubbo、gRPC]
- 消息队列:[例如:Kafka、RocketMQ、RabbitMQ]
- 缓存中间件:[例如:Redis、Memcached]
- 任务调度:[例如:Quartz、XXL-JOB、EasyJob]
- 配置中心:[例如:Nacos、Apollo、DUCC]
## 入口清单摘要
- [RPC Provider/入站接口]:[数量与简述,例如:3个核心资源接口]
- [MQ Consumer/消息消费者]:[数量与简述,例如:2个活跃Topic]
- [定时任务/Jobs]:[数量与简述,例如:4个日常批处理任务]
- [RPC Consumer/出站调用]:[数量与简述,例如:3个下游依赖服务]
# ============================================================
# 各产物类型的规则
# ============================================================
rules:
# ---- 提案(Proposal)规则 ----
proposal:
- 提案必须包含:背景、目标、非目标(Non-goals)、技术方案概要、影响范围
- 提案字数控制在 [具体字数] 字以内
- 必须标注影响的模块(例如:common/domain/dao/service/rpc/web)
- 必须评估是否影响现有对外接口契约
- 必须说明缓存影响(Key 变更/新增/删除)
- 必须说明 MQ 消息变更(新增 Topic / 修改消息体)
# ---- 设计(Design)规则 ----
design:
- 设计文档必须包含:当前架构、目标架构、接口设计、数据模型变更、缓存设计、异常处理
- 接口设计必须遵循读写分离原则(ReadService / WriteService)
- 数据模型变更必须包含:表结构变更、PO/DTO 变更、实体映射转换变更
- 缓存设计必须说明 Key 模式(引用常量枚举)、TTL、刷新策略
- 新增核心业务逻辑必须继承基类或实现指定接口
- 新增对外接口方法必须添加监控/鉴权注解
- 涉及异步操作必须说明分布式锁方案
- 涉及数据库变更必须包含 DDL 脚本
# ---- 规范(Specs)规则 ----
specs:
- 必须使用 RFC 2119 关键词(SHALL/MUST/SHOULD)明确需求强度
- 每个需求(Requirement)必须包含至少一个场景(Scenario)
- 场景(Scenario)必须严格采用 GIVEN / WHEN / THEN 格式编写
- 需求标题必须以 `### Requirement:` 开头,场景标题必须以 `#### Scenario:` 开头
- 必须覆盖正常流程(Happy Path)和异常/边界流程(Edge Cases)
- 禁止在 spec 中描述具体的代码实现细节(如变量名、函数名)
- 性能指标等非功能性需求也必须写成可验证的场景
# ---- 变更(Change)规则 ----
change:
- 变更记录必须关联 design 编号
- 必须列出受影响的文件清单(按模块分组)
- 必须标注变更类型:feature / fix / refactor / config
- 必须包含回归测试要点
- 涉及缓存变更必须包含缓存刷新方案
- 涉及数据库变更必须包含 DDL 脚本
# ---- 任务(Task)规则 ----
tasks:
- 每个任务拆分为最大 [具体时间] 小时可完成的粒度
- 任务必须标注所属模块和预估工作量
- 任务必须遵循分层依赖顺序(例如:domain → dao → service → rpc → web)
- 新增文件必须符合包结构和命名规范
- 禁止跨层直接调用(如 web 直接调 dao)
# ---- 代码审查(Review)规则 ----
review:
- 检查是否违反分层架构约束
- 检查缓存 Key 是否使用枚举或常量组装
- 检查是否通过统一的缓存服务操作缓存
- 检查对外接口是否有必要的监控/鉴权注解
- 检查 DTO/PO 转换是否使用对象映射工具
- 检查异常处理是否使用统一的业务异常类和错误码
- 检查是否在表现层(web/rpc)写了复杂的业务逻辑
b、context
注入项目背景(技术栈、核心能力),防止 AI “幻觉”。
- 技术栈(语言、框架、数据库)
- 关键架构模式(monorepo、微服务等)
- 非明显的约束(”我们不能使用库 X 因为…“)
- 经常被忽略的关键约定
c、rules
细分了
proposal(提案)、spec(规格)、tasks(任务)等不同阶段的输出格式要求,确保产物结构的一致性。
- 特定于制品的格式(”在规范中使用
Given/When/Then“) - 审查标准(”提案必须包括回滚计划”)
- 这些仅出现在匹配的制品中,使其他请求更轻量
2)specs/ —— 系统的“当前真相”
这是项目已上线、已稳定运行功能的权威基准库。
生效时机:按需读取(AI 写代码或做变更时查阅)。
核心职责:
- 存储模块架构、接口签名、数据结构、依赖关系。
- 增量规范 :仅记录本次迭代的变更点,不重复搬运历史,保持轻量化。
- 本质:它是系统的“导航地图”,告诉 AI “世界是什么样的”。
归档时系统会自动处理
- 合并规范:CLI 工具会自动将当前变更中的增量规范(ADDED/MODIFIED 要求)合并到主规范目录
openspec/specs/中。 - 历史转移:该变更文件夹会被移动到历史归档路径
openspec/changes/archive/中妥善保存,供后续审计和追溯使用
.openspec/
├── specs/ # 已部署功能的权威基准(最终规范归档)
│ └── [capability]/ # 按功能模块划分(如返点单列表、返点单详情)
│ ├── spec.md # 需求说明与场景描述(核心规格文档)
│ └── design.md # 技术实现方案(可选,复杂功能补充)
| 纬度 | 解释 | 说明 |
|---|---|---|
[capability]/ |
能力模块 | 按业务领域划分文件夹 |
spec.md |
核心规格 | 该模块当前具备的所有功能、接口定义和业务场景。它是 AI 编写新代码时的“参考书” |
design.md |
技术实现 | 存放复杂功能的历史技术方案。当需要迭代时,AI 会先读它来了解为什么这么设计,避免盲目重构 |
3)changes/ —— 正在施工的“临时工地”
所有正在进行中、尚未上线的需求都在这里独立开发,互不干扰1。当你执行
/opsx:propose "优化返点单列表查询性能"时,就会在这里生成一个对应的文件夹。里面的四个核心文件构成了完整的开发蓝图:
4)archive/ —— 历史变更记录的“博物馆”
当某个变更开发完成并执行
/opsx:archive后,整个文件夹会从changes/迁移到这里。
- 作用:保留完整的审计链路。未来如果线上出现
Bug,或者新同事想了解“当初为什么要加这个字段”,直接来这里翻阅历史记录即可,完美解决了传统开发中“改了哪里、为什么改”无迹可寻的痛点
3、入门
/opsx:onboard
SHOW: ✅ 预检结果
✅ JoySpec CLI 已安装(版本 0.2.12)
✅ 项目已初始化(.joyspec/ 目录存在)
PAUSE: 预检通过!准备好继续了吗?
Phase 1: 欢迎
EXPLAIN:
什么是 JoySpec?
JoySpec 是一个规约驱动的开发工作流,帮助团队通过结构化的提案、规范和任务跟踪来管理代码变更。
核心工作流周期
Propose → Spec → Design → Task → Apply → Archive
提案 规范 设计 任务 实施 归档
Propose(提案): 描述问题和解决方案
Spec(规范): 定义功能需求和行为
Design(设计): 技术设计和架构决策
Task(任务): 分解为可执行的小任务
Apply(实施): 执行任务并跟踪进度
Archive(归档): 完成后归档并更新规范
预期效果
本次上手体验约 15-20 分钟,我们将一起完成一个真实的、小型的代码改进,让您完整体验整个工作流。
PAUSE: 您准备好了吗?让我们进入下一阶段:选择一个实际任务来实践!
SHOW: 扫描结果 - 我发现了几个适合作为第一个 JoySpec 变更的候选任务:
📋 任务候选列表
| # | 任务类型 | 描述 | 预估时间 | 难度 |
|---|---------|------|---------|------|
| 1 | 文档完善 | 完善 README.md,添加项目结构、快速开始、技术栈等章节 | 10-15分钟 | ⭐ |
| 2 | 项目规约 | 完善 .joyspec/project.md,填写项目的实际信息(技术栈、架构模式等) | 10-15分钟 | ⭐ |
| 3 | 代码质量 | 为关键类添加完整的 JavaDoc 注释(如 DemoResourceImpl) | 15-20分钟 | ⭐⭐ |
💡 推荐
我推荐选择任务 1 或任务 2,因为:
✅ 足够小,可以在本次会话中完成
✅ 能展示完整的 JoySpec 工作流(提案 → 规范 → 设计 → 任务 → 实施 → 归档)
✅ 有实际价值,能帮助新成员快速了解项目
✅ 没有代码风险,适合作为第一次实践
PAUSE: 您想选择哪个任务?
4、核心工作流
整套流程遵循「先规范、后执行、再验证、最后归档」原则,共 6 个标准环节,可直接落地到部门日常迭代:
┌───────────────────────────────────────────────────────┐
│ 核心行动指令 (Actions) │
│ │
│ explore ◄──► new ◄──► continue ◄──► apply ◄──► verify ◄──► archive │
│ │ │ │ │ │ │
│ └──────────┴───────────┴────────────┴──────────────┘ │
│ 任意顺序、自由穿梭 │
└───────────────────────────────────────────────────────┘
- 🔭 探索阶段 (
/opsx:explore):模糊想法探路,零副作用地把需求和方案聊透。 - 🏗️ 启动阶段 (
/opsx:new):思路清晰后,建立正式的变更脚手架。 - 📝 规划阶段 (
/opsx:continue//opsx:ff):生成具体的 proposal、specs、design 和 tasks 四大制品。 - 🛠️ 实施阶段 (
/opsx:apply):AI按图施工,支持中途回退修改设计,直到所有任务完成。 - ✅ 验证阶段 (
/opsx:verify):(新增的核心质检) 对照文档全面体检代码,发现并修复“漏做、做错、不一致”的问题。 - 📦 归档阶段 (
/opsx:archive):确认无误后,合并增量规范,清理战场,将这次迭代沉淀为系统的永久资产。
┌──────────────────────────────────────────────────────────────────────────────┐
│ OPENSPEC 流程 │
│ │
│ ┌────────────────┐ │
│ │ 1. START │ /opsx:propose (core) or /opsx:new (expanded) │
│ │ CHANGE │ │
│ └───────┬────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────┐ │
│ │ 2. 创建 │ /opsx:ff 或 /opsx:continue (expanded workflow) │
│ │ 制品 │ 创建提案 → 规范 → 设计 → 任务 │
│ │ │ (基于模式依赖关系) │
│ └───────┬────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────┐ │
│ │ 3. 实施 │ /opsx:apply │
│ │ 任务 │ 处理任务,勾选完成项 │
│ │ │◄──── 学习时更新制品 │
│ └───────┬────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────┐ │
│ │ 4. 验证 │ /opsx:verify(可选) │
│ │ 工作 │ 检查实施是否匹配规范 │
│ └───────┬────────┘ │
│ │ │
│ ▼ │
│ ┌────────────────┐ ┌──────────────────────────────────────────────┐ │
│ │ 5. 归档 │────►│ 增量规范合并到主规范 │ │
│ │ 变更 │ │ 变更文件夹移动到 archive/ │ │
│ └────────────────┘ │ 规范现在是更新的单一事实来源 │ │
│ └──────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
1)初始化脚手架 /opsx:new <变更名称>
- 动作:在对话框输入
/opsx:new add-user-login(建议使用短横线连接的英文命名)。 - AI 的底层动作:
- 它不会立刻写文档,而是先在
openspec/changes/目录下创建一个名为add-user-login/的空文件夹。 - 关键点:此时文件夹是空的。这给了你一个“冷静期”,你可以在开始生成内容前,先手动往里面丢一些参考文档或截图,作为 AI 的额外参考资料。
- 它不会立刻写文档,而是先在
2.1)生成规划制品:快进模式 /opsx:ff
适合需求极其明确的日常迭代
- 你的动作:直接输入
/opsx:ff。 AI的动作:火力全开,一次性生成proposal.md、design.md、tasks.md和specs/文件夹下的初始规范。它会基于AGENTS.md的行为约束和config.yaml的格式要求,瞬间完成从背景分析到任务拆解的全过程。
2.2)生成规划制品:逐步模式 /opsx:continue
适合复杂业务或探索性开发
- 你的动作:输入
/opsx:continue。 AI的动作:它只会先生成proposal.md(需求提案),然后停下来等你确认。- 交互细节:你觉得背景描述没问题了
- 第 1 次输入
/opsx:continue➡️ 生成proposal.md(需求提案) - 第 2 次输入
/opsx:continue➡️ 生成specs/里的业务规则文档 - 第 3 次输入
/opsx:continue➡️ 生成design.md(技术设计) - 第 4 次输入
/opsx:continue➡️ 生成tasks.md(任务清单)
- 第 1 次输入
- 优势:这种“挤牙膏”式的方法,能让你在每一步都精准纠偏,防止
AI在错误的方向上狂奔
3)审查任务:四大核心制品
在进入编码前,你必须检查生成的四大制品:
-
说明:
OpenSpec为每一次迭代任务,固定输出 4 类结构化文件,形成闭环,同时支持Delta Spec增量规范(仅记录本次变更,不重复搬运历史内容,保持文档轻量化)。 -
微调:如果发现任何问题,不要急着改代码,直接在聊天框告诉 AI:“修改 design.md,把用户表的新增字段改为 xxx”,让它先把文档改对。
制品相互构建:
proposal ──► specs ──► design ──► tasks ──► implement
▲ ▲ ▲ │
└───────────┴──────────┴────────────────────┘
在学习过程中更新
| 制品 | 核心作用 | 审查 |
|---|---|---|
proposal.md |
“为什么做”:阐述背景、目标、范围和不做范围 | 范围是否失控?有没有包含不该做的功能 |
design.md |
“怎么实现”:架构图、DB改造、接口调整、风险方案 | 数据库表结构改动是否合理?接口设计是否符合现有架构? |
tasks.md |
“如何执行”:拆分为≤2h的任务项,供AI分步打勾执行 | 任务拆解是否足够细(每个任务 ideally ≤ 2小时)?顺序是否合乎逻辑? |
specs/ |
“改了什么规则”:存放增量的业务规则与验收标准 | 业务规则是否有漏洞?异常场景(如网络超时、数据为空)是否定义清楚? |
a、proposal.md 捕获意图
rules:
# ---- 提案(Proposal)规则 ----
proposal:
- 提案必须包含:背景、目标、非目标(Non-goals)、技术方案概要、影响范围
- 必须标注影响的模块(common/domain/dao/manager/service/rpc/web)
- 必须评估是否影响现有 JSF 接口契约
- 必须说明缓存影响(Redis Key 变更/新增/删除)
- 必须说明 MQ 消息变更(新增 Topic / 修改消息体)
## Why
<描述当前系统的不足/痛点,为什么需要这次变更。重点说明:>
- 现有架构的局限性(如:某维度缺失导致无法差异化处理)
- 业务诉求的优先级(如:仅少数场景需要新维度,大部分仍走默认逻辑)
- 对主路径性能的约束(如:新增维度不可退化核心查询性能)
## What Changes
- 数据库表(`<table_name>`)新增 `<new_column>` 字段,唯一键从 `<old_unique_key>` 调整为 `<new_unique_key>`,`<new_column>` 为 NULL 时表示默认规则
- **BREAKING** RPC 接口 `<RequestDto>` 新增 `<newField>` 字段(向前兼容,非必传)
- 缓存 Key `<CACHE_PREFIX>` 新增 `<newField>` 段;主路径采用"先查带新维度 Key,miss 后查默认 Key"策略,保证查询效率
- CRUD:创建/编辑时支持指定 `<newField>`,默认规则与新维度规则可独立并存
- 策略分配:入参透传 `<newField>`,分配结果按 `<existingKey>` 隔离存储,无需改动
- 规则生效/失效/预刷缓存:按 `<newField>` 维度独立刷缓存,默认规则与新维度规则各自维护
- 核心查询链路:三级查询(订单缓存→路由缓存→DB 兜底)均增加 `<newField>` 维度匹配
- 定时任务:查询与缓存预刷逻辑适配 `<newField>`
- 字典查询接口:新增新维度字典数据
## Capabilities
### New Capabilities
- `<capability-name>`: <一句话描述新能力——覆盖规则唯一性定义、缓存 Key 策略、查询链路适配、生效/失效/预刷缓存联动>
### Modified Capabilities
- `<existing-capability-name>`: <描述对该能力的修改,如字段新增、约束变更、接口扩展>
## Impact
- **影响模块**:common(缓存 Key/常量)、domain(PO/缓存对象)、dao(Mapper 查询条件)、manager(查询逻辑)、service(查询链路、写入逻辑、策略分配)、rpc(Provider 入参解析)、web(MQ Consumer/定时任务适配)
- **接口契约**:`<RequestDto>` 新增 `<newField>` 字段(非必传,默认 null 走原逻辑);`<ResponseDto>` 新增 `<newField>` 字段
- **缓存影响**:`<CACHE_PREFIX>` Key 格式变更(新增字段段),需灰度切换;其他缓存 Key 依赖已有隔离键,无需变更
- **MQ 消息变更**:无新增 Topic,如有 `<newField>` 需透传
b、design.md 设计方案
## Context
<描述当前系统的核心模型和查询链路。重点说明:>
- 当前唯一键定义(如二元组/三元组)
- 核心查询链路(如三级缓存结构)
- 核心约束(如缓存是一对一映射,新增维度后变为 1:N)
### 当前架构关键链路
```
核心查询(request)
→ 1. 一级缓存: <CACHE_KEY_PATTERN_1>
→ 2. 二级缓存: <CACHE_KEY_PATTERN_2> → <resultKey>
→ 详情缓存: <CACHE_KEY_PATTERN_3> → <resultDetail>
→ 关系缓存: <CACHE_KEY_PATTERN_4> → <relationResult>
→ 3. DB 兜底
```
## Goals / Non-Goals
**Goals:**
- <目标 1:新增维度支持差异化规则>
- <目标 2:主路径查询性能不退化>
- <目标 3:全链路覆盖:DB、缓存、CRUD、生效/失效、预刷、定时任务>
- <目标 4:向前兼容:现有数据新字段为 NULL,老调用方不传新字段时行为不变>
**Non-Goals:**
- <不做的事 1:不改造分配算法本身,仅透传新字段>
- <不做的事 2:不改造与新字段无关的缓存 Key 格式>
- <不做的事 3:不改造已有隔离键覆盖的缓存>
## Decisions
### D1: 缓存 Key 策略——"先精确后降级"保证主路径性能
**决策**:`<CACHE_PREFIX>` 缓存 Key 新增新维度段,格式为 `<CACHE_PREFIX>:<existingKey>:<newField>`。查询时先按传入的新字段查精确 Key,若未命中则查默认 Key(新字段为空段)。默认规则仍然使用原 Key,不搬迁旧数据。
**关键点**:如果为新维度配置了专属规则,则在专属 Key 下写入结果;同时默认 Key 下仍保留默认规则的结果。调用方传新字段时:
1. 先查 `<CACHE_PREFIX>:<existingKey>:<newFieldValue>` → 若命中,走专属规则
2. 若 miss,查 `<CACHE_PREFIX>:<existingKey>` → 命中默认规则
**主路径分析**:大部分请求传了新字段但仅有默认规则,步骤 1 miss,步骤 2 hit,总计 2 次查询。内网缓存延迟极低,2 次查询仍在可接受范围内。
**备选方案**:
- ❌ 合并 Key(Hash 结构):1 次查询可同时获取,但需改造所有写入路径且需全量迁移数据
- ❌ 双写精确 Key + 默认 Key:主路径 1 次命中,但失效时需双删、一致性风险高
### D2: 数据库唯一约束设计
**决策**:`<table_name>` 表新增 `<new_column> VARCHAR(N) DEFAULT NULL`。唯一索引调整为包含新列。MySQL 中 NULL 不参与唯一索引冲突检测,由业务层保证同一条件下仅一条默认记录。
**备选方案**:
- ❌ 使用空字符串代替 NULL:可行但语义不清,且需全量刷历史数据
### D3: 核心查询链路改造
**决策**:在缓存查询和 DB 兜底中增加新维度。
缓存查询伪代码:
```java
// 1. 尝试精确 Key(带新维度)
String result = null;
if (StringUtils.isNotBlank(req.getNewField())) {
String preciseKey = CacheKeyHelper.getKey(req.getExistingKey1(), req.getExistingKey2(), req.getNewField());
result = cacheService.get(preciseKey);
}
// 2. 精确 Key 未命中或无新维度,查默认 Key
if (StringUtils.isBlank(result)) {
String defaultKey = CacheKeyHelper.getKey(req.getExistingKey1(), req.getExistingKey2());
result = cacheService.get(defaultKey);
}
```
DB 兜底伪代码:
```java
// 1. 先查带新维度的记录
Entity record = null;
if (StringUtils.isNotBlank(req.getNewField())) {
record = queryByCondition(req.getExistingKey1(), req.getExistingKey2(), req.getNewField(), status);
}
// 2. 未查到则查默认记录
if (record == null) {
record = queryByCondition(req.getExistingKey1(), req.getExistingKey2(), null, status);
}
```
### D4: 规则生效/失效缓存联动
**决策**:规则生效时,根据自身的 `<newField>` 决定写入哪个 Key:
- `<newField>` 非空 → 写入 `精确 Key`
- `<newField>` 为空 → 写入 `默认 Key`
规则失效时,删除对应的 Key 即可。默认规则失效不影响专属规则,反之亦然。
### D5: 审批通过时同维度规则作废逻辑
**决策**:审批通过后将同维度下的"待生效"记录置为作废。作废范围限定为**同一新维度**:默认规则的新版本只作废默认规则的旧版本,专属规则同理。
### D6: 缓存 Key 工具类扩展
**决策**:`CacheKeyHelper.getKey()` 新增重载方法,接受新维度参数。保持原方法签名不变(向前兼容),新重载方法在 Key 末尾追加新维度段。
## Risks / Trade-offs
- **[主路径 2 次缓存查询]** → 可接受,内网缓存延迟极低。若后续有极端性能要求,可引入空值标记优化
- **[缓存 Key 灰度切换]** → 旧 Key 不删除、不搬迁,新代码先查新 Key 再查旧 Key,天然兼容。待全部切换完成后旧 Key 自然过期
- **[新字段=NULL 唯一约束]** → 需业务层保证同条件下仅一条默认记录,在保存方法中增加校验
- **[接口兼容性]** → 新增字段为非必传,默认 null。老调用方不传时等价于查默认逻辑,行为不变
- **[定时任务查询范围]** → 按 status 查询时不限新维度,逐条处理时根据规则的新维度决定缓存 Key
## Migration Plan
1. **DDL 变更**(先行):
```sql
ALTER TABLE <table_name> ADD COLUMN <new_column> VARCHAR(32) DEFAULT NULL COMMENT '<字段说明,NULL表示默认>' AFTER <after_column>;
ALTER TABLE <table_name> DROP INDEX <old_unique_index>;
ALTER TABLE <table_name> ADD UNIQUE INDEX <new_unique_index> (<col1>, <col2>, <new_column>);
```
2. **代码发布**(export JAR 先行 → 主应用后行):
- Step 1: 发布 export 新版 JAR(新增字段,非必传)
- Step 2: 通知调用方升级 export JAR(可渐进式)
- Step 3: 发布主应用
3. **回滚策略**:代码回滚至旧版本即可,新列均为 NULL 不影响旧逻辑
## Open Questions
- <新维度枚举值由哪方定义?是否需要对接上游系统?>
- <MQ 消息体是否已包含新字段?需确认消息生产方是否同步改造。>
c、spec.md 增量规范
## ADDED Requirements
### Requirement: <实体>支持<新维度>维度
<实体> SHALL 新增 `<newField>` 字段,用于标识规则的新维度。`<newField>` 为空(NULL)时表示默认规则。同一条件下,`<uniqueKey组合>` SHALL 唯一确定一条记录。
#### Scenario: 创建默认记录(不传新维度)
- **WHEN** 用户创建记录时未指定 `<newField>`
- **THEN** 系统将 `<newField>` 存储为 NULL,该记录作为默认记录
#### Scenario: 创建专属记录
- **WHEN** 用户创建记录时指定 `<newField>` 为 "<value>"
- **THEN** 系统存储 `<newField>="<value>"`,该记录仅对匹配该维度的请求生效
c、tasks.md 实施清单:
## 1. 数据库变更
- [ ] 1.1 编写 DDL 脚本:`<table_name>` 表新增 `<new_column>` 列,删除旧唯一索引,创建新唯一索引 【模块:dao | 预估:0.5h】
## 2. Export 模块
- [ ] 2.1 `<RequestDto>` 新增 `<newField>` 字段(非必传,默认 null)【模块:export | 预估:0.5h】
- [ ] 2.2 `<ResponseDto>` 新增 `<newField>` 字段【模块:export | 预估:0.5h】
- [ ] 2.3 其他相关 DTO 新增 `<newField>` 字段【模块:export | 预估:0.5h】
- [ ] 2.4 发布 export 新版 JAR,通知调用方升级【模块:export | 预估:0.5h】
## 3. Domain 层变更
- [ ] 3.1 PO 新增 `<newField>` 字段【模块:domain | 预估:0.5h】
- [ ] 3.2 缓存对象新增 `<newField>` 字段【模块:domain | 预估:0.5h】
- [ ] 3.3 Query 对象新增 `<newField>` 查询条件字段【模块:domain | 预估:0.5h】
## 4. Common 层变更
- [ ] 4.1 缓存 Key 工具类新增重载方法,接受 `<newField>` 参数;原方法签名保持不变【模块:common | 预估:0.5h】
- [ ] 4.2 新增维度枚举类,定义常量值【模块:common | 预估:1h】
## 5. DAO 层变更
- [ ] 5.1 Mapper XML:列定义、动态列、查询条件、更新列、insertOrUpdate 均适配 `<new_column>`【模块:dao | 预估:1h】
- [ ] 5.2 Mapper XML:核心查询增加 `<new_column>` 条件支持(精确匹配 + NULL 默认匹配)【模块:dao | 预估:1h】
## 6. Manager 层变更
- [ ] 6.1 Manager 查询方法增加 `<newField>` 参数重载,支持降级查询默认规则【模块:manager | 预估:1h】
- [ ] 6.2 对象转换器:转换方法透传 `<newField>` 字段【模块:manager | 预估:1h】
## 7. Service 层——核心查询链路
- [ ] 7.1 缓存查询:实现"先精确后降级"策略【模块:service | 预估:1.5h】
- [ ] 7.2 DB 兜底:实现降级查询策略【模块:service | 预估:1h】
- [ ] 7.3 核心查询方法:增加 `<newField>` 参数【模块:service | 预估:0.5h】
- [ ] 7.4 响应 DTO 设置 `<newField>` 字段【模块:service | 预估:0.5h】
## 8. Service 层——规则写入与缓存联动
- [ ] 8.1 生效缓存切换:根据 `<newField>` 决定写入的 Key;作废时限定同维度【模块:service | 预估:1.5h】
- [ ] 8.2 缓存预刷:根据 `<newField>` 决定续期的 Key【模块:service | 预估:1h】
- [ ] 8.3 状态更新:审批通过后作废同维度规则,查询条件增加 `<newField>` 限定【模块:service | 预估:1h】
- [ ] 8.4 保存前校验:同条件+同维度下是否已存在默认记录(业务层唯一约束兜底)【模块:service | 预估:1h】
## 9. Service 层——字典接口
- [ ] 9.1 字典接口:返回结果新增新维度选项列表【模块:service | 预估:1h】
- [ ] 9.2 字典 DTO 新增字段(如需在 export 模块添加)【模块:export | 预估:0.5h】
## 10. RPC 层适配
- [ ] 10.1 核心查询方法:透传 `<newField>` 至 Service【模块:rpc | 预估:0.5h】
- [ ] 10.2 写入方法:透传 `<newField>`【模块:rpc | 预估:0.5h】
## 11. 定时任务适配
- [ ] 11.1 生效 Job:验证逐条处理时 `<newField>` 正确透传【模块:web | 预估:0.5h】
- [ ] 11.2 缓存预刷 Job:验证按 `<newField>` 正确写入缓存 Key【模块:web | 预估:0.5h】
- [ ] 11.3 其他相关 Job:验证内部逻辑适配后行为正确【模块:web | 预估:0.5h】
## 12. MQ Consumer 适配
- [ ] 12.1 消息处理器:确认消息体中 `<newField>` 字段透传【模块:web | 预估:1h】
## 13. 单元测试
- [ ] 13.1 核心查询 Service 测试:新增传入 `<newField>` 的用例(专属命中、降级默认、不传兼容)【模块:service | 预估:1.5h】
- [ ] 13.2 写入 Service 测试:新增按维度生效/失效的用例【模块:service | 预估:1h】
- [ ] 13.3 缓存 Key 工具类测试:新增带 `<newField>` 重载方法的用例【模块:common | 预估:0.5h】
- [ ] 13.4 Manager 测试:新增按维度查询和降级查询的用例【模块:manager | 预估:1h】
## 14. 集成验证与发布
- [ ] 14.1 执行 DDL 脚本到测试环境,验证历史数据兼容性【模块:dao | 预估:0.5h】
- [ ] 14.2 端到端验证:创建默认规则 + 专属规则 → 分别查询 → 验证缓存 Key 和返回结果【模块:全链路 | 预估:1.5h】
- [ ] 14.3 性能验证:主路径缓存查询次数与延迟基线对比【模块:service | 预估:1h】
- [ ] 14.4 发布 export JAR,通知调用方渐进式升级【模块:export | 预估:0.5h】
4)执行开发:/opsx:apply
这是将静态文档转化为动态代码的过程。架构最大的亮点在于它的可中断与可恢复性。
- 你的动作:确认文档无误后,输入
/opsx:apply。 - AI 的底层动作:
- AI 会打开
tasks.md,读取第一个未打勾的任务。 - 结合
specs/中的业务规则和design.md中的技术方案,开始在对应的代码文件中进行编写或修改。 - 每完成一个任务,它会自动回到
tasks.md将该行标记为完成(例如打上[x])。
- AI 会打开
5)方案/任务修正
- 场景模拟:假设
AI执行到第 5 个任务时,你发现它实现的某个逻辑不符合预期,或者突然意识到数据库少了一个索引。 - 你的动作:
- 打断它:直接在聊天框叫停,“停一下,我发现设计有个问题”。
- 修正规划:告诉
AI,“去修改design.md,在用户表增加一个邮箱字段的索引”,或者补充specs/里的某条校验规则。 - 无缝继续:修正完文档后,你只需要再次输入
/opsx:apply。
AI的反应:它非常聪明,会识别出tasks.md中哪些任务已经打勾了,自动跳过已完成的部分,带着新的设计思路,从断点处继续执行剩下的任务。
6)验证环节: /opsx:verify
| 验证维度 | 核心问题 (验真逻辑) |
|---|---|
| 完整性 | “活干完了吗?” 所有任务清单里的项都打勾了吗?需求规格里的场景都有对应的代码实现吗? |
| 正确性 | “活干对了吗?” 代码的实际逻辑是否符合 Spec 里的业务规则和边界条件? |
| 一致性 | “风格统一吗?” 代码结构、命名规范、技术选型是否遵循了 design.md 里的架构决策? |
1)找准时机执行:当你在 /opsx:apply 阶段把所有代码写完,准备收尾归档之前,直接在对话框输入 /opsx:verify(如果上下文中有多个变更,可以带上变更名,如 /opsx:verify add-login)。
2)审阅验证报告:AI 会输出一份体检报告。你需要重点看有没有 CRITICAL 级别的问题。
- 如果有严重问题:绝对不能归档。直接把报告丢回给 AI,让它去修补代码或补充遗漏的逻辑。
- 如果有警告或建议:你可以评估一下。如果是合理的偏差(比如实现时发现了更好的技术方案),你可以让 AI 同步更新
design.md或specs里的描述,让文档和代码重新对齐。
3)确认无误后归档:只有当 /opsx:verify 的检查结果显示没有严重问题之后,你才能放心地执行最后一步 /opsx:archive
4)其他命令
# 列出活动变更
openspec list
# 查看变更详情
openspec show add-dark-mode
# 验证规范格式
openspec validate add-dark-mode
# 交互式仪表盘
openspec view
7)收尾归档:/opsx:archive
这不仅仅是清理文件夹,更是一次资产的沉淀与系统的进化。
- 动作一:更新系统真相(
Merge Specs)AI会把本次变更中changes/xxx/specs/里的增量规则,提取出来合并到项目根目录的openspec/specs/对应领域中。- 意义:这意味着项目的“主文档”被更新了。下次做新需求时,AI 读取的就是包含了这次改动的最新系统全貌。
- 动作二:打包封存(
Move to Archive)AI会将整个changes/add-user-login/文件夹移动并重命名(通常带上时间戳或序号)放入openspec/archive/目录。- 意义:
- 你的工作区瞬间变得干干净净。同时,这个归档文件夹成为了永久的历史档案。
- 三个月后如果这里出了
Bug,你依然可以翻出当时的proposal和design,完美还原当初的开发思路和决策背景。
5、工作流指令
1)快速功能
当你知道要构建什么并只需要执行时:
/opsx:new ──► /opsx:ff ──► /opsx:apply ──► /opsx:verify ──► /opsx:archive
最适合: 中小型功能、错误修复、直接变更。
2)探索性
/opsx:explore ──► /opsx:new ──► /opsx:continue ──► ... ──► /opsx:apply──► /opsx:verify ──► /opsx:archive
最适合: 性能优化、调试、架构决策、不明确的需求。
3)并行变更
同时处理多个变更:
变更 A:/opsx:new ──► /opsx:ff ──► /opsx:apply(进行中)
│
上下文切换
│
变更 B:/opsx:new ──► /opsx:ff ──────► /opsx:apply
最适合: 并行工作流、紧急中断、团队协作。
4)完成变更
/opsx:apply ──► /opsx:verify ──► /opsx:archive
│ │
验证实施 如果需要会提示
是否匹配 同步规范
5、Claude Code 会话生命周期
下面知识一个举例,按照当时的一个情况
┌─────────────────────────────────────────────────────────────────┐
│ Claude Code 会话生命周期 │
│ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Phase 0: 会话启动(自动,无需任何命令) │ │
│ │ │ │
│ │ AGENTS.md ──── 自动加载到系统上下文 │ │
│ │ (Claude Code 读取 .claude/commands/ 时连带加载) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Phase 1: 任务理解(AI 按 AGENTS.md §0 的指示执行) │ │
│ │ │ │
│ │ README.md ──→ specs/具体模块/spec.md ──→ 子文档 │ │
│ │ (按需读取,由 AGENTS.md 的知识库加载顺序驱动) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Phase 2: 产物生成(/opsx:propose 触发) │ │
│ │ │ │
│ │ config.yaml ──→ context(注入项目背景) │ │
│ │ ──→ rules.proposal(约束提案写法) │ │
│ │ ──→ rules.spec(约束规格写法) │ │
│ │ ──→ rules.change / tasks / review │ │
│ │ (通过 openspec CLI 的 instructions 命令注入) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Phase 3: 代码实施(/opsx:apply 触发) │ │
│ │ │ │
│ │ AGENTS.md ──→ 编码规约(分层、命名、注解...) │ │
│ │ config.yaml ──→ review 规则(代码审查检查项) │ │
│ │ specs/ ──→ 模块知识(接口签名、数据结构、流程) │ │
│ │ tasks.md ──→ 任务清单(做什么、什么顺序) │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
1)AGENTS.md — “永远的守卫”
-
何时生效:会话启动时自动加载,全程有效
-
谁在执行它:
Claude Code的 AI 助手(是给 AI 的行为规约,不是给人看的操作手册)
┌─────────────────────────────────────────────┐
│ AGENTS.md 管辖范围 │
├─────────────────────────────────────────────┤
│ │
│ §0 知识库加载顺序 → 告诉 AI 先读什么 │
│ §1 分层架构约束 → 写代码时必须遵守 │
│ §2 命名规范 → 类/Key/包结构 │
│ §3 编码约定 → 注解/工具/异常/缓存 │
│ §4 配置管理 → 哪里改配置 │
│ §5 测试约定 → 怎么写测试 │
│ §6 禁止事项 → 红线 │
│ │
│ 本质:AI 编码时的"交通规则" │
│ 生效方式:写进 AI 的系统上下文,每次对话都在 │
│ │
└─────────────────────────────────────────────┘
2)config.yaml — “产物生成器”
-
何时生效:运行
/opsx:propose创建变更产物时 -
谁在执行它:
openspec CLI(通过openspecinstructions命令把context和rules注入给 AI
┌──────────────────────────────────────────────────────────────┐
│ config.yaml 的两层结构 │
├──────────────────────────────────────────────────────────────┤
│ │
│ Layer 1: context(项目上下文) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ • 项目定位:xxxxxx │ │
│ │ • 技术栈:Java 1.8 / Spring Boot 2.2.2 / MyBatis-Plus │ │
│ │ • 分层架构:web → service → manager → dao → domain │ │
│ │ • 核心业务能力(5 条) │ │
│ │ • 入口清单摘要 │ │
│ │ • 关键约束(8 条) │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ │ 作用:AI 生成 proposal.md / spec.md / tasks.md 时 │
│ │ 自动参考这个上下文,确保产物不偏离项目实际 │
│ │ │
│ Layer 2: rules(产物规则,按类型分组) │
│ ┌──────────────┬───────────────────────────────────────────┐ │
│ │ rules. │ │ │
│ │ proposal │ → 提案必须含 背景/目标/非目标/技术方案 │ │
│ │ │ → 必须标注影响模块、JSF契约、缓存、MQ变更 │ │
│ ├──────────────┼───────────────────────────────────────────┤ │
│ │ rules. │ │ │
│ │ spec │ → 接口设计必须读写分离 │ │
│ │ │ → 缓存设计必须用枚举 Key │ │
│ │ │ → 新增策略必须继承 AbstractRouteRuleService │ │
│ ├──────────────┼───────────────────────────────────────────┤ │
│ │ rules. │ │ │
│ │ change │ → 必须关联 spec、列出受影响文件 │ │
│ │ │ → 缓存变更→刷新方案,DB变更→DDL脚本 │ │
│ ├──────────────┼───────────────────────────────────────────┤ │
│ │ rules. │ │ │
│ │ tasks │ → 拆分粒度≤2h,标注模块和工作量 │ │
│ │ │ → 按 domain→dao→manager→service→rpc→web │ │
│ ├──────────────┼───────────────────────────────────────────┤ │
│ │ rules. │ │ │
│ │ review │ → 7 项检查(分层/Redis/MapStruct/异常...) │ │
│ └──────────────┴───────────────────────────────────────────┘ │
│ │
│ 本质:控制"生成什么样的文档产物" │
│ 生效方式:openspec CLI instructions 命令注入到 AI 上下文 │
│ │
└──────────────────────────────────────────────────────────────┘
3)AGENTS.md 和 config.yaml
-
AGENTS.md管 代码怎么写(编码规约) -
config.yaml管”产物长什么样”(文档结构),
| 维度 | AGENTS.md |
config.yaml |
|---|---|---|
| 定位 | AI 的“交通规则” | 产物的“模具” |
| 生效时机 | 会话启动时自动加载,全程生效 | 生成文档时(如 /opsx:propose)生效 |
| 作用对象 | AI 的行为(怎么写代码) |
文档的结构(怎么写提案/任务) |
| 核心职责 | 约束编码风格、分层、命名、红线 | 定义提案/规格/任务文档的标准格式 |
| 类比 | 足球场上的裁判(确保不犯规) | 建筑图纸的制图标准(线宽、标注规范) |
5、核心能力:Delta Spec 增量规范
- 概念
- 增量规范是
OpenSpec的特色能力,区别于传统全量文档编写。 - 无需重复粘贴历史已有规则,仅记录本次迭代的变更点、新增内容、修改规则。
- 增量规范是
- 优势
- 文档精简,避免内容臃肿冗余
- 变更点一目了然,快速定位迭代内容
- 长期迭代下,文档依然易维护、易阅读
- 天然支持版本对比,追溯每一处规则改动
- 适用场景:版本迭代、功能增量扩展、规则微调、局部优化等日常需求
┌───────────────────────┬─────────────────────────────────────────────────────────┐
│ Delta Spec 类型 │ 合并操作 │
├───────────────────────┼─────────────────────────────────────────────────────────┤
│ ADDED Requirements │ 直接追加到主 spec 的 ## Requirements 末尾 │
├───────────────────────┼─────────────────────────────────────────────────────────┤
│ MODIFIED Requirements │ 找到主 spec 中同名的 ### Requirement:,整体替换为新内容 │
├───────────────────────┼─────────────────────────────────────────────────────────┤
│ REMOVED Requirements │ 从主 spec 中删除对应 Requirement 块 │
├───────────────────────┼─────────────────────────────────────────────────────────┤
│ 新建能力模块 │ 创建新 spec.md,直接就是 Delta Spec 风格,不需要再翻译 │
└───────────────────────┴─────────────────────────────────────────────────────────┘
6、specs 规约目录建议
1)目录结构
实际建议:
-
顶层目录:按业务领域划分(唯一标准)
-
领域内部子文件 / 子文件夹:按需求 / 接口 / 能力纬度拆分
-
禁止顶层直接堆一堆需求文件,会完全失去维护性
-
数量控制红线:单领域下规约文件不宜过多,超出即拆分子领域
openspec/
├─ specs/ # 主规约(稳定、已归档、按领域分层)
│ ├─ domain-user/ # 领域1:用户域
│ │ ├─ entity.md # 领域实体:User、Address、Account
│ │ ├─ api-auth.md # 需求/能力子集:登录、注册、验证码接口
│ │ ├─ api-user-info.md # 能力子集:用户信息CRUD
│ │ └─ common-enum.md # 领域通用枚举、常量、校验规则
│ ├─ domain-order/ # 领域2:订单域
│ │ ├─ entity.md
│ │ ├─ api-order-create.md
│ │ ├─ api-order-pay.md
│ │ └─ rule-discount.md # 领域专属业务规则
│ └─ common-base/ # 全局公共领域(所有业务通用)
│ ├─ page-model.md # 分页通用结构体
│ └─ error-code.md # 全局错误码
└─ changes/ # 临时增量变更(按需求纬度,迭代完成归档合并到specs领域)
├─ login-v2-fix/
├─ order-discount-opt/
└─ archive/ # 已归档历史变更包
| 目录位置 | 划分维度 | 生命周期 | 能否直接修改 |
|---|---|---|---|
openspec/specs/ 一级目录 |
业务领域 | 永久稳定 | 禁止直接改,必须走 changes 增量变更修正 |
单个 domain 内部 md 文件 |
需求 / 接口能力 | 永久沉淀 | 同上,走变更修改 |
openspec/changes/ 变更包 |
单次迭代需求 | 临时(迭代后归档) | 可自由 edit 局部修改 |
2)规约目录实际建议
a、新增迭代需求
- 在
changes/创建需求纬度变更包,写增量spec - 开发完成校验无误后执行
/opsx:archive,自动合并到对应领域目录
b、修改线上存量规约(已归档)
- 新建
fix类型需求变更,不改动specs领域原文件 - 归档后自动更新对应领域下的规约文件
c、新增业务模块
- 先判断归属领域,无对应领域则新建一级
domain文件夹,不新增零散需求文件
d、局部修改规约
- 只修改
changes内当前变更的增量spec,主领域 spec 只读 - 修改完
ff、validate、apply,归档后才同步到领域目录
四、命令快速参考
1、命令解释
| 命令 | 目的 | 何时使用 |
|---|---|---|
/opsx:new |
创建新的变更脚手架 | 扩展模式,显式控制制品 |
/opsx:continue |
创建下一个制品(每次一个) | 扩展模式,逐步创建制品 |
/opsx:ff |
快进——一次性创建规划制品 | 扩展模式,范围明确时 |
/opsx:verify |
验证实现是否匹配规范 | 扩展模式,归档前使用 |
/opsx:sync |
预览/合并规范而不归档 | 扩展模式,可选 |
/opsx:bulk-archive |
批量归档多个变更 | 扩展模式,并行工作时 |
/opsx:onboard |
引导式端到端入门工作流 | |
/opsx:explore |
思考探索想法 | 需求不明确、需要调查时 |
/opsx:propose |
创建变更 + 规划制品 | 默认快速路径(core 配置文件) |
/opsx:apply |
从 tasks.md 实现任务 |
|
/opsx:archive |
完成变更 | 所有工作完成时 |
/opsx:edit |
局部编辑变更规范 | 局部需要修改 |
2、命令扩展
默认全局配置文件为
core。要启用扩展工作流命令,运行openspec config profile选择工作流,然后在项目中运行openspec update。
┌─[zhangyujin1@ZBMac-J7H7T2943L] - [~/Desktop/] - [2526]
└─[$] openspec config profile [11:07:57]
Current profile settings
Delivery: both
Workflows: 4 selected (custom)
Delivery = where workflows are installed (skills, commands, or both)
Workflows = which actions are available (propose, explore, apply, etc.)
✔ What do you want to configure? Workflows only
✔ Select workflows to make available: Propose change, Explore ideas, New change, Continue change, Apply tasks, Fast-forward, Sync specs, Archive
change, Bulk archive, Verify change, Onboard
Config changes:
workflows: added new, continue, ff, sync, bulk-archive, verify, onboard
✔ Apply changes to this project now? Yes
Updating 1 tool(s): claude (config sync)
✔ Updated Claude Code
✓ Updated: Claude Code (v1.3.1)
Tools: Claude Code
Restart your IDE for changes to take effect.
Run `openspec update` in your other projects to apply.
┌─[zhangyujin1@ZBMac-J7H7T2943L] - [~/Desktop/] - [2527]
└─[$] openspec update [11:09:19]
✓ All 1 tool(s) up to date (v1.3.1)
Tools: claude
Use --force to refresh files anyway.


