@hongmaple0820/scale-engine 0.10.1 → 0.11.1

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,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
+ }>;