@hongmaple0820/scale-engine 0.10.0 → 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.
Files changed (40) hide show
  1. package/README.en.md +127 -196
  2. package/README.md +168 -1114
  3. package/dist/api/cli.js +2 -2
  4. package/dist/api/cli.js.map +1 -1
  5. package/dist/artifact/types.d.ts +1 -1
  6. package/dist/artifact/types.js.map +1 -1
  7. package/dist/capabilities/BrowserQACapability.d.ts +151 -0
  8. package/dist/capabilities/BrowserQACapability.js +344 -0
  9. package/dist/capabilities/BrowserQACapability.js.map +1 -0
  10. package/dist/cli/evolutionCommands.d.ts +112 -0
  11. package/dist/cli/evolutionCommands.js +246 -0
  12. package/dist/cli/evolutionCommands.js.map +1 -0
  13. package/dist/cli/phaseCommands.d.ts +9 -0
  14. package/dist/cli/phaseCommands.js +169 -48
  15. package/dist/cli/phaseCommands.js.map +1 -1
  16. package/dist/guardrails/OWASPDetector.d.ts +58 -0
  17. package/dist/guardrails/OWASPDetector.js +508 -0
  18. package/dist/guardrails/OWASPDetector.js.map +1 -0
  19. package/dist/workflow/ReviewAnalyzer.d.ts +5 -0
  20. package/dist/workflow/ReviewAnalyzer.js +194 -10
  21. package/dist/workflow/ReviewAnalyzer.js.map +1 -1
  22. package/dist/workflow/VerificationCommands.d.ts +4 -0
  23. package/dist/workflow/VerificationCommands.js +2 -0
  24. package/dist/workflow/VerificationCommands.js.map +1 -1
  25. package/dist/workflow/WorkflowEngine.js +1 -1
  26. package/dist/workflow/WorkflowEngine.js.map +1 -1
  27. package/dist/workflow/evolution/LessonExtractor.d.ts +90 -0
  28. package/dist/workflow/evolution/LessonExtractor.js +317 -0
  29. package/dist/workflow/evolution/LessonExtractor.js.map +1 -0
  30. package/dist/workflow/evolution/SelfImproveEngine.d.ts +156 -0
  31. package/dist/workflow/evolution/SelfImproveEngine.js +361 -0
  32. package/dist/workflow/evolution/SelfImproveEngine.js.map +1 -0
  33. package/dist/workflow/gates/GateSystem.d.ts +28 -2
  34. package/dist/workflow/gates/GateSystem.js +291 -82
  35. package/dist/workflow/gates/GateSystem.js.map +1 -1
  36. package/dist/workflow/qa/E2ETestRunner.d.ts +102 -0
  37. package/dist/workflow/qa/E2ETestRunner.js +227 -0
  38. package/dist/workflow/qa/E2ETestRunner.js.map +1 -0
  39. package/dist/workflow/types.d.ts +7 -0
  40. package/package.json +3 -3
@@ -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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"}
@@ -14,6 +14,16 @@ interface CommandResult {
14
14
  stdout: string;
15
15
  stderr: string;
16
16
  durationMs: number;
17
+ startedAt: number;
18
+ endedAt: number;
19
+ cwd: string;
20
+ }
21
+ export interface SecurityGateOptions {
22
+ rootDir?: string;
23
+ scanDirs?: string[];
24
+ maxFileBytes?: number;
25
+ maxFindings?: number;
26
+ strict?: boolean;
17
27
  }
18
28
  export declare function runShellCommand(command: string, timeout: number): Promise<CommandResult>;
19
29
  export declare class GateSystem {
@@ -49,11 +59,15 @@ export declare class PlanningGate implements IGate {
49
59
  private checkSpecDocument;
50
60
  }
51
61
  export declare class TDDGate implements IGate {
62
+ private evidencePath?;
63
+ private strict;
52
64
  stage: GateStage;
53
65
  name: string;
54
66
  description: string;
55
67
  requiredLevel: RequiredLevel;
68
+ constructor(evidencePath?: string | undefined, strict?: boolean);
56
69
  execute(): Promise<GateResult>;
70
+ private verifyEvidenceFile;
57
71
  }
58
72
  export declare class BuildGate implements IGate {
59
73
  private command;
@@ -96,9 +110,21 @@ export declare class SecurityGate implements IGate {
96
110
  name: string;
97
111
  description: string;
98
112
  requiredLevel: RequiredLevel;
113
+ private rootDir;
114
+ private scanDirs;
115
+ private maxFileBytes;
116
+ private maxFindings;
117
+ private strict;
118
+ constructor(options?: SecurityGateOptions);
99
119
  execute(): Promise<GateResult>;
100
- private detectSecrets;
120
+ private scan;
121
+ private scanFile;
101
122
  private walkDir;
102
- private containsSecret;
123
+ private rulesForFile;
124
+ private findEmptyCatchBlocks;
125
+ private summarize;
126
+ private isTestPath;
127
+ private isRuleDefinition;
128
+ private isSecurityTestFixture;
103
129
  }
104
130
  export {};