From eea8f2374e80dc7f4d2fac26175471e467fbc7b2 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 01:33:52 +0000 Subject: [PATCH] fix(agentic): match PR review commits by PR number Co-Authored-By: Virgil --- pkg/agentic/handlers.go | 17 +++++++++++++++-- pkg/agentic/handlers_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/pkg/agentic/handlers.go b/pkg/agentic/handlers.go index f0e61c6..94b64e6 100644 --- a/pkg/agentic/handlers.go +++ b/pkg/agentic/handlers.go @@ -120,14 +120,14 @@ func handleCompletionVerify(c *core.Core, msg core.Message) core.Result { func handleCompletionCommit(c *core.Core, msg core.Message) core.Result { switch ev := msg.(type) { case messages.PRMerged: - workspaceDir := findWorkspaceByPR(ev.Repo, "") + workspaceDir := findWorkspaceByPRWithInfo(ev.Repo, "", ev.PRNum, ev.PRURL) if workspaceDir != "" { if c.Action("agentic.commit").Exists() { c.Action("agentic.commit").Run(context.Background(), workspaceActionOptions(workspaceDir)) } } case messages.PRNeedsReview: - workspaceDir := findWorkspaceByPR(ev.Repo, "") + workspaceDir := findWorkspaceByPRWithInfo(ev.Repo, "", ev.PRNum, ev.PRURL) if workspaceDir != "" { if c.Action("agentic.commit").Exists() { c.Action("agentic.commit").Run(context.Background(), workspaceActionOptions(workspaceDir)) @@ -200,6 +200,10 @@ func resolveWorkspace(name string) string { } func findWorkspaceByPR(repo, branch string) string { + return findWorkspaceByPRWithInfo(repo, branch, 0, "") +} + +func findWorkspaceByPRWithInfo(repo, branch string, prNum int, prURL string) string { for _, path := range WorkspaceStatusPaths() { workspaceDir := core.PathDir(path) statusResult := ReadStatusResult(workspaceDir) @@ -213,6 +217,15 @@ func findWorkspaceByPR(repo, branch string) string { if branch != "" && workspaceStatus.Branch != branch { continue } + if prNum > 0 { + if workspaceStatus.PRURL != "" && extractPullRequestNumber(workspaceStatus.PRURL) == prNum { + return workspaceDir + } + if prURL != "" && workspaceStatus.PRURL == prURL { + return workspaceDir + } + continue + } if branch == "" || workspaceStatus.Branch == branch { return workspaceDir } diff --git a/pkg/agentic/handlers_test.go b/pkg/agentic/handlers_test.go index 2aa85a3..0dff2a3 100644 --- a/pkg/agentic/handlers_test.go +++ b/pkg/agentic/handlers_test.go @@ -193,6 +193,32 @@ func TestHandlers_RegisterHandlers_Good_CompletionPipeline(t *testing.T) { }, time.Second, 10*time.Millisecond) } +func TestHandlers_FindWorkspaceByPR_Good_MatchesPRNumber(t *testing.T) { + root := t.TempDir() + t.Setenv("CORE_WORKSPACE", root) + + firstWorkspace := core.JoinPath(WorkspaceRoot(), "core", "go-io", "task-1") + secondWorkspace := core.JoinPath(WorkspaceRoot(), "core", "go-io", "task-2") + require.True(t, fs.EnsureDir(firstWorkspace).OK) + require.True(t, fs.EnsureDir(secondWorkspace).OK) + + require.NoError(t, writeStatus(firstWorkspace, &WorkspaceStatus{ + Status: "completed", + Repo: "go-io", + Branch: "agent/first", + PRURL: "https://forge.lthn.ai/core/go-io/pulls/12", + })) + require.NoError(t, writeStatus(secondWorkspace, &WorkspaceStatus{ + Status: "completed", + Repo: "go-io", + Branch: "agent/second", + PRURL: "https://forge.lthn.ai/core/go-io/pulls/13", + })) + + result := findWorkspaceByPRWithInfo("go-io", "", 13, "https://forge.lthn.ai/core/go-io/pulls/13") + assert.Equal(t, secondWorkspace, result) +} + func TestHandlers_IngestDisabled_Bad(t *testing.T) { root := t.TempDir() t.Setenv("CORE_WORKSPACE", root)