@@ -3,6 +3,7 @@ package agent
3
3
import (
4
4
"fmt"
5
5
"io"
6
+ "path/filepath"
6
7
"strings"
7
8
"time"
8
9
@@ -39,119 +40,56 @@ func New(cfg *config.Config, workspaceManager *workspace.Manager) *Agent {
39
40
}
40
41
}
41
42
42
- // ProcessIssue 处理 Issue 事件,生成代码(保留向后兼容)
43
- func (a * Agent ) ProcessIssue ( issue * github.Issue ) error {
44
- // 1. 准备临时工作空间
45
- ws := a .workspace .Prepare ( issue )
46
- if ws . ID == "" {
47
- return fmt .Errorf ("failed to prepare workspace" )
43
+ // ProcessIssueComment 处理 Issue 评论事件,包含完整的仓库信息
44
+ func (a * Agent ) ProcessIssueComment ( event * github.IssueCommentEvent ) error {
45
+ // 1. 创建 Issue 工作空间
46
+ ws := a .workspace .CreateWorkspaceFromIssue ( event . Issue )
47
+ if ws == nil {
48
+ return fmt .Errorf ("failed to create workspace from issue " )
48
49
}
49
50
50
51
// 2. 创建分支并推送
51
- if err := a .github .CreateBranch (& ws ); err != nil {
52
+ if err := a .github .CreateBranch (ws ); err != nil {
52
53
log .Errorf ("Failed to create branch: %v" , err )
53
54
return err
54
55
}
55
56
56
57
// 3. 创建初始 PR
57
- pr , err := a .github .CreatePullRequest (& ws )
58
+ pr , err := a .github .CreatePullRequest (ws )
58
59
if err != nil {
59
60
log .Errorf ("Failed to create PR: %v" , err )
60
61
return err
61
62
}
62
63
63
- // 4. 初始化 code client
64
- code , err := a .sessionManager .GetSession (& ws )
65
- if err != nil {
66
- log .Errorf ("failed to get code client: %v" , err )
67
- return err
64
+ // 4. 移动工作空间从 Issue 到 PR
65
+ if err := a .workspace .MoveIssueToPR (ws , pr .GetNumber ()); err != nil {
66
+ log .Errorf ("Failed to move workspace: %v" , err )
68
67
}
68
+ ws .PRNumber = pr .GetNumber ()
69
69
70
- // 5. 执行代码修改,使用更明确的 prompt
71
- codePrompt := fmt .Sprintf (`请根据以下 Issue 内容直接修改代码:
72
-
73
- 标题:%s
74
- 描述:%s
75
-
76
- 要求:
77
- 1. 仔细分析 Issue 需求,理解要解决的问题
78
- 2. 查看现有代码结构,找到需要修改的文件
79
- 3. 直接实现代码修改,确保功能完整
80
- 4. 遵循项目的代码风格和最佳实践
81
- 5. 添加必要的测试用例(如果需要)
82
- 6. 确保代码能够正常运行
83
-
84
- 请开始分析和修改代码。` , issue .GetTitle (), issue .GetBody ())
85
- codeResp , err := a .promptWithRetry (code , codePrompt , 3 )
70
+ // 5. 创建 session 目录
71
+ suffix := strings .TrimPrefix (filepath .Base (ws .Path ), fmt .Sprintf ("%s-pr-%d-" , ws .Repo , pr .GetNumber ()))
72
+ sessionPath , err := a .workspace .CreateSessionPath (filepath .Dir (ws .Path ), ws .Repo , pr .GetNumber (), suffix )
86
73
if err != nil {
87
- log .Errorf ("failed to prompt for code modification: %v" , err )
88
- return err
89
- }
90
-
91
- codeOutput , err := io .ReadAll (codeResp .Out )
92
- if err != nil {
93
- log .Errorf ("failed to read code modification output: %v" , err )
94
- return err
95
- }
96
-
97
- log .Infof ("Code Modification Output: %s" , string (codeOutput ))
98
-
99
- // 6. 更新 PR Body 为执行结果
100
- if err = a .github .UpdatePullRequest (pr , string (codeOutput )); err != nil {
101
- log .Errorf ("failed to update PR body with execution result: %v" , err )
102
- return err
103
- }
104
-
105
- // 7. 评论到 PR
106
- commentBody := fmt .Sprintf ("<details><summary>Code Modification Session</summary>%s</details>" , string (codeOutput ))
107
- if err = a .github .CreatePullRequestComment (pr , commentBody ); err != nil {
108
- log .Errorf ("failed to create PR comment for code modification: %v" , err )
109
- return err
110
- }
111
-
112
- // 8. 提交变更并推送到远程
113
- result := & models.ExecutionResult {
114
- Output : string (codeOutput ),
115
- }
116
- if err = a .github .CommitAndPush (& ws , result , code ); err != nil {
117
- log .Errorf ("Failed to commit and push: %v" , err )
74
+ log .Errorf ("Failed to create session directory: %v" , err )
118
75
return err
119
76
}
77
+ ws .SessionPath = sessionPath
120
78
121
- log . Infof ( "Successfully processed Issue #%d, PR: %s" , issue . GetNumber (), pr . GetHTMLURL ())
122
- return nil
123
- }
79
+ // 6. 注册工作空间到 PR 映射
80
+ ws . PullRequest = pr
81
+ a . workspace . RegisterWorkspace ( ws , pr )
124
82
125
- // ProcessIssueComment 处理 Issue 评论事件,包含完整的仓库信息
126
- func (a * Agent ) ProcessIssueComment (event * github.IssueCommentEvent ) error {
127
- // 1. 准备临时工作空间,传递完整事件
128
- ws := a .workspace .PrepareFromEvent (event )
129
- if ws .ID == "" {
130
- return fmt .Errorf ("failed to prepare workspace" )
131
- }
83
+ log .Infof ("process issue #%d, workspace: %s, session: %s" , event .Issue .GetNumber (), ws .Path , ws .SessionPath )
132
84
133
- // 2. 创建分支并推送
134
- if err := a .github .CreateBranch (& ws ); err != nil {
135
- log .Errorf ("Failed to create branch: %v" , err )
136
- return err
137
- }
138
-
139
- // 3. 创建初始 PR
140
- pr , err := a .github .CreatePullRequest (& ws )
141
- if err != nil {
142
- log .Errorf ("Failed to create PR: %v" , err )
143
- return err
144
- }
145
- a .workspace .RegisterWorkspace (& ws , pr )
146
-
147
- // 4. 初始化 code client
148
- code , err := a .sessionManager .GetSession (& ws )
85
+ // 7. 初始化 code client
86
+ code , err := a .sessionManager .GetSession (ws )
149
87
if err != nil {
150
88
log .Errorf ("failed to get code client: %v" , err )
151
89
return err
152
90
}
153
91
154
- // 5 . 执行代码修改,规范 prompt,要求 AI 输出结构化摘要
92
+ // 8 . 执行代码修改,规范 prompt,要求 AI 输出结构化摘要
155
93
codePrompt := fmt .Sprintf (`请根据以下 Issue 内容修改代码:
156
94
157
95
标题:%s
@@ -182,7 +120,7 @@ func (a *Agent) ProcessIssueComment(event *github.IssueCommentEvent) error {
182
120
183
121
log .Infof ("LLM Output: %s" , string (codeOutput ))
184
122
185
- // 6 . 组织结构化 PR Body(解析三段式输出)
123
+ // 9 . 组织结构化 PR Body(解析三段式输出)
186
124
aiStr := string (codeOutput )
187
125
188
126
// 解析三段式输出
@@ -219,11 +157,11 @@ func (a *Agent) ProcessIssueComment(event *github.IssueCommentEvent) error {
219
157
return err
220
158
}
221
159
222
- // 8 . 提交变更并推送到远程
160
+ // 10 . 提交变更并推送到远程
223
161
result := & models.ExecutionResult {
224
162
Output : string (codeOutput ),
225
163
}
226
- if err = a .github .CommitAndPush (& ws , result , code ); err != nil {
164
+ if err = a .github .CommitAndPush (ws , result , code ); err != nil {
227
165
log .Errorf ("Failed to commit and push: %v" , err )
228
166
return err
229
167
}
@@ -314,13 +252,19 @@ func (a *Agent) ContinuePRWithArgs(event *github.IssueCommentEvent, args string)
314
252
HTMLURL : event .Issue .HTMLURL ,
315
253
}
316
254
317
- // 2. 准备临时工作空间
318
- ws := a .workspace .Getworkspace (pr )
255
+ // 2. 获取或创建 PR 工作空间
256
+ ws := a .workspace .GetOrCreateWorkspaceForPR (pr )
319
257
if ws == nil {
320
- return fmt .Errorf ("failed to prepare workspace for PR continue" )
258
+ return fmt .Errorf ("failed to get or create workspace for PR continue" )
321
259
}
322
260
323
- // 3. 初始化 code client
261
+ // 3. 拉取远端最新代码
262
+ if err := a .github .PullLatestChanges (ws ); err != nil {
263
+ log .Errorf ("Failed to pull latest changes: %v" , err )
264
+ // 不返回错误,继续执行,因为可能是网络问题
265
+ }
266
+
267
+ // 4. 初始化 code client
324
268
code , err := a .sessionManager .GetSession (ws )
325
269
if err != nil {
326
270
log .Errorf ("failed to get code client for PR continue: %v" , err )
@@ -390,13 +334,19 @@ func (a *Agent) FixPRWithArgs(event *github.IssueCommentEvent, args string) erro
390
334
HTMLURL : event .Issue .HTMLURL ,
391
335
}
392
336
393
- // 2. 准备临时工作空间
394
- ws := a .workspace .Getworkspace (pr )
337
+ // 2. 获取或创建 PR 工作空间
338
+ ws := a .workspace .GetOrCreateWorkspaceForPR (pr )
395
339
if ws == nil {
396
- return fmt .Errorf ("failed to prepare workspace for PR fix" )
340
+ return fmt .Errorf ("failed to get or create workspace for PR fix" )
341
+ }
342
+
343
+ // 3. 拉取远端最新代码
344
+ if err := a .github .PullLatestChanges (ws ); err != nil {
345
+ log .Errorf ("Failed to pull latest changes: %v" , err )
346
+ // 不返回错误,继续执行,因为可能是网络问题
397
347
}
398
348
399
- // 3 . 初始化 code client
349
+ // 4 . 初始化 code client
400
350
code , err := a .sessionManager .GetSession (ws )
401
351
if err != nil {
402
352
log .Errorf ("failed to get code client for PR fix: %v" , err )
@@ -452,13 +402,19 @@ func (a *Agent) ContinuePRFromReviewComment(event *github.PullRequestReviewComme
452
402
// 1. 从工作空间管理器获取 PR 信息
453
403
pr := event .PullRequest
454
404
455
- // 2. 准备临时工作空间
456
- ws := a .workspace .Getworkspace (pr )
405
+ // 2. 获取或创建 PR 工作空间
406
+ ws := a .workspace .GetOrCreateWorkspaceForPR (pr )
457
407
if ws == nil {
458
- return fmt .Errorf ("failed to prepare workspace for PR continue from review comment" )
408
+ return fmt .Errorf ("failed to get or create workspace for PR continue from review comment" )
409
+ }
410
+
411
+ // 3. 拉取远端最新代码
412
+ if err := a .github .PullLatestChanges (ws ); err != nil {
413
+ log .Errorf ("Failed to pull latest changes: %v" , err )
414
+ // 不返回错误,继续执行,因为可能是网络问题
459
415
}
460
416
461
- // 3 . 初始化 code client
417
+ // 4 . 初始化 code client
462
418
code , err := a .sessionManager .GetSession (ws )
463
419
if err != nil {
464
420
log .Errorf ("failed to get code client for PR continue from review comment: %v" , err )
@@ -533,13 +489,19 @@ func (a *Agent) FixPRFromReviewComment(event *github.PullRequestReviewCommentEve
533
489
// 1. 从工作空间管理器获取 PR 信息
534
490
pr := event .PullRequest
535
491
536
- // 2. 准备临时工作空间
537
- ws := a .workspace .Getworkspace (pr )
492
+ // 2. 获取或创建 PR 工作空间
493
+ ws := a .workspace .GetOrCreateWorkspaceForPR (pr )
538
494
if ws == nil {
539
- return fmt .Errorf ("failed to prepare workspace for PR fix from review comment" )
495
+ return fmt .Errorf ("failed to get or create workspace for PR fix from review comment" )
496
+ }
497
+
498
+ // 3. 拉取远端最新代码
499
+ if err := a .github .PullLatestChanges (ws ); err != nil {
500
+ log .Errorf ("Failed to pull latest changes: %v" , err )
501
+ // 不返回错误,继续执行,因为可能是网络问题
540
502
}
541
503
542
- // 3 . 初始化 code client
504
+ // 4 . 初始化 code client
543
505
code , err := a .sessionManager .GetSession (ws )
544
506
if err != nil {
545
507
log .Errorf ("failed to get code client for PR fix from review comment: %v" , err )
0 commit comments