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,94 @@
|
|
|
1
|
+
# 交付工作流指引
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
将完成的 phase(或其变更集)交付。Ship 分为两级:(1) Ship Phase — 创建 PR + 更新 STATE.md;(2) Ship Milestone — 创建 release tag + 更新 PROJECT.md 版本。
|
|
6
|
+
|
|
7
|
+
Ship Phase 在每个 phase 的 change 循环全部完成后触发。Ship Milestone 在 milestone 的所有 phase 完成后触发。
|
|
8
|
+
|
|
9
|
+
## 前置条件
|
|
10
|
+
|
|
11
|
+
- 当前 phase 内所有 change 的 verify 已通过(passed 状态)
|
|
12
|
+
- archive 已执行
|
|
13
|
+
|
|
14
|
+
## 执行步骤
|
|
15
|
+
|
|
16
|
+
### 1. 检查交付就绪
|
|
17
|
+
|
|
18
|
+
- [ ] 所有 change 的 VERIFICATION.md 状态为 passed
|
|
19
|
+
- [ ] 所有 change 已 archive(delta-specs 已合并、代码认知已提取)
|
|
20
|
+
- [ ] 没有未合并的 delta-spec 冲突
|
|
21
|
+
- [ ] 测试通过、构建通过
|
|
22
|
+
|
|
23
|
+
### 2. Ship Phase
|
|
24
|
+
|
|
25
|
+
**创建 PR**:
|
|
26
|
+
\`\`\`
|
|
27
|
+
git checkout -b ship/ph-<phase-name>
|
|
28
|
+
git merge --squash <phase-branch>(或逐个 cherry-pick change)
|
|
29
|
+
git commit -m "feat(<phase>): <phase 标题>"
|
|
30
|
+
git push origin ship/ph-<phase-name>
|
|
31
|
+
\`\`\`
|
|
32
|
+
|
|
33
|
+
创建 PR:
|
|
34
|
+
- 标题:\`feat(<phase>): <标题>\`
|
|
35
|
+
- 正文包含:
|
|
36
|
+
- 本 phase 的 scope 概述
|
|
37
|
+
- 包含的 change 列表
|
|
38
|
+
- 变更统计(文件数、行数)
|
|
39
|
+
- 测试覆盖状态
|
|
40
|
+
- CHECKLIST(所有 change 已 verify passed、已 archive)
|
|
41
|
+
|
|
42
|
+
PR 通过后合并到主分支。
|
|
43
|
+
|
|
44
|
+
**更新 STATE.md**:
|
|
45
|
+
\`\`\`markdown
|
|
46
|
+
# 状态
|
|
47
|
+
|
|
48
|
+
## Phase: <name>
|
|
49
|
+
- 状态: ✅ shipped
|
|
50
|
+
- PR: #<PR 号>
|
|
51
|
+
- Ship 日期: <date>
|
|
52
|
+
\`\`\`
|
|
53
|
+
|
|
54
|
+
### 3. Ship Milestone(可选,仅在 milestone 全部完成时)
|
|
55
|
+
|
|
56
|
+
当 milestone 的最后 phase ship 后:
|
|
57
|
+
|
|
58
|
+
\`\`\`
|
|
59
|
+
git tag v<major>.<minor>.<patch>
|
|
60
|
+
git push origin v<major>.<minor>.<patch>
|
|
61
|
+
\`\`\`
|
|
62
|
+
|
|
63
|
+
更新 PROJECT.md(或 README.md)的版本号和 changelog。
|
|
64
|
+
|
|
65
|
+
### 4. 通知
|
|
66
|
+
|
|
67
|
+
(可选)在项目日志或 release notes 中记录交付内容。
|
|
68
|
+
|
|
69
|
+
## 产物
|
|
70
|
+
|
|
71
|
+
- GitHub PR(ship phase)
|
|
72
|
+
- \`specwf/STATE.md\`(更新,标记 phase 为 shipped)
|
|
73
|
+
- (milestone)git tag + release notes
|
|
74
|
+
|
|
75
|
+
## 验证
|
|
76
|
+
|
|
77
|
+
- [ ] PR 已创建且包含完整信息
|
|
78
|
+
- [ ] STATE.md 已更新
|
|
79
|
+
- [ ] CI 通过
|
|
80
|
+
- [ ] (milestone)tag 已创建和推送
|
|
81
|
+
- [ ] 主分支代码与 PR 一致
|
|
82
|
+
|
|
83
|
+
## 常见陷阱
|
|
84
|
+
|
|
85
|
+
- 不要跳过 PR 直接合并到主分支 — PR 是审计轨迹的一部分
|
|
86
|
+
- squash merge 要注意 squash 后的 message 包含所有 change 信息
|
|
87
|
+
- 如果发现 CI 失败,不要强行合并 — 修复后重试
|
|
88
|
+
- STATE.md 更新使用 \`shipped\` 枚举值,不是自由文本
|
|
89
|
+
- Milestone ship 前确认所有 phase 都已 shipped
|
|
90
|
+
|
|
91
|
+
## 参考
|
|
92
|
+
|
|
93
|
+
- Conventional Commits 规范(feat 类型)
|
|
94
|
+
- GSD Core 的 ship 流程
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Change 拆分工作流指引
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
将 Phase 的工作拆分为多个可并行(或有序)执行的 Change。每个 Change 是独立可验证的工作单元,有明确的输入输出和被测试场景覆盖。
|
|
6
|
+
|
|
7
|
+
拆分产出依赖图,支持三种并行策略:串行、依赖图并行、流水线并行。
|
|
8
|
+
|
|
9
|
+
## 前置条件
|
|
10
|
+
|
|
11
|
+
- context.md 已完成
|
|
12
|
+
- phase 的 scope 和接口边界明确
|
|
13
|
+
|
|
14
|
+
## 执行步骤
|
|
15
|
+
|
|
16
|
+
### 1. 识别独立工作单元
|
|
17
|
+
|
|
18
|
+
从 phase 的 scope 中识别可独立实现和验证的功能单位:
|
|
19
|
+
- 每个 change 对应一个完整的功能切面
|
|
20
|
+
- 不跨 change 共享未完成的代码(除非依赖图明确)
|
|
21
|
+
- 每个 change 有明确的可验证结果
|
|
22
|
+
|
|
23
|
+
### 2. 建立依赖关系
|
|
24
|
+
|
|
25
|
+
绘制 change 之间的依赖图:
|
|
26
|
+
\`\`\`
|
|
27
|
+
Change A ──→ Change B ──→ Change C
|
|
28
|
+
↓
|
|
29
|
+
Change D ──→ Change E
|
|
30
|
+
\`\`\`
|
|
31
|
+
|
|
32
|
+
依赖类型:
|
|
33
|
+
- **数据依赖**:B 依赖 A 的数据结构
|
|
34
|
+
- **接口依赖**:D 依赖 B 的接口
|
|
35
|
+
- **顺序依赖**:C 必须在 B 之后(但不需要 B 的产出物)
|
|
36
|
+
|
|
37
|
+
### 3. 为每个 Change 准备 skeleton
|
|
38
|
+
|
|
39
|
+
每个 change 的目录:
|
|
40
|
+
\`\`\`
|
|
41
|
+
changes/<change-name>/
|
|
42
|
+
├── proposal.md # 当前 change 的需求范围
|
|
43
|
+
├── specs/
|
|
44
|
+
│ └── <domain>/
|
|
45
|
+
│ └── spec.md # delta-specs(初始空,plan 阶段写)
|
|
46
|
+
├── design.md # (plan 阶段产出)
|
|
47
|
+
├── tasks.md # (plan 阶段产出)
|
|
48
|
+
├── reviews/ # (review 阶段产出)
|
|
49
|
+
└── VERIFICATION.md # (verify 阶段产出)
|
|
50
|
+
\`\`\`
|
|
51
|
+
|
|
52
|
+
proposal.md 内容:
|
|
53
|
+
\`\`\`markdown
|
|
54
|
+
# Change: <名称>
|
|
55
|
+
|
|
56
|
+
## 目标
|
|
57
|
+
## 范围
|
|
58
|
+
## 依赖(前置 change 列表)
|
|
59
|
+
## 关键接口(输入/输出/副作用)
|
|
60
|
+
## 测试场景清单
|
|
61
|
+
\`\`\`
|
|
62
|
+
|
|
63
|
+
### 4. 确认并行策略
|
|
64
|
+
|
|
65
|
+
根据 change 依赖图配置并行策略:
|
|
66
|
+
|
|
67
|
+
- **serial**: 所有 change 串行(依赖图全序)
|
|
68
|
+
- **dependency-graph**: 无依赖的 change 并行,有依赖的串行(默认推荐)
|
|
69
|
+
- **pipeline**: 按依赖深度分层,同层并行、异层流水线
|
|
70
|
+
|
|
71
|
+
## 产物
|
|
72
|
+
|
|
73
|
+
- \`changes/<change-name>/proposal.md\` — 每个 change 的定义
|
|
74
|
+
- \`changes/<change-name>/specs/\` — 每个 change 的 delta-specs 目录(初始空)
|
|
75
|
+
- 依赖图(在 conversation 中记录,不生成独立文件)
|
|
76
|
+
|
|
77
|
+
## 验证
|
|
78
|
+
|
|
79
|
+
- [ ] 每个 change 有明确的可验证结果
|
|
80
|
+
- [ ] 依赖图无循环
|
|
81
|
+
- [ ] 变更范围不重叠
|
|
82
|
+
- [ ] 所有 phase scope 被覆盖
|
|
83
|
+
- [ ] 依赖关系合理(无缺少的依赖)
|
|
84
|
+
|
|
85
|
+
## 常见陷阱
|
|
86
|
+
|
|
87
|
+
- change 太大 → 超出 review 合理范围(建议单个 change ≤ 400 行 diff)
|
|
88
|
+
- change 太小 → 上下文切换成本高于并行收益
|
|
89
|
+
- 不要「偷渡」未计划的改动到一个 change 中
|
|
90
|
+
- 依赖图不要太深(3 层以上意味着拆分粒度需要调整)
|
|
91
|
+
- 如果不确定独立程度,宁拆大不拆小
|
|
92
|
+
|
|
93
|
+
## 参考
|
|
94
|
+
|
|
95
|
+
- OpenSpec 的 change 结构设计
|
|
96
|
+
- GSD Core 的 dependency-graph 并行策略
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# 测试验证工作流指引
|
|
2
|
+
|
|
3
|
+
## 概述
|
|
4
|
+
|
|
5
|
+
在 Review 通过后,对实现进行完整的测试验证。Verify 负责确保代码正确运行、所有场景覆盖,并处理回环路由 —— 根据缺陷类型路由到不同的修复阶段。
|
|
6
|
+
|
|
7
|
+
## 前置条件
|
|
8
|
+
|
|
9
|
+
- review 阶段已通过(三重审查全部 PASS 或 gate 条件满足)
|
|
10
|
+
- 测试套件完整(包括 RED 阶段写的测试)
|
|
11
|
+
|
|
12
|
+
## 执行步骤
|
|
13
|
+
|
|
14
|
+
### 1. 运行完整测试套件
|
|
15
|
+
|
|
16
|
+
\`\`\`
|
|
17
|
+
# 运行所有测试
|
|
18
|
+
bun run test
|
|
19
|
+
|
|
20
|
+
# 运行类型检查
|
|
21
|
+
bun run typecheck
|
|
22
|
+
|
|
23
|
+
#(可选)运行集成测试
|
|
24
|
+
bun run test:integration
|
|
25
|
+
\`\`\`
|
|
26
|
+
|
|
27
|
+
### 2. 测试覆盖率分析
|
|
28
|
+
|
|
29
|
+
分析测试覆盖缺口:
|
|
30
|
+
- delta-specs 中每个 SHALL/MUST 是否有测试
|
|
31
|
+
- 正常路径覆盖
|
|
32
|
+
- 边界路径覆盖
|
|
33
|
+
- 异常路径覆盖
|
|
34
|
+
|
|
35
|
+
### 3. 人工检查点验证
|
|
36
|
+
|
|
37
|
+
逐项检查 tasks.md 中每个任务的完成标准:
|
|
38
|
+
\`\`\`
|
|
39
|
+
- [ ] 所有 type:behavior 验证通过
|
|
40
|
+
- [ ] 所有非 TDD 任务验证通过
|
|
41
|
+
- [ ] 无回归(已有测试通过)
|
|
42
|
+
- [ ] 代码未破坏依赖项
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
### 4. 诊断失败(如有)
|
|
46
|
+
|
|
47
|
+
如果任何测试失败或验证不通过:
|
|
48
|
+
|
|
49
|
+
**根因诊断**:
|
|
50
|
+
1. 确定失败是测试问题还是实现问题
|
|
51
|
+
2. 明确缺陷的类型(见下方路由规则)
|
|
52
|
+
3. 在 VERIFICATION.md 中记录根因
|
|
53
|
+
|
|
54
|
+
### 5. 回环路由
|
|
55
|
+
|
|
56
|
+
根据缺陷类型路由到不同阶段:
|
|
57
|
+
|
|
58
|
+
\`\`\`
|
|
59
|
+
# 路由规则
|
|
60
|
+
|
|
61
|
+
## 计划缺陷 → 回 plan 重设计
|
|
62
|
+
触发条件:
|
|
63
|
+
- delta-specs 中的场景在代码中无法实现(设计不合理)
|
|
64
|
+
- design.md 的方案有架构缺陷
|
|
65
|
+
- 依赖关系在 split 时未正确识别
|
|
66
|
+
- 拆分的 tasks 粒度不合理
|
|
67
|
+
|
|
68
|
+
行为:
|
|
69
|
+
1. 标记缺陷类型为 PLAN
|
|
70
|
+
2. 记录问题和修改建议
|
|
71
|
+
3. 输出 \`路由目标: plan\`
|
|
72
|
+
4. 不修代码,回 plan 更新 design.md / tasks.md / delta-specs
|
|
73
|
+
|
|
74
|
+
## 实现缺陷 → 回 apply 重实现
|
|
75
|
+
触发条件:
|
|
76
|
+
- 测试失败(实现未满足 delta-spec)
|
|
77
|
+
- 代码逻辑错误
|
|
78
|
+
- 类型错误
|
|
79
|
+
- 性能不达标
|
|
80
|
+
- 缺少边界处理
|
|
81
|
+
|
|
82
|
+
行为:
|
|
83
|
+
1. 标记缺陷类型为 IMPLEMENTATION
|
|
84
|
+
2. 记录根因和具体位置(文件+行号)
|
|
85
|
+
3. 输出 \`路由目标: apply\`
|
|
86
|
+
4. 回 apply 修复实现
|
|
87
|
+
|
|
88
|
+
## 规格缺陷 → 标记 spec 待修(回 plan)
|
|
89
|
+
触发条件:
|
|
90
|
+
- delta-specs 本身不合理或矛盾
|
|
91
|
+
- 现有 specs/ 被违反但 delta-specs 未覆盖
|
|
92
|
+
- 场景遗漏(关键路径缺少 spec 定义)
|
|
93
|
+
- spec 与需求矛盾
|
|
94
|
+
|
|
95
|
+
行为:
|
|
96
|
+
1. 标记缺陷类型为 SPEC
|
|
97
|
+
2. 记录问题描述和修复建议
|
|
98
|
+
3. 输出 \`路由目标: plan(spec 待修)\`
|
|
99
|
+
4. 在 specs/ 中标记 \`[TODO: FIX SPEC]\`
|
|
100
|
+
5. 回 plan 修正规格
|
|
101
|
+
\`\`\`
|
|
102
|
+
|
|
103
|
+
### 6. 产出 VERIFICATION.md
|
|
104
|
+
|
|
105
|
+
\`\`\`markdown
|
|
106
|
+
# Change: <名称> — 验证报告
|
|
107
|
+
|
|
108
|
+
## 测试结果
|
|
109
|
+
- 单元测试: 通过 / 失败(N/N)
|
|
110
|
+
- 类型检查: 通过 / 失败
|
|
111
|
+
- 集成测试: 通过 / 失败(可选)
|
|
112
|
+
|
|
113
|
+
## 覆盖率
|
|
114
|
+
- 正常路径: N/N
|
|
115
|
+
- 边界路径: N/N
|
|
116
|
+
- 异常路径: N/N
|
|
117
|
+
|
|
118
|
+
## 路由决策
|
|
119
|
+
- 状态: passed | replan | reapply
|
|
120
|
+
- 路由目标: (通过时不填)
|
|
121
|
+
- 缺陷类型: PLAN | IMPLEMENTATION | SPEC
|
|
122
|
+
- 根因: ...
|
|
123
|
+
\`\`\`
|
|
124
|
+
|
|
125
|
+
## 产物
|
|
126
|
+
|
|
127
|
+
- \`changes/<change-name>/VERIFICATION.md\` — 验证报告
|
|
128
|
+
|
|
129
|
+
## 验证
|
|
130
|
+
|
|
131
|
+
- [ ] 测试套件全部通过(passed 时)
|
|
132
|
+
- [ ] delta-specs SHALL/MUST 全覆盖
|
|
133
|
+
- [ ] tasks.md 完成标准全通过
|
|
134
|
+
- [ ] VERIFICATION.md 路由决策清晰
|
|
135
|
+
|
|
136
|
+
## 常见陷阱
|
|
137
|
+
|
|
138
|
+
- 不要自己修发现的问题 — 路由是给主流程的信号,不是直接在 verify 中修改代码
|
|
139
|
+
- 不要混淆缺陷类型 —「这代码写错了」是 IMPLEMENTATION,「这规格就不对」是 SPEC
|
|
140
|
+
- 如果多个缺陷属于不同类型,按优先级最高的路由
|
|
141
|
+
- 不要只跑单元测试 — 集成测试才能暴露接口交互问题
|
|
142
|
+
- 路由前确认缺陷确实可重现,不是测试环境配置问题
|
|
143
|
+
|
|
144
|
+
## 参考
|
|
145
|
+
|
|
146
|
+
- GSD Core 的 verify phase 回环机制
|
|
147
|
+
- OpenSpec 的 verification 模板
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "specwf",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "规格驱动开发工作流 — spec-driven development workflow for AI coding agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"specwf": "bin/specwf.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsup",
|
|
11
|
+
"typecheck": "tsc --noEmit",
|
|
12
|
+
"test": "vitest run",
|
|
13
|
+
"test:watch": "vitest",
|
|
14
|
+
"prepublishOnly": "npm run typecheck && npm run test && npm run build"
|
|
15
|
+
},
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=20"
|
|
18
|
+
},
|
|
19
|
+
"files": [
|
|
20
|
+
"dist",
|
|
21
|
+
"bin",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@clack/prompts": "^1.6.0",
|
|
26
|
+
"commander": "^15.0.0",
|
|
27
|
+
"gray-matter": "^4.0.3",
|
|
28
|
+
"yaml": "^2.9.0",
|
|
29
|
+
"zod": "^4.4.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^22.0.0",
|
|
33
|
+
"tsup": "^8.5.0",
|
|
34
|
+
"typescript": "^5.7.0",
|
|
35
|
+
"vitest": "^4.0.0"
|
|
36
|
+
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
40
|
+
"license": "MIT",
|
|
41
|
+
"keywords": [
|
|
42
|
+
"spec-driven",
|
|
43
|
+
"workflow",
|
|
44
|
+
"ai-agent",
|
|
45
|
+
"cli",
|
|
46
|
+
"openspec",
|
|
47
|
+
"gsd"
|
|
48
|
+
],
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "git+https://github.com/hyperion2144/specwf.git"
|
|
52
|
+
},
|
|
53
|
+
"exports": {
|
|
54
|
+
".": "./dist/cli.js"
|
|
55
|
+
}
|
|
56
|
+
}
|