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
2 changes: 1 addition & 1 deletion .claude/hooks-config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# 1. $CLAUDE_ENV_FILE → Bash ツールの環境変数 (CLAUDE_CODE_SESSION_ID)
# 2. .claude/.session-id → 子プロセス exe から読み取り可能
# 同一 ID ならスキップ、異なる ID なら上書きする方式。
# ※ hooks-post-pr-monitor は daemon + state file 方式に移行済みのため
# ※ cli-pr-monitor は daemon + state file 方式に移行済みのため
# .session-id の直接参照は不要になったが、将来の拡張用に維持。

# [session_start]
Expand Down
2 changes: 1 addition & 1 deletion .claude/settings.local.json.template
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"permissions": {
"allow": [
"Bash(pnpm build:hooks)",
"Bash(pnpm build:all)",
"Bash(pnpm check-ci *)",
"Bash(pnpm pr-create *)",
"Bash(cargo test:*)"
Expand Down
21 changes: 4 additions & 17 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,11 @@
.claude/hook-debug.log
.claude/post-pr-monitor-debug.log

# Generated from .claude/settings.local.json.template by build:hooks
# Generated from .claude/settings.local.json.template by build:all
.claude/settings.local.json

# Built executables (can be rebuilt with pnpm build:hooks)
.claude/hooks-pre-tool-validate.exe
.claude/hooks-post-tool-linter.exe
.claude/hooks-stop-quality.exe
.claude/hooks-push-pipeline.exe
.claude/hooks-post-pr-monitor.exe
.claude/check-ci-coderabbit.exe
.claude/hooks-session-start.exe
# Built executables (can be rebuilt with pnpm build:all)
.claude/*.exe

# Deploy targets (contains local paths; create from deploy-targets.template.json)
scripts/deploy-targets.json
Expand All @@ -25,14 +19,7 @@ __pycache__/
*.pyc

# Rust build artifacts
src/hooks-pre-tool-validate/target/
src/hooks-post-tool-linter/target/
src/hooks-stop-quality/target/
src/hooks-push-pipeline/target/
src/hooks-post-pr-monitor/target/
src/check-ci-coderabbit/target/
src/hooks-session-start/target/
src/hooks-report-formatter/target/
src/*/target/

# Runtime generated files
.claude/.session-id
Expand Down
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,11 @@
- [ADR-008: Push Pipeline ハーネスの実装](docs/adr/adr-008-push-pipeline-harness.md)
- [ADR-009: Post-PR Monitor — push/PR作成後の CI・CodeRabbit 自動監視](docs/adr/adr-009-post-pr-monitor.md)
- [ADR-011: jj の新規ブックマーク push 戦略](docs/adr/adr-011-jj-push-new-bookmark-strategy.md)
- [ADR-012: src/ ディレクトリの命名規約](docs/adr/adr-012-src-naming-convention.md)

## Build

```sh
pnpm build:hooks # 全 hooks exe を一括ビルド
pnpm build:all # 全 hooks/CLI exe を一括ビルド
pnpm deploy:hooks # 派生プロジェクトに exe を配布
```
2 changes: 1 addition & 1 deletion docs/adr/adr-001-hooks-implementation-language.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Windows 環境では以下の問題が発生した。
- Windows 環境で hooks が確実に動作する
- PreToolUse / PostToolUse で実装パターンが統一される
- ビルド済み exe を `.gitignore` で除外し、ソースコードだけをバージョン管理できる
- `pnpm build:hooks` 一発で全 hooks を再ビルドできる
- `pnpm build:all` 一発で全 hooks を再ビルドできる

### Negative

Expand Down
12 changes: 6 additions & 6 deletions docs/adr/adr-003-hooks-layout-and-build-strategy.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ Claude Code の hooks を複数管理する上で、ファイル配置・ビル
- `pnpm build:hooks-pre-tool-validate` — PreToolUse フック単体ビルド
- `pnpm build:hooks-post-tool-linter` — PostToolUse フック単体ビルド
- `pnpm build:hooks-stop-quality` — Stop フック単体ビルド
- `pnpm build:hooks` — 全フック一括ビルド
- `pnpm build:all` — 全フック一括ビルド
- 各コマンドは `cd .claude/<dir> && cargo build --release && cp target/release/<name>.exe ../<name>.exe` の形式

### バージョン管理

- `.gitignore` で除外するもの:
- ビルド済み exe(`pnpm build:hooks` で再生成可能)
- ビルド済み exe(`pnpm build:all` で再生成可能)
- `target/` ディレクトリ(Rust ビルド成果物)
- バージョン管理するもの:
- `Cargo.toml` と `src/` 以下のソースコード
Expand All @@ -76,22 +76,22 @@ Claude Code の hooks を複数管理する上で、ファイル配置・ビル
### Positive

- フックの追加時に命名規則・配置が明確で迷わない
- `pnpm build:hooks` 一発で全フックを再ビルドできる
- `pnpm build:all` 一発で全フックを再ビルドできる
- exe はバージョン管理外なのでリポジトリサイズが肥大化しない
- 各フックが独立した Cargo プロジェクトなので、依存関係の競合が起きない

### Negative

- フック追加時に `package.json` の scripts と `.gitignore` の両方を更新する必要がある
- クローン直後は `pnpm build:hooks` を実行しないと hooks が動作しない
- クローン直後は `pnpm build:all` を実行しないと hooks が動作しない

### 新しいフックを追加する手順

1. `.claude/<機能名>/` に Cargo プロジェクトを作成
2. `package.json` に `build:hooks-<機能名>` スクリプトを追加し、`build:hooks` にチェーン
2. `package.json` に `build:hooks-<機能名>` スクリプトを追加し、`build:all` にチェーン
3. `.gitignore` に `.claude/<機能名>.exe` と `.claude/<機能名>/target/` を追加
4. `settings.local.json` の該当フックイベントに exe のパスを登録
5. `pnpm build:hooks` でビルド確認
5. `pnpm build:all` でビルド確認

## References

Expand Down
10 changes: 5 additions & 5 deletions docs/adr/adr-005-hooks-path-resolution-with-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ ADR-003 では `settings.local.json` の `command` フィールドで `%CLAUDE_P

## Decision

**`settings.local.json.template` をテンプレートとして git 管理し、`pnpm build:hooks` 実行時にプロジェクトの絶対パスを埋め込んで `settings.local.json` を自動生成する。**
**`settings.local.json.template` をテンプレートとして git 管理し、`pnpm build:all` 実行時にプロジェクトの絶対パスを埋め込んで `settings.local.json` を自動生成する。**
Comment thread
coderabbitai[bot] marked this conversation as resolved.

### テンプレート

Expand All @@ -55,7 +55,7 @@ ADR-003 では `settings.local.json` の `command` フィールドで `%CLAUDE_P
node -e "...process.cwd() で {{PROJECT_DIR}} を置換..."
```

`build:hooks` の末尾で自動実行されるため、exe ビルドとパス設定が 1 コマンドで完了する。
`build:all` の末尾で自動実行されるため、exe ビルドとパス設定が 1 コマンドで完了する。

### バージョン管理

Expand All @@ -68,14 +68,14 @@ node -e "...process.cwd() で {{PROJECT_DIR}} を置換..."

### Positive

- `pnpm build:hooks` を 1 回実行するだけで exe ビルド + パス設定が完了する
- `pnpm build:all` を 1 回実行するだけで exe ビルド + パス設定が完了する
- `%CLAUDE_PROJECT_DIR%` の不安定性に依存しない
- テンプレートを git 管理するため、hooks 設定の変更履歴が追跡できる
- プロジェクトをコピーしても `pnpm build:hooks` で正しいパスに自動更新される
- プロジェクトをコピーしても `pnpm build:all` で正しいパスに自動更新される

### Negative

- クローン直後に `pnpm build:hooks` を実行しないと hooks が動作しない(ADR-003 と同様)
- クローン直後に `pnpm build:all` を実行しないと hooks が動作しない(ADR-003 と同様)
- テンプレートと生成物の二重管理になる(ただし生成は自動なので実質的な負担は小さい)

### ADR-003 への影響
Expand Down
2 changes: 1 addition & 1 deletion docs/adr/adr-006-config-driven-hooks.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ hooks (Rust 製 exe 4 本) を複数の派生プロジェクト (auto-review-fix

### 配布

- `pnpm build:hooks` で本家でビルド
- `pnpm build:all` で本家でビルド
- `pnpm deploy:hooks` で `scripts/deploy-targets.json` に登録された派生プロジェクトに exe を一括コピー
- 派生プロジェクトは `hooks-config.toml` のみを管理

Expand Down
12 changes: 6 additions & 6 deletions docs/adr/adr-008-push-pipeline-harness.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ Git には `pre-push` フックがあり、Lefthook のような OSS でパイ

2. **PreToolUse でブロック + スタンドアロン exe で パイプラインを実行**
- PreToolUse で `jj git push` をブロックし、「`pnpm push` を使え」と誘導
- `pnpm push` がスタンドアロン exe (hooks-push-pipeline) を呼び出し、テスト → レビュー → push を順次実行
- `pnpm push` がスタンドアロン exe (cli-push-pipeline) を呼び出し、テスト → レビュー → push を順次実行
- → Claude Code hooks の制約内で push パイプラインを実現可能

3. **Skill (`/push`) として実装**
Expand All @@ -28,7 +28,7 @@ Git には `pre-push` フックがあり、Lefthook のような OSS でパイ

## 決定

**選択肢 2 を採用する。** PreToolUse の `jj-push-guard` プリセットで直接の push をブロックし、`hooks-push-pipeline` (スタンドアロン Rust exe) で push 前パイプラインを実行する。
**選択肢 2 を採用する。** PreToolUse の `jj-push-guard` プリセットで直接の push をブロックし、`cli-push-pipeline` (スタンドアロン Rust exe) で push 前パイプラインを実行する。

### アーキテクチャ

Expand All @@ -44,7 +44,7 @@ PreToolUse (hooks-pre-tool-validate)
Claude が "pnpm push" を実行する
hooks-push-pipeline.exe (スタンドアロン)
cli-push-pipeline.exe (スタンドアロン)
├─ hooks-config.toml [push_pipeline] を読み込み
├─ command 型ステップを順次実行
├─ ai 型ステップは現在スキップ (将来実装)
Expand All @@ -54,7 +54,7 @@ hooks-push-pipeline.exe (スタンドアロン)

### Claude Code hooks プロトコルとの違い

| | Claude Code hooks (Pre/Post/Stop) | hooks-push-pipeline |
| | Claude Code hooks (Pre/Post/Stop) | cli-push-pipeline |
|---|---|---|
| 起動方法 | Claude Code が自動的に呼び出す | `pnpm push` から手動/Claude 経由で呼び出す |
| 入力 | stdin に JSON | なし (hooks-config.toml から設定読み込み) |
Expand All @@ -76,14 +76,14 @@ hooks-push-pipeline.exe (スタンドアロン)
### Positive

- Claude Code hooks に push イベントがない制約下で、事実上の push hook を実現できる
- 既存のビルド・配布フロー (`pnpm build:hooks`, `pnpm deploy:hooks`) にそのまま乗る
- 既存のビルド・配布フロー (`pnpm build:all`, `pnpm deploy:hooks`) にそのまま乗る
- `hooks-config.toml` の `[push_pipeline]` セクションで、プロジェクトごとにステップをカスタマイズできる
- `type = "ai"` ステップの導入により、将来の AI レビュー・コミット整理統合への拡張ポイントが確保されている

### Negative

- PreToolUse ブロックは Claude 経由の push にのみ有効。ユーザーが直接ターミナルから `jj git push` を叩いた場合はバイパスされる(前提条件により許容)
- `hooks-push-pipeline` は Claude Code hooks プロトコルに準拠しないスタンドアロン exe であり、hooks 群の中で唯一の例外的な存在になる
- `cli-push-pipeline` は Claude Code hooks プロトコルに準拠しないスタンドアロン exe であり、hooks 群の中で唯一の例外的な存在になる
- `run_step()` / `drain_pipe()` ロジックが `hooks-stop-quality` と重複する(ADR-003 の独立 Cargo プロジェクト方針に従い、共通クレート化は見送り)

### 将来の検討事項
Expand Down
12 changes: 6 additions & 6 deletions docs/adr/adr-009-post-pr-monitor.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ PreToolUse guard (gh-pr-create-guard) がブロック
Claude が "pnpm pr-create -- --title ..." を実行
hooks-post-pr-monitor.exe (スタンドアロン)
cli-pr-monitor.exe (スタンドアロン)
├─ gh pr create を実行(引数を転送)
├─ PR番号・リポジトリ情報を gh CLI で取得
├─ .claude/pr-monitor-state.json に初期 state 書き出し
Expand All @@ -64,16 +64,16 @@ Claude が stdout を読み、CronCreate で定期ジョブ作成 (任意)
└─ command: cat .claude/pr-monitor-state.json

【既存 PR への push 時】
pnpm push → hooks-push-pipeline.exe (テスト + レビュー + push)
pnpm push → cli-push-pipeline.exe (テスト + レビュー + push)
▼ (push 成功後に && でチェイン)
hooks-post-pr-monitor.exe --monitor-only
cli-pr-monitor.exe --monitor-only
├─ gh pr view で PR 存在確認
├─ PR なし → exit 0 (何もしない)
└─ PR あり → state file 初期化 + daemon スポーン + stdout 指示

【daemon (バックグラウンド)】
hooks-post-pr-monitor.exe --daemon --state-file <path>
cli-pr-monitor.exe --daemon --state-file <path>
├─ check-ci-coderabbit.exe を poll_interval_secs 間隔で実行
├─ 結果を pr-monitor-state.json に毎回書き出し
├─ 意味的終了: action != "continue_monitoring"
Expand All @@ -89,7 +89,7 @@ cat .claude/pr-monitor-state.json

| コンポーネント | 種別 | 役割 |
|---|---|---|
| `hooks-post-pr-monitor.exe` | スタンドアロン CLI (Rust) | PR 作成 + daemon 起動 + state file 管理 |
| `cli-pr-monitor.exe` | スタンドアロン CLI (Rust) | PR 作成 + daemon 起動 + state file 管理 |
| `hooks-pre-tool-validate.exe` | PreToolUse hook (Rust) | `gh-pr-create-guard` で直接の `gh pr create` をブロック |
| `check-ci-coderabbit.exe` | スタンドアロン CLI (Rust) | CI・CodeRabbit 状態チェック → JSON 出力 |
| `post-pr-create-review-check` SKILL.md | Claude Skill | 監視結果の解釈・報告手順 |
Expand Down Expand Up @@ -130,7 +130,7 @@ check_coderabbit = true

- push/PR 作成後の CI・CodeRabbit 確認を自動化し、開発フローの摩擦を削減
- 判定ロジックが Rust の純粋関数に分離されており、unit test で網羅可能
- 既存のビルド・配布フロー (`pnpm build:hooks`, `pnpm deploy:hooks`) にそのまま乗る
- 既存のビルド・配布フロー (`pnpm build:all`, `pnpm deploy:hooks`) にそのまま乗る
- `hooks-config.toml` でプロジェクトごとにポーリング間隔・監視対象をカスタマイズ可能

### Negative
Expand Down
20 changes: 10 additions & 10 deletions docs/adr/adr-010-hooks-layout-and-build-strategy-v2.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,10 @@ project-root/
│ ├── hooks-stop-quality/ # Stop フックのソース
│ │ ├── Cargo.toml
│ │ └── src/main.rs
│ ├── hooks-push-pipeline/ # Push Pipeline のソース
│ ├── cli-push-pipeline/ # Push Pipeline CLI のソース
│ │ ├── Cargo.toml
│ │ └── src/main.rs
│ ├── hooks-post-pr-monitor/ # Post-PR Monitor のソース
│ ├── cli-pr-monitor/ # PR Monitor CLI のソース
│ │ ├── Cargo.toml
│ │ └── src/main.rs
│ ├── hooks-session-start/ # SessionStart フックのソース
Expand All @@ -60,8 +60,8 @@ project-root/
│ ├── hooks-pre-tool-validate.exe # ビルド済み exe(.gitignore)
│ ├── hooks-post-tool-linter.exe
│ ├── hooks-stop-quality.exe
│ ├── hooks-push-pipeline.exe
│ ├── hooks-post-pr-monitor.exe
│ ├── cli-push-pipeline.exe # CLI ツール exe
│ ├── cli-pr-monitor.exe
│ ├── hooks-session-start.exe
│ └── check-ci-coderabbit.exe
└── package.json # ビルドスクリプト
Expand All @@ -76,15 +76,15 @@ project-root/
### ビルド戦略

- `package.json` に個別ビルドコマンドと一括ビルドコマンドを定義:
- `pnpm build:hooks-<機能名>` — 各フック単体ビルド
- `pnpm build:hooks` — 全フック一括ビルド
- `pnpm build:<フォルダ名>` — 各フック/CLI 単体ビルド
- `pnpm build:all` — 全フック一括ビルド
- 各コマンドは `cd src/<dir> && cargo build --release && cp target/release/<name>.exe ../../.claude/<name>.exe` の形式
- `pnpm deploy:hooks` で派生プロジェクトへの exe 配布(変更なし)

### バージョン管理

- `.gitignore` で除外するもの:
- ビルド済み exe(`pnpm build:hooks` で再生成可能)
- ビルド済み exe(`pnpm build:all` で再生成可能)
- `src/*/target/` ディレクトリ(Rust ビルド成果物)
- バージョン管理するもの:
- `src/*/Cargo.toml` と `src/*/src/` 以下のソースコード
Expand All @@ -103,16 +103,16 @@ project-root/
### Negative

- ADR-003 と同様: フック追加時に `package.json` と `.gitignore` の両方を更新する必要がある
- ADR-003 と同様: クローン直後は `pnpm build:hooks` を実行しないと hooks が動作しない
- ADR-003 と同様: クローン直後は `pnpm build:all` を実行しないと hooks が動作しない
- ビルド出力先が2階層上(`../../.claude/`)になるため、ビルドスクリプトがやや複雑

### 新しいフックを追加する手順

1. `src/<機能名>/` に Cargo プロジェクトを作成
2. `package.json` に `build:hooks-<機能名>` スクリプトを追加し、`build:hooks` にチェーン
2. `package.json` に `build:<フォルダ名>` スクリプトを追加し、`build:all` にチェーン
3. `.gitignore` に `.claude/<機能名>.exe` と `src/<機能名>/target/` を追加
4. `.claude/settings.local.json.template` の該当フックイベントに exe のパスを登録
5. `pnpm build:hooks` でビルド確認
5. `pnpm build:all` でビルド確認

## References

Expand Down
Loading