hooks-plugin
v2.11.7Claude Code hooks for enforcing best practices and workflow automation
By Lauri GatesLicense: MIT58 GitHub starsUpdated last week
Directory evidence
- Runtimes
- Claude Code
- Parsed components
- 4 skill or MCP entries
- Source updated
- Sep 15, 2026
- Manifest status
- Canonical path parsed
The directory validates manifest shape and source location. It does not execute the plugin or provide a security endorsement. Review the indexing methodology →
Install hooks-plugin for Claude Code
claude plugin marketplace add IchenDEV/agent-plugin-mkt
claude plugin marketplace update agent-plugin-marketplace
claude plugin install hooks-plugin@agent-plugin-marketplacePaste and run these commands in a terminal with Claude Code. They add and refresh the PluginsMP catalog, then install this plugin.
The installer fetches third-party code from the source repository shown on this page. This directory validates manifest structure and source location, but does not perform a security audit; review the manifest, components, and source before installing.
Get the source manually
git clone https://github.com/laurigates/claude-pluginsClone the source repository, then follow its setup instructions to add the plugin to a compatible client. The plugin root is hooks-plugin/.
Plugin files
├── .claude-plugin/plugin.json├── skills/hooks-configuration/SKILL.md├── skills/hooks-permission-request-hook/SKILL.md├── skills/hooks-session-end-issue-hook/SKILL.md└── skills/hooks-session-start-hook/SKILL.md
Included Skills4
Claude Code hooks configuration and development. Use when the user mentions hooks, PreToolUse, PostToolUse, SessionStart, SubagentStart, PermissionRequest, or TaskCompleted.
Generate a PermissionRequest hook with auto-approve/deny rules. Use when needing a safer alternative to --dangerouslySkipPermissions tailored to your project stack.
Configure a Stop hook that surfaces unfinished todos at session end. Use when you want deferred work automatically flagged for GitHub issue creation.
Create a SessionStart hook for Claude Code on the web. Use when setting up a repo so dependencies install and tests/linters run automatically on remote session start.
Plugin manifests1
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "hooks-plugin",
"version": "2.11.7",
"description": "Claude Code hooks for enforcing best practices and workflow automation",
"author": {
"name": "Lauri Gates"
},
"repository": "https://github.com/laurigates/claude-plugins",
"license": "MIT",
"keywords": [
"hooks",
"automation",
"best-practices",
"workflow",
"anti-patterns",
"tooling",
"session-start",
"web",
"git-stash",
"git-cleanup",
"session-end",
"prompt-hooks",
"agent-hooks",
"task-completeness",
"test-verification",
"quality-gates",
"secret-protection",
"branch-protection",
"event-logger",
"permissions",
"checkpoint",
"repo-deletion-safety",
"branch-base",
"prose-style"
],
"hooks": {
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/git-stash-session-init.sh",
"timeout": 5000
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/drift-aggregator.sh",
"timeout": 5000
}
]
}
],
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/bash-antipatterns.sh",
"timeout": 5000
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/branch-protection.sh",
"timeout": 5000
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/repo-deletion-safety.sh",
"timeout": 5000
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/branch-base-guard.sh",
"timeout": 5000
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/auto-checkpoint.sh",
"timeout": 5000
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/external-pr-merge-guard.sh",
"timeout": 15000
}
]
},
{
"matcher": "mcp__github__merge_pull_request",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/external-pr-merge-guard.sh",
"timeout": 15000
}
]
},
{
"matcher": "Read|Edit|Write|Bash",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/secret-protection.sh",
"timeout": 5000
}
]
},
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/event-logger.sh",
"timeout": 2000
}
]
}
],
"PermissionRequest": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/permission-auto-approve.sh",
"timeout": 5000
}
]
}
],
"PostToolUse": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/event-logger.sh",
"timeout": 2000
}
]
},
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/bash-antipatterns-teach.sh",
"timeout": 5000
}
]
},
{
"matcher": "Write|Edit|Bash",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/prose-house-style-nudge.sh",
"timeout": 15000
}
]
}
],
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/git-stash-reminder.sh",
"timeout": 10000
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/task-completeness.sh",
"timeout": 10000,
"statusMessage": "Checking task completeness..."
},
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/no-calendar-estimates.sh",
"timeout": 5000
}
]
}
],
"SubagentStop": [
{
"hooks": [
{
"type": "prompt",
"prompt": "You are evaluating whether a subagent's output is complete and actionable. Respond with ONLY a JSON object, no other text.\n\nContext: $ARGUMENTS\n\nCheck:\n1. Does the output address the original task/prompt that spawned the subagent?\n2. Is the response specific and actionable (not vague platitudes or generic advice)?\n3. Are there obvious gaps, unanswered questions, or incomplete sections?\n4. If the task was research, are findings concrete with file paths or code references?\n5. If the task was implementation, were the changes actually made?\n\nRespond with ONLY one of these JSON objects (no markdown, no explanation, no other text):\n{\"ok\": true}\n{\"ok\": false, \"reason\": \"what's missing or inadequate\"}",
"timeout": 30,
"statusMessage": "Evaluating subagent output quality..."
}
]
}
],
"TaskCompleted": [
{
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/test-verification.sh",
"timeout": 60000,
"statusMessage": "Running fast tests..."
},
{
"type": "agent",
"prompt": "You are verifying that a completed task meets quality standards before accepting it. Context: $ARGUMENTS\n\nEvidence of the work may live in COMMITS, not only in the working tree. A clean working tree on a branch that carries relevant commits is the success shape, not the failure shape — never conclude that no work was done from a clean working tree alone.\n\n1. Resolve BASE, the ref this branch diverged from. BASE is the repository's DEFAULT branch, never the branch's own remote counterpart: git rev-parse --abbrev-ref --symbolic-full-name @{u} returns origin/<this-branch> on any pushed branch, so BASE..HEAD comes back empty and committed work vanishes. Find the default branch, stopping at the first that resolves: (a) git symbolic-ref --short refs/remotes/origin/HEAD, (b) the first of origin/main, origin/master, main, master that git rev-parse --verify --quiet accepts — origin/HEAD is unset in most agent worktrees, --single-branch clones and CI checkouts, so this fallback is the usual path. Never assume a branch name exists; probe each with --verify --quiet. Then BASE=$(git merge-base HEAD <default-branch>).\n2. Inspect what the branch adds over BASE: git log --oneline BASE..HEAD and git diff --stat BASE...HEAD. Treat those commits and files as CANDIDATE evidence — a branch can also carry commits from earlier, unrelated tasks in the same session, and only the parts matching this task count as evidence for it. If the branch has no commits ahead of BASE, fall back to the working tree.\n3. Inspect the working tree: git status --porcelain and git diff --stat.\n4. The CHANGE SET is the branch diff from step 2 plus the uncommitted changes from step 3. Judge steps 5-8 against the change set only. If step 1 found no default branch, or BASE resolves to HEAD, there is no base ref: skip step 2 and build the change set from the working tree plus git log --oneline -10 HEAD (a task whose work landed directly on the default branch presents this way).\n5. For each changed source file, search for TODO/FIXME/HACK comments that may indicate unfinished work.\n6. Check that no debugging artifacts remain (stray console.log, print() statements, debugger keywords).\n7. If the task involved adding new functionality, check if test files exist nearby or were updated.\n8. Identify which parts of the change set correspond to the task described in Context and verify they are consistent with it. Commits and files belonging only to earlier, unrelated work are not evidence for this task.\n\nScope: judge scope against the branch diff (git diff --name-only BASE...HEAD) plus the files this task actually touched — not raw git status; when there is no base ref, judge it against the working-tree changes plus the files this task touched. Modified or untracked files outside that set are pre-existing or concurrent state, not scope violations, and must not on their own withhold completion.\n\nWithhold completion when the change set contains real problems; when there is no supporting change anywhere — neither commits on the branch over its base nor changes in the working tree; or when nothing in the change set corresponds to the task described in Context.\n\nRespond with {\"ok\": true} if the implementation looks complete and clean, or {\"ok\": false, \"reason\": \"specific issues found\"} if problems remain.",
"timeout": 60,
"statusMessage": "Verifying task implementation quality..."
}
]
}
],
"SessionEnd": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/git-session-cleanup.sh",
"timeout": 30000
}
]
}
]
}
}For maintainers
If you maintain this plugin, link to this source-backed listing from your README so users can review its manifest and indexed components.
[hooks-plugin on Agent Plugins Marketplace](https://pluginsmp.com/plugins/hooks-plugin)