sillyspec 3.10.7 → 3.11.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/package.json +1 -1
- package/src/stages/archive.js +127 -4
- package/src/stages/execute.js +7 -1
- package/src/stages/plan.js +7 -1
- package/src/stages/propose.js +7 -1
- package/src/stages/quick.js +11 -1
- package/src/stages/scan.js +45 -0
- package/src/stages/verify.js +8 -2
package/package.json
CHANGED
package/src/stages/archive.js
CHANGED
|
@@ -18,19 +18,141 @@ export const definition = {
|
|
|
18
18
|
outputHint: '完成度报告',
|
|
19
19
|
optional: false
|
|
20
20
|
},
|
|
21
|
+
{
|
|
22
|
+
name: 'extract-module-impact',
|
|
23
|
+
prompt: `分析本次变更影响的模块,生成模块影响记录。
|
|
24
|
+
|
|
25
|
+
### 操作
|
|
26
|
+
1. 读取变更目录下的 proposal.md、design.md、tasks.md
|
|
27
|
+
2. 运行 \`git diff --name-only HEAD~1\`(或 \`git diff --name-only --cached\`)获取真实修改文件列表
|
|
28
|
+
3. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`
|
|
29
|
+
- **如果不存在**:提示"建议运行 scan 生成模块映射",但继续执行。跳到步骤 7 生成只有 unmapped 部分的 module-impact.md
|
|
30
|
+
4. 三重交叉验证:
|
|
31
|
+
- 声明范围:proposal.md / design.md 中的"变更范围"/"文件变更清单"
|
|
32
|
+
- 任务范围:tasks.md / plan.md 中的任务文件路径
|
|
33
|
+
- 真实变更:git diff 文件列表
|
|
34
|
+
- **以 git diff 为准**(真实 > 声明)
|
|
35
|
+
5. 将 git diff 文件按 \`_module-map.yaml\` 的 paths glob 匹配到模块
|
|
36
|
+
6. 生成模块影响矩阵:
|
|
37
|
+
|
|
38
|
+
| 模块 | 影响类型 | 相关文件 | 更新内容摘要 |
|
|
39
|
+
|------|----------|----------|-------------|
|
|
40
|
+
|
|
41
|
+
影响类型:逻辑变更 / 数据结构变更 / 接口变更 / 调用关系变更 / 配置变更 / 新增
|
|
42
|
+
|
|
43
|
+
7. 未匹配到任何模块的文件归入"未匹配文件"表格
|
|
44
|
+
8. 生成 \`.sillyspec/changes/<change-name>/module-impact.md\`,格式:
|
|
45
|
+
|
|
46
|
+
\`\`\`markdown
|
|
47
|
+
# 模块影响分析
|
|
48
|
+
|
|
49
|
+
author: <git用户名>
|
|
50
|
+
created_at: <YYYY-MM-DD HH:mm:ss>
|
|
51
|
+
|
|
52
|
+
## 变更:<change-name>
|
|
53
|
+
|
|
54
|
+
## 模块影响矩阵
|
|
55
|
+
| 模块 | 影响类型 | 相关文件 | 更新内容摘要 |
|
|
56
|
+
|------|----------|----------|-------------|
|
|
57
|
+
|
|
58
|
+
## 未匹配文件
|
|
59
|
+
| 文件路径 | 说明 |
|
|
60
|
+
|----------|------|
|
|
61
|
+
|
|
62
|
+
## 更新结果
|
|
63
|
+
(sync-module-docs 步骤完成后回填)
|
|
64
|
+
| 模块文档 | 操作 | 状态 |
|
|
65
|
+
|----------|------|------|
|
|
66
|
+
\`\`\`
|
|
67
|
+
|
|
68
|
+
### 输出
|
|
69
|
+
module-impact.md 路径 + 影响模块数量 + 未匹配文件数量`,
|
|
70
|
+
outputHint: 'module-impact.md 路径 + 影响摘要',
|
|
71
|
+
optional: false
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: 'sync-module-docs',
|
|
75
|
+
prompt: `根据 module-impact.md 同步更新模块设计文档。
|
|
76
|
+
|
|
77
|
+
### 原则
|
|
78
|
+
- 模块文档正文**永远描述当前状态**(快照模式),不是变更日志
|
|
79
|
+
- 底部只保留轻量变更索引
|
|
80
|
+
- 模块文档是下一次 AI 开发前必须读取的上下文
|
|
81
|
+
|
|
82
|
+
### 操作
|
|
83
|
+
1. 读取 \`.sillyspec/changes/<change-name>/module-impact.md\`
|
|
84
|
+
2. 如果没有受影响模块(只有 unmapped)→ 提示用户,跳过同步
|
|
85
|
+
3. 对每个受影响模块:
|
|
86
|
+
a. 读取 \`.sillyspec/docs/<project>/modules/<module>.md\`(如不存在则新建)
|
|
87
|
+
b. 根据 module-impact.md 中的"更新内容摘要",更新模块文档
|
|
88
|
+
c. **更新规则**:
|
|
89
|
+
- 新建:全量生成,使用下方模板
|
|
90
|
+
- 更新:只改相关章节(当前设计/对外接口/依赖关系等),保持其他章节不变
|
|
91
|
+
- 正文重写为当前状态,不追加历史
|
|
92
|
+
- 底部"变更索引"追加一行:\`| <日期> | <变更名> | <一句话摘要> |\`
|
|
93
|
+
d. 更新头部元数据:\`> 最后更新:YYYY-MM-DD\`、\`> 最近变更:<change-name>\`
|
|
94
|
+
4. 展示所有模块文档的更新内容(diff 摘要),请用户确认
|
|
95
|
+
5. 用户确认后,写入 \`.sillyspec/docs/<project>/modules/*.md\`
|
|
96
|
+
6. 用户拒绝时,不写入模块文档,但提示"module-impact.md 已保留,可稍后手动同步"
|
|
97
|
+
7. 回填 module-impact.md 的"更新结果"表格
|
|
98
|
+
|
|
99
|
+
### 模块文档模板
|
|
100
|
+
\`\`\`markdown
|
|
101
|
+
# <module-name>
|
|
102
|
+
|
|
103
|
+
> 最后更新:YYYY-MM-DD
|
|
104
|
+
> 最近变更:<change-name>
|
|
105
|
+
> 模块路径:<glob patterns>
|
|
106
|
+
|
|
107
|
+
## 职责
|
|
108
|
+
(一句话说清这个模块做什么)
|
|
109
|
+
|
|
110
|
+
## 当前设计
|
|
111
|
+
(架构、数据流、关键逻辑 — 描述当前状态,不是历史)
|
|
112
|
+
|
|
113
|
+
## 对外接口
|
|
114
|
+
| 接口 | 说明 | 调用方 |
|
|
115
|
+
|------|------|--------|
|
|
116
|
+
|
|
117
|
+
## 关键数据流
|
|
118
|
+
\`\`\`text
|
|
119
|
+
调用方 → 模块.方法() → 依赖模块.方法() → 返回结果
|
|
120
|
+
\`\`\`
|
|
121
|
+
|
|
122
|
+
## 设计决策
|
|
123
|
+
| 决策 | 理由 | 来源 |
|
|
124
|
+
|------|------|------|
|
|
125
|
+
|
|
126
|
+
## 依赖关系
|
|
127
|
+
### 依赖本模块
|
|
128
|
+
### 本模块依赖
|
|
129
|
+
|
|
130
|
+
## 注意事项
|
|
131
|
+
(维护提醒、已知限制、修改时需同步检查的模块)
|
|
132
|
+
|
|
133
|
+
## 变更索引
|
|
134
|
+
| 日期 | 变更 | 摘要 |
|
|
135
|
+
|------|------|------|
|
|
136
|
+
\`\`\`
|
|
137
|
+
|
|
138
|
+
### 输出
|
|
139
|
+
已更新的模块文档路径列表 + 用户确认状态`,
|
|
140
|
+
outputHint: '模块文档更新结果',
|
|
141
|
+
optional: false
|
|
142
|
+
},
|
|
21
143
|
{
|
|
22
144
|
name: '确认归档',
|
|
23
145
|
prompt: `展示即将归档的内容,请用户确认。
|
|
24
146
|
|
|
25
147
|
### 操作
|
|
26
|
-
1.
|
|
148
|
+
1. 展示:变更目录名、包含的文件列表(含 module-impact.md)、生成总结
|
|
27
149
|
2. 请用户确认是否执行归档
|
|
28
|
-
3. 确认后:将
|
|
150
|
+
3. 确认后:将 \`.sillyspec/changes/<change-name>/\` 移动到 \`.sillyspec/changes/archive/YYYY-MM-DD-<change-name>/\`
|
|
29
151
|
4. 确保所有 checkbox 都已勾选
|
|
30
152
|
|
|
31
153
|
### 归档执行
|
|
32
154
|
确认归档后,执行以下命令自动完成目录移动:
|
|
33
|
-
\
|
|
155
|
+
\t\tsillyspec run archive --done --confirm --output "确认归档"
|
|
34
156
|
- \`--confirm\` 标志会自动执行目录移动(原子操作)
|
|
35
157
|
- 不带 \`--confirm\` 则只提示需要确认
|
|
36
158
|
|
|
@@ -46,7 +168,8 @@ export const definition = {
|
|
|
46
168
|
### 操作
|
|
47
169
|
1. 如果 \`.sillyspec/ROADMAP.md\` 存在,标记对应 Phase 为已完成
|
|
48
170
|
2. \`git add .sillyspec/changes/\` — 暂存归档结果(不要 commit,由用户通过统一提交工具处理)
|
|
49
|
-
3.
|
|
171
|
+
3. \`git add .sillyspec/docs/\` — 暂存模块文档更新(如有)
|
|
172
|
+
4. 更新 progress.json:
|
|
50
173
|
- 清除当前变更信息(归档后不再活跃)
|
|
51
174
|
- 如果是主变更(有 MASTER.md),标记所有阶段为 ✅,然后清除
|
|
52
175
|
- 历史记录追加时间 + 归档完成
|
package/src/stages/execute.js
CHANGED
|
@@ -36,8 +36,14 @@ const fixedPrefix = [
|
|
|
36
36
|
4. 读取 local.yaml(构建命令)
|
|
37
37
|
5. 加载 CODEBASE-OVERVIEW.md
|
|
38
38
|
|
|
39
|
+
### 模块文档加载
|
|
40
|
+
6. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
41
|
+
7. 根据 plan.md 中的任务文件路径匹配 _module-map.yaml 中的模块
|
|
42
|
+
8. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
|
|
43
|
+
9. 实现代码时遵循模块文档中描述的接口约定、数据流和依赖关系
|
|
44
|
+
|
|
39
45
|
### 输出
|
|
40
|
-
|
|
46
|
+
已加载的上下文摘要(含模块文档)`,
|
|
41
47
|
outputHint: '上下文摘要',
|
|
42
48
|
optional: false
|
|
43
49
|
},
|
package/src/stages/plan.js
CHANGED
|
@@ -33,8 +33,14 @@ export const fixedPrefix = [
|
|
|
33
33
|
3. 读取 CONVENTIONS.md、ARCHITECTURE.md、STACK.md
|
|
34
34
|
4. 读取 local.yaml 获取构建/测试命令
|
|
35
35
|
|
|
36
|
+
### 模块文档加载
|
|
37
|
+
5. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
38
|
+
6. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
|
|
39
|
+
7. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
|
|
40
|
+
8. 将模块文档作为制定计划的上下文,确保计划符合模块当前设计
|
|
41
|
+
|
|
36
42
|
### 输出
|
|
37
|
-
|
|
43
|
+
已加载的文件清单(含模块文档)`,
|
|
38
44
|
outputHint: '文件清单',
|
|
39
45
|
optional: false
|
|
40
46
|
},
|
package/src/stages/propose.js
CHANGED
|
@@ -26,8 +26,14 @@ export const definition = {
|
|
|
26
26
|
2. 读取最新设计文档、需求文档、代码库约定
|
|
27
27
|
3. 如果是子阶段变更,读取 MASTER.md 和前序阶段设计
|
|
28
28
|
|
|
29
|
+
### 模块文档加载
|
|
30
|
+
4. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
31
|
+
5. 根据当前提案初步判断涉及的模块(匹配提案中的文件路径到 _module-map.yaml 的 paths)
|
|
32
|
+
6. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
|
|
33
|
+
7. 如果发现提案中的变更范围与某个模块文档描述的当前设计存在潜在冲突,在后续提案中明确标注并说明处理方案
|
|
34
|
+
|
|
29
35
|
### 输出
|
|
30
|
-
|
|
36
|
+
已加载的文件列表(含模块文档)`,
|
|
31
37
|
outputHint: '文件列表',
|
|
32
38
|
optional: false
|
|
33
39
|
},
|
package/src/stages/quick.js
CHANGED
|
@@ -68,8 +68,18 @@ export const definition = {
|
|
|
68
68
|
4. 如果发现项目特有的坑,追加到 \`.sillyspec/knowledge/uncategorized.md\`
|
|
69
69
|
5. 任务比预期复杂 → 建议用完整流程
|
|
70
70
|
|
|
71
|
+
### 模块文档同步
|
|
72
|
+
6. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
73
|
+
7. 对比本次修改的文件(\`git diff --name-only\`)与模块映射
|
|
74
|
+
8. 如果命中模块 → 直接同步模块文档:
|
|
75
|
+
- 读取对应的 \`.sillyspec/docs/<project>/modules/<module>.md\`(如不存在则新建)
|
|
76
|
+
- 根据本次改动内容更新模块文档(正文描述当前状态,底部追加变更索引)
|
|
77
|
+
- 写入模块文档
|
|
78
|
+
- 将更新的模块文件加入 \`git add\`
|
|
79
|
+
9. 未命中任何模块 → 跳过,不做额外操作
|
|
80
|
+
|
|
71
81
|
### 输出
|
|
72
|
-
暂存确认 +
|
|
82
|
+
暂存确认 + 记录路径 + 模块文档同步结果(如有)`,
|
|
73
83
|
outputHint: '暂存和记录确认',
|
|
74
84
|
optional: false
|
|
75
85
|
}
|
package/src/stages/scan.js
CHANGED
|
@@ -158,6 +158,51 @@ local.yaml 生成结果(已存在/已生成)`,
|
|
|
158
158
|
outputHint: 'local.yaml 生成状态',
|
|
159
159
|
optional: false
|
|
160
160
|
},
|
|
161
|
+
{
|
|
162
|
+
name: '生成模块映射',
|
|
163
|
+
prompt: `生成模块映射配置文件,建立"文件路径 → 模块"的稳定映射。
|
|
164
|
+
|
|
165
|
+
### 操作
|
|
166
|
+
1. 检查 \.sillyspec/docs/<project>/modules/_module-map.yaml\` 是否已存在,已存在则跳过
|
|
167
|
+
2. 分析项目 src/ 目录结构(或主代码目录),识别模块划分:
|
|
168
|
+
- 用 \`find . -maxdepth 2 -type d -not -path "*/node_modules/*" -not -path "*/.git/*"\` 查看目录结构
|
|
169
|
+
- 每个独立目录(有明确职责的)识别为一个模块
|
|
170
|
+
- 路径用 glob 模式(如 \`src/auth/**\`)
|
|
171
|
+
3. 生成 \.sillyspec/docs/<project>/modules/_module-map.yaml\`
|
|
172
|
+
4. 如果 modules/ 目录不存在,先创建
|
|
173
|
+
5. 原子写入(先写 tmp 文件再 rename)
|
|
174
|
+
|
|
175
|
+
### YAML 格式
|
|
176
|
+
\`\`\`yaml
|
|
177
|
+
# 模块映射(自动生成,可手动修改)
|
|
178
|
+
# 用于 archive 阶段识别变更影响的模块
|
|
179
|
+
modules:
|
|
180
|
+
<module-name>:
|
|
181
|
+
paths:
|
|
182
|
+
- <glob-pattern>
|
|
183
|
+
description: <一句话描述>
|
|
184
|
+
\`\`\`
|
|
185
|
+
|
|
186
|
+
### 示例
|
|
187
|
+
\`\`\`yaml
|
|
188
|
+
modules:
|
|
189
|
+
core:
|
|
190
|
+
paths:
|
|
191
|
+
- src/core/**
|
|
192
|
+
- src/utils/**
|
|
193
|
+
description: 核心工具和公共逻辑
|
|
194
|
+
|
|
195
|
+
stages:
|
|
196
|
+
paths:
|
|
197
|
+
- src/stages/**
|
|
198
|
+
description: 阶段定义(brainstorm/plan/execute/verify/archive等)
|
|
199
|
+
\`\`\`
|
|
200
|
+
|
|
201
|
+
### 输出
|
|
202
|
+
_module-map.yaml 生成结果(已存在/已生成/模块列表)`,
|
|
203
|
+
outputHint: '_module-map.yaml 生成状态',
|
|
204
|
+
optional: true
|
|
205
|
+
},
|
|
161
206
|
{
|
|
162
207
|
name: '自检和提交',
|
|
163
208
|
prompt: `验证扫描完整性,清理并提交。
|
package/src/stages/verify.js
CHANGED
|
@@ -27,8 +27,13 @@ export const definition = {
|
|
|
27
27
|
4. 加载代码规范:\`cat .sillyspec/docs/<project>/scan/CONVENTIONS.md 2>/dev/null\`
|
|
28
28
|
5. 标注每个文件的存在/不存在状态
|
|
29
29
|
|
|
30
|
+
### 模块文档加载
|
|
31
|
+
6. 读取 \`.sillyspec/docs/<project>/modules/_module-map.yaml\`(不存在则跳过以下步骤)
|
|
32
|
+
7. 根据 design.md 的文件变更清单匹配 _module-map.yaml 中的模块
|
|
33
|
+
8. 读取匹配到的 \`.sillyspec/docs/<project>/modules/<module>.md\`
|
|
34
|
+
|
|
30
35
|
### 输出
|
|
31
|
-
|
|
36
|
+
文件加载确认清单(含模块文档)`,
|
|
32
37
|
outputHint: '文件确认清单',
|
|
33
38
|
optional: false
|
|
34
39
|
},
|
|
@@ -95,9 +100,10 @@ grep -rl "<关键词>" <源码目录>/ --include="*.java" --include="*.js" --inc
|
|
|
95
100
|
3. 数据模型是否符合
|
|
96
101
|
4. API 设计是否符合
|
|
97
102
|
5. **Reverse Sync 检查**:如果发现实现合理但 design.md 未覆盖,先更新 design.md 补充遗漏
|
|
103
|
+
6. **模块文档一致性检查**:如果在"加载规范并锚定"步骤中加载了模块文档,检查实现是否符合模块文档描述的当前设计(特别关注接口签名、数据流、依赖关系)。不符合时标记 ⚠️(不阻断,模块文档可能未及时更新)
|
|
98
104
|
|
|
99
105
|
### 输出
|
|
100
|
-
探针报告 +
|
|
106
|
+
探针报告 + 设计一致性检查结果 + 模块文档一致性检查结果`,
|
|
101
107
|
outputHint: '设计一致性报告',
|
|
102
108
|
optional: false
|
|
103
109
|
},
|