setup-git-hooks について
setup-git-hooksは、Git組み込みのcore.hooksPath設定でリポジトリのフックを構成するスキルです。ステージ済みファイルの整形とチェックを各ツールに割り当て、設定済みの型チェックとビルドをコミット前に実行します。
主な機能
- 01core.hooksPathによるフック設定
- 02lint-staged経由でBiomeを実行
- 03未対応言語向けPrettierの追加
- 04設定済みの型チェックとビルドを実行
- 05フック設定の検証と関連ファイルのコミット
活用シーン
- 01リポジトリへのコミット前チェック追加
- 02プロジェクトの言語に合わせた整形設定
- 03移行を確認したうえでHuskyを置き換え
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ dyrits/ skills --skill setup-git-hooksインストール後、Claude Code で/setup-git-hooksを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlapm.yml
詳細
Git フックを設定する
設定内容
- コミット済みの
.githooks/ディレクトリを指すcore.hooksPath(Git 組み込み機能のため、Husky は不要です) - 対応言語に対して Biome を実行する lint-staged
- (存在しない場合)Biome の設定
- Biome が対応していない言語用の Prettier(ユーザーが利用を選択した場合のみ)
- pre-commit フック内の typecheck と build スクリプト
Husky を使わない理由:Husky の役割は、実行スクリプトを .git/hooks/ にコピーすることだけです。git config core.hooksPath .githooks なら、依存関係なしで同じことができます。prepare スクリプトにより、npm install のたびに設定されるため、チームメイトもクローン時に設定されます。
手順
1. パッケージマネージャーと既存のフックツールを確認する
package-lock.json(npm)、pnpm-lock.yaml(pnpm)、yarn.lock(yarn)、bun.lockb(bun)があるか確認します。存在するものを使用してください。判断できない場合は npm を使用します。
リポジトリですでに Husky を使用している場合(.husky/ ディレクトリがある、または prepare: husky が設定されている場合)は、何かをインストールまたは書き込む前に、Husky から移行するか、Husky を維持してここで停止するかをユーザーに確認してください。
2. フォーマッターの対応範囲を整理する
リポジトリに含まれる言語を一覧にし、インストールする Biome のバージョンが対応する言語(フォーマットとリント)を確認します(ドキュメントまたは biome --help を参照してください)。Biome 2.x では HTML など、一部の言語は biome.json で有効にした場合にのみ対応するため、対応済みとして数え、手順 7 で有効にしてください。プロジェクトですでに使用しているフォーマッター(oxfmt、dprint、Prettier)は維持し、それぞれの言語をそのフォーマッターに割り当ててください。
未対応の言語が残る場合は、それぞれの言語名を挙げて Prettier の利用を提案し、ユーザーが辞退できるようにしてください。
完了条件:リポジトリ内のすべての言語が、Biome、既存のフォーマッター、(利用を受け入れた場合の)Prettier、または(利用を辞退した場合の)フォーマッターなしのいずれかに割り当てられていること。
3. 依存関係をインストールする
lint-staged と @biomejs/biome を開発用依存関係としてインストールします。ユーザーが Prettier の利用を受け入れた場合のみ、prettier もインストールします。リポジトリにすでにあるツールはスキップしてください。
4. .githooks/pre-commit を作成する
このファイルを書き込み、実行可能にします(chmod +x .githooks/pre-commit)。
#!/bin/sh
npx lint-staged
npm run typecheck --if-present
npm run build --if-present
調整:npm を確認済みのパッケージマネージャーに置き換えます(pnpm --if-present はサポートされていないため、まず package.json でスクリプトを確認し、存在しない場合は行を省略してください)。リポジトリの package.json に typecheck または build スクリプトがない場合は省略し、その旨をユーザーに伝えてください。
5. Git にフックディレクトリを指定する
git config core.hooksPath .githooks
これはローカル設定のため、新しいクローンにも必要です。すべてのインストール時に実行されるよう、package.json に prepare スクリプトを追加します。
{
"scripts": {
"prepare": "git config core.hooksPath .githooks"
}
}
既存のスクリプトに統合してください。すでに prepare がある場合は、git config の呼び出しを追加します(例:&&)。
6. .lintstagedrc を作成する
Biome は手順 2 で割り当てた言語のフォーマットとリント(check)を処理します。ユーザーが Prettier に割り当てた言語に対してのみ、Prettier のエントリーを追加してください。
{
"*.{js,jsx,ts,tsx,json,jsonc,css,graphql}": "biome check --write --no-errors-on-unmatched",
"*.{html,md,mdx,yaml,yml,scss,vue,svelte,astro}": "prettier --write"
}
各 glob にはツールを 1 つだけ指定し、リポジトリに含まれる拡張子のみを列挙してください。
7. biome.json と(必要な場合は).prettierrc を作成する
設定ファイルが存在しない場合に限り、作成してください(biome.json、biome.jsonc、.prettierrc、.prettierrc.json、prettier.config.* があるか確認してください)。手順 2 で Biome に割り当てたオプトイン言語を有効にしてください。.prettierrc は Prettier の利用が受け入れられた場合のみ作成してください。
Biome のデフォルト設定(biome.json)。書き込む前に、基本的なフォーマッター設定の希望をユーザーに確認し(以下の質問を参照)、その後ファイルを作成します。
{
"$schema": "https://biomejs.dev/schemas/latest/schema.json",
"formatter": {
"enabled": true,
"indentWidth": 2,
"lineWidth": 160,
"trailingComma": "none"
},
"javascript": {
"formatter": {
"quoteStyle": "double",
"semicolons": "always",
"arrowParentheses": "always"
}
},
"json": {
"formatter": { "enabled": true }
},
"css": {
"formatter": { "enabled": true }
},
"linter": { "enabled": true },
"organizeImports": { "enabled": true },
"assist": {
"actions": {
"source": {
"useSortedAttributes": "on",
"useSortedKeys": "on",
"useSortedProperties": "on"
}
}
}
}
biome.json を書き込む前に、基本設定をユーザーに確認してください(上記ですでに回答済み、または決定済みの項目は省略します)。
- タブとスペースのどちらを使いますか(デフォルト:スペース、幅 2)?
- 行の幅はいくつにしますか(デフォルト:160)?
- JS/TS の引用符スタイルはどれにしますか(デフォルト:ダブルクォート)?
- セミコロンとアロー関数の括弧はどうしますか(デフォルト:常に付ける/常に付ける)?
Prettier のデフォルト設定(利用が受け入れられた場合の .prettierrc。Biome の基本設定に合わせます)。
{
"useTabs": false,
"tabWidth": 2,
"printWidth": 160,
"singleQuote": false,
"trailingComma": "none",
"semi": true,
"arrowParens": "always"
}
8. 確認
-
.githooks/pre-commitが存在し、実行可能である -
git config core.hooksPathが.githooksを出力する - package.json の
prepareスクリプトがcore.hooksPathを設定する -
.lintstagedrcが存在する -
biome.jsonが存在する(または既存の Biome 設定が見つかっている) - Prettier を採用した場合、
prettier設定が存在する -
npx lint-stagedを実行し、動作することを確認する
9. コミット
このセットアップで作成または変更したファイルのみをステージします:.githooks/、.lintstagedrc、フォーマッターの設定ファイル、package.json、ロックファイルです。ほかに未コミットの変更があり、ブランチがデフォルトブランチの場合は、コミットする前に確認してください。インストールしたツール名を含むメッセージでコミットします。例:Add git hooks via core.hooksPath (lint-staged + biome)。
コミット時には新しい pre-commit フックが実行されます。すべてが動作することを確かめる、よいスモークテストです。
注意事項
core.hooksPathは.git/hooks/を全面的に上書きするため、.git/hooks/内のフックは実行されなくなりますprepareスクリプトを実行するには Git リポジトリが必要です。公開パッケージでは、対策を講じない限り、Git コンテキスト以外でのnpm installは失敗します(例:prepare": "git rev-parse && git config core.hooksPath .githooks || true")- Biome の
checkはフォーマットと lint を一度に実行します。--no-errors-on-unmatchedを指定すると、サポートされているファイルがステージされていない場合に lint-staged が不要な出力をしなくなります - Prettier は Biome が対応していないものだけを処理するため、同じファイルをめぐって両者が競合することはありません
- pre-commit は最初に lint-staged(高速で、ステージ済みファイルのみを対象)を実行し、その後に完全な型チェックとビルドを実行します
- チームで pre-commit 以上の機能(並列ステップや、lint-staged を使わない glob ごとのランナー)が必要な場合は、次のステップとして lefthook を提案してください。Husky は
core.hooksPathですでにできることに、便利なラッパーを追加するだけです