spec-canon 0.1.2 → 0.1.3
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/index.js
CHANGED
package/dist/prompts/renderer.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
const IF_BLOCK = /\{\{#if\s+([A-Z_]+)\}\}([\s\S]*?)\{\{\/if\}\}/g;
|
|
1
|
+
const IF_BLOCK = /\{\{#if\s+([A-Z_]+)\}\}([\s\S]*?)(?:\{\{else\}\}([\s\S]*?))?\{\{\/if\}\}/g;
|
|
2
2
|
const VAR_PATTERN = /\{\{([A-Z_]+)\}\}/g;
|
|
3
3
|
export function renderPrompt(template, variables) {
|
|
4
|
-
// 1.
|
|
4
|
+
// 1. 处理条件块:保留已提供变量的块内容,否则使用 else 分支(如有)
|
|
5
5
|
const afterBlocks = template
|
|
6
|
-
.replace(IF_BLOCK, (_match, name, body) => {
|
|
7
|
-
return name in variables ? body : '';
|
|
6
|
+
.replace(IF_BLOCK, (_match, name, body, elseBody) => {
|
|
7
|
+
return name in variables ? body : (elseBody ?? '');
|
|
8
8
|
})
|
|
9
9
|
.replace(/\n{3,}/g, '\n\n') // 压缩连续空行
|
|
10
10
|
.trim();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-canon",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "CLI toolkit for Spec-Driven Development (SDD)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"prebuild": "node scripts/sync-templates.mjs",
|
|
29
29
|
"build": "tsc",
|
|
30
30
|
"dev": "tsx src/index.ts",
|
|
31
|
+
"test": "vitest run",
|
|
31
32
|
"prepublishOnly": "npm run build"
|
|
32
33
|
},
|
|
33
34
|
"files": [
|
|
@@ -44,6 +45,7 @@
|
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@types/node": "^22.0.0",
|
|
46
47
|
"tsx": "^4.0.0",
|
|
47
|
-
"typescript": "^5.7.0"
|
|
48
|
+
"typescript": "^5.7.0",
|
|
49
|
+
"vitest": "^4.0.18"
|
|
48
50
|
}
|
|
49
51
|
}
|
|
@@ -48,9 +48,9 @@ Change Spec 生成顺序(后者依赖前者作为上下文):
|
|
|
48
48
|
| Step 2 | `iface` → `impl-spec` → `test-spec` | `02` / `03` / `04` | 审阅接口设计、文件路径、步骤顺序 |
|
|
49
49
|
| Step 3 | `impl` | 分步编码 | 逐步确认,Gate 验证 |
|
|
50
50
|
| Step 4 | `review` | 审查 + `AI_CHANGELOG` | 最终确认 |
|
|
51
|
-
| Step 5 | `domain-sync
|
|
51
|
+
| Step 5 | `domain-sync`(可选 `-d`) | 回填 domain_spec + 更新域间关系 | 审阅草稿后写入 |
|
|
52
52
|
|
|
53
|
-
domain_spec 生命周期:变更启动时从 domain_spec 读取现状生成 `00_context`;变更完成时通过 `domain-sync`
|
|
53
|
+
domain_spec 生命周期:变更启动时从 domain_spec 读取现状生成 `00_context`;变更完成时通过 `domain-sync` 将关键信息回填。省略 `-d` 时,AI 会自动从 Change Spec 推断受影响的域。
|
|
54
54
|
|
|
55
55
|
### CLI 工具
|
|
56
56
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
{{#if DOMAIN}}
|
|
1
2
|
请检查 spec-canon/domains/{{DOMAIN}}/domain_spec.md 是否已存在,然后按以下分支执行:
|
|
2
3
|
|
|
3
4
|
## 分支判断
|
|
@@ -46,3 +47,69 @@
|
|
|
46
47
|
请对比本次 @spec-canon/changes/{{CHANGE}}/ 的 00_context.md §2.4 依赖服务
|
|
47
48
|
和 @spec-canon/domains/README.md 中的域间依赖明细,
|
|
48
49
|
检查是否有新增的跨域依赖。如果有,输出 README.md 更新草稿。
|
|
50
|
+
{{else}}
|
|
51
|
+
## 自动发现受影响域
|
|
52
|
+
|
|
53
|
+
请阅读 @spec-canon/changes/{{CHANGE}}/ 下的全部 Spec 文档,从以下位置提取涉及的业务域:
|
|
54
|
+
- `00_context.md` §1 涉及域 / §2.4 依赖服务(如果存在)
|
|
55
|
+
- `01_requirement.md` 影响分析(如果存在)
|
|
56
|
+
- `02_interface.md` 接口归属(如果存在)
|
|
57
|
+
|
|
58
|
+
然后扫描 @spec-canon/domains/ 目录,列出已有的域目录。
|
|
59
|
+
|
|
60
|
+
将提取到的域与已有域目录交叉比对,输出以下清单:
|
|
61
|
+
|
|
62
|
+
| 域名 | 操作类型 | 依据 |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| xxx | UPDATE(已有 domain_spec) | 来源:00_context §X / 01_requirement §X |
|
|
65
|
+
| yyy | CREATE(域目录不存在) | 来源:02_interface §X |
|
|
66
|
+
|
|
67
|
+
**请先输出此清单,等我确认后再逐域执行。**
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
确认后,请按以下流程逐域处理:
|
|
72
|
+
|
|
73
|
+
### 对于 UPDATE 的域
|
|
74
|
+
|
|
75
|
+
阅读 @spec-canon/changes/{{CHANGE}}/ 下的全部 Spec 文档,
|
|
76
|
+
将关键信息回填到对应域的 domain_spec.md。
|
|
77
|
+
要求:
|
|
78
|
+
1. 新增/变更的业务规则 → §1,标注来源变更编号
|
|
79
|
+
2. 状态机变化 → §2
|
|
80
|
+
3. 数据流变化 → §3
|
|
81
|
+
4. 新增接口 → §4
|
|
82
|
+
5. 数据模型变更 → §5
|
|
83
|
+
6. 新坑位 → §6 + 同步到 SKILL.md
|
|
84
|
+
7. 00_context.md 中有而 domain_spec 中没有的信息 → 补充
|
|
85
|
+
请先输出每个域的回填草稿,等我审阅。
|
|
86
|
+
|
|
87
|
+
### 对于 CREATE 的域
|
|
88
|
+
|
|
89
|
+
请检查代码库中是否有该域相关的模块或代码:
|
|
90
|
+
|
|
91
|
+
**如果有相关代码** → 扫描代码库创建:
|
|
92
|
+
阅读 @spec-canon/changes/{{CHANGE}}/ 下的全部 Spec 文档,
|
|
93
|
+
同时扫描代码库中与该域相关的全部模块,
|
|
94
|
+
按照 @spec-canon/templates/domain_spec.md 模板创建 domain_spec.md。要求:
|
|
95
|
+
1. 不只是本次变更涉及的内容——要覆盖该业务域的全部现有行为
|
|
96
|
+
2. 本次变更的 Spec 作为主要信息源,代码库扫描作为补充
|
|
97
|
+
3. 标注信息来源:[Change Spec] 或 [代码库扫描]
|
|
98
|
+
4. 标注置信度:✅ 确定 / ⚠️ 推测 / ❓ 需确认
|
|
99
|
+
5. 评估是否需要子域分拆
|
|
100
|
+
|
|
101
|
+
**如果没有相关代码** → 仅从 Change Spec 创建:
|
|
102
|
+
阅读 @spec-canon/changes/{{CHANGE}}/ 下的全部 Spec 文档,
|
|
103
|
+
按照 @spec-canon/templates/domain_spec.md 模板创建 domain_spec.md。
|
|
104
|
+
这是该领域的首份 domain_spec,请完整录入所有信息。
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 跨域依赖检查
|
|
109
|
+
|
|
110
|
+
所有域处理完毕后,请统一执行以下检查:
|
|
111
|
+
|
|
112
|
+
请对比本次 @spec-canon/changes/{{CHANGE}}/ 的全部 Spec 文档中涉及的跨域依赖
|
|
113
|
+
和 @spec-canon/domains/README.md 中的域间依赖明细,
|
|
114
|
+
检查是否有新增的跨域依赖。如果有,输出 README.md 更新草稿。
|
|
115
|
+
{{/if}}
|