본문으로 건너뛰기
cccskills
무료GitHub에 공개

writing-hooks

Guide for writing, configuring, and debugging Claude Code hooks. Use when adding, writing, or debugging hooks — including silent failures and permission errors.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

설치 방법 보기

포함된 파일(1)

  • SKILL.md5.6 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Writing Hooks

Guide for adding hooks to harness/hooks/hooks.json and writing the scripts they invoke.

Hook Types

TypeWhen to useCost
commandDeterministic checks, fast guards, file opsLow
promptSingle LLM judgment with {"ok": true/false} responseMedium
agentMulti-step LLM reasoning with file toolsHigh
httpPOST to external serviceVaries

Prefer command whenever the logic can be expressed in any executable script or the Go binary. Reserve agent/prompt for cases that genuinely need judgment — they are slower and cost tokens on every invocation.

Note: agent hooks do NOT work on PreCompact. Use command instead.

Adding a command Hook

1. Write the script

Place scripts in harness/scripts/. Use whichever language fits the task — bash, Python, and Node.js are all fine. The only requirement is that the script is executable and produces the correct exit code and stdout.

Exit codes control the hook outcome:

Exit codeMeaning
0Allow / pass
2 + JSON to stdoutBlock (PreToolUse / Stop)
0 + JSON to stdoutInject context (PostToolUse, PreCompact)

Bash example — blocking Stop hook:

#!/usr/bin/env bash
if [[ some_condition ]]; then
  echo '{"decision":"block","reason":"Explain why"}'
  exit 2
fi
exit 0

Python example — blocking Stop hook:

#!/usr/bin/env python3
import sys, json
if some_condition:
    print(json.dumps({"decision": "block", "reason": "Explain why"}))
    sys.exit(2)
sys.exit(0)

Node.js example — warning injection (PreCompact):

#!/usr/bin/env node
if (someCondition) {
  console.log(JSON.stringify({ systemMessage: "Warning: something needs attention" }));
}
process.exit(0);  // never block compaction

2. Set execution permission

Scripts without chmod +x fail silently or with permission denied, regardless of language:

chmod +x harness/scripts/your-script.py   # or .sh, .js, etc.

Alternatively, invoke the interpreter explicitly in the hook command (step 3) — then chmod +x is not required.

3. Register in hooks.json

Edit harness/hooks/hooks.json (SSOT). Reference the script via ${CLAUDE_PLUGIN_ROOT} and invoke with the appropriate interpreter:

{ "type": "command", "command": "bash \"${CLAUDE_PLUGIN_ROOT}/scripts/your-script.sh\"", "timeout": 5 }
{ "type": "command", "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/your-script.py\"", "timeout": 5 }
{ "type": "command", "command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/your-script.js\"", "timeout": 5 }

For bin/harness subcommands, use timeout: 3. For scripts, use timeout: 5.

4. Validate

make validate   # runs tests/validate-plugin.sh

Checklist for New Hooks

  • Script has the correct shebang for its language (#!/usr/bin/env bash, #!/usr/bin/env python3, #!/usr/bin/env node)
  • Script is executable (chmod +x) or interpreter is explicit in the hook command (python3 "...", node "...")
  • Script path uses ${CLAUDE_PLUGIN_ROOT}/scripts/ — never absolute paths
  • Timeout matches type: 3 for bin/harness, 5 for scripts, 30 for agents
  • Tested locally by running the script directly with its interpreter
  • make validate passes after editing hooks.json

Common Issues

Hook not running (silent failure)

Three likely causes:

  1. Not executable — check with ls -la harness/scripts/your-script.*. Either chmod +x the file or prefix the command with the interpreter (python3 "...", node "...", bash "...")
  2. Wrong path — verify the path resolves correctly; run the script directly to confirm
  3. Syntax error — run the script manually (python3 script.py, node script.js, bash -n script.sh) to surface errors before the hook fires

Permission denied

chmod +x harness/scripts/your-script.py   # or .sh, .js
# OR use explicit interpreter in hooks.json — no chmod needed

Hook fires but doesn't block

For blocking hooks (PreToolUse / Stop), you must both print JSON to stdout and exit 2. Printing alone or exiting alone won't block.

agent hook not firing on PreCompact

Agent hooks silently do nothing on PreCompact. Convert to a command script — see harness/scripts/check-wip-precompact.sh as a reference.


Event Reference

Key events and their typical use:

EventUse for
PreToolUseGuard writes, validate inputs before execution
PostToolUseCleanup, logging, tracking after tool runs
StopBlock session end if work is incomplete
PreCompactWarn (don't block) before context compaction
UserPromptSubmitInject policy context, track commands
SessionStartOne-time session initialization (once: true)

Full event list and response schemas: .claude/rules/hooks-editing.md


Related

  • harness/hooks/hooks.json — SSOT for all hook configuration
  • harness/scripts/ — All command hook scripts
  • .claude/rules/hooks-editing.md — Complete event reference and timeout guidelines
  • update-config skill — For adding automated behaviors via settings.json

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

allow1

무료

Use when generating, vectorizing, or converting images to SVG — logos, icons, illustrations, or 'allow1'/'quiver' references.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

tim-hub/powerball-harness352026년 8월 5일 업데이트

breezing

무료

Use when running the full team/breezing flow end-to-end — all tasks with parallel workers. Do NOT load for: single-task implementation, planning, review, release, or setup.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

tim-hub/powerball-harness352026년 8월 5일 업데이트

Reviews PRs that modify the Feature Table in CLAUDE.md. Use when a PR adds CC version rows or modifies docs/CLAUDE-feature-table.md.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

tim-hub/powerball-harness352026년 8월 5일 업데이트

Use when researching Claude Code or Codex upstream releases, selecting adaptations, or preparing Harness upgrades. Local-only; not for distribution.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

tim-hub/powerball-harness352026년 8월 5일 업데이트

Creates a single project slide or one-page visual summary for a repo. Use when generating a project intro image or promotional slide.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

tim-hub/powerball-harness352026년 8월 5일 업데이트

Generates product demo videos and release walkthroughs via Remotion. Use when creating video documentation or animated demos.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

tim-hub/powerball-harness352026년 8월 5일 업데이트

tim-hub의 스킬 모두 보기

이 스킬의 문제 신고