mcpField
P
prek

prek

github.com/paulnsorensenテスト・品質079 回インストール2 週間前に更新
リポジトリ

prek について

prekはprekの設定導入を支援するスキルで、プロジェクトのフックを追加、監査、移行する開発者向けです。言語を示すファイルを検出して組み込み・言語別フックを提案し、`prek.toml`を作成または拡張します。

主な機能

  1. 01プロジェクトの言語と技術スタックの検出
  2. 02組み込み・言語別フックの提案
  3. 03`prek.toml`の生成と拡張
  4. 04pre-commit YAMLからの移行支援
  5. 05許可を得たフックの導入と実行

活用シーン

  1. 01フック未設定のプロジェクトへの基本チェック導入
  2. 02既存の`prek.toml`の監査や拡張
  3. 03`.pre-commit-config.yaml`からネイティブTOMLへの変換
  4. 04コミット前のフォーマット・安全性チェック

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/paulnsorensen/git-gouda --skill prek

インストール後、Claude Code で/prekを入力して読み込まれたか確認します。

同梱ファイルevals/evals.json

詳細

prek

prek を導入して設定します。高速な Rust 製の pre-commit フックマネージャーです。

使用する場面

  • プロジェクトに prek.toml がなく、pre-commit フックを導入すると効果が見込める場合
  • 既存の prek.toml にフックを追加、監査、拡張したい場合
  • .pre-commit-config.yaml から prek のネイティブ TOML 形式に移行する場合

手順

1. プロジェクトの種類を検出する

リポジトリのルートで、言語を示すファイルを検索します。

マーカーファイル言語/フレームワーク
Cargo.tomlRust
pyproject.toml、setup.py、requirements.txtPython
package.jsonTypeScript/JavaScript
go.modGo
GemfileRuby
*.sh、zsh/、bin/Shell
DockerfileDocker

複数のマーカーがある場合は、多言語プロジェクトです。検出したすべての言語向けにフックを提案します。

2. 既存の設定を確認する
  • prek.toml がある場合は読み込み、すでに設定されている内容を特定します
  • .pre-commit-config.yaml がある場合は、移行を提案します(prek は YAML をネイティブに読み取れますが、TOML がネイティブ形式であり、グロブパターンなどの機能がより豊富です)
3. フックを提案する

カテゴリ別にフックを提示します。追加する前に、各フックの動作を説明します。以下を参考にしてください。

組み込みフック(repo = "builtin")

高速で、オフラインで動作し、セットアップは不要です。基盤として常に提案します。

フック ID動作
trailing-whitespace行末の空白を削除します。引数:--markdown-linebreak-ext=md
end-of-file-fixerファイルが改行で終わるようにします
check-yamlYAML 構文を検証します。引数:--allow-multiple-documents
check-tomlTOML 構文を検証します
check-jsonJSON 構文を検証します(重複キーは拒否します)
check-json5JSON5 構文を検証します
check-xmlXML 構文を検証します
check-merge-conflict未解決のマージコンフリクトマーカーを検出します
detect-private-key誤ってコミットされた秘密鍵を検出します
check-added-large-files大きなファイルをブロックします。引数:--maxkb=1024
check-case-conflict大文字と小文字だけが異なるファイル名を検出します
check-symlinksシンボリックリンクの参照先が存在するか検証します
check-executables-have-shebangs実行可能スクリプトにシバンがあることを確認します
mixed-line-ending改行コードの混在(LF と CRLF)を検出します
fix-byte-order-markerUTF-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

Shell:

[[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 を生成します。

  1. 組み込みフック(必ず含めるもの:trailing-whitespace、end-of-file-fixer、check-merge-conflict、detect-private-key、check-added-large-files)
  2. 検出結果に基づく言語固有のフック
  3. 各セクションの説明コメント

既存プロジェクト:追加する内容の差分を提示します。すでにあるフックは重複させません。

6. インストールして検証する

以下のコマンドを実行する前に、ユーザーに確認します。監査または設定変更の提案の場合は、提案した差分を提示した時点で終了し、ユーザーがインストールまたは変更を伴う実行を許可しない限り、どちらのコマンドも実行しません。

prek install
prek run --all-files

prek がインストールされていない場合は、ユーザーにインストール方法を伝えます(cargo install prek または brew install prek)。インストールに関する案内はこのリポジトリに限定し、個人用のパッケージマニフェストやドットファイルは編集しません。

高度なオプション

ステージ別フック

時間のかかるチェック(テスト、フルビルド)は 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

stages = ["pre-push"] だけでは、pre-push Git shim はインストールされません。トップレベルの設定に default_install_hook_types = ["pre-commit", "pre-push"] を追加し(キー名は prek のドキュメントで確認してください)、Git に pre-push shim をインストールするため、ユーザーに許可済みの prek install を再実行するよう依頼します。prek run --hook-stage pre-push はステージを実行しますが、shim 自体がインストールされていることの証明にはなりません。

グローバルフィルター

ベンダー提供コード/生成コードをすべてのフックから除外します。

exclude = "^(vendor/|generated/|node_modules/)"
Glob パターン(prek 専用)

Prek は、正規表現の代替として glob パターンをサポートしています(upstream pre-commit とは互換性がありません)。

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

pre-commit からの移行

.pre-commit-config.yaml がある場合:

  1. prek は YAML をネイティブに読み取るため、既存の設定をそのまま使用できます
  2. prek 専用機能(glob パターン、repo: builtin)を利用できるよう、prek.toml への変換を提案します
  3. 対応するフックでは、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/ への書き込み権限が必要です — フックを共有する worktree では失敗します

コメント