create-vibe-workflow 0.1.0 → 0.2.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.
- package/README.md +248 -57
- package/dist/adapters/next-only/skills.recommend.json +1 -0
- package/dist/adapters/node-api/skills.recommend.json +1 -0
- package/dist/cli.js +163 -5
- package/dist/cli.js.map +1 -1
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +255 -44
- package/dist/generator.js.map +1 -1
- package/dist/questions.d.ts +11 -1
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +103 -16
- package/dist/questions.js.map +1 -1
- package/dist/templates/claude-md/CLAUDE.zh-CN.md +51 -46
- package/dist/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
- package/dist/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
- package/dist/templates/commands/gstack/cso.md.ejs +213 -0
- package/dist/templates/commands/gstack/office-hours.md.ejs +109 -0
- package/dist/templates/commands/gstack/review.md.ejs +192 -0
- package/dist/templates/commands/gstack/ship.md.ejs +256 -0
- package/dist/templates/commands/opsx/apply.md.ejs +106 -0
- package/dist/templates/commands/opsx/archive.md.ejs +88 -0
- package/dist/templates/commands/opsx/explore.md.ejs +84 -0
- package/dist/templates/commands/opsx/propose.md.ejs +185 -0
- package/dist/templates/commands/superpowers/brainstorm.md.ejs +240 -0
- package/dist/templates/commands/superpowers/tdd.md.ejs +230 -0
- package/dist/templates/commands/superpowers/verify.md.ejs +211 -0
- package/dist/templates/commands/workflow/plan.md.ejs +219 -0
- package/dist/templates/hooks/check-deps.mjs +66 -65
- package/dist/templates/memory/.gitkeep +0 -0
- package/dist/templates/memory/MEMORY.md.ejs +88 -0
- package/dist/templates/memory/dev-notes.md.ejs +61 -0
- package/dist/templates/memory/troubleshooting.md.ejs +30 -0
- package/dist/templates/rules/agents.md +49 -49
- package/dist/templates/rules/coding-style.md +156 -117
- package/dist/templates/rules/development-workflow.md +103 -50
- package/dist/templates/rules/git-workflow.md +103 -47
- package/dist/templates/rules/hooks.md +159 -0
- package/dist/templates/rules/hooks.md.ejs +159 -0
- package/dist/templates/rules/memory.md +106 -0
- package/dist/templates/rules/memory.md.ejs +106 -0
- package/dist/templates/rules/patterns.md +117 -48
- package/dist/templates/rules/performance.md +108 -0
- package/dist/templates/rules/performance.md.ejs +108 -0
- package/dist/templates/rules/security.md +52 -37
- package/dist/templates/rules/testing.md +83 -30
- package/dist/templates/settings/settings.template.json +18 -2
- package/dist/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
- package/dist/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
- package/dist/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
- package/dist/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
- package/dist/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
- package/dist/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
- package/dist/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
- package/dist/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
- package/dist/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
- package/dist/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
- package/dist/templates/skills/skill-manifest.json +59 -0
- package/dist/templates/skills/skills-lock.template.json +12 -0
- package/dist/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
- package/dist/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
- package/dist/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
- package/dist/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
- package/dist/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
- package/dist/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
- package/dist/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
- package/dist/utils.d.ts +40 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +110 -0
- package/dist/utils.js.map +1 -0
- package/package.json +2 -2
- package/templates/claude-md/CLAUDE.zh-CN.md +51 -46
- package/templates/claude-md/next-only/CLAUDE.zh-CN.md +46 -0
- package/templates/claude-md/node-api/CLAUDE.zh-CN.md +47 -0
- package/templates/commands/gstack/cso.md.ejs +213 -0
- package/templates/commands/gstack/office-hours.md.ejs +109 -0
- package/templates/commands/gstack/review.md.ejs +192 -0
- package/templates/commands/gstack/ship.md.ejs +256 -0
- package/templates/commands/opsx/apply.md.ejs +106 -0
- package/templates/commands/opsx/archive.md.ejs +88 -0
- package/templates/commands/opsx/explore.md.ejs +84 -0
- package/templates/commands/opsx/propose.md.ejs +185 -0
- package/templates/commands/superpowers/brainstorm.md.ejs +240 -0
- package/templates/commands/superpowers/tdd.md.ejs +230 -0
- package/templates/commands/superpowers/verify.md.ejs +211 -0
- package/templates/commands/workflow/plan.md.ejs +219 -0
- package/templates/hooks/check-deps.mjs +66 -65
- package/templates/memory/.gitkeep +0 -0
- package/templates/memory/MEMORY.md.ejs +88 -0
- package/templates/memory/dev-notes.md.ejs +61 -0
- package/templates/memory/troubleshooting.md.ejs +30 -0
- package/templates/rules/agents.md +49 -49
- package/templates/rules/coding-style.md +156 -117
- package/templates/rules/development-workflow.md +103 -50
- package/templates/rules/git-workflow.md +103 -47
- package/templates/rules/hooks.md +159 -0
- package/templates/rules/memory.md +106 -0
- package/templates/rules/patterns.md +117 -48
- package/templates/rules/performance.md +108 -0
- package/templates/rules/security.md +52 -37
- package/templates/rules/testing.md +83 -30
- package/templates/settings/settings.template.json +18 -2
- package/templates/skills/advanced/caveman/SKILL.md.ejs +144 -0
- package/templates/skills/advanced/diagnose/SKILL.md.ejs +159 -0
- package/templates/skills/advanced/grill-with-docs/SKILL.md.ejs +154 -0
- package/templates/skills/advanced/improve-codebase-architecture/SKILL.md.ejs +172 -0
- package/templates/skills/backend/backend-patterns/SKILL.md.ejs +263 -0
- package/templates/skills/database/database-migrations/SKILL.md.ejs +202 -0
- package/templates/skills/database/postgres-patterns/SKILL.md.ejs +235 -0
- package/templates/skills/devops/deployment-patterns/SKILL.md.ejs +228 -0
- package/templates/skills/devops/docker-patterns/SKILL.md.ejs +215 -0
- package/templates/skills/frontend/frontend-patterns/SKILL.md.ejs +195 -0
- package/templates/skills/skill-manifest.json +59 -0
- package/templates/skills/skills-lock.template.json +12 -0
- package/templates/skills/testing/e2e-testing/SKILL.md.ejs +224 -0
- package/templates/skills/workflow/coding-standards/SKILL.md.ejs +143 -0
- package/templates/skills/workflow/search-first/SKILL.md.ejs +103 -0
- package/templates/skills/workflow/security-review/SKILL.md.ejs +146 -0
- package/templates/skills/workflow/strategic-compact/SKILL.md.ejs +108 -0
- package/templates/skills/workflow/tdd-workflow/SKILL.md.ejs +104 -0
- package/templates/skills/workflow/verification-loop/SKILL.md.ejs +144 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Brainstorm"
|
|
3
|
+
description: "将模糊想法转化为具体设计文档,在写任何代码前执行。源自 Superpowers brainstorming"
|
|
4
|
+
category: "Planning"
|
|
5
|
+
tags: ["设计", "规划", "头脑风暴", "Superpowers"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Brainstorm
|
|
9
|
+
|
|
10
|
+
## 职责
|
|
11
|
+
|
|
12
|
+
将用户的一个模糊想法或需求,通过结构化思考转化为具体设计文档。**禁止编写任何实现代码**——本命令的唯一产出是一份设计文档。
|
|
13
|
+
|
|
14
|
+
## HARD GATE(硬性约束)
|
|
15
|
+
|
|
16
|
+
> **禁止:**
|
|
17
|
+
> - 编写任何实现代码
|
|
18
|
+
> - 创建任何项目脚手架
|
|
19
|
+
> - 修改任何源代码文件
|
|
20
|
+
> - 生成代码片段(除设计文档中的伪代码示例外)
|
|
21
|
+
>
|
|
22
|
+
> **唯一允许的产出:**
|
|
23
|
+
> - `docs/designs/YYYY-MM-DD-<topic>.md` 设计文档
|
|
24
|
+
> - 相关 git commit(仅包含设计文档)
|
|
25
|
+
|
|
26
|
+
## 工作模式
|
|
27
|
+
|
|
28
|
+
<%= USER_LEVEL === 'vibe-coder' ? `
|
|
29
|
+
### 面向非专业编程人员(Vibe Coder)
|
|
30
|
+
|
|
31
|
+
用户可能没有技术背景。你的职责是翻译器和引导者:
|
|
32
|
+
- **用自然语言交流**:避免技术术语,或用通俗比喻解释
|
|
33
|
+
- **帮用户理清想法**:用户可能只有一个模糊的需求,通过提问帮他们聚焦
|
|
34
|
+
- **翻译技术概念**:把用户的"我想要一个类似淘宝的页面"翻译为功能模块
|
|
35
|
+
- **给出简单选项**:设计方案时给 2-3 个选项,用日常语言说明优劣
|
|
36
|
+
- **逐步确认**:每完成一个设计部分就询问"这个部分你觉得对吗?"
|
|
37
|
+
- **控制范围**:提醒用户不要一次做太多,聚焦最小可行方案
|
|
38
|
+
` : `
|
|
39
|
+
### 面向专业开发者
|
|
40
|
+
|
|
41
|
+
- 可以直接讨论技术方案、架构模式、设计模式
|
|
42
|
+
- 关注实现效率、可维护性、技术合理性
|
|
43
|
+
- 可以复用项目已有的模式和约定
|
|
44
|
+
- 使用适当的抽象层级讨论(领域层、应用层、基础设施层)
|
|
45
|
+
- 关注可测试性、可扩展性、性能边界
|
|
46
|
+
` %>
|
|
47
|
+
|
|
48
|
+
## 步骤
|
|
49
|
+
|
|
50
|
+
### 步骤 1:探索项目上下文
|
|
51
|
+
|
|
52
|
+
在开始设计前,了解当前项目:
|
|
53
|
+
|
|
54
|
+
1. 读取 `docs/` 目录下已有的设计文档和 PRD
|
|
55
|
+
2. 检查项目结构(`src/`、`packages/` 等)了解已有约定
|
|
56
|
+
3. 查看最近的 git commit 了解开发节奏
|
|
57
|
+
4. 如果项目有 `CLAUDE.md`,阅读项目说明
|
|
58
|
+
5. 如果项目有 `openspec/` 目录,阅读最近的提案
|
|
59
|
+
|
|
60
|
+
**目的**:确保新设计不重复已有功能,符合项目既有模式。
|
|
61
|
+
|
|
62
|
+
### 步骤 2:逐一问 clarifying questions
|
|
63
|
+
|
|
64
|
+
一次只问 **一个问题**,等待用户回答后再问下一个。
|
|
65
|
+
|
|
66
|
+
**必须先澄清的问题:**
|
|
67
|
+
|
|
68
|
+
| 问题 | 目的 |
|
|
69
|
+
|------|------|
|
|
70
|
+
| "这个功能解决谁的什么问题?" | 确定用户和目标 |
|
|
71
|
+
| "你觉得什么样的输出算做完了?" | 确定验收标准 |
|
|
72
|
+
| "有没有类似的参考(网站、应用、截图)?" | 对齐视觉/功能预期 |
|
|
73
|
+
| "这个功能影响现有功能吗?" | 确定影响范围 |
|
|
74
|
+
| "你希望什么时候能用上?" | 确定时间约束 |
|
|
75
|
+
|
|
76
|
+
**约束确认:**
|
|
77
|
+
|
|
78
|
+
<%= USER_LEVEL === 'vibe-coder' ? `
|
|
79
|
+
- "你希望用户登录后才能用,还是所有人能用?"
|
|
80
|
+
- "数据存哪里方便?电脑本地还是服务器?"
|
|
81
|
+
- "多少人会用这个功能?"
|
|
82
|
+
` : `
|
|
83
|
+
- "认证方案用什么?JWT / Session / OAuth?"
|
|
84
|
+
- "数据存储用现有 DB 还是引入新的存储?"
|
|
85
|
+
- "预期并发量级?这可能影响架构选择。"
|
|
86
|
+
` %>
|
|
87
|
+
|
|
88
|
+
### 步骤 3:提出 2-3 个方案
|
|
89
|
+
|
|
90
|
+
针对需求,提出 2-3 个可行方案,每个方案包括:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
## 方案 A:<名称>
|
|
94
|
+
- **做法**:简短的实现描述
|
|
95
|
+
- **优点**:2-3 个优点
|
|
96
|
+
- **缺点**:1-2 个缺点
|
|
97
|
+
- **复杂度**:低/中/高
|
|
98
|
+
- **预估工时**:<时间估算>
|
|
99
|
+
|
|
100
|
+
## 方案 B:<名称>
|
|
101
|
+
...
|
|
102
|
+
|
|
103
|
+
## 方案 C(可选):<名称>
|
|
104
|
+
...
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**提出推荐方案**并说明理由:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
## 推荐:方案 <X>
|
|
111
|
+
理由:<1-2 句话说明为什么推荐该方案>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
用户确认方案后再进入下一步。
|
|
115
|
+
|
|
116
|
+
### 步骤 4:分部分设计,逐部分确认
|
|
117
|
+
|
|
118
|
+
将设计拆分为以下部分,**每完成一部分就向用户确认**:
|
|
119
|
+
|
|
120
|
+
#### 第一部分:功能范围
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
## 功能范围
|
|
124
|
+
|
|
125
|
+
### 在范围内(本次做)
|
|
126
|
+
- 功能 A
|
|
127
|
+
- 功能 B
|
|
128
|
+
|
|
129
|
+
### 不在范围内(明确排除)
|
|
130
|
+
- 功能 C(后续迭代)
|
|
131
|
+
- 功能 D(不相关)
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
#### 第二部分:数据模型(如有)
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
## 数据模型
|
|
138
|
+
|
|
139
|
+
### 实体
|
|
140
|
+
- **User**:id, name, email, role, createdAt
|
|
141
|
+
- **Order**:id, userId, status, total, createdAt
|
|
142
|
+
|
|
143
|
+
### 关系
|
|
144
|
+
- User 1:N Order
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
#### 第三部分:用户界面 / API
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
## 界面 / API
|
|
151
|
+
|
|
152
|
+
### 页面/端点
|
|
153
|
+
1. `/login` — 登录页面(邮箱 + 密码)
|
|
154
|
+
2. `/register` — 注册页面
|
|
155
|
+
...
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
#### 第四部分:数据流
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
## 数据流
|
|
162
|
+
|
|
163
|
+
### 核心流程
|
|
164
|
+
1. 用户访问页面 →
|
|
165
|
+
2. 系统检查认证状态 →
|
|
166
|
+
3. 未认证用户重定向到登录页 →
|
|
167
|
+
4. ...
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
<%= USER_LEVEL === 'vibe-coder' ? `
|
|
171
|
+
每次确认时用通俗语言:"这个部分你看对不对?有需要调整的地方吗?"
|
|
172
|
+
` : `
|
|
173
|
+
每次确认:"这个设计部分是否符合预期?有没有需要补充的技术细节?"
|
|
174
|
+
` %>
|
|
175
|
+
|
|
176
|
+
### 步骤 5:编写设计文档
|
|
177
|
+
|
|
178
|
+
写入 `docs/designs/YYYY-MM-DD-<topic>.md`,格式:
|
|
179
|
+
|
|
180
|
+
```markdown
|
|
181
|
+
# 设计:<项目名称>
|
|
182
|
+
|
|
183
|
+
## 概述
|
|
184
|
+
<1-3 句话说明这个设计要做什么>
|
|
185
|
+
|
|
186
|
+
## 背景
|
|
187
|
+
<为什么需要这个功能,解决什么问题>
|
|
188
|
+
|
|
189
|
+
## 方案选择
|
|
190
|
+
<选中的方案和理由>
|
|
191
|
+
|
|
192
|
+
## 功能范围
|
|
193
|
+
### 范围内
|
|
194
|
+
### 范围外
|
|
195
|
+
|
|
196
|
+
## 数据模型
|
|
197
|
+
...
|
|
198
|
+
|
|
199
|
+
## 界面 / API
|
|
200
|
+
...
|
|
201
|
+
|
|
202
|
+
## 数据流
|
|
203
|
+
...
|
|
204
|
+
|
|
205
|
+
## 影响分析
|
|
206
|
+
<会影响哪些已有模块,是否需要迁移>
|
|
207
|
+
|
|
208
|
+
## 验收标准
|
|
209
|
+
- [ ] P0: ...
|
|
210
|
+
- [ ] P1: ...
|
|
211
|
+
|
|
212
|
+
## 设计日期
|
|
213
|
+
<%= GENERATED_AT.split('T')[0] %>
|
|
214
|
+
|
|
215
|
+
## 设计者
|
|
216
|
+
create-vibe-workflow / Brainstorm command
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
> 如果 `docs/designs/` 目录不存在,先创建。
|
|
220
|
+
|
|
221
|
+
### 步骤 6:提交设计文档
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
git add docs/designs/YYYY-MM-DD-<topic>.md
|
|
225
|
+
git commit -m "docs: 添加 <topic> 设计文档"
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## 设计原则
|
|
229
|
+
|
|
230
|
+
- **先理解再设计**:没有理解需求之前不要急于给方案
|
|
231
|
+
- **保持聚焦**:控制范围,避免功能蔓延
|
|
232
|
+
- **逐部分确认**:不要在全部完成后才让用户反馈
|
|
233
|
+
- **记录决策**:设计文档要记录"为什么选 A 不选 B"
|
|
234
|
+
- **足够就好**:设计文档不是详细规格,够下一步规划用即可
|
|
235
|
+
|
|
236
|
+
## 下一步
|
|
237
|
+
|
|
238
|
+
设计文档提交后,建议用户运行:
|
|
239
|
+
- `/plan` — 将设计拆解为 commit 级任务
|
|
240
|
+
- 然后进入开发阶段
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "TDD"
|
|
3
|
+
description: "强制执行测试驱动开发纪律 — RED → GREEN → REFACTOR 循环,覆盖率 ≥80%"
|
|
4
|
+
category: "Development"
|
|
5
|
+
tags: ["TDD", "测试", "开发", "Superpowers"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# TDD
|
|
9
|
+
|
|
10
|
+
## 职责
|
|
11
|
+
|
|
12
|
+
强制执行 Test-Driven Development(测试驱动开发)纪律:**先写测试,再写实现**。
|
|
13
|
+
|
|
14
|
+
## TDD 铁律
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
┌─────────────────────────────────────────────────────────┐
|
|
18
|
+
│ ① RED ── 写一个失败的测试(先写!) │
|
|
19
|
+
│ ② GREEN ── 写最简实现让测试通过 │
|
|
20
|
+
│ ③ REFACTOR ── 重构代码,保持测试通过 │
|
|
21
|
+
│ ④ LOOP ── 回到 ①,直到功能完成 │
|
|
22
|
+
└─────────────────────────────────────────────────────────┘
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**不可跳过的阶段:RED → GREEN → REFACTOR 必须严格按顺序执行。**
|
|
26
|
+
|
|
27
|
+
## 工作模式
|
|
28
|
+
|
|
29
|
+
<%= USER_LEVEL === 'vibe-coder' ? `
|
|
30
|
+
### 面向非专业编程人员(Vibe Coder)
|
|
31
|
+
|
|
32
|
+
- TDD 的核心理念是"先想清楚怎么验证,再动手做"——就像组装家具前先检查零件清单
|
|
33
|
+
- 测试就是"验证清单"——确认每个功能按预期工作
|
|
34
|
+
- 如果测试失败,不要慌——这恰恰说明测试在保护你
|
|
35
|
+
- 红 -> 绿 -> 重构,可以先不纠结完美,先确保功能跑通,再回来打磨
|
|
36
|
+
- 会使用通俗语言解释测试结果:红色 = 有问题需要修,绿色 = 一切正常
|
|
37
|
+
` : `
|
|
38
|
+
### 面向专业开发者
|
|
39
|
+
|
|
40
|
+
- 测试行为而非实现细节
|
|
41
|
+
- 避免 over-mocking——只在系统边界使用 mock
|
|
42
|
+
- 关注测试的可维护性和可读性
|
|
43
|
+
- 覆盖率指标是手段不是目的
|
|
44
|
+
- 每个 RED 阶段验证测试本身会失败(确认测试有效)
|
|
45
|
+
` %>
|
|
46
|
+
|
|
47
|
+
## 步骤
|
|
48
|
+
|
|
49
|
+
### 步骤 0:准备
|
|
50
|
+
|
|
51
|
+
1. 读取 `todolist.md`,找到当前待完成的第一个 P0 任务
|
|
52
|
+
2. 理解任务描述、涉及文件、验收标准
|
|
53
|
+
3. 确定当前要实现的函数/组件/端点
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
正在实现:<commit-message>
|
|
57
|
+
涉及文件:<files>
|
|
58
|
+
当前阶段:准备就绪,等待 RED 阶段
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 步骤 1:RED — 先写测试
|
|
62
|
+
|
|
63
|
+
**必须**:在写任何实现代码之前,先写测试。
|
|
64
|
+
|
|
65
|
+
**写测试指南:**
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
### RED 阶段
|
|
69
|
+
|
|
70
|
+
测试目标:<要测试的函数/组件>
|
|
71
|
+
测试文件:<test-file-path>
|
|
72
|
+
|
|
73
|
+
测试用例:
|
|
74
|
+
1. <场景 1> — 期望结果
|
|
75
|
+
2. <场景 2> — 期望结果
|
|
76
|
+
...
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**测试命名规范**:`{被测单元} — {场景} — {期望结果}`
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
示例:
|
|
83
|
+
- createUser — with valid data — returns user object with ID
|
|
84
|
+
- createUser — with duplicate email — throws ValidationError
|
|
85
|
+
- UserAvatar — when image fails to load — shows fallback initials
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**测试类型选择**(按优先级):
|
|
89
|
+
|
|
90
|
+
| 要验证什么 | 测试类型 | 速度 | 数量 |
|
|
91
|
+
|-----------|---------|------|------|
|
|
92
|
+
| 工具函数/纯逻辑 | 单元测试 | 毫秒级 | 边界全覆盖 |
|
|
93
|
+
| 组件渲染 | 单元测试 | 毫秒级 | happy path |
|
|
94
|
+
| API 端点 | 集成测试 | 秒级 | happy + error |
|
|
95
|
+
| 数据库操作 | 集成测试 | 秒级 | CRUD + 约束 |
|
|
96
|
+
|
|
97
|
+
**写完后运行测试**,确认测试**失败**:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npm test 2>&1 | head -30
|
|
101
|
+
# 或
|
|
102
|
+
npm run test -- --run 2>&1 | head -30
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
> 确认测试失败证明:① 测试写对了 ② 功能确实还没实现
|
|
106
|
+
|
|
107
|
+
### 步骤 2:GREEN — 最简实现
|
|
108
|
+
|
|
109
|
+
**写最简代码让测试通过**:
|
|
110
|
+
|
|
111
|
+
- 写刚好够让测试通过的代码
|
|
112
|
+
- **不要优化**,**不要抽象**,**不要加未来功能**
|
|
113
|
+
- 可以硬编码返回值——后续测试会迫使你泛化
|
|
114
|
+
- 本阶段目标是**通过测试**,不是"写好代码"
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
### GREEN 阶段
|
|
118
|
+
|
|
119
|
+
实现方案:<简短的实现描述>
|
|
120
|
+
变更文件:<files to modify>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**写完后运行测试**,确认全部通过:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
npm test 2>&1 | head -30
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 步骤 3:REFACTOR — 重构
|
|
130
|
+
|
|
131
|
+
**测试通过后才能重构**:
|
|
132
|
+
|
|
133
|
+
- 提取重复代码
|
|
134
|
+
- 优化命名
|
|
135
|
+
- 简化逻辑
|
|
136
|
+
- 遵循项目代码风格
|
|
137
|
+
|
|
138
|
+
**重构不改变行为**:
|
|
139
|
+
- 不改测试
|
|
140
|
+
- 不改 API 签名
|
|
141
|
+
- 不改业务逻辑
|
|
142
|
+
|
|
143
|
+
**每步修改后跑测试**确认没有破坏:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
npm test 2>&1 | head -10
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
### REFACTOR 阶段
|
|
151
|
+
|
|
152
|
+
重构内容:
|
|
153
|
+
1. <重构了什么> — <理由>
|
|
154
|
+
2. <重构了什么> — <理由>
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 步骤 4:验证覆盖率
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
npm run test -- --coverage 2>&1 | tail -30
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
覆盖率要求:
|
|
164
|
+
- 纯逻辑层 ≥ 95%
|
|
165
|
+
- 组件层 ≥ 80%
|
|
166
|
+
- API 端点 ≥ 80%
|
|
167
|
+
- **总覆盖率 ≥ 80%**
|
|
168
|
+
|
|
169
|
+
如果覆盖率不达标,补充测试或标记为已知低覆盖区域。
|
|
170
|
+
|
|
171
|
+
### 步骤 5:标记任务完成
|
|
172
|
+
|
|
173
|
+
在 `todolist.md` 中将当前任务标记为 `[x]`:
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
- [x] <commit-message> — <任务描述>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
并提交当前进度:
|
|
180
|
+
|
|
181
|
+
```bash
|
|
182
|
+
git add -A
|
|
183
|
+
git commit -m "<commit-message>"
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 步骤 6:进入下一个任务
|
|
187
|
+
|
|
188
|
+
如果还有未完成的 P0 任务,回到步骤 0(RED 阶段)。
|
|
189
|
+
|
|
190
|
+
如果所有 P0 完成,输出完成摘要:
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
✅ 所有 P0 任务已完成!
|
|
194
|
+
|
|
195
|
+
完成情况:
|
|
196
|
+
- [x] 任务 1
|
|
197
|
+
- [x] 任务 2
|
|
198
|
+
|
|
199
|
+
覆盖率:<X>%(≥80% ✅)
|
|
200
|
+
|
|
201
|
+
建议:运行 /verify 进行完整性检查
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## 反模式(必须避免)
|
|
205
|
+
|
|
206
|
+
| 反模式 | 问题 | 正确做法 |
|
|
207
|
+
|--------|------|---------|
|
|
208
|
+
| 先写实现再补测试 | 测试只是验证而非驱动 | 先写测试 |
|
|
209
|
+
| 测试依赖实现细节 | 重构时大面积测试失败 | 测试行为而非实现 |
|
|
210
|
+
| 一个测试测多个东西 | 失败时不知道问题在哪 | 一个测试一个断言 |
|
|
211
|
+
| mock 过多 | 测试与实现强耦合 | 只在边界层用 mock |
|
|
212
|
+
| 忽略 RED 阶段 | 无法确认测试有效性 | RED 阶段验证测试本身 |
|
|
213
|
+
| 覆盖率 100% 强迫症 | 耗费精力在 trivial 代码上 | 按决策矩阵分配精力 |
|
|
214
|
+
|
|
215
|
+
## CI 集成
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
每次 push / PR 自动运行:
|
|
219
|
+
[lint] → [type-check] → [unit-test] → [build] → [integration-test]
|
|
220
|
+
|
|
221
|
+
门禁规则:
|
|
222
|
+
- 单元测试失败 → 阻断合并
|
|
223
|
+
- 覆盖率低于阈值 → 警告
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## 下一步
|
|
227
|
+
|
|
228
|
+
实现完成后,运行:
|
|
229
|
+
- `/verify` — 完整性检查(编译、测试、lint、安全)
|
|
230
|
+
- 然后准备提交 PR
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Verify"
|
|
3
|
+
description: "预完成验证 — 在声明工作完成前运行所有检查。源自 Superpowers verification-before-completion"
|
|
4
|
+
category: "Quality"
|
|
5
|
+
tags: ["验证", "质量", "检查", "Superpowers"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Verify
|
|
9
|
+
|
|
10
|
+
## 职责
|
|
11
|
+
|
|
12
|
+
在声明"功能完成"或"问题已修复"之前,运行所有检查。**没有验证过的完成声明不可信。**
|
|
13
|
+
|
|
14
|
+
## CRITICAL RULE(硬性规则)
|
|
15
|
+
|
|
16
|
+
> **禁止在未运行此命令的情况下声明"已完成"、"已修复"、"功能正确"。**
|
|
17
|
+
>
|
|
18
|
+
> 证据必须优先于断言。每次你认为"搞定了"时,先运行 `/verify`。
|
|
19
|
+
|
|
20
|
+
## 工作模式
|
|
21
|
+
|
|
22
|
+
<%= USER_LEVEL === 'vibe-coder' ? `
|
|
23
|
+
### 面向非专业编程人员(Vibe Coder)
|
|
24
|
+
|
|
25
|
+
验证就是"最后的检查清单"——就像出门前检查:钥匙、手机、钱包。
|
|
26
|
+
- 每个检查步骤会用通俗语言解释在做什么
|
|
27
|
+
- 失败了会告诉你"哪里有问题"和"怎么修"
|
|
28
|
+
- 不要担心看不懂,我会解释每个错误
|
|
29
|
+
- 修复建议是可操作的("在第 42 行删掉这个 console.log")
|
|
30
|
+
` : `
|
|
31
|
+
### 面向专业开发者
|
|
32
|
+
|
|
33
|
+
- 只报告具体失败信息,不做不必要的解释
|
|
34
|
+
- 关注 CI 一致性——确保本地检查与 CI 检查一致
|
|
35
|
+
- 支持逐项跳过(用 --skip-lint 等参数)
|
|
36
|
+
` %>
|
|
37
|
+
|
|
38
|
+
## 6 阶段验证
|
|
39
|
+
|
|
40
|
+
### 阶段 1:编译检查
|
|
41
|
+
|
|
42
|
+
确保代码可以编译。执行项目对应的编译命令:
|
|
43
|
+
|
|
44
|
+
<%= USER_LEVEL === 'vibe-coder' ? `
|
|
45
|
+
运行构建命令,检查有没有"红色的错误"——如果有,说明代码还不完整。
|
|
46
|
+
|
|
47
|
+
\`\`\`bash
|
|
48
|
+
npm run build 2>&1
|
|
49
|
+
\`\`\`
|
|
50
|
+
` : `
|
|
51
|
+
\`\`\`bash
|
|
52
|
+
# TypeScript 项目
|
|
53
|
+
npm run build 2>&1
|
|
54
|
+
# 或
|
|
55
|
+
tsc --noEmit 2>&1
|
|
56
|
+
|
|
57
|
+
# 其他语言根据项目配置
|
|
58
|
+
\`\`\`
|
|
59
|
+
` %>
|
|
60
|
+
|
|
61
|
+
**通过条件**:编译/构建成功,无错误退出。
|
|
62
|
+
|
|
63
|
+
### 阶段 2:类型检查
|
|
64
|
+
|
|
65
|
+
确保类型系统没有错误:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# TypeScript
|
|
69
|
+
npx tsc --noEmit 2>&1
|
|
70
|
+
# 或使用项目配置的 type-check 脚本
|
|
71
|
+
npm run type-check 2>&1
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**通过条件**:类型检查通过,无类型错误。
|
|
75
|
+
|
|
76
|
+
### 阶段 3:Lint 检查
|
|
77
|
+
|
|
78
|
+
确保代码风格和规范没有问题:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# 根据项目配置
|
|
82
|
+
npm run lint 2>&1
|
|
83
|
+
# 或
|
|
84
|
+
npx eslint . 2>&1
|
|
85
|
+
npx prettier --check . 2>&1
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**通过条件**:无新的 lint 错误或警告。如果项目本身有未修复的历史 lint 问题,只检查本次修改的文件。
|
|
89
|
+
|
|
90
|
+
### 阶段 4:测试套件
|
|
91
|
+
|
|
92
|
+
运行所有测试并检查覆盖率:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npm test 2>&1
|
|
96
|
+
npm run test -- --coverage 2>&1 | tail -20
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**检查项:**
|
|
100
|
+
|
|
101
|
+
| 检查 | 通过条件 |
|
|
102
|
+
|------|---------|
|
|
103
|
+
| 所有测试通过 | 0 failures |
|
|
104
|
+
| 覆盖率 ≥ 80% | 全局与单文件覆盖率均达标 |
|
|
105
|
+
| 无 flaky 测试 | 重复运行 3 次均通过(如适用) |
|
|
106
|
+
|
|
107
|
+
**通过条件**:所有测试通过 + 覆盖率 ≥ 80%。
|
|
108
|
+
|
|
109
|
+
**如果测试失败:**
|
|
110
|
+
<%= USER_LEVEL === 'vibe-coder' ? `
|
|
111
|
+
- 我会告诉你哪个测试失败了
|
|
112
|
+
- 解释这个测试在测什么
|
|
113
|
+
- 给出可能的修复方向
|
|
114
|
+
- 修复完成后重新运行测试
|
|
115
|
+
` : `
|
|
116
|
+
- 分析失败根因(实现错误 / 测试问题 / 环境问题)
|
|
117
|
+
- 检查测试隔离性
|
|
118
|
+
- 验证 mock 是正确的
|
|
119
|
+
- 修复后重新运行
|
|
120
|
+
` %>
|
|
121
|
+
|
|
122
|
+
### 阶段 5:安全扫描
|
|
123
|
+
|
|
124
|
+
检查代码中的安全问题:
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
### 安全检查清单
|
|
128
|
+
|
|
129
|
+
□ 无硬编码密钥(API Key、密码、token)
|
|
130
|
+
搜索模式:/(?:sk-|api[-_]?key|password|secret|token)[:=]["']\w/
|
|
131
|
+
|
|
132
|
+
□ 无 console.log 残留
|
|
133
|
+
搜索模式:console\.(log|debug|warn|error)
|
|
134
|
+
|
|
135
|
+
□ 无 TODO / FIXME 在生产代码中
|
|
136
|
+
搜索模式:TODO|FIXME|HACK|XXX
|
|
137
|
+
|
|
138
|
+
□ 无暴露的注释掉的代码块
|
|
139
|
+
|
|
140
|
+
□ 用户输入已做验证(如果涉及新 API 端点)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
> 扫描范围为本次修改的所有文件(用 `git diff --name-only` 获取)。
|
|
144
|
+
|
|
145
|
+
**通过条件**:无高安全性问题(CRITICAL/HIGH 级别)。
|
|
146
|
+
|
|
147
|
+
### 阶段 6:Diff 审查
|
|
148
|
+
|
|
149
|
+
审查所有变更,检查:
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
### Diff 审查清单
|
|
153
|
+
|
|
154
|
+
□ 变更与需求相关(无无关修改)
|
|
155
|
+
□ 无调试代码残留
|
|
156
|
+
□ 文档已同步更新
|
|
157
|
+
□ 错误处理完整(无静默吞错误)
|
|
158
|
+
□ 命名一致(与项目现有模式一致)
|
|
159
|
+
□ 无重复代码或不必要的抽象
|
|
160
|
+
□ 未引入新的循环依赖
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
**通过条件**:所有检查项通过。如果有问题,列出具体位置。
|
|
164
|
+
|
|
165
|
+
## 输出报告
|
|
166
|
+
|
|
167
|
+
验证完成后,生成以下报告:
|
|
168
|
+
|
|
169
|
+
```
|
|
170
|
+
## Verify 报告
|
|
171
|
+
|
|
172
|
+
### 编译检查 ✅ 通过
|
|
173
|
+
### 类型检查 ✅ 通过
|
|
174
|
+
### Lint 检查 ✅ 通过
|
|
175
|
+
### 测试套件 ✅ 通过(共 N 个测试,覆盖率 X%)
|
|
176
|
+
### 安全扫描 ✅ 通过
|
|
177
|
+
### Diff 审查 ✅ 通过
|
|
178
|
+
|
|
179
|
+
结果:✅ 全部通过!可以准备提交。
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
如果有失败项:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
## Verify 报告
|
|
186
|
+
|
|
187
|
+
### 编译检查 ❌ 失败
|
|
188
|
+
- 错误信息:<具体信息>
|
|
189
|
+
- 修复建议:<具体建议>
|
|
190
|
+
|
|
191
|
+
### 类型检查 ✅ 通过
|
|
192
|
+
|
|
193
|
+
结果:❌ 1/6 阶段失败。请修复后再运行 /verify。
|
|
194
|
+
|
|
195
|
+
下一个动作:<具体的下一步操作>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## 跳过选项
|
|
199
|
+
|
|
200
|
+
- `--skip-build` / `--skip-type` / `--skip-lint` / `--skip-tests` / `--skip-security` / `--skip-diff`
|
|
201
|
+
- 跳过时需说明理由
|
|
202
|
+
|
|
203
|
+
## 与 /ship 的关联
|
|
204
|
+
|
|
205
|
+
`/ship` 命令会在创建 PR 前**自动调用 `/verify`**。如果验证失败,ship 流程会中止并报告失败原因。
|
|
206
|
+
|
|
207
|
+
## 下一步
|
|
208
|
+
|
|
209
|
+
验证通过后:
|
|
210
|
+
- 运行 `/plan` 标记下一个任务
|
|
211
|
+
- 或运行 `/ship` 创建 PR
|