Uh oh!
There was an error while loading. Please reload this page.
Fix: PRコメント取得を3ソース対応に拡張し取得漏れを解消 (#13) - #15
Conversation
GitHub PR の review body と PR レベルコメントが取得されず、 人間レビュアーの指摘が cross-review ループで検出されない問題を修正。 共有スクリプト fetch-pr-comments.sh を fix skill に配置し、 cross-review / fix / review-pr-comments の 3 skill で共用する。 Closes#13 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- state.py: Path → pathlib.Path に修正 (NameError 解消) - fetch-pr-comments.sh: review body の改行を \n エスケープして全文保持 - fetch-pr-comments.sh: 全ソース取得失敗時のみ非0終了 (0件取得と取得失敗の区別) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
PRレベルコメント・インラインコメントも review body と同様に
gsub("\n"; "\\n") で全文を1行に保持するよう統一。
split("\n")[0] による先頭行切り詰めを排除し、
fix/review-pr-comments が複数行の指摘を見落とさないようにする。fetch-pr-comments.shが全ソース失敗で非0を返した場合、 空スナップショットで黙って継続せずdie()でinitを失敗させる。 重複検出が無効な状態でレビューを進めないようにする。
- PLAN13 サンプルコードを実装済みの gsub + 失敗カウント方式に更新 (codex minor) - args.worktree を .resolve() で絶対パスに変換 (gemini major) - フォーク PR の fetch 失敗時に gh pr checkout --detach でフォールバック (gemini major) - KEY=VALUE 出力のパス・ブランチ名をダブルクォートで囲む (gemini major) - worktree ベースディレクトリの書き込み権限チェック追加 (gemini minor) - read_text() / write_text() 全箇所に encoding="utf-8" を明示指定 (gemini minor)
…minor 2件) - state.py: gh pr checkout --detach の戻り値チェック追加、失敗時 die() で中断 - state.py: _default_worktree_base の os.access 失敗時に die() せずフォールバック継続 - fetch-pr-comments.sh: 引数 (REPO, PR) の存在チェック追加 - fetch-pr-comments.sh: 各 gh api 失敗時に stderr へ個別警告メッセージ出力
Bash tool 実行時に $0 はシェル自体を指すため、SKILL.md からの 相対パス解決に使えない。Claude Code プラグインが提供する $CLAUDE_PLUGIN_ROOT 環境変数を使用するよう修正。 対象: - plugins/ndf/skills/fix/SKILL.md - plugins/ndf/skills/review-pr-comments/SKILL.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- state.py: eval "$(state.py init ...)" で取り込む KEY=VALUE 出力のパス・文字列値を shlex.quote() で囲み、パスに特殊文字 ($, ", 改行等) が含まれる場合のコマンド注入・ 構文破壊を防止 (WORKTREE, TMP_DIR, REPO, HEAD_BRANCH, BASE_BRANCH) - fetch-pr-comments.sh: コメント本文中の ``` (3連バッククォート) を ` ` ` に置換し、 launch-gemini.sh の Markdown フェンスが本文中のコードブロックで閉じられる問題を防止 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 6 | codex | APPROVE
修正必須の指摘はありません。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 6 | gemini | REQUEST_CHANGES
PR #15 の修正を確認しました。既存の NameError や body 切り詰めは解消されていますが、状態の永続性と再開時の動作に関して数点改善案があります。
その他の指摘
- [minor / 信頼性]
state.pyのcmd_merge_fix等の各サブコマンドで_tmp_dir()を再計算していますが、これはカレントディレクトリや環境変数に依存するため、init時と異なるパスを返すリスクがあります。init時にst["tmp_dir"]に保存した値を優先的に使用するように変更し、パス解決の整合性を担保してください。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
1. 再開時の変数出力不足: RESUMED=1 パスで REPO, HEAD_BRANCH, BASE_BRANCH, IS_OWN_PR, EVENT_DOWNGRADE を state.json から 読み出して stdout に出力するよう修正 2. gh api --jq の raw output 保証: --jq を -q + jq -r パイプに 変更し、環境差による引用符混入リスクを排除 3. _tmp_dir() の再計算リスク: _resolve_tmp_dir(pr) を導入し、 state.json に保存済みの tmp_dir を優先使用。各コマンドの パス解決を init 時確定値に統一 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
fetch-pr-comments.sh が現状のままだと全ソース取得に失敗し、state.py init が既存コメントスナップショット作成で中断します。gh api 呼び出しの -q を削除するか、各コマンドで有効な --jq 引数を渡してください。
Uh oh!
There was an error while loading. Please reload this page.
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | gemini | REQUEST_CHANGES
PR #15 において、中断状態からの再開時に必要な変数の出力不足の修正、および fetch-pr-comments.sh での raw string 出力対応が行われたことを確認しました。これらは前回の指摘を適切に反映しています。
一方で、新たに追加された _resolve_tmp_dir のパス解決ロジックに不整合があり、state.json の読み込み元と参照先が乖離する懸念があります。また、パス解決関数内でのディレクトリ作成(副作用)や、_tmp_dir における workspace 引数の優先順位(環境変数が優先される点)など、いくつか修正・改善が望ましい点が見つかりました。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
1. [major] fetch-pr-comments.sh: gh api の -q フラグ(引数必須)を削除し、
raw JSON を jq -r へ直接パイプする形に修正
2. [major] state.py: _state_path() が _resolve_tmp_dir() を使うと
state.json の読み込み元と参照先が乖離する問題を修正。
state ファイル自体のパス解決には _tmp_dir() を直接使用
3. [minor] state.py: _resolve_tmp_dir() 内の p.mkdir() 副作用を削除。
パス解決関数でディレクトリ作成しないよう修正
4. [minor] state.py: st.get("repo", "") 等を st.get("repo") or "" に変更し、
値が None の場合に "None" 文字列になる問題を防止
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | codex | APPROVE
修正が必要な追加指摘はありません。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | gemini | REQUEST_CHANGES
CROSS_REVIEW_TMP_DIR を使用した際の再開検知漏れおよび内部関数の副作用に関する修正を推奨します。
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
…キュメント修正 - cmd_initの再開チェックでCROSS_REVIEW_TMP_DIR環境変数が設定されている場合に そちらを参照するよう修正。カスタムディレクトリ使用時にstateファイルを 見落として上書きするリスクを解消。 - _resolve_tmp_dirのdocstringを実際の挙動に合わせ、_tmp_dir()経由で mkdirの副作用が発生する可能性があることを明記。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | gemini | APPROVE
PR #15 の変更内容を確認しました。fetch-pr-comments.sh によるコメント取得ソースの拡張と、state.py における再開時の状態復元および worktree 作成の堅牢性向上が適切に実装されています。設計方針(PLAN13)に沿った一貫性のある修正であり、技術的な懸念点も解消されているため、承認します。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | APPROVE
修正必須の新規指摘はありません。
Summary
fetch-pr-comments.shを新規作成し、cross-review / fix / review-pr-comments の 3 skill で共用化state.pyのインラインgh api呼び出しをスクリプト呼び出しに差し替え、コメント本文の全文保持・安全なシェル出力 (shlex.quote) ・堅牢なエラーハンドリング (die()による即時中断) を実装PLAN13) を追加Changed files
plugins/ndf/skills/fix/scripts/fetch-pr-comments.shplugins/ndf/skills/cross-review/scripts/state.pygh api→ 共有スクリプト呼び出しに差し替え。shlex.quoteによる eval 出力の安全化、Pathimport 修正、取得失敗時のdie()中断を追加plugins/ndf/skills/fix/SKILL.md$CLAUDE_PLUGIN_ROOTに修正plugins/ndf/skills/review-pr-comments/SKILL.mdplugins/ndf/skills/cross-review/SKILL.mdplugins/ndf/skills/cross-review/docs/01-state-and-review.mdplugins/ndf/skills/cross-review/docs/02-fix-and-rotation.mdissues/PLAN13_cross-review-review-body-missing.mdTest plan
fetch-pr-comments.sh <owner/repo> <pr_number>を実 PR に対して実行し、3 ソース (インライン/[REVIEW-BODY]/[PR-COMMENT]) の出力が含まれることを確認state.py init <pr>実行後、existing-comments.txtに 3 ソースの内容が含まれることを確認/ndf:cross-reviewを実行し、指摘が正しく検出されることを確認fetch-pr-comments.shに不正な引数を渡した場合、適切なエラーメッセージで終了することを確認claude plugin validateが通ることを確認Closes#13