fix: cc-resolve の checkout 前ステップに --repo を追加し、プロンプトを /resolve の観点に忠実に修正

This commit is contained in:
nrslib 2026-02-28 13:26:57 +09:00
parent f6d59f4209
commit e4af465d72

View File

@ -93,111 +93,182 @@ jobs:
claude -p "$(cat <<'PROMPT' claude -p "$(cat <<'PROMPT'
このPRのコンフリクトおよびレビュー指摘を解決してください。 このPRのコンフリクトおよびレビュー指摘を解決してください。
原則: 差分を読み、疑い、判断根拠を書いてから解決する。妄信的に片方を採用しない。
---
## 状況判定 ## 状況判定
まず現在の状態を確認してください。 まず現在の状態を確認してください。
1. `git status` でコンフリクトの有無を確認 1. `git status` でコンフリクトの有無を確認
2. コンフリクトがあれば「コンフリクト解決モード 2. コンフリクトがあれば「コンフリクト解決を実行
3. コンフリクトがなければ「レビュー指摘対応モード」 3. PRのレビューコメントがあれば「レビュー指摘対応」を実行
4. 両方あれば、コンフリクト解決を先に行い、その後レビュー指摘に対応 4. 両方あれば、コンフリクト解決を先に行い、その後レビュー指摘に対応
--- ---
## コンフリクト解決モード ## コンフリクト解決
### 1. コンテキストを把握する Git merge/rebase/cherry-pick のコンフリクトを、差分分析に基づいて解決する。
並列で実行: **原則: 差分を読み、疑い、判断根拠を書いてから解決する。妄信的に片方を採用しない。**
- `git log --oneline HEAD -5` で HEAD 側の最近の変更を確認
- `git log --oneline MERGE_HEAD -5` で取り込み側の最近の変更を確認
- 両ブランチの関係性を理解する
### 2. コンフリクトファイルを列挙する ### 1. コンフリクト状態を確認する
```bash
git status
```
- `Unmerged paths` がなければ「コンフリクトなし」と報告してスキップ
- merge / rebase / cherry-pick のどれが進行中か特定する
- `.git/MERGE_HEAD` があれば merge
- `.git/rebase-merge/` があれば rebase
- `.git/CHERRY_PICK_HEAD` があれば cherry-pick
### 2. コンテキストを把握する
以下を**並列で**実行:
- `git log --oneline HEAD -5` で HEAD 側(現在のブランチ)の最近の変更を確認
- `git log --oneline MERGE_HEAD -5` で取り込み側の最近の変更を確認merge の場合)
- 両ブランチの関係性(どちらがベースでどちらが新しいか)を理解する
### 3. コンフリクトファイルを列挙する
```bash ```bash
git diff --name-only --diff-filter=U git diff --name-only --diff-filter=U
``` ```
### 3. 各ファイルを分析する(核心) ファイル数と種類(ソースコード / 設定ファイル / ロックファイル等)を報告する。
ファイルごとに以下を必ず実行する。省略しない。 ### 4. 各ファイルを分析する
**ここが核心。ファイルごとに以下を必ず実行する。省略しない。**
1. ファイル全体を読む(コンフリクトマーカー付きの状態) 1. ファイル全体を読む(コンフリクトマーカー付きの状態)
2. 各コンフリクトブロック(`<<<<<<<` 〜 `>>>>>>>`)について: 2. 各コンフリクトブロック(`<<<<<<<` 〜 `>>>>>>>`)について:
- HEAD 側の内容を具体的に読む - HEAD 側の内容を具体的に読む
- theirs 側の内容を具体的に読む - theirs 側の内容を具体的に読む
- 差分が何を意味するか分析する - 差分が何を意味するか分析する(バージョン番号?リファクタ?機能追加?型変更?)
- 判断に迷う場合は `git log --oneline -- {file}` で変更履歴を確認 - 判断に迷う場合は `git log --oneline -- {file}` で変更履歴を確認する
3. 判断を書く: 3. **判断を書く**(以下の形式で必ず出力すること):
- HEAD 側: {具体的な内容}
- theirs 側: {具体的な内容}
- 分析: {差分の意味}
- 判断: {HEAD / theirs / 両方統合} を採用({理由}
疑うべきポイント: ```markdown
- 「〇〇側が新しいから」だけで判断していないか? ### ファイル: path/to/file.ts
- theirs を採用すると、HEAD 側の作業が消えないか?
#### コンフリクト 1 (L30-45)
- HEAD 側: {具体的な内容を書く}
- theirs 側: {具体的な内容を書く}
- 分析: {差分が何を意味するか}
- 判断: {HEAD / theirs / 両方統合} を採用({理由}
```
**疑うべきポイント:**
- 「〇〇側が新しいから」だけで判断していないか? HEAD 側に独自の意図ある変更はないか?
- theirs を採用すると、HEAD 側でしか行っていない作業が消えないか?
- 両方の変更を統合すべきケースではないか? - 両方の変更を統合すべきケースではないか?
- package-lock.json のような機械生成ファイルでも、バージョンの意味を確認したか?
### 4. 解決を実施する ### 5. 解決を実施する
- 片方採用が明確: `git checkout --ours {file}` / `git checkout --theirs {file}`(分析済みファイルのみ) ステップ4の分析結果に基づいて解決する:
- 統合が必要: コンフリクトマーカーを除去し両方を結合
- 解決したファイルを `git add {file}` - 片方採用が明確な場合: `git checkout --ours {file}` / `git checkout --theirs {file}` を使ってよい(**分析済みファイルのみ**
- `<<<<<<<` マーカーの取り残しがないか確認 - 両方の変更を統合する場合: コンフリクトマーカーを除去し、両方の内容を適切に結合する
- 解決したファイルを `git add {file}` でマークする
解決後、`<<<<<<<` を検索し、マーカーの取り残しがないか確認する。
--- ---
## レビュー指摘対応モード ## レビュー指摘対応
### 1. レビューコメントを分析する PRのレビューコメントを分析し、コンフリクト解決と同じ原則で対応する。
各指摘について: **原則: 指摘を読み、コードを確認し、判断根拠を書いてから修正する。盲従しない。**
- 指摘箇所のコードを実際に読む
- 指摘の意図を理解する
- 現状コードの問題点を分析する
### 2. 各指摘に対して判断する ### 1. レビューコメントを収集する
`gh pr view` や `gh api` でPRのレビューコメントを取得し、全指摘を列挙する。
### 2. 各指摘を分析する
**指摘ごとに以下を必ず実行する。省略しない。**
1. 指摘箇所のコードを実際に読む
2. 指摘の意図を理解する
3. 現状コードが指摘通りに問題があるか分析する
4. **判断を書く**(以下の形式で必ず出力すること):
```markdown
### 指摘: {レビューコメントの要約}
- 指摘箇所: {ファイル:行}
- 現状コード: {具体的な内容}
- 指摘の意図: {何を改善すべきか}
- 判断: {修正 / 部分修正 / 反論}{理由}
```
**疑うべきポイント:**
- 指摘が的外れではないか? コンテキストを見落としていないか?
- 修正すると他の箇所に影響しないか?
- 指摘の通りに修正するのがベストか、別のアプローチの方が良くないか?
### 3. 修正を実施する
判断に基づいて修正する:
- 修正: 指摘が妥当 → コードを修正 - 修正: 指摘が妥当 → コードを修正
- 部分修正: 一部妥当 → 妥当な部分のみ修正 - 部分修正: 一部妥当 → 妥当な部分のみ修正
- 反論: 指摘が不適切 → 理由を明記してスキップ - 反論: 指摘が不適切 → 理由を明記してスキップ
判断根拠を必ず記録する。
### 3. 修正を実施する
指摘ごとにコードを修正し、修正内容を記録する。
--- ---
## 波及影響確認(両モード共通) ## 波及影響確認(共通)
- ビルド確認(`npm run build` 等) **コンフリクト解決・指摘修正だけでは終わらない。** 対象外ファイルにも影響が出ていないか検証する。
- テスト確認(`npm test` 等)
- 修正対象外ファイルとの矛盾がないか確認 - ビルド確認(`npm run build`、`./gradlew build` 等、プロジェクトに応じて)
- テスト確認(`npm test`、`./gradlew test` 等)
- 対象外ファイルが、変更と矛盾していないか確認する
- : 関数シグネチャを変更したのに、テストが旧シグネチャを期待している
- : import パスを変更したのに、別ファイルが旧パスを参照している
問題が見つかった場合はここで修正する。 問題が見つかった場合はここで修正する。
--- ---
## 結果を報告する
全ファイルの解決結果をサマリーテーブルで報告する:
```markdown
## 解決サマリー
### コンフリクト解決
| ファイル | コンフリクト数 | 採用 | 理由 |
|---------|-------------|------|------|
| path/to/file.ts | 2 | theirs | リファクタリング済み |
### レビュー指摘対応
| 指摘 | 判断 | 理由 |
|------|------|------|
| {指摘要約} | 修正/反論 | {理由} |
波及修正: {対象外ファイルの修正内容。なければ「なし」}
ビルド: OK / NG
テスト: OK / NG ({passed}/{total})
```
---
## 絶対原則 ## 絶対原則
- 差分を読まずに解決しない - **差分を読まずに解決しない。** ファイルの中身を確認せずに `--ours` / `--theirs` を適用しない
- 「〇〇優先」を盲従しない - **盲従しない。** HEAD 側に独自の意図がないか必ず疑う。レビュー指摘も鵜呑みにしない
- 判断根拠を省略しない(何が・なぜ・どちらを) - **判断根拠を省略しない。** 各コンフリクト・各指摘に「何が・なぜ・どちらを」の3点を書く
- 波及を確認する - **波及を確認する。** 対象外ファイルもビルド・テストで検証する
## 禁止事項 ## 禁止事項
- 分析なしで `git checkout --ours .` / `git checkout --theirs .` を実行しない - 分析なしで `git checkout --ours .` / `git checkout --theirs .` を実行しない
- 全ファイルを一括解決しない - 「とりあえず片方」で全ファイルを一括解決しない
- コンフリクトマーカーを残さない - コンフリクトマーカー (`<<<<<<<`) が残ったままにしない
- `git merge --abort` を実行しない - `git merge --abort` を実行しない
PROMPT PROMPT
)" --verbose )" --verbose