@hongmaple0820/scale-engine 0.10.1 → 0.11.0
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.
- package/dist/artifact/types.d.ts +1 -1
- package/dist/artifact/types.js.map +1 -1
- package/dist/capabilities/BrowserQACapability.d.ts +151 -0
- package/dist/capabilities/BrowserQACapability.js +344 -0
- package/dist/capabilities/BrowserQACapability.js.map +1 -0
- package/dist/cli/evolutionCommands.d.ts +112 -0
- package/dist/cli/evolutionCommands.js +246 -0
- package/dist/cli/evolutionCommands.js.map +1 -0
- package/dist/cli/phaseCommands.js +74 -40
- package/dist/cli/phaseCommands.js.map +1 -1
- package/dist/guardrails/OWASPDetector.d.ts +58 -0
- package/dist/guardrails/OWASPDetector.js +508 -0
- package/dist/guardrails/OWASPDetector.js.map +1 -0
- package/dist/workflow/evolution/LessonExtractor.d.ts +90 -0
- package/dist/workflow/evolution/LessonExtractor.js +317 -0
- package/dist/workflow/evolution/LessonExtractor.js.map +1 -0
- package/dist/workflow/evolution/SelfImproveEngine.d.ts +156 -0
- package/dist/workflow/evolution/SelfImproveEngine.js +361 -0
- package/dist/workflow/evolution/SelfImproveEngine.js.map +1 -0
- package/dist/workflow/qa/E2ETestRunner.d.ts +102 -0
- package/dist/workflow/qa/E2ETestRunner.js +227 -0
- package/dist/workflow/qa/E2ETestRunner.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
// SCALE Engine — Self-Improve Engine
|
|
2
|
+
// Defect → Lesson → Rule → Hook 自改进闭环
|
|
3
|
+
// 设计参考:docs/03-CORE-MODULES.md §3.6 + L6 Evolution
|
|
4
|
+
import { LessonExtractor } from './LessonExtractor.js';
|
|
5
|
+
/**
|
|
6
|
+
* Self-Improve Engine
|
|
7
|
+
*
|
|
8
|
+
* 实现自改进闭环:
|
|
9
|
+
* 1. Defect → Lesson: 从缺陷提取可复用教训
|
|
10
|
+
* 2. Lesson → Rule: 经过验证的教训转化为规则
|
|
11
|
+
* 3. Rule → Hook: 高频规则转化为自动化 Hook
|
|
12
|
+
*
|
|
13
|
+
* 闭环流程:
|
|
14
|
+
* - Lesson 需要 verified 3 次才能晋升为 Rule Candidate
|
|
15
|
+
* - Rule 需要 hit 10 换才能晋升为 Hook Candidate
|
|
16
|
+
* - Hook 生成后自动注册到 Gateway
|
|
17
|
+
*/
|
|
18
|
+
export class SelfImproveEngine {
|
|
19
|
+
constructor(eventBus, thresholds) {
|
|
20
|
+
// 存储候选
|
|
21
|
+
this.lessonCandidates = new Map();
|
|
22
|
+
this.ruleCandidates = new Map();
|
|
23
|
+
this.generatedHooks = [];
|
|
24
|
+
this.eventBus = eventBus;
|
|
25
|
+
this.thresholds = {
|
|
26
|
+
lessonVerificationThreshold: 3,
|
|
27
|
+
ruleActivationThreshold: 10,
|
|
28
|
+
hookGenerationThreshold: 20,
|
|
29
|
+
maxHooks: 10,
|
|
30
|
+
...thresholds
|
|
31
|
+
};
|
|
32
|
+
this.lessonExtractor = new LessonExtractor(eventBus, 2);
|
|
33
|
+
this.state = {
|
|
34
|
+
lessonsExtracted: 0,
|
|
35
|
+
lessonsVerified: 0,
|
|
36
|
+
rulesCreated: 0,
|
|
37
|
+
rulesActive: 0,
|
|
38
|
+
hooksGenerated: 0,
|
|
39
|
+
lastRunAt: 0
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 运行自改进闭环
|
|
44
|
+
*/
|
|
45
|
+
async run(sessionId) {
|
|
46
|
+
this.eventBus.emit('self-improve.start', { sessionId, thresholds: this.thresholds });
|
|
47
|
+
const startTime = Date.now();
|
|
48
|
+
// Phase 1: Extract Lessons from Defects
|
|
49
|
+
const lessons = await this.extractLessons(sessionId);
|
|
50
|
+
// Phase 2: Verify and Promote Lessons to Rules
|
|
51
|
+
const rules = await this.verifyAndPromoteLessons(lessons);
|
|
52
|
+
// Phase 3: Activate Rules and Track Hits
|
|
53
|
+
const activeRules = await this.activateRules(rules);
|
|
54
|
+
// Phase 4: Generate Hooks from High-Frequency Rules
|
|
55
|
+
const hooks = await this.generateHooksFromRules(activeRules);
|
|
56
|
+
// 更新状态
|
|
57
|
+
this.state = {
|
|
58
|
+
lessonsExtracted: lessons.length,
|
|
59
|
+
lessonsVerified: this.lessonCandidates.size,
|
|
60
|
+
rulesCreated: rules.length,
|
|
61
|
+
rulesActive: activeRules.length,
|
|
62
|
+
hooksGenerated: hooks.length,
|
|
63
|
+
lastRunAt: startTime
|
|
64
|
+
};
|
|
65
|
+
this.eventBus.emit('self-improve.end', {
|
|
66
|
+
sessionId,
|
|
67
|
+
state: this.state,
|
|
68
|
+
durationMs: Date.now() - startTime
|
|
69
|
+
});
|
|
70
|
+
return this.state;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Phase 1: 从会话提取 Lessons
|
|
74
|
+
*/
|
|
75
|
+
async extractLessons(sessionId) {
|
|
76
|
+
this.eventBus.emit('self-improve.phase.extract', { sessionId });
|
|
77
|
+
const candidates = await this.lessonExtractor.extractFromSession(sessionId);
|
|
78
|
+
// 存储候选
|
|
79
|
+
for (const candidate of candidates) {
|
|
80
|
+
const existing = this.lessonCandidates.get(candidate.pattern) ?? candidate;
|
|
81
|
+
existing.frequency += candidate.frequency;
|
|
82
|
+
existing.defectIds.push(...candidate.defectIds);
|
|
83
|
+
this.lessonCandidates.set(candidate.pattern, existing);
|
|
84
|
+
}
|
|
85
|
+
return candidates;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Phase 2: 验证并晋升 Lessons 为 Rules
|
|
89
|
+
*/
|
|
90
|
+
async verifyAndPromoteLessons(candidates) {
|
|
91
|
+
this.eventBus.emit('self-improve.phase.verify', { candidatesCount: candidates.length });
|
|
92
|
+
const rules = [];
|
|
93
|
+
for (const [pattern, candidate] of this.lessonCandidates.entries()) {
|
|
94
|
+
// 检查是否达到验证阈值
|
|
95
|
+
if (candidate.frequency >= this.thresholds.lessonVerificationThreshold) {
|
|
96
|
+
candidate.verified = true;
|
|
97
|
+
// 创建 Rule Candidate
|
|
98
|
+
const ruleCandidate = this.createRuleCandidate(candidate);
|
|
99
|
+
this.ruleCandidates.set(ruleCandidate.id, ruleCandidate);
|
|
100
|
+
rules.push(ruleCandidate);
|
|
101
|
+
this.eventBus.emit('self-improve.lesson.promoted', {
|
|
102
|
+
pattern,
|
|
103
|
+
ruleId: ruleCandidate.id
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return rules;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 创建 Rule Candidate
|
|
111
|
+
*/
|
|
112
|
+
createRuleCandidate(lesson) {
|
|
113
|
+
return {
|
|
114
|
+
id: `rule-${Date.now()}-${lesson.defectIds[0]}`,
|
|
115
|
+
name: lesson.pattern.slice(0, 50).replace(/\s+/g, '-').toLowerCase(),
|
|
116
|
+
pattern: this.patternToRegExp(lesson.pattern),
|
|
117
|
+
severity: lesson.priority === 'HIGH' ? 'block' : lesson.priority === 'MEDIUM' ? 'warn' : 'info',
|
|
118
|
+
description: lesson.pattern,
|
|
119
|
+
remediation: lesson.solution,
|
|
120
|
+
lessonId: lesson.defectIds[0],
|
|
121
|
+
hitCount: 0,
|
|
122
|
+
lastHitAt: 0,
|
|
123
|
+
active: false
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* 将模式字符串转换为 RegExp
|
|
128
|
+
*/
|
|
129
|
+
patternToRegExp(pattern) {
|
|
130
|
+
// 常见模式的 RegExp 转换
|
|
131
|
+
const patternMappings = {
|
|
132
|
+
'Missing null check': /\?\s*\.\s*\w+|undefined\s*\.\s*\w+/,
|
|
133
|
+
'Async/await handling': /async\s+\w+\s*\([^)]*\)\s*\{[^}]*\breturn\b[^}]*\}/,
|
|
134
|
+
'Type mismatch': /as\s+any|:\s*any\b|@ts-ignore/,
|
|
135
|
+
'Missing import': /import\s+.*from\s+['"]undefined['"]|^.*\b\w+\b.*\n.*\b\w+\s*\(/,
|
|
136
|
+
};
|
|
137
|
+
// 尝试匹配已知模式
|
|
138
|
+
for (const [key, regex] of Object.entries(patternMappings)) {
|
|
139
|
+
if (pattern.includes(key)) {
|
|
140
|
+
return regex;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// 默认:创建简单文本匹配
|
|
144
|
+
const safePattern = pattern.replace(/[.*+?^${}()|[\]\\]/g, '\\$&').slice(0, 30);
|
|
145
|
+
return new RegExp(safePattern, 'i');
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Phase 3: 激活 Rules 并跟踪触发次数
|
|
149
|
+
*/
|
|
150
|
+
async activateRules(rules) {
|
|
151
|
+
this.eventBus.emit('self-improve.phase.activate', { rulesCount: rules.length });
|
|
152
|
+
const activeRules = [];
|
|
153
|
+
// 检查现有规则的触发历史
|
|
154
|
+
for (const [id, rule] of this.ruleCandidates.entries()) {
|
|
155
|
+
// 查询历史触发次数(通过 eventBus)
|
|
156
|
+
const hits = await this.eventBus.query({
|
|
157
|
+
types: ['rule.hit'],
|
|
158
|
+
filter: (e) => {
|
|
159
|
+
const p = e.payload;
|
|
160
|
+
return p.ruleId === id;
|
|
161
|
+
},
|
|
162
|
+
limit: 100
|
|
163
|
+
});
|
|
164
|
+
rule.hitCount = hits.length;
|
|
165
|
+
rule.lastHitAt = hits[0]?.timestamp ?? 0;
|
|
166
|
+
// 达到阈值则激活
|
|
167
|
+
if (rule.hitCount >= this.thresholds.ruleActivationThreshold) {
|
|
168
|
+
rule.active = true;
|
|
169
|
+
activeRules.push(rule);
|
|
170
|
+
this.eventBus.emit('self-improve.rule.activated', {
|
|
171
|
+
ruleId: id,
|
|
172
|
+
hitCount: rule.hitCount
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return activeRules;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Phase 4: 从高频 Rules 生成 Hooks
|
|
180
|
+
*/
|
|
181
|
+
async generateHooksFromRules(rules) {
|
|
182
|
+
this.eventBus.emit('self-improve.phase.hooks', { activeRulesCount: rules.length });
|
|
183
|
+
const hooks = [];
|
|
184
|
+
for (const rule of rules) {
|
|
185
|
+
// 检查是否达到 Hook 生成阈值
|
|
186
|
+
if (rule.hitCount >= this.thresholds.hookGenerationThreshold && this.generatedHooks.length < this.thresholds.maxHooks) {
|
|
187
|
+
const hook = this.generateHookFromRule(rule);
|
|
188
|
+
hooks.push(hook);
|
|
189
|
+
this.generatedHooks.push(hook);
|
|
190
|
+
this.eventBus.emit('self-improve.hook.generated', {
|
|
191
|
+
hookType: hook.hookType,
|
|
192
|
+
ruleId: rule.id,
|
|
193
|
+
matcher: hook.matcher
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return hooks;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* 从 Rule 生成 Hook 配置
|
|
201
|
+
*/
|
|
202
|
+
generateHookFromRule(rule) {
|
|
203
|
+
// 确定 Hook 类型
|
|
204
|
+
const hookType = rule.severity === 'block' ? 'PreToolUse' : 'PostToolUse';
|
|
205
|
+
// 确定 Matcher
|
|
206
|
+
const matcher = rule.severity === 'block' ? 'Write|Edit|MultiEdit' : 'Write|Edit';
|
|
207
|
+
// 生成检查命令
|
|
208
|
+
const command = this.generateHookCommand(rule);
|
|
209
|
+
return {
|
|
210
|
+
hookType,
|
|
211
|
+
matcher,
|
|
212
|
+
command,
|
|
213
|
+
description: `Auto-generated from rule: ${rule.name}`,
|
|
214
|
+
ruleId: rule.id
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 生成 Hook 检查命令
|
|
219
|
+
*/
|
|
220
|
+
generateHookCommand(rule) {
|
|
221
|
+
// 生成 Node.js 检查脚本
|
|
222
|
+
const script = `
|
|
223
|
+
const pattern = ${rule.pattern.toString()};
|
|
224
|
+
const content = process.argv[2] || '';
|
|
225
|
+
const matches = content.match(pattern);
|
|
226
|
+
if (matches) {
|
|
227
|
+
console.error('[RULE: ${rule.name}] ${rule.description}');
|
|
228
|
+
console.error('Remediation: ${rule.remediation}');
|
|
229
|
+
process.exit(${rule.severity === 'block' ? '1' : '0'});
|
|
230
|
+
}
|
|
231
|
+
process.exit(0);
|
|
232
|
+
`;
|
|
233
|
+
return `node -e "${script.replace(/\n/g, ' ').replace(/"/g, '\\"')}" "$CONTENT"`;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* 获取生成的 Hooks 配置(用于注册到 settings.json)
|
|
237
|
+
*/
|
|
238
|
+
getGeneratedHooksConfig() {
|
|
239
|
+
const hooks = {
|
|
240
|
+
PreToolUse: [],
|
|
241
|
+
PostToolUse: [],
|
|
242
|
+
Stop: []
|
|
243
|
+
};
|
|
244
|
+
for (const hook of this.generatedHooks) {
|
|
245
|
+
hooks[hook.hookType].push({
|
|
246
|
+
matcher: hook.matcher,
|
|
247
|
+
command: hook.command,
|
|
248
|
+
description: hook.description,
|
|
249
|
+
timeout: 5000
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
return hooks;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 记录 Rule 触发(用于跟踪)
|
|
256
|
+
*/
|
|
257
|
+
recordRuleHit(ruleId) {
|
|
258
|
+
const rule = this.ruleCandidates.get(ruleId);
|
|
259
|
+
if (rule) {
|
|
260
|
+
rule.hitCount++;
|
|
261
|
+
rule.lastHitAt = Date.now();
|
|
262
|
+
this.eventBus.emit('rule.hit', { ruleId, hitCount: rule.hitCount });
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* 获取当前状态
|
|
267
|
+
*/
|
|
268
|
+
getState() {
|
|
269
|
+
return this.state;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* 获取所有 Lesson Candidates
|
|
273
|
+
*/
|
|
274
|
+
getLessonCandidates() {
|
|
275
|
+
return Array.from(this.lessonCandidates.values());
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* 获取所有 Rule Candidates
|
|
279
|
+
*/
|
|
280
|
+
getRuleCandidates() {
|
|
281
|
+
return Array.from(this.ruleCandidates.values());
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* 获取所有生成的 Hooks
|
|
285
|
+
*/
|
|
286
|
+
getGeneratedHooks() {
|
|
287
|
+
return this.generatedHooks;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* 生成自改进报告
|
|
291
|
+
*/
|
|
292
|
+
generateReport() {
|
|
293
|
+
const lines = [
|
|
294
|
+
'=== Self-Improve Engine Report ===',
|
|
295
|
+
'',
|
|
296
|
+
'[STATE]',
|
|
297
|
+
` Lessons Extracted: ${this.state.lessonsExtracted}`,
|
|
298
|
+
` Lessons Verified: ${this.state.lessonsVerified}`,
|
|
299
|
+
` Rules Created: ${this.state.rulesCreated}`,
|
|
300
|
+
` Rules Active: ${this.state.rulesActive}`,
|
|
301
|
+
` Hooks Generated: ${this.state.hooksGenerated}`,
|
|
302
|
+
'',
|
|
303
|
+
'[TOP LESSONS]',
|
|
304
|
+
...this.getLessonCandidates().slice(0, 5).map(l => ` - ${l.pattern} (${l.frequency} occurrences, ${l.priority})`),
|
|
305
|
+
'',
|
|
306
|
+
'[ACTIVE RULES]',
|
|
307
|
+
...this.getRuleCandidates().filter(r => r.active).map(r => ` - ${r.name} (${r.hitCount} hits)`),
|
|
308
|
+
'',
|
|
309
|
+
'[GENERATED HOOKS]',
|
|
310
|
+
...this.generatedHooks.map(h => ` - ${h.hookType}: ${h.matcher} (${h.description})`),
|
|
311
|
+
''
|
|
312
|
+
];
|
|
313
|
+
return lines.join('\n');
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* 重置引擎状态
|
|
317
|
+
*/
|
|
318
|
+
reset() {
|
|
319
|
+
this.lessonCandidates.clear();
|
|
320
|
+
this.ruleCandidates.clear();
|
|
321
|
+
this.generatedHooks = [];
|
|
322
|
+
this.state = {
|
|
323
|
+
lessonsExtracted: 0,
|
|
324
|
+
lessonsVerified: 0,
|
|
325
|
+
rulesCreated: 0,
|
|
326
|
+
rulesActive: 0,
|
|
327
|
+
hooksGenerated: 0,
|
|
328
|
+
lastRunAt: 0
|
|
329
|
+
};
|
|
330
|
+
this.eventBus.emit('self-improve.reset', {});
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* 手动验证 Lesson(用于外部确认)
|
|
335
|
+
*/
|
|
336
|
+
export async function verifyLesson(engine, pattern) {
|
|
337
|
+
const candidates = engine.getLessonCandidates();
|
|
338
|
+
const candidate = candidates.find(c => c.pattern === pattern);
|
|
339
|
+
if (candidate) {
|
|
340
|
+
candidate.verified = true;
|
|
341
|
+
candidate.frequency += 1;
|
|
342
|
+
// 检查是否达到阈值晋升
|
|
343
|
+
if (candidate.frequency >= engine.getState().lessonsVerified) {
|
|
344
|
+
// 触发晋升流程
|
|
345
|
+
engine.recordRuleHit(`lesson-${pattern}`);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* 从多个会话运行自改进
|
|
351
|
+
*/
|
|
352
|
+
export async function runSelfImproveFromSessions(eventBus, sessionIds) {
|
|
353
|
+
const engine = new SelfImproveEngine(eventBus);
|
|
354
|
+
const states = [];
|
|
355
|
+
for (const sessionId of sessionIds) {
|
|
356
|
+
const state = await engine.run(sessionId);
|
|
357
|
+
states.push(state);
|
|
358
|
+
}
|
|
359
|
+
return states;
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=SelfImproveEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelfImproveEngine.js","sourceRoot":"","sources":["../../../src/workflow/evolution/SelfImproveEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { IEventBus } from '../../core/eventBus.js';
|
|
2
|
+
import type { VerificationResult } from '../types.js';
|
|
3
|
+
import { BrowserQACapability, type UserFlow, type QAResult } from '../../capabilities/BrowserQACapability.js';
|
|
4
|
+
/**
|
|
5
|
+
* E2E 测试配置
|
|
6
|
+
*/
|
|
7
|
+
export interface E2ETestConfig {
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
flows: UserFlow[];
|
|
10
|
+
timeoutMs: number;
|
|
11
|
+
retryCount: number;
|
|
12
|
+
screenshotDir: string;
|
|
13
|
+
accessibilityCheck: boolean;
|
|
14
|
+
performanceCheck: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* E2E 测试结果
|
|
18
|
+
*/
|
|
19
|
+
export interface E2ETestResult {
|
|
20
|
+
passed: boolean;
|
|
21
|
+
totalFlows: number;
|
|
22
|
+
passedFlows: number;
|
|
23
|
+
failedFlows: number;
|
|
24
|
+
results: QAResult[];
|
|
25
|
+
accessibilityIssues: number;
|
|
26
|
+
performanceMetrics?: {
|
|
27
|
+
avgLoadTimeMs: number;
|
|
28
|
+
maxLoadTimeMs: number;
|
|
29
|
+
};
|
|
30
|
+
report: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* E2E Test Runner
|
|
34
|
+
*
|
|
35
|
+
* 运行 E2E 测试并生成验证结果:
|
|
36
|
+
* 1. 执行用户流程测试
|
|
37
|
+
* 2. 检查 Console 错误
|
|
38
|
+
* 3. Accessibility 检查(可选)
|
|
39
|
+
* 4. 性能检查(可选)
|
|
40
|
+
* 5. 生成 Honest Delivery 报告
|
|
41
|
+
*/
|
|
42
|
+
export declare class E2ETestRunner {
|
|
43
|
+
private eventBus;
|
|
44
|
+
private browserQA;
|
|
45
|
+
private config;
|
|
46
|
+
constructor(eventBus: IEventBus, config: E2ETestConfig);
|
|
47
|
+
/**
|
|
48
|
+
* 运行完整 E2E 测试
|
|
49
|
+
*/
|
|
50
|
+
run(): Promise<E2ETestResult>;
|
|
51
|
+
/**
|
|
52
|
+
* 转换为 VerificationResult(用于 WorkflowEngine G8 门控)
|
|
53
|
+
*/
|
|
54
|
+
toVerificationResult(result: E2ETestResult): VerificationResult[];
|
|
55
|
+
/**
|
|
56
|
+
* 运行并生成 VerificationResult(用于 G8 门控)
|
|
57
|
+
*/
|
|
58
|
+
runForVerification(): Promise<VerificationResult[]>;
|
|
59
|
+
/**
|
|
60
|
+
* 添加自定义流程
|
|
61
|
+
*/
|
|
62
|
+
addFlow(flow: UserFlow): void;
|
|
63
|
+
/**
|
|
64
|
+
* 获取 MCP 工具调用序列(用于 Claude Code 实际执行)
|
|
65
|
+
*/
|
|
66
|
+
getMCPExecutionPlan(): {
|
|
67
|
+
flow: UserFlow;
|
|
68
|
+
calls: ReturnType<BrowserQACapability['getMCPCallSequence']>;
|
|
69
|
+
}[];
|
|
70
|
+
/**
|
|
71
|
+
* 快速验证(仅检查关键流程)
|
|
72
|
+
*/
|
|
73
|
+
quickVerify(): Promise<boolean>;
|
|
74
|
+
private sleep;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* E2E 测试配置预设
|
|
78
|
+
*/
|
|
79
|
+
export declare const E2EPresets: {
|
|
80
|
+
/**
|
|
81
|
+
* 快速测试(仅关键流程,无重试)
|
|
82
|
+
*/
|
|
83
|
+
quick: (baseUrl: string, flows: UserFlow[]) => E2ETestConfig;
|
|
84
|
+
/**
|
|
85
|
+
* 标准测试(完整流程,2次重试)
|
|
86
|
+
*/
|
|
87
|
+
standard: (baseUrl: string, flows: UserFlow[]) => E2ETestConfig;
|
|
88
|
+
/**
|
|
89
|
+
* 完整测试(所有检查,3次重试)
|
|
90
|
+
*/
|
|
91
|
+
full: (baseUrl: string, flows: UserFlow[]) => E2ETestConfig;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* G8 浏览器门控检查
|
|
95
|
+
*
|
|
96
|
+
* 用于 WorkflowEngine 的第 8 个门控(浏览器 QA)
|
|
97
|
+
*/
|
|
98
|
+
export declare function browserGateCheck(eventBus: IEventBus, baseUrl: string, flows: UserFlow[]): Promise<{
|
|
99
|
+
passed: boolean;
|
|
100
|
+
verifications: VerificationResult[];
|
|
101
|
+
report: string;
|
|
102
|
+
}>;
|