Summary
Fandhe-AI 組織標準の CI ガード一式(codex-review 導入 / AGENTS.md レビュー観点集 / 必須チェック集約ジョブ / branch protection ruleset・追加ガード)を対象リポジトリへ導入する。「リポジトリガード入れて」「CI ガード導入して」 「branch…
fandhe-ai/agent-cli-skills
Fandhe-AI 組織標準の CI ガード一式(codex-review 導? branch protection ruleset・追加ガード)を対象リポジトリへ導? 「branch protection セットアップ」「codex-review 導? 複数リポジトリへの一括適用にも対応。.claude/ 体系の初期セットアップは init-claude、既存体系の?
npx skills add fandhe-ai/agent-cli-skills --skill setup-repo-guards
Fandhe-AI 組織標準の CI ガード一式(codex-review 導入 / AGENTS.md レビュー観点集 / 必須チェック集約ジョブ / branch protection ruleset・追加ガード)を対象リポジトリへ導入する。「リポジトリガード入れて」「CI ガード導入して」 「branch…
Related neighbors and high-traction skills in the same topics — useful to compare before installing.
Helps users discover and install agent skills when they ask questions like "how do I do X", "fi…
3.3M installsBrowser automation CLI for AI agents. Use when the user needs to interact with websites, includ…
810.4K installsReview UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "chec…
617.3K installsBuild, deploy, evaluate, optimize, fine-tune, and manage Microsoft Foundry agents, models, and …
576.5K installsPrepare azd-based Azure projects for deployment: generates azure.yaml, infrastructure (Bicep/Te…
568.3K installsOther skills from fandhe-ai/agent-cli-skills · top by installs.
npx skills add fandhe-ai/agent-cli-skills
Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.
main
Parsed from SKILL.md frontmatter.
Files included with this skill beyond the listing page.
SKILL.md
17,027 B
SUMMARY.md
607 B
対象リポジトリへ組織標準の CI ガード一式を導入する。導入するのは次の 4 点で、 Step 1 → 4 の順に、各 Step を PR → CI 全 pass → レビュースレッド resolve → squash merge で確定させてから次へ進む。
ci-complete 等)この順序を守る理由: 「必須チェックに入れる集約ジョブが先に存在する」「AGENTS.md は PR の base コミット参照のため マージ後の次の PR から実効」という依存関係が、この順で自然に満たされる。
setup-repo-guards Fandhe-AI/my-repo public
setup-repo-guards Fandhe-AI/repo-a public Fandhe-AI/repo-b private
owner/repo)public / private)。runner 方針の分岐に使う(public は ubuntu ホステッド、private は self-hosted。codex 実行ジョブのみ self-hosted codex runner の例外)gh CLI がインストールされ、対象リポジトリの admin 権限で認証済みであること(command -v gh && gh auth status で確認)jq がインストールされていること(command -v jq で確認).github/workflows/codex-review.yml を wrapper として追加し、Fandhe-AI/actions の reusable workflow codex-review.yml を commit SHA 固定(@main 禁止)で参照する。
参照する SHA は下記のレビュー済み SHA 定数を使う。最新 main からの動的取得 (gh api repos/Fandhe-AI/actions/commits/main)は禁止する — 文字列上は commit SHA 固定でも、 導入のたびに未レビューの最新コードを取り込む「可動 ref の自動追従」と同じであり、 サプライチェーン対策(レビュー済み SHA 固定)を弱体化する(fandhe-frontend PR #1311 codex P1)。
# レビュー済み SHA 定数(内容精査済み。既存導入リポジトリ fandhe-frontend の
# .github/workflows/codex-review.yml が参照している SHA と同一)
sha="fed9c07d98367f77e5e2b63bca38843f46feee96"
定数の更新手順(新しい SHA を採用したくなった場合):
gh api "repos/Fandhe-AI/actions/compare/<旧SHA>...<新SHA>" または Web UI の compare で、 reusable workflow 本体(fork PR 拒否・fail-closed 検証・資格情報スキャン等)の変更内容を確認する
docs/codex-review-runner-exception.md と、既存導入リポジトリ(fandhe-frontend 等)の wrapper を参照して揃える
codex 実行ジョブのみ self-hosted codex runner の例外。post_feedback ジョブは資格情報に触れないため ubuntu-latest を明示する
CODEXHOMEDIR variable は設定しないcodex の既定 prompt は PR の base コミットの AGENTS.md をレビュー基準として読む。 リポジトリルートに日本語で新規作成する(既存があれば基準を弱めず不足観点を追記する)。
必須 3 観点を、必ず対象リポジトリ固有の具体項目に落とし込んで書く(別リポジトリ用の記述を流用しない):
加えて:
.claude/rules/ / 設計文書から抽出したリポジトリ固有観点を整理する(codex ジョブは P1 でも fail する)と矛盾させない**
.github/codex/prompts/review.md)が既にある場合は二重管理を避ける:観点の正は AGENTS.md、enforcement(完了判定・機械格上げ)の正は review.md という役割分担にし、 review.md へは AGENTS.md 読み取りの最小追記のみ行う
複数ジョブを持つ workflow には集約ジョブ(ci-complete 等)を追加する: 全ジョブを needs: に列挙し、if: always() を付け、toJSON(needs) を jq で判定する。
skipped の許容は「条件付きジョブ(if: を持つジョブ)」の明示リストに限定し、他ジョブは success のみ受理する(skipped 全許容は fail-open として codex に P1 指摘される)。 change detection ゲートがある場合はゲート出力に基づき「skip が正しい状況」でのみ skipped を受理する
permissions: {} を付け、「ジョブ追加時は needs への追加が必要」のコメントを書く(lint-docs / lint-docs-complete 等)が入った SHA まで参照をバンプすればチェック 1 件に集約できる
name: に # や「: 」を含む場合は必ずクォートする(未クォートだと API 報告名が途中で切れ、必須チェック名として不安定になる)
gh api -X PATCH repos/...): squash のみ(merge commit / rebase 禁止)、マージ後ブランチ自動削除、auto-merge 許可、squash タイトル = PRTITLE / 本文 = PRBODY
main-protection(target: branch、~DEFAULTBRANCH、enforcement: active、bypassactors 空):- deletion 禁止 / nonfastforward(force push 禁止) - pullrequest: requiredapprovingreviewcount 0(人間 approver 不在の AI 運用。レビューゲートは codex の必須チェックで担保)・requiredreviewthreadresolution true・allowedmergemethods ["squash"] - requiredstatuschecks(strict false は必須。true にすると 1 件マージするたびに他の open PR の base が陳腐化し、implement-issue-tree の並列ランが収束しなくなる。strict は鮮度制御であって bypass 不能性の制御ではないため、false でもクライアント側自動マージの G0 は通過する。 詳細は .claude/rules/ruleset-policy.md): [<集約ジョブ>, (集約できない別 workflow の常時チェック), codex-review / codex] の最小集合 - 自動マージ(implement-issue-tree の autoMerge: true)を使う場合、requiredstatuschecks の 各エントリに発行元 App の integrationid を束縛する(未束縛だと G0 が issuer-unbound で辞退する)。 ruleset を PUT で更新した後は必ず下記「検証」の 3 軸スイープを実行する(PUT は requiredstatuschecks.parameters を丸ごと置換するため束縛が落ち得る。複数リポへ一括適用する 場合は全リポで実行する)
- 直近 PR の check runs で「常に報告される」チェックのみ選ぶ。workflow レベル paths フィルタで 実行されないことがあるチェックは入れない(マージが永久ブロックされる)。ジョブレベル条件の skipped は可 - Cursor Bugbot 等の外部アプリ、codex-review / postfeedback は必須にしない - チェック名が変わる PR をマージするときは、マージ前に ruleset を新チェック名へ PUT で置換する (旧名のままだと CI 全 pass でも「Expected」のまま BLOCKED になる)。PUT は GET した JSON の requiredstatus_checks のみ差し替えて送る
(public なら)private vulnerability reporting / タグ運用があれば tag ruleset(deletion・nonfastforward)/ GITHUB_TOKEN 既定権限 read 化(全 workflow の permissions: 明示を確認してから)/ Actions の PR 作成・承認許可は自動 PR 運用(update-external 等)が無ければ false / (private なら)forking 禁止 / 未使用の wiki・projects 無効化
各 Step の完了は以下で確認する:
repo="Fandhe-AI/<REPO>"
# Step 1: wrapper の存在と SHA 固定(@main が残っていないこと)
grep -n "uses: Fandhe-AI/actions" .github/workflows/codex-review.yml
# Step 2: AGENTS.md の存在と P0/P1/P2 定義
grep -n "P0\|P1\|P2" AGENTS.md | head
# Step 3: 直近 PR の check runs で集約ジョブが報告されること
gh pr checks "$(gh pr list --repo "${repo}" --state merged --limit 1 --json number --jq '.[0].number')" --repo "${repo}"
# Step 4: ruleset とマージ設定
gh api "repos/${repo}/rulesets" --jq '.[] | {id, name, enforcement}'
gh api "repos/${repo}" --jq '{allow_squash_merge, allow_merge_commit, allow_rebase_merge, delete_branch_on_merge, allow_auto_merge}'
# Step 4-a: 一括更新後の 3 軸スイープ(strict / bypass_actors / integration_id 残存)
# PUT した ruleset 単体ではなく branch target の全 ruleset を掃く(org 継承は source_type でルーティング)。
# コマンド全文・判定表は .claude/rules/ruleset-policy.md の「一括更新後の検証」節を参照
org="${repo%%/*}"
gh api "repos/${repo}/rulesets" \
--jq '.[] | select(.target == "branch") | [(.id|tostring), .name, (.source_type // "unknown")] | @tsv' |
while IFS=$'\t' read -r id name src; do
case "${src}" in
Repository) path="repos/${repo}/rulesets/${id}" ;;
Organization) path="orgs/${org}/rulesets/${id}" ;;
*) echo "UNKNOWN source_type: ${name} (${src}) — 手動確認"; continue ;;
esac
gh api "${path}" --jq '{
name: .name, enforcement: .enforcement, bypass: (.bypass_actors | length),
strict: ([.rules[]? | select(.type=="required_status_checks") | .parameters.strict_required_status_checks_policy] | first),
total: ([.rules[]? | select(.type=="required_status_checks") | .parameters.required_status_checks[]?] | length),
unbound: [.rules[]? | select(.type=="required_status_checks") | .parameters.required_status_checks[]? | select(.integration_id == null) | .context]
}'
done
# Step 4-b: classic branch protection を別枠で掃く(defaultBranchRef 解決・@uri エンコード・HTTP status 分岐)
db=$(gh repo view "${repo}" --json defaultBranchRef --jq '.defaultBranchRef.name')
db_enc=$(printf '%s' "${db}" | jq -sRr '@uri')
code=$(gh api -i "repos/${repo}/branches/${db_enc}/protection" 2>/dev/null | awk 'NR==1{print $2}')
case "${code}" in
200) gh api "repos/${repo}/branches/${db_enc}/protection" --jq \
'{strict: (.required_status_checks.strict // "none"), unbound: [.required_status_checks.checks[]? | select(.app_id == null) | .context]}' ;;
404) echo "classic BP なし(${db})" ;;
*) echo "判定不能 (HTTP ${code:-?}) — Administration: read 権限を確認。green と扱わない" ;;
esac
最終確認として、導入後に小さな PR を 1 件流し、codex-review の実行・必須チェックの報告・ squash merge のみ許可・スレッド resolve 必須が実際に効いていることを観察する。
Step ごとの PR 番号、AGENTS.md の観点構成、ruleset の最終必須チェック一覧、適用できなかった項目 (理由付き)を表でまとめて報告する。
| 問題 | 回避策 |
|---|---|
| 集約ジョブの skipped 全許容が fail-open として codex に P1 指摘される | Step 3: skipped 許容を条件付きジョブの明示リストに限定する |
| チェック名変更 PR が CI 全 pass でも BLOCKED(ruleset が旧名のまま「Expected」待ち) | Step 4: マージ前に ruleset を新チェック名へ PUT で置換する |
未クォート name: の # 以降が切れて API 報告名が不安定になる |
Step 3: name に # や「: 」を含む場合はクォート必須 |
| paths フィルタ付き workflow のチェックを必須にするとマージが永久ブロックされる | Step 4: 常に報告されるチェックのみ必須化する |
| 参考ファイルの取り違え(別リポジトリ用 AGENTS.md の混入)を codex が検出 | Step 2: 対象リポジトリ固有の具体項目に落とし込む |
| AGENTS.md の P1 定義と CI ゲート実挙動(P1 でも fail)の矛盾を codex が指摘 | Step 2: P1 定義をゲート実挙動と矛盾させない |
| GITHUB_TOKEN read 化で暗黙 write 依存の workflow が壊れる | Step 4: 全 workflow の permissions 明示を確認してから適用する |
ruleset を PUT したら integration_id 束縛が落ち、自動マージが静かに止まる(strict と bypass だけ見ると全 green に見える) |
Step 4-a: PUT 後に 3 軸スイープ(select(.integration_id==null))を実行する |
| 旧 ruleset / classic BP の掃き漏らしで未束縛・strict=true が残る | Step 4-a/4-b: 全 branch ruleset を列挙して掃き、classic BP は defaultBranchRef 解決 + status 分岐で別枠確認する |
| AGENTS.md に自動マージの G0 契約を書く際 strict を要件として列挙し、実装より強い契約が codex P0 の根拠になる | Step 2: G0 契約を書くなら strict は「意図的な非要件」と明記する(.claude/rules/ruleset-policy.md) |
--no-verify は使用しない"${var}" 形式でクォートするスレッドへ対応内容を返信して resolve してからマージする