sillyspec 3.14.0 → 3.14.1
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
CHANGED
package/src/init.js
CHANGED
|
@@ -125,6 +125,22 @@ async function doInstall(projectDir, tools, subprojects = []) {
|
|
|
125
125
|
const gitkeepPath = join(scanDir, '.gitkeep');
|
|
126
126
|
if (!existsSync(gitkeepPath)) writeFileSync(gitkeepPath, '');
|
|
127
127
|
|
|
128
|
+
// 复制 workflow 模板到 .sillyspec/workflows/
|
|
129
|
+
const workflowsDir = join(projectDir, '.sillyspec', 'workflows');
|
|
130
|
+
const templatesDir = join(__dirname, '..', 'templates', 'workflows');
|
|
131
|
+
if (existsSync(templatesDir)) {
|
|
132
|
+
mkdirSync(workflowsDir, { recursive: true });
|
|
133
|
+
for (const file of readdirSync(templatesDir)) {
|
|
134
|
+
if (file.endsWith('.yaml')) {
|
|
135
|
+
const srcPath = join(templatesDir, file);
|
|
136
|
+
const dstPath = join(workflowsDir, file);
|
|
137
|
+
if (!existsSync(dstPath)) {
|
|
138
|
+
writeFileSync(dstPath, readFileSync(srcPath));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
128
144
|
// 创建 shared/workspace 目录
|
|
129
145
|
mkdirSync(join(projectDir, '.sillyspec', 'shared'), { recursive: true });
|
|
130
146
|
mkdirSync(join(projectDir, '.sillyspec', 'workspace'), { recursive: true });
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
name: archive-impact
|
|
2
|
+
description: 分析变更影响的模块并同步模块文档
|
|
3
|
+
spec_version: 1
|
|
4
|
+
|
|
5
|
+
roles:
|
|
6
|
+
- id: impact-analyzer
|
|
7
|
+
name: "影响分析"
|
|
8
|
+
task: "分析 git diff,提取变更影响模块"
|
|
9
|
+
inputs:
|
|
10
|
+
paths: [".sillyspec/changes/", ".sillyspec/docs/*/modules/"]
|
|
11
|
+
hints:
|
|
12
|
+
grep_patterns: ["_module-map", "module-impact", "git diff"]
|
|
13
|
+
outputs:
|
|
14
|
+
- path: ".sillyspec/changes/<change-name>/module-impact.md"
|
|
15
|
+
required: true
|
|
16
|
+
checks:
|
|
17
|
+
- type: file_exists
|
|
18
|
+
- type: min_lines
|
|
19
|
+
min: 20
|
|
20
|
+
- type: contains_sections
|
|
21
|
+
sections: ["模块影响矩阵", "未匹配文件"]
|
|
22
|
+
constraints:
|
|
23
|
+
- "以 git diff 为准(真实 > 声明)"
|
|
24
|
+
- "影响类型:逻辑变更/数据结构变更/接口变更/调用关系变更/配置变更/新增"
|
|
25
|
+
- "需要 review 标记不确定的影响"
|
|
26
|
+
|
|
27
|
+
- id: doc-syncer
|
|
28
|
+
name: "文档同步"
|
|
29
|
+
task: "根据 module-impact.md 同步更新模块索引和卡片"
|
|
30
|
+
depends_on:
|
|
31
|
+
- impact-analyzer
|
|
32
|
+
inputs:
|
|
33
|
+
from_role: impact-analyzer
|
|
34
|
+
output: module-impact
|
|
35
|
+
output_description: "变更影响分析结果,包含模块影响矩阵"
|
|
36
|
+
paths: [".sillyspec/docs/*/modules/"]
|
|
37
|
+
hints:
|
|
38
|
+
grep_patterns: ["_module-map", "module-impact"]
|
|
39
|
+
outputs:
|
|
40
|
+
- path: ".sillyspec/docs/sillyspec/modules/_module-map.yaml"
|
|
41
|
+
required: false
|
|
42
|
+
checks:
|
|
43
|
+
- type: file_exists
|
|
44
|
+
- path: ".sillyspec/docs/sillyspec/modules/<module-id>.md"
|
|
45
|
+
required: false
|
|
46
|
+
# checks 跳过:路径含动态 <module-id> 占位符,不适合静态检查
|
|
47
|
+
constraints:
|
|
48
|
+
- "结构化事实改 _module-map.yaml,语义解释改模块卡片"
|
|
49
|
+
- "人工备注区域永远保护,不覆盖"
|
|
50
|
+
- "更新前展示 diff 摘要,请用户确认"
|
|
51
|
+
|
|
52
|
+
orchestration:
|
|
53
|
+
mode: sequential
|
|
54
|
+
timeout_per_role: 180
|
|
55
|
+
|
|
56
|
+
checks:
|
|
57
|
+
role_level:
|
|
58
|
+
- type: file_exists
|
|
59
|
+
- type: min_lines
|
|
60
|
+
min: 10
|
|
61
|
+
workflow_level:
|
|
62
|
+
- type: file_exists
|
|
63
|
+
path: ".sillyspec/changes/<change-name>/module-impact.md"
|
|
64
|
+
|
|
65
|
+
retry:
|
|
66
|
+
max_attempts: 1
|
|
67
|
+
include_failure_context: true
|
|
68
|
+
retry_scope: failed_role_only
|
|
69
|
+
|
|
70
|
+
on_check_failure: prompt_retry
|
|
71
|
+
|
|
72
|
+
permissions:
|
|
73
|
+
write_mode: patch_only
|
|
74
|
+
write_scope:
|
|
75
|
+
- ".sillyspec/docs/"
|
|
76
|
+
- ".sillyspec/changes/<change-name>/"
|
|
77
|
+
allow_shell: true
|
|
78
|
+
allow_network: false
|
|
79
|
+
allow_git: true
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
name: scan-docs
|
|
2
|
+
description: 并行生成项目的扫描文档(7份)
|
|
3
|
+
spec_version: 1
|
|
4
|
+
|
|
5
|
+
roles:
|
|
6
|
+
- id: arch
|
|
7
|
+
name: "技术架构"
|
|
8
|
+
task: "生成 ARCHITECTURE.md"
|
|
9
|
+
inputs:
|
|
10
|
+
paths:
|
|
11
|
+
- "src/*.js"
|
|
12
|
+
- "package.json"
|
|
13
|
+
hints:
|
|
14
|
+
grep_patterns: ["class ", "export ", "import ", "schema", "CREATE TABLE"]
|
|
15
|
+
outputs:
|
|
16
|
+
- path: ".sillyspec/docs/<project>/scan/ARCHITECTURE.md"
|
|
17
|
+
required: true
|
|
18
|
+
checks:
|
|
19
|
+
- type: file_exists
|
|
20
|
+
- type: min_lines
|
|
21
|
+
min: 20
|
|
22
|
+
- type: contains_sections
|
|
23
|
+
sections: ["技术栈", "架构概览"]
|
|
24
|
+
constraints:
|
|
25
|
+
- "禁止读源码全文,只用 grep/rg 搜索"
|
|
26
|
+
- "Schema 只记表名+说明+字段数"
|
|
27
|
+
|
|
28
|
+
- id: conventions
|
|
29
|
+
name: "代码约定"
|
|
30
|
+
task: "生成 CONVENTIONS.md"
|
|
31
|
+
inputs:
|
|
32
|
+
paths: ["src/"]
|
|
33
|
+
hints:
|
|
34
|
+
grep_patterns: ["function ", "const ", "async ", "try ", "catch "]
|
|
35
|
+
outputs:
|
|
36
|
+
- path: ".sillyspec/docs/<project>/scan/CONVENTIONS.md"
|
|
37
|
+
required: true
|
|
38
|
+
checks:
|
|
39
|
+
- type: file_exists
|
|
40
|
+
- type: min_lines
|
|
41
|
+
min: 15
|
|
42
|
+
- type: contains_sections
|
|
43
|
+
sections: ["框架隐形规则", "代码风格"]
|
|
44
|
+
constraints:
|
|
45
|
+
- "禁止读源码全文"
|
|
46
|
+
- "提取 3-5 个典型模式"
|
|
47
|
+
|
|
48
|
+
- id: structure
|
|
49
|
+
name: "目录结构+外部集成"
|
|
50
|
+
task: "生成 STRUCTURE.md 和 INTEGRATIONS.md"
|
|
51
|
+
inputs:
|
|
52
|
+
paths: ["./"]
|
|
53
|
+
hints:
|
|
54
|
+
grep_patterns: ["fetch", "http", "WebSocket", "ws", "chokidar"]
|
|
55
|
+
outputs:
|
|
56
|
+
- path: ".sillyspec/docs/<project>/scan/STRUCTURE.md"
|
|
57
|
+
required: true
|
|
58
|
+
checks:
|
|
59
|
+
- type: file_exists
|
|
60
|
+
- type: min_lines
|
|
61
|
+
min: 15
|
|
62
|
+
- path: ".sillyspec/docs/<project>/scan/INTEGRATIONS.md"
|
|
63
|
+
required: true
|
|
64
|
+
checks:
|
|
65
|
+
- type: file_exists
|
|
66
|
+
- type: min_lines
|
|
67
|
+
min: 15
|
|
68
|
+
constraints:
|
|
69
|
+
- "STRUCTURE: 目录树+模块说明"
|
|
70
|
+
- "INTEGRATIONS: 按类型分组外部依赖"
|
|
71
|
+
|
|
72
|
+
- id: quality
|
|
73
|
+
name: "测试+债务+概览"
|
|
74
|
+
task: "生成 TESTING.md、CONCERNS.md、PROJECT.md"
|
|
75
|
+
inputs:
|
|
76
|
+
paths: ["src/", "packages/"]
|
|
77
|
+
hints:
|
|
78
|
+
grep_patterns: ["TODO", "FIXME", "deprecated", "test", "describe"]
|
|
79
|
+
outputs:
|
|
80
|
+
- path: ".sillyspec/docs/<project>/scan/TESTING.md"
|
|
81
|
+
required: true
|
|
82
|
+
checks:
|
|
83
|
+
- type: file_exists
|
|
84
|
+
- type: min_lines
|
|
85
|
+
min: 10
|
|
86
|
+
- type: no_placeholder
|
|
87
|
+
- path: ".sillyspec/docs/<project>/scan/CONCERNS.md"
|
|
88
|
+
required: true
|
|
89
|
+
checks:
|
|
90
|
+
- type: file_exists
|
|
91
|
+
- type: min_lines
|
|
92
|
+
min: 10
|
|
93
|
+
- type: contains_sections
|
|
94
|
+
sections: ["代码质量", "依赖风险"]
|
|
95
|
+
- path: ".sillyspec/docs/<project>/scan/PROJECT.md"
|
|
96
|
+
required: true
|
|
97
|
+
checks:
|
|
98
|
+
- type: file_exists
|
|
99
|
+
- type: min_lines
|
|
100
|
+
min: 15
|
|
101
|
+
- type: contains_sections
|
|
102
|
+
sections: ["项目简介", "技术栈"]
|
|
103
|
+
constraints:
|
|
104
|
+
- "CONCERNS 按严重程度分组(🔴/🟡/🟢)"
|
|
105
|
+
- "不编造不存在的测试"
|
|
106
|
+
|
|
107
|
+
orchestration:
|
|
108
|
+
mode: parallel
|
|
109
|
+
max_concurrent: 4
|
|
110
|
+
timeout_per_role: 120
|
|
111
|
+
|
|
112
|
+
checks:
|
|
113
|
+
workflow_level:
|
|
114
|
+
- type: file_count
|
|
115
|
+
path: "scan/"
|
|
116
|
+
min: 7
|
|
117
|
+
- type: no_empty_files
|
|
118
|
+
|
|
119
|
+
retry:
|
|
120
|
+
max_attempts: 1
|
|
121
|
+
include_failure_context: true
|
|
122
|
+
retry_scope: failed_role_only
|
|
123
|
+
|
|
124
|
+
on_check_failure: prompt_retry
|
|
125
|
+
|
|
126
|
+
permissions:
|
|
127
|
+
write_mode: direct
|
|
128
|
+
write_scope:
|
|
129
|
+
- ".sillyspec/docs/<project>/scan/"
|
|
130
|
+
allow_shell: true
|
|
131
|
+
allow_network: false
|
|
132
|
+
allow_git: false
|