Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
{
"name": "ndf",
"source": "./plugins/ndf",
"description": "All-in-one plugin (v4.14.0): 8 specialized agents (model-tiered), 48 skills including pytest-playwright E2E testing (7 focused skills: test-planning, script-creation, execution, report, kit-ops, browser-connect, evidence-drive), CDP remote browser support, Google Drive evidence archival, ML model structure standard, PR/review workflows, principles, data analysis, Codex/Gemini CLI integration, skill usage stats, statusline switcher (/ndf:statusline). SessionStart hook (transcript retention >= 90 days, default statusline when none is configured), Stop hook (AI-summarized Slack notifications)."
"description": "All-in-one plugin (v4.15.0): 8 specialized agents (model-tiered), 48 skills including pytest-playwright E2E testing (7 focused skills: test-planning, script-creation, execution, report, kit-ops, browser-connect, evidence-drive), CDP remote browser support, Google Drive evidence archival, ML model structure standard, PR/review workflows, principles, data analysis, Codex/Gemini CLI integration, skill usage stats, statusline switcher (/ndf:statusline). SessionStart hook (transcript retention >= 90 days, default statusline when none is configured), Stop hook (AI-summarized Slack notifications)."
},
{
"name": "affaan-m",
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ ai-plugins/

## NDFプラグインについて

**NDFプラグイン**は、このマーケットプレイスの主要プラグインです(v4.14.0):
**NDFプラグイン**は、このマーケットプレイスの主要プラグインです(v4.15.0):
- 8個の専門サブエージェント(director、data-analyst、corder、researcher、qa、debugger、devops-engineer、code-reviewer)
- 48個のSkills(PR/コードレビューワークフロー、AIクロスレビュー (codex/gemini)、原則・ガイドライン、MLモデル構造標準 (ml-model-structure)、issue→multi-PR ワークフロー戦略、SQL最適化、データエクスポート、skill利用統計、statusline切替 (/ndf:statusline)、Codex CLI連携、Playwrightシナリオテスト (CDPリモート接続・Google Driveエビデンス保管含む)、Google Drive/Chat連携 等)
- SessionStartフック(transcript保持期間自動管理 `cleanupPeriodDays >= 90`、statusLine未設定時のNDF標準statusline自動設定)
Expand Down
3 changes: 2 additions & 1 deletion docs/ndf-plugin-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

NDF プラグインは、Claude Code / Kiro CLI 向けのオールインワン開発支援プラグイン。エージェント、Skills、フックを統合して提供する。

**現行バージョン**: **v4.14.0** — `statusline` skill とデフォルト statusline 設定 hook を追加(47→48個)。statusLine 未設定時のみ NDF 標準 statusline(コンテナ名/ホスト名 + project_dir + コンテキスト使用率)を自動設定し、`/ndf:statusline set|restore|status` で切り替え・復元できる。**v4.13.0** で `issue-plan-strategy` の release PR body を self-contained 必須化。**v4.12.0** で Playwright E2E に `/ndf:playwright-browser-connect`(CDP リモートブラウザ接続)と `/ndf:playwright-evidence-drive`(Google Drive エビデンスアーカイブ)の 2 skill を追加(45→47個)。直前の **v4.11.0** で `/ndf:cross-review` の堅牢性改善(monitor.py の EARLY_ERROR 誤検知を解消: テスト用文字列リテラル / grep 形式ソース引用行を benign 自動判定し、ループ終了時の最終スイープで残 open review thread を全 Resolve)を実施。**v4.10.0** で `ml-model-structure` skill(MLモデル構築・推論API開発の標準ディレクトリ構造: 版内feature SSoT / train↔serve契約)を追加。`/ndf:fix` の修正ポリシー刷新(minor/nit のうち performance/readability/duplication は積極修正、+30 行超は要問い合わせ)、CI 完了待ち廃止、PR範囲外 flaky テストも修正対象。`/ndf:cross-review` 内のサブエージェントプロンプトも同期。重要度ラベルは AI agent の付与を鵜呑みにせず独自再判定。完了報告には PR URL 必須。詳細は [CHANGELOG.md](../plugins/ndf/CHANGELOG.md)。`/ndf:codex` skill + `corder` エージェント経由の Codex CLI 直接実行に一本化、Serena MCP は別プラグイン `mcp-serena` に分離済み、Playwright シナリオ E2E、Google Drive / Chat 連携 skill を提供。
**現行バージョン**: **v4.15.0** — cross-review の worktree 生成先を非永続領域 `<システム tmpdir>/ndf-worktrees/<owner>--<repo>/pr<N>` に変更(永続 volume 消費・他リポジトリの PR 番号衝突・残骸流用事故を解消。`NDF_WORKTREE_BASE` env で明示オーバーライド可)。**v4.14.0** で `statusline` skill とデフォルト statusline 設定 hook を追加(47→48個)。statusLine 未設定時のみ NDF 標準 statusline(コンテナ名/ホスト名 + project_dir + コンテキスト使用率)を自動設定し、`/ndf:statusline set|restore|status` で切り替え・復元できる。**v4.13.0** で `issue-plan-strategy` の release PR body を self-contained 必須化。**v4.12.0** で Playwright E2E に `/ndf:playwright-browser-connect`(CDP リモートブラウザ接続)と `/ndf:playwright-evidence-drive`(Google Drive エビデンスアーカイブ)の 2 skill を追加(45→47個)。直前の **v4.11.0** で `/ndf:cross-review` の堅牢性改善(monitor.py の EARLY_ERROR 誤検知を解消: テスト用文字列リテラル / grep 形式ソース引用行を benign 自動判定し、ループ終了時の最終スイープで残 open review thread を全 Resolve)を実施。**v4.10.0** で `ml-model-structure` skill(MLモデル構築・推論API開発の標準ディレクトリ構造: 版内feature SSoT / train↔serve契約)を追加。`/ndf:fix` の修正ポリシー刷新(minor/nit のうち performance/readability/duplication は積極修正、+30 行超は要問い合わせ)、CI 完了待ち廃止、PR範囲外 flaky テストも修正対象。`/ndf:cross-review` 内のサブエージェントプロンプトも同期。重要度ラベルは AI agent の付与を鵜呑みにせず独自再判定。完了報告には PR URL 必須。詳細は [CHANGELOG.md](../plugins/ndf/CHANGELOG.md)。`/ndf:codex` skill + `corder` エージェント経由の Codex CLI 直接実行に一本化、Serena MCP は別プラグイン `mcp-serena` に分離済み、Playwright シナリオ E2E、Google Drive / Chat 連携 skill を提供。

## ディレクトリ構造

Expand Down Expand Up @@ -206,3 +206,4 @@ claude -p --settings '{"disableAllHooks": true, "disableAllPlugins": true}' --ou
| **v4.12.1** | `/ndf:cross-review` デフォルト調整: `--max-rounds` 6→12 / `--rotate-after` 5→8、`--rotate-mode squash` 説明から「既存挙動」表記を削除 |
| **v4.13.0** | `issue-plan-strategy`: release PR body の self-contained 必須化 (レビュアー視点の原則明文化、子 PR チェックリストを `<details>` に格下げ、Ready 前の body 最終化ステップ追加) |
| **v4.14.0** | `statusline` skill + デフォルト statusline 設定 hook 追加 (47→48個)。statusLine 未設定時のみ NDF 標準 statusline を自動設定、`/ndf:statusline set\|restore\|status` で切替・復元 |
| **v4.15.0** | cross-review: worktree 生成先を `<システム tmpdir>/ndf-worktrees/<owner>--<repo>/pr<N>` に変更 (非永続化 + リポジトリ別分離)。未登録パスの残骸は `.stale-<ts>` に退避して作り直すガード追加 |
2 changes: 1 addition & 1 deletion plugins/ndf/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ndf",
"version": "4.14.0",
"version": "4.15.0",
"description": "Integrated plugin with 8 specialized agents (model-tiered: opus/sonnet/haiku), 48 skills including official mcp-builder, on-demand loader for Anthropic official skills, generic workflow/principle skills, ML model structure standard (ml-model-structure), skill usage statistics, pytest-playwright E2E testing split into 7 focused skills (test-planning, script-creation, execution, report, kit-ops, browser-connect, evidence-drive) + orchestrator with video-by-default evidence, CDP remote browser support, and Google Drive evidence archival, Google Drive/Chat integration, and Codex CLI integration via /ndf:codex skill. Transcript retention is automatically kept at >= 90 days. Default statusline (container/host name + project dir + context usage) is set when none is configured, switchable via /ndf:statusline. Serena MCP is a separate plugin (mcp-serena).",
"author": {
"name": "takemi-ohama",
Expand Down
21 changes: 21 additions & 0 deletions plugins/ndf/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,26 @@
# NDF Plugin CHANGELOG

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

cross-review の worktree 生成先 `/work/worktrees/pr<N>` が共有の永続 volume 上にあり、
(1) 別リポジトリの同一 PR 番号と衝突する (2) 明示削除しないと残り続ける
(3) volume スペースを消費する、という問題に対応。実際に別プロジェクトの残骸
worktree を流用して git 操作が壊れる事故が発生した。

- **デフォルト生成先を `<システム tmpdir>/ndf-worktrees` に変更** (`state.py`):
- 解決順: `NDF_WORKTREE_BASE` env > `tempfile.gettempdir()/ndf-worktrees`
- 非永続領域のためコンテナ再作成で自動消滅し、明示削除も不要
- 旧 `/work/worktrees` / `$HOME/work/worktrees` フォールバックは廃止
- **パスにリポジトリ slug を含める**: `<base>/<owner>--<repo>/pr<N>` 形式とし、
他リポジトリの同一 PR 番号と衝突しないようにした
- **残骸 worktree の流用ガード追加**: パスが存在しても `git worktree list` に
登録されていなければ `.stale-<timestamp>` に退避して作り直す
(`_is_registered_worktree()` / `_create_worktree()` に分離)
- **テスト更新**: `test_default_worktree_base.py` を新解決順 + repo slug +
残骸ガードのテストに刷新 (102 passed)
- **plugin.json: version 4.14.0 → 4.15.0**。marketplace.json / AGENTS.md /
ndf-plugin-reference の version 表記を整合。

### v4.14.0 (statusline skill + デフォルト statusline 設定 hook 追加)

コンテナ名 (非コンテナ環境ではホスト名) + project_dir + コンテキスト使用率を表示する
Expand Down
12 changes: 9 additions & 3 deletions plugins/ndf/skills/cross-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ state.json の読み書きや AI launcher 起動・完了待ちは全て委譲
| # | 対策 | スクリプト側で何をするか |
|---|---|---|
| 1 | 自分の PR 判定(422 回避) | `gh api user` と `gh pr view --json author` を比較し `is_own_pr` / `event_downgrade` を state.json に書く |
| 2 | worktree 分離 | `git worktree add <worktree-base>/pr<PR> <head>` を冪等実行(`<worktree-base>` は `NDF_WORKTREE_BASE` env > `/work/worktrees` > `$HOME/work/worktrees` の優先順で解決) |
| 2 | worktree 分離 | `git worktree add <worktree-base>/<owner>--<repo>/pr<PR> <head>` を冪等実行(`<worktree-base>` は `NDF_WORKTREE_BASE` env > `<システム tmpdir>/ndf-worktrees` の優先順で解決)。パスが存在しても現リポジトリの登録済み worktree でなければ `.stale-<ts>` に退避して作り直す |
| 3 | gemini trusted directory | `launch-gemini.sh` が `GEMINI_CLI_TRUST_WORKSPACE=true` + `--skip-trust` を必ず併用。**tmp dir は `<worktree>/.cross_review/`** を採用し、gemini の workspace 制約 (workspace 外の `write_file` がブロックされる) を根本回避 |
| 4 | 既存コメント差分 | `fix/scripts/fetch-pr-comments.sh` で 3 ソース (インラインコメント / レビュー body / PR レベルコメント) を一括取得し `$TMP_DIR/cross-review-pr<PR>-existing-comments.txt` に保存。gemini プロンプトには **内容をインライン埋め込み**、codex プロンプトには path を渡す |

Expand All @@ -97,8 +97,14 @@ state.json の読み書きや AI launcher 起動・完了待ちは全て委譲
`state.py init` は worktree の親ディレクトリを以下の優先順で解決する:

1. `NDF_WORKTREE_BASE` 環境変数(明示オーバーライド)
2. `/work/worktrees`(Linux コンテナ環境互換。書き込み可能ならこちらを使用)
3. `$HOME/work/worktrees`(macOS / WSL 等のフォールバック)
2. `<システム tmpdir>/ndf-worktrees`(Python `tempfile.gettempdir()`。非永続領域のため
コンテナ再作成で自動消滅し、共有 volume を消費しない)

worktree の実パスは `<base>/<owner>--<repo>/pr<PR>` 形式で、リポジトリ slug を含める
ことで**他リポジトリの同一 PR 番号と衝突しない**。永続 volume(旧 `/work/worktrees`)を
使っていた頃は別プロジェクトの残骸 worktree を誤って流用する事故があったため、
パスが存在しても `git worktree list` に登録されていなければ `.stale-<timestamp>` に
退避して作り直すガードも入っている。

解決した実パスは `state.json` の `worktree_path` に書かれるため、後続スクリプトや
サブエージェント prompt は state.json から読めば追従できる。
Expand Down
6 changes: 3 additions & 3 deletions plugins/ndf/skills/cross-review/docs/01-state-and-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"rotate_after": 8,
"only": null,
"current_pr": 123,
"worktree_path": "/work/worktrees/pr123",
"worktree_path": "/tmp/ndf-worktrees/owner--name/pr123",
"repo": "owner/name",
"head_branch": "feature/foo",
"base_branch": "main",
Expand Down Expand Up @@ -98,7 +98,7 @@ cd "$WORKTREE"

1. 既存 state.json があり `final == null` なら再開
2. 自分の PR 判定(`gh api user` と `gh pr view --json author` を比較)
3. worktree 作成(`<worktree-base>/pr<PR>`。`<worktree-base>` は `NDF_WORKTREE_BASE` env > `/work/worktrees` > `$HOME/work/worktrees` の優先順で解決。実 path は state.json の `worktree_path` を参照)
3. worktree 作成(`<worktree-base>/<owner>--<repo>/pr<PR>`。`<worktree-base>` は `NDF_WORKTREE_BASE` env > `<システム tmpdir>/ndf-worktrees` の優先順で解決。既存パスが現リポジトリの登録済み worktree でなければ `.stale-<ts>` に退避して作り直す。実 path は state.json の `worktree_path` を参照)
4. 既存コメントスナップショット (`fix/scripts/fetch-pr-comments.sh` で 3 ソース一括取得) → `$TMP_DIR/cross-review-pr<PR>-existing-comments.txt`
5. state.json 書き出し

Expand Down Expand Up @@ -173,7 +173,7 @@ fi
launcher が生成するプロンプトに以下を強制している:

- **headRefOid (commit_id) を明示**: AI が自前で取得すると baseRefOid を誤って入れる事故が多発
- **作業 worktree の絶対パス**: 「ファイル読み取りは必ず worktree 配下の絶対パスを使う」(実 path は state.json の `worktree_path` を参照。`<worktree-base>` は `NDF_WORKTREE_BASE` env > `/work/worktrees` > `$HOME/work/worktrees` の優先順で解決)
- **作業 worktree の絶対パス**: 「ファイル読み取りは必ず worktree 配下の絶対パスを使う」(実 path は state.json の `worktree_path` を参照。`<worktree-base>` は `NDF_WORKTREE_BASE` env > `<システム tmpdir>/ndf-worktrees` の優先順で解決)
- **event ダウングレード警告**: `event_downgrade=true` のときは payload の `event` を `COMMENT` に
- **既存コメント差分**: `$TMP_DIR/cross-review-pr<PR>-existing-comments.txt` を読んで重複指摘禁止
- **review body 先頭 prefix**:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ state.json から旧 PR / worktree を解決し、以下の素材を 1 つの JS
"state_pr": 217,
"old_pr": 217,
"old_pr_url": "https://github.com/.../pull/217",
"worktree_path": "/work/worktrees/pr217",
"worktree_path": "/tmp/ndf-worktrees/owner--name/pr217",
"head_branch": "feature/...",
"base_branch": "release/...",
"is_draft": true,
Expand Down
Loading