specops 0.2.4 → 0.3.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.
Files changed (160) hide show
  1. package/.opencode/agent/specops-codebase-mapper.md +764 -0
  2. package/.opencode/agent/specops-debugger.md +1246 -0
  3. package/.opencode/agent/specops-executor.md +469 -0
  4. package/.opencode/agent/specops-integration-checker.md +443 -0
  5. package/.opencode/agent/specops-phase-researcher.md +547 -0
  6. package/.opencode/agent/specops-plan-checker.md +690 -0
  7. package/.opencode/agent/specops-planner.md +575 -0
  8. package/.opencode/agent/specops-project-researcher.md +354 -0
  9. package/.opencode/agent/specops-research-synthesizer.md +239 -0
  10. package/.opencode/agent/specops-roadmapper.md +642 -0
  11. package/.opencode/agent/specops-work-verifier.md +573 -0
  12. package/.opencode/references/checkpoints.md +776 -0
  13. package/.opencode/references/continuation-format.md +249 -0
  14. package/.opencode/references/decimal-phase-calculation.md +65 -0
  15. package/.opencode/references/git-integration.md +248 -0
  16. package/.opencode/references/git-planning-commit.md +38 -0
  17. package/.opencode/references/model-profile-resolution.md +34 -0
  18. package/.opencode/references/model-profiles.md +92 -0
  19. package/.opencode/references/phase-argument-parsing.md +61 -0
  20. package/.opencode/references/planning-config.md +196 -0
  21. package/.opencode/references/questioning.md +145 -0
  22. package/.opencode/references/tdd.md +263 -0
  23. package/.opencode/references/ui-brand.md +160 -0
  24. package/.opencode/references/verification-patterns.md +612 -0
  25. package/.opencode/skills/demand-analysis/SKILL.md +142 -10
  26. package/.opencode/templates/DEBUG.md +164 -0
  27. package/.opencode/templates/UAT.md +180 -0
  28. package/.opencode/templates/VALIDATION.md +76 -0
  29. package/.opencode/templates/codebase/architecture.md +255 -0
  30. package/.opencode/templates/codebase/concerns.md +310 -0
  31. package/.opencode/templates/codebase/conventions.md +307 -0
  32. package/.opencode/templates/codebase/integrations.md +280 -0
  33. package/.opencode/templates/codebase/stack.md +186 -0
  34. package/.opencode/templates/codebase/structure.md +285 -0
  35. package/.opencode/templates/codebase/testing.md +480 -0
  36. package/.opencode/templates/context.md +221 -0
  37. package/.opencode/templates/continue-here.md +78 -0
  38. package/.opencode/templates/debug-subagent-prompt.md +91 -0
  39. package/.opencode/templates/discovery.md +147 -0
  40. package/.opencode/templates/milestone-archive.md +123 -0
  41. package/.opencode/templates/milestone.md +115 -0
  42. package/.opencode/templates/phase-prompt.md +333 -0
  43. package/.opencode/templates/planner-subagent-prompt.md +117 -0
  44. package/.opencode/templates/project.md +184 -0
  45. package/.opencode/templates/requirements.md +130 -0
  46. package/.opencode/templates/research-project/ARCHITECTURE.md +204 -0
  47. package/.opencode/templates/research-project/FEATURES.md +147 -0
  48. package/.opencode/templates/research-project/PITFALLS.md +200 -0
  49. package/.opencode/templates/research-project/STACK.md +120 -0
  50. package/.opencode/templates/research-project/SUMMARY.md +170 -0
  51. package/.opencode/templates/research.md +278 -0
  52. package/.opencode/templates/retrospective.md +54 -0
  53. package/.opencode/templates/roadmap.md +202 -0
  54. package/.opencode/templates/state.md +176 -0
  55. package/.opencode/templates/summary-complex.md +59 -0
  56. package/.opencode/templates/summary-minimal.md +41 -0
  57. package/.opencode/templates/summary-standard.md +48 -0
  58. package/.opencode/templates/summary.md +248 -0
  59. package/.opencode/templates/user-setup.md +311 -0
  60. package/.opencode/templates/verification-report.md +322 -0
  61. package/.opencode/workflows/add-phase.md +111 -0
  62. package/.opencode/workflows/add-tests.md +350 -0
  63. package/.opencode/workflows/add-todo.md +157 -0
  64. package/.opencode/workflows/audit-milestone.md +297 -0
  65. package/.opencode/workflows/check-todos.md +176 -0
  66. package/.opencode/workflows/cleanup.md +152 -0
  67. package/.opencode/workflows/complete-milestone.md +763 -0
  68. package/.opencode/workflows/diagnose-issues.md +219 -0
  69. package/.opencode/workflows/discovery-phase.md +288 -0
  70. package/.opencode/workflows/discuss-phase.md +542 -0
  71. package/.opencode/workflows/execute-phase.md +449 -0
  72. package/.opencode/workflows/execute-plan.md +447 -0
  73. package/.opencode/workflows/health.md +156 -0
  74. package/.opencode/workflows/help.md +489 -0
  75. package/.opencode/workflows/insert-phase.md +129 -0
  76. package/.opencode/workflows/list-phase-assumptions.md +178 -0
  77. package/.opencode/workflows/map-codebase.md +315 -0
  78. package/.opencode/workflows/new-milestone.md +382 -0
  79. package/.opencode/workflows/new-project.md +1116 -0
  80. package/.opencode/workflows/pause-work.md +122 -0
  81. package/.opencode/workflows/plan-milestone-gaps.md +274 -0
  82. package/.opencode/workflows/plan-phase.md +569 -0
  83. package/.opencode/workflows/progress.md +381 -0
  84. package/.opencode/workflows/quick.md +453 -0
  85. package/.opencode/workflows/remove-phase.md +154 -0
  86. package/.opencode/workflows/research-phase.md +73 -0
  87. package/.opencode/workflows/resume-project.md +304 -0
  88. package/.opencode/workflows/set-profile.md +80 -0
  89. package/.opencode/workflows/settings.md +213 -0
  90. package/.opencode/workflows/transition.md +544 -0
  91. package/.opencode/workflows/update.md +219 -0
  92. package/.opencode/workflows/verify-phase.md +242 -0
  93. package/.opencode/workflows/verify-work.md +569 -0
  94. package/commands/specops/add-phase.md +43 -0
  95. package/commands/specops/add-tests.md +41 -0
  96. package/commands/specops/add-todo.md +47 -0
  97. package/commands/specops/audit-milestone.md +36 -0
  98. package/commands/specops/check-todos.md +45 -0
  99. package/commands/specops/cleanup.md +18 -0
  100. package/commands/specops/complete-milestone.md +136 -0
  101. package/commands/specops/debug.md +167 -0
  102. package/commands/specops/discuss-phase.md +83 -0
  103. package/commands/specops/execute-phase.md +41 -0
  104. package/commands/specops/health.md +22 -0
  105. package/commands/specops/help.md +22 -0
  106. package/commands/specops/insert-phase.md +32 -0
  107. package/commands/specops/join-discord.md +18 -0
  108. package/commands/specops/list-phase-assumptions.md +46 -0
  109. package/commands/specops/map-codebase.md +71 -0
  110. package/commands/specops/new-milestone.md +44 -0
  111. package/commands/specops/new-project.md +42 -0
  112. package/commands/specops/pause-work.md +38 -0
  113. package/commands/specops/plan-milestone-gaps.md +34 -0
  114. package/commands/specops/plan-phase.md +45 -0
  115. package/commands/specops/progress.md +24 -0
  116. package/commands/specops/quick.md +41 -0
  117. package/commands/specops/reapply-patches.md +111 -0
  118. package/commands/specops/remove-phase.md +31 -0
  119. package/commands/specops/research-phase.md +189 -0
  120. package/commands/specops/resume-work.md +40 -0
  121. package/commands/specops/set-profile.md +34 -0
  122. package/commands/specops/settings.md +36 -0
  123. package/commands/specops/update.md +37 -0
  124. package/commands/specops/verify-work.md +38 -0
  125. package/dist/__e2e__/01-state-engine.e2e.test.js +1 -1
  126. package/dist/acceptance/lazyDetector.js +1 -1
  127. package/dist/acceptance/lazyDetector.test.js +1 -1
  128. package/dist/acceptance/reporter.js +1 -1
  129. package/dist/acceptance/reporter.test.js +1 -1
  130. package/dist/acceptance/runner.js +1 -1
  131. package/dist/acceptance/runner.test.js +1 -1
  132. package/dist/cli.js +1 -1
  133. package/dist/context/index.js +1 -1
  134. package/dist/context/promptTemplate.js +1 -1
  135. package/dist/context/promptTemplate.test.js +1 -1
  136. package/dist/context/techContextLoader.js +1 -1
  137. package/dist/context/techContextLoader.test.js +1 -1
  138. package/dist/engine.js +1 -1
  139. package/dist/evolution/distiller.js +1 -1
  140. package/dist/evolution/index.js +1 -1
  141. package/dist/evolution/memoryGraph.js +1 -1
  142. package/dist/evolution/selector.js +1 -1
  143. package/dist/evolution/signals.js +1 -1
  144. package/dist/evolution/solidify.js +1 -1
  145. package/dist/evolution/store.js +1 -1
  146. package/dist/evolution/types.js +1 -1
  147. package/dist/init.d.ts +4 -3
  148. package/dist/init.js +1 -1
  149. package/dist/machines/agentMachine.js +1 -1
  150. package/dist/machines/agentMachine.test.js +1 -1
  151. package/dist/machines/supervisorMachine.js +1 -1
  152. package/dist/machines/supervisorMachine.test.js +1 -1
  153. package/dist/persistence/schema.js +1 -1
  154. package/dist/persistence/stateFile.js +1 -1
  155. package/dist/persistence/stateFile.test.js +1 -1
  156. package/dist/plugin-engine.js +1 -1
  157. package/dist/plugin.js +1 -1
  158. package/dist/types/index.js +1 -1
  159. package/dist/utils/id.js +1 -1
  160. package/package.json +2 -1
@@ -0,0 +1,255 @@
1
+ # 架构模板
2
+
3
+ `.planning/codebase/ARCHITECTURE.md` 的模板 - 记录概念层面的代码组织。
4
+
5
+ **用途:** 记录代码在概念层面的组织方式。与 STRUCTURE.md(展示物理文件位置)互补。
6
+
7
+ ---
8
+
9
+ ## 文件模板
10
+
11
+ ```markdown
12
+ # 架构
13
+
14
+ **分析日期:** [YYYY-MM-DD]
15
+
16
+ ## 模式概览
17
+
18
+ **整体:** [模式名称:例如 "单体 CLI"、"Serverless API"、"全栈 MVC"]
19
+
20
+ **关键特征:**
21
+ - [特征 1:例如 "单一可执行文件"]
22
+ - [特征 2:例如 "无状态请求处理"]
23
+ - [特征 3:例如 "事件驱动"]
24
+
25
+ ## 分层
26
+
27
+ [描述概念层及其职责]
28
+
29
+ **[层名称]:**
30
+ - 用途:[这一层做什么]
31
+ - 包含:[代码类型:例如 "路由处理器"、"业务逻辑"]
32
+ - 依赖:[使用什么:例如 "仅数据层"]
33
+ - 被使用:[什么使用它:例如 "API 路由"]
34
+
35
+ **[层名称]:**
36
+ - 用途:[这一层做什么]
37
+ - 包含:[代码类型]
38
+ - 依赖:[使用什么]
39
+ - 被使用:[什么使用它]
40
+
41
+ ## 数据流
42
+
43
+ [描述典型的请求/执行生命周期]
44
+
45
+ **[流程名称](例如 "HTTP 请求"、"CLI 命令"、"事件处理"):**
46
+
47
+ 1. [入口点:例如 "用户运行命令"]
48
+ 2. [处理步骤:例如 "路由器匹配路径"]
49
+ 3. [处理步骤:例如 "控制器验证输入"]
50
+ 4. [处理步骤:例如 "服务执行逻辑"]
51
+ 5. [输出:例如 "返回响应"]
52
+
53
+ **状态管理:**
54
+ - [状态如何处理:例如 "无状态 - 无持久状态"、"每请求数据库"、"内存缓存"]
55
+
56
+ ## 关键抽象
57
+
58
+ [整个代码库中使用的核心概念/模式]
59
+
60
+ **[抽象名称]:**
61
+ - 用途:[它代表什么]
62
+ - 示例:[例如 "UserService、ProjectService"]
63
+ - 模式:[例如 "单例"、"工厂"、"仓储"]
64
+
65
+ **[抽象名称]:**
66
+ - 用途:[它代表什么]
67
+ - 示例:[具体示例]
68
+ - 模式:[使用的模式]
69
+
70
+ ## 入口点
71
+
72
+ [执行从哪里开始]
73
+
74
+ **[入口点]:**
75
+ - 位置:[简述:例如 "src/index.ts"、"API Gateway 触发"]
76
+ - 触发方式:[什么调用它:例如 "CLI 调用"、"HTTP 请求"]
77
+ - 职责:[它做什么:例如 "解析参数,路由到命令"]
78
+
79
+ ## 错误处理
80
+
81
+ **策略:** [错误如何处理:例如 "异常冒泡到顶层处理器"、"每路由错误中间件"]
82
+
83
+ **模式:**
84
+ - [模式:例如 "在控制器层 try/catch"]
85
+ - [模式:例如 "向用户返回错误码"]
86
+
87
+ ## 横切关注点
88
+
89
+ [影响多个层的方面]
90
+
91
+ **日志:**
92
+ - [方法:例如 "Winston logger,每请求注入"]
93
+
94
+ **验证:**
95
+ - [方法:例如 "API 边界使用 Zod schema"]
96
+
97
+ **认证:**
98
+ - [方法:例如 "受保护路由使用 JWT 中间件"]
99
+
100
+ ---
101
+
102
+ *架构分析:[date]*
103
+ *主要模式变更时更新*
104
+ ```
105
+
106
+ <good_examples>
107
+ ```markdown
108
+ # 架构
109
+
110
+ **分析日期:** 2025-01-20
111
+
112
+ ## 模式概览
113
+
114
+ **整体:** 带插件系统的 CLI 应用
115
+
116
+ **关键特征:**
117
+ - 带子命令的单一可执行文件
118
+ - 基于插件的可扩展性
119
+ - 基于文件的状态(无数据库)
120
+ - 同步执行模型
121
+
122
+ ## 分层
123
+
124
+ **命令层:**
125
+ - 用途:解析用户输入并路由到适当的处理器
126
+ - 包含:命令定义、参数解析、帮助文本
127
+ - 位置:`src/commands/*.ts`
128
+ - 依赖:服务层提供业务逻辑
129
+ - 被使用:CLI 入口点(`src/index.ts`)
130
+
131
+ **服务层:**
132
+ - 用途:核心业务逻辑
133
+ - 包含:FileService、TemplateService、InstallService
134
+ - 位置:`src/services/*.ts`
135
+ - 依赖:文件系统工具、外部工具
136
+ - 被使用:命令处理器
137
+
138
+ **工具层:**
139
+ - 用途:共享辅助函数和抽象
140
+ - 包含:文件 I/O 封装、路径解析、字符串格式化
141
+ - 位置:`src/utils/*.ts`
142
+ - 依赖:仅 Node.js 内置模块
143
+ - 被使用:服务层
144
+
145
+ ## 数据流
146
+
147
+ **CLI 命令执行:**
148
+
149
+ 1. 用户运行:`specops new-project`
150
+ 2. Commander 解析参数和标志
151
+ 3. 调用命令处理器(`src/commands/new-project.ts`)
152
+ 4. 处理器调用服务方法(`src/services/project.ts` → `create()`)
153
+ 5. 服务读取模板、处理文件、写入输出
154
+ 6. 结果输出到控制台
155
+ 7. 进程以状态码退出
156
+
157
+ **状态管理:**
158
+ - 基于文件:所有状态存放在 `.planning/` 目录
159
+ - 无持久内存状态
160
+ - 每次命令执行独立
161
+
162
+ ## 关键抽象
163
+
164
+ **Service:**
165
+ - 用途:封装某个领域的业务逻辑
166
+ - 示例:`src/services/file.ts`、`src/services/template.ts`、`src/services/project.ts`
167
+ - 模式:类单例(作为模块导入,不实例化)
168
+
169
+ **Command:**
170
+ - 用途:CLI 命令定义
171
+ - 示例:`src/commands/new-project.ts`、`src/commands/plan-phase.ts`
172
+ - 模式:Commander.js 命令注册
173
+
174
+ **Template:**
175
+ - 用途:可复用的文档结构
176
+ - 示例:PROJECT.md、PLAN.md 模板
177
+ - 模式:带替换变量的 Markdown 文件
178
+
179
+ ## 入口点
180
+
181
+ **CLI 入口:**
182
+ - 位置:`src/index.ts`
183
+ - 触发方式:用户运行 `specops <command>`
184
+ - 职责:注册命令、解析参数、显示帮助
185
+
186
+ **命令:**
187
+ - 位置:`src/commands/*.ts`
188
+ - 触发方式:CLI 匹配的命令
189
+ - 职责:验证输入、调用服务、格式化输出
190
+
191
+ ## 错误处理
192
+
193
+ **策略:** 抛出异常,在命令层捕获,记录日志并退出
194
+
195
+ **模式:**
196
+ - 服务抛出带描述性消息的 Error
197
+ - 命令处理器捕获,将错误输出到 stderr,exit(1)
198
+ - 验证错误在执行前显示(快速失败)
199
+
200
+ ## 横切关注点
201
+
202
+ **日志:**
203
+ - Console.log 用于正常输出
204
+ - Console.error 用于错误
205
+ - Chalk 用于彩色输出
206
+
207
+ **验证:**
208
+ - Zod schema 用于配置文件解析
209
+ - 命令处理器中的手动验证
210
+ - 无效输入时快速失败
211
+
212
+ **文件操作:**
213
+ - FileService 对 fs-extra 的抽象
214
+ - 所有路径在操作前验证
215
+ - 原子写入(临时文件 + 重命名)
216
+
217
+ ---
218
+
219
+ *架构分析:2025-01-20*
220
+ *主要模式变更时更新*
221
+ ```
222
+ </good_examples>
223
+
224
+ <guidelines>
225
+ **ARCHITECTURE.md 中应包含的内容:**
226
+ - 整体架构模式(单体、微服务、分层等)
227
+ - 概念层及其关系
228
+ - 数据流/请求生命周期
229
+ - 关键抽象和模式
230
+ - 入口点
231
+ - 错误处理策略
232
+ - 横切关注点(日志、认证、验证)
233
+
234
+ **不应包含的内容:**
235
+ - 详尽的文件列表(那是 STRUCTURE.md 的内容)
236
+ - 技术选型(那是 STACK.md 的内容)
237
+ - 逐行代码走读(参考代码阅读)
238
+ - 特定功能的实现细节
239
+
240
+ **欢迎包含文件路径:**
241
+ 包含文件路径作为抽象的具体示例。使用反引号格式:`src/services/user.ts`。这使架构文档在 Claude 规划时可操作。
242
+
243
+ **填写此模板时:**
244
+ - 阅读主入口点(index、server、main)
245
+ - 通过阅读导入/依赖识别分层
246
+ - 追踪典型的请求/命令执行流程
247
+ - 记录反复出现的模式(services、controllers、repositories)
248
+ - 保持描述在概念层面,而非机械层面
249
+
250
+ **在阶段规划中的用途:**
251
+ - 添加新功能时(它适合哪一层?)
252
+ - 重构时(了解当前模式)
253
+ - 识别代码放置位置(哪一层处理 X?)
254
+ - 了解组件之间的依赖关系
255
+ </guidelines>
@@ -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>