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
5 changes: 5 additions & 0 deletions .claude/settings.local.json.template
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-stop-quality.exe\"",
"timeout": 300
},
{
"type": "command",
"command": "\"{{PROJECT_DIR}}\\.claude\\hooks-stop-feedback-dispatch.exe\"",
"timeout": 10
}
]
}
Expand Down
19 changes: 19 additions & 0 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,10 @@ members = [
"src/hooks-post-tool-linter",
"src/hooks-pre-tool-validate",
"src/hooks-session-start",
"src/hooks-stop-feedback-dispatch",
"src/hooks-stop-quality",
"src/lib-jj-helpers",
"src/lib-pending-file",
"src/lib-report-formatter",
]

Expand Down
48 changes: 6 additions & 42 deletions docs/todo.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,44 +12,9 @@
>
> **設計の核 (state file + 現セッション起動)**: cli-merge-pipeline が `.claude/post-merge-feedback-pending.json` を書き込み、新規 Stop hook が検出 → `additionalContext` で Claude に skill 起動を指示。新セッションを spawn しないので ADR-014 選択肢 3「skill はメイン会話内で実行」の原則を維持し、セッション知見の引き継ぎ問題を構造的に回避する。
>
> **依存関係・順序**: ADR-029 (PR #69) マージ後に `1-B (CLI)` と `1-C (hook)` を並行可。最後に `1-D (有効化 + 試験運用開始)`。`1-E (skill 更新)` は独立タスクとして切り出し済み (依存: ADR-029 マージ)
> **依存関係・順序**: `1-C (hook)` を先に進める。最後に `1-D (有効化 + 試験運用開始)`。`1-E (skill 更新)` は独立タスクとして切り出し済み。
>
> **全タスク共通の参照先**: 設計の詳細は `docs/adr/adr-029-post-merge-feedback-auto-trigger.md` (PR #69 で新規作成)。以降のタスクはこの ADR の仕様に従う。
>
> **採否済みのフィードバック論点** (ADR-029 に反映済み):
> 1. 多重実行耐性 → pending file に `status: "pending" | "dispatched" | "consumed"` を持たせる
> 2. atomic write / 破損耐性 → atomic rename、読み取り時は size 0 / parse 失敗で削除、ロック不要
> 3. 既存 pending との競合 → 既存 `status != "consumed"` なら新規書き込み skip + WARN (将来キュー化への拡張余地を Note に明記)
> 4. `additionalContext` は構造化タグ形式 (`[POST_MERGE_FEEDBACK_TRIGGER]` 等) にする
> 5. `run_steps` は `Option<&PipelineContext>` で後方互換を保つ

#### 1-B. cli-merge-pipeline の `ai` 分岐実装 (コード + テスト、1 PR)

- **やろうとしたこと**: 現状 SKIP 実装の `run_steps` の `"ai"` 分岐 ([src/cli-merge-pipeline/src/main.rs:313-322](../src/cli-merge-pipeline/src/main.rs#L313-L322)) を、ADR-029 仕様に沿った pending file 書き込みに置き換える
- **現在地**: 未着手
- [ ] `PipelineContext` struct を新設 (`pr_number: u64`, `owner_repo: Option<String>`)
- [ ] `run_steps` シグネチャを `Option<&PipelineContext>` で拡張 (後方互換、pre_steps は `None` を渡す)
- [ ] `"ai"` 分岐の実装:
- ctx が `None` → SKIP + log
- 既存 pending 読み取り: `status != "consumed"` なら WARN + skip (ステップ自体は PASS 扱い)、破損ファイル (size 0 / parse 失敗 / schema_version 不一致) は削除して続行
- 新規 pending 書き込み (`status = "pending"`): tmp file → `fs::rename` で atomic
- pending file パス: `config_path().parent() / "post-merge-feedback-pending.json"`
- [ ] unit test 追加:
- 正常書き込み (ctx ありで新規作成)
- ctx なしで SKIP
- 既存 consumed 上書き成功
- 既存 pending/dispatched で skip + WARN
- 破損 pending (parse 失敗) で削除後書き込み
- tmp → rename の atomicity (partial file が残らない)
- [ ] **atomic rename の環境確認と fallback 戦略** (CodeRabbit PR #69 指摘):
- 実装時に `std::fs::rename` のターゲット環境挙動を確認 (本プロジェクトは Windows 11 + NTFS 想定で atomic 経路に入るが、派生プロジェクトでは要再確認)
- `fs::rename` の Err を戻り値として伝播させ、呼び出し側でログ出力する (silent fail させない)
- 旧 Windows / 非対応 FS で non-atomic fallback が走ったケースの対処方針を docstring に明記: (a) 許容する (POST_MERGE_FEEDBACK_TRIGGER が 1 回発火失敗しても次マージで復帰可能)、(b) 必要なら `ReplaceFile` / `FileRenameInfoEx` の直接呼び出しを検討
- `owner_repo` の入力検証 (newline injection 防御、正規表現 `^[a-zA-Z0-9_.-]+/[a-zA-Z0-9_.-]+$` 程度) を pending file 書き込み前に実施 (push 時の security-review で指摘済)
- [ ] `"ai"` 分岐のエラーハンドリング方針明文化: pending 書き込み失敗時もステップを FAIL にせず WARN + PASS とする (merge 自体は完了しているので pipeline を止めない)
- **完了基準**: `cargo test` 通過 + ローカルで `pnpm merge-pr` 手動実行 → 正しい pending file が生成される + atomic rename の挙動確認メモが実装コードの doc コメントに残っていること
- **詰まっている箇所**: なし
- **依存関係**: ADR-029 (PR #69) マージ後に着手
> **全タスク共通の参照先**: 設計の詳細は `docs/adr/adr-029-post-merge-feedback-auto-trigger.md` (PR #69 で新規作成、PR #70 で create_new 採用 / producer フィールド追加を反映)。以降のタスクはこの ADR の仕様に従う。

#### 1-C. hooks-stop-feedback-dispatch 新規 exe (コード + 配布統合、1 PR)

Expand Down Expand Up @@ -81,7 +46,6 @@
- additionalContext 文字列フォーマット検証 (構造化タグの key 順序等)
- **完了基準**: `cargo test` 通過 + `pnpm build:hooks-stop-feedback-dispatch` / `pnpm deploy:hooks` 成功 + hooks-stop-quality と並行動作確認
- **詰まっている箇所**: なし
- **依存関係**: ADR-029 (PR #69) マージ後に着手

#### 1-D. post_steps 有効化 + 試験運用開始 (設定 + todo 更新、1 PR)

Expand All @@ -95,15 +59,15 @@
prompt = "post-merge-feedback"
```
- [ ] `templates/hooks-config.toml` にも反映 (派生プロジェクト用、デフォルト opt-in/opt-out 方針は PR 内で判断)
- [ ] `docs/todo.md` から本タスク群 (1-B〜1-D、および section ヘッダーと前文) を削除 (運用ルール: 完了タスクは ADR/仕組みに反映後に削除。1-A は PR #69 時点で削除済)
- [ ] `docs/todo.md` から本タスク群 (1-C〜1-D、および section ヘッダーと前文) を削除 (運用ルール: 完了タスクは ADR/仕組みに反映後に削除。1-A は PR #69、1-B は PR #70 で削除済)
- **完了基準**: 実マージ (別 PR) の `pnpm merge-pr` で pending file が生成され、Stop 時に Claude が構造化 `additionalContext` を受け取って skill 起動を試みるフローが走ること (skill 未対応なら手動起動で検証)
- **詰まっている箇所**: なし
- **依存関係**: 1-B (CLI) + 1-C (hook) 両方の完了
- **依存関係**: 1-C (hook) の完了

#### 1-E. post-merge-feedback skill の pending file 対応 (別タスク、skill リポジトリ側で実施)

- **やろうとしたこと**: skill Phase 1 の前段に「pending file 先読み (Phase 0)」を追加し、status が `"dispatched"` の場合は引数指定と同等の最優先度で採用。skill 完了時に `status = "consumed"` に更新してからファイル削除
- **現在地**: 未着手。ADR-029 (PR #69) マージ後に仕様参照可能
- **現在地**: 未着手
- [ ] skill リポジトリの管理場所を特定 (`$CLAUDE_SKILLS_REPO` 経由 or `~/.claude/skills/` 直接) → `/skill-sync-check` で確認
- [ ] `SKILL.md` に Phase 0 「pending file 先読み」を追加:
- pending file を読み取り、`status == "dispatched"` ならその `pr_number` / `owner_repo` を採用 (引数・セッションコンテキスト・fallback より優先)
Expand All @@ -113,7 +77,7 @@
- [ ] (任意) skill eval の追加: pending file ありのケース / 破損ケース / status 別の挙動
- **完了基準**: skill が pending file を正しく consume し、本プロジェクトの dogfood で Claude が自動起動した skill から Feedback Report が出力される
- **詰まっている箇所**: skill の管理場所 (本プロジェクト外) の扱いは `/skill-sync-check` の結果次第
- **依存関係**: ADR-029 (PR #69) マージ。1-B/1-C/1-D とは並行可能だが、dogfood の完結には 1-E も必要
- **依存関係**: 1-C/1-D とは並行可能だが、dogfood の完結には 1-E も必要

#### 1-F. (追って) ADR-014 試験運用フラグ解除 + takt-test-vc 反映

Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@
"build:hooks-pre-tool-validate": "cargo build --release -p hooks-pre-tool-validate && cp target/release/hooks-pre-tool-validate.exe .claude/hooks-pre-tool-validate.exe",
"build:hooks-post-tool-linter": "cargo build --release -p hooks-post-tool-linter && cp target/release/hooks-post-tool-linter.exe .claude/hooks-post-tool-linter.exe",
"build:hooks-stop-quality": "cargo build --release -p hooks-stop-quality && cp target/release/hooks-stop-quality.exe .claude/hooks-stop-quality.exe",
"build:hooks-stop-feedback-dispatch": "cargo build --release -p hooks-stop-feedback-dispatch && cp target/release/hooks-stop-feedback-dispatch.exe .claude/hooks-stop-feedback-dispatch.exe",
"build:cli-push-runner": "cargo build --release -p cli-push-runner && cp target/release/cli-push-runner.exe .claude/cli-push-runner.exe",
"build:cli-pr-monitor": "cargo build --release -p cli-pr-monitor && cp target/release/cli-pr-monitor.exe .claude/cli-pr-monitor.exe",
"build:check-ci-coderabbit": "cargo build --release -p check-ci-coderabbit && cp target/release/check-ci-coderabbit.exe .claude/check-ci-coderabbit.exe",
"build:hooks-session-start": "cargo build --release -p hooks-session-start && cp target/release/hooks-session-start.exe .claude/hooks-session-start.exe",
"build:cli-merge-pipeline": "cargo build --release -p cli-merge-pipeline && cp target/release/cli-merge-pipeline.exe .claude/cli-merge-pipeline.exe",
"build:hooks-settings": "node -e \"const fs=require('fs');const t=fs.readFileSync('.claude/settings.local.json.template','utf8');const p=process.cwd().replace(/\\\\/g,'\\\\\\\\');fs.writeFileSync('.claude/settings.local.json',t.replace(/\\{\\{PROJECT_DIR\\}\\}/g,p))\" && echo settings.local.json generated",
"build:all": "pnpm build:hooks-session-start && pnpm build:hooks-pre-tool-validate && pnpm build:hooks-post-tool-linter && pnpm build:hooks-stop-quality && pnpm build:cli-push-runner && pnpm build:cli-pr-monitor && pnpm build:cli-merge-pipeline && pnpm build:check-ci-coderabbit && pnpm build:hooks-settings",
"build:all": "pnpm build:hooks-session-start && pnpm build:hooks-pre-tool-validate && pnpm build:hooks-post-tool-linter && pnpm build:hooks-stop-quality && pnpm build:hooks-stop-feedback-dispatch && pnpm build:cli-push-runner && pnpm build:cli-pr-monitor && pnpm build:cli-merge-pipeline && pnpm build:check-ci-coderabbit && pnpm build:hooks-settings",
"push": ".\\.claude\\cli-push-runner.exe && .\\.claude\\cli-pr-monitor.exe --monitor-only",
"create-pr": ".\\.claude\\cli-pr-monitor.exe",
"observe-pr": ".\\.claude\\cli-pr-monitor.exe --observe",
Expand Down
1 change: 1 addition & 0 deletions scripts/deploy-hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const EXE_FILES = [
"hooks-pre-tool-validate.exe",
"hooks-post-tool-linter.exe",
"hooks-stop-quality.exe",
"hooks-stop-feedback-dispatch.exe",
"cli-push-runner.exe",
"cli-pr-monitor.exe",
"cli-merge-pipeline.exe",
Expand Down
Loading