@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,317 @@
1
+ // SCALE Engine — Lesson Extractor
2
+ // 从会话 Defect 事件提取可复用的 Lessons
3
+ // 设计参考:docs/03-CORE-MODULES.md §3.6 + L6 Evolution
4
+ /**
5
+ * Lesson Extractor
6
+ *
7
+ * 从会话历史中提取可复用的 Lessons:
8
+ * 1. 查询 defect.opened 事件
9
+ * 2. 分析修复过程和根因
10
+ * 3. 提取 pattern-solution 对
11
+ * 4. 聚合高频模式
12
+ * 5. 生成 Lesson Candidates
13
+ */
14
+ export class LessonExtractor {
15
+ constructor(eventBus, minOccurrences = 2) {
16
+ this.minOccurrences = 2; // 成为 Lesson 的最小出现次数
17
+ this.eventBus = eventBus;
18
+ this.minOccurrences = minOccurrences;
19
+ }
20
+ /**
21
+ * 从会话提取 Lessons
22
+ */
23
+ async extractFromSession(sessionId) {
24
+ this.eventBus.emit('lesson.extract.start', { sessionId });
25
+ // 1. 查询 defect 相关事件
26
+ const defectEvents = await this.eventBus.query({
27
+ sessionId,
28
+ types: ['defect.opened', 'defect.resolved'],
29
+ limit: 50
30
+ });
31
+ if (defectEvents.length === 0) {
32
+ this.eventBus.emit('lesson.extract.empty', { sessionId });
33
+ return [];
34
+ }
35
+ // 2. 分析每个 Defect
36
+ const analyses = [];
37
+ for (const defectEvent of defectEvents.filter(e => e.type === 'defect.opened')) {
38
+ const analysis = await this.analyzeDefect(sessionId, defectEvent);
39
+ if (analysis) {
40
+ analyses.push(analysis);
41
+ }
42
+ }
43
+ // 3. 提取 Patterns
44
+ const patterns = this.identifyPatterns(analyses);
45
+ // 4. 聚合为 Lesson Candidates
46
+ const candidates = this.aggregateToLessons(patterns, analyses);
47
+ this.eventBus.emit('lesson.extract.end', {
48
+ sessionId,
49
+ defectsAnalyzed: analyses.length,
50
+ candidatesGenerated: candidates.length
51
+ });
52
+ return candidates;
53
+ }
54
+ /**
55
+ * 分析单个 Defect
56
+ */
57
+ async analyzeDefect(sessionId, defectEvent) {
58
+ const defect = defectEvent.payload;
59
+ if (!defect?.id)
60
+ return null;
61
+ // 查询该 defect 的修复过程
62
+ const fixEvents = await this.eventBus.query({
63
+ sessionId,
64
+ types: ['tool.completed', 'tool.failed'],
65
+ filter: (e) => {
66
+ const p = e.payload;
67
+ // 查找与缺陷修复相关的工具调用
68
+ return ['Edit', 'Write', 'Bash'].includes(p.tool);
69
+ },
70
+ limit: 20
71
+ });
72
+ // 计算修复时间和尝试次数
73
+ const openedAt = defect.createdAt ?? Date.now();
74
+ const resolvedEvents = await this.eventBus.query({
75
+ sessionId,
76
+ types: ['defect.resolved'],
77
+ filter: (e) => {
78
+ const p = e.payload;
79
+ return p.defectId === defect.id;
80
+ },
81
+ limit: 1
82
+ });
83
+ const resolvedAt = resolvedEvents[0]?.timestamp ?? Date.now();
84
+ const timeToFix = resolvedAt - openedAt;
85
+ // 分析根因
86
+ const rootCause = this.inferRootCause(defect, fixEvents);
87
+ const resolutionSteps = this.extractResolutionSteps(fixEvents);
88
+ // 识别模式
89
+ const patternsIdentified = this.extractPatternsFromFix(rootCause, resolutionSteps);
90
+ return {
91
+ defectId: defect.id,
92
+ rootCause,
93
+ resolutionSteps,
94
+ timeToFix,
95
+ attempts: fixEvents.filter(e => e.type === 'tool.failed').length + 1,
96
+ patternsIdentified
97
+ };
98
+ }
99
+ /**
100
+ * 推断根因
101
+ */
102
+ inferRootCause(defect, fixEvents) {
103
+ // 从缺陷 payload 和修复历史推断根因
104
+ const payload = defect.payload;
105
+ const symptom = payload?.symptom ?? '';
106
+ const title = defect.title ?? '';
107
+ // 常见根因模式
108
+ if (symptom.includes('undefined') || symptom.includes('null')) {
109
+ return 'Missing null check or initialization';
110
+ }
111
+ if (symptom.includes('type') || symptom.includes('TypeScript')) {
112
+ return 'Type mismatch or incorrect type definition';
113
+ }
114
+ if (symptom.includes('async') || symptom.includes('await')) {
115
+ return 'Async/await handling issue';
116
+ }
117
+ if (symptom.includes('import') || symptom.includes('module')) {
118
+ return 'Missing or incorrect import';
119
+ }
120
+ if (symptom.includes('test') && fixEvents.some(e => {
121
+ const p = e.payload;
122
+ return p.args?.command?.includes('test');
123
+ })) {
124
+ return 'Test assertion failure or test setup issue';
125
+ }
126
+ // 默认:从标题推断
127
+ return title ?? 'Unknown root cause';
128
+ }
129
+ /**
130
+ * 提取修复步骤
131
+ */
132
+ extractResolutionSteps(fixEvents) {
133
+ const steps = [];
134
+ for (const event of fixEvents) {
135
+ const p = event.payload;
136
+ if (p.tool === 'Edit' && p.args?.file_path) {
137
+ steps.push(`Edit ${p.args.file_path}`);
138
+ }
139
+ if (p.tool === 'Write' && p.args?.file_path) {
140
+ steps.push(`Write ${p.args.file_path}`);
141
+ }
142
+ if (p.tool === 'Bash' && p.args?.command) {
143
+ steps.push(`Run: ${p.args.command}`);
144
+ }
145
+ }
146
+ return steps;
147
+ }
148
+ /**
149
+ * 从修复过程提取模式
150
+ */
151
+ extractPatternsFromFix(rootCause, steps) {
152
+ const patterns = [];
153
+ // 根因到模式的映射
154
+ const rootCausePatterns = {
155
+ 'Missing null check or initialization': 'Always check for null/undefined before accessing properties',
156
+ 'Type mismatch or incorrect type definition': 'Use strict type checking and avoid type assertions',
157
+ 'Async/await handling issue': 'Always await async operations and handle promise errors',
158
+ 'Missing or incorrect import': 'Verify imports before using; check module exports',
159
+ 'Test assertion failure or test setup issue': 'Ensure test data and mocks are properly initialized'
160
+ };
161
+ if (rootCausePatterns[rootCause]) {
162
+ patterns.push(rootCausePatterns[rootCause]);
163
+ }
164
+ // 从修复步骤提取模式
165
+ for (const step of steps) {
166
+ if (step.includes('Edit') && patterns.length === 0) {
167
+ patterns.push(`Fix involved: ${step}`);
168
+ }
169
+ }
170
+ return patterns;
171
+ }
172
+ /**
173
+ * 识别重复模式
174
+ */
175
+ identifyPatterns(analyses) {
176
+ const patternMap = new Map();
177
+ for (const analysis of analyses) {
178
+ for (const pattern of analysis.patternsIdentified) {
179
+ const existing = patternMap.get(pattern) ?? [];
180
+ existing.push(analysis);
181
+ patternMap.set(pattern, existing);
182
+ }
183
+ }
184
+ return patternMap;
185
+ }
186
+ /**
187
+ * 聚合为 Lesson Candidates
188
+ */
189
+ aggregateToLessons(patternMap, analyses) {
190
+ const candidates = [];
191
+ for (const [pattern, relatedAnalyses] of patternMap.entries()) {
192
+ // 只有高频模式才成为 Lesson
193
+ if (relatedAnalyses.length < this.minOccurrences)
194
+ continue;
195
+ // 生成解决方案
196
+ const solutions = relatedAnalyses.map(a => a.resolutionSteps.join(' → '));
197
+ const commonSolution = this.findCommonSolution(solutions);
198
+ // 计算优先级
199
+ const avgTimeToFix = relatedAnalyses.reduce((sum, a) => sum + a.timeToFix, 0) / relatedAnalyses.length;
200
+ const totalAttempts = relatedAnalyses.reduce((sum, a) => sum + a.attempts, 0);
201
+ const priority = avgTimeToFix > 300000 || totalAttempts > 5 ? 'HIGH'
202
+ : avgTimeToFix > 60000 || totalAttempts > 2 ? 'MEDIUM'
203
+ : 'LOW';
204
+ candidates.push({
205
+ pattern,
206
+ solution: commonSolution,
207
+ context: this.generateContext(pattern, relatedAnalyses),
208
+ defectIds: relatedAnalyses.map(a => a.defectId),
209
+ frequency: relatedAnalyses.length,
210
+ verified: false, // 需要后续验证
211
+ priority
212
+ });
213
+ }
214
+ // 按频率和优先级排序
215
+ return candidates.sort((a, b) => {
216
+ if (a.priority !== b.priority) {
217
+ return a.priority === 'HIGH' ? -1 : 1;
218
+ }
219
+ return b.frequency - a.frequency;
220
+ });
221
+ }
222
+ /**
223
+ * 找到共同解决方案
224
+ */
225
+ findCommonSolution(solutions) {
226
+ if (solutions.length === 0)
227
+ return 'No solution found';
228
+ if (solutions.length === 1)
229
+ return solutions[0];
230
+ // 找出最短的共同路径
231
+ const steps = solutions[0].split(' → ');
232
+ const commonSteps = [];
233
+ for (const step of steps) {
234
+ if (solutions.every(s => s.includes(step))) {
235
+ commonSteps.push(step);
236
+ }
237
+ }
238
+ return commonSteps.length > 0 ? commonSteps.join(' → ') : solutions[0];
239
+ }
240
+ /**
241
+ * 生成上下文描述
242
+ */
243
+ generateContext(pattern, analyses) {
244
+ const avgFixTime = Math.round(analyses.reduce((s, a) => s + a.timeToFix, 0) / analyses.length / 1000);
245
+ return `This pattern occurred ${analyses.length} times with average fix time of ${avgFixTime}s. ` +
246
+ `Apply when: ${pattern}`;
247
+ }
248
+ /**
249
+ * 转换为 Lesson Artifact
250
+ */
251
+ toLessonArtifact(candidate) {
252
+ const lessonPayload = {
253
+ type: 'lesson',
254
+ };
255
+ return {
256
+ id: `lesson-${Date.now()}-${candidate.defectIds[0]}`,
257
+ type: 'Lesson',
258
+ version: 1,
259
+ title: candidate.pattern,
260
+ status: candidate.verified ? 'VERIFIED' : 'DRAFT',
261
+ statusHistory: [],
262
+ parents: [],
263
+ children: [],
264
+ contentRef: '',
265
+ payload: lessonPayload,
266
+ gates: [],
267
+ createdBy: { kind: 'system', component: 'LessonExtractor' },
268
+ createdAt: Date.now(),
269
+ updatedAt: Date.now(),
270
+ tags: [`priority:${candidate.priority}`, `frequency:${candidate.frequency}`],
271
+ labels: {},
272
+ };
273
+ }
274
+ /**
275
+ * 批量转换
276
+ */
277
+ toLessonArtifacts(candidates) {
278
+ return candidates.map(c => this.toLessonArtifact(c));
279
+ }
280
+ }
281
+ /**
282
+ * 从多个会话聚合 Lessons
283
+ */
284
+ export async function aggregateLessonsFromSessions(eventBus, sessionIds) {
285
+ const extractor = new LessonExtractor(eventBus);
286
+ const allCandidates = [];
287
+ for (const sessionId of sessionIds) {
288
+ const candidates = await extractor.extractFromSession(sessionId);
289
+ allCandidates.push(...candidates);
290
+ }
291
+ // 聚合相同模式的候选
292
+ const patternCounts = new Map();
293
+ for (const candidate of allCandidates) {
294
+ const existing = patternCounts.get(candidate.pattern) ?? [];
295
+ existing.push(candidate);
296
+ patternCounts.set(candidate.pattern, existing);
297
+ }
298
+ // 合并高频模式
299
+ const merged = [];
300
+ for (const [pattern, candidates] of patternCounts.entries()) {
301
+ const totalFrequency = candidates.reduce((s, c) => s + c.frequency, 0);
302
+ const allDefectIds = candidates.flatMap(c => c.defectIds);
303
+ merged.push({
304
+ pattern,
305
+ solution: candidates[0].solution,
306
+ context: candidates[0].context,
307
+ defectIds: allDefectIds,
308
+ frequency: totalFrequency,
309
+ verified: candidates.some(c => c.verified),
310
+ priority: candidates.some(c => c.priority === 'HIGH') ? 'HIGH'
311
+ : candidates.some(c => c.priority === 'MEDIUM') ? 'MEDIUM'
312
+ : 'LOW'
313
+ });
314
+ }
315
+ return merged.sort((a, b) => b.frequency - a.frequency);
316
+ }
317
+ //# sourceMappingURL=LessonExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LessonExtractor.js","sourceRoot":"","sources":["../../../src/workflow/evolution/LessonExtractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import type { IEventBus } from '../../core/eventBus.js';
2
+ import { type LessonCandidate } from './LessonExtractor.js';
3
+ /**
4
+ * Hook 配置格式(用于 settings.json)
5
+ */
6
+ interface HookConfig {
7
+ matcher: string;
8
+ command: string;
9
+ description?: string;
10
+ timeout?: number;
11
+ }
12
+ /**
13
+ * 自改进闭环状态
14
+ */
15
+ export interface SelfImproveState {
16
+ lessonsExtracted: number;
17
+ lessonsVerified: number;
18
+ rulesCreated: number;
19
+ rulesActive: number;
20
+ hooksGenerated: number;
21
+ lastRunAt: number;
22
+ }
23
+ /**
24
+ * Rule 候选
25
+ */
26
+ export interface RuleCandidate {
27
+ id: string;
28
+ name: string;
29
+ pattern: RegExp | string;
30
+ severity: 'block' | 'warn' | 'info';
31
+ description: string;
32
+ remediation: string;
33
+ lessonId: string;
34
+ hitCount: number;
35
+ lastHitAt: number;
36
+ active: boolean;
37
+ }
38
+ /**
39
+ * Hook 生成结果
40
+ */
41
+ export interface HookGenerationResult {
42
+ hookType: 'PreToolUse' | 'PostToolUse' | 'Stop';
43
+ matcher: string;
44
+ command: string;
45
+ description: string;
46
+ ruleId: string;
47
+ }
48
+ /**
49
+ * 自改进阈值配置
50
+ */
51
+ export interface SelfImproveThresholds {
52
+ lessonVerificationThreshold: number;
53
+ ruleActivationThreshold: number;
54
+ hookGenerationThreshold: number;
55
+ maxHooks: number;
56
+ }
57
+ /**
58
+ * Self-Improve Engine
59
+ *
60
+ * 实现自改进闭环:
61
+ * 1. Defect → Lesson: 从缺陷提取可复用教训
62
+ * 2. Lesson → Rule: 经过验证的教训转化为规则
63
+ * 3. Rule → Hook: 高频规则转化为自动化 Hook
64
+ *
65
+ * 闭环流程:
66
+ * - Lesson 需要 verified 3 次才能晋升为 Rule Candidate
67
+ * - Rule 需要 hit 10 换才能晋升为 Hook Candidate
68
+ * - Hook 生成后自动注册到 Gateway
69
+ */
70
+ export declare class SelfImproveEngine {
71
+ private eventBus;
72
+ private lessonExtractor;
73
+ private thresholds;
74
+ private state;
75
+ private lessonCandidates;
76
+ private ruleCandidates;
77
+ private generatedHooks;
78
+ constructor(eventBus: IEventBus, thresholds?: Partial<SelfImproveThresholds>);
79
+ /**
80
+ * 运行自改进闭环
81
+ */
82
+ run(sessionId: string): Promise<SelfImproveState>;
83
+ /**
84
+ * Phase 1: 从会话提取 Lessons
85
+ */
86
+ private extractLessons;
87
+ /**
88
+ * Phase 2: 验证并晋升 Lessons 为 Rules
89
+ */
90
+ private verifyAndPromoteLessons;
91
+ /**
92
+ * 创建 Rule Candidate
93
+ */
94
+ private createRuleCandidate;
95
+ /**
96
+ * 将模式字符串转换为 RegExp
97
+ */
98
+ private patternToRegExp;
99
+ /**
100
+ * Phase 3: 激活 Rules 并跟踪触发次数
101
+ */
102
+ private activateRules;
103
+ /**
104
+ * Phase 4: 从高频 Rules 生成 Hooks
105
+ */
106
+ private generateHooksFromRules;
107
+ /**
108
+ * 从 Rule 生成 Hook 配置
109
+ */
110
+ private generateHookFromRule;
111
+ /**
112
+ * 生成 Hook 检查命令
113
+ */
114
+ private generateHookCommand;
115
+ /**
116
+ * 获取生成的 Hooks 配置(用于注册到 settings.json)
117
+ */
118
+ getGeneratedHooksConfig(): Record<string, HookConfig[]>;
119
+ /**
120
+ * 记录 Rule 触发(用于跟踪)
121
+ */
122
+ recordRuleHit(ruleId: string): void;
123
+ /**
124
+ * 获取当前状态
125
+ */
126
+ getState(): SelfImproveState;
127
+ /**
128
+ * 获取所有 Lesson Candidates
129
+ */
130
+ getLessonCandidates(): LessonCandidate[];
131
+ /**
132
+ * 获取所有 Rule Candidates
133
+ */
134
+ getRuleCandidates(): RuleCandidate[];
135
+ /**
136
+ * 获取所有生成的 Hooks
137
+ */
138
+ getGeneratedHooks(): HookGenerationResult[];
139
+ /**
140
+ * 生成自改进报告
141
+ */
142
+ generateReport(): string;
143
+ /**
144
+ * 重置引擎状态
145
+ */
146
+ reset(): void;
147
+ }
148
+ /**
149
+ * 手动验证 Lesson(用于外部确认)
150
+ */
151
+ export declare function verifyLesson(engine: SelfImproveEngine, pattern: string): Promise<void>;
152
+ /**
153
+ * 从多个会话运行自改进
154
+ */
155
+ export declare function runSelfImproveFromSessions(eventBus: IEventBus, sessionIds: string[]): Promise<SelfImproveState[]>;
156
+ export {};