speccore 8.3.47 → 8.3.49

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 (48) hide show
  1. package/dist/cli.js +6 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/execute.d.ts.map +1 -1
  4. package/dist/commands/execute.js +43 -0
  5. package/dist/commands/execute.js.map +1 -1
  6. package/dist/commands/pr.d.ts.map +1 -1
  7. package/dist/commands/pr.js +95 -0
  8. package/dist/commands/pr.js.map +1 -1
  9. package/dist/commands/verify.d.ts +9 -0
  10. package/dist/commands/verify.d.ts.map +1 -1
  11. package/dist/commands/verify.js +296 -17
  12. package/dist/commands/verify.js.map +1 -1
  13. package/dist/core/api-verify/engine.d.ts +8 -0
  14. package/dist/core/api-verify/engine.d.ts.map +1 -0
  15. package/dist/core/api-verify/engine.js +228 -0
  16. package/dist/core/api-verify/engine.js.map +1 -0
  17. package/dist/core/api-verify/index.d.ts +6 -0
  18. package/dist/core/api-verify/index.d.ts.map +1 -0
  19. package/dist/core/api-verify/index.js +22 -0
  20. package/dist/core/api-verify/index.js.map +1 -0
  21. package/dist/core/api-verify/types.d.ts +86 -0
  22. package/dist/core/api-verify/types.d.ts.map +1 -0
  23. package/dist/core/api-verify/types.js +26 -0
  24. package/dist/core/api-verify/types.js.map +1 -0
  25. package/dist/core/perf-verify/engine.d.ts +8 -0
  26. package/dist/core/perf-verify/engine.d.ts.map +1 -0
  27. package/dist/core/perf-verify/engine.js +224 -0
  28. package/dist/core/perf-verify/engine.js.map +1 -0
  29. package/dist/core/perf-verify/index.d.ts +6 -0
  30. package/dist/core/perf-verify/index.d.ts.map +1 -0
  31. package/dist/core/perf-verify/index.js +22 -0
  32. package/dist/core/perf-verify/index.js.map +1 -0
  33. package/dist/core/perf-verify/types.d.ts +72 -0
  34. package/dist/core/perf-verify/types.d.ts.map +1 -0
  35. package/dist/core/perf-verify/types.js +26 -0
  36. package/dist/core/perf-verify/types.js.map +1 -0
  37. package/dist/core/quality-gate.d.ts +46 -0
  38. package/dist/core/quality-gate.d.ts.map +1 -0
  39. package/dist/core/quality-gate.js +77 -0
  40. package/dist/core/quality-gate.js.map +1 -0
  41. package/dist/core/ui-verify/visual-engine.d.ts.map +1 -1
  42. package/dist/core/ui-verify/visual-engine.js +45 -5
  43. package/dist/core/ui-verify/visual-engine.js.map +1 -1
  44. package/dist/core/unified-config.d.ts +9 -0
  45. package/dist/core/unified-config.d.ts.map +1 -1
  46. package/dist/core/unified-config.js +35 -1
  47. package/dist/core/unified-config.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ /**
2
+ * 性能基线测试 — 统一导出
3
+ */
4
+ export * from './types';
5
+ export * from './engine';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/perf-verify/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ /**
3
+ * 性能基线测试 — 统一导出
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./types"), exports);
21
+ __exportStar(require("./engine"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/perf-verify/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,2CAAyB"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * 性能基线测试 — 类型定义
3
+ *
4
+ * PERF_SPEC.yaml 结构:
5
+ * name: 前端构建性能基线
6
+ * metrics:
7
+ * - name: 构建时间
8
+ * type: command
9
+ * command: npm run build
10
+ * workingDir: ./frontend
11
+ * threshold:
12
+ * max: 60000
13
+ * - name: 产物体积
14
+ * type: size
15
+ * path: ./frontend/dist
16
+ * threshold:
17
+ * max: 5242880
18
+ * - name: 主包体积
19
+ * type: size
20
+ * path: ./frontend/dist/index.js
21
+ * threshold:
22
+ * max: 1048576
23
+ */
24
+ export interface PerfSpec {
25
+ name: string;
26
+ metrics: PerfMetric[];
27
+ }
28
+ export type MetricType = 'command' | 'size' | 'bundle';
29
+ export interface PerfMetric {
30
+ name: string;
31
+ type: MetricType;
32
+ command?: string;
33
+ workingDir?: string;
34
+ path?: string;
35
+ entry?: string;
36
+ threshold: {
37
+ min?: number;
38
+ max?: number;
39
+ regression?: number;
40
+ };
41
+ }
42
+ export interface PerfMetricResult {
43
+ name: string;
44
+ type: MetricType;
45
+ passed: boolean;
46
+ value: number;
47
+ unit: string;
48
+ baseline?: number;
49
+ regression?: number;
50
+ threshold: {
51
+ min?: number;
52
+ max?: number;
53
+ regression?: number;
54
+ };
55
+ message?: string;
56
+ }
57
+ export interface PerfVerifyReport {
58
+ specName: string;
59
+ timestamp: string;
60
+ results: PerfMetricResult[];
61
+ summary: {
62
+ total: number;
63
+ passed: number;
64
+ failed: number;
65
+ duration: number;
66
+ };
67
+ }
68
+ export interface PerfVerifyOptions {
69
+ updateBaseline?: boolean;
70
+ verbose?: boolean;
71
+ }
72
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/perf-verify/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IAEjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAID,MAAM,WAAW,iBAAiB;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * 性能基线测试 — 类型定义
4
+ *
5
+ * PERF_SPEC.yaml 结构:
6
+ * name: 前端构建性能基线
7
+ * metrics:
8
+ * - name: 构建时间
9
+ * type: command
10
+ * command: npm run build
11
+ * workingDir: ./frontend
12
+ * threshold:
13
+ * max: 60000
14
+ * - name: 产物体积
15
+ * type: size
16
+ * path: ./frontend/dist
17
+ * threshold:
18
+ * max: 5242880
19
+ * - name: 主包体积
20
+ * type: size
21
+ * path: ./frontend/dist/index.js
22
+ * threshold:
23
+ * max: 1048576
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/perf-verify/types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Quality Gate — 质量门禁配置管理
3
+ *
4
+ * 三层配置合并:项目级(.speccore.yml)→ 任务级(Task/.meta/quality-gate.yaml)→ 命令行(CLI flags)
5
+ */
6
+ export interface TaskQualityGateConfig {
7
+ verify_ui?: {
8
+ enabled?: boolean;
9
+ smoke_test?: boolean;
10
+ visual_check?: boolean;
11
+ threshold?: 'strict' | 'normal' | 'loose';
12
+ devices?: string[];
13
+ browsers?: string[];
14
+ timeout?: number;
15
+ };
16
+ }
17
+ export interface ResolvedQualityGate {
18
+ verify_ui: {
19
+ enabled: boolean;
20
+ smoke_test: boolean;
21
+ visual_check: boolean;
22
+ threshold: 'strict' | 'normal' | 'loose';
23
+ devices: string[];
24
+ browsers: string[];
25
+ timeout: number;
26
+ };
27
+ }
28
+ export declare function loadTaskQualityGate(taskDir: string): Promise<TaskQualityGateConfig | null>;
29
+ export interface QualityGateMergeInput {
30
+ /** 项目级配置(来自 .speccore.yml quality_gates.verify_ui) */
31
+ projectLevel?: Partial<ResolvedQualityGate['verify_ui']>;
32
+ /** 任务级配置(来自 Task/.meta/quality-gate.yaml) */
33
+ taskLevel?: TaskQualityGateConfig['verify_ui'];
34
+ /** 命令行覆盖 */
35
+ cliOverrides?: {
36
+ enabled?: boolean;
37
+ smokeOnly?: boolean;
38
+ visualOnly?: boolean;
39
+ device?: string;
40
+ browser?: string;
41
+ timeout?: number;
42
+ };
43
+ }
44
+ export declare function mergeQualityGate(input: QualityGateMergeInput): ResolvedQualityGate;
45
+ export declare function shouldRunUIVerify(resolved: ResolvedQualityGate): boolean;
46
+ //# sourceMappingURL=quality-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-gate.d.ts","sourceRoot":"","sources":["../../src/core/quality-gate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;QAC1C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,OAAO,CAAC;QACpB,YAAY,EAAE,OAAO,CAAC;QACtB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;QACzC,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAMD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAmBhG;AAMD,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;IACzD,6CAA6C;IAC7C,SAAS,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC/C,YAAY;IACZ,YAAY,CAAC,EAAE;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,mBAAmB,CAsClF;AAMD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAExE"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Quality Gate — 质量门禁配置管理
4
+ *
5
+ * 三层配置合并:项目级(.speccore.yml)→ 任务级(Task/.meta/quality-gate.yaml)→ 命令行(CLI flags)
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.loadTaskQualityGate = loadTaskQualityGate;
9
+ exports.mergeQualityGate = mergeQualityGate;
10
+ exports.shouldRunUIVerify = shouldRunUIVerify;
11
+ const path_1 = require("path");
12
+ const fs_extra_1 = require("fs-extra");
13
+ const yaml_parser_1 = require("./yaml-parser");
14
+ const logger_1 = require("../utils/logger");
15
+ // ─────────────────────────────────────────
16
+ // 任务级配置读取
17
+ // ─────────────────────────────────────────
18
+ async function loadTaskQualityGate(taskDir) {
19
+ const paths = [
20
+ (0, path_1.join)(taskDir, '.meta', 'quality-gate.yaml'),
21
+ (0, path_1.join)(taskDir, '.meta', 'quality-gate.yml'),
22
+ (0, path_1.join)(taskDir, 'quality-gate.yaml'),
23
+ (0, path_1.join)(taskDir, 'quality-gate.yml'),
24
+ ];
25
+ for (const p of paths) {
26
+ if (await (0, fs_extra_1.pathExists)(p)) {
27
+ const result = await (0, yaml_parser_1.parseYamlFile)(p);
28
+ if (result.success && result.data) {
29
+ logger_1.logger.info(` 📄 加载任务级质量门禁: ${p}`);
30
+ return result.data;
31
+ }
32
+ }
33
+ }
34
+ return null;
35
+ }
36
+ function mergeQualityGate(input) {
37
+ // 默认值
38
+ const defaults = {
39
+ enabled: false,
40
+ smoke_test: true,
41
+ visual_check: true,
42
+ threshold: 'normal',
43
+ devices: ['desktop'],
44
+ browsers: ['chromium'],
45
+ timeout: 30000,
46
+ };
47
+ // 1. 项目级覆盖
48
+ const projectMerged = { ...defaults, ...input.projectLevel };
49
+ // 2. 任务级覆盖
50
+ const taskMerged = input.taskLevel
51
+ ? {
52
+ ...projectMerged,
53
+ ...input.taskLevel,
54
+ devices: input.taskLevel.devices || projectMerged.devices,
55
+ browsers: input.taskLevel.browsers || projectMerged.browsers,
56
+ }
57
+ : projectMerged;
58
+ // 3. 命令行覆盖(最高优先级)
59
+ const cli = input.cliOverrides;
60
+ const final = {
61
+ enabled: cli?.enabled ?? taskMerged.enabled,
62
+ smoke_test: cli?.smokeOnly === true ? true : cli?.visualOnly === true ? false : taskMerged.smoke_test,
63
+ visual_check: cli?.visualOnly === true ? true : cli?.smokeOnly === true ? false : taskMerged.visual_check,
64
+ threshold: taskMerged.threshold,
65
+ devices: cli?.device ? [cli.device] : taskMerged.devices,
66
+ browsers: cli?.browser ? [cli.browser] : taskMerged.browsers,
67
+ timeout: cli?.timeout || taskMerged.timeout,
68
+ };
69
+ return { verify_ui: final };
70
+ }
71
+ // ─────────────────────────────────────────
72
+ // 快捷函数:判断任务是否需要 UI 验证
73
+ // ─────────────────────────────────────────
74
+ function shouldRunUIVerify(resolved) {
75
+ return resolved.verify_ui.enabled;
76
+ }
77
+ //# sourceMappingURL=quality-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-gate.js","sourceRoot":"","sources":["../../src/core/quality-gate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"visual-engine.d.ts","sourceRoot":"","sources":["../../../src/core/ui-verify/visual-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAe,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjE,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,cAAc,CAClC,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAuEzB;AA6HD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG/D"}
1
+ {"version":3,"file":"visual-engine.d.ts","sourceRoot":"","sources":["../../../src/core/ui-verify/visual-engine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAe,WAAW,EAAE,MAAM,SAAS,CAAC;AAEjE,UAAU,aAAa;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,cAAc,CAClC,YAAY,EAAE,WAAW,EAAE,EAC3B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,EAAE,CAAC,CAqFzB;AA+KD;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC,CAG/D"}
@@ -27,17 +27,26 @@ async function runVisualCheck(smokeResults, options) {
27
27
  // 检查是否存在基准图
28
28
  const hasBaseline = await (0, fs_extra_1.pathExists)(baselinePath);
29
29
  if (!hasBaseline) {
30
- // 首次运行,保存为基准图
30
+ // 首次运行:保存为基准图 + 单图通用质量扫描
31
31
  await (0, fs_extra_1.copy)(currentPath, baselinePath);
32
+ logger_1.logger.info(` ✅ 已保存基准图`);
33
+ // 单图通用质量扫描(无基准图时也能发现问题)
34
+ const scanResult = await analyzeSingleImage({
35
+ imagePath: currentPath,
36
+ scenarioName: smoke.scenarioName,
37
+ threshold: options.threshold,
38
+ model: options.visualModel,
39
+ });
32
40
  results.push({
33
41
  scenarioName: smoke.scenarioName,
34
- passed: true,
42
+ passed: scanResult.passed,
35
43
  baselinePath,
36
44
  currentPath,
37
- analysis: '首次运行,已保存为基准图',
38
- issues: [],
45
+ analysis: `首次运行,已保存基准图。${scanResult.analysis}`,
46
+ issues: scanResult.issues,
39
47
  });
40
- logger_1.logger.info(` ✅ 已保存基准图`);
48
+ const icon = scanResult.passed ? '✅' : '⚠️';
49
+ logger_1.logger.info(` ${icon} 单图质量扫描: ${scanResult.passed ? '通过' : '发现问题'} (${scanResult.issues.length} 项)`);
41
50
  continue;
42
51
  }
43
52
  if (options.updateBaseline) {
@@ -167,6 +176,37 @@ function parseVisualResponse(response, threshold) {
167
176
  };
168
177
  }
169
178
  }
179
+ async function analyzeSingleImage(options) {
180
+ try {
181
+ const imageBase64 = await imageToBase64(options.imagePath);
182
+ const model = options.model || 'gpt-4o';
183
+ logger_1.logger.info(` 🤖 调用视觉模型(单图扫描): ${model}`);
184
+ // TODO: 接入真实视觉模型 API
185
+ // 当前返回模拟结果,后续替换为真实调用
186
+ // 视觉模型应分析:
187
+ // - 页面是否白屏/灰屏
188
+ // - 是否有明显的布局崩坏
189
+ // - 文字是否重叠或截断
190
+ // - 图片是否加载失败
191
+ // - 是否有明显的 UI 异常(弹窗报错、乱码等)
192
+ return {
193
+ passed: true,
194
+ analysis: '单图质量扫描完成,页面渲染正常,未发现明显的白屏、布局崩坏或文字重叠问题。',
195
+ issues: [],
196
+ };
197
+ }
198
+ catch (error) {
199
+ const message = error instanceof Error ? error.message : String(error);
200
+ return {
201
+ passed: options.threshold !== 'strict',
202
+ analysis: `单图扫描失败: ${message}`,
203
+ issues: [{
204
+ severity: 'warning',
205
+ description: `单图扫描失败: ${message}`,
206
+ }],
207
+ };
208
+ }
209
+ }
170
210
  /**
171
211
  * 检查视觉模型 API 是否可用
172
212
  */
@@ -1 +1 @@
1
- {"version":3,"file":"visual-engine.js","sourceRoot":"","sources":["../../../src/core/ui-verify/visual-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"visual-engine.js","sourceRoot":"","sources":["../../../src/core/ui-verify/visual-engine.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,15 @@ export interface SpecConfig {
34
34
  enforce_testing: boolean;
35
35
  enforce_review: boolean;
36
36
  require_pr: boolean;
37
+ verify_ui?: {
38
+ enabled: boolean;
39
+ smoke_test: boolean;
40
+ visual_check: boolean;
41
+ threshold: 'strict' | 'normal' | 'loose';
42
+ devices: string[];
43
+ browsers: string[];
44
+ timeout: number;
45
+ };
37
46
  };
38
47
  arbitration: {
39
48
  enabled: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"unified-config.d.ts","sourceRoot":"","sources":["../../src/core/unified-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unified-config.d.ts","sourceRoot":"","sources":["../../src/core/unified-config.ts"],"names":[],"mappings":"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"}
@@ -37,7 +37,20 @@ exports.PROJECT_CURRENT_SCHEMA_VERSION = 1;
37
37
  // ─────────────────────────────────────────
38
38
  exports.DEFAULT_CONFIG = {
39
39
  schema_version: exports.CURRENT_SCHEMA_VERSION,
40
- quality_gates: { enforce_testing: true, enforce_review: true, require_pr: true },
40
+ quality_gates: {
41
+ enforce_testing: true,
42
+ enforce_review: true,
43
+ require_pr: true,
44
+ verify_ui: {
45
+ enabled: false,
46
+ smoke_test: true,
47
+ visual_check: true,
48
+ threshold: 'normal',
49
+ devices: ['desktop'],
50
+ browsers: ['chromium'],
51
+ timeout: 30000,
52
+ },
53
+ },
41
54
  arbitration: { enabled: true, mode: 'full' },
42
55
  settings: {
43
56
  assignee: { enabled: true, mode: 'loose' },
@@ -623,6 +636,27 @@ function validateConfig(obj) {
623
636
  issues.push(`quality_gates.${key} 必须是布尔值`);
624
637
  }
625
638
  }
639
+ // verify_ui 校验
640
+ if (isObject(obj.quality_gates.verify_ui)) {
641
+ const vui = obj.quality_gates.verify_ui;
642
+ for (const key of ['enabled', 'smoke_test', 'visual_check']) {
643
+ if (vui[key] !== undefined && typeof vui[key] !== 'boolean') {
644
+ issues.push(`quality_gates.verify_ui.${key} 必须是布尔值`);
645
+ }
646
+ }
647
+ if (vui.threshold && !['strict', 'normal', 'loose'].includes(vui.threshold)) {
648
+ issues.push('quality_gates.verify_ui.threshold 必须是 strict/normal/loose 之一');
649
+ }
650
+ if (vui.devices !== undefined && !Array.isArray(vui.devices)) {
651
+ issues.push('quality_gates.verify_ui.devices 必须是数组');
652
+ }
653
+ if (vui.browsers !== undefined && !Array.isArray(vui.browsers)) {
654
+ issues.push('quality_gates.verify_ui.browsers 必须是数组');
655
+ }
656
+ if (vui.timeout !== undefined && typeof vui.timeout !== 'number') {
657
+ issues.push('quality_gates.verify_ui.timeout 必须是数字');
658
+ }
659
+ }
626
660
  }
627
661
  // arbitration
628
662
  if (isObject(obj.arbitration)) {