specwf 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -0
- package/bin/specwf.js +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1800 -0
- package/dist/templates/agents/archiver.md +112 -0
- package/dist/templates/agents/executor.md +125 -0
- package/dist/templates/agents/planner.md +114 -0
- package/dist/templates/agents/researcher.md +104 -0
- package/dist/templates/agents/reviewer.md +98 -0
- package/dist/templates/agents/verifier.md +129 -0
- package/dist/templates/artifacts/context.md +151 -0
- package/dist/templates/artifacts/design.md +224 -0
- package/dist/templates/artifacts/goal-review.md +95 -0
- package/dist/templates/artifacts/project.yml +117 -0
- package/dist/templates/artifacts/proposal.md +124 -0
- package/dist/templates/artifacts/quality-review.md +131 -0
- package/dist/templates/artifacts/research.md +127 -0
- package/dist/templates/artifacts/spec-review.md +84 -0
- package/dist/templates/artifacts/state.md +158 -0
- package/dist/templates/artifacts/summary.md +129 -0
- package/dist/templates/artifacts/tasks.md +109 -0
- package/dist/templates/artifacts/verification.md +113 -0
- package/dist/templates/commands/adhoc.md +38 -0
- package/dist/templates/commands/apply.md +20 -0
- package/dist/templates/commands/archive.md +21 -0
- package/dist/templates/commands/continue.md +27 -0
- package/dist/templates/commands/discuss.md +24 -0
- package/dist/templates/commands/grill.md +24 -0
- package/dist/templates/commands/init.md +20 -0
- package/dist/templates/commands/milestone.md +27 -0
- package/dist/templates/commands/plan.md +22 -0
- package/dist/templates/commands/research-phase.md +20 -0
- package/dist/templates/commands/research.md +24 -0
- package/dist/templates/commands/review.md +20 -0
- package/dist/templates/commands/roadmap.md +23 -0
- package/dist/templates/commands/ship.md +36 -0
- package/dist/templates/commands/split.md +16 -0
- package/dist/templates/commands/verify.md +22 -0
- package/dist/templates/skills/adhoc.md +53 -0
- package/dist/templates/skills/apply.md +134 -0
- package/dist/templates/skills/archive.md +109 -0
- package/dist/templates/skills/continue.md +97 -0
- package/dist/templates/skills/discuss.md +95 -0
- package/dist/templates/skills/grill.md +90 -0
- package/dist/templates/skills/init.md +116 -0
- package/dist/templates/skills/milestone.md +36 -0
- package/dist/templates/skills/plan.md +144 -0
- package/dist/templates/skills/research-phase.md +66 -0
- package/dist/templates/skills/research.md +76 -0
- package/dist/templates/skills/review.md +148 -0
- package/dist/templates/skills/roadmap.md +104 -0
- package/dist/templates/skills/ship.md +94 -0
- package/dist/templates/skills/split.md +96 -0
- package/dist/templates/skills/verify.md +147 -0
- package/package.json +56 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Proposal: {{name}}
|
|
2
|
+
|
|
3
|
+
> **填表指引**:本文档是 Change Proposal,用于在实现前对齐变更的意图、范围和方案。每节均附填写指引,请按指引完整填写。完成后约 1-3 位 reviewer 会评审本 proposal 后再进入 design 阶段。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Intent
|
|
8
|
+
|
|
9
|
+
<!--
|
|
10
|
+
填写指引:
|
|
11
|
+
说明为什么要做这个变更,回答以下问题:
|
|
12
|
+
1. 当前系统存在什么具体问题或缺失什么能力?
|
|
13
|
+
2. 这个问题影响谁(用户/开发者/运维)?影响程度如何?
|
|
14
|
+
3. 不做这个变更会有什么后果?
|
|
15
|
+
4. 这个是 bug fix / feature / tech debt / perf improvement?
|
|
16
|
+
5. 是否关联某个已知 issue、用户反馈、或性能指标?(可附 issue 链接)
|
|
17
|
+
|
|
18
|
+
示例:
|
|
19
|
+
用户反馈在列表页滑动时出现明显卡顿(60fps→20fps),经 profiling
|
|
20
|
+
定位为 FlatList 未配置 getItemLayout 导致布局计算 O(n²)。
|
|
21
|
+
本变更为性能修复,目标是将列表滚动帧率恢复至 55fps+。
|
|
22
|
+
-->
|
|
23
|
+
|
|
24
|
+
{{intent}}
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Scope
|
|
29
|
+
|
|
30
|
+
<!--
|
|
31
|
+
填写指引:明确界定"做什么"和"不做什么"。
|
|
32
|
+
-->
|
|
33
|
+
|
|
34
|
+
### In scope
|
|
35
|
+
|
|
36
|
+
<!--
|
|
37
|
+
列出本变更涵盖的所有功能点或改动项。
|
|
38
|
+
每项一行,用动词开头描述具体变更。
|
|
39
|
+
|
|
40
|
+
格式示例:
|
|
41
|
+
- 在列表页下拉刷新时增加骨架屏加载状态
|
|
42
|
+
- 新增 `useScrollPerformance` hook,提供 scroll metrics 采集
|
|
43
|
+
- 为 `<UserCard>` 组件添加 memo + 纯组件优化
|
|
44
|
+
-->
|
|
45
|
+
|
|
46
|
+
{{in-scope-items}}
|
|
47
|
+
|
|
48
|
+
### Out of scope
|
|
49
|
+
|
|
50
|
+
<!--
|
|
51
|
+
明确排除的改动,防止 scope creep。
|
|
52
|
+
每项一行,说明为什么不在本次做。
|
|
53
|
+
|
|
54
|
+
格式示例:
|
|
55
|
+
- 首页的骨架屏改造(已规划在下一 phase 处理)
|
|
56
|
+
- 服务端 API 分页改造(与客户端性能问题无关)
|
|
57
|
+
- Android 端列表性能优化(platform-specific,需单独调研)
|
|
58
|
+
-->
|
|
59
|
+
|
|
60
|
+
{{out-of-scope-items}}
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Approach
|
|
65
|
+
|
|
66
|
+
<!--
|
|
67
|
+
填写指引:从宏观描述技术方案方向,涵盖以下方面:
|
|
68
|
+
1. **架构方向**:改动落在哪一层(UI / ViewModel / Service / Store)?是否需要新建模块?
|
|
69
|
+
2. **关键库选型**:是否引入新依赖?替换或升级现有依赖?选择理由?
|
|
70
|
+
3. **数据流方向**:数据如何从源头到达 UI?状态管理变更?
|
|
71
|
+
4. **兼容性**:向后兼容策略?是否需要 migration?
|
|
72
|
+
5. **可测试性**:方案中是否为测试留有入口(依赖注入 / mock 点)?
|
|
73
|
+
|
|
74
|
+
不需要在此写详细实现——design 文档负责。这里写"方向"即可。
|
|
75
|
+
|
|
76
|
+
示例:
|
|
77
|
+
- UI 层:在 FlatList 组件外层封装 OptimizedList,内部配置 getItemLayout
|
|
78
|
+
和 windowSize;ViewModel 层新增列表性能监控数据上报点
|
|
79
|
+
- 后端接口:不涉及,所有数据流不变
|
|
80
|
+
- 测试策略:新增 useScrollPerformance 单元测试 + 列表渲染性能 benchmark
|
|
81
|
+
-->
|
|
82
|
+
|
|
83
|
+
{{approach}}
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Must-haves
|
|
88
|
+
|
|
89
|
+
<!--
|
|
90
|
+
列出 3-7 条可观测、可验证的必须达成的行为。
|
|
91
|
+
每条必须是具体声明,不模糊。
|
|
92
|
+
写完后 reviewer 应能用这些条件判断是否通过。
|
|
93
|
+
|
|
94
|
+
填写指引:
|
|
95
|
+
- 每行以 "MUST" / "SHALL" 开头(英文)或 "必须" 开头(中文)
|
|
96
|
+
- 可观测:打开页面能看到,终端命令可检查,测试可断言
|
|
97
|
+
- 可验证:reviwer 能通过操作/命令确认
|
|
98
|
+
|
|
99
|
+
示例:
|
|
100
|
+
- 列表页滚动帧率在 1000 条数据下不低于 55fps
|
|
101
|
+
- 下拉刷新时骨架屏在 200ms 内显示
|
|
102
|
+
- 新增 useScrollPerformance 的单元测试覆盖率达到 90%+
|
|
103
|
+
-->
|
|
104
|
+
|
|
105
|
+
{{must-haves}}
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Non-goals
|
|
110
|
+
|
|
111
|
+
<!--
|
|
112
|
+
明确非目标,防止 reviewer 误判"为什么没做某事"。
|
|
113
|
+
每项一行。
|
|
114
|
+
|
|
115
|
+
不同于 Out of scope(不在此 change 的范围内),
|
|
116
|
+
Non-goals 是可能被误以为在范围内但明确不做的具体目标。
|
|
117
|
+
|
|
118
|
+
示例:
|
|
119
|
+
- 不追求 Android 端列表性能在本 change 中提升
|
|
120
|
+
- 不改变现有列表的分页逻辑
|
|
121
|
+
- 不新增 UI 组件库依赖
|
|
122
|
+
-->
|
|
123
|
+
|
|
124
|
+
{{non-goals}}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Quality Review: {{change-name}}
|
|
2
|
+
|
|
3
|
+
> 审查时间: {{date}}
|
|
4
|
+
> 审查者: {{reviewer | agent/human}}
|
|
5
|
+
|
|
6
|
+
## 审查范围
|
|
7
|
+
|
|
8
|
+
列出本次质量审查覆盖的代码文件范围。
|
|
9
|
+
|
|
10
|
+
- **TypeScript/源代码**: <!-- 如 `src/**/*.ts`(排除生成的) -->
|
|
11
|
+
- **测试代码**: <!-- 如 `test/**/*.test.ts` -->
|
|
12
|
+
- **配置文件**: <!-- 如 `*.config.ts`、`tsconfig.json` -->
|
|
13
|
+
- **其他**: <!-- 如 SQL 脚本、Dockerfile、CI 配置等 -->
|
|
14
|
+
|
|
15
|
+
**填写指引:**
|
|
16
|
+
- 范围应列出文件 glob 或手动文件列表,确保可复现
|
|
17
|
+
- 明确指出本次审查涉及新增、修改、删除的文件
|
|
18
|
+
- 如果只审查 diff,写"新增代码行: N, 修改代码行: M"
|
|
19
|
+
|
|
20
|
+
## 审查结果
|
|
21
|
+
|
|
22
|
+
按四个维度分别检查。各维度独立打分,综合决定最终结论。
|
|
23
|
+
|
|
24
|
+
### Bug 检查
|
|
25
|
+
|
|
26
|
+
检查代码中是否存在逻辑错误、边界条件漏处理、竞态条件等问题。
|
|
27
|
+
|
|
28
|
+
| 文件 | 问题 | 严重度 | 状态 |
|
|
29
|
+
|------|------|--------|------|
|
|
30
|
+
| <!-- 文件名+行号 --> | <!-- 问题描述 --> | critical / high / medium / low | 未修复 / 已修复 / 误报 |
|
|
31
|
+
|
|
32
|
+
**典型检查项:**
|
|
33
|
+
- [ ] 空值 / undefined / null 路径是否处理
|
|
34
|
+
- [ ] 边界条件(数组为空的特殊值、最大/最小值)
|
|
35
|
+
- [ ] 异步操作的竞态条件(race condition、未 await)
|
|
36
|
+
- [ ] 错误处理是否完整(try/catch 是否合适)
|
|
37
|
+
- [ ] 状态机转换是否合法
|
|
38
|
+
- [ ] 循环终止条件是否可能无限
|
|
39
|
+
|
|
40
|
+
### 安全检查
|
|
41
|
+
|
|
42
|
+
检查代码中的安全漏洞和敏感信息泄露。
|
|
43
|
+
|
|
44
|
+
| 文件 | 问题 | 严重度 | 状态 |
|
|
45
|
+
|------|------|--------|------|
|
|
46
|
+
| <!-- 文件名+行号 --> | <!-- 问题描述 --> | critical / high / medium / low | 未修复 / 已修复 / 误报 |
|
|
47
|
+
|
|
48
|
+
**典型检查项:**
|
|
49
|
+
- [ ] 用户输入是否经过校验或清洗(注入风险)
|
|
50
|
+
- [ ] 敏感信息(token、key、密码)是否被硬编码或日志输出
|
|
51
|
+
- [ ] 权限检查是否缺失
|
|
52
|
+
- [ ] 文件路径拼接存在遍历风险
|
|
53
|
+
- [ ] 依赖是否存在已知 CVE(已知漏洞)
|
|
54
|
+
- [ ] SQL / shell 命令拼接是否有注入风险
|
|
55
|
+
|
|
56
|
+
### 规范检查
|
|
57
|
+
|
|
58
|
+
检查代码是否符合项目约定的编码风格和模式。
|
|
59
|
+
|
|
60
|
+
| 文件 | 问题 | 严重度 | 状态 |
|
|
61
|
+
|------|------|--------|------|
|
|
62
|
+
| <!-- 文件名+行号 --> | <!-- 问题描述 --> | critical / high / medium / low | 未修复 / 已修复 / 误报 |
|
|
63
|
+
|
|
64
|
+
**典型检查项:**
|
|
65
|
+
- [ ] 命名是否符合约定(camelCase / PascalCase / kebab-case)
|
|
66
|
+
- [ ] 类型是否正确使用(有无不必要的 `any`)
|
|
67
|
+
- [ ] lint 规则遵守情况(eslint 规则违反)
|
|
68
|
+
- [ ] 项目既有模式是否被遵循(如请求处理模式、错误处理模式)
|
|
69
|
+
- [ ] 文件组织是否符合模块结构约定
|
|
70
|
+
- [ ] import 路径是否符合项目别名配置
|
|
71
|
+
|
|
72
|
+
### 性能检查
|
|
73
|
+
|
|
74
|
+
检查代码中可能影响性能的写法。
|
|
75
|
+
|
|
76
|
+
| 文件 | 问题 | 严重度 | 状态 |
|
|
77
|
+
|------|------|--------|------|
|
|
78
|
+
| <!-- 文件名+行号 --> | <!-- 问题描述 --> | critical / high / medium / low | 未修复 / 已修复 / 误报 |
|
|
79
|
+
|
|
80
|
+
**典型检查项:**
|
|
81
|
+
- [ ] 不必要的内存分配(循环中创建对象/数组)
|
|
82
|
+
- [ ] N+1 查询或不必要的重复请求
|
|
83
|
+
- [ ] 大对象不必要的深拷贝
|
|
84
|
+
- [ ] DOM 操作过于频繁
|
|
85
|
+
- [ ] 未使用缓存的热路径
|
|
86
|
+
- [ ] 长列表未分页或虚拟滚动
|
|
87
|
+
|
|
88
|
+
## 严重度定义
|
|
89
|
+
|
|
90
|
+
| 严重度 | 定义 | 对结论的影响 |
|
|
91
|
+
|--------|------|-------------|
|
|
92
|
+
| **critical** | 功能被完全破坏、安全漏洞可被利用、数据可能丢失 | 直接 FAIL |
|
|
93
|
+
| **high** | 主要路径存在 bug、明显的安全风险、轻微的功能异常 | 强烈建议修复后再通过;如果可以证明该路径不触发的则降级 |
|
|
94
|
+
| **medium** | 边缘情况下的问题、不规范但无功能影响、重构建议 | 不阻塞,记录为 tech debt |
|
|
95
|
+
| **low** | 样式偏好、注释不完整、可读性建议 | 仅供参考,不记录 tech debt |
|
|
96
|
+
|
|
97
|
+
## 不通过项详情
|
|
98
|
+
|
|
99
|
+
只记录状态为"未修复"且严重度 ≥ medium 的问题。low 严重度的问题仅汇总数量。
|
|
100
|
+
|
|
101
|
+
### {{文件:行号}}: {{问题摘要}}
|
|
102
|
+
|
|
103
|
+
- **维度**: <!-- Bug / Security / Convention / Performance -->
|
|
104
|
+
- **严重度**: <!-- critical / high / medium -->
|
|
105
|
+
- **问题描述**: <!-- 为什么这是问题 -->
|
|
106
|
+
- **代码位置**:
|
|
107
|
+
```typescript
|
|
108
|
+
// 定位到的代码片段(贴关键行)
|
|
109
|
+
```
|
|
110
|
+
- **影响分析**: <!-- 什么条件下会触发此问题 -->
|
|
111
|
+
- **不触发证明**(可选): <!-- 如果声称"不会在实际中触发",提供证据 -->
|
|
112
|
+
|
|
113
|
+
### <!-- 下一个问题 -->
|
|
114
|
+
|
|
115
|
+
<!-- 无不通过项时写"未发现严重度 ≥ medium 的问题。" -->
|
|
116
|
+
|
|
117
|
+
## 结论
|
|
118
|
+
|
|
119
|
+
- [ ] **PASS** — 代码质量达标,无 critical/high 未修复项
|
|
120
|
+
- [ ] **FAIL** — 存在质量问题:
|
|
121
|
+
- **critical** 未修复: <!-- 数量 -->
|
|
122
|
+
- **high** 未修复: <!-- 数量 -->
|
|
123
|
+
- **medium** 未修复: <!-- 数量(参考,不阻塞) -->
|
|
124
|
+
- **low** 未修复: <!-- 数量(仅供参考) -->
|
|
125
|
+
|
|
126
|
+
**审查总结:**
|
|
127
|
+
- BUG: <!-- 发现了 X 个 bug,其中 critical/high N 个 -->
|
|
128
|
+
- 安全: <!-- 发现了 X 个安全问题,其中 critical/high N 个 -->
|
|
129
|
+
- 规范: <!-- 主要规范问题概述 -->
|
|
130
|
+
- 性能: <!-- 主要性能问题概述 -->
|
|
131
|
+
- 整体结论: <!-- 高度概括项目当前代码质量状态 -->
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Phase Research: {{phase-name}}
|
|
2
|
+
|
|
3
|
+
> **调研时间**: {{date}}
|
|
4
|
+
> **调研者**: {{作者}}
|
|
5
|
+
> **状态**: {{进行中 / 已完成 / 待补充}}
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 调研方向
|
|
10
|
+
|
|
11
|
+
<!--
|
|
12
|
+
填写指引:
|
|
13
|
+
每个调研方向独立一节。对每个方向列出:
|
|
14
|
+
- 调研问题:本次调研要回答的具体问题
|
|
15
|
+
- 候选方案:备选方案的对比表格
|
|
16
|
+
- 结论:推荐哪个方案及理由
|
|
17
|
+
- 来源:参考链接/文档
|
|
18
|
+
|
|
19
|
+
每节回答一个独立的技术或业务问题。如果某一方向没有涉及 n 个候选方案,则不需要对比表格。
|
|
20
|
+
-->
|
|
21
|
+
|
|
22
|
+
### 方向 1: {{调研主题 1}}
|
|
23
|
+
|
|
24
|
+
#### 调研问题
|
|
25
|
+
- {{问题 1:如 "React Native 0.73 的 getItemLayout 对动态高度列表的支持程度?"}}
|
|
26
|
+
- {{问题 2:如 "是否需要在 Android 上关闭 accessibility 以提升列表性能?"}}
|
|
27
|
+
|
|
28
|
+
#### 候选方案
|
|
29
|
+
|
|
30
|
+
| 方案 | 优点 | 缺点 | 成熟度 | 许可证 |
|
|
31
|
+
|---|---|---|---|---|
|
|
32
|
+
| {{方案 A 名称}} | {{优点列表}} | {{缺点列表}} | {{GA / Beta / Alpha}} | {{MIT / Apache / 专有}} |
|
|
33
|
+
| {{方案 B 名称}} | {{优点列表}} | {{缺点列表}} | {{GA / Beta / Alpha}} | {{MIT / Apache / 专有}} |
|
|
34
|
+
| {{方案 C 名称}} | {{优点列表}} | {{缺点列表}} | {{GA / Beta / Alpha}} | {{MIT / Apache / 专有}} |
|
|
35
|
+
|
|
36
|
+
#### 结论
|
|
37
|
+
|
|
38
|
+
{{推荐方案和理由。包含:推荐什么、为什么它优于其他方案、什么条件下应该重新评估。}}
|
|
39
|
+
|
|
40
|
+
#### 来源
|
|
41
|
+
|
|
42
|
+
- {{链接 1:官方文档 / RFC / issue}}
|
|
43
|
+
- {{链接 2:社区文章 / 博客}}
|
|
44
|
+
- {{链接 3:相关工具仓库}}
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
### 方向 2: {{调研主题 2}}
|
|
49
|
+
|
|
50
|
+
#### 调研问题
|
|
51
|
+
- {{问题 1}}
|
|
52
|
+
- {{问题 2}}
|
|
53
|
+
|
|
54
|
+
#### 候选方案
|
|
55
|
+
|
|
56
|
+
| 方案 | 优点 | 缺点 | 成熟度 | 许可证 |
|
|
57
|
+
|---|---|---|---|---|
|
|
58
|
+
| {{方案 A 名称}} | {{优点}} | {{缺点}} | {{成熟度}} | {{许可证}} |
|
|
59
|
+
| {{方案 B 名称}} | {{优点}} | {{缺点}} | {{成熟度}} | {{许可证}} |
|
|
60
|
+
|
|
61
|
+
#### 结论
|
|
62
|
+
|
|
63
|
+
{{推荐方案和理由}}
|
|
64
|
+
|
|
65
|
+
#### 来源
|
|
66
|
+
|
|
67
|
+
- {{链接 1}}
|
|
68
|
+
- {{链接 2}}
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### 方向 3: {{调研主题 3}}
|
|
73
|
+
|
|
74
|
+
#### 调研问题
|
|
75
|
+
- {{问题 1}}
|
|
76
|
+
|
|
77
|
+
#### 候选方案
|
|
78
|
+
|
|
79
|
+
| 方案 | 优点 | 缺点 | 成熟度 | 许可证 |
|
|
80
|
+
|---|---|---|---|---|
|
|
81
|
+
| {{方案 A 名称}} | {{优点}} | {{缺点}} | {{成熟度}} | {{许可证}} |
|
|
82
|
+
| {{方案 B 名称}} | {{优点}} | {{缺点}} | {{成熟度}} | {{许可证}} |
|
|
83
|
+
|
|
84
|
+
#### 结论
|
|
85
|
+
|
|
86
|
+
{{推荐方案和理由}}
|
|
87
|
+
|
|
88
|
+
#### 来源
|
|
89
|
+
|
|
90
|
+
- {{链接 1}}
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 推荐方案汇总
|
|
95
|
+
|
|
96
|
+
<!--
|
|
97
|
+
填写指引:
|
|
98
|
+
将所有方向的推荐汇总为一张表格,方便快速参考。
|
|
99
|
+
-->
|
|
100
|
+
|
|
101
|
+
| 类别 | 推荐方案 | 备选方案 | 关键理由 |
|
|
102
|
+
|---|---|---|---|
|
|
103
|
+
| {{类别 1:如"列表性能优化"}} | {{推荐方案}} | {{备选方案}} | {{选择该方案的核心原因}} |
|
|
104
|
+
| {{类别 2:如"性能监控方案"}} | {{推荐方案}} | {{备选方案}} | {{选择该方案的核心原因}} |
|
|
105
|
+
| {{类别 3}} | {{推荐方案}} | {{备选方案}} | {{选择该方案的核心原因}} |
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 陷阱与注意事项
|
|
110
|
+
|
|
111
|
+
<!--
|
|
112
|
+
填写指引:
|
|
113
|
+
列出调研过程中发现的已知陷阱、常见错误、容易被忽略的边缘情况。
|
|
114
|
+
这是最有价值的信息——减少实现者踩坑的概率。
|
|
115
|
+
-->
|
|
116
|
+
|
|
117
|
+
1. **{{陷阱标题 1}}**:{{描述。如:"Android 端 FlatList 的 getItemLayout 在 item 高度不一致时会导致滚动位置跳跃。如果必须支持动态高度,考虑改用 CellRendererComponent + 缓存测量的高度。"}}
|
|
118
|
+
- 影响范围:{{哪些模块/平台受影响}}
|
|
119
|
+
- 缓解方法:{{如何避免或处理}}
|
|
120
|
+
|
|
121
|
+
2. **{{陷阱标题 2}}**:{{描述}}
|
|
122
|
+
- 影响范围:{{影响范围}}
|
|
123
|
+
- 缓解方法:{{缓解方法}}
|
|
124
|
+
|
|
125
|
+
3. **{{陷阱标题 3}}**:{{描述}}
|
|
126
|
+
- 影响范围:{{影响范围}}
|
|
127
|
+
- 缓解方法:{{缓解方法}}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Spec Review: {{change-name}}
|
|
2
|
+
|
|
3
|
+
> 审查时间: {{date}}
|
|
4
|
+
> 审查者: {{reviewer | agent/human}}
|
|
5
|
+
|
|
6
|
+
## 审查范围
|
|
7
|
+
|
|
8
|
+
列出本次审查覆盖的输入文件清单。
|
|
9
|
+
|
|
10
|
+
- **delta-specs 文件**:
|
|
11
|
+
- `specwf/changes/{{change-name}}/specs/*.md` — <!-- 具体文件名,如 `req-api.md`、`req-auth.md` -->
|
|
12
|
+
- **实现文件**:
|
|
13
|
+
- <!-- 实现代码路径,如 `src/lib/xxx.ts`、`src/modules/xxx/` -->
|
|
14
|
+
- **测试文件**:
|
|
15
|
+
- <!-- 如 `test/lib/xxx.test.ts` -->
|
|
16
|
+
- **相关规格文件**(全局 specs/):
|
|
17
|
+
- <!-- 如 `specs/conventions/coding-standards.md` -->
|
|
18
|
+
|
|
19
|
+
**填写指引:**
|
|
20
|
+
- 审查范围应以文件列表形式明确给出,不写模糊的"所有实现文件"
|
|
21
|
+
- 只审查当前 change 涉及的 specs 和 files,不审查全局无关的规格
|
|
22
|
+
- 如果 change 没有新增 delta-specs(纯 refactor/docs),注明"本 change 无新增 specs"
|
|
23
|
+
|
|
24
|
+
## 审查结果
|
|
25
|
+
|
|
26
|
+
每条记录对应 delta-specs 中的一个 Requirement 或 Scenario,逐项审查。
|
|
27
|
+
|
|
28
|
+
| 规格项 | SHALL/MUST 关键词 | 场景 | 实现状态 | 证据 | 备注 |
|
|
29
|
+
|--------|-------------------|------|----------|------|------|
|
|
30
|
+
| <!-- SHALL-001 或 REQ-001 --> | <!-- SHALL / MUST / SHOULD / MAY --> | <!-- GIVEN/WHEN/THEN 场景摘要,或具体行为描述 --> | ✅ 满足 / ❌ 不满足 / ⚠️ 部分满足 | <!-- 代码行号引用、测试用例名 --> | <!-- 观察到的偏差、异常等 --> |
|
|
31
|
+
| | | | | | |
|
|
32
|
+
|
|
33
|
+
**填写指引:**
|
|
34
|
+
|
|
35
|
+
### 规格项命名
|
|
36
|
+
- 直接引用 delta-specs 中的 Requirement ID(如 `REQ-001`)或 Scenario 标题
|
|
37
|
+
- 如果 delta-specs 没有编号,按文件+序号引用(如 `req-api.md#L12`)
|
|
38
|
+
|
|
39
|
+
### SHALL/MUST 关键词含义
|
|
40
|
+
| 关键词 | 含义 | 审查要求 |
|
|
41
|
+
|--------|------|----------|
|
|
42
|
+
| SHALL / MUST | 强制性要求,必须实现 | ✅ 必须满足,否则 FAIL |
|
|
43
|
+
| SHOULD | 建议性要求,推荐实现 | ⚠️ 不满足时标注但可不 FAIL |
|
|
44
|
+
| MAY | 可选要求 | 不满足不视为问题 |
|
|
45
|
+
| SHALL NOT / MUST NOT | 禁止行为 | 必须验证不存在,违规即 FAIL |
|
|
46
|
+
|
|
47
|
+
### 实现状态判定标准
|
|
48
|
+
- **✅ 满足**: 代码完整实现了规格描述的行为,有通过的测试覆盖
|
|
49
|
+
- **❌ 不满足**: 缺少实现或实现明显不符合规格描述,不满足路径清晰
|
|
50
|
+
- **⚠️ 部分满足**: 主要路径通过但边界条件未覆盖,或实现与规格有细微出入
|
|
51
|
+
|
|
52
|
+
### 证据
|
|
53
|
+
- 必须提供可验证的证据,不写"代码已实现"这种模糊描述
|
|
54
|
+
- 好的证据:`src/lib/validate.ts:42-58 实现了 isEmail()`、`test/lib/validate.test.ts:15 测试通过"`
|
|
55
|
+
- 可以在备注中附加截图或日志
|
|
56
|
+
|
|
57
|
+
## 不满足项详情
|
|
58
|
+
|
|
59
|
+
对于 ❌ 不满足 和 ⚠️ 部分满足 的规格项,在此逐项展开分析。
|
|
60
|
+
|
|
61
|
+
### {{规格项 ID}}: {{规格项描述}}
|
|
62
|
+
|
|
63
|
+
- **规格要求**: <!-- 原文引用 -->
|
|
64
|
+
- **实现现状**: <!-- 代码中实际发生了什么 -->
|
|
65
|
+
- **差异分析**: <!-- 为什么有差异 -->
|
|
66
|
+
- **影响评估**: <!-- 影响范围:当前 change 范围 / 全局 / 下游 -->
|
|
67
|
+
- **修复建议**:
|
|
68
|
+
- <!-- 具体要改的文件、加什么逻辑、改什么测试 -->
|
|
69
|
+
- <!-- 如 "src/lib/validate.ts: 增加 email 格式校验分支" -->
|
|
70
|
+
|
|
71
|
+
### <!-- 下一个不满足项 -->
|
|
72
|
+
|
|
73
|
+
<!-- 无 ❌/⚠️ 项时写"所有规格项均已满足,无不满足项。" -->
|
|
74
|
+
|
|
75
|
+
## 结论
|
|
76
|
+
|
|
77
|
+
- [ ] **PASS** — 所有规格项满足,无 ❌ 项
|
|
78
|
+
- [ ] **FAIL** — 存在 ❌ 不满足的规格项:
|
|
79
|
+
- <!-- 列出具体不满足项的 ID 和简要描述 -->
|
|
80
|
+
|
|
81
|
+
**审查建议:**
|
|
82
|
+
- PASS 且无 ⚠️ 项 → 可进入下一阶段
|
|
83
|
+
- PASS 但有 ⚠️ 项 → 记录为后续跟踪项(可不阻塞但需记录)
|
|
84
|
+
- FAIL → 阻塞进入 verify,需回 apply 修复后重新审查
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
# ============================================================
|
|
3
|
+
# specwf 状态机 frontmatter
|
|
4
|
+
# ============================================================
|
|
5
|
+
# 注意:这是 YAML frontmatter,缩进和空格敏感。
|
|
6
|
+
# 不要使用 Tab,不要混用空格缩进层级。
|
|
7
|
+
|
|
8
|
+
# 项目元信息
|
|
9
|
+
project:
|
|
10
|
+
name: {{name}} # 项目名,与 project.yml 一致
|
|
11
|
+
status: initialized # 项目级状态机当前步
|
|
12
|
+
# initialized → requirements-defined → researched → roadmap-defined
|
|
13
|
+
# → milestone-active → project-done / project-paused / project-aborted
|
|
14
|
+
current_milestone: null # 当前活跃 Milestone 名称,如 milestone-1, v2-migration
|
|
15
|
+
current_phase: null # 当前活跃 Phase 名称
|
|
16
|
+
# 如: auth-system, data-migration
|
|
17
|
+
|
|
18
|
+
# 当前活跃上下文(项目层或某个实体层)
|
|
19
|
+
active_context:
|
|
20
|
+
type: project # 当前上下文类型: project / milestone / phase / change / adhoc
|
|
21
|
+
ref: null # 当前上下文的引用名称(如 phase 名称或 change ID)
|
|
22
|
+
step: init # 当前上下文所在的步骤名
|
|
23
|
+
# 项目层步: init, requirements, research, roadmap
|
|
24
|
+
# Phase 层步: discuss, research, split, apply, review, verify, ship
|
|
25
|
+
# Change 层步: plan, apply, review, verify, archive
|
|
26
|
+
|
|
27
|
+
# Change 层执行记录(每次 apply 时追加)
|
|
28
|
+
# 每个 Change 记录包含: { id, status, phase_ref, specs, tasks }
|
|
29
|
+
# 每项格式见下方填写指引
|
|
30
|
+
changes: []
|
|
31
|
+
|
|
32
|
+
# 临时/紧急变更记录(非 Change 体系的修改)
|
|
33
|
+
# 每项格式: { id, description, status, related_phase }
|
|
34
|
+
adhoc: []
|
|
35
|
+
|
|
36
|
+
# --- 前端变量说明 ---
|
|
37
|
+
#
|
|
38
|
+
# {{name}} — 项目名称,从 project.yml 读取
|
|
39
|
+
# {{date}} — 当前日期,specwf 自动填充
|
|
40
|
+
# {{phase-name}} — 当前 Phase 名称
|
|
41
|
+
# {{change-name}}— 当前 Change 名称
|
|
42
|
+
# {{step}} — 当前工作流步骤名
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
# {{name}} — 状态机
|
|
46
|
+
|
|
47
|
+
## 当前位置
|
|
48
|
+
|
|
49
|
+
<!-- 简要描述当前在项目流程中的位置 -->
|
|
50
|
+
|
|
51
|
+
**项目层**: <!-- 如 "Milestone 1 — 用户认证系统实施中" -->
|
|
52
|
+
**当前 Milestone**: {{current_milestone | "无"}}
|
|
53
|
+
**当前 Phase**: {{current_phase | "无"}}
|
|
54
|
+
**当前 Step**: <!-- 如 "Change 'add-email-login' apply 中" -->
|
|
55
|
+
|
|
56
|
+
## 状态机
|
|
57
|
+
|
|
58
|
+
<!-- 说明当前实体层的状态机路径和可选步 -->
|
|
59
|
+
|
|
60
|
+
### 项目层状态机
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
initialized → requirements-defined → researched → roadmap-defined
|
|
64
|
+
→ milestone-active → project-done / project-paused / project-aborted
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Phase 层状态机
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
discuss → research → split → [change执行循环] → ship
|
|
71
|
+
↓
|
|
72
|
+
plan → apply → review → verify → archive
|
|
73
|
+
← replan ←
|
|
74
|
+
← reapply ←
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Change 层状态机
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
planned → applying → applied → reviewing → verifying → archived
|
|
81
|
+
↑← reapply ← ← ← ←
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 当前状态
|
|
85
|
+
|
|
86
|
+
- **项目状态**: {{project.status}}
|
|
87
|
+
- **Milestone 状态**: <!-- 如 "进行中 / 未开始 / 已完成" -->
|
|
88
|
+
- **Phase 状态**: <!-- 如 "discuss 完成,research 进行中" -->
|
|
89
|
+
- **Change 状态**: <!-- 如 "3 个 planned,2 个 applied,1 个 verifying" -->
|
|
90
|
+
|
|
91
|
+
## 变更列表 (Changes)
|
|
92
|
+
|
|
93
|
+
当前 Phase 下的所有 Change 及其状态一览。
|
|
94
|
+
|
|
95
|
+
| Change ID | 描述 | 状态 | 关联 Specs |
|
|
96
|
+
|-----------|------|------|------------|
|
|
97
|
+
| <!-- change-1 --> | <!-- 简短描述 --> | planned / applying / applied / reviewing / verifying / archived / blocked | <!-- specs 文件路径 --> |
|
|
98
|
+
| <!-- change-2 --> | <!-- ... --> | | |
|
|
99
|
+
|
|
100
|
+
## 临时变更 (Ad-hoc)
|
|
101
|
+
|
|
102
|
+
非 Change 体系内的暂存修改记录。
|
|
103
|
+
|
|
104
|
+
| ID | 描述 | 状态 | 关联 Phase |
|
|
105
|
+
|----|------|------|-----------|
|
|
106
|
+
| <!-- adhoc-001 --> | <!-- 做了什么/为什么是 adhoc --> | open / resolved | <!-- 影响哪个 phase --> |
|
|
107
|
+
|
|
108
|
+
## 历史
|
|
109
|
+
|
|
110
|
+
<!-- 按时间增序记录所有关键状态变更事件。每次状态变更后追加一行。 -->
|
|
111
|
+
|
|
112
|
+
- {{date | YYYY-MM-DD HH:mm}} — init: 创建 specwf 项目结构
|
|
113
|
+
- <!-- 后续事件追加格式: -->
|
|
114
|
+
- {{date}} — milestone {{milestone-name}} started
|
|
115
|
+
- {{date}} — phase {{phase-name}} {{old-status}} → {{new-status}}
|
|
116
|
+
- {{date}} — change {{change-name}} {{old-status}} → {{new-status}}
|
|
117
|
+
|
|
118
|
+
## 状态变更检查清单
|
|
119
|
+
|
|
120
|
+
每次变更状态时,请确认以下条件:
|
|
121
|
+
|
|
122
|
+
### milestone 启动前
|
|
123
|
+
- [ ] 前一 milestone 已 ship(或项目第一个)
|
|
124
|
+
- [ ] roadmap 已定义
|
|
125
|
+
- [ ] 资源/成员已就位
|
|
126
|
+
|
|
127
|
+
### phase 启动前
|
|
128
|
+
- [ ] 当前 milestone 中无冲突 phase
|
|
129
|
+
- [ ] 依赖的前置 phase 已完成
|
|
130
|
+
|
|
131
|
+
### phase split → apply
|
|
132
|
+
- [ ] 所有 Change 已定义
|
|
133
|
+
- [ ] Change 依赖图已确认无环
|
|
134
|
+
- [ ] 每个 Change 都有 spec 和 plan
|
|
135
|
+
|
|
136
|
+
### change apply → review
|
|
137
|
+
- [ ] 所有 task 已实现并提交
|
|
138
|
+
- [ ] RED→GREEN→REFACTOR 循环完整(behavior 类型)
|
|
139
|
+
- [ ] 类型检查通过(tsc --noEmit)
|
|
140
|
+
- [ ] 测试通过(vitest run)
|
|
141
|
+
|
|
142
|
+
### change review → verify
|
|
143
|
+
- [ ] 三重审查全部 PASS(或按 gate 配置通过)
|
|
144
|
+
- [ ] 无未关闭的 reapply 标记
|
|
145
|
+
|
|
146
|
+
### change verify → archive
|
|
147
|
+
- [ ] 验证报告已生成
|
|
148
|
+
- [ ] 无打开的 replan/reapply 回环
|
|
149
|
+
- [ ] 代码认知已提取(archive 时触发 delta-spec 合并)
|
|
150
|
+
|
|
151
|
+
### phase ship 前
|
|
152
|
+
- [ ] 所有 Change 已 archived
|
|
153
|
+
- [ ] phase summary 已生成
|
|
154
|
+
- [ ] 文档已更新
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
*state.md 由 specwf 自动管理。不要手动编辑 frontmatter 的缩进和层级结构。*
|