From 09fda82677bdbf3386d57dcc050168dcfdcbdfe4 Mon Sep 17 00:00:00 2001 From: nrslib <38722970+nrslib@users.noreply.github.com> Date: Sat, 28 Feb 2026 12:56:34 +0900 Subject: [PATCH] =?UTF-8?q?ci:=20PR=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=20?= =?UTF-8?q?`/resolve`=20=E3=81=A7=E3=82=B3=E3=83=B3=E3=83=95=E3=83=AA?= =?UTF-8?q?=E3=82=AF=E3=83=88=E8=A7=A3=E6=B1=BA=E3=83=BB=E3=83=AC=E3=83=93?= =?UTF-8?q?=E3=83=A5=E3=83=BC=E6=8C=87=E6=91=98=E4=BF=AE=E6=AD=A3=E3=82=92?= =?UTF-8?q?=E8=A1=8C=E3=81=86=E3=83=AF=E3=83=BC=E3=82=AF=E3=83=95=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/cc-resolve.yml | 228 +++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 .github/workflows/cc-resolve.yml diff --git a/.github/workflows/cc-resolve.yml b/.github/workflows/cc-resolve.yml new file mode 100644 index 0000000..0c2cb3e --- /dev/null +++ b/.github/workflows/cc-resolve.yml @@ -0,0 +1,228 @@ +name: CC Resolve + +on: + issue_comment: + types: [created] + +jobs: + resolve: + # Uncomment to allow organization members or collaborators: + # || github.event.comment.author_association == 'MEMBER' + # || github.event.comment.author_association == 'COLLABORATOR' + if: | + github.event.issue.pull_request && + contains(github.event.comment.body, '/resolve') && + github.event.comment.author_association == 'OWNER' + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - name: Acknowledge + run: | + gh api repos/${{ github.repository }}/issues/comments/${{ github.event.comment.id }}/reactions \ + -f content=rocket + gh pr comment ${{ github.event.issue.number }} \ + --body "🚀 cc-resolve started: [View logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Get PR branch + id: pr + run: | + echo "branch=$(gh pr view ${{ github.event.issue.number }} --json headRefName -q .headRefName)" >> "$GITHUB_OUTPUT" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/checkout@v4 + with: + ref: ${{ steps.pr.outputs.branch }} + fetch-depth: 0 + + - name: Configure git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Merge main (detect conflicts) + id: merge + run: | + git fetch origin main + if git merge origin/main --no-edit 2>/dev/null; then + echo "conflicts=false" >> "$GITHUB_OUTPUT" + else + echo "conflicts=true" >> "$GITHUB_OUTPUT" + fi + + - name: Collect PR review comments + id: reviews + run: | + PR_NUMBER=${{ github.event.issue.number }} + COMMENTS=$(gh pr view "$PR_NUMBER" --json comments -q '.comments[].body' 2>/dev/null || echo "") + REVIEWS=$(gh api "repos/${{ github.repository }}/pulls/${PR_NUMBER}/reviews" --jq '.[].body' 2>/dev/null || echo "") + REVIEW_COMMENTS=$(gh api "repos/${{ github.repository }}/pulls/${PR_NUMBER}/comments" --jq '.[] | "**\(.path):\(.line // .original_line)** \(.body)"' 2>/dev/null || echo "") + + { + echo "review_context<> "$GITHUB_OUTPUT" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Claude Code + run: npm install -g @anthropic-ai/claude-code + + - name: Resolve + run: | + claude -p "$(cat <<'PROMPT' + このPRのコンフリクトおよびレビュー指摘を解決してください。 + + 原則: 差分を読み、疑い、判断根拠を書いてから解決する。妄信的に片方を採用しない。 + + --- + + ## 状況判定 + + まず現在の状態を確認してください。 + + 1. `git status` でコンフリクトの有無を確認 + 2. コンフリクトがあれば「コンフリクト解決モード」 + 3. コンフリクトがなければ「レビュー指摘対応モード」 + 4. 両方あれば、コンフリクト解決を先に行い、その後レビュー指摘に対応 + + --- + + ## コンフリクト解決モード + + ### 1. コンテキストを把握する + + 並列で実行: + - `git log --oneline HEAD -5` で HEAD 側の最近の変更を確認 + - `git log --oneline MERGE_HEAD -5` で取り込み側の最近の変更を確認 + - 両ブランチの関係性を理解する + + ### 2. コンフリクトファイルを列挙する + + ```bash + git diff --name-only --diff-filter=U + ``` + + ### 3. 各ファイルを分析する(核心) + + ファイルごとに以下を必ず実行する。省略しない。 + + 1. ファイル全体を読む(コンフリクトマーカー付きの状態) + 2. 各コンフリクトブロック(`<<<<<<<` 〜 `>>>>>>>`)について: + - HEAD 側の内容を具体的に読む + - theirs 側の内容を具体的に読む + - 差分が何を意味するか分析する + - 判断に迷う場合は `git log --oneline -- {file}` で変更履歴を確認 + 3. 判断を書く: + - HEAD 側: {具体的な内容} + - theirs 側: {具体的な内容} + - 分析: {差分の意味} + - 判断: {HEAD / theirs / 両方統合} を採用({理由}) + + 疑うべきポイント: + - 「〇〇側が新しいから」だけで判断していないか? + - theirs を採用すると、HEAD 側の作業が消えないか? + - 両方の変更を統合すべきケースではないか? + + ### 4. 解決を実施する + + - 片方採用が明確: `git checkout --ours {file}` / `git checkout --theirs {file}`(分析済みファイルのみ) + - 統合が必要: コンフリクトマーカーを除去し両方を結合 + - 解決したファイルを `git add {file}` + - `<<<<<<<` マーカーの取り残しがないか確認 + + --- + + ## レビュー指摘対応モード + + ### 1. レビューコメントを分析する + + 各指摘について: + - 指摘箇所のコードを実際に読む + - 指摘の意図を理解する + - 現状コードの問題点を分析する + + ### 2. 各指摘に対して判断する + + - 修正: 指摘が妥当 → コードを修正 + - 部分修正: 一部妥当 → 妥当な部分のみ修正 + - 反論: 指摘が不適切 → 理由を明記してスキップ + + 判断根拠を必ず記録する。 + + ### 3. 修正を実施する + + 指摘ごとにコードを修正し、修正内容を記録する。 + + --- + + ## 波及影響確認(両モード共通) + + - ビルド確認(`npm run build` 等) + - テスト確認(`npm test` 等) + - 修正対象外ファイルとの矛盾がないか確認 + + 問題が見つかった場合はここで修正する。 + + --- + + ## 絶対原則 + + - 差分を読まずに解決しない + - 「〇〇優先」を盲従しない + - 判断根拠を省略しない(何が・なぜ・どちらを) + - 波及を確認する + + ## 禁止事項 + + - 分析なしで `git checkout --ours .` / `git checkout --theirs .` を実行しない + - 全ファイルを一括解決しない + - コンフリクトマーカーを残さない + - `git merge --abort` を実行しない + PROMPT + )" --verbose + env: + ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} + + - name: Commit and push + run: | + git add -A + if ! git diff --cached --quiet; then + git commit -m "fix: resolve conflicts and review comments" + git push + else + echo "No changes to commit" + fi + + - name: Report result + if: always() + run: | + PR_NUMBER=${{ github.event.issue.number }} + RUN_URL="${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}" + if [ "${{ job.status }}" = "success" ]; then + gh pr comment "$PR_NUMBER" --body "✅ cc-resolve completed. [View logs](${RUN_URL})" + else + gh pr comment "$PR_NUMBER" --body "❌ cc-resolve failed. [View logs](${RUN_URL})" + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}