From 546d2615c7308ed4359669ab5bade38b5e295212 Mon Sep 17 00:00:00 2001 From: Daniel Samson <12231216+daniel-samson@users.noreply.github.com> Date: Sun, 12 Apr 2026 20:57:46 +0100 Subject: [PATCH] feat: re-trigger tester when human comments on a PR PR comments fire as issue_comment webhooks in Gitea. Previously the handler only re-triggered the analyst for regular issues. Now it detects PR comments via the pull_request field and queues a test workspace using the review bot account. Co-Authored-By: Claude Opus 4.6 --- src/handlers/issue-comment.ts | 29 ++++++++++++++++++++++++++--- src/types.ts | 1 + 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/handlers/issue-comment.ts b/src/handlers/issue-comment.ts index d0954dd..b9f22a7 100644 --- a/src/handlers/issue-comment.ts +++ b/src/handlers/issue-comment.ts @@ -4,7 +4,9 @@ import type { TaskQueue } from "../queue.js"; import type { Config } from "../config.js"; /** - * Issue comment created or edited → re-trigger analyst if still in analysis. + * Issue comment created or edited: + * - On a PR → re-trigger tester + * - On an issue still in analysis → re-trigger analyst * * Replaces: issue-comment-reply.json */ @@ -23,6 +25,29 @@ export function issueComment(config: Config, queue: TaskQueue) { return c.text("ignored: bot comment", 200); } + const [org, repo] = event.repository.full_name.split("/"); + const isPullRequest = !!event.issue.pull_request; + + if (isPullRequest) { + // Comment on a PR → re-trigger tester + const task: TaskRequest = { + taskType: "test", + issueNumber: event.issue.number, + giteaOrg: org, + giteaRepo: repo, + repoCloneUrl: event.repository.clone_url, + giteaToken: config.giteaReviewToken, + }; + + const queued = await queue.enqueue(task, { + useReviewAccount: true, + body: "🤖 Re-triggering **test** — workspace queued.", + }); + + return c.json({ ok: true, queued }); + } + + // Regular issue comment → re-trigger analyst if still in analysis const labels = event.issue.labels.map((l) => l.name); const pastAnalysis = labels.includes("ready-for-architecture") || @@ -32,8 +57,6 @@ export function issueComment(config: Config, queue: TaskQueue) { return c.text("ignored: issue past analysis stage", 200); } - const [org, repo] = event.repository.full_name.split("/"); - const task: TaskRequest = { taskType: "analyse", issueNumber: event.issue.number, diff --git a/src/types.ts b/src/types.ts index 9510d51..59bc637 100644 --- a/src/types.ts +++ b/src/types.ts @@ -30,6 +30,7 @@ export interface GiteaIssue { state: string; user: GiteaUser; labels: GiteaLabel[]; + pull_request?: { merged: boolean } | null; } export interface GiteaPullRequest {