@zhuan-ai/zhuanspec 2.11.3 → 2.11.6
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/dist/commands/change.js +9 -4
- package/dist/commands/progress.js +3 -3
- package/dist/commands/spec.js +12 -4
- package/dist/commands/validate.js +15 -6
- package/dist/core/artifact-graph/instruction-loader.d.ts +3 -1
- package/dist/core/artifact-graph/instruction-loader.js +27 -2
- package/dist/core/hooks/deviation-check.js +16 -3
- package/dist/core/hooks/init.js +14 -1
- package/dist/core/hooks/notify-milestone.js +31 -5
- package/dist/core/hooks/pre-review.js +18 -5
- package/dist/core/hooks/record-progress.d.ts +12 -0
- package/dist/core/hooks/record-progress.js +3 -3
- package/dist/core/hooks/review-hooks.js +5 -4
- package/dist/core/hooks/review-orchestrator.js +9 -0
- package/dist/core/init.js +14 -2
- package/dist/core/templates/agents-template.d.ts +1 -1
- package/dist/core/templates/agents-template.js +11 -0
- package/dist/core/templates/slash-command-templates.js +25 -13
- package/dist/core/templates/tasks-template.d.ts +0 -7
- package/dist/core/templates/tasks-template.js +8 -45
- package/dist/core/templates/tdd-tasks-template.d.ts +0 -6
- package/dist/core/templates/tdd-tasks-template.js +159 -73
- package/dist/core/validation/strict-rules.d.ts +18 -8
- package/dist/core/validation/strict-rules.js +188 -70
- package/dist/core/validation/validator.js +21 -0
- package/dist/utils/task-progress.js +2 -2
- package/package.json +22 -20
- package/schemas/spec-driven/schema.yaml +10 -2
- package/schemas/spec-driven/templates/tasks.md +117 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhuan-ai/zhuanspec",
|
|
3
|
-
"version": "2.11.
|
|
3
|
+
"version": "2.11.6",
|
|
4
4
|
"description": "AI-native system for spec-driven development",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"zhuanspec",
|
|
@@ -39,6 +39,26 @@
|
|
|
39
39
|
"!dist/**/__tests__",
|
|
40
40
|
"!dist/**/*.map"
|
|
41
41
|
],
|
|
42
|
+
"scripts": {
|
|
43
|
+
"lint": "eslint src/",
|
|
44
|
+
"build": "node build.js",
|
|
45
|
+
"dev": "tsc --watch",
|
|
46
|
+
"dev:cli": "pnpm build && node bin/zhuanspec.js",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"test:watch": "vitest",
|
|
49
|
+
"test:ui": "vitest --ui",
|
|
50
|
+
"test:coverage": "vitest --coverage",
|
|
51
|
+
"test:postinstall": "node scripts/postinstall.js",
|
|
52
|
+
"prepare": "npm run build",
|
|
53
|
+
"prepublishOnly": "npm run build",
|
|
54
|
+
"postinstall": "node scripts/postinstall.js",
|
|
55
|
+
"check:pack-version": "node scripts/pack-version-check.mjs",
|
|
56
|
+
"diagnose:cursor": "node scripts/diagnose-cursor-commands.js",
|
|
57
|
+
"release": "pnpm run release:ci",
|
|
58
|
+
"release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
|
|
59
|
+
"release:local": "pnpm exec changeset version && pnpm run check:pack-version && pnpm exec changeset publish",
|
|
60
|
+
"changeset": "changeset"
|
|
61
|
+
},
|
|
42
62
|
"engines": {
|
|
43
63
|
"node": ">=20.19.0"
|
|
44
64
|
},
|
|
@@ -60,23 +80,5 @@
|
|
|
60
80
|
"ora": "^8.2.0",
|
|
61
81
|
"yaml": "^2.8.2",
|
|
62
82
|
"zod": "^4.0.17"
|
|
63
|
-
},
|
|
64
|
-
"scripts": {
|
|
65
|
-
"lint": "eslint src/",
|
|
66
|
-
"build": "node build.js",
|
|
67
|
-
"dev": "tsc --watch",
|
|
68
|
-
"dev:cli": "pnpm build && node bin/zhuanspec.js",
|
|
69
|
-
"test": "vitest run",
|
|
70
|
-
"test:watch": "vitest",
|
|
71
|
-
"test:ui": "vitest --ui",
|
|
72
|
-
"test:coverage": "vitest --coverage",
|
|
73
|
-
"test:postinstall": "node scripts/postinstall.js",
|
|
74
|
-
"postinstall": "node scripts/postinstall.js",
|
|
75
|
-
"check:pack-version": "node scripts/pack-version-check.mjs",
|
|
76
|
-
"diagnose:cursor": "node scripts/diagnose-cursor-commands.js",
|
|
77
|
-
"release": "pnpm run release:ci",
|
|
78
|
-
"release:ci": "pnpm run check:pack-version && pnpm exec changeset publish",
|
|
79
|
-
"release:local": "pnpm exec changeset version && pnpm run check:pack-version && pnpm exec changeset publish",
|
|
80
|
-
"changeset": "changeset"
|
|
81
83
|
}
|
|
82
|
-
}
|
|
84
|
+
}
|
|
@@ -169,9 +169,17 @@ artifacts:
|
|
|
169
169
|
instruction: |
|
|
170
170
|
创建分解实施工作的任务列表。
|
|
171
171
|
|
|
172
|
+
⚠️ 任务格式强制要求:
|
|
173
|
+
- 所有任务项必须使用 GitHub Flavored Markdown 复选框格式
|
|
174
|
+
- 待完成:- [ ] N.M 描述 @skill:xxx
|
|
175
|
+
- 已完成:- [x] N.M 描述 @skill:xxx
|
|
176
|
+
- 严禁使用 #### Task N.M: 或 #### T1: 标题格式
|
|
177
|
+
- 严禁使用 ✅ emoji 标记完成,必须用 [x] 复选框
|
|
178
|
+
- validate --strict 会对非复选框格式直接报 ERROR 并阻断流程
|
|
179
|
+
|
|
172
180
|
指导原则:
|
|
173
|
-
-
|
|
174
|
-
-
|
|
181
|
+
- 任务必须组织在 Wave 标题下(### Wave 1, ### Wave 2 等)
|
|
182
|
+
- 每个任务按类型使用固定模板(新增文件/修改文件),填满所有字段
|
|
175
183
|
- 任务应该足够小,可以在一次会话中完成
|
|
176
184
|
- 按依赖关系排序任务(必须先做什么?)
|
|
177
185
|
|
|
@@ -48,12 +48,96 @@ Answer: 是,每页20条
|
|
|
48
48
|
- 数据依赖:后续任务使用前序任务创建的表/接口/类时,必须标注依赖
|
|
49
49
|
- 独立任务:无数据或逻辑依赖的任务不要添加 @depends,以最大化并行度
|
|
50
50
|
|
|
51
|
+
@test-case 标注指南(可选):
|
|
52
|
+
1. 仅当提供测试 case 时添加此标注
|
|
53
|
+
2. 格式:@test-case:TC-001 或 @test-case:TC-001,TC-002(多个用逗号分隔)
|
|
54
|
+
3. 确保引用的 TC-XXX 在 test-cases.md 中存在
|
|
55
|
+
4. 任务应覆盖对应测试 case 的所有验收点
|
|
56
|
+
|
|
57
|
+
@ref 标注指南:
|
|
58
|
+
1. 指向技术方案文档的具体章节(路径为实际定位到的技术方案文件相对路径)
|
|
59
|
+
2. 格式:@ref:<tech-spec路径>#章节编号-章节名称
|
|
60
|
+
3. 示例:@ref:techDesign/tech-spec.md#3.1-新建客户接口 或 @ref:/path/to/external-tech-spec.md#3.1-新建客户接口
|
|
61
|
+
4. 确保引用的章节在技术方案文档中存在
|
|
62
|
+
|
|
51
63
|
示例:
|
|
52
64
|
- [ ] 1.1 新增枚举值 @skill:kf-backend-coding-standards
|
|
53
65
|
- [ ] 1.2 创建数据库表 @skill:java-db-schema-standards
|
|
54
66
|
- [ ] 1.3 编写 DAO 层代码 @skill:java-dao-standards @depends:1.2
|
|
55
67
|
-->
|
|
56
68
|
|
|
69
|
+
## 任务格式说明
|
|
70
|
+
|
|
71
|
+
⚠️ **所有任务项必须使用 GitHub Flavored Markdown 复选框格式**:
|
|
72
|
+
- 待完成:`- [ ] N.M 描述`
|
|
73
|
+
- 已完成:`- [x] N.M 描述`
|
|
74
|
+
- **严禁使用** `#### Task N.M:` 或 `#### T1:` 标题格式
|
|
75
|
+
- **严禁使用** ✅ emoji 标记完成,必须用 `[x]`
|
|
76
|
+
|
|
77
|
+
每个任务按类型使用对应的固定模板,必须填满所有字段:
|
|
78
|
+
|
|
79
|
+
### 类型 A:新增文件
|
|
80
|
+
|
|
81
|
+
- [ ] N.M [描述] @skill:xxx @ref:xxx
|
|
82
|
+
- **文件**: `完整相对路径`(新增)
|
|
83
|
+
- **内容**:
|
|
84
|
+
- 类定义: [类名、继承/实现关系]
|
|
85
|
+
- 依赖注入: [注入的 Bean/Service 列表]
|
|
86
|
+
- 核心方法: [方法签名 → 返回类型](列出全部 public 方法)
|
|
87
|
+
- 关键逻辑: [核心业务流程,如:校验 → 加锁 → 写库 → 同步ES]
|
|
88
|
+
- 字段/配置: [若为 Entity/DTO/配置类,列出全部字段及类型]
|
|
89
|
+
- **验证**: [具体的输入输出断言,含正常和异常场景]
|
|
90
|
+
|
|
91
|
+
示例:
|
|
92
|
+
- [ ] 5.1 创建 CustomerDomainService @skill:java-scf-rpc-usage-skill
|
|
93
|
+
@ref:techDesign/tech-spec.md#3.1-新建客户
|
|
94
|
+
- **文件**: `domain_hub_server/src/main/java/com/zz/domain/hub/domain/CustomerDomainService.java`(新增)
|
|
95
|
+
- **内容**:
|
|
96
|
+
- 类定义: `@Service public class CustomerDomainService`
|
|
97
|
+
- 依赖注入: CustomerMapper, CustomerEmployeeMapper, EsSyncService, RedissonClient
|
|
98
|
+
- 核心方法: createCustomer(CreateCustomerRequest, Long tenantId) → Long
|
|
99
|
+
- 关键逻辑: customerName 必填校验 → selectByPhoneAndTenant 手机号唯一检查 → 分布式锁 dh:customer:merge:{phone} → insert t_customer → 异步 ES 同步
|
|
100
|
+
- 异常处理: 手机号重复抛 BizException(ErrorCode.PHONE_DUPLICATE)
|
|
101
|
+
- **验证**: 手机号重复返回 PHONE_DUPLICATE 错误码;正常创建返回 customerId > 0;无锁时并发创建只成功一个
|
|
102
|
+
|
|
103
|
+
### 类型 B:修改文件
|
|
104
|
+
|
|
105
|
+
- [ ] N.M [描述] @skill:xxx @ref:xxx
|
|
106
|
+
- **文件**: `完整相对路径`(总行数)
|
|
107
|
+
- **修改位置**: L行号范围 `函数名/类名` 之后/之内
|
|
108
|
+
- **内容**: [具体改什么:新增代码逻辑/修改现有逻辑/删除代码,描述修改方式]
|
|
109
|
+
- **验证**: [修改后的预期行为,含回归验证]
|
|
110
|
+
|
|
111
|
+
示例:
|
|
112
|
+
- [ ] 1.1 在 review 命令中增加任务完成度硬门禁 @skill:none
|
|
113
|
+
@ref:techDesign/tech-spec.md#7.1-任务完成度检查
|
|
114
|
+
- **文件**: `src/commands/review.ts`(138行)
|
|
115
|
+
- **修改位置**: L32-38 `runReview()` 函数内,现有校验逻辑之后
|
|
116
|
+
- **内容**: 新增任务完成度检查 — 读取 tasks.md 匹配 `- [ ]` 统计未完成任务数,>0 时输出未完成列表并阻断 review 流程,支持 `--force` 参数跳过检查
|
|
117
|
+
- **验证**: 有未完成任务时阻断并输出列表;--force 跳过;全部完成时正常通过
|
|
118
|
+
|
|
119
|
+
## 任务粒度原则
|
|
120
|
+
- 每个任务对应一个类或一个接口方法的实现
|
|
121
|
+
- 单个任务 AI 执行时间不超过 30 分钟
|
|
122
|
+
- 超过则需拆分为多个子任务
|
|
123
|
+
- **禁止模糊描述**:不允许"创建XXX类"不带文件路径、"实现YYY方法"不带方法签名和关键逻辑
|
|
124
|
+
|
|
125
|
+
## Coverage Checklist
|
|
126
|
+
|
|
127
|
+
<!-- 当存在技术方案(techDesign/tech-spec.md/ 通过--tech-spec创建的提案)时,必须填写此表 -->
|
|
128
|
+
<!-- 列出技术方案中所有维度与任务的映射关系,确保覆盖率 >= 95% -->
|
|
129
|
+
|
|
130
|
+
| 维度 | 技术方案数量 | 提案任务覆盖 | 覆盖率 |
|
|
131
|
+
|------|-------------|-------------|-------|
|
|
132
|
+
| DB 表 | <!-- N张 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
133
|
+
| ES 索引 | <!-- N个 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
134
|
+
| Entity 类 | <!-- N个 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
135
|
+
| Mapper | <!-- N个 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
136
|
+
| SCF接口方法 | <!-- N个 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
137
|
+
| DTO 类 | <!-- N个 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
138
|
+
| 配置项 | <!-- N个 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
139
|
+
| 前端组件 | <!-- N个 --> | <!-- T编号范围 --> | <!-- 100% --> |
|
|
140
|
+
|
|
57
141
|
### Wave 1
|
|
58
142
|
|
|
59
143
|
<!-- Wave 1: Tasks with no dependencies -->
|
|
@@ -85,9 +169,38 @@ Wave assignment logic:
|
|
|
85
169
|
- Wave 2: @depends:1.x → depends on Wave 1
|
|
86
170
|
- Wave 3: @depends:2.x → depends on Wave 2
|
|
87
171
|
|
|
88
|
-
##
|
|
89
|
-
|
|
90
|
-
|
|
172
|
+
## File Conflict Analysis
|
|
173
|
+
|
|
174
|
+
<!-- 当多个任务修改同一文件时,在此声明冲突并指定隔离策略 -->
|
|
175
|
+
<!-- 隔离策略:parallel(不同区域可并行)/ serial(同区域必须串行)-->
|
|
176
|
+
<!-- 此表帮助编排 Agent 做更精确的并行化决策,补充自动检测无法覆盖的"同文件不同区域可并行"场景 -->
|
|
177
|
+
<!-- 无文件冲突时章节可省略,或将表格行填写 N/A -->
|
|
178
|
+
|
|
179
|
+
| 文件 | 涉及任务 | 各任务修改区域 | 隔离策略 |
|
|
180
|
+
|------|---------|-------------|---------|
|
|
181
|
+
| <!-- 相对路径 --> | <!-- T1.x, T2.y --> | <!-- T1.x: 函数名/行范围; T2.y: 函数名/行范围 --> | <!-- parallel / serial --> |
|
|
182
|
+
|
|
183
|
+
## Test Case Coverage
|
|
184
|
+
|
|
185
|
+
<!-- ⚠️ CHECKPOINT [TEST-CASE-COVERAGE]: Each task should reference related test cases (recommended) -->
|
|
186
|
+
<!-- Use @test-case:TC-XXX to link tasks to test cases -->
|
|
187
|
+
<!-- 表格必须包含四列:Task、测试 Case ID、测试 Case 文件路径、覆盖场景 -->
|
|
188
|
+
|
|
189
|
+
| Task | 测试 Case ID | 测试 Case 文件路径 | 覆盖场景 |
|
|
190
|
+
|------|-------------|-------------------|----------|
|
|
191
|
+
| <!-- T1 --> | <!-- TC-001 --> | <!-- BIC 路径层级,如:退货退款 > 创建售后 > 三选一页面 > 组装机弹窗 --> | <!-- 描述覆盖的场景 --> |
|
|
192
|
+
|
|
193
|
+
<!--
|
|
194
|
+
测试 case 设计指南:
|
|
195
|
+
1. 为每个 Requirement 设计至少一个正向场景测试 case
|
|
196
|
+
2. 为关键业务逻辑设计异常场景测试 case
|
|
197
|
+
3. 测试 case 应与 Requirement 的 Scenario 对应
|
|
198
|
+
4. 测试 case ID 格式:TC-XXX(三位数字)
|
|
199
|
+
5. 测试 case 详情记录在 test-cases.md 文件中
|
|
200
|
+
6. "测试 Case 文件路径" 列填写 BIC 路径层级格式:
|
|
201
|
+
- 格式:功能模块 > 子模块 > 页面 > 操作 > 结果
|
|
202
|
+
- 示例:退货退款 > 创建售后 > 三选一页面 > 组装机 > 退货退款 > 点击后,显示组装机弹窗
|
|
203
|
+
-->
|
|
91
204
|
|
|
92
205
|
## Workflow Diagram
|
|
93
206
|
|
|
@@ -98,4 +211,4 @@ Wave assignment logic:
|
|
|
98
211
|
flowchart TD
|
|
99
212
|
W1[Wave 1] --> W2[Wave 2]
|
|
100
213
|
W2 --> W3[Wave 3]
|
|
101
|
-
```
|
|
214
|
+
```
|