@specpow/framework 0.5.10 → 0.5.11
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/CHANGELOG.md +623 -623
- package/LICENSE +21 -21
- package/bin/specpow.js +9 -9
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +12 -11
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/archive.d.ts.map +1 -1
- package/dist/commands/archive.js +6 -3
- package/dist/commands/archive.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +5 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +29 -10
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/execute.d.ts.map +1 -1
- package/dist/commands/execute.js +5 -2
- package/dist/commands/execute.js.map +1 -1
- package/dist/commands/explore.d.ts.map +1 -1
- package/dist/commands/explore.js +8 -10
- package/dist/commands/explore.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/propose.d.ts.map +1 -1
- package/dist/commands/propose.js +4 -3
- package/dist/commands/propose.js.map +1 -1
- package/dist/commands/schema.d.ts.map +1 -1
- package/dist/commands/schema.js +5 -2
- package/dist/commands/schema.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +5 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/store.d.ts.map +1 -1
- package/dist/commands/store.js +8 -6
- package/dist/commands/store.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +3 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/validate-specs.d.ts.map +1 -1
- package/dist/commands/validate-specs.js +8 -5
- package/dist/commands/validate-specs.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +5 -2
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/workflow/index.d.ts.map +1 -1
- package/dist/commands/workflow/index.js +13 -8
- package/dist/commands/workflow/index.js.map +1 -1
- package/dist/core/archive/engine.d.ts.map +1 -1
- package/dist/core/archive/engine.js +10 -6
- package/dist/core/archive/engine.js.map +1 -1
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -1
- package/dist/core/artifact-graph/resolver.js +5 -2
- package/dist/core/artifact-graph/resolver.js.map +1 -1
- package/dist/core/config/config-schema.d.ts +104 -0
- package/dist/core/config/config-schema.d.ts.map +1 -1
- package/dist/core/config/config-schema.js +15 -1
- package/dist/core/config/config-schema.js.map +1 -1
- package/dist/core/hooks/session-start-hook.d.ts.map +1 -1
- package/dist/core/hooks/session-start-hook.js +50 -45
- package/dist/core/hooks/session-start-hook.js.map +1 -1
- package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -1
- package/dist/core/hooks/workflow-state-hook.js +3 -1
- package/dist/core/hooks/workflow-state-hook.js.map +1 -1
- package/dist/core/init/engine.d.ts.map +1 -1
- package/dist/core/init/engine.js +15 -12
- package/dist/core/init/engine.js.map +1 -1
- package/dist/core/memory/adapters/sqlite-adapter.js +55 -55
- package/dist/core/migration/index.d.ts.map +1 -1
- package/dist/core/migration/index.js +128 -4
- package/dist/core/migration/index.js.map +1 -1
- package/dist/core/store/index.d.ts +4 -3
- package/dist/core/store/index.d.ts.map +1 -1
- package/dist/core/store/index.js +7 -7
- package/dist/core/store/index.js.map +1 -1
- package/dist/core/templates/index.d.ts +1 -1
- package/dist/core/templates/index.d.ts.map +1 -1
- package/dist/core/templates/index.js +11 -6
- package/dist/core/templates/index.js.map +1 -1
- package/dist/core/workflow-state.d.ts +1 -1
- package/dist/core/workflow-state.d.ts.map +1 -1
- package/dist/core/workflow-state.js +10 -5
- package/dist/core/workflow-state.js.map +1 -1
- package/dist/templates/claude-commands/specpow-apply.md +23 -23
- package/dist/templates/claude-commands/specpow-archive.md +22 -22
- package/dist/templates/claude-commands/specpow-propose.md +27 -27
- package/dist/templates/claude-commands/specpow-status.md +22 -22
- package/dist/templates/claude-commands/specpow-validate-specs.md +28 -28
- package/dist/templates/claude-commands/specpow-verify.md +21 -21
- package/dist/templates/claude-commands/specpow.md +34 -34
- package/package.json +121 -122
- package/.specpow/skills/business-code-review/SKILL.md +0 -78
- package/.specpow/skills/business-db-design/SKILL.md +0 -74
- package/.specpow/skills/business-deploy-check/SKILL.md +0 -72
- package/.specpow/skills/business-doc-sync/SKILL.md +0 -72
- package/.specpow/skills/business-java-codegen/SKILL.md +0 -97
- package/.specpow/skills/business-menu-register/SKILL.md +0 -63
- package/.specpow/skills/business-prd-writer/SKILL.md +0 -80
- package/.specpow/skills/business-test-gen/SKILL.md +0 -82
- package/.specpow/skills/business-ui-codegen/SKILL.md +0 -104
- package/.specpow/skills/cli-router/SKILL.md +0 -107
- package/.specpow/skills/execution-finish-branch/SKILL.md +0 -58
- package/.specpow/skills/execution-git-worktrees/SKILL.md +0 -48
- package/.specpow/skills/execution-parallel-agents/SKILL.md +0 -46
- package/.specpow/skills/execution-receiving-review/SKILL.md +0 -47
- package/.specpow/skills/execution-requesting-review/SKILL.md +0 -51
- package/.specpow/skills/execution-sdd-orchestrator/SKILL.md +0 -366
- package/.specpow/skills/execution-subagent-dispatch/SKILL.md +0 -295
- package/.specpow/skills/execution-subagent-driven-dev/SKILL.md +0 -143
- package/.specpow/skills/execution-systematic-debugging/SKILL.md +0 -95
- package/.specpow/skills/execution-tdd/SKILL.md +0 -74
- package/.specpow/skills/execution-verification-before-completion/SKILL.md +0 -75
- package/.specpow/skills/meta-create-skill/SKILL.md +0 -374
- package/.specpow/skills/meta-using-skills/SKILL.md +0 -97
- package/.specpow/skills/meta-writing-skills/SKILL.md +0 -66
- package/.specpow/skills/planning-apply-change/SKILL.md +0 -194
- package/.specpow/skills/planning-archive-change/SKILL.md +0 -53
- package/.specpow/skills/planning-explore/SKILL.md +0 -99
- package/.specpow/skills/planning-onboard/SKILL.md +0 -60
- package/.specpow/skills/planning-propose/SKILL.md +0 -156
- package/.specpow/skills/planning-update-change/SKILL.md +0 -45
- package/.specpow/skills/planning-verify-change/SKILL.md +0 -72
- package/.specpow/skills/planning-write-design/SKILL.md +0 -59
- package/.specpow/skills/planning-write-plans/SKILL.md +0 -55
- package/.specpow/skills/planning-write-specs/SKILL.md +0 -73
- package/.specpow/skills/using-specpow/SKILL.md +0 -232
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: execution-subagent-driven-dev
|
|
3
|
-
description: 子代理驱动开发(SDD)。通过分发新鲜子代理执行每个任务,每个任务后进行审查,最后进行全分支审查。来自 Superpowers 的核心执行引擎。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 子代理驱动开发(SDD)
|
|
7
|
-
|
|
8
|
-
通过为每个任务分发一个全新的实现者子代理来执行计划,每个任务后进行任务审查(规范合规 + 代码质量),最后进行全分支审查。
|
|
9
|
-
|
|
10
|
-
**为什么用子代理:** 你将任务委托给具有隔离上下文的专门代理。通过精确构建它们的指令和上下文,你确保它们保持专注并成功完成任务。它们不应该继承你会话的上下文或历史 — 你构建它们需要的一切。这也保护了你自己的上下文用于协调工作。
|
|
11
|
-
|
|
12
|
-
**核心原则:** 每任务新鲜子代理 + 任务审查(规范 + 质量)+ 宽泛最终审查 = 高质量、快速迭代
|
|
13
|
-
|
|
14
|
-
## 何时使用
|
|
15
|
-
|
|
16
|
-
- 有实现计划?
|
|
17
|
-
- 任务大多独立?
|
|
18
|
-
- 想在当前会话中完成?
|
|
19
|
-
|
|
20
|
-
如果都是 yes → 使用此技能。
|
|
21
|
-
|
|
22
|
-
## 流程
|
|
23
|
-
|
|
24
|
-
### 设置
|
|
25
|
-
|
|
26
|
-
1. 确保工作在隔离工作区中(使用 `git-worktrees` 技能)
|
|
27
|
-
2. 解析工作区目录:`scripts/sdd-workspace PLAN_FILE`
|
|
28
|
-
3. 检查账本(`<workspace>/progress.md`)
|
|
29
|
-
4. 读取计划一次,为每个任务创建 todo
|
|
30
|
-
5. 扫描计划中的冲突(任务间矛盾、与全局约束矛盾)
|
|
31
|
-
|
|
32
|
-
### 任务循环
|
|
33
|
-
|
|
34
|
-
对每个任务:
|
|
35
|
-
|
|
36
|
-
#### 1. 分发实现者
|
|
37
|
-
记录 BASE commit(`git rev-parse HEAD`)。
|
|
38
|
-
- **任务简报:** 运行 `scripts/task-brief PLAN_FILE N`
|
|
39
|
-
- **报告文件名:** 与简报同名(`task-N-report.md`)
|
|
40
|
-
- **分发 prompt 包含:**
|
|
41
|
-
1. 一行项目背景
|
|
42
|
-
2. 简报路径("先读这个")
|
|
43
|
-
3. 来自前置任务的接口信息
|
|
44
|
-
4. 你对歧义的解读
|
|
45
|
-
5. 报告文件路径和报告契约
|
|
46
|
-
|
|
47
|
-
**绝不**让子代理读取整个计划文件。
|
|
48
|
-
**绝不**分发多个实现子代理并行(会冲突)。
|
|
49
|
-
|
|
50
|
-
#### 2. 处理报告
|
|
51
|
-
|
|
52
|
-
实现者报告四种状态之一:
|
|
53
|
-
- **DONE:** 生成审查包,分发审查者
|
|
54
|
-
- **DONE_WITH_CONCERNS:** 先读取疑虑,如果是正确性问题则先处理
|
|
55
|
-
- **NEEDS_CONTEXT:** 提供缺失上下文,重新分发
|
|
56
|
-
- **BLOCKED:** 评估阻塞原因,可能需要更强模型或拆分任务
|
|
57
|
-
|
|
58
|
-
#### 3. 审查任务
|
|
59
|
-
|
|
60
|
-
- 运行 `scripts/review-package PLAN_FILE BASE HEAD`
|
|
61
|
-
- 分发任务审查子代理
|
|
62
|
-
- 审查者输入:简报 + 报告 + 审查包 + 全局约束
|
|
63
|
-
- 审查者输出:规范合规 ✓/✗ + 质量通过/不通过 + 发现列表
|
|
64
|
-
|
|
65
|
-
**绝不跳过任务审查。实现者自审不能替代任务审查。**
|
|
66
|
-
|
|
67
|
-
#### 4. 修复循环
|
|
68
|
-
|
|
69
|
-
触发条件:规范 ❌、Critical/Important 发现、或确认有 ⚠️ 项。
|
|
70
|
-
|
|
71
|
-
**Rounds 1-3 — 恢复原始实现者:**
|
|
72
|
-
发送开放发现原文。它的上下文完整。
|
|
73
|
-
|
|
74
|
-
**Rounds 4-5 — 分发全新实现者,使用更强模型:**
|
|
75
|
-
"A prior implementer attempted this task N times; you own it now."
|
|
76
|
-
|
|
77
|
-
每轮:
|
|
78
|
-
1. 实现者修复 + 重新运行测试 + 追加修复报告
|
|
79
|
-
2. 运行 `scripts/review-package PLAN_FILE FIX_BASE HEAD`
|
|
80
|
-
3. 分发范围限定的重新审查
|
|
81
|
-
4. 重新审查者裁定每个发现:ADDRESSED 或 NOT ADDRESSED
|
|
82
|
-
5. 记录到账本
|
|
83
|
-
|
|
84
|
-
#### 5. 断路器(5 轮后)
|
|
85
|
-
停止分发。自己裁定每个开放发现:
|
|
86
|
-
|
|
87
|
-
- **审查者误报/有争议:** 停放 → `Task N: parked — <finding> — ruling: <why>`
|
|
88
|
-
- **真实但无下游依赖:** 停放,注明延迟
|
|
89
|
-
- **真实且承重:** STOP。`Task N: BLOCKED — <reason>`。报告给用户。
|
|
90
|
-
|
|
91
|
-
**只在顶部裁定。提前裁定是用不同名字预先判断。**
|
|
92
|
-
|
|
93
|
-
#### 6. 完成任务
|
|
94
|
-
|
|
95
|
-
审查干净后(或所有开放发现都已停放):
|
|
96
|
-
- 追加完成行到账本
|
|
97
|
-
- 标记 todo 完成
|
|
98
|
-
- 继续下一任务
|
|
99
|
-
|
|
100
|
-
### 最终审查
|
|
101
|
-
所有任务完成后:
|
|
102
|
-
1. 运行 `scripts/review-package PLAN_FILE MERGE_BASE HEAD`
|
|
103
|
-
2. 分发最终审查(使用最强模型)
|
|
104
|
-
3. 如果有发现,分发一个修复子代理(不是每个发现一个)
|
|
105
|
-
4. 然后一次范围限定的重新审查
|
|
106
|
-
5. 裁定剩余发现
|
|
107
|
-
|
|
108
|
-
### 完成
|
|
109
|
-
|
|
110
|
-
1. 删除工作区(`rm -rf <workspace>`)
|
|
111
|
-
2. 使用 `finish-branch` 技能
|
|
112
|
-
|
|
113
|
-
## 模型选择
|
|
114
|
-
|
|
115
|
-
| 任务类型 | 模型级别 |
|
|
116
|
-
|----------|----------|
|
|
117
|
-
| 机械实现(1-2文件,完整规范) | cheap |
|
|
118
|
-
| 集成和判断(多文件协调) | standard |
|
|
119
|
-
| 架构和设计 | capable |
|
|
120
|
-
| 最终审查 | capable(总是) |
|
|
121
|
-
| 修复轮次 4-5 | 至少比卡住的实现者高一级 |
|
|
122
|
-
|
|
123
|
-
**总是显式指定模型。** 省略模型会继承会话模型(通常是最贵的)。
|
|
124
|
-
|
|
125
|
-
## 上下文管理铁律
|
|
126
|
-
- 所有产物通过文件传递
|
|
127
|
-
- 分发 prompt 只包含当前任务所需
|
|
128
|
-
- 不粘贴历史任务摘要
|
|
129
|
-
- 审查包是文件,不在你的上下文中
|
|
130
|
-
- 信任账本而非自己的记忆
|
|
131
|
-
|
|
132
|
-
## 合理化防御表
|
|
133
|
-
|
|
134
|
-
| 借口 | 现实 |
|
|
135
|
-
|------|------|
|
|
136
|
-
| "规范合规差不多就行了" | 审查者发现规范差异 = 没完成。修复或裁定。 |
|
|
137
|
-
| "我自己修复,分发太麻烦" | 控制器修复污染你的上下文且跳过审查。 |
|
|
138
|
-
| "再来一轮会收敛吧" | 过了顶部,轮次不会收敛。失败是结构性的。 |
|
|
139
|
-
| "审查者反正会发现新东西" | 范围限定的重新审查验证修复;它们不会游荡。 |
|
|
140
|
-
| "这个发现明显错了,我跳过吧" | 你只在顶部裁定,每个裁定都是账本条目。 |
|
|
141
|
-
| "修复很小,跳过重新审查" | 未审查的修复是回归的方式。 |
|
|
142
|
-
| "审查拖慢了循环" | 没有审查的循环只是未验证的折腾。 |
|
|
143
|
-
| "账本记录是多余的" | 账本是压缩后存活的东西。 |
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: execution-systematic-debugging
|
|
3
|
-
description: 系统化调试 4 阶段根因分析:调查→模式分析→假设测试→实现修复。来自 Superpowers。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 系统化调试
|
|
7
|
-
|
|
8
|
-
## 铁律
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
不要猜测。调查。
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## 4 阶段流程
|
|
15
|
-
|
|
16
|
-
### 阶段 1: 调查
|
|
17
|
-
|
|
18
|
-
1. 复现问题
|
|
19
|
-
2. 收集错误信息(日志、堆栈、截图)
|
|
20
|
-
3. 确定影响范围
|
|
21
|
-
4. 检查最近的变更(`git log --oneline -20`)
|
|
22
|
-
|
|
23
|
-
### 阶段 2: 模式分析
|
|
24
|
-
|
|
25
|
-
1. 错误信息中的关键词是什么?
|
|
26
|
-
2. 这个错误模式在代码库中有先例吗?
|
|
27
|
-
3. 最近有什么变更可能引入这个问题?
|
|
28
|
-
4. 是回归还是新问题?
|
|
29
|
-
|
|
30
|
-
### 阶段 3: 假设测试
|
|
31
|
-
|
|
32
|
-
1. 形成假设:"如果 X,那么 Y"
|
|
33
|
-
2. 设计验证实验
|
|
34
|
-
3. 运行实验
|
|
35
|
-
4. 如果假设被否定,形成新假设
|
|
36
|
-
|
|
37
|
-
### 阶段 4: 实现修复
|
|
38
|
-
|
|
39
|
-
1. 修复根因,不是症状
|
|
40
|
-
2. 写回归测试
|
|
41
|
-
3. 验证修复
|
|
42
|
-
4. 检查是否有类似问题
|
|
43
|
-
|
|
44
|
-
## 根因追踪
|
|
45
|
-
|
|
46
|
-
如果修复后问题再次出现,说明你没有找到根因。回到阶段 1。
|
|
47
|
-
|
|
48
|
-
## 合理化防御表
|
|
49
|
-
|
|
50
|
-
| 你可能的想法 | 现实 |
|
|
51
|
-
|-------------|------|
|
|
52
|
-
| "我猜是这个问题" | 猜测不是调试。验证。 |
|
|
53
|
-
| "先修了再说" | 修症状不是修根因。 |
|
|
54
|
-
| "没时间调查了" | 不调查就修 = 问题会回来。 |
|
|
55
|
-
| "这个错误信息不重要" | 错误信息是线索。读它。 |
|
|
56
|
-
| "肯定是最近改的" | 也可能是旧 bug 被新代码触发。 |
|
|
57
|
-
| "我应该直接问同事" | 先自己调查 15 分钟再问。 |
|
|
58
|
-
| "这个 bug 太复杂了" | 复杂 bug 也是简单问题的组合。分解它。 |
|
|
59
|
-
| "重启一下就好了" | 重启掩盖问题,不解决问题。 |
|
|
60
|
-
| "这个只在测试环境出现" | 测试环境暴露问题,不是制造问题。 |
|
|
61
|
-
| "用户操作错误" | 用户操作是反馈,不是借口。 |
|
|
62
|
-
| "这个优先级不高" | bug 不会因为你标记低优先级就停止影响用户。 |
|
|
63
|
-
|
|
64
|
-
## 红旗清单
|
|
65
|
-
|
|
66
|
-
以下 13 条危险信号出现时,立即 STOP:
|
|
67
|
-
|
|
68
|
-
1. **"我猜是这个问题"** → 猜测不是调试。形成假设并验证。
|
|
69
|
-
2. **"先修了再说"** → 修症状不是修根因。问题会回来。
|
|
70
|
-
3. **"没时间调查了"** → 不调查就修 = 赌博。
|
|
71
|
-
4. **"这个错误信息不重要"** → 错误信息是第一条线索。忽略它 = 盲人摸象。
|
|
72
|
-
5. **"肯定是最近改的"** → 确认偏误。检查所有可能性。
|
|
73
|
-
6. **"我加个日志看看"** → 日志是好的,但先读现有日志和堆栈。
|
|
74
|
-
7. **"这个 bug 太复杂了"** → 复杂 bug 也是简单问题的组合。分解它。
|
|
75
|
-
8. **"重启一下就好了"** → 重启掩盖问题。根因还在。
|
|
76
|
-
9. **"这个只在测试环境出现"** → 测试环境暴露问题,不是制造问题。
|
|
77
|
-
10. **"用户操作错误"** → 用户操作是反馈。系统应该能处理错误操作。
|
|
78
|
-
11. **"这个优先级不高"** → bug 不会因为低优先级就停止影响用户。
|
|
79
|
-
12. **"我之前遇到过类似的"** → 类似不等于相同。每次都要验证。
|
|
80
|
-
13. **"应该是并发/时序问题"** → 不要跳到结论。先排除确定性 bug。
|
|
81
|
-
|
|
82
|
-
## 压力测试
|
|
83
|
-
|
|
84
|
-
在声称修复完成前,问自己:
|
|
85
|
-
|
|
86
|
-
1. 如果输入是空的怎么办?
|
|
87
|
-
2. 如果输入是 null/undefined 怎么办?
|
|
88
|
-
3. 如果并发 1000 个请求怎么办?
|
|
89
|
-
4. 如果网络断了怎么办?
|
|
90
|
-
5. 如果磁盘满了怎么办?
|
|
91
|
-
6. 如果数据库连接超时怎么办?
|
|
92
|
-
7. 如果配置缺失怎么办?
|
|
93
|
-
8. 如果依赖服务返回错误怎么办?
|
|
94
|
-
9. 如果这个修复引入了新问题怎么办?回归测试覆盖了吗?
|
|
95
|
-
10. 如果问题在另一个环境复现不了怎么办?
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: execution-tdd
|
|
3
|
-
description: 测试驱动开发。严格的 RED-GREEN-REFACTOR 循环。铁律:没有失败测试就不写产品代码。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 测试驱动开发(TDD)
|
|
7
|
-
|
|
8
|
-
## 铁律
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
没有失败测试就不写产品代码。
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## 循环
|
|
15
|
-
|
|
16
|
-
### RED — 写一个失败的测试
|
|
17
|
-
|
|
18
|
-
1. 写一个描述期望行为的测试
|
|
19
|
-
2. 运行测试,确认它失败
|
|
20
|
-
3. 测试失败的原因必须是"功能还不存在"
|
|
21
|
-
|
|
22
|
-
### GREEN — 写最少的代码让测试通过
|
|
23
|
-
|
|
24
|
-
1. 写刚好够让测试通过的代码
|
|
25
|
-
2. 不多写。YAGNI。
|
|
26
|
-
3. 运行测试,确认全部通过
|
|
27
|
-
|
|
28
|
-
### REFACTOR — 清理代码
|
|
29
|
-
|
|
30
|
-
1. 在测试保护下重构
|
|
31
|
-
2. 消除重复
|
|
32
|
-
3. 改善命名
|
|
33
|
-
4. 运行测试,确认仍然全部通过
|
|
34
|
-
|
|
35
|
-
## 合理化防御表
|
|
36
|
-
|
|
37
|
-
| 你可能的想法 | 现实 |
|
|
38
|
-
|-------------|------|
|
|
39
|
-
| "这个改动太小不需要测试" | 小改动也会引入 bug。先写测试。 |
|
|
40
|
-
| "测试会花太长时间" | 不测试会花更长时间调试。 |
|
|
41
|
-
| "这个函数太简单了" | 简单函数也会有边界情况。 |
|
|
42
|
-
| "我先实现再补测试" | 事后测试无法驱动设计。先测试。 |
|
|
43
|
-
| "现有测试已经够了" | 新行为需要新测试。 |
|
|
44
|
-
| "这个 edge case 不太可能发生" | 不可能发生的事总会发生。 |
|
|
45
|
-
| "重构可以等一等" | 技术债会复利增长。 |
|
|
46
|
-
| "文档可以后面再写" | 后面 = 永远不。现在写。 |
|
|
47
|
-
| "性能优化不急" | 等用户抱怨就来不及了。 |
|
|
48
|
-
| "这个 TODO 我记住了" | 你会忘的。写下来。 |
|
|
49
|
-
| "其他模块更重要" | 每个模块都是最重要的。 |
|
|
50
|
-
|
|
51
|
-
## 红旗
|
|
52
|
-
|
|
53
|
-
这些想法意味着 STOP — 你正在合理化:
|
|
54
|
-
|
|
55
|
-
| 想法 | 现实 |
|
|
56
|
-
|------|------|
|
|
57
|
-
| "我先写实现再补测试" | STOP。先写测试。 |
|
|
58
|
-
| "这个不需要测试" | 如果它需要工作,它需要测试。 |
|
|
59
|
-
| "测试太多了" | 代码太多了还差不多。 |
|
|
60
|
-
| "这个 edge case 不重要" | 不重要的 edge case 经常是最重要的 bug。 |
|
|
61
|
-
| "测试会让我变慢" | 没有测试会让你更慢。 |
|
|
62
|
-
|
|
63
|
-
## 压力测试
|
|
64
|
-
|
|
65
|
-
在声称完成前,问自己:
|
|
66
|
-
|
|
67
|
-
1. 如果输入是空的怎么办?
|
|
68
|
-
2. 如果输入是 null/undefined 怎么办?
|
|
69
|
-
3. 如果并发 1000 个请求怎么办?
|
|
70
|
-
4. 如果网络断了怎么办?
|
|
71
|
-
5. 如果磁盘满了怎么办?
|
|
72
|
-
6. 如果数据库连接超时怎么办?
|
|
73
|
-
7. 如果用户输入包含特殊字符怎么办?
|
|
74
|
-
8. 如果配置缺失怎么办?
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: execution-verification-before-completion
|
|
3
|
-
description: 完成前验证。铁律:没有新鲜验证证据就不声称完成。防止代理说"应该可以了"。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 完成前验证
|
|
7
|
-
|
|
8
|
-
## 铁律
|
|
9
|
-
|
|
10
|
-
```
|
|
11
|
-
没有新鲜验证证据就不声称完成。
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
## 规则
|
|
15
|
-
|
|
16
|
-
1. **运行测试** — 不是"应该通过",是"确实通过"
|
|
17
|
-
2. **检查构建** — 不是"应该能构建",是"确实构建了"
|
|
18
|
-
3. **验证行为** — 不是"逻辑上应该对",是"实际运行对了"
|
|
19
|
-
|
|
20
|
-
## 验证清单
|
|
21
|
-
|
|
22
|
-
完成前必须确认:
|
|
23
|
-
|
|
24
|
-
- [ ] 所有测试通过(`npm test` / `mvn test`)
|
|
25
|
-
- [ ] 构建成功(`npm run build` / `mvn package`)
|
|
26
|
-
- [ ] Lint 通过(无新增警告)
|
|
27
|
-
- [ ] 手动验证关键路径(如果适用)
|
|
28
|
-
- [ ] 没有遗留 TODO 或 FIXME
|
|
29
|
-
|
|
30
|
-
## 合理化防御表
|
|
31
|
-
|
|
32
|
-
| 你可能的想法 | 现实 |
|
|
33
|
-
|-------------|------|
|
|
34
|
-
| "应该可以了" | "应该"不是证据。运行测试。 |
|
|
35
|
-
| "改动太小不需要验证" | 小改动也能破坏东西。验证。 |
|
|
36
|
-
| "测试太慢了" | 不验证就声称完成更慢(返工)。 |
|
|
37
|
-
| "我检查了代码逻辑" | 检查逻辑 ≠ 运行测试。 |
|
|
38
|
-
| "这个 edge case 不太可能" | 不太可能的事总会发生。 |
|
|
39
|
-
| "集成测试就够了" | 集成测试慢且定位困难。两者都需要。 |
|
|
40
|
-
| "我先发布再修复" | 修复线上 bug 的成本是开发阶段的 100 倍。 |
|
|
41
|
-
| "其他人都验证过了" | 责任在你。自己验证。 |
|
|
42
|
-
| "这个模块不重要" | 每个模块对用户都很重要。 |
|
|
43
|
-
| "性能问题以后再说" | 性能问题会滚雪球。早处理。 |
|
|
44
|
-
| "文档可以后面补" | 后面 = 永远不。现在写。 |
|
|
45
|
-
|
|
46
|
-
## 红旗
|
|
47
|
-
|
|
48
|
-
这些想法意味着 STOP — 你正在合理化:
|
|
49
|
-
|
|
50
|
-
1. **"我觉得应该没问题"** → STOP。验证它。
|
|
51
|
-
2. **"这个改动很明显是对的"** → 明显的改动也经常有 bug。验证。
|
|
52
|
-
3. **"测试都通过了"** → 测试通过 ≠ 行为正确。检查测试覆盖。
|
|
53
|
-
4. **"我手动测试过了"** → 手动测试不可复现。自动化它。
|
|
54
|
-
5. **"这个功能很简单"** → 简单功能也会有复杂 bug。
|
|
55
|
-
6. **"用户不会这样用"** → 用户总会做你意想不到的事。
|
|
56
|
-
7. **"这个错误不重要"** | 错误就是错误。没有"不重要"的错误。
|
|
57
|
-
8. **"我先标记为已知问题"** | 已知问题也会让用户流失。
|
|
58
|
-
9. **"这个只在特定环境出现"** | 特定环境也是真实环境。
|
|
59
|
-
10. **"我昨天测试过了"** | 昨天 ≠ 今天。代码变了。重新测试。
|
|
60
|
-
11. **"这个 warning 可以忽略"** | warning 是未来的 bug。现在修复。
|
|
61
|
-
|
|
62
|
-
## 压力测试
|
|
63
|
-
|
|
64
|
-
在声称完成前,问自己:
|
|
65
|
-
|
|
66
|
-
1. 如果输入是空的怎么办?
|
|
67
|
-
2. 如果输入是 null/undefined 怎么办?
|
|
68
|
-
3. 如果并发 1000 个请求怎么办?
|
|
69
|
-
4. 如果网络断了怎么办?
|
|
70
|
-
5. 如果磁盘满了怎么办?
|
|
71
|
-
6. 如果数据库连接超时怎么办?
|
|
72
|
-
7. 如果用户输入包含特殊字符怎么办?
|
|
73
|
-
8. 如果配置缺失怎么办?
|
|
74
|
-
9. 如果依赖服务不可用怎么办?
|
|
75
|
-
10. 如果内存不足怎么办?
|