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,159 @@
|
|
|
1
|
+
# Diagnose — 严格诊断循环
|
|
2
|
+
|
|
3
|
+
> 使用此 skill 时:遇到 Bug、错误、异常行为,且原因不明确时。
|
|
4
|
+
|
|
5
|
+
## 诊断循环
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌──────────────────────────────────────────────────────────┐
|
|
9
|
+
│ ① 观察(Observe) 收集所有症状,不跳结论 │
|
|
10
|
+
│ ② 假设(Hypothesize) 提出一个可验证的根因假设 │
|
|
11
|
+
│ ③ 验证(Verify) 设计最小实验验证/证伪假设 │
|
|
12
|
+
│ ④ 修复(Fix) 确定根因后实施修复 │
|
|
13
|
+
│ ⑤ 确认(Confirm) 验证修复有效且不引入回归 │
|
|
14
|
+
│ ↺ 未解决 → 回到 ① │
|
|
15
|
+
└──────────────────────────────────────────────────────────┘
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## ① 观察 — 收集症状
|
|
19
|
+
|
|
20
|
+
只收集事实,不跳入结论。
|
|
21
|
+
|
|
22
|
+
### 必须收集的信息
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
【症状】
|
|
26
|
+
- 实际行为是什么?
|
|
27
|
+
- 期望行为是什么?
|
|
28
|
+
- 差异在什么条件下出现?
|
|
29
|
+
- 是稳定的还是偶发的?
|
|
30
|
+
|
|
31
|
+
【环境】
|
|
32
|
+
- 什么系统/版本?
|
|
33
|
+
- 什么输入?
|
|
34
|
+
- 什么配置?
|
|
35
|
+
- 什么数据量?
|
|
36
|
+
|
|
37
|
+
【复现】
|
|
38
|
+
- 稳定可复现?
|
|
39
|
+
- 复现步骤是否最少?
|
|
40
|
+
- 在什么环境下可复现?
|
|
41
|
+
|
|
42
|
+
【最近变更】
|
|
43
|
+
- 问题从什么时候开始?
|
|
44
|
+
- 之前改了什么?
|
|
45
|
+
- 关联的部署/发布?
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 禁止以下预判
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
❌ "这个应该是 XXX 问题"
|
|
52
|
+
❌ "上次也是这个原因"
|
|
53
|
+
❌ "不用看日志就知道"
|
|
54
|
+
❌ "肯定是 XXX 的问题"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## ② 假设 — 提出根因假设
|
|
58
|
+
|
|
59
|
+
### 假设模板
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
如果 [原因] → 那么 [预期现象]
|
|
63
|
+
|
|
64
|
+
如果数据库连接池满了 → 那么所有数据库操作都会超时
|
|
65
|
+
如果缓存未失效 → 那么返回的应该是旧数据
|
|
66
|
+
如果权限检查顺序错误 → 那么登出用户也能访问
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 假设质量检查
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
[ ] 假设可验证(有明确的预期现象)
|
|
73
|
+
[ ] 假设可证伪(可以证明是错的)
|
|
74
|
+
[ ] 假设符合已有事实(不矛盾)
|
|
75
|
+
[ ] 只包含一个原因(而非多个可能原因混合)
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## ③ 验证 — 设计最小实验
|
|
79
|
+
|
|
80
|
+
### 实验设计原则
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
每次只验证一个假设。
|
|
84
|
+
|
|
85
|
+
最小实验 = 产生明确答案的最少工作量。
|
|
86
|
+
|
|
87
|
+
好实验:
|
|
88
|
+
- 执行时间 < 30 秒(或极短)
|
|
89
|
+
- 结果明确(是/否,或具体数值)
|
|
90
|
+
- 不改变系统状态(只读)
|
|
91
|
+
- 可重复(同一输入同一结果)
|
|
92
|
+
|
|
93
|
+
坏实验:
|
|
94
|
+
- 修改多处代码然后看效果
|
|
95
|
+
- 需要 10 分钟才能看到结果
|
|
96
|
+
- 结果是模糊的("好像好了")
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### 典型的验证方法
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
日志验证:
|
|
103
|
+
- 添加特定日志 → 重现场景 → 检查输出
|
|
104
|
+
- 注意生产环境不要添加 debug 级别日志
|
|
105
|
+
|
|
106
|
+
单元测试:
|
|
107
|
+
- 对可疑函数写测试 → 断言预期行为
|
|
108
|
+
|
|
109
|
+
隔离验证:
|
|
110
|
+
- 创建最小复现(去掉无关代码)
|
|
111
|
+
- 在独立环境中测试假设
|
|
112
|
+
|
|
113
|
+
二分法:
|
|
114
|
+
- 注释掉一半代码 → 看问题是否还在
|
|
115
|
+
- 重复直到定位到具体行
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## ④ 修复 — 实施修复
|
|
119
|
+
|
|
120
|
+
```text
|
|
121
|
+
确定根因后,只做最少修改。
|
|
122
|
+
|
|
123
|
+
修复模板:
|
|
124
|
+
1. 理解为什么要这样写(原作者的意图是什么?)
|
|
125
|
+
2. 修改最小范围的代码
|
|
126
|
+
3. 添加测试覆盖这个边界情况
|
|
127
|
+
4. 确保现有测试仍然通过
|
|
128
|
+
|
|
129
|
+
如果修复复杂(> 50 行):
|
|
130
|
+
- 拆分为小步骤
|
|
131
|
+
- 每步验证
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## ⑤ 确认 — 验证修复
|
|
135
|
+
|
|
136
|
+
```text
|
|
137
|
+
验证清单:
|
|
138
|
+
[ ] 原问题不再复现
|
|
139
|
+
[ ] 所有已有测试通过
|
|
140
|
+
[ ] 新增了防止回归的测试
|
|
141
|
+
[ ] 相邻功能不受影响
|
|
142
|
+
[ ] 边界情况已测试
|
|
143
|
+
|
|
144
|
+
如果验证失败:
|
|
145
|
+
- 回到 ①,重新观察
|
|
146
|
+
- 标记原假设为证伪
|
|
147
|
+
- 提出新假设
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## 反模式
|
|
151
|
+
|
|
152
|
+
| 反模式 | 问题 | 正确做法 |
|
|
153
|
+
|--------|------|---------|
|
|
154
|
+
| 无假设直接改 | 盲目尝试,浪费时间 | 先假设再实验 |
|
|
155
|
+
| 一次改多处 | 不知道哪处解决了问题 | 一次只改一处 |
|
|
156
|
+
| 确认偏差 | 只找支持假设的证据 | 主动寻找证伪证据 |
|
|
157
|
+
| 忽略简单原因 | 一上来就怀疑复杂原因 | 先排查简单可能(拼写、配置、版本) |
|
|
158
|
+
| 修复后不验证 | 以为好了但实际上没 | 严格确认 |
|
|
159
|
+
| 不写回归测试 | 下次同类问题再出现 | 每个修复加测试 |
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# Grill with Docs — 基于文档的对抗式审查
|
|
2
|
+
|
|
3
|
+
> 使用此 skill 时:在实现复杂功能之前、在 PR 合并之前、在不确定方案是否正确时。
|
|
4
|
+
|
|
5
|
+
## 什么是"对抗式审查"
|
|
6
|
+
|
|
7
|
+
通过严格的文档审查来挑战方案中的假设、模糊之处和遗漏。核心方法是:**AI 扮演"吹毛求疵的审查者",用文档中的每一条要求来检查方案是否满足**。
|
|
8
|
+
|
|
9
|
+
## 审查流程
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
┌──────────────────────────────────────────────────────────┐
|
|
13
|
+
│ ① 加载文档 收集所有相关规格文档 │
|
|
14
|
+
│ ② 提取要求 从文档中提取出每条具体需求 │
|
|
15
|
+
│ ③ 对照检查 逐条对照方案是否满足需求 │
|
|
16
|
+
│ ④ 发现漏洞 标记不满足、模糊、矛盾之处 │
|
|
17
|
+
│ ⑤ 修复方案 修正方案直到满足所有文档要求 │
|
|
18
|
+
└──────────────────────────────────────────────────────────┘
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## ① 加载文档
|
|
22
|
+
|
|
23
|
+
收集所有相关文档:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
- PRD / 功能规格文档
|
|
27
|
+
- API 设计文档
|
|
28
|
+
- 数据库 Schema 文档
|
|
29
|
+
- 安全规范文档
|
|
30
|
+
- UI/UX 设计稿或线框图
|
|
31
|
+
- 相关 Issue 和讨论
|
|
32
|
+
- 上游/下游模块的接口文档
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## ② 提取要求
|
|
36
|
+
|
|
37
|
+
从文档中提取每一条具体需求,分类记录:
|
|
38
|
+
|
|
39
|
+
### 分类
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
【功能需求(F)】
|
|
43
|
+
文档中明确要求的功能点
|
|
44
|
+
例:"用户可以重置密码"
|
|
45
|
+
|
|
46
|
+
【非功能需求(NF)】
|
|
47
|
+
性能、安全、可用性、兼容性
|
|
48
|
+
例:"页面加载时间 < 2 秒"
|
|
49
|
+
|
|
50
|
+
【约束条件(C)】
|
|
51
|
+
技术选型、架构限制、团队规范
|
|
52
|
+
例:"必须使用 XXX 框架"
|
|
53
|
+
|
|
54
|
+
【边界条件(B)】
|
|
55
|
+
错误路径、极限情况、异常处理
|
|
56
|
+
例:"当数据库不可用时显示降级页面"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 提取示例
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
PRD 原文:
|
|
63
|
+
"用户可以通过邮箱或手机号注册,注册后需要验证邮箱或手机。
|
|
64
|
+
如果用户使用邮箱注册,需要发送验证邮件;如果使用手机号注册,需要发送短信验证码。
|
|
65
|
+
验证成功后用户才能登录。"
|
|
66
|
+
|
|
67
|
+
提取为:
|
|
68
|
+
[F-1] 用户可以用邮箱注册
|
|
69
|
+
[F-2] 用户可以用手机号注册
|
|
70
|
+
[F-3] 邮箱注册需要发送验证邮件
|
|
71
|
+
[F-4] 手机注册需要发送短信验证码
|
|
72
|
+
[F-5] 用户验证成功后才能登录
|
|
73
|
+
[B-1] 如果邮件发送失败怎么办?(未明确)
|
|
74
|
+
[B-2] 如果短信发送失败怎么办?(未明确)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## ③ 对照检查
|
|
78
|
+
|
|
79
|
+
| 要求 | 方案覆盖 | 状态 |
|
|
80
|
+
|------|---------|------|
|
|
81
|
+
| F-1: 邮箱注册 | UserController.register(email) 接收邮箱参数 | ✅ |
|
|
82
|
+
| F-2: 手机注册 | UserController.register(phone) 接收手机参数 | ✅ |
|
|
83
|
+
| F-3: 发送验证邮件 | 注册后调用 EmailService.sendVerification | ✅ |
|
|
84
|
+
| F-4: 发送短信验证码 | 注册后调用 SMSService.sendCode | ✅ |
|
|
85
|
+
| F-5: 验证后才能登录 | LoginGuard 检查用户 verified 状态 | ✅ |
|
|
86
|
+
| B-1: 邮件发送失败 | 方案中未提及 | ❌ |
|
|
87
|
+
| B-2: 短信发送失败 | 方案中未提及 | ❌ |
|
|
88
|
+
|
|
89
|
+
## ④ 发现漏洞
|
|
90
|
+
|
|
91
|
+
### 常见漏洞类型
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
【遗漏】
|
|
95
|
+
文档中有的要求,方案中没有
|
|
96
|
+
|
|
97
|
+
【模糊】
|
|
98
|
+
方案使用了模糊的表述("合适的"、"合理的"、"按需")
|
|
99
|
+
|
|
100
|
+
【矛盾】
|
|
101
|
+
方案与文档冲突、不同文档之间冲突
|
|
102
|
+
|
|
103
|
+
【未定义】
|
|
104
|
+
关键术语没有定义("及时"、"大量"、"异常")
|
|
105
|
+
|
|
106
|
+
【假设】
|
|
107
|
+
方案基于未经验证的假设("用户不会同时操作")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 追问模板
|
|
111
|
+
|
|
112
|
+
```text
|
|
113
|
+
关于遗漏:
|
|
114
|
+
"文档要求 X,但方案中没看到对应的实现。怎么处理的?"
|
|
115
|
+
|
|
116
|
+
关于模糊:
|
|
117
|
+
"这里说'合适的错误处理',具体是什么?是重试、降级还是报错?"
|
|
118
|
+
|
|
119
|
+
关于矛盾:
|
|
120
|
+
"文档 A 说 X,方案这里用了 ~X。哪个是对的?"
|
|
121
|
+
|
|
122
|
+
关于未定义:
|
|
123
|
+
"'及时通知用户'——具体是多长时间?"
|
|
124
|
+
|
|
125
|
+
关于假设:
|
|
126
|
+
"方案假设了 X,如果 X 不成立会怎样?"
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## ⑤ 修复方案
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
对每个发现的漏洞,决定处理方式:
|
|
133
|
+
|
|
134
|
+
修复:补充缺失的实现、明确模糊的表述、解决矛盾
|
|
135
|
+
搁置:确认不是问题,记录理由("这个场景不会发生因为……")
|
|
136
|
+
记录:标记为已知限制,后续版本处理
|
|
137
|
+
|
|
138
|
+
修复核对清单:
|
|
139
|
+
[ ] 所有 F(功能需求)已覆盖
|
|
140
|
+
[ ] 所有 NF(非功能需求)已覆盖
|
|
141
|
+
[ ] 所有 C(约束条件)已满足
|
|
142
|
+
[ ] 所有 B(边界条件)已处理
|
|
143
|
+
[ ] 文档中没有模糊的术语
|
|
144
|
+
[ ] 方案中没有隐藏的假设
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## 反模式
|
|
148
|
+
|
|
149
|
+
| 反模式 | 问题 | 正确做法 |
|
|
150
|
+
|--------|------|---------|
|
|
151
|
+
| 只检查功能需求 | 遗漏安全和性能要求 | 全部类别都检查 |
|
|
152
|
+
| 对自己方案过于宽容 | 跳过对自己不利的检查 | 假设方案有问题,努力去找 |
|
|
153
|
+
| 忘记检查矛盾 | 方案内部不自洽 | 检查方案自身的一致性 |
|
|
154
|
+
| 不更新文档 | 方案和文档不一致 | 改方案的同时更新文档 |
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Improve Codebase Architecture — 代码架构优化
|
|
2
|
+
|
|
3
|
+
> 使用此 skill 时:代码库变得难以修改、每次改东西都影响多个模块、新需求难以添加时。
|
|
4
|
+
|
|
5
|
+
## 核心理念
|
|
6
|
+
|
|
7
|
+
使用两个概念分析架构健康度:
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
【Depth(深度)】— 一个模块的职责有多集中
|
|
11
|
+
浅(Shallow) → 模块做了太多不同的事,没有清晰的抽象
|
|
12
|
+
深(Deep) → 模块封装了复杂逻辑,对外暴露简单接口
|
|
13
|
+
|
|
14
|
+
目标:模块深而窄(内部复杂但接口简单)
|
|
15
|
+
|
|
16
|
+
【Seam(接缝)】— 在不修改代码的情况下改变行为的地方
|
|
17
|
+
好的接缝 → 可以通过配置/注入/参数改变行为
|
|
18
|
+
坏的接缝 → 必须修改代码才能改变行为
|
|
19
|
+
|
|
20
|
+
目标:关键变化点都有清晰的接缝
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 判断方法
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
深度检测:
|
|
27
|
+
问:这个模块的接口有几个方法?
|
|
28
|
+
问:用一个句子能说清这个模块的职责吗?
|
|
29
|
+
问:这个模块隐藏了多少复杂性?
|
|
30
|
+
|
|
31
|
+
如果:
|
|
32
|
+
- 接口方法 > 10 → 可能太浅
|
|
33
|
+
- 一句话说不清职责 → 可能太浅
|
|
34
|
+
- 调用者需要了解实现细节 → 可能太浅
|
|
35
|
+
|
|
36
|
+
接缝检测:
|
|
37
|
+
问:要改变这个行为,需要修改什么文件?
|
|
38
|
+
问:想用 mock 替换这个依赖,需要改代码吗?
|
|
39
|
+
问:添加同类功能要改几个地方?
|
|
40
|
+
|
|
41
|
+
如果:
|
|
42
|
+
- 改行为必须改具体实现文件 → 没有接缝
|
|
43
|
+
- 难以 mock → 没有接缝
|
|
44
|
+
- 加同类功能要改 N 个文件(N > 1)→ 没有接缝
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 重构优先级矩阵
|
|
48
|
+
|
|
49
|
+
| 对业务影响 | 架构问题严重 | 架构问题轻微 |
|
|
50
|
+
|-----------|------------|------------|
|
|
51
|
+
| **变更频繁** | **立即重构(P0)** | **计划重构** |
|
|
52
|
+
| **变更稀少** | 监控,等变更时再重构 | 忽略 |
|
|
53
|
+
|
|
54
|
+
### 优先级说明
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
P0 — 立即重构
|
|
58
|
+
症状:
|
|
59
|
+
- 每次改这个功能都很痛苦
|
|
60
|
+
- 频繁出现 Bug
|
|
61
|
+
- 修改一处需要同步改多处
|
|
62
|
+
|
|
63
|
+
做法:
|
|
64
|
+
- 提取清晰抽象
|
|
65
|
+
- 建立接缝
|
|
66
|
+
- 写测试固定行为
|
|
67
|
+
|
|
68
|
+
P1 — 计划重构
|
|
69
|
+
症状:
|
|
70
|
+
- 代码难以理解但暂时不改
|
|
71
|
+
- 测试写起来费劲
|
|
72
|
+
|
|
73
|
+
做法:
|
|
74
|
+
- 在 todolist 中加入重构任务
|
|
75
|
+
- 等有相关需求时顺便重构
|
|
76
|
+
|
|
77
|
+
P2 — 监控
|
|
78
|
+
症状:
|
|
79
|
+
- 代码不够理想但很少改
|
|
80
|
+
- 没有实际的痛苦
|
|
81
|
+
|
|
82
|
+
做法:
|
|
83
|
+
- 不做主动重构
|
|
84
|
+
- 下次改时评估是否需要重构
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## 常见架构问题及修复
|
|
88
|
+
|
|
89
|
+
### 上帝对象(God Object)
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
症状:
|
|
93
|
+
- 一个模块/类/文件 > 800 行
|
|
94
|
+
- 一个模块做了多件事
|
|
95
|
+
- 团队所有人都在改同一个模块
|
|
96
|
+
|
|
97
|
+
修复:
|
|
98
|
+
1. 识别出独立的职责
|
|
99
|
+
2. 逐个提取为新模块
|
|
100
|
+
3. 原模块只做编排
|
|
101
|
+
4. 每个新模块有自己的测试
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 循环依赖
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
症状:
|
|
108
|
+
- A → B → A (直接或间接)
|
|
109
|
+
- 初始化时需要特殊顺序
|
|
110
|
+
- 修改 A 导致 B 异常
|
|
111
|
+
|
|
112
|
+
修复:
|
|
113
|
+
1. 提取共用的部分为第三个模块
|
|
114
|
+
2. 或使用依赖倒置(接口定义在调用方)
|
|
115
|
+
3. 或引入事件机制解耦
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 隐式依赖
|
|
119
|
+
|
|
120
|
+
```text
|
|
121
|
+
症状:
|
|
122
|
+
- 需要按特定顺序调用方法
|
|
123
|
+
- 依赖全局/单例状态
|
|
124
|
+
- 构造函数做了大量初始化
|
|
125
|
+
|
|
126
|
+
修复:
|
|
127
|
+
1. 显式参数化依赖
|
|
128
|
+
2. 依赖注入(构造函数参数)
|
|
129
|
+
3. 消除隐式的"必须按顺序调用"的约束
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 散弹式修改(Shotgun Surgery)
|
|
133
|
+
|
|
134
|
+
```text
|
|
135
|
+
症状:
|
|
136
|
+
- 改一个需求需要改 N 个文件(N > 3)
|
|
137
|
+
- 改完后总有一两个文件忘记改
|
|
138
|
+
|
|
139
|
+
修复:
|
|
140
|
+
1. 识别变化的原因
|
|
141
|
+
2. 使用策略模式、钩子或配置集中变化点
|
|
142
|
+
3. 新加同类功能不用改已有代码(开闭原则)
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 优化流程
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
1. 识别痛点
|
|
149
|
+
- 哪些模块改起来最痛苦?
|
|
150
|
+
- 团队抱怨最多的是什么?
|
|
151
|
+
- 测试最难写的是什么?
|
|
152
|
+
|
|
153
|
+
2. 分析根因
|
|
154
|
+
- 使用 Depth/Seam 分析
|
|
155
|
+
- 识别违反了什么原则
|
|
156
|
+
|
|
157
|
+
3. 制定方案
|
|
158
|
+
- 提取接口
|
|
159
|
+
- 拆分职责
|
|
160
|
+
- 集中变化点
|
|
161
|
+
- 消除隐式依赖
|
|
162
|
+
|
|
163
|
+
4. 分步实施
|
|
164
|
+
- 先加测试(固定当前行为)
|
|
165
|
+
- 小步重构(每次只提取一个职责)
|
|
166
|
+
- 每个步骤都保持可运行
|
|
167
|
+
|
|
168
|
+
5. 验证
|
|
169
|
+
- 所有测试通过
|
|
170
|
+
- 行为不变
|
|
171
|
+
- 新需求实现起来更顺畅
|
|
172
|
+
```
|