Skip to content
Merged
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
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ members = [
"src/hooks-pre-tool-validate",
"src/hooks-session-start",
"src/hooks-stop-quality",
"src/lib-jj-helpers",
"src/lib-report-formatter",
]

Expand Down
4 changes: 2 additions & 2 deletions docs/adr/adr-021-jj-change-detection-principles.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ select : BOOKMARK_SEARCH_REVSETS を近い順に走査し、
| cli-pr-monitor | `src/cli-pr-monitor/src/util.rs` | `pnpm create-pr` の bookmark 検出 + `--head` 自動補完 |
| cli-push-runner | `src/cli-push-runner/src/stages/push_jj_bookmark.rs` | `pnpm push` の bookmark fallback |

3 クレートで定数・関数が重複している状態は ADR-024 の共通化対象 (PR-C / `docs/todo.md` #8 で `lib-jj-helpers` 抽出予定)。
3 クレートで定数・関数が重複していた状態は PR-C (ADR-024 本採用) で `src/lib-jj-helpers/` に集約済。以降の新規クレートは `lib-jj-helpers` を依存に追加して共通 API を呼び出す。

## 影響

Expand All @@ -152,5 +152,5 @@ select : BOOKMARK_SEARCH_REVSETS を近い順に走査し、
## 次ステップ (スコープ外)

- **cli-merge-pipeline の post_steps 実装時に流用**: ADR-013 の merge 後 AI ステップで、merge の副作用を検出する際も同パターン
- **共通ライブラリ化の検討**: 2 つ目の使用例が出たら `src/lib-jj-helpers/` への切り出しを検討 (ADR-024 (仮) で観察中)
- **lib-jj-helpers の利用徹底**: 新規 jj 連携クレートでは `src/lib-jj-helpers/` を依存に追加し、本 ADR 原則 5 の共通 API (`get_jj_bookmarks` 等) を利用する。`capture_commit_id` / `diff_is_empty` は 2 つ目の使用例出現時に段階的移設予定 (ADR-024 本採用)
- **他の jj コマンド差異の文書化**: `jj bookmark` / `jj new` / `jj describe` も git と意味が違う箇所が多い。必要に応じて追記
47 changes: 24 additions & 23 deletions docs/adr/adr-024-shared-jj-helpers-library.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

本採用 (2026-04-19、試験運用期間: 2026-04-17 ~ 2026-04-19)

> 観察期間中 (2026-04-17 起点、想定 3.5 ヶ月) の早い段階で正式採用条件 (3 箇所の port 完了) を達成したため繰上げ本採用。実抽出作業は PR-C (`docs/todo.md` #8) で `src/lib-jj-helpers/` を新設して実施する。
> 観察期間中 (2026-04-17 起点、想定 3.5 ヶ月) の早い段階で正式採用条件 (3 箇所の port 完了) を達成したため繰上げ本採用。実抽出作業は PR-C で `src/lib-jj-helpers/` を新設して実施済。

## コンテキスト

Expand Down Expand Up @@ -50,19 +50,18 @@ src/lib-jj-helpers/
└── lib.rs
```

公開する API の初期セット:
PR-C で公開した API の初期セット (ADR-021 原則 5 系、bookmark 検出):

- ADR-021 原則 1-4 系 (変更検出):
- `capture_commit_id() -> Option<String>`
- `diff_is_empty(from: &str, to: &str) -> bool`
- ADR-021 原則 5 系 (bookmark 検出):
- 定数 `BOOKMARK_SEARCH_REVSETS = ["@", "@-", "@--"]`
- 定数 `TRUNK_BOOKMARKS = ["main", "master", "trunk", "develop"]`
- `is_trunk_bookmark(name: &str) -> bool`
- `parse_bookmark_list_output(stdout: &str) -> Vec<String>`
- `select_from_revsets(...)` (クロージャ注入型 pure function)
- `query_bookmarks_at(revset: &str) -> Vec<String>`
- `get_jj_bookmarks(stderr_mode: StderrMode) -> Vec<String>`
- 定数 `BOOKMARK_SEARCH_REVSETS = ["@", "@-", "@--"]`
- 定数 `TRUNK_BOOKMARKS = ["main", "master", "trunk", "develop"]`
- `is_trunk_bookmark(name: &str) -> bool`
- `enum StderrMode { Silent, Piped(fn(&str)) }`
- `parse_bookmark_list_output(raw: &str) -> Vec<String>`
- `query_bookmarks_at(revset: &str, stderr_mode: &StderrMode) -> Vec<String>`
- `select_from_revsets<F: Fn(&str) -> Vec<String>>(revsets: &[&str], query: F, fallback_log: Option<fn(&str)>) -> Vec<String>`
- `get_jj_bookmarks(stderr_mode: StderrMode, fallback_log: Option<fn(&str)>) -> Vec<String>`

ADR-021 原則 1-4 系 (変更検出: `capture_commit_id` / `diff_is_empty`) は本 PR 時点では cli-pr-monitor 内に留める。2 つ目の使用例が出現したタイミングで本 crate に移設する (下記「次ステップ」参照)。

配置は ADR-012 の命名規約 `lib-*` に従い、ADR-026 の Cargo workspace の member として登録する。

Expand All @@ -74,21 +73,23 @@ src/lib-jj-helpers/
- **`log_info` 注入**: `fn(&str)` クロージャを引数で受ける設計。各クレート固有 prefix (`[post-pr-monitor]` / `[merge-pipeline]` 等) を崩さない
- **fallback 方針**: log 注入設計で詰まった場合は「各クレート固有の薄いラッパー関数を残す」方針で進める (PR-C 段階で判断)

### 移行方針
### 移行方針 (PR-C で実施済)

PR-C で以下を実施:

PR-C (`docs/todo.md` #8) で以下を実施:
1. `src/lib-jj-helpers/` 新設、workspace member 登録 (済)
2. 共通定数・関数を移動し `pub` 公開 (済)
3. 呼び出し側 3 クレートを差し替え、各 `Cargo.toml` に依存追加 (済)
4. unit テストを `lib-jj-helpers` 側に集約、3 クレートの重複テスト削除 (済)
5. `cargo test --workspace` / `pnpm build:all` でグリーン確認 (済: 363 tests PASS)

1. `src/lib-jj-helpers/` 新設、workspace member 登録
2. 共通定数・関数を移動し `pub` 公開
3. 呼び出し側 3 クレートを差し替え、各 `Cargo.toml` に依存追加
4. unit テストを `lib-jj-helpers` 側に集約、3 クレートの重複テスト削除
5. `cargo test --workspace` / `pnpm build:all` でグリーン確認
なお公開 API のうち `capture_commit_id` / `diff_is_empty` は PR-C 時点では未移設。現状は cli-pr-monitor 内のみで使用されており、2 つ目の使用例が出たタイミングで本 crate に追加する (ADR-021 原則 1-4 系の共通化は将来 PR で段階的に実施)。

## 影響

### 採用される構成要素

- `src/lib-jj-helpers/` (PR-C で新設予定)
- `src/lib-jj-helpers/` (PR-C で新設済)
- 3 呼び出し側クレート (`cli-pr-monitor` / `cli-merge-pipeline` / `cli-push-runner`) の `Cargo.toml` への依存追加

### 避けるべきアンチパターン
Expand All @@ -103,8 +104,8 @@ PR-C (`docs/todo.md` #8) で以下を実施:
- ADR-021 (jj 変更検出): 本 ADR のヘルパーが実装する原則 (原則 1-5 すべて)
- ADR-026 (Cargo workspace): workspace member として参照する前提

## 次ステップ (スコープ外、PR-C で実施)
## 次ステップ (スコープ外)

- **PR-C (`docs/todo.md` #8)**: `src/lib-jj-helpers/` 新設と 3 クレート差し替え
- **将来の新規クレート**: jj 連携が必要になったらまず `lib-jj-helpers` を依存に追加することから始める
- **API 拡張**: `jj new` / `jj describe` / `jj bookmark` 系のラッパーは都度検討 (早期汎用化を避ける)
- **`capture_commit_id` / `diff_is_empty` の移設**: cli-pr-monitor 以外に 2 つ目の使用例が出現したタイミングで実施
2 changes: 1 addition & 1 deletion docs/adr/adr-028-pnpm-create-pr-gate.md
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ interactive session での PR 作成フロー:
## 次ステップ (スコープ外、PR-B 以降で対応)

- **PR-B (実装済)**: `.claude/settings.json` に `permissions.ask` 4 パターンを追加して二次防衛層を実装 + `scripts/prepare-pr-body.ps1` で PR body を一時ファイル化する helper を整備
- **PR-D (`docs/todo.md` #8)**: `prepare-pr` skill で「ドラフト提示 → 明示承認 → 実行」フローを標準化
- **PR-D (`docs/todo.md` #7)**: `prepare-pr` skill で「ドラフト提示 → 明示承認 → 実行」フローを標準化
- **運用レビュー**: 2026-07 に二次防衛層の発火頻度を計測。毎回 prompt 応答が形骸化していないか確認

## 参照
Expand Down
60 changes: 8 additions & 52 deletions docs/todo.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,17 +159,18 @@

---

## セッション 247510ea 由来: 整備タスク群 (PR-C〜PR-D)
## セッション 247510ea 由来: 整備タスク群 (PR-D)

> **最優先ブロック**。PR #54 / #55 のマージ後に確定した ADR / 仕組みの整備作業。2 タスクは **PR 粒度で分割実施**、依存関係あり。
> **最優先ブロック**。PR #54 / #55 のマージ後に確定した ADR / 仕組みの整備作業。残 1 タスク。
>
> **背景コンテキスト**:
> - **発端セッション**: `247510ea-3f24-4b87-8f68-3c860e1b1b4e` (2026-04-18)
> - **先行成果**:
> - PR #54 (cli-merge-pipeline の revset 拡張 `@-..@--` + trunk filter)
> - PR #55 (cli-pr-monitor への同パターン水平展開)
> - PR-A (ADR 集約 / PR #56 merged): ADR-028 新設、ADR-021 原則 5 追加、ADR-024 本採用、ADR-019 可換性追記
> - PR-B (Ask ルール + body helper / 本 PR): `permissions.ask` 4 パターン追加、`scripts/prepare-pr-body.ps1` 新設
> - PR-B (Ask ルール + body helper / PR #57 merged): `permissions.ask` 4 パターン追加、`scripts/prepare-pr-body.ps1` 新設
> - PR-C (jj-helpers 抽出 / 本 PR): `src/lib-jj-helpers/` 新設、3 クレート差し替え、重複テストを lib 側に集約
> - **ユーザーフィードバック 3 点** (memory `feedback_bookmark_auto_naming.md` に記録済):
> 1. auto mode は試験導入。基本は自律実行だが、**最終出力の責任をユーザーが握るため `pnpm create-pr` / `pnpm merge-pr` は事前許可必須**
> 2. bookmark 名は Claude が自動採番して OK
Expand All @@ -181,56 +182,11 @@
>
> **PR 依存関係**:
> ```
> PR-A (ADR 集約, merged) ──┬── PR-B (Ask ルール + body helper, merged/本 PR) ── PR-D (prepare-pr skill)
> └── PR-C (jj-helpers 抽出)
> PR-A (ADR 集約, merged) ──┬── PR-B (Ask ルール + body helper, merged) ── PR-D (prepare-pr skill)
> └── PR-C (jj-helpers 抽出, 本 PR)
> ```
>
> **推奨実行順序**: PR-C → PR-D (PR-B は別 PR で着手済/完了)
>
> **CodeRabbit rate limit 対策**: PR-B と PR-C の push 間に 1 時間のインターバルを入れる (無料枠は 1h 3 件制限)

### 7. [PR-C] `jj-helpers` 共通クレート抽出 (ADR-024 本採用後)

- **やろうとしたこと**: PR #55 の CodeRabbit Nitpick で指摘された通り、bookmark 検出ロジックが **cli-push-runner / cli-merge-pipeline / cli-pr-monitor の 3 クレートで重複定義** されている状態を `jj-helpers` 共通クレートに集約
- **現在地**: 未着手。PR-A merge 後に着手可 (ADR-024 本採用が前提)
- **背景**:
- cli-push-runner: `push_jj_bookmark.rs` に `TRUNK_BOOKMARKS`, `is_trunk_bookmark`, bookmark parsing
- cli-merge-pipeline: PR #54 で 3 層構造 + trunk filter を実装
- cli-pr-monitor: PR #55 で同パターンを移植
- ADR-024 の「試験運用」条件 = **3 箇所目の port 完了** が達成済
- 次に 4 箇所目のクレートが同パターンを必要とすると機械的に広がる懸念
- **実装内容**:
- [ ] **新クレート `src/lib-jj-helpers/` 追加** (ADR-026 workspace 準拠)
- `Cargo.toml`, `src/lib.rs`
- Cargo workspace root の `members` に追加
- [ ] **共通定数と関数を `pub` で移動**:
- `BOOKMARK_SEARCH_REVSETS`, `TRUNK_BOOKMARKS`
- `is_trunk_bookmark`, `parse_bookmark_list_output`, `select_from_revsets`, `query_bookmarks_at`, `get_jj_bookmarks`
- [ ] **`stderr` ハンドリングを引数化**: `fn get_jj_bookmarks(stderr_mode: StderrMode)` 等
- cli-pr-monitor は `Stdio::null` 継続
- cli-merge-pipeline は `Stdio::piped` + logging 継続
- [ ] **`log_info` 注入**: `fn(&str) -> ()` を引数で受け取る設計
- 各クレート固有 prefix (`[post-pr-monitor]` / `[merge-pipeline]` 等) を崩さない
- [ ] **呼び出し側 3 クレート差し替え**:
- `src/cli-push-runner/src/stages/push_jj_bookmark.rs`
- `src/cli-merge-pipeline/src/main.rs`
- `src/cli-pr-monitor/src/util.rs`
- 各 `Cargo.toml` に `lib-jj-helpers` 依存追加
- [ ] **unit テスト集約**: `lib-jj-helpers` 側に集約、3 クレートの重複テスト削除
- [ ] **検証**:
- `cargo test --workspace` でグリーン
- `pnpm build:all` で全 exe がビルドされる
- PR #54/#55 の動作パターン (`@` 空 / `@-` = bookmark) の smoke test
- **詰まっている箇所**:
- **log_info 注入設計**: クロージャ vs. trait vs. 呼び出し側 wrap のどれが最もエルゴノミックか要設計
- **stderr ハンドリング引数化**: `enum StderrMode { Silent, Piped(LogFn) }` のような型定義
- **想定サイズ**: 中〜大 (refactor、~400-600 行差分、但し移動が主)
- **依存**: **PR-A** (ADR-024 格上げが前提)
- **見積**: 2-4 時間
- **リスク**: log_info 注入の設計で躓いた場合、「各クレート固有の薄いラッパー関数を残す」フォールバック方針で進める
- **参照**: PR #54, PR #55 (CodeRabbit Nitpick 1), ADR-024, ADR-026 (Cargo workspace)

### 8. [PR-D] `prepare-pr` skill (試験運用)
### 7. [PR-D] `prepare-pr` skill (試験運用)

- **やろうとしたこと**: auto mode で安全に PR を作成するためのインタビュー型 skill を試験運用として整備。commit log と diff から PR title / body の初稿を生成し、ユーザー承認後に `pnpm create-pr` を foreground 実行するフローを標準化
- **現在地**: 未着手。PR-B merge 後に着手 (ADR-028 の運用フローと PR-B の body helper が前提)
Expand All @@ -257,7 +213,7 @@

## その他の進行中タスク

### 9. 雑務: 過去の delete-pending bookmark cleanup
### 8. 雑務: 過去の delete-pending bookmark cleanup

- **やろうとしたこと**: `jj git push --tracked` で `Refusing to push deleted bookmark fix/push-allow-new` の警告が出るため、`jj bookmark forget fix/push-allow-new` で消す
- **現在地**: 未対応。push を block しないので緊急性なし
Expand Down
1 change: 1 addition & 0 deletions src/cli-merge-pipeline/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ edition = "2021"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
toml = "0.8"
lib-jj-helpers = { path = "../lib-jj-helpers" }

# [profile.release] は workspace root (Cargo.toml) に集約 (ADR-026)
Loading