@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.
- package/README.en.md +127 -196
- package/README.md +168 -1114
- package/dist/api/cli.js +2 -2
- package/dist/api/cli.js.map +1 -1
- 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.d.ts +9 -0
- package/dist/cli/phaseCommands.js +169 -48
- 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/ReviewAnalyzer.d.ts +5 -0
- package/dist/workflow/ReviewAnalyzer.js +194 -10
- package/dist/workflow/ReviewAnalyzer.js.map +1 -1
- package/dist/workflow/VerificationCommands.d.ts +4 -0
- package/dist/workflow/VerificationCommands.js +2 -0
- package/dist/workflow/VerificationCommands.js.map +1 -1
- package/dist/workflow/WorkflowEngine.js +1 -1
- package/dist/workflow/WorkflowEngine.js.map +1 -1
- 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/gates/GateSystem.d.ts +28 -2
- package/dist/workflow/gates/GateSystem.js +291 -82
- package/dist/workflow/gates/GateSystem.js.map +1 -1
- 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/dist/workflow/types.d.ts +7 -0
- 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
|
|
120
|
+
private scan;
|
|
121
|
+
private scanFile;
|
|
101
122
|
private walkDir;
|
|
102
|
-
private
|
|
123
|
+
private rulesForFile;
|
|
124
|
+
private findEmptyCatchBlocks;
|
|
125
|
+
private summarize;
|
|
126
|
+
private isTestPath;
|
|
127
|
+
private isRuleDefinition;
|
|
128
|
+
private isSecurityTestFixture;
|
|
103
129
|
}
|
|
104
130
|
export {};
|