@shirlytaylor73/superharness 1.5.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/LICENSE +21 -0
- package/README.md +202 -0
- package/bin/lib/codex-installer.js +228 -0
- package/bin/lib/interactive-select.js +96 -0
- package/bin/superharness.js +67 -0
- package/package.json +52 -0
- package/plugins/superharness/.claude-plugin/plugin.json +19 -0
- package/plugins/superharness/.codex-plugin/plugin.json +31 -0
- package/plugins/superharness/.mcp.json +9 -0
- package/plugins/superharness/CODE_OF_CONDUCT.md +79 -0
- package/plugins/superharness/LICENSE +21 -0
- package/plugins/superharness/README.md +57 -0
- package/plugins/superharness/agents/code-reviewer.md +48 -0
- package/plugins/superharness/archived-skills/using-superpowers/SKILL.md +140 -0
- package/plugins/superharness/archived-skills/using-superpowers/references/codex-tools.md +25 -0
- package/plugins/superharness/archived-skills/using-superpowers/references/copilot-tools.md +52 -0
- package/plugins/superharness/archived-skills/using-superpowers/references/gemini-tools.md +33 -0
- package/plugins/superharness/archived-skills/using-superpowers/references/hermes-tools.md +44 -0
- package/plugins/superharness/commands/free.md +6 -0
- package/plugins/superharness/commands/rollback.md +30 -0
- package/plugins/superharness/commands-codex/free.md +29 -0
- package/plugins/superharness/commands-codex/rollback.md +33 -0
- package/plugins/superharness/hooks/hooks-codex.json +50 -0
- package/plugins/superharness/hooks/hooks.json +50 -0
- package/plugins/superharness/hooks/lib/free-mode-check.mjs +27 -0
- package/plugins/superharness/hooks/run-hook.cmd +58 -0
- package/plugins/superharness/hooks/workflow-context +4 -0
- package/plugins/superharness/hooks/workflow-context.mjs +184 -0
- package/plugins/superharness/hooks/workflow-post-transition +4 -0
- package/plugins/superharness/hooks/workflow-post-transition.mjs +89 -0
- package/plugins/superharness/hooks/workflow-pre-tool-use +4 -0
- package/plugins/superharness/hooks/workflow-pre-tool-use.mjs +97 -0
- package/plugins/superharness/hooks/workflow-stop +4 -0
- package/plugins/superharness/hooks/workflow-stop.mjs +136 -0
- package/plugins/superharness/scripts/rollback.mjs +86 -0
- package/plugins/superharness/scripts/set-free-mode.mjs +77 -0
- package/plugins/superharness/skills/brainstorming/SKILL.md +182 -0
- package/plugins/superharness/skills/brainstorming/scripts/frame-template.html +214 -0
- package/plugins/superharness/skills/brainstorming/scripts/helper.js +88 -0
- package/plugins/superharness/skills/brainstorming/scripts/server.cjs +338 -0
- package/plugins/superharness/skills/brainstorming/scripts/start-server.sh +153 -0
- package/plugins/superharness/skills/brainstorming/scripts/stop-server.sh +55 -0
- package/plugins/superharness/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
- package/plugins/superharness/skills/brainstorming/visual-companion.md +286 -0
- package/plugins/superharness/skills/chinese-code-review/SKILL.md +277 -0
- package/plugins/superharness/skills/chinese-commit-conventions/SKILL.md +364 -0
- package/plugins/superharness/skills/chinese-documentation/SKILL.md +448 -0
- package/plugins/superharness/skills/chinese-git-workflow/SKILL.md +547 -0
- package/plugins/superharness/skills/dispatching-parallel-agents/SKILL.md +186 -0
- package/plugins/superharness/skills/exploration/SKILL.md +197 -0
- package/plugins/superharness/skills/finishing/SKILL.md +200 -0
- package/plugins/superharness/skills/intake/SKILL.md +134 -0
- package/plugins/superharness/skills/mcp-builder/SKILL.md +255 -0
- package/plugins/superharness/skills/parallel-execution/SKILL.md +368 -0
- package/plugins/superharness/skills/parallel-execution/implementer-prompt.md +144 -0
- package/plugins/superharness/skills/parallel-execution/spec-reviewer-prompt.md +84 -0
- package/plugins/superharness/skills/parallel-execution/wave-final-manual-qa-prompt.md +61 -0
- package/plugins/superharness/skills/parallel-execution/wave-final-quality-prompt.md +59 -0
- package/plugins/superharness/skills/parallel-execution/wave-final-scope-fidelity-prompt.md +69 -0
- package/plugins/superharness/skills/parallel-execution/wave-final-spec-prompt.md +56 -0
- package/plugins/superharness/skills/planning/SKILL.md +265 -0
- package/plugins/superharness/skills/planning/plan-document-reviewer-prompt.md +80 -0
- package/plugins/superharness/skills/receiving-code-review/SKILL.md +213 -0
- package/plugins/superharness/skills/requesting-code-review/SKILL.md +107 -0
- package/plugins/superharness/skills/requesting-code-review/code-reviewer.md +146 -0
- package/plugins/superharness/skills/serial-execution/SKILL.md +183 -0
- package/plugins/superharness/skills/systematic-debugging/CREATION-LOG.md +119 -0
- package/plugins/superharness/skills/systematic-debugging/SKILL.md +320 -0
- package/plugins/superharness/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
- package/plugins/superharness/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/plugins/superharness/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/plugins/superharness/skills/systematic-debugging/find-polluter.sh +63 -0
- package/plugins/superharness/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/plugins/superharness/skills/systematic-debugging/test-academic.md +14 -0
- package/plugins/superharness/skills/systematic-debugging/test-pressure-1.md +58 -0
- package/plugins/superharness/skills/systematic-debugging/test-pressure-2.md +68 -0
- package/plugins/superharness/skills/systematic-debugging/test-pressure-3.md +69 -0
- package/plugins/superharness/skills/test-driven-development/SKILL.md +371 -0
- package/plugins/superharness/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/plugins/superharness/skills/trivial/SKILL.md +118 -0
- package/plugins/superharness/skills/using-git-worktrees/SKILL.md +218 -0
- package/plugins/superharness/skills/verification/SKILL.md +139 -0
- package/plugins/superharness/skills/workflow-runner/SKILL.md +172 -0
- package/plugins/superharness/skills/writing-skills/SKILL.md +655 -0
- package/plugins/superharness/skills/writing-skills/anthropic-best-practices.md +1149 -0
- package/plugins/superharness/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
- package/plugins/superharness/skills/writing-skills/graphviz-conventions.dot +172 -0
- package/plugins/superharness/skills/writing-skills/persuasion-principles.md +187 -0
- package/plugins/superharness/skills/writing-skills/render-graphs.js +168 -0
- package/plugins/superharness/skills/writing-skills/testing-skills-with-subagents.md +385 -0
- package/plugins/superharness/workflow/default-workflow.yaml +84 -0
- package/plugins/superharness/workflow-state-server/bootstrap.js +44 -0
- package/plugins/superharness/workflow-state-server/package-lock.json +2853 -0
- package/plugins/superharness/workflow-state-server/package.json +22 -0
- package/plugins/superharness/workflow-state-server/render-context.js +124 -0
- package/plugins/superharness/workflow-state-server/schema.sql +39 -0
- package/plugins/superharness/workflow-state-server/server.js +290 -0
- package/plugins/superharness/workflow-state-server/state.js +424 -0
- package/plugins/superharness/workflow-state-server/validate-workflow.js +165 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chinese-code-review
|
|
3
|
+
description: 中文代码审查规范——在保持专业严谨的同时,用符合国内团队文化的方式给出有效反馈
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 中文代码审查规范
|
|
7
|
+
|
|
8
|
+
## 概述
|
|
9
|
+
|
|
10
|
+
国内团队做 Code Review 常遇到两个极端:要么过度客气导致关键问题被放过,要么照搬西方直白风格让同事下不来台。本技能帮你找到平衡点——**既不回避问题,又让人愿意接受反馈**。
|
|
11
|
+
|
|
12
|
+
**核心原则:** 用"建议"代替"命令",用"提问"代替"否定",但绝不因为面子而放过 bug。
|
|
13
|
+
|
|
14
|
+
## 审查反馈的表达方式
|
|
15
|
+
|
|
16
|
+
### 用建议代替命令
|
|
17
|
+
|
|
18
|
+
| 避免(命令式) | 推荐(建议式) |
|
|
19
|
+
|---------------|---------------|
|
|
20
|
+
| 你必须改成 X | 建议考虑用 X,因为 Y |
|
|
21
|
+
| 这里写错了 | 这里可能存在一个问题,是否考虑过 Z 的情况? |
|
|
22
|
+
| 不要用这个方法 | 这个方法在 A 场景下可能有性能问题,可以看看 B 方案 |
|
|
23
|
+
| 这段代码不行 | 这段逻辑我理解得对吗?如果输入为空的话会怎样? |
|
|
24
|
+
|
|
25
|
+
### 用提问代替否定
|
|
26
|
+
|
|
27
|
+
当你不确定对方意图时,先问再评:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
# 好的方式
|
|
31
|
+
这里用 sync 方式读文件是出于什么考虑?如果并发量上来,可能会阻塞事件循环。
|
|
32
|
+
|
|
33
|
+
# 不好的方式
|
|
34
|
+
这里不应该用 sync 方式读文件。
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 分级标注
|
|
38
|
+
|
|
39
|
+
统一使用优先级标记,让作者快速判断轻重缓急:
|
|
40
|
+
|
|
41
|
+
- **[必须修复]** — 安全漏洞、数据丢失风险、逻辑错误(不修不能合)
|
|
42
|
+
- **[建议修改]** — 性能问题、可维护性、缺少校验(本次或下次迭代修复)
|
|
43
|
+
- **[仅供参考]** — 命名优化、风格建议、替代方案(不改也行)
|
|
44
|
+
- **[问题]** — 不确定的地方,需要作者解释意图
|
|
45
|
+
|
|
46
|
+
### 审查评论模板
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
[必须修复] SQL 注入风险
|
|
50
|
+
|
|
51
|
+
第 42 行:用户输入直接拼接到 SQL 语句中。
|
|
52
|
+
|
|
53
|
+
原因:攻击者可以通过 name 参数注入 `'; DROP TABLE users; --`。
|
|
54
|
+
|
|
55
|
+
建议:使用参数化查询:
|
|
56
|
+
db.query('SELECT * FROM users WHERE name = $1', [name])
|
|
57
|
+
|
|
58
|
+
参考:https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 中英混排代码注释规范
|
|
62
|
+
|
|
63
|
+
### 何时用中文
|
|
64
|
+
|
|
65
|
+
- **业务逻辑说明** — 用中文解释业务背景和需求来源
|
|
66
|
+
- **复杂算法注释** — 用中文写思路,确保团队成员都能理解
|
|
67
|
+
- **TODO / FIXME** — 用中文描述待办事项,方便搜索和追踪
|
|
68
|
+
- **文档注释(内部项目)** — JSDoc / Javadoc 中的描述文字用中文
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
/**
|
|
72
|
+
* 计算用户的会员等级折扣
|
|
73
|
+
*
|
|
74
|
+
* 业务规则:
|
|
75
|
+
* - 普通会员 9.5 折
|
|
76
|
+
* - 银卡会员 9 折
|
|
77
|
+
* - 金卡会员 8.5 折
|
|
78
|
+
* - 钻石会员 8 折
|
|
79
|
+
*
|
|
80
|
+
* @param level - 会员等级(MemberLevel enum)
|
|
81
|
+
* @param amount - 原始金额(单位:分)
|
|
82
|
+
* @returns 折后金额(单位:分)
|
|
83
|
+
*/
|
|
84
|
+
function calculateDiscount(level: MemberLevel, amount: number): number {
|
|
85
|
+
// ...
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 何时用英文
|
|
90
|
+
|
|
91
|
+
- **变量名、函数名、类名** — 始终用英文命名,遵循团队命名规范
|
|
92
|
+
- **Git commit message** — 参考下方 commit 规范
|
|
93
|
+
- **开源项目注释** — 面向国际社区的项目,注释统一用英文
|
|
94
|
+
- **错误信息和日志** — 生产环境的 error message 用英文(避免编码问题)
|
|
95
|
+
- **API 接口文档** — 对外暴露的 API 用英文
|
|
96
|
+
|
|
97
|
+
### 混排格式要求
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
// 好:中英文之间加空格
|
|
101
|
+
// 使用 Redis 缓存来减少 MySQL 的查询压力
|
|
102
|
+
|
|
103
|
+
// 坏:中英文之间没有空格
|
|
104
|
+
// 使用Redis缓存来减少MySQL的查询压力
|
|
105
|
+
|
|
106
|
+
// 好:技术术语保留英文
|
|
107
|
+
// 这里用 debounce 防抖处理,避免频繁触发 API 请求
|
|
108
|
+
|
|
109
|
+
// 坏:强行翻译技术术语
|
|
110
|
+
// 这里用防抖动处理,避免频繁触发应用程序接口请求
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Commit Message 中英双语格式
|
|
114
|
+
|
|
115
|
+
### 推荐格式
|
|
116
|
+
|
|
117
|
+
团队内部项目使用中文 commit message,采用约定式提交(Conventional Commits)的中文版:
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
<类型>(<范围>): <简要描述>
|
|
121
|
+
|
|
122
|
+
<详细说明(可选)>
|
|
123
|
+
|
|
124
|
+
<关联信息(可选)>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 类型对照表
|
|
128
|
+
|
|
129
|
+
| 类型 | 含义 | 示例 |
|
|
130
|
+
|------|------|------|
|
|
131
|
+
| feat | 新功能 | feat(用户): 新增手机号登录功能 |
|
|
132
|
+
| fix | 修复 Bug | fix(支付): 修复微信支付回调重复处理的问题 |
|
|
133
|
+
| docs | 文档变更 | docs: 更新 API 接口文档 |
|
|
134
|
+
| style | 代码格式 | style: 统一缩进为 2 个空格 |
|
|
135
|
+
| refactor | 重构 | refactor(订单): 拆分订单服务,提取公共逻辑 |
|
|
136
|
+
| perf | 性能优化 | perf(列表): 虚拟滚动优化长列表渲染性能 |
|
|
137
|
+
| test | 测试 | test(auth): 补充登录模块单元测试 |
|
|
138
|
+
| chore | 构建/工具 | chore: 升级 Node.js 至 v20 |
|
|
139
|
+
|
|
140
|
+
### 示例
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
fix(支付): 修复支付宝异步回调签名校验失败的问题
|
|
144
|
+
|
|
145
|
+
原因:升级 SDK 后签名算法从 RSA 变为 RSA2,但回调校验仍使用旧算法。
|
|
146
|
+
方案:回调处理中同时兼容 RSA 和 RSA2 签名校验。
|
|
147
|
+
|
|
148
|
+
Closes #1234
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 面向国际社区的项目
|
|
152
|
+
|
|
153
|
+
如果项目面向国际社区或有外籍成员,commit message 用英文,PR 描述中可附加中文说明:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
fix(payment): fix Alipay async callback signature verification failure
|
|
157
|
+
|
|
158
|
+
The SDK upgrade changed the signature algorithm from RSA to RSA2,
|
|
159
|
+
but the callback handler still used the old algorithm.
|
|
160
|
+
|
|
161
|
+
Closes #1234
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 常见反模式与对策
|
|
165
|
+
|
|
166
|
+
### 反模式一:过度客气
|
|
167
|
+
|
|
168
|
+
**表现:** 所有评论都是"我觉得可能也许大概好像这里有个小问题"。
|
|
169
|
+
|
|
170
|
+
**后果:** 关键 bug 被隐藏在一堆委婉语里,作者根本不知道哪些必须改。
|
|
171
|
+
|
|
172
|
+
**对策:** 使用分级标注。[必须修复] 就是必须修复,语气可以温和,但级别必须准确。
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
# 坏:过度客气
|
|
176
|
+
不知道我理解得对不对,这里好像可能有一点点并发问题,不过也许我看错了...
|
|
177
|
+
|
|
178
|
+
# 好:温和但清晰
|
|
179
|
+
[必须修复] 并发安全问题
|
|
180
|
+
|
|
181
|
+
这里的 map 在多个 goroutine 中同时读写,会触发 panic。
|
|
182
|
+
建议加 sync.RWMutex,或者换成 sync.Map。
|
|
183
|
+
|
|
184
|
+
复现方式:加 -race flag 跑测试就能看到。
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### 反模式二:不敢给高级开发者提意见
|
|
188
|
+
|
|
189
|
+
**表现:** 高级开发者或 Leader 的代码直接 Approve,不仔细看。
|
|
190
|
+
|
|
191
|
+
**后果:** 代码质量双标,团队对 Code Review 失去信任。
|
|
192
|
+
|
|
193
|
+
**对策:** Code Review 对事不对人。可以换个表达方式:
|
|
194
|
+
|
|
195
|
+
```
|
|
196
|
+
# 提问式(适合给资深同事的反馈)
|
|
197
|
+
想请教一下,这里选择用递归而不是迭代,是出于什么考虑?
|
|
198
|
+
我在想如果递归深度超过 1000 层会不会有栈溢出的风险?
|
|
199
|
+
|
|
200
|
+
# 学习式
|
|
201
|
+
学到了一个新写法!不过有个小疑问——这里的类型断言在运行时不会做检查,
|
|
202
|
+
如果上游数据结构变了,这里会静默通过。是否考虑加个 runtime validation?
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 反模式三:审查变成风格之争
|
|
206
|
+
|
|
207
|
+
**表现:** 大量评论纠结于缩进、空格、花括号位置。
|
|
208
|
+
|
|
209
|
+
**后果:** 浪费时间,忽略真正的问题。
|
|
210
|
+
|
|
211
|
+
**对策:** 风格问题交给 ESLint / Prettier / gofmt 等工具自动处理。Code Review 聚焦逻辑、安全、性能。
|
|
212
|
+
|
|
213
|
+
### 反模式四:只写"LGTM"
|
|
214
|
+
|
|
215
|
+
**表现:** 随手一个 LGTM 就 Approve,没有实质性审查。
|
|
216
|
+
|
|
217
|
+
**后果:** Code Review 形同虚设,出了问题没人兜底。
|
|
218
|
+
|
|
219
|
+
**对策:** 即使代码质量很好,也要写出你关注了哪些方面:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
LGTM
|
|
223
|
+
|
|
224
|
+
审查了以下方面:
|
|
225
|
+
- 并发安全:锁的粒度合理
|
|
226
|
+
- 错误处理:所有外部调用都有 error handling
|
|
227
|
+
- 向下兼容:新增字段都有默认值,不影响老版本
|
|
228
|
+
|
|
229
|
+
一个小建议 [仅供参考]:第 78 行的变量名 `d` 可以改成 `duration`,更易读。
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## 审查流程建议
|
|
233
|
+
|
|
234
|
+
### 开始审查前
|
|
235
|
+
|
|
236
|
+
1. **先看 PR 描述**,理解改动的背景和目的
|
|
237
|
+
2. **看关联的 Issue 或需求文档**
|
|
238
|
+
3. **先整体浏览**,再逐文件细看
|
|
239
|
+
|
|
240
|
+
### 审查顺序
|
|
241
|
+
|
|
242
|
+
1. **架构层面** — 方案是否合理?有没有更好的方式?
|
|
243
|
+
2. **正确性** — 逻辑对不对?边界条件处理了吗?
|
|
244
|
+
3. **安全性** — 有没有注入、越权、信息泄露?
|
|
245
|
+
4. **性能** — 有没有 N+1 查询、内存泄漏、不必要的循环?
|
|
246
|
+
5. **可维护性** — 半年后能看懂吗?测试覆盖了吗?
|
|
247
|
+
6. **风格** — 只关注工具无法自动处理的部分
|
|
248
|
+
|
|
249
|
+
### 给出总结
|
|
250
|
+
|
|
251
|
+
审查结束后,给一段总结,包括:
|
|
252
|
+
- 整体评价(一句话)
|
|
253
|
+
- 值得学习的地方(先扬后抑)
|
|
254
|
+
- 主要问题列表(按优先级)
|
|
255
|
+
- 建议的修改方向
|
|
256
|
+
|
|
257
|
+
```
|
|
258
|
+
总结:整体实现思路清晰,支付回调的幂等处理很到位。
|
|
259
|
+
|
|
260
|
+
主要问题:
|
|
261
|
+
1. [必须修复] 并发写 map 的问题(2 处)
|
|
262
|
+
2. [建议修改] 缺少对空值的校验(3 处)
|
|
263
|
+
3. [仅供参考] 几个变量命名可以更语义化
|
|
264
|
+
|
|
265
|
+
建议先修复并发问题,校验的部分可以本次一起改或者拆到下个迭代。
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## 检查清单
|
|
269
|
+
|
|
270
|
+
在提交审查意见前,确认:
|
|
271
|
+
|
|
272
|
+
- [ ] 每条评论都标注了优先级
|
|
273
|
+
- [ ] [必须修复] 的问题都给出了具体的修复建议
|
|
274
|
+
- [ ] 没有因为面子而跳过关键问题
|
|
275
|
+
- [ ] 没有纠结于工具能自动处理的风格问题
|
|
276
|
+
- [ ] 对好的代码给予了肯定
|
|
277
|
+
- [ ] 给出了整体总结
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chinese-commit-conventions
|
|
3
|
+
description: 中文 Git 提交规范 — 适配国内团队的 commit message 规范和 changelog 自动化
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 中文 Git 提交规范
|
|
7
|
+
|
|
8
|
+
## 1. Conventional Commits 中文适配
|
|
9
|
+
|
|
10
|
+
基于 Conventional Commits 1.0.0 规范,针对中文团队的实际使用习惯进行适配。
|
|
11
|
+
|
|
12
|
+
### 类型(type)定义
|
|
13
|
+
|
|
14
|
+
| 类型 | 说明 | 示例场景 |
|
|
15
|
+
| ---------- | ---------------------------- | -------------------------- |
|
|
16
|
+
| `feat` | 新功能 | 添加用户注册模块 |
|
|
17
|
+
| `fix` | 修复缺陷 | 修复登录页白屏问题 |
|
|
18
|
+
| `docs` | 文档变更 | 更新 API 接口文档 |
|
|
19
|
+
| `style` | 代码格式(不影响逻辑) | 调整缩进、补充分号 |
|
|
20
|
+
| `refactor` | 重构(非新功能、非修复) | 拆分过长的服务类 |
|
|
21
|
+
| `perf` | 性能优化 | 优化首页列表查询速度 |
|
|
22
|
+
| `test` | 测试相关 | 补充用户模块单元测试 |
|
|
23
|
+
| `chore` | 构建/工具/依赖变更 | 升级 webpack 到 v5 |
|
|
24
|
+
| `ci` | 持续集成配置 | 修改 GitHub Actions 流程 |
|
|
25
|
+
| `revert` | 回滚提交 | 回滚 v2.1.0 的登录重构 |
|
|
26
|
+
|
|
27
|
+
### 原则
|
|
28
|
+
|
|
29
|
+
- type 保留英文关键字(工具链兼容性好)
|
|
30
|
+
- scope 和 description 使用中文
|
|
31
|
+
- body 使用中文完整描述
|
|
32
|
+
|
|
33
|
+
## 2. 中文 commit message 模板
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
<type>(<scope>): <subject>
|
|
37
|
+
|
|
38
|
+
<body>
|
|
39
|
+
|
|
40
|
+
<footer>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### 完整示例
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
feat(用户模块): 添加手机号一键登录功能
|
|
47
|
+
|
|
48
|
+
- 接入运营商一键登录 SDK
|
|
49
|
+
- 支持移动、联通、电信三网
|
|
50
|
+
- 登录失败自动降级到短信验证码
|
|
51
|
+
|
|
52
|
+
Closes #128
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
fix(订单): 修复并发下单导致库存超卖的问题
|
|
57
|
+
|
|
58
|
+
在高并发场景下,原有的库存扣减逻辑存在竞态条件。
|
|
59
|
+
改用 Redis 分布式锁 + 数据库乐观锁双重保障。
|
|
60
|
+
|
|
61
|
+
影响范围:订单服务、库存服务
|
|
62
|
+
测试确认:已通过 500 并发压测验证
|
|
63
|
+
|
|
64
|
+
Closes #256
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## 3. Subject 行规范
|
|
68
|
+
|
|
69
|
+
### 格式
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
<type>(<scope>): <description>
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 规则
|
|
76
|
+
|
|
77
|
+
- **type**: 必填,从上方类型表中选取
|
|
78
|
+
- **scope**: 选填,表示影响范围,使用中文模块名
|
|
79
|
+
- 示例:`用户模块`、`订单`、`支付`、`基础组件`
|
|
80
|
+
- **description**: 必填,中文简述,不超过 50 个字符
|
|
81
|
+
- 使用动宾短语:「添加 xxx」「修复 xxx」「优化 xxx」
|
|
82
|
+
- 不加句号结尾
|
|
83
|
+
- 不要写「修改了代码」这种无意义描述
|
|
84
|
+
|
|
85
|
+
### 好的示例
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
feat(权限): 添加基于 RBAC 的细粒度权限控制
|
|
89
|
+
fix(支付): 修复微信支付回调签名验证失败的问题
|
|
90
|
+
perf(列表页): 优化大数据量表格的虚拟滚动渲染
|
|
91
|
+
refactor(网关): 将单体网关拆分为独立微服务
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### 反面示例
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
# 以下写法应避免
|
|
98
|
+
fix: 修了一个 bug
|
|
99
|
+
feat: 更新代码
|
|
100
|
+
chore: 改了点东西
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 4. Body 编写规范
|
|
104
|
+
|
|
105
|
+
Body 用于详细说明本次变更的动机、方案和影响。
|
|
106
|
+
|
|
107
|
+
### 编写要点
|
|
108
|
+
|
|
109
|
+
- 说明**为什么**要做这个改动(背景/原因)
|
|
110
|
+
- 说明**怎么做**的(技术方案摘要)
|
|
111
|
+
- 说明**影响范围**(哪些模块、接口受影响)
|
|
112
|
+
- 每行不超过 72 个字符(中文约 36 个汉字)
|
|
113
|
+
- 正文与标题之间空一行
|
|
114
|
+
|
|
115
|
+
### Body 模板
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
<改动背景和原因>
|
|
119
|
+
|
|
120
|
+
技术方案:
|
|
121
|
+
- <方案要点 1>
|
|
122
|
+
- <方案要点 2>
|
|
123
|
+
|
|
124
|
+
影响范围:<受影响的模块或服务>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 5. Breaking Changes 标注
|
|
128
|
+
|
|
129
|
+
当提交包含不兼容变更时,必须在 footer 中标注。
|
|
130
|
+
|
|
131
|
+
### 格式一:footer 标注
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
feat(接口): 重构用户信息返回结构
|
|
135
|
+
|
|
136
|
+
将用户接口返回的扁平结构改为嵌套结构,前端需同步调整字段取值路径。
|
|
137
|
+
|
|
138
|
+
BREAKING CHANGE: /api/user/info 返回结构变更
|
|
139
|
+
- avatar 字段移入 profile 对象
|
|
140
|
+
- 移除已废弃的 nickname 字段,统一使用 displayName
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 格式二:type 后加感叹号
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
feat(接口)!: 重构用户信息返回结构
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### 团队约定
|
|
150
|
+
|
|
151
|
+
- 涉及数据库表结构变更 -> 必须标注 BREAKING CHANGE
|
|
152
|
+
- 涉及公共 API 参数/返回值变更 -> 必须标注
|
|
153
|
+
- 涉及配置文件格式变更 -> 必须标注
|
|
154
|
+
- 标注时须写明迁移方法或升级步骤
|
|
155
|
+
|
|
156
|
+
## 6. Issue 关联
|
|
157
|
+
|
|
158
|
+
### GitHub 格式
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
Closes #128
|
|
162
|
+
Refs #129, #130
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Gitee 格式
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
Closes #I5ABC1
|
|
169
|
+
相关需求: https://gitee.com/org/repo/issues/I5ABC1
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Coding 格式
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
关联 Coding 缺陷 #12345
|
|
176
|
+
fixed=project-2024/issues/678
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 通用写法
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
# footer 中关联多个平台
|
|
183
|
+
Closes #128
|
|
184
|
+
Jira: PROJ-456
|
|
185
|
+
禅道: #789
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## 7. Changelog 自动生成配置
|
|
189
|
+
|
|
190
|
+
### 安装 conventional-changelog
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
npm install -D conventional-changelog-cli conventional-changelog-conventionalcommits
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### package.json 脚本
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"scripts": {
|
|
201
|
+
"changelog": "conventional-changelog -p conventionalcommits -i CHANGELOG.md -s",
|
|
202
|
+
"changelog:all": "conventional-changelog -p conventionalcommits -i CHANGELOG.md -s -r 0",
|
|
203
|
+
"release": "standard-version"
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### .versionrc.js 中文配置
|
|
209
|
+
|
|
210
|
+
```javascript
|
|
211
|
+
module.exports = {
|
|
212
|
+
types: [
|
|
213
|
+
{ type: 'feat', section: '新功能' },
|
|
214
|
+
{ type: 'fix', section: '缺陷修复' },
|
|
215
|
+
{ type: 'perf', section: '性能优化' },
|
|
216
|
+
{ type: 'refactor', section: '代码重构' },
|
|
217
|
+
{ type: 'docs', section: '文档更新' },
|
|
218
|
+
{ type: 'test', section: '测试' },
|
|
219
|
+
{ type: 'chore', section: '构建/工具', hidden: true },
|
|
220
|
+
{ type: 'ci', section: '持续集成', hidden: true },
|
|
221
|
+
{ type: 'style', section: '代码格式', hidden: true }
|
|
222
|
+
],
|
|
223
|
+
commitUrlFormat: '{{host}}/{{owner}}/{{repository}}/commit/{{hash}}',
|
|
224
|
+
compareUrlFormat: '{{host}}/{{owner}}/{{repository}}/compare/{{previousTag}}...{{currentTag}}'
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## 8. commitlint 中文配置
|
|
229
|
+
|
|
230
|
+
### 安装
|
|
231
|
+
|
|
232
|
+
```bash
|
|
233
|
+
npm install -D @commitlint/cli @commitlint/config-conventional
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### commitlint.config.js
|
|
237
|
+
|
|
238
|
+
```javascript
|
|
239
|
+
module.exports = {
|
|
240
|
+
extends: ['@commitlint/config-conventional'],
|
|
241
|
+
rules: {
|
|
242
|
+
'type-enum': [2, 'always', [
|
|
243
|
+
'feat', 'fix', 'docs', 'style', 'refactor',
|
|
244
|
+
'perf', 'test', 'chore', 'ci', 'revert'
|
|
245
|
+
]],
|
|
246
|
+
'type-case': [2, 'always', 'lower-case'],
|
|
247
|
+
'type-empty': [2, 'never'],
|
|
248
|
+
'subject-empty': [2, 'never'],
|
|
249
|
+
'subject-max-length': [2, 'always', 100],
|
|
250
|
+
// 允许中文字符,关闭 subject-case 限制
|
|
251
|
+
'subject-case': [0],
|
|
252
|
+
// 关闭 header-max-length 或放宽(中文占宽较大)
|
|
253
|
+
'header-max-length': [2, 'always', 120],
|
|
254
|
+
'body-max-line-length': [1, 'always', 200],
|
|
255
|
+
'footer-max-line-length': [1, 'always', 200]
|
|
256
|
+
},
|
|
257
|
+
prompt: {
|
|
258
|
+
messages: {
|
|
259
|
+
type: '选择提交类型:',
|
|
260
|
+
scope: '输入影响范围(可选):',
|
|
261
|
+
subject: '填写简短描述:',
|
|
262
|
+
body: '填写详细描述(可选,使用 "|" 换行):',
|
|
263
|
+
breaking: '列出不兼容变更(可选):',
|
|
264
|
+
footer: '关联的 Issue(可选,例如 #123):',
|
|
265
|
+
confirmCommit: '确认提交以上信息?'
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## 9. husky + lint-staged 集成
|
|
272
|
+
|
|
273
|
+
### 安装与初始化
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
npm install -D husky lint-staged
|
|
277
|
+
npx husky init
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### 配置 commit-msg 钩子
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
# .husky/commit-msg
|
|
284
|
+
npx --no -- commitlint --edit "$1"
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### 配置 pre-commit 钩子
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
# .husky/pre-commit
|
|
291
|
+
npx lint-staged
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### lint-staged 配置(package.json)
|
|
295
|
+
|
|
296
|
+
```json
|
|
297
|
+
{
|
|
298
|
+
"lint-staged": {
|
|
299
|
+
"*.{js,ts,jsx,tsx,vue}": [
|
|
300
|
+
"eslint --fix",
|
|
301
|
+
"prettier --write"
|
|
302
|
+
],
|
|
303
|
+
"*.{css,scss,less}": [
|
|
304
|
+
"stylelint --fix",
|
|
305
|
+
"prettier --write"
|
|
306
|
+
],
|
|
307
|
+
"*.md": [
|
|
308
|
+
"prettier --write"
|
|
309
|
+
]
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### 交互式提交(可选)
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
npm install -D commitizen cz-conventional-changelog
|
|
318
|
+
|
|
319
|
+
# package.json 中添加
|
|
320
|
+
{
|
|
321
|
+
"config": {
|
|
322
|
+
"commitizen": {
|
|
323
|
+
"path": "cz-conventional-changelog"
|
|
324
|
+
}
|
|
325
|
+
},
|
|
326
|
+
"scripts": {
|
|
327
|
+
"commit": "cz"
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
运行 `npm run commit` 即可进入交互式提交引导。
|
|
333
|
+
|
|
334
|
+
## 10. 团队规范检查清单
|
|
335
|
+
|
|
336
|
+
### 提交前自查
|
|
337
|
+
|
|
338
|
+
- [ ] type 是否正确选择(feat/fix/docs/...)
|
|
339
|
+
- [ ] scope 是否准确描述了影响模块
|
|
340
|
+
- [ ] subject 是否为动宾短语且不超过 50 字符
|
|
341
|
+
- [ ] subject 末尾是否去掉了句号
|
|
342
|
+
- [ ] body 是否说明了变更原因和方案
|
|
343
|
+
- [ ] 不兼容变更是否标注了 BREAKING CHANGE
|
|
344
|
+
- [ ] 相关 Issue 是否已关联
|
|
345
|
+
- [ ] 一次提交是否只做了一件事(原子性)
|
|
346
|
+
|
|
347
|
+
### 团队落地步骤
|
|
348
|
+
|
|
349
|
+
1. **工具链配置**:按上述步骤配置 commitlint + husky,让规范可执行
|
|
350
|
+
2. **模板共享**:将 `.commitlintrc`、`.husky/` 等配置提交到仓库
|
|
351
|
+
3. **团队培训**:组织 15 分钟的规范说明会,演示工具使用
|
|
352
|
+
4. **Code Review**:Review 时关注 commit message 质量
|
|
353
|
+
5. **持续迭代**:每季度回顾规范执行情况,根据团队反馈调整
|
|
354
|
+
|
|
355
|
+
### 常见问题
|
|
356
|
+
|
|
357
|
+
**Q: 中英文混排时空格怎么处理?**
|
|
358
|
+
A: 中文与英文/数字之间加一个空格,如「添加 Redis 缓存」。
|
|
359
|
+
|
|
360
|
+
**Q: scope 用中文还是英文?**
|
|
361
|
+
A: 团队内统一即可。推荐中文(可读性好),但需在 commitlint 中关闭 scope-case 检查。
|
|
362
|
+
|
|
363
|
+
**Q: 多人协作时如何保证规范一致?**
|
|
364
|
+
A: 靠工具而非靠自觉。配置好 husky + commitlint,不符合规范的提交会被拦截。
|