From 881af49d26e2613b05a6fb0625b533589e584bcc Mon Sep 17 00:00:00 2001 From: Jiro Date: Sun, 2 Aug 2026 11:25:14 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20Git=20=E6=93=8D=E4=BD=9C=E3=82=92?= =?UTF-8?q?=20grape=20=E3=81=AB=E7=A7=BB=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit safe-git-push を廃止し、push と rebase の手順・権限設定を grape に統一する。grape-usage external skill を Codex と Claude の配布対象へ追加した。\n\n検証: make deploy-dry-run\n検証: GOMODCACHE=/tmp/gomodcache GOCACHE=/tmp/gocache GOTOOLCHAIN=local go test ./... --- AGENTS.md | 2 +- README.md | 2 +- claude/CLAUDE.md | 7 ++- claude/settings.json | 9 ++- codex/AGENTS.md | 7 ++- codex/README.md | 1 - codex/bin/safe-git-push | 57 ------------------- codex/rules/allow.rules | 8 +-- .../skills/internal/beautify-commit/SKILL.md | 3 +- .../references/split-workflows.md | 41 +------------ codex/skills/internal/cmd-create-pr/SKILL.md | 11 ++-- .../internal/cmd-create-pr/evals/evals.json | 4 +- .../internal/role-gardener-playbook/SKILL.md | 11 ++-- docs/skill-library.md | 5 +- external-skills.json | 10 ++++ 15 files changed, 52 insertions(+), 126 deletions(-) delete mode 100755 codex/bin/safe-git-push diff --git a/AGENTS.md b/AGENTS.md index 5ff2ceb..f3b75e8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -58,7 +58,7 @@ Codex / Claude 向けの agent、skill、設定、プロンプトを管理し、 ## ブランチ運用 -- 作業ブランチをデフォルトブランチの最新状態へ追従させるときは、merge ではなく rebase を使用します。 +- 作業ブランチをデフォルトブランチの最新状態へ追従させるときは、merge や `git rebase` ではなく `grape rebase` を使用します。 ## 配布時の確認 diff --git a/README.md b/README.md index adb95a7..ea05993 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Codex / Claude などの AI エージェントに配布するルール、プロ - `make deploy` で `deploy.json` と `external-skills.json` に基づいて設定とスキルを配置します。 `make deploy` は Codex 用の補助コマンドも `~/.codex/bin` に配置します。 -`safe-git-push` は agent が prompt なしで使うための安全な `git push` wrapper です。 +push と rebase には、ポリシーに基づいて Git 操作を制限する `grape` を使います。 `safe-gh-edit` は自分が作成した PR / Issue だけを prompt なしで編集するための `gh pr edit` / `gh issue edit` wrapper です。 `safe-local-curl` は localhost / loopback / private address 宛ての確認だけを prompt なしで行うための安全な `curl` wrapper です。 diff --git a/claude/CLAUDE.md b/claude/CLAUDE.md index f2fa8a9..f5dcb8f 100644 --- a/claude/CLAUDE.md +++ b/claude/CLAUDE.md @@ -37,13 +37,14 @@ KPI やカバレッジ目標が与えられたら、達成するまで試行す ## ブランチ運用 -- 作業ブランチをデフォルトブランチの最新状態へ追従させるときは、merge ではなく rebase を使用します。 +- 作業ブランチをデフォルトブランチの最新状態へ追従させるときは、merge や `git rebase` ではなく `grape rebase` を使用します。 ## コマンド実行確認 - prompt なしで実行できるのは、許可済みルールに合致し、実行内容と影響範囲が明確なコマンドだけです。 - 破壊的操作、外部送信、認証情報や設定の変更、履歴改変、実行先が曖昧なコマンドは、実行前にユーザーへ確認します。 -- `git push` や `git push -f` は直接実行しません。prompt なしで push する場合は、引数なしの `~/.codex/bin/safe-git-push` を使います。 -- `~/.codex/bin/safe-git-push` が拒否した場合やコマンドが見つからない場合は、拒否理由を確認してからユーザーに方針を確認します。 +- `git push` や `git push -f` は直接実行せず、`grape push` を使います。 +- rebase の開始には `git rebase` を直接使わず、`grape rebase` を使います。競合後の継続、中止、スキップに限り、`git rebase --continue`、`git rebase --abort`、`git rebase --skip` を使えます。 +- `grape` が拒否した場合やコマンドが見つからない場合は Git コマンドへ自動的にフォールバックせず、拒否理由を確認してからユーザーに方針を確認します。 - `gh pr edit` や `gh issue edit` は直接実行しません。prompt なしで自分が作成した PR / Issue を編集する場合は、`~/.codex/bin/safe-gh-edit [gh edit flags...]` を使います。 - `~/.codex/bin/safe-gh-edit` が拒否した場合やコマンドが見つからない場合は、拒否理由を確認してからユーザーに方針を確認します。 - curl は localhost / loopback / Docker network 内の private address 宛てなら prompt なしで実行可能 diff --git a/claude/settings.json b/claude/settings.json index f3621d2..ab4b2d3 100644 --- a/claude/settings.json +++ b/claude/settings.json @@ -72,8 +72,11 @@ "Bash(python3 -m pytest *)", "Bash(mv *)", "Bash(docker *)", - "Bash(safe-git-push)", - "Bash(~/.codex/bin/safe-git-push)", + "Bash(grape)", + "Bash(grape *)", + "Bash(git rebase --continue)", + "Bash(git rebase --abort)", + "Bash(git rebase --skip)", "Bash(safe-gh-edit *)", "Bash(~/.codex/bin/safe-gh-edit *)", "Bash(safe-local-curl *)", @@ -82,6 +85,8 @@ "ask": [ "Bash(git push)", "Bash(git push *)", + "Bash(git rebase)", + "Bash(git rebase *)", "Bash(git reset --hard)", "Bash(git reset --hard *)", "Bash(git worktree remove *)", diff --git a/codex/AGENTS.md b/codex/AGENTS.md index 33fae48..321fad3 100644 --- a/codex/AGENTS.md +++ b/codex/AGENTS.md @@ -34,13 +34,14 @@ KPI やカバレッジ目標が与えられたら、達成するまで試行す ## ブランチ運用 -- 作業ブランチをデフォルトブランチの最新状態へ追従させるときは、merge ではなく rebase を使用します。 +- 作業ブランチをデフォルトブランチの最新状態へ追従させるときは、merge や `git rebase` ではなく `grape rebase` を使用します。 ## コマンド実行確認 - prompt なしで実行できるのは、許可済みルールに合致し、実行内容と影響範囲が明確なコマンドだけです。 - 破壊的操作、外部送信、認証情報や設定の変更、履歴改変、実行先が曖昧なコマンドは、実行前にユーザーへ確認します。 -- `git push` や `git push -f` は直接実行しません。prompt なしで push する場合は、引数なしの `~/.codex/bin/safe-git-push` を使います。 -- `~/.codex/bin/safe-git-push` が拒否した場合やコマンドが見つからない場合は、拒否理由を確認してからユーザーに方針を確認します。 +- `git push` や `git push -f` は直接実行せず、`grape push` を使います。 +- rebase の開始には `git rebase` を直接使わず、`grape rebase` を使います。競合後の継続、中止、スキップに限り、`git rebase --continue`、`git rebase --abort`、`git rebase --skip` を使えます。 +- `grape` が拒否した場合やコマンドが見つからない場合は Git コマンドへ自動的にフォールバックせず、拒否理由を確認してからユーザーに方針を確認します。 - `gh pr edit` や `gh issue edit` は直接実行しません。prompt なしで自分が作成した PR / Issue を編集する場合は、`~/.codex/bin/safe-gh-edit [gh edit flags...]` を使います。 - `~/.codex/bin/safe-gh-edit` が拒否した場合やコマンドが見つからない場合は、拒否理由を確認してからユーザーに方針を確認します。 - curl は外部アクセスを避けるため、prompt なしで実行する場合は `~/.codex/bin/safe-local-curl` を使います。 diff --git a/codex/README.md b/codex/README.md index 644ff35..8a9b3ba 100644 --- a/codex/README.md +++ b/codex/README.md @@ -43,7 +43,6 @@ commands Codex CLI から prompt なしで実行させる補助コマンドを配置します。 -- `safe-git-push`: 引数なし専用の安全な push wrapper。`main` / `master` / detached HEAD / 不正な branch / 複数 push URL を拒否し、`git push origin HEAD:` だけを実行します。 - `safe-gh-edit`: 自分が作成した PR / Issue だけを編集できる `gh pr edit` / `gh issue edit` wrapper。対象の author と認証中の GitHub user が一致しない場合は拒否します。 - `safe-local-curl`: localhost / loopback / private address 宛ての URL だけを実行できる `curl` wrapper。よく使う読み取り系オプションだけを許可し、外部 URL や複数 URL を拒否します。 diff --git a/codex/bin/safe-git-push b/codex/bin/safe-git-push deleted file mode 100755 index c373e8b..0000000 --- a/codex/bin/safe-git-push +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh -set -eu - -die() { - printf 'safe-git-push: %s\n' "$*" >&2 - exit 1 -} - -if [ "$#" -ne 0 ]; then - die "arguments are not allowed; run safe-git-push without options" -fi - -command -v git >/dev/null 2>&1 || die "git command not found" - -branch=$(git symbolic-ref --quiet --short HEAD 2>/dev/null) || - die "current HEAD is detached or not in a git repository" - -case "$branch" in - main | master) - die "refusing to push protected branch: $branch" - ;; - -*) - die "refusing to push branch that starts with '-': $branch" - ;; -esac - -git check-ref-format --branch "$branch" >/dev/null 2>&1 || - die "invalid branch name: $branch" - -pushurls=$(git config --get-all remote.origin.pushurl || true) -pushurl_count=$(printf '%s\n' "$pushurls" | sed '/^$/d' | wc -l | tr -d ' ') - -if [ "$pushurl_count" -gt 1 ]; then - die "refusing to push because remote.origin.pushurl has multiple values" -fi - -if [ "$pushurl_count" -eq 1 ]; then - origin_url=$pushurls -else - urls=$(git config --get-all remote.origin.url || true) - url_count=$(printf '%s\n' "$urls" | sed '/^$/d' | wc -l | tr -d ' ') - - if [ "$url_count" -eq 0 ]; then - die "remote origin is not configured" - fi - if [ "$url_count" -gt 1 ]; then - die "refusing to push because remote.origin.url has multiple values" - fi - - origin_url=$urls -fi - -printf 'safe-git-push: branch: %s\n' "$branch" >&2 -printf 'safe-git-push: origin: %s\n' "$origin_url" >&2 -printf 'safe-git-push: running: git push origin HEAD:%s\n' "$branch" >&2 - -exec git push origin "HEAD:${branch}" diff --git a/codex/rules/allow.rules b/codex/rules/allow.rules index 3f7a4e5..19aabf5 100644 --- a/codex/rules/allow.rules +++ b/codex/rules/allow.rules @@ -73,9 +73,9 @@ prefix_rule( ) prefix_rule( - pattern = ["git", "rebase"], + pattern = ["git", "rebase", ["--continue", "--abort", "--skip"]], decision = "allow", - justification = "rebase はローカルブランチの履歴整理で通常安全" + justification = "grape rebase の競合後に継続、中止、スキップするため" ) prefix_rule( @@ -97,9 +97,9 @@ prefix_rule( ) prefix_rule( - pattern = ["safe-git-push"], + pattern = ["grape"], decision = "allow", - justification = "safe-git-push validates branch and remote before pushing" + justification = "grape provides policy-gated Git and worktree operations" ) prefix_rule( diff --git a/codex/skills/internal/beautify-commit/SKILL.md b/codex/skills/internal/beautify-commit/SKILL.md index 65d5a88..31e876a 100644 --- a/codex/skills/internal/beautify-commit/SKILL.md +++ b/codex/skills/internal/beautify-commit/SKILL.md @@ -29,7 +29,8 @@ description: Git リポジトリで、ベースブランチまたは残したい - 基準 ref が未指定の場合、デフォルトブランチでよいか yes/no で確認してから進める。 - 履歴を書き換える操作をするときは、対象 branch と対象 commit 範囲を明確にする。 - push 済み、共有済み、PR 作成済みの履歴を書き換える場合は、実行前にユーザー確認を取る。 -- `git reset --hard`、`git rebase -i`、`git commit --amend`、`git push --force` は、必要性と影響を説明してから使う。 +- `git reset --hard`、`git commit --amend`、`git push --force` は、必要性と影響を説明してから使う。 +- `git rebase -i` は使わない。interactive rebase が必要な整理は grape が対応するまで実行せず、制約をユーザーへ報告する。 - 分割作業の前に、可能なら `backup/-before-split-` のようなバックアップ branch を作る。 - 読んでいない差分を stage しない。`git add .` ではなく、ファイル単位または patch 単位で stage する。 - 分割後は、それぞれの commit が単独で目的を説明できるか確認する。 diff --git a/codex/skills/internal/beautify-commit/references/split-workflows.md b/codex/skills/internal/beautify-commit/references/split-workflows.md index 73be11b..bdbb338 100644 --- a/codex/skills/internal/beautify-commit/references/split-workflows.md +++ b/codex/skills/internal/beautify-commit/references/split-workflows.md @@ -89,48 +89,11 @@ git reset ## 古い commit を分割する -直近ではない commit を分割する場合は、interactive rebase で対象 commit を `edit` にする。 - -```bash -git branch backup/-before-split- -git rebase -i ^ -``` - -rebase todo で分割したい commit を `edit` に変更する。 -停止したら次を実行する。 - -```bash -git reset HEAD^ -``` - -変更単位ごとに stage / commit し、分割が終わったら次を実行する。 - -```bash -git rebase --continue -``` - -注意: - -- rebase 中に conflict が起きたら、差分を読み、解消後に `git add `、`git rebase --continue` を実行する。 -- conflict 解消で無関係な変更を混ぜない。 -- rebase を中止する必要がある場合は `git rebase --abort` を使えるが、実行前に現在の状態を確認する。 +直近ではない commit の分割には interactive rebase が必要だが、`grape rebase` は interactive mode をサポートしていない。`git rebase -i` へフォールバックせず、grape が対応するまでこの操作は実行しない。対象範囲と必要な操作を報告して終了する。 ## commit を並べ替えたり統合したりしながら分割する -複数 commit の一部を統合、一部を分割、一部を並べ替える場合は、interactive rebase を使う。 - -使う操作: - -- `pick`: commit をそのまま残す。 -- `reword`: message だけ変更する。 -- `edit`: commit の中身を変更、分割する。 -- `squash` / `fixup`: 前の commit に統合する。 -- 行の順序変更: commit 順を変更する。 - -注意: - -- 並べ替えは依存関係を壊しやすい。build や test が通る順序か確認する。 -- 同じファイルの近い行を複数 commit が触っている場合、conflict が増える可能性がある。 +複数 commit の一部を統合、一部を分割、一部を並べ替える操作にも interactive rebase が必要になる。`git rebase -i` へフォールバックせず、grape が対応するまで実行しない。 ## 安全確認 diff --git a/codex/skills/internal/cmd-create-pr/SKILL.md b/codex/skills/internal/cmd-create-pr/SKILL.md index bafad1e..a725e0d 100644 --- a/codex/skills/internal/cmd-create-pr/SKILL.md +++ b/codex/skills/internal/cmd-create-pr/SKILL.md @@ -1,6 +1,6 @@ --- name: cmd-create-pr -description: GitHub Pull Request を安全な手順で作成または更新するときに使う。ユーザーが「PR 作って」「PR 出して」「pull request 作成して」「この変更を PR にして」「pr を出す手順を進めて」などを依頼した場合は必ず使う。差分確認、検証、commit、最新 base branch への追従、role-reviewer による PR 前レビュー、High 指摘の自動対応、safe-git-push、PR description 作成、gh pr create / edit までの順序を整理し、未確認の変更や直接 git push を避ける。 +description: GitHub Pull Request を安全な手順で作成または更新するときに使う。ユーザーが「PR 作って」「PR 出して」「pull request 作成して」「この変更を PR にして」「pr を出す手順を進めて」などを依頼した場合は必ず使う。差分確認、検証、commit、最新 base branch への追従、role-reviewer による PR 前レビュー、High 指摘の自動対応、grape push、PR description 作成、gh pr create / edit までの順序を整理し、未確認の変更や直接 git push を避ける。 --- # Create PR @@ -16,8 +16,9 @@ GitHub Pull Request を出す前後の作業を、安全で再現しやすい手 - PR は「読んだ差分」「必要な検証」「意図が分かる commit」「レビューしやすい description」が揃ってから作る。 - ユーザーの未確認変更を勝手に commit、push、PR に含めない。 - PR 作成前に `git fetch origin` で base branch を更新し、head branch を最新 base に追従させる。古い base のままレビュー、push、PR 作成を進めない。 -- `git push` は直接実行しない。prompt なしで push する場合は、引数なしの `~/.codex/bin/safe-git-push` を使う。 -- `safe-git-push` が拒否した場合や見つからない場合は、拒否理由を確認してユーザーに方針を確認する。 +- `git push` は直接実行せず、`grape push` を使う。 +- rebase の開始には `git rebase` を直接使わず、`grape rebase` を使う。競合後の継続、中止、スキップには `git rebase --continue`、`git rebase --abort`、`git rebase --skip` を使える。 +- `grape` が拒否した場合や見つからない場合は Git コマンドへ自動的にフォールバックせず、拒否理由を確認してユーザーに方針を確認する。 - 既存 PR がある場合は、新規作成ではなく更新を検討する。 - PR を新規作成または更新する前に `$role-reviewer` で差分をレビューし、High severity の指摘は PR 作成前に自動対応する。 - PR 本文を作るときは `$format-pr-description` を使う。 @@ -62,13 +63,13 @@ git fetch origin - `git merge-base --is-ancestor origin/ HEAD` が成功するなら、head は最新 base に追従済み。 - 成功しない場合は、まず `git log --oneline HEAD..origin/` と `git log --oneline origin/..HEAD` で base 側と head 側の差分を確認する。 - current branch に独自 commit がない場合だけ、`git merge --ff-only origin/` で fast-forward してよい。 - - current branch に独自 commit がある場合は、merge commit 作成、rebase、作業の積み直しのどれを使うかユーザーへ確認する。確認なしに rebase や merge commit を作らない。 + - current branch に独自 commit がある場合は、merge commit 作成、`grape rebase`、作業の積み直しのどれを使うかユーザーへ確認する。確認なしに rebase や merge commit を作らない。 7. 追従後に変更内容に合う検証を実行する。文書だけの変更なら、Markdown のリンク、見出し、差分確認で十分な場合がある。 8. `git log --oneline ..HEAD` と `git diff --stat ...HEAD` で PR 差分を確認する。 9. `$role-reviewer` で PR 差分をレビューする。レビュー対象は `...HEAD` の差分、実行済み検証、未コミット変更の有無、最新 base への追従状況。 10. High severity の指摘がある場合は、PR 作成前に自動で対応する。対応後は必要な検証を再実行し、必要に応じて `$cmd-commit` で追加 commit を作る。 11. High 指摘が残っていないことを確認するまで `$role-reviewer` の確認を繰り返す。 -12. `~/.codex/bin/safe-git-push` で current branch を push する。 +12. `grape push` で current branch を push する。 13. `$format-pr-description` で PR description を作る。 14. 既存 PR がなければ `gh pr create`、既存 PR があれば `gh pr edit` で description を更新する。 15. `gh pr view` で URL、base、head、state を確認する。 diff --git a/codex/skills/internal/cmd-create-pr/evals/evals.json b/codex/skills/internal/cmd-create-pr/evals/evals.json index 333fde3..3dcfb78 100644 --- a/codex/skills/internal/cmd-create-pr/evals/evals.json +++ b/codex/skills/internal/cmd-create-pr/evals/evals.json @@ -4,14 +4,14 @@ { "id": 1, "prompt": "この変更を PR にして。まだ commit してない差分があるはず", - "expected_output": "git status と diff を確認し、PR に含める差分を読んだうえで cmd-commit を使って commit する。PR 作成前に git fetch origin で base branch を最新化し、head が最新 base を含むか確認する。追従できていない場合は確認なしに rebase や merge commit を作らず、方針を確認する。検証、role-reviewer による PR 前レビュー、High 指摘があれば自動対応と再レビュー、safe-git-push、format-pr-description、gh pr create の順に進める。未確認の unrelated changes は含めない。", + "expected_output": "git status と diff を確認し、PR に含める差分を読んだうえで cmd-commit を使って commit する。PR 作成前に git fetch origin で base branch を最新化し、head が最新 base を含むか確認する。追従できていない場合は確認なしに grape rebase や merge commit を実行せず、方針を確認する。検証、role-reviewer による PR 前レビュー、High 指摘があれば自動対応と再レビュー、grape push、format-pr-description、gh pr create の順に進める。未確認の unrelated changes は含めない。", "files": [], "should_fire": true }, { "id": 2, "prompt": "PR 出して。push もお願い", - "expected_output": "直接 git push せず、現在の branch / remote / base / 既存 PR の有無を確認し、必要な commit を済ませる。PR 作成前に git fetch origin で base branch を最新化し、head が最新 base を含むか確認する。追従できていない場合は確認なしに rebase や merge commit を作らない。検証と role-reviewer での PR 前レビューを行い、High 指摘があれば自動対応して再検証・再レビューし、High が残っていない状態で引数なしの ~/.codex/bin/safe-git-push を使う。PR 作成後に URL、base 追従状況、検証結果、レビュー結果を報告する。", + "expected_output": "直接 git push せず、現在の branch / remote / base / 既存 PR の有無を確認し、必要な commit を済ませる。PR 作成前に git fetch origin で base branch を最新化し、head が最新 base を含むか確認する。追従できていない場合は確認なしに grape rebase や merge commit を実行しない。検証と role-reviewer での PR 前レビューを行い、High 指摘があれば自動対応して再検証・再レビューし、High が残っていない状態で grape push を使う。PR 作成後に URL、base 追従状況、検証結果、レビュー結果を報告する。", "files": [], "should_fire": true }, diff --git a/codex/skills/internal/role-gardener-playbook/SKILL.md b/codex/skills/internal/role-gardener-playbook/SKILL.md index b018282..a888d51 100644 --- a/codex/skills/internal/role-gardener-playbook/SKILL.md +++ b/codex/skills/internal/role-gardener-playbook/SKILL.md @@ -13,9 +13,9 @@ Git リポジトリと GitHub 上のリソースに対して、依頼された - `git clone` で指定されたリポジトリを取得する。 - `git checkout` や `git switch` でブランチを作成、切り替えする。 -- `git fetch` と、指定された `git pull --ff-only` または `git pull --rebase` でリモートの変更を取得する。 -- `git push` でローカルの変更をリモートへ反映する。 -- `git rebase` で指定されたブランチの履歴を整理する。 +- `git fetch` と、指定された `git pull --ff-only` でリモートの変更を取得する。 +- `grape push` でローカルの変更をリモートへ反映する。 +- `grape rebase` でポリシーが許可する現在のブランチを指定された upstream へ rebase する。 - `git worktree` で作業ディレクトリを作成、一覧、移動、修復、削除する。 - `git status`、`git log`、`git diff`、`git branch`、`git remote` などでリポジトリの状態を取得する。 - `gh repo`、`gh pr`、`gh issue` などで GitHub の情報を取得する。 @@ -45,9 +45,10 @@ Git リポジトリと GitHub 上のリソースに対して、依頼された - 未コミット変更、未追跡ファイル、未 push commit を上書き、削除、混入させない。 - 対象が曖昧な clone、checkout、rebase、worktree 削除、PR 更新は実行しない。 - force push、履歴改変、branch / worktree 削除などの破壊的操作は、明示的な依頼と事前確認なしに実行しない。 -- plain `git pull` は使わない。repository のルールまたは依頼で `--ff-only` / `--rebase` を特定できない場合は実行せず、方針を確認する。 +- plain `git pull` や `git pull --rebase` は使わない。fast-forward 以外の追従では `git fetch` 後に `grape rebase` を使う。 - デフォルトブランチへの追従では、repository のルールに従う。rebase が指定されている場合は merge commit を作らない。 -- push は、適用可能な安全 wrapper または明示的な承認を必須とする。安全 wrapper が指定されている場合は必ず使用する。 +- push は `grape push` を使う。rebase の開始は `grape rebase` を使い、競合後の継続、中止、スキップだけ Git を直接使える。 +- `grape` が拒否した場合や見つからない場合は Git コマンドへ自動的にフォールバックせず、拒否理由と必要な入力を依頼元へ返す。 - PR / Issue の更新は repository の安全 wrapper が指定されていれば必ず使用する。 - PR 作成または更新に必要な title や body が支給されていない場合、自作せず依頼元へ返す。 - GitHub への外部送信、認証や設定の変更は、適用される承認ルールを守る。 diff --git a/docs/skill-library.md b/docs/skill-library.md index d3fae4b..6222285 100644 --- a/docs/skill-library.md +++ b/docs/skill-library.md @@ -21,11 +21,11 @@ skill 間の明示的な併用・優先関係は [docs/skill-dependency-map.md]( | `agent-retro` | 直近のエージェント作業を振り返り、再利用可能なルールへ反映する。 | 遠回りした知見を skill、AGENTS.md、CLAUDE.md などに残したいとき。 | | `cmd-batch` | 広範囲の調査、編集、検証を複数エージェントや並列作業へ分割する。 | 大規模変更、横断調査、複数担当への分担、統合手順の整理が必要なとき。 | | `cmd-commit` | 変更内容を確認し、適切な粒度とメッセージで安全に Git commit を作成する。 | commit 作成を依頼されたとき。未確認の変更や unrelated changes を含めず、stage 対象と message を整理する。 | -| `cmd-create-pr` | GitHub Pull Request を安全な手順で作成または更新する。 | PR 作成、PR 提出、pull request 作成を依頼されたとき。差分確認、検証、commit、role-reviewer による PR 前レビュー、High 指摘の自動対応、safe-git-push、PR description 作成、gh pr create / edit の順序を整理する。 | +| `cmd-create-pr` | GitHub Pull Request を安全な手順で作成または更新する。 | PR 作成、PR 提出、pull request 作成を依頼されたとき。差分確認、検証、commit、role-reviewer による PR 前レビュー、High 指摘の自動対応、grape push、PR description 作成、gh pr create / edit の順序を整理する。 | | `cmd-dispatch-agent` | 指定された agent を起動し、結果を待たずにタスクを投げる。 | ユーザーが agent 起動、worker への委譲、投げっぱなし実行を明示したとき。明示がなくても、単純で不明瞭な点がない自己完結タスクを任せたいとき。 | | `cmd-rmbranch` | `main` と `develop` を残し、不要なローカルブランチを安全に削除する。 | ローカルブランチ整理を依頼されたとき。未マージブランチは確認してから扱う。 | | `cmd-start-branch` | 最新のデフォルトブランチから作業ブランチを作り、不要ブランチ整理を非同期に依頼する。 | 新しい作業を始める前に「ブランチ切って」「作業開始用ブランチを作って」などを依頼されたとき。ブランチ名を報告してタスク詳細を待つ。 | -| `beautify-commit` | ベースブランチまたは基準 commit との差分を、意味のある変更単位の commit へ安全に整理する。 | commit 分割、履歴整理、大きすぎる差分の再 commit、ベースブランチや commit hash を基準にした差分整理、interactive rebase や reset を伴う整理を依頼されたとき。 | +| `beautify-commit` | ベースブランチまたは基準 commit との差分を、意味のある変更単位の commit へ安全に整理する。 | commit 分割、履歴整理、大きすぎる差分の再 commit、ベースブランチや commit hash を基準にした差分整理を依頼されたとき。interactive rebase が必要な整理は grape の対応まで実行しない。 | | `ci-fix` | GitHub Actions / CI の失敗を調査し、原因切り分けから修正、再検証まで進める。 | CI、GitHub Actions、checks、workflow、test / lint / build failure の修正を依頼されたとき。 | | `code-refactor` | 挙動を変えずにコードを簡略化、リファクタリングする。 | レビュー指摘、quality report、diff、指定ファイルをもとに可読性、保守性、テスト容易性を改善するとき。 | | `code-test` | テスト設計、回帰テスト追加、テストコードレビュー、テスト戦略を整理する。 | 正常系、異常系、境界値、flake、モック方針を検討するとき。 | @@ -130,6 +130,7 @@ skill 間の明示的な併用・優先関係は [docs/skill-dependency-map.md]( | `frontend-design` | `anthropics/skills` | 行動定義型 / ワークフロー型 | Web UI、ページ、コンポーネント、HTML/CSS/React などを高品質な frontend design として実装するときに使う。 | | `grilling` | `mattpocock/skills` | 判断定義型 / 判断基準・評価型 | 計画や設計を厳しく質問し、曖昧さや判断漏れを潰すために使う。 | | `empirical-prompt-tuning` | `mizchi/skills` | 判断定義型 / スコアリング・査定型 | skill やプロンプトを実験的に改善し、評価と反復で性能を詰めるために使う。 | +| `grape-usage` | `version-1/grape` | 行動定義型 / リファレンス型 | 安全な push、ポリシーで制限された rebase、worktree 操作など、grape コマンドの正確な利用方法を確認するときに使う。 | ## 運用メモ diff --git a/external-skills.json b/external-skills.json index 371a9ba..18d12d6 100644 --- a/external-skills.json +++ b/external-skills.json @@ -55,5 +55,15 @@ "~/.codex/skills/external/tq-orchestrator", "~/.claude/skills/tq-orchestrator" ] + }, + { + "name": "grape-usage", + "url": "https://github.com/version-1/grape/tree/main/.codex/skills/grape-usage", + "type": "git", + "treeHash": "127cab5302a2f2c8b6170de7751cda7ed29bace2", + "destination": [ + "~/.codex/skills/external/grape-usage", + "~/.claude/skills/grape-usage" + ] } ] From bd3dc0fdeb1ae1adec696c77a49724fc98141dd8 Mon Sep 17 00:00:00 2001 From: Jiro Date: Sun, 2 Aug 2026 11:27:38 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20grape=20=E7=A7=BB=E8=A1=8C=E3=83=AB?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=81=AE=E6=95=B4=E5=90=88=E6=80=A7=E3=82=92?= =?UTF-8?q?=E4=BF=9D=E3=81=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude の競合処理許可を打ち消す ask ルールを除去し、履歴整理後の push も grape push --force-with-lease に統一する。\n\n検証: jq empty claude/settings.json\n検証: git diff --check --- claude/settings.json | 2 -- codex/skills/internal/beautify-commit/SKILL.md | 4 ++-- .../internal/beautify-commit/references/split-workflows.md | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/claude/settings.json b/claude/settings.json index ab4b2d3..d7e1a14 100644 --- a/claude/settings.json +++ b/claude/settings.json @@ -85,8 +85,6 @@ "ask": [ "Bash(git push)", "Bash(git push *)", - "Bash(git rebase)", - "Bash(git rebase *)", "Bash(git reset --hard)", "Bash(git reset --hard *)", "Bash(git worktree remove *)", diff --git a/codex/skills/internal/beautify-commit/SKILL.md b/codex/skills/internal/beautify-commit/SKILL.md index 31e876a..9e4fad5 100644 --- a/codex/skills/internal/beautify-commit/SKILL.md +++ b/codex/skills/internal/beautify-commit/SKILL.md @@ -29,7 +29,7 @@ description: Git リポジトリで、ベースブランチまたは残したい - 基準 ref が未指定の場合、デフォルトブランチでよいか yes/no で確認してから進める。 - 履歴を書き換える操作をするときは、対象 branch と対象 commit 範囲を明確にする。 - push 済み、共有済み、PR 作成済みの履歴を書き換える場合は、実行前にユーザー確認を取る。 -- `git reset --hard`、`git commit --amend`、`git push --force` は、必要性と影響を説明してから使う。 +- `git reset --hard`、`git commit --amend`、`grape push --force-with-lease` は、必要性と影響を説明してから使う。 - `git rebase -i` は使わない。interactive rebase が必要な整理は grape が対応するまで実行せず、制約をユーザーへ報告する。 - 分割作業の前に、可能なら `backup/-before-split-` のようなバックアップ branch を作る。 - 読んでいない差分を stage しない。`git add .` ではなく、ファイル単位または patch 単位で stage する。 @@ -74,4 +74,4 @@ description: Git リポジトリで、ベースブランチまたは残したい - 作成した commit 一覧 - 残っている未コミット変更の有無 - 実行した検証、または未実行の理由 -- force push など、ユーザー側で必要な次操作があるか +- `grape push --force-with-lease` など、ユーザー側で必要な次操作があるか diff --git a/codex/skills/internal/beautify-commit/references/split-workflows.md b/codex/skills/internal/beautify-commit/references/split-workflows.md index bdbb338..8f8e7fb 100644 --- a/codex/skills/internal/beautify-commit/references/split-workflows.md +++ b/codex/skills/internal/beautify-commit/references/split-workflows.md @@ -115,4 +115,4 @@ git reset - `git log --oneline --decorate -n <必要数>` で commit 一覧を確認する。 - `git status --short` が想定どおりか確認する。 - 可能なら関連テスト、lint、build を実行する。 -- push 済み履歴を書き換えた場合は、通常の push では失敗する可能性と force-with-lease が必要になり得ることを伝える。 +- push 済み履歴を書き換えた場合は、通常の push では失敗する可能性と `grape push --force-with-lease` が必要になり得ることを伝える。 From c951b9c4dad190551d1cff41b8906e67a97179c5 Mon Sep 17 00:00:00 2001 From: Jiro Date: Sun, 2 Aug 2026 11:28:57 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20Claude=20=E3=81=AE=20Git=20=E8=A8=B1?= =?UTF-8?q?=E5=8F=AF=E3=82=92=E9=99=90=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 包括的な Bash(git *) 許可を安全なサブコマンド列挙へ置き換え、直接 rebase は競合処理の3操作だけを許可する。\n\n検証: jq empty claude/settings.json\n検証: git diff --check --- claude/settings.json | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/claude/settings.json b/claude/settings.json index d7e1a14..1338f65 100644 --- a/claude/settings.json +++ b/claude/settings.json @@ -6,7 +6,36 @@ "defaultMode": "auto", "allow": [ "Agent", - "Bash(git *)", + "Bash(git checkout -b *)", + "Bash(git switch *)", + "Bash(git status *)", + "Bash(git diff *)", + "Bash(git log *)", + "Bash(git fetch *)", + "Bash(git pull --ff-only *)", + "Bash(git show *)", + "Bash(git rev-parse *)", + "Bash(git merge-base *)", + "Bash(git ls-files *)", + "Bash(git grep *)", + "Bash(git remote -v)", + "Bash(git config --get *)", + "Bash(git submodule status *)", + "Bash(git branch --show-current)", + "Bash(git branch --list *)", + "Bash(git branch -a)", + "Bash(git commit *)", + "Bash(git add *)", + "Bash(git branch -d *)", + "Bash(git cherry-pick *)", + "Bash(git merge --ff-only *)", + "Bash(git stash *)", + "Bash(git worktree add *)", + "Bash(git worktree list *)", + "Bash(git worktree lock *)", + "Bash(git worktree move *)", + "Bash(git worktree repair *)", + "Bash(git worktree unlock *)", "Bash(gh *)", "Bash(tree)", "Bash(tree *)",