openspec-sdd-e2e-kit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +63 -0
  2. package/bin/sdd-e2e-kit.mjs +53 -0
  3. package/kit/.codex/skills/feature-to-e2e/SKILL.md +188 -0
  4. package/kit/.codex/skills/feature-to-e2e/agents/openai.yaml +4 -0
  5. package/kit/.codex/skills/openspec-apply-change/SKILL.md +180 -0
  6. package/kit/.codex/skills/openspec-archive-change/SKILL.md +157 -0
  7. package/kit/.codex/skills/openspec-continue-change/SKILL.md +136 -0
  8. package/kit/.codex/skills/openspec-explore/SKILL.md +292 -0
  9. package/kit/.codex/skills/openspec-full-spec-discovery/SKILL.md +356 -0
  10. package/kit/.codex/skills/openspec-full-spec-discovery/references/backlog-row-to-main-spec.md +447 -0
  11. package/kit/.codex/skills/openspec-new-change/SKILL.md +92 -0
  12. package/kit/.codex/skills/openspec-propose/SKILL.md +132 -0
  13. package/kit/.codex/skills/spec-to-gherkin/SKILL.md +686 -0
  14. package/kit/SDD_E2E_FLOW.md +268 -0
  15. package/kit/manifest.json +78 -0
  16. package/kit/openspec/config.yaml +18 -0
  17. package/kit/openspec/schemas/sdd-e2e/schema.yaml +128 -0
  18. package/kit/openspec/schemas/sdd-e2e/templates/acceptance-coverage.md +9 -0
  19. package/kit/openspec/schemas/sdd-e2e/templates/design.md +29 -0
  20. package/kit/openspec/schemas/sdd-e2e/templates/feature.feature +13 -0
  21. package/kit/openspec/schemas/sdd-e2e/templates/proposal.md +23 -0
  22. package/kit/openspec/schemas/sdd-e2e/templates/spec.md +21 -0
  23. package/kit/openspec/schemas/sdd-e2e/templates/tasks.md +16 -0
  24. package/kit/openspec/schemas/sdd-e2e/templates/test-cases.md +35 -0
  25. package/kit/openspec/schemas/sdd-e2e.yaml +160 -0
  26. package/kit/openspec/sdd-e2e-flow.md +290 -0
  27. package/kit/openspec/sdd-e2e-maintenance.md +98 -0
  28. package/kit/scripts/sdd/check-report.mjs +34 -0
  29. package/kit/scripts/sdd/lib.mjs +290 -0
  30. package/kit/scripts/sdd/lint-features.mjs +60 -0
  31. package/kit/scripts/sdd/lint-tasks.mjs +41 -0
  32. package/kit/scripts/sdd/self-test.mjs +185 -0
  33. package/kit/scripts/sdd/summarize-acceptance.mjs +41 -0
  34. package/package.json +19 -0
  35. package/src/check.mjs +86 -0
  36. package/src/diff.mjs +101 -0
  37. package/src/install.mjs +159 -0
  38. package/src/lib.mjs +221 -0
@@ -0,0 +1,447 @@
1
+ # Backlog Row 到 Main Spec 恢复
2
+
3
+ 只在用户已经选择一个明确 capability 后使用本参考。输入可以来自 `full-spec-discovery.md` 的 Product Capability Backlog,也可以来自用户直接指定的 capability、页面、路由或已有主 spec。
4
+
5
+ 本参考负责把一个 capability 垂向恢复为 `openspec/specs/<capability>/spec.md`。首次全量 discovery 阶段不要使用本参考生成 Requirement、Scenario 或 `SHALL/MUST`。
6
+
7
+ ## 流程
8
+
9
+ ```text
10
+ Backlog Row /明确 capability
11
+ -> Readiness Gate
12
+ -> Evidence Package
13
+ -> Chrome DevTools MCP Runtime Gap Scan
14
+ -> Candidate Requirements
15
+ -> User Review Gate
16
+ -> Pre-write Checks
17
+ -> Main Spec Write
18
+ -> Interaction Flow Write
19
+ -> Spec / Flow Alignment Review
20
+ -> Discovery Writeback
21
+ ```
22
+
23
+ 一次只处理一个 capability。不要把多个 backlog 行合并写入一个主 spec。
24
+
25
+ ## 输入契约
26
+
27
+ 从 Product Capability Backlog 读取:
28
+
29
+ ```text
30
+ order | priority | capability | main_spec_status | purpose/boundary | entries/evidence | confidence | vertical_slice_preparation
31
+ ```
32
+
33
+ 同时读取与该 capability 相关的:
34
+
35
+ - Entry / API / Store assignment summary
36
+ - GitNexus process assignment ledger
37
+ - Unknown / Inactive Entries
38
+ - Excluded Implementation Details
39
+ - Out-of-product Tooling
40
+ - Open Questions
41
+ - 已有 `openspec/specs/<capability>/spec.md`
42
+ - 已有 `openspec/specs/<capability>/interaction-flow.md`
43
+ - 已归档 `openspec/changes/archive/**/specs/**/spec.md`
44
+ - 测试、API 契约、UI 文案、route、store、form guard、mock 或 fixture
45
+
46
+ 只带入会影响当前 capability 边界、规则、证据、阻塞项或目标 spec 路径的材料。
47
+
48
+ ## Readiness Gate
49
+
50
+ 只有满足以下条件时,才继续恢复:
51
+
52
+ - `capability` 是 kebab-case,并能映射到 `openspec/specs/<capability>/spec.md`。
53
+ - 该 capability 描述一个 actor goal,或一个边界紧密的产品工作流。
54
+ - 该 capability 有稳定业务对象、用户可见表面或外部契约。
55
+ - 该 capability 不是内部 component、hook、helper、state action、utility 或 execution flow。
56
+ - 证据足以启动 requirement-level 恢复,即使细节仍需确认。
57
+
58
+ 如果一行混合多个 actor goal、多个对象生命周期、多个外部 owner、多个独立页面或互不相关的用户任务,不要恢复成一个主 spec。
59
+
60
+ 使用以下决策之一:
61
+
62
+ - `ready`:继续构建证据包。
63
+ - `split`:先拆成更小 capability,每个子项 `main_spec_status = 未完成`。
64
+ - `block`:标记 `main_spec_status = 暂缓`,写明 blocker 和下一步证据来源。
65
+ - `exclude`:移出 Product Capability Backlog,放入 `unknown/inactive`、`impl-detail` 或 `out-of-product`。
66
+
67
+ GitNexus process 可以作为证据或归属线索,但不能单独证明 capability 已完成。
68
+
69
+ ## Evidence Package
70
+
71
+ 先收集证据,再起草 requirement。使用紧凑表格:
72
+
73
+ ```text
74
+ 候选行为 | 证据 | 置信度 | 待确认问题
75
+ ```
76
+
77
+ 对 UI-facing capability,Evidence Package 还必须先列出静态交互候选图,作为 Chrome DevTools MCP Runtime Gap Scan 的输入:
78
+
79
+ ```text
80
+ 候选动作 | 静态来源 | 用户可见表面 | 预期可见结果/状态变化 | 预期 network/storage | 是否修改性/破坏性 | 用户授权状态 | 后续处理
81
+ ```
82
+
83
+ 静态来源应尽量覆盖 route、页面组合、组件事件处理器、props callback、表单控件、表格列/行操作、菜单项、store 状态迁移、API 调用、测试、归档 spec 和直接 UI 文案。不要只按当前可见页面截图枚举控件;先用代码和证据推导目标 capability 内可能存在的用户动作,再进入运行态验证。
84
+
85
+ 证据等级:
86
+
87
+ - 高:已有主 spec、已接受归档 delta spec、断言可观察行为且通过的测试、明确 API/后端契约、用户确认的运行时观察、直接产品文案。
88
+ - 中:route/page composition、API client 形态、form schema/submit guard、store/reducer/state-machine、mock/fixture/Storybook、错误或空态分支。
89
+ - 低:未测试条件分支、死代码、TODO、注释代码、未使用 props、偶然实现细节、只靠命名推断、无 UI/测试支撑的生成类型。
90
+
91
+ 冲突处理:
92
+
93
+ 1. 优先采用已接受 OpenSpec,而不是代码现状。
94
+ 2. 优先采用断言用户可见行为的测试,而不是实现分支。
95
+ 3. 优先采用当前可观察 UI,而不是过期文档。
96
+ 4. 将未测试代码视为候选行为,不视为产品意图。
97
+ 5. 选择某个来源作为规范依据前,先让用户确认。
98
+
99
+ 只有高置信或用户确认的行为才能写成 `SHALL`、`MUST` 或 `SHOULD`。中低置信行为先写成候选、gap 或待验证问题。
100
+
101
+ 浏览器观察只证明当前可见行为,不自动证明产品意图。对 UI-facing capability,必须在 Candidate Requirements 之前使用 Chrome DevTools MCP 做运行态验证与遗漏探索;只有纯后端、纯数据契约、离线文档或 out-of-product tooling 等非 UI-facing capability 可以跳过,并必须说明排除原因。
102
+
103
+ ## Chrome DevTools MCP Runtime Gap Scan
104
+
105
+ 对 UI-facing capability,在 Candidate Requirements 之前必须执行一轮 Chrome DevTools MCP 运行态验证与遗漏探索。该步骤既验证已有候选 requirement,也要先结合代码和静态证据推导目标 capability 内所有可能用户动作,再通过运行态观察验证可达性、可见结果、网络/状态变化和遗漏交互。
106
+
107
+ 如果 Chrome DevTools MCP、dev server、登录态、测试数据或目标入口不可用,记录 runtime blocker / gap,不得臆造运行时行为,不得静默跳过。UI-facing capability 不得进入规范性 Candidate Requirements 或 Main Spec Write;只能输出 blocker/gap 或 audit-only 预览,除非用户明确批准其它观察方式。
108
+
109
+ 准备:
110
+
111
+ - 确认 dev server URL、登录态/token/cookies、测试数据、目标 capability 入口和允许操作边界。
112
+ - 明确哪些动作只观察、哪些动作可执行、哪些动作执行前需要用户确认;修改性或破坏性动作默认纳入交互候选图,不得因需要确认而忽略。
113
+ - 执行修改性或破坏性动作前,向用户说明目标环境、目标对象、具体动作和可能影响;用户批准或确认可回滚/可丢弃测试数据后执行;用户明确拒绝时不执行,并标为 `refused`、`blocked` 或 `not-tested`;用户未回应或授权边界不清时,保留为待授权 gap。
114
+ - 若登录、数据或环境不可用,记录 blocker,不臆造运行时行为。
115
+
116
+ 执行:
117
+
118
+ 1. 从路由、组件事件处理器、props callback、表单控件、表格列/行操作、菜单项、store 状态迁移、API 调用、测试和归档 spec 推导交互候选图,覆盖目标 capability 内所有可能用户动作。示例类型不得被视为探索上限。
119
+ 2. 为每个候选动作分配稳定的本次审查 ID,并记录静态来源、预期可见结果、预期 network/storage、是否修改性/破坏性、用户授权状态。
120
+ 3. 打开目标 capability 的真实入口,确认页面/抽屉/弹窗是否可达,并将当前可见控件、菜单、按钮、输入、切换、空态、加载态、错误态和禁用态与交互候选图对齐。
121
+ 4. 用 DevTools 对交互候选图做运行态验证,优先验证归档 spec、测试和代码之间可能 drift 的行为。等价动作组可以选代表执行,但未执行项必须显式标为 `not-tested`、`blocked`、`refused` 或待确认。
122
+ 5. 对每个候选动作记录 `observed`、`unreachable`、`blocked`、`refused`、`not-tested` 或 `runtime-only` 状态,并观察 DOM 可见变化、network request/response、console error、storage/session 变化、URL/路由变化、可见反馈和跨视图同步。
123
+ 6. 对代码推导到但运行态不可达的动作、运行态发现但静态证据没有覆盖的行为,分别列为 gap 或“挖掘候选”,不要直接写成规范。
124
+ 7. 如果观察到归档 spec/test 与当前运行时冲突,列为冲突并进入 User Review Gate。
125
+
126
+ 输出 runtime gap scan:
127
+
128
+ ```text
129
+ candidate_id | candidate action | approval state | static source/evidence | runtime status | observed evidence | requirement/gap disposition | decision needed
130
+ ```
131
+
132
+ 同时保留紧凑的交互候选图摘要,说明每个候选动作来自代码、测试、归档 spec、API/store 还是运行态探索,以及它最终被归入 requirement、gap、排除项或待确认问题。
133
+
134
+ 证据定级:
135
+
136
+ - 运行时观察 + 用户确认,或运行时观察 + 通过测试/归档 spec/API 契约支撑,可以作为高置信证据。
137
+ - 仅 Chrome DevTools MCP 观察到、未被测试或用户确认的行为,默认中置信。
138
+ - 只来自瞬时 UI、异常数据、偶发网络状态或无法复现的观察,默认低置信或 gap。
139
+
140
+ 不要把 raw screenshot、完整 network payload、console dump 写进最终 main spec。最终 spec 只保留被接受的可观察业务规则;DevTools 证据可进入写入前摘要和非规范性 `Code Scope`。
141
+
142
+ ## Candidate Requirements
143
+
144
+ 按业务规则分组证据,不按文件、组件或函数分组。
145
+
146
+ 每个候选 requirement 包含:
147
+
148
+ - Requirement 名称
149
+ - Requirement ID,格式为 `REQ-<SPEC_SHORT_CODE>-NN`
150
+ - 候选规则描述
151
+ - 代表性 Scenario 摘要
152
+ - 证据引用
153
+ - 关联交互候选动作或 runtime gap
154
+ - 置信度:高 / 中 / 低
155
+ - 待确认问题或冲突
156
+
157
+ 候选表:
158
+
159
+ ```text
160
+ Requirement 候选名 | 规则摘要 | Scenario 摘要 | 证据 | 关联交互/Runtime Gap | 置信度 | 决策
161
+ ```
162
+
163
+ Requirement 应描述稳定业务规则或用户可见工作流。不要把组件名、API 函数名、hook、reducer action 或文件名写成 requirement。
164
+
165
+ 规范性语言使用:
166
+
167
+ - `WHEN <触发条件>, 系统 SHALL <可观察行为>.`
168
+ - `IF <条件>, 系统 SHALL/MUST <可观察行为>.`
169
+ - `WHILE <状态>, 系统 SHALL/MUST <可观察行为>.`
170
+ - `<实体> MUST NOT <被禁止的行为>.`
171
+
172
+ 避免“正确地”“通常”“简单”“快速”“合理”“友好”等不可验证词。
173
+
174
+ ## Scenario 规则
175
+
176
+ 每个 requirement 至少一个 `#### Scenario`。
177
+
178
+ Scenario 必须描述可观察行为:
179
+
180
+ ```md
181
+ #### Scenario: <代表性例子>
182
+ - **GIVEN** <初始状态>
183
+ - **WHEN** <用户动作或系统事件>
184
+ - **THEN** <可观察结果>
185
+ ```
186
+
187
+ 不要写实现断言,例如 `handleSubmit 被调用`、React state 为某值、某 hook 返回某内部字段。只有当实现细节本身是外部契约时,才改写成契约描述。
188
+
189
+ 主 spec 不写 `.feature` 的 `@phase`、`@validation`、`@req`、优先级或风险标签。
190
+
191
+ ## Requirement / Flow ID 规则
192
+
193
+ 写入主 spec 时,每个 Requirement 必须有稳定 ID:
194
+
195
+ ```text
196
+ REQ-<SPEC_SHORT_CODE>-NN
197
+ ```
198
+
199
+ `SPEC_SHORT_CODE` 使用 capability 的可读短码,优先取主要词首字母并大写,例如 `chat-test-affix -> CTA`。`NN` 使用两位递增编号。ID 一旦被 `interaction-flow.md`、测试、审计或其它文档引用,应尽量保持稳定;标题微调不应导致 ID 变化。
200
+
201
+ 在 `spec.md` 中保留 OpenSpec 标题格式,并把 ID 放在 Requirement 规范正文之后、Scenario 之前:
202
+
203
+ ```md
204
+ ### Requirement: <业务规则名称>
205
+
206
+ <系统 SHALL/MUST ...>
207
+
208
+ Requirement ID: `REQ-XXX-01`
209
+
210
+ #### Scenario: <代表性例子>
211
+ ```
212
+
213
+ 不要把 `Requirement ID` 放在 Requirement 标题后的第一段。OpenSpec strict 校验会把第一段当作 Requirement 正文;如果第一段没有 `SHALL` 或 `MUST`,会校验失败。
214
+
215
+ `interaction-flow.md` 中的流程 ID 使用:
216
+
217
+ ```text
218
+ FLOW-<SPEC_SHORT_CODE>-NN
219
+ ```
220
+
221
+ 流程 ID 只用于辅助文档引用,不替代主 spec 的 Requirement ID。
222
+
223
+ ## User Review Gate
224
+
225
+ 编辑文件前先展示候选规则、交互候选图摘要、runtime gap scan 和写入摘要。让用户对不确定规则分类:
226
+
227
+ - `接受`:写入主 spec。
228
+ - `编辑`:调整措辞或 scenario。
229
+ - `Gap`:记录为未决,不写成 `SHALL`。
230
+ - `拒绝`:本次 spec 省略。
231
+ - `验证`:先运行或检查更多证据。
232
+
233
+ 未经用户确认,绝不能把以下内容提升为 `SHALL`:
234
+
235
+ - 只有低置信代码路径支持的行为。
236
+ - 像 workaround、bug、历史妥协或偶然 UI 状态的行为。
237
+ - 被测试、UI、API 契约或已归档 spec 反驳的规则。
238
+ - 无法从可观察行为推断出的产品决策。
239
+ - 私有实现细节。
240
+
241
+ 对 UI-facing capability,User Review Gate 必须明确说明:
242
+
243
+ - 哪些静态推导动作已被运行态验证并归入候选 requirement。
244
+ - 哪些静态推导动作在运行态不可达,暂列 gap、排除项或待确认问题。
245
+ - 哪些运行态探索发现的动作缺少静态证据或规范来源,暂列“挖掘候选”。
246
+ - 哪些修改性或破坏性动作已获批准执行、哪些被用户明确拒绝、哪些仍待授权;被拒绝或待授权的路径不得从候选图和 gap 中消失。
247
+
248
+ 写入前摘要至少列出:
249
+
250
+ ```text
251
+ Target spec:
252
+ Target interaction flow:
253
+ Mode: create | update | audit-only
254
+ Interaction candidate graph summary:
255
+ Runtime gap scan:
256
+ Unverified or unreachable candidates:
257
+ Runtime-only discovered candidates:
258
+ Chrome DevTools MCP blockers or exclusions:
259
+ Mutation/destructive action approvals:
260
+ Add requirements:
261
+ Modify requirements:
262
+ Keep unchanged:
263
+ Not writing as normative:
264
+ Interaction flows:
265
+ Code Scope evidence:
266
+ ```
267
+
268
+ ## Pre-write Checks
269
+
270
+ 写入或更新前确认:
271
+
272
+ - 每个 requirement 至少有一个 scenario。
273
+ - 每个 requirement 都有 `REQ-<SPEC_SHORT_CODE>-NN` ID,且 ID 放在规范正文之后、Scenario 之前。
274
+ - 如果写入或更新主 spec,也必须同步创建或更新 `interaction-flow.md`。
275
+ - 每个 scenario 包含 `GIVEN`、`WHEN` 和 `THEN`,除非有明确理由省略 `GIVEN`。
276
+ - 每个规范性声明都能被用户、API consumer 或 integration 观察到。
277
+ - 没有私有实现细节被提升为业务规则。
278
+ - 没有低置信行为被写成 `SHALL`。
279
+ - 修改性或破坏性候选动作没有因需要授权而被忽略;每个此类动作都有 `approved`、`refused`、`pending`、`not-needed` 或等价处置说明。
280
+ - UI-facing capability 已完成 Chrome DevTools MCP Runtime Gap Scan,或已记录不可用 blocker 并停止规范性写入。
281
+ - 代码推导出的每个交互候选动作都有 disposition:requirement、gap、exclude、blocked、not-tested 或 decision needed。
282
+ - 没有未经用户明确批准就弱化已有 requirement。
283
+ - 术语与项目已有语言、UI 文案和 OpenSpec 风格一致。
284
+ - 主 spec 包含非规范性的 `## Code Scope`。
285
+
286
+ 如果验证需要当前不可用的登录、数据、凭据或运行环境,停止并把 capability 标记为 `暂缓` 或留下明确 gap。
287
+
288
+ ## Main Spec Write
289
+
290
+ 只有用户接受写入摘要后,才创建或更新:
291
+
292
+ ```text
293
+ openspec/specs/<capability>/spec.md
294
+ ```
295
+
296
+ 最终主 spec 保持干净,并为每个 Requirement 标记稳定 ID:
297
+
298
+ ```md
299
+ # <capability> Specification
300
+
301
+ ## Purpose
302
+ <业务边界>
303
+
304
+ ## Requirements
305
+
306
+ ### Requirement: <业务规则名称>
307
+
308
+ <系统 SHALL/MUST ...>
309
+
310
+ Rules:
311
+ - <可选的补充业务规则>
312
+
313
+ Requirement ID: `REQ-XXX-01`
314
+
315
+ #### Scenario: <代表性例子>
316
+ - **GIVEN** <初始状态>
317
+ - **WHEN** <用户动作或系统事件>
318
+ - **THEN** <可观察结果>
319
+
320
+ ## Code Scope
321
+ <非规范性实现范围>
322
+ ```
323
+
324
+ `Code Scope` 不是业务规则,不使用 `SHALL/MUST`。至少记录可确认的 `routes`、`files`、`apis` 或 `gitnexus_processes` 中一类;证据不足的项不要臆造。
325
+
326
+ 除非用户要求,不要把证据置信度表格写进最终 spec。只有用户希望在 spec 中保留未决项时,才添加简短 `## 待确认问题`。
327
+
328
+ 更新已有 spec 时,保留无关 requirement,只编辑已接受的范围。
329
+
330
+ ## Interaction Flow Write
331
+
332
+ 写入或更新主 spec 时,同时创建或更新:
333
+
334
+ ```text
335
+ openspec/specs/<capability>/interaction-flow.md
336
+ ```
337
+
338
+ `interaction-flow.md` 是面向研发和测试的辅助阅读材料,只表达交互流程,不新增规范性要求。若它与 `spec.md` 冲突,以 `spec.md` 的 Requirement 和 Scenario 为准。
339
+
340
+ 推荐结构:
341
+
342
+ ````md
343
+ # <capability> Interaction Flow
344
+
345
+ 本文档是 `<capability>` 主 spec 的辅助阅读材料,面向研发和测试人员。
346
+
347
+ 它只整理交互流程,不新增规范性要求。若本文档与 `spec.md` 存在冲突,以 `spec.md` 中的 Requirement 和 Scenario 为准。
348
+
349
+ ## 阅读范围
350
+
351
+ <In scope / Out of scope Mermaid 或列表>
352
+
353
+ ## Requirement ID 对照
354
+
355
+ | Requirement ID | `spec.md` Requirement | 关联流程 |
356
+ | --- | --- | --- |
357
+ | `REQ-XXX-01` | `<Requirement 名称>` | `FLOW-XXX-01` |
358
+
359
+ ## FLOW-XXX-01:<中文流程名>
360
+
361
+ <一句话说明该流程表达什么。>
362
+
363
+ ```mermaid
364
+ flowchart TD
365
+ A["用户动作"]
366
+ B["系统可见反馈"]
367
+ A --> B
368
+ ```
369
+
370
+ 阅读要点:
371
+ - <研发/测试需要关注的边界>
372
+
373
+ 关联 Requirements:
374
+ - `REQ-XXX-01`:`<Requirement 名称>`
375
+
376
+ ## 流程与 Requirement 索引
377
+
378
+ | 流程 ID | 核心关注点 | Requirement IDs |
379
+ | --- | --- | --- |
380
+ | `FLOW-XXX-01` | `<流程摘要>` | `REQ-XXX-01` |
381
+ ````
382
+
383
+ 图表规则:
384
+
385
+ - 普通用户交互主线用 Mermaid `flowchart`。
386
+ - 并发、乱序返回、回调、超时、reset 后旧响应隔离等时序逻辑用 `sequenceDiagram`。
387
+ - 节点、分支和注释使用中文;保留项目既有技术术语,例如 `pending`、`answer`、`pre_session`、`Agent`。
388
+ - 交互流程图表达“用户动作与可见结果”;payload 构建、状态派生等实现细节只在它们帮助研发/测试理解验收边界时保留。
389
+ - 每个流程块必须列出关联的 Requirement ID。
390
+ - 文档必须同时提供 `Requirement -> Flow` 和 `Flow -> Requirement` 两种索引。
391
+
392
+ ## Spec / Flow Alignment Review
393
+
394
+ 写入 `spec.md` 和 `interaction-flow.md` 后执行对齐检查:
395
+
396
+ 1. 每个 `REQ-...` 在 `spec.md` 中真实存在。
397
+ 2. `interaction-flow.md` 引用的每个 `REQ-...` 都能在 `spec.md` 找到。
398
+ 3. 每个主 spec Requirement 至少能在 `interaction-flow.md` 的对照表或流程索引中找到对应项;若某 Requirement 没有交互流程,必须说明它是范围边界、排除项、后台契约或其它非交互规则。
399
+ 4. 每个 `FLOW-...` 至少关联一个 Requirement ID。
400
+ 5. 每个被引用的 `FLOW-...` 都有对应的 `## FLOW-...` 章节。
401
+ 6. 每个 `## FLOW-...` 章节都出现在 `流程与 Requirement 索引` 中。
402
+ 7. `Requirement -> Flow` 对照表、每个 flow 章节的“关联 Requirements”、`Flow -> Requirement` 索引三处映射必须一致。
403
+ 8. 每个 flow 的用户动作、触发条件、系统可见反馈、异常分支和边界处理必须与对应 Requirement 及其 Scenario 的 GIVEN/WHEN/THEN 逻辑一致。
404
+ 9. `interaction-flow.md` 不新增 `spec.md` 没有承认的规范性 `SHALL/MUST`、业务规则、可见结果或异常处理。
405
+ 10. 运行:
406
+
407
+ ```bash
408
+ git diff --check
409
+ openspec validate --specs --strict --json
410
+ ```
411
+
412
+ 如果当前 CLI / 工具环境支持 multi-agent 或 subagent 能力,在完成本地对齐检查后派生一个独立子 agent 做二次审查。先检查当前会话是否暴露 multi-agent/subagent 工具;例如可通过可用工具列表、`tool_search` 查询 `multi-agent`,或当前 CLI 的 agent/subagent 帮助命令确认。若不可用,记录“multi-agent unavailable”并继续人工检查。
413
+
414
+ 子 agent 审查要求:
415
+
416
+ - 只给子 agent 原始产物路径:`openspec/specs/<capability>/spec.md` 和 `openspec/specs/<capability>/interaction-flow.md`。
417
+ - 不泄露你的结论、预期答案或已知问题。
418
+ - 让子 agent 检查 Requirement ID 是否存在、Flow ID 是否完整、双向索引是否一致。
419
+ - 让子 agent 逐项对比流程图与对应 Requirement / Scenario 的 BDD 逻辑,确认 GIVEN 初始状态、WHEN 用户动作或系统事件、THEN 可见结果、异常分支和边界处理没有偏离。
420
+ - 让子 agent 检查流程图是否新增未被主 spec 承认的规范性规则、可见结果或异常处理。
421
+ - 子 agent 不应修改文件;它只返回发现的问题和建议。
422
+ - 如果子 agent 发现真实不一致,修正后重新运行本地对齐检查和 OpenSpec strict 校验。
423
+
424
+ ## Discovery Report 回写
425
+
426
+ 处理 capability 后,回写 Product Capability Backlog:
427
+
428
+ - `未完成 -> 进行中`:用户选择该行并开始恢复。
429
+ - `进行中 -> 已完成`:主 spec 和 `interaction-flow.md` 已创建或更新,用户已接受,通过 review checks,包含 `Purpose`、`Requirements`、代表性 Scenario、非规范性 `Code Scope`、Requirement ID、Flow ID 和双向索引。
430
+ - `未完成/进行中 -> 暂缓`:产品意图、运行时访问、外部系统证据、凭据或证据冲突阻塞规范性恢复。
431
+ - `暂缓 -> 进行中`:blocker 已解除并重新开始恢复。
432
+
433
+ 不要因为 GitNexus process、route、API group 或代码 owner 已归属,就标记为 `已完成`。完成必须有已接受主 spec。
434
+
435
+ 当 capability 被拆分时,更新 ledger,使每个 route/API/store/process owner 指向新的子 capability 或明确 exclusion。
436
+
437
+ 当 capability 被排除时,从 Product Capability Backlog 移除,并在对应 unknown、implementation detail 或 tooling 章节记录证据和原因。
438
+
439
+ ## 停止条件
440
+
441
+ 遇到以下情况时,停止并询问用户:
442
+
443
+ - 请求范围过大,无法安全审查。
444
+ - 证据冲突,并且影响产品行为判断。
445
+ - 写入会删除或重写已接受范围之外的现有主 spec 内容。
446
+ - 验证需要当前不可用的登录、数据、凭据或运行环境。
447
+ - 用户要求修改应用代码;此时切换到合适的 OpenSpec change 工作流。
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: openspec-new-change
3
+ description: 使用实验性的 artifact 工作流创建一个新的 OpenSpec 变更。适用于用户想用结构化步骤创建新功能、修复或修改时。
4
+ license: MIT
5
+ compatibility: 需要 openspec CLI。
6
+ metadata:
7
+ author: openspec
8
+ version: "1.0"
9
+ generatedBy: "1.3.1"
10
+ projectOverlay: "sdd-e2e"
11
+ ---
12
+
13
+ 使用 artifact 驱动方式创建一个新的 OpenSpec 变更。
14
+
15
+ 本项目已经集成 project-local schema:`sdd-e2e`。原生 schema 入口是 `openspec/schemas/sdd-e2e/schema.yaml`;流程规范入口是 `openspec/sdd-e2e-flow.md`。不要再使用 `schemaFile` fallback 来模拟 schema。
16
+
17
+ **输入**:用户请求中应该包含一个变更名称(kebab-case),或者包含他们想构建内容的描述。
18
+
19
+ **步骤**
20
+
21
+ 1. **如果没有清晰输入,先询问用户想构建什么**
22
+
23
+ 使用 **AskUserQuestion tool**(开放式问题,不提供预设选项)询问:
24
+ > "你想处理哪个变更?请描述你想构建或修复的内容。"
25
+
26
+ 根据用户描述推导 kebab-case 名称,例如 `"add user authentication"` -> `add-user-auth`。
27
+
28
+ **重要**:在理解用户想构建什么之前,不要继续执行。
29
+
30
+ 2. **确定工作流 schema**
31
+
32
+ 先运行:
33
+ ```bash
34
+ openspec schemas --json
35
+ ```
36
+
37
+ 如果结果中包含 source 为 `project` 的 `sdd-e2e`,则说明项目级流程已接入 OpenSpec CLI。
38
+
39
+ **默认选择 `sdd-e2e` 的情况**:变更涉及 UI 行为、交互状态、异步请求、配置表单、发布流程、跨视图同步,或需要 phase E2E 验收。
40
+
41
+ **只有在用户提到以下内容时,才使用不同 schema:**
42
+ - 指定了具体 schema 名称 -> 使用 `--schema <name>`
43
+ - 提到 "show workflows" 或 "what workflows" -> 运行 `openspec schemas --json` 并让用户选择
44
+ - 明确要求轻量流程、纯文案、样式微调或无状态小修 -> 可以使用默认 `spec-driven`
45
+
46
+ 如果需求应使用 `sdd-e2e`,但 `openspec schemas --json` 未列出该 schema,停止并提示先修复项目 schema 集成;不要静默 fallback 到 `spec-driven`。
47
+
48
+ 3. **创建变更目录**
49
+ ```bash
50
+ openspec new change "<name>" --schema sdd-e2e
51
+ ```
52
+ 如果已经明确选择其他 schema,改用对应的 `--schema <name>`;如果使用默认 `spec-driven`,可省略 `--schema`。
53
+
54
+ 命令会在 `openspec/changes/<name>/` 下创建 `.openspec.yaml`。对于 `sdd-e2e`,文件应至少包含:
55
+ ```yaml
56
+ schema: sdd-e2e
57
+ ```
58
+
59
+ 4. **展示 artifact 状态**
60
+ ```bash
61
+ openspec status --change "<name>"
62
+ ```
63
+ 该命令会显示哪些 artifact 需要创建、哪些已就绪(依赖已满足)。
64
+
65
+ 5. **获取第一个 artifact 的创建说明**
66
+
67
+ 第一个 artifact 取决于 schema,例如 spec-driven 工作流通常是 `proposal`。
68
+ 查看 status 输出,找到第一个状态为 `"ready"` 的 artifact。
69
+ ```bash
70
+ openspec instructions <first-artifact-id> --change "<name>"
71
+ ```
72
+ 该命令会输出创建第一个 artifact 所需的模板和上下文。
73
+
74
+ 6. **停止并等待用户指示**
75
+
76
+ **输出**
77
+
78
+ 完成上述步骤后,汇总:
79
+ - 变更名称和位置
80
+ - 当前使用的 schema / 工作流,以及 artifact 顺序
81
+ - 当前状态(0/N 个 artifact 已完成)
82
+ - 第一个 artifact 的模板
83
+ - 提示语:"已准备好创建第一个 artifact。你可以描述这个变更的背景,我来起草;也可以直接让我继续。"
84
+
85
+ **约束**
86
+ - 此时不要创建任何 artifact,只展示说明
87
+ - 不要越过第一个 artifact 模板继续推进
88
+ - 如果名称不合法(不是 kebab-case),要求用户提供合法名称
89
+ - 如果同名变更已经存在,建议继续该变更
90
+ - 如果使用非默认工作流,必须传 `--schema`
91
+ - 使用 `sdd-e2e` 时,后续 artifact 顺序以 `openspec/schemas/sdd-e2e/schema.yaml` 为准:proposal -> specs -> features -> test-cases -> design -> tasks -> phase acceptance -> final acceptance -> archive
92
+ - OpenSpec `status` 只表示 artifact 文件是否存在;phase gate 和 final acceptance 以 `pnpm sdd:*` 命令为准
@@ -0,0 +1,132 @@
1
+ ---
2
+ name: openspec-propose
3
+ description: 一次性提出一个新的 OpenSpec 变更并生成所有必要 artifact。适用于用户想快速描述需求,并得到可进入实现阶段的 proposal、design、specs 和 tasks。
4
+ license: MIT
5
+ compatibility: 需要 openspec CLI。
6
+ metadata:
7
+ author: openspec
8
+ version: "1.0"
9
+ generatedBy: "1.3.1"
10
+ projectOverlay: "sdd-e2e"
11
+ ---
12
+
13
+ 提出一个新变更:创建 change,并一次性生成实现前所需的所有 artifact。
14
+
15
+ 我会创建包含以下 artifact 的变更:
16
+ - `proposal.md`:做什么、为什么做
17
+ - `specs/**/spec.md`:需求行为和业务规则
18
+ - `specs/**/features/*.feature`:由 specs 扩写的验收契约
19
+ - `test-cases.md`:覆盖矩阵和 phase 摘要
20
+ - `design.md`:如何实现
21
+ - `tasks.md`:实现步骤
22
+
23
+ 准备开始实现时,运行 `/opsx:apply`。
24
+
25
+ 项目验证扩展:
26
+ - 当前项目支持原生 project-local schema:`openspec/schemas/sdd-e2e/schema.yaml`。
27
+ - 对于 `schema: sdd-e2e` 的变更,features 和 test-cases 是必需 artifact,不是可选测试附件。
28
+ - 对于默认 `spec-driven` 变更,不要自动加塞 sdd-e2e artifact;只有用户明确要求补充 phase 验证时才生成项目验证 artifact。
29
+ - 生成的 Scenario 标签(`@phase:*`、`@validation:*`、`@req:*`)应当影响 design 中的风险分析,以及 tasks 中的 phase 分组。
30
+
31
+ ---
32
+
33
+ **输入**:用户请求中应该包含一个变更名称(kebab-case),或者包含他们想构建内容的描述。
34
+
35
+ **步骤**
36
+
37
+ 1. **如果没有清晰输入,先询问用户想构建什么**
38
+
39
+ 使用 **AskUserQuestion tool**(开放式问题,不提供预设选项)询问:
40
+ > "你想处理哪个变更?请描述你想构建或修复的内容。"
41
+
42
+ 根据用户描述推导 kebab-case 名称,例如 `"add user authentication"` -> `add-user-auth`。
43
+
44
+ **重要**:在理解用户想构建什么之前,不要继续执行。
45
+
46
+ 2. **创建变更目录**
47
+ ```bash
48
+ openspec new change "<name>" --schema sdd-e2e
49
+ ```
50
+ 对 UI 行为、交互状态、异步请求、配置表单、发布流程、跨视图同步或需要 phase E2E 的需求,默认使用 `--schema sdd-e2e`。
51
+
52
+ 创建前先确认 schema 可用:
53
+ ```bash
54
+ openspec schemas --json
55
+ ```
56
+ 如果 `sdd-e2e` 未出现在 schema 列表中,停止并提示先修复 OpenSpec 集成;不要创建 `spec-driven` 后手动伪装成 sdd-e2e。
57
+
58
+ 3. **获取 artifact 构建顺序**
59
+ ```bash
60
+ openspec status --change "<name>" --json
61
+ ```
62
+ 解析 JSON,得到:
63
+ - `applyRequires`:进入实现前必须完成的 artifact ID 数组,例如 `["tasks"]`
64
+ - `artifacts`:所有 artifact 的列表,包含状态和依赖关系
65
+
66
+ 4. **按顺序创建 artifact,直到满足 apply-ready 条件**
67
+
68
+ 使用 **TodoWrite tool** 跟踪 artifact 创建进度。
69
+
70
+ 按依赖顺序遍历 artifact(优先处理没有未完成依赖的 artifact):
71
+
72
+ a. **对于每个状态为 `ready`(依赖已满足)的 artifact**:
73
+ - 获取创建说明:
74
+ ```bash
75
+ openspec instructions <artifact-id> --change "<name>" --json
76
+ ```
77
+ - instructions JSON 包含:
78
+ - `context`:项目背景(给你的约束,不要写入输出文件)
79
+ - `rules`:artifact 级规则(给你的约束,不要写入输出文件)
80
+ - `template`:输出文件应使用的结构
81
+ - `instruction`:该 artifact 类型的 schema 指南
82
+ - `outputPath`:应写入的位置
83
+ - `dependencies`:需要读取的已完成依赖 artifact
84
+ - 读取所有已完成依赖文件作为上下文
85
+ - 使用 `template` 作为结构创建 artifact 文件
86
+ - 写作时遵守 `context` 和 `rules`,但不要把它们复制进文件
87
+ - 简短展示进度:"已创建 <artifact-id>"
88
+
89
+ b. **持续创建,直到所有 `applyRequires` artifact 都完成**
90
+ - 每创建一个 artifact 后,重新运行 `openspec status --change "<name>" --json`
91
+ - 检查 `applyRequires` 中的每个 artifact ID 是否都在 `artifacts` 数组中显示 `status: "done"`
92
+ - 全部完成后停止
93
+ - 对 `schema: sdd-e2e`,按 schema artifact 顺序创建:proposal -> specs -> features -> test-cases -> design -> tasks。不得在 features/test-cases 缺失时创建 design 或 tasks。
94
+ - 对 `schema: sdd-e2e`,创建 tasks 后停止;final-acceptance 是实现和 phase report 完成后的收口 artifact,不在 propose 阶段提前生成。
95
+
96
+ c. **如果某个 artifact 需要用户补充输入**(上下文不清晰):
97
+ - 使用 **AskUserQuestion tool** 澄清
98
+ - 然后继续创建
99
+
100
+ 5. **展示最终状态**
101
+ ```bash
102
+ openspec status --change "<name>"
103
+ ```
104
+
105
+ **输出**
106
+
107
+ 完成所有 artifact 后,汇总:
108
+ - 变更名称和位置
109
+ - 已创建 artifact 列表及简短说明
110
+ - 已创建的项目验证 artifact,例如 `specs/**/features/*.feature` 和 `test-cases.md`
111
+ - 当前就绪状态:"所有 artifact 已创建,可以开始实现。"
112
+ - 提示语:"运行 `/opsx:apply`,或直接让我开始实现 tasks。"
113
+
114
+ **Artifact 创建准则**
115
+
116
+ - 遵循 `openspec instructions` 中每种 artifact 的 `instruction` 字段
117
+ - schema 决定每个 artifact 应包含的内容,必须按 schema 执行
118
+ - 创建新 artifact 前,先读取依赖 artifact
119
+ - 使用 `template` 作为输出文件结构,并填充各节
120
+ - **重要**:`context` 和 `rules` 是给你的约束,不是文件内容
121
+ - 不要把 `<context>`、`<rules>`、`<project_context>` 块复制到 artifact 文件中
122
+ - 它们只指导你如何写,绝不能出现在最终输出中
123
+
124
+ **约束**
125
+ - 创建进入实现所需的全部 artifact(由 schema 的 `apply.requires` 定义)
126
+ - 创建新 artifact 前必须读取依赖 artifact
127
+ - 如果上下文严重不清楚,询问用户;但优先做合理决策,保持推进
128
+ - 如果同名变更已存在,询问用户是继续该变更还是创建新变更
129
+ - 每创建一个 artifact 后,先确认文件确实存在,再继续下一个
130
+ - 如果生成了 `.feature` 文件,必须确认每个 Scenario 都有 `@phase:*`、`@validation:*` 和 `@req:*` 标签,然后才能用它们塑造 tasks
131
+ - 如果 `.openspec.yaml` 声明 `schema: sdd-e2e`,还必须确认每个 Scenario 都有 `@p0|@p1|@p2` 优先级标签,并运行 `pnpm sdd:lint-features <change>` 与 `pnpm sdd:lint-tasks <change>`
132
+ - OpenSpec `status.isComplete` 只代表 artifact 文件存在;不要把它当成 SDD final acceptance 结论