Lesson completed!
-

Hooks

Hooks

Hooks let you run custom scripts before or after Claude performs actions, enabling powerful automation.

What Are Hooks?

Hooks are scripts that execute at specific points:

  • PreToolUse - Before Claude uses a tool
  • PostToolUse - After Claude uses a tool
  • PreEdit - Before file modifications
  • PostEdit - After file modifications

Configuring Hooks

Add hooks to your settings:

{
  "hooks": {
    "PostEdit": {
      "command": "npm run lint:fix",
      "pattern": "**/*.ts"
    }
  }
}

Common Hook Patterns

Auto-format on Edit

{
  "hooks": {
    "PostEdit": {
      "command": "prettier --write",
      "pattern": "**/*.{ts,tsx,js,jsx}"
    }
  }
}

Auto-lint

{
  "hooks": {
    "PostEdit": {
      "command": "eslint --fix",
      "pattern": "src/**/*.ts"
    }
  }
}

Run Tests on Change

{
  "hooks": {
    "PostEdit": {
      "command": "npm test -- --related",
      "pattern": "src/**/*.ts"
    }
  }
}

Notify on Complete

{
  "hooks": {
    "PostToolUse": {
      "command": "terminal-notifier -message 'Task complete'",
      "tools": ["bash"]
    }
  }
}

Hook Configuration Options

{
  "hooks": {
    "PostEdit": {
      "command": "string",      // Command to run
      "pattern": "glob",        // File pattern match
      "tools": ["array"],       // Tool types to match
      "timeout": 30000,         // Timeout in ms
      "continueOnError": true   // Don't fail on hook error
    }
  }
}

Advanced Patterns

Chain Multiple Hooks

{
  "hooks": {
    "PostEdit": [
      {
        "command": "prettier --write",
        "pattern": "**/*.ts"
      },
      {
        "command": "eslint --fix",
        "pattern": "**/*.ts"
      }
    ]
  }
}

Conditional Hooks

{
  "hooks": {
    "PostEdit": {
      "command": "./scripts/validate.sh",
      "pattern": "src/critical/**/*"
    }
  }
}

Best Practices

Keep Hooks Fast

Slow hooks break flow:

// Good - fast
{ "command": "prettier --write" }
 
// Bad - slow
{ "command": "npm run build && npm test" }

Fail Gracefully

{
  "continueOnError": true,
  "timeout": 5000
}

Log Output

Debug with verbose logging:

{
  "command": "./hook.sh 2>&1 | tee hook.log"
}

Next Steps

In the next module, you'll learn about testing and CI/CD integration for production deployments.