openmatrix 0.2.19 → 0.2.20

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.
package/skills/test.md ADDED
@@ -0,0 +1,719 @@
1
+ ---
2
+ name: om:test
3
+ description: "Use when generating tests for untested code, discovering test coverage gaps, or setting up test infrastructure. Use for ANY test generation task: 生成测试, 测试覆盖, 补测试, 写单元测试, E2E测试, UI测试, 测试缺失. Use ESPECIALLY when: new code without tests, low test coverage detected, need to verify functionality before commit, starting a new project without test setup. Don't skip when: code looks simple (simple code needs tests too), rushing to deploy (tests prevent regression), existing tests exist (may need updates for new features)."
4
+ priority: high
5
+ ---
6
+
7
+ <NO-OTHER-SKILLS>
8
+ **绝对禁止**调用以下技能:
9
+ - ❌ superpowers:test-driven-development → 你已经在 om:test 中了
10
+ - ❌ superpowers:* → 全部被 OpenMatrix 替代
11
+ - ❌ gsd:* → 全部被 OpenMatrix 替代
12
+ - ❌ 任何其他任务编排相关的技能
13
+
14
+ **测试生成阶段只能使用 Agent 工具** — 直接调用 Agent,不通过任何中间层。
15
+ </NO-OTHER-SKILLS>
16
+
17
+ <MANDATORY-EXECUTION-ORDER>
18
+ ## 执行顺序 - 必须严格按此顺序,不得跳过
19
+
20
+ ```
21
+ Step 1: 调用 CLI 扫描项目 (openmatrix test --json)
22
+ Step 2: AI 分析项目上下文和业务逻辑
23
+ Step 3: 发现测试缺失,输出分析报告
24
+ Step 4: UI 测试决策(如果 isFrontend=true)
25
+ ⛔ 分析阶段结束,必须等待用户确认
26
+ Step 5: AskUserQuestion 确认测试范围
27
+ Step 6: 生成测试代码(Agent)
28
+ Step 7: 自动验证测试(循环最多 3 次)
29
+ ├─ 通过 → 进入 Step 8
30
+ └─ 失败 → 自动重新生成(带失败信息)
31
+ Step 8: 输出测试报告
32
+ ```
33
+
34
+ **铁律:不做项目分析,不许生成测试**
35
+ **铁律:前端项目必须询问 UI 测试需求,不得跳过**
36
+ **铁律:验证失败自动循环,最多 3 次,超过必须暂停**
37
+ </MANDATORY-EXECUTION-ORDER>
38
+
39
+ <objective>
40
+ 智能测试生成 - 从业务角度分析代码逻辑,发现测试缺失,自动生成并验证测试。遵循 OpenMatrix 分层原则:CLI 收集原始数据,AI 分析并生成测试。
41
+ </objective>
42
+
43
+ <process>
44
+
45
+ ## Step 1: 调用 CLI 扫描项目
46
+
47
+ **检查 `$ARGUMENTS`:**
48
+
49
+ | 参数 | 处理方式 |
50
+ |------|---------|
51
+ | 空 | 扫描整个项目 |
52
+ | `src/auth/` | 扫描指定目录 |
53
+ | `--target src/utils.ts` | 扫描指定文件 |
54
+
55
+ **调用 CLI 扫描:**
56
+
57
+ ```bash
58
+ openmatrix test --json
59
+ ```
60
+
61
+ 或指定目标:
62
+
63
+ ```bash
64
+ openmatrix test --target src/auth/ --json
65
+ ```
66
+
67
+ **CLI 返回 TestScanResult JSON:**
68
+
69
+ ```json
70
+ {
71
+ "timestamp": "2026-04-23T10:00:00Z",
72
+ "projectRoot": "/path/to/project",
73
+ "target": "src/",
74
+ "frameworks": [
75
+ {
76
+ "framework": "vitest",
77
+ "version": "1.2.3",
78
+ "configFile": "vitest.config.ts",
79
+ "isPrimary": true,
80
+ "supportedTypes": ["unit", "integration"],
81
+ "commands": {
82
+ "test": "npm test",
83
+ "testCoverage": "npm test -- --coverage"
84
+ }
85
+ }
86
+ ],
87
+ "existingTests": [
88
+ { "path": "tests/example.test.ts", "type": "unit", "testCount": 5 }
89
+ ],
90
+ "uncoveredSources": [
91
+ {
92
+ "path": "src/auth/login.ts",
93
+ "fileType": "service",
94
+ "exports": ["login", "validateToken"],
95
+ "hasTest": false,
96
+ "suggestedTestTypes": ["unit", "integration"],
97
+ "complexity": { "lines": 150, "functions": 5 }
98
+ }
99
+ ],
100
+ "projectType": "typescript",
101
+ "isFrontend": false,
102
+ "hasUIComponents": false,
103
+ "coverageReport": { "total": 45 },
104
+ "testStyle": {
105
+ "namingConvention": "describe-it",
106
+ "assertionLibrary": "expect",
107
+ "usesTypeScript": true,
108
+ "fileSuffix": ".test.ts",
109
+ "fileLocation": "separate"
110
+ },
111
+ "summary": {
112
+ "frameworkCount": 1,
113
+ "existingTestCount": 5,
114
+ "uncoveredSourceCount": 20,
115
+ "hasTestConfig": true,
116
+ "hasCoverageConfig": true
117
+ }
118
+ }
119
+ ```
120
+
121
+ **从返回结果读取关键数据:**
122
+ - `frameworks`: 检测到的测试框架
123
+ - `existingTests`: 现有测试文件
124
+ - `uncoveredSources`: 未覆盖的源文件
125
+ - `isFrontend`: 是否为前端项目
126
+ - `hasUIComponents`: 是否有 UI 组件
127
+ - `testStyle`: 现有测试风格(用于保持一致性)
128
+
129
+ ## Step 2: AI 分析项目上下文
130
+
131
+ **AI 分析任务(读取原始数据后):**
132
+
133
+ 1. **识别测试框架**
134
+ - 读取 `frameworks` 数组
135
+ - 确定主要测试框架 `isPrimary: true`
136
+ - 了解支持的测试类型
137
+
138
+ 2. **分析项目结构**
139
+ - 读取 `projectType` 确定语言
140
+ - 读取 `uncoveredSources` 了解需要测试的模块
141
+ - 每个源文件的 `exports` 表示需要测试的目标
142
+
143
+ 3. **分析现有测试风格**
144
+ - 读取 `testStyle.namingConvention` 保持命名一致
145
+ - 读取 `testStyle.assertionLibrary` 使用相同断言库
146
+ - 读取 `testStyle.fileSuffix` 保持文件后缀一致
147
+ - 读取 `testStyle.fileLocation` 确定测试文件位置
148
+
149
+ 4. **评估覆盖率现状**
150
+ - 如果 `coverageReport` 存在,了解当前覆盖率
151
+ - 识别关键业务模块的覆盖缺口
152
+
153
+ ## Step 3: 发现测试缺失
154
+
155
+ **AI 分析每个未覆盖源文件:**
156
+
157
+ ```
158
+ 对于每个 uncoveredSources[i]:
159
+ 1. 分析 exports 中的每个函数/类/组件
160
+ 2. 理解业务逻辑(不是语法,而是"做什么")
161
+ 3. 识别关键业务场景
162
+ 4. 确定测试优先级(基于复杂度、重要性)
163
+ 5. 生成测试用例清单
164
+ ```
165
+
166
+ **输出分析报告:**
167
+
168
+ ```
169
+ 📊 测试缺失分析报告
170
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
171
+
172
+ 项目类型: TypeScript
173
+ 测试框架: Vitest (v1.2.3)
174
+ 当前覆盖率: 45%
175
+
176
+ 未覆盖源文件 (20 个):
177
+ ┌────────────────────────────────────────┐
178
+ │ src/auth/login.ts │
179
+ │ 类型: service | 导出: login, validateToken │
180
+ │ 行数: 150 | 函数: 5 │
181
+ │ 建议测试类型: unit, integration │
182
+ │ 关键业务场景: │
183
+ │ - 用户登录成功 │
184
+ │ - 密码错误拒绝 │
185
+ │ - Token 验证过期 │
186
+ │ - 并发登录处理 │
187
+ ├────────────────────────────────────────┤
188
+ │ src/utils/format.ts │
189
+ │ 类型: util | 导出: formatDate, parseJSON │
190
+ │ ... │
191
+ └────────────────────────────────────────┘
192
+
193
+ 测试优先级建议:
194
+ P0: src/auth/login.ts (认证核心)
195
+ P0: src/api/handler.ts (API 入口)
196
+ P1: src/utils/format.ts (通用工具)
197
+ P2: src/config/index.ts (配置加载)
198
+
199
+ 现有测试风格:
200
+ - 命名约定: describe/it
201
+ - 断言库: expect
202
+ - 文件后缀: .test.ts
203
+ - 文件位置: tests/ 目录
204
+
205
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
206
+ ```
207
+
208
+ ## Step 4: UI 测试决策
209
+
210
+ **如果 `isFrontend=true` 或 `hasUIComponents=true`:**
211
+
212
+ **⛔ 必须在此询问用户 UI 测试需求,不得跳过。**
213
+
214
+ AskUserQuestion: `header: "UI 测试"`, `multiSelect: false`
215
+ **question:** 检测到前端/UI 组件,是否需要生成 UI/E2E 测试?
216
+
217
+ | label | description |
218
+ |-------|-------------|
219
+ | 需要 UI 测试 | 生成 Playwright/Cypress E2E 测试 |
220
+ | 仅单元测试 | 只生成单元测试,不生成 E2E |
221
+ | 自定义配置 | 指定 UI 测试框架和范围 |
222
+
223
+ **如果用户选择"自定义配置":**
224
+
225
+ AskUserQuestion: `header: "UI 测试框架"`, `multiSelect: false`
226
+ **question:** 选择 UI 测试框架?
227
+
228
+ | label | description |
229
+ |-------|-------------|
230
+ | Playwright (推荐) | 跨浏览器支持,现代 API |
231
+ | Cypress | 开发体验好,调试方便 |
232
+ | Puppeteer | 轻量级,Chrome 优先 |
233
+
234
+ **如果用户选择"需要 UI 测试":**
235
+ - AI 根据 `frameworks` 中是否有 E2E 框架推荐合适的选择
236
+ - 如果无 E2E 框架,推荐 Playwright
237
+
238
+ ## Step 5: 确认测试范围
239
+
240
+ **展示分析报告后,询问用户确认:**
241
+
242
+ AskUserQuestion: `header: "测试范围"`, `multiSelect: true`
243
+ **question:** 选择需要生成测试的源文件?
244
+
245
+ | label | description |
246
+ |-------|-------------|
247
+ | 全部生成 (推荐) | 为所有未覆盖文件生成测试 |
248
+ | P0 优先级 | 只生成 P0 优先级测试 |
249
+ | 自定义选择 | 指定具体文件列表 |
250
+
251
+ **如果用户选择"自定义选择":**
252
+
253
+ 展示文件列表,让用户选择具体文件。
254
+
255
+ **确认测试配置:**
256
+
257
+ AskUserQuestion: `header: "测试配置"`, `multiSelect: false`
258
+ **question:** 确认测试生成配置?
259
+
260
+ | label | description |
261
+ |-------|-------------|
262
+ | 自动生成 (推荐) | AI 自动分析业务逻辑生成测试 |
263
+ | 交互式生成 | 每个文件询问测试场景 |
264
+ | 快速生成 | 只生成基础测试,跳过复杂场景 |
265
+
266
+ ## Step 6: 生成测试代码
267
+
268
+ **调用 Agent 生成测试:**
269
+
270
+ ```typescript
271
+ Agent({
272
+ subagent_type: "general-purpose",
273
+ description: "生成测试代码",
274
+ prompt: `你是测试工程师。根据分析结果生成测试代码。
275
+
276
+ ## 铁律
277
+ 1. 从业务角度理解代码,不是语法角度
278
+ 2. 测试业务场景,不是函数调用
279
+ 3. 保持与现有测试风格一致
280
+ 4. 每个测试用例必须有明确的业务意义
281
+
282
+ ## 项目信息
283
+ - 语言: ${projectType}
284
+ - 测试框架: ${primaryFramework}
285
+ - 测试目录: ${testDirectory}
286
+ - 文件后缀: ${fileSuffix}
287
+
288
+ ## 现有测试风格
289
+ - 命名约定: ${namingConvention}
290
+ - 断言库: ${assertionLibrary}
291
+ - 文件位置: ${fileLocation}
292
+
293
+ ## 需要测试的源文件
294
+ ${selectedFiles.map(f => `
295
+ 文件: ${f.path}
296
+ 类型: ${f.fileType}
297
+ 导出: ${f.exports.join(', ')}
298
+ 复杂度: ${f.complexity?.lines || 'unknown'} 行
299
+ `).join('\n')}
300
+
301
+ ## 任务
302
+ 1. 分析每个源文件的业务逻辑
303
+ 2. 识别关键业务场景(成功路径、边界条件、错误处理)
304
+ 3. 为每个场景编写测试用例
305
+ 4. 测试文件写入正确位置
306
+ 5. 保持命名和风格一致
307
+
308
+ ## 测试用例要求
309
+ - describe 描述业务场景(不是函数名)
310
+ - it 描述具体行为("should...")
311
+ - 断言验证业务结果
312
+ - Mock 外部依赖(API、数据库等)
313
+
314
+ ## 禁止行为
315
+ ❌ 测试语法而不是行为
316
+ ❌ 使用与项目不一致的风格
317
+ ❌ 跳过边界条件和错误处理
318
+ ❌ 生成无意义的测试(如 "should exist")`,
319
+ run_in_background: false
320
+ })
321
+ ```
322
+
323
+ **UI 测试生成(如果需要):**
324
+
325
+ ```typescript
326
+ Agent({
327
+ subagent_type: "general-purpose",
328
+ description: "生成 E2E/UI 测试",
329
+ prompt: `你是 E2E 测试工程师。为前端组件生成 UI 测试。
330
+
331
+ ## UI 测试框架
332
+ - 框架: ${uiFramework}
333
+ - 配置文件: ${uiConfigFile || '需要创建'}
334
+
335
+ ## 需要测试的 UI 组件
336
+ ${uiComponents.map(c => `
337
+ 组件: ${c.path}
338
+ 导出: ${c.exports.join(', ')}
339
+ 功能: ${c.description || '需要分析'}
340
+ `).join('\n')}
341
+
342
+ ## 任务
343
+ 1. 创建 E2E 测试配置(如果不存在)
344
+ 2. 为每个关键用户流程生成测试
345
+ 3. 测试用例覆盖:页面渲染、用户交互、数据展示
346
+ 4. 截图放置在 tests/e2e/screenshots/
347
+
348
+ ## E2E 测试用例要求
349
+ - 测试完整用户流程
350
+ - 验证页面状态变化
351
+ - 检查关键元素可见性
352
+ - 处理异步加载等待
353
+
354
+ ## 禁止行为
355
+ ❌ 测试单个元素样式
356
+ ❌ 跳过用户等待时间
357
+ ❌ 硬编码测试数据`,
358
+ run_in_background: false
359
+ })
360
+ ```
361
+
362
+ ## Step 7: 自动验证测试(循环机制)
363
+
364
+ **⛔ 自动验证流程 - 无需用户手动确认**
365
+
366
+ ### 7.1 执行验证命令(自动判断结果)
367
+
368
+ ```bash
369
+ # 执行测试验证
370
+ VERIFY_RESULT=0
371
+ npm test -- --run > /tmp/test-verify-output.txt 2>&1 || VERIFY_RESULT=1
372
+
373
+ if [ $VERIFY_RESULT -eq 0 ]; then
374
+ echo "✅ 测试验证通过"
375
+ else
376
+ echo "❌ 测试验证失败"
377
+ cat /tmp/test-verify-output.txt | tail -50 # 展示失败详情
378
+ fi
379
+ ```
380
+
381
+ ### 7.2 验证失败自动循环(无需用户确认)
382
+
383
+ **验证失败时自动处理:**
384
+
385
+ ```
386
+ 验证失败 → retryCount + 1 → 检查重试次数 →
387
+ ├─ < 3 次 → 自动回到 Step 6 重新生成(带失败信息)
388
+ └─ >= 3 次 → 暂停,报告问题,可能是测试框架配置问题
389
+ ```
390
+
391
+ **重试计数器更新:**
392
+ - Skill 内部维护 `retryCount` 变量
393
+ - 每次验证失败 +1
394
+ - 验证通过后重置为 0
395
+
396
+ ### 7.3 自动循环回生成步骤
397
+
398
+ **< 3 次验证失败 → 自动调用 Agent 重新生成:**
399
+
400
+ ```typescript
401
+ Agent({
402
+ subagent_type: "general-purpose",
403
+ description: `修复测试 (第 ${retryCount + 1} 次)`,
404
+ prompt: `根据测试验证失败结果修复测试代码。
405
+
406
+ ## 铁律
407
+ 1. 只修复失败的测试,不修改通过的测试
408
+ 2. 分析失败原因,不要盲目修改
409
+ 3. 保持测试风格一致
410
+
411
+ ## 验证失败详情
412
+ ${verifyFailureOutput}
413
+
414
+ ## 失败分析
415
+ - 哪些测试失败了?
416
+ - 失败原因是什么?
417
+ - 是测试代码问题还是源代码问题?
418
+
419
+ ## 修复策略
420
+ 1. 如果是测试语法错误 → 修正测试代码
421
+ 2. 如果是断言失败 → 分析预期值是否正确
422
+ 3. 如果是 Mock 问题 → 调整 Mock 实现
423
+
424
+ ## 禁止行为
425
+ ❌ 修改通过的测试
426
+ ❌ 删除失败的测试用例
427
+ ❌ 跳过 Mock 外部依赖`,
428
+ run_in_background: false
429
+ })
430
+ ```
431
+
432
+ ### 7.4 达到最大重试次数(>= 3 次)
433
+
434
+ **输出警告并暂停:**
435
+
436
+ ```
437
+ ⚠️ 已尝试 3 次以上生成,测试仍未通过
438
+
439
+ 可能的问题:
440
+ - 测试框架配置不正确
441
+ - 源代码有 bug 导致测试无法通过
442
+ - Mock 设置不完整
443
+
444
+ 建议:检查测试框架配置,或手动修复测试代码。
445
+ ```
446
+
447
+ AskUserQuestion: `header: "验证问题"`, `multiSelect: false`
448
+ **question:** 已尝试 3 次生成仍未通过,可能存在配置问题。下一步?
449
+
450
+ | label | description |
451
+ |-------|-------------|
452
+ | 检查配置 | 检查测试框架配置文件 |
453
+ | 手动修复 | 输出测试文件路径,用户手动修改 |
454
+ | 结束流程 | 保存当前测试文件,结束流程 |
455
+
456
+ ### 7.5 验证通过
457
+
458
+ **验证通过 → 自动进入 Step 8**
459
+
460
+ ```
461
+ ✅ 测试验证通过
462
+
463
+ 所有生成的测试正常运行,自动进入报告阶段。
464
+ ```
465
+
466
+ ## Step 8: 输出测试报告
467
+
468
+ **展示测试生成报告:**
469
+
470
+ ```markdown
471
+ # 测试生成报告
472
+
473
+ **生成时间**: ${timestamp}
474
+ **项目**: ${projectName}
475
+ **测试框架**: ${primaryFramework}
476
+
477
+ ## 生成的测试文件
478
+
479
+ | 文件 | 类型 | 测试用例 | 源文件 |
480
+ |------|------|---------|--------|
481
+ | tests/auth/login.test.ts | unit | 12 | src/auth/login.ts |
482
+ | tests/api/handler.test.ts | integration | 8 | src/api/handler.ts |
483
+ | tests/e2e/user-flow.spec.ts | e2e | 5 | 多个组件 |
484
+
485
+ ## 测试覆盖统计
486
+
487
+ - 单元测试: 20 个
488
+ - 集成测试: 8 个
489
+ - E2E 测试: 5 个
490
+ - 总计: 33 个测试用例
491
+
492
+ ## 验证结果
493
+
494
+ ✅ 所有测试通过 (33 passed, 0 failed)
495
+
496
+ ## 覆盖率预估
497
+
498
+ 当前覆盖率: 45%
499
+ 预估覆盖率: 72% (+27%)
500
+
501
+ ## 后续建议
502
+
503
+ 1. 运行 `npm test -- --coverage` 查看详细覆盖率
504
+ 2. 检查 Mock 文件是否需要补充测试数据
505
+ 3. E2E 测试截图已放置在 tests/e2e/screenshots/
506
+
507
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
508
+ ```
509
+
510
+ **Git 提交提示(可选):**
511
+
512
+ AskUserQuestion: `header: "Git 提交"`, `multiSelect: false`
513
+ **question:** 是否提交生成的测试文件?
514
+
515
+ | label | description |
516
+ |-------|-------------|
517
+ | 提交测试文件 | git add tests/ && git commit |
518
+ | 仅保存文件 | 不提交,用户稍后处理 |
519
+ | 查看生成的文件 | 展示文件内容后再决定 |
520
+
521
+ </process>
522
+
523
+ <arguments>
524
+ $ARGUMENTS
525
+ </arguments>
526
+
527
+ <examples>
528
+ /om:test # 扫描整个项目,发现测试缺失
529
+ /om:test src/auth/ # 只为 src/auth/ 目录生成测试
530
+ /om:test --target src/utils.ts # 为指定文件生成测试
531
+ </examples>
532
+
533
+ <notes>
534
+ ## 完整流程图
535
+
536
+ ```
537
+ Step 1: CLI 扫描 (openmatrix test --json)
538
+ │ 收集原始数据:框架、源文件、覆盖率
539
+
540
+ Step 2: AI 分析项目上下文
541
+ │ • 识别测试框架
542
+ │ • 分析项目结构
543
+ │ • 理解测试风格
544
+
545
+ Step 3: 发现测试缺失
546
+ │ • 对比源文件与测试文件
547
+ │ • 分析业务逻辑复杂度
548
+ │ • 识别关键业务场景
549
+ │ • 输出分析报告
550
+
551
+ Step 4: UI 测试决策 (如果 isFrontend=true)
552
+ │ ⛔ 必须询问用户
553
+ │ AskUserQuestion: 是否需要 UI 测试?
554
+
555
+ Step 5: 确认测试范围
556
+ │ AskUserQuestion: 选择源文件
557
+ │ AskUserQuestion: 确认配置
558
+
559
+ Step 6: 生成测试代码
560
+ │ Agent(general-purpose) 分析业务逻辑生成测试
561
+ │ 如果需要 UI 测试,Agent 生成 E2E 测试
562
+
563
+ Step 7: ⛔ 自动验证测试(无需用户确认)
564
+ │ ├─ 执行 npm test → 自动判断结果
565
+ │ ├─ 通过 → 自动进入 Step 8 ✅
566
+ │ └─ 失败 → 自动循环处理
567
+ │ ├─ < 3 次 → 自动回到 Step 6 重新生成
568
+ │ └─ >= 3 次 → 暂停,可能是配置问题 ⚠️
569
+
570
+ Step 8: 输出测试报告
571
+ │ 展示生成的文件列表
572
+ │ 展示覆盖率统计
573
+ │ Git 提交询问(可选)
574
+ ```
575
+
576
+ ## 自动验证循环流程(Step 7 详细)
577
+
578
+ ```
579
+ ┌─────────────────────────────────────────┐
580
+ │ Step 6: 生成测试代码 │
581
+ └─────────────────────┬───────────────────┘
582
+
583
+ ┌─────────────────────────────────────────┐
584
+ │ Step 7: 执行测试验证 │
585
+ │ (npm test / npm test -- --run) │
586
+ └─────────────────────┬───────────────────┘
587
+
588
+ ┌───────┴───────┐
589
+ │ 自动判断结果 │
590
+ └───────┬───────┘
591
+ ┌─────────────┴─────────────┐
592
+ │ │
593
+ 退出码=0 退出码≠0
594
+ (测试通过) (测试失败)
595
+ │ │
596
+ ↓ ↓
597
+ ┌───────────────┐ ┌───────────────────┐
598
+ │ ✅ 进入 Step 8│ │ retryCount + 1 │
599
+ └───────────────┘ └───────┬───────────┘
600
+
601
+ ┌────────┴────────┐
602
+ │ 检查重试次数 │
603
+ └───────┬─────────┘
604
+ ┌─────────────┴─────────────┐
605
+ │ │
606
+ < 3 次 >= 3 次
607
+ │ │
608
+ ↓ ↓
609
+ ┌─────────────────┐ ┌───────────────────┐
610
+ │ ⚡ 自动回到 Step 6 │ │ ⚠️ 暂停,检查配置 │
611
+ │ (带失败信息) │ │ 用户手动处理 │
612
+ └─────────────────┘ └───────────────────┘
613
+ ```
614
+
615
+ ## 铁律
616
+
617
+ **不做项目分析,不许生成测试**
618
+
619
+ **前端项目必须询问 UI 测试需求**
620
+
621
+ **验证失败自动循环,无需用户手动确认**
622
+
623
+ **最大重试 3 次,超过必须暂停检查配置**
624
+
625
+ ## 红线
626
+
627
+ - 3 次生成失败 → 暂停,检查测试框架配置
628
+ - 不生成与现有风格不一致的测试
629
+ - 不跳过 UI 测试询问(前端项目)
630
+ - 不删除现有的通过的测试
631
+ - **验证必须自动判断,不得依赖用户手动确认**
632
+ - **验证失败自动循环,不得跳过或手动绕过**
633
+ - **达到 3 次重试必须暂停,不得继续生成**
634
+
635
+ ## 红旗警告 - 停止并回归流程
636
+
637
+ **如果发现自己在想:**
638
+ - "直接生成测试,不用分析"
639
+ - "跳过 UI 测试询问"
640
+ - "测试看起来很简单,不用验证"
641
+ - "验证失败了,让用户手动修"
642
+ - "重试超过 3 次继续生成"
643
+ - "跳过自动验证"
644
+ - 只测试函数调用而不是业务场景
645
+ - 生成的测试与项目风格不一致
646
+
647
+ **所有这些意味着:停止。回到 Step 2 或执行自动验证循环。**
648
+
649
+ ## 测试生成原则
650
+
651
+ ### 业务角度测试
652
+
653
+ ```
654
+ // ❌ 错误:测试语法
655
+ describe('login function', () => {
656
+ it('should exist', () => {
657
+ expect(login).toBeDefined();
658
+ });
659
+ });
660
+
661
+ // ✅ 正确:测试业务场景
662
+ describe('用户登录', () => {
663
+ it('正确密码应该成功登录', async () => {
664
+ const result = await login('user', 'correct-password');
665
+ expect(result.success).toBe(true);
666
+ expect(result.token).toBeDefined();
667
+ });
668
+
669
+ it('错误密码应该拒绝登录', async () => {
670
+ const result = await login('user', 'wrong-password');
671
+ expect(result.success).toBe(false);
672
+ expect(result.error).toBe('密码错误');
673
+ });
674
+ });
675
+ ```
676
+
677
+ ### 保持风格一致
678
+
679
+ - 使用项目的命名约定 (describe-it 或 test)
680
+ - 使用相同的断言库 (expect/assert/should)
681
+ - 保持文件后缀一致 (.test.ts/.spec.ts)
682
+ - 保持文件位置风格 (同目录或独立目录)
683
+
684
+ ## 分层原则
685
+
686
+ **CLI 只负责:**
687
+ - 扫描项目结构
688
+ - 检测测试框架
689
+ - 运行测试验证
690
+ - 输出结构化 JSON 数据
691
+
692
+ **Skill AI 负责:**
693
+ - 分析业务逻辑
694
+ - 发现测试缺失
695
+ - 推荐测试类型
696
+ - 生成测试代码
697
+ - 处理验证失败
698
+
699
+ **反模式(禁止):**
700
+ ```typescript
701
+ // ❌ 错误:CLI 硬编码推荐逻辑
702
+ function recommendTestFramework(projectType) {
703
+ if (projectType === 'typescript') return 'vitest';
704
+ // ...更多 if/else
705
+ }
706
+
707
+ // ✅ 正确:CLI 只输出原始数据,AI 自己判断
708
+ // AI 看到 frameworks 数组,自己决定使用哪个
709
+ ```
710
+
711
+ ## 实际影响
712
+
713
+ 来自测试生成实践:
714
+ - 业务角度测试:更易维护,更有价值
715
+ - 自动验证循环:减少手动调试时间
716
+ - 风格一致性:团队协作更顺畅
717
+ - 首次生成成功率:85%+
718
+ - 3 次循环成功率:95%+
719
+ </notes>