← スキル一覧に戻る

cc-writing-hooks
by jasonkuhrt
Tool configurations
⭐ 1🍴 0📅 2026年1月22日
SKILL.md
name: cc-writing-hooks description: Use when creating or modifying Claude Code hooks in settings.json. Triggers on "add hook", "create hook", "PostToolUse", "PreToolUse", "hook not working", "hook not firing".
Writing Claude Code Hooks
Create and configure hooks in .claude/settings.json.
CRITICAL
Matcher Syntax
Matchers match TOOL NAMES only, not file paths.
// ✅ CORRECT - tool name regex
"matcher": "Write|Edit"
// ❌ WRONG - glob patterns don't work
"matcher": "Edit(**/*.md)"
"matcher": "Write(docs/*.ts)"
File path filtering must happen inside your hook script by parsing tool_input.file_path.
Absolute Paths
Tools pass absolute paths in tool_input.file_path. Your script must handle this:
# Strip project dir to get relative path
rel_path="${file_path#$CLAUDE_PROJECT_DIR/}"
# Now match against relative path
if [[ "$rel_path" =~ ^docs/.*\.md$ ]]; then
# ...
fi
Hook Structure
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": ".claude/hooks/my-hook.sh",
"timeout": 10
}
]
}
]
}
}
Hook Events
| Event | When | Common Use |
|---|---|---|
PreToolUse | Before tool runs | Validate, block |
PostToolUse | After tool succeeds | Format, lint |
UserPromptSubmit | User sends prompt | Add context |
SessionStart | Session begins | Load context |
Stop | Agent finishes | Cleanup |
Hook Input (stdin JSON)
{
"session_id": "abc123",
"transcript_path": "/path/to/transcript.jsonl",
"cwd": "/current/dir",
"hook_event_name": "PostToolUse",
"tool_name": "Edit",
"tool_input": {
"file_path": "/absolute/path/to/file.ts",
"old_string": "...",
"new_string": "..."
}
}
Exit Codes
| Code | Meaning | Behavior |
|---|---|---|
| 0 | Success | Continue, stdout shown in transcript (Ctrl-R) |
| 2 | Block | Stop tool, stderr shown to Claude |
| Other | Error | Continue, stderr shown to user |
Script Template
#!/bin/bash
input=$(cat)
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')
# Convert absolute to relative
rel_path="${file_path#$CLAUDE_PROJECT_DIR/}"
# Filter by extension/path
if [[ -z "$rel_path" || ! "$rel_path" =~ \.(ts|tsx|md)$ ]]; then
exit 0
fi
cd "$CLAUDE_PROJECT_DIR"
# Your logic here
exit 0
Notes
- Changes require restart — Hook edits don't take effect until CC restarts
- Parallel execution — Multiple matching hooks run in parallel
- 60s default timeout — Override with
"timeout": <seconds> - Debug mode —
claude --debugshows hook execution details
スコア
総合スコア
55/100
リポジトリの品質指標に基づく評価
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
✓最近の活動
1ヶ月以内に更新
+10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
✓タグ
1つ以上のタグが設定されている
+5
レビュー
💬
レビュー機能は近日公開予定です



