prek について
リポジトリで prek のコミット前フックを設定・管理するスキルです。プロジェクトの言語を判定してフックを提案し、pre-commit の YAML から prek.toml への移行も扱います。
主な機能
- 01リポジトリの目印から言語を判定
- 02prek.toml の確認と生成
- 03組み込みおよび言語別フックの提案
- 04pre-commit YAML からの移行
- 05フックステージとファイルフィルターの設定
活用シーン
- 01prek.toml がないプロジェクトへのフック追加
- 02既存のフック設定の確認や拡張
- 03YAML 設定から prek.toml への変換
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ paulnsorensen/ skillz-that-grillz --skill prekインストール後、Claude Code で/prekを入力して読み込まれたか確認します。
詳細
prek
高速でRustを活用したpre-commitフックマネージャーであるprekを導入して設定します。
使用する場面
- プロジェクトに
prek.tomlがなく、pre-commitフックを導入するメリットがある場合 - 既存の
prek.tomlにフックを追加、監査、拡張したい場合 .pre-commit-config.yamlからprekのネイティブTOML形式に移行する場合
手順
1. プロジェクトの種類を検出する
リポジトリのルートで、言語を示すファイルを確認します。
| マーカーファイル | 言語/フレームワーク |
|---|---|
Cargo.toml | Rust |
pyproject.toml、setup.py、requirements.txt | Python |
package.json | TypeScript/JavaScript |
go.mod | Go |
Gemfile | Ruby |
*.sh、zsh/、bin/ | シェル |
Dockerfile | Docker |
複数のマーカーがある場合は、複数言語を使うプロジェクトです。検出したすべての言語に対応するフックを提案します。
2. 既存の設定を確認する
prek.tomlがある場合は内容を読み、すでに設定されている項目を確認します.pre-commit-config.yamlがある場合は、移行を提案します(prekはYAMLをネイティブに読み込めますが、TOMLがネイティブ形式であり、globパターンなどの機能も利用できます)
3. フックを提案する
フックをカテゴリ別に提示します。追加する前に、各フックの動作を説明します。次のリファレンスを使用してください。
組み込みフック(repo = "builtin")
高速で、オフラインで動作し、セットアップ不要です。常に基礎として提案してください。
| フックID | 動作 |
|---|---|
trailing-whitespace | 行末の空白を削除します。引数:--markdown-linebreak-ext=md |
end-of-file-fixer | ファイルの末尾が改行で終わるようにします |
check-yaml | YAML構文を検証します。引数:--allow-multiple-documents |
check-toml | TOML構文を検証します |
check-json | JSON構文を検証します(キーの重複を拒否します) |
check-json5 | JSON5構文を検証します |
check-xml | XML構文を検証します |
check-merge-conflict | 解決されていないマージコンフリクトのマーカーを検出します |
detect-private-key | 秘密鍵を誤ってコミットするのを防ぎます |
check-added-large-files | サイズの大きいファイルをブロックします。引数:--maxkb=1024 |
check-case-conflict | 大文字と小文字だけが異なるファイル名を検出します |
check-symlinks | シンボリックリンクの参照先が存在するかを検証します |
check-executables-have-shebangs | 実行可能なスクリプトにshebangがあることを確認します |
mixed-line-ending | LFとCRLFが混在した改行コードを検出します |
fix-byte-order-marker | UTF-8 BOMを削除します |
no-commit-to-branch | 保護されたブランチへの直接コミットをブロックします |
言語別フック(コミュニティリポジトリ)
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
シェル:
[[repos]]
repo = "https://github.com/shellcheck-py/shellcheck-py"
rev = "a23f6b85d0fdd5bb9d564e2579e678033debbdff"
hooks = [
{ id = "shellcheck" },
]
4. 最新バージョンを確認する
設定を書く前に、コミュニティのフックリポジトリ(ruff-pre-commit、shellcheck-pyなど)で、現在推奨されているバージョンを確認します。利用可能な場合はContext7 MCP、ハーネスのドキュメント検索ツール、または各リポジトリのGitHubリリースページを使ってください。確認手段がない場合は、上記に記載したバージョンを使用します。
5. prek.tomlを生成または拡張する
新規プロジェクト:次の内容を含むprek.tomlを生成します。
- 組み込みフック(必ず
trailing-whitespace、end-of-file-fixer、check-merge-conflict、detect-private-key、check-added-large-filesを含めます) - 検出した言語に応じたフック
- 各セクションの説明コメント
既存プロジェクト:追加する内容の差分を提示します。すでに存在するフックは重複させないでください。
6. インストールして検証する
設定を書いた後、次を実行します。
prek install
prek run --all-files
prekがインストールされていない場合は、ユーザーにインストール方法(cargo install prekまたはbrew install prek)を伝え、packages.yamlがある場合はそこにも追加します。
高度なオプション
ステージ別フック
テストや完全なビルドなど、時間のかかるチェックはpre-commitではなくpre-pushに設定します。
[[repos.hooks]]
id = "pytest"
name = "Run tests"
language = "system"
entry = "pytest -x"
pass_filenames = false
always_run = true
stages = ["pre-push"]
priority = 100
グローバルフィルター
ベンダー提供コードや生成コードを、すべてのフックの対象外にします。
exclude = "^(vendor/|generated/|node_modules/)"
globパターン(prek専用)
Prekでは正規表現の代わりにglobパターンを使用できます(上流のpre-commitとは互換性がありません)。
files = { glob = "src/**/*.py" }
exclude = { glob = ["vendor/**", "dist/**"] }
pre-commit からの移行
.pre-commit-config.yaml がある場合:
- prek は YAML をネイティブに読み取るため、既存の設定をそのまま使えます
- prek 専用機能(グロブパターン、
repo: builtin)を利用できるよう、prek.tomlへの変換を提案します - 対応するフックでは、
repo: https://github.com/pre-commit/pre-commit-hooksをrepo: builtinに置き換えます
対応しないこと
- CI パイプライン、GitHub Actions、その他の CI フックシステムの設定
- husky、lint-staged、pre-commit(Python)の設定の管理
- ユーザーの確認なしに既存のフックを削除すること
.pre-commit-config.yamlの直接変更 — 生成するのはprek.tomlのみです
注意点
- Context7 を利用できない場合があります — フックの推奨にはトレーニングデータを使用します
- 自動修正フックによってすべてが再フォーマットされると、初回実行時に
prek run --all-filesが失敗する場合があります prek.tomlのリビジョン固定は古くなるため、定期的な更新を推奨しますprek installには.git/hooks/への書き込み権限が必要です — フックを共有するワークツリーでは失敗します