@kkeve/suite 0.0.1 → 0.0.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.
Files changed (152) hide show
  1. package/README.md +53 -0
  2. package/dist/bin/keve.d.ts +13 -0
  3. package/dist/bin/keve.js +164 -0
  4. package/dist/commands/auth-update.d.ts +16 -0
  5. package/dist/commands/auth-update.js +88 -0
  6. package/dist/commands/clean.d.ts +10 -0
  7. package/dist/commands/clean.js +78 -0
  8. package/dist/commands/config.d.ts +17 -0
  9. package/dist/commands/config.js +99 -0
  10. package/dist/commands/init.d.ts +15 -0
  11. package/dist/commands/init.js +292 -0
  12. package/dist/commands/report.d.ts +12 -0
  13. package/dist/commands/report.js +159 -0
  14. package/dist/commands/run.d.ts +29 -0
  15. package/dist/commands/run.js +417 -0
  16. package/dist/commands/test.d.ts +12 -0
  17. package/dist/commands/test.js +102 -0
  18. package/dist/commands/vitest.d.ts +14 -0
  19. package/dist/commands/vitest.js +166 -0
  20. package/dist/config.d.ts +109 -0
  21. package/dist/config.js +291 -0
  22. package/dist/core/action-log-writer.d.ts +47 -0
  23. package/dist/{tools/write-file.js → core/action-log-writer.js} +42 -26
  24. package/dist/core/auth.d.ts +17 -0
  25. package/dist/core/auth.js +224 -0
  26. package/dist/core/cdp-resolver.d.ts +5 -0
  27. package/dist/core/cdp-resolver.js +93 -0
  28. package/dist/core/generateReport/report.d.ts +19 -0
  29. package/dist/core/generateReport/report.js +91 -0
  30. package/dist/core/generateReport/reportData.d.ts +215 -0
  31. package/dist/core/generateReport/reportData.js +735 -0
  32. package/dist/core/global-setup.d.ts +6 -0
  33. package/dist/core/global-setup.js +113 -0
  34. package/dist/core/keve-aspect.d.ts +54 -0
  35. package/dist/core/keve-aspect.js +52 -0
  36. package/dist/core/keve-decorators.d.ts +51 -0
  37. package/dist/core/keve-decorators.js +95 -0
  38. package/dist/core/keve-registry.d.ts +38 -0
  39. package/dist/core/keve-registry.js +25 -0
  40. package/dist/core/keve-report.d.ts +27 -0
  41. package/dist/core/keve-report.js +357 -0
  42. package/dist/core/keve-test.d.ts +36 -0
  43. package/dist/core/keve-test.js +364 -0
  44. package/dist/core/learned-actions.d.ts +24 -0
  45. package/dist/core/learned-actions.js +65 -0
  46. package/dist/core/pw-config.d.ts +19 -0
  47. package/dist/core/pw-config.js +180 -0
  48. package/dist/index.d.ts +8 -23
  49. package/dist/index.js +36 -43
  50. package/dist/page-agent/agent.d.ts +129 -0
  51. package/dist/page-agent/agent.js +585 -0
  52. package/dist/page-agent/hooks.d.ts +13 -0
  53. package/dist/page-agent/hooks.js +218 -0
  54. package/dist/page-agent/tools.d.ts +29 -0
  55. package/dist/page-agent/tools.js +297 -0
  56. package/doc/README.md +124 -0
  57. package/doc/agents/keve-dev-test-agent.md +140 -0
  58. package/doc/agents/keve-test-agent.md +178 -0
  59. package/doc/asserts//346/265/213/350/257/225/345/220/204/351/230/266/346/256/265/350/257/264/346/230/216.png +0 -0
  60. package/doc/keve-agent-demo.html +370 -0
  61. package/doc/skills/keve-bddcase-gen/SKILL.md +332 -0
  62. package/doc/skills/keve-bddcase-gen/references/test-case-rules.md +91 -0
  63. package/doc/skills/keve-bddcase-gen/references/test-cases-example.md +103 -0
  64. package/doc/skills/keve-component-gen/SKILL.md +255 -0
  65. package/doc/skills/keve-component-gen/references/component-mock-strategy.md +74 -0
  66. package/doc/skills/keve-component-gen/references/component-model-template.md +98 -0
  67. package/doc/skills/keve-component-gen/references/component-test-template.md +100 -0
  68. package/doc/skills/keve-component-gen/references/vue-test-utils-guide.md +91 -0
  69. package/doc/skills/keve-e2e-gen/SKILL.md +179 -0
  70. package/doc/skills/keve-e2e-gen/references/code-analysis-guide.md +208 -0
  71. package/doc/skills/keve-e2e-gen/references/decisions.md +36 -0
  72. package/doc/skills/keve-e2e-gen/references/pom-generation-guide.md +140 -0
  73. package/doc/skills/keve-e2e-gen/references/script-generation-guide.md +236 -0
  74. package/doc/skills/keve-e2e-gen/references/test-auditor-guide.md +189 -0
  75. package/doc/skills/keve-e2e-gen/scripts/extract-components.sh +85 -0
  76. package/doc/skills/keve-e2e-gen/scripts/inject-testids.sh +95 -0
  77. package/doc/skills/keve-static-analysis/SKILL.md +362 -0
  78. package/doc/skills/keve-static-analysis/references/codegraph-analysis-guide.md +108 -0
  79. package/doc/skills/keve-static-analysis/references/git-impact-analysis.md +81 -0
  80. package/doc/skills/keve-static-analysis/references/lint-fix-guide.md +69 -0
  81. package/doc/skills/keve-static-analysis/references/runtime-risk-patterns.md +92 -0
  82. package/doc/skills/keve-static-analysis/references/security-scan-guide.md +32 -0
  83. package/doc/skills/keve-static-analysis/references/ts-error-patterns.md +98 -0
  84. package/doc/skills/keve-static-analysis/references/vue-security-guide.md +72 -0
  85. package/doc/skills/keve-test-eval/SKILL.md +78 -0
  86. package/doc/skills/keve-test-eval/references/common-fix-guide.md +166 -0
  87. package/doc/skills/keve-test-eval/references/confidence-data-guide.md +78 -0
  88. package/doc/skills/keve-test-eval/references/fix-loop-guide.md +67 -0
  89. package/doc/skills/keve-unit-gen/SKILL.md +203 -0
  90. package/doc/skills/keve-unit-gen/references/boundary-conditions.md +78 -0
  91. package/doc/skills/keve-unit-gen/references/unit-mock-strategy.md +71 -0
  92. package/doc/skills/keve-unit-gen/references/unit-test-template.md +105 -0
  93. package/package.json +47 -25
  94. package/dist/agent/factory.d.ts +0 -25
  95. package/dist/agent/factory.js +0 -99
  96. package/dist/agent/index.d.ts +0 -3
  97. package/dist/agent/index.js +0 -7
  98. package/dist/agent/loader.d.ts +0 -22
  99. package/dist/agent/loader.js +0 -117
  100. package/dist/agent/types.d.ts +0 -9
  101. package/dist/agent/types.js +0 -2
  102. package/dist/agent-loop/complete-task.d.ts +0 -28
  103. package/dist/agent-loop/complete-task.js +0 -70
  104. package/dist/agent-loop/index.d.ts +0 -16
  105. package/dist/agent-loop/index.js +0 -26
  106. package/dist/agent-loop/loop.d.ts +0 -42
  107. package/dist/agent-loop/loop.js +0 -282
  108. package/dist/agent-loop/runtime.d.ts +0 -40
  109. package/dist/agent-loop/runtime.js +0 -163
  110. package/dist/agent-loop/types.d.ts +0 -161
  111. package/dist/agent-loop/types.js +0 -105
  112. package/dist/context/index.d.ts +0 -8
  113. package/dist/context/index.js +0 -29
  114. package/dist/context/tokenCalculation.d.ts +0 -55
  115. package/dist/context/tokenCalculation.js +0 -95
  116. package/dist/context/truncation.d.ts +0 -67
  117. package/dist/context/truncation.js +0 -142
  118. package/dist/context/types.d.ts +0 -7
  119. package/dist/context/types.js +0 -27
  120. package/dist/llm/OpenAIClient.d.ts +0 -31
  121. package/dist/llm/OpenAIClient.js +0 -455
  122. package/dist/llm/constants.d.ts +0 -2
  123. package/dist/llm/constants.js +0 -6
  124. package/dist/llm/errors.d.ts +0 -25
  125. package/dist/llm/errors.js +0 -51
  126. package/dist/llm/index.d.ts +0 -49
  127. package/dist/llm/index.js +0 -158
  128. package/dist/llm/types.d.ts +0 -124
  129. package/dist/llm/types.js +0 -2
  130. package/dist/llm/utils.d.ts +0 -29
  131. package/dist/llm/utils.js +0 -284
  132. package/dist/skill/frontmatter-parser.d.ts +0 -50
  133. package/dist/skill/frontmatter-parser.js +0 -152
  134. package/dist/skill/index.d.ts +0 -12
  135. package/dist/skill/index.js +0 -17
  136. package/dist/skill/loader.d.ts +0 -96
  137. package/dist/skill/loader.js +0 -256
  138. package/dist/tools/ask-user.d.ts +0 -8
  139. package/dist/tools/ask-user.js +0 -47
  140. package/dist/tools/bash.d.ts +0 -47
  141. package/dist/tools/bash.js +0 -213
  142. package/dist/tools/edit-file.d.ts +0 -9
  143. package/dist/tools/edit-file.js +0 -76
  144. package/dist/tools/glob.d.ts +0 -8
  145. package/dist/tools/glob.js +0 -101
  146. package/dist/tools/grep.d.ts +0 -10
  147. package/dist/tools/grep.js +0 -76
  148. package/dist/tools/index.d.ts +0 -24
  149. package/dist/tools/index.js +0 -47
  150. package/dist/tools/read-files.d.ts +0 -8
  151. package/dist/tools/read-files.js +0 -81
  152. package/dist/tools/write-file.d.ts +0 -8
@@ -0,0 +1,32 @@
1
+ # eslint-plugin-security 规则完整列表
2
+
3
+ > AI 执行安全扫描时的规则参考
4
+
5
+ ---
6
+
7
+ ## 高优先级规则
8
+
9
+ | 规则 | 检测 | 风险 |
10
+ |------|------|------|
11
+ | `detect-eval-with-expression` | `eval(userInput)`, `new Function(str)` | 🔴 代码注入 |
12
+ | `detect-unsafe-regex` | `/(a+)+/`, `/(a\|a)*$/` | 🟠 ReDoS |
13
+ | `detect-non-literal-regexp` | `new RegExp(userInput)` | 🟠 ReDoS |
14
+ | `detect-object-injection` | `obj[userInput]` | 🟡 属性注入 |
15
+ | `detect-xss` | `innerHTML = userInput`, `v-html` | 🔴 XSS |
16
+
17
+ ## 中优先级规则
18
+
19
+ | 规则 | 检测 | 风险 |
20
+ |------|------|------|
21
+ | `detect-non-literal-fs-filename` | `fs.readFile(userInput)` | 🟠 路径遍历 |
22
+ | `detect-pseudoRandomBytes` | `Math.random()` 用于安全场景 | 🟡 弱随机 |
23
+ | `detect-possible-timing-attacks` | `password === input` | 🟡 时序攻击 |
24
+ | `detect-buffer-usage` | `new Buffer(userInput)` | 🟡 内存泄露 |
25
+
26
+ ## Vue 专项
27
+
28
+ | 规则 | 检测 | 风险 |
29
+ |------|------|------|
30
+ | `vue/no-v-html` | `<div v-html="userContent">` | 🔴 XSS |
31
+ | `vue/require-v-for-key` | `<div v-for="item in list">` | 🟡 性能/DOM |
32
+ | `vue/no-mutating-props` | `props.data = newValue` | 🟡 数据流 |
@@ -0,0 +1,98 @@
1
+ # TypeScript 常见错误码及修复模式
2
+
3
+ > AI 修复 TS 类型错误时的参考手册
4
+
5
+ ---
6
+
7
+ ## 高频错误码
8
+
9
+ ### TS2322: 类型不匹配
10
+
11
+ ```typescript
12
+ // ❌ 错误
13
+ const name: string = 123;
14
+
15
+ // ✅ 修复:修正类型标注或转换值
16
+ const name: string = '123';
17
+ // 或
18
+ const name: number = 123;
19
+ ```
20
+
21
+ ### TS2339: 属性不存在
22
+
23
+ ```typescript
24
+ // ❌ 错误
25
+ interface User { name: string; }
26
+ const user: User = { name: 'Alice' };
27
+ console.log(user.age); // Property 'age' does not exist
28
+
29
+ // ✅ 修复:扩展接口或使用可选链
30
+ interface User { name: string; age?: number; }
31
+ console.log(user.age?.toString());
32
+ ```
33
+
34
+ ### TS2304: 找不到名称
35
+
36
+ ```typescript
37
+ // ❌ 错误
38
+ const result = someFunction(); // Cannot find name 'someFunction'
39
+
40
+ // ✅ 修复:补充 import
41
+ import { someFunction } from './utils';
42
+ ```
43
+
44
+ ### TS2307: 找不到模块
45
+
46
+ ```typescript
47
+ // ❌ 错误
48
+ import { foo } from './nonexistent'; // Cannot find module
49
+
50
+ // ✅ 修复:检查路径、补充 .vue 后缀、或创建声明文件
51
+ import { foo } from './existent';
52
+ ```
53
+
54
+ ### TS2769: 函数参数类型不匹配
55
+
56
+ ```typescript
57
+ // ❌ 错误
58
+ function greet(name: string) { ... }
59
+ greet(123); // Argument of type 'number' is not assignable
60
+
61
+ // ✅ 修复:传入正确类型
62
+ greet('Alice');
63
+ // 或
64
+ greet(String(123));
65
+ ```
66
+
67
+ ### TS7053: 索引签名缺失
68
+
69
+ ```typescript
70
+ // ❌ 错误
71
+ const obj: Record<string, string> = { a: '1' };
72
+ obj['b']; // Element implicitly has an 'any' type
73
+
74
+ // ✅ 修复:添加索引签名或类型断言
75
+ const obj: Record<string, string> = { a: '1' };
76
+ obj['b'] as string | undefined;
77
+ ```
78
+
79
+ ---
80
+
81
+ ## 修复原则
82
+
83
+ 1. **优先修正类型标注**,而不是用 `as any` 绕过
84
+ 2. **检查 import 路径**,确认文件存在且大小写正确
85
+ 3. **检查 `.vue` 文件导入**,可能需要 `shims-vue.d.ts`
86
+ 4. **检查泛型约束**,可能需要补充 `extends` 条件
87
+ 5. **检查响应式类型**,`Ref<T>` vs `T` 需要 `.value`
88
+
89
+ ---
90
+
91
+ ## 禁止做法
92
+
93
+ | 禁止 | 原因 |
94
+ |------|------|
95
+ | `@ts-ignore` | 掩盖错误,不解决问题 |
96
+ | `@ts-nocheck` | 整个文件跳过检查 |
97
+ | `as any` | 丢失类型安全 |
98
+ | 删除文件 | 不是修复,是逃避 |
@@ -0,0 +1,72 @@
1
+ # Vue 安全扫描指南
2
+
3
+ > AI 扫描 Vue 项目安全风险时的参考
4
+
5
+ ---
6
+
7
+ ## XSS 风险
8
+
9
+ | 模式 | 风险等级 | 说明 |
10
+ |------|---------|------|
11
+ | `v-html="userInput"` | 🔴 Critical | 直接渲染用户输入 = XSS |
12
+ | `element.innerHTML = userInput` | 🔴 Critical | 原生 innerHTML |
13
+ | `v-html="sanitizedContent"` | 🟡 Medium | 取决于 sanitization 实现 |
14
+ | `v-text="userInput"` | ✅ 安全 | 自动转义 |
15
+ | `{{ userInput }}` | ✅ 安全 | 模板语法自动转义 |
16
+
17
+ ### v-html 安全修复
18
+
19
+ ```typescript
20
+ // ❌ 危险
21
+ <div v-html="comment.content" />
22
+
23
+ // ✅ 使用 DOMPurify
24
+ import DOMPurify from 'dompurify';
25
+ const sanitized = DOMPurify.sanitize(comment.content);
26
+ <div v-html="sanitized" />
27
+
28
+ // ✅ 最佳:不用 v-html
29
+ <div>{{ comment.content }}</div>
30
+ ```
31
+
32
+ ---
33
+
34
+ ## 数据流风险
35
+
36
+ ### Props 修改
37
+
38
+ ```typescript
39
+ // ❌ 风险:直接修改 props
40
+ props: { list: Array },
41
+ setup(props) { props.list.push(newItem); }
42
+
43
+ // ✅ 修复:emit 事件
44
+ emits: ['update:list'],
45
+ setup(props, { emit }) { emit('update:list', [...props.list, newItem]); }
46
+ ```
47
+
48
+ ### 计算属性中的副作用
49
+
50
+ ```typescript
51
+ // ❌ 风险:计算属性中发请求
52
+ computed: {
53
+ data() { return fetchData(this.id); } // 每次访问都触发
54
+ }
55
+
56
+ // ✅ 修复:用 watch + ref
57
+ watch: {
58
+ id(newId) { this.fetchData(newId); }
59
+ }
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 依赖安全
65
+
66
+ ### 已知 Vue 生态漏洞
67
+
68
+ | 包 | CVE | 修复版本 |
69
+ |----|-----|---------|
70
+ | lodash < 4.17.21 | CVE-2021-23337 | 升级到 4.17.21+ |
71
+ | vue < 2.6.12 | XSS in templates | 升级到 2.6.12+ |
72
+ | vue-server-renderer | CVE-2024-6345 | 检查版本 |
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: keve-test-eval
3
+ description: 测试执行与评估技能。指导用例执行(keve run),读取 Reporter 工程分类和 AI 评估结果,对失败用例做根因分析、给出修复建议、指导重跑闭环。
4
+ allowed-tools: Bash(shell:*) Bash(npx:*) Bash(npm:*) Bash(node:*) Bash(git:*) ask_user_questions
5
+ ---
6
+
7
+ # keve-test-eval
8
+
9
+ ## 1. 定位
10
+
11
+ **本技能负责**:执行用例 → 评估结果 → 分析根因 → 修复 → 重跑。
12
+
13
+ ```
14
+ keve run → confidence-data.jsonl
15
+ │
16
+ ├─ data="通过" → 无需处理
17
+ ├─ data="跳过" → 按 errorCategory 排查
18
+ ├─ data="不通过" → 读 thought 判断根因 → 修复/报Bug/问用户
19
+ └─ data="待确认" → ask_user_questions 确认
20
+ ```
21
+
22
+ ## 2. 用例执行
23
+
24
+ ### 2.1 前置条件
25
+
26
+ 项目已通过 `keve init` 初始化(见 keve-e2e-gen Phase 0),目录结构详见 `keve_test_spec/keve.yaml` 顶部注释。
27
+
28
+ ### 2.2 keve run 命令
29
+
30
+ ```bash
31
+ # 基本执行(必传 KEVE_TASK_DIR 和 --config)
32
+ KEVE_TASK_DIR=.keve/mr-868-temp npx keve run --config=keve_test_spec/keve-test.config.ts
33
+
34
+ # 重跑失败用例
35
+ KEVE_TASK_DIR=.keve/mr-868-temp npx keve run --config=keve_test_spec/keve-test.config.ts --last-failed
36
+
37
+ # 指定/筛选用例
38
+ KEVE_TASK_DIR=.keve/mr-868-temp npx keve run --config=keve_test_spec/keve-test.config.ts --cases=AG-01,KB-03
39
+ ```
40
+
41
+ ## 3. 执行结果分析
42
+
43
+ 读 `$KEVE_TASK_DIR/test-artifacts/latest/confidence-data.jsonl`,按 `data` + `errorCategory` 分流:
44
+
45
+ | data | errorCategory | 行动 |
46
+ |------|--------------|------|
47
+ | 通过 | pass | 无需处理 |
48
+ | 跳过 | env | [common-fix-guide 第2节](references/common-fix-guide.md):Auth/网络/元素找不到 |
49
+ | 跳过 | script | [common-fix-guide 第3节](references/common-fix-guide.md):测试代码本身有错 |
50
+ | 跳过 | visual | [common-fix-guide 第4节](references/common-fix-guide.md):keveAssert 判断异常 |
51
+ | 不通过 | assert | 读 `thought` 判断根因:脚本缺陷→自修 / 应用Bug→报Bug / 需求变更→问用户 |
52
+ | 不通过 | script | 自修 POM/spec → --last-failed 重跑 |
53
+ | 待确认 | * | ask_user_questions 确认实际结果 |
54
+
55
+ **定位根因**:`errorCategory` → `thought` → `keveScreenshots` 截图 → 必要时读 `test-results.json` 取 error.stack → 定位 `@keveScene` / POM 方法
56
+
57
+ **即时确认规则**:遇到以下情况,必须立即用 `ask_user_questions` 向用户确认,不要自行决策:
58
+ - errorCategory=env → 确认是修复环境、添加 mock 还是标记跳过
59
+ - thought 提示需求/预期可能变更 → 确认预期是否需要更新
60
+ - data="待确认" → 确认实际结果是否符合预期
61
+
62
+ ## 4. 修复闭环
63
+
64
+ ```
65
+ data="跳过" → 按 errorCategory 排查 → env 时检查 Auth → 重跑(global-setup 自动获取)
66
+ data="不通过" + script → 自修 POM/spec → --last-failed 重跑 → 由编排层控制迭代轮次
67
+ data="不通过" + assert → 读 thought 判断 → 自修/报Bug/问用户
68
+ data="待确认" → ask_user_questions → 人工复核
69
+ ```
70
+
71
+ 每轮修复后在 `run-state.yaml` 中记录修复内容(fixes 字段),编排层读取轮次进度。
72
+
73
+ > 脚本缺陷的子类型和修复流程详见 [fix-loop-guide](references/fix-loop-guide.md)
74
+
75
+ ## References
76
+
77
+ - [confidence-data-guide.md](references/confidence-data-guide.md) — confidence-data.jsonl 字段说明、组合解读、thought 关键词、示例
78
+ - [common-fix-guide.md](references/common-fix-guide.md) — 各 errorCategory 的排查与修复流程
@@ -0,0 +1,166 @@
1
+ # 常规问题修复建议
2
+
3
+ > 针对报告中常见错误分类的修复策略与操作指引。
4
+
5
+ ---
6
+
7
+ ## 1. errorCategory 分类与对应修复
8
+
9
+ | errorCategory | 报告显示 | 典型原因 | 修复方式 |
10
+ |---------------|----------|----------|----------|
11
+ | script | 脚本错误 | TypeError / ReferenceError / SyntaxError | 修复测试脚本代码 |
12
+ | env | 环境异常 | Timeout / 网络错误 / Auth 重定向 / Cookie 过期 | 检查环境或更新 Auth |
13
+ | visual | 视觉断言失败 | keveAssert 视觉比对不通过 | 检查截图,确认是 Bug 还是断言预期需更新 |
14
+ | assert | 断言失败 | Playwright expect 断言不通过 | 根因分析(A/B/C/D),见下方 |
15
+ | unknown | 未知异常 | 无法自动分类的错误 | 人工排查 |
16
+ | pass | 通过 | 测试正常通过 | 无需处理 |
17
+
18
+ ---
19
+
20
+ ## 2. 环境异常(env)修复流程
21
+
22
+ 环境异常是最常见的"非脚本问题"导致测试失败的原因。
23
+
24
+ ### 2.1 Auth / Cookie 过期
25
+
26
+ **识别信号**:
27
+ - 错误信息包含 `authenticate`、`redirect`、`ERR_`、`401`、`403`
28
+ - 截图显示登录页面而非目标页面
29
+ - `navigation intercepted`
30
+
31
+ **修复步骤**:
32
+
33
+ ```bash
34
+ # 直接重跑测试 — global-setup 每次自动获取 Auth(打开浏览器手动登录)
35
+ KEVE_TASK_DIR=.keve/mr-868-temp npx keve run --config=keve_test_spec/keve-test.config.ts
36
+ ```
37
+
38
+ `keve run` 的 global-setup 会自动:
39
+ - 打开浏览器(非 headless)
40
+ - 导航到登录页面,等待用户手动登录
41
+ - 自动检测登录完成(URL 不再包含 login/auth)
42
+ - 保存 cookies + localStorage 到 `.auth/storage-state.json`
43
+
44
+ **注意事项**:
45
+ - 确保 dev server 正在运行(`pnpm dev`),否则无法打开目标页面
46
+ - 如果目标 URL 不是默认的 `http://localhost:3000`,使用 `--url` 参数指定
47
+ - 如果 storage-state 路径不是默认的 `.auth/storage-state.json`,使用 `--config` 参数让命令从 Playwright config 中读取
48
+
49
+ ### 2.2 网络超时(Timeout)
50
+
51
+ **识别信号**:
52
+ - 错误信息包含 `timeout`、`timed out`、`TimeoutError`
53
+ - 截图显示空白页面或部分加载的页面
54
+
55
+ **排查方向**:
56
+ 1. dev server 是否正在运行?
57
+ 2. 目标页面加载是否确实很慢?(调整 Playwright config 中 `timeout` / `actionTimeout`)
58
+ 3. 网络是否不稳定?(如果是偶发,重跑一次即可)
59
+
60
+ **修复步骤**:
61
+
62
+ ```bash
63
+ # 如果是偶发超时,直接重跑
64
+ KEVE_TASK_DIR=.keve/mr-868-temp npx keve run --config=keve_test_spec/keve-test.config.ts --retry-from=<round>
65
+
66
+ # 如果是系统性超时,调整 timeout 配置
67
+ # 编辑 .keve/keve-test.config.ts 中的 timeout 和 actionTimeout
68
+ ```
69
+
70
+ ### 2.3 元素未找到(Locator not found)
71
+
72
+ **识别信号**:
73
+ - 错误信息包含 `locator.*not found`、`waiting for selector`
74
+ - 截图显示页面但缺少预期元素
75
+
76
+ **排查方向**:
77
+ 1. 页面是否真的没有这个元素?(→ 应用 Bug,报告给开发)
78
+ 2. 定位器是否写错了?(→ 脚本缺陷,修复定位器)
79
+ 3. 页面是否还在加载中?(→ 增加 `waitFor` 或 timeout)
80
+ 4. Auth 是否过期导致页面跳转到登录?(→ 更新 Auth,见 2.1)
81
+
82
+ ---
83
+
84
+ ## 3. 脚本错误(script)修复流程
85
+
86
+ 脚本错误是测试代码本身的问题,与被测应用无关。
87
+
88
+ **常见类型**:
89
+
90
+ | 错误类型 | 典型原因 | 修复方式 |
91
+ |----------|----------|----------|
92
+ | TypeError | 调用 undefined 的方法、属性访问错误 | 检查变量是否已定义 |
93
+ | ReferenceError | 使用未声明的变量 | 检查 import / 变量声明 |
94
+ | SyntaxError | 代码语法错误 | 检查括号、逗号等语法 |
95
+
96
+ **修复步骤**:
97
+ 1. 查看报告中"执行结果"列的错误信息
98
+ 2. 定位到对应的 `@keveScene` 测试脚本
99
+ 3. 修复代码错误
100
+ 4. 重跑验证
101
+
102
+ ---
103
+
104
+ ## 4. 视觉断言失败(visual)修复流程
105
+
106
+ 视觉断言失败说明 keveAssert 的 AI 判断认为页面视觉状态不符合预期。
107
+
108
+ **排查方向**:
109
+ 1. **是真的 Bug?** → 截图显示页面确实有问题(文案错误、样式异常、功能缺失)
110
+ 2. **是断言预期不合理?** → 截图显示页面正常,但 keveAssert 的描述与实际不符
111
+ 3. **是 AI 误判?** → 截图显示页面正常,断言描述也合理,但 AI 误判了
112
+
113
+ **修复方式**:
114
+
115
+ | 场景 | 修复方式 |
116
+ |------|----------|
117
+ | 真的 Bug | 报告 Bug,不修脚本 |
118
+ | 断言预期不合理 | 更新 `keveAssert` 的 description,使其更精确 |
119
+ | AI 误判 | 重跑一次确认(AI 误判概率 < 5%);如果反复误判,考虑改用 Playwright expect 断言 |
120
+
121
+ ---
122
+
123
+ ## 5. 断言失败(assert)修复流程
124
+
125
+ 断言失败是经过 AI 评估仍确认为"不通过"的用例,需做根因分析。
126
+
127
+ ### 5.1 断言失败的根因判断
128
+
129
+ 读 `confidence-data.jsonl` 中 `data="不通过"` 的记录,根据 `errorCategory` + `thought` 判断行动:
130
+
131
+ | errorCategory | thought 关键词 | 根因 | 行动 |
132
+ |--------------|---------------|------|------|
133
+ | script | "locator not found" / "element not found" | 脚本缺陷 | 自修 POM/spec |
134
+ | script | "timeout" / "wait" | 等待策略不足 | 调整 waitFor/timeout |
135
+ | assert | "text mismatch" + MR 有相关 diff | 需求变更 | ask_user_questions 确认 |
136
+ | assert | "element exists but behavior wrong" | 应用 Bug | 报 Bug,不修脚本 |
137
+ | visual | "keveAssert failed but DOM passed" | 假阳性 | 查截图判断 |
138
+
139
+ ### 5.2 决策流程
140
+
141
+ ```
142
+ data="不通过"
143
+ ├─ errorCategory=script → 自修 POM/spec → --last-failed 重跑
144
+ ├─ errorCategory=assert
145
+ │ ├─ thought 提示需求/文案变更 → ask_user_questions 确认
146
+ │ ├─ thought 提示应用 Bug → 报 Bug,不修脚本
147
+ │ └─ thought 提示断言逻辑错 → 自修断言 → 重跑
148
+ └─ errorCategory=visual → 查截图 → 判断 Bug/预期/AI误判
149
+ ```
150
+
151
+ ---
152
+
153
+ ## 6. 快速参考卡片
154
+
155
+ ```
156
+ 看 confidence-data.jsonl → 按 data + errorCategory 分流
157
+ │
158
+ ├─ script → 修代码 → 重跑
159
+ ├─ env → 检查 auth/server/网络
160
+ │ ├─ auth 过期 → 重跑(global-setup 自动获取 Auth)
161
+ │ ├─ server 没跑 → pnpm dev → 重跑
162
+ │ └─ 偶发超时 → 直接重跑
163
+ ├─ visual → 查截图 → 判断 Bug/预期/AI误判
164
+ ├─ assert → 读 thought 判断根因 → 修脚本/报Bug/问用户
165
+ └─ unknown → 人工排查
166
+ ```
@@ -0,0 +1,78 @@
1
+ # confidence-data.jsonl 解读指南
2
+
3
+ > 每次执行后 Reporter 写入 `$KEVE_TASK_DIR/test-artifacts/latest/confidence-data.jsonl`,每行一条用例的评估结果。
4
+
5
+ ## 文件位置
6
+
7
+ ```
8
+ .keve/mr-868-temp/test-artifacts/latest/confidence-data.jsonl
9
+ ↑ 符号链接,指向当前 round-N/
10
+ ```
11
+
12
+ ## 格式
13
+
14
+ 每行一个 JSON 对象:
15
+
16
+ ```json
17
+ {"title":"AG-01: 筛选区域不显示天策门户","data":"通过","confidence":95,"thought":"DOM断言通过 + keveAssert视觉验证通过","errorCategory":"pass","keveScreenshots":["keveAssert-筛选区域验证"]}
18
+ ```
19
+
20
+ ## 字段说明
21
+
22
+ | 字段 | 类型 | 说明 |
23
+ |------|------|------|
24
+ | `title` | string | 用例标题(@keveScene 的 title) |
25
+ | `data` | string | 最终结论:通过 / 不通过 / 跳过 / 待确认 |
26
+ | `confidence` | number | AI 评估置信度 0-100(跳过时为 0) |
27
+ | `thought` | string | AI 分析推理过程(跳过时为短路原因) |
28
+ | `errorCategory` | string | 错误分类:pass / script / env / visual / assert / unknown |
29
+ | `keveScreenshots` | string[] | keveAssert 截图 attachment 名称列表 |
30
+
31
+ ## data + errorCategory 组合解读
32
+
33
+ | data | errorCategory | 含义 | 行动 |
34
+ |------|--------------|------|------|
35
+ | 通过 | pass | 可信通过(confidence >= 80) | 无需处理 |
36
+ | 通过 | pass | 有保留的通过(confidence < 80) | 可人工抽检 |
37
+ | 跳过 | env | 环境异常导致未执行 | [common-fix-guide 第2节](./common-fix-guide.md) |
38
+ | 跳过 | script | 测试代码本身有错导致未执行 | [common-fix-guide 第3节](./common-fix-guide.md) |
39
+ | 跳过 | visual | keveAssert 异常导致跳过 | [common-fix-guide 第4节](./common-fix-guide.md) |
40
+ | 不通过 | script | 脚本缺陷 | 自修 POM/spec → --last-failed 重跑 |
41
+ | 不通过 | assert | 断言失败(经 AI 评估仍不通过) | 读 thought 判断根因 → 修脚本/报Bug/问用户 |
42
+ | 不通过 | visual | 视觉断言失败 | 查截图判断 |
43
+ | 待确认 | * | AI 证据不足无法判定 | ask_user_questions |
44
+
45
+ ## thought 字段解读
46
+
47
+ `thought` 是 AI 的推理过程,包含具体的错误描述和判断依据。重点关键词:
48
+
49
+ | thought 关键词 | 可能根因 | 行动 |
50
+ |---------------|---------|------|
51
+ | "locator not found" / "element not found" | 定位器找不到元素 | 检查 POM 定位器是否匹配源码 |
52
+ | "timeout" / "wait" | 等待策略不足 | 调整 waitFor/timeout |
53
+ | "text mismatch" | 预期与实际文本不符 | 检查 MR diff 是否有需求变更 |
54
+ | "keveAssert failed but DOM passed" | 假阳性 | 查 keveScreenshots 截图 |
55
+ | "redirect" / "auth" | 认证/重定向问题 | 检查 Auth 状态 |
56
+ | "ERR_CONNECTION" | 网络问题 | 检查 dev server 和网络 |
57
+
58
+ ## 示例
59
+
60
+ **通过**:
61
+ ```json
62
+ {"title":"AG-01: 类型筛选只显示用户自建","data":"通过","confidence":95,"thought":"DOM断言通过 + keveAssert视觉验证通过","errorCategory":"pass","keveScreenshots":["keveAssert-AG01-Step1"]}
63
+ ```
64
+
65
+ **跳过(环境异常)**:
66
+ ```json
67
+ {"title":"AG-02: 搜索功能","data":"跳过","confidence":0,"thought":"短路: navigation timeout, page.goto 超时, 可能 dev server 未启动","errorCategory":"env","keveScreenshots":[]}
68
+ ```
69
+
70
+ **不通过(脚本缺陷)**:
71
+ ```json
72
+ {"title":"AG-03: 创建Agent","data":"不通过","confidence":88,"thought":"locator('[data-e2e-name=创建按钮]') not found, 源码中该元素使用 aria-label 而非 data-e2e-name","errorCategory":"script","keveScreenshots":["keveAssert-AG03-Step1"]}
73
+ ```
74
+
75
+ **不通过(断言失败,需人工判断)**:
76
+ ```json
77
+ {"title":"AG-04: 删除Agent","data":"不通过","confidence":72,"thought":"点击删除后页面仍显示该Agent, 但MR diff 显示删除逻辑已改为软删除(标记而非移除)","errorCategory":"assert","keveScreenshots":["keveAssert-AG04-Step2"]}
78
+ ```
@@ -0,0 +1,67 @@
1
+ # 修复闭环指南 (Fix Loop Guide)
2
+
3
+ > test-eval 执行用例后,读 confidence-data.jsonl 按 errorCategory 分流,对 script 类自行修复。
4
+
5
+ ---
6
+
7
+ ## 脚本缺陷子类型(errorCategory=script 时自行修复)
8
+
9
+ | 子类型 | 说明 | 修复方式 |
10
+ |--------|------|----------|
11
+ | 定位器不匹配 | 页面有替代元素 | 更新 POM 定位器 |
12
+ | 硬编码路径/ID/路由 | 路由格式错误 | 对照源代码 router 配置验证,严禁猜测 |
13
+ | 断言逻辑错误 | 页面显示正确但断言写错 | 调整断言 |
14
+ | 渲染类型不匹配 | 条件渲染/动态组件 | 改用正确的定位策略 |
15
+ | 等待策略不足 | 元素渲染时机不对 | 增加 waitFor 或调整 timeout |
16
+
17
+ > errorCategory=env/visual/assert 时不自修,用 `ask_user_questions` 确认或按 [common-fix-guide](./common-fix-guide.md) 排查。
18
+
19
+ ---
20
+
21
+ ## 修复流程
22
+
23
+ 单次修复闭环(test-eval 内部):
24
+
25
+ ```
26
+ 1. 读 confidence-data.jsonl → 按 errorCategory 分流
27
+ 2. errorCategory=script → 定位失败用例 → 修复 POM 或 spec
28
+ 3. 重跑失败用例:KEVE_TASK_DIR=.keve/mr-868-temp npx keve run --config=keve_test_spec/keve-test.config.ts --last-failed
29
+ 4. 读新一轮 confidence-data.jsonl → 重新评估修复效果
30
+ ```
31
+
32
+ ---
33
+
34
+ ## 每轮执行结果天然隔离(KEVE_TASK_DIR)
35
+
36
+ 每轮 round 独立输出到 `$KEVE_TASK_DIR/test-artifacts/round-N/`,`latest` 符号链接始终指向最新轮次:
37
+
38
+ ```
39
+ .keve/mr-868-temp/test-artifacts/
40
+ ├── round-1/
41
+ │ ├── test-results.json
42
+ │ └── confidence-data.jsonl
43
+ ├── round-2/
44
+ └── latest → round-2/
45
+ ```
46
+
47
+ 每轮修复后在 `run-state.yaml` 中记录修复内容,编排层读取轮次进度:
48
+
49
+ ```yaml
50
+ current_round: 3
51
+ rounds:
52
+ 1:
53
+ status: completed
54
+ passed: 14
55
+ failed: 5
56
+ fixes: ["AG-01: strict mode → .first()", "KB tooltip: broader popper locator"]
57
+ 2:
58
+ status: completed
59
+ passed: 16
60
+ failed: 3
61
+ fixes: ["WW: scope to 欢迎语容器", "REG-01: add NotAvailable分支"]
62
+ 3:
63
+ status: completed
64
+ passed: 19
65
+ failed: 0
66
+ fixes: []
67
+ ```