cfix 1.0.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/.env.example +69 -0
- package/README.md +1590 -0
- package/bin/cfix +14 -0
- package/bin/cfix.cmd +6 -0
- package/cli/commands/config.js +58 -0
- package/cli/commands/doctor.js +240 -0
- package/cli/commands/fix.js +211 -0
- package/cli/commands/help.js +62 -0
- package/cli/commands/init.js +226 -0
- package/cli/commands/logs.js +161 -0
- package/cli/commands/monitor.js +151 -0
- package/cli/commands/project.js +331 -0
- package/cli/commands/service.js +133 -0
- package/cli/commands/status.js +115 -0
- package/cli/commands/task.js +412 -0
- package/cli/commands/version.js +19 -0
- package/cli/index.js +269 -0
- package/cli/lib/config-manager.js +612 -0
- package/cli/lib/formatter.js +224 -0
- package/cli/lib/process-manager.js +233 -0
- package/cli/lib/service-client.js +271 -0
- package/cli/scripts/install-completion.js +133 -0
- package/package.json +85 -0
- package/public/monitor.html +1096 -0
- package/scripts/completion.bash +87 -0
- package/scripts/completion.zsh +102 -0
- package/src/assets/README.md +32 -0
- package/src/assets/error.png +0 -0
- package/src/assets/icon.png +0 -0
- package/src/assets/success.png +0 -0
- package/src/claude-cli-service.js +216 -0
- package/src/config/index.js +69 -0
- package/src/database/manager.js +391 -0
- package/src/database/migration.js +252 -0
- package/src/git-service.js +1278 -0
- package/src/index.js +1658 -0
- package/src/logger.js +139 -0
- package/src/metrics/collector.js +184 -0
- package/src/middleware/auth.js +86 -0
- package/src/middleware/rate-limit.js +85 -0
- package/src/queue/integration-example.js +283 -0
- package/src/queue/task-queue.js +333 -0
- package/src/services/notification-limiter.js +48 -0
- package/src/services/notification-service.js +115 -0
- package/src/services/system-notifier.js +130 -0
- package/src/task-manager.js +289 -0
- package/src/utils/exec.js +87 -0
- package/src/utils/project-lock.js +246 -0
- package/src/utils/retry.js +110 -0
- package/src/utils/sanitizer.js +174 -0
- package/src/websocket/notifier.js +363 -0
- package/src/wechat-notifier.js +97 -0
package/README.md
ADDED
|
@@ -0,0 +1,1590 @@
|
|
|
1
|
+
# Claude CLI 自动修复服务
|
|
2
|
+
|
|
3
|
+
基于 Claude CLI 的自动化代码修复服务,支持通过 HTTP 接口触发自动修复、提交和推送。
|
|
4
|
+
|
|
5
|
+
## ✨ 特性
|
|
6
|
+
|
|
7
|
+
### 核心功能
|
|
8
|
+
- 🤖 使用 Claude Sonnet 4.5 进行智能代码修复
|
|
9
|
+
- 🔧 支持多种工具调用(读文件、写文件、搜索代码等)
|
|
10
|
+
- 📦 自动 Git 操作(创建分支、提交、推送)
|
|
11
|
+
- 📢 企业微信通知集成
|
|
12
|
+
- 🧪 可选的测试验证
|
|
13
|
+
- 🌐 RESTful API 接口(基于 Koa 框架)
|
|
14
|
+
- 💾 任务持久化存储(重启服务后仍可查询历史任务)
|
|
15
|
+
- 🌍 支持跨域访问(CORS)
|
|
16
|
+
- ⚡ 高性能异步架构
|
|
17
|
+
|
|
18
|
+
### 安全与监控(v2.1 新增)
|
|
19
|
+
- 🔐 **API 认证**:支持 API Key 和 IP 白名单
|
|
20
|
+
- 🛡️ **输入验证**:防止命令注入、路径遍历等安全漏洞
|
|
21
|
+
- ⏱️ **请求频率限制**:防止 API 滥用
|
|
22
|
+
- 📊 **性能监控**:实时收集任务执行指标
|
|
23
|
+
- 🔍 **请求追踪**:每个请求自动分配唯一 ID
|
|
24
|
+
- 📝 **结构化日志**:支持开发和生产环境格式切换
|
|
25
|
+
- ⚙️ **配置管理**:集中化配置验证和访问
|
|
26
|
+
- 🔄 **错误重试**:Git 操作自动重试机制
|
|
27
|
+
- 🌿 **分支冲突检测**:自动处理分支名称冲突
|
|
28
|
+
- ✅ **分支名称验证**:确保符合 Git 规范
|
|
29
|
+
|
|
30
|
+
### 任务队列(v2.2 新增)
|
|
31
|
+
- 🚀 **智能队列管理**:支持 Redis 队列和本地队列自动降级
|
|
32
|
+
- 🔄 **并发控制**:可配置最大并发任务数,防止资源耗尽
|
|
33
|
+
- 📈 **自动重试**:任务失败自动重试(最多 3 次)
|
|
34
|
+
- 💪 **高可用性**:Redis 不可用时自动降级到本地队列
|
|
35
|
+
- 📊 **队列监控**:实时查看队列状态和任务数量
|
|
36
|
+
|
|
37
|
+
### WebSocket 实时通知(v2.3 新增)
|
|
38
|
+
- 🔔 **实时推送**:任务状态变更即时通知
|
|
39
|
+
- 📈 **进度追踪**:实时查看任务执行进度
|
|
40
|
+
- 🎯 **订阅机制**:按需订阅感兴趣的任务
|
|
41
|
+
- 💻 **Web 监控面板**:可视化监控界面
|
|
42
|
+
- ❤️ **心跳检测**:自动检测连接状态
|
|
43
|
+
|
|
44
|
+
### 数据库支持(v2.3 新增)
|
|
45
|
+
- 💾 **SQLite 数据库**:替代 JSON 文件存储
|
|
46
|
+
- 🔍 **高效查询**:支持复杂查询和索引
|
|
47
|
+
- 📊 **数据分析**:任务统计和性能分析
|
|
48
|
+
- 🔄 **无缝迁移**:一键从 JSON 迁移到数据库
|
|
49
|
+
- 📦 **自动备份**:迁移前自动备份原数据
|
|
50
|
+
|
|
51
|
+
### 项目锁管理(v2.5 新增)
|
|
52
|
+
- 🔒 **智能锁机制**:防止同一项目的并发 Git 冲突
|
|
53
|
+
- ⏳ **自动排队**:同一项目的任务自动排队执行
|
|
54
|
+
- ⚡ **并行执行**:不同项目的任务可以并行执行
|
|
55
|
+
- 📊 **锁统计**:实时查看项目锁状态和等待队列
|
|
56
|
+
- 🔍 **详细日志**:锁的获取、等待、释放全程记录
|
|
57
|
+
- 🛡️ **健壮性强**:确保锁一定被释放,避免死锁
|
|
58
|
+
|
|
59
|
+
### 人工确认机制(v2.6 新增)
|
|
60
|
+
- ✅ **手动审查**:AI 修复完成后,开发者可先查看修改再决定是否提交
|
|
61
|
+
- 🔍 **差异对比**:查看每个文件的 Git diff,了解具体修改内容
|
|
62
|
+
- ✋ **灵活控制**:支持确认或拒绝 AI 修改,完全掌控代码质量
|
|
63
|
+
- ⚙️ **可配置**:可选择需要确认或自动执行,适应不同场景
|
|
64
|
+
- 📊 **详细信息**:查看修改摘要、文件列表、对话轮次等完整信息
|
|
65
|
+
|
|
66
|
+
## 📋 前置要求
|
|
67
|
+
|
|
68
|
+
- Node.js >= 14.x
|
|
69
|
+
- Git
|
|
70
|
+
- Claude CLI (需要在系统中已安装并配置)
|
|
71
|
+
|
|
72
|
+
## 🚀 快速开始
|
|
73
|
+
|
|
74
|
+
### 1. 安装依赖
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
cd claude-auto-fix
|
|
78
|
+
npm install
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### 2. 配置环境变量
|
|
82
|
+
|
|
83
|
+
复制 `.env.example` 为 `.env`,并根据实际情况修改:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
cp .env.example .env
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
编辑 `.env` 文件:
|
|
90
|
+
|
|
91
|
+
```env
|
|
92
|
+
# 工作目录
|
|
93
|
+
WORK_DIR=e:\\demo\\projects
|
|
94
|
+
|
|
95
|
+
# 服务端口
|
|
96
|
+
PORT=3000
|
|
97
|
+
|
|
98
|
+
# CORS 跨域配置(可选)
|
|
99
|
+
# * 表示允许所有来源,生产环境建议指定具体域名
|
|
100
|
+
CORS_ORIGIN=*
|
|
101
|
+
|
|
102
|
+
# 安全配置(可选)
|
|
103
|
+
# API 认证密钥
|
|
104
|
+
API_KEY=your-secret-api-key-here
|
|
105
|
+
# IP 白名单(逗号分隔)
|
|
106
|
+
ALLOWED_IPS=127.0.0.1,192.168.1.100
|
|
107
|
+
|
|
108
|
+
# 企业微信机器人 Webhook(可选)
|
|
109
|
+
WECOM_WEBHOOK=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY
|
|
110
|
+
|
|
111
|
+
# Claude 模型
|
|
112
|
+
CLAUDE_MODEL=claude-sonnet-4-5-20250929
|
|
113
|
+
|
|
114
|
+
# 最大对话轮次
|
|
115
|
+
MAX_CONVERSATION_TURNS=20
|
|
116
|
+
|
|
117
|
+
# 日志级别
|
|
118
|
+
LOG_LEVEL=info
|
|
119
|
+
|
|
120
|
+
# 任务队列配置(可选)
|
|
121
|
+
# Redis 配置(未配置时自动使用本地队列)
|
|
122
|
+
REDIS_HOST=127.0.0.1
|
|
123
|
+
REDIS_PORT=6379
|
|
124
|
+
REDIS_PASSWORD=your-redis-password
|
|
125
|
+
|
|
126
|
+
# 队列并发控制
|
|
127
|
+
QUEUE_MAX_CONCURRENT=3 # 最大并发任务数
|
|
128
|
+
USE_REDIS_QUEUE=false # 是否强制使用 Redis(需要先安装 ioredis 和 bull)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 3. 启动服务
|
|
132
|
+
|
|
133
|
+
#### 方式一:使用服务管理脚本(推荐)
|
|
134
|
+
|
|
135
|
+
**Linux/Mac:**
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# 赋予执行权限
|
|
139
|
+
chmod +x service.sh
|
|
140
|
+
|
|
141
|
+
# 启动服务(后台运行)
|
|
142
|
+
./service.sh start
|
|
143
|
+
|
|
144
|
+
# 查看实时日志
|
|
145
|
+
./service.sh logs
|
|
146
|
+
|
|
147
|
+
# 查看服务状态
|
|
148
|
+
./service.sh status
|
|
149
|
+
|
|
150
|
+
# 停止服务
|
|
151
|
+
./service.sh stop
|
|
152
|
+
|
|
153
|
+
# 重启服务
|
|
154
|
+
./service.sh restart
|
|
155
|
+
|
|
156
|
+
# 查看错误日志
|
|
157
|
+
./service.sh errors
|
|
158
|
+
|
|
159
|
+
# 清理日志文件
|
|
160
|
+
./service.sh clean
|
|
161
|
+
|
|
162
|
+
# 查看帮助
|
|
163
|
+
./service.sh help
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**Windows:**
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
# 启动服务(后台运行)
|
|
170
|
+
service.bat start
|
|
171
|
+
|
|
172
|
+
# 查看实时日志
|
|
173
|
+
service.bat logs
|
|
174
|
+
|
|
175
|
+
# 查看服务状态
|
|
176
|
+
service.bat status
|
|
177
|
+
|
|
178
|
+
# 停止服务
|
|
179
|
+
service.bat stop
|
|
180
|
+
|
|
181
|
+
# 重启服务
|
|
182
|
+
service.bat restart
|
|
183
|
+
|
|
184
|
+
# 查看错误日志
|
|
185
|
+
service.bat errors
|
|
186
|
+
|
|
187
|
+
# 清理日志文件
|
|
188
|
+
service.bat clean
|
|
189
|
+
|
|
190
|
+
# 查看帮助
|
|
191
|
+
service.bat help
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**特点**:
|
|
195
|
+
- ✅ 后台运行,不占用终端
|
|
196
|
+
- ✅ 自动管理进程 PID
|
|
197
|
+
- ✅ 日志文件记录(`logs/service.log`)
|
|
198
|
+
- ✅ 实时日志查看(`logs` 命令)
|
|
199
|
+
- ✅ 优雅启动/停止(SIGTERM → SIGKILL)
|
|
200
|
+
|
|
201
|
+
#### 方式二:直接运行
|
|
202
|
+
|
|
203
|
+
```bash
|
|
204
|
+
# 生产模式(前台运行)
|
|
205
|
+
npm start
|
|
206
|
+
|
|
207
|
+
# 开发模式(自动重启)
|
|
208
|
+
npm run dev
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
服务将在 `http://localhost:3000` 启动。
|
|
212
|
+
|
|
213
|
+
## 📖 API 使用说明
|
|
214
|
+
|
|
215
|
+
### 认证说明
|
|
216
|
+
|
|
217
|
+
如果配置了 `API_KEY` 环境变量,需要在请求头中添加:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
X-API-Key: your-secret-api-key-here
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 1. 健康检查(增强版)
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
GET /health
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
**响应示例:**
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"status": "ok",
|
|
233
|
+
"service": "claude-auto-fix",
|
|
234
|
+
"timestamp": "2026-01-03T10:00:00.000Z",
|
|
235
|
+
"uptime": 3600,
|
|
236
|
+
"memory": {
|
|
237
|
+
"rss": 52428800,
|
|
238
|
+
"heapTotal": 20971520,
|
|
239
|
+
"heapUsed": 15728640,
|
|
240
|
+
"external": 1048576
|
|
241
|
+
},
|
|
242
|
+
"metrics": {
|
|
243
|
+
"tasks": {
|
|
244
|
+
"total": 10,
|
|
245
|
+
"completed": 8,
|
|
246
|
+
"failed": 1,
|
|
247
|
+
"cancelled": 1
|
|
248
|
+
},
|
|
249
|
+
"performance": {
|
|
250
|
+
"avgTaskDuration": 45000,
|
|
251
|
+
"avgResponseTime": 120,
|
|
252
|
+
"successRate": 80
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### 2. 性能监控指标
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
GET /api/metrics
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
**响应示例:**
|
|
265
|
+
```json
|
|
266
|
+
{
|
|
267
|
+
"success": true,
|
|
268
|
+
"metrics": {
|
|
269
|
+
"tasks": {
|
|
270
|
+
"total": 10,
|
|
271
|
+
"completed": 8,
|
|
272
|
+
"failed": 1,
|
|
273
|
+
"cancelled": 1
|
|
274
|
+
},
|
|
275
|
+
"performance": {
|
|
276
|
+
"avgTaskDuration": 45000,
|
|
277
|
+
"avgResponseTime": 120,
|
|
278
|
+
"successRate": 80
|
|
279
|
+
},
|
|
280
|
+
"ai": {
|
|
281
|
+
"success": 8,
|
|
282
|
+
"failure": 2,
|
|
283
|
+
"totalTime": 360000,
|
|
284
|
+
"avgTime": 45000
|
|
285
|
+
},
|
|
286
|
+
"git": {
|
|
287
|
+
"pushSuccess": 8,
|
|
288
|
+
"pushFailure": 0,
|
|
289
|
+
"mergeSuccess": 3,
|
|
290
|
+
"mergeFailure": 0
|
|
291
|
+
},
|
|
292
|
+
"http": {
|
|
293
|
+
"total": 50,
|
|
294
|
+
"errors": 2,
|
|
295
|
+
"errorRate": 4
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
"timestamp": "2026-01-03T10:00:00.000Z"
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### 3. 配置信息(需要认证)
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
GET /api/config
|
|
306
|
+
X-API-Key: your-secret-api-key-here
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
**响应示例:**
|
|
310
|
+
```json
|
|
311
|
+
{
|
|
312
|
+
"success": true,
|
|
313
|
+
"config": {
|
|
314
|
+
"server": {
|
|
315
|
+
"port": 3008,
|
|
316
|
+
"workDir": "e:\\demo\\projects"
|
|
317
|
+
},
|
|
318
|
+
"ai": {
|
|
319
|
+
"defaultEngine": "claude-cli",
|
|
320
|
+
"zhipu": {
|
|
321
|
+
"model": "glm-4-plus",
|
|
322
|
+
"maxTurns": 20,
|
|
323
|
+
"configured": false
|
|
324
|
+
},
|
|
325
|
+
"claude": {
|
|
326
|
+
"model": "claude-sonnet-4-5-20250929",
|
|
327
|
+
"maxTurns": 20,
|
|
328
|
+
"configured": true
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
"security": {
|
|
332
|
+
"corsOrigin": "*",
|
|
333
|
+
"rateLimit": {
|
|
334
|
+
"windowMs": 900000,
|
|
335
|
+
"max": 20
|
|
336
|
+
},
|
|
337
|
+
"apiKeyConfigured": true
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### 4. 项目锁统计(v2.5 新增)
|
|
344
|
+
|
|
345
|
+
查看项目锁状态和等待队列信息。
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
GET /api/project-locks/stats
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**响应示例:**
|
|
352
|
+
```json
|
|
353
|
+
{
|
|
354
|
+
"success": true,
|
|
355
|
+
"stats": {
|
|
356
|
+
"totalLocks": 156,
|
|
357
|
+
"currentLocks": 3,
|
|
358
|
+
"waitingTasks": 5,
|
|
359
|
+
"maxWaitTime": 45000,
|
|
360
|
+
"activeLocks": 3,
|
|
361
|
+
"locks": [
|
|
362
|
+
{
|
|
363
|
+
"projectKey": "e:/demo/projects/insai",
|
|
364
|
+
"taskId": "task-1767443950266-abc",
|
|
365
|
+
"waitingCount": 3,
|
|
366
|
+
"duration": 12500
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
"projectKey": "/home/user/projects/demo",
|
|
370
|
+
"taskId": "task-1767443950267-xyz",
|
|
371
|
+
"waitingCount": 2,
|
|
372
|
+
"duration": 8300
|
|
373
|
+
}
|
|
374
|
+
]
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
**字段说明:**
|
|
380
|
+
- `totalLocks`: 累计锁获取次数
|
|
381
|
+
- `currentLocks`: 当前活跃锁数量
|
|
382
|
+
- `waitingTasks`: 当前等待任务数量
|
|
383
|
+
- `maxWaitTime`: 最大等待时间(毫秒)
|
|
384
|
+
- `activeLocks`: 活跃锁数量
|
|
385
|
+
- `locks`: 详细的锁信息列表
|
|
386
|
+
- `projectKey`: 标准化的项目路径
|
|
387
|
+
- `taskId`: 持有锁的任务ID
|
|
388
|
+
- `waitingCount`: 等待队列中的任务数量
|
|
389
|
+
- `duration`: 锁持有时长(毫秒)
|
|
390
|
+
|
|
391
|
+
**使用场景:**
|
|
392
|
+
- 查看哪些项目正在被锁定
|
|
393
|
+
- 查看等待队列长度
|
|
394
|
+
- 监控任务等待时间
|
|
395
|
+
- 调试并发任务问题
|
|
396
|
+
|
|
397
|
+
### 5. 自动修复(完整流程)
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
POST /api/fix-bug
|
|
401
|
+
Content-Type: application/json
|
|
402
|
+
X-API-Key: your-secret-api-key-here # 如果启用了认证
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
**请求参数:**
|
|
406
|
+
|
|
407
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
408
|
+
|------|------|------|------|
|
|
409
|
+
| `projectPath` | string | 否* | 本地项目路径 |
|
|
410
|
+
| `repoUrl` | string | 否* | 远程仓库地址 |
|
|
411
|
+
| `requirement` | string | 是 | 修复需求描述 |
|
|
412
|
+
| `runTests` | boolean | 否 | 是否运行测试,默认 `false` |
|
|
413
|
+
| `autoPush` | boolean | 否 | 是否自动推送,默认 `true` |
|
|
414
|
+
| `aiEngine` | string | 否 | AI 引擎,可选 `claude-cli`、`zhipu`、`claude` |
|
|
415
|
+
| `baseBranch` | string | 否 | 基准分支,默认自动查找 `main`/`master` |
|
|
416
|
+
| `createNewBranch` | boolean | 否 | 是否创建新分支,默认 `true` |
|
|
417
|
+
| `username` | string | 否 | 用户名(用于分支命名),默认 `system` |
|
|
418
|
+
| `mergeToAlpha` | boolean | 否 | 是否合并到 alpha 分支,默认 `false` |
|
|
419
|
+
| `mergeToBeta` | boolean | 否 | 是否合并到 beta 分支,默认 `false` |
|
|
420
|
+
| `mergeToMaster` | boolean | 否 | 是否合并到 master 分支,默认 `false` |
|
|
421
|
+
| `needsApproval` | boolean | 否 | 是否需要人工确认后才执行 Git 操作,默认 `true` |
|
|
422
|
+
|
|
423
|
+
\* `projectPath` 和 `repoUrl` 必须提供其中之一
|
|
424
|
+
|
|
425
|
+
**请求示例 1 - 使用本地项目:**
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
429
|
+
-H "Content-Type: application/json" \
|
|
430
|
+
-H "X-API-Key: your-secret-api-key-here" \
|
|
431
|
+
-d '{
|
|
432
|
+
"projectPath": "e:\\demo\\my-project",
|
|
433
|
+
"requirement": "修复登录按钮点击无反应的问题,应该调用 handleLogin 函数",
|
|
434
|
+
"runTests": false,
|
|
435
|
+
"autoPush": true
|
|
436
|
+
}'
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
**请求示例 2 - 克隆远程仓库:**
|
|
440
|
+
|
|
441
|
+
```bash
|
|
442
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
443
|
+
-H "Content-Type: application/json" \
|
|
444
|
+
-d '{
|
|
445
|
+
"repoUrl": "https://github.com/username/repo.git",
|
|
446
|
+
"requirement": "将所有的 console.log 改为使用统一的 logger 工具"
|
|
447
|
+
}'
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
**请求示例 3 - 指定基准分支和自动合并:**
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
454
|
+
-H "Content-Type: application/json" \
|
|
455
|
+
-d '{
|
|
456
|
+
"projectPath": "e:\\demo\\my-project",
|
|
457
|
+
"requirement": "更新 API 接口的错误处理逻辑",
|
|
458
|
+
"baseBranch": "develop",
|
|
459
|
+
"mergeToAlpha": true,
|
|
460
|
+
"mergeToBeta": true,
|
|
461
|
+
"autoPush": true
|
|
462
|
+
}'
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
**请求示例 4 - 直接在基准分支上开发(不创建新分支):**
|
|
466
|
+
|
|
467
|
+
```bash
|
|
468
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
469
|
+
-H "Content-Type: application/json" \
|
|
470
|
+
-d '{
|
|
471
|
+
"projectPath": "e:\\demo\\my-project",
|
|
472
|
+
"requirement": "修复配置文件中的拼写错误",
|
|
473
|
+
"baseBranch": "develop",
|
|
474
|
+
"createNewBranch": false,
|
|
475
|
+
"username": "zhangsan",
|
|
476
|
+
"autoPush": true
|
|
477
|
+
}'
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
**请求示例 5 - 创建新分支并指定用户名:**
|
|
481
|
+
|
|
482
|
+
```bash
|
|
483
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
484
|
+
-H "Content-Type: application/json" \
|
|
485
|
+
-d '{
|
|
486
|
+
"projectPath": "e:\\demo\\my-project",
|
|
487
|
+
"requirement": "优化数据库查询性能",
|
|
488
|
+
"baseBranch": "develop",
|
|
489
|
+
"createNewBranch": true,
|
|
490
|
+
"username": "lisi",
|
|
491
|
+
"autoPush": true
|
|
492
|
+
}'
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
**请求示例 6 - 直接合并到 master(谨慎使用):**
|
|
496
|
+
|
|
497
|
+
```bash
|
|
498
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
499
|
+
-H "Content-Type: application/json" \
|
|
500
|
+
-d '{
|
|
501
|
+
"projectPath": "e:\\demo\\my-project",
|
|
502
|
+
"requirement": "修复紧急安全漏洞",
|
|
503
|
+
"baseBranch": "master",
|
|
504
|
+
"mergeToMaster": true,
|
|
505
|
+
"runTests": true
|
|
506
|
+
}'
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
**请求示例 7 - 需要人工确认后再执行 Git 操作(推荐):**
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
513
|
+
-H "Content-Type: application/json" \
|
|
514
|
+
-d '{
|
|
515
|
+
"projectPath": "e:\\demo\\my-project",
|
|
516
|
+
"requirement": "重构用户认证模块",
|
|
517
|
+
"needsApproval": true,
|
|
518
|
+
"username": "zhangsan"
|
|
519
|
+
}'
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
AI 修复完成后,任务会暂停在 `waiting_approval` 状态,此时可以:
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
# 1. 查看修改内容
|
|
526
|
+
curl http://localhost:3000/api/tasks/task-xxx/changes
|
|
527
|
+
|
|
528
|
+
# 2. 确认修改(执行 Git 操作)
|
|
529
|
+
curl -X POST http://localhost:3000/api/tasks/task-xxx/approve
|
|
530
|
+
|
|
531
|
+
# 或者拒绝修改
|
|
532
|
+
curl -X POST http://localhost:3000/api/tasks/task-xxx/reject \
|
|
533
|
+
-H "Content-Type: application/json" \
|
|
534
|
+
-d '{"reason": "修改范围过大,需要更细致的调整"}'
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
**请求示例 8 - 跳过确认,自动执行(适合简单修复):**
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
541
|
+
-H "Content-Type: application/json" \
|
|
542
|
+
-d '{
|
|
543
|
+
"projectPath": "e:\\demo\\my-project",
|
|
544
|
+
"requirement": "修复 README 中的拼写错误",
|
|
545
|
+
"needsApproval": false,
|
|
546
|
+
"username": "zhangsan"
|
|
547
|
+
}'
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
**异步响应示例(立即返回):**
|
|
551
|
+
|
|
552
|
+
接口会立即返回任务 ID,任务在后台异步执行。
|
|
553
|
+
|
|
554
|
+
```json
|
|
555
|
+
{
|
|
556
|
+
"success": true,
|
|
557
|
+
"id": "task-1735819200-abc123",
|
|
558
|
+
"taskId": "task-1735819200-abc123",
|
|
559
|
+
"message": "任务已创建,正在后台处理",
|
|
560
|
+
"statusUrl": "/api/tasks/task-1735819200-abc123"
|
|
561
|
+
}
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
**说明**:
|
|
565
|
+
- `id` / `taskId`:任务唯一标识(两个字段值相同,保持兼容性)
|
|
566
|
+
- `statusUrl`:查询任务状态的 URL
|
|
567
|
+
- 使用 `GET /api/tasks/{id}` 查询任务执行状态和结果
|
|
568
|
+
|
|
569
|
+
**任务完成后的结果示例:**
|
|
570
|
+
|
|
571
|
+
通过 `GET /api/tasks/{id}` 查询任务,当任务完成后返回:
|
|
572
|
+
|
|
573
|
+
```json
|
|
574
|
+
{
|
|
575
|
+
"success": true,
|
|
576
|
+
"task": {
|
|
577
|
+
"id": "task-1735819200-abc123",
|
|
578
|
+
"status": "completed",
|
|
579
|
+
"requirement": "修复登录按钮问题",
|
|
580
|
+
"projectPath": "e:\\demo\\my-project",
|
|
581
|
+
"createdAt": "2026-01-02T10:00:00.000Z",
|
|
582
|
+
"startedAt": "2026-01-02T10:00:01.000Z",
|
|
583
|
+
"completedAt": "2026-01-02T10:00:15.000Z",
|
|
584
|
+
"result": {
|
|
585
|
+
"success": true,
|
|
586
|
+
"projectName": "my-project",
|
|
587
|
+
"projectPath": "e:\\demo\\my-project",
|
|
588
|
+
"branch": "fix/auto-1735819200000",
|
|
589
|
+
"baseBranch": "develop",
|
|
590
|
+
"changedFiles": [
|
|
591
|
+
"src/components/Login.js",
|
|
592
|
+
"src/utils/logger.js"
|
|
593
|
+
],
|
|
594
|
+
"summary": "已完成修复,修改了登录组件...",
|
|
595
|
+
"conversationTurns": 5,
|
|
596
|
+
"testsPassed": true,
|
|
597
|
+
"pushed": true,
|
|
598
|
+
"mergeResults": {
|
|
599
|
+
"alpha": true,
|
|
600
|
+
"beta": true
|
|
601
|
+
}
|
|
602
|
+
},
|
|
603
|
+
"progress": {
|
|
604
|
+
"step": "sending_success_notification",
|
|
605
|
+
"message": "发送成功通知"
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
**失败响应示例:**
|
|
612
|
+
|
|
613
|
+
```json
|
|
614
|
+
{
|
|
615
|
+
"success": false,
|
|
616
|
+
"error": "项目路径不存在且未提供仓库地址",
|
|
617
|
+
"projectPath": null,
|
|
618
|
+
"branch": null
|
|
619
|
+
}
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
### 3. 测试接口(仅 Claude 修复)
|
|
623
|
+
|
|
624
|
+
用于测试 Claude 修复功能,不进行 Git 操作。
|
|
625
|
+
|
|
626
|
+
```bash
|
|
627
|
+
POST /api/test
|
|
628
|
+
Content-Type: application/json
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
**请求示例:**
|
|
632
|
+
|
|
633
|
+
```bash
|
|
634
|
+
curl -X POST http://localhost:3000/api/test \
|
|
635
|
+
-H "Content-Type: application/json" \
|
|
636
|
+
-d '{
|
|
637
|
+
"projectPath": "e:\\demo\\my-project",
|
|
638
|
+
"requirement": "优化首页加载速度"
|
|
639
|
+
}'
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
## 💾 任务持久化
|
|
643
|
+
|
|
644
|
+
服务支持任务历史记录持久化,所有任务数据会自动保存到本地文件,即使服务重启也能查询历史记录。
|
|
645
|
+
|
|
646
|
+
### 存储位置
|
|
647
|
+
|
|
648
|
+
任务数据存储在 `data/tasks.json` 文件中。
|
|
649
|
+
|
|
650
|
+
### 功能特点
|
|
651
|
+
|
|
652
|
+
- **自动保存**:任务创建、更新、完成时自动保存
|
|
653
|
+
- **启动加载**:服务启动时自动加载历史任务
|
|
654
|
+
- **自动清理**:保留最近 100 条任务记录,自动清理旧记录
|
|
655
|
+
- **完整信息**:保存任务的完整状态、进度、结果等信息
|
|
656
|
+
|
|
657
|
+
### 查询历史任务
|
|
658
|
+
|
|
659
|
+
```bash
|
|
660
|
+
# 基本查询(默认第 1 页,每页 20 条)
|
|
661
|
+
curl http://localhost:3000/api/tasks
|
|
662
|
+
|
|
663
|
+
# 分页查询
|
|
664
|
+
curl http://localhost:3000/api/tasks?page=2&pageSize=50
|
|
665
|
+
|
|
666
|
+
# 按状态过滤(pending, running, waiting_approval, completed, failed)
|
|
667
|
+
curl http://localhost:3000/api/tasks?status=completed
|
|
668
|
+
|
|
669
|
+
# 按仓库地址过滤(模糊匹配)
|
|
670
|
+
curl http://localhost:3000/api/tasks?repoUrl=github.com/myorg
|
|
671
|
+
|
|
672
|
+
# 按项目路径过滤(模糊匹配)
|
|
673
|
+
curl http://localhost:3000/api/tasks?projectPath=demo
|
|
674
|
+
|
|
675
|
+
# 组合查询
|
|
676
|
+
curl "http://localhost:3000/api/tasks?status=waiting_approval&page=1&pageSize=10"
|
|
677
|
+
|
|
678
|
+
# 查询特定仓库的已完成任务
|
|
679
|
+
curl "http://localhost:3000/api/tasks?status=completed&repoUrl=myproject"
|
|
680
|
+
|
|
681
|
+
# 查询特定任务
|
|
682
|
+
curl http://localhost:3000/api/tasks/task-1735819200-abc123
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
**查询参数说明:**
|
|
686
|
+
|
|
687
|
+
| 参数 | 类型 | 说明 | 默认值 |
|
|
688
|
+
|------|------|------|--------|
|
|
689
|
+
| `page` | number | 页码(从 1 开始) | 1 |
|
|
690
|
+
| `pageSize` | number | 每页数量(最大 100) | 20 |
|
|
691
|
+
| `status` | string | 任务状态过滤 | - |
|
|
692
|
+
| `repoUrl` | string | 仓库地址过滤(模糊匹配,不区分大小写) | - |
|
|
693
|
+
| `projectPath` | string | 项目路径过滤(模糊匹配,不区分大小写) | - |
|
|
694
|
+
|
|
695
|
+
**任务状态值:**
|
|
696
|
+
- `pending` - 等待执行
|
|
697
|
+
- `running` - 执行中
|
|
698
|
+
- `waiting_approval` - 等待人工确认
|
|
699
|
+
- `completed` - 已完成
|
|
700
|
+
- `failed` - 失败
|
|
701
|
+
|
|
702
|
+
**任务列表响应示例:**
|
|
703
|
+
|
|
704
|
+
```json
|
|
705
|
+
{
|
|
706
|
+
"success": true,
|
|
707
|
+
"pagination": {
|
|
708
|
+
"page": 1,
|
|
709
|
+
"pageSize": 20,
|
|
710
|
+
"total": 45,
|
|
711
|
+
"totalPages": 3,
|
|
712
|
+
"hasNextPage": true,
|
|
713
|
+
"hasPrevPage": false
|
|
714
|
+
},
|
|
715
|
+
"filters": {
|
|
716
|
+
"status": "completed",
|
|
717
|
+
"repoUrl": null,
|
|
718
|
+
"projectPath": null
|
|
719
|
+
},
|
|
720
|
+
"stats": {
|
|
721
|
+
"total": 50,
|
|
722
|
+
"pending": 0,
|
|
723
|
+
"running": 2,
|
|
724
|
+
"waiting_approval": 3,
|
|
725
|
+
"completed": 45,
|
|
726
|
+
"failed": 0
|
|
727
|
+
},
|
|
728
|
+
"tasks": [
|
|
729
|
+
{
|
|
730
|
+
"id": "task-1735819200-abc123",
|
|
731
|
+
"status": "completed",
|
|
732
|
+
"requirement": "修复登录按钮问题",
|
|
733
|
+
"projectPath": "e:\\demo\\my-project",
|
|
734
|
+
"repoUrl": null,
|
|
735
|
+
"runTests": false,
|
|
736
|
+
"autoPush": true,
|
|
737
|
+
"aiEngine": "claude-cli",
|
|
738
|
+
"baseBranch": "develop",
|
|
739
|
+
"mergeToAlpha": true,
|
|
740
|
+
"mergeToBeta": false,
|
|
741
|
+
"mergeToMaster": false,
|
|
742
|
+
"createdAt": "2026-01-02T10:00:00.000Z",
|
|
743
|
+
"startedAt": "2026-01-02T10:00:01.000Z",
|
|
744
|
+
"completedAt": "2026-01-02T10:00:15.000Z",
|
|
745
|
+
"duration": "14.25s",
|
|
746
|
+
"result": {
|
|
747
|
+
"success": true,
|
|
748
|
+
"projectName": "my-project",
|
|
749
|
+
"branch": "fix/auto-1735819200",
|
|
750
|
+
"changedFiles": ["src/components/Login.js"],
|
|
751
|
+
"summary": "修复了登录按钮点击无反应的问题",
|
|
752
|
+
"conversationTurns": 3,
|
|
753
|
+
"testsPassed": true,
|
|
754
|
+
"pushed": true,
|
|
755
|
+
"mergeResults": { "alpha": true }
|
|
756
|
+
},
|
|
757
|
+
"error": null,
|
|
758
|
+
"progress": {
|
|
759
|
+
"step": "sending_success_notification",
|
|
760
|
+
"message": "发送成功通知"
|
|
761
|
+
},
|
|
762
|
+
"isRunning": false,
|
|
763
|
+
"isCompleted": true,
|
|
764
|
+
"isFailed": false,
|
|
765
|
+
"isPending": false,
|
|
766
|
+
"isWaitingApproval": false
|
|
767
|
+
}
|
|
768
|
+
]
|
|
769
|
+
}
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
**字段说明:**
|
|
773
|
+
|
|
774
|
+
**响应结构字段:**
|
|
775
|
+
|
|
776
|
+
| 字段 | 类型 | 说明 |
|
|
777
|
+
|------|------|------|
|
|
778
|
+
| `pagination` | object | 分页信息 |
|
|
779
|
+
| `pagination.page` | number | 当前页码 |
|
|
780
|
+
| `pagination.pageSize` | number | 每页数量 |
|
|
781
|
+
| `pagination.total` | number | 过滤后的任务总数 |
|
|
782
|
+
| `pagination.totalPages` | number | 总页数 |
|
|
783
|
+
| `pagination.hasNextPage` | boolean | 是否有下一页 |
|
|
784
|
+
| `pagination.hasPrevPage` | boolean | 是否有上一页 |
|
|
785
|
+
| `filters` | object | 当前应用的过滤条件 |
|
|
786
|
+
| `stats` | object | 全局任务统计(不受过滤影响) |
|
|
787
|
+
| `tasks` | array | 任务列表 |
|
|
788
|
+
|
|
789
|
+
**任务对象字段:**
|
|
790
|
+
|
|
791
|
+
| 字段 | 类型 | 说明 |
|
|
792
|
+
|------|------|------|
|
|
793
|
+
| `id` | string | 任务唯一标识 |
|
|
794
|
+
| `status` | string | 任务状态:`pending`/`running`/`waiting_approval`/`completed`/`failed` |
|
|
795
|
+
| `requirement` | string | 修复需求描述 |
|
|
796
|
+
| `projectPath` | string | 本地项目路径 |
|
|
797
|
+
| `repoUrl` | string | 远程仓库地址 |
|
|
798
|
+
| `runTests` | boolean | 是否运行测试 |
|
|
799
|
+
| `autoPush` | boolean | 是否自动推送 |
|
|
800
|
+
| `aiEngine` | string | 使用的 AI 引擎 |
|
|
801
|
+
| `baseBranch` | string | 基准分支 |
|
|
802
|
+
| `createNewBranch` | boolean | 是否创建新分支 |
|
|
803
|
+
| `username` | string | 用户名(用于分支命名) |
|
|
804
|
+
| `mergeToAlpha` | boolean | 是否合并到 alpha |
|
|
805
|
+
| `mergeToBeta` | boolean | 是否合并到 beta |
|
|
806
|
+
| `mergeToMaster` | boolean | 是否合并到 master |
|
|
807
|
+
| `createdAt` | string | 创建时间(ISO 8601) |
|
|
808
|
+
| `startedAt` | string | 开始时间(ISO 8601) |
|
|
809
|
+
| `completedAt` | string | 完成时间(ISO 8601) |
|
|
810
|
+
| `duration` | string | 执行耗时(如:`14.25s`) |
|
|
811
|
+
| `result` | object | 执行结果(仅 completed 状态) |
|
|
812
|
+
| `error` | string | 错误信息(仅 failed 状态) |
|
|
813
|
+
| `progress` | object | 当前进度信息 |
|
|
814
|
+
| `isRunning` | boolean | 便捷字段:是否正在运行 |
|
|
815
|
+
| `isCompleted` | boolean | 便捷字段:是否已完成 |
|
|
816
|
+
| `isFailed` | boolean | 便捷字段:是否失败 |
|
|
817
|
+
| `isPending` | boolean | 便捷字段:是否等待中 |
|
|
818
|
+
| `isWaitingApproval` | boolean | 便捷字段:是否等待人工确认 |
|
|
819
|
+
|
|
820
|
+
## 🌍 跨域支持(CORS)
|
|
821
|
+
|
|
822
|
+
服务已启用 CORS 跨域支持,允许前端应用从不同域名访问 API。
|
|
823
|
+
|
|
824
|
+
### 配置方式
|
|
825
|
+
|
|
826
|
+
在 `.env` 文件中配置允许的来源:
|
|
827
|
+
|
|
828
|
+
```env
|
|
829
|
+
# 允许所有来源(开发环境)
|
|
830
|
+
CORS_ORIGIN=*
|
|
831
|
+
|
|
832
|
+
# 允许特定域名(生产环境推荐)
|
|
833
|
+
CORS_ORIGIN=https://example.com
|
|
834
|
+
|
|
835
|
+
# 允许多个域名(逗号分隔)
|
|
836
|
+
CORS_ORIGIN=http://localhost:3000,https://example.com,https://admin.example.com
|
|
837
|
+
```
|
|
838
|
+
|
|
839
|
+
### 支持的方法
|
|
840
|
+
|
|
841
|
+
- GET
|
|
842
|
+
- POST
|
|
843
|
+
- PUT
|
|
844
|
+
- DELETE
|
|
845
|
+
- OPTIONS(预检请求)
|
|
846
|
+
|
|
847
|
+
### 允许的请求头
|
|
848
|
+
|
|
849
|
+
- Content-Type
|
|
850
|
+
- Authorization
|
|
851
|
+
|
|
852
|
+
## 🔧 工作流程
|
|
853
|
+
|
|
854
|
+
```
|
|
855
|
+
1. 接收 HTTP 请求
|
|
856
|
+
↓
|
|
857
|
+
2. 检查项目是否存在
|
|
858
|
+
├─ 存在 → 拉取最新代码
|
|
859
|
+
└─ 不存在 → 克隆远程仓库
|
|
860
|
+
↓
|
|
861
|
+
3. 创建功能分支或切换到基准分支
|
|
862
|
+
├─ 创建新分支(createNewBranch = true,默认)
|
|
863
|
+
│ └─ 分支命名: fix_[username]_[taskid]_[timestamp]
|
|
864
|
+
│ 例如: fix_zhangsan_task-1735819200-abc123_1735819200000
|
|
865
|
+
└─ 直接使用基准分支(createNewBranch = false)
|
|
866
|
+
└─ 切换到指定的 baseBranch 或 main/master
|
|
867
|
+
↓
|
|
868
|
+
4. Claude 使用工具进行代码修复
|
|
869
|
+
├─ list_files: 了解项目结构
|
|
870
|
+
├─ search_code: 查找相关代码
|
|
871
|
+
├─ read_file: 读取需要修改的文件
|
|
872
|
+
└─ write_file: 完成代码修改
|
|
873
|
+
↓
|
|
874
|
+
5. 运行测试(可选)
|
|
875
|
+
↓
|
|
876
|
+
6. 提交更改
|
|
877
|
+
↓
|
|
878
|
+
7. 推送到远程仓库(可选)
|
|
879
|
+
↓
|
|
880
|
+
8. 合并到目标分支(可选)
|
|
881
|
+
├─ 合并到 alpha(如果 mergeToAlpha = true)
|
|
882
|
+
├─ 合并到 beta(如果 mergeToBeta = true)
|
|
883
|
+
└─ 合并到 master(如果 mergeToMaster = true)
|
|
884
|
+
↓
|
|
885
|
+
9. 发送企业微信通知
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
## 📁 项目结构
|
|
889
|
+
|
|
890
|
+
```
|
|
891
|
+
claude-auto-fix/
|
|
892
|
+
├── src/
|
|
893
|
+
│ ├── index.js # 主服务入口(Koa 框架)
|
|
894
|
+
│ ├── claude-cli-service.js # Claude CLI 集成
|
|
895
|
+
│ ├── git-service.js # Git 操作封装
|
|
896
|
+
│ ├── wechat-notifier.js # 企业微信通知
|
|
897
|
+
│ ├── task-manager.js # 异步任务管理(带持久化)
|
|
898
|
+
│ ├── logger.js # 日志系统配置
|
|
899
|
+
│ ├── config/
|
|
900
|
+
│ │ └── index.js # 配置管理器
|
|
901
|
+
│ ├── queue/
|
|
902
|
+
│ │ └── task-queue.js # 任务队列(支持 Redis 和本地降级)
|
|
903
|
+
│ ├── metrics/
|
|
904
|
+
│ │ └── collector.js # 指标收集器
|
|
905
|
+
│ ├── middleware/
|
|
906
|
+
│ │ ├── auth.js # 认证中间件
|
|
907
|
+
│ │ └── rate-limit.js # 频率限制
|
|
908
|
+
│ └── utils/
|
|
909
|
+
│ ├── retry.js # 重试工具
|
|
910
|
+
│ └── sanitizer.js # 输入清理
|
|
911
|
+
├── logs/ # 日志文件目录(自动生成)
|
|
912
|
+
│ ├── combined-YYYY-MM-DD.log # 综合日志
|
|
913
|
+
│ └── error-YYYY-MM-DD.log # 错误日志
|
|
914
|
+
├── data/ # 数据存储目录(自动生成)
|
|
915
|
+
│ └── tasks.json # 任务历史记录
|
|
916
|
+
├── .env # 环境变量配置
|
|
917
|
+
├── .env.example # 环境变量示例
|
|
918
|
+
├── .gitignore
|
|
919
|
+
├── package.json
|
|
920
|
+
└── README.md
|
|
921
|
+
```
|
|
922
|
+
|
|
923
|
+
## 🚦 任务队列系统
|
|
924
|
+
|
|
925
|
+
服务内置智能任务队列,支持 Redis 队列和本地队列自动降级。
|
|
926
|
+
|
|
927
|
+
### 队列模式
|
|
928
|
+
|
|
929
|
+
**1. Redis 队列模式(推荐生产环境)**
|
|
930
|
+
|
|
931
|
+
优势:
|
|
932
|
+
- 持久化任务数据
|
|
933
|
+
- 支持分布式部署
|
|
934
|
+
- 任务优先级管理
|
|
935
|
+
- 自动失败重试
|
|
936
|
+
- 更好的性能监控
|
|
937
|
+
|
|
938
|
+
使用方式:
|
|
939
|
+
```bash
|
|
940
|
+
# 1. 安装 Redis 依赖
|
|
941
|
+
npm install ioredis bull
|
|
942
|
+
|
|
943
|
+
# 2. 配置环境变量
|
|
944
|
+
REDIS_HOST=127.0.0.1
|
|
945
|
+
REDIS_PORT=6379
|
|
946
|
+
REDIS_PASSWORD=your-password
|
|
947
|
+
USE_REDIS_QUEUE=true
|
|
948
|
+
|
|
949
|
+
# 3. 启动服务(自动连接 Redis)
|
|
950
|
+
npm start
|
|
951
|
+
```
|
|
952
|
+
|
|
953
|
+
**2. 本地队列模式(默认)**
|
|
954
|
+
|
|
955
|
+
优势:
|
|
956
|
+
- 零依赖,开箱即用
|
|
957
|
+
- 无需额外配置
|
|
958
|
+
- 适合开发和小规模部署
|
|
959
|
+
- Redis 故障时自动降级
|
|
960
|
+
|
|
961
|
+
使用方式:
|
|
962
|
+
```bash
|
|
963
|
+
# 不配置 REDIS_HOST 或 USE_REDIS_QUEUE=false
|
|
964
|
+
npm start
|
|
965
|
+
```
|
|
966
|
+
|
|
967
|
+
### 队列配置
|
|
968
|
+
|
|
969
|
+
```env
|
|
970
|
+
# 队列配置
|
|
971
|
+
QUEUE_MAX_CONCURRENT=3 # 最大并发任务数(默认 3)
|
|
972
|
+
USE_REDIS_QUEUE=false # 是否强制使用 Redis
|
|
973
|
+
|
|
974
|
+
# Redis 配置(可选)
|
|
975
|
+
REDIS_HOST=127.0.0.1 # Redis 主机(不配置则使用本地队列)
|
|
976
|
+
REDIS_PORT=6379 # Redis 端口
|
|
977
|
+
REDIS_PASSWORD= # Redis 密码(可选)
|
|
978
|
+
```
|
|
979
|
+
|
|
980
|
+
### 队列监控
|
|
981
|
+
|
|
982
|
+
通过 API 查看队列状态:
|
|
983
|
+
|
|
984
|
+
```bash
|
|
985
|
+
GET /api/queue/stats
|
|
986
|
+
```
|
|
987
|
+
|
|
988
|
+
**响应示例(Redis 模式):**
|
|
989
|
+
```json
|
|
990
|
+
{
|
|
991
|
+
"success": true,
|
|
992
|
+
"stats": {
|
|
993
|
+
"queueType": "redis",
|
|
994
|
+
"waiting": 5,
|
|
995
|
+
"active": 2,
|
|
996
|
+
"completed": 120,
|
|
997
|
+
"failed": 3,
|
|
998
|
+
"total": 130
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
**响应示例(本地模式):**
|
|
1004
|
+
```json
|
|
1005
|
+
{
|
|
1006
|
+
"success": true,
|
|
1007
|
+
"stats": {
|
|
1008
|
+
"queueType": "local",
|
|
1009
|
+
"waiting": 5,
|
|
1010
|
+
"active": 2,
|
|
1011
|
+
"completed": 0,
|
|
1012
|
+
"failed": 0,
|
|
1013
|
+
"total": 7,
|
|
1014
|
+
"maxConcurrent": 3
|
|
1015
|
+
}
|
|
1016
|
+
}
|
|
1017
|
+
```
|
|
1018
|
+
|
|
1019
|
+
### 自动降级机制
|
|
1020
|
+
|
|
1021
|
+
服务启动时会自动检测 Redis 可用性:
|
|
1022
|
+
|
|
1023
|
+
1. **Redis 可用** → 使用 Redis 队列
|
|
1024
|
+
2. **Redis 不可用** → 自动降级到本地队列
|
|
1025
|
+
3. **未配置 Redis** → 直接使用本地队列
|
|
1026
|
+
|
|
1027
|
+
降级过程完全透明,不影响业务功能。
|
|
1028
|
+
|
|
1029
|
+
### 并发控制
|
|
1030
|
+
|
|
1031
|
+
通过 `QUEUE_MAX_CONCURRENT` 控制同时执行的最大任务数:
|
|
1032
|
+
|
|
1033
|
+
- **默认值**:3
|
|
1034
|
+
- **推荐配置**:
|
|
1035
|
+
- 开发环境:1-2
|
|
1036
|
+
- 小型服务器(2-4 核):3-5
|
|
1037
|
+
- 中型服务器(8 核):5-10
|
|
1038
|
+
- 大型服务器(16+ 核):10-20
|
|
1039
|
+
|
|
1040
|
+
```env
|
|
1041
|
+
# 示例:限制最多同时执行 5 个任务
|
|
1042
|
+
QUEUE_MAX_CONCURRENT=5
|
|
1043
|
+
```
|
|
1044
|
+
|
|
1045
|
+
## 🔔 WebSocket 实时通知
|
|
1046
|
+
|
|
1047
|
+
服务内置 WebSocket 支持,可实时推送任务状态和进度。
|
|
1048
|
+
|
|
1049
|
+
### 启用 WebSocket
|
|
1050
|
+
|
|
1051
|
+
```bash
|
|
1052
|
+
# 1. 安装 WebSocket 依赖
|
|
1053
|
+
npm run install:ws
|
|
1054
|
+
|
|
1055
|
+
# 2. 启动服务(自动启用 WebSocket)
|
|
1056
|
+
npm start
|
|
1057
|
+
```
|
|
1058
|
+
|
|
1059
|
+
WebSocket 服务地址:`ws://localhost:3008/ws`
|
|
1060
|
+
|
|
1061
|
+
### 使用 Web 监控面板
|
|
1062
|
+
|
|
1063
|
+
打开浏览器访问监控面板:
|
|
1064
|
+
|
|
1065
|
+
```
|
|
1066
|
+
http://localhost:3008/monitor.html
|
|
1067
|
+
```
|
|
1068
|
+
|
|
1069
|
+
### WebSocket 连接示例
|
|
1070
|
+
|
|
1071
|
+
**JavaScript 客户端**:
|
|
1072
|
+
|
|
1073
|
+
```javascript
|
|
1074
|
+
// 连接 WebSocket(可选 API Key)
|
|
1075
|
+
const ws = new WebSocket('ws://localhost:3008/ws?apiKey=your-api-key');
|
|
1076
|
+
|
|
1077
|
+
ws.onopen = () => {
|
|
1078
|
+
console.log('WebSocket 已连接');
|
|
1079
|
+
|
|
1080
|
+
// 订阅特定任务
|
|
1081
|
+
ws.send(JSON.stringify({
|
|
1082
|
+
type: 'subscribe',
|
|
1083
|
+
taskId: 'task-1735819200-abc123'
|
|
1084
|
+
}));
|
|
1085
|
+
};
|
|
1086
|
+
|
|
1087
|
+
ws.onmessage = (event) => {
|
|
1088
|
+
const data = JSON.parse(event.data);
|
|
1089
|
+
|
|
1090
|
+
switch (data.type) {
|
|
1091
|
+
case 'task_status':
|
|
1092
|
+
console.log(`任务 ${data.taskId} 状态: ${data.status}`);
|
|
1093
|
+
break;
|
|
1094
|
+
|
|
1095
|
+
case 'task_progress':
|
|
1096
|
+
console.log(`任务 ${data.taskId} 进度: ${data.message} (${data.percent}%)`);
|
|
1097
|
+
break;
|
|
1098
|
+
|
|
1099
|
+
case 'task_complete':
|
|
1100
|
+
console.log(`任务 ${data.taskId} 完成:`, data.result);
|
|
1101
|
+
break;
|
|
1102
|
+
|
|
1103
|
+
case 'task_failed':
|
|
1104
|
+
console.error(`任务 ${data.taskId} 失败:`, data.error);
|
|
1105
|
+
break;
|
|
1106
|
+
|
|
1107
|
+
case 'queue_stats':
|
|
1108
|
+
console.log('队列统计:', data.stats);
|
|
1109
|
+
break;
|
|
1110
|
+
}
|
|
1111
|
+
};
|
|
1112
|
+
|
|
1113
|
+
// 取消订阅
|
|
1114
|
+
ws.send(JSON.stringify({
|
|
1115
|
+
type: 'unsubscribe',
|
|
1116
|
+
taskId: 'task-1735819200-abc123'
|
|
1117
|
+
}));
|
|
1118
|
+
```
|
|
1119
|
+
|
|
1120
|
+
### 支持的消息类型
|
|
1121
|
+
|
|
1122
|
+
| 客户端发送 | 说明 |
|
|
1123
|
+
|----------|------|
|
|
1124
|
+
| `subscribe` | 订阅任务状态更新 |
|
|
1125
|
+
| `unsubscribe` | 取消订阅 |
|
|
1126
|
+
| `ping` | 心跳检测 |
|
|
1127
|
+
|
|
1128
|
+
| 服务端推送 | 说明 |
|
|
1129
|
+
|----------|------|
|
|
1130
|
+
| `connected` | 连接成功 |
|
|
1131
|
+
| `task_status` | 任务状态变更 |
|
|
1132
|
+
| `task_progress` | 任务进度更新 |
|
|
1133
|
+
| `task_complete` | 任务完成 |
|
|
1134
|
+
| `task_failed` | 任务失败 |
|
|
1135
|
+
| `queue_stats` | 队列统计 |
|
|
1136
|
+
|
|
1137
|
+
## 💾 数据库支持
|
|
1138
|
+
|
|
1139
|
+
服务支持使用 SQLite 数据库替代 JSON 文件存储,提供更高效的查询和分析能力。
|
|
1140
|
+
|
|
1141
|
+
### 启用数据库
|
|
1142
|
+
|
|
1143
|
+
```bash
|
|
1144
|
+
# 1. 安装数据库依赖
|
|
1145
|
+
npm run install:db
|
|
1146
|
+
|
|
1147
|
+
# 2. 从 JSON 迁移到数据库
|
|
1148
|
+
npm run migrate
|
|
1149
|
+
```
|
|
1150
|
+
|
|
1151
|
+
### 迁移过程
|
|
1152
|
+
|
|
1153
|
+
```bash
|
|
1154
|
+
$ npm run migrate
|
|
1155
|
+
|
|
1156
|
+
> ai-auto-fix@2.3.0 migrate
|
|
1157
|
+
> node src/database/migration.js
|
|
1158
|
+
|
|
1159
|
+
开始数据迁移...
|
|
1160
|
+
找到 120 条任务记录
|
|
1161
|
+
✅ JSON 文件已备份: data/tasks.json.backup.2026-01-03T10-00-00-000Z
|
|
1162
|
+
✅ 数据迁移完成: 成功 120 条, 失败 0 条
|
|
1163
|
+
|
|
1164
|
+
迁移验证:
|
|
1165
|
+
JSON 文件任务数: 120
|
|
1166
|
+
数据库任务总数: 120
|
|
1167
|
+
✅ 验证通过:任务数量一致
|
|
1168
|
+
|
|
1169
|
+
✅ 迁移成功并已验证
|
|
1170
|
+
```
|
|
1171
|
+
|
|
1172
|
+
### 数据库优势
|
|
1173
|
+
|
|
1174
|
+
| 特性 | JSON 文件 | SQLite 数据库 |
|
|
1175
|
+
|------|----------|-------------|
|
|
1176
|
+
| **查询速度** | 慢(需全文件读取) | 快(索引支持) |
|
|
1177
|
+
| **复杂查询** | ❌ 不支持 | ✅ 支持 SQL |
|
|
1178
|
+
| **数据统计** | ❌ 需手动计算 | ✅ 内置聚合函数 |
|
|
1179
|
+
| **并发访问** | ❌ 可能冲突 | ✅ 事务支持 |
|
|
1180
|
+
| **数据分析** | ❌ 困难 | ✅ 简单 |
|
|
1181
|
+
| **性能** | 任务多时变慢 | 任务多时保持快速 |
|
|
1182
|
+
|
|
1183
|
+
### 数据库表结构
|
|
1184
|
+
|
|
1185
|
+
```sql
|
|
1186
|
+
-- 任务表
|
|
1187
|
+
CREATE TABLE tasks (
|
|
1188
|
+
id TEXT PRIMARY KEY,
|
|
1189
|
+
status TEXT NOT NULL,
|
|
1190
|
+
requirement TEXT NOT NULL,
|
|
1191
|
+
project_path TEXT,
|
|
1192
|
+
-- ... 其他字段
|
|
1193
|
+
created_at TEXT NOT NULL
|
|
1194
|
+
);
|
|
1195
|
+
|
|
1196
|
+
-- 任务结果表
|
|
1197
|
+
CREATE TABLE task_results (
|
|
1198
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1199
|
+
task_id TEXT NOT NULL,
|
|
1200
|
+
success BOOLEAN NOT NULL,
|
|
1201
|
+
-- ... 其他字段
|
|
1202
|
+
FOREIGN KEY (task_id) REFERENCES tasks(id)
|
|
1203
|
+
);
|
|
1204
|
+
|
|
1205
|
+
-- 任务进度表
|
|
1206
|
+
CREATE TABLE task_progress (
|
|
1207
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1208
|
+
task_id TEXT NOT NULL,
|
|
1209
|
+
step TEXT NOT NULL,
|
|
1210
|
+
message TEXT NOT NULL,
|
|
1211
|
+
created_at TEXT NOT NULL
|
|
1212
|
+
);
|
|
1213
|
+
|
|
1214
|
+
-- 性能指标表
|
|
1215
|
+
CREATE TABLE metrics (
|
|
1216
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
1217
|
+
metric_type TEXT NOT NULL,
|
|
1218
|
+
metric_key TEXT NOT NULL,
|
|
1219
|
+
metric_value REAL NOT NULL,
|
|
1220
|
+
created_at TEXT NOT NULL
|
|
1221
|
+
);
|
|
1222
|
+
```
|
|
1223
|
+
|
|
1224
|
+
### 迁移回滚
|
|
1225
|
+
|
|
1226
|
+
如果迁移后发现问题,可以回滚到 JSON 文件:
|
|
1227
|
+
|
|
1228
|
+
```bash
|
|
1229
|
+
# 使用备份文件恢复
|
|
1230
|
+
cp data/tasks.json.backup.* data/tasks.json
|
|
1231
|
+
```
|
|
1232
|
+
|
|
1233
|
+
## 📋 日志系统
|
|
1234
|
+
|
|
1235
|
+
服务使用 Winston 进行日志管理,支持控制台和文件双输出。
|
|
1236
|
+
|
|
1237
|
+
### 日志配置
|
|
1238
|
+
|
|
1239
|
+
在 `.env` 文件中配置日志级别:
|
|
1240
|
+
|
|
1241
|
+
```env
|
|
1242
|
+
# 日志级别:error, warn, info, debug
|
|
1243
|
+
LOG_LEVEL=info
|
|
1244
|
+
```
|
|
1245
|
+
|
|
1246
|
+
### 日志文件
|
|
1247
|
+
|
|
1248
|
+
日志文件自动按天轮转,存储在 `logs/` 目录:
|
|
1249
|
+
|
|
1250
|
+
- **combined-{日期}.log**: 包含所有级别的日志
|
|
1251
|
+
- **error-{日期}.log**: 仅包含错误日志
|
|
1252
|
+
|
|
1253
|
+
### 日志保留策略
|
|
1254
|
+
|
|
1255
|
+
- 综合日志:保留 14 天
|
|
1256
|
+
- 错误日志:保留 30 天
|
|
1257
|
+
- 单个日志文件最大 20MB
|
|
1258
|
+
|
|
1259
|
+
### 日志格式
|
|
1260
|
+
|
|
1261
|
+
```
|
|
1262
|
+
[2026-01-02 10:00:00] [INFO] [Task: task-1735819200-abc123]: 🚀 开始任务 task-1735819200-abc123
|
|
1263
|
+
[2026-01-02 10:00:01] [INFO] [Task: task-1735819200-abc123]: 📋 需求: 修复登录按钮问题
|
|
1264
|
+
[2026-01-02 10:00:15] [INFO] [Task: task-1735819200-abc123]: ✅ 任务完成
|
|
1265
|
+
```
|
|
1266
|
+
|
|
1267
|
+
### 查看日志
|
|
1268
|
+
|
|
1269
|
+
```bash
|
|
1270
|
+
# 查看实时日志
|
|
1271
|
+
tail -f logs/combined-$(date +%Y-%m-%d).log
|
|
1272
|
+
|
|
1273
|
+
# 查看错误日志
|
|
1274
|
+
tail -f logs/error-$(date +%Y-%m-% d).log
|
|
1275
|
+
|
|
1276
|
+
# 搜索特定任务的日志
|
|
1277
|
+
grep "task-1735819200-abc123" logs/combined-*.log
|
|
1278
|
+
```
|
|
1279
|
+
|
|
1280
|
+
## 🛠️ Claude 可用工具
|
|
1281
|
+
|
|
1282
|
+
Claude 在修复过程中可以使用以下工具:
|
|
1283
|
+
|
|
1284
|
+
| 工具 | 说明 |
|
|
1285
|
+
|------|------|
|
|
1286
|
+
| `read_file` | 读取文件内容 |
|
|
1287
|
+
| `write_file` | 写入/修改文件 |
|
|
1288
|
+
| `list_files` | 列出目录中的文件 |
|
|
1289
|
+
| `search_code` | 在项目中搜索代码 |
|
|
1290
|
+
| `run_command` | 执行 shell 命令(谨慎使用) |
|
|
1291
|
+
|
|
1292
|
+
## 📢 企业微信通知
|
|
1293
|
+
|
|
1294
|
+
配置 `WECOM_WEBHOOK` 后,服务会在以下时机发送通知:
|
|
1295
|
+
|
|
1296
|
+
- ✅ 任务开始
|
|
1297
|
+
- ✅ 任务成功完成
|
|
1298
|
+
- ❌ 任务失败
|
|
1299
|
+
|
|
1300
|
+
**通知示例:**
|
|
1301
|
+
|
|
1302
|
+
```markdown
|
|
1303
|
+
## ✅ 自动修复任务完成
|
|
1304
|
+
|
|
1305
|
+
**项目名称**: my-project
|
|
1306
|
+
**分支**: `fix/auto-1735819200000`
|
|
1307
|
+
**修改文件数**: 2
|
|
1308
|
+
|
|
1309
|
+
### 修改的文件
|
|
1310
|
+
- src/components/Login.js
|
|
1311
|
+
- src/utils/logger.js
|
|
1312
|
+
|
|
1313
|
+
### 修改说明
|
|
1314
|
+
已完成修复,修改了登录组件...
|
|
1315
|
+
|
|
1316
|
+
**完成时间**: 2026-01-02 10:00:00
|
|
1317
|
+
```
|
|
1318
|
+
|
|
1319
|
+
## 🌿 分支管理策略
|
|
1320
|
+
|
|
1321
|
+
### 分支命名规则
|
|
1322
|
+
|
|
1323
|
+
服务支持灵活的分支命名策略:
|
|
1324
|
+
|
|
1325
|
+
**新分支命名格式**:`fix_[username]_[taskid]_[timestamp]`
|
|
1326
|
+
|
|
1327
|
+
- `username`: 用户名,通过 `username` 参数指定,默认为 `system`
|
|
1328
|
+
- `taskid`: 任务 ID,自动生成(格式:`task-{timestamp}-{random}`)
|
|
1329
|
+
- `timestamp`: 创建时间戳(毫秒)
|
|
1330
|
+
|
|
1331
|
+
**示例分支名称**:
|
|
1332
|
+
- `fix_zhangsan_task-1735819200-abc123_1735819200000`
|
|
1333
|
+
- `fix_system_task-1735820000-xyz456_1735820000000`
|
|
1334
|
+
|
|
1335
|
+
### 分支创建模式
|
|
1336
|
+
|
|
1337
|
+
服务支持两种分支管理模式:
|
|
1338
|
+
|
|
1339
|
+
**1. 创建新分支(默认)**
|
|
1340
|
+
|
|
1341
|
+
```json
|
|
1342
|
+
{
|
|
1343
|
+
"createNewBranch": true, // 默认值
|
|
1344
|
+
"username": "zhangsan",
|
|
1345
|
+
"baseBranch": "develop",
|
|
1346
|
+
"requirement": "修复bug"
|
|
1347
|
+
}
|
|
1348
|
+
```
|
|
1349
|
+
|
|
1350
|
+
- 从基准分支创建新的功能分支
|
|
1351
|
+
- 分支命名遵循上述规则
|
|
1352
|
+
- 适合大多数开发场景
|
|
1353
|
+
|
|
1354
|
+
**2. 直接在基准分支开发**
|
|
1355
|
+
|
|
1356
|
+
```json
|
|
1357
|
+
{
|
|
1358
|
+
"createNewBranch": false,
|
|
1359
|
+
"baseBranch": "develop",
|
|
1360
|
+
"requirement": "修复配置文件拼写错误"
|
|
1361
|
+
}
|
|
1362
|
+
```
|
|
1363
|
+
|
|
1364
|
+
- 直接切换到指定的基准分支
|
|
1365
|
+
- 不创建新分支,直接在该分支上提交
|
|
1366
|
+
- 适合简单修改或配置更新
|
|
1367
|
+
|
|
1368
|
+
### 基准分支
|
|
1369
|
+
|
|
1370
|
+
默认情况下,服务会自动从 `main` 或 `master` 分支创建功能分支。你可以通过 `baseBranch` 参数指定其他基准分支:
|
|
1371
|
+
|
|
1372
|
+
```json
|
|
1373
|
+
{
|
|
1374
|
+
"baseBranch": "develop",
|
|
1375
|
+
"requirement": "修复bug"
|
|
1376
|
+
}
|
|
1377
|
+
```
|
|
1378
|
+
|
|
1379
|
+
### 自动合并
|
|
1380
|
+
|
|
1381
|
+
服务支持在修复完成后自动合并到指定的目标分支。通过以下参数控制:
|
|
1382
|
+
|
|
1383
|
+
- `mergeToAlpha`: 合并到 alpha 分支(测试环境)
|
|
1384
|
+
- `mergeToBeta`: 合并到 beta 分支(预发布环境)
|
|
1385
|
+
- `mergeToMaster`: 合并到 master 分支(生产环境)
|
|
1386
|
+
|
|
1387
|
+
**合并流程**:
|
|
1388
|
+
1. 切换到目标分支
|
|
1389
|
+
2. 拉取最新代码
|
|
1390
|
+
3. 执行非快进合并(`--no-ff`)
|
|
1391
|
+
4. 推送到远程仓库
|
|
1392
|
+
5. 返回源分支
|
|
1393
|
+
|
|
1394
|
+
**合并失败处理**:
|
|
1395
|
+
- 如果合并冲突,会自动中止合并
|
|
1396
|
+
- 合并结果会在响应的 `mergeResults` 字段中返回
|
|
1397
|
+
- 日志中会详细记录每个分支的合并状态
|
|
1398
|
+
|
|
1399
|
+
### 使用场景
|
|
1400
|
+
|
|
1401
|
+
```json
|
|
1402
|
+
// 场景 1: 创建新分支进行开发(推荐)
|
|
1403
|
+
{
|
|
1404
|
+
"baseBranch": "develop",
|
|
1405
|
+
"createNewBranch": true,
|
|
1406
|
+
"username": "zhangsan",
|
|
1407
|
+
"autoPush": true,
|
|
1408
|
+
"requirement": "添加新功能"
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
// 场景 2: 直接在基准分支修改(简单修改)
|
|
1412
|
+
{
|
|
1413
|
+
"baseBranch": "develop",
|
|
1414
|
+
"createNewBranch": false,
|
|
1415
|
+
"requirement": "修复配置文件拼写错误"
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
// 场景 3: 快速修复并发布到测试环境
|
|
1419
|
+
{
|
|
1420
|
+
"baseBranch": "develop",
|
|
1421
|
+
"createNewBranch": true,
|
|
1422
|
+
"username": "lisi",
|
|
1423
|
+
"mergeToAlpha": true,
|
|
1424
|
+
"requirement": "修复测试环境发现的bug"
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
// 场景 4: 紧急修复,逐步发布
|
|
1428
|
+
{
|
|
1429
|
+
"baseBranch": "master",
|
|
1430
|
+
"createNewBranch": true,
|
|
1431
|
+
"username": "wangwu",
|
|
1432
|
+
"mergeToAlpha": true,
|
|
1433
|
+
"mergeToBeta": true,
|
|
1434
|
+
"runTests": true,
|
|
1435
|
+
"requirement": "修复紧急安全漏洞"
|
|
1436
|
+
}
|
|
1437
|
+
```
|
|
1438
|
+
|
|
1439
|
+
**⚠️ 重要提示**:
|
|
1440
|
+
- 生产环境合并(`mergeToMaster`)应谨慎使用
|
|
1441
|
+
- 建议配合 `runTests: true` 确保代码质量
|
|
1442
|
+
- 对于重要修改,建议先推送分支,通过 PR 审核后再手动合并
|
|
1443
|
+
- 使用 `createNewBranch: false` 时要特别注意,确认基准分支是正确的
|
|
1444
|
+
|
|
1445
|
+
## ⚠️ 注意事项
|
|
1446
|
+
|
|
1447
|
+
1. **Claude CLI 配置**:确保已正确安装和配置 Claude CLI
|
|
1448
|
+
2. **安全性**:
|
|
1449
|
+
- 不要将 `.env` 文件提交到版本控制
|
|
1450
|
+
- 保护好 API Key 和 Webhook 地址
|
|
1451
|
+
- 建议在内网环境运行
|
|
1452
|
+
3. **测试**:重要项目建议开启 `runTests` 参数
|
|
1453
|
+
4. **审核**:建议先创建 PR 由人工审核,而非直接合并到主分支
|
|
1454
|
+
|
|
1455
|
+
## 🐛 故障排查
|
|
1456
|
+
|
|
1457
|
+
### 1. Claude CLI 调用失败
|
|
1458
|
+
|
|
1459
|
+
**问题**:Claude CLI 命令执行失败
|
|
1460
|
+
|
|
1461
|
+
**解决**:
|
|
1462
|
+
- 确保已安装 Claude CLI:`npm install -g @anthropic-ai/claude`
|
|
1463
|
+
- 检查 Claude CLI 配置是否正确
|
|
1464
|
+
- 验证 Claude CLI 权限设置
|
|
1465
|
+
|
|
1466
|
+
### 2. Git 操作失败
|
|
1467
|
+
|
|
1468
|
+
**问题**:`git: command not found` 或权限错误
|
|
1469
|
+
|
|
1470
|
+
**解决**:
|
|
1471
|
+
- 确保已安装 Git 并在 PATH 中
|
|
1472
|
+
- 检查项目目录的读写权限
|
|
1473
|
+
- 验证 Git 仓库的访问权限(SSH key 或 token)
|
|
1474
|
+
|
|
1475
|
+
### 3. 企业微信通知未收到
|
|
1476
|
+
|
|
1477
|
+
**问题**:通知未发送
|
|
1478
|
+
|
|
1479
|
+
**解决**:
|
|
1480
|
+
- 检查 `WECOM_WEBHOOK` 是否正确配置
|
|
1481
|
+
- 验证 Webhook 地址是否有效
|
|
1482
|
+
- 查看服务日志中的错误信息
|
|
1483
|
+
|
|
1484
|
+
### 4. 分支合并失败
|
|
1485
|
+
|
|
1486
|
+
**问题**:自动合并到目标分支失败
|
|
1487
|
+
|
|
1488
|
+
**解决**:
|
|
1489
|
+
- 检查目标分支是否存在(alpha/beta/master)
|
|
1490
|
+
- 查看日志中的合并冲突详情
|
|
1491
|
+
- 验证是否有权限推送到目标分支
|
|
1492
|
+
- 如有冲突,建议手动解决或先不使用自动合并功能
|
|
1493
|
+
- 检查 `mergeResults` 字段查看具体哪个分支合并失败
|
|
1494
|
+
|
|
1495
|
+
## 📝 示例场景
|
|
1496
|
+
|
|
1497
|
+
### 场景 1:修复简单 Bug
|
|
1498
|
+
|
|
1499
|
+
```bash
|
|
1500
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
1501
|
+
-H "Content-Type: application/json" \
|
|
1502
|
+
-d '{
|
|
1503
|
+
"projectPath": "e:\\demo\\my-app",
|
|
1504
|
+
"requirement": "修复用户注册页面的邮箱验证正则表达式,应该支持 .com.cn 域名"
|
|
1505
|
+
}'
|
|
1506
|
+
```
|
|
1507
|
+
|
|
1508
|
+
### 场景 2:批量文案修改
|
|
1509
|
+
|
|
1510
|
+
```bash
|
|
1511
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
1512
|
+
-H "Content-Type: application/json" \
|
|
1513
|
+
-d '{
|
|
1514
|
+
"repoUrl": "https://github.com/myteam/website.git",
|
|
1515
|
+
"requirement": "将所有页面中的「登陆」改为「登录」,「註冊」改为「注册」"
|
|
1516
|
+
}'
|
|
1517
|
+
```
|
|
1518
|
+
|
|
1519
|
+
### 场景 3:代码重构
|
|
1520
|
+
|
|
1521
|
+
```bash
|
|
1522
|
+
curl -X POST http://localhost:3000/api/fix-bug \
|
|
1523
|
+
-H "Content-Type: application/json" \
|
|
1524
|
+
-d '{
|
|
1525
|
+
"projectPath": "e:\\demo\\api-server",
|
|
1526
|
+
"requirement": "将 src/utils 目录下所有使用 var 声明的变量改为 const 或 let",
|
|
1527
|
+
"runTests": true
|
|
1528
|
+
}'
|
|
1529
|
+
```
|
|
1530
|
+
|
|
1531
|
+
## 🔄 集成到现有工作流
|
|
1532
|
+
|
|
1533
|
+
### 与 JIRA 集成
|
|
1534
|
+
|
|
1535
|
+
通过 JIRA Webhook 触发自动修复:
|
|
1536
|
+
|
|
1537
|
+
```javascript
|
|
1538
|
+
// jira-webhook-handler.js
|
|
1539
|
+
app.post('/webhook/jira', async (req, res) => {
|
|
1540
|
+
const { issue } = req.body;
|
|
1541
|
+
|
|
1542
|
+
if (issue.labels.includes('auto-fix')) {
|
|
1543
|
+
await axios.post('http://localhost:3000/api/fix-bug', {
|
|
1544
|
+
projectPath: 'e:\\demo\\my-project',
|
|
1545
|
+
requirement: issue.fields.description
|
|
1546
|
+
});
|
|
1547
|
+
}
|
|
1548
|
+
|
|
1549
|
+
res.sendStatus(200);
|
|
1550
|
+
});
|
|
1551
|
+
```
|
|
1552
|
+
|
|
1553
|
+
### 与 GitLab CI 集成
|
|
1554
|
+
|
|
1555
|
+
在 `.gitlab-ci.yml` 中:
|
|
1556
|
+
|
|
1557
|
+
```yaml
|
|
1558
|
+
auto-fix:
|
|
1559
|
+
stage: fix
|
|
1560
|
+
only:
|
|
1561
|
+
- labels:
|
|
1562
|
+
- auto-fix
|
|
1563
|
+
script:
|
|
1564
|
+
- |
|
|
1565
|
+
curl -X POST http://fix-service:3000/api/fix-bug \
|
|
1566
|
+
-H "Content-Type: application/json" \
|
|
1567
|
+
-d "{
|
|
1568
|
+
\"repoUrl\": \"$CI_REPOSITORY_URL\",
|
|
1569
|
+
\"requirement\": \"$ISSUE_DESCRIPTION\"
|
|
1570
|
+
}"
|
|
1571
|
+
```
|
|
1572
|
+
|
|
1573
|
+
## 📚 详细文档
|
|
1574
|
+
|
|
1575
|
+
- [SERVICE_MANAGEMENT.md](SERVICE_MANAGEMENT.md) - 服务管理脚本使用指南
|
|
1576
|
+
- [MANUAL_APPROVAL_WORKFLOW.md](MANUAL_APPROVAL_WORKFLOW.md) - 人工确认机制实现文档
|
|
1577
|
+
- [PROJECT_LOCK_IMPLEMENTATION.md](PROJECT_LOCK_IMPLEMENTATION.md) - 项目锁实现文档
|
|
1578
|
+
- [TASK_QUEUE_INTEGRATION.md](TASK_QUEUE_INTEGRATION.md) - 任务队列集成文档
|
|
1579
|
+
- [WEBSOCKET_INTEGRATION.md](WEBSOCKET_INTEGRATION.md) - WebSocket 实时通知集成文档
|
|
1580
|
+
- [DATABASE_MIGRATION.md](DATABASE_MIGRATION.md) - 数据库迁移指南
|
|
1581
|
+
- [SMART_PROJECT_PREPARATION.md](SMART_PROJECT_PREPARATION.md) - 智能项目准备机制文档
|
|
1582
|
+
- [TASK_CANCELLATION_IMPLEMENTATION.md](TASK_CANCELLATION_IMPLEMENTATION.md) - 任务取消实现文档
|
|
1583
|
+
|
|
1584
|
+
## 📄 License
|
|
1585
|
+
|
|
1586
|
+
MIT
|
|
1587
|
+
|
|
1588
|
+
## 🤝 贡献
|
|
1589
|
+
|
|
1590
|
+
欢迎提交 Issue 和 Pull Request!
|