Claude Code: 「〜したら〜して」はルールではなく hooks(settings.json)に書く
「コミット前にレビュー」のような定型の手順は CLAUDE.md に書いても守られないことがある。settings.json の hooks(例: PreToolUse)に書けば毎回確実に実行される。重い処理は "async": true で非同期にできる。
どんな問題を解決する?
- CLAUDE.md に「コミット前に必ず lint」と書いたのに、ときどき無視される
- 毎回のツール実行に付随する処理を、プロンプトに頼らず強制したい
設定例
json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "./scripts/pre-commit-check.sh" }
]
}
],
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{ "type": "command", "command": "npm run -s format", "async": true }
]
}
]
}
}- 例:
PreToolUseでgit commitを検知したら、コーディング規約の skill でレビューさせる(@imaimai17468 の運用)。 "async": trueを付けると、フックの完了を待たずに作業が進む(結果を使わない後処理向け)。
注意点
- フックはあなたの権限でシェルコマンドを実行する。他人のリポジトリの
.claude/settings.jsonをそのまま信用しない(サプライチェーン攻撃で悪用された例あり)。 - 遅いフックは体感速度を大きく落とす。
/checkupなどで定期的に見直す。 - 「指示より仕組みで縛る」という考え方は AIコーディング: 「指示を書く」は最終手段。lint・ビルドエラー・hook・skillで機械的に縛る も参照。
出典
- @imaimai17468 · 2026-03-29
- @oikon48 2026-01-26(async hooks): @oikon48 · 2026-01-26