@be-link/smart-test 1.0.1-beta.13 → 1.0.1-beta.15

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.
@@ -506,13 +506,14 @@ async function buildTestCaseGenerationPrompt(options) {
506
506
  prompt += `
507
507
  要求:
508
508
  1. 使用 @playwright/test 框架
509
- 2. 在 beforeEach 中引入已生成的 API mock
510
- 3. 生成完整可运行的测试代码
511
- 4. 包含适当的 Playwright 断言和等待
512
- 5. 只返回代码,不要包含额外的解释文本
513
- 6. 使用代码块格式返回
514
- 7. 不要导入除 @playwright/test 之外的其他测试库
515
- 8. 如果有AI 视觉检查预期:添加一个新的case,调用aiReviewScreenshot,详情参考现有测试代码风格
509
+ 2. TS使用单引号,不要使用双引号
510
+ 3. 在 beforeEach 中引入已生成的 API mock
511
+ 4. 生成完整可运行的测试代码
512
+ 5. 包含适当的 Playwright 断言和等待
513
+ 6. 只返回代码,不要包含额外的解释文本
514
+ 7. 使用代码块格式返回
515
+ 8. 不要导入除 @playwright/test 之外的其他测试库
516
+ 9. 如果有AI 视觉检查预期:添加一个新的case,调用aiReviewScreenshot,详情参考现有测试代码风格
516
517
  `;
517
518
  // 自动拼接参考代码:优先使用配置文件,否则使用默认模板
518
519
  const referenceCode = getDefaultTestCaseReferenceCode(options);
@@ -553,7 +554,7 @@ Mock 数据描述:${description}
553
554
  5. **代码可读性**:route.fulfill 中只需要写 JSON.stringify(mockData),保持代码简洁清晰
554
555
  6. 设置正确的响应头(使用 jsonHeaders 常量)
555
556
  7. 数据应该符合常见的业务场景
556
- 8. **重要**:严格遵循提供的 TypeScript 类型定义,生成的数据必须完全符合类型结构
557
+ 8. **重要**:严格遵循提供的 TypeScript 类型定义,生成的数据必须完全符合类型结构, TS使用单引号,不要使用双引号
557
558
  9. 字段类型、必填/可选字段、嵌套结构等必须与类型定义一致
558
559
  10. 根据字段注释生成合理的测试数据值
559
560
  11. 只返回代码,不要包含额外的解释文本
@@ -652,19 +653,17 @@ async function aiGenerateTestCase(options) {
652
653
  // 自动加载配置文件
653
654
  await ensureConfigLoaded();
654
655
  const config = mergeConfig(options.aiConfig);
656
+ console.log('🤖 AI 正在生成代码...\n');
655
657
  const result = await callAi({
656
658
  taskType: 'codeModel',
657
659
  config,
658
- messages: [
659
- {
660
- role: 'user',
661
- content: await buildTestCaseGenerationPrompt(options),
662
- },
663
- ],
660
+ messages: [{ role: 'user', content: await buildTestCaseGenerationPrompt(options) }],
664
661
  });
665
662
  if (result.skipped) {
663
+ console.log(`🤖 AI 测试用例生成跳过: ${result.reason}\n`);
666
664
  return { ok: false, skipped: true, reason: `AI 测试用例生成跳过: ${result.reason}` };
667
665
  }
666
+ console.log('🤖 AI 测试用例生成成功\n');
668
667
  return {
669
668
  ok: true,
670
669
  code: extractCodeFromResponse(result.content),
@@ -681,19 +680,18 @@ async function aiGenerateMock(options) {
681
680
  // 自动加载配置文件
682
681
  await ensureConfigLoaded();
683
682
  const config = mergeConfig(options.aiConfig);
683
+ console.log('🤖 AI 正在生成代码...\n');
684
+ console.log(`🤖 AI 配置: ${JSON.stringify(config, null, 2)}\n`);
684
685
  const result = await callAi({
685
686
  taskType: 'codeModel',
686
687
  config,
687
- messages: [
688
- {
689
- role: 'user',
690
- content: await buildMockGenerationPrompt(options),
691
- },
692
- ],
688
+ messages: [{ role: 'user', content: await buildMockGenerationPrompt(options) }],
693
689
  });
694
690
  if (result.skipped) {
691
+ console.log(`🤖 AI Mock 数据生成跳过: ${result.reason}\n`);
695
692
  return { ok: false, skipped: true, reason: `AI Mock 数据生成跳过: ${result.reason}` };
696
693
  }
694
+ console.log(`🤖 AI Mock 数据生成成功\n`);
697
695
  return {
698
696
  ok: true,
699
697
  code: extractCodeFromResponse(result.content),
@@ -709,6 +707,7 @@ function extractCodeFromResponse(content) {
709
707
  * 格式化并写入文件
710
708
  */
711
709
  async function writeFormattedFile(targetPath, content, options = {}) {
710
+ console.log(`文件写入中...\n: ${targetPath}`);
712
711
  // 确保目录存在
713
712
  await promises.mkdir(path.dirname(targetPath), { recursive: true });
714
713
  let finalContent = content;
@@ -729,6 +728,7 @@ async function writeFormattedFile(targetPath, content, options = {}) {
729
728
  }
730
729
  }
731
730
  await promises.writeFile(targetPath, finalContent, 'utf-8');
731
+ console.log(`文件写入成功: ${targetPath}\n`);
732
732
  }
733
733
  /**
734
734
  * 生成文件头注释
@@ -810,11 +810,14 @@ async function generateTestCase(options) {
810
810
  * 执行 Mock 数据生成
811
811
  */
812
812
  async function executeGenerateMock(interactiveResult, apiKey, cwd) {
813
- console.log('\n🚀 开始生成 Mock 数据...');
813
+ console.log('\n🚀 开始生成 Mock 数据...\n');
814
814
  const mockParams = interactiveResult.mock; // 交互式模式保证了这些字段存在
815
815
  const typeDefinitions = mockParams.typeFile && mockParams.types
816
816
  ? await extractTypeDefinitions(path.resolve(cwd, mockParams.typeFile), mockParams.types)
817
817
  : undefined;
818
+ if (typeDefinitions && typeDefinitions.length > 0) {
819
+ console.log(`🔍 已提取 ${typeDefinitions.length} 个类型定义`);
820
+ }
818
821
  const mockResult = await generateMock({
819
822
  apiPath: mockParams.apiPath,
820
823
  description: mockParams.description,
@@ -838,7 +841,7 @@ async function executeGenerateMock(interactiveResult, apiKey, cwd) {
838
841
  * 执行测试用例生成
839
842
  */
840
843
  async function executeGenerateTestCase(interactiveResult, apiKey, cwd) {
841
- console.log('\n🚀 开始生成测试用例...');
844
+ console.log('\n🚀 开始生成测试用例...\n');
842
845
  const testcaseParams = interactiveResult.testcase; // 交互式模式保证了这些字段存在
843
846
  const testCaseResult = await generateTestCase({
844
847
  pageUrl: testcaseParams.pageUrl,
@@ -1 +1 @@
1
- {"version":3,"file":"generate-mock.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-mock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CA2Bf"}
1
+ {"version":3,"file":"generate-mock.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate-mock.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,iBAAiB,EAAE,iBAAiB,EACpC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
@@ -26,7 +26,7 @@ export default defineConfig({
26
26
  // 基础 URL
27
27
  baseURL: 'http://localhost:8080',
28
28
  // 测试追踪配置
29
- trace: 'on-first-retry',
29
+ trace: 'retain-on-failure',
30
30
  // 截图配置
31
31
  screenshot: 'only-on-failure',
32
32
  // 视频录制配置
@@ -1 +1 @@
1
- {"version":3,"file":"ai-assistant.d.ts","sourceRoot":"","sources":["../../src/core/ai-assistant.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAEb,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAG5B,MAAM,SAAS,CAAC;AAmGjB;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAqC7G;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0B9G;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0BtG"}
1
+ {"version":3,"file":"ai-assistant.d.ts","sourceRoot":"","sources":["../../src/core/ai-assistant.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EAEb,sBAAsB,EACtB,uBAAuB,EACvB,2BAA2B,EAG5B,MAAM,SAAS,CAAC;AAmGjB;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAqC7G;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAwB9G;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAyBtG"}
@@ -1 +1 @@
1
- {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAgFpF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiB1D;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CzG;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDjG"}
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAgFpF;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiB1D;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CzG;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDjG"}
@@ -233,13 +233,14 @@ async function buildTestCaseGenerationPrompt(options) {
233
233
  prompt += `
234
234
  要求:
235
235
  1. 使用 @playwright/test 框架
236
- 2. 在 beforeEach 中引入已生成的 API mock
237
- 3. 生成完整可运行的测试代码
238
- 4. 包含适当的 Playwright 断言和等待
239
- 5. 只返回代码,不要包含额外的解释文本
240
- 6. 使用代码块格式返回
241
- 7. 不要导入除 @playwright/test 之外的其他测试库
242
- 8. 如果有AI 视觉检查预期:添加一个新的case,调用aiReviewScreenshot,详情参考现有测试代码风格
236
+ 2. TS使用单引号,不要使用双引号
237
+ 3. 在 beforeEach 中引入已生成的 API mock
238
+ 4. 生成完整可运行的测试代码
239
+ 5. 包含适当的 Playwright 断言和等待
240
+ 6. 只返回代码,不要包含额外的解释文本
241
+ 7. 使用代码块格式返回
242
+ 8. 不要导入除 @playwright/test 之外的其他测试库
243
+ 9. 如果有AI 视觉检查预期:添加一个新的case,调用aiReviewScreenshot,详情参考现有测试代码风格
243
244
  `;
244
245
  // 自动拼接参考代码:优先使用配置文件,否则使用默认模板
245
246
  const referenceCode = getDefaultTestCaseReferenceCode(options);
@@ -280,7 +281,7 @@ Mock 数据描述:${description}
280
281
  5. **代码可读性**:route.fulfill 中只需要写 JSON.stringify(mockData),保持代码简洁清晰
281
282
  6. 设置正确的响应头(使用 jsonHeaders 常量)
282
283
  7. 数据应该符合常见的业务场景
283
- 8. **重要**:严格遵循提供的 TypeScript 类型定义,生成的数据必须完全符合类型结构
284
+ 8. **重要**:严格遵循提供的 TypeScript 类型定义,生成的数据必须完全符合类型结构, TS使用单引号,不要使用双引号
284
285
  9. 字段类型、必填/可选字段、嵌套结构等必须与类型定义一致
285
286
  10. 根据字段注释生成合理的测试数据值
286
287
  11. 只返回代码,不要包含额外的解释文本
@@ -456,19 +457,17 @@ async function aiGenerateTestCase(options) {
456
457
  // 自动加载配置文件
457
458
  await ensureConfigLoaded();
458
459
  const config = mergeConfig(options.aiConfig);
460
+ console.log('🤖 AI 正在生成代码...\n');
459
461
  const result = await callAi({
460
462
  taskType: 'codeModel',
461
463
  config,
462
- messages: [
463
- {
464
- role: 'user',
465
- content: await buildTestCaseGenerationPrompt(options),
466
- },
467
- ],
464
+ messages: [{ role: 'user', content: await buildTestCaseGenerationPrompt(options) }],
468
465
  });
469
466
  if (result.skipped) {
467
+ console.log(`🤖 AI 测试用例生成跳过: ${result.reason}\n`);
470
468
  return { ok: false, skipped: true, reason: `AI 测试用例生成跳过: ${result.reason}` };
471
469
  }
470
+ console.log('🤖 AI 测试用例生成成功\n');
472
471
  return {
473
472
  ok: true,
474
473
  code: extractCodeFromResponse(result.content),
@@ -485,19 +484,18 @@ async function aiGenerateMock(options) {
485
484
  // 自动加载配置文件
486
485
  await ensureConfigLoaded();
487
486
  const config = mergeConfig(options.aiConfig);
487
+ console.log('🤖 AI 正在生成代码...\n');
488
+ console.log(`🤖 AI 配置: ${JSON.stringify(config, null, 2)}\n`);
488
489
  const result = await callAi({
489
490
  taskType: 'codeModel',
490
491
  config,
491
- messages: [
492
- {
493
- role: 'user',
494
- content: await buildMockGenerationPrompt(options),
495
- },
496
- ],
492
+ messages: [{ role: 'user', content: await buildMockGenerationPrompt(options) }],
497
493
  });
498
494
  if (result.skipped) {
495
+ console.log(`🤖 AI Mock 数据生成跳过: ${result.reason}\n`);
499
496
  return { ok: false, skipped: true, reason: `AI Mock 数据生成跳过: ${result.reason}` };
500
497
  }
498
+ console.log(`🤖 AI Mock 数据生成成功\n`);
501
499
  return {
502
500
  ok: true,
503
501
  code: extractCodeFromResponse(result.content),
@@ -530,6 +528,7 @@ function extractCodeFromResponse(content) {
530
528
  * 格式化并写入文件
531
529
  */
532
530
  async function writeFormattedFile(targetPath, content, options = {}) {
531
+ console.log(`文件写入中...\n: ${targetPath}`);
533
532
  // 确保目录存在
534
533
  await mkdir(path.dirname(targetPath), { recursive: true });
535
534
  let finalContent = content;
@@ -550,6 +549,7 @@ async function writeFormattedFile(targetPath, content, options = {}) {
550
549
  }
551
550
  }
552
551
  await writeFile(targetPath, finalContent, 'utf-8');
552
+ console.log(`文件写入成功: ${targetPath}\n`);
553
553
  }
554
554
  /**
555
555
  * 生成文件头注释
package/dist/index.js CHANGED
@@ -254,13 +254,14 @@ async function buildTestCaseGenerationPrompt(options) {
254
254
  prompt += `
255
255
  要求:
256
256
  1. 使用 @playwright/test 框架
257
- 2. 在 beforeEach 中引入已生成的 API mock
258
- 3. 生成完整可运行的测试代码
259
- 4. 包含适当的 Playwright 断言和等待
260
- 5. 只返回代码,不要包含额外的解释文本
261
- 6. 使用代码块格式返回
262
- 7. 不要导入除 @playwright/test 之外的其他测试库
263
- 8. 如果有AI 视觉检查预期:添加一个新的case,调用aiReviewScreenshot,详情参考现有测试代码风格
257
+ 2. TS使用单引号,不要使用双引号
258
+ 3. 在 beforeEach 中引入已生成的 API mock
259
+ 4. 生成完整可运行的测试代码
260
+ 5. 包含适当的 Playwright 断言和等待
261
+ 6. 只返回代码,不要包含额外的解释文本
262
+ 7. 使用代码块格式返回
263
+ 8. 不要导入除 @playwright/test 之外的其他测试库
264
+ 9. 如果有AI 视觉检查预期:添加一个新的case,调用aiReviewScreenshot,详情参考现有测试代码风格
264
265
  `;
265
266
  // 自动拼接参考代码:优先使用配置文件,否则使用默认模板
266
267
  const referenceCode = getDefaultTestCaseReferenceCode(options);
@@ -301,7 +302,7 @@ Mock 数据描述:${description}
301
302
  5. **代码可读性**:route.fulfill 中只需要写 JSON.stringify(mockData),保持代码简洁清晰
302
303
  6. 设置正确的响应头(使用 jsonHeaders 常量)
303
304
  7. 数据应该符合常见的业务场景
304
- 8. **重要**:严格遵循提供的 TypeScript 类型定义,生成的数据必须完全符合类型结构
305
+ 8. **重要**:严格遵循提供的 TypeScript 类型定义,生成的数据必须完全符合类型结构, TS使用单引号,不要使用双引号
305
306
  9. 字段类型、必填/可选字段、嵌套结构等必须与类型定义一致
306
307
  10. 根据字段注释生成合理的测试数据值
307
308
  11. 只返回代码,不要包含额外的解释文本
@@ -477,19 +478,17 @@ async function aiGenerateTestCase(options) {
477
478
  // 自动加载配置文件
478
479
  await ensureConfigLoaded();
479
480
  const config = mergeConfig(options.aiConfig);
481
+ console.log('🤖 AI 正在生成代码...\n');
480
482
  const result = await callAi({
481
483
  taskType: 'codeModel',
482
484
  config,
483
- messages: [
484
- {
485
- role: 'user',
486
- content: await buildTestCaseGenerationPrompt(options),
487
- },
488
- ],
485
+ messages: [{ role: 'user', content: await buildTestCaseGenerationPrompt(options) }],
489
486
  });
490
487
  if (result.skipped) {
488
+ console.log(`🤖 AI 测试用例生成跳过: ${result.reason}\n`);
491
489
  return { ok: false, skipped: true, reason: `AI 测试用例生成跳过: ${result.reason}` };
492
490
  }
491
+ console.log('🤖 AI 测试用例生成成功\n');
493
492
  return {
494
493
  ok: true,
495
494
  code: extractCodeFromResponse(result.content),
@@ -506,19 +505,18 @@ async function aiGenerateMock(options) {
506
505
  // 自动加载配置文件
507
506
  await ensureConfigLoaded();
508
507
  const config = mergeConfig(options.aiConfig);
508
+ console.log('🤖 AI 正在生成代码...\n');
509
+ console.log(`🤖 AI 配置: ${JSON.stringify(config, null, 2)}\n`);
509
510
  const result = await callAi({
510
511
  taskType: 'codeModel',
511
512
  config,
512
- messages: [
513
- {
514
- role: 'user',
515
- content: await buildMockGenerationPrompt(options),
516
- },
517
- ],
513
+ messages: [{ role: 'user', content: await buildMockGenerationPrompt(options) }],
518
514
  });
519
515
  if (result.skipped) {
516
+ console.log(`🤖 AI Mock 数据生成跳过: ${result.reason}\n`);
520
517
  return { ok: false, skipped: true, reason: `AI Mock 数据生成跳过: ${result.reason}` };
521
518
  }
519
+ console.log(`🤖 AI Mock 数据生成成功\n`);
522
520
  return {
523
521
  ok: true,
524
522
  code: extractCodeFromResponse(result.content),
@@ -551,6 +549,7 @@ function extractCodeFromResponse(content) {
551
549
  * 格式化并写入文件
552
550
  */
553
551
  async function writeFormattedFile(targetPath, content, options = {}) {
552
+ console.log(`文件写入中...\n: ${targetPath}`);
554
553
  // 确保目录存在
555
554
  await promises.mkdir(path.dirname(targetPath), { recursive: true });
556
555
  let finalContent = content;
@@ -571,6 +570,7 @@ async function writeFormattedFile(targetPath, content, options = {}) {
571
570
  }
572
571
  }
573
572
  await promises.writeFile(targetPath, finalContent, 'utf-8');
573
+ console.log(`文件写入成功: ${targetPath}\n`);
574
574
  }
575
575
  /**
576
576
  * 生成文件头注释
@@ -1 +1 @@
1
- {"version":3,"file":"file-writer.d.ts","sourceRoot":"","sources":["../../src/utils/file-writer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
1
+ {"version":3,"file":"file-writer.d.ts","sourceRoot":"","sources":["../../src/utils/file-writer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@be-link/smart-test",
3
- "version": "1.0.1-beta.13",
3
+ "version": "1.0.1-beta.15",
4
4
  "description": "AI-powered visual testing for Playwright - 基于 AI 视觉模型的 Playwright 测试工具",
5
5
  "homepage": "https://github.com/snowmountain-top/be-link",
6
6
  "author": "shian",