Files
tiennm99 c7be188b5e feat(hooks): add stop hook demo and examples documentation
- Add hook_demo.js demonstrating the COMPLETE comment pattern
- Add stop-hooks-examples.md with real-world hook patterns for
  TypeScript, linting, tests, builds, and chaining multiple checks

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-08 20:54:51 +07:00

1.6 KiB

Stop Hook Examples

How It Works

Every time Claude finishes a response, the hook runs. If it outputs JSON with "decision": "block", Claude sees the reason and keeps working until the check passes.

Claude finishes → hook runs → check fails → Claude fixes → tries again
                                          → check passes → Claude stops

Pattern

<your-check-command> 2>&1 || echo '{"decision":"block","reason":"<what went wrong>"}'
  • Check passes → output nothing → Claude stops
  • Check fails → output JSON → Claude fixes and retries

Common Examples

# TypeScript type checking
npx tsc --noEmit 2>&1 || echo '{"decision":"block","reason":"TypeScript errors found"}'

# Linting
npm run lint 2>&1 || echo '{"decision":"block","reason":"Linting errors found"}'

# Tests
npm test 2>&1 || echo '{"decision":"block","reason":"Tests failing"}'

# Build
npm run build 2>&1 || echo '{"decision":"block","reason":"Build failed"}'

Chaining Multiple Checks

npm run typecheck 2>&1 || echo '{"decision":"block","reason":"Typecheck failed"}' && \
npm run lint 2>&1 || echo '{"decision":"block","reason":"Lint failed"}' && \
npm test 2>&1 || echo '{"decision":"block","reason":"Tests failing"}'

Configuration

Add hooks to .claude/settings.local.json in your project:

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "cd \"$CLAUDE_PROJECT_DIR\" && npm run typecheck 2>&1 || echo '{\"decision\":\"block\",\"reason\":\"TypeScript errors found\"}'"
          }
        ]
      }
    ]
  }
}