kld-sdd 2.4.13 → 2.4.15

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.
@@ -1,433 +0,0 @@
1
- ---
2
- name: OPSX: Task
3
- description: "创建任务拆解文档 - 针对单一 Capability 的 DAG 任务清单"
4
- argument-hint: "[change-name] [capability-name] [上下文文件...]"
5
- ---
6
-
7
- 创建 **tasks.md** - 针对单一 Capability 的 AI 编码引擎执行单元(支持拓扑依赖管理)。
8
-
9
- > **🖥️ 跨平台执行规则**
10
- > - 先确认当前终端工作目录是项目根目录;若不是,先 `cd` 到项目根目录。
11
- > - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
12
- > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
- > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
- > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
-
17
- > **⚠️ 阶段边界提示**
18
- >
19
- > 当前处于 **Task(任务拆解)阶段**,此阶段:
20
- > - ✅ **允许**:创建/编辑 tasks.md 文档、读取代码作为任务分析参考
21
- > - ❌ **禁止**:创建/修改任何代码文件、执行代码生成、运行测试
22
- > - ⛔ **单阶段原则**:完成 tasks.md 后**必须立即停止**,等待用户主动触发下一阶段
23
- >
24
- > tasks.md 定义的是「待执行的任务清单」,**不是立即执行代码**。
25
- > 用户确认任务后,使用 `/opsx:apply` 进入实施阶段执行代码操作。
26
- > **完成本阶段后,绝对禁止自动继续执行 apply/check 等后续阶段。**
27
-
28
- > **⚠️ 渐进式上下文加载原则**
29
- >
30
- > - 本命令针对**单一 Capability** 执行任务拆解
31
- > - **输入路径**:`changes/<name>/specs/<capability>/design.md`
32
- > - **输出路径**:`changes/<name>/specs/<capability>/tasks.md`
33
- > - ⛔ **隔离红线**:绝对禁止跨目录读取同级其他 Capability 的文档
34
-
35
- ---
36
-
37
- **前置要求**: 已运行 `/opsx:design` 或对应 capability 的 design.md 已存在
38
-
39
- **执行步骤**
40
-
41
- 0. **【Telemetry 必做】记录阶段开始**
42
-
43
- 在终端执行(若命令失败必须中止本阶段,不得跳过):
44
- ```bash
45
- node skywalk-sdd/log.cjs start --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
46
- ```
47
- 保存输出 JSON 中的 `event_id`,供阶段结束使用。
48
-
49
- 1. **【交互引导】确认变更名称和 Capability**
50
-
51
- **步骤 1a - 确认变更名称**:
52
- 若未提供 change-name,列出当前所有变更供用户选择:
53
- ```bash
54
- openspec list
55
- ```
56
-
57
- **步骤 1b - 确认 Capability**:
58
- 若未提供 capability-name,读取已存在 design.md 的 Capability 列表,使用 **AskUserQuestion** 让用户选择:
59
- > "请选择要拆解任务的 Capability:
60
- > - A. user-auth(用户认证)- design.md ✅ 已存在
61
- > - B. user-profile(用户资料)- design.md ✅ 已存在
62
- > - C. data-export(数据导出)- design.md ❌ 未设计"
63
-
64
- **【路径确认】**:
65
- > "📍 当前操作目标:
66
- > - **变更**:`<change-name>`
67
- > - **Capability**:`<capability-name>`
68
- > - **输入**:`changes/<name>/specs/<capability>/design.md`
69
- > - **输出**:`changes/<name>/specs/<capability>/tasks.md`"
70
-
71
- 2. **【渐进式上下文加载】严格按顺序读取文档**
72
-
73
- > **⛔ 上下文加载红线**:必须严格按以下顺序加载,禁止一次性加载所有 Capability!
74
-
75
- **加载顺序**(由全局到局部):
76
-
77
- ```
78
- ┌─────────────────────────────────────────────────────────┐
79
- │ 第 1 层:全局基线(必读) │
80
- │ → openspec/specs/overview.md │
81
- │ (全局数据字典、接口规范、共享实体) │
82
- └─────────────────────────────────────────────────────────┘
83
-
84
- ┌─────────────────────────────────────────────────────────┐
85
- │ 第 2 层:宏观背景(必读) │
86
- │ → changes/<name>/proposal.md │
87
- │ (业务意图、影响范围) │
88
- └─────────────────────────────────────────────────────────┘
89
-
90
- ┌─────────────────────────────────────────────────────────┐
91
- │ 第 3 层:精准打击(仅读当前 Capability) │
92
- │ → changes/<name>/specs/<capability>/spec.md │
93
- │ → changes/<name>/specs/<capability>/design.md │
94
- │ │
95
- │ ⛔ 隔离红线:禁止读取其他 Capability 的文档! │
96
- └─────────────────────────────────────────────────────────┘
97
- ```
98
-
99
- **执行加载**:
100
- ```
101
- 使用 Read 工具依次读取:
102
- 1. openspec/specs/overview.md(若不存在则跳过,记录警告)
103
- 2. changes/<name>/proposal.md
104
- 3. changes/<name>/specs/<capability>/spec.md
105
- 4. changes/<name>/specs/<capability>/design.md(必须存在)
106
- ```
107
-
108
- **若 design.md 不存在**:
109
- > "❌ 当前 Capability 的 design.md 不存在,请先运行:
110
- > `/opsx:design <change-name> <capability-name>`"
111
-
112
- 3. **【关键步骤】读取本地模板文件**
113
-
114
- **必须先读取** `openspec-templates/tasks.md` 作为文档结构模板:
115
- ```
116
- 使用 Read 工具读取:openspec-templates/tasks.md
117
- ```
118
-
119
- 此模板定义了局部任务文档的完整结构:
120
- - **任务执行拓扑图**
121
- - 原子任务清单(带依赖字段)
122
- - 验证方式
123
- - 质量红线检查清单
124
-
125
- 4. **【任务范围分析】统计需要覆盖的实现点**
126
-
127
- 分析 design.md 内容,统计:
128
- - 前端组件数量:[X] 个
129
- - 后端接口数量:[X] 个
130
- - 数据表数量:[X] 张
131
- - 外部集成点:[X] 个
132
-
133
- **【预估任务数量】**:
134
- 基于设计复杂度,预估任务数量:
135
- > "基于 `<capability>` 的 design.md,预计需要 [X] 个原子任务:
136
- > - 数据层任务:[数量]
137
- > - 接口层任务:[数量]
138
- > - UI 层任务:[数量]
139
- > - 测试任务:[数量]
140
- >
141
- > 请确认任务粒度是否合适,或调整拆分策略:"
142
-
143
- 5. **【交互引导】确认测试策略**
144
-
145
- **❗ 必须主动确认用户的测试策略选择**
146
-
147
- 首先读取 `proposal.md` 的 YAML frontmatter 中的 `test-strategy` 字段:
148
-
149
- **若已设置**:向用户确认
150
- > "🧪 **当前测试策略:[test-strategy]**
151
- >
152
- > - `tdd`: 测试驱动 - 测试任务作为实现任务的前置依赖
153
- > - `impl-first`: 实现优先 - 先实现后测试
154
- > - `none`: 无测试 - 不生成测试任务
155
- >
156
- > 是否继续使用该策略?"
157
-
158
- **若未设置**:使用 **AskUserQuestion** 询问
159
- > "🧪 **未检测到测试策略配置,请选择:**
160
- >
161
- > **A) 测试驱动 (TDD)** - 测试先行
162
- > - 先生成测试任务骨架,实现任务依赖测试任务
163
- > - DAG 顺序:测试骨架 → 实现代码 → 测试验证
164
- > - 适合:核心业务逻辑、质量要求高
165
- >
166
- > **B) 实现优先** - 代码先行
167
- > - 先生成实现任务,测试作为验证步骤
168
- > - DAG 顺序:实现代码 → 测试验证
169
- > - 适合:UI 层、配置类、快速原型
170
- >
171
- > **C) 无测试** - 仅实现
172
- > - 不生成测试任务,仅编译检查
173
- > - 适合:简单配置、文档更新"
174
-
175
- 根据用户选择设置 `test-strategy`,并更新 proposal.md 的 frontmatter(若未设置)。
176
-
177
- 6. **【交互引导】确认任务拆解策略**
178
-
179
- 在开始拆解前,向用户确认策略:
180
- > "基于 design.md,本次 tasks.md 拆解策略:
181
- > - **Capability**:`<capability-name>`
182
- > - 拆解维度:按 [数据层→接口层→UI层→测试] 顺序
183
- > - 任务粒度:每个任务约 5 分钟完成
184
- > - 预计任务数:[X] 个
185
- > - DAG 层级:预计 [X] 层
186
- >
187
- > 请确认:
188
- > - A. 确认策略,开始拆解
189
- > - B. 调整任务粒度(更细/更粗)
190
- > - C. 优先处理特定模块"
191
-
192
- **根据 test-strategy 调整 DAG 生成规则:**
193
-
194
- | test-strategy | DAG 生成规则 |
195
- |---------------|---------------|
196
- | `tdd` | 每个实现任务前必须有对应的测试任务,实现任务 Depends-On 测试任务 |
197
- | `impl-first` | 实现任务在前,测试任务 Depends-On 实现任务 |
198
- | `none` | 不生成测试任务,仅编译检查 |
199
-
200
- 6. **【AI 分析澄清】识别任务风险**
201
-
202
- 分析 design.md,识别任务拆解中的风险点:
203
-
204
- **常见风险点**:
205
- - 任务间循环依赖
206
- - 复杂算法实现难度
207
- - 第三方集成不确定性
208
- - 测试覆盖盲区
209
-
210
- **【主动询问机制】**:
211
- 发现潜在风险时:
212
- > "design.md 中 [模块/功能] 存在实现风险:
213
- > - 风险描述:[具体描述]
214
- > - 影响范围:[影响的任务]
215
- > - 建议方案:[应对方案]
216
- >
217
- > 请确认如何处理,或提供更多信息:"
218
-
219
- 8. **创建局部 tasks.md(含 DAG 拓扑)**
220
-
221
- **输出路径**:`changes/<name>/specs/<capability>/tasks.md`
222
-
223
- **以 `openspec-templates/tasks.md` 的结构为骨架**,填充内容:
224
-
225
- **【质量红线】生成的 tasks.md 必须:**
226
- - 标题包含 Capability 名称
227
- - 包含**任务执行拓扑图(DAG)**
228
- - 每个任务包含 **Depends-On** 字段
229
- - 每个任务颗粒度 ≤ 5 分钟
230
- - 100% 覆盖 design.md 的设计内容
231
-
232
- ```markdown
233
- # 实施任务拆解 - [Capability 名称]
234
-
235
- > **⚠️ 边界声明**:本任务清单仅服务于当前 Capability。
236
-
237
- ## 1. 任务总览
238
-
239
- ### 1.1 关联文档
240
- | 文档 | 路径 | 说明 |
241
- |-----|------|------|
242
- | 全局契约 | `openspec/specs/overview.md` | 全局约束基线 |
243
- | 业务意图 | `proposal.md` | 变更背景 |
244
- | 技术契约 | `specs/[capability]/spec.md` | 当前能力规格 |
245
- | 技术方案 | `specs/[capability]/design.md` | 当前能力设计 |
246
-
247
- ### 1.2 实现范围
248
- <!-- 本次编码要覆盖的功能范围 -->
249
-
250
- ### 1.3 技术栈
251
- - 语言:
252
- - 框架:
253
- - 依赖:
254
-
255
- ---
256
-
257
- ## 2. 任务执行拓扑图
258
-
259
- ### 2.0 测试策略
260
- **当前测试策略**:`[测试驱动 | 实现优先 | 无测试]`
261
-
262
- ### 2.1 拓扑图
263
- ```
264
- 层级 1 (无依赖): TASK-XXX-01, TASK-XXX-02
265
- 层级 2 (依赖 L1): TASK-XXX-03
266
- 层级 3 (依赖 L2): TASK-XXX-04
267
- ```
268
-
269
- ### 2.2 层级汇总
270
- | 层级 | 任务列表 | 可并行 | 前置依赖 |
271
- |-----|---------|-------|--------|
272
- | 层级 1 | TASK-XXX-01, TASK-XXX-02 | ✅ 是 | 无 |
273
- | 层级 2 | TASK-XXX-03 | - | 层级 1 |
274
-
275
- ---
276
-
277
- ## 3. 原子任务清单
278
-
279
- ### 3.0 任务类型说明
280
- | 类型 | 说明 | 适用场景 |
281
- |------|------|----------|
282
- | 数据层 | 实体、DTO、Mapper、数据访问 | 数据库操作相关 |
283
- | 接口层 | Service、Controller、API | 业务逻辑和接口 |
284
- | UI层 | 组件、页面、样式 | 前端展示相关 |
285
- | 测试-骨架 | 测试类结构、Mock设置 | 测试驱动模式下的前置任务 |
286
- | 测试-验证 | 测试用例实现、断言 | 实现后的验证任务 |
287
- | 配置 | 配置文件、依赖添加 | 项目配置相关 |
288
-
289
- ---
290
-
291
- ### [TASK-XXX-01] 任务名称
292
- - **类型**: 数据层 / 接口层 / UI层 / 测试
293
- - **依赖**: 无
294
- - **状态**: [ ] 未完成(勾选格式统一使用 GitHub 标准的 `- [ ]` / `- [x]`)
295
-
296
- #### 任务描述
297
- <!-- 一句话描述本任务要做什么 -->
298
- #### 输入
299
- #### 输出
300
- #### 实现步骤
301
- 1.
302
- 2.
303
- #### 验收标准
304
- - [ ] 验收标准 1
305
- #### 关联设计
306
- - spec.md 章节:
307
- - design.md 章节:
308
-
309
- ---
310
-
311
- ## 4. 验证方式
312
-
313
- ### 4.1 单元测试要求
314
- | 任务 ID | 测试类型 | 测试场景 | 断言内容 |
315
- |--------|---------|---------|--------|
316
-
317
- ### 4.2 集成测试场景
318
- | 场景 | 前置条件 | 操作步骤 | 预期结果 |
319
- |-----|---------|---------|--------|
320
-
321
- ### 4.3 手动验证清单
322
- - [ ] 验证项 1
323
-
324
- ---
325
-
326
- ## 5. 外部依赖
327
- | 依赖项 | 类型 | 提供方 | 状态 | 备注 |
328
- |-------|------|-------|------|------|
329
- | | 其他能力 / 第三方 | | ✅ 就绪 / ⏳ 等待 | |
330
-
331
- ---
332
-
333
- ## 6. 代码规范
334
- ### 6.1 命名规范
335
- - 类名:
336
- - 方法名:
337
- - 变量名:
338
- ### 6.2 代码风格
339
- - 缩进:
340
- - 注释:
341
- - 异常处理:
342
- ### 6.3 日志规范
343
- - 日志级别:
344
- - 日志格式:
345
-
346
- ---
347
-
348
- ## 7. 交付物
349
- ### 7.1 代码文件
350
- | 文件路径 | 说明 | 对应任务 |
351
- |---------|------|--------|
352
-
353
- ### 7.2 测试文件
354
- | 文件路径 | 说明 | 对应任务 |
355
- |---------|------|--------|
356
-
357
- ### 7.3 文档更新
358
- - [ ] README 更新
359
- - [ ] 接口文档更新
360
- - [ ] 变更日志更新
361
-
362
- ---
363
-
364
- > **质量红线检查清单**
365
- > - [ ] 每个任务颗粒度符合“5分钟可实现”标准
366
- > - [ ] 任务清单 100% 覆盖 spec.md 定义
367
- > - [ ] 任务清单 100% 覆盖 design.md 定义
368
- > - [ ] 每个任务都有明确的验收标准
369
- > - [ ] 每个任务都有对应的单元测试要求
370
- > - [ ] **依赖拓扑已明确**(依赖字段已填写)
371
- > - [ ] **任务执行拓扑图已绘制**(层级关系清晰)
372
- > - [ ] 无循环依赖
373
- ```
374
-
375
- 9. **质量红线自检【100% 覆盖检查】**
376
-
377
- 写入文档前,逐项确认:
378
- - [ ] 文档结构完全符合 `openspec-templates/tasks.md` 模板
379
- - [ ] **拓扑图已绘制**:层级关系清晰
380
- - [ ] **依赖字段已填写**:每个任务的依赖已明确
381
- - [ ] **无循环依赖**:拓扑中不存在环
382
- - [ ] 每个任务颗粒度符合"5 分钟可实现"标准
383
- - [ ] 任务清单 100% 覆盖 spec.md 定义
384
- - [ ] 任务清单 100% 覆盖 design.md 定义
385
- - [ ] 每个任务都有明确的验收标准
386
-
387
- **如有任意一项未满足,重新生成对应章节,直至全部通过。**
388
-
389
- 10. **【交互引导】确认任务并输出结果**
390
-
391
- 生成文档后,向用户展示概要:
392
- > "已生成 `<capability>` 的 tasks.md,概要如下:
393
- > - **Capability**:`<capability-name>`
394
- > - **输出路径**:`changes/<name>/specs/<capability>/tasks.md`
395
- > - **总任务数**:[X] 个
396
- > - **DAG 层级**:[X] 层
397
- > - **层级 1(可并行)**:[X] 个任务
398
- > - 数据层:[X] 个 / 接口层:[X] 个 / UI层:[X] 个
399
- >
400
- > 请确认:
401
- > - A. 确认无误,准备执行
402
- > - B. 需要调整任务
403
- > - C. 继续拆解下一个 Capability"
404
-
405
- **下一步提示**:
406
- - 若还有其他 Capability 未拆解:
407
- > "运行 `/opsx:task <name> <next-capability>` 继续拆解下一个 Capability"
408
- - 若所有 Capability 已拆解完成:
409
- > "运行 `/opsx:check` 验证后,执行 `/opsx:apply <name> <capability>` 开始实现"
410
-
411
- ---
412
-
413
- **护栏规则**
414
-
415
- - **必须以 `openspec-templates/tasks.md` 为模板基准**
416
- - **⛔ 渐进式加载**:严格按 overview.md → proposal.md → 当前 spec.md → design.md 顺序加载
417
- - **⛔ 隔离红线**:绝对禁止读取同级其他 Capability 的文档
418
- - **⛔ 拓扑必须完整**:每个任务必须有依赖字段,任务拓扑图必须绘制
419
- - **⛔ 无循环依赖**:拓扑中不允许存在环
420
- - 任务颗粒度宁可过细也不要过粗,复杂任务继续拆分为子任务
421
- - 验收标准必须是可验证的(能通过测试或人工检查确认)
422
- - `context` 和 `rules` 是你的约束条件,**不得出现在生成的文档中**
423
- - 文档写入后验证文件确实存在于输出路径
424
- - **⛔ 阶段边界**:本阶段只创建任务清单,禁止直接执行代码操作
425
- - **⛔ 单阶段原则:完成 tasks.md 后必须立即停止**。仅提示用户下一步可运行 `/opsx:check` 或 `/opsx:apply`,**绝对禁止自动执行 apply/check 等后续阶段**。每个阶段必须由用户主动触发。
426
-
427
- > **🖥️ 跨平台执行规则**
428
- > - 先确认当前终端工作目录是项目根目录;若不是,先 `cd` 到项目根目录。
429
- > - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
430
- > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
431
- > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
432
- > **📊 Telemetry(必做,不得跳过)**
433
- > 在终端执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=task --project=. --change=<变更名称> --capability=<capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="一句话摘要"`
@@ -1,244 +0,0 @@
1
- ---
2
- name: OPSX: Test
3
- description: "执行单元测试 - 自动检测并运行测试用例,输出测试报告"
4
- argument-hint: "[test-scope] [options]"
5
- ---
6
-
7
- 执行单元测试 - 自动检测项目中的测试用例并运行,输出结构化测试报告。
8
-
9
- > **🖥️ 跨平台执行规则**
10
- > - 先确认当前终端工作目录是项目根目录;若不是,先 `cd` 到项目根目录。
11
- > - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
12
- > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
13
- > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
14
- > **📊 Telemetry(必做,不得跳过)**
15
- > 在终端执行(必须成功):`node skywalk-sdd/log.cjs start --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>`,记录返回的 event_id。
16
-
17
- > **⚠️ 命令定位**
18
- >
19
- > 本命令专注于**单元测试执行**,是 `/opsx:apply` 流程的可选验证环节。
20
- > - 用户可在完成代码实现后主动调用
21
- > - 输出标准化测试报告,便于质量追踪
22
-
23
- ---
24
-
25
- **执行步骤**
26
-
27
- 0. **【Telemetry 必做】记录阶段开始**
28
-
29
- 在终端执行(若命令失败必须中止本阶段,不得跳过):
30
- ```bash
31
- node skywalk-sdd/log.cjs start --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID>
32
- ```
33
- 保存输出 JSON 中的 `event_id`,供阶段结束使用。
34
-
35
- 1. **【交互引导】确认测试范围**
36
-
37
- 若未提供 test-scope,使用 **AskUserQuestion** 让用户选择:
38
- > "请选择测试执行范围:
39
- > - A. **全量测试** - 运行项目所有测试用例
40
- > - B. **变更相关** - 仅运行当前变更涉及的测试
41
- > - C. **指定文件/目录** - 运行指定路径的测试
42
- > - D. **最近修改** - 运行最近修改文件相关的测试"
43
-
44
- 2. **【自动检测】识别项目类型和测试框架**
45
-
46
- **检测项目类型**:
47
- | 项目标识 | 项目类型 | 测试框架 |
48
- |---------|----------|----------|
49
- | `package.json` | Node.js/TypeScript | Jest / Mocha / Vitest |
50
- | `pom.xml` | Java Maven | JUnit / TestNG |
51
- | `build.gradle` | Java Gradle | JUnit / TestNG |
52
- | `requirements.txt` / `pyproject.toml` | Python | pytest / unittest |
53
- | `go.mod` | Go | go test |
54
- | `Cargo.toml` | Rust | cargo test |
55
- | `*.csproj` | C# / .NET | xUnit / NUnit / MSTest |
56
-
57
- **检测测试文件**:
58
- | 项目类型 | 测试文件模式 |
59
- |---------|-------------|
60
- | TypeScript/JS | `*.test.ts`, `*.spec.ts`, `*.test.js`, `__tests__/` |
61
- | Java | `src/test/java/**/*Test.java`, `*Tests.java` |
62
- | Python | `test_*.py`, `*_test.py`, `tests/` |
63
- | Go | `*_test.go` |
64
- | Rust | `#[cfg(test)]`, `tests/` |
65
- | C# | `*Tests.cs`, `*.Tests/` |
66
-
67
- **显示检测结果**:
68
- > "🔍 **测试环境检测**
69
- > - 项目类型: TypeScript (Node.js)
70
- > - 测试框架: Jest
71
- > - 检测到测试文件: 12 个
72
- > - 测试用例预估: ~45 个"
73
-
74
- 3. **【执行测试】运行测试命令**
75
-
76
- **根据项目类型执行对应命令**:
77
-
78
- | 项目类型 | 测试命令 | 覆盖率命令 |
79
- |---------|----------|-----------|
80
- | Node.js (npm) | `npm test` | `npm test -- --coverage` |
81
- | Node.js (Jest) | `npx jest` | `npx jest --coverage` |
82
- | Node.js (Vitest) | `npx vitest run` | `npx vitest run --coverage` |
83
- | Java Maven | `mvn test` | `mvn test jacoco:report` |
84
- | Java Gradle | `./gradlew test` | `./gradlew test jacocoTestReport` |
85
- | Python | `pytest` | `pytest --cov` |
86
- | Go | `go test ./...` | `go test ./... -cover` |
87
- | Rust | `cargo test` | `cargo tarpaulin` |
88
- | C# | `dotnet test` | `dotnet test --collect:"XPlat Code Coverage"` |
89
-
90
- **执行选项**:
91
- - `--verbose` / `-v`: 显示详细输出
92
- - `--coverage` / `-c`: 生成覆盖率报告
93
- - `--watch` / `-w`: 监听模式(持续运行)
94
- - `--filter <pattern>`: 过滤特定测试
95
-
96
- 4. **【输出报告】生成测试报告**
97
-
98
- **测试报告格式**:
99
- ```markdown
100
- ## 📊 单元测试报告
101
-
102
- **执行时间**: 2024-03-27 14:30:25
103
- **执行范围**: 全量测试
104
- **总耗时**: 12.5s
105
-
106
- ### 测试结果摘要
107
-
108
- | 指标 | 数值 | 状态 |
109
- |------|------|------|
110
- | 总用例数 | 45 | - |
111
- | 通过 | 43 | ✅ |
112
- | 失败 | 2 | ❌ |
113
- | 跳过 | 0 | ⏭️ |
114
- | 通过率 | 95.6% | ⚠️ |
115
-
116
- ### 失败用例详情
117
-
118
- #### ❌ UserService.test.ts > createUser
119
- - **断言失败**: Expected status 200, received 500
120
- - **位置**: `src/services/__tests__/UserService.test.ts:42`
121
- - **可能原因**: 数据库连接未初始化
122
-
123
- #### ❌ AuthController.test.ts > validateToken
124
- - **断言失败**: Token validation timeout
125
- - **位置**: `src/controllers/__tests__/AuthController.test.ts:78`
126
- - **可能原因**: 异步超时设置过短
127
-
128
- ### 覆盖率报告(如启用)
129
-
130
- | 模块 | 行覆盖率 | 分支覆盖率 | 函数覆盖率 |
131
- |------|----------|-----------|-----------|
132
- | services/ | 85.2% | 72.1% | 90.0% |
133
- | controllers/ | 78.5% | 65.3% | 82.4% |
134
- | utils/ | 92.1% | 88.7% | 95.0% |
135
- | **总计** | **83.6%** | **73.2%** | **87.5%** |
136
- ```
137
-
138
- 5. **【交互引导】后续操作建议**
139
-
140
- **全部通过时**:
141
- > "✅ **测试全部通过**
142
- >
143
- > - 通过: 45/45 用例
144
- > - 通过率: 100%
145
- > - 覆盖率: 83.6%
146
- >
147
- > 测试质量良好,可以继续后续流程。
148
- >
149
- > **下一步**:
150
- > - 运行 `/opsx:apply` 继续实施任务
151
- > - 运行 `/opsx:archive` 归档变更"
152
-
153
- **存在失败时**:
154
- > "❌ **存在失败用例**
155
- >
156
- > - 通过: 43/45 用例
157
- > - 失败: 2 个
158
- > - 通过率: 95.6%
159
- >
160
- > 请选择:
161
- > - A. **查看失败详情** - 分析失败原因
162
- > - B. **修复并重新测试** - 我来协助修复
163
- > - C. **跳过继续** - 标记为已知问题,继续流程
164
- > - D. **生成修复任务** - 创建 TASK 修复这些问题"
165
-
166
- **无测试文件时**:
167
- > "⚠️ **未检测到测试用例**
168
- >
169
- > 当前项目未发现测试文件。
170
- >
171
- > 请选择:
172
- > - A. **指定测试路径** - 手动指定测试文件位置
173
- > - B. **创建测试用例** - 为当前实现生成测试
174
- > - C. **跳过测试** - 本次不执行测试"
175
-
176
- 5. **【Telemetry 必做】整理结构化测试结果**
177
-
178
- 测试运行后,必须将结果整理为以下标准 schema:
179
-
180
- ```json
181
- {
182
- "test_results": {
183
- "command": "npm test",
184
- "passed": 12,
185
- "failed": 0,
186
- "skipped": 1,
187
- "coverage": 85.5,
188
- "duration_ms": 40000
189
- }
190
- }
191
- ```
192
-
193
- **字段口径**:
194
- - `command`: 实际执行的测试命令。
195
- - `passed`: 通过用例数。
196
- - `failed`: 失败用例数。
197
- - `skipped`: 跳过用例数,没有则填 `0`。
198
- - `coverage`: 覆盖率百分比,无法获取时填 `null`。
199
- - `duration_ms`: 测试耗时,无法获取时填 `null`。
200
-
201
- ---
202
-
203
- **使用示例**
204
-
205
- ```bash
206
- # 运行全量测试
207
- /opsx:test
208
-
209
- # 运行变更相关测试
210
- /opsx:test --scope change
211
-
212
- # 运行并生成覆盖率报告
213
- /opsx:test --coverage
214
-
215
- # 运行指定目录的测试
216
- /opsx:test src/services/
217
-
218
- # 监听模式
219
- /opsx:test --watch
220
-
221
- # 过滤特定测试
222
- /opsx:test --filter "UserService"
223
- ```
224
-
225
- ---
226
-
227
- **护栏规则**
228
-
229
- - **自动检测优先**:优先自动检测项目类型和测试框架,减少用户配置
230
- - **标准化报告**:输出结构化测试报告,便于质量追踪和问题定位
231
- - **失败详情**:测试失败时提供详细错误信息和可能原因分析
232
- - **覆盖率可选**:覆盖率报告为可选功能,通过 `--coverage` 启用
233
- - **不阻塞流程**:测试结果作为参考,由用户决定是否继续
234
- - **支持增量测试**:支持仅运行变更相关的测试,提升效率
235
-
236
- > **🖥️ 跨平台执行规则**
237
- > - 先确认当前终端工作目录是项目根目录;若不是,先 `cd` 到项目根目录。
238
- > - Telemetry 命令默认使用 `--project=.`,兼容 Windows、macOS、Linux。
239
- > - 在 Windows Bash / Git Bash / Claude Bash 中,禁止裸写 Windows 反斜杠绝对路径(如 `D:\project\demo`);如必须使用绝对路径,请写成正斜杠路径或加引号。
240
- > - 不要省略 `--source=opsx-command` 与 `--session-id=<会话ID>`。
241
- > **📊 Telemetry(必做,不得跳过)**
242
- > 测试运行后,必须记录结构化测试结果:`node skywalk-sdd/log.cjs record --type=test_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="测试结果摘要" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`
243
- > 若 spec.md 中有可识别场景 ID,且测试能映射到这些场景,建议记录 Q4 规约驱动测试覆盖率(可选,不阻塞测试流程):`node skywalk-sdd/log.cjs record --type=coverage_result --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/partial/failure --summary="规约场景测试覆盖率" --details-json="{\"spec_test_coverage\":{\"mappings\":[{\"scenario_id\":\"SCN-001\",\"description\":\"规约场景摘要\",\"test_ids\":[\"<测试文件或用例ID>\"],\"status\":\"covered\",\"notes\":\"\"}]}}"`
244
- > 阶段结束时执行(必须成功):`node skywalk-sdd/log.cjs end --event-id=<开头记录的event_id> --command=test --project=. --change=<变更名称> --capability=<可选capability-name> --agent=<Agent类型> --source=opsx-command --session-id=<会话ID> --result=success/failure --summary="测试结果摘要" --details-json="{\"test_results\":{\"command\":\"<实际测试命令>\",\"passed\":0,\"failed\":0,\"skipped\":0,\"coverage\":null,\"duration_ms\":0}}"`