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,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>
@@ -0,0 +1,280 @@
1
+ # 外部集成模板
2
+
3
+ `.planning/codebase/INTEGRATIONS.md` 的模板 - 记录外部服务依赖。
4
+
5
+ **用途:** 记录本代码库与哪些外部系统通信。聚焦于"我们代码之外依赖的东西"。
6
+
7
+ ---
8
+
9
+ ## 文件模板
10
+
11
+ ```markdown
12
+ # 外部集成
13
+
14
+ **分析日期:** [YYYY-MM-DD]
15
+
16
+ ## API 与外部服务
17
+
18
+ **支付处理:**
19
+ - [服务] - [用途:例如 "订阅计费、一次性支付"]
20
+ - SDK/客户端:[例如 "stripe npm 包 v14.x"]
21
+ - 认证:[例如 "STRIPE_SECRET_KEY 环境变量中的 API 密钥"]
22
+ - 使用的端点:[例如 "checkout sessions、webhooks"]
23
+
24
+ **邮件/短信:**
25
+ - [服务] - [用途:例如 "事务性邮件"]
26
+ - SDK/客户端:[例如 "sendgrid/mail v8.x"]
27
+ - 认证:[例如 "SENDGRID_API_KEY 环境变量中的 API 密钥"]
28
+ - 模板:[例如 "在 SendGrid 仪表板中管理"]
29
+
30
+ **外部 API:**
31
+ - [服务] - [用途]
32
+ - 集成方式:[例如 "通过 fetch 的 REST API"、"GraphQL 客户端"]
33
+ - 认证:[例如 "AUTH_TOKEN 环境变量中的 OAuth2 令牌"]
34
+ - 速率限制:[如适用]
35
+
36
+ ## 数据存储
37
+
38
+ **数据库:**
39
+ - [类型/提供商] - [例如 "Supabase 上的 PostgreSQL"]
40
+ - 连接:[例如 "通过 DATABASE_URL 环境变量"]
41
+ - 客户端:[例如 "Prisma ORM v5.x"]
42
+ - 迁移:[例如 "migrations/ 中的 prisma migrate"]
43
+
44
+ **文件存储:**
45
+ - [服务] - [例如 "AWS S3 用于用户上传"]
46
+ - SDK/客户端:[例如 "@aws-sdk/client-s3"]
47
+ - 认证:[例如 "AWS_* 环境变量中的 IAM 凭证"]
48
+ - 存储桶:[例如 "prod-uploads、dev-uploads"]
49
+
50
+ **缓存:**
51
+ - [服务] - [例如 "Redis 用于会话存储"]
52
+ - 连接:[例如 "REDIS_URL 环境变量"]
53
+ - 客户端:[例如 "ioredis v5.x"]
54
+
55
+ ## 认证与身份
56
+
57
+ **认证提供商:**
58
+ - [服务] - [例如 "Supabase Auth"、"Auth0"、"自定义 JWT"]
59
+ - 实现:[例如 "Supabase 客户端 SDK"]
60
+ - 令牌存储:[例如 "httpOnly cookies"、"localStorage"]
61
+ - 会话管理:[例如 "JWT 刷新令牌"]
62
+
63
+ **OAuth 集成:**
64
+ - [提供商] - [例如 "Google OAuth 用于登录"]
65
+ - 凭证:[例如 "GOOGLE_CLIENT_ID、GOOGLE_CLIENT_SECRET"]
66
+ - 作用域:[例如 "email、profile"]
67
+
68
+ ## 监控与可观测性
69
+
70
+ **错误追踪:**
71
+ - [服务] - [例如 "Sentry"]
72
+ - DSN:[例如 "SENTRY_DSN 环境变量"]
73
+ - 版本追踪:[例如 "通过 SENTRY_RELEASE"]
74
+
75
+ **分析:**
76
+ - [服务] - [例如 "Mixpanel 用于产品分析"]
77
+ - 令牌:[例如 "MIXPANEL_TOKEN 环境变量"]
78
+ - 追踪的事件:[例如 "用户操作、页面浏览"]
79
+
80
+ **日志:**
81
+ - [服务] - [例如 "CloudWatch"、"Datadog"、"无(仅 stdout)"]
82
+ - 集成:[例如 "AWS Lambda 内置"]
83
+
84
+ ## CI/CD 与部署
85
+
86
+ **托管:**
87
+ - [平台] - [例如 "Vercel"、"AWS Lambda"、"ECS 上的 Docker"]
88
+ - 部署:[例如 "main 分支推送时自动部署"]
89
+ - 环境变量:[例如 "在 Vercel 仪表板中配置"]
90
+
91
+ **CI 流水线:**
92
+ - [服务] - [例如 "GitHub Actions"]
93
+ - 工作流:[例如 "test.yml、deploy.yml"]
94
+ - 密钥:[例如 "存储在 GitHub 仓库密钥中"]
95
+
96
+ ## 环境配置
97
+
98
+ **开发环境:**
99
+ - 必需环境变量:[列出关键变量]
100
+ - 密钥位置:[例如 ".env.local(已 gitignore)"、"1Password 保险库"]
101
+ - Mock/桩服务:[例如 "Stripe 测试模式"、"本地 PostgreSQL"]
102
+
103
+ **预发布环境:**
104
+ - 环境特定差异:[例如 "使用预发布 Stripe 账户"]
105
+ - 数据:[例如 "独立的预发布数据库"]
106
+
107
+ **生产环境:**
108
+ - 密钥管理:[例如 "Vercel 环境变量"]
109
+ - 故障转移/冗余:[例如 "多区域数据库复制"]
110
+
111
+ ## Webhook 与回调
112
+
113
+ **入站:**
114
+ - [服务] - [端点:例如 "/api/webhooks/stripe"]
115
+ - 验证:[例如 "通过 stripe.webhooks.constructEvent 进行签名验证"]
116
+ - 事件:[例如 "payment_intent.succeeded、customer.subscription.updated"]
117
+
118
+ **出站:**
119
+ - [服务] - [触发条件]
120
+ - 端点:[例如 "用户注册时的外部 CRM webhook"]
121
+ - 重试逻辑:[如适用]
122
+
123
+ ---
124
+
125
+ *集成审计:[date]*
126
+ *添加/移除外部服务时更新*
127
+ ```
128
+
129
+ <good_examples>
130
+ ```markdown
131
+ # 外部集成
132
+
133
+ **分析日期:** 2025-01-20
134
+
135
+ ## API 与外部服务
136
+
137
+ **支付处理:**
138
+ - Stripe - 订阅计费和一次性课程支付
139
+ - SDK/客户端:stripe npm 包 v14.8
140
+ - 认证:STRIPE_SECRET_KEY 环境变量中的 API 密钥
141
+ - 使用的端点:checkout sessions、customer portal、webhooks
142
+
143
+ **邮件/短信:**
144
+ - SendGrid - 事务性邮件(收据、密码重置)
145
+ - SDK/客户端:@sendgrid/mail v8.1
146
+ - 认证:SENDGRID_API_KEY 环境变量中的 API 密钥
147
+ - 模板:在 SendGrid 仪表板中管理(模板 ID 在代码中)
148
+
149
+ **外部 API:**
150
+ - OpenAI API - 课程内容生成
151
+ - 集成方式:通过 openai npm 包 v4.x 的 REST API
152
+ - 认证:OPENAI_API_KEY 环境变量中的 Bearer 令牌
153
+ - 速率限制:3500 请求/分钟(tier 3)
154
+
155
+ ## 数据存储
156
+
157
+ **数据库:**
158
+ - Supabase 上的 PostgreSQL - 主数据存储
159
+ - 连接:通过 DATABASE_URL 环境变量
160
+ - 客户端:Prisma ORM v5.8
161
+ - 迁移:prisma/migrations/ 中的 prisma migrate
162
+
163
+ **文件存储:**
164
+ - Supabase Storage - 用户上传(头像、课程材料)
165
+ - SDK/客户端:@supabase/supabase-js v2.x
166
+ - 认证:SUPABASE_SERVICE_ROLE_KEY 中的服务角色密钥
167
+ - 存储桶:avatars(公开)、course-materials(私有)
168
+
169
+ **缓存:**
170
+ - 当前无(所有数据库查询,无 Redis)
171
+
172
+ ## 认证与身份
173
+
174
+ **认证提供商:**
175
+ - Supabase Auth - 邮箱/密码 + OAuth
176
+ - 实现:Supabase 客户端 SDK,服务端会话管理
177
+ - 令牌存储:通过 @supabase/ssr 的 httpOnly cookies
178
+ - 会话管理:Supabase 处理的 JWT 刷新令牌
179
+
180
+ **OAuth 集成:**
181
+ - Google OAuth - 社交登录
182
+ - 凭证:GOOGLE_CLIENT_ID、GOOGLE_CLIENT_SECRET(Supabase 仪表板)
183
+ - 作用域:email、profile
184
+
185
+ ## 监控与可观测性
186
+
187
+ **错误追踪:**
188
+ - Sentry - 服务端和客户端错误
189
+ - DSN:SENTRY_DSN 环境变量
190
+ - 版本追踪:通过 SENTRY_RELEASE 的 Git commit SHA
191
+
192
+ **分析:**
193
+ - 无(计划中:Mixpanel)
194
+
195
+ **日志:**
196
+ - Vercel 日志 - 仅 stdout/stderr
197
+ - 保留期:Pro 计划 7 天
198
+
199
+ ## CI/CD 与部署
200
+
201
+ **托管:**
202
+ - Vercel - Next.js 应用托管
203
+ - 部署:main 分支推送时自动部署
204
+ - 环境变量:在 Vercel 仪表板中配置(同步到 .env.example)
205
+
206
+ **CI 流水线:**
207
+ - GitHub Actions - 测试和类型检查
208
+ - 工作流:.github/workflows/ci.yml
209
+ - 密钥:不需要(仅公开仓库测试)
210
+
211
+ ## 环境配置
212
+
213
+ **开发环境:**
214
+ - 必需环境变量:DATABASE_URL、NEXT_PUBLIC_SUPABASE_URL、NEXT_PUBLIC_SUPABASE_ANON_KEY
215
+ - 密钥位置:.env.local(已 gitignore),团队通过 1Password 保险库共享
216
+ - Mock/桩服务:Stripe 测试模式、Supabase 本地开发项目
217
+
218
+ **预发布环境:**
219
+ - 使用独立的 Supabase 预发布项目
220
+ - Stripe 测试模式
221
+ - 同一 Vercel 账户,不同环境
222
+
223
+ **生产环境:**
224
+ - 密钥管理:Vercel 环境变量
225
+ - 数据库:Supabase 生产项目,每日备份
226
+
227
+ ## Webhook 与回调
228
+
229
+ **入站:**
230
+ - Stripe - /api/webhooks/stripe
231
+ - 验证:通过 stripe.webhooks.constructEvent 进行签名验证
232
+ - 事件:payment_intent.succeeded、customer.subscription.updated、customer.subscription.deleted
233
+
234
+ **出站:**
235
+ - 无
236
+
237
+ ---
238
+
239
+ *集成审计:2025-01-20*
240
+ *添加/移除外部服务时更新*
241
+ ```
242
+ </good_examples>
243
+
244
+ <guidelines>
245
+ **INTEGRATIONS.md 中应包含的内容:**
246
+ - 代码通信的外部服务
247
+ - 认证模式(密钥存放位置,而非密钥本身)
248
+ - 使用的 SDK 和客户端库
249
+ - 环境变量名称(而非值)
250
+ - Webhook 端点和验证方法
251
+ - 数据库连接模式
252
+ - 文件存储位置
253
+ - 监控和日志服务
254
+
255
+ **不应包含的内容:**
256
+ - 实际 API 密钥或密钥(绝对不要写入)
257
+ - 内部架构(那是 ARCHITECTURE.md 的内容)
258
+ - 代码模式(那是 PATTERNS.md 的内容)
259
+ - 技术选型(那是 STACK.md 的内容)
260
+ - 性能问题(那是 CONCERNS.md 的内容)
261
+
262
+ **填写此模板时:**
263
+ - 检查 .env.example 或 .env.template 中的必需环境变量
264
+ - 查找 SDK 导入(stripe、@sendgrid/mail 等)
265
+ - 检查路由/端点中的 webhook 处理器
266
+ - 记录密钥管理位置(而非密钥本身)
267
+ - 记录环境特定差异(开发/预发布/生产)
268
+ - 包含每个服务的认证模式
269
+
270
+ **在阶段规划中的用途:**
271
+ - 添加新的外部服务集成
272
+ - 调试认证问题
273
+ - 了解应用外部的数据流
274
+ - 搭建新环境
275
+ - 审计第三方依赖
276
+ - 规划服务中断或迁移
277
+
278
+ **安全提示:**
279
+ 记录密钥存放在哪里(环境变量、Vercel 仪表板、1Password),绝不记录密钥是什么。
280
+ </guidelines>