From 38eaf4b30e94b9410447c0196a09ed38d39262d8 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Mon, 15 Dec 2025 11:45:00 -0800 Subject: [PATCH] ci: add AI agent prompt to backport conflict comments (#7367) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - When backports fail due to merge conflicts, the comment now includes a copyable prompt for AI coding assistants - Styled similar to CodeRabbit's "Prompt for AI Agents" feature - Prompt includes all necessary context: PR URL, merge commit, target branch, conflict files, resolution guidelines ## Example Output When a backport fails due to conflicts, the workflow now posts a cleaner comment with an AI agent prompt: --- ### ⚠️ Backport to `core/1.33` failed **Reason:** Merge conflicts detected during cherry-pick of `5233749`
📄 Conflicting files - src/scripts/app.ts
🤖 Prompt for AI Agents ``` Backport PR #7166 (https://github.com/Comfy-Org/ComfyUI_frontend/pull/7166) to core/1.33. Cherry-pick merge commit 5233749fe33fe03cf40bafa7218bdf6eaf74cddf onto new branch backport-7166-to-core-1.33 from origin/core/1.33. Resolve conflicts in: src/scripts/app.ts. For test snapshots (browser_tests/**/*-snapshots/), accept PR version if changed in original PR, else keep target. For package.json versions, keep target branch. For pnpm-lock.yaml, regenerate with pnpm install. Ask user for non-obvious conflicts. Create PR titled "[backport core/1.33] " with label "backport". See .github/workflows/pr-backport.yaml for workflow details. ```
--- The "Prompt for AI Agents" section can be copied directly into Claude Code, Cursor, or other AI coding assistants to resolve the conflicts automatically. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-7367-ci-add-AI-agent-prompt-to-backport-conflict-comments-2c66d73d365081e1a8fbcfdc48ea8777) by [Unito](https://www.unito.io) --------- Co-authored-by: Claude Opus 4.5 --- .github/workflows/pr-backport.yaml | 59 ++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-backport.yaml b/.github/workflows/pr-backport.yaml index 13fab6cdb..c38a8081e 100644 --- a/.github/workflows/pr-backport.yaml +++ b/.github/workflows/pr-backport.yaml @@ -361,6 +361,42 @@ jobs: if: steps.filter-targets.outputs.skip != 'true' && failure() && steps.backport.outputs.failed env: GH_TOKEN: ${{ github.token }} + BACKPORT_AGENT_PROMPT_TEMPLATE: | + Backport PR #${PR_NUMBER} (${PR_URL}) to ${target}. + Cherry-pick merge commit ${MERGE_COMMIT} onto new branch + ${BACKPORT_BRANCH} from origin/${target}. + Resolve conflicts in: ${CONFLICTS_INLINE}. + For test snapshots (browser_tests/**/*-snapshots/), accept PR version if + changed in original PR, else keep target. For package.json versions, keep + target branch. For pnpm-lock.yaml, regenerate with pnpm install. + Ask user for non-obvious conflicts. + Create PR titled "[backport ${target}] " with label "backport". + See .github/workflows/pr-backport.yaml for workflow details. + COMMENT_BODY_TEMPLATE: | + ### ⚠️ Backport to `${target}` failed + + **Reason:** Merge conflicts detected during cherry-pick of `${MERGE_COMMIT_SHORT}` + +
+ 📄 Conflicting files + + ``` + ${CONFLICTS_BLOCK} + ``` + +
+ +
+ 🤖 Prompt for AI Agents + + ``` + ${AGENT_PROMPT} + ``` + +
+ + --- + cc @${PR_AUTHOR} run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then PR_DATA=$(gh pr view ${{ inputs.pr_number }} --json author,mergeCommit) @@ -383,10 +419,27 @@ jobs: gh pr comment "${PR_NUMBER}" --body "@${PR_AUTHOR} Commit \`${MERGE_COMMIT}\` already exists on branch \`${target}\`. No backport needed." elif [ "${reason}" = "conflicts" ]; then - # Convert comma-separated conflicts back to newlines for display - CONFLICTS_LIST=$(echo "${conflicts}" | tr ',' '\n' | sed 's/^/- /') + CONFLICTS_INLINE=$(echo "${conflicts}" | tr ',' ' ') + SAFE_TARGET=$(echo "$target" | tr '/' '-') + BACKPORT_BRANCH="backport-${PR_NUMBER}-to-${SAFE_TARGET}" + PR_URL="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/pull/${PR_NUMBER}" + + export PR_NUMBER PR_URL MERGE_COMMIT target BACKPORT_BRANCH CONFLICTS_INLINE + + # envsubst is provided by gettext-base + if ! command -v envsubst >/dev/null 2>&1; then + sudo apt-get update && sudo apt-get install -y gettext-base + fi + + AGENT_PROMPT=$(envsubst '${PR_NUMBER} ${PR_URL} ${target} ${MERGE_COMMIT} ${BACKPORT_BRANCH} ${CONFLICTS_INLINE}' <<<"$BACKPORT_AGENT_PROMPT_TEMPLATE") + + # Use fenced code block for conflicts to handle special chars in filenames + CONFLICTS_BLOCK=$(echo "${conflicts}" | tr ',' '\n') + MERGE_COMMIT_SHORT="${MERGE_COMMIT:0:7}" + + export target MERGE_COMMIT_SHORT CONFLICTS_BLOCK AGENT_PROMPT PR_AUTHOR + COMMENT_BODY=$(envsubst '${target} ${MERGE_COMMIT_SHORT} ${CONFLICTS_BLOCK} ${AGENT_PROMPT} ${PR_AUTHOR}' <<<"$COMMENT_BODY_TEMPLATE") - COMMENT_BODY="@${PR_AUTHOR} Backport to \`${target}\` failed: Merge conflicts detected."$'\n\n'"Please manually cherry-pick commit \`${MERGE_COMMIT}\` to the \`${target}\` branch."$'\n\n'"
Conflicting files"$'\n\n'"${CONFLICTS_LIST}"$'\n\n'"
" gh pr comment "${PR_NUMBER}" --body "${COMMENT_BODY}" fi done