PreCommit
A comprehensive skill for managing pre-commit hooks - the framework for multi-language pre-commit hook management that automates code quality, formatting, linting, and security scanning.
Quick Reference
| Command | Description |
|---|---|
pre-commit install | Install git hooks |
pre-commit run --all-files | Run all hooks on all files |
pre-commit autoupdate | Update hooks to latest versions |
pre-commit run <hook-id> | Run specific hook |
Workflow Routing
| Workflow | Trigger | File |
|---|---|---|
| Setup | "setup pre-commit", "initialize hooks", "create config" | Workflows/Setup.md |
| AddHooks | "add hook", "add linting", "add formatter", "add security" | Workflows/AddHooks.md |
| Troubleshoot | "fix pre-commit", "hook failing", "debug hooks" | Workflows/Troubleshoot.md |
| CIIntegration | "CI pipeline", "GitHub Actions", "GitLab CI" | Workflows/CIIntegration.md |
| CustomHook | "create custom hook", "local hook", "write hook" | Workflows/CustomHook.md |
Documentation
| Document | Purpose |
|---|---|
QuickStartGuide.md | Installation and first-time setup |
HooksReference.md | Comprehensive hook catalog by language/purpose |
ConfigurationGuide.md | Advanced configuration options |
SecurityHooks.md | Secret detection and security scanning |
Tools
| Tool | Purpose |
|---|---|
Tools/PreCommitManager.ts | CLI for managing pre-commit configurations |
Tools/HookGenerator.ts | Generate .pre-commit-config.yaml templates |
Tools/HookValidator.ts | Validate hook configurations |
Examples
Example 1: Setup pre-commit for a new project
User: "Setup pre-commit for my Python project"
→ Invokes Setup workflow
→ Creates .pre-commit-config.yaml with Python hooks (black, isort, flake8)
→ Runs pre-commit install
Example 2: Add Terraform hooks
User: "Add Terraform validation hooks"
→ Invokes AddHooks workflow
→ Adds terraform_fmt, terraform_validate, terraform_docs hooks
→ Configures tflint and checkov integration
Example 3: Add security scanning
User: "Add secret detection to pre-commit"
→ Invokes AddHooks workflow
→ Adds gitleaks, detect-secrets, trufflehog hooks
→ Configures appropriate exclusion patterns
Example 4: Debug failing hook
User: "My eslint pre-commit hook is failing"
→ Invokes Troubleshoot workflow
→ Checks hook configuration and dependencies
→ Provides fix recommendations
Supported Hook Categories
- Python: black, isort, flake8, mypy, bandit, pyupgrade
- JavaScript/TypeScript: prettier, eslint, biome
- Infrastructure: terraform, terragrunt, helm, kustomize
- Kubernetes: kubeconform, kubeval, checkov
- Security: gitleaks, detect-secrets, trufflehog, trivy
- General: yamllint, jsonlint, shellcheck, markdownlint
Gotchas
- Hook output disappears when run via
git commit -min an editor terminal — stdout/stderr get swallowed by the editor wrapping. Runpre-commit run --all-filesdirectly to see the actual failure message. pre-commit autoupdatebumps to latest tag but doesn't update pinned config in hook repos — a hook that pinsflake8==6.0.0internally keeps that version. Look at each hook'sadditional_dependenciesafter autoupdate.- Hooks only run on staged files by default, so editing a file after
git addand then committing runs the hook against the OLD content. Use--all-filesin CI to catch this. exclude:regex is anchored differently thanfiles:—exclude: tests/does NOT excludetests/foo.pyin some hook versions; useexclude: ^tests/to be safe. Anchor everything.language: systemhooks bypass the pre-commit venv and rely on the user's PATH — works on your machine, fails in CI withcommand not found. Preferlanguage: pythonwithadditional_dependencies.pre-commit installdoesn't install forcommit-msgorpre-pushby default — separate--hook-typecalls needed. Many teams add commit-msg hooks then wonder why they don't fire.- Skipping a hook via
SKIP=hookid git commitis per-shell-invocation, not per-commit — CI runs with a fresh env where SKIP is unset and the hook fires anyway.