Skip to content
Agent Orchestration
Hook

Hooks

What evanflow runs automatically, and when. A hook is a command Claude Code fires at a fixed moment, without you asking for it.

From plugin
evanflow
41816 skills2 agents1 hook
Install
> /plugin marketplace add evanklem/evanflow
> /plugin install evanflow@evanflow

Ships with evanflow. Installing the plugin gets these hooks.

What fires, and when

PreToolUse

  • MatchesBash${CLAUDE_PLUGIN_ROOT}/hooks/block-dangerous-git.sh
Read hooks/hooks.json

Where it lives

  • hooks/block-dangerous-git.shRunsGitHub
    Read the script
    #!/bin/bash
    
    # Fail-closed: if jq is unavailable, block the command rather than allowing it.
    if ! command -v jq &>/dev/null; then
      echo "BLOCKED: jq is not installed — cannot verify command safety. Install jq or remove this hook." >&2
      exit 2
    fi
    
    INPUT=$(cat)
    COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')
    
    DANGEROUS_PATTERNS=(
      "git push"
      "git reset --hard"
      "git clean -f"
      "git branch -D"
      "git checkout \."
      "git checkout -- \."
      "git restore \."
      "git restore -- \."
      "push --force"
      "reset --hard"
    )
    
    for pattern in "${DANGEROUS_PATTERNS[@]}"; do
      if echo "$COMMAND" | grep -qE "$pattern"; then
        echo "BLOCKED: '$COMMAND' matches dangerous pattern '$pattern'. The user has prevented you from doing this." >&2
        exit 2
      fi
    done
    
    exit 0
    

Read the script before you install anything that runs on your machine. This is the one part of a plugin that acts without being asked.

Ships withevanflow

A TDD-driven iterative feedback loop for software development with Claude Code. 16 cohesive skills + 2 custom subagents walk an idea from brainstorm through implementation, with checkpoints throughout where you stay in control.

Get the whole plugin