@spaceflow/review 0.29.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.
- package/CHANGELOG.md +533 -0
- package/README.md +124 -0
- package/dist/551.js +9 -0
- package/dist/index.js +5704 -0
- package/package.json +50 -0
- package/src/README.md +364 -0
- package/src/__mocks__/@anthropic-ai/claude-agent-sdk.js +3 -0
- package/src/__mocks__/json-stringify-pretty-compact.ts +4 -0
- package/src/deletion-impact.service.spec.ts +974 -0
- package/src/deletion-impact.service.ts +879 -0
- package/src/dto/mcp.dto.ts +42 -0
- package/src/index.ts +32 -0
- package/src/issue-verify.service.spec.ts +460 -0
- package/src/issue-verify.service.ts +309 -0
- package/src/locales/en/review.json +31 -0
- package/src/locales/index.ts +11 -0
- package/src/locales/zh-cn/review.json +31 -0
- package/src/parse-title-options.spec.ts +251 -0
- package/src/parse-title-options.ts +185 -0
- package/src/review-report/formatters/deletion-impact.formatter.ts +144 -0
- package/src/review-report/formatters/index.ts +4 -0
- package/src/review-report/formatters/json.formatter.ts +8 -0
- package/src/review-report/formatters/markdown.formatter.ts +291 -0
- package/src/review-report/formatters/terminal.formatter.ts +130 -0
- package/src/review-report/index.ts +4 -0
- package/src/review-report/review-report.module.ts +8 -0
- package/src/review-report/review-report.service.ts +58 -0
- package/src/review-report/types.ts +26 -0
- package/src/review-spec/index.ts +3 -0
- package/src/review-spec/review-spec.module.ts +10 -0
- package/src/review-spec/review-spec.service.spec.ts +1543 -0
- package/src/review-spec/review-spec.service.ts +902 -0
- package/src/review-spec/types.ts +143 -0
- package/src/review.command.ts +244 -0
- package/src/review.config.ts +58 -0
- package/src/review.mcp.ts +184 -0
- package/src/review.module.ts +52 -0
- package/src/review.service.spec.ts +3007 -0
- package/src/review.service.ts +2603 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +34 -0
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@spaceflow/review",
|
|
3
|
+
"version": "0.29.1",
|
|
4
|
+
"description": "Spaceflow 代码审查插件,使用 LLM 对 PR 代码进行自动审查",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Lydanne",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Lydanne/spaceflow.git",
|
|
10
|
+
"directory": "extensions/review"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"micromatch": "^4.0.8"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@nestjs/testing": "^11.0.1",
|
|
22
|
+
"@swc/core": "1.15.3",
|
|
23
|
+
"@types/micromatch": "^4.0.9",
|
|
24
|
+
"@types/node": "^22.15.0",
|
|
25
|
+
"typescript": "^5.7.3",
|
|
26
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
27
|
+
"unplugin-swc": "^1.5.9",
|
|
28
|
+
"vitest": "^4.0.18",
|
|
29
|
+
"@spaceflow/cli": "0.19.2"
|
|
30
|
+
},
|
|
31
|
+
"peerDependencies": {
|
|
32
|
+
"@nestjs/common": "^11.0.1",
|
|
33
|
+
"@nestjs/config": "^4.0.2",
|
|
34
|
+
"@nestjs/swagger": "^11.2.6",
|
|
35
|
+
"class-transformer": "^0.5.1",
|
|
36
|
+
"class-validator": "^0.14.3",
|
|
37
|
+
"nest-commander": "^3.20.1",
|
|
38
|
+
"@spaceflow/core": "0.1.2"
|
|
39
|
+
},
|
|
40
|
+
"spaceflow": {
|
|
41
|
+
"type": "flow",
|
|
42
|
+
"entry": "."
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "spaceflow build",
|
|
46
|
+
"dev": "spaceflow dev",
|
|
47
|
+
"test": "vitest run",
|
|
48
|
+
"test:cov": "vitest run --coverage"
|
|
49
|
+
}
|
|
50
|
+
}
|
package/src/README.md
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
# Review 模块
|
|
2
|
+
|
|
3
|
+
Review 是 spaceflow 的核心模块,提供基于 LLM 的自动化代码审查功能。支持在 GitHub Actions CI 环境中运行,也可在本地命令行使用。
|
|
4
|
+
|
|
5
|
+
## 目录结构
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
review/
|
|
9
|
+
├── index.ts # 模块导出入口
|
|
10
|
+
├── review.module.ts # NestJS 模块定义
|
|
11
|
+
├── review.command.ts # CLI 命令定义
|
|
12
|
+
├── review.service.ts # 核心审查服务
|
|
13
|
+
├── review.service.spec.ts # 审查服务单元测试
|
|
14
|
+
├── issue-verify.service.ts # 历史问题验证服务
|
|
15
|
+
├── issue-verify.service.spec.ts # 验证服务单元测试
|
|
16
|
+
├── deletion-impact.service.ts # 删除代码影响分析服务
|
|
17
|
+
├── deletion-impact.service.spec.ts # 删除分析服务单元测试
|
|
18
|
+
├── parse-title-options.ts # PR 标题参数解析
|
|
19
|
+
├── parse-title-options.spec.ts # 标题解析单元测试
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 模块依赖
|
|
23
|
+
|
|
24
|
+
```text
|
|
25
|
+
ReviewModule
|
|
26
|
+
├── ConfigModule # 配置管理
|
|
27
|
+
├── GitProviderModule # Git Provider 适配器
|
|
28
|
+
├── ClaudeSetupModule # Claude CLI 配置
|
|
29
|
+
├── ReviewSpecModule # 审查规范加载
|
|
30
|
+
├── ReviewReportModule # 审查报告格式化
|
|
31
|
+
├── GitSdkModule # Git 命令封装
|
|
32
|
+
└── LlmProxyModule # LLM 统一代理(支持 OpenAI/Claude/Gemini)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## 核心功能
|
|
36
|
+
|
|
37
|
+
### 1. ReviewCommand
|
|
38
|
+
|
|
39
|
+
CLI 命令入口,支持以下参数:
|
|
40
|
+
|
|
41
|
+
| 参数 | 简写 | 说明 |
|
|
42
|
+
| --------------------------------- | ---- | ------------------------------------- |
|
|
43
|
+
| `--dry-run` | `-d` | 仅打印将要执行的操作,不实际提交评论 |
|
|
44
|
+
| `--ci` | `-c` | 在 CI 环境中运行 |
|
|
45
|
+
| `--pr-number <number>` | `-p` | PR 编号 |
|
|
46
|
+
| `--base <ref>` | `-b` | 基准分支/tag |
|
|
47
|
+
| `--head <ref>` | | 目标分支/tag |
|
|
48
|
+
| `--verbose [level]` | `-v` | 详细输出 (1: 过程日志, 2: 含提示词) |
|
|
49
|
+
| `--includes <patterns...>` | `-i` | 文件 glob 过滤模式 |
|
|
50
|
+
| `--llm-mode <mode>` | `-l` | LLM 模式: claude-code, openai, gemini |
|
|
51
|
+
| `--files <files...>` | `-f` | 仅审查指定文件 |
|
|
52
|
+
| `--commits <commits...>` | | 仅审查指定 commits |
|
|
53
|
+
| `--verify-fixes` | | 验证历史问题是否已修复 |
|
|
54
|
+
| `--no-verify-fixes` | | 禁用历史问题验证 |
|
|
55
|
+
| `--verify-concurrency <n>` | | 验证并发数(默认 10) |
|
|
56
|
+
| `--analyze-deletions` | | 分析删除代码影响 |
|
|
57
|
+
| `--deletion-only` | | 仅执行删除代码分析 |
|
|
58
|
+
| `--deletion-analysis-mode <mode>` | | 删除分析模式: openai, claude-code |
|
|
59
|
+
| `--output-format <format>` | `-o` | 输出格式: markdown, terminal, json |
|
|
60
|
+
| `--generate-description` | | 使用 AI 生成 PR 功能描述 |
|
|
61
|
+
|
|
62
|
+
**环境变量**:
|
|
63
|
+
|
|
64
|
+
- `GITHUB_TOKEN`: GitHub API Token
|
|
65
|
+
- `GITHUB_REPOSITORY`: 仓库名称 (owner/repo 格式)
|
|
66
|
+
- `GITHUB_REF_NAME`: 当前分支名称
|
|
67
|
+
- `GITHUB_EVENT_PATH`: 事件文件路径
|
|
68
|
+
|
|
69
|
+
### 2. ReviewService
|
|
70
|
+
|
|
71
|
+
核心审查服务,主要功能:
|
|
72
|
+
|
|
73
|
+
#### 2.1 审查流程
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
getContextFromEnv() # 从环境变量/配置构建上下文
|
|
77
|
+
↓
|
|
78
|
+
execute() # 执行审查主流程
|
|
79
|
+
↓
|
|
80
|
+
┌───────────────────────────────────────┐
|
|
81
|
+
│ 1. 加载审查规范 (ReviewSpec) │
|
|
82
|
+
│ 2. 获取 PR/分支变更信息 │
|
|
83
|
+
│ 3. 过滤文件 (files/commits/includes) │
|
|
84
|
+
│ 4. 获取文件内容并构建行号-commit 映射 │
|
|
85
|
+
│ 5. 构建审查提示词 │
|
|
86
|
+
│ 6. 并行调用 LLM 审查各文件 │
|
|
87
|
+
│ 7. 过滤/格式化审查结果 │
|
|
88
|
+
│ 8. 验证历史问题修复状态 │
|
|
89
|
+
│ 9. 提交/更新 PR 评论 │
|
|
90
|
+
│ 10. 可选:删除代码影响分析 │
|
|
91
|
+
└───────────────────────────────────────┘
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### 2.2 审查结果 Schema
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
interface ReviewResult {
|
|
98
|
+
success: boolean;
|
|
99
|
+
description: string; // PR 功能描述
|
|
100
|
+
issues: ReviewIssue[]; // 发现的问题列表
|
|
101
|
+
summary: FileSummary[]; // 各文件审查总结
|
|
102
|
+
deletionImpact?: DeletionImpactResult; // 删除代码影响
|
|
103
|
+
round: number; // 审查轮次
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface ReviewIssue {
|
|
107
|
+
file: string; // 文件路径
|
|
108
|
+
line: string; // 行号 (如 "123" 或 "123-125")
|
|
109
|
+
ruleId: string; // 规则 ID
|
|
110
|
+
specFile: string; // 规则来源文件
|
|
111
|
+
reason: string; // 问题描述
|
|
112
|
+
suggestion?: string; // 修改建议
|
|
113
|
+
severity?: "error" | "warn"; // 严重程度
|
|
114
|
+
commit?: string; // 相关 commit SHA
|
|
115
|
+
code?: string; // 问题代码片段
|
|
116
|
+
date?: string; // 发现时间
|
|
117
|
+
fixed?: string; // 修复时间
|
|
118
|
+
valid?: "true" | "false"; // 问题有效性
|
|
119
|
+
round?: number; // 发现轮次
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
#### 2.3 关键方法
|
|
124
|
+
|
|
125
|
+
| 方法 | 说明 |
|
|
126
|
+
| ----------------------------- | ------------------------------ |
|
|
127
|
+
| `getContextFromEnv()` | 从环境变量和配置构建审查上下文 |
|
|
128
|
+
| `execute()` | 执行完整审查流程 |
|
|
129
|
+
| `executeDeletionOnly()` | 仅执行删除代码分析 |
|
|
130
|
+
| `buildReviewPrompt()` | 为每个文件构建审查提示词 |
|
|
131
|
+
| `runLLMReview()` | 调用 LLM 执行审查 |
|
|
132
|
+
| `callLLM()` | 并行审查多个文件 |
|
|
133
|
+
| `reviewSingleFile()` | 审查单个文件 |
|
|
134
|
+
| `getFileContents()` | 获取文件内容并构建行号映射 |
|
|
135
|
+
| `buildLineCommitMap()` | 构建行号到 commit 的映射 |
|
|
136
|
+
| `filterDuplicateIssues()` | 过滤重复问题 |
|
|
137
|
+
| `postOrUpdateReviewComment()` | 发布/更新 PR 评论 |
|
|
138
|
+
| `generatePrDescription()` | AI 生成 PR 功能描述 |
|
|
139
|
+
|
|
140
|
+
### 3. IssueVerifyService
|
|
141
|
+
|
|
142
|
+
历史问题验证服务,用于检查之前发现的问题是否已被修复。
|
|
143
|
+
|
|
144
|
+
#### 3.1 验证流程
|
|
145
|
+
|
|
146
|
+
```text
|
|
147
|
+
verifyIssueFixes()
|
|
148
|
+
↓
|
|
149
|
+
┌─────────────────────────────────────┐
|
|
150
|
+
│ 1. 跳过已修复/无效的问题 │
|
|
151
|
+
│ 2. 检查文件是否已删除 │
|
|
152
|
+
│ 3. 并行调用 LLM 验证各问题 │
|
|
153
|
+
│ 4. 更新问题的 fixed/valid 状态 │
|
|
154
|
+
└─────────────────────────────────────┘
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### 3.2 验证结果
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
interface VerifyResult {
|
|
161
|
+
fixed: boolean; // 问题是否已修复
|
|
162
|
+
valid: boolean; // 问题是否有效(非误报)
|
|
163
|
+
reason: string; // 判断依据
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### 4. DeletionImpactService
|
|
168
|
+
|
|
169
|
+
删除代码影响分析服务,评估删除代码可能带来的风险。
|
|
170
|
+
|
|
171
|
+
#### 4.1 分析流程
|
|
172
|
+
|
|
173
|
+
```text
|
|
174
|
+
analyzeDeletionImpact()
|
|
175
|
+
↓
|
|
176
|
+
┌─────────────────────────────────────┐
|
|
177
|
+
│ 1. 获取删除的代码块 │
|
|
178
|
+
│ - Git Provider API 模式:从 PR diff 获取 │
|
|
179
|
+
│ - Git Diff 模式:本地 git 命令 │
|
|
180
|
+
│ 2. 查找代码引用关系 (git grep) │
|
|
181
|
+
│ 3. 调用 LLM 分析影响 │
|
|
182
|
+
│ - OpenAI 模式:标准 chat │
|
|
183
|
+
│ - Claude Agent 模式:可用工具 │
|
|
184
|
+
└─────────────────────────────────────┘
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
#### 4.2 风险等级
|
|
188
|
+
|
|
189
|
+
| 等级 | 说明 |
|
|
190
|
+
| -------- | ---------------------------- |
|
|
191
|
+
| `high` | 可能导致编译错误或运行时异常 |
|
|
192
|
+
| `medium` | 可能影响部分功能行为 |
|
|
193
|
+
| `low` | 影响较小 |
|
|
194
|
+
| `none` | 无影响(清理无用代码) |
|
|
195
|
+
|
|
196
|
+
#### 4.3 分析结果
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
interface DeletionImpactResult {
|
|
200
|
+
impacts: DeletionImpact[];
|
|
201
|
+
summary: string;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
interface DeletionImpact {
|
|
205
|
+
file: string; // 被删除代码所在文件
|
|
206
|
+
deletedCode: string; // 删除代码摘要
|
|
207
|
+
riskLevel: "high" | "medium" | "low" | "none";
|
|
208
|
+
affectedFiles: string[]; // 可能受影响的文件
|
|
209
|
+
reason: string; // 影响分析说明
|
|
210
|
+
suggestion?: string; // 建议处理方式
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### 5. parseTitleOptions
|
|
215
|
+
|
|
216
|
+
从 PR 标题解析命令参数,支持在标题末尾添加 `[/ai-review ...]` 格式的参数。
|
|
217
|
+
|
|
218
|
+
**示例**:
|
|
219
|
+
|
|
220
|
+
```text
|
|
221
|
+
feat: 添加新功能 [/ai-review -l openai -v 2]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
**支持的参数**:
|
|
225
|
+
|
|
226
|
+
- `-l, --llm-mode <mode>`: LLM 模式
|
|
227
|
+
- `-v, --verbose [level]`: 详细输出级别
|
|
228
|
+
- `-d, --dry-run`: 仅打印不执行
|
|
229
|
+
- `-i, --includes <pattern>`: 文件过滤模式
|
|
230
|
+
- `--verify-fixes` / `--no-verify-fixes`: 历史问题验证
|
|
231
|
+
- `--analyze-deletions`: 分析删除代码
|
|
232
|
+
- `--deletion-only`: 仅执行删除分析
|
|
233
|
+
- `--deletion-analysis-mode <mode>`: 删除分析模式
|
|
234
|
+
|
|
235
|
+
## 配置项
|
|
236
|
+
|
|
237
|
+
在 `spaceflow.json` 中配置:
|
|
238
|
+
|
|
239
|
+
```javascript
|
|
240
|
+
module.exports = {
|
|
241
|
+
review: {
|
|
242
|
+
// LLM 模式:claude-code, openai, gemini
|
|
243
|
+
llmMode: "openai",
|
|
244
|
+
|
|
245
|
+
// 文件过滤模式
|
|
246
|
+
includes: ["**/*.ts", "**/*.js"],
|
|
247
|
+
|
|
248
|
+
// 是否验证历史问题
|
|
249
|
+
verifyFixes: true,
|
|
250
|
+
verifyFixesConcurrency: 10,
|
|
251
|
+
|
|
252
|
+
// 删除代码分析
|
|
253
|
+
analyzeDeletions: false,
|
|
254
|
+
deletionAnalysisMode: "openai",
|
|
255
|
+
|
|
256
|
+
// 并发和超时配置
|
|
257
|
+
concurrency: 5,
|
|
258
|
+
timeout: 60000,
|
|
259
|
+
retries: 0,
|
|
260
|
+
retryDelay: 1000,
|
|
261
|
+
|
|
262
|
+
// 是否生成 PR 描述
|
|
263
|
+
generateDescription: false,
|
|
264
|
+
|
|
265
|
+
// 是否启用行级评论
|
|
266
|
+
lineComments: false,
|
|
267
|
+
|
|
268
|
+
// OpenAI 配置
|
|
269
|
+
openai: {
|
|
270
|
+
apiKey: "sk-xxx",
|
|
271
|
+
baseUrl: "https://api.openai.com/v1",
|
|
272
|
+
model: "gpt-4o",
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
// Claude Code 配置
|
|
276
|
+
claudeCode: {
|
|
277
|
+
// Claude CLI 配置
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## 使用示例
|
|
284
|
+
|
|
285
|
+
### CI 环境
|
|
286
|
+
|
|
287
|
+
```yaml
|
|
288
|
+
# .github/workflows/ai-review.yml
|
|
289
|
+
name: AI Review
|
|
290
|
+
on:
|
|
291
|
+
pull_request:
|
|
292
|
+
types: [opened, synchronize]
|
|
293
|
+
|
|
294
|
+
jobs:
|
|
295
|
+
review:
|
|
296
|
+
runs-on: ubuntu-latest
|
|
297
|
+
steps:
|
|
298
|
+
- uses: actions/checkout@v4
|
|
299
|
+
- name: Review
|
|
300
|
+
run: npx spaceflow review --ci -l openai
|
|
301
|
+
env:
|
|
302
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 本地命令行
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
# 审查 PR
|
|
309
|
+
npx spaceflow review -p 123 -l openai
|
|
310
|
+
|
|
311
|
+
# 审查两个分支之间的差异
|
|
312
|
+
npx spaceflow review -b main --head feature/xxx -l openai
|
|
313
|
+
|
|
314
|
+
# 仅审查指定文件
|
|
315
|
+
npx spaceflow review -f src/app.ts -l openai
|
|
316
|
+
|
|
317
|
+
# 详细输出
|
|
318
|
+
npx spaceflow review -p 123 -l openai -v 2
|
|
319
|
+
|
|
320
|
+
# 仅分析删除代码
|
|
321
|
+
npx spaceflow review -p 123 --deletion-only -l openai
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## 审查规范
|
|
325
|
+
|
|
326
|
+
审查规范文件位于 `.spaceflow/review-spec/` 目录,使用 Markdown 格式定义规则。
|
|
327
|
+
|
|
328
|
+
详见 [ReviewSpec 模块文档](../../shared/review-spec/README.md)。
|
|
329
|
+
|
|
330
|
+
## 输出格式
|
|
331
|
+
|
|
332
|
+
### Markdown 格式(PR 评论)
|
|
333
|
+
|
|
334
|
+
包含以下部分:
|
|
335
|
+
|
|
336
|
+
- PR 功能描述
|
|
337
|
+
- 问题列表(按严重程度分组)
|
|
338
|
+
- 各文件审查总结
|
|
339
|
+
- 删除代码影响分析(如启用)
|
|
340
|
+
- 隐藏的 JSON 数据(用于增量审查)
|
|
341
|
+
|
|
342
|
+
### Terminal 格式
|
|
343
|
+
|
|
344
|
+
彩色终端输出,适合本地调试。
|
|
345
|
+
|
|
346
|
+
### JSON 格式
|
|
347
|
+
|
|
348
|
+
结构化 JSON 输出,适合程序处理。
|
|
349
|
+
|
|
350
|
+
## 增量审查
|
|
351
|
+
|
|
352
|
+
AI Review 支持增量审查,即在同一个 PR 上多次运行时:
|
|
353
|
+
|
|
354
|
+
1. **问题去重**:不会重复报告已存在的问题
|
|
355
|
+
2. **修复验证**:自动验证历史问题是否已修复
|
|
356
|
+
3. **轮次追踪**:记录每个问题的发现轮次
|
|
357
|
+
4. **评论更新**:更新而非新增评论
|
|
358
|
+
|
|
359
|
+
## 注意事项
|
|
360
|
+
|
|
361
|
+
1. **Token 限制**:单个文件审查的提示词长度受 LLM token 限制
|
|
362
|
+
2. **并发控制**:可通过 `concurrency` 配置控制并行审查数量
|
|
363
|
+
3. **超时处理**:可通过 `timeout` 配置单文件审查超时时间
|
|
364
|
+
4. **重试机制**:可通过 `retries` 和 `retryDelay` 配置重试策略
|