block-no-verify-hook
wshobson/agents
Prevent AI agents from bypassing git pre-commit hooks with --no-verify flags.
What is block-no-verify-hook?
A PreToolUse hook configuration that intercepts and blocks git bypass flags (--no-verify, --no-gpg-sign) before execution. Use this when setting up Claude Code projects to enforce commit quality gates and prevent agents from circumventing linting, formatting, testing, and security checks.
- Inspects all Bash tool calls for bypass flags before execution
- Blocks commands containing --no-verify, --no-gpg-sign, and their short forms
- Rejects tool calls with exit code 2 to prevent command execution
- Works with both per-project and global .claude/settings.json configuration
- Allows legitimate commits without bypass flags to proceed normally
- Detects bypass flags in various command contexts (git, sudo git, aliased git)
How to install block-no-verify-hook
npx skills add https://github.com/wshobson/agents --skill block-no-verify-hook- Claude Code or compatible AI agent
- Project with .claude/settings.json configuration file
- Git repository with pre-commit hooks configured
How to use block-no-verify-hook
- 1.Create or navigate to the .claude directory in your project root
- 2.Add the PreToolUse hook configuration to .claude/settings.json with the provided grep command
- 3.Commit the settings file to version control so all team members use the same hook
- 4.Test the hook by attempting a git commit with --no-verify flag (should be blocked)
- 5.Verify normal commits without bypass flags execute successfully
Use cases
- Enforce pre-commit hooks in team projects where AI agents commit code
- Prevent unsigned commits when GPG signing policy is required
- Block agents from skipping linting and formatting checks
- Ensure security scanning runs on all commits
- Maintain code quality standards across AI-assisted development
- Teams using Claude Code for development
- Project leads enforcing commit quality gates
- DevOps engineers managing pre-commit hook policies
- Development teams requiring GPG-signed commits
block-no-verify-hook FAQ
The hook only blocks commands containing the specific bypass flags (--no-verify, --no-gpg-sign). Normal commits without these flags proceed unaffected. False positives can occur if these flag names appear in commit messages, which is the safe failure mode.
The hook stops agents reaching for bypass flags out of habit. Determined evasion is possible (e.g., building flags from pieces, disabling hooks via git config), but the hook prevents casual bypass attempts.
Yes. Committing the settings file ensures all team members and AI agents use the same hook configuration, maintaining consistent code quality standards across the project.
Yes. The hook uses a grep regex pattern that you can extend to block other flags like --force by modifying the pattern in the command field.
Exit code 0 allows the tool call to proceed, exit code 1 shows a warning but allows execution, and exit code 2 blocks the tool call entirely. The hook uses exit code 2 to reject bypass flags.
Full instructions (SKILL.md)
Source of truth, from wshobson/agents.
name: block-no-verify-hook description: Configure a PreToolUse hook to prevent AI agents from skipping git pre-commit hooks with --no-verify and other bypass flags. Use when setting up Claude Code projects that enforce commit quality gates.
Block No-Verify Hook
PreToolUse hook configuration that intercepts and blocks bypass-flag usage before execution, ensuring AI agents cannot skip pre-commit hooks, GPG signing, or other git safety mechanisms.
Overview
AI coding agents (Claude Code, Codex, etc.) can run shell commands with flags like --no-verify that bypass pre-commit hooks. This defeats the purpose of linting, formatting, testing, and security checks configured in pre-commit hooks. The block-no-verify hook adds a PreToolUse guard that rejects any tool call containing bypass flags before execution.
Problem
When AI agents commit code, they may use bypass flags to avoid hook failures:
# 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
This allows:
- Unformatted code to enter the repository
- Linting errors to bypass checks
- Security scanning to be skipped
- Unsigned commits to bypass signing policies
- Test suites to be circumvented
Solution
Add a PreToolUse hook to .claude/settings.json that inspects every Bash tool call and blocks commands containing bypass flags.
Configuration
Add the following to your project's .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"
}
]
}
]
}
}
How It Works
- Matcher: The hook targets only
Bashtool calls, so it does not interfere with other tools (Read, Edit, Grep, etc.). - Inspection: Claude Code sends the tool call to the hook as JSON on stdin and sets no
$TOOL_INPUTvariable. The hook searches thecommandvalue in that JSON withgrep -E, so it needs nojqornode, and text in other fields, such ascwdor the tool call's description, can't trigger it. It blocks--no-verify,--no-gpg-sign, and any shorter prefix of them that git accepts, e.g.,--no-veri. It also blocks a short option group withnthat followscommitin the same command, e.g.,-nor-nm, because-nis the short form of--no-verify. The hook doesn't look for the wordgit, so it also catchesif git ...,sudo git ..., andg=git; $g commit --no-verify. A false match, such as a commit message that mentions a flag, blocks the call, which is the safe way to fail. - Blocking: If a bypass flag is found in a git command, the hook exits with code 2 and prints an error message. Exit code 2 signals Claude Code to reject the tool call entirely.
- Pass-through: If no bypass flag is found, the hook exits with code 0 and the command executes normally.
- Limits: The hook checks text, so it stops an agent that reaches for a bypass flag out of habit. It doesn't stop an agent that sets out to evade it, e.g., by building the flag from pieces or by running
git -c core.hooksPath=/dev/null commit.
Exit Codes
| Code | Meaning |
|---|---|
| 0 | Allow the tool call to proceed |
| 1 | Error (tool call still proceeds, warning shown) |
| 2 | Block the tool call entirely |
Blocked Flags
| Flag | Purpose | Why Blocked |
|---|---|---|
--no-verify | Skips pre-commit and commit-msg hooks | Bypasses linting, formatting, testing, security checks |
--no-gpg-sign | Skips GPG commit signing | Bypasses commit signing policy |
Installation
Per-Project Setup
Create or update .claude/settings.json in your project root:
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
Global Setup
To enforce across all projects, add to ~/.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
Verification
Test that the hook blocks bypass flags:
# This should be blocked by the hook:
git commit --no-verify -m "test"
# This should succeed normally:
git commit -m "test"
Extending the Hook
Adding More Blocked Flags
To block additional flags (e.g., --force), extend the grep pattern:
{
"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"
}
]
}
]
}
}
Combining with Other Hooks
The block-no-verify hook works alongside other PreToolUse hooks:
{
"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"
}
]
}
]
}
}
Best Practices
- Commit the settings file -- Add
.claude/settings.jsonto version control so all team members benefit from the hook. - Document in onboarding -- Mention the hook in your project's contributing guide so developers understand why bypass flags are blocked.
- Pair with pre-commit hooks -- The block-no-verify hook ensures pre-commit hooks run; make sure you have meaningful pre-commit hooks configured.
- Test after setup -- Verify the hook works by intentionally triggering it in a test commit.
Related skills
More from wshobson/agents and the wider catalog.

brand-landingpage
Brand-first landing page designer with guided interviews and Stitch-powered iteration.

changelog-automation
Automate changelog generation from commits and releases using Keep a Changelog and Conventional Commits.

checkpoint-promotion
Gate fine-tuned checkpoints against drift budgets, paired comparison, and forgetting before shipping.

code-review-excellence
Master constructive code review practices to catch bugs, share knowledge, and improve team collaboration.

competitive-landscape
Analyze competition and craft winning market positioning using Porter's Five Forces, Blue Ocean Strategy, and positioning maps.

context-driven-development
Create and maintain structured project context artifacts to align AI agents and teams during development.