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.
Files changed (52) hide show
  1. package/.env.example +69 -0
  2. package/README.md +1590 -0
  3. package/bin/cfix +14 -0
  4. package/bin/cfix.cmd +6 -0
  5. package/cli/commands/config.js +58 -0
  6. package/cli/commands/doctor.js +240 -0
  7. package/cli/commands/fix.js +211 -0
  8. package/cli/commands/help.js +62 -0
  9. package/cli/commands/init.js +226 -0
  10. package/cli/commands/logs.js +161 -0
  11. package/cli/commands/monitor.js +151 -0
  12. package/cli/commands/project.js +331 -0
  13. package/cli/commands/service.js +133 -0
  14. package/cli/commands/status.js +115 -0
  15. package/cli/commands/task.js +412 -0
  16. package/cli/commands/version.js +19 -0
  17. package/cli/index.js +269 -0
  18. package/cli/lib/config-manager.js +612 -0
  19. package/cli/lib/formatter.js +224 -0
  20. package/cli/lib/process-manager.js +233 -0
  21. package/cli/lib/service-client.js +271 -0
  22. package/cli/scripts/install-completion.js +133 -0
  23. package/package.json +85 -0
  24. package/public/monitor.html +1096 -0
  25. package/scripts/completion.bash +87 -0
  26. package/scripts/completion.zsh +102 -0
  27. package/src/assets/README.md +32 -0
  28. package/src/assets/error.png +0 -0
  29. package/src/assets/icon.png +0 -0
  30. package/src/assets/success.png +0 -0
  31. package/src/claude-cli-service.js +216 -0
  32. package/src/config/index.js +69 -0
  33. package/src/database/manager.js +391 -0
  34. package/src/database/migration.js +252 -0
  35. package/src/git-service.js +1278 -0
  36. package/src/index.js +1658 -0
  37. package/src/logger.js +139 -0
  38. package/src/metrics/collector.js +184 -0
  39. package/src/middleware/auth.js +86 -0
  40. package/src/middleware/rate-limit.js +85 -0
  41. package/src/queue/integration-example.js +283 -0
  42. package/src/queue/task-queue.js +333 -0
  43. package/src/services/notification-limiter.js +48 -0
  44. package/src/services/notification-service.js +115 -0
  45. package/src/services/system-notifier.js +130 -0
  46. package/src/task-manager.js +289 -0
  47. package/src/utils/exec.js +87 -0
  48. package/src/utils/project-lock.js +246 -0
  49. package/src/utils/retry.js +110 -0
  50. package/src/utils/sanitizer.js +174 -0
  51. package/src/websocket/notifier.js +363 -0
  52. 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!