block-no-verify-hook について
block-no-verify-hookは、AIコーディングエージェントを使うチーム向けのClaude Code PreToolUseフックです。Bash呼び出しを調べ、実行前にGitの回避フラグをブロックし、ほかのツール呼び出しには干渉しません。
主な機能
- 01Bashツール呼び出しの検査
- 02Gitフックや署名を回避するフラグのブロック
- 03JSON入力内のコマンド文字列を確認
- 04終了コードによるブロックまたは許可
- 05プロジェクト単位と全体設定に対応
活用シーン
- 01コミット時のpre-commitフック回避を防止
- 02GitコマンドでのGPG署名を徹底
- 03短縮フラグによるチェック回避を阻止
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ wshobson/ agents --skill block-no-verify-hookインストール後、Claude Code で/block-no-verify-hookを入力して読み込まれたか確認します。
詳細
Block No-Verify フック
実行前にバイパスフラグの使用を傍受してブロックする PreToolUse フックの設定です。これにより、AI エージェントが pre-commit フック、GPG 署名、その他の git の安全機構をスキップできないようにします。
概要
AI コーディングエージェント(Claude Code、Codex など)は、pre-commit フックをバイパスする --no-verify のようなフラグを付けてシェルコマンドを実行できます。これは、pre-commit フックで設定されたリンティング、フォーマット、テスト、セキュリティチェックの意義を損ないます。block-no-verify フックは、実行前にバイパスフラグを含むツール呼び出しを拒否する PreToolUse ガードを追加します。
問題
AI エージェントがコードをコミットする際、フックの失敗を避けるためにバイパスフラグを使うことがあります。
# These commands skip pre-commit hooks entirely
git commit --no-verify -m "quick fix"
git push --no-verify
git commit --no-gpg-sign -m "unsigned commit"
git merge --no-verify feature-branch
これにより次のことが可能になります。
- フォーマットされていないコードがリポジトリに入り込む
- リンティングエラーがチェックをすり抜ける
- セキュリティスキャンがスキップされる
- 署名されていないコミットが署名ポリシーを回避する
- テストスイートが回避される
解決策
.claude/settings.json に PreToolUse フックを追加し、すべての Bash ツール呼び出しを検査して、バイパスフラグを含むコマンドをブロックします。
設定
プロジェクトの .claude/settings.json に以下を追加します。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: --no-verify and --no-gpg-sign flags are not allowed. Run the commit without bypass flags so that pre-commit hooks execute properly.' >&2; exit 2; fi"
}
]
}
]
}
}
仕組み
- マッチャー: このフックは
Bashツール呼び出しだけを対象とするため、他のツール(Read、Edit、Grep など)には干渉しません。 - 検査: Claude Code はツール呼び出しを JSON として stdin でフックに送信し、
$TOOL_INPUT変数は設定しません。フックはその JSON 内のcommandの値をgrep -Eで検索するため、jqやnodeは不要で、cwdやツール呼び出しの説明など他のフィールドのテキストでトリガーされることもありません。--no-verify、--no-gpg-sign、および git が受け付けるこれらの短縮プレフィックス(例:--no-veri)をブロックします。また、同じコマンド内でcommitの後に続くnを含む短いオプションのグループ(例:-nや-nm)もブロックします。これは-nが--no-verifyの短縮形だからです。このフックはgitという単語を探さないため、if git ...、sudo git ...、g=git; $g commit --no-verifyも捕捉します。コミットメッセージがフラグに言及している場合のような誤検出は呼び出しをブロックしますが、これは安全側に倒れる挙動です。 - ブロック: git コマンド内にバイパスフラグが見つかった場合、フックはコード 2 で終了し、エラーメッセージを出力します。終了コード 2 は Claude Code にツール呼び出しを完全に拒否するよう指示します。
- パススルー: バイパスフラグが見つからなかった場合、フックはコード 0 で終了し、コマンドは通常どおり実行されます。
- 限界: このフックはテキストを検査するため、習慣的にバイパスフラグに手を伸ばすエージェントは止められます。しかし、フラグを部品から組み立てたり、
git -c core.hooksPath=/dev/null commitを実行したりするなど、回避を意図したエージェントは止められません。
終了コード
| コード | 意味 |
|---|---|
| 0 | ツール呼び出しの続行を許可する |
| 1 | エラー(ツール呼び出しは続行され、警告が表示される) |
| 2 | ツール呼び出しを完全にブロックする |
ブロックされるフラグ
| フラグ | 目的 | ブロックされる理由 |
|---|---|---|
--no-verify | pre-commit フックと commit-msg フックをスキップする | リンティング、フォーマット、テスト、セキュリティチェックをバイパスする |
--no-gpg-sign | GPG コミット署名をスキップする | コミット署名ポリシーをバイパスする |
インストール
プロジェクトごとの設定
プロジェクトルートに .claude/settings.json を作成または更新します。
mkdir -p .claude
cat > .claude/settings.json << 'EOF'
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: --no-verify and --no-gpg-sign flags are not allowed. Run the commit without bypass flags so that pre-commit hooks execute properly.' >&2; exit 2; fi"
}
]
}
]
}
}
EOF
グローバル設定
すべてのプロジェクトで適用するには、~/.claude/settings.json に追加します。
mkdir -p ~/.claude
cat > ~/.claude/settings.json << 'EOF'
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: --no-verify and --no-gpg-sign flags are not allowed. Run the commit without bypass flags so that pre-commit hooks execute properly.' >&2; exit 2; fi"
}
]
}
]
}
}
EOF
検証
フックがバイパスフラグをブロックすることをテストします。
# This should be blocked by the hook:
git commit --no-verify -m "test"
# This should succeed normally:
git commit -m "test"
フックの拡張
ブロックするフラグの追加
追加のフラグ(例: --force)をブロックするには、grep パターンを拡張します。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n|git([[:space:]]|\\\\t)([^\"\\\\]|\\\\.)*--force)'; then echo 'BLOCKED: Bypass flags are not allowed.' >&2; exit 2; fi"
}
]
}
]
}
}
他のフックとの組み合わせ
block-no-verify フックは他の PreToolUse フックと併用できます。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if grep -qE '\"command\"[[:space:]]*:[[:space:]]*\"([^\"\\\\]|\\\\.)*(--no-(ver|g)|commit([^\"\\\\]|\\\\.)*([[:space:]]|\\\\[tn])-[a-zA-Z]*n)'; then echo 'BLOCKED: Bypass flags not allowed.' >&2; exit 2; fi"
}
]
},
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "if grep -qE 'rm[[:space:]]+-rf[[:space:]]+/'; then echo 'BLOCKED: Dangerous rm command.' >&2; exit 2; fi"
}
]
}
]
}
}
ベストプラクティス
- 設定ファイルをコミットする --
.claude/settings.jsonをバージョン管理に追加して、チームメンバー全員がフックの恩恵を受けられるようにします。 - オンボーディングで文書化する -- プロジェクトのコントリビューションガイドでフックに言及し、開発者がなぜバイパスフラグがブロックされるのかを理解できるようにします。
- pre-commit フックと組み合わせる -- block-no-verify フックは pre-commit フックが実行されることを保証します。意味のある pre-commit フックが設定されていることを確認してください。
- セットアップ後にテストする -- テストコミットで意図的にフックをトリガーして、フックが機能することを検証します。