1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
| // review-strategy.ts
enum ReviewLayer {
// 第一层:快速扫描(5秒)
QUICK_SCAN = 'quick-scan',
// 第二层:深度分析(30秒)
DEEP_ANALYSIS = 'deep-analysis',
// 第三层:综合评估(1分钟)
COMPREHENSIVE = 'comprehensive'
}
interface ReviewConfig {
layer: ReviewLayer
focus: string[] // 关注的审查点
threshold: number // 问题严重程度阈值
}
// PR分级审查
const prSizeCategories = {
small: { maxFiles: 5, maxChanges: 100 },
medium: { maxFiles: 20, maxChanges: 500 },
large: { maxFiles: 50, maxChanges: 2000 },
xlarge: { maxFiles: Infinity, maxChanges: Infinity }
}
function getReviewStrategy(prStats: PRStats): ReviewConfig {
const category = Object.entries(prSizeCategories)
.find(([_, limits]) =>
prStats.files <= limits.maxFiles &&
prStats.changes <= limits.maxChanges
)?.[0] || 'xlarge'
const strategies = {
small: {
layer: ReviewLayer.COMPREHENSIVE,
focus: ['all', 'security', 'performance', 'style'],
threshold: 0 // 所有问题都要看
},
medium: {
layer: ReviewLayer.DEEP_ANALYSIS,
focus: ['security', 'logic', 'performance'],
threshold: 2 // 只关注严重问题
},
large: {
layer: ReviewLayer.QUICK_SCAN,
focus: ['security', 'critical-bugs'],
threshold: 3 // 只看关键问题
},
xlarge: {
layer: ReviewLayer.QUICK_SCAN,
focus: ['security'],
threshold: 4 // 只看安全漏洞
}
}
return strategies[category]
}
|