speccore 8.3.349 → 8.3.363

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 (248) hide show
  1. package/.agents/skills/spec-verify/SKILL.md +22 -1
  2. package/dist/cli.js +15 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/about.d.ts.map +1 -1
  5. package/dist/commands/about.js +36 -1
  6. package/dist/commands/about.js.map +1 -1
  7. package/dist/commands/analyze/add-platform.d.ts +3 -0
  8. package/dist/commands/analyze/add-platform.d.ts.map +1 -0
  9. package/dist/commands/analyze/add-platform.js +82 -0
  10. package/dist/commands/analyze/add-platform.js.map +1 -0
  11. package/dist/commands/analyze/audit-fix.d.ts +3 -0
  12. package/dist/commands/analyze/audit-fix.d.ts.map +1 -0
  13. package/dist/commands/analyze/audit-fix.js +73 -0
  14. package/dist/commands/analyze/audit-fix.js.map +1 -0
  15. package/dist/commands/analyze/context-guard.d.ts +3 -0
  16. package/dist/commands/analyze/context-guard.d.ts.map +1 -0
  17. package/dist/commands/analyze/context-guard.js +75 -0
  18. package/dist/commands/analyze/context-guard.js.map +1 -0
  19. package/dist/commands/analyze/doc.d.ts +3 -0
  20. package/dist/commands/analyze/doc.d.ts.map +1 -0
  21. package/dist/commands/analyze/doc.js +77 -0
  22. package/dist/commands/analyze/doc.js.map +1 -0
  23. package/dist/commands/analyze/feature.d.ts +3 -0
  24. package/dist/commands/analyze/feature.d.ts.map +1 -0
  25. package/dist/commands/analyze/feature.js +75 -0
  26. package/dist/commands/analyze/feature.js.map +1 -0
  27. package/dist/commands/analyze/from-code.d.ts +3 -0
  28. package/dist/commands/analyze/from-code.d.ts.map +1 -0
  29. package/dist/commands/analyze/from-code.js +94 -0
  30. package/dist/commands/analyze/from-code.js.map +1 -0
  31. package/dist/commands/analyze/incremental.d.ts +3 -0
  32. package/dist/commands/analyze/incremental.d.ts.map +1 -0
  33. package/dist/commands/analyze/incremental.js +90 -0
  34. package/dist/commands/analyze/incremental.js.map +1 -0
  35. package/dist/commands/analyze/modes.d.ts +13 -0
  36. package/dist/commands/analyze/modes.d.ts.map +1 -0
  37. package/dist/commands/analyze/modes.js +147 -0
  38. package/dist/commands/analyze/modes.js.map +1 -0
  39. package/dist/commands/analyze/module.d.ts +3 -0
  40. package/dist/commands/analyze/module.d.ts.map +1 -0
  41. package/dist/commands/analyze/module.js +95 -0
  42. package/dist/commands/analyze/module.js.map +1 -0
  43. package/dist/commands/analyze/overview.d.ts +3 -0
  44. package/dist/commands/analyze/overview.d.ts.map +1 -0
  45. package/dist/commands/analyze/overview.js +125 -0
  46. package/dist/commands/analyze/overview.js.map +1 -0
  47. package/dist/commands/analyze/shared.d.ts +53 -0
  48. package/dist/commands/analyze/shared.d.ts.map +1 -0
  49. package/dist/commands/analyze/shared.js +34 -0
  50. package/dist/commands/analyze/shared.js.map +1 -0
  51. package/dist/commands/analyze/units.d.ts +46 -0
  52. package/dist/commands/analyze/units.d.ts.map +1 -0
  53. package/dist/commands/analyze/units.js +950 -0
  54. package/dist/commands/analyze/units.js.map +1 -0
  55. package/dist/commands/analyze.d.ts +6 -88
  56. package/dist/commands/analyze.d.ts.map +1 -1
  57. package/dist/commands/analyze.js +97 -1417
  58. package/dist/commands/analyze.js.map +1 -1
  59. package/dist/commands/ask.d.ts.map +1 -1
  60. package/dist/commands/ask.js +4 -2
  61. package/dist/commands/ask.js.map +1 -1
  62. package/dist/commands/dashboard.d.ts.map +1 -1
  63. package/dist/commands/dashboard.js +36 -1
  64. package/dist/commands/dashboard.js.map +1 -1
  65. package/dist/commands/deploy.d.ts +6 -0
  66. package/dist/commands/deploy.d.ts.map +1 -1
  67. package/dist/commands/deploy.js +153 -0
  68. package/dist/commands/deploy.js.map +1 -1
  69. package/dist/commands/doc2spec.d.ts +1 -1
  70. package/dist/commands/doc2spec.d.ts.map +1 -1
  71. package/dist/commands/doc2spec.js +33 -23
  72. package/dist/commands/doc2spec.js.map +1 -1
  73. package/dist/commands/doctor.js +60 -13
  74. package/dist/commands/doctor.js.map +1 -1
  75. package/dist/commands/execute.d.ts.map +1 -1
  76. package/dist/commands/execute.js +22 -0
  77. package/dist/commands/execute.js.map +1 -1
  78. package/dist/commands/help.js +36 -1
  79. package/dist/commands/help.js.map +1 -1
  80. package/dist/commands/init.js +1 -1
  81. package/dist/commands/init.js.map +1 -1
  82. package/dist/commands/pipeline.d.ts.map +1 -1
  83. package/dist/commands/pipeline.js +15 -0
  84. package/dist/commands/pipeline.js.map +1 -1
  85. package/dist/commands/plan.js +2 -0
  86. package/dist/commands/plan.js.map +1 -1
  87. package/dist/commands/pr.d.ts.map +1 -1
  88. package/dist/commands/pr.js +14 -3
  89. package/dist/commands/pr.js.map +1 -1
  90. package/dist/commands/prompts.d.ts +11 -1
  91. package/dist/commands/prompts.d.ts.map +1 -1
  92. package/dist/commands/prompts.js +197 -15
  93. package/dist/commands/prompts.js.map +1 -1
  94. package/dist/commands/reindex.d.ts.map +1 -1
  95. package/dist/commands/reindex.js +23 -0
  96. package/dist/commands/reindex.js.map +1 -1
  97. package/dist/commands/retro.d.ts.map +1 -1
  98. package/dist/commands/retro.js +3 -1
  99. package/dist/commands/retro.js.map +1 -1
  100. package/dist/commands/status-panel.d.ts.map +1 -1
  101. package/dist/commands/status-panel.js +9 -1
  102. package/dist/commands/status-panel.js.map +1 -1
  103. package/dist/commands/unitize.d.ts +2 -0
  104. package/dist/commands/unitize.d.ts.map +1 -1
  105. package/dist/commands/unitize.js +168 -6
  106. package/dist/commands/unitize.js.map +1 -1
  107. package/dist/commands/update-env-configs.d.ts.map +1 -1
  108. package/dist/commands/update-env-configs.js +10 -0
  109. package/dist/commands/update-env-configs.js.map +1 -1
  110. package/dist/commands/verify.d.ts +8 -0
  111. package/dist/commands/verify.d.ts.map +1 -1
  112. package/dist/commands/verify.js +383 -16
  113. package/dist/commands/verify.js.map +1 -1
  114. package/dist/commands/welcome.d.ts.map +1 -1
  115. package/dist/commands/welcome.js +3 -1
  116. package/dist/commands/welcome.js.map +1 -1
  117. package/dist/core/ai-verify/plan-generator.d.ts +94 -0
  118. package/dist/core/ai-verify/plan-generator.d.ts.map +1 -0
  119. package/dist/core/ai-verify/plan-generator.js +598 -0
  120. package/dist/core/ai-verify/plan-generator.js.map +1 -0
  121. package/dist/core/ai-verify/result-parser.d.ts +27 -0
  122. package/dist/core/ai-verify/result-parser.d.ts.map +1 -0
  123. package/dist/core/ai-verify/result-parser.js +212 -0
  124. package/dist/core/ai-verify/result-parser.js.map +1 -0
  125. package/dist/core/ai-verify/scope-resolver.d.ts +34 -0
  126. package/dist/core/ai-verify/scope-resolver.d.ts.map +1 -0
  127. package/dist/core/ai-verify/scope-resolver.js +183 -0
  128. package/dist/core/ai-verify/scope-resolver.js.map +1 -0
  129. package/dist/core/ai-verify/types.d.ts +171 -0
  130. package/dist/core/ai-verify/types.d.ts.map +1 -0
  131. package/dist/core/ai-verify/types.js +9 -0
  132. package/dist/core/ai-verify/types.js.map +1 -0
  133. package/dist/core/ai-verify/visual-judge.d.ts +33 -0
  134. package/dist/core/ai-verify/visual-judge.d.ts.map +1 -0
  135. package/dist/core/ai-verify/visual-judge.js +123 -0
  136. package/dist/core/ai-verify/visual-judge.js.map +1 -0
  137. package/dist/core/ask-engine.d.ts +6 -0
  138. package/dist/core/ask-engine.d.ts.map +1 -1
  139. package/dist/core/ask-engine.js +83 -3
  140. package/dist/core/ask-engine.js.map +1 -1
  141. package/dist/core/code-graph/builder.d.ts.map +1 -1
  142. package/dist/core/code-graph/builder.js +93 -75
  143. package/dist/core/code-graph/builder.js.map +1 -1
  144. package/dist/core/code-graph/incremental-build.d.ts.map +1 -1
  145. package/dist/core/code-graph/incremental-build.js +13 -19
  146. package/dist/core/code-graph/incremental-build.js.map +1 -1
  147. package/dist/core/code-graph/index.d.ts +1 -1
  148. package/dist/core/code-graph/index.d.ts.map +1 -1
  149. package/dist/core/code-graph/index.js +15 -12
  150. package/dist/core/code-graph/index.js.map +1 -1
  151. package/dist/core/code-graph/multimodal.js +1 -1
  152. package/dist/core/code-graph/parser.js +1 -1
  153. package/dist/core/code-graph/query.d.ts +1 -1
  154. package/dist/core/code-graph/reporter.d.ts +1 -1
  155. package/dist/core/code-graph/reporter.d.ts.map +1 -1
  156. package/dist/core/code-graph/reporter.js +18 -10
  157. package/dist/core/code-graph/reporter.js.map +1 -1
  158. package/dist/core/code-graph/requirement-linker.d.ts.map +1 -1
  159. package/dist/core/code-graph/requirement-linker.js +24 -14
  160. package/dist/core/code-graph/requirement-linker.js.map +1 -1
  161. package/dist/core/code-graph/types.d.ts +1 -1
  162. package/dist/core/code-graph/types.js +1 -1
  163. package/dist/core/code-graph/visualizer.d.ts +1 -7
  164. package/dist/core/code-graph/visualizer.d.ts.map +1 -1
  165. package/dist/core/code-graph/visualizer.js +476 -49
  166. package/dist/core/code-graph/visualizer.js.map +1 -1
  167. package/dist/core/deploy/engine.d.ts +21 -0
  168. package/dist/core/deploy/engine.d.ts.map +1 -1
  169. package/dist/core/deploy/engine.js +276 -0
  170. package/dist/core/deploy/engine.js.map +1 -1
  171. package/dist/core/deploy-ledger.d.ts +12 -0
  172. package/dist/core/deploy-ledger.d.ts.map +1 -0
  173. package/dist/core/deploy-ledger.js +35 -0
  174. package/dist/core/deploy-ledger.js.map +1 -0
  175. package/dist/core/environment-config.d.ts +11 -0
  176. package/dist/core/environment-config.d.ts.map +1 -1
  177. package/dist/core/environment-config.js +4 -0
  178. package/dist/core/environment-config.js.map +1 -1
  179. package/dist/core/intent-cache.d.ts.map +1 -1
  180. package/dist/core/intent-cache.js +6 -0
  181. package/dist/core/intent-cache.js.map +1 -1
  182. package/dist/core/knowledge-visualizer.js +1 -1
  183. package/dist/core/page-bundle.d.ts +2 -0
  184. package/dist/core/page-bundle.d.ts.map +1 -1
  185. package/dist/core/page-bundle.js +18 -1
  186. package/dist/core/page-bundle.js.map +1 -1
  187. package/dist/core/plan-html.js +1 -1
  188. package/dist/core/platform-inference.d.ts +35 -0
  189. package/dist/core/platform-inference.d.ts.map +1 -1
  190. package/dist/core/platform-inference.js +92 -0
  191. package/dist/core/platform-inference.js.map +1 -1
  192. package/dist/core/prompt-plugins/analyze-graph-plugin.d.ts.map +1 -1
  193. package/dist/core/prompt-plugins/analyze-graph-plugin.js +16 -1
  194. package/dist/core/prompt-plugins/analyze-graph-plugin.js.map +1 -1
  195. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts +2 -0
  196. package/dist/core/prompt-plugins/execute-graph-plugin.d.ts.map +1 -1
  197. package/dist/core/prompt-plugins/execute-graph-plugin.js +127 -27
  198. package/dist/core/prompt-plugins/execute-graph-plugin.js.map +1 -1
  199. package/dist/core/quality-audit.d.ts.map +1 -1
  200. package/dist/core/quality-audit.js +18 -0
  201. package/dist/core/quality-audit.js.map +1 -1
  202. package/dist/core/reindex-engine.d.ts +20 -0
  203. package/dist/core/reindex-engine.d.ts.map +1 -1
  204. package/dist/core/reindex-engine.js +142 -0
  205. package/dist/core/reindex-engine.js.map +1 -1
  206. package/dist/core/requirement-clarifier.d.ts.map +1 -1
  207. package/dist/core/requirement-clarifier.js +22 -6
  208. package/dist/core/requirement-clarifier.js.map +1 -1
  209. package/dist/core/spec-paths.d.ts +5 -0
  210. package/dist/core/spec-paths.d.ts.map +1 -1
  211. package/dist/core/spec-paths.js +1 -0
  212. package/dist/core/spec-paths.js.map +1 -1
  213. package/dist/core/test-config.d.ts +7 -1
  214. package/dist/core/test-config.d.ts.map +1 -1
  215. package/dist/core/test-config.js +59 -11
  216. package/dist/core/test-config.js.map +1 -1
  217. package/dist/core/ui-verify/index.d.ts +1 -1
  218. package/dist/core/ui-verify/index.d.ts.map +1 -1
  219. package/dist/core/ui-verify/index.js +2 -1
  220. package/dist/core/ui-verify/index.js.map +1 -1
  221. package/dist/core/ui-verify/smoke-engine.js +71 -15
  222. package/dist/core/ui-verify/smoke-engine.js.map +1 -1
  223. package/dist/core/ui-verify/spec-generator.d.ts +5 -9
  224. package/dist/core/ui-verify/spec-generator.d.ts.map +1 -1
  225. package/dist/core/ui-verify/spec-generator.js +66 -3
  226. package/dist/core/ui-verify/spec-generator.js.map +1 -1
  227. package/dist/core/ui-verify/types.d.ts +25 -0
  228. package/dist/core/ui-verify/types.d.ts.map +1 -1
  229. package/dist/core/ui-verify/visual-model-client.d.ts +2 -0
  230. package/dist/core/ui-verify/visual-model-client.d.ts.map +1 -1
  231. package/dist/core/ui-verify/visual-model-client.js +4 -4
  232. package/dist/core/ui-verify/visual-model-client.js.map +1 -1
  233. package/dist/core/unified-config.d.ts +27 -0
  234. package/dist/core/unified-config.d.ts.map +1 -1
  235. package/dist/core/unified-config.js +37 -0
  236. package/dist/core/unified-config.js.map +1 -1
  237. package/package.json +1 -1
  238. package/templates/accounts-example.yaml +49 -0
  239. package/templates/html/fonts/JetBrainsMono.woff2 +0 -0
  240. package/templates/html/fonts/Orbitron.woff2 +0 -0
  241. package/templates/html/speccore-ask-explain.html +1 -1
  242. package/templates/html/speccore-ask-guide.html +2 -2
  243. package/templates/html/speccore-ask-match.html +1 -1
  244. package/templates/html/speccore-ask-pipeline.html +1 -1
  245. package/templates/html/speccore-ask-result.html +2 -2
  246. package/templates/html/speccore-help.html +2 -2
  247. package/templates/html/speccore-setup-guide.html +16 -1
  248. package/templates/speccore-yml-example.yml +12 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-parser.d.ts","sourceRoot":"","sources":["../../../src/core/ai-verify/result-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEtG,cAAc;AACd,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAK5D,CAAC;AAEF,sCAAsC;AACtC,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAS/F;AAED,gCAAgC;AAChC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAG3F;AAED,cAAc;AACd,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,qBAAqB,CAEtG;AAED,yBAAyB;AACzB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,GAAG;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAWA;AAyED,qCAAqC;AACrC,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyFxF"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ /**
3
+ * result-parser — 执行结果解析与 HTML 报告生成(v8.3.350+)
4
+ *
5
+ * 宿主 AI 执行完剧本写回 results.json,本模块负责:
6
+ * 1. 结构校验 + 与 plan.json 场景对齐(缺漏场景标未执行)
7
+ * 2. 生成 HTML 报告(复用 ui-verify 报告的视觉风格)
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.EXECUTOR_LABELS = void 0;
11
+ exports.parseAiVerifyResults = parseAiVerifyResults;
12
+ exports.findMissingScenarios = findMissingScenarios;
13
+ exports.buildReportContext = buildReportContext;
14
+ exports.summarizeResults = summarizeResults;
15
+ exports.generateAiVerifyReport = generateAiVerifyReport;
16
+ const path_1 = require("path");
17
+ const fs_extra_1 = require("fs-extra");
18
+ /** 执行通道展示名 */
19
+ exports.EXECUTOR_LABELS = {
20
+ 'browser-agent': 'Browser 子代理',
21
+ 'playwright-mcp': 'Playwright MCP',
22
+ 'visual-judge': '视觉模型判定',
23
+ manual: '人工执行',
24
+ };
25
+ /** 解析 results.json(结构校验,非法返回 null) */
26
+ async function parseAiVerifyResults(resultsPath) {
27
+ try {
28
+ const raw = await (0, fs_extra_1.readFile)(resultsPath, 'utf-8');
29
+ const parsed = JSON.parse(raw);
30
+ if (!parsed || !Array.isArray(parsed.results))
31
+ return null;
32
+ return parsed;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ /** 场景对齐:找出剧本中有而结果中缺失的场景(未执行) */
39
+ function findMissingScenarios(plan, results) {
40
+ const executed = new Set(results.results.map((r) => r.scenarioId));
41
+ return plan.scenarios.map((s) => s.id).filter((id) => !executed.has(id));
42
+ }
43
+ /** 组装报告上下文 */
44
+ function buildReportContext(plan, results) {
45
+ return { plan, results, missing: findMissingScenarios(plan, results) };
46
+ }
47
+ /** 摘要统计(通过/失败/跳过/未执行) */
48
+ function summarizeResults(ctx) {
49
+ const { plan, results, missing } = ctx;
50
+ const byId = new Map(results.results.map((r) => [r.scenarioId, r]));
51
+ const total = plan.scenarios.length;
52
+ const passed = plan.scenarios.filter((s) => byId.get(s.id)?.passed).length;
53
+ const failed = plan.scenarios.filter((s) => {
54
+ const r = byId.get(s.id);
55
+ return r && !r.passed && !r.skipped;
56
+ }).length;
57
+ const skipped = plan.scenarios.filter((s) => byId.get(s.id)?.skipped).length;
58
+ return { total, passed, failed, skipped, notRun: missing.length };
59
+ }
60
+ /** HTML 转义 */
61
+ function esc(text) {
62
+ return text
63
+ .replace(/&/g, '&')
64
+ .replace(/</g, '&lt;')
65
+ .replace(/>/g, '&gt;')
66
+ .replace(/"/g, '&quot;');
67
+ }
68
+ /** 按端分组渲染场景卡片(层内复用) */
69
+ function renderPlatformSections(scenarios, byId) {
70
+ const byPlatform = new Map();
71
+ for (const s of scenarios) {
72
+ const list = byPlatform.get(s.platform) || [];
73
+ list.push(s);
74
+ byPlatform.set(s.platform, list);
75
+ }
76
+ const platformSections = [];
77
+ for (const [platform, list] of byPlatform) {
78
+ const cards = list
79
+ .map((s) => {
80
+ const r = byId.get(s.id);
81
+ let status;
82
+ let badge;
83
+ if (!r) {
84
+ status = 'notrun';
85
+ badge = '<span class="badge notrun">未执行</span>';
86
+ }
87
+ else if (r.skipped) {
88
+ status = 'skip';
89
+ badge = '<span class="badge skip">跳过</span>';
90
+ }
91
+ else if (r.passed) {
92
+ status = 'pass';
93
+ badge = '<span class="badge pass">通过</span>';
94
+ }
95
+ else {
96
+ status = 'fail';
97
+ badge = '<span class="badge fail">失败</span>';
98
+ }
99
+ const reason = r ? `<div class="reason">${esc(r.reason)}</div>` : '';
100
+ const executorLabel = r?.executor ? ` · 执行通道: ${esc(exports.EXECUTOR_LABELS[r.executor] || r.executor)}` : '';
101
+ const screenshots = (r?.screenshots || [])
102
+ .map((shot) => `<div class="shot"><img src="${esc(shot)}" onerror="this.style.display='none'" /></div>`)
103
+ .join('');
104
+ return `
105
+ <div class="scenario ${status}">
106
+ <div class="scenario-header">
107
+ <strong>${esc(s.title)}</strong>
108
+ ${badge}
109
+ </div>
110
+ <div class="scenario-body">
111
+ <div class="meta">${esc(s.unit)} · ${esc(s.platform)}${executorLabel} · <a href="${esc(s.entry)}" target="_blank">${esc(s.entry)}</a></div>
112
+ ${reason}
113
+ ${screenshots ? `<div class="shots">${screenshots}</div>` : ''}
114
+ </div>
115
+ </div>`;
116
+ })
117
+ .join('');
118
+ platformSections.push(` <div class="section">
119
+ <h2>${esc(platform)}</h2>
120
+ ${cards}
121
+ </div>`);
122
+ }
123
+ return platformSections.join('\n');
124
+ }
125
+ /** 生成 HTML 报告并落盘 report.html,返回路径 */
126
+ async function generateAiVerifyReport(ctx) {
127
+ const { plan, results } = ctx;
128
+ await (0, fs_extra_1.ensureDir)(plan.outDir);
129
+ const byId = new Map(results.results.map((r) => [r.scenarioId, r]));
130
+ const { total, passed, failed, skipped: skippedCount, notRun } = summarizeResults(ctx);
131
+ // v8.3.351+: 按层渲染(公共能力层 → 模块层);旧剧本无 groups 时回退按端分组
132
+ let scenarioSections;
133
+ if (Array.isArray(plan.groups) && plan.groups.length > 0) {
134
+ scenarioSections = plan.groups
135
+ .map((g) => {
136
+ const layerHead = ` <div class="section layer">
137
+ <h2>${esc(g.label)}${g.enabled ? '' : '(⏭️ 已关闭)'}</h2>${g.note ? `
138
+ <div class="layer-note">${esc(g.note)}</div>` : ''}`;
139
+ const body = g.scenarios.length > 0 ? renderPlatformSections(g.scenarios, byId) : ' <div class="notes">(本层无场景)</div>';
140
+ return `${layerHead}
141
+ ${body}
142
+ </div>`;
143
+ })
144
+ .join('\n');
145
+ }
146
+ else {
147
+ scenarioSections = renderPlatformSections(plan.scenarios, byId);
148
+ }
149
+ const skippedNotes = plan.skipped.length
150
+ ? `<div class="notes"><h3>生成期跳过项</h3><ul>${plan.skipped
151
+ .map((s) => `<li>${esc(s.unit)}${s.platform ? '/' + esc(s.platform) : ''}: ${esc(s.reason)}</li>`)
152
+ .join('')}</ul></div>`
153
+ : '';
154
+ const html = `<!DOCTYPE html>
155
+ <html lang="zh-CN">
156
+ <head>
157
+ <meta charset="UTF-8" />
158
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
159
+ <title>AI 浏览器验证报告 — ${esc(plan.env)}</title>
160
+ <style>
161
+ body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; margin: 0; background: #f5f7fa; color: #1f2937; }
162
+ .container { max-width: 960px; margin: 0 auto; padding: 24px; }
163
+ h1 { font-size: 22px; margin: 0 0 8px; }
164
+ .summary { display: flex; gap: 12px; margin: 16px 0; flex-wrap: wrap; }
165
+ .stat { background: #fff; border-radius: 8px; padding: 12px 20px; box-shadow: 0 1px 3px rgba(0,0,0,.08); }
166
+ .stat .num { font-size: 26px; font-weight: 700; }
167
+ .stat.pass .num { color: #16a34a; }
168
+ .stat.fail .num { color: #dc2626; }
169
+ .stat.skip .num { color: #d97706; }
170
+ .stat.notrun .num { color: #6b7280; }
171
+ .section { background: #fff; border-radius: 10px; padding: 16px 20px; margin: 16px 0; box-shadow: 0 1px 3px rgba(0,0,0,.08); }
172
+ .section h2 { margin: 0 0 12px; font-size: 17px; }
173
+ .scenario { border: 1px solid #e5e7eb; border-radius: 8px; margin: 10px 0; overflow: hidden; }
174
+ .scenario-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; background: #fafafa; }
175
+ .scenario-body { padding: 10px 14px; }
176
+ .badge { font-size: 12px; padding: 2px 10px; border-radius: 999px; color: #fff; }
177
+ .badge.pass { background: #16a34a; }
178
+ .badge.fail { background: #dc2626; }
179
+ .badge.skip { background: #d97706; }
180
+ .badge.notrun { background: #6b7280; }
181
+ .meta { font-size: 12px; color: #6b7280; margin-bottom: 6px; }
182
+ .reason { font-size: 13px; margin: 6px 0; white-space: pre-wrap; }
183
+ .scenario.fail .reason { color: #b91c1c; }
184
+ .scenario.pass .reason { color: #15803d; }
185
+ .shots { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; }
186
+ .shot img { max-width: 280px; max-height: 200px; border: 1px solid #e5e7eb; border-radius: 6px; }
187
+ .notes { background: #fffbeb; border: 1px solid #fde68a; border-radius: 8px; padding: 12px 16px; margin: 16px 0; font-size: 13px; }
188
+ .notes ul { margin: 6px 0 0; padding-left: 18px; }
189
+ </style>
190
+ </head>
191
+ <body>
192
+ <div class="container">
193
+ <h1>AI 浏览器验证报告</h1>
194
+ <div class="meta">环境: ${esc(plan.env)} · 迭代: ${esc(plan.iteration)} · 执行时间: ${esc(results.executedAt)}</div>
195
+ <div class="summary">
196
+ <div class="stat"><div>总场景</div><div class="num">${total}</div></div>
197
+ <div class="stat pass"><div>通过</div><div class="num">${passed}</div></div>
198
+ <div class="stat fail"><div>失败</div><div class="num">${failed}</div></div>
199
+ <div class="stat skip"><div>跳过</div><div class="num">${skippedCount}</div></div>
200
+ <div class="stat notrun"><div>未执行</div><div class="num">${notRun}</div></div>
201
+ </div>
202
+ ${skippedNotes}
203
+ ${scenarioSections}
204
+ </div>
205
+ </body>
206
+ </html>
207
+ `;
208
+ const reportPath = (0, path_1.join)(plan.outDir, 'report.html');
209
+ await (0, fs_extra_1.writeFile)(reportPath, html, 'utf-8');
210
+ return reportPath;
211
+ }
212
+ //# sourceMappingURL=result-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-parser.js","sourceRoot":"","sources":["../../../src/core/ai-verify/result-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * scope-resolver — AI 验证范围解析(v8.3.350+)
3
+ *
4
+ * 三种范围:
5
+ * all → 020-specs 下所有功能单元目录
6
+ * deployed → 读部署清单(deploy-manifest.json)的端名,筛选含对应端子目录的单元
7
+ * modules → 精确匹配指定的功能单元目录名
8
+ * 均可叠加端过滤(platformFilter)。
9
+ */
10
+ import type { DeployManifest, ScopeUnit } from './types';
11
+ export interface ScopeResolveInput {
12
+ /** 迭代目录绝对路径(含 020-specs) */
13
+ iterDir: string;
14
+ /** scope 参数原文:all | deployed | modules:a,b */
15
+ scope: string;
16
+ /** 端过滤(CONSTITUTION 标准端名,逗号分隔),空为不过滤 */
17
+ platformFilter?: string;
18
+ /** 项目根目录(读 deploy-manifest.json 用) */
19
+ projectRoot: string;
20
+ }
21
+ export interface ScopeResolveOutput {
22
+ units: ScopeUnit[];
23
+ warnings: string[];
24
+ }
25
+ /** 解析 --platform 参数为端名数组 */
26
+ export declare function parsePlatformFilter(filter?: string): string[];
27
+ /** 读部署清单(不存在返回 null) */
28
+ export declare function loadDeployManifest(projectRoot: string): Promise<DeployManifest | null>;
29
+ /**
30
+ * 解析验证范围 → 功能单元列表。
31
+ * 非法 scope 抛错(由调用方捕获提示用法)。
32
+ */
33
+ export declare function resolveScopeUnits(input: ScopeResolveInput): Promise<ScopeResolveOutput>;
34
+ //# sourceMappingURL=scope-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/ai-verify/scope-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAKzD,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,4BAA4B;AAC5B,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAM7D;AA4CD,wBAAwB;AACxB,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAU5F;AAsBD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0C7F"}
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ /**
3
+ * scope-resolver — AI 验证范围解析(v8.3.350+)
4
+ *
5
+ * 三种范围:
6
+ * all → 020-specs 下所有功能单元目录
7
+ * deployed → 读部署清单(deploy-manifest.json)的端名,筛选含对应端子目录的单元
8
+ * modules → 精确匹配指定的功能单元目录名
9
+ * 均可叠加端过滤(platformFilter)。
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.parsePlatformFilter = parsePlatformFilter;
46
+ exports.loadDeployManifest = loadDeployManifest;
47
+ exports.resolveScopeUnits = resolveScopeUnits;
48
+ const path_1 = require("path");
49
+ const fs_extra_1 = require("fs-extra");
50
+ /** 非功能单元的目录名(全局规格与元数据,AGENTS.md 约定) */
51
+ const EXCLUDED_DIRS = new Set(['overview', 'requirements']);
52
+ /** 解析 --platform 参数为端名数组 */
53
+ function parsePlatformFilter(filter) {
54
+ if (!filter)
55
+ return [];
56
+ return filter
57
+ .split(/[,,、\s]+/)
58
+ .map((n) => n.trim())
59
+ .filter(Boolean);
60
+ }
61
+ /** 判断一个目录是否为功能单元目录(含端子目录或 overview 子目录) */
62
+ async function listUnitPlatforms(unitPath) {
63
+ let entries;
64
+ try {
65
+ entries = await (0, fs_extra_1.readdir)(unitPath);
66
+ }
67
+ catch {
68
+ return [];
69
+ }
70
+ // 端目录特征:包含 UI_SPEC.md / TEST.md / TECH.md 之一的子目录(overview 除外)
71
+ const platforms = [];
72
+ for (const entry of entries) {
73
+ if (EXCLUDED_DIRS.has(entry))
74
+ continue;
75
+ try {
76
+ const stats = (await Promise.resolve().then(() => __importStar(require('fs-extra')))).statSync((0, path_1.join)(unitPath, entry));
77
+ if (!stats.isDirectory())
78
+ continue;
79
+ }
80
+ catch {
81
+ continue;
82
+ }
83
+ platforms.push(entry);
84
+ }
85
+ return platforms;
86
+ }
87
+ /** 枚举 020-specs 下全部功能单元 */
88
+ async function listAllUnits(specsDir) {
89
+ const entries = await (0, fs_extra_1.readdir)(specsDir);
90
+ const units = [];
91
+ for (const entry of entries) {
92
+ if (EXCLUDED_DIRS.has(entry))
93
+ continue;
94
+ const unitPath = (0, path_1.join)(specsDir, entry);
95
+ try {
96
+ const stats = (await Promise.resolve().then(() => __importStar(require('fs-extra')))).statSync(unitPath);
97
+ if (!stats.isDirectory())
98
+ continue;
99
+ }
100
+ catch {
101
+ continue;
102
+ }
103
+ const platforms = await listUnitPlatforms(unitPath);
104
+ units.push({ name: entry, path: unitPath, platforms });
105
+ }
106
+ return units;
107
+ }
108
+ /** 读部署清单(不存在返回 null) */
109
+ async function loadDeployManifest(projectRoot) {
110
+ const manifestPath = (0, path_1.join)(projectRoot, '.speccore', 'local', 'deploy-manifest.json');
111
+ try {
112
+ const raw = await (0, fs_extra_1.readFile)(manifestPath, 'utf-8');
113
+ const parsed = JSON.parse(raw);
114
+ if (!parsed || !Array.isArray(parsed.platforms))
115
+ return null;
116
+ return parsed;
117
+ }
118
+ catch {
119
+ return null;
120
+ }
121
+ }
122
+ /** 按部署清单端名筛选单元:单元含任一已部署端子目录则入选 */
123
+ function filterByDeployed(all, manifest) {
124
+ const deployedNames = new Set(manifest.platforms.map((p) => p.name));
125
+ return all.filter((u) => u.platforms.some((p) => deployedNames.has(p)));
126
+ }
127
+ /** 按模块名筛选:精确匹配单元目录名 */
128
+ function filterByModules(all, modules) {
129
+ const wanted = new Set(modules);
130
+ return all.filter((u) => wanted.has(u.name));
131
+ }
132
+ /** 端过滤:单元保留 filter 中的端 */
133
+ function applyPlatformFilter(units, filter) {
134
+ if (filter.length === 0)
135
+ return units;
136
+ return units
137
+ .map((u) => ({ ...u, platforms: u.platforms.filter((p) => filter.includes(p)) }))
138
+ .filter((u) => u.platforms.length > 0);
139
+ }
140
+ /**
141
+ * 解析验证范围 → 功能单元列表。
142
+ * 非法 scope 抛错(由调用方捕获提示用法)。
143
+ */
144
+ async function resolveScopeUnits(input) {
145
+ const specsDir = (0, path_1.join)(input.iterDir, '020-specs');
146
+ const all = await listAllUnits(specsDir);
147
+ const warnings = [];
148
+ let units;
149
+ const scope = (input.scope || 'all').trim();
150
+ if (scope === 'all') {
151
+ units = all;
152
+ }
153
+ else if (scope === 'deployed') {
154
+ const manifest = await loadDeployManifest(input.projectRoot);
155
+ if (!manifest) {
156
+ throw new Error('未找到部署清单(.speccore/local/deploy-manifest.json)。请先执行 speccore deploy 部署,再使用 --scope deployed');
157
+ }
158
+ units = filterByDeployed(all, manifest);
159
+ if (units.length === 0) {
160
+ warnings.push(`部署清单(${manifest.time},端: ${manifest.platforms.map((p) => p.name).join(', ')})与 020-specs 无交集,无可验证单元`);
161
+ }
162
+ }
163
+ else if (scope.startsWith('modules:')) {
164
+ const modules = parsePlatformFilter(scope.slice('modules:'.length));
165
+ if (modules.length === 0) {
166
+ throw new Error('--scope modules: 后需跟功能单元名(逗号分隔),如 modules:订单管理,用户管理');
167
+ }
168
+ units = filterByModules(all, modules);
169
+ const found = new Set(units.map((u) => u.name));
170
+ for (const m of modules) {
171
+ if (!found.has(m))
172
+ warnings.push(`模块 "${m}" 在 020-specs 中不存在,已忽略`);
173
+ }
174
+ }
175
+ else {
176
+ throw new Error(`未知验证范围 "${scope}",可用: all | deployed | modules:单元名(逗号分隔)`);
177
+ }
178
+ // 端过滤
179
+ const filter = parsePlatformFilter(input.platformFilter);
180
+ units = applyPlatformFilter(units, filter);
181
+ return { units, warnings };
182
+ }
183
+ //# sourceMappingURL=scope-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-resolver.js","sourceRoot":"","sources":["../../../src/core/ai-verify/scope-resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * AI 浏览器验证 — 类型定义(v8.3.350+)
3
+ *
4
+ * 分工:CLI 只切片不解析语义——从 020-specs 的 UI_SPEC.md/TEST.md 按标题抓取
5
+ * 原文段落组装成剧本,语义理解与页面操作交给宿主 AI(Browser 子代理)执行。
6
+ */
7
+ /** 部署清单(deploy 成功后落盘 .speccore/local/deploy-manifest.json,支撑 --scope deployed) */
8
+ export interface DeployManifestPlatform {
9
+ name: string;
10
+ type?: string;
11
+ git?: {
12
+ branch?: string;
13
+ commit?: string;
14
+ };
15
+ }
16
+ export interface DeployManifest {
17
+ env: string;
18
+ time: string;
19
+ platforms: DeployManifestPlatform[];
20
+ }
21
+ /** 范围解析结果:一个功能单元目录 */
22
+ export interface ScopeUnit {
23
+ /** 功能单元目录名(如 订单管理 或 admin-web-01-yudingguanli) */
24
+ name: string;
25
+ /** 绝对路径 */
26
+ path: string;
27
+ /** 该单元下存在的端目录名列表 */
28
+ platforms: string[];
29
+ }
30
+ /**
31
+ * 剧本分层 ID(v8.3.351+):
32
+ * common = 公共能力层(入口可达性/登录态/全局导航,CLI 模板生成,先于模块层执行)
33
+ * modules = 模块层(各功能单元 UI_SPEC/TEST 切片场景,逐单元推进)
34
+ */
35
+ export type AiVerifyGroupId = 'common' | 'modules';
36
+ /** 剧本分层:执行视角的分组视图(场景仍平铺在 plan.scenarios,按 scenarioId 对齐结果) */
37
+ export interface AiVerifyGroup {
38
+ id: AiVerifyGroupId;
39
+ /** 层显示名(公共能力层 / 模块层) */
40
+ label: string;
41
+ /** 该层是否启用(settings.tests.layered 控制;关闭时无场景但保留层头供审计) */
42
+ enabled: boolean;
43
+ /** 该层场景 */
44
+ scenarios: AiVerifyScenario[];
45
+ /** 层说明(执行协议提示) */
46
+ note?: string;
47
+ }
48
+ /** 单个验证场景(剧本最小单元) */
49
+ export interface AiVerifyScenario {
50
+ /** 场景 ID:{单元}__{端}__{序号},执行结果按此对齐(公共层单元名为 common) */
51
+ id: string;
52
+ /** 所属分层 */
53
+ group: AiVerifyGroupId;
54
+ /** 功能单元目录名(公共层为 common) */
55
+ unit: string;
56
+ /** 端名(CONSTITUTION 标准端名) */
57
+ platform: string;
58
+ /** 入口 URL(environments/{env}.yaml 的 tests.base_urls) */
59
+ entry: string;
60
+ /** 账号引用(如 staging.admin),剧本不落密码;无账号时为空 */
61
+ account?: string;
62
+ /** 操作步骤原文切片(UI_SPEC 交互流程段) */
63
+ steps: string[];
64
+ /** 预期结果原文切片(TEST.md 用例段) */
65
+ expected: string[];
66
+ /** 场景标题(取源文档段落标题,无标题时用兜底描述) */
67
+ title: string;
68
+ }
69
+ /** 跳过项:无地址/空模板等无法生成剧本的单元 */
70
+ export interface AiVerifySkipped {
71
+ unit: string;
72
+ platform?: string;
73
+ reason: string;
74
+ }
75
+ /** 账号环境变量引用提示:password/username 形如 ${VAR} 时,执行 AI 需从环境变量取明文 */
76
+ export interface AccountEnvVarHint {
77
+ /** 账号引用名(如 staging.admin) */
78
+ ref: string;
79
+ /** 使用环境变量的字段 */
80
+ field: 'username' | 'password';
81
+ /** 环境变量名 */
82
+ varName: string;
83
+ /** 剧本生成时该变量是否已设置(未设置时剧本仅提示,不阻断) */
84
+ set: boolean;
85
+ }
86
+ /**
87
+ * 登录验证码提示(v8.3.354+):账号配置了 verification 时,剧本头集中声明取码说明。
88
+ * 只落「取码通道指引」不落码本身——执行 AI 按 note 自行取码(短信网关/TOTP 工具/测试号平台)。
89
+ */
90
+ export interface AccountVerificationHint {
91
+ /** 账号引用名(如 staging.user) */
92
+ ref: string;
93
+ /** 验证码类型(sms/totp/graphic/email;仅供执行 AI 参考取码方式) */
94
+ type: string;
95
+ /** 取码说明(人写的通道指引,如「验证码发送至测试手机 138xxxx,从短信网关读取」) */
96
+ note: string;
97
+ }
98
+ /** AI 验证剧本(机器可读,落盘 plan.json) */
99
+ export interface AiVerifyPlan {
100
+ /** 生成版本号 */
101
+ version: '1.0';
102
+ /** 环境名 */
103
+ env: string;
104
+ /** 迭代名 */
105
+ iteration: string;
106
+ /** 生成时间 ISO */
107
+ generatedAt: string;
108
+ /** 账号兑底文件路径(绝对路径;权威源为环境文件 tests.accounts,见 accountSources) */
109
+ accountsPath: string;
110
+ /**
111
+ * 账号来源说明(v8.3.351+ 账号收敛):执行 AI 据此定位明文。
112
+ * 如 ["environments/staging.yaml (tests.accounts)", "/abs/.speccore/tests/accounts.yaml"];
113
+ * 环境内嵌账号引用名为账号名(如 admin),accounts.yaml 兑底引用名为 {env}.{name}(如 staging.admin)。
114
+ */
115
+ accountSources?: string[];
116
+ /** 场景列表(按端分组后的平铺,与结果按 scenarioId 对齐) */
117
+ scenarios: AiVerifyScenario[];
118
+ /** 分层视图(v8.3.351+):公共能力层先行 → 模块层推进;执行 AI 按此顺序推进 */
119
+ groups: AiVerifyGroup[];
120
+ /** 跳过项 */
121
+ skipped: AiVerifySkipped[];
122
+ /** 账号环境变量引用提示(password/username 为 ${VAR} 形式时列出) */
123
+ accountEnvVars?: AccountEnvVarHint[];
124
+ /** 登录验证码提示(账号配置了 verification 时列出,执行 AI 据此取码) */
125
+ accountVerifications?: AccountVerificationHint[];
126
+ /**
127
+ * 原型/设计稿素材(v8.3.355+):010-requirements 下 assets/designs、assets/prototypes、
128
+ * assets/screenshots、prototypes 目录中收集的图片/HTML 绝对路径;
129
+ * 执行 AI 打开对照理解界面,复杂流程有了视觉参照物。
130
+ */
131
+ prototypeAssets?: string[];
132
+ /** 输出目录(report.html / results.json / screenshots 落盘处) */
133
+ outDir: string;
134
+ }
135
+ /** 执行通道:记录场景由哪个通道执行判定(报告展示 + 兜底链路审计) */
136
+ export type AiVerifyExecutor = 'browser-agent' | 'playwright-mcp' | 'visual-judge' | 'manual';
137
+ /** 单个场景执行结果(宿主 AI 写回) */
138
+ export interface AiVerifyResult {
139
+ scenarioId: string;
140
+ unit: string;
141
+ platform: string;
142
+ /** passed=false 且 skipped=true 表示跳过(验证码/支付等无法自动化) */
143
+ passed: boolean;
144
+ skipped?: boolean;
145
+ /** 执行通道(默认 browser-agent) */
146
+ executor?: AiVerifyExecutor;
147
+ /**
148
+ * 宿主 AI 是否已完成视觉判定。无多模态能力的宿主只截图不判定时写 false,
149
+ * 交由 speccore verify --ai-judge 用视觉模型兜底判定(executor 会改写为 visual-judge)。
150
+ */
151
+ judged?: boolean;
152
+ /** AI 判断理由(视觉检查 + 业务断言依据) */
153
+ reason: string;
154
+ /** 截图相对路径(相对 outDir) */
155
+ screenshots?: string[];
156
+ }
157
+ /** 执行结果汇总(宿主 AI 写回 results.json) */
158
+ export interface AiVerifyResults {
159
+ version: '1.0';
160
+ env: string;
161
+ executedAt: string;
162
+ results: AiVerifyResult[];
163
+ }
164
+ /** 报告生成输入:剧本 + 结果 */
165
+ export interface AiVerifyReportContext {
166
+ plan: AiVerifyPlan;
167
+ results: AiVerifyResults;
168
+ /** 结果中缺失的场景(未执行) */
169
+ missing: string[];
170
+ }
171
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/ai-verify/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * AI 浏览器验证 — 类型定义(v8.3.350+)
4
+ *
5
+ * 分工:CLI 只切片不解析语义——从 020-specs 的 UI_SPEC.md/TEST.md 按标题抓取
6
+ * 原文段落组装成剧本,语义理解与页面操作交给宿主 AI(Browser 子代理)执行。
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/ai-verify/types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG"}