openmatrix 0.2.25 → 0.2.27

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/start.md CHANGED
@@ -37,14 +37,9 @@ description: "Use when starting a new development task cycle with interactive qu
37
37
  </INTENT-JUDGMENT>
38
38
 
39
39
  <NO-OTHER-SKILLS>
40
- **绝对禁止**调用以下任何技能或工具:
41
- - gsd-executor、gsd:* 等 GSD 相关技能
42
- - superpowers:* 等 superpowers 相关技能
43
- - 任何其他任务编排相关的 Agent 或工具
40
+ 本 skill 与其他任务编排技能功能重叠,请勿同时使用。
44
41
 
45
- **Step 9 只能使用 Agent 工具** — 直接调用 Agent,不通过任何中间层。
46
-
47
- 违规调用将导致执行失败。
42
+ **Step 9 使用 Agent 工具执行子任务。**
48
43
 
49
44
  **相关技能**: `/om:brainstorm` (需求探索) | `/om:plan` (方案生成) | `/om:auto` (全自动) | `/om:meeting` (阻塞处理) | `/om:status` (状态查看) | `/om:report` (报告)
50
45
  </NO-OTHER-SKILLS>
@@ -57,7 +52,7 @@ Step 1: 初始化 .openmatrix 目录
57
52
  Step 2: 验证前置条件(plan.md + tasks-input.json 必须已存在)
58
53
  Step 3: 智能分析任务类型(开发/非开发)
59
54
  Step 4: 提交文档(git add docs/ + 所有 .md 文件, commit)
60
- Step 5: 必选问题(开发任务:质量+E2E+模式; 非开发:仅模式)<- 不可跳过
55
+ Step 5: 必选问题(开发任务:质量等级; 严格模式可选E2E; 非开发:跳过)<- 不可跳过
61
56
  Step 6: 可选问题(仅复杂开发任务)+ 展示执行计划
62
57
  Step 7: 调用 openmatrix start --tasks-json <- 必须完成,不可跳过
63
58
  Step 8: 从 CLI 返回结果中读取 subagentTasks 列表 <- 必须完成
@@ -67,25 +62,51 @@ Step 9: 逐个执行 subagentTasks(调用 Agent 工具) <- 只有
67
62
  **违反以下任一规则将导致任务执行失败:**
68
63
 
69
64
  - **禁止在 Step 9 之前写任何业务代码** — 所有代码必须在 Step 9 通过 Agent 执行
70
- - **禁止跳过 Step 5 必选问题** — 开发任务必须选质量/E2E/模式,非开发任务必须选模式
65
+ - **禁止跳过 Step 5 必选问题** — 开发任务必须选质量等级,非开发任务无需问答
71
66
  - **禁止跳过 Step 7** — 必须调用 CLI,不能用其他方式代替
72
67
  - **禁止自行规划 Phase** — 任务由 CLI 的 TaskPlanner 拆分,AI 只提取 goals
73
68
  - **禁止用 Bash/npm/write 直接写业务代码** — 业务代码只能通过 Step 9 的 Agent 执行
74
- - **禁止调用 gsd-executor 或其他编排技能** — 必须用原生 Agent 工具
75
69
  - **禁止在 start 中生成 plan** — plan 由 /om:plan 生成,start 只负责执行
70
+ - **使用 Agent 工具执行子任务** — 不通过其他编排系统
76
71
  </MANDATORY-EXECUTION-ORDER>
77
72
 
73
+ <IRON-LAW>
74
+
75
+ **NO PRODUCTION CODE WITHOUT QUALITY GATES FIRST**
76
+
77
+ 跳过了必选问题?停止。重新开始。
78
+ 写了代码但没跑测试?删除。重新开始。
79
+ 这不是建议。这是铁律。
80
+
81
+ </IRON-LAW>
82
+
83
+ <RED-FLAGS>
84
+
85
+ 这些想法意味着停止:
86
+
87
+ | 想法 | 真相 |
88
+ |-----|------|
89
+ | "先写代码,测试稍后" | 跳过铁律 = 质量无保证 |
90
+ | "这个任务很简单" | 简单任务也要质量门禁 |
91
+ | "手动验证就够了" | 手动验证不可重复 |
92
+ | "质量级别不重要" | 质量级别决定代码可信度 |
93
+ | "跳过问答更快" | 跳过问答 = 跳过铁律 |
94
+ | "我知道该选什么" | 必选问题不可跳过 |
95
+ | "执行模式无所谓" | 执行模式决定审批节点 |
96
+
97
+ </RED-FLAGS>
98
+
78
99
  <objective>
79
100
  读取已有的 plan.md + tasks-input.json,通过必选问答确定执行配置(开发任务还需确定质量等级、E2E测试),确认后通过 CLI 拆分任务并执行。
80
101
 
81
102
  本 Skill 只做执行,不做方案生成。如果 plan.md 或 tasks-input.json 不存在,引导用户先执行 /om:plan。
82
103
 
83
- **Step 5 必选问题不可跳过** — 开发任务必须选择:
84
- 1. 质量等级 (strict/balanced/fast)
85
- 2. E2E 测试 (当选择 strict/balanced 时)
86
- 3. 执行模式 (全自动/关键节点确认/每阶段确认)
104
+ **Step 5 必选问题(开发任务):**
105
+ 1. 质量等级(严格模式/平衡模式/快速模式)
106
+ 2. E2E 测试(仅严格模式可选,其他模式自动跳过)
107
+ 3. 执行模式根据质量等级自动推断(无需问答)
87
108
 
88
- 非开发任务(文档、配置等)只需选择执行模式。
109
+ **非开发任务**(文档、配置等)无需问答,直接使用全自动执行。
89
110
  </objective>
90
111
 
91
112
  <process>
@@ -131,13 +152,27 @@ git init
131
152
 
132
153
  ### Step 2: 验证前置条件
133
154
 
134
- **检查 plan.md 和 tasks-input.json 是否已存在:**
155
+ **先获取当前 runId:**
156
+ ```bash
157
+ cat .openmatrix/current.json 2>/dev/null || echo '{"runId":"run-default"}'
158
+ ```
159
+
160
+ 从返回结果提取 `runId`,后续文件检测和读取都使用 `.openmatrix/{runId}/` 目录。
161
+
162
+ **检查 plan.md 和 tasks-input.json 是否已存在(使用 runId):**
163
+
164
+ ```bash
165
+ cat .openmatrix/${runId}/tasks-input.json 2>/dev/null || echo "NOT_FOUND"
166
+ cat .openmatrix/${runId}/plan.md 2>/dev/null || echo "NOT_FOUND"
167
+ ```
135
168
 
169
+ **或通过 CLI 检查(推荐):**
136
170
  ```bash
137
- cat .openmatrix/tasks-input.json 2>/dev/null || echo "NOT_FOUND"
138
- cat .openmatrix/plan.md 2>/dev/null || echo "NOT_FOUND"
171
+ openmatrix status --json | jq '.files'
139
172
  ```
140
173
 
174
+ 返回 `{hasPlan: true, hasTasksInput: true, hasResearchContext: false}` 等。
175
+
141
176
  | 情况 | 处理方式 |
142
177
  |------|---------|
143
178
  | 两个都存在 | 读取内容,继续 Step 3 |
@@ -149,7 +184,7 @@ cat .openmatrix/plan.md 2>/dev/null || echo "NOT_FOUND"
149
184
  **如果都存在,读取 tasks-input.json:**
150
185
 
151
186
  ```bash
152
- cat .openmatrix/tasks-input.json
187
+ cat .openmatrix/${runId}/tasks-input.json
153
188
  ```
154
189
 
155
190
  提取关键字段:`title`、`goals`、`goalTypes`、`goalComplexity`。
@@ -157,7 +192,7 @@ cat .openmatrix/tasks-input.json
157
192
  **检测研究上下文:**
158
193
 
159
194
  ```bash
160
- cat .openmatrix/research/context.json 2>/dev/null || echo "NO_RESEARCH"
195
+ cat .openmatrix/${runId}/research/context.json 2>/dev/null || echo "NO_RESEARCH"
161
196
  ```
162
197
 
163
198
  如果检测到研究上下文,告知用户并将 `--research-context` 参数传递给 CLI。
@@ -191,7 +226,8 @@ git ls-files --others --exclude-standard | grep -E '\.md$|^docs/' 2>/dev/null
191
226
  如果有文档变更(未追踪或未提交),执行提交:
192
227
 
193
228
  ```bash
194
- git add docs/ .openmatrix/*.md CLAUDE.md README.md README_EN.md
229
+ git add docs/ CLAUDE.md README.md README_EN.md
230
+ # 注意:plan.md 和 tasks-input.json 在 .openmatrix/{runId}/ 目录,被 gitignore,不提交
195
231
  git commit -m "$(cat <<'EOF'
196
232
  docs: 更新项目文档
197
233
 
@@ -212,9 +248,9 @@ EOF
212
248
 
213
249
  | goalTypes | 需要询问 |
214
250
  |-----------|---------|
215
- | `development` | 5.1 质量等级 -> 5.2 E2E -> 5.3 执行模式 |
216
- | `testing` | 5.3 执行模式 |
217
- | `documentation` / `other` | 5.3 执行模式 |
251
+ | `development` | 5.1 质量等级 -> 5.2 E2E(仅严格模式可选) |
252
+ | `testing` | 无需问答,直接进入 Step 7 |
253
+ | `documentation` / `other` | 无需问答,直接进入 Step 7 |
218
254
 
219
255
  #### 5.1 质量等级(仅 `goalTypes: development`)
220
256
 
@@ -224,11 +260,21 @@ AskUserQuestion: `header: "质量等级"`, `multiSelect: false`
224
260
 
225
261
  | label | description |
226
262
  |-------|-------------|
227
- | `strict` | TDD + >80%覆盖率 + 严格Lint + 安全扫描 — 生产级代码 |
228
- | `balanced (推荐)` | >60%覆盖率 + Lint + 安全扫描 — 日常开发 |
229
- | `fast` | 无质量门禁 — 快速原型/验证 |
263
+ | `严格模式` | TDD + >80%覆盖率 + 严格Lint + 安全扫描 — 生产级代码 |
264
+ | `平衡模式 (推荐)` | >60%覆盖率 + Lint + 安全扫描 — 日常开发 |
265
+ | `快速模式` | 无质量门禁 — 快速原型/验证 |
266
+
267
+ **质量等级选择后的自动推断规则:**
268
+
269
+ | 模式 | E2E | AI 验收 | 执行方式 |
270
+ |-----|-----|---------|---------|
271
+ | 严格模式 | 可选问一句(Step 5.2) | 必须 | TDD(先测试后开发) |
272
+ | 平衡模式 | 不需要(自动跳过) | 必须 | 先开发后测试 |
273
+ | 快速模式 | 不需要(自动跳过) | 不需要 | 直接开发 |
230
274
 
231
- #### 5.2 E2E 测试(仅 `development` 且选 strict/balanced,选 `fast` 跳过)
275
+ #### 5.2 E2E 测试(仅 `严格模式` 可选,其他模式自动跳过)
276
+
277
+ **只有选择「严格模式」时才询问此问题,平衡模式和快速模式自动推断为「不需要」。**
232
278
 
233
279
  AskUserQuestion: `header: "E2E 测试"`, `multiSelect: false`
234
280
 
@@ -240,17 +286,25 @@ AskUserQuestion: `header: "E2E 测试"`, `multiSelect: false`
240
286
  | `视觉验证` | 需要浏览器可视化验证,可检查页面样式和布局 |
241
287
  | `不需要` | 仅进行单元测试和集成测试,节省时间 |
242
288
 
243
- #### 5.3 执行模式(所有任务必选)
289
+ #### 执行模式自动推断
244
290
 
245
- AskUserQuestion: `header: "执行模式"`, `multiSelect: false`
291
+ **执行模式不再通过问答选择,而是根据质量等级自动推断:**
246
292
 
247
- **question:** 选择执行模式(控制 AI 执行过程中的审批节点)
293
+ - **严格模式** 全自动执行 + TDD 流程
294
+ - **平衡模式** → 全自动执行 + 先开发后测试
295
+ - **快速模式** → 全自动执行 + 直接开发
248
296
 
249
- | label | description |
250
- |-------|-------------|
251
- | `全自动执行 (推荐)` | 全自动执行,无需人工审批,遇到阻塞自动 Meeting |
252
- | `关键节点确认` | plan/merge/deploy 时暂停确认 |
253
- | `每阶段确认` | 每个阶段(develop/verify/accept)完成后暂停 |
297
+ **非开发任务**(testing/documentation/other)默认使用「全自动执行」。
298
+
299
+ #### 常见借口
300
+
301
+ | 借口 | 真相 |
302
+ |-----|------|
303
+ | "只是个小功能,不用问这么多" | 小功能也要质量门禁 |
304
+ | "我知道该选什么级别" | 必选问题不可跳过 |
305
+ | "E2E测试浪费时间" | E2E测试由你决定,不是默认跳过 |
306
+ | "我会手动检查代码" | AI验收比手动检查更系统 |
307
+ | "这太复杂了,简化流程" | 流程设计有目的,简化=降低质量 |
254
308
 
255
309
  ### Step 6: 可选问题(仅复杂任务)
256
310
 
@@ -275,43 +329,71 @@ Goals:
275
329
  Goals: N 个(将生成 N个开发 + N个测试 + 审查)
276
330
  质量级别: xxx
277
331
  E2E 测试: 功能测试 / 视觉验证 / 不启用
278
- 技术方案: .openmatrix/plan.md
332
+ 技术方案: .openmatrix/{runId}/plan.md
279
333
  ```
280
334
 
281
335
  ### Step 7: 调用 CLI 创建任务(不可跳过)
282
336
 
283
- **根据任务类型选择正确的 CLI 调用:**
337
+ **CLI 自动从当前 runId 目录读取 tasks-input.json 和 plan.md。**
338
+
339
+ **根据质量等级自动设置执行参数:**
340
+
341
+ | 质量等级 | CLI 参数 | 执行方式 |
342
+ |---------|---------|---------|
343
+ | 严格模式 | `--quality strict --mode auto` | TDD 流程 |
344
+ | 平衡模式 | `--quality balanced --mode auto` | 先开发后测试 |
345
+ | 快速模式 | `--quality fast --mode auto` | 直接开发 |
284
346
 
285
347
  **开发任务**(有质量等级选择):
286
348
  ```bash
287
- openmatrix start --tasks-json @.openmatrix/tasks-input.json --quality <质量等级> --mode <执行模式> --json
349
+ openmatrix start --tasks-json @tasks-input.json --quality <质量等级> --mode auto --json
288
350
  ```
289
351
 
290
- 如果存在 `.openmatrix/research/context.json`,增加 `--research-context` 参数:
352
+ 如果存在研究上下文(`.openmatrix/{runId}/research/context.json`),增加 `--research-context` 参数:
291
353
  ```bash
292
- openmatrix start --tasks-json @.openmatrix/tasks-input.json --research-context @.openmatrix/research/context.json --quality <质量等级> --mode <执行模式> --json
354
+ openmatrix start --tasks-json @tasks-input.json --research-context @research/context.json --quality <质量等级> --mode auto --json
293
355
  ```
294
356
 
295
357
  如果启用了 E2E 测试(功能测试),加上 `--e2e-tests`:
296
358
  ```bash
297
- openmatrix start --tasks-json @.openmatrix/tasks-input.json --quality balanced --mode auto --e2e-tests --json
359
+ openmatrix start --tasks-json @tasks-input.json --quality strict --mode auto --e2e-tests --json
298
360
  ```
299
361
 
300
362
  如果选择了视觉验证,加上 `--e2e-tests --e2e-type visual`:
301
363
  ```bash
302
- openmatrix start --tasks-json @.openmatrix/tasks-input.json --quality balanced --mode auto --e2e-tests --e2e-type visual --json
364
+ openmatrix start --tasks-json @tasks-input.json --quality strict --mode auto --e2e-tests --e2e-type visual --json
303
365
  ```
304
366
 
305
- **非开发任务**(无质量等级):
367
+ **非开发任务**(无质量等级,默认全自动执行):
306
368
  ```bash
307
- openmatrix start --tasks-json @.openmatrix/tasks-input.json --mode <执行模式> --json
369
+ openmatrix start --tasks-json @tasks-input.json --mode auto --json
308
370
  ```
309
371
 
372
+ **注意**: `@tasks-input.json` 表示 CLI 自动从当前 runId 目录读取。CLI 会自动检测 `current.json` 定位 runId。
373
+
310
374
  此命令返回 JSON 包含 `subagentTasks` 列表。
311
375
 
312
376
  ### Step 8: 读取 subagentTasks
313
377
 
314
- CLI 返回 JSON 中 `subagentTasks` 数组包含待执行任务。
378
+ CLI 返回 JSON 中 `subagentTasks` 数组包含待执行任务:
379
+
380
+ ```json
381
+ {
382
+ "status": "tasks_ready",
383
+ "subagentTasks": [
384
+ {
385
+ "taskId": "TASK-001",
386
+ "agentType": "coder",
387
+ "title": "实现登录功能",
388
+ "description": "...",
389
+ "prompt": "完整任务提示词...",
390
+ "timeout": 300000
391
+ }
392
+ ]
393
+ }
394
+ ```
395
+
396
+ 提取每个任务的 `taskId`、`agentType`、`title`、`prompt`,供 Step 9 执行。
315
397
 
316
398
  ## === 执行阶段(只有此阶段才能写业务代码)===
317
399
 
@@ -390,6 +472,53 @@ AskUserQuestion: `header: "歧义确认"`, `multiSelect: false`
390
472
 
391
473
  #### 9.3 执行 Agent 任务
392
474
 
475
+ **Skill 感知执行:**
476
+
477
+ 执行每个任务前,AI 应根据任务内容判断是否需要调用相关 skill 来增强执行质量。
478
+
479
+ 可用 skill 列表(AI 自行判断是否适用):
480
+ - `om:test` — 测试生成与验证循环
481
+ - `frontend-design` — 前端/UI 设计与实现
482
+ - `om:research` — 领域研究
483
+ - 其他已安装的 skill
484
+
485
+ **判断流程:**
486
+ 1. 读取任务的 `agentType`、`title`、`description`
487
+ 2. AI 自行判断该任务是否匹配某个 skill 的触发条件
488
+ 3. 如果匹配,在 Agent prompt 中注入该 skill 的核心指令或先调用对应 CLI 获取上下文数据
489
+ 4. 如果不匹配任何 skill,直接执行
490
+
491
+ **tester 任务验证循环(om:test 逻辑):**
492
+
493
+ 当 AI 判断任务需要 om:test 流程时:
494
+
495
+ 1. 先调用 CLI 获取项目测试配置:
496
+ ```bash
497
+ openmatrix test --json
498
+ ```
499
+
500
+ 2. 调用 Agent 生成测试(prompt 中已包含原始扫描数据):
501
+ ```typescript
502
+ Agent({
503
+ subagent_type: task.subagent_type,
504
+ description: task.description,
505
+ prompt: task.prompt + "\n\n⚠️ 完成后请输出简短摘要(不超过3行):\n1. 关键决策\n2. 创建/修改的文件\n3. 对后续任务的建议\n\n🚫 **禁止执行以下 Git 命令**:\n- ❌ git commit\n- ❌ git checkout/merge/pull/push/rebase/branch\n\n✅ 允许:git status, git diff, git log",
506
+ run_in_background: true
507
+ })
508
+ ```
509
+
510
+ 3. Agent 完成后,自动验证测试:
511
+ ```bash
512
+ npm test -- --run 2>&1
513
+ ```
514
+
515
+ 4. 验证失败时自动重试(最多 3 次):
516
+ - 将失败输出传给新 Agent 修复测试
517
+ - 重新验证
518
+ - 3 次失败后标记为 blocked,创建 Meeting
519
+
520
+ **默认执行方式(无特殊 skill 匹配时):**
521
+
393
522
  ```typescript
394
523
  Agent({
395
524
  subagent_type: task.subagent_type,
@@ -406,7 +535,7 @@ Agent({
406
535
  openmatrix complete TASK-XXX --success --summary "关键决策: xxx; 创建文件: xxx"
407
536
  ```
408
537
 
409
- 2. **全局上下文文件** — 所有任务的上下文累积在 `.openmatrix/context.md`:
538
+ 2. **全局上下文文件** — 所有任务的上下文累积在 `.openmatrix/{runId}/context.md`:
410
539
  - 每次任务完成后,通过 `--summary` 参数追加写入
411
540
  - 后续 Agent 可读取此文件了解前序任务的决策和发现
412
541
 
@@ -516,18 +645,20 @@ $ARGUMENTS
516
645
  ```
517
646
 
518
647
  start 和 auto 在同一位置,区别在于 start 有交互审批,auto 零交互。前置条件:
519
- - `.openmatrix/plan.md` — 技术方案(由 /om:plan 生成)
520
- - `.openmatrix/tasks-input.json` — 结构化元数据(由 /om:plan 生成)
648
+ - `.openmatrix/{runId}/plan.md` — 技术方案(由 /om:plan 生成)
649
+ - `.openmatrix/{runId}/tasks-input.json` — 结构化元数据(由 /om:plan 生成)
650
+
651
+ CLI 自动通过 `current.json` 定位当前 runId。
521
652
 
522
653
  如果前置条件不满足,引导用户执行 `/om:plan`。
523
654
 
524
655
  ## 质量级别
525
656
 
526
- | 级别 | TDD | 覆盖率 | Lint | 安全 |
527
- |------|:---:|:------:|:----:|:----:|
528
- | strict | Y | >80% | Y | Y |
529
- | balanced | N | >60% | Y | Y |
530
- | fast | N | 无 | N | N |
657
+ | 级别 | TDD | 覆盖率 | Lint | 安全 | 执行方式 |
658
+ |------|:---:|:------:|:----:|:----:|:--------:|
659
+ | 严格模式 | Y | >80% | Y | Y | TDD |
660
+ | 平衡模式 | N | >60% | Y | Y | 先开发后测试 |
661
+ | 快速模式 | N | 无 | N | N | 直接开发 |
531
662
 
532
663
  ## 执行流程
533
664
 
@@ -537,6 +668,14 @@ Step 1-2: 初始化 + 验证前置条件 -> Step 3-4: 分析类型 + 提交文
537
668
  -> Step 9: Agent 逐个执行 (只有这里写代码)
538
669
  ```
539
670
 
671
+ ## 自动推断规则
672
+
673
+ | 质量等级 | E2E 问题 | AI 验收 | 执行模式 |
674
+ |---------|---------|---------|---------|
675
+ | 严格模式 | 可选问一句 | 必须 | 全自动 + TDD |
676
+ | 平衡模式 | 不需要 | 必须 | 全自动 + 先开发后测试 |
677
+ | 快速模式 | 不需要 | 不需要 | 全自动 + 直接开发 |
678
+
540
679
  ## Git 提交格式
541
680
 
542
681
  ```
package/skills/status.md CHANGED
@@ -35,7 +35,7 @@ description: "Use when checking task execution progress, run status, completion
35
35
  </INTENT-JUDGMENT>
36
36
 
37
37
  <NO-OTHER-SKILLS>
38
- 执行此技能时,不得调用 superpowers、gsd 或其他任务编排相关的技能。OpenMatrix 独立运行,不依赖外部任务编排系统。
38
+ skill 与其他任务编排技能功能重叠,请勿同时使用。
39
39
  </NO-OTHER-SKILLS>
40
40
 
41
41
  <objective>
package/skills/test.md CHANGED
@@ -36,13 +36,9 @@ priority: high
36
36
  </INTENT-JUDGMENT>
37
37
 
38
38
  <NO-OTHER-SKILLS>
39
- **绝对禁止**调用以下技能:
40
- - ❌ superpowers:test-driven-development → 你已经在 om:test 中了
41
- - ❌ superpowers:* → 全部被 OpenMatrix 替代
42
- - ❌ gsd:* → 全部被 OpenMatrix 替代
43
- - ❌ 任何其他任务编排相关的技能
39
+ 本 skill 与其他任务编排技能功能重叠,请勿同时使用。
44
40
 
45
- **测试生成阶段只能使用 Agent 工具** — 直接调用 Agent,不通过任何中间层。
41
+ **测试生成阶段使用 Agent 工具执行。**
46
42
  </NO-OTHER-SKILLS>
47
43
 
48
44
  <MANDATORY-EXECUTION-ORDER>
@@ -67,6 +63,95 @@ Step 8: 输出测试报告
67
63
  **铁律:验证失败自动循环,最多 3 次,超过必须暂停**
68
64
  </MANDATORY-EXECUTION-ORDER>
69
65
 
66
+ <IRON-LAW>
67
+ ## 铁律:没有失败的测试,不许写生产代码
68
+
69
+ **NO PRODUCTION CODE WITHOUT A FAILING TEST FIRST**
70
+
71
+ 在测试前写了代码?删除。重新开始。
72
+
73
+ 没有例外:
74
+ - 不要保留作为"参考"
75
+ - 不要"写测试时适应它"
76
+ - 不要看它
77
+
78
+ 删除意味着删除。
79
+
80
+ ## Why Order Matters
81
+
82
+ ### "我会在实现后写测试来验证工作"
83
+
84
+ 实现后写的测试立即通过。立即通过什么也证明不了:
85
+ - 可能测试错误的东西
86
+ - 可能测试实现,不是行为
87
+ - 可能遗漏你忘记的边界情况
88
+ - 你从未看到它捕获 bug
89
+
90
+ 测试优先强制你看到测试失败,证明它确实测试某些东西。
91
+
92
+ ### "我手动测试了所有边界情况"
93
+
94
+ 手动测试是临时的。你以为测试了所有东西但:
95
+ - 没有测试记录
96
+ - 代码变化时无法重跑
97
+ - 压力下容易忘记情况
98
+ - "我试过了" ≠ 全面
99
+
100
+ 自动化测试是系统的。每次运行相同方式。
101
+
102
+ ### "删除 X 小时工作是浪费"
103
+
104
+ 沉没成本谬误。时间已经没了。现在选择:
105
+ - 删除并用 TDD 重写(X+小时,高信心)
106
+ - 保留并在后加测试(30分钟,低信心,可能 bug)
107
+
108
+ "浪费"是保留不能信任的代码。无真实测试的工作代码是技术债务。
109
+
110
+ ## Good vs Bad Tests
111
+
112
+ | 质量 | Good | Bad |
113
+ |-----|------|-----|
114
+ | **最小化** | 一件事。名字有"and"?拆分。 | `test('validates email and domain and whitespace')` |
115
+ | **清晰** | 名字描述行为 | `test('test1')` |
116
+ | **展示意图** | 展示期望 API | 模糊代码该做什么 |
117
+ | **真实代码** | 无 mock(除非不可避免) | Mock 一切 |
118
+
119
+ ### Good Example
120
+
121
+ ```typescript
122
+ test('重试失败操作 3 次', async () => {
123
+ let attempts = 0;
124
+ const operation = () => {
125
+ attempts++;
126
+ if (attempts < 3) throw new Error('fail');
127
+ return 'success';
128
+ };
129
+
130
+ const result = await retryOperation(operation);
131
+
132
+ expect(result).toBe('success');
133
+ expect(attempts).toBe(3);
134
+ });
135
+ ```
136
+
137
+ 一件事,测试真实行为,清晰名字。
138
+
139
+ ### Bad Example
140
+
141
+ ```typescript
142
+ test('retry works', async () => {
143
+ const mock = jest.fn()
144
+ .mockRejectedValueOnce(new Error())
145
+ .mockRejectedValueOnce(new Error())
146
+ .mockResolvedValueOnce('success');
147
+ await retryOperation(mock);
148
+ expect(mock).toHaveBeenCalledTimes(3);
149
+ });
150
+ ```
151
+
152
+ 模糊名字,测试 mock 不是代码。
153
+ </IRON-LAW>
154
+
70
155
  <objective>
71
156
  智能测试生成 - 从业务角度分析代码逻辑,发现测试缺失,自动生成并验证测试。遵循 OpenMatrix 分层原则:CLI 收集原始数据,AI 分析并生成测试。
72
157
  </objective>
@@ -682,6 +767,8 @@ Step 8: 输出测试报告
682
767
 
683
768
  **最大重试 3 次,超过必须暂停检查配置**
684
769
 
770
+ **没有失败的测试,不许写生产代码(参见 IRON-LAW 区块)**
771
+
685
772
  ## 红线
686
773
 
687
774
  - 3 次生成失败 → 暂停,检查测试框架配置
@@ -703,8 +790,18 @@ Step 8: 输出测试报告
703
790
  - "跳过自动验证"
704
791
  - 只测试函数调用而不是业务场景
705
792
  - 生成的测试与项目风格不一致
706
-
707
- **所有这些意味着:停止。回到 Step 2 或执行自动验证循环。**
793
+ - "我先写实现,再补测试"
794
+ - "这个测试一次就能过,不用看失败"
795
+ - "测试代码不重要,能过就行"
796
+ - "边界情况太多了,只测主流程"
797
+ - "删除这个失败的测试用例算了"
798
+ - "Mock 返回什么都行,只要测试通过"
799
+ - 测试名字描述实现细节而非业务行为
800
+ - 一个测试验证多个不相关的事情
801
+ - 测试依赖执行顺序或共享状态
802
+ - 使用 `any` 类型绕过类型检查
803
+
804
+ **这些都意味着:停止。回到 Step 2 或执行自动验证循环。**
708
805
 
709
806
  ## 测试生成原则
710
807