Skip to content

Update: cross-review worktree を非永続領域 + リポジトリ別パスに変更 (v4.15.0)#31

Open
takemi-ohama wants to merge 2 commits into
mainfrom
feature/cross-review-worktree-tmpdir
Open

Update: cross-review worktree を非永続領域 + リポジトリ別パスに変更 (v4.15.0)#31
takemi-ohama wants to merge 2 commits into
mainfrom
feature/cross-review-worktree-tmpdir

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

何のために(背景)

cross-review の worktree 生成先 /work/worktrees/pr<N> は共有の永続 volume 上にあり、以下の問題があった:

  • 別プロジェクトの同一 PR 番号と衝突する(実際に旧 devbase リポジトリの残骸 worktree pr30 を誤って流用しかけ、git 操作が壊れる事故が発生)
  • 明示的に削除しないと残り続ける
  • volume のスペースを消費する(残骸 1 件で 48MB)

何を(変更内容)

worktree 生成先の変更(state.py

  • デフォルトを <システム tmpdir>/ndf-worktrees に変更: tempfile.gettempdir() ベースの非永続領域。コンテナ再作成で自動消滅し、明示削除も不要
  • 解決順は NDF_WORKTREE_BASE env > <tmpdir>/ndf-worktrees。旧 /work/worktrees / $HOME/work/worktrees フォールバックは廃止
  • パスにリポジトリ slug を含める: <base>/<owner>--<repo>/pr<N> 形式(例: /tmp/ndf-worktrees/devbasex--ai-plugins/pr30)とし、他リポジトリの同一 PR 番号と衝突しない
  • 残骸流用ガード: パスが存在しても git worktree list に登録されていなければ .stale-<timestamp> に退避して作り直す(_is_registered_worktree() / _create_worktree() に分離)

その他

  • SKILL.md / docs/01 / docs/02 の worktree-base 解決順とサンプルパスを更新
  • test_default_worktree_base.py を新解決順 + repo slug + 残骸ガードのテストに刷新
  • version 4.14.0 → 4.15.0(marketplace.json / AGENTS.md / ndf-plugin-reference 整合)

テスト

  • pytest: 102 passed(cross-review 全テスト)
  • 実 PR Add: NDF標準statusline (デフォルト設定hook + /ndf:statusline skill) (v4.14.0) #30 でスモークテスト: 偽の残骸ディレクトリを事前配置 → .stale-20260612061751 に退避され、/tmp/ndf-worktrees/devbasex--ai-plugins/pr30 に detached worktree が正常作成されることを確認(テスト後に掃除済み)
  • claude plugin validate パス(warning は既存の marketplace description 欠如のみ)

🤖 Generated with Claude Code

/work/worktrees は共有の永続 volume のため、(1) 別リポジトリの同一 PR 番号と
衝突 (2) 明示削除が必要 (3) volume を消費する問題があった。

- デフォルト生成先を <システム tmpdir>/ndf-worktrees に変更
  (NDF_WORKTREE_BASE env でオーバーライド可。旧 fallback は廃止)
- パスを <base>/<owner>--<repo>/pr<N> 形式にしてリポジトリ間衝突を防止
- 未登録パスの残骸は .stale-<timestamp> に退避して作り直すガードを追加
- テストを新解決順 + repo slug + 残骸ガードに刷新 (102 passed)
- version 4.14.0 → 4.15.0、関連ドキュメント整合

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | codex | APPROVE

修正必須の指摘はありません。

@takemi-ohama takemi-ohama left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 cross-review | round 1 | gemini | REQUEST_CHANGES

state.py の worktree 生成・解決ロジックにエッジケースの不備があります。

  1. NDF_WORKTREE_BASE に相対パスが指定された場合、state.jsonworktree_path に相対パスが書き込まれ、後続エージェントの「絶対パスを使う」制約が壊れる可能性があります。
  2. フォーク PR フォールバック時の gh pr checkout が失敗した場合、誤ったコミット (HEAD) を指したままの worktree が残存し、次回実行時に不正に流用される危険があります。

インラインコメントの指摘内容に沿って修正をお願いします。

Comment thread plugins/ndf/skills/cross-review/scripts/state.py Outdated
Comment thread plugins/ndf/skills/cross-review/scripts/state.py
…ee ロールバック)

- _default_worktree_base(): 環境変数が相対パスの場合も .resolve() で常に絶対パスを返す
- _create_worktree(): gh pr checkout 失敗時に git worktree remove --force でロールバックし、HEAD 指向 worktree の不正流用を防止

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant