mcpField
P
prek

prek

github.com/paulnsorensenTesting & quality158 installsUpdated today
Repository

About prek

A skill for setting up and maintaining prek pre-commit hooks in a repository. It detects project languages, recommends hooks, and supports migration from pre-commit YAML to prek.toml.

Key features

  1. 01Detects languages from repository markers
  2. 02Audits and generates prek.toml
  3. 03Recommends built-in and language hooks
  4. 04Supports migration from pre-commit YAML
  5. 05Covers hook stages and file filters

Use cases

  1. 01Adding hooks to a project without prek.toml
  2. 02Reviewing or extending an existing hook configuration
  3. 03Converting YAML configuration to prek.toml

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/paulnsorensen/skillz-that-grillz --skill prek

After installing, type/prekin Claude Code to confirm it loaded.

Details

From the project README

prek

Onboard and configure prek — a fast, Rust-powered pre-commit hook manager.

When to use

  • Project has no prek.toml and would benefit from pre-commit hooks
  • User wants to add/audit/extend hooks in an existing prek.toml
  • User is migrating from .pre-commit-config.yaml to prek's native TOML format

Protocol

1. Detect project type

Scan the repo root for language markers:

Marker fileLanguage/Framework
Cargo.tomlRust
pyproject.toml, setup.py, requirements.txtPython
package.jsonTypeScript/JavaScript
go.modGo
GemfileRuby
*.sh, zsh/, bin/Shell
DockerfileDocker

Multiple markers = polyglot project. Suggest hooks for all detected languages.

2. Check existing config
  • If prek.toml exists, read it and identify what's already configured
  • If .pre-commit-config.yaml exists, offer to migrate (prek reads YAML natively, but TOML is the native format with more features like glob patterns)
3. Suggest hooks

Present hooks in categories. Show what each hook does before adding. Use this reference:

Built-in hooks (repo = "builtin")

Fast, offline, zero-setup. Always suggest these as the foundation:

Hook IDWhat it does
trailing-whitespaceTrims trailing whitespace. Args: --markdown-linebreak-ext=md
end-of-file-fixerEnsures files end with a newline
check-yamlValidates YAML syntax. Args: --allow-multiple-documents
check-tomlValidates TOML syntax
check-jsonValidates JSON syntax (rejects duplicate keys)
check-json5Validates JSON5 syntax
check-xmlValidates XML syntax
check-merge-conflictDetects unresolved merge conflict markers
detect-private-keyCatches accidentally committed private keys
check-added-large-filesBlocks large files. Args: --maxkb=1024
check-case-conflictDetects filenames that differ only by case
check-symlinksValidates symlinks point to existing targets
check-executables-have-shebangsEnsures executable scripts have shebangs
mixed-line-endingDetects mixed line endings (LF vs CRLF)
fix-byte-order-markerRemoves UTF-8 BOM
no-commit-to-branchBlocks direct commits to protected branches
Language-specific hooks (community repos)

Rust:

# Local hooks (no external repo needed)
[[repos]]
repo = "local"

[[repos.hooks]]
id = "cargo-fmt"
name = "cargo fmt"
language = "system"
entry = "cargo fmt --"
files = "\\.rs$"
pass_filenames = true

[[repos.hooks]]
id = "cargo-clippy"
name = "cargo clippy"
language = "system"
entry = "cargo clippy --all-targets --all-features -- -D warnings"
files = "\\.rs$"
pass_filenames = false
always_run = true

Python:

# Ruff (linter + formatter)
[[repos]]
repo = "https://github.com/astral-sh/ruff-pre-commit"
rev = "v0.11.6"
hooks = [
  { id = "ruff", args = ["--fix"] },
  { id = "ruff-format" },
]

TypeScript/JavaScript:

[[repos]]
repo = "local"

[[repos.hooks]]
id = "eslint"
name = "eslint"
language = "system"
entry = "npx eslint --fix"
files = "\\.(ts|tsx|js|jsx)$"
pass_filenames = true

[[repos.hooks]]
id = "prettier"
name = "prettier"
language = "system"
entry = "npx prettier --write"
files = "\\.(ts|tsx|js|jsx|json|css|md)$"
pass_filenames = true

Go:

[[repos]]
repo = "local"

[[repos.hooks]]
id = "go-fmt"
name = "go fmt"
language = "system"
entry = "gofmt -w"
files = "\\.go$"
pass_filenames = true

[[repos.hooks]]
id = "go-vet"
name = "go vet"
language = "system"
entry = "go vet ./..."
pass_filenames = false
always_run = true

Shell:

[[repos]]
repo = "https://github.com/shellcheck-py/shellcheck-py"
rev = "a23f6b85d0fdd5bb9d564e2579e678033debbdff"
hooks = [
  { id = "shellcheck" },
]
4. Fetch latest versions

Before writing config, check the community hook repos for their current recommended versions (ruff-pre-commit, shellcheck-py, etc.) — via the Context7 MCP if your harness has it, your harness's doc-lookup tool, or the repos' GitHub releases pages. Fall back to the versions listed above if no lookup is available.

5. Generate or augment prek.toml

New project: Generate a complete prek.toml with:

  1. Built-in hooks (always include: trailing-whitespace, end-of-file-fixer, check-merge-conflict, detect-private-key, check-added-large-files)
  2. Language-specific hooks based on detection
  3. Comments explaining each section

Existing project: Show a diff of what would be added. Don't duplicate hooks already present.

6. Install and verify

After writing config:

prek install
prek run --all-files

If prek isn't installed, tell the user to install it (cargo install prek or brew install prek) and add it to their packages.yaml if one exists.

Advanced options

Stage-specific hooks

Slow checks (tests, full builds) belong on pre-push, not pre-commit:

[[repos.hooks]]
id = "pytest"
name = "Run tests"
language = "system"
entry = "pytest -x"
pass_filenames = false
always_run = true
stages = ["pre-push"]
priority = 100
Global filters

Exclude vendored/generated code from all hooks:

exclude = "^(vendor/|generated/|node_modules/)"
Glob patterns (prek-only)

Prek supports glob patterns as an alternative to regex (not compatible with upstream pre-commit):

files = { glob = "src/**/*.py" }
exclude = { glob = ["vendor/**", "dist/**"] }

Migration from pre-commit

If .pre-commit-config.yaml exists:

  1. prek reads YAML natively — the existing config works as-is
  2. Offer to convert to prek.toml for access to prek-only features (glob patterns, repo: builtin)
  3. Replace repo: https://github.com/pre-commit/pre-commit-hooks with repo: builtin where hooks are supported

What You Don't Do

  • Configure CI pipelines, GitHub Actions, or other CI hook systems
  • Manage husky, lint-staged, or pre-commit (Python) configs
  • Remove existing hooks without user confirmation
  • Modify .pre-commit-config.yaml directly — only generates prek.toml

Gotchas

  • Context7 may be unavailable — fall back to training data for hook recommendations
  • prek run --all-files can fail on first run if auto-fix hooks reformat everything
  • Rev pinning in prek.toml goes stale — recommend periodic updates
  • prek install needs write access to .git/hooks/ — fails in worktrees with shared hooks

Comments

Markdown supported