@be-link/smart-test 1.0.1-beta.0 → 1.0.1-beta.2

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.
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Smart Test 配置结构
3
+ */
4
+ export interface SmartTestConfig {
5
+ /**
6
+ * 版本号
7
+ */
8
+ version?: string;
9
+ /**
10
+ * AI 配置
11
+ */
12
+ ai?: {
13
+ /**
14
+ * AI 模型
15
+ */
16
+ model?: string;
17
+ /**
18
+ * API Key
19
+ */
20
+ apiKey?: string;
21
+ /**
22
+ * API Base URL
23
+ */
24
+ baseURL?: string;
25
+ /**
26
+ * 超时时间(毫秒)
27
+ */
28
+ timeout?: number;
29
+ };
30
+ /**
31
+ * 输出配置
32
+ */
33
+ output?: {
34
+ /**
35
+ * 测试文件目录
36
+ */
37
+ testsDir?: string;
38
+ /**
39
+ * Helpers 目录
40
+ */
41
+ helpersDir?: string;
42
+ /**
43
+ * 文件命名风格
44
+ */
45
+ naming?: 'camelCase' | 'kebab-case' | 'snake_case';
46
+ };
47
+ /**
48
+ * 模板配置
49
+ */
50
+ templates?: {
51
+ /**
52
+ * Mock 模板
53
+ */
54
+ mock?: string;
55
+ /**
56
+ * 测试模板
57
+ */
58
+ test?: string;
59
+ };
60
+ /**
61
+ * Playwright 配置
62
+ */
63
+ playwright?: {
64
+ /**
65
+ * Base URL
66
+ */
67
+ baseURL?: string;
68
+ /**
69
+ * 视口大小
70
+ */
71
+ viewport?: {
72
+ width: number;
73
+ height: number;
74
+ };
75
+ /**
76
+ * 浏览器类型
77
+ */
78
+ browser?: 'chromium' | 'firefox' | 'webkit';
79
+ };
80
+ }
81
+ /**
82
+ * 默认配置
83
+ */
84
+ export declare const DEFAULT_CONFIG: SmartTestConfig;
85
+ //# sourceMappingURL=config-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../../src/config/config-schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,EAAE,CAAC,EAAE;QACH;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;OAEG;IACH,MAAM,CAAC,EAAE;QACP;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB;;WAEG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;QAEpB;;WAEG;QACH,MAAM,CAAC,EAAE,WAAW,GAAG,YAAY,GAAG,YAAY,CAAC;KACpD,CAAC;IAEF;;OAEG;IACH,SAAS,CAAC,EAAE;QACV;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IAEF;;OAEG;IACH,UAAU,CAAC,EAAE;QACX;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,QAAQ,CAAC,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;QAEF;;WAEG;QACH,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;KAC7C,CAAC;CACH;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,eAwB5B,CAAC"}
@@ -16,7 +16,6 @@ import type { AiCheckOptions, AiCheckResult } from './types';
16
16
  * const result = await aiReviewScreenshot(page, {
17
17
  * expected: '页面应该显示优惠券列表',
18
18
  * model: 'gpt-4-vision-preview',
19
- * saveScreenshots: false,
20
19
  * });
21
20
  *
22
21
  * // 处理结果
@@ -1 +1 @@
1
- {"version":3,"file":"ai-assistant.d.ts","sourceRoot":"","sources":["../../src/core/ai-assistant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAkB,MAAM,SAAS,CAAC;AAI7E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA2E7G"}
1
+ {"version":3,"file":"ai-assistant.d.ts","sourceRoot":"","sources":["../../src/core/ai-assistant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAkB,MAAM,SAAS,CAAC;AAI7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAuE7G"}
@@ -11,7 +11,6 @@ import type { AiVisionConfig } from './types';
11
11
  * configure({
12
12
  * apiKey: process.env.AI_API_KEY,
13
13
  * model: 'qwen3-vl-plus',
14
- * screenshotDir: './screenshots',
15
14
  * });
16
15
  * ```
17
16
  */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAmB9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAK/D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAK/F"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAiB9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI,CAK/D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC,CAEpD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,WAAW,GAAE,OAAO,CAAC,cAAc,CAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAK/F"}
@@ -16,16 +16,6 @@ export interface AiVisionConfig {
16
16
  * @default 'qwen3-vl-plus'
17
17
  */
18
18
  model?: string;
19
- /**
20
- * 截图保存目录
21
- * @default './test-results/ai-screenshots'
22
- */
23
- screenshotDir?: string;
24
- /**
25
- * 是否保存截图到文件
26
- * @default true
27
- */
28
- saveScreenshots?: boolean;
29
19
  /**
30
20
  * AI 请求超时时间(毫秒)
31
21
  * @default 30000
@@ -74,11 +64,6 @@ export interface AiCheckOptions extends Partial<AiVisionConfig> {
74
64
  * @default true
75
65
  */
76
66
  fullPage?: boolean;
77
- /**
78
- * 自定义截图文件名前缀
79
- * @default 'ai-review'
80
- */
81
- screenshotPrefix?: string;
82
67
  }
83
68
  /**
84
69
  * AI 响应的 JSON 格式
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,EAAE,EAAE,OAAO,CAAC;IAEZ;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,OAAO,CAAC,cAAc,CAAC;IAC7D;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,EAAE,EAAE,OAAO,CAAC;IAEZ;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,OAAO,CAAC,cAAc,CAAC;IAC7D;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB"}
package/dist/index.esm.js CHANGED
@@ -1,6 +1,4 @@
1
1
  import { OpenAI } from 'openai';
2
- import * as fs from 'fs';
3
- import * as path from 'path';
4
2
 
5
3
  /**
6
4
  * 默认配置
@@ -9,8 +7,6 @@ const DEFAULT_CONFIG = {
9
7
  apiKey: '',
10
8
  baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
11
9
  model: 'qwen3-vl-plus',
12
- screenshotDir: './test-results/ai-screenshots',
13
- saveScreenshots: true,
14
10
  timeout: 30000,
15
11
  };
16
12
  /**
@@ -29,7 +25,6 @@ let globalConfig = { ...DEFAULT_CONFIG };
29
25
  * configure({
30
26
  * apiKey: process.env.AI_API_KEY,
31
27
  * model: 'qwen3-vl-plus',
32
- * screenshotDir: './screenshots',
33
28
  * });
34
29
  * ```
35
30
  */
@@ -66,25 +61,6 @@ function mergeConfig(localConfig = {}) {
66
61
  };
67
62
  }
68
63
 
69
- /**
70
- * 保存截图到文件
71
- *
72
- * @param screenshot - 截图 Buffer
73
- * @param dir - 保存目录
74
- * @param prefix - 文件名前缀
75
- * @returns 截图文件的绝对路径
76
- */
77
- async function saveScreenshot(screenshot, dir, prefix = 'ai-review') {
78
- // 确保目录存在
79
- await fs.promises.mkdir(dir, { recursive: true });
80
- // 生成文件名(使用时间戳避免冲突)
81
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
82
- const filename = `${prefix}-${timestamp}.png`;
83
- const screenshotPath = path.resolve(dir, filename);
84
- // 写入文件
85
- await fs.promises.writeFile(screenshotPath, screenshot);
86
- return screenshotPath;
87
- }
88
64
  /**
89
65
  * 将截图转换为 base64 编码
90
66
  *
@@ -111,7 +87,6 @@ function screenshotToBase64(screenshot) {
111
87
  * const result = await aiReviewScreenshot(page, {
112
88
  * expected: '页面应该显示优惠券列表',
113
89
  * model: 'gpt-4-vision-preview',
114
- * saveScreenshots: false,
115
90
  * });
116
91
  *
117
92
  * // 处理结果
@@ -141,10 +116,6 @@ async function aiReviewScreenshot(page, options) {
141
116
  });
142
117
  // 保存截图(如果启用)
143
118
  let screenshotPath;
144
- if (config.saveScreenshots) {
145
- screenshotPath = await saveScreenshot(screenshot, config.screenshotDir, opts.screenshotPrefix || 'ai-review');
146
- console.log(`[smart-test] 截图已保存: ${screenshotPath}`);
147
- }
148
119
  // 构建 AI 请求
149
120
  const prompt = buildPrompt(opts.expected);
150
121
  const openai = new OpenAI({
package/dist/index.js CHANGED
@@ -1,28 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var openai = require('openai');
4
- var fs = require('fs');
5
- var path = require('path');
6
-
7
- function _interopNamespaceDefault(e) {
8
- var n = Object.create(null);
9
- if (e) {
10
- Object.keys(e).forEach(function (k) {
11
- if (k !== 'default') {
12
- var d = Object.getOwnPropertyDescriptor(e, k);
13
- Object.defineProperty(n, k, d.get ? d : {
14
- enumerable: true,
15
- get: function () { return e[k]; }
16
- });
17
- }
18
- });
19
- }
20
- n.default = e;
21
- return Object.freeze(n);
22
- }
23
-
24
- var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
25
- var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
26
4
 
27
5
  /**
28
6
  * 默认配置
@@ -31,8 +9,6 @@ const DEFAULT_CONFIG = {
31
9
  apiKey: '',
32
10
  baseURL: 'https://dashscope.aliyuncs.com/compatible-mode/v1',
33
11
  model: 'qwen3-vl-plus',
34
- screenshotDir: './test-results/ai-screenshots',
35
- saveScreenshots: true,
36
12
  timeout: 30000,
37
13
  };
38
14
  /**
@@ -51,7 +27,6 @@ let globalConfig = { ...DEFAULT_CONFIG };
51
27
  * configure({
52
28
  * apiKey: process.env.AI_API_KEY,
53
29
  * model: 'qwen3-vl-plus',
54
- * screenshotDir: './screenshots',
55
30
  * });
56
31
  * ```
57
32
  */
@@ -88,25 +63,6 @@ function mergeConfig(localConfig = {}) {
88
63
  };
89
64
  }
90
65
 
91
- /**
92
- * 保存截图到文件
93
- *
94
- * @param screenshot - 截图 Buffer
95
- * @param dir - 保存目录
96
- * @param prefix - 文件名前缀
97
- * @returns 截图文件的绝对路径
98
- */
99
- async function saveScreenshot(screenshot, dir, prefix = 'ai-review') {
100
- // 确保目录存在
101
- await fs__namespace.promises.mkdir(dir, { recursive: true });
102
- // 生成文件名(使用时间戳避免冲突)
103
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
104
- const filename = `${prefix}-${timestamp}.png`;
105
- const screenshotPath = path__namespace.resolve(dir, filename);
106
- // 写入文件
107
- await fs__namespace.promises.writeFile(screenshotPath, screenshot);
108
- return screenshotPath;
109
- }
110
66
  /**
111
67
  * 将截图转换为 base64 编码
112
68
  *
@@ -133,7 +89,6 @@ function screenshotToBase64(screenshot) {
133
89
  * const result = await aiReviewScreenshot(page, {
134
90
  * expected: '页面应该显示优惠券列表',
135
91
  * model: 'gpt-4-vision-preview',
136
- * saveScreenshots: false,
137
92
  * });
138
93
  *
139
94
  * // 处理结果
@@ -163,10 +118,6 @@ async function aiReviewScreenshot(page, options) {
163
118
  });
164
119
  // 保存截图(如果启用)
165
120
  let screenshotPath;
166
- if (config.saveScreenshots) {
167
- screenshotPath = await saveScreenshot(screenshot, config.screenshotDir, opts.screenshotPrefix || 'ai-review');
168
- console.log(`[smart-test] 截图已保存: ${screenshotPath}`);
169
- }
170
121
  // 构建 AI 请求
171
122
  const prompt = buildPrompt(opts.expected);
172
123
  const openai$1 = new openai.OpenAI({
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 自定义错误类型
3
+ */
4
+ export declare class SmartTestError extends Error {
5
+ code?: string | undefined;
6
+ details?: any | undefined;
7
+ constructor(message: string, code?: string | undefined, details?: any | undefined);
8
+ }
9
+ /**
10
+ * 配置错误
11
+ */
12
+ export declare class ConfigError extends SmartTestError {
13
+ constructor(message: string, details?: any);
14
+ }
15
+ /**
16
+ * 网络错误
17
+ */
18
+ export declare class NetworkError extends SmartTestError {
19
+ constructor(message: string, details?: any);
20
+ }
21
+ /**
22
+ * AI 服务错误
23
+ */
24
+ export declare class AIServiceError extends SmartTestError {
25
+ constructor(message: string, details?: any);
26
+ }
27
+ /**
28
+ * 文件系统错误
29
+ */
30
+ export declare class FileSystemError extends SmartTestError {
31
+ constructor(message: string, details?: any);
32
+ }
33
+ /**
34
+ * 全局错误处理器
35
+ */
36
+ export declare function handleError(error: Error | SmartTestError): void;
37
+ /**
38
+ * 包装异步函数,自动处理错误
39
+ */
40
+ export declare function withErrorHandling<T extends (...args: any[]) => Promise<any>>(fn: T): T;
41
+ //# sourceMappingURL=error-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;IAG9B,IAAI,CAAC,EAAE,MAAM;IACb,OAAO,CAAC,EAAE,GAAG;gBAFpB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,OAAO,CAAC,EAAE,GAAG,YAAA;CAKvB;AAED;;GAEG;AACH,qBAAa,WAAY,SAAQ,cAAc;gBACjC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,cAAc;gBAClC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,cAAc;gBACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG;CAI3C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,cAAc,GAAG,IAAI,CA4B/D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAQtF"}
@@ -0,0 +1,88 @@
1
+ import { Ora } from 'ora';
2
+ /**
3
+ * 日志级别
4
+ */
5
+ export declare enum LogLevel {
6
+ DEBUG = 0,
7
+ INFO = 1,
8
+ WARN = 2,
9
+ ERROR = 3
10
+ }
11
+ /**
12
+ * 日志工具类
13
+ */
14
+ declare class Logger {
15
+ private level;
16
+ private spinner;
17
+ /**
18
+ * 设置日志级别
19
+ */
20
+ setLevel(level: LogLevel): void;
21
+ /**
22
+ * 调试日志
23
+ */
24
+ debug(message: string, ...args: any[]): void;
25
+ /**
26
+ * 信息日志
27
+ */
28
+ info(message: string, ...args: any[]): void;
29
+ /**
30
+ * 成功日志
31
+ */
32
+ success(message: string, ...args: any[]): void;
33
+ /**
34
+ * 警告日志
35
+ */
36
+ warn(message: string, ...args: any[]): void;
37
+ /**
38
+ * 错误日志
39
+ */
40
+ error(message: string, ...args: any[]): void;
41
+ /**
42
+ * 标题(带装饰)
43
+ */
44
+ title(message: string): void;
45
+ /**
46
+ * 步骤提示
47
+ */
48
+ step(current: number, total: number, message: string): void;
49
+ /**
50
+ * 提示用户输入
51
+ */
52
+ prompt(message: string): void;
53
+ /**
54
+ * AI 消息
55
+ */
56
+ ai(message: string): void;
57
+ /**
58
+ * 开始加载动画
59
+ */
60
+ startSpinner(message: string): Ora;
61
+ /**
62
+ * 更新加载动画文本
63
+ */
64
+ updateSpinner(message: string): void;
65
+ /**
66
+ * 停止加载动画(成功)
67
+ */
68
+ succeedSpinner(message?: string): void;
69
+ /**
70
+ * 停止加载动画(失败)
71
+ */
72
+ failSpinner(message?: string): void;
73
+ /**
74
+ * 停止加载动画
75
+ */
76
+ stopSpinner(): void;
77
+ /**
78
+ * 换行
79
+ */
80
+ newLine(): void;
81
+ /**
82
+ * 分隔线
83
+ */
84
+ divider(): void;
85
+ }
86
+ export declare const logger: Logger;
87
+ export {};
88
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE/B;;GAEG;AACH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED;;GAEG;AACH,cAAM,MAAM;IACV,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,OAAO,CAAoB;IAEnC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI/B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM5C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3C;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM9C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM5C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3D;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG;IAKlC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpC;;OAEG;IACH,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAOtC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAOnC;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -1,12 +1,3 @@
1
- /**
2
- * 保存截图到文件
3
- *
4
- * @param screenshot - 截图 Buffer
5
- * @param dir - 保存目录
6
- * @param prefix - 文件名前缀
7
- * @returns 截图文件的绝对路径
8
- */
9
- export declare function saveScreenshot(screenshot: Buffer, dir: string, prefix?: string): Promise<string>;
10
1
  /**
11
2
  * 将截图转换为 base64 编码
12
3
  *
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/utils/screenshot.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAanH;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D"}
1
+ {"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/utils/screenshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE7D"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@be-link/smart-test",
3
- "version": "1.0.1-beta.0",
3
+ "version": "1.0.1-beta.2",
4
+ "type": "module",
4
5
  "description": "AI-powered visual testing for Playwright - 基于 AI 视觉模型的 Playwright 测试工具",
5
6
  "homepage": "https://github.com/snowmountain-top/be-link",
6
7
  "author": "shian",
@@ -8,6 +9,9 @@
8
9
  "main": "dist/index.js",
9
10
  "module": "dist/index.esm.js",
10
11
  "types": "dist/index.d.ts",
12
+ "bin": {
13
+ "smart-test": "./bin/smart-test.js"
14
+ },
11
15
  "exports": {
12
16
  ".": {
13
17
  "types": "./dist/index.d.ts",
@@ -19,16 +23,27 @@
19
23
  },
20
24
  "files": [
21
25
  "dist",
26
+ "bin",
27
+ "templates",
22
28
  "README.md"
23
29
  ],
24
30
  "dependencies": {
25
- "openai": "^6.15.0"
31
+ "openai": "^6.15.0",
32
+ "commander": "^12.0.0",
33
+ "inquirer": "^9.2.0",
34
+ "chalk": "^5.3.0",
35
+ "ora": "^7.0.0",
36
+ "cosmiconfig": "^9.0.0",
37
+ "handlebars": "^4.7.8",
38
+ "prettier": "^3.0.0"
26
39
  },
27
40
  "peerDependencies": {
28
41
  "@playwright/test": "^1.40.0"
29
42
  },
30
43
  "devDependencies": {
31
- "@playwright/test": "^1.50.0"
44
+ "@playwright/test": "^1.50.0",
45
+ "@types/inquirer": "^9.0.0",
46
+ "@types/node": "^20.0.0"
32
47
  },
33
48
  "publishConfig": {
34
49
  "access": "public"