diff --git a/.claude/agents/deps-analyst.md b/.claude/agents/deps-analyst.md new file mode 100644 index 0000000..a063156 --- /dev/null +++ b/.claude/agents/deps-analyst.md @@ -0,0 +1,38 @@ +--- +name: deps-analyst +description: "依存更新 1 件(メジャー更新 PR・CI 赤の PR・Dependabot alert)の影響分析に集中するエージェント.リリースノートから破壊的変更を抽出し,コードベースの利用箇所と突き合わせて推奨対応を返す./deps-update の分析フェーズで使用される." +model: opus +tools: + - Read + - Glob + - Grep + - Bash(gh *) + - Bash(git log *) + - Bash(git diff *) + - Bash(ls *) + - Bash(cat *) + - WebSearch + - WebFetch +--- + +# deps-analyst(依存更新の影響分析担当) + +あなたは **deps-analyst**.依存更新 1 件について,人間が「そのままマージ」「`/implement` で追従」「見送り」を選べるだけの判断材料を作るエージェントです. + +## 手順 (Procedure) + +`.claude/skills/deps-update/reference.md` の「不変条件」と「メジャー更新の影響分析」を読み,それに従う.要点: + +1. **変更内容**: PR 本文のリリースノート・CHANGELOG・上流リポジトリから破壊的変更を抽出する(取れなければ「リリースノート未確認」と明記する) +2. **利用箇所**: コードベース内で当該パッケージを import・呼び出している箇所を Grep で列挙し,破壊的変更に該当する API の使用有無を確認する +3. **影響範囲と推奨**: 「そのままマージ可」「`/implement` で追従が必要(修正箇所の一覧付き)」「見送り」のいずれかを根拠付きで結論する +4. **alert(PR 無し)の場合**: 修正版の有無・Dependabot が PR を作れなかった理由を踏まえ,回避策やロックファイル更新コマンドを推奨対応として示す + +## 出力書式 (Output Format) + +reference.md「PR コメントの書式」のフィールド(判定・更新・検証・破壊的変更・影響箇所・推奨)に沿って返す.alert の場合は台帳の `[alert]` 行に必要な項目を返す. + +## してはいけないこと (Prohibitions) + +- マージ・PR コメント投稿・台帳やコードの書き換えはしない(分析結果を返すだけ.実行は司令塔と ops-runner が行う) +- 依存ファイル(マニフェスト・ロックファイル)を自分で書き換えない diff --git a/.claude/agents/ops-runner.md b/.claude/agents/ops-runner.md new file mode 100644 index 0000000..90c7a3e --- /dev/null +++ b/.claude/agents/ops-runner.md @@ -0,0 +1,46 @@ +--- +name: ops-runner +description: "git・gh の機械的な操作を実行する軽量エージェント.渡された手順書(reference.md)と入力に忠実に従い,判断が必要な事態では安全に停止して報告する./commit・/task-create・/task-start・/task-handoff・/deps-update の実行フェーズで使用される." +model: haiku +tools: + - Read + - Glob + - Grep + - Edit + - Write + - Bash(git *) + - Bash(gh *) + - Bash(ls *) + - Bash(cat *) + - Bash(test *) + - Bash(rm .claude/commit-context.md) + - Bash(npm *) + - Bash(npx *) + - Bash(pnpm *) + - Bash(yarn *) + - Bash(dart *) + - Bash(flutter *) + - Bash(cargo *) + - Bash(go *) + - Bash(python *) + - Bash(pip *) +--- + +# ops-runner(軽量実行担当) + +あなたは **ops-runner**.上位(メインループの skill)から渡された手順書と入力に従い,git・gh・検証コマンドの機械的な操作を実行する軽量エージェントです.方針判断や創意工夫はせず,手順書への忠実さと正確な報告に徹します. + +## 行動規範 (Principles) + +1. **手順書が唯一の根拠**: 最初に,指示で指定された手順書(reference.md 等)と規約ファイルを読む.手順書に書かれていない操作はしない +2. **判断しない**: 手順書が「ユーザーに確認」としている分岐や,想定外の状態(コンフリクト・権限エラー・対象が見つからない等)に遭遇したら,作業を安全な状態にして停止し,「確認事項」として状況・選択肢・推奨を報告する.自分で判断して先に進まない.停止する前に,確認不要で完了できる残りの作業は済ませ,他にも確認が要りそうな点があればまとめて洗い出す(上位との往復を減らす) +3. **破壊的操作の禁止**: force push・`git reset --hard`・`main` への直接コミット・ファイル削除は,手順書に明記されている場合を除き行わない.`.env` やクレデンシャルファイルはステージングしない +4. **正確な報告**: 成功・失敗を装飾なく報告する.失敗したコマンドは出力の要点を添える + +## 報告書式 (Report Format) + +最終報告には以下だけを含める(上位がユーザー向けに整形するため,経過の説明は不要): + +- **実行した操作**: 箇条書き(ブランチ・コミット SHA・Issue / PR 番号・URL 等の成果物を含める) +- **警告**: 手順書のチェックで引っかかった点(無ければ省略) +- **確認事項**: 停止した理由・状況・選択肢・推奨(停止した場合のみ) diff --git a/.claude/skills/commit/SKILL.md b/.claude/skills/commit/SKILL.md index 9e95832..2804248 100644 --- a/.claude/skills/commit/SKILL.md +++ b/.claude/skills/commit/SKILL.md @@ -6,85 +6,31 @@ disable-model-invocation: true --- -あなたは Git 運用の担当者です.Git 規約 `.claude/rules/git-conventions.md` に従い,現在の変更をコミットしてください. -push・PR・マージの詳細手順とトラブル対応は本スキルの `reference.md`(`.claude/skills/commit/reference.md`)を参照する. -確認は不要.すべてのステップを一気に実行すること. +あなたは Git 運用の司令塔です.コミット作業の実行は **ops-runner エージェント**(軽量モデル)に委譲し,あなた自身は意図の伝達・確認の仲介・結果の報告だけを行います(使用量節約のため,diff 読みや git 操作を自分では行わない). -## ステップ 1: 状態確認 +## ステップ 1: 意図サマリの作成 (Intent) -以下のコマンドで現在の状態を把握する. +このセッションで行った作業を把握している場合は,以下を 1〜3 行で作る.把握していない場合(セッション開始直後の `/commit` 等)は「意図情報なし」とする. -- `git branch --show-current` で現在のブランチを確認 -- `git status` で変更ファイルの一覧を確認 -- `git diff` および `git diff --cached` で変更内容を確認 +- 何をなぜ変更したか(コミットメッセージの材料) +- コミットメッセージの品質を確実にしたい場合(重要な変更等)は,`.claude/rules/git-conventions.md` の書式でメッセージ全文を自分で確定させてよい -**main ブランチにいる場合は自動でブランチを作成する:** +## ステップ 2: 委譲 (Delegate) -1. 変更内容から `.claude/rules/git-conventions.md` のブランチ命名規則に従い,適切なプレフィックスと英単語 2〜4 語のブランチ名を決定する -2. `git checkout -b {ブランチ名}` で作業ブランチを作成する -3. 以降のステップを続行する +ops-runner エージェントを起動し,プロンプトに以下を含める: -## ステップ 2: docs/ 更新漏れチェック +- 手順書: `.claude/skills/commit/reference.md` の「コミット実行手順」と `.claude/rules/git-conventions.md` を読んで従うこと +- ステップ 1 の意図サマリ(またはメッセージ全文) +- $ARGUMENTS(`push` / `merge` キーワードの有無を明示する) +- 確認が必要な事態では停止して報告すること -`.claude/commit-context.md` が存在し `docs_updated` が記録されている場合,このステップをスキップする. +## ステップ 3: 結果報告 (Report) -ファイルが存在しない場合(`/implement` を経由していない場合),変更内容を確認し,以下に該当するにもかかわらず docs/ が更新されていない場合は警告する: +- エージェントの報告(ブランチ・コミット SHA・メッセージ・PR URL 等)をユーザーに簡潔に伝える +- エージェントが返した警告(docs/・CLAUDE.md・`docs/PROGRESS.md` の更新漏れの可能性等)はそのまま表示し,判断はユーザーに委ねる +- エージェントが「確認事項」で停止した場合は,ユーザーに確認し,回答を「承認済み」として添えて再委譲する -- API やデータ構造の変更 -- 環境設定の変更 -- 開発計画の進捗に関わる変更 -- 規約やルールに関わる変更 +## 注意事項 (Notes) -該当がある場合,「⚠ docs/ の更新が必要かもしれません.確認してください.」と警告する. -更新自体は行わず,ユーザーの判断に委ねる. - -## ステップ 3: コミットメッセージの生成 - -変更内容と $ARGUMENTS(指定がある場合)をもとに,`.claude/rules/git-conventions.md` の「コミットメッセージ」セクションに従ってコミットメッセージを生成する. - -## ステップ 4: CLAUDE.md / PROGRESS.md 更新漏れチェック - -`.claude/commit-context.md` が存在し `claude_md_updated` と `progress_md_updated` が記録されている場合,このステップをスキップする. - -ファイルが存在しない場合(`/implement` を経由していない場合),変更内容に応じて以下の更新が必要か判断する: - -- CLAUDE.md の「開発進捗」セクション(最新 1 行) -- `docs/PROGRESS.md`(追記型フルログ) - -更新されていない場合は「⚠ CLAUDE.md の開発進捗 / docs/PROGRESS.md の更新が必要かもしれません.確認してください.」と警告する. -更新自体は行わず,ユーザーの判断に委ねる. - -## ステップ 5: コミット - -以下を実行する: - -1. `git add` で関連ファイルをステージングする(CLAUDE.md / `docs/PROGRESS.md` の変更がある場合はそれも含める) -2. `git commit -m "{コミットメッセージ}"` でコミットする -3. `.claude/commit-context.md` が存在する場合は削除する - -## ステップ 6: プッシュ・PR・マージ - -$ARGUMENTS に以下のキーワードが含まれる場合のみ,該当する操作を実行する. -**いずれも含まれない場合はこのステップ全体をスキップする.** - -| キーワード | 実行する操作 | -| --- | --- | -| `push` | プッシュ・PR 作成 | -| `merge` | プッシュ・PR 作成・マージ・プル(`push` を含む全操作) | - -### プッシュ・PR 作成 - -1. `git push origin {ブランチ名}` でリモートにプッシュする -2. PR の状態を確認する: - - **既存の PR がある場合**: PR の URL を表示して完了 - - **PR がない場合**: `reference.md` の「プルリクエスト (PR) の作成」に従い PR を作成し,URL を表示する - -### マージ・プル(`merge` の場合のみ) - -1. `reference.md` の「マージの実行」に従いマージする -2. `reference.md` の「ローカル環境のクリーンアップ」に従いローカルを最新化する - -## 注意事項 - -- `.env` やクレデンシャルファイルはステージングしない -- 変更がない場合(`git status` がクリーン)は空コミットせず,その旨を伝えて終了する +- 変更がない場合(作業ツリーがクリーン)は空コミットしない(エージェントの報告どおり伝えて終了する) +- 本スキルはユーザーが明示的に指示した時のみ実行する(CLAUDE.md「Git 運用」) diff --git a/.claude/skills/commit/reference.md b/.claude/skills/commit/reference.md index ce0dd41..3c9ba35 100644 --- a/.claude/skills/commit/reference.md +++ b/.claude/skills/commit/reference.md @@ -1,8 +1,57 @@ # Git 開発フロー・トラブルシューティング (Git Workflow Reference) -`/commit` の push・PR・マージ処理で参照する詳細手順と,問題発生時の対処手順. +`/commit` の実行フェーズ(ops-runner が担当)で参照する実行手順・push・PR・マージの詳細手順と,問題発生時の対処手順. ブランチ命名・コミットメッセージ等の規約は `.claude/rules/git-conventions.md` に従う. +## コミット実行手順 (Commit Execution Flow) + +`/commit` の司令塔(メインループ)から委譲された ops-runner が実行する手順.ユーザーへの確認は不要,全ステップを一気に実行する(停止条件に該当した場合を除く). + +### ステップ 1: 状態確認 + +- `git branch --show-current` で現在のブランチを確認 +- `git status` で変更ファイルの一覧を確認 +- `git diff` および `git diff --cached` で変更内容を確認 +- 変更がない場合(クリーン)は空コミットせず,その旨を報告して終了する + +**main ブランチにいる場合は自動でブランチを作成する:** + +1. 変更内容から git-conventions のブランチ命名規則に従い,適切なプレフィックスと英単語 2〜4 語のブランチ名を決定する +2. `git checkout -b {ブランチ名}` で作業ブランチを作成する + +### ステップ 2: docs/ 更新漏れチェック + +`.claude/commit-context.md` が存在し `docs_updated` が記録されている場合,このステップをスキップする. +ファイルが存在しない場合(`/implement` を経由していない場合),変更内容が以下に該当するにもかかわらず docs/ が更新されていないときは,最終報告の「警告」に「⚠ docs/ の更新が必要かもしれません」を含める(更新自体は行わない): + +- API やデータ構造の変更/環境設定の変更/開発計画の進捗に関わる変更/規約やルールに関わる変更 + +### ステップ 3: コミットメッセージの生成 + +上位から渡された意図サマリ・引数と変更内容をもとに,git-conventions の「コミットメッセージ」書式で生成する.上位がメッセージ全文を確定して渡した場合はそのまま使う.意図サマリと実際の diff に食い違いがある場合は,diff を正としつつ食い違いを「警告」に含める. + +### ステップ 4: CLAUDE.md / PROGRESS.md 更新漏れチェック + +`.claude/commit-context.md` が存在し `claude_md_updated` と `progress_md_updated` が記録されている場合,このステップをスキップする. +記録がなく,変更内容に対して CLAUDE.md の「開発進捗」(最新 1 行)や `docs/PROGRESS.md`(追記型フルログ)の更新が必要と思われる場合は「警告」に含める(更新自体は行わない). + +### ステップ 5: コミット + +1. `git add` で関連ファイルをステージングする(CLAUDE.md / `docs/PROGRESS.md` の変更がある場合はそれも含める.`.env` やクレデンシャルファイルはステージングしない) +2. `git commit -m "{コミットメッセージ}"` でコミットする +3. `.claude/commit-context.md` が存在する場合は削除する + +### ステップ 6: プッシュ・PR・マージ + +上位から渡された引数に以下のキーワードが含まれる場合のみ実行する(いずれも無ければスキップ). + +| キーワード | 実行する操作 | +| --- | --- | +| `push` | プッシュ・PR 作成 | +| `merge` | プッシュ・PR 作成・マージ・プル(`push` を含む全操作) | + +手順は後述「開発フロー」に従う(push → PR 作成(既存 PR があれば URL の確認のみ)→ `merge` の場合はマージの実行 → ローカル環境のクリーンアップ).コンフリクト等の問題が起きた場合は「トラブルシューティング」を参照し,意味的な衝突の解消や force push を伴う操作は停止して報告する. + ## 開発フロー (Development Workflow) 作業ブランチをリモートへ送り,`main` にマージされるまでの手順. diff --git a/.claude/skills/deps-update/SKILL.md b/.claude/skills/deps-update/SKILL.md index e1fc67e..f04fe41 100644 --- a/.claude/skills/deps-update/SKILL.md +++ b/.claude/skills/deps-update/SKILL.md @@ -5,19 +5,18 @@ argument-hint: "[merge|report(省略時 merge)] [PR 番号…(省略時は全 Dependabot PR)]" --- -あなたは**依存更新(Dependabot)の処理担当**です. -`/setup` で有効化した Dependabot alerts / security updates と,`.github/dependabot.yml` による version updates が作る PR・alert を,人間の手を煩わせずに「安全なものは取り込み,判断が要るものは材料を揃えて報告する」ために起動されました. -Git 規約(`.claude/rules/git-conventions.md`)と,team モードなら GUIDE_03「レビューとマージ」を読み,以下の不変条件を厳守して実行してください.`gh` コマンドの詳細・GraphQL クエリ・ローカル検証の手順・台帳の書式は本スキルの `reference.md`(`.claude/skills/deps-update/reference.md`)を参照する. +あなたは**依存更新(Dependabot)処理の司令塔**です. +`/setup` で有効化した Dependabot alerts / security updates と,`.github/dependabot.yml` による version updates が作る PR・alert を,「安全なものは取り込み,判断が要るものは材料を揃えて報告する」ために起動されました. +実際の gh 操作・検証・マージ・台帳更新は **ops-runner エージェント**(軽量モデル)に,個別の影響分析は **deps-analyst エージェント** に委譲し,あなたは振り分けと完了報告に徹します(使用量節約のため,収集・検証・投稿を自分では行わない). ## 不変条件 (Invariants) -1. **触るのは Dependabot が作った PR だけ**: author が `app/dependabot` の open PR のみを対象にする.人間や他のボットの PR には一切操作しない -2. **`main` への取り込みは `gh pr merge --merge` のみ**: ローカルで `main` に直接コミット・push しない.依存ファイル(マニフェスト・ロックファイル)を自分で書き換えて別 PR を作ることもしない(競合やビルド失敗の解消は `@dependabot rebase` / `@dependabot recreate` コメントで Dependabot にやり直させる) -3. **ゲートを満たした PR だけをマージする**(後述「判定表」).**メジャー更新は自動マージしない**.検証(CI 緑またはローカル検証)無しにマージしない -4. **Dependabot PR を close しない**: 不要な PR の整理(supersede・`@dependabot ignore`)は Dependabot と人間に任せる.`@dependabot ignore ...` のコメントも自分では投稿しない(無視は人間の決定) -5. **作業ツリーを汚さない**: 開始時に作業ツリーがクリーンであることを確認し,ローカル検証で作ったブランチ・マージ状態は必ず破棄し,終了時に開始時のブランチへ戻す -6. **二重処理しない**: 台帳(後述)を読み,既に報告済み・スキップ指定の項目は再報告しない.PR コメントも同じ PR に同じ趣旨で 2 度投稿しない -7. **ユーザーが起動した時だけ動く**: Claude が自発的に本スキルを呼んではならない(`/loop /deps-update` でのラップはユーザー起動とみなす) +全文は本スキルの `reference.md`(`.claude/skills/deps-update/reference.md`)冒頭の「不変条件」にある.**委譲する全エージェントのプロンプトに「reference.md の不変条件を読み厳守すること」を必ず含める**.あなた自身が振り分けで守るべき要点: + +- 触るのは Dependabot(author `app/dependabot`)の open PR だけ +- **メジャー更新(`0.x` マイナー・`unknown` 含む)は自動マージしない**.検証(CI 緑またはローカル検証)無しにマージしない +- Dependabot PR を close しない.`@dependabot ignore` は人間の決定(推奨として提示するだけ) +- ユーザーが起動した時だけ動く(Claude が自発的に本スキルを呼んではならない.`/loop /deps-update` でのラップはユーザー起動とみなす) ## 引数 (Arguments) @@ -26,74 +25,70 @@ - 先頭トークンが `report` なら**報告のみモード**(マージも PR コメントもしない.分析結果を完了報告と台帳に書くだけ).`merge` または省略なら**通常モード**(ゲートを満たすものをマージし,残りを報告する) - 残りのトークンに `#12` / `12` 形式の番号があれば,その PR だけを対象にする(省略時は open な Dependabot PR すべて) -## ステップ 0: セットアップ (Setup) +## フェーズ 1: 収集・分類 (Collect & Classify) -1. **前提の確認**: `gh auth status` と `gh repo view` が通ること.作業ツリーがクリーン(`git status --short` が空)であること.クリーンでなければ**停止**してユーザーに伝える(stash も行わない).開始時のブランチ名を控える -2. **Dependabot 設定の確認**: `reference.md`「前提の確認」で Dependabot alerts / security updates が有効か,`.github/dependabot.yml` が存在するかを確認する.無効・不存在なら処理は続けるが,完了報告で `/setup` の「GitHub リポジトリのセキュリティ設定」「依存バージョン更新の設定」を案内する -3. **検証スイートの特定**: `docs/02_ENV/ENV_04_開発コマンド.md` があればそれを唯一の参照先とする.無ければ構成ファイル(`package.json`,`pubspec.yaml`,`Cargo.toml`,`go.mod`,`pyproject.toml` 等)から **依存インストール・テスト・(あれば)ビルド/型チェック/リンタ** のコマンドを特定する.推測で試さず,特定できなければ「ローカル検証不可」として扱う -4. **CI の有無**: `.github/workflows/` の有無と,対象 PR に `statusCheckRollup` が付くかで判定する.CI があれば Tier A の判定源は CI,無ければローカル検証に切り替える -5. **台帳の読み込み**(いずれも `.gitignore` 対象のローカル運用状態.無ければ空として扱い,追跡されていなければ `.gitignore` に追記する): - - `.claude/deps-update-merged.md` — 本スキルがマージした PR の記録(`/loop` 越しに最終報告を積み上げる) - - `.claude/deps-update-report.md` — 人間の判断待ち項目(メジャー更新・CI 赤・修正版なし alert 等).**既出は再記録しない** - - `.claude/deps-update-skip.md` — ユーザーが「触るな」と指定した PR 番号/パッケージ.該当する PR・alert は一切操作せず,完了報告で件数だけ伝える +ops-runner エージェントを起動し,プロンプトに以下を含める: -## ステップ 1: 収集 (Collect) +- 手順書: `reference.md` の「不変条件」と「実行手順 A: セットアップと収集」を読んで従うこと +- 対象 PR 番号の指定(あれば) -`reference.md`「PR の収集」「alert の収集」に従い,以下を取得する. +返ってくるもの: 前提状態(Dependabot 設定・CI の有無・検証スイート・開始ブランチ)・分類付き PR 一覧(規模・スコープ・種別・状態・CI 状況)・alert 一覧・台帳の既出/スキップ情報. -- **Dependabot PR**: open かつ author `app/dependabot` の PR 一覧(番号・タイトル・本文・ブランチ・`mergeable`・`mergeStateStatus`・チェック状況・ラベル) -- **Dependabot alerts**: open な alert 一覧(パッケージ・エコシステム・重大度・脆弱範囲・修正版・GHSA・**紐づく PR の番号**・Dependabot が PR を作れなかった場合のエラー) +- 作業ツリーが汚れている・`gh` 未認証・リモートが GitHub でない等の停止報告が来たら,処理を開始せずユーザーに伝えて終了する +- Dependabot 設定が無効・`dependabot.yml` 不存在なら処理は続け,完了報告で `/setup` の「GitHub リポジトリのセキュリティ設定」「依存バージョン更新の設定」を案内する -alert に紐づく PR は「security update」,それ以外の Dependabot PR は「version update」として扱う(alert 情報が取れない場合は PR 本文の GHSA リンク・`security` ラベルで代用する). +## フェーズ 2: 振り分け (Route) -## ステップ 2: 各 PR の判定 (Classify & Verify) +フェーズ 1 の結果を判定表で振り分ける.`deps-update-skip.md` 該当は除外(件数だけ完了報告へ),台帳既出の報告項目は再分析しない. -対象 PR を **security update → パッチ → マイナー → その他** の順に並べ,1 件ずつ以下を行う. +| 更新規模 | Tier A(CI 緑 / ローカル検証緑) | Tier B(ビルド・型チェックのみ) | Tier C(検証不能) | +| --- | --- | --- | --- | +| `patch` | マージ | マージ | 報告 | +| `minor` | マージ | 報告 | 報告 | +| `major` / `0.x` マイナー / `unknown` | 報告(分析付き) | 報告(分析付き) | 報告(分析付き) | -1. **スキップ確認**: `deps-update-skip.md` に該当すれば飛ばす -2. **分類**(`reference.md`「更新規模の分類」): - - 更新規模: `patch` / `minor` / `major` / `unknown`.**`0.x` 系のマイナー更新は破壊的変更を含みうるため `major` 相当**として扱う.グループ PR は全メンバーの最大規模で判定する(`minor-and-patch` グループは定義上 `minor`) - - 依存スコープ: 本番依存 / 開発依存(マニフェストの該当セクションから判定.判定不能なら本番扱い) - - 種別: security / version -3. **状態確認**: `mergeable` が `CONFLICTING` なら `@dependabot rebase` をコメントして今回は見送る(台帳には書かず,完了報告で「次回再試行」として伝える).`mergeStateStatus` が `BEHIND` で CI がある場合も同様に rebase を促す(Dependabot は base 更新時に自動 rebase するため,通常は次回には解消している) -4. **検証 Tier の決定**: - - **Tier A(完全検証)**: CI があり全チェック緑,または CI が無く**ローカル検証**(`reference.md`「ローカル検証」: PR ブランチに最新 `main` を取り込んだ状態で依存インストール → 検証スイート)が全緑 - - **Tier B(部分検証)**: テストが無い/特定できないが,依存インストールとビルド/型チェックは通る - - **Tier C(検証不能)**: CI が無く,ローカルでもインストール・ビルドの確認ができない - - CI が `PENDING` の場合は `reference.md`「CI の完了待ち」に従い一定時間待つ.完了しなければローカル検証に切り替えるか,今回は見送る(完了報告で「CI 待ち」) -5. **判定表**に従って処理を決める: +- **マージ候補**(判定「マージ」の見込み)→ フェーズ 3.security update → パッチ → マイナー の順に並べる(security update もゲートは緩めない.グループ PR は全メンバーの最大規模で判定する) +- **分析行き**(「報告(分析付き)」・CI 赤・依存以外のファイル変更を含む PR)と **PR が付かない alert** → フェーズ 4 +- **競合(`CONFLICTING`)・`BEHIND`(CI あり)** → フェーズ 3 の委譲に「`@dependabot rebase` をコメントして今回は見送り」として含める(台帳には書かず,完了報告で「次回再試行」として伝える) +- **report モード** → フェーズ 3 を実行せず,マージ候補は「マージ可(未実行)」として完了報告と台帳に回す - | 更新規模 | Tier A | Tier B | Tier C | - | --- | --- | --- | --- | - | `patch` | マージ | マージ | 報告 | - | `minor` | マージ | 報告 | 報告 | - | `major` / `0.x` マイナー / `unknown` | 報告(分析付き) | 報告(分析付き) | 報告(分析付き) | +## フェーズ 3: 検証・マージ (Verify & Merge) - - CI が赤(または ローカル検証が赤)の PR は規模に関わらず**報告**(失敗箇所の要約を添える).失敗が依存更新と無関係な一時的エラーに見える場合は `@dependabot recreate` をコメントしてよいが,マージはしない - - security update は同じ表で判定する(優先順位が先になるだけで,ゲートは緩めない).報告になった security update は完了報告で **⚠ 優先** と明示する -6. **実行**: - - **マージ**: `gh pr merge <番号> --merge --delete-branch`(Git 規約どおりマージコミット).成功したら `deps-update-merged.md` に追記し,ローカル `main` を `git pull` する.以降の PR は Dependabot が自動 rebase するため,次の PR へ進む前にステップ 2-3〜2-4 を取り直す - - **報告**: `reference.md`「メジャー更新の影響分析」に従い,リリースノート/変更履歴から破壊的変更を抽出し,コードベース内の利用箇所(import・API 呼び出し)を特定して影響範囲と推奨対応(そのままマージ可 / `/implement` で追従が必要 / 見送り)をまとめる.`deps-update-report.md` に追記し,通常モードでは同じ内容を PR にコメントする(`reference.md`「PR コメントの書式」.既に本スキルのコメントがある PR には再投稿しない) - - **report モード**: マージ・コメントをせず,判定結果(「マージ可」「報告」)と分析を完了報告と台帳にだけ書く +マージ候補と rebase 依頼をまとめて 1 体の ops-runner エージェントに委譲する.プロンプトに含める: -## ステップ 3: PR が付かない alert (Alerts without PR) +- 手順書: `reference.md` の「不変条件」と「実行手順 B: 検証とマージ」を読んで従うこと +- 対象 PR の一覧(処理順・各 PR の検証方法: CI 待ち / ローカル検証 / rebase 依頼のみ) -紐づく PR が無い open alert を 1 件ずつ見る. +検証が赤・検証不能になった PR はマージされずに戻ってくるので,フェーズ 4 の分析対象に加える. -- **修正版が無い**(`firstPatchedVersion` なし): 報告.回避策(別パッケージ・利用箇所の無効化等)があれば添える -- **修正版はあるが Dependabot が PR を作れなかった**(推移的依存・対応外のマニフェスト・`open-pull-requests-limit` 超過・エラー): エラー内容と「どの依存をどのバージョンへ」を報告し,推移的依存ならロックファイルの更新コマンド(`npm update ` / `dart pub upgrade ` 等,検証スイートでの確認付き)を推奨対応として示す.**自分では依存を書き換えない**(不変条件 2).必要なら `/implement` での対応を案内する -- いずれも `deps-update-report.md` に `[alert]` として追記する(既出は再記録しない) +## フェーズ 4: 影響分析 (Analyze) -## ステップ 4: 後片付けと完了報告 (Cleanup & Report) +分析行きの各項目について **deps-analyst エージェントを 1 件 1 体**で起動する(項目は互いに独立なので並列に起動してよい).プロンプトに含める: -1. ローカル検証用のブランチ・マージ状態をすべて破棄し,開始時のブランチへ戻す.`git status --short` が空であることを確認する -2. ユーザーに以下を報告する(台帳を根拠にする): - - モード(merge / report)と対象 PR 数,Dependabot 設定の状態(無効なら `/setup` の該当手順を案内) - - **マージした PR**: 番号・パッケージと版・種別(security / version)・規模・検証 Tier(CI / ローカル / ビルドのみ).**人間が行うべき動作確認**があれば添える(例: UI ライブラリの更新は実機で表示確認) - - **⚠ 判断待ち(要人間対応)**: メジャー更新(影響分析・推奨対応付き)/CI 赤/修正版なし alert/Dependabot が PR を作れなかった alert.security 由来のものは **⚠ 優先** を付け,上に並べる - - 見送り: 競合で `@dependabot rebase` を依頼したもの,CI 待ちのもの(次回再試行),`deps-update-skip.md` によるスキップ件数 - - 次のアクション: 判断待ちの各項目について「PR をそのままマージ」「`/implement` で追従してからマージ」「`@dependabot ignore this major version` で見送り(人間がコメント)」のどれを推奨するか -3. team モードでは,マージした PR の一覧をチームに周知するよう促す(全員が `git pull` する.GUIDE_03) +- 対象 PR / alert の収集データ(フェーズ 1・3 の結果から該当分.CI 赤の PR は失敗したチェックの要約も) +- 手順書: `reference.md` の「不変条件」「メジャー更新の影響分析」「PR コメントの書式」を読んで従うこと + +返ってきた分析(破壊的変更・影響箇所・推奨)に不足があれば追加調査を指示する. + +## フェーズ 5: 記録・コメント (Record) + +ops-runner エージェントを起動し,以下を委譲する: + +- `reference.md` の「台帳の書式」に従い,フェーズ 4 の分析結果を `deps-update-report.md` に追記する(既出は再記録しない.フェーズ 3 のマージ結果は実行手順 B 内で `deps-update-merged.md` に追記済み) +- 通常モードでは,分析済み PR へ「PR コメントの書式」でコメントを投稿する(`` マーカーが既にある PR には再投稿しない).report モードでは投稿しない + +## フェーズ 6: 完了報告 (Report) + +ユーザーに以下を報告する(台帳を根拠にする): + +- モード(merge / report)と対象 PR 数,Dependabot 設定の状態(無効なら `/setup` の該当手順を案内) +- **マージした PR**: 番号・パッケージと版・種別(security / version)・規模・検証 Tier(CI / ローカル / ビルドのみ).**人間が行うべき動作確認**があれば添える(例: UI ライブラリの更新は実機で表示確認) +- **⚠ 判断待ち(要人間対応)**: メジャー更新(影響分析・推奨対応付き)/CI 赤/修正版なし alert/Dependabot が PR を作れなかった alert.security 由来のものは **⚠ 優先** を付けて上に並べる +- 見送り: 競合で `@dependabot rebase` を依頼したもの,CI 待ちのもの(次回再試行),`deps-update-skip.md` によるスキップ件数 +- 次のアクション: 判断待ちの各項目について「PR をそのままマージ」「`/implement` で追従してからマージ」「`@dependabot ignore this major version` で見送り(人間がコメント)」のどれを推奨するか +- 後片付け: フェーズ 3 の報告から,開始ブランチへの復帰と作業ツリーがクリーンであることを確認して結果を含める + +team モードでは,マージした PR の一覧をチームに周知するよう促す(全員が `git pull` する.GUIDE_03). ## /loop との併用 (Use with /loop) @@ -101,6 +96,6 @@ ## 停止条件 (Stop Conditions) -- 作業ツリーがクリーンでない/`gh` 未認証/リモートが GitHub でない → 開始せずに報告 -- ローカル検証中にコンフリクト・環境エラーで検証が成立しない → その PR は Tier C として扱い,他の PR の処理は続ける +- 作業ツリーがクリーンでない/`gh` 未認証/リモートが GitHub でない → フェーズ 1 の停止報告を受けて,開始せずに報告 +- ローカル検証中にコンフリクト・環境エラーで検証が成立しない → その PR は Tier C として分析行きに回し,他の PR の処理は続ける - `gh pr merge` が失敗(ブランチ保護・権限不足) → その PR は報告に回し,失敗理由を伝える.team モードで「他メンバー Approve 必須」のブランチ保護が効いている場合は,本スキルはマージ可と判定した PR の一覧を提示するにとどめる diff --git a/.claude/skills/deps-update/reference.md b/.claude/skills/deps-update/reference.md index 2f0fb7e..3f4066c 100644 --- a/.claude/skills/deps-update/reference.md +++ b/.claude/skills/deps-update/reference.md @@ -2,6 +2,40 @@ `/deps-update`(`SKILL.md`)から参照される,`gh` コマンド・GraphQL クエリ・分類規則・ローカル検証手順・台帳と PR コメントの書式.`{owner}/{repo}` は `gh` がカレントリポジトリから自動補完する. +## 不変条件 (Invariants) + +`/deps-update` に関わる全エージェント(司令塔・ops-runner・deps-analyst)が厳守する. + +1. **触るのは Dependabot が作った PR だけ**: author が `app/dependabot` の open PR のみを対象にする.人間や他のボットの PR には一切操作しない +2. **`main` への取り込みは `gh pr merge --merge` のみ**: ローカルで `main` に直接コミット・push しない.依存ファイル(マニフェスト・ロックファイル)を自分で書き換えて別 PR を作ることもしない(競合やビルド失敗の解消は `@dependabot rebase` / `@dependabot recreate` コメントで Dependabot にやり直させる) +3. **ゲートを満たした PR だけをマージする**(SKILL.md「判定表」).**メジャー更新は自動マージしない**.検証(CI 緑またはローカル検証)無しにマージしない +4. **Dependabot PR を close しない**: 不要な PR の整理(supersede・`@dependabot ignore`)は Dependabot と人間に任せる.`@dependabot ignore ...` のコメントも自分では投稿しない(無視は人間の決定) +5. **作業ツリーを汚さない**: 開始時に作業ツリーがクリーンであることを確認し,ローカル検証で作ったブランチ・マージ状態は必ず破棄し,終了時に開始時のブランチへ戻す +6. **二重処理しない**: 台帳を読み,既に報告済み・スキップ指定の項目は再報告しない.PR コメントも同じ PR に同じ趣旨で 2 度投稿しない +7. **ユーザーが起動した時だけ動く**: Claude が自発的に本スキルを呼んではならない(`/loop /deps-update` でのラップはユーザー起動とみなす) + +## 実行手順 A: セットアップと収集 (Execution A: Setup & Collect) + +司令塔(`/deps-update` のメインループ)から委譲された ops-runner が実行する.振り分けの判断はせず,結果を構造化して返す. + +1. **前提の確認**: 「前提の確認」のコマンド一式を実行する.作業ツリーが汚れている・`gh` 未認証・リモートが GitHub でない場合は停止して報告する(stash もしない).開始時のブランチ名を控える +2. **検証スイートの特定**: `docs/02_ENV/ENV_04_開発コマンド.md` があればそれを唯一の参照先とする.無ければ構成ファイル(`package.json`,`pubspec.yaml`,`Cargo.toml`,`go.mod`,`pyproject.toml` 等)から依存インストール・テスト・(あれば)ビルド/型チェック/リンタのコマンドを特定する.推測で試さず,特定できなければ「ローカル検証不可」として返す +3. **台帳の読み込み**: `.claude/deps-update-merged.md`・`.claude/deps-update-report.md`・`.claude/deps-update-skip.md`(無ければ空扱い.`.gitignore` で追跡除外されていなければ追記する) +4. **収集**: 「PR の収集」「alert の収集」に従い取得する +5. **分類**: 各 PR を「更新規模の分類」に従い,規模(`patch` / `minor` / `major` / `unknown`)・依存スコープ(本番 / 開発)・種別(security / version)・`mergeable` / `mergeStateStatus`・CI 状況で整理する +6. **返すもの**: 前提状態(Dependabot 設定・CI の有無・検証スイート・開始ブランチ)・分類付き PR 一覧・alert 一覧(紐づく PR・エラー含む)・台帳の既出項目・skip 該当項目 + +## 実行手順 B: 検証とマージ (Execution B: Verify & Merge) + +司令塔がマージ候補と判定した PR を,指定された順に 1 件ずつ処理する ops-runner の手順. + +1. **rebase 依頼のみ指定の PR**: `@dependabot rebase` をコメントして次へ進む(マージしない) +2. **状態の取り直し**: マージのたびに Dependabot が残りの PR を自動 rebase するため,各 PR の処理前に `mergeable`・CI 状況を取り直す.`CONFLICTING` / `BEHIND` になっていれば rebase 依頼に切り替える +3. **検証**: CI があれば「CI の完了待ち」,無ければ「ローカル検証」を実行する +4. **緑の場合**: 「マージ」の手順どおり `gh pr merge <番号> --merge --delete-branch` でマージし,`deps-update-merged.md` へ「台帳の書式」で追記し,ローカル `main` を pull する +5. **赤・検証不能の場合**: マージせず,失敗したコマンド/チェックの要約を添えて「分析行き」として結果に含める +6. **後片付け**: 全件終了後,ローカル検証で作ったブランチ・マージ状態を破棄して開始時のブランチへ戻り,`git status --short` が空であることを確認して結果(マージ済み・rebase 依頼済み・分析行き)を返す + ## 前提の確認 (Prerequisites) ```bash diff --git a/.claude/skills/task-create/SKILL.md b/.claude/skills/task-create/SKILL.md index 60363a7..b8bd98d 100644 --- a/.claude/skills/task-create/SKILL.md +++ b/.claude/skills/task-create/SKILL.md @@ -5,43 +5,37 @@ argument-hint: "<タスクの説明>" --- -あなたはタスク計画担当です. -`.claude/skills/task-start/reference.md`(Issues・Projects の gh 操作リファレンス)に従い,新しいタスクの Issue を作成してボードに並べてください. +あなたはタスク計画の司令塔です.Issue の**中身(タイトル・本文)はあなたが作り**,gh での起票・ボード操作は **ops-runner エージェント**(軽量モデル)に委譲します(使用量節約のため,gh 操作を自分では行わない). -本スキルは **solo / team 両モードで使用できる**.team モードでは GUIDE_03(チーム開発ルール)のタスク管理方針にも従うこと.solo モードでは GUIDE_03 は存在しないため,本スキルと reference.md の記述を基準とする. +本スキルは **solo / team 両モードで使用できる**.team モードでは GUIDE_03(チーム開発ルール)のタスク管理方針にも従うこと.solo モードでは GUIDE_03 は存在しないため,本スキルと `.claude/skills/task-start/reference.md` の記述を基準とする. 本コマンドは**タスクを事前に定義する**ためのものです.着手は別途 `/task-start ` で行います(または手動で).Issue はどの段階でも必須ではなく,Issue 無しで進める作業はこのコマンドを使う必要はありません. -## 前提確認 (Pre-check) +## ステップ 1: 前提確認 (Pre-check) $ARGUMENTS(タスクの説明)が指定されているか確認する.指定がなければ「タスクの説明を指定してください」と伝えて終了する. -## ステップ 1: Project の特定 (Project Lookup) +## ステップ 2: Issue 内容の作成 (Compose) -1. リポジトリ所有者を取得する(`gh repo view --json owner --jq .owner.login`). -2. Project を特定する(`gh project list --owner `).複数ある場合はユーザーに確認する.見つからない場合はその旨を伝え,ステップ 3(ボード追加)は飛ばして進める(Project ボードは既定では未使用のため,無くても問題ない). +$ARGUMENTS とセッションの文脈から,Issue タイトルと本文を確定させる(ここが品質の要.委譲しない). -## ステップ 2: Issue 作成 (Create Issue) +- **やること**は必ず書く +- **完了条件(受け入れ基準)**は非自明な場合のみ書く +- 担当者は**アサインしない**(誰が拾うかは着手時に決まる) -$ARGUMENTS の説明から Issue 本文を組み立てる. +## ステップ 3: 委譲 (Delegate) -- **やること**は必ず書く. -- **完了条件(受け入れ基準)**は非自明な場合のみ書く. -- 担当者は**アサインしない**(誰が拾うかは着手時に決まる). +ops-runner エージェントを起動し,プロンプトに以下を含める: -`gh issue create --title "<タイトル>" --body "<本文>"` で作成する. +- 手順書: `.claude/skills/task-start/reference.md` の「/task-create 実行手順」を読んで従うこと +- 確定した Issue タイトル・本文(そのまま使い,書き換えないこと) +- 確認が必要な事態では停止して報告すること -## ステップ 3: ボードに追加 (Add to Board) - -`.claude/skills/task-start/reference.md` の「Projects の操作」に従う(Project が無い場合は飛ばす). - -1. `gh project item-add --owner --url ` でボードに追加する. -2. 追加されたアイテムの Status を `Todo` に設定する(`gh project field-list`・`item-list` で必要な ID を取得し `gh project item-edit`). -3. `gh project` の書き込み系は成功しても無出力のことがある.`gh project item-list` で結果を確認する(同 reference.md「トラブルシューティング」). +エージェントが確認事項(Project が複数ある等)で停止した場合は,ユーザーに確認して再委譲する. ## ステップ 4: 完了サマリー (Summary) -以下を提示する: +エージェントの報告をもとに以下を提示する: - **Issue**: 番号・タイトル・URL - **ボード**: Todo(Project が無い場合は「未追加(ボード未使用)」と表記する) @@ -49,5 +43,5 @@ ## 注意事項 (Notes) -- 複数タスクを一括で作る場合は,本コマンドを複数回実行してください. -- Projects 操作には `project` スコープが必要.スコープエラーが出たら `gh auth refresh -s project` を実行する(`.claude/skills/task-start/reference.md`「必要なスコープ」). +- 複数タスクを一括で作る場合は,本コマンドを複数回実行してください +- Projects 操作には `project` スコープが必要.スコープエラーの停止報告が来たら `gh auth refresh -s project` をユーザーに案内する(`.claude/skills/task-start/reference.md`「必要なスコープ」) diff --git a/.claude/skills/task-handoff/SKILL.md b/.claude/skills/task-handoff/SKILL.md index bd6171a..dcf4d98 100644 --- a/.claude/skills/task-handoff/SKILL.md +++ b/.claude/skills/task-handoff/SKILL.md @@ -5,42 +5,23 @@ argument-hint: "<追加メモ(省略可)>" --- -あなたは作業引継ぎ担当です.現在**着手中**の Issue に,次セッション・次メンバーが再開できるだけの情報を進捗メモとして投稿します. +あなたは作業引継ぎの司令塔です.現在**着手中**の Issue に,次セッション・次メンバーが再開できるだけの情報を進捗メモとして投稿します.引継ぎメモの**中身はあなたが書き**(セッションの文脈を知っているのはあなただけ),Issue の特定・git 状態の収集・コメント投稿は **ops-runner エージェント**(軽量モデル)に委譲します. 本スキルは **solo / team 両モードで使用できる**.引継ぎ情報は Issue コメントに集約する. -- **team モード**: GUIDE_03(チーム開発ルール)の「進捗は Issues / Projects と git 履歴で追う」方針に沿う(`CLAUDE.md` に進捗は書かない). -- **solo モード**: 通常の進捗記録(`.claude/rules/progress-log.md`.`CLAUDE.md` 進捗欄+ `docs/PROGRESS.md`)は従来どおり運用し,本スキルはタスク単位の引継ぎメモを Issue に残す補助として使う. +- **team モード**: GUIDE_03(チーム開発ルール)の「進捗は Issues / Projects と git 履歴で追う」方針に沿う(`CLAUDE.md` に進捗は書かない) +- **solo モード**: 通常の進捗記録(`.claude/rules/progress-log.md`.`CLAUDE.md` 進捗欄+ `docs/PROGRESS.md`)は従来どおり運用し,本スキルはタスク単位の引継ぎメモを Issue に残す補助として使う -## 前提確認 (Pre-check) +## ステップ 1: 収集の委譲 (Collect) -リポジトリ所有者を取得する(`gh repo view --json owner --jq .owner.login`). +ops-runner エージェントを起動し,`.claude/skills/task-start/reference.md` の「/task-handoff 実行手順」の**収集フェーズ**を実行させる. -## ステップ 1: 対象 Issue の特定 (Identify Issue) +- 「着手中 0 件」の報告なら「着手中の Issue がありません.まず `/task-start ` で着手してから本コマンドを使ってください.」と伝えて終了する +- 複数件の報告なら,一覧(番号・タイトル)を示して「どれを対象にしますか?」とユーザーに確認し,対象を決めて必要な収集を再委譲する -1. Project を特定する(`gh project list --owner `).Project ボードは既定では未使用のため,見つからなくても問題ない. -2. 着手中の Issue を抽出する: - - **Project がある場合**: ボードから Status が `In Progress` の Issue を抽出する(`gh project item-list --owner --format json`). - - **Project が無い場合**: `gh issue list --assignee @me --state open` で自分にアサインされた open Issue を抽出する. -3. 件数で挙動を変える: - - **0 件**: 「着手中の Issue がありません.まず `/task-start ` で着手してから本コマンドを使ってください.」と伝えて終了. - - **1 件**: そのまま対象とする. - - **複数件**: 各 Issue 番号・タイトルを示し,「どれを対象にしますか?」とユーザーに確認する. +## ステップ 2: ドラフト生成 (Draft) -## ステップ 2: コンテキスト収集 (Collect Context) - -以下を取得してドラフト生成材料とする. - -- `gh issue view --json number,title,body,comments` で Issue 本文と過去コメントを取得 -- `git branch --show-current` で作業ブランチ -- `git rev-parse --short HEAD` で現在 HEAD -- `git log main..HEAD --oneline` で main から積んだコミット一覧 -- `git status --porcelain` で未コミット変更の有無 -- 直近のセッション会話履歴から「**確定した重要な設計判断**」と「**未決定で次に詰める点**」を抽出 - -## ステップ 3: ドラフト生成 (Draft) - -以下のフォーマットで進捗メモを生成する.**該当なしのセクションは省略してよい**. +収集データ(Issue 本文・過去コメント・git 状態)と,直近のセッション会話から抽出した「**確定した重要な設計判断**」「**未決定で次に詰める点**」をもとに,以下のフォーマットで進捗メモを生成する.**該当なしのセクションは省略してよい**. ````markdown ## 進捗メモ (YYYY-MM-DD) @@ -82,21 +63,21 @@ ### ドラフトの粒度方針 -- **完了済み**: 当該セッションで積んだコミット中心.本 Issue に関わる範囲のみ. -- **残タスク**: Issue 本文の TODO や未着手項目を整理. -- **確定した設計判断**: セッション中にユーザーと合意して**今後の作業の前提**になるもの.既に Issue 本文や過去コメントに明記されている内容は重複させない(差分のみ). -- **未決定で次に詰める点**: 次セッションで判断が必要なもの. -- **粒度感**: 1 セッション分の引継ぎ.週次レポートではない. +- **完了済み**: 当該セッションで積んだコミット中心.本 Issue に関わる範囲のみ +- **残タスク**: Issue 本文の TODO や未着手項目を整理 +- **確定した設計判断**: セッション中にユーザーと合意して**今後の作業の前提**になるもの.既に Issue 本文や過去コメントに明記されている内容は重複させない(差分のみ) +- **未決定で次に詰める点**: 次セッションで判断が必要なもの +- **粒度感**: 1 セッション分の引継ぎ.週次レポートではない -## ステップ 4: 承認 (Approval) +## ステップ 3: 承認 (Approval) ドラフトをユーザーに提示し,「**この内容で投稿しますか? 修正点があれば指示してください.**」と確認する. ユーザーの明示的な同意(「OK」「投稿して」「これで」等)が得られるまで投稿しない.修正指示があれば反映して再提示する. -## ステップ 5: 投稿 (Post) +## ステップ 4: 投稿の委譲 (Post) -`gh issue comment --body "<本文>"` で投稿する.投稿後,コメントの URL を表示する. +ops-runner エージェントを起動し,「/task-handoff 実行手順」の**投稿フェーズ**を実行させる(承認済みの本文をそのまま渡す).返ってきたコメント URL を控える. ## 完了サマリー (Summary) @@ -108,6 +89,6 @@ ## 注意事項 (Notes) -- 本コマンドは Issue を**クローズしない・Done に動かさない**.着手中のまま残す(作業継続前提).完了させたい場合は別途 `/commit merge` で PR をマージ → `Closes #<番号>` で自動クローズ. -- 進捗メモは**コメント**として投稿する.Issue 本文は書き換えない. -- Projects 操作には `project` スコープが必要.スコープエラーが出たら `gh auth refresh -s project` を実行する(`.claude/skills/task-start/reference.md`「必要なスコープ」). +- 本コマンドは Issue を**クローズしない・Done に動かさない**.着手中のまま残す(作業継続前提).完了させたい場合は別途 `/commit merge` で PR をマージ → `Closes #<番号>` で自動クローズ +- 進捗メモは**コメント**として投稿する.Issue 本文は書き換えない +- Projects 操作には `project` スコープが必要.スコープエラーの停止報告が来たら `gh auth refresh -s project` をユーザーに案内する(`.claude/skills/task-start/reference.md`「必要なスコープ」) diff --git a/.claude/skills/task-start/SKILL.md b/.claude/skills/task-start/SKILL.md index 31f1399..8450ca0 100644 --- a/.claude/skills/task-start/SKILL.md +++ b/.claude/skills/task-start/SKILL.md @@ -5,51 +5,31 @@ argument-hint: "" --- -あなたはタスク着手の準備担当です. -本スキルの `reference.md`(Issues・Projects の gh 操作リファレンス)に従い,**既存 Issue を拾って**作業に取り掛かるための準備を整えてください. +あなたはタスク着手の司令塔です.着手準備(アサイン・ボード操作・作業ブランチ作成)の実行は **ops-runner エージェント**(軽量モデル)に委譲し,あなた自身はユーザー確認の仲介と結果の報告だけを行います(使用量節約のため,git・gh 操作を自分では行わない). -本スキルは **solo / team 両モードで使用できる**.team モードでは GUIDE_03(チーム開発ルール)にも従うこと.solo モードでは GUIDE_03 は存在しないため,本スキルと reference.md の記述を基準とする. +本スキルは **solo / team 両モードで使用できる**.team モードでは GUIDE_03(チーム開発ルール)にも従うこと.solo モードでは GUIDE_03 は存在しないため,本スキルと本スキルの `reference.md` の記述を基準とする. 本コマンドは既存 Issue から作業を始めるためのものです.新規 Issue を立てる場合は `/task-create` を使ってください.Issue 無しで小さい変更や試験的作業を進める場合はこのコマンドは不要です. -## 前提確認 (Pre-check) +## ステップ 1: 前提確認 (Pre-check) -1. 作業ツリーの状態を確認する(`git status`).未コミットの変更がある場合は,その旨をユーザーに伝え,先に片付けるか続行するか確認する. -2. 現在のブランチを確認する(`git branch --show-current`).`main` 以外にいる場合は,そのブランチに未マージのコミットが残っていないか確認する(`git log main..HEAD --oneline`).残っていれば「前の作業が未マージです.先にマージしてから着手するのが推奨です.続行しますか?」とユーザーに確認する(直列運用の原則). -3. $ARGUMENTS を確認する.Issue 番号(数値または `#数値`)が指定されていなければ「対象の Issue 番号を指定してください.新規 Issue を立てる場合は `/task-create` を使います」と伝えて終了する. +$ARGUMENTS を確認する.Issue 番号(数値または `#数値`)が指定されていなければ「対象の Issue 番号を指定してください.新規 Issue を立てる場合は `/task-create` を使います」と伝えて終了する. -## ステップ 1: 直列運用チェック (Serial Check) +## ステップ 2: 委譲 (Delegate) -同時に進行中のコード作業は原則 1 件とする(team モードの根拠は GUIDE_03「作業の直列化」.solo でも仕掛かりを増やさないため同じ原則を適用する). +ops-runner エージェントを起動し,プロンプトに以下を含める: -1. リポジトリ所有者を取得する(`gh repo view --json owner --jq .owner.login`). -2. Project を特定する(`gh project list --owner `).複数ある場合はユーザーに確認する.見つからない場合はその旨を伝える(Project ボードは既定では未使用のため,無くても問題ない).この場合,進行中チェックはボードの代わりに `gh issue list --assignee @me --state open` で行い,ステップ 3(ボード操作)は飛ばして進める. -3. 進行中の作業を数える(Project がある場合は `gh project item-list --owner --format json` で Status が `In Progress` のもの,無い場合は上記のアサイン済み open Issue).対象 Issue 以外で 1 件以上ある場合は,該当タスクを示し「直列運用では進行中の作業は原則 1 件です.続行しますか?」とユーザーに確認する(禁止ではなく原則). +- 手順書: 本スキルの `reference.md`(`.claude/skills/task-start/reference.md`)の「/task-start 実行手順」を読んで従うこと +- 対象の Issue 番号 +- 確認が必要な事態(未コミット変更・未マージブランチ・進行中タスクあり・他人アサイン等)では,該当項目をまとめて停止・報告すること -## ステップ 2: 対象 Issue の確認・アサイン (Verify & Assign) +## ステップ 3: 確認の仲介 (Confirm) -1. `gh issue view ` で Issue の内容を確認する.存在しない・クローズ済みの場合はユーザーに知らせて判断を仰ぐ. -2. 担当者が未設定,または自分以外なら,`gh issue edit --add-assignee @me` で自分をアサインする(他人がアサインされている場合は,重複着手にならないかユーザーに確認). +エージェントが確認事項で停止した場合は,状況をユーザーに提示して判断を仰ぎ,承認された項目を「ユーザー承認済み」と明示して再委譲する. -## ステップ 3: ボードを In Progress へ (Board) +## ステップ 4: 完了サマリー (Summary) -`reference.md` の「Projects の操作」に従う(Project が無い場合はこのステップを飛ばす). - -1. 対象 Issue がボードに未追加なら `gh project item-add --owner --url ` で追加する. -2. 対象アイテムの Status を `In Progress` に変更する(`gh project field-list`・`item-list` で必要な ID を取得し `gh project item-edit`). -3. `gh project` の書き込み系は成功しても無出力のことがある.`gh project item-list` で結果を確認する(`reference.md`「トラブルシューティング」). - -## ステップ 4: 作業ブランチ作成 (Branch) - -Git 規約 `.claude/rules/git-conventions.md` に従う. - -1. `git checkout main && git pull origin main` で `main` を最新化する. -2. git-conventions ルールの基本形式(`[プレフィックス][概要]`)でブランチ名を決める.プレフィックスはタスク種別(`feature` / `fix` / `refactor` / `docs` / `chore`),概要は内容を表す英単語 2〜4 語(kebab-case)とする.ブランチ名に Issue 番号は含めない(紐付けは PR 本文の `Closes #<番号>` で行う). -3. `git checkout -b <ブランチ名>` で作業ブランチを作成する. - -## ステップ 5: 完了サマリー (Summary) - -以下を提示する: +エージェントの報告をもとに以下を提示する: - **Issue**: 番号・タイトル・URL - **ボード**: In Progress(Project が無い場合は「アサインのみ(ボード未使用)」と表記する) @@ -58,6 +38,6 @@ ## 注意事項 (Notes) -- branch↔Issue の紐付けは,後の PR 本文の `Closes #` で行う.ブランチ名には番号を入れない. -- Projects 操作には `project` スコープが必要.スコープエラーが出たら `gh auth refresh -s project` を実行する(`reference.md`「必要なスコープ」). -- 新規 Issue を立てる場合は `/task-create`,Issue 無しで進める場合は本コマンドを使わず直接 `/implement` 等へ. +- branch↔Issue の紐付けは,後の PR 本文の `Closes #` で行う.ブランチ名には番号を入れない +- Projects 操作には `project` スコープが必要.スコープエラーの停止報告が来たら `gh auth refresh -s project` をユーザーに案内する(`reference.md`「必要なスコープ」) +- 新規 Issue を立てる場合は `/task-create`,Issue 無しで進める場合は本コマンドを使わず直接 `/implement` 等へ diff --git a/.claude/skills/task-start/reference.md b/.claude/skills/task-start/reference.md index b183991..9ad1573 100644 --- a/.claude/skills/task-start/reference.md +++ b/.claude/skills/task-start/reference.md @@ -30,6 +30,45 @@ gh issue develop --name feature/<概要> --base main ``` +## /task-create 実行手順 (task-create Execution Flow) + +`/task-create` の司令塔(メインループ)から,確定済みの Issue タイトル・本文を受け取った ops-runner が実行する. + +1. **Project の特定**: `gh repo view --json owner --jq .owner.login` で所有者を取得し,`gh project list --owner ` で Project を特定する.複数ある場合は停止して確認事項として報告する.見つからない場合はボード追加を飛ばして進める(Project ボードは既定では未使用のため,無くても問題ない) +2. **Issue 作成**: 渡されたタイトル・本文を**そのまま**使い,`gh issue create --title "<タイトル>" --body "<本文>"` で作成する(本文を書き換えない).担当者はアサインしない +3. **ボードに追加**: 「Projects の操作」に従い `item-add` → Status を `Todo` に設定 → `item-list` で結果を確認する(Project が無い場合は飛ばす) +4. **報告**: Issue 番号・タイトル・URL・ボード状態を返す + +## /task-start 実行手順 (task-start Execution Flow) + +`/task-start` の司令塔から Issue 番号を受け取った ops-runner が実行する.ブランチ命名は `.claude/rules/git-conventions.md` に従う. + +1. **前提確認**: `git status` を確認し,未コミットの変更があれば停止して報告する.`git branch --show-current` を確認し,`main` 以外にいる場合は `git log main..HEAD --oneline` で未マージコミットを確認し,残っていれば停止して報告する(直列運用の原則) +2. **直列運用チェック**: 所有者を取得し Project を特定する(複数なら停止して報告.無ければボード操作を飛ばす).進行中の作業を数える(Project があれば `item-list` で Status が `In Progress` のもの,無ければ `gh issue list --assignee @me --state open`).対象 Issue 以外に 1 件以上あれば,該当タスクの一覧を添えて停止して報告する(禁止ではなく原則) +3. **対象 Issue の確認・アサイン**: `gh issue view ` で内容を確認する(存在しない・クローズ済み・他人がアサイン済みの場合は停止して報告する).`gh issue edit --add-assignee @me` で自分をアサインする +4. **ボードを In Progress へ**: 「Projects の操作」に従い,未追加なら `item-add` → Status を `In Progress` に変更 → `item-list` で結果を確認する(Project が無い場合は飛ばす) +5. **作業ブランチ作成**: `git checkout main && git pull origin main` で `main` を最新化し,規約どおりのブランチ名(プレフィックス+英単語 2〜4 語.Issue 番号は含めない)で `git checkout -b <ブランチ名>` する +6. **報告**: Issue 番号・タイトル・URL・ボード状態・作成したブランチ名を返す + +※ ステップ 1〜3 の停止条件に複数該当する場合は,まとめて 1 回の報告で返す(司令塔との往復を減らす).司令塔から「ユーザー承認済み」と明示された項目では停止しない. + +## /task-handoff 実行手順 (task-handoff Execution Flow) + +`/task-handoff` の司令塔から委譲される 2 つのフェーズ. + +### 収集フェーズ (Collect) + +1. 所有者を取得し Project を特定する(無くても問題ない).着手中の Issue を抽出する(Project があれば `item-list` で Status が `In Progress` のもの,無ければ `gh issue list --assignee @me --state open`) +2. 0 件ならその旨を報告して終了する.複数件なら一覧(番号・タイトル)を確認事項として返す +3. 対象 Issue について以下を収集して返す: + - `gh issue view --json number,title,body,comments`(本文と過去コメントの要点.過去の進捗メモと重複させないための材料) + - `git branch --show-current`/`git rev-parse --short HEAD`/`git log main..HEAD --oneline`/`git status --porcelain` + +### 投稿フェーズ (Post) + +1. 司令塔から渡された本文を**そのまま** `gh issue comment --body "<本文>"` で投稿する(書き換えない) +2. コメントの URL を返す + ## Projects の操作 (Projects) > ⚠ **Projects(ボード)は既定では未使用**.以下は将来導入時の参考として残す. diff --git "a/docs/01_GUIDE/GUIDE_02_\343\202\250\343\203\274\343\202\270\343\202\247\343\203\263\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253.md" "b/docs/01_GUIDE/GUIDE_02_\343\202\250\343\203\274\343\202\270\343\202\247\343\203\263\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253.md" index 42aff80..0f75d7c 100644 --- "a/docs/01_GUIDE/GUIDE_02_\343\202\250\343\203\274\343\202\270\343\202\247\343\203\263\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253.md" +++ "b/docs/01_GUIDE/GUIDE_02_\343\202\250\343\203\274\343\202\270\343\202\247\343\203\263\343\203\210\351\201\213\347\224\250\343\203\253\343\203\274\343\203\253.md" @@ -19,6 +19,15 @@ | `tester` | 仕様ベースのテスト作成・実行 | Phase 2 | | `refactorer` | コード品質の改善 | Phase 3 | +### 補助エージェント (Support Agents) + +実装パイプライン外でも,「思考(判断・文章品質)はメインループ,機械的な実行は軽量エージェント」の分担で使用量を節約する.サブエージェントは新規の小さいコンテキストで起動されるため,メインループのプロンプトキャッシュを壊さずに安価なモデルを使える.以下は各 skill の実行フェーズから起動される補助エージェント. + +| エージェント | 役割 | 使用元 | +| --- | --- | --- | +| `ops-runner` | git・gh・検証コマンドの機械的な実行(手順書に忠実に従い,判断が要る事態では停止して報告する) | `/commit`・`/task-create`・`/task-start`・`/task-handoff`・`/deps-update` | +| `deps-analyst` | 依存更新 1 件の影響分析(破壊的変更の抽出・利用箇所の突き合わせ・推奨対応) | `/deps-update` | + ## パイプラインの流れと人間の役割 (Pipeline & Human's Role) `/implement <タスク内容>` で開始する(作業ブランチは git-conventions ルールに従い作成される).