speccore 8.3.349 → 8.3.366

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 (274) hide show
  1. package/.agents/skills/spec-unitize/SKILL.md +5 -1
  2. package/.agents/skills/spec-verify/SKILL.md +22 -1
  3. package/dist/cli.js +19 -2
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/about.d.ts.map +1 -1
  6. package/dist/commands/about.js +36 -1
  7. package/dist/commands/about.js.map +1 -1
  8. package/dist/commands/analyze/add-platform.d.ts +3 -0
  9. package/dist/commands/analyze/add-platform.d.ts.map +1 -0
  10. package/dist/commands/analyze/add-platform.js +82 -0
  11. package/dist/commands/analyze/add-platform.js.map +1 -0
  12. package/dist/commands/analyze/audit-fix.d.ts +3 -0
  13. package/dist/commands/analyze/audit-fix.d.ts.map +1 -0
  14. package/dist/commands/analyze/audit-fix.js +73 -0
  15. package/dist/commands/analyze/audit-fix.js.map +1 -0
  16. package/dist/commands/analyze/context-guard.d.ts +3 -0
  17. package/dist/commands/analyze/context-guard.d.ts.map +1 -0
  18. package/dist/commands/analyze/context-guard.js +75 -0
  19. package/dist/commands/analyze/context-guard.js.map +1 -0
  20. package/dist/commands/analyze/doc.d.ts +3 -0
  21. package/dist/commands/analyze/doc.d.ts.map +1 -0
  22. package/dist/commands/analyze/doc.js +77 -0
  23. package/dist/commands/analyze/doc.js.map +1 -0
  24. package/dist/commands/analyze/feature.d.ts +3 -0
  25. package/dist/commands/analyze/feature.d.ts.map +1 -0
  26. package/dist/commands/analyze/feature.js +75 -0
  27. package/dist/commands/analyze/feature.js.map +1 -0
  28. package/dist/commands/analyze/from-code.d.ts +3 -0
  29. package/dist/commands/analyze/from-code.d.ts.map +1 -0
  30. package/dist/commands/analyze/from-code.js +94 -0
  31. package/dist/commands/analyze/from-code.js.map +1 -0
  32. package/dist/commands/analyze/incremental.d.ts +3 -0
  33. package/dist/commands/analyze/incremental.d.ts.map +1 -0
  34. package/dist/commands/analyze/incremental.js +90 -0
  35. package/dist/commands/analyze/incremental.js.map +1 -0
  36. package/dist/commands/analyze/modes.d.ts +13 -0
  37. package/dist/commands/analyze/modes.d.ts.map +1 -0
  38. package/dist/commands/analyze/modes.js +147 -0
  39. package/dist/commands/analyze/modes.js.map +1 -0
  40. package/dist/commands/analyze/module.d.ts +3 -0
  41. package/dist/commands/analyze/module.d.ts.map +1 -0
  42. package/dist/commands/analyze/module.js +95 -0
  43. package/dist/commands/analyze/module.js.map +1 -0
  44. package/dist/commands/analyze/overview.d.ts +3 -0
  45. package/dist/commands/analyze/overview.d.ts.map +1 -0
  46. package/dist/commands/analyze/overview.js +125 -0
  47. package/dist/commands/analyze/overview.js.map +1 -0
  48. package/dist/commands/analyze/shared.d.ts +53 -0
  49. package/dist/commands/analyze/shared.d.ts.map +1 -0
  50. package/dist/commands/analyze/shared.js +34 -0
  51. package/dist/commands/analyze/shared.js.map +1 -0
  52. package/dist/commands/analyze/units.d.ts +46 -0
  53. package/dist/commands/analyze/units.d.ts.map +1 -0
  54. package/dist/commands/analyze/units.js +950 -0
  55. package/dist/commands/analyze/units.js.map +1 -0
  56. package/dist/commands/analyze.d.ts +6 -88
  57. package/dist/commands/analyze.d.ts.map +1 -1
  58. package/dist/commands/analyze.js +167 -1419
  59. package/dist/commands/analyze.js.map +1 -1
  60. package/dist/commands/ask.d.ts.map +1 -1
  61. package/dist/commands/ask.js +4 -2
  62. package/dist/commands/ask.js.map +1 -1
  63. package/dist/commands/dashboard.d.ts.map +1 -1
  64. package/dist/commands/dashboard.js +36 -1
  65. package/dist/commands/dashboard.js.map +1 -1
  66. package/dist/commands/deploy.d.ts +6 -0
  67. package/dist/commands/deploy.d.ts.map +1 -1
  68. package/dist/commands/deploy.js +153 -0
  69. package/dist/commands/deploy.js.map +1 -1
  70. package/dist/commands/doc2spec.d.ts +1 -1
  71. package/dist/commands/doc2spec.d.ts.map +1 -1
  72. package/dist/commands/doc2spec.js +39 -24
  73. package/dist/commands/doc2spec.js.map +1 -1
  74. package/dist/commands/doctor.js +60 -13
  75. package/dist/commands/doctor.js.map +1 -1
  76. package/dist/commands/execute.d.ts.map +1 -1
  77. package/dist/commands/execute.js +22 -0
  78. package/dist/commands/execute.js.map +1 -1
  79. package/dist/commands/help.js +36 -1
  80. package/dist/commands/help.js.map +1 -1
  81. package/dist/commands/init.js +1 -1
  82. package/dist/commands/init.js.map +1 -1
  83. package/dist/commands/pipeline.d.ts.map +1 -1
  84. package/dist/commands/pipeline.js +15 -0
  85. package/dist/commands/pipeline.js.map +1 -1
  86. package/dist/commands/plan.js +2 -0
  87. package/dist/commands/plan.js.map +1 -1
  88. package/dist/commands/pr.d.ts.map +1 -1
  89. package/dist/commands/pr.js +14 -3
  90. package/dist/commands/pr.js.map +1 -1
  91. package/dist/commands/prompts.d.ts +11 -1
  92. package/dist/commands/prompts.d.ts.map +1 -1
  93. package/dist/commands/prompts.js +197 -15
  94. package/dist/commands/prompts.js.map +1 -1
  95. package/dist/commands/reindex.d.ts.map +1 -1
  96. package/dist/commands/reindex.js +23 -0
  97. package/dist/commands/reindex.js.map +1 -1
  98. package/dist/commands/retro.d.ts.map +1 -1
  99. package/dist/commands/retro.js +3 -1
  100. package/dist/commands/retro.js.map +1 -1
  101. package/dist/commands/status-panel.d.ts.map +1 -1
  102. package/dist/commands/status-panel.js +9 -1
  103. package/dist/commands/status-panel.js.map +1 -1
  104. package/dist/commands/unitize.d.ts +3 -0
  105. package/dist/commands/unitize.d.ts.map +1 -1
  106. package/dist/commands/unitize.js +183 -6
  107. package/dist/commands/unitize.js.map +1 -1
  108. package/dist/commands/update-env-configs.d.ts.map +1 -1
  109. package/dist/commands/update-env-configs.js +10 -0
  110. package/dist/commands/update-env-configs.js.map +1 -1
  111. package/dist/commands/verify.d.ts +8 -0
  112. package/dist/commands/verify.d.ts.map +1 -1
  113. package/dist/commands/verify.js +383 -16
  114. package/dist/commands/verify.js.map +1 -1
  115. package/dist/commands/welcome.d.ts.map +1 -1
  116. package/dist/commands/welcome.js +3 -1
  117. package/dist/commands/welcome.js.map +1 -1
  118. package/dist/core/ai-context-generator.d.ts +21 -0
  119. package/dist/core/ai-context-generator.d.ts.map +1 -1
  120. package/dist/core/ai-context-generator.js +54 -1
  121. package/dist/core/ai-context-generator.js.map +1 -1
  122. package/dist/core/ai-verify/plan-generator.d.ts +94 -0
  123. package/dist/core/ai-verify/plan-generator.d.ts.map +1 -0
  124. package/dist/core/ai-verify/plan-generator.js +598 -0
  125. package/dist/core/ai-verify/plan-generator.js.map +1 -0
  126. package/dist/core/ai-verify/result-parser.d.ts +27 -0
  127. package/dist/core/ai-verify/result-parser.d.ts.map +1 -0
  128. package/dist/core/ai-verify/result-parser.js +212 -0
  129. package/dist/core/ai-verify/result-parser.js.map +1 -0
  130. package/dist/core/ai-verify/scope-resolver.d.ts +34 -0
  131. package/dist/core/ai-verify/scope-resolver.d.ts.map +1 -0
  132. package/dist/core/ai-verify/scope-resolver.js +183 -0
  133. package/dist/core/ai-verify/scope-resolver.js.map +1 -0
  134. package/dist/core/ai-verify/types.d.ts +171 -0
  135. package/dist/core/ai-verify/types.d.ts.map +1 -0
  136. package/dist/core/ai-verify/types.js +9 -0
  137. package/dist/core/ai-verify/types.js.map +1 -0
  138. package/dist/core/ai-verify/visual-judge.d.ts +33 -0
  139. package/dist/core/ai-verify/visual-judge.d.ts.map +1 -0
  140. package/dist/core/ai-verify/visual-judge.js +123 -0
  141. package/dist/core/ai-verify/visual-judge.js.map +1 -0
  142. package/dist/core/analyze-engine.d.ts.map +1 -1
  143. package/dist/core/analyze-engine.js +2 -1
  144. package/dist/core/analyze-engine.js.map +1 -1
  145. package/dist/core/ask-engine.d.ts +6 -0
  146. package/dist/core/ask-engine.d.ts.map +1 -1
  147. package/dist/core/ask-engine.js +83 -3
  148. package/dist/core/ask-engine.js.map +1 -1
  149. package/dist/core/code-graph/builder.d.ts.map +1 -1
  150. package/dist/core/code-graph/builder.js +93 -75
  151. package/dist/core/code-graph/builder.js.map +1 -1
  152. package/dist/core/code-graph/incremental-build.d.ts.map +1 -1
  153. package/dist/core/code-graph/incremental-build.js +13 -19
  154. package/dist/core/code-graph/incremental-build.js.map +1 -1
  155. package/dist/core/code-graph/index.d.ts +1 -1
  156. package/dist/core/code-graph/index.d.ts.map +1 -1
  157. package/dist/core/code-graph/index.js +15 -12
  158. package/dist/core/code-graph/index.js.map +1 -1
  159. package/dist/core/code-graph/multimodal.js +1 -1
  160. package/dist/core/code-graph/parser.js +1 -1
  161. package/dist/core/code-graph/query.d.ts +1 -1
  162. package/dist/core/code-graph/reporter.d.ts +1 -1
  163. package/dist/core/code-graph/reporter.d.ts.map +1 -1
  164. package/dist/core/code-graph/reporter.js +18 -10
  165. package/dist/core/code-graph/reporter.js.map +1 -1
  166. package/dist/core/code-graph/requirement-linker.d.ts.map +1 -1
  167. package/dist/core/code-graph/requirement-linker.js +24 -14
  168. package/dist/core/code-graph/requirement-linker.js.map +1 -1
  169. package/dist/core/code-graph/types.d.ts +1 -1
  170. package/dist/core/code-graph/types.js +1 -1
  171. package/dist/core/code-graph/visualizer.d.ts +1 -7
  172. package/dist/core/code-graph/visualizer.d.ts.map +1 -1
  173. package/dist/core/code-graph/visualizer.js +476 -49
  174. package/dist/core/code-graph/visualizer.js.map +1 -1
  175. package/dist/core/code-scanner.d.ts +2 -0
  176. package/dist/core/code-scanner.d.ts.map +1 -1
  177. package/dist/core/code-scanner.js +13 -1
  178. package/dist/core/code-scanner.js.map +1 -1
  179. package/dist/core/deploy/engine.d.ts +21 -0
  180. package/dist/core/deploy/engine.d.ts.map +1 -1
  181. package/dist/core/deploy/engine.js +276 -0
  182. package/dist/core/deploy/engine.js.map +1 -1
  183. package/dist/core/deploy-ledger.d.ts +12 -0
  184. package/dist/core/deploy-ledger.d.ts.map +1 -0
  185. package/dist/core/deploy-ledger.js +35 -0
  186. package/dist/core/deploy-ledger.js.map +1 -0
  187. package/dist/core/environment-config.d.ts +11 -0
  188. package/dist/core/environment-config.d.ts.map +1 -1
  189. package/dist/core/environment-config.js +4 -0
  190. package/dist/core/environment-config.js.map +1 -1
  191. package/dist/core/intent-cache.d.ts.map +1 -1
  192. package/dist/core/intent-cache.js +6 -0
  193. package/dist/core/intent-cache.js.map +1 -1
  194. package/dist/core/knowledge-visualizer.js +1 -1
  195. package/dist/core/page-bundle.d.ts +2 -0
  196. package/dist/core/page-bundle.d.ts.map +1 -1
  197. package/dist/core/page-bundle.js +18 -1
  198. package/dist/core/page-bundle.js.map +1 -1
  199. package/dist/core/plan-html.js +1 -1
  200. package/dist/core/platform-inference.d.ts +35 -0
  201. package/dist/core/platform-inference.d.ts.map +1 -1
  202. package/dist/core/platform-inference.js +92 -0
  203. package/dist/core/platform-inference.js.map +1 -1
  204. package/dist/core/prompt-plugins/analyze-graph-plugin.d.ts.map +1 -1
  205. package/dist/core/prompt-plugins/analyze-graph-plugin.js +16 -1
  206. package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -1
  207. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts +2 -0
  208. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts.map +1 -1
  209. package/dist/core/prompt-plugins/execute-graph-plugin.js +127 -27
  210. package/dist/core/prompt-plugins/execute-graph-plugin.js.map +1 -1
  211. package/dist/core/quality-audit.d.ts.map +1 -1
  212. package/dist/core/quality-audit.js +18 -0
  213. package/dist/core/quality-audit.js.map +1 -1
  214. package/dist/core/rag-engine.d.ts.map +1 -1
  215. package/dist/core/rag-engine.js +12 -243
  216. package/dist/core/rag-engine.js.map +1 -1
  217. package/dist/core/reindex-engine.d.ts +20 -0
  218. package/dist/core/reindex-engine.d.ts.map +1 -1
  219. package/dist/core/reindex-engine.js +142 -0
  220. package/dist/core/reindex-engine.js.map +1 -1
  221. package/dist/core/requirement-clarifier.d.ts.map +1 -1
  222. package/dist/core/requirement-clarifier.js +22 -6
  223. package/dist/core/requirement-clarifier.js.map +1 -1
  224. package/dist/core/reverse-requirement.d.ts +37 -0
  225. package/dist/core/reverse-requirement.d.ts.map +1 -1
  226. package/dist/core/reverse-requirement.js +84 -9
  227. package/dist/core/reverse-requirement.js.map +1 -1
  228. package/dist/core/spec-paths.d.ts +5 -0
  229. package/dist/core/spec-paths.d.ts.map +1 -1
  230. package/dist/core/spec-paths.js +1 -0
  231. package/dist/core/spec-paths.js.map +1 -1
  232. package/dist/core/test-config.d.ts +7 -1
  233. package/dist/core/test-config.d.ts.map +1 -1
  234. package/dist/core/test-config.js +59 -11
  235. package/dist/core/test-config.js.map +1 -1
  236. package/dist/core/ui-verify/index.d.ts +1 -1
  237. package/dist/core/ui-verify/index.d.ts.map +1 -1
  238. package/dist/core/ui-verify/index.js +2 -1
  239. package/dist/core/ui-verify/index.js.map +1 -1
  240. package/dist/core/ui-verify/smoke-engine.js +71 -15
  241. package/dist/core/ui-verify/smoke-engine.js.map +1 -1
  242. package/dist/core/ui-verify/spec-generator.d.ts +5 -9
  243. package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
  244. package/dist/core/ui-verify/spec-generator.js +66 -3
  245. package/dist/core/ui-verify/spec-generator.js.map +1 -1
  246. package/dist/core/ui-verify/types.d.ts +25 -0
  247. package/dist/core/ui-verify/types.d.ts.map +1 -1
  248. package/dist/core/ui-verify/visual-model-client.d.ts +2 -0
  249. package/dist/core/ui-verify/visual-model-client.d.ts.map +1 -1
  250. package/dist/core/ui-verify/visual-model-client.js +4 -4
  251. package/dist/core/ui-verify/visual-model-client.js.map +1 -1
  252. package/dist/core/unified-config.d.ts +27 -0
  253. package/dist/core/unified-config.d.ts.map +1 -1
  254. package/dist/core/unified-config.js +37 -0
  255. package/dist/core/unified-config.js.map +1 -1
  256. package/dist/core/unified-retrieval.d.ts +8 -0
  257. package/dist/core/unified-retrieval.d.ts.map +1 -1
  258. package/dist/core/unified-retrieval.js +18 -0
  259. package/dist/core/unified-retrieval.js.map +1 -1
  260. package/dist/utils/synonyms.d.ts.map +1 -1
  261. package/dist/utils/synonyms.js +4 -0
  262. package/dist/utils/synonyms.js.map +1 -1
  263. package/package.json +1 -1
  264. package/templates/accounts-example.yaml +49 -0
  265. package/templates/html/fonts/JetBrainsMono.woff2 +0 -0
  266. package/templates/html/fonts/Orbitron.woff2 +0 -0
  267. package/templates/html/speccore-ask-explain.html +1 -1
  268. package/templates/html/speccore-ask-guide.html +2 -2
  269. package/templates/html/speccore-ask-match.html +1 -1
  270. package/templates/html/speccore-ask-pipeline.html +1 -1
  271. package/templates/html/speccore-ask-result.html +2 -2
  272. package/templates/html/speccore-help.html +2 -2
  273. package/templates/html/speccore-setup-guide.html +16 -1
  274. package/templates/speccore-yml-example.yml +12 -0
@@ -0,0 +1,598 @@
1
+ "use strict";
2
+ /**
3
+ * plan-generator — AI 验证剧本生成(v8.3.350+)
4
+ *
5
+ * 只切片不解析语义:从 020-specs/{单元}/{端}/UI_SPEC.md 抓「页面清单/交互流程」段、
6
+ * TEST.md 抓「测试用例」段,原文组装成自然语言场景。语义理解交给执行 AI。
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DEFAULT_LAYERED = void 0;
10
+ exports.collectPrototypeAssets = collectPrototypeAssets;
11
+ exports.sliceSections = sliceSections;
12
+ exports.isSkeleton = isSkeleton;
13
+ exports.collectEnvVarRefs = collectEnvVarRefs;
14
+ exports.collectAccountVerifications = collectAccountVerifications;
15
+ exports.buildCommonScenarios = buildCommonScenarios;
16
+ exports.generateAiVerifyPlan = generateAiVerifyPlan;
17
+ const path_1 = require("path");
18
+ const fs_extra_1 = require("fs-extra");
19
+ const yaml_parser_1 = require("../yaml-parser");
20
+ const spec_generator_1 = require("../ui-verify/spec-generator");
21
+ /** SKELETON 空模板标记(analyze 未执行的产物,跳过) */
22
+ const SKELETON_MARK = '<!-- SPEC-SKELETON -->';
23
+ /** 原型/设计稿素材扩展名(v8.3.355+ 剧本原型参考区块) */
24
+ const PROTOTYPE_ASSET_EXTS = ['.png', '.jpg', '.jpeg', '.webp', '.gif', '.svg', '.html'];
25
+ /**
26
+ * 收集迭代级原型/设计稿素材(v8.3.355+):扫描 010-requirements 下的
27
+ * prototypes/、assets/designs/、assets/prototypes/、assets/screenshots/ 目录。
28
+ * 收集图片与 HTML 绝对路径——执行 AI 打开对照理解界面(复杂流程的视觉参照物)。
29
+ */
30
+ function collectPrototypeAssets(iterDir) {
31
+ const reqDir = (0, path_1.join)(iterDir, '010-requirements');
32
+ const roots = [
33
+ (0, path_1.join)(reqDir, 'prototypes'),
34
+ (0, path_1.join)(reqDir, 'assets', 'designs'),
35
+ (0, path_1.join)(reqDir, 'assets', 'prototypes'),
36
+ (0, path_1.join)(reqDir, 'assets', 'screenshots'),
37
+ ];
38
+ const assets = [];
39
+ const seen = new Set();
40
+ const walk = (dir, depth) => {
41
+ if (depth > 3 || !(0, fs_extra_1.existsSync)(dir))
42
+ return;
43
+ let entries;
44
+ try {
45
+ entries = (0, fs_extra_1.readdirSync)(dir);
46
+ }
47
+ catch {
48
+ return;
49
+ }
50
+ for (const name of entries) {
51
+ const full = (0, path_1.join)(dir, name);
52
+ let isDir = false;
53
+ try {
54
+ isDir = (0, fs_extra_1.statSync)(full).isDirectory();
55
+ }
56
+ catch {
57
+ continue;
58
+ }
59
+ if (isDir) {
60
+ walk(full, depth + 1);
61
+ continue;
62
+ }
63
+ if (PROTOTYPE_ASSET_EXTS.some((ext) => name.toLowerCase().endsWith(ext)) && !seen.has(full)) {
64
+ seen.add(full);
65
+ assets.push(full);
66
+ }
67
+ }
68
+ };
69
+ for (const root of roots)
70
+ walk(root, 0);
71
+ return assets.sort();
72
+ }
73
+ /** 分层默认开关(未配置时公共层 + 模块层全开) */
74
+ exports.DEFAULT_LAYERED = { common: true, modules: true };
75
+ /** 按 ^#{2,3} 标题切段,返回 {标题, 正文行数组} */
76
+ function sliceSections(markdown) {
77
+ const lines = markdown.split('\n');
78
+ const sections = [];
79
+ let current = null;
80
+ for (const line of lines) {
81
+ const match = /^#{2,3}\s+(.+?)\s*$/.exec(line);
82
+ if (match) {
83
+ if (current)
84
+ sections.push(current);
85
+ current = { title: match[1].trim(), body: [] };
86
+ }
87
+ else if (current) {
88
+ const trimmed = line.trim();
89
+ if (trimmed)
90
+ current.body.push(trimmed);
91
+ }
92
+ }
93
+ if (current)
94
+ sections.push(current);
95
+ return sections;
96
+ }
97
+ /** 空模板检测 */
98
+ function isSkeleton(content) {
99
+ return content.includes(SKELETON_MARK);
100
+ }
101
+ /** UI_SPEC 相关段标题关键词(页面清单/交互流程) */
102
+ const UI_SPEC_SECTION_KEYS = ['页面清单', '页面', '交互', '流程', '路由'];
103
+ /** TEST 相关段标题关键词(测试用例/验收) */
104
+ const TEST_SECTION_KEYS = ['测试用例', '用例', '场景', '验收', '流程'];
105
+ /** 从 UI_SPEC.md 提取交互段落 */
106
+ async function extractUiSections(uiSpecPath) {
107
+ try {
108
+ const content = await (0, fs_extra_1.readFile)(uiSpecPath, 'utf-8');
109
+ if (isSkeleton(content))
110
+ return [];
111
+ return sliceSections(content).filter((s) => UI_SPEC_SECTION_KEYS.some((k) => s.title.includes(k)));
112
+ }
113
+ catch {
114
+ return [];
115
+ }
116
+ }
117
+ /** 从 TEST.md 提取用例段落 */
118
+ async function extractTestSections(testPath) {
119
+ try {
120
+ const content = await (0, fs_extra_1.readFile)(testPath, 'utf-8');
121
+ if (isSkeleton(content))
122
+ return [];
123
+ return sliceSections(content).filter((s) => TEST_SECTION_KEYS.some((k) => s.title.includes(k)));
124
+ }
125
+ catch {
126
+ return [];
127
+ }
128
+ }
129
+ /** 读 accounts.yaml(不存在/解析失败返回 null) */
130
+ async function loadAccounts(accountsPath) {
131
+ const result = await (0, yaml_parser_1.parseYamlFile)(accountsPath);
132
+ if (!result.success || !result.data)
133
+ return null;
134
+ return result.data;
135
+ }
136
+ /** 单源账号选择:platforms 含该端 → 无端限定 → 第一个。prefix 为引用名前缀(文件源带 {env}.) */
137
+ function selectFrom(entries, platform, prefix, from) {
138
+ if (!entries)
139
+ return null;
140
+ const list = Object.entries(entries);
141
+ if (list.length === 0)
142
+ return null;
143
+ // v8.3.354+: 验证码约定随账号走(取码说明只在剧本中指引,不落码)
144
+ const toPick = ([name, cfg]) => ({
145
+ ref: `${prefix}${name}`,
146
+ from,
147
+ verification: cfg?.verification?.note
148
+ ? { type: cfg.verification.type || 'verification', note: cfg.verification.note }
149
+ : undefined,
150
+ });
151
+ const matched = list.find(([, cfg]) => cfg?.platforms?.includes(platform));
152
+ if (matched)
153
+ return toPick(matched);
154
+ const unrestricted = list.find(([, cfg]) => !cfg?.platforms || cfg.platforms.length === 0);
155
+ return toPick(unrestricted || list[0]);
156
+ }
157
+ /**
158
+ * 为端选账号(v8.3.351+ 账号收敛):优先环境内嵌 tests.accounts(权威源,就近声明),
159
+ * 兜底 accounts.yaml 的 {env} 分组(全局兑底,多环境共享账号时用)。
160
+ */
161
+ function pickAccount(inline, accounts, env, platform) {
162
+ return selectFrom(inline, platform, '', 'env-file') ?? selectFrom(accounts?.[env]?.accounts, platform, `${env}.`, 'accounts-yaml');
163
+ }
164
+ /** 扫描账号配置中的 ${VAR} 环境变量引用(password/username),返回引用提示列表。双源:环境内嵌(权威源,ref=账号名) + accounts.yaml(兑底,ref={env}.{name}) */
165
+ function collectEnvVarRefs(accounts, inline) {
166
+ const hints = [];
167
+ const scan = (refPrefix, entries) => {
168
+ if (!entries)
169
+ return;
170
+ for (const [name, cfg] of Object.entries(entries)) {
171
+ if (!cfg)
172
+ continue;
173
+ for (const field of ['username', 'password']) {
174
+ const value = String(cfg[field] ?? '');
175
+ const match = /^\$\{([A-Z_][A-Z0-9_]*)\}$/.exec(value.trim());
176
+ if (!match)
177
+ continue;
178
+ const varName = match[1];
179
+ hints.push({
180
+ ref: `${refPrefix}${name}`,
181
+ field,
182
+ varName,
183
+ set: !!process.env[varName],
184
+ });
185
+ }
186
+ }
187
+ };
188
+ scan('', inline);
189
+ if (accounts) {
190
+ for (const [env, envCfg] of Object.entries(accounts)) {
191
+ scan(`${env}.`, envCfg?.accounts);
192
+ }
193
+ }
194
+ return hints;
195
+ }
196
+ /**
197
+ * 收集登录验证码约定(v8.3.354+):双源(环境内嵌权威源 + accounts.yaml 兑底),
198
+ * 剧本头集中声明取码说明——只落「通道指引」不落码本身。
199
+ */
200
+ function collectAccountVerifications(accounts, env, inline) {
201
+ const hints = [];
202
+ const scan = (refPrefix, entries) => {
203
+ if (!entries)
204
+ return;
205
+ for (const [name, cfg] of Object.entries(entries)) {
206
+ if (!cfg?.verification?.note)
207
+ continue;
208
+ hints.push({
209
+ ref: `${refPrefix}${name}`,
210
+ type: cfg.verification.type || 'verification',
211
+ note: cfg.verification.note,
212
+ });
213
+ }
214
+ };
215
+ scan('', inline);
216
+ scan(`${env}.`, accounts?.[env]?.accounts);
217
+ return hints;
218
+ }
219
+ /**
220
+ * 为端选账号引用:优先匹配 platforms 含该端的账号,否则选无端限定的账号,再兑底第一个。
221
+ * 返回引用名(如 staging.admin)或 null。
222
+ */
223
+ /**
224
+ * 标题关键词重合度(v8.3.353+):中文 2+ 字 token 与英文单词取交集计数,
225
+ * 用于交互流程段与 TEST 用例段的就近配对(替代同下标取模)。
226
+ */
227
+ function scoreTitleMatch(flowTitle, testTitle) {
228
+ const tokens = (t) => {
229
+ const cn = t.match(/[\u4e00-\u9fa5]{2,}/g) || [];
230
+ const en = t.toLowerCase().match(/[a-z0-9_]+/g) || [];
231
+ return new Set([...cn, ...en].filter((x) => x.length >= 2));
232
+ };
233
+ const a = tokens(flowTitle);
234
+ const b = tokens(testTitle);
235
+ let score = 0;
236
+ for (const x of a)
237
+ if (b.has(x))
238
+ score += 1;
239
+ return score;
240
+ }
241
+ /** 组装单个(单元, 端)的场景列表 */
242
+ async function buildUnitScenarios(unit, platform, entry, account) {
243
+ const specsDir = (0, path_1.join)(unit.path, platform);
244
+ const uiSections = await extractUiSections((0, path_1.join)(specsDir, 'UI_SPEC.md'));
245
+ const testSections = await extractTestSections((0, path_1.join)(specsDir, 'TEST.md'));
246
+ const scenarios = [];
247
+ const skipped = [];
248
+ // 主场景:以 UI_SPEC 交互流程段为骨架,TEST 用例段按序拼为预期结果
249
+ const flowSections = uiSections.filter((s) => /交互|流程/.test(s.title));
250
+ const pageSections = uiSections.filter((s) => /页面清单|页面|路由/.test(s.title));
251
+ const build = (title, steps, expected, index) => ({
252
+ id: `${unit.name}__${platform}__${index}`,
253
+ group: 'modules',
254
+ unit: unit.name,
255
+ platform,
256
+ entry,
257
+ account: account ?? undefined,
258
+ steps,
259
+ expected,
260
+ title,
261
+ });
262
+ let index = 0;
263
+ if (flowSections.length > 0) {
264
+ const used = new Set();
265
+ for (const flow of flowSections) {
266
+ // v8.3.353+: 标题关键词就近匹配(替代同下标取模——流程段与用例段数量错位时取模会轮转配错预期);
267
+ // 同下标 tie-break + 无重合时退回同下标配对(单流程单用例的常见形态行为不变)。
268
+ let bestIdx = -1;
269
+ let bestScore = -1;
270
+ testSections.forEach((t, i) => {
271
+ if (used.has(i))
272
+ return;
273
+ const score = scoreTitleMatch(flow.title, t.title);
274
+ if (score > bestScore || (score === bestScore && i === index)) {
275
+ bestScore = score;
276
+ bestIdx = i;
277
+ }
278
+ });
279
+ if (bestScore <= 0 && index < testSections.length && !used.has(index)) {
280
+ bestIdx = index;
281
+ }
282
+ const expected = bestIdx >= 0
283
+ ? [testSections[bestIdx].title, ...testSections[bestIdx].body]
284
+ : ['(TEST.md 未提供匹配的预期结果,执行时对照页面实际表现判断)'];
285
+ if (bestIdx >= 0)
286
+ used.add(bestIdx);
287
+ scenarios.push(build(`${unit.name}:${flow.title}`, flow.body, expected, index));
288
+ index += 1;
289
+ }
290
+ // 剩余未配对的 TEST 段补为独立场景(操作步骤=用例步骤,预期=后续内容)
291
+ for (let i = 0; i < testSections.length; i += 1) {
292
+ if (used.has(i))
293
+ continue;
294
+ const t = testSections[i];
295
+ // v8.3.353+: 段内验收表格「操作步骤」列拆为精细步骤(表格是好的验证素材)
296
+ const tableSteps = (0, spec_generator_1.extractTableOperationSteps)(t.body.join('\n'));
297
+ scenarios.push(build(`${unit.name}:${t.title}`, tableSteps.length > 0 ? tableSteps : t.body, [], index));
298
+ index += 1;
299
+ }
300
+ }
301
+ else if (pageSections.length > 0) {
302
+ // 无交互流程段:按页面清单做「页面可用性 + 内容」场景
303
+ for (const page of pageSections) {
304
+ scenarios.push(build(`${unit.name}:${page.title}`, page.body, [], index));
305
+ index += 1;
306
+ }
307
+ }
308
+ else {
309
+ // 兜底:仅验证入口可达与基本可用性
310
+ scenarios.push(build(`${unit.name}:入口可达性检查`, [`打开入口地址 ${entry},确认页面正常加载(无 404/白屏/报错)`], ['页面可访问且渲染正常'], index));
311
+ index += 1;
312
+ }
313
+ // 完全无素材(SKELETON 或文件缺失)→ 跳过并说明
314
+ if (uiSections.length === 0 && testSections.length === 0) {
315
+ // 检查是否两个文件都缺失/空模板
316
+ const hasUi = await (0, fs_extra_1.readFile)((0, path_1.join)(specsDir, 'UI_SPEC.md'), 'utf-8').then((c) => !isSkeleton(c) && c.trim().length > 0, () => false);
317
+ const hasTest = await (0, fs_extra_1.readFile)((0, path_1.join)(specsDir, 'TEST.md'), 'utf-8').then((c) => !isSkeleton(c) && c.trim().length > 0, () => false);
318
+ if (!hasUi && !hasTest) {
319
+ skipped.push({
320
+ unit: unit.name,
321
+ platform,
322
+ reason: 'UI_SPEC.md/TEST.md 为空模板或缺失(analyze 未执行或未落盘)',
323
+ });
324
+ return { scenarios: [], skipped };
325
+ }
326
+ }
327
+ return { scenarios, skipped };
328
+ }
329
+ /**
330
+ * 公共能力层场景(CLI 模板生成,不解析规格语义):
331
+ * 每端固定三类——入口可达性 / 登录态 / 全局导航。先于模块层执行(登录就绪是模块场景前置)。
332
+ * 登录态场景无账号时进 skipped(不阻断其它公共场景)。
333
+ */
334
+ function buildCommonScenarios(input) {
335
+ const { env, baseUrls, platformFilter, accounts, inlineAccounts } = input;
336
+ const scenarios = [];
337
+ const skipped = [];
338
+ const platforms = Object.keys(baseUrls).filter((p) => platformFilter.length === 0 || platformFilter.includes(p));
339
+ let index = 0;
340
+ for (const platform of platforms) {
341
+ const entry = baseUrls[platform];
342
+ const account = pickAccount(inlineAccounts, accounts, env, platform);
343
+ const build = (title, steps, expected) => ({
344
+ id: `common__${platform}__${index}`,
345
+ group: 'common',
346
+ unit: 'common',
347
+ platform,
348
+ entry,
349
+ account: account?.ref,
350
+ steps,
351
+ expected,
352
+ title,
353
+ });
354
+ scenarios.push(build(`公共能力:入口可达性检查(${platform})`, [`打开入口地址 ${entry},确认页面正常加载(无 404/白屏/报错)`], ['页面可访问且渲染正常']));
355
+ index += 1;
356
+ if (account) {
357
+ const credSource = account.from === 'env-file'
358
+ ? `environments/${env}.yaml 的 tests.accounts`
359
+ : '.speccore/tests/accounts.yaml';
360
+ // v8.3.354+: 登录需验证码时,取码说明随账号走,登录态场景直接提示执行 AI
361
+ const verificationStep = account.verification
362
+ ? `该账号登录需要验证码(${account.verification.type}):${account.verification.note}`
363
+ : null;
364
+ scenarios.push(build(`公共能力:登录态验证(${platform})`, [
365
+ `使用账号 ${account.ref} 登录(凭据从 ${credSource} 读取明文,勿落盘)`,
366
+ ...(verificationStep ? [verificationStep] : []),
367
+ '确认登录成功并进入登录后的主界面',
368
+ ], ['登录成功,页面显示登录后状态(用户信息/退出入口等)']));
369
+ index += 1;
370
+ }
371
+ else {
372
+ skipped.push({
373
+ unit: 'common',
374
+ platform,
375
+ reason: `公共能力层-登录场景跳过:未配置账号(environments/${env}.yaml tests.accounts 与 .speccore/tests/accounts.yaml 均无该环境账号)`,
376
+ });
377
+ }
378
+ scenarios.push(build(`公共能力:全局导航检查(${platform})`, [
379
+ '检查全局布局与导航(顶部导航/侧边栏/页脚等)',
380
+ '确认关键导航入口渲染完整且可点击(不点击可能跳转到未开发页面的入口)',
381
+ ], ['全局导航元素渲染完整,关键入口可交互']));
382
+ index += 1;
383
+ }
384
+ return { scenarios, skipped };
385
+ }
386
+ /** 组装分层视图(每层含 enabled 状态 + 场景 + 执行说明) */
387
+ function buildGroups(layered, common, modules) {
388
+ return [
389
+ {
390
+ id: 'common',
391
+ label: '公共能力层',
392
+ enabled: layered.common,
393
+ scenarios: layered.common ? common.scenarios : [],
394
+ note: '先于模块层执行:入口可达性与登录就绪是模块场景的前置条件',
395
+ },
396
+ {
397
+ id: 'modules',
398
+ label: '模块层',
399
+ enabled: layered.modules,
400
+ scenarios: layered.modules ? modules : [],
401
+ note: '公共能力层全部通过后进入本层,按端分批逐单元推进',
402
+ },
403
+ ];
404
+ }
405
+ /** 生成剧本(plan.json + AI_VERIFY_PLAN.md) */
406
+ async function generateAiVerifyPlan(input) {
407
+ const { iteration, iterDir, env, envConfig, units, platformFilter, projectRoot, accountsPath } = input;
408
+ const outDir = (0, path_1.join)(iterDir, '000-overview', 'ai-verify');
409
+ await (0, fs_extra_1.ensureDir)(outDir);
410
+ const accounts = await loadAccounts(accountsPath);
411
+ const baseUrls = envConfig.tests?.base_urls || {};
412
+ const inlineAccounts = envConfig.tests?.accounts;
413
+ const layered = { ...exports.DEFAULT_LAYERED, ...input.layered };
414
+ const scenarios = [];
415
+ const skipped = [];
416
+ // 层 1:公共能力(CLI 模板生成,按环境 base_urls 逐端)
417
+ const commonBuilt = layered.common
418
+ ? buildCommonScenarios({ env, baseUrls, platformFilter, accounts, inlineAccounts })
419
+ : { scenarios: [], skipped: [] };
420
+ // 层 2:模块层(各单元规格切片;层开关关闭时不生成,避免平铺混入关闭层场景)
421
+ const moduleScenarios = [];
422
+ if (layered.modules) {
423
+ for (const unit of units) {
424
+ for (const platform of unit.platforms) {
425
+ if (platformFilter.length > 0 && !platformFilter.includes(platform))
426
+ continue;
427
+ const entry = baseUrls[platform];
428
+ if (!entry) {
429
+ skipped.push({
430
+ unit: unit.name,
431
+ platform,
432
+ reason: `环境 "${env}" 未配置该端测试地址(environments/${env}.yaml 的 tests.base_urls.${platform})`,
433
+ });
434
+ continue;
435
+ }
436
+ const account = pickAccount(inlineAccounts, accounts, env, platform);
437
+ if (!account) {
438
+ skipped.push({ unit: unit.name, platform, reason: `未配置账号(environments/${env}.yaml tests.accounts 与 .speccore/tests/accounts.yaml 均无该环境账号)` });
439
+ // 无账号仍生成场景(执行时可跳过登录或标注)
440
+ }
441
+ const built = await buildUnitScenarios(unit, platform, entry, account?.ref ?? null);
442
+ moduleScenarios.push(...built.scenarios);
443
+ skipped.push(...built.skipped);
444
+ }
445
+ }
446
+ }
447
+ scenarios.push(...commonBuilt.scenarios, ...moduleScenarios);
448
+ skipped.push(...commonBuilt.skipped);
449
+ // 账号来源说明(v8.3.351+ 账号收敛):执行 AI 据此定位明文(机器可读,供 SPECCORE_AI_VERIFY_ACCOUNTS 标记与 SKILL 协议消费)
450
+ const accountSources = [];
451
+ if (inlineAccounts && Object.keys(inlineAccounts).length > 0) {
452
+ accountSources.push(`environments/${env}.yaml (tests.accounts)`);
453
+ }
454
+ if (accounts)
455
+ accountSources.push(accountsPath);
456
+ const plan = {
457
+ version: '1.0',
458
+ env,
459
+ iteration,
460
+ generatedAt: new Date().toISOString(),
461
+ accountsPath,
462
+ accountSources,
463
+ scenarios,
464
+ groups: buildGroups(layered, commonBuilt, moduleScenarios),
465
+ skipped,
466
+ accountEnvVars: collectEnvVarRefs(accounts, inlineAccounts),
467
+ accountVerifications: collectAccountVerifications(accounts, env, inlineAccounts),
468
+ prototypeAssets: collectPrototypeAssets(iterDir),
469
+ outDir,
470
+ };
471
+ const planJsonPath = (0, path_1.join)(outDir, 'plan.json');
472
+ const planMdPath = (0, path_1.join)(outDir, 'AI_VERIFY_PLAN.md');
473
+ await (0, fs_extra_1.writeFile)(planJsonPath, JSON.stringify(plan, null, 2), 'utf-8');
474
+ await (0, fs_extra_1.writeFile)(planMdPath, renderPlanMarkdown(plan), 'utf-8');
475
+ return { plan, planJsonPath, planMdPath };
476
+ }
477
+ /** 剧本 Markdown(执行 AI 的可读版本,按层组织:公共能力层 → 模块层) */
478
+ function renderPlanMarkdown(plan) {
479
+ const lines = [];
480
+ lines.push(`# AI 浏览器验证剧本(环境: ${plan.env})`);
481
+ lines.push('');
482
+ lines.push(`> 迭代: ${plan.iteration} | 生成时间: ${plan.generatedAt} | 场景数: ${plan.scenarios.length}`);
483
+ // 账号来源行按实际情况精确化(权威源内嵌 / 仅兑底 / 均无),避免误导执行 AI
484
+ const srcList = plan.accountSources || [];
485
+ const hasInline = srcList.some((s) => s.includes('tests.accounts'));
486
+ if (hasInline && srcList.length > 1) {
487
+ lines.push(`> 账号来源: ${srcList[0]}(权威源,引用名即账号名)→ ${srcList[1]}(兑底,引用名 {env}.{name});执行时读取明文,本剧本不落密码`);
488
+ }
489
+ else if (hasInline) {
490
+ lines.push(`> 账号来源: ${srcList[0]}(权威源,引用名即账号名);执行时读取明文,本剧本不落密码`);
491
+ }
492
+ else if (srcList.length === 1) {
493
+ lines.push(`> 账号来源: ${srcList[0]}(环境文件未声明 tests.accounts,兑底生效,引用名 {env}.{name});执行时读取明文,本剧本不落密码`);
494
+ }
495
+ else {
496
+ lines.push('> 账号来源: 未配置(见下方降级警告)');
497
+ }
498
+ lines.push('> 输出目录: ' + plan.outDir);
499
+ lines.push('> 分层: 公共能力层(入口可达性/登录态/全局导航)→ 模块层(逐单元业务场景),关闭的层标 ⏭️ 跳过');
500
+ lines.push('');
501
+ // v8.3.351+: 公共能力层缺登录账号 → 降级为纯可达性,剧本头显式标注(避免执行 AI 误以为已覆盖登录后业务)
502
+ const commonLoginSkipped = plan.skipped.filter((s) => s.unit === 'common' && s.reason.includes('登录'));
503
+ if (commonLoginSkipped.length > 0) {
504
+ lines.push('> ⚠️ **公共能力层降级**:以下端无登录账号,登录态验证被跳过,公共层仅覆盖纯可达性(入口可达/全局导航):');
505
+ for (const s of commonLoginSkipped)
506
+ lines.push(`> - ${s.platform}: ${s.reason}`);
507
+ lines.push(`> 补齐账号(environments/${plan.env}.yaml 的 tests.accounts 或 ${plan.accountsPath})后重新生成剧本,可恢复登录态与登录后业务覆盖。`);
508
+ lines.push('');
509
+ }
510
+ if (plan.accountEnvVars && plan.accountEnvVars.length > 0) {
511
+ lines.push('## 账号环境变量引用');
512
+ lines.push('');
513
+ lines.push('以下账号的 username/password 为 ${VAR} 形式,执行时从环境变量取明文,勿将明文写入任何落盘文件:');
514
+ lines.push('');
515
+ for (const h of plan.accountEnvVars) {
516
+ lines.push(`- ${h.ref} 的 ${h.field} → 环境变量 ${h.varName}(${h.set ? '已设置' : '⚠️ 当前未设置'})`);
517
+ }
518
+ lines.push('');
519
+ }
520
+ // v8.3.354+: 登录验证码说明——只落「通道指引」不落码,执行 AI 按 note 自行取码
521
+ if (plan.accountVerifications && plan.accountVerifications.length > 0) {
522
+ lines.push('## 登录验证码说明');
523
+ lines.push('');
524
+ lines.push('以下账号登录需要验证码,执行时按说明自行取码(码本身勿写入任何落盘文件):');
525
+ lines.push('');
526
+ for (const v of plan.accountVerifications) {
527
+ lines.push(`- ${v.ref}(${v.type}):${v.note}`);
528
+ }
529
+ lines.push('');
530
+ }
531
+ // v8.3.355+: 原型与设计稿参考——执行 AI 打开对照理解界面,复杂流程有视觉参照物
532
+ if (plan.prototypeAssets && plan.prototypeAssets.length > 0) {
533
+ lines.push('## 原型与设计稿参考');
534
+ lines.push('');
535
+ lines.push('以下素材来自 010-requirements 的原型/设计稿目录,执行前打开对照理解界面(尤其是复杂流程):');
536
+ lines.push('');
537
+ for (const asset of plan.prototypeAssets) {
538
+ lines.push(`- ${asset}`);
539
+ }
540
+ lines.push('');
541
+ }
542
+ if (plan.skipped.length > 0) {
543
+ lines.push('## 跳过项');
544
+ lines.push('');
545
+ for (const s of plan.skipped) {
546
+ lines.push(`- ${s.unit}${s.platform ? `/${s.platform}` : ''}: ${s.reason}`);
547
+ }
548
+ lines.push('');
549
+ }
550
+ // 按层渲染(层内按端分组)
551
+ for (const group of plan.groups) {
552
+ lines.push(`## ${group.label}${group.enabled ? '' : '(⏭️ 已关闭)'}`);
553
+ lines.push('');
554
+ if (group.note) {
555
+ lines.push(`> ${group.note}`);
556
+ lines.push('');
557
+ }
558
+ if (!group.enabled || group.scenarios.length === 0) {
559
+ lines.push('(本层无场景)');
560
+ lines.push('');
561
+ continue;
562
+ }
563
+ const byPlatform = new Map();
564
+ for (const s of group.scenarios) {
565
+ const list = byPlatform.get(s.platform) || [];
566
+ list.push(s);
567
+ byPlatform.set(s.platform, list);
568
+ }
569
+ for (const [platform, list] of byPlatform) {
570
+ const entry = list[0]?.entry || '';
571
+ lines.push(`### ${platform} — ${entry}`);
572
+ lines.push('');
573
+ for (const s of list) {
574
+ lines.push(`#### ${s.title}`);
575
+ lines.push('');
576
+ lines.push(`- 入口: ${s.entry}`);
577
+ lines.push(`- 账号: ${s.account || '(未配置)'}`);
578
+ lines.push('');
579
+ if (s.steps.length > 0) {
580
+ lines.push('**操作步骤**');
581
+ lines.push('');
582
+ for (const step of s.steps)
583
+ lines.push(`- ${step}`);
584
+ lines.push('');
585
+ }
586
+ if (s.expected.length > 0) {
587
+ lines.push('**预期结果**');
588
+ lines.push('');
589
+ for (const e of s.expected)
590
+ lines.push(`- ${e}`);
591
+ lines.push('');
592
+ }
593
+ }
594
+ }
595
+ }
596
+ return lines.join('\n');
597
+ }
598
+ //# sourceMappingURL=plan-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-generator.js","sourceRoot":"","sources":["../../../src/core/ai-verify/plan-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * result-parser — 执行结果解析与 HTML 报告生成(v8.3.350+)
3
+ *
4
+ * 宿主 AI 执行完剧本写回 results.json,本模块负责:
5
+ * 1. 结构校验 + 与 plan.json 场景对齐(缺漏场景标未执行)
6
+ * 2. 生成 HTML 报告(复用 ui-verify 报告的视觉风格)
7
+ */
8
+ import type { AiVerifyExecutor, AiVerifyPlan, AiVerifyReportContext, AiVerifyResults } from './types';
9
+ /** 执行通道展示名 */
10
+ export declare const EXECUTOR_LABELS: Record<AiVerifyExecutor, string>;
11
+ /** 解析 results.json(结构校验,非法返回 null) */
12
+ export declare function parseAiVerifyResults(resultsPath: string): Promise<AiVerifyResults | null>;
13
+ /** 场景对齐:找出剧本中有而结果中缺失的场景(未执行) */
14
+ export declare function findMissingScenarios(plan: AiVerifyPlan, results: AiVerifyResults): string[];
15
+ /** 组装报告上下文 */
16
+ export declare function buildReportContext(plan: AiVerifyPlan, results: AiVerifyResults): AiVerifyReportContext;
17
+ /** 摘要统计(通过/失败/跳过/未执行) */
18
+ export declare function summarizeResults(ctx: AiVerifyReportContext): {
19
+ total: number;
20
+ passed: number;
21
+ failed: number;
22
+ skipped: number;
23
+ notRun: number;
24
+ };
25
+ /** 生成 HTML 报告并落盘 report.html,返回路径 */
26
+ export declare function generateAiVerifyReport(ctx: AiVerifyReportContext): Promise<string>;
27
+ //# sourceMappingURL=result-parser.d.ts.map