@alenfitz/spec-copilot 1.2.1 → 1.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.
- package/adapters/index.js +1 -218
- package/bin/cli.js +1 -786
- package/commands/spec:apply.md +16 -3
- package/commands/spec:review.md +12 -2
- package/commands/spec:smoke.md +6 -2
- package/framework/AGENTS.md.template +37 -11
- package/framework/VERSION +1 -1
- package/framework/changes/templates/tasks.md +12 -0
- package/package.json +2 -2
package/commands/spec:apply.md
CHANGED
|
@@ -21,13 +21,15 @@ description: 执行编码(逐 task 推进,每个 task 停顿等确认)
|
|
|
21
21
|
每个 task 的执行流程:
|
|
22
22
|
1. 编码实现
|
|
23
23
|
2. 验证(编译/构建/运行)
|
|
24
|
-
3.
|
|
24
|
+
3. **展示验证证据**(见下方验证证据要求)
|
|
25
25
|
4. 立即 `git commit`
|
|
26
26
|
5. 更新 tasks.md 该 task 状态为 ✅
|
|
27
27
|
6. **🛑 停止。输出以下提示后结束回复:**
|
|
28
28
|
```
|
|
29
29
|
✅ T<n> 完成(<简述>)
|
|
30
30
|
验证:<编译/测试结果>
|
|
31
|
+
功能验证:<curl 输出 / 页面行为描述>
|
|
32
|
+
已实现文件:<实际新增/修改的文件列表>
|
|
31
33
|
Commit: <hash> <message>
|
|
32
34
|
|
|
33
35
|
→ 下一步:T<n+1>: <描述>
|
|
@@ -35,8 +37,19 @@ description: 执行编码(逐 task 推进,每个 task 停顿等确认)
|
|
|
35
37
|
```
|
|
36
38
|
7. **等用户回复后才开始下一个 task**
|
|
37
39
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
+
### 验证证据要求(铁律)
|
|
41
|
+
|
|
42
|
+
> **编译通过 ≠ 功能完成。** 每个 task 必须提供与 tasks.md 验收标准匹配的证据。
|
|
43
|
+
|
|
44
|
+
- **后端 task**:必须执行 tasks.md 中定义的验证命令(curl),展示实际返回的 JSON/状态码。如果 curl 返回异常,该 task 不得标记为 ✅
|
|
45
|
+
- **前端 task**:必须说明页面可访问路径、核心交互是否可操作(表单有绑定、按钮有 handler、提交有反馈)。如果按钮的 handler 是空的 TODO,该 task 不得标记为 ✅
|
|
46
|
+
- **文件清单对照**:完成时对比 tasks.md 计划的文件列表和实际修改的文件列表。遗漏的文件必须说明原因
|
|
47
|
+
|
|
48
|
+
### Scope 偏差处理
|
|
49
|
+
|
|
50
|
+
- 如果执行中发现某个计划文件无法实现或需要跳过,**立即告知用户并等待确认**,不得静默裁切
|
|
51
|
+
- 偏差发生时当场记录到 log.md `Spec-Code 偏差记录`(log.md 已在 /spec:propose 时从模板创建,直接编辑已有文件,不得重建)
|
|
52
|
+
- 禁止以"文件数太多"、"不属于当前 task 范围"为由裁减 spec 中已定义的功能
|
|
40
53
|
|
|
41
54
|
## 全部 task 完成后
|
|
42
55
|
|
package/commands/spec:review.md
CHANGED
|
@@ -11,13 +11,23 @@ description: 两阶段审查(Spec 合规 + 代码质量)
|
|
|
11
11
|
运行 `npx @alenfitz/spec-copilot gate <变更名> review`(跨平台门禁检查)
|
|
12
12
|
|
|
13
13
|
**阶段一 Spec Compliance**(附录 A):
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
> 🔒 **独立验证铁律**:禁止凭 apply 阶段的记忆得出结论。每个功能点/业务规则必须当场执行 `grep -rn` 或 `Read`,输出 `文件:行号` 作为证据。无证据的 ✅ 视为无效。
|
|
16
|
+
|
|
17
|
+
执行步骤:
|
|
18
|
+
1. 读取 spec.md §3 功能点列表,逐条执行 `grep -rn` 定位后端和前端实现
|
|
19
|
+
2. 读取 spec.md §4 业务规则列表,逐条执行 `grep -rn` 定位校验逻辑
|
|
20
|
+
3. 对有实现的功能点,`Read` 代码段确认非空实现(非 TODO/占位/空方法体)
|
|
21
|
+
4. 统计覆盖率:`已实现/总功能点`。**低于 80% 直接判定不合规**
|
|
22
|
+
5. 检查 log.md `Spec-Code 偏差记录` 是否为空 — 如果 apply 阶段声称无偏差但 review 发现缺失实现,标记为 Critical 不一致
|
|
23
|
+
|
|
24
|
+
PASS 后才进入阶段二。
|
|
15
25
|
|
|
16
26
|
**阶段二 Code Quality**(附录 B):
|
|
17
27
|
按 Critical / Important / Minor 三级审查。
|
|
18
28
|
加载 `spec_copilot/stack-adapters/<栈>.md` §10 栈相关检查项。
|
|
19
29
|
|
|
20
|
-
完成后更新 spec.md §12
|
|
30
|
+
完成后更新 spec.md §12 审查结论(必须包含覆盖率数字)。
|
|
21
31
|
|
|
22
32
|
## 结束后
|
|
23
33
|
|
package/commands/spec:smoke.md
CHANGED
|
@@ -9,8 +9,12 @@ description: 冒烟验证(编译 + 核心接口测试)
|
|
|
9
9
|
步骤:
|
|
10
10
|
1. 编译/构建后端(命令见 `spec_copilot/rules/project-context.md` §8)
|
|
11
11
|
2. 编译/构建前端(如有)
|
|
12
|
-
3.
|
|
13
|
-
4.
|
|
12
|
+
3. 读取 spec.md §3 功能点列表和 §6 API 契约
|
|
13
|
+
4. 对 spec 中**每个 API 接口**执行 curl 验证(不仅限"核心接口"),记录状态码和响应摘要
|
|
14
|
+
5. 如有前端页面,逐页面确认可渲染、核心交互可操作
|
|
15
|
+
6. 统计接口冒烟覆盖率:`通过接口数/总接口数`
|
|
16
|
+
|
|
17
|
+
> ⚠️ 仅验证"核心接口"是不够的。Spec 定义的每个 API 都必须 curl 验证可达。不可达的接口记录为失败项。
|
|
14
18
|
|
|
15
19
|
## 结束后
|
|
16
20
|
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
- **阶段跳转等确认**:每个阶段(propose/apply/smoke/review/fix/test/archive)完成后停下来,告知下一步是什么,等用户显式触发。
|
|
30
30
|
- **唯一例外**:/spec:flow 全自动模式下,阶段间自动推进(但仅限 🟢/🟡 需求)。
|
|
31
31
|
|
|
32
|
+
### Scope 偏差管控(铁律)
|
|
33
|
+
- **禁止静默裁切**:如果某个 spec 功能点或 tasks.md 中的文件在执行时被跳过、简化或降级实现,必须**立即告知用户并等待确认**,然后记录到 log.md `Spec-Code 偏差记录`
|
|
34
|
+
- **前后端均衡**:如果 spec 含前后端,tasks.md 中前端和后端 task 的数量比不得超过 1:3。前端不得仅做"骨架级"实现——表单必须有数据绑定、按钮必须有 handler、提交必须有反馈
|
|
35
|
+
- **偏差即记录**:任何与 spec/tasks.md 的偏差(裁切功能、简化实现、跳过文件)都必须在发生时记录到 log.md,不得留空
|
|
36
|
+
|
|
32
37
|
## 启动检查(每次会话开始时执行)
|
|
33
38
|
|
|
34
39
|
**执行 `/spec:init`** — 该命令自动完成规范加载、项目扫描、栈适配、变更检测、状态报告。这是每次会话的唯一起点。
|
|
@@ -129,24 +134,38 @@ npx @alenfitz/spec-copilot gate <变更名> <phase>
|
|
|
129
134
|
|
|
130
135
|
核心理念:**不信报告,只信代码** — reviewer 必须读实际代码独立验证。
|
|
131
136
|
|
|
137
|
+
### 🔒 独立验证铁律
|
|
138
|
+
|
|
139
|
+
> **禁止凭记忆或 apply 阶段的上下文得出结论。每一条验证结果必须附带当场执行的 Grep/Read 证据。**
|
|
140
|
+
> 没有 `文件:行号` 引用的验证结论视为无效。
|
|
141
|
+
|
|
142
|
+
1. **逐功能点 Grep**:对 spec 每个功能点编号(如 F01、F02),必须执行 `grep -rn` 或 `Read` 在代码中定位实现,输出匹配的文件路径和行号
|
|
143
|
+
2. **逐规则 Grep**:对 spec 每条业务规则编号(如 V01、V02),必须在 Service/Controller 层搜索对应的条件判断,输出匹配证据
|
|
144
|
+
3. **前后端均验证**:后端有对应 API ≠ 功能已实现。必须同时验证前端是否有调用该 API 的页面/组件,且交互完整(按钮可点击、表单有绑定、提交有反馈)
|
|
145
|
+
4. **空实现检测**:Grep 检查是否存在 `TODO`、`/* */` 空方法体、`Promise.resolve()` 占位。发现即标记为 ❌ 未实现
|
|
146
|
+
5. **覆盖率统计**:最终输出 `已实现/总功能点` 比率。**低于 80% 直接判定不合规,不得通过**
|
|
147
|
+
|
|
132
148
|
### 审查维度
|
|
133
149
|
1. **缺失实现**:spec 要求了但代码没做的
|
|
134
150
|
2. **多余实现**:spec 没要求但代码多做了的(YAGNI 违规)
|
|
135
151
|
3. **理解偏差**:做了但做错了方向的
|
|
136
152
|
4. **业务规则落地**:spec 中的规则是否全部体现在代码中
|
|
137
153
|
5. **数据变更准确性**:spec 中的表/字段变更是否准确落地
|
|
154
|
+
6. **前后端一致性**:后端接口是否有前端调用方,前端交互是否完整闭环
|
|
138
155
|
|
|
139
156
|
### 具体审查清单(每次 review 逐项执行)
|
|
140
157
|
|
|
141
158
|
**功能点验证(对应 spec §3)**
|
|
142
|
-
- [ ] 读取 spec.md §3
|
|
143
|
-
- [ ]
|
|
159
|
+
- [ ] 读取 spec.md §3 功能点列表,提取所有功能点编号
|
|
160
|
+
- [ ] 对每个功能点,执行 `grep -rn "<关键字>"` 定位后端实现,记录 `文件:行号`
|
|
161
|
+
- [ ] 对每个功能点,执行 `grep -rn "<关键字>"` 定位前端实现(组件/页面/API 调用),记录 `文件:行号`
|
|
162
|
+
- [ ] 对有实现的功能点,`Read` 对应代码段,确认非空实现(非 TODO/占位)
|
|
144
163
|
- [ ] 检查是否有 spec 未提及但代码中多出的接口(YAGNI 违规)
|
|
145
164
|
|
|
146
165
|
**业务规则验证(对应 spec §4)**
|
|
147
|
-
- [ ] 读取 spec.md §4
|
|
148
|
-
- [ ] 对每条规则,在 Service 层
|
|
149
|
-
- [ ]
|
|
166
|
+
- [ ] 读取 spec.md §4 业务规则列表,提取所有规则编号
|
|
167
|
+
- [ ] 对每条规则,在 Service 层 `grep -rn` 对应的条件判断逻辑,记录 `文件:行号`
|
|
168
|
+
- [ ] 验证规则的边界条件是否在代码中体现(Read 对应代码段确认)
|
|
150
169
|
|
|
151
170
|
**数据变更验证(对应 spec §5)**
|
|
152
171
|
- [ ] 读取 spec.md §5 数据变更
|
|
@@ -158,12 +177,19 @@ npx @alenfitz/spec-copilot gate <变更名> <phase>
|
|
|
158
177
|
|
|
159
178
|
### 输出格式
|
|
160
179
|
```
|
|
161
|
-
####
|
|
162
|
-
- ✅
|
|
163
|
-
- ❌
|
|
164
|
-
-
|
|
165
|
-
|
|
166
|
-
|
|
180
|
+
#### 功能点逐条验证(N/M 通过,覆盖率 XX%)
|
|
181
|
+
- ✅ F01:已实现,后端 `XxxService.java:L42`,前端 `XxxPage.vue:L15`
|
|
182
|
+
- ❌ F02:后端有接口但前端未调用(缺少页面入口)
|
|
183
|
+
- ❌ F03:未实现(grep 无结果)
|
|
184
|
+
- ⚠️ F04:实现方式与 spec 描述有偏差(spec 要求 X,代码实际做了 Y)
|
|
185
|
+
- ❌ F05:空实现(`XxxService.java:L88` 方法体为 TODO)
|
|
186
|
+
|
|
187
|
+
#### 业务规则逐条验证(N/M 通过)
|
|
188
|
+
- ✅ V01:已实现,见 `XxxService.java:L120` if 判断
|
|
189
|
+
- ❌ V02:未找到对应校验逻辑
|
|
190
|
+
|
|
191
|
+
#### 覆盖率:功能点 X/Y (Z%),业务规则 X/Y (Z%)
|
|
192
|
+
#### 结论:✅ Spec 合规(覆盖率 ≥ 80%) / ❌ 不合规(覆盖率 < 80% 或存在 Critical 偏差)
|
|
167
193
|
```
|
|
168
194
|
|
|
169
195
|
---
|
package/framework/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.7.0
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
```
|
|
31
31
|
- **Git commit**:`git commit -m "[变更名] T1: <中文简述>"`
|
|
32
32
|
- 状态:待完成
|
|
33
|
+
- **实际验证结果**:(apply 完成时填写:curl 输出摘要 / 页面行为确认)
|
|
34
|
+
- **实际文件清单**:(apply 完成时填写:与计划文件对比,标注新增/遗漏)
|
|
33
35
|
|
|
34
36
|
---
|
|
35
37
|
|
|
@@ -38,11 +40,21 @@
|
|
|
38
40
|
|
|
39
41
|
---
|
|
40
42
|
|
|
43
|
+
## Scope 偏差跟踪
|
|
44
|
+
> ⚠️ 执行中发生的任何 scope 偏差必须即时记录于此,禁止留空后补
|
|
45
|
+
|
|
46
|
+
| Task | 偏差内容 | 原因 | 用户确认 |
|
|
47
|
+
|------|---------|------|---------|
|
|
48
|
+
| (无偏差则写"无") | | | |
|
|
49
|
+
|
|
41
50
|
## 变更摘要
|
|
42
51
|
> ⚠️ /spec:apply 全部完成后必须填写,不填不允许进入 /spec:review
|
|
43
52
|
|
|
44
53
|
- **总文件数**:X 个新增,Y 个修改
|
|
54
|
+
- **计划文件 vs 实际文件对比**:(列出计划但未实现的文件及原因)
|
|
45
55
|
- **Spec-Plan 偏差记录**:(无偏差 / 列出偏差点及原因)
|
|
56
|
+
- **功能点覆盖自查**:已实现 X/Y 功能点(列出未实现的功能点编号)
|
|
57
|
+
- **前后端工作量比**:后端 X 文件,前端 Y 文件
|
|
46
58
|
- **魔法值是否已提取为常量**:是 / 否(列出遗留项)
|
|
47
59
|
- **注释覆盖情况**:Entity/Service/Controller 注释是否符合 coding-style.md §1
|
|
48
60
|
- **遗留问题**:(下一步需处理的已知缺陷或 TODO)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alenfitz/spec-copilot",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Spec-Driven Development Framework — one package, six AI coding tools (opencode, Claude Code, Cursor, Windsurf, GitHub Copilot, Cline)",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-coding",
|
|
@@ -37,4 +37,4 @@
|
|
|
37
37
|
"scripts": {
|
|
38
38
|
"test": "node bin/cli.js --help"
|
|
39
39
|
}
|
|
40
|
-
}
|
|
40
|
+
}
|