specops 0.2.5 → 0.3.2
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/.opencode/agent/specops-codebase-mapper.md +764 -0
- package/.opencode/agent/specops-debugger.md +1246 -0
- package/.opencode/agent/specops-executor.md +475 -0
- package/.opencode/agent/specops-integration-checker.md +443 -0
- package/.opencode/agent/specops-phase-researcher.md +547 -0
- package/.opencode/agent/specops-plan-checker.md +690 -0
- package/.opencode/agent/specops-planner.md +581 -0
- package/.opencode/agent/specops-project-researcher.md +354 -0
- package/.opencode/agent/specops-research-synthesizer.md +242 -0
- package/.opencode/agent/specops-roadmapper.md +642 -0
- package/.opencode/agent/specops-work-verifier.md +573 -0
- package/.opencode/references/checkpoints.md +776 -0
- package/.opencode/references/continuation-format.md +249 -0
- package/.opencode/references/decimal-phase-calculation.md +65 -0
- package/.opencode/references/git-integration.md +248 -0
- package/.opencode/references/git-planning-commit.md +38 -0
- package/.opencode/references/model-profile-resolution.md +34 -0
- package/.opencode/references/model-profiles.md +92 -0
- package/.opencode/references/phase-argument-parsing.md +61 -0
- package/.opencode/references/planning-config.md +196 -0
- package/.opencode/references/questioning.md +145 -0
- package/.opencode/references/tdd.md +263 -0
- package/.opencode/references/ui-brand.md +160 -0
- package/.opencode/references/verification-patterns.md +612 -0
- package/.opencode/templates/DEBUG.md +164 -0
- package/.opencode/templates/UAT.md +180 -0
- package/.opencode/templates/VALIDATION.md +76 -0
- package/.opencode/templates/codebase/architecture.md +255 -0
- package/.opencode/templates/codebase/concerns.md +310 -0
- package/.opencode/templates/codebase/conventions.md +307 -0
- package/.opencode/templates/codebase/integrations.md +280 -0
- package/.opencode/templates/codebase/stack.md +186 -0
- package/.opencode/templates/codebase/structure.md +285 -0
- package/.opencode/templates/codebase/testing.md +480 -0
- package/.opencode/templates/context.md +221 -0
- package/.opencode/templates/continue-here.md +78 -0
- package/.opencode/templates/debug-subagent-prompt.md +91 -0
- package/.opencode/templates/discovery.md +147 -0
- package/.opencode/templates/milestone-archive.md +123 -0
- package/.opencode/templates/milestone.md +115 -0
- package/.opencode/templates/phase-prompt.md +333 -0
- package/.opencode/templates/planner-subagent-prompt.md +117 -0
- package/.opencode/templates/project.md +184 -0
- package/.opencode/templates/requirements.md +130 -0
- package/.opencode/templates/research-project/ARCHITECTURE.md +204 -0
- package/.opencode/templates/research-project/FEATURES.md +147 -0
- package/.opencode/templates/research-project/PITFALLS.md +200 -0
- package/.opencode/templates/research-project/STACK.md +120 -0
- package/.opencode/templates/research-project/SUMMARY.md +170 -0
- package/.opencode/templates/research.md +278 -0
- package/.opencode/templates/retrospective.md +54 -0
- package/.opencode/templates/roadmap.md +202 -0
- package/.opencode/templates/state.md +176 -0
- package/.opencode/templates/summary-complex.md +59 -0
- package/.opencode/templates/summary-minimal.md +41 -0
- package/.opencode/templates/summary-standard.md +48 -0
- package/.opencode/templates/summary.md +248 -0
- package/.opencode/templates/user-setup.md +311 -0
- package/.opencode/templates/verification-report.md +322 -0
- package/.opencode/workflows/add-phase.md +111 -0
- package/.opencode/workflows/add-tests.md +350 -0
- package/.opencode/workflows/add-todo.md +157 -0
- package/.opencode/workflows/audit-milestone.md +297 -0
- package/.opencode/workflows/check-todos.md +176 -0
- package/.opencode/workflows/cleanup.md +152 -0
- package/.opencode/workflows/complete-milestone.md +763 -0
- package/.opencode/workflows/diagnose-issues.md +219 -0
- package/.opencode/workflows/discovery-phase.md +288 -0
- package/.opencode/workflows/discuss-phase.md +542 -0
- package/.opencode/workflows/execute-phase.md +449 -0
- package/.opencode/workflows/execute-plan.md +447 -0
- package/.opencode/workflows/health.md +156 -0
- package/.opencode/workflows/help.md +489 -0
- package/.opencode/workflows/insert-phase.md +129 -0
- package/.opencode/workflows/list-phase-assumptions.md +178 -0
- package/.opencode/workflows/map-codebase.md +315 -0
- package/.opencode/workflows/new-milestone.md +382 -0
- package/.opencode/workflows/new-project.md +1116 -0
- package/.opencode/workflows/pause-work.md +122 -0
- package/.opencode/workflows/plan-milestone-gaps.md +274 -0
- package/.opencode/workflows/plan-phase.md +569 -0
- package/.opencode/workflows/progress.md +381 -0
- package/.opencode/workflows/quick.md +453 -0
- package/.opencode/workflows/remove-phase.md +154 -0
- package/.opencode/workflows/research-phase.md +73 -0
- package/.opencode/workflows/resume-project.md +304 -0
- package/.opencode/workflows/set-profile.md +80 -0
- package/.opencode/workflows/settings.md +213 -0
- package/.opencode/workflows/transition.md +544 -0
- package/.opencode/workflows/update.md +219 -0
- package/.opencode/workflows/verify-phase.md +242 -0
- package/.opencode/workflows/verify-work.md +569 -0
- package/commands/specops/add-phase.md +43 -0
- package/commands/specops/add-tests.md +41 -0
- package/commands/specops/add-todo.md +47 -0
- package/commands/specops/audit-milestone.md +36 -0
- package/commands/specops/check-todos.md +45 -0
- package/commands/specops/cleanup.md +18 -0
- package/commands/specops/complete-milestone.md +136 -0
- package/commands/specops/debug.md +167 -0
- package/commands/specops/discuss-phase.md +83 -0
- package/commands/specops/execute-phase.md +41 -0
- package/commands/specops/health.md +22 -0
- package/commands/specops/help.md +22 -0
- package/commands/specops/insert-phase.md +32 -0
- package/commands/specops/join-discord.md +18 -0
- package/commands/specops/list-phase-assumptions.md +46 -0
- package/commands/specops/map-codebase.md +71 -0
- package/commands/specops/new-milestone.md +44 -0
- package/commands/specops/new-project.md +42 -0
- package/commands/specops/pause-work.md +38 -0
- package/commands/specops/plan-milestone-gaps.md +34 -0
- package/commands/specops/plan-phase.md +45 -0
- package/commands/specops/progress.md +24 -0
- package/commands/specops/quick.md +41 -0
- package/commands/specops/reapply-patches.md +111 -0
- package/commands/specops/remove-phase.md +31 -0
- package/commands/specops/research-phase.md +189 -0
- package/commands/specops/resume-work.md +40 -0
- package/commands/specops/set-profile.md +34 -0
- package/commands/specops/settings.md +36 -0
- package/commands/specops/update.md +37 -0
- package/commands/specops/verify-work.md +38 -0
- package/dist/__integration__/fixtures/generator.d.ts +4 -0
- package/dist/__integration__/fixtures/generator.js +1 -0
- package/dist/__integration__/mocks/server.d.ts +7 -0
- package/dist/__integration__/mocks/server.js +1 -0
- package/dist/__integration__/setup.d.ts +6 -0
- package/dist/__integration__/setup.js +1 -0
- package/dist/acceptance/lazyDetector.js +1 -1
- package/dist/acceptance/reporter.js +1 -1
- package/dist/acceptance/runner.js +1 -1
- package/dist/cli.js +1 -1
- package/dist/context/index.js +1 -1
- package/dist/context/promptTemplate.js +1 -1
- package/dist/context/techContextLoader.js +1 -1
- package/dist/engine.d.ts +1 -0
- package/dist/engine.js +1 -1
- package/dist/evolution/distiller.js +1 -1
- package/dist/evolution/index.js +1 -1
- package/dist/evolution/memoryGraph.js +1 -1
- package/dist/evolution/selector.js +1 -1
- package/dist/evolution/signals.js +1 -1
- package/dist/evolution/solidify.js +1 -1
- package/dist/evolution/store.js +1 -1
- package/dist/evolution/types.js +1 -1
- package/dist/init.d.ts +4 -3
- package/dist/init.js +1 -1
- package/dist/machines/agentMachine.js +1 -1
- package/dist/machines/supervisorMachine.js +1 -1
- package/dist/persistence/schema.js +1 -1
- package/dist/persistence/stateFile.js +1 -1
- package/dist/plugin-engine.js +1 -1
- package/dist/plugin.js +1 -1
- package/dist/requirement-analysis/analyzers/repository-parser.d.ts +121 -0
- package/dist/requirement-analysis/analyzers/repository-parser.js +1 -0
- package/dist/requirement-analysis/generators/prd-generator.d.ts +90 -0
- package/dist/requirement-analysis/generators/prd-generator.js +1 -0
- package/dist/requirement-analysis/integrations/v1-integration.d.ts +73 -0
- package/dist/requirement-analysis/integrations/v1-integration.js +1 -0
- package/dist/requirement-analysis/tools/analyze-requirements.js +1 -0
- package/dist/requirement-analysis/types/analysis-result.d.ts +326 -0
- package/dist/requirement-analysis/types/analysis-result.js +1 -0
- package/dist/requirement-analysis/types/feature-mapping.d.ts +294 -0
- package/dist/requirement-analysis/types/feature-mapping.js +1 -0
- package/dist/requirement-analysis/types/index.d.ts +171 -0
- package/dist/requirement-analysis/types/index.js +1 -0
- package/dist/requirement-analysis/types/tech-stack.d.ts +213 -0
- package/dist/requirement-analysis/types/tech-stack.js +1 -0
- package/dist/requirement-analysis/utils/error-handler.d.ts +112 -0
- package/dist/requirement-analysis/utils/error-handler.js +1 -0
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.js +1 -1
- package/dist/utils/id.js +1 -1
- package/package.json +4 -2
- package/skills/competitor-search/SKILL.md +169 -0
- package/skills/demand-analysis/SKILL.md +307 -0
- package/skills/feature-search/SKILL.md +182 -0
- package/skills/requirement-analysis/README.md +464 -0
- package/skills/requirement-analysis/SKILL.md +224 -0
- package/skills/requirement-analysis/templates/feature-mapping-template.json +210 -0
- package/skills/requirement-analysis/templates/prd-template.md +104 -0
- package/skills/tech-selection/SKILL.md +198 -0
- package/dist/__e2e__/01-state-engine.e2e.test.d.ts +0 -10
- package/dist/__e2e__/01-state-engine.e2e.test.js +0 -1
- package/dist/acceptance/lazyDetector.test.d.ts +0 -1
- package/dist/acceptance/lazyDetector.test.js +0 -1
- package/dist/acceptance/reporter.test.d.ts +0 -1
- package/dist/acceptance/reporter.test.js +0 -1
- package/dist/acceptance/runner.test.d.ts +0 -1
- package/dist/acceptance/runner.test.js +0 -1
- package/dist/context/promptTemplate.test.d.ts +0 -1
- package/dist/context/promptTemplate.test.js +0 -1
- package/dist/context/techContextLoader.test.d.ts +0 -1
- package/dist/context/techContextLoader.test.js +0 -1
- package/dist/machines/agentMachine.test.d.ts +0 -1
- package/dist/machines/agentMachine.test.js +0 -1
- package/dist/machines/supervisorMachine.test.d.ts +0 -1
- package/dist/machines/supervisorMachine.test.js +0 -1
- package/dist/persistence/stateFile.test.d.ts +0 -1
- package/dist/persistence/stateFile.test.js +0 -1
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# 代码库关注点模板
|
|
2
|
+
|
|
3
|
+
`.planning/codebase/CONCERNS.md` 的模板 - 记录已知问题和需要注意的区域。
|
|
4
|
+
|
|
5
|
+
**用途:** 提供关于代码库的可操作警告。聚焦于"修改代码时需要注意什么"。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 文件模板
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
# 代码库关注点
|
|
13
|
+
|
|
14
|
+
**分析日期:** [YYYY-MM-DD]
|
|
15
|
+
|
|
16
|
+
## 技术债务
|
|
17
|
+
|
|
18
|
+
**[区域/组件]:**
|
|
19
|
+
- 问题:[什么是捷径/变通方案]
|
|
20
|
+
- 原因:[为什么这样做]
|
|
21
|
+
- 影响:[因此什么会出问题或退化]
|
|
22
|
+
- 修复方案:[如何正确解决]
|
|
23
|
+
|
|
24
|
+
**[区域/组件]:**
|
|
25
|
+
- 问题:[什么是捷径/变通方案]
|
|
26
|
+
- 原因:[为什么这样做]
|
|
27
|
+
- 影响:[因此什么会出问题或退化]
|
|
28
|
+
- 修复方案:[如何正确解决]
|
|
29
|
+
|
|
30
|
+
## 已知 Bug
|
|
31
|
+
|
|
32
|
+
**[Bug 描述]:**
|
|
33
|
+
- 症状:[发生了什么]
|
|
34
|
+
- 触发条件:[如何复现]
|
|
35
|
+
- 变通方案:[临时缓解措施(如有)]
|
|
36
|
+
- 根因:[如果已知]
|
|
37
|
+
- 阻塞于:[如果在等待某些东西]
|
|
38
|
+
|
|
39
|
+
**[Bug 描述]:**
|
|
40
|
+
- 症状:[发生了什么]
|
|
41
|
+
- 触发条件:[如何复现]
|
|
42
|
+
- 变通方案:[临时缓解措施(如有)]
|
|
43
|
+
- 根因:[如果已知]
|
|
44
|
+
|
|
45
|
+
## 安全考虑
|
|
46
|
+
|
|
47
|
+
**[需要安全关注的区域]:**
|
|
48
|
+
- 风险:[可能出什么问题]
|
|
49
|
+
- 当前缓解措施:[目前有什么保护]
|
|
50
|
+
- 建议:[应该添加什么]
|
|
51
|
+
|
|
52
|
+
**[需要安全关注的区域]:**
|
|
53
|
+
- 风险:[可能出什么问题]
|
|
54
|
+
- 当前缓解措施:[目前有什么保护]
|
|
55
|
+
- 建议:[应该添加什么]
|
|
56
|
+
|
|
57
|
+
## 性能瓶颈
|
|
58
|
+
|
|
59
|
+
**[慢操作/端点]:**
|
|
60
|
+
- 问题:[什么慢]
|
|
61
|
+
- 测量值:[实际数据:"500ms p95"、"2s 加载时间"]
|
|
62
|
+
- 原因:[为什么慢]
|
|
63
|
+
- 改进路径:[如何加速]
|
|
64
|
+
|
|
65
|
+
**[慢操作/端点]:**
|
|
66
|
+
- 问题:[什么慢]
|
|
67
|
+
- 测量值:[实际数据]
|
|
68
|
+
- 原因:[为什么慢]
|
|
69
|
+
- 改进路径:[如何加速]
|
|
70
|
+
|
|
71
|
+
## 脆弱区域
|
|
72
|
+
|
|
73
|
+
**[组件/模块]:**
|
|
74
|
+
- 脆弱原因:[什么使它容易出问题]
|
|
75
|
+
- 常见故障:[通常会出什么问题]
|
|
76
|
+
- 安全修改方式:[如何修改而不破坏]
|
|
77
|
+
- 测试覆盖:[是否有测试?有什么缺口?]
|
|
78
|
+
|
|
79
|
+
**[组件/模块]:**
|
|
80
|
+
- 脆弱原因:[什么使它容易出问题]
|
|
81
|
+
- 常见故障:[通常会出什么问题]
|
|
82
|
+
- 安全修改方式:[如何修改而不破坏]
|
|
83
|
+
- 测试覆盖:[是否有测试?有什么缺口?]
|
|
84
|
+
|
|
85
|
+
## 扩展限制
|
|
86
|
+
|
|
87
|
+
**[资源/系统]:**
|
|
88
|
+
- 当前容量:[数据:"100 req/sec"、"10k 用户"]
|
|
89
|
+
- 极限:[在哪里会崩溃]
|
|
90
|
+
- 达到极限时的症状:[会发生什么]
|
|
91
|
+
- 扩展路径:[如何增加容量]
|
|
92
|
+
|
|
93
|
+
## 有风险的依赖
|
|
94
|
+
|
|
95
|
+
**[包/服务]:**
|
|
96
|
+
- 风险:[例如 "已弃用"、"无人维护"、"即将有破坏性变更"]
|
|
97
|
+
- 影响:[如果它失败会破坏什么]
|
|
98
|
+
- 迁移计划:[替代方案或升级路径]
|
|
99
|
+
|
|
100
|
+
## 缺失的关键功能
|
|
101
|
+
|
|
102
|
+
**[功能缺口]:**
|
|
103
|
+
- 问题:[缺少什么]
|
|
104
|
+
- 当前变通方案:[用户如何应对]
|
|
105
|
+
- 阻塞:[没有它什么无法完成]
|
|
106
|
+
- 实现复杂度:[粗略工作量估计]
|
|
107
|
+
|
|
108
|
+
## 测试覆盖缺口
|
|
109
|
+
|
|
110
|
+
**[未测试区域]:**
|
|
111
|
+
- 未测试内容:[具体功能]
|
|
112
|
+
- 风险:[什么可能在不知不觉中出问题]
|
|
113
|
+
- 优先级:[高/中/低]
|
|
114
|
+
- 测试难度:[为什么还没有测试]
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
*关注点审计:[date]*
|
|
119
|
+
*问题修复或发现新问题时更新*
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
<good_examples>
|
|
123
|
+
```markdown
|
|
124
|
+
# 代码库关注点
|
|
125
|
+
|
|
126
|
+
**分析日期:** 2025-01-20
|
|
127
|
+
|
|
128
|
+
## 技术债务
|
|
129
|
+
|
|
130
|
+
**React 组件中的数据库查询:**
|
|
131
|
+
- 问题:15+ 个页面组件中直接使用 Supabase 查询,而非 server actions
|
|
132
|
+
- 文件:`app/dashboard/page.tsx`、`app/profile/page.tsx`、`app/courses/[id]/page.tsx`、`app/settings/page.tsx`(以及 `app/` 中的另外 11 个)
|
|
133
|
+
- 原因:MVP 阶段的快速原型开发
|
|
134
|
+
- 影响:无法正确实现 RLS,向客户端暴露数据库结构
|
|
135
|
+
- 修复方案:将所有查询移至 `app/actions/` 中的 server actions,添加适当的 RLS 策略
|
|
136
|
+
|
|
137
|
+
**手动 webhook 签名验证:**
|
|
138
|
+
- 问题:3 个不同端点中复制粘贴的 Stripe webhook 验证代码
|
|
139
|
+
- 文件:`app/api/webhooks/stripe/route.ts`、`app/api/webhooks/checkout/route.ts`、`app/api/webhooks/subscription/route.ts`
|
|
140
|
+
- 原因:每个 webhook 都是临时添加的,没有抽象
|
|
141
|
+
- 影响:新 webhook 容易遗漏验证(安全风险)
|
|
142
|
+
- 修复方案:创建共享的 `lib/stripe/validate-webhook.ts` 中间件
|
|
143
|
+
|
|
144
|
+
## 已知 Bug
|
|
145
|
+
|
|
146
|
+
**订阅更新的竞态条件:**
|
|
147
|
+
- 症状:成功支付后用户显示为"免费"层级 5-10 秒
|
|
148
|
+
- 触发条件:Stripe 结账重定向后快速导航,webhook 处理之前
|
|
149
|
+
- 文件:`app/checkout/success/page.tsx`(重定向处理器)、`app/api/webhooks/stripe/route.ts`(webhook)
|
|
150
|
+
- 变通方案:Stripe webhook 最终会更新状态(自愈)
|
|
151
|
+
- 根因:Webhook 处理比用户导航慢,没有乐观 UI 更新
|
|
152
|
+
- 修复:在 `app/checkout/success/page.tsx` 中重定向后添加轮询
|
|
153
|
+
|
|
154
|
+
**登出后会话状态不一致:**
|
|
155
|
+
- 症状:登出后用户被重定向到 /dashboard 而非 /login
|
|
156
|
+
- 触发条件:通过移动端导航按钮登出(桌面端正常)
|
|
157
|
+
- 文件:`components/MobileNav.tsx`(约第 45 行,登出处理器)
|
|
158
|
+
- 变通方案:手动导航到 /login 可以正常工作
|
|
159
|
+
- 根因:移动端导航组件没有 await supabase.auth.signOut()
|
|
160
|
+
- 修复:在 `components/MobileNav.tsx` 的登出处理器中添加 await
|
|
161
|
+
|
|
162
|
+
## 安全考虑
|
|
163
|
+
|
|
164
|
+
**管理员角色仅在客户端检查:**
|
|
165
|
+
- 风险:管理员仪表板页面从 Supabase 客户端检查 isAdmin,没有服务端验证
|
|
166
|
+
- 文件:`app/admin/page.tsx`、`app/admin/users/page.tsx`、`components/AdminGuard.tsx`
|
|
167
|
+
- 当前缓解措施:无(依赖 UI 隐藏)
|
|
168
|
+
- 建议:在 `middleware.ts` 中为管理员路由添加中间件,服务端验证角色
|
|
169
|
+
|
|
170
|
+
**未验证的文件上传:**
|
|
171
|
+
- 风险:用户可以上传任何文件类型到头像存储桶(无大小/类型验证)
|
|
172
|
+
- 文件:`components/AvatarUpload.tsx`(上传处理器)
|
|
173
|
+
- 当前缓解措施:Supabase 存储桶限制为 2MB(在仪表板中配置)
|
|
174
|
+
- 建议:在 `lib/storage/validate.ts` 中添加文件类型验证(仅 image/*)
|
|
175
|
+
|
|
176
|
+
## 性能瓶颈
|
|
177
|
+
|
|
178
|
+
**/api/courses 端点:**
|
|
179
|
+
- 问题:获取所有课程及嵌套的课时和作者
|
|
180
|
+
- 文件:`app/api/courses/route.ts`
|
|
181
|
+
- 测量值:50+ 课程时 p95 响应时间 1.2s
|
|
182
|
+
- 原因:N+1 查询模式(每个课程单独查询课时)
|
|
183
|
+
- 改进路径:在 `lib/db/courses.ts` 中使用 Prisma include 预加载课时,添加 Redis 缓存
|
|
184
|
+
|
|
185
|
+
**仪表板初始加载:**
|
|
186
|
+
- 问题:挂载时 5 个串行 API 调用的瀑布流
|
|
187
|
+
- 文件:`app/dashboard/page.tsx`
|
|
188
|
+
- 测量值:慢速 3G 下 3.5s 才可交互
|
|
189
|
+
- 原因:每个组件独立获取自己的数据
|
|
190
|
+
- 改进路径:转换为 Server Component,使用单次并行获取
|
|
191
|
+
|
|
192
|
+
## 脆弱区域
|
|
193
|
+
|
|
194
|
+
**认证中间件链:**
|
|
195
|
+
- 文件:`middleware.ts`
|
|
196
|
+
- 脆弱原因:4 个不同的中间件函数按特定顺序运行(auth -> role -> subscription -> logging)
|
|
197
|
+
- 常见故障:中间件顺序变更会破坏一切,难以调试
|
|
198
|
+
- 安全修改方式:修改顺序前添加测试,在注释中记录依赖关系
|
|
199
|
+
- 测试覆盖:中间件链无集成测试(仅有单元测试)
|
|
200
|
+
|
|
201
|
+
**Stripe webhook 事件处理:**
|
|
202
|
+
- 文件:`app/api/webhooks/stripe/route.ts`
|
|
203
|
+
- 脆弱原因:包含 12 种事件类型的巨大 switch 语句,共享事务逻辑
|
|
204
|
+
- 常见故障:添加新事件类型时未处理,错误时部分数据库更新
|
|
205
|
+
- 安全修改方式:将每个事件处理器提取到 `lib/stripe/handlers/*.ts`
|
|
206
|
+
- 测试覆盖:12 种事件类型中仅 3 种有测试
|
|
207
|
+
|
|
208
|
+
## 扩展限制
|
|
209
|
+
|
|
210
|
+
**Supabase 免费层级:**
|
|
211
|
+
- 当前容量:500MB 数据库、1GB 文件存储、2GB 带宽/月
|
|
212
|
+
- 极限:预计约 5000 用户后达到限制
|
|
213
|
+
- 达到极限时的症状:429 速率限制错误,数据库写入失败
|
|
214
|
+
- 扩展路径:升级到 Pro($25/月)扩展到 8GB 数据库、100GB 存储
|
|
215
|
+
|
|
216
|
+
**服务端渲染阻塞:**
|
|
217
|
+
- 当前容量:约 50 个并发用户后开始变慢
|
|
218
|
+
- 极限:Vercel Hobby 计划(10s 函数超时,100GB-hrs/月)
|
|
219
|
+
- 达到极限时的症状:课程页面 504 网关超时
|
|
220
|
+
- 扩展路径:升级到 Vercel Pro($20/月),添加边缘缓存
|
|
221
|
+
|
|
222
|
+
## 有风险的依赖
|
|
223
|
+
|
|
224
|
+
**react-hot-toast:**
|
|
225
|
+
- 风险:无人维护(最后更新 18 个月前),React 19 兼容性未知
|
|
226
|
+
- 影响:Toast 通知失效,无优雅降级
|
|
227
|
+
- 迁移计划:切换到 sonner(积极维护,类似 API)
|
|
228
|
+
|
|
229
|
+
## 缺失的关键功能
|
|
230
|
+
|
|
231
|
+
**支付失败处理:**
|
|
232
|
+
- 问题:订阅支付失败时没有重试机制或用户通知
|
|
233
|
+
- 当前变通方案:用户手动重新输入支付信息(如果他们注意到的话)
|
|
234
|
+
- 阻塞:无法留住过期卡片的用户,没有催款流程
|
|
235
|
+
- 实现复杂度:中等(Stripe webhooks + 邮件流程 + UI)
|
|
236
|
+
|
|
237
|
+
**课程进度跟踪:**
|
|
238
|
+
- 问题:没有持久化状态记录已完成的课时
|
|
239
|
+
- 当前变通方案:用户手动跟踪进度
|
|
240
|
+
- 阻塞:无法显示完成百分比,无法推荐下一课时
|
|
241
|
+
- 实现复杂度:低(添加 completed_lessons 关联表)
|
|
242
|
+
|
|
243
|
+
## 测试覆盖缺口
|
|
244
|
+
|
|
245
|
+
**支付流程端到端:**
|
|
246
|
+
- 未测试内容:完整的 Stripe 结账 -> webhook -> 订阅激活流程
|
|
247
|
+
- 风险:支付处理可能静默失败(已发生过两次)
|
|
248
|
+
- 优先级:高
|
|
249
|
+
- 测试难度:需要 Stripe 测试固定数据和 webhook 模拟设置
|
|
250
|
+
|
|
251
|
+
**错误边界行为:**
|
|
252
|
+
- 未测试内容:组件抛出错误时应用的行为
|
|
253
|
+
- 风险:用户看到白屏,没有错误报告
|
|
254
|
+
- 优先级:中
|
|
255
|
+
- 测试难度:需要在测试环境中故意触发错误
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
*关注点审计:2025-01-20*
|
|
260
|
+
*问题修复或发现新问题时更新*
|
|
261
|
+
```
|
|
262
|
+
</good_examples>
|
|
263
|
+
|
|
264
|
+
<guidelines>
|
|
265
|
+
**CONCERNS.md 中应包含的内容:**
|
|
266
|
+
- 有明确影响和修复方案的技术债务
|
|
267
|
+
- 有复现步骤的已知 bug
|
|
268
|
+
- 安全缺口和缓解建议
|
|
269
|
+
- 有测量数据的性能瓶颈
|
|
270
|
+
- 容易出问题的脆弱代码
|
|
271
|
+
- 有数据的扩展限制
|
|
272
|
+
- 需要关注的依赖
|
|
273
|
+
- 阻塞工作流的缺失功能
|
|
274
|
+
- 测试覆盖缺口
|
|
275
|
+
|
|
276
|
+
**不应包含的内容:**
|
|
277
|
+
- 没有证据的观点("代码很乱")
|
|
278
|
+
- 没有解决方案的抱怨("认证很烂")
|
|
279
|
+
- 未来功能想法(那是产品规划的内容)
|
|
280
|
+
- 普通 TODO(那些放在代码注释中)
|
|
281
|
+
- 运行良好的架构决策
|
|
282
|
+
- 次要代码风格问题
|
|
283
|
+
|
|
284
|
+
**填写此模板时:**
|
|
285
|
+
- **始终包含文件路径** - 没有位置的关注点不可操作。使用反引号:`src/file.ts`
|
|
286
|
+
- 测量值要具体("500ms p95" 而非 "慢")
|
|
287
|
+
- 包含 bug 的复现步骤
|
|
288
|
+
- 建议修复方案,而不仅仅是问题
|
|
289
|
+
- 聚焦可操作的项目
|
|
290
|
+
- 按风险/影响排列优先级
|
|
291
|
+
- 问题解决后更新
|
|
292
|
+
- 发现新问题时添加
|
|
293
|
+
|
|
294
|
+
**语气指南:**
|
|
295
|
+
- 专业,不情绪化("N+1 查询模式" 而非 "糟糕的查询")
|
|
296
|
+
- 面向解决方案("修复:添加索引" 而非 "需要修复")
|
|
297
|
+
- 聚焦风险("可能暴露用户数据" 而非 "安全很差")
|
|
298
|
+
- 基于事实("3.5s 加载时间" 而非 "非常慢")
|
|
299
|
+
|
|
300
|
+
**在阶段规划中的用途:**
|
|
301
|
+
- 决定下一步做什么
|
|
302
|
+
- 评估变更风险
|
|
303
|
+
- 了解哪里需要小心
|
|
304
|
+
- 确定改进优先级
|
|
305
|
+
- 为新的 Claude 上下文提供入门信息
|
|
306
|
+
- 规划重构工作
|
|
307
|
+
|
|
308
|
+
**如何填充:**
|
|
309
|
+
探索代理在代码库映射期间检测这些问题。欢迎手动添加人工发现的问题。这是活文档,不是抱怨清单。
|
|
310
|
+
</guidelines>
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# 编码规范模板
|
|
2
|
+
|
|
3
|
+
`.planning/codebase/CONVENTIONS.md` 的模板 - 记录编码风格和模式。
|
|
4
|
+
|
|
5
|
+
**用途:** 记录本代码库中代码的编写方式。为 Claude 匹配现有风格提供规范性指南。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 文件模板
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
# 编码规范
|
|
13
|
+
|
|
14
|
+
**分析日期:** [YYYY-MM-DD]
|
|
15
|
+
|
|
16
|
+
## 命名模式
|
|
17
|
+
|
|
18
|
+
**文件:**
|
|
19
|
+
- [模式:例如 "所有文件使用 kebab-case"]
|
|
20
|
+
- [测试文件:例如 "*.test.ts 与源文件并列"]
|
|
21
|
+
- [组件:例如 "React 组件使用 PascalCase.tsx"]
|
|
22
|
+
|
|
23
|
+
**函数:**
|
|
24
|
+
- [模式:例如 "所有函数使用 camelCase"]
|
|
25
|
+
- [异步:例如 "异步函数无特殊前缀"]
|
|
26
|
+
- [处理器:例如 "事件处理器使用 handleEventName"]
|
|
27
|
+
|
|
28
|
+
**变量:**
|
|
29
|
+
- [模式:例如 "变量使用 camelCase"]
|
|
30
|
+
- [常量:例如 "常量使用 UPPER_SNAKE_CASE"]
|
|
31
|
+
- [私有:例如 "私有成员使用 _前缀" 或 "无前缀"]
|
|
32
|
+
|
|
33
|
+
**类型:**
|
|
34
|
+
- [接口:例如 "PascalCase,无 I 前缀"]
|
|
35
|
+
- [类型:例如 "类型别名使用 PascalCase"]
|
|
36
|
+
- [枚举:例如 "枚举名使用 PascalCase,值使用 UPPER_CASE"]
|
|
37
|
+
|
|
38
|
+
## 代码风格
|
|
39
|
+
|
|
40
|
+
**格式化:**
|
|
41
|
+
- [工具:例如 "Prettier,配置在 .prettierrc"]
|
|
42
|
+
- [行长度:例如 "最大 100 字符"]
|
|
43
|
+
- [引号:例如 "字符串使用单引号"]
|
|
44
|
+
- [分号:例如 "必须" 或 "省略"]
|
|
45
|
+
|
|
46
|
+
**代码检查:**
|
|
47
|
+
- [工具:例如 "ESLint,配置在 eslint.config.js"]
|
|
48
|
+
- [规则:例如 "继承 airbnb-base,生产环境禁止 console"]
|
|
49
|
+
- [运行:例如 "npm run lint"]
|
|
50
|
+
|
|
51
|
+
## 导入组织
|
|
52
|
+
|
|
53
|
+
**顺序:**
|
|
54
|
+
1. [例如 "外部包(react、express 等)"]
|
|
55
|
+
2. [例如 "内部模块(@/lib、@/components)"]
|
|
56
|
+
3. [例如 "相对导入(.、..)"]
|
|
57
|
+
4. [例如 "类型导入(import type {})"]
|
|
58
|
+
|
|
59
|
+
**分组:**
|
|
60
|
+
- [空行:例如 "组之间空一行"]
|
|
61
|
+
- [排序:例如 "每组内按字母排序"]
|
|
62
|
+
|
|
63
|
+
**路径别名:**
|
|
64
|
+
- [使用的别名:例如 "@/ 对应 src/、@components/ 对应 src/components/"]
|
|
65
|
+
|
|
66
|
+
## 错误处理
|
|
67
|
+
|
|
68
|
+
**模式:**
|
|
69
|
+
- [策略:例如 "抛出错误,在边界处捕获"]
|
|
70
|
+
- [自定义错误:例如 "继承 Error 类,命名为 *Error"]
|
|
71
|
+
- [异步:例如 "使用 try/catch,不使用 .catch() 链"]
|
|
72
|
+
|
|
73
|
+
**错误类型:**
|
|
74
|
+
- [何时抛出:例如 "无效输入、缺少依赖"]
|
|
75
|
+
- [何时返回:例如 "预期失败返回 Result<T, E>"]
|
|
76
|
+
- [日志:例如 "抛出前记录带上下文的错误"]
|
|
77
|
+
|
|
78
|
+
## 日志
|
|
79
|
+
|
|
80
|
+
**框架:**
|
|
81
|
+
- [工具:例如 "console.log、pino、winston"]
|
|
82
|
+
- [级别:例如 "debug、info、warn、error"]
|
|
83
|
+
|
|
84
|
+
**模式:**
|
|
85
|
+
- [格式:例如 "带上下文对象的结构化日志"]
|
|
86
|
+
- [何时:例如 "记录状态转换、外部调用"]
|
|
87
|
+
- [何处:例如 "在服务边界记录,不在工具函数中"]
|
|
88
|
+
|
|
89
|
+
## 注释
|
|
90
|
+
|
|
91
|
+
**何时注释:**
|
|
92
|
+
- [例如 "解释为什么,而非是什么"]
|
|
93
|
+
- [例如 "记录业务逻辑、算法、边界情况"]
|
|
94
|
+
- [例如 "避免显而易见的注释,如 // 计数器加一"]
|
|
95
|
+
|
|
96
|
+
**JSDoc/TSDoc:**
|
|
97
|
+
- [用法:例如 "公共 API 必须,内部可选"]
|
|
98
|
+
- [格式:例如 "使用 @param、@returns、@throws 标签"]
|
|
99
|
+
|
|
100
|
+
**TODO 注释:**
|
|
101
|
+
- [模式:例如 "// TODO(username): 描述"]
|
|
102
|
+
- [追踪:例如 "如有可用则链接到 issue 编号"]
|
|
103
|
+
|
|
104
|
+
## 函数设计
|
|
105
|
+
|
|
106
|
+
**大小:**
|
|
107
|
+
- [例如 "保持在 50 行以内,提取辅助函数"]
|
|
108
|
+
|
|
109
|
+
**参数:**
|
|
110
|
+
- [例如 "最多 3 个参数,更多时使用对象"]
|
|
111
|
+
- [例如 "在参数列表中解构对象"]
|
|
112
|
+
|
|
113
|
+
**返回值:**
|
|
114
|
+
- [例如 "显式返回,不使用隐式 undefined"]
|
|
115
|
+
- [例如 "守卫子句提前返回"]
|
|
116
|
+
|
|
117
|
+
## 模块设计
|
|
118
|
+
|
|
119
|
+
**导出:**
|
|
120
|
+
- [例如 "优先使用命名导出,React 组件使用默认导出"]
|
|
121
|
+
- [例如 "从 index.ts 导出公共 API"]
|
|
122
|
+
|
|
123
|
+
**桶文件:**
|
|
124
|
+
- [例如 "使用 index.ts 重新导出公共 API"]
|
|
125
|
+
- [例如 "避免循环依赖"]
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
*规范分析:[date]*
|
|
130
|
+
*模式变更时更新*
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
<good_examples>
|
|
134
|
+
```markdown
|
|
135
|
+
# 编码规范
|
|
136
|
+
|
|
137
|
+
**分析日期:** 2025-01-20
|
|
138
|
+
|
|
139
|
+
## 命名模式
|
|
140
|
+
|
|
141
|
+
**文件:**
|
|
142
|
+
- 所有文件使用 kebab-case(command-handler.ts、user-service.ts)
|
|
143
|
+
- *.test.ts 与源文件并列
|
|
144
|
+
- index.ts 用于桶导出
|
|
145
|
+
|
|
146
|
+
**函数:**
|
|
147
|
+
- 所有函数使用 camelCase
|
|
148
|
+
- 异步函数无特殊前缀
|
|
149
|
+
- 事件处理器使用 handleEventName(handleClick、handleSubmit)
|
|
150
|
+
|
|
151
|
+
**变量:**
|
|
152
|
+
- 变量使用 camelCase
|
|
153
|
+
- 常量使用 UPPER_SNAKE_CASE(MAX_RETRIES、API_BASE_URL)
|
|
154
|
+
- 无下划线前缀(TypeScript 中无私有标记)
|
|
155
|
+
|
|
156
|
+
**类型:**
|
|
157
|
+
- 接口使用 PascalCase,无 I 前缀(User,而非 IUser)
|
|
158
|
+
- 类型别名使用 PascalCase(UserConfig、ResponseData)
|
|
159
|
+
- 枚举名使用 PascalCase,值使用 UPPER_CASE(Status.PENDING)
|
|
160
|
+
|
|
161
|
+
## 代码风格
|
|
162
|
+
|
|
163
|
+
**格式化:**
|
|
164
|
+
- Prettier,配置在 .prettierrc
|
|
165
|
+
- 100 字符行长度
|
|
166
|
+
- 字符串使用单引号
|
|
167
|
+
- 必须使用分号
|
|
168
|
+
- 2 空格缩进
|
|
169
|
+
|
|
170
|
+
**代码检查:**
|
|
171
|
+
- ESLint,配置在 eslint.config.js
|
|
172
|
+
- 继承 @typescript-eslint/recommended
|
|
173
|
+
- 生产代码禁止 console.log(使用 logger)
|
|
174
|
+
- 运行:npm run lint
|
|
175
|
+
|
|
176
|
+
## 导入组织
|
|
177
|
+
|
|
178
|
+
**顺序:**
|
|
179
|
+
1. 外部包(react、express、commander)
|
|
180
|
+
2. 内部模块(@/lib、@/services)
|
|
181
|
+
3. 相对导入(./utils、../types)
|
|
182
|
+
4. 类型导入(import type { User })
|
|
183
|
+
|
|
184
|
+
**分组:**
|
|
185
|
+
- 组之间空一行
|
|
186
|
+
- 每组内按字母排序
|
|
187
|
+
- 类型导入在每组最后
|
|
188
|
+
|
|
189
|
+
**路径别名:**
|
|
190
|
+
- @/ 映射到 src/
|
|
191
|
+
- 未定义其他别名
|
|
192
|
+
|
|
193
|
+
## 错误处理
|
|
194
|
+
|
|
195
|
+
**模式:**
|
|
196
|
+
- 抛出错误,在边界处捕获(路由处理器、主函数)
|
|
197
|
+
- 自定义错误继承 Error 类(ValidationError、NotFoundError)
|
|
198
|
+
- 异步函数使用 try/catch,不使用 .catch() 链
|
|
199
|
+
|
|
200
|
+
**错误类型:**
|
|
201
|
+
- 无效输入、缺少依赖、不变量违反时抛出
|
|
202
|
+
- 抛出前记录带上下文的错误:logger.error({ err, userId }, 'Failed to process')
|
|
203
|
+
- 错误消息中包含原因:new Error('Failed to X', { cause: originalError })
|
|
204
|
+
|
|
205
|
+
## 日志
|
|
206
|
+
|
|
207
|
+
**框架:**
|
|
208
|
+
- 从 lib/logger.ts 导出的 pino logger 实例
|
|
209
|
+
- 级别:debug、info、warn、error(无 trace)
|
|
210
|
+
|
|
211
|
+
**模式:**
|
|
212
|
+
- 带上下文的结构化日志:logger.info({ userId, action }, 'User action')
|
|
213
|
+
- 在服务边界记录,不在工具函数中
|
|
214
|
+
- 记录状态转换、外部 API 调用、错误
|
|
215
|
+
- 提交的代码中禁止 console.log
|
|
216
|
+
|
|
217
|
+
## 注释
|
|
218
|
+
|
|
219
|
+
**何时注释:**
|
|
220
|
+
- 解释为什么,而非是什么:// 重试 3 次因为 API 有瞬时故障
|
|
221
|
+
- 记录业务规则:// 用户必须在 24 小时内验证邮箱
|
|
222
|
+
- 解释不明显的算法或变通方案
|
|
223
|
+
- 避免显而易见的注释:// 将 count 设为 0
|
|
224
|
+
|
|
225
|
+
**JSDoc/TSDoc:**
|
|
226
|
+
- 公共 API 函数必须
|
|
227
|
+
- 签名自解释的内部函数可选
|
|
228
|
+
- 使用 @param、@returns、@throws 标签
|
|
229
|
+
|
|
230
|
+
**TODO 注释:**
|
|
231
|
+
- 格式:// TODO: 描述(无用户名,使用 git blame)
|
|
232
|
+
- 如有 issue 则链接:// TODO: 修复竞态条件(issue #123)
|
|
233
|
+
|
|
234
|
+
## 函数设计
|
|
235
|
+
|
|
236
|
+
**大小:**
|
|
237
|
+
- 保持在 50 行以内
|
|
238
|
+
- 复杂逻辑提取辅助函数
|
|
239
|
+
- 每个函数一个抽象层级
|
|
240
|
+
|
|
241
|
+
**参数:**
|
|
242
|
+
- 最多 3 个参数
|
|
243
|
+
- 4+ 个参数使用选项对象:function create(options: CreateOptions)
|
|
244
|
+
- 在参数列表中解构:function process({ id, name }: ProcessParams)
|
|
245
|
+
|
|
246
|
+
**返回值:**
|
|
247
|
+
- 显式 return 语句
|
|
248
|
+
- 守卫子句提前返回
|
|
249
|
+
- 预期失败使用 Result<T, E> 类型
|
|
250
|
+
|
|
251
|
+
## 模块设计
|
|
252
|
+
|
|
253
|
+
**导出:**
|
|
254
|
+
- 优先使用命名导出
|
|
255
|
+
- 仅 React 组件使用默认导出
|
|
256
|
+
- 从 index.ts 桶文件导出公共 API
|
|
257
|
+
|
|
258
|
+
**桶文件:**
|
|
259
|
+
- index.ts 重新导出公共 API
|
|
260
|
+
- 内部辅助函数保持私有(不从 index 导出)
|
|
261
|
+
- 避免循环依赖(需要时从具体文件导入)
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
*规范分析:2025-01-20*
|
|
266
|
+
*模式变更时更新*
|
|
267
|
+
```
|
|
268
|
+
</good_examples>
|
|
269
|
+
|
|
270
|
+
<guidelines>
|
|
271
|
+
**CONVENTIONS.md 中应包含的内容:**
|
|
272
|
+
- 代码库中观察到的命名模式
|
|
273
|
+
- 格式化规则(Prettier 配置、代码检查规则)
|
|
274
|
+
- 导入组织模式
|
|
275
|
+
- 错误处理策略
|
|
276
|
+
- 日志方法
|
|
277
|
+
- 注释规范
|
|
278
|
+
- 函数和模块设计模式
|
|
279
|
+
|
|
280
|
+
**不应包含的内容:**
|
|
281
|
+
- 架构决策(那是 ARCHITECTURE.md 的内容)
|
|
282
|
+
- 技术选型(那是 STACK.md 的内容)
|
|
283
|
+
- 测试模式(那是 TESTING.md 的内容)
|
|
284
|
+
- 文件组织(那是 STRUCTURE.md 的内容)
|
|
285
|
+
|
|
286
|
+
**填写此模板时:**
|
|
287
|
+
- 检查 .prettierrc、.eslintrc 或类似配置文件
|
|
288
|
+
- 检查 5-10 个代表性源文件的模式
|
|
289
|
+
- 寻找一致性:如果 80%+ 遵循某个模式,就记录它
|
|
290
|
+
- 使用规范性语言:"使用 X" 而非 "有时使用 Y"
|
|
291
|
+
- 记录偏差:"遗留代码使用 Y,新代码应使用 X"
|
|
292
|
+
- 总计保持在约 150 行以内
|
|
293
|
+
|
|
294
|
+
**在阶段规划中的用途:**
|
|
295
|
+
- 编写新代码时(匹配现有风格)
|
|
296
|
+
- 添加功能时(遵循命名模式)
|
|
297
|
+
- 重构时(应用一致的规范)
|
|
298
|
+
- 代码审查时(对照记录的模式检查)
|
|
299
|
+
- 入门时(了解风格期望)
|
|
300
|
+
|
|
301
|
+
**分析方法:**
|
|
302
|
+
- 扫描 src/ 目录了解文件命名模式
|
|
303
|
+
- 检查 package.json scripts 中的 lint/format 命令
|
|
304
|
+
- 阅读 5-10 个文件识别函数命名、错误处理
|
|
305
|
+
- 查找配置文件(.prettierrc、eslint.config.js)
|
|
306
|
+
- 记录导入、注释、函数签名中的模式
|
|
307
|
+
</guidelines>
|