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,248 @@
|
|
|
1
|
+
# 总结模板
|
|
2
|
+
|
|
3
|
+
`.planning/phases/XX-name/{phase}-{plan}-SUMMARY.md` 的模板,用于阶段完成文档。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 文件模板
|
|
8
|
+
|
|
9
|
+
```markdown
|
|
10
|
+
---
|
|
11
|
+
phase: XX-name
|
|
12
|
+
plan: YY
|
|
13
|
+
subsystem: [主要类别: auth, payments, ui, api, database, infra, testing 等]
|
|
14
|
+
tags: [可搜索的技术标签: jwt, stripe, react, postgres, prisma]
|
|
15
|
+
|
|
16
|
+
# 依赖图
|
|
17
|
+
requires:
|
|
18
|
+
- phase: [依赖的前置阶段]
|
|
19
|
+
provides: [该阶段构建的、本阶段使用的内容]
|
|
20
|
+
provides:
|
|
21
|
+
- [本阶段构建/交付内容的列表]
|
|
22
|
+
affects: [需要此上下文的阶段名称或关键词列表]
|
|
23
|
+
|
|
24
|
+
# 技术追踪
|
|
25
|
+
tech-stack:
|
|
26
|
+
added: [本阶段新增的库/工具]
|
|
27
|
+
patterns: [建立的架构/代码模式]
|
|
28
|
+
|
|
29
|
+
key-files:
|
|
30
|
+
created: [创建的重要文件]
|
|
31
|
+
modified: [修改的重要文件]
|
|
32
|
+
|
|
33
|
+
key-decisions:
|
|
34
|
+
- "决策 1"
|
|
35
|
+
- "决策 2"
|
|
36
|
+
|
|
37
|
+
patterns-established:
|
|
38
|
+
- "模式 1: 描述"
|
|
39
|
+
- "模式 2: 描述"
|
|
40
|
+
|
|
41
|
+
requirements-completed: [] # 必填 — 从本计划 `requirements` frontmatter 字段复制所有需求 ID。
|
|
42
|
+
|
|
43
|
+
# 指标
|
|
44
|
+
duration: X分钟
|
|
45
|
+
completed: YYYY-MM-DD
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
# 阶段 [X]: [名称] 总结
|
|
49
|
+
|
|
50
|
+
**[描述成果的实质性一句话 — 不要写 "阶段完成" 或 "实现完毕"]**
|
|
51
|
+
|
|
52
|
+
## 执行表现
|
|
53
|
+
|
|
54
|
+
- **耗时:** [时间] (如 23 分钟, 1小时15分)
|
|
55
|
+
- **开始:** [ISO 时间戳]
|
|
56
|
+
- **完成:** [ISO 时间戳]
|
|
57
|
+
- **任务:** [完成数量]
|
|
58
|
+
- **修改文件:** [数量]
|
|
59
|
+
|
|
60
|
+
## 完成事项
|
|
61
|
+
- [最重要的成果]
|
|
62
|
+
- [第二个关键成果]
|
|
63
|
+
- [第三个(如适用)]
|
|
64
|
+
|
|
65
|
+
## 任务提交
|
|
66
|
+
|
|
67
|
+
每个任务独立原子提交:
|
|
68
|
+
|
|
69
|
+
1. **任务 1: [任务名称]** - `abc123f` (feat/fix/test/refactor)
|
|
70
|
+
2. **任务 2: [任务名称]** - `def456g` (feat/fix/test/refactor)
|
|
71
|
+
3. **任务 3: [任务名称]** - `hij789k` (feat/fix/test/refactor)
|
|
72
|
+
|
|
73
|
+
**计划元数据:** `lmn012o` (docs: 完成计划)
|
|
74
|
+
|
|
75
|
+
_注意: TDD 任务可能有多次提交 (test → feat → refactor)_
|
|
76
|
+
|
|
77
|
+
## 创建/修改的文件
|
|
78
|
+
- `path/to/file.ts` - 功能说明
|
|
79
|
+
- `path/to/another.ts` - 功能说明
|
|
80
|
+
|
|
81
|
+
## 做出的决策
|
|
82
|
+
[关键决策及简要理由,或 "无偏差,按计划执行"]
|
|
83
|
+
|
|
84
|
+
## 计划偏差
|
|
85
|
+
|
|
86
|
+
[如果无偏差: "无偏差,完全按计划执行"]
|
|
87
|
+
|
|
88
|
+
[如果有偏差:]
|
|
89
|
+
|
|
90
|
+
### 自动修复的问题
|
|
91
|
+
|
|
92
|
+
**1. [规则 X - 类别] 简要描述**
|
|
93
|
+
- **发现于:** 任务 [N] ([任务名称])
|
|
94
|
+
- **问题:** [什么问题]
|
|
95
|
+
- **修复:** [做了什么]
|
|
96
|
+
- **修改文件:** [文件路径]
|
|
97
|
+
- **验证:** [如何验证]
|
|
98
|
+
- **提交于:** [hash] (任务提交的一部分)
|
|
99
|
+
|
|
100
|
+
[... 每个自动修复重复 ...]
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
**总偏差:** [N] 个自动修复 ([按规则分类])
|
|
105
|
+
**对计划的影响:** [简要评估 — 如 "所有自动修复对正确性/安全性必要。无范围蔓延。"]
|
|
106
|
+
|
|
107
|
+
## 遇到的问题
|
|
108
|
+
[问题及解决方式,或 "无"]
|
|
109
|
+
|
|
110
|
+
[注意: "计划偏差" 记录通过偏差规则自动处理的计划外工作。"遇到的问题" 记录计划内工作中需要解决的问题。]
|
|
111
|
+
|
|
112
|
+
## 用户设置要求
|
|
113
|
+
|
|
114
|
+
[如果生成了 USER-SETUP.md:]
|
|
115
|
+
**外部服务需要手动配置。** 参见 [{phase}-USER-SETUP.md](./{phase}-USER-SETUP.md):
|
|
116
|
+
- 需要添加的环境变量
|
|
117
|
+
- 控制台配置步骤
|
|
118
|
+
- 验证命令
|
|
119
|
+
|
|
120
|
+
[如果没有 USER-SETUP.md:]
|
|
121
|
+
无需用户设置,不涉及外部服务配置。
|
|
122
|
+
|
|
123
|
+
## 下一阶段准备
|
|
124
|
+
[为下一阶段准备好了什么]
|
|
125
|
+
[阻塞或关注点]
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
*阶段: XX-name*
|
|
129
|
+
*完成时间: [日期]*
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
<frontmatter_guidance>
|
|
133
|
+
**用途:** 通过依赖图实现自动上下文组装。Frontmatter 使总结元数据可机器读取,让 plan-phase 能快速扫描所有总结并根据依赖关系选择相关内容。
|
|
134
|
+
|
|
135
|
+
**快速扫描:** Frontmatter 在前 ~25 行,跨所有总结扫描成本低,无需读取完整内容。
|
|
136
|
+
|
|
137
|
+
**依赖图:** `requires`/`provides`/`affects` 在阶段间创建显式链接,支持传递闭包的上下文选择。
|
|
138
|
+
|
|
139
|
+
**子系统:** 主要分类 (auth, payments, ui, api, database, infra, testing) 用于检测相关阶段。
|
|
140
|
+
|
|
141
|
+
**标签:** 可搜索的技术关键词 (库、框架、工具) 用于技术栈感知。
|
|
142
|
+
|
|
143
|
+
**关键文件:** 重要文件用于 PLAN.md 中的 @context 引用。
|
|
144
|
+
|
|
145
|
+
**模式:** 已建立的约定,未来阶段应保持。
|
|
146
|
+
|
|
147
|
+
**填充:** Frontmatter 在 execute-plan.md 的总结创建阶段填充。参见 `<step name="create_summary">` 获取逐字段指导。
|
|
148
|
+
</frontmatter_guidance>
|
|
149
|
+
|
|
150
|
+
<one_liner_rules>
|
|
151
|
+
一句话描述必须有实质内容:
|
|
152
|
+
|
|
153
|
+
**好的:**
|
|
154
|
+
- "使用 jose 库实现 JWT 认证及刷新令牌轮换"
|
|
155
|
+
- "Prisma schema 含 User, Session 和 Product 模型"
|
|
156
|
+
- "通过 Server-Sent Events 实现实时指标的仪表盘"
|
|
157
|
+
|
|
158
|
+
**差的:**
|
|
159
|
+
- "阶段完成"
|
|
160
|
+
- "认证已实现"
|
|
161
|
+
- "基础完毕"
|
|
162
|
+
- "所有任务完成"
|
|
163
|
+
|
|
164
|
+
一句话应该告诉别人实际交付了什么。
|
|
165
|
+
</one_liner_rules>
|
|
166
|
+
|
|
167
|
+
<example>
|
|
168
|
+
```markdown
|
|
169
|
+
# 阶段 1: 基础 总结
|
|
170
|
+
|
|
171
|
+
**使用 jose 库实现 JWT 认证及刷新令牌轮换,Prisma User 模型,以及受保护的 API 中间件**
|
|
172
|
+
|
|
173
|
+
## 执行表现
|
|
174
|
+
|
|
175
|
+
- **耗时:** 28 分钟
|
|
176
|
+
- **开始:** 2025-01-15T14:22:10Z
|
|
177
|
+
- **完成:** 2025-01-15T14:50:33Z
|
|
178
|
+
- **任务:** 5
|
|
179
|
+
- **修改文件:** 8
|
|
180
|
+
|
|
181
|
+
## 完成事项
|
|
182
|
+
- 含邮箱/密码认证的 User 模型
|
|
183
|
+
- 使用 httpOnly JWT cookie 的登录/登出端点
|
|
184
|
+
- 检查令牌有效性的受保护路由中间件
|
|
185
|
+
- 每次请求时的刷新令牌轮换
|
|
186
|
+
|
|
187
|
+
## 创建/修改的文件
|
|
188
|
+
- `prisma/schema.prisma` - User 和 Session 模型
|
|
189
|
+
- `src/app/api/auth/login/route.ts` - 登录端点
|
|
190
|
+
- `src/app/api/auth/logout/route.ts` - 登出端点
|
|
191
|
+
- `src/middleware.ts` - 受保护路由检查
|
|
192
|
+
- `src/lib/auth.ts` - 使用 jose 的 JWT 工具函数
|
|
193
|
+
|
|
194
|
+
## 做出的决策
|
|
195
|
+
- 使用 jose 而非 jsonwebtoken (ESM 原生, Edge 兼容)
|
|
196
|
+
- 15 分钟访问令牌配合 7 天刷新令牌
|
|
197
|
+
- 将刷新令牌存储在数据库中以支持撤销
|
|
198
|
+
|
|
199
|
+
## 计划偏差
|
|
200
|
+
|
|
201
|
+
### 自动修复的问题
|
|
202
|
+
|
|
203
|
+
**1. [规则 2 - 缺失关键项] 添加 bcrypt 密码哈希**
|
|
204
|
+
- **发现于:** 任务 2 (登录端点实现)
|
|
205
|
+
- **问题:** 计划未指定密码哈希,存储明文将是严重安全漏洞
|
|
206
|
+
- **修复:** 注册时添加 bcrypt 哈希,登录时比对,salt rounds 10
|
|
207
|
+
- **修改文件:** src/app/api/auth/login/route.ts, src/lib/auth.ts
|
|
208
|
+
- **验证:** 密码哈希测试通过,明文从未存储
|
|
209
|
+
- **提交于:** abc123f (任务 2 提交)
|
|
210
|
+
|
|
211
|
+
**2. [规则 3 - 阻塞] 安装缺失的 jose 依赖**
|
|
212
|
+
- **发现于:** 任务 4 (JWT 令牌生成)
|
|
213
|
+
- **问题:** jose 包不在 package.json 中,导入失败
|
|
214
|
+
- **修复:** 运行 `npm install jose`
|
|
215
|
+
- **修改文件:** package.json, package-lock.json
|
|
216
|
+
- **验证:** 导入成功,构建通过
|
|
217
|
+
- **提交于:** def456g (任务 4 提交)
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
**总偏差:** 2 个自动修复 (1 个缺失关键项, 1 个阻塞)
|
|
222
|
+
**对计划的影响:** 两个自动修复对安全性和功能性都是必要的。无范围蔓延。
|
|
223
|
+
|
|
224
|
+
## 遇到的问题
|
|
225
|
+
- jsonwebtoken 的 CommonJS 导入在 Edge 运行时失败,切换到 jose (计划中的库变更,按预期工作)
|
|
226
|
+
|
|
227
|
+
## 下一阶段准备
|
|
228
|
+
- 认证基础完成,可以开始功能开发
|
|
229
|
+
- 公开发布前需要用户注册端点
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
*阶段: 01-foundation*
|
|
233
|
+
*完成时间: 2025-01-15*
|
|
234
|
+
```
|
|
235
|
+
</example>
|
|
236
|
+
|
|
237
|
+
<guidelines>
|
|
238
|
+
**Frontmatter:** 必填,完成所有字段。支持未来规划的自动上下文组装。
|
|
239
|
+
|
|
240
|
+
**一句话:** 必须有实质内容。"使用 jose 库实现 JWT 认证及刷新令牌轮换" 而非 "认证已实现"。
|
|
241
|
+
|
|
242
|
+
**决策部分:**
|
|
243
|
+
- 执行期间做出的关键决策及理由
|
|
244
|
+
- 提取到 STATE.md 的累积上下文
|
|
245
|
+
- 如无偏差使用 "无偏差,按计划执行"
|
|
246
|
+
|
|
247
|
+
**创建后:** STATE.md 更新位置、决策、问题。
|
|
248
|
+
</guidelines>
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
# 用户设置模板
|
|
2
|
+
|
|
3
|
+
`.planning/phases/XX-name/{phase}-USER-SETUP.md` 的模板,记录 Claude 无法自动化的、需要人工操作的配置。
|
|
4
|
+
|
|
5
|
+
**用途:** 记录确实需要人工操作的设置任务,包括账户创建、控制台配置、密钥获取。Claude 会自动化一切可能的操作;此文件只记录剩余的人工任务。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 文件模板
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
# 阶段 {X}: 需要用户设置
|
|
13
|
+
|
|
14
|
+
**生成时间:** [YYYY-MM-DD]
|
|
15
|
+
**阶段:** {phase-name}
|
|
16
|
+
**状态:** 未完成
|
|
17
|
+
|
|
18
|
+
完成以下项目以使集成正常工作。Claude 已自动化所有可能的操作;这些项目需要人工访问外部控制台/账户。
|
|
19
|
+
|
|
20
|
+
## 环境变量
|
|
21
|
+
|
|
22
|
+
| 状态 | 变量 | 来源 | 添加到 |
|
|
23
|
+
|------|------|------|--------|
|
|
24
|
+
| [ ] | `ENV_VAR_NAME` | [服务控制台 → 路径 → 到 → 值] | `.env.local` |
|
|
25
|
+
| [ ] | `ANOTHER_VAR` | [服务控制台 → 路径 → 到 → 值] | `.env.local` |
|
|
26
|
+
|
|
27
|
+
## 账户设置
|
|
28
|
+
|
|
29
|
+
[仅在需要创建新账户时填写]
|
|
30
|
+
|
|
31
|
+
- [ ] **创建 [服务] 账户**
|
|
32
|
+
- URL: [注册 URL]
|
|
33
|
+
- 跳过条件: 已有账户
|
|
34
|
+
|
|
35
|
+
## 控制台配置
|
|
36
|
+
|
|
37
|
+
[仅在需要控制台配置时填写]
|
|
38
|
+
|
|
39
|
+
- [ ] **[配置任务]**
|
|
40
|
+
- 位置: [服务控制台 → 路径 → 到 → 设置]
|
|
41
|
+
- 设置为: [所需值或配置]
|
|
42
|
+
- 备注: [重要细节]
|
|
43
|
+
|
|
44
|
+
## 验证
|
|
45
|
+
|
|
46
|
+
完成设置后,用以下命令验证:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# [验证命令]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
预期结果:
|
|
53
|
+
- [成功的表现]
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
**所有项目完成后:** 将文件顶部状态标记为 "已完成"。
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## 何时生成
|
|
63
|
+
|
|
64
|
+
当计划 frontmatter 包含 `user_setup` 字段时生成 `{phase}-USER-SETUP.md`。
|
|
65
|
+
|
|
66
|
+
**触发条件:** PLAN.md frontmatter 中存在 `user_setup` 且有内容。
|
|
67
|
+
|
|
68
|
+
**位置:** 与 PLAN.md 和 SUMMARY.md 同目录。
|
|
69
|
+
|
|
70
|
+
**时机:** 在 execute-plan.md 中任务完成后、SUMMARY.md 创建前生成。
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Frontmatter 结构
|
|
75
|
+
|
|
76
|
+
在 PLAN.md 中,`user_setup` 声明需要人工操作的配置:
|
|
77
|
+
|
|
78
|
+
```yaml
|
|
79
|
+
user_setup:
|
|
80
|
+
- service: stripe
|
|
81
|
+
why: "支付处理需要 API 密钥"
|
|
82
|
+
env_vars:
|
|
83
|
+
- name: STRIPE_SECRET_KEY
|
|
84
|
+
source: "Stripe 控制台 → Developers → API keys → Secret key"
|
|
85
|
+
- name: STRIPE_WEBHOOK_SECRET
|
|
86
|
+
source: "Stripe 控制台 → Developers → Webhooks → Signing secret"
|
|
87
|
+
dashboard_config:
|
|
88
|
+
- task: "创建 webhook 端点"
|
|
89
|
+
location: "Stripe 控制台 → Developers → Webhooks → Add endpoint"
|
|
90
|
+
details: "URL: https://[your-domain]/api/webhooks/stripe, Events: checkout.session.completed, customer.subscription.*"
|
|
91
|
+
local_dev:
|
|
92
|
+
- "运行: stripe listen --forward-to localhost:3000/api/webhooks/stripe"
|
|
93
|
+
- "使用 CLI 输出的 webhook secret 进行本地测试"
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 自动化优先原则
|
|
99
|
+
|
|
100
|
+
**USER-SETUP.md 只包含 Claude 确实无法完成的操作。**
|
|
101
|
+
|
|
102
|
+
| Claude 能做的(不在 USER-SETUP 中) | Claude 不能做的(→ USER-SETUP) |
|
|
103
|
+
|--------------------------------------|--------------------------------|
|
|
104
|
+
| `npm install stripe` | 创建 Stripe 账户 |
|
|
105
|
+
| 编写 webhook 处理代码 | 从控制台获取 API 密钥 |
|
|
106
|
+
| 创建 `.env.local` 文件结构 | 复制实际的密钥值 |
|
|
107
|
+
| 运行 `stripe listen` | 认证 Stripe CLI (浏览器 OAuth) |
|
|
108
|
+
| 配置 package.json | 访问外部服务控制台 |
|
|
109
|
+
| 编写任何代码 | 从第三方系统获取密钥 |
|
|
110
|
+
|
|
111
|
+
**判断标准:** "这是否需要人工在浏览器中操作,访问 Claude 没有凭据的账户?"
|
|
112
|
+
- 是 → USER-SETUP.md
|
|
113
|
+
- 否 → Claude 自动完成
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 服务示例
|
|
118
|
+
|
|
119
|
+
<stripe_example>
|
|
120
|
+
```markdown
|
|
121
|
+
# 阶段 10: 需要用户设置
|
|
122
|
+
|
|
123
|
+
**生成时间:** 2025-01-14
|
|
124
|
+
**阶段:** 10-monetization
|
|
125
|
+
**状态:** 未完成
|
|
126
|
+
|
|
127
|
+
完成以下项目以使 Stripe 集成正常工作。
|
|
128
|
+
|
|
129
|
+
## 环境变量
|
|
130
|
+
|
|
131
|
+
| 状态 | 变量 | 来源 | 添加到 |
|
|
132
|
+
|------|------|------|--------|
|
|
133
|
+
| [ ] | `STRIPE_SECRET_KEY` | Stripe 控制台 → Developers → API keys → Secret key | `.env.local` |
|
|
134
|
+
| [ ] | `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY` | Stripe 控制台 → Developers → API keys → Publishable key | `.env.local` |
|
|
135
|
+
| [ ] | `STRIPE_WEBHOOK_SECRET` | Stripe 控制台 → Developers → Webhooks → [端点] → Signing secret | `.env.local` |
|
|
136
|
+
|
|
137
|
+
## 账户设置
|
|
138
|
+
|
|
139
|
+
- [ ] **创建 Stripe 账户** (如需要)
|
|
140
|
+
- URL: https://dashboard.stripe.com/register
|
|
141
|
+
- 跳过条件: 已有 Stripe 账户
|
|
142
|
+
|
|
143
|
+
## 控制台配置
|
|
144
|
+
|
|
145
|
+
- [ ] **创建 webhook 端点**
|
|
146
|
+
- 位置: Stripe 控制台 → Developers → Webhooks → Add endpoint
|
|
147
|
+
- 端点 URL: `https://[your-domain]/api/webhooks/stripe`
|
|
148
|
+
- 需要发送的事件:
|
|
149
|
+
- `checkout.session.completed`
|
|
150
|
+
- `customer.subscription.created`
|
|
151
|
+
- `customer.subscription.updated`
|
|
152
|
+
- `customer.subscription.deleted`
|
|
153
|
+
|
|
154
|
+
- [ ] **创建产品和价格** (如使用订阅层级)
|
|
155
|
+
- 位置: Stripe 控制台 → Products → Add product
|
|
156
|
+
- 创建每个订阅层级
|
|
157
|
+
- 复制 Price ID 到:
|
|
158
|
+
- `STRIPE_STARTER_PRICE_ID`
|
|
159
|
+
- `STRIPE_PRO_PRICE_ID`
|
|
160
|
+
|
|
161
|
+
## 本地开发
|
|
162
|
+
|
|
163
|
+
本地 webhook 测试:
|
|
164
|
+
```bash
|
|
165
|
+
stripe listen --forward-to localhost:3000/api/webhooks/stripe
|
|
166
|
+
```
|
|
167
|
+
使用 CLI 输出的 webhook signing secret (以 `whsec_` 开头)。
|
|
168
|
+
|
|
169
|
+
## 验证
|
|
170
|
+
|
|
171
|
+
完成设置后:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# 检查环境变量已设置
|
|
175
|
+
grep STRIPE .env.local
|
|
176
|
+
|
|
177
|
+
# 验证构建通过
|
|
178
|
+
npm run build
|
|
179
|
+
|
|
180
|
+
# 测试 webhook 端点 (应返回 400 签名错误,而非 500 崩溃)
|
|
181
|
+
curl -X POST http://localhost:3000/api/webhooks/stripe \
|
|
182
|
+
-H "Content-Type: application/json" \
|
|
183
|
+
-d '{}'
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
预期: 构建通过,webhook 返回 400 (签名验证正常工作)。
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
**所有项目完成后:** 将文件顶部状态标记为 "已完成"。
|
|
191
|
+
```
|
|
192
|
+
</stripe_example>
|
|
193
|
+
|
|
194
|
+
<supabase_example>
|
|
195
|
+
```markdown
|
|
196
|
+
# 阶段 2: 需要用户设置
|
|
197
|
+
|
|
198
|
+
**生成时间:** 2025-01-14
|
|
199
|
+
**阶段:** 02-authentication
|
|
200
|
+
**状态:** 未完成
|
|
201
|
+
|
|
202
|
+
完成以下项目以使 Supabase Auth 正常工作。
|
|
203
|
+
|
|
204
|
+
## 环境变量
|
|
205
|
+
|
|
206
|
+
| 状态 | 变量 | 来源 | 添加到 |
|
|
207
|
+
|------|------|------|--------|
|
|
208
|
+
| [ ] | `NEXT_PUBLIC_SUPABASE_URL` | Supabase 控制台 → Settings → API → Project URL | `.env.local` |
|
|
209
|
+
| [ ] | `NEXT_PUBLIC_SUPABASE_ANON_KEY` | Supabase 控制台 → Settings → API → anon public | `.env.local` |
|
|
210
|
+
| [ ] | `SUPABASE_SERVICE_ROLE_KEY` | Supabase 控制台 → Settings → API → service_role | `.env.local` |
|
|
211
|
+
|
|
212
|
+
## 账户设置
|
|
213
|
+
|
|
214
|
+
- [ ] **创建 Supabase 项目**
|
|
215
|
+
- URL: https://supabase.com/dashboard/new
|
|
216
|
+
- 跳过条件: 已有此应用的项目
|
|
217
|
+
|
|
218
|
+
## 控制台配置
|
|
219
|
+
|
|
220
|
+
- [ ] **启用邮箱认证**
|
|
221
|
+
- 位置: Supabase 控制台 → Authentication → Providers
|
|
222
|
+
- 启用: Email provider
|
|
223
|
+
- 配置: 确认邮件 (根据偏好开启/关闭)
|
|
224
|
+
|
|
225
|
+
- [ ] **配置 OAuth 提供商** (如使用社交登录)
|
|
226
|
+
- 位置: Supabase 控制台 → Authentication → Providers
|
|
227
|
+
- Google: 添加来自 Google Cloud Console 的 Client ID 和 Secret
|
|
228
|
+
- GitHub: 添加来自 GitHub OAuth Apps 的 Client ID 和 Secret
|
|
229
|
+
|
|
230
|
+
## 验证
|
|
231
|
+
|
|
232
|
+
完成设置后:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
# 检查环境变量
|
|
236
|
+
grep SUPABASE .env.local
|
|
237
|
+
|
|
238
|
+
# 验证连接 (在项目目录中运行)
|
|
239
|
+
npx supabase status
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
**所有项目完成后:** 将文件顶部状态标记为 "已完成"。
|
|
245
|
+
```
|
|
246
|
+
</supabase_example>
|
|
247
|
+
|
|
248
|
+
<sendgrid_example>
|
|
249
|
+
```markdown
|
|
250
|
+
# 阶段 5: 需要用户设置
|
|
251
|
+
|
|
252
|
+
**生成时间:** 2025-01-14
|
|
253
|
+
**阶段:** 05-notifications
|
|
254
|
+
**状态:** 未完成
|
|
255
|
+
|
|
256
|
+
完成以下项目以使 SendGrid 邮件正常工作。
|
|
257
|
+
|
|
258
|
+
## 环境变量
|
|
259
|
+
|
|
260
|
+
| 状态 | 变量 | 来源 | 添加到 |
|
|
261
|
+
|------|------|------|--------|
|
|
262
|
+
| [ ] | `SENDGRID_API_KEY` | SendGrid 控制台 → Settings → API Keys → Create API Key | `.env.local` |
|
|
263
|
+
| [ ] | `SENDGRID_FROM_EMAIL` | 你的已验证发件人邮箱地址 | `.env.local` |
|
|
264
|
+
|
|
265
|
+
## 账户设置
|
|
266
|
+
|
|
267
|
+
- [ ] **创建 SendGrid 账户**
|
|
268
|
+
- URL: https://signup.sendgrid.com/
|
|
269
|
+
- 跳过条件: 已有账户
|
|
270
|
+
|
|
271
|
+
## 控制台配置
|
|
272
|
+
|
|
273
|
+
- [ ] **验证发件人身份**
|
|
274
|
+
- 位置: SendGrid 控制台 → Settings → Sender Authentication
|
|
275
|
+
- 选项 1: 单一发件人验证 (快速,适合开发)
|
|
276
|
+
- 选项 2: 域名认证 (生产环境)
|
|
277
|
+
|
|
278
|
+
- [ ] **创建 API Key**
|
|
279
|
+
- 位置: SendGrid 控制台 → Settings → API Keys → Create API Key
|
|
280
|
+
- 权限: Restricted Access → Mail Send (Full Access)
|
|
281
|
+
- 立即复制密钥 (只显示一次)
|
|
282
|
+
|
|
283
|
+
## 验证
|
|
284
|
+
|
|
285
|
+
完成设置后:
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
# 检查环境变量
|
|
289
|
+
grep SENDGRID .env.local
|
|
290
|
+
|
|
291
|
+
# 测试邮件发送 (替换为你的测试邮箱)
|
|
292
|
+
curl -X POST http://localhost:3000/api/test-email \
|
|
293
|
+
-H "Content-Type: application/json" \
|
|
294
|
+
-d '{"to": "your@email.com"}'
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
**所有项目完成后:** 将文件顶部状态标记为 "已完成"。
|
|
300
|
+
```
|
|
301
|
+
</sendgrid_example>
|
|
302
|
+
|
|
303
|
+
---
|
|
304
|
+
|
|
305
|
+
## 指南
|
|
306
|
+
|
|
307
|
+
**绝不包含:** 实际的密钥值。Claude 能自动化的步骤(包安装、代码修改)。
|
|
308
|
+
|
|
309
|
+
**命名:** `{phase}-USER-SETUP.md` 匹配阶段编号模式。
|
|
310
|
+
**状态追踪:** 用户勾选复选框并在完成后更新状态行。
|
|
311
|
+
**可搜索性:** `grep -r "USER-SETUP" .planning/` 可找到所有需要用户操作的阶段。
|