Skip to content
cccskills
FreePublished on GitHub

hook-scaffold

新しいフックの雛形(スクリプト + 配線)を本リポジトリの規約どおりに生成する。

イベント選定(PreToolUse / PostToolUse / Stop / SessionStart 等)とブロッキング可否を対話的に決め、 ai-agents/hooks/ か ai-agents/settings/<cli>/hooks/ への配置と、hooks.json / settings.json への配線まで行う。

新しいフックを追加したいときに `/hook-scaffold <フック名> [用途の一言]` で呼び出す。

The English summary is being prepared. Showing the original description.

See how to install

Files included (1)

  • SKILL.md10.6 KB

SKILL.md (original)

Review the instructions the agent will receive before you install.

/hook-scaffold スキル

Goal

新規フックの追加を、スクリプト雛形の生成から配線・検証まで、 本リポジトリの規約どおりに一貫した手順で完了させる。

Workflow

Step 1: 引数パース

$ARGUMENTS を以下のように解釈する:

  • 第1引数: 生成するフック名(以降 HOOK_NAME。ファイル名は HOOK_NAME.sh)
  • 第2引数以降: そのフックの用途の一言(自由記述、省略可)

引数なしの場合は対話でフック名と用途を尋ねる。HOOK_NAME は既存に倣い lowercase + ハイフンにする。

Step 2: 衝突チェックと既存重複の確認

ai-agents/hooks/HOOK_NAME.sh と ai-agents/settings/*/hooks/HOOK_NAME.sh の いずれにも存在しないこと を確認する。存在する場合は作成せず中断し、既存スクリプトの修正を案内する。

あわせて既存フックを読み、同種の処理(formatter / lint / guard / notify)が既にないか確認する。 formatter 系は 1 ファイル種別 1 スクリプトで揃っているので、対象拡張子が既存とかぶる場合は新規追加ではなく既存への追記を提案する。

Step 3: イベント選定とブロッキング可否の確認

「何をきっかけに走らせたいか」からイベントを選ぶ。現在このリポジトリが配線しているのは以下だけで、他イベントを使う場合は公式ドキュメント(https://code.claude.com/docs/en/hooks)で最新のスキーマを確認する。

用途claude のイベント現行の配線配線ファイル
起動時の環境チェックSessionStarttoolchain-doctor.shsettings.json
コンパクション前後の退避PreCompact / SessionStart(matcher compact)context-anchor-save / -restore.shhooks.json
毎プロンプトの文脈注入UserPromptSubmitgit-state.shhooks.json
Bash 実行前の遮断PreToolUse(matcher Bash)guard-dangerous-bash.shhooks.json
ファイル編集後の整形PostToolUse(matcher Write|Edit|MultiEdit)formatter 6 本hooks.json
応答終了時のまとめ処理Stoplint-changed.sh ほかhooks.json
通知Notificationnotify-macos.shsettings.json
worktree 作成時WorktreeCreateworktree-create.shsettings.json

選定時に必ず確認すること:

  • そのイベントは exit 2 でブロックできるか。PreToolUse はブロックできるが PostToolUse はできない。ブロック不可のイベントに強制ロジックを載せると「黙って効かないフック」になる。
  • 終了コードの意味: 0 = 正常(stdout が JSON なら構造化出力として解釈される)、2 = ブロッキング(stderr がメッセージ)、それ以外 = 非ブロッキングエラー。
  • hookSpecificOutput の形はイベントごとに違う。使う場合は転記済みの記憶に頼らず、必ず上記ドキュメントで確認する。

report-only(報告のみで止めない)で足りるなら、exit 0 + stderr への出力に留めるのが既定。

Step 3.5: 置き場所の決定

.claude/rules/hook-authoring.md の判断軸に従い、claude 側の置き場所を決める(以降 HOOK_ROOT)。判断が割れる場合はユーザーに確認する。

ルート選ぶ条件配線先
ai-agents/hooksこのマシン・このクローンに依存しない(既定)ai-agents/hooks/hooks.json
ai-agents/settings/claude/hooksmacOS GUI・ローカル FS レイアウト・ローカル mise のツールチェーンに依存するsettings/claude/settings.json

サイドカー(設定ファイル等)を読むなら $HOME の絶対パスではなく SCRIPT_DIR 基準にする。plugin として動くときに $HOME/.claude/hooks/ は存在しない。

Step 4: 配線先の確認

既定は claude のみ。codex へは次の基準で展開する。cursor / copilot の設定は廃止済み(ADR-0009)。

  • 展開する: PreToolUse(matcher Bash)の遮断フック。入力が tool_input.command、遮断が exit 2 + stderr で claude と同じ契約(既存は guard-dangerous-bash)。
  • 展開しない: Stop / SessionStart / WorktreeCreate / macOS 通知など Claude 固有機構に依存するもの。
  • 上記以外は、Codex 側のイベントと入力形式を公式ドキュメント(https://developers.openai.com/codex/hooks)で確認してから決める。

codex 用は ai-agents/settings/codex/hooks/ に claude 版とは別の自前コピーを置く。判定部が同じでも共有しない(claude 側の仕様変更に引きずられないため)。

Step 5: スクリプト生成

HOOK_ROOT/HOOK_NAME.sh を既存フック準拠で作る。定型は次のとおり (インデントは既存フックに合わせてタブにする。以下は markdownlint の hard-tab 検査を避けるためスペース表記にしてあるので、書き出し後に shfmt -w を通して揃える):

#!/bin/bash
# mise-managed tools (non-interactive contexts do not run mise activate)
export PATH="${MISE_DATA_DIR:-$HOME/.local/share/mise}/shims:$PATH"
# stdin から JSON を読み込む
INPUT=$(cat)

FILE_PATH=$(echo "$INPUT" | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(data.get('tool_input', {}).get('file_path', ''))
")

# 対象外なら何もせず抜ける
if [[ "$FILE_PATH" != *.EXT ]]; then
  exit 0
fi

if ! COMMAND "$FILE_PATH" 2>&1; then
  echo "[HOOK_NAME] fail: $FILE_PATH" >&2
  exit 1
fi

Step 6: 配線

JSON は既存エントリの末尾に追記する形にし、並び順の慣習(formatter は既存の並びに続ける)に従う。

  • claude(HOOK_ROOT が ai-agents/hooks): ai-agents/hooks/hooks.json の hooks.<Event> に {"type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}/hooks/HOOK_NAME.sh\""} を追記する。 PostToolUse なら既存の matcher: "Write|Edit|MultiEdit" グループの hooks 配列に足す(新しいグループを作らない)。
  • claude(HOOK_ROOT が ai-agents/settings/claude/hooks): ai-agents/settings/claude/settings.json の hooks.<Event> に {"type": "command", "command": "~/.claude/hooks/HOOK_NAME.sh"} を追記する。
  • codex: ai-agents/settings/codex/hooks.json の hooks.PreToolUse(matcher: "^Bash$")に {"type": "command", "command": "bash \"$HOME/.codex/hooks/HOOK_NAME.sh\"", "timeout": 10} を追記する (timeout は秒)。

編集後、触った JSON すべてを jq . <file> にかけてパースできることを必ず確認する。

Step 7: 配布経路の確認

mise.toml の claude-settings-copy / codex-settings-copy は ai-agents/scripts/copy-entries.sh でディレクトリ単位に配るため、 既存ディレクトリにファイルを 1 本足すだけなら mise / copy-entries.sh の変更は不要。 新しいディレクトリ階層を導入する場合のみタスク追加を検討する。この前提自体を毎回確認する。

ai-agents/hooks/ に置いたフックは plugin(ai-agents@my-pde)と claude-settings-copy の 両方から配られ、ローカルでは二重に発火する。移行期の既定の挙動なので、そのつもりで report-only か冪等かを設計する。

Step 8: 検証

以下を実行し、エラーを潰してから完了とする。

  1. chmod +x されていること(既存フックに合わせる)
  2. shfmt -d <script> と shellcheck <script>(mise run lint:shell で一括でも可)
  3. jq . で配線先 JSON がパースできること
  4. サンプル入力での単体実行: echo '{"tool_input":{"file_path":"/tmp/x.sh"}}' | ./HOOK_NAME.sh
  5. デプロイは自動実行せず、mise run settings-copy で配布される旨を案内する(codex に配線した場合は、配布後に Codex の /hooks で信頼レビューが要る旨も添える)
  6. 発火確認は claude --debug 等で行う旨を案内する

Notes

  • 既存スクリプトの上書き防止が最重要。Step 2 の非存在確認を必ず先に行い、衝突時は作成せず中断する。
  • イベント一覧や JSON スキーマを SKILL.md に転記しない。Claude Code のフック仕様は変化が速いため、 本文には「このリポジトリ固有の配線規約」だけを書き、詳細は https://code.claude.com/docs/en/hooks を参照させる。
  • 既定は claude 専用。codex への展開は Step 4 の基準に限る。
  • Step 6 の JSON 編集を誤ると設定全体が読めなくなるため、jq での妥当性確認を飛ばさない。
  • 誤爆でフックが生成されるのを防ぐため disable-model-invocation: true を付けている。明示呼び出し専用。
  • 本スキルは「新規フックの立ち上げ」専任。既存フック定義の静的検査は agents-lint 系の役割で、そちらには踏み込まない。

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

Convert Claude markdown subagent files to Codex CLI TOML format. Parses YAML frontmatter and body, applies model/permission/tool mappings, and outputs to agents/codex/<name>.toml.

The English summary is being prepared. Showing the original description.

hodanov/my-pde3Updated Oct 18, 2026

Create or update a Markdown blog draft from recent work and export it with `YYYY-MM-DD_slug.md` naming. Output directory can be set via environment variable or CLI option; if missing, ask the user and pass it explicitly.

The English summary is being prepared. Showing the original description.

hodanov/my-pde3Updated Oct 18, 2026

変更をコミットしてドラフトPRを作成する一連のGit/ghワークフロー。ユーザーが「コミットして」「PR作って」「draft PR」等を求めたときに使用し、status/diff確認・命令形コミット・push・gh pr create --draft(--assignee hodanov)まで実行する。ユーザーの明示リクエストが無くても、実装完了後にcommitやPRが必要になった場面(dev-workflowのcommitフェーズ等)では必ずこれを使う。`git commit` や `gh pr create` を単体でBash直接実行しない。

The English summary is being prepared. Showing the original description.

hodanov/my-pde3Updated Oct 18, 2026

1 つの作業ツリーに混ざった差分を、変更理由ごとの意味単位のコミットへ分割する。ユーザーが「コミットを分割して」「意味単位で分けて」「commit-split」等を求めたとき、または機能追加・付随リファクタ・設定/ドキュメント修正が 1 コミットに混在していると気づいたときに使用する。分割案を提示して承認を得てからステージし、コミットごとに単独で成立することを確認する。メッセージ規約・push・PR の作成は commit-and-draft-pr へ委譲する。

The English summary is being prepared. Showing the original description.

hodanov/my-pde3Updated Oct 18, 2026

gitleaks + pre-commit を使ってローカルコミット時のクレデンシャル混入を機械的にブロックする。「クレデンシャル漏洩防止」「シークレット混入対策」「gitleaks」「pre-commit シークレット」「credential leak prevention」に言及した場合に使用する。

The English summary is being prepared. Showing the original description.

hodanov/my-pde3Updated Oct 18, 2026

依存パッケージ(Go modules / npm / Terraform provider / GitHub Actions / pre-commit 等)の アップグレードを、outdated 検出 → CHANGELOG・破壊的変更の確認 → 更新 → lint/test 検証 → コミットまで一連の手順で安全に適用する。「依存更新」「パッケージを上げて」「dependency update」 「go get -u」「npm update」「provider を上げる」等に言及されたときに使用する。

The English summary is being prepared. Showing the original description.

hodanov/my-pde3Updated Oct 18, 2026

See all skills by hodanov

Report a problem with this skill