From 5b2b5c0d1ade3a5c608a0420ccaea50cdb6366aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Sat, 2 May 2026 22:07:03 +0800 Subject: [PATCH] Trigger Dosu from PR triage comments The PR triage workflow mentioned Dosu inside inline-code formatting and before the final footer, which did not reliably wake the bot. Move the handoff so the last non-empty comment line is a plain-text @dosubot request, matching the working PR template pattern. Constraint: GitHub bot mentions can be sensitive to markdown formatting and comment placement. Rejected: Leave the mention as a copy-paste hint | it does not satisfy the maintainer need for automatic bot triggering. Confidence: high Scope-risk: narrow Directive: Keep the generated triage comment's final non-empty line as a plain-text @dosubot request. Tested: bun run check:policy Tested: git diff --check Tested: bun run check:pr --- .github/workflows/pr-triage.yml | 6 +++--- package.json | 2 +- scripts/pr/pr-triage-workflow.test.ts | 28 +++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 scripts/pr/pr-triage-workflow.test.ts diff --git a/.github/workflows/pr-triage.yml b/.github/workflows/pr-triage.yml index 89ec8d9d..bf94fc0d 100644 --- a/.github/workflows/pr-triage.yml +++ b/.github/workflows/pr-triage.yml @@ -227,11 +227,11 @@ jobs: '**Risk notes:**', riskNotes.map((note) => `- ${note}`).join('\n'), '', + 'Hard merge gates still come from GitHub Actions, not AI review.', + '', '**Dosu handoff:** Dosu can be used as the AI reviewer for risk explanation, missing-test prompts, and maintainer Q&A. If it does not comment automatically from the PR template, ask:', '', - '`@dosubot review this PR for changed-area risk, missing tests, docs impact, desktop startup risk, and CLI core impact.`', - '', - 'Hard merge gates still come from GitHub Actions, not AI review.', + '@dosubot review this PR for changed-area risk, missing tests, docs impact, desktop startup risk, and CLI core impact.', ].join('\n') const comments = await github.paginate(github.rest.issues.listComments, { diff --git a/package.json b/package.json index 34ea1a7a..84e03205 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "start": "bun run ./bin/claude-haha", "check:pr": "bun run scripts/pr/check-pr.ts", "check:impact": "bun run scripts/pr/impact-report.ts", - "check:policy": "bun test scripts/pr/change-policy.test.ts", + "check:policy": "bun test scripts/pr/change-policy.test.ts scripts/pr/pr-triage-workflow.test.ts", "check:server": "bun run scripts/pr/run-server-tests.ts", "check:desktop": "cd desktop && bun run lint && bun run test -- --run && bun run build", "check:adapters": "cd adapters && bun test", diff --git a/scripts/pr/pr-triage-workflow.test.ts b/scripts/pr/pr-triage-workflow.test.ts new file mode 100644 index 00000000..a8932a36 --- /dev/null +++ b/scripts/pr/pr-triage-workflow.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, test } from 'bun:test' +import { readFileSync } from 'node:fs' + +const DOSU_PROMPT = '@dosubot review this PR for changed-area risk, missing tests, docs impact, desktop startup risk, and CLI core impact.' + +function extractCommentBodyEntries(workflow: string) { + const match = workflow.match(/const body = \[([\s\S]*?)\n\s*\]\.join\('\\n'\)/) + if (!match) { + throw new Error('Could not find PR triage comment body array') + } + + return match[1] + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.startsWith("'") || line.startsWith('`')) +} + +describe('PR triage workflow comment', () => { + test('ends with a plain-text Dosu mention so the bot is triggered', () => { + const workflow = readFileSync('.github/workflows/pr-triage.yml', 'utf8') + const entries = extractCommentBodyEntries(workflow) + const nonEmptyEntries = entries.filter((entry) => !/^['`]['`],?$/.test(entry)) + const lastEntry = nonEmptyEntries.at(-1) + + expect(lastEntry).toBe(`'${DOSU_PROMPT}',`) + expect(workflow).not.toContain(`\`${DOSU_PROMPT}\``) + }) +})