speccore 8.3.340 → 8.3.345

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.
Files changed (246) hide show
  1. package/.agents/skills/speccore-router/SKILL.md +0 -2
  2. package/README.en.md +3 -11
  3. package/README.md +3 -13
  4. package/dist/cli.js +1 -187
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/analyze.d.ts.map +1 -1
  7. package/dist/commands/analyze.js +583 -502
  8. package/dist/commands/analyze.js.map +1 -1
  9. package/dist/commands/ask.d.ts +1 -0
  10. package/dist/commands/ask.d.ts.map +1 -1
  11. package/dist/commands/ask.js +5 -18
  12. package/dist/commands/ask.js.map +1 -1
  13. package/dist/commands/completion.d.ts.map +1 -1
  14. package/dist/commands/completion.js +9 -7
  15. package/dist/commands/completion.js.map +1 -1
  16. package/dist/commands/doctor.js +3 -3
  17. package/dist/commands/doctor.js.map +1 -1
  18. package/dist/commands/done.js +1 -5
  19. package/dist/commands/done.js.map +1 -1
  20. package/dist/commands/execute.js +2 -2
  21. package/dist/commands/execute.js.map +1 -1
  22. package/dist/commands/help.js +5 -54
  23. package/dist/commands/help.js.map +1 -1
  24. package/dist/commands/init.d.ts.map +1 -1
  25. package/dist/commands/init.js +3 -31
  26. package/dist/commands/init.js.map +1 -1
  27. package/dist/commands/iteration/taskify.d.ts.map +1 -1
  28. package/dist/commands/iteration/taskify.js +5 -147
  29. package/dist/commands/iteration/taskify.js.map +1 -1
  30. package/dist/commands/pr.d.ts.map +1 -1
  31. package/dist/commands/pr.js +3 -5
  32. package/dist/commands/pr.js.map +1 -1
  33. package/dist/commands/search.js +1 -1
  34. package/dist/commands/search.js.map +1 -1
  35. package/dist/commands/update-env-configs.d.ts.map +1 -1
  36. package/dist/commands/update-env-configs.js +2 -1
  37. package/dist/commands/update-env-configs.js.map +1 -1
  38. package/dist/commands/update.d.ts +4 -0
  39. package/dist/commands/update.d.ts.map +1 -1
  40. package/dist/commands/update.js +41 -1
  41. package/dist/commands/update.js.map +1 -1
  42. package/dist/commands/welcome.d.ts.map +1 -1
  43. package/dist/commands/welcome.js +37 -36
  44. package/dist/commands/welcome.js.map +1 -1
  45. package/dist/core/analyze-engine.js +3 -3
  46. package/dist/core/analyze-engine.js.map +1 -1
  47. package/dist/core/arbitration/l3-human-arbiter.js +1 -1
  48. package/dist/core/arbitration/l3-human-arbiter.js.map +1 -1
  49. package/dist/core/arbitration/verdict-generator.js +1 -1
  50. package/dist/core/arbitration/verdict-generator.js.map +1 -1
  51. package/dist/core/ask-engine.d.ts.map +1 -1
  52. package/dist/core/ask-engine.js +16 -42
  53. package/dist/core/ask-engine.js.map +1 -1
  54. package/dist/core/code-graph/reporter.d.ts.map +1 -1
  55. package/dist/core/code-graph/reporter.js +3 -12
  56. package/dist/core/code-graph/reporter.js.map +1 -1
  57. package/dist/core/code-graph/requirement-linker.js +1 -1
  58. package/dist/core/code-graph/requirement-linker.js.map +1 -1
  59. package/dist/core/code-scanner.js +1 -1
  60. package/dist/core/code-scanner.js.map +1 -1
  61. package/dist/core/deploy/engine.d.ts.map +1 -1
  62. package/dist/core/deploy/engine.js +58 -44
  63. package/dist/core/deploy/engine.js.map +1 -1
  64. package/dist/core/environment-config.d.ts +2 -0
  65. package/dist/core/environment-config.d.ts.map +1 -1
  66. package/dist/core/environment-config.js +6 -1
  67. package/dist/core/environment-config.js.map +1 -1
  68. package/dist/core/error-diagnosis.js +2 -2
  69. package/dist/core/error-diagnosis.js.map +1 -1
  70. package/dist/core/function-map.d.ts +49 -0
  71. package/dist/core/function-map.d.ts.map +1 -0
  72. package/dist/core/function-map.js +280 -0
  73. package/dist/core/function-map.js.map +1 -0
  74. package/dist/core/git-integration.d.ts +6 -0
  75. package/dist/core/git-integration.d.ts.map +1 -1
  76. package/dist/core/git-integration.js +11 -0
  77. package/dist/core/git-integration.js.map +1 -1
  78. package/dist/core/global-knowledge.js +1 -1
  79. package/dist/core/index-guard.d.ts.map +1 -1
  80. package/dist/core/index-guard.js +4 -26
  81. package/dist/core/index-guard.js.map +1 -1
  82. package/dist/core/intent-recognition.d.ts +1 -1
  83. package/dist/core/intent-recognition.d.ts.map +1 -1
  84. package/dist/core/intent-recognition.js +5 -63
  85. package/dist/core/intent-recognition.js.map +1 -1
  86. package/dist/core/page-bundle.d.ts +25 -0
  87. package/dist/core/page-bundle.d.ts.map +1 -0
  88. package/dist/core/page-bundle.js +144 -0
  89. package/dist/core/page-bundle.js.map +1 -0
  90. package/dist/core/prompt-builder.d.ts +9 -0
  91. package/dist/core/prompt-builder.d.ts.map +1 -1
  92. package/dist/core/prompt-builder.js +135 -3
  93. package/dist/core/prompt-builder.js.map +1 -1
  94. package/dist/core/prompt-plugins/analyze-graph-plugin.js +1 -1
  95. package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -1
  96. package/dist/core/structured-extractor.d.ts +6 -0
  97. package/dist/core/structured-extractor.d.ts.map +1 -1
  98. package/dist/core/structured-extractor.js +6 -0
  99. package/dist/core/structured-extractor.js.map +1 -1
  100. package/dist/core/unified-config.d.ts.map +1 -1
  101. package/dist/core/unified-config.js +29 -19
  102. package/dist/core/unified-config.js.map +1 -1
  103. package/dist/core/usage-analytics.js +1 -1
  104. package/dist/core/usage-analytics.js.map +1 -1
  105. package/package.json +1 -1
  106. package/templates/html/speccore-ask-guide.html +1 -1
  107. package/templates/html/speccore-ask-pipeline.html +1 -1
  108. package/templates/html/speccore-ask-result.html +1 -1
  109. package/templates/html/speccore-help.html +2 -2
  110. package/templates/speccore-yml-example.yml +24 -24
  111. package/dist/commands/audit.d.ts +0 -12
  112. package/dist/commands/audit.d.ts.map +0 -1
  113. package/dist/commands/audit.js +0 -540
  114. package/dist/commands/audit.js.map +0 -1
  115. package/dist/commands/backup.d.ts +0 -18
  116. package/dist/commands/backup.d.ts.map +0 -1
  117. package/dist/commands/backup.js +0 -102
  118. package/dist/commands/backup.js.map +0 -1
  119. package/dist/commands/baseline.d.ts +0 -13
  120. package/dist/commands/baseline.d.ts.map +0 -1
  121. package/dist/commands/baseline.js +0 -227
  122. package/dist/commands/baseline.js.map +0 -1
  123. package/dist/commands/chain.d.ts +0 -55
  124. package/dist/commands/chain.d.ts.map +0 -1
  125. package/dist/commands/chain.js +0 -501
  126. package/dist/commands/chain.js.map +0 -1
  127. package/dist/commands/clarify.d.ts +0 -17
  128. package/dist/commands/clarify.d.ts.map +0 -1
  129. package/dist/commands/clarify.js +0 -351
  130. package/dist/commands/clarify.js.map +0 -1
  131. package/dist/commands/code-index.d.ts +0 -21
  132. package/dist/commands/code-index.d.ts.map +0 -1
  133. package/dist/commands/code-index.js +0 -193
  134. package/dist/commands/code-index.js.map +0 -1
  135. package/dist/commands/context.d.ts +0 -10
  136. package/dist/commands/context.d.ts.map +0 -1
  137. package/dist/commands/context.js +0 -213
  138. package/dist/commands/context.js.map +0 -1
  139. package/dist/commands/current.d.ts +0 -10
  140. package/dist/commands/current.d.ts.map +0 -1
  141. package/dist/commands/current.js +0 -53
  142. package/dist/commands/current.js.map +0 -1
  143. package/dist/commands/dev.d.ts +0 -18
  144. package/dist/commands/dev.d.ts.map +0 -1
  145. package/dist/commands/dev.js +0 -854
  146. package/dist/commands/dev.js.map +0 -1
  147. package/dist/commands/diff.d.ts +0 -10
  148. package/dist/commands/diff.d.ts.map +0 -1
  149. package/dist/commands/diff.js +0 -160
  150. package/dist/commands/diff.js.map +0 -1
  151. package/dist/commands/global-status.d.ts +0 -9
  152. package/dist/commands/global-status.d.ts.map +0 -1
  153. package/dist/commands/global-status.js +0 -135
  154. package/dist/commands/global-status.js.map +0 -1
  155. package/dist/commands/graph.d.ts +0 -25
  156. package/dist/commands/graph.d.ts.map +0 -1
  157. package/dist/commands/graph.js +0 -523
  158. package/dist/commands/graph.js.map +0 -1
  159. package/dist/commands/handover.d.ts +0 -11
  160. package/dist/commands/handover.d.ts.map +0 -1
  161. package/dist/commands/handover.js +0 -170
  162. package/dist/commands/handover.js.map +0 -1
  163. package/dist/commands/health.d.ts +0 -7
  164. package/dist/commands/health.d.ts.map +0 -1
  165. package/dist/commands/health.js +0 -80
  166. package/dist/commands/health.js.map +0 -1
  167. package/dist/commands/history.d.ts +0 -9
  168. package/dist/commands/history.d.ts.map +0 -1
  169. package/dist/commands/history.js +0 -117
  170. package/dist/commands/history.js.map +0 -1
  171. package/dist/commands/impact.d.ts +0 -12
  172. package/dist/commands/impact.d.ts.map +0 -1
  173. package/dist/commands/impact.js +0 -238
  174. package/dist/commands/impact.js.map +0 -1
  175. package/dist/commands/import.d.ts +0 -19
  176. package/dist/commands/import.d.ts.map +0 -1
  177. package/dist/commands/import.js +0 -673
  178. package/dist/commands/import.js.map +0 -1
  179. package/dist/commands/knowledge.d.ts +0 -6
  180. package/dist/commands/knowledge.d.ts.map +0 -1
  181. package/dist/commands/knowledge.js +0 -94
  182. package/dist/commands/knowledge.js.map +0 -1
  183. package/dist/commands/lifecycle.d.ts +0 -9
  184. package/dist/commands/lifecycle.d.ts.map +0 -1
  185. package/dist/commands/lifecycle.js +0 -288
  186. package/dist/commands/lifecycle.js.map +0 -1
  187. package/dist/commands/merge-check.d.ts +0 -10
  188. package/dist/commands/merge-check.d.ts.map +0 -1
  189. package/dist/commands/merge-check.js +0 -183
  190. package/dist/commands/merge-check.js.map +0 -1
  191. package/dist/commands/notify.d.ts +0 -13
  192. package/dist/commands/notify.d.ts.map +0 -1
  193. package/dist/commands/notify.js +0 -63
  194. package/dist/commands/notify.js.map +0 -1
  195. package/dist/commands/rag-index.d.ts +0 -19
  196. package/dist/commands/rag-index.d.ts.map +0 -1
  197. package/dist/commands/rag-index.js +0 -286
  198. package/dist/commands/rag-index.js.map +0 -1
  199. package/dist/commands/recommend.d.ts +0 -13
  200. package/dist/commands/recommend.d.ts.map +0 -1
  201. package/dist/commands/recommend.js +0 -37
  202. package/dist/commands/recommend.js.map +0 -1
  203. package/dist/commands/refresh.d.ts +0 -21
  204. package/dist/commands/refresh.d.ts.map +0 -1
  205. package/dist/commands/refresh.js +0 -211
  206. package/dist/commands/refresh.js.map +0 -1
  207. package/dist/commands/rollback.d.ts +0 -8
  208. package/dist/commands/rollback.d.ts.map +0 -1
  209. package/dist/commands/rollback.js +0 -113
  210. package/dist/commands/rollback.js.map +0 -1
  211. package/dist/commands/status.d.ts +0 -7
  212. package/dist/commands/status.d.ts.map +0 -1
  213. package/dist/commands/status.js +0 -262
  214. package/dist/commands/status.js.map +0 -1
  215. package/dist/commands/trace.d.ts +0 -12
  216. package/dist/commands/trace.d.ts.map +0 -1
  217. package/dist/commands/trace.js +0 -163
  218. package/dist/commands/trace.js.map +0 -1
  219. package/dist/commands/tracker.d.ts +0 -2
  220. package/dist/commands/tracker.d.ts.map +0 -1
  221. package/dist/commands/tracker.js +0 -28
  222. package/dist/commands/tracker.js.map +0 -1
  223. package/dist/commands/verdict.d.ts +0 -16
  224. package/dist/commands/verdict.d.ts.map +0 -1
  225. package/dist/commands/verdict.js +0 -189
  226. package/dist/commands/verdict.js.map +0 -1
  227. package/dist/commands/workspace.d.ts +0 -20
  228. package/dist/commands/workspace.d.ts.map +0 -1
  229. package/dist/commands/workspace.js +0 -142
  230. package/dist/commands/workspace.js.map +0 -1
  231. package/dist/core/constraint-set.d.ts +0 -67
  232. package/dist/core/constraint-set.d.ts.map +0 -1
  233. package/dist/core/constraint-set.js +0 -151
  234. package/dist/core/constraint-set.js.map +0 -1
  235. package/dist/core/smart-recommend.d.ts +0 -16
  236. package/dist/core/smart-recommend.d.ts.map +0 -1
  237. package/dist/core/smart-recommend.js +0 -149
  238. package/dist/core/smart-recommend.js.map +0 -1
  239. package/dist/core/task-type-registry.d.ts +0 -110
  240. package/dist/core/task-type-registry.d.ts.map +0 -1
  241. package/dist/core/task-type-registry.js +0 -334
  242. package/dist/core/task-type-registry.js.map +0 -1
  243. package/dist/utils/mermaid-render.d.ts +0 -39
  244. package/dist/utils/mermaid-render.d.ts.map +0 -1
  245. package/dist/utils/mermaid-render.js +0 -284
  246. package/dist/utils/mermaid-render.js.map +0 -1
@@ -1,540 +0,0 @@
1
- "use strict";
2
- /**
3
- * audit - AI 智能审计命令
4
- * 扫描全量层发现重复需求、歧义描述、潜在冲突、孤立需求
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.auditCommand = auditCommand;
8
- const logger_1 = require("../utils/logger");
9
- const global_layer_1 = require("../core/global-layer");
10
- const context_1 = require("../core/context");
11
- const path_1 = require("path");
12
- const fs_extra_1 = require("fs-extra");
13
- async function auditCommand(options) {
14
- // v6.69.2+: specs 模式审计 020-specs/ 文档质量
15
- if (options.specs) {
16
- await auditSpecsCommand(options);
17
- return;
18
- }
19
- const spinner = new logger_1.Spinner('扫描全量层...');
20
- spinner.start();
21
- try {
22
- const index = await (0, global_layer_1.readGlobalIndex)();
23
- if (index.reqs.length === 0) {
24
- spinner.fail('全量层为空,无法执行审计。请先导入项目。');
25
- return;
26
- }
27
- spinner.stop(`扫描 ${index.reqs.length} 条需求...`);
28
- const issues = [];
29
- // 1. 重复检测
30
- const duplicates = detectDuplicates(index);
31
- issues.push(...duplicates);
32
- // 2. 歧义检测
33
- for (const req of index.reqs) {
34
- const detail = await (0, global_layer_1.readRequirementDetail)(req.project, req.id);
35
- const ambiguous = detectAmbiguity(req, detail || '');
36
- issues.push(...ambiguous);
37
- }
38
- // 3. 孤立检测
39
- const orphans = index.reqs.filter((r) => !r.iteration && r.status !== '🗑️ 已废弃' && r.status !== '📦 已有实现');
40
- for (const req of orphans.slice(0, 10)) {
41
- issues.push({
42
- type: 'orphan',
43
- severity: '🟡',
44
- reqId: req.id,
45
- reqName: req.name,
46
- description: `未关联任何迭代或 Task,处于孤立状态`,
47
- suggestion: `建议纳入近期迭代`,
48
- });
49
- }
50
- // 4. 冲突检测
51
- const conflicts = detectConflicts(index);
52
- issues.push(...conflicts);
53
- // 输出报告
54
- outputAuditReport(issues, index.reqs.length, options.detail || false);
55
- if (options.fix) {
56
- logger_1.logger.info('');
57
- logger_1.logger.info('🔧 --fix 模式:自动标记可修复的问题');
58
- autoFixIssues(issues);
59
- }
60
- }
61
- catch (error) {
62
- spinner.fail(`审计失败: ${error}`);
63
- throw error;
64
- }
65
- }
66
- /**
67
- * 重复检测
68
- */
69
- function detectDuplicates(index) {
70
- const issues = [];
71
- const checked = new Set();
72
- for (let i = 0; i < index.reqs.length; i++) {
73
- for (let j = i + 1; j < index.reqs.length; j++) {
74
- const a = index.reqs[i];
75
- const b = index.reqs[j];
76
- const key = [a.id, b.id].sort().join('|');
77
- if (checked.has(key))
78
- continue;
79
- checked.add(key);
80
- const similarity = calculateSimilarity(a.name, b.name);
81
- if (similarity > 0.8) {
82
- issues.push({
83
- type: 'duplicate',
84
- severity: '🔴',
85
- reqId: `${a.id} ⇔ ${b.id}`,
86
- reqName: `${a.name} / ${b.name}`,
87
- description: `高度重复(相似度 ${Math.round(similarity * 100)}%),来源: ${a.project} / ${b.project}`,
88
- suggestion: '建议合并或明确区分',
89
- });
90
- }
91
- else if (similarity > 0.6) {
92
- issues.push({
93
- type: 'duplicate',
94
- severity: '🟡',
95
- reqId: `${a.id} ⇔ ${b.id}`,
96
- reqName: `${a.name} / ${b.name}`,
97
- description: `可能重复(相似度 ${Math.round(similarity * 100)}%)`,
98
- suggestion: '建议审查是否可合并',
99
- });
100
- }
101
- }
102
- }
103
- return issues;
104
- }
105
- /**
106
- * 简单字符串相似度(Jaccard 系数)
107
- */
108
- function calculateSimilarity(a, b) {
109
- const setA = new Set(a.toLowerCase().split(''));
110
- const setB = new Set(b.toLowerCase().split(''));
111
- const intersection = new Set([...setA].filter((x) => setB.has(x)));
112
- const union = new Set([...setA, ...setB]);
113
- return intersection.size / union.size;
114
- }
115
- /**
116
- * 歧义检测
117
- */
118
- function detectAmbiguity(req, detail) {
119
- const issues = [];
120
- const ambiguousWords = {
121
- '尽快': '指定具体时间或 SLA',
122
- '优先': '明确优先级排序规则',
123
- '及时': '指定具体响应时间',
124
- '大量': '指定具体数字或范围',
125
- '众多': '指定具体数量',
126
- '若干': '指定明确的数量',
127
- '尽量': '改为明确的要求',
128
- '尽可能': '改为明确的约束',
129
- '稳定': '指定可测量的标准(如 99.9%)',
130
- '可靠': '指定可靠的量化指标',
131
- '良好': '指定可测量的质量标准',
132
- '适当': '指定具体的数值',
133
- };
134
- for (const [word, suggestion] of Object.entries(ambiguousWords)) {
135
- if (detail.includes(word)) {
136
- issues.push({
137
- type: 'ambiguous',
138
- severity: '🟡',
139
- reqId: req.id,
140
- reqName: req.name,
141
- description: `发现模糊词汇: "${word}"`,
142
- suggestion,
143
- });
144
- }
145
- }
146
- return issues.slice(0, 3); // 最多保留 3 条
147
- }
148
- /**
149
- * 冲突检测
150
- */
151
- function detectConflicts(index) {
152
- const issues = [];
153
- // 检测同名需求在不同项目中
154
- const nameMap = new Map();
155
- for (const req of index.reqs) {
156
- if (!nameMap.has(req.name))
157
- nameMap.set(req.name, []);
158
- nameMap.get(req.name).push(req.project);
159
- }
160
- for (const [name, projects] of nameMap) {
161
- if (projects.length > 1) {
162
- issues.push({
163
- type: 'conflict',
164
- severity: '🟡',
165
- reqId: '',
166
- reqName: name,
167
- description: `相同需求出现在 ${projects.length} 个项目中: ${projects.join(', ')}`,
168
- suggestion: '检查是否存在重复实现,考虑抽取为公共服务',
169
- });
170
- }
171
- }
172
- return issues.slice(0, 5);
173
- }
174
- /**
175
- * 输出审计报告
176
- */
177
- function outputAuditReport(issues, totalReqs, detail) {
178
- logger_1.logger.info('');
179
- logger_1.logger.info('🤖 AI 智能审计报告');
180
- logger_1.logger.info('');
181
- const duplicates = issues.filter((i) => i.type === 'duplicate');
182
- const ambiguous = issues.filter((i) => i.type === 'ambiguous');
183
- const orphans = issues.filter((i) => i.type === 'orphan');
184
- const conflicts = issues.filter((i) => i.type === 'conflict');
185
- // 重复需求
186
- if (duplicates.length > 0) {
187
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
188
- logger_1.logger.info('🔴 重复需求(建议合并)');
189
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
190
- for (const d of duplicates.slice(0, detail ? 20 : 5)) {
191
- logger_1.logger.info(` ${d.severity} ${d.reqId} | ${d.reqName}`);
192
- logger_1.logger.info(` ${d.description}`);
193
- logger_1.logger.info(` 💡 ${d.suggestion}`);
194
- }
195
- }
196
- // 歧义描述
197
- if (ambiguous.length > 0) {
198
- logger_1.logger.info('');
199
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
200
- logger_1.logger.info('⚠️ 歧义描述(建议量化)');
201
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
202
- for (const a of ambiguous.slice(0, detail ? 20 : 8)) {
203
- logger_1.logger.info(` ${a.severity} ${a.reqId}: ${a.description}`);
204
- logger_1.logger.info(` 💡 ${a.suggestion}`);
205
- }
206
- }
207
- // 冲突
208
- if (conflicts.length > 0) {
209
- logger_1.logger.info('');
210
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
211
- logger_1.logger.info('🔶 潜在冲突');
212
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
213
- for (const c of conflicts) {
214
- logger_1.logger.info(` ${c.severity} ${c.reqName}`);
215
- logger_1.logger.info(` ${c.description}`);
216
- logger_1.logger.info(` 💡 ${c.suggestion}`);
217
- }
218
- }
219
- // 孤立需求
220
- if (orphans.length > 0) {
221
- logger_1.logger.info('');
222
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
223
- logger_1.logger.info('🔶 孤立需求(建议关联迭代)');
224
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
225
- for (const o of orphans.slice(0, detail ? 20 : 8)) {
226
- logger_1.logger.info(` ${o.severity} ${o.reqId}: ${o.description}`);
227
- logger_1.logger.info(` 💡 ${o.suggestion}`);
228
- }
229
- }
230
- // 健康度评分
231
- const dupCount = duplicates.filter((d) => d.severity === '🔴').length;
232
- const dupYellow = duplicates.filter((d) => d.severity === '🟡').length;
233
- const ambCount = ambiguous.length;
234
- const clarityScore = Math.max(0, 100 - ambCount * 5);
235
- const dupScore = Math.max(0, 100 - dupCount * 10 - dupYellow * 5);
236
- const linkScore = Math.max(0, 100 - orphans.length * 5);
237
- const overallScore = Math.round((clarityScore + dupScore + linkScore) / 3);
238
- logger_1.logger.info('');
239
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
240
- logger_1.logger.info(`📊 健康度评分: ${overallScore}/100`);
241
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
242
- logger_1.logger.info(` 需求完整性: ${clarityScore}/100`);
243
- logger_1.logger.info(` 描述清晰度: ${clarityScore}/100`);
244
- logger_1.logger.info(` 关联完整性: ${linkScore}/100`);
245
- logger_1.logger.info(` 重复率: ${dupScore}/100(越低越好)`);
246
- // 总结
247
- logger_1.logger.info('');
248
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
249
- logger_1.logger.info('💡 建议');
250
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
251
- let idx = 1;
252
- if (dupCount > 0) {
253
- logger_1.logger.info(` ${idx++}. 🔴 高优先级: 解决 ${dupCount} 条高度重复需求`);
254
- }
255
- if (ambCount > 0) {
256
- logger_1.logger.info(` ${idx++}. 🟡 中优先级: 量化 ${ambCount} 条模糊描述`);
257
- }
258
- if (orphans.length > 0) {
259
- logger_1.logger.info(` ${idx++}. 🟢 低优先级: 为 ${orphans.length} 条孤立需求关联迭代`);
260
- }
261
- if (issues.length === 0) {
262
- logger_1.logger.info(' 🎉 全量层质量良好,未发现明显问题!');
263
- }
264
- logger_1.logger.info('');
265
- logger_1.logger.info('📋 输入 speccore audit --fix 自动修复可修复的问题');
266
- }
267
- /**
268
- * 自动修复
269
- */
270
- function autoFixIssues(issues) {
271
- let fixed = 0;
272
- for (const issue of issues) {
273
- if (issue.type === 'ambiguous') {
274
- // 自动标记模糊词汇
275
- logger_1.logger.info(` 已标记: ${issue.reqId} - "${issue.description}"`);
276
- fixed++;
277
- }
278
- else if (issue.type === 'orphan') {
279
- // 无法自动关联迭代
280
- logger_1.logger.info(` 需确认: ${issue.reqId} - 请手动关联迭代`);
281
- }
282
- }
283
- logger_1.logger.info('');
284
- logger_1.logger.info(`✅ 已自动处理 ${fixed} 条问题`);
285
- }
286
- async function auditSpecsCommand(options) {
287
- const iteration = await (0, context_1.getDefaultIteration)(options.iteration);
288
- const iterDir = await (0, context_1.getIterationDir)(iteration);
289
- const specDir = (0, path_1.join)(iterDir, '020-specs');
290
- if (!(await (0, fs_extra_1.pathExists)(specDir))) {
291
- logger_1.logger.error(`❌ 未找到 020-specs/ 目录: ${specDir}`);
292
- logger_1.logger.info(' 请先执行 speccore analyze 生成 spec 文档');
293
- return;
294
- }
295
- const spinner = new logger_1.Spinner('扫描 020-specs/ 文档质量...');
296
- spinner.start();
297
- try {
298
- // 收集所有 .md 文件
299
- const files = await collectSpecFiles(specDir);
300
- if (files.length === 0) {
301
- spinner.fail('020-specs/ 为空,无法执行审计');
302
- return;
303
- }
304
- spinner.stop(`扫描 ${files.length} 个 spec 文档...`);
305
- // 读取所有文件内容
306
- const contents = {};
307
- for (const f of files) {
308
- contents[f.relative] = await (0, fs_extra_1.readFile)(f.absolute, 'utf-8');
309
- }
310
- const issues = [];
311
- // 1. 目录结构合法性检查
312
- issues.push(...checkDirectoryStructure(files, specDir));
313
- // 2. 枚举值一致性检查
314
- issues.push(...checkEnumConsistency(contents));
315
- // 3. 接口路径一致性检查
316
- issues.push(...checkApiPathConsistency(contents));
317
- // 4. 功能覆盖完整性检查
318
- issues.push(...checkCoverageGaps(contents, files));
319
- // 输出报告
320
- outputSpecAuditReport(issues, files.length, iteration);
321
- }
322
- catch (error) {
323
- spinner.fail(`审计失败: ${error}`);
324
- throw error;
325
- }
326
- }
327
- async function collectSpecFiles(specDir) {
328
- const files = [];
329
- async function walk(dir, platform) {
330
- const entries = await (0, fs_extra_1.readdir)(dir, { withFileTypes: true });
331
- for (const e of entries) {
332
- const abs = (0, path_1.join)(dir, e.name);
333
- if (e.isDirectory()) {
334
- await walk(abs, e.name);
335
- }
336
- else if (e.name.endsWith('.md')) {
337
- files.push({ relative: (0, path_1.join)(platform, e.name), absolute: abs, platform });
338
- }
339
- }
340
- }
341
- const topEntries = await (0, fs_extra_1.readdir)(specDir, { withFileTypes: true });
342
- for (const e of topEntries) {
343
- const abs = (0, path_1.join)(specDir, e.name);
344
- if (e.isDirectory()) {
345
- await walk(abs, e.name);
346
- }
347
- else if (e.name.endsWith('.md')) {
348
- files.push({ relative: e.name, absolute: abs, platform: 'root' });
349
- }
350
- }
351
- return files;
352
- }
353
- function checkDirectoryStructure(files, specDir) {
354
- const issues = [];
355
- const illegalPatterns = [/^\d+$/, /^\.+$/, /[一-\u9fff]/]; // 纯数字、纯点、含中文
356
- const platforms = new Set(files.map(f => f.platform));
357
- for (const p of platforms) {
358
- if (p === 'root')
359
- continue;
360
- for (const pattern of illegalPatterns) {
361
- if (pattern.test(p)) {
362
- issues.push({
363
- type: 'dir_illegal',
364
- severity: '🔴',
365
- file: p,
366
- description: `非法目录名: "${p}"(不符合端名规范)`,
367
- suggestion: '删除该目录,将文档移动到正确的端目录或 global/ 下',
368
- });
369
- break;
370
- }
371
- }
372
- }
373
- return issues;
374
- }
375
- function checkEnumConsistency(contents) {
376
- const issues = [];
377
- const enumMap = {}; // file -> {enumKey -> definition}
378
- // 提取所有枚举定义(status=0:空闲, type=1:会议 等格式)
379
- const enumRegex = /(\w+)[=::]\s*(\d+)\s*[=:]?\s*([^,\n;;]+)/g;
380
- const enumBlockRegex = /(?:状态|枚举|类型|status|type|enum)[::]?\s*\n?\s*([\s\S]{0,300}?)(?=\n##|\n###|$)/gi;
381
- for (const [file, content] of Object.entries(contents)) {
382
- enumMap[file] = {};
383
- let match;
384
- while ((match = enumRegex.exec(content)) !== null) {
385
- const key = match[1].toLowerCase();
386
- const val = match[2];
387
- const desc = match[3].trim();
388
- enumMap[file][`${key}=${val}`] = desc;
389
- }
390
- }
391
- // 跨文件对比枚举定义
392
- const allKeys = new Set();
393
- for (const defs of Object.values(enumMap)) {
394
- for (const k of Object.keys(defs))
395
- allKeys.add(k);
396
- }
397
- for (const key of allKeys) {
398
- const fileDefs = {};
399
- for (const [file, defs] of Object.entries(enumMap)) {
400
- if (key in defs)
401
- fileDefs[file] = defs[key];
402
- }
403
- const uniqueDefs = new Set(Object.values(fileDefs));
404
- if (uniqueDefs.size > 1) {
405
- issues.push({
406
- type: 'enum_mismatch',
407
- severity: '🔴',
408
- file: Object.keys(fileDefs).join(', '),
409
- description: `枚举值不一致: ${key} → ${Array.from(uniqueDefs).map((d, i) => `[${Object.keys(fileDefs)[i]}] ${d}`).join(' vs ')}`,
410
- suggestion: '统一所有文档中的枚举定义,确保跨文档一致',
411
- });
412
- }
413
- }
414
- return issues;
415
- }
416
- function checkApiPathConsistency(contents) {
417
- const issues = [];
418
- const apiMap = {}; // file -> {path -> method}
419
- // 提取 API 路径(/api/xxx、/v1/xxx 等)
420
- const apiRegex = /(GET|POST|PUT|DELETE|PATCH)\s+([\/\w\-{}]+)/gi;
421
- const mdApiRegex = /\|\s*(GET|POST|PUT|DELETE|PATCH)\s*\|\s*([\/\w\-{}]+)\s*\|/gi;
422
- for (const [file, content] of Object.entries(contents)) {
423
- apiMap[file] = {};
424
- let match;
425
- const combined = content;
426
- while ((match = apiRegex.exec(combined)) !== null) {
427
- const method = match[1].toUpperCase();
428
- const path = normalizeApiPath(match[2]);
429
- apiMap[file][path] = method;
430
- }
431
- while ((match = mdApiRegex.exec(combined)) !== null) {
432
- const method = match[1].toUpperCase();
433
- const path = normalizeApiPath(match[2]);
434
- apiMap[file][path] = method;
435
- }
436
- }
437
- // v8.3.171+: 检查同一端内路径一致性(唯一路径 overview/REQUIREMENT.md)
438
- const globalApis = apiMap['overview/REQUIREMENT.md'] || {};
439
- for (const [file, apis] of Object.entries(apiMap)) {
440
- if (file.includes('overview/') || file === 'REQUIREMENT.md')
441
- continue;
442
- for (const [path, method] of Object.entries(apis)) {
443
- const globalMethod = Object.entries(globalApis).find(([p]) => p === path)?.[1];
444
- if (globalMethod && globalMethod !== method) {
445
- issues.push({
446
- type: 'api_mismatch',
447
- severity: '🟡',
448
- file,
449
- description: `接口方法不一致: ${method} ${path} vs 全局 ${globalMethod} ${path}`,
450
- suggestion: '统一接口方法,确保与全局需求文档一致',
451
- });
452
- }
453
- }
454
- }
455
- return issues;
456
- }
457
- function normalizeApiPath(path) {
458
- // 归一化:去掉末尾斜杠,统一大小写(路径段)
459
- return path.replace(/\/$/, '').toLowerCase();
460
- }
461
- function checkCoverageGaps(contents, files) {
462
- const issues = [];
463
- // 检查 overview/REQUIREMENT.md 是否存在
464
- const hasReq = files.some(f => f.relative.includes('REQUIREMENT.md'));
465
- if (!hasReq) {
466
- issues.push({
467
- type: 'coverage_gap',
468
- severity: '🔴',
469
- file: '020-specs/',
470
- description: '缺少 overview/REQUIREMENT.md(需求规格基线)',
471
- suggestion: '执行 speccore analyze 重新生成迭代综合需求文档',
472
- });
473
- }
474
- // 检查 API_CONTRACT.md 是否存在(v6.69.0+ 契约先行要求)
475
- const hasContract = files.some(f => f.relative.includes('API_CONTRACT.md'));
476
- if (!hasContract) {
477
- issues.push({
478
- type: 'coverage_gap',
479
- severity: '🟡',
480
- file: '020-specs/',
481
- description: '缺少 API_CONTRACT.md(跨端 API 契约)',
482
- suggestion: '建议在 analyze Phase 1 后生成 API_CONTRACT.md,作为 Phase 2 的输入',
483
- });
484
- }
485
- // 检查各端是否都有 TECH.md
486
- const platforms = new Set(files.filter(f => f.platform !== 'root').map(f => f.platform));
487
- for (const p of platforms) {
488
- const hasTech = files.some(f => f.platform === p && f.relative.endsWith('TECH.md'));
489
- if (!hasTech) {
490
- issues.push({
491
- type: 'coverage_gap',
492
- severity: '🟡',
493
- file: `${p}/`,
494
- description: `端 "${p}" 缺少 TECH.md(技术方案)`,
495
- suggestion: '为该端补充技术方案文档',
496
- });
497
- }
498
- }
499
- return issues;
500
- }
501
- function outputSpecAuditReport(issues, fileCount, iteration) {
502
- logger_1.logger.info('');
503
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
504
- logger_1.logger.info(`📋 020-specs/ 质量审计报告 — ${iteration}`);
505
- logger_1.logger.info('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
506
- logger_1.logger.info(` 扫描文档数: ${fileCount}`);
507
- logger_1.logger.info(` 发现问题数: ${issues.length}`);
508
- logger_1.logger.info('');
509
- const groups = {
510
- '🔴 严重': issues.filter(i => i.severity === '🔴'),
511
- '🟡 警告': issues.filter(i => i.severity === '🟡'),
512
- '🟢 提示': issues.filter(i => i.severity === '🟢'),
513
- };
514
- for (const [label, items] of Object.entries(groups)) {
515
- if (items.length === 0)
516
- continue;
517
- logger_1.logger.info(`${label} (${items.length} 项)`);
518
- logger_1.logger.info('────────────────────────────────────');
519
- for (const item of items) {
520
- logger_1.logger.info(` [${item.type}] ${item.file}`);
521
- logger_1.logger.info(` ${item.description}`);
522
- logger_1.logger.info(` 💡 ${item.suggestion}`);
523
- }
524
- logger_1.logger.info('');
525
- }
526
- if (issues.length === 0) {
527
- logger_1.logger.info('🎉 020-specs/ 质量良好,未发现明显问题!');
528
- }
529
- else {
530
- const critical = issues.filter(i => i.severity === '🔴').length;
531
- logger_1.logger.info(`⚠️ 发现 ${issues.length} 个问题(${critical} 个严重),建议修复后再进入 split/execute 阶段`);
532
- logger_1.logger.info('');
533
- logger_1.logger.info('💡 修复建议:');
534
- logger_1.logger.info(' 1. 严重问题:必须修复,否则会影响后续开发');
535
- logger_1.logger.info(' 2. 警告:建议修复,提高文档质量');
536
- logger_1.logger.info(' 3. 可执行 speccore analyze --prompt -I <迭代名> 重新生成有问题的文档');
537
- }
538
- logger_1.logger.info('');
539
- }
540
- //# sourceMappingURL=audit.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/commands/audit.ts"],"names":[],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- /**
2
- * backup — 自动备份与恢复
3
- *
4
- * 在每次修改前自动创建时间戳备份,支持查看和恢复
5
- */
6
- export interface BackupOptions {
7
- list?: boolean;
8
- restore?: string;
9
- }
10
- /**
11
- * 创建一次备份(执行关键操作前调用)
12
- */
13
- export declare function createBackup(label: string): Promise<string | null>;
14
- /**
15
- * 备份命令入口
16
- */
17
- export declare function backupCommand(options: BackupOptions): Promise<void>;
18
- //# sourceMappingURL=backup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID;;GAEG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4BxE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBzE"}