diff --git a/.claude/skills/auto-audit/SKILL.md b/.claude/skills/auto-audit/SKILL.md index 3137e70..f48cb11 100644 --- a/.claude/skills/auto-audit/SKILL.md +++ b/.claude/skills/auto-audit/SKILL.md @@ -65,7 +65,7 @@ - 自動生成コード(コードジェネレータ出力,`*.g.dart`,`*.pb.go`,スナップショット等) - 依存・サードパーティ(`node_modules/`,`vendor/`,`.dart_tool/`,`target/`,ベンダリングされた外部ソース) - - ただし**依存の既知 CVE**(脆弱性観点)は,コードを書き換えるのではなく「どの依存をどのバージョンに上げるべきか」を**報告**する(バージョン更新の自動適用はしない.挙動変化・破壊的変更のリスクがあるため). + - ただし**依存の既知 CVE**(脆弱性観点)は,コードを書き換えるのではなく「どの依存をどのバージョンに上げるべきか」を**報告**する(バージョン更新の自動適用はしない.挙動変化・破壊的変更のリスクがあるため).Dependabot alerts が有効なら同じ CVE は Dependabot 側でも検出されるので,報告時に「`/deps-update` で処理できる」旨を添える. - ロックファイル・依存マニフェスト(`package-lock.json`,`yarn.lock`,`pubspec.lock`,`Cargo.lock`,`go.sum` 等) - マイグレーション・スキーマ履歴(適用済みの DB マイグレーション等) - 設定・秘匿情報ファイル(`.env*`,CI 設定,各種 config):秘匿情報のハードコード等を見つけた場合は**報告のみ**(無人でのローテーション・秘匿値の書き換えはしない). diff --git a/.claude/skills/deps-update/SKILL.md b/.claude/skills/deps-update/SKILL.md new file mode 100644 index 0000000..e1fc67e --- /dev/null +++ b/.claude/skills/deps-update/SKILL.md @@ -0,0 +1,106 @@ +--- +name: deps-update +model: inherit +description: "Dependabot が作成した依存更新 PR(security updates / version updates)と,PR が付かない Dependabot alerts をまとめて処理する.メジャー更新でない・競合なし・CI 緑(またはローカル検証緑)のゲートを満たす PR だけを gh pr merge で main に取り込み,メジャー更新・CI 赤・修正版なしの alert 等は影響分析と推奨対応を添えて台帳と PR コメントに報告する.ユーザーが明示的に起動した時のみ実行する(/loop でのラップ可)." +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`)を参照する. + +## 不変条件 (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` でのラップはユーザー起動とみなす) + +## 引数 (Arguments) + +`$ARGUMENTS` を次のように解釈する: + +- 先頭トークンが `report` なら**報告のみモード**(マージも PR コメントもしない.分析結果を完了報告と台帳に書くだけ).`merge` または省略なら**通常モード**(ゲートを満たすものをマージし,残りを報告する) +- 残りのトークンに `#12` / `12` 形式の番号があれば,その PR だけを対象にする(省略時は open な Dependabot PR すべて) + +## ステップ 0: セットアップ (Setup) + +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 は一切操作せず,完了報告で件数だけ伝える + +## ステップ 1: 収集 (Collect) + +`reference.md`「PR の収集」「alert の収集」に従い,以下を取得する. + +- **Dependabot PR**: open かつ author `app/dependabot` の PR 一覧(番号・タイトル・本文・ブランチ・`mergeable`・`mergeStateStatus`・チェック状況・ラベル) +- **Dependabot alerts**: open な alert 一覧(パッケージ・エコシステム・重大度・脆弱範囲・修正版・GHSA・**紐づく PR の番号**・Dependabot が PR を作れなかった場合のエラー) + +alert に紐づく PR は「security update」,それ以外の Dependabot PR は「version update」として扱う(alert 情報が取れない場合は PR 本文の GHSA リンク・`security` ラベルで代用する). + +## ステップ 2: 各 PR の判定 (Classify & Verify) + +対象 PR を **security update → パッチ → マイナー → その他** の順に並べ,1 件ずつ以下を行う. + +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. **判定表**に従って処理を決める: + + | 更新規模 | Tier A | Tier B | Tier C | + | --- | --- | --- | --- | + | `patch` | マージ | マージ | 報告 | + | `minor` | マージ | 報告 | 報告 | + | `major` / `0.x` マイナー / `unknown` | 報告(分析付き) | 報告(分析付き) | 報告(分析付き) | + + - 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 モード**: マージ・コメントをせず,判定結果(「マージ可」「報告」)と分析を完了報告と台帳にだけ書く + +## ステップ 3: PR が付かない alert (Alerts without PR) + +紐づく PR が無い open alert を 1 件ずつ見る. + +- **修正版が無い**(`firstPatchedVersion` なし): 報告.回避策(別パッケージ・利用箇所の無効化等)があれば添える +- **修正版はあるが Dependabot が PR を作れなかった**(推移的依存・対応外のマニフェスト・`open-pull-requests-limit` 超過・エラー): エラー内容と「どの依存をどのバージョンへ」を報告し,推移的依存ならロックファイルの更新コマンド(`npm update ` / `dart pub upgrade ` 等,検証スイートでの確認付き)を推奨対応として示す.**自分では依存を書き換えない**(不変条件 2).必要なら `/implement` での対応を案内する +- いずれも `deps-update-report.md` に `[alert]` として追記する(既出は再記録しない) + +## ステップ 4: 後片付けと完了報告 (Cleanup & Report) + +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) + +## /loop との併用 (Use with /loop) + +Dependabot は週 1 回(`dependabot.yml` の `interval`)まとめて PR を作るため,単発実行で十分なことが多い.放置中に取り込みたい場合は `/loop 1d /deps-update` のように日次でラップしてよい.対象が無い回は収集だけで即終了するので空回りのコストは小さいが,2 回連続で「マージ 0・新規報告 0」なら `/loop` を終了してよい. + +## 停止条件 (Stop Conditions) + +- 作業ツリーがクリーンでない/`gh` 未認証/リモートが GitHub でない → 開始せずに報告 +- ローカル検証中にコンフリクト・環境エラーで検証が成立しない → その 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 new file mode 100644 index 0000000..2f0fb7e --- /dev/null +++ b/.claude/skills/deps-update/reference.md @@ -0,0 +1,186 @@ +# deps-update リファレンス (deps-update Reference) + +`/deps-update`(`SKILL.md`)から参照される,`gh` コマンド・GraphQL クエリ・分類規則・ローカル検証手順・台帳と PR コメントの書式.`{owner}/{repo}` は `gh` がカレントリポジトリから自動補完する. + +## 前提の確認 (Prerequisites) + +```bash +gh auth status +gh repo view --json nameWithOwner -q .nameWithOwner +git status --short # 空であること +git branch --show-current # 開始時のブランチを控える +gh api repos/{owner}/{repo}/vulnerability-alerts # 204 なら Dependabot alerts 有効(404 なら無効) +gh api repos/{owner}/{repo}/automated-security-fixes # {"enabled":true,...} なら security updates 有効 +test -f .github/dependabot.yml && echo "dependabot.yml: あり" || echo "dependabot.yml: なし" +ls .github/workflows/*.yml 2>/dev/null # CI の有無 +``` + +## PR の収集 (Collect PRs) + +```bash +gh pr list --author app/dependabot --state open --limit 100 \ + --json number,title,body,url,headRefName,baseRefName,labels,mergeable,mergeStateStatus,statusCheckRollup,createdAt,isDraft +``` + +- 個別の詳細: `gh pr view <番号> --json number,title,body,mergeable,mergeStateStatus,statusCheckRollup,files,commits` +- チェック状況: `gh pr checks <番号>`(CI が無いリポジトリでは何も返らない) +- 変更ファイル: `gh pr diff <番号> --name-only`(マニフェストとロックファイルだけのはず.それ以外が含まれていたら報告に回す) +- 本スキルが既にコメント済みか: `gh pr view <番号> --json comments -q '.comments[].body' | grep -c ""` + +## alert の収集 (Collect Alerts) + +GraphQL で「紐づく PR」と「PR を作れなかった理由」まで一度に取る(REST の `/deps-update/alerts` には PR との紐づけが無い). + +```bash +OWNER=$(gh repo view --json owner -q .owner.login) +REPO=$(gh repo view --json name -q .name) +gh api graphql -f owner="$OWNER" -f repo="$REPO" -f query=' +query($owner: String!, $repo: String!) { + repository(owner: $owner, name: $repo) { + vulnerabilityAlerts(states: OPEN, first: 100) { + nodes { + number + vulnerableManifestPath + vulnerableRequirements + securityVulnerability { + package { name ecosystem } + severity + vulnerableVersionRange + firstPatchedVersion { identifier } + } + securityAdvisory { ghsaId summary permalink } + dependabotUpdate { + pullRequest { number url } + error { title body errorType } + } + } + } + } +}' +``` + +- `dependabotUpdate.pullRequest` があれば,その PR は **security update** +- `dependabotUpdate.error` があれば,Dependabot は修正 PR を作れなかった(推移的依存・対応外マニフェスト・上限超過等).`errorType` と `body` を報告に転記する +- `firstPatchedVersion` が `null` なら修正版が無い +- フォールバック(GraphQL が使えない場合): `gh api "repos/{owner}/{repo}/dependabot/alerts?state=open&per_page=100"`.PR との紐づけは PR 本文の GHSA リンク(`securityAdvisory.ghsaId`)で照合する + +## 更新規模の分類 (Classifying the Bump) + +### 単独 PR (Single-package PR) + +タイトル `Bump from to `(`Update requirement from ... to ...` の形もある)から版を取り,semver で比較する. + +| 条件 | 規模 | +| --- | --- | +| メジャーが上がる(`1.x` → `2.x`) | `major` | +| メジャーが `0` でマイナーが上がる(`0.3.x` → `0.4.x`) | `major` 相当(破壊的変更を含みうる) | +| メジャー同じでマイナーが上がる | `minor` | +| パッチだけ上がる | `patch` | +| semver として解釈できない(日付版・ハッシュ・範囲指定等) | `unknown` | + +- プレリリース(`-beta` 等)への更新は `unknown` として扱う +- `github-actions` の `v3` → `v4` のようなメジャータグ更新は `major` + +### グループ PR (Grouped PR) + +タイトル `Bump the group (across N directories )?with N updates` の PR は,本文の `Updates \`\` from to ` 行(または本文の表)を全て取り,**最大の規模**で判定する.テンプレートの `dependabot.yml` では `minor-and-patch` グループがマイナー/パッチだけを含むので定義上 `minor` になるが,本文から実際に確認する. + +### 依存スコープ (Dependency Scope) + +マニフェストのセクションで判定する(`package.json` の `devDependencies`,`pubspec.yaml` の `dev_dependencies`,`pyproject.toml` の dev グループ/`[project.optional-dependencies]`,`Cargo.toml` の `[dev-dependencies]` 等).`github-actions`・`docker` は CI/実行環境への影響として本番扱いにする. + +## CI の完了待ち (Waiting for CI) + +```bash +gh pr checks <番号> --watch --interval 30 # 全チェック完了まで待つ(Bash ツールの timeout を 10 分程度にする) +``` + +- 待ち切れなければ,CI が無い場合と同じく「ローカル検証」に切り替えるか,今回は見送って「CI 待ち」として報告する +- マージ直後は Dependabot が残りの PR を自動 rebase して CI が再実行される.次の PR に進む前にチェック状況を取り直す + +## ローカル検証 (Local Verification) + +CI が無い/CI 待ちに使う.**最新 `main` を取り込んだ状態**で検証し,終わったら必ず元に戻す.push は一切しない. + +```bash +START_BRANCH=$(git branch --show-current) +git fetch origin +gh pr checkout <番号> # PR のブランチをローカルに取得して切り替え +PR_BRANCH=$(git branch --show-current) +git merge --no-edit origin/main # 失敗(コンフリクト)なら: git merge --abort → この PR は見送り(@dependabot rebase) +# 依存インストール → 検証スイート(ENV_04_開発コマンド.md のコマンド) +# 例: npm ci && npm test && npm run build / flutter pub get && flutter test && flutter analyze / cargo test / go test ./... +git checkout "$START_BRANCH" +git branch -D "$PR_BRANCH" +git status --short # 空であることを確認 +``` + +- 依存インストール後にロックファイル等が変わる(`git status` に差分が出る)場合は,`git checkout -- .` で破棄してからブランチを戻す +- 検証結果の解釈: + - テスト+(あれば)ビルド/型チェック/リンタが全緑 → **Tier A** + - テストが無いがインストールとビルド/型チェックは通る → **Tier B** + - インストール自体が失敗/検証コマンドが特定できない → **Tier C** + - 赤 → 「CI 赤」と同じ扱いで報告(失敗したコマンドと要約を添える) + +## マージ (Merge) + +```bash +gh pr merge <番号> --merge --delete-branch # Git 規約どおりマージコミット +git checkout main && git pull origin main # ローカル main を追従(開始時のブランチが main でない場合は戻す) +``` + +- ブランチ保護(必須レビュー)で拒否された場合は,その PR を「マージ可と判定したが権限不足」として報告する +- `--delete-branch` が「既に削除済み」で失敗しても無視してよい(Dependabot 側の設定でブランチが自動削除されることがある) + +## Dependabot へのコメント指示 (Dependabot Commands) + +PR コメントで Dependabot を操作できる.本スキルが使ってよいのは次の 2 つだけ. + +```bash +gh pr comment <番号> --body "@dependabot rebase" # base に追従させる(競合・BEHIND のとき) +gh pr comment <番号> --body "@dependabot recreate" # PR を作り直させる(一時的なビルド失敗・壊れたブランチのとき) +``` + +- `@dependabot ignore this major version` / `@dependabot ignore this dependency` / `@dependabot close` は**人間が判断して投稿する**(本スキルは推奨として提示するだけ) + +## メジャー更新の影響分析 (Analyzing a Major Bump) + +報告に回す PR(`major`・`0.x` マイナー・`unknown`)は,人間が「そのままマージ」「`/implement` で追従」「見送り」を選べるだけの材料を揃える. + +1. **変更内容**: PR 本文の Release notes / Changelog / Commits 節から **Breaking changes** を抜き出す.本文に無ければ `gh api repos///releases` や CHANGELOG を参照する(取れなければ「リリースノート未確認」と明記する) +2. **利用箇所**: コードベース内で当該パッケージを import/呼び出している箇所を Grep で列挙し,破壊的変更に該当する API を使っているか確認する +3. **影響範囲と推奨**: + - 該当 API を使っていない/開発依存のみ → 「そのままマージ可(検証 Tier と根拠を添える)」 + - 該当 API を使っている → 「`/implement` で追従が必要(修正箇所の一覧)」 + - 互換性が取れない・移行コストが見合わない → 「見送り(`@dependabot ignore this major version` を人間が投稿)」 +4. `github-actions` のメジャー更新は workflow の入力・出力の変更点を確認する(CI が通っていれば「マージ可」でよい) + +## PR コメントの書式 (PR Comment Format) + +報告に回した PR には,通常モードで次の書式のコメントを 1 回だけ投稿する(先頭の HTML コメントは二重投稿防止のマーカー.削除しない). + +```markdown + +## /deps-update による分析 + +- **判定**: 自動マージ対象外({メジャー更新 / 0.x マイナー更新 / CI 赤 / 検証不能}) +- **更新**: `{pkg}` {A} → {B}({本番依存 / 開発依存},{security / version}) +- **検証**: {CI 緑 / ローカル検証緑 / ビルドのみ / 未検証} +- **破壊的変更**: {抜き出した要点,無ければ「記載なし」} +- **影響箇所**: {ファイル:行 の一覧,無ければ「該当 API の利用なし」} +- **推奨**: {そのままマージ可 / `/implement` で追従後にマージ / 見送り(`@dependabot ignore this major version`)} +``` + +## 台帳の書式 (Ledger Formats) + +いずれも `.claude/` 直下のローカル運用状態(`.gitignore` 対象).1 行 1 エントリ. + +- `.claude/deps-update-merged.md`: + - `- [merged] #<番号> | (グループは件数) | | | <検証: CI / ローカル / ビルドのみ> | <推奨する動作確認(無ければ -)> | <日付>` +- `.claude/deps-update-report.md`: + - `- [major] #<番号> | | <本番 / 開発> | <破壊的変更の要点> | <影響箇所> | <推奨> | <日付>` + - `- [ci-fail] #<番号> | | <失敗したチェック/コマンドと要約> | <推奨> | <日付>` + - `- [alert] ) | <重大度> | | <修正版 or 修正版なし> | | <推奨対応> | <日付>` + - `- [other] #<番号> | <内容(依存以外のファイル変更・unknown 規模 等)> | <推奨> | <日付>` +- `.claude/deps-update-skip.md`(ユーザーが編集する): + - `- #<番号> または | <理由> | <日付>` diff --git a/.claude/skills/setup/SKILL.md b/.claude/skills/setup/SKILL.md index c31e80a..a1715bb 100644 --- a/.claude/skills/setup/SKILL.md +++ b/.claude/skills/setup/SKILL.md @@ -137,6 +137,7 @@ CLAUDE.md を更新しました. GitHub リポジトリのセキュリティ設定(Dependabot alerts / security updates): {有効化済み / リポジトリ未作成のため未実施(ENV_03 のコマンドで有効化してください)} 依存バージョン更新(`.github/dependabot.yml`): {対象エコシステム一覧} を {更新頻度} で監視 +Dependabot が作る PR・alert は `/deps-update` で処理できます(安全な更新は自動マージ,メジャー更新等は分析付きで報告). 最初の実装ステップは `{ステップ名}` です.`/implement {タスク}` で開始できます. {team の場合: 「チーム運用の管理者初期設定(GitHub repo・CI 等)は GUIDE_03 を参照してユーザー側で実施してください.」}」 diff --git a/.gitignore b/.gitignore index aa42353..8ed3fac 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,11 @@ .claude/auto-audit-fixed.md .claude/auto-audit-skip.md +# /deps-update のローカル運用状態(マージ済み台帳・報告台帳・スキップ台帳) +.claude/deps-update-merged.md +.claude/deps-update-report.md +.claude/deps-update-skip.md + # -- プロジェクト立ち上げ時に有効化する(.claude/rules/git-conventions.md 参照) -- # .env # .env.* diff --git a/CLAUDE.md b/CLAUDE.md index 5c5aef5..d4b6132 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -19,6 +19,7 @@ - **例外**: 以下の無人運転ループはユーザー承認済みの例外として専用ブランチに自律コミットする.いずれも push・PR・マージ・`main` への操作はしない(取り込みは人間が `/commit push` 等で行う) - `/auto-refactor`(リファクタ/ドキュメント整理ループ)→ `refactor/` 専用ブランチ - `/auto-audit`(バグ/脆弱性の巡回監査ループ)→ `fix/` 専用ブランチ + - **例外(`main` へのマージ)**: `/deps-update` は,Dependabot が作成した依存更新 PR に限り,ゲート(メジャー更新でない・競合なし・CI 緑またはローカル検証緑)を満たすものを `gh pr merge` で `main` に取り込む(ユーザーが明示的に起動した時のみ.メジャー更新・CI 赤・PR が付かない alert は報告して人間が判断する) ### テンプレート同期 diff --git a/README.md b/README.md index bdbd720..edcf0a4 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ - `/implement <タスク>` — 実装パイプライン(コーディング → テスト → リファクタリング) - `/commit` / `/commit push` / `/commit merge` — コミット作成(`push` でプッシュと PR 作成まで,`merge` でマージ・プルまで) - `/auto-refactor` / `/auto-audit` — 無人運転ループ(リファクタ/ドキュメント整理,バグ/脆弱性の巡回監査).専用ブランチへ自律コミットし,push・PR・マージはしない +- `/deps-update` — Dependabot の依存更新 PR と alert を処理(メジャー更新でなく CI/ローカル検証が緑の PR は `main` に自動マージ,メジャー更新・CI 赤・修正版なし alert は影響分析付きで報告.`/deps-update report` で報告のみ) - `/sync-template` — テンプレートの最新変更を取り込む(プロジェクトで意図的に変えたファイルは `.claude/template-overrides.md` の台帳に登録しておくと,上書きせず方針に従ってマージ/保持される) - `/set-mode ` — 開発モードを切り替える(team 層ファイル・settings.json・CLAUDE.md・project-mode を一括整合) - `/task-create` / `/task-start` / `/task-handoff` — Issue ベースのタスク作成・着手・引継ぎ(solo / team 両モード共通) diff --git "a/docs/01_GUIDE/GUIDE_01_\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\347\253\213\343\201\241\344\270\212\343\201\222\343\203\225\343\203\255\343\203\274.md" "b/docs/01_GUIDE/GUIDE_01_\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\347\253\213\343\201\241\344\270\212\343\201\222\343\203\225\343\203\255\343\203\274.md" index 0ae90aa..5605c3b 100644 --- "a/docs/01_GUIDE/GUIDE_01_\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\347\253\213\343\201\241\344\270\212\343\201\222\343\203\225\343\203\255\343\203\274.md" +++ "b/docs/01_GUIDE/GUIDE_01_\343\203\227\343\203\255\343\202\270\343\202\247\343\202\257\343\203\210\347\253\213\343\201\241\344\270\212\343\201\222\343\203\225\343\203\255\343\203\274.md" @@ -23,7 +23,7 @@ | レイヤ | 対象 | 存在するモード | | --- | --- | --- | -| 共通層 | `GUIDE_01`・`GUIDE_02`,`.claude/rules/` のすべて,`.claude/agents/`,`.claude/template-overrides.md`(雛形),skills(`commit`(+ `reference.md`)・`implement`・`setup`(+ `reference.md`)・`sync-template`(+ `reference.md`)・`set-mode`・`auto-refactor`・`auto-audit`・`task-create`・`task-start`(+ `reference.md`)・`task-handoff`) | solo・team 両方 | +| 共通層 | `GUIDE_01`・`GUIDE_02`,`.claude/rules/` のすべて,`.claude/agents/`,`.claude/template-overrides.md`(雛形),skills(`commit`(+ `reference.md`)・`implement`・`setup`(+ `reference.md`)・`sync-template`(+ `reference.md`)・`set-mode`・`auto-refactor`・`auto-audit`・`deps-update`(+ `reference.md`)・`task-create`・`task-start`(+ `reference.md`)・`task-handoff`) | solo・team 両方 | | team 層 | `GUIDE_03`,`.claude/hooks/check_sync.sh`,`settings.json` の SessionStart 配線 | team のみ | - `.claude/rules/` はすべて共通層だが,進捗記録ルール(`progress-log`)だけは team モードで運用上**上書き**される(進捗は `CLAUDE.md`/`docs/PROGRESS.md` ではなく GitHub Issues と git 履歴で追う.GUIDE_03). @@ -57,7 +57,7 @@ - **人間が決めること**: 開発マシンの選定,クラウドサービスのアカウント作成,環境構築方法の選択 - **AI に依頼できること**: 環境構築手順書の作成,設定ファイルの生成,`.gitignore` の作成,Dockerfile や devcontainer.json 等の構築用ファイルの作成,GitHub リポジトリのセキュリティ設定・`.github/dependabot.yml` の生成(後述) - **GitHub リポジトリのセキュリティ設定**: GitHub の Settings → Code security にある **Dependabot alerts**(既知脆弱性の検出."Vulnerabilities" として表示される)と **Dependabot security updates** はリポジトリごとに既定で OFF のため,リポジトリを作成したら必ず有効化する.モードに関わらず `/setup` が `gh api` で有効化・検証する(コマンド・検証・トラブル対応は `.claude/skills/setup/reference.md`「GitHub リポジトリのセキュリティ設定」).`/setup` 時点でリポジトリが無い場合は,`ENV_03_管理者用環境構築手順.md` に転記した同じコマンドをリポジトリ作成後に実行する. -- **依存バージョン更新(Dependabot version updates)**: 上記とは別に,依存パッケージを定期的に最新化する PR を作らせるため,`/setup` が技術スタックに合わせて `.github/dependabot.yml` を必ず生成する(週 1 回・マイナー/パッチをまとめる・`[update]` プレフィックス.エコシステム対応表と雛形は `.claude/skills/setup/reference.md`「依存バージョン更新の設定」).Dependabot の更新 PR も通常の PR と同じく確認してからマージする. +- **依存バージョン更新(Dependabot version updates)**: 上記とは別に,依存パッケージを定期的に最新化する PR を作らせるため,`/setup` が技術スタックに合わせて `.github/dependabot.yml` を必ず生成する(週 1 回・マイナー/パッチをまとめる・`[update]` プレフィックス.エコシステム対応表と雛形は `.claude/skills/setup/reference.md`「依存バージョン更新の設定」).Dependabot が作る PR と alert の処理は `/deps-update` で行う(ゲートを満たす PR を自動マージし,メジャー更新等は分析付きで報告.GUIDE_02「コミットルール」の例外). - **成果物**: - `ENV_02_環境構築手順.md` — メンバーの参加時や環境の再構築時に使う手順 - `ENV_03_管理者用環境構築手順.md` — プロジェクト作成時に一度だけ行う初期設定(リポジトリ作成,GitHub リポジトリのセキュリティ設定,外部サービスの設定等) 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 91f9daf..42aff80 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" @@ -44,6 +44,8 @@ - `/auto-refactor`(リファクタ/ドキュメント整理ループ)→ `refactor/` 専用ブランチ - `/auto-audit`(バグ/脆弱性の巡回監査ループ.発見を裏取り後,再現テストで正しさを担保できるものだけ自動修正し,それ以外は台帳へ報告)→ `fix/` 専用ブランチ +※ **例外(Dependabot PR の取り込み)**: `/deps-update` は,Dependabot が作成した依存更新 PR に限り,ゲート(メジャー更新でない・競合なし・CI 緑またはローカル検証緑)を満たすものを `gh pr merge --merge` で `main` に取り込む.これは「Claude が `main` へマージする」唯一の承認済み例外であり,ユーザーが明示的に起動した時のみ動く.メジャー更新・CI 赤・PR が付かない alert は影響分析付きで報告し,人間が判断する(`.claude/skills/deps-update/SKILL.md`). + ## 進捗記録の運用ルール(CLAUDE.md / PROGRESS.md) 進捗記録(CLAUDE.md「開発進捗」・`docs/PROGRESS.md` の書き方)のルールは `.claude/rules/progress-log.md` に定義されている.該当ファイルを編集する際に自動で読み込まれる. diff --git "a/docs/01_GUIDE/GUIDE_03_\343\203\201\343\203\274\343\203\240\351\226\213\347\231\272\343\203\253\343\203\274\343\203\253.md" "b/docs/01_GUIDE/GUIDE_03_\343\203\201\343\203\274\343\203\240\351\226\213\347\231\272\343\203\253\343\203\274\343\203\253.md" index c26cdb0..7561097 100644 --- "a/docs/01_GUIDE/GUIDE_03_\343\203\201\343\203\274\343\203\240\351\226\213\347\231\272\343\203\253\343\203\274\343\203\253.md" +++ "b/docs/01_GUIDE/GUIDE_03_\343\203\201\343\203\274\343\203\240\351\226\213\347\231\272\343\203\253\343\203\274\343\203\253.md" @@ -86,6 +86,15 @@ - 機能 PR に混ぜず,専用 PR とする(「共有設定の扱い」参照). - 他メンバー 1 名の Approve を必須とする(セルフマージ不可). +### Dependabot の依存更新 PR (Dependabot PR) + +Dependabot が作成する依存更新 PR(security updates / version updates)は,人間が書いた PR ではないため上記の「`/implement` 完走」「Phase 1 動作確認」を満たせない.代わりに `/deps-update` のゲートを品質ゲートとする(`.claude/skills/deps-update/SKILL.md`). + +- **`/deps-update` がマージしてよいもの**: メジャー更新でなく,競合が無く,CI 緑(CI 未構築ならローカル検証緑)の PR.`gh pr merge --merge` で取り込む.これは「AI が `main` へマージする」唯一の例外である(GUIDE_02「コミットルール」). +- **人間が判断するもの**: メジャー更新(`0.x` のマイナー更新を含む),CI 赤,修正版の無い alert,Dependabot が PR を作れなかった alert.`/deps-update` が影響分析と推奨(そのままマージ/`/implement` で追従/`@dependabot ignore` で見送り)を PR コメントと完了報告に出すので,それを見て決める. +- 依存更新 PR は共有設定(`CLAUDE.md`・`.claude/`)を変更しないため,他メンバーの Approve は不要.`main` にブランチ保護(必須レビュー)を設定している場合は `/deps-update` はマージできないので,マージ可と判定した一覧を提示するにとどまり,人間がマージする. +- `/deps-update` を実行するのは原則 1 名(管理者またはその週の担当)とし,マージ後はチームに周知して全員が `git pull` する(直列運用のため,他メンバーの作業ブランチは次の rebase で追従する). + ### CI 構築までの暫定ゲート (Interim Gate) CI が未構築の間は「CI 緑」を以下で代替する.CI 構築後はこの節を削除する.