Skip to content
Productivity
Hook

Hooks

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

From plugin
agent-reachout
592 hooks

Claude Code

> /plugin marketplace add vibe-with-me-tools/agent-reachout
> /plugin install agent-reachout@agent-reachout

What fires, and when

Notification

  • Matches*${CLAUDE_PLUGIN_ROOT}/hooks/send-telegram.sh

PermissionRequest

  • Matches*${CLAUDE_PLUGIN_ROOT}/hooks/send-telegram.sh
Read hooks/hooks.json

Where it lives

  • hooks/send-telegram.shRunsGitHub
    Read the script
    #!/usr/bin/env bash
    set -euo pipefail
    
    if [ -z "${AGENT_REACHOUT_TELEGRAM_BOT_TOKEN:-}" ] || [ -z "${AGENT_REACHOUT_TELEGRAM_CHAT_ID:-}" ]; then
      echo "Missing AGENT_REACHOUT_TELEGRAM_BOT_TOKEN or AGENT_REACHOUT_TELEGRAM_CHAT_ID" >&2
      exit 0
    fi
    
    payload=$(cat)
    
    # Debounce Stop events — only send if a tool was used since last Stop
    # This prevents spammy "finished" messages after every conversational reply
    DEBOUNCE_FILE="/tmp/agent-reachout-last-stop"
    TOOL_FLAG="/tmp/agent-reachout-tool-used"
    event_name=$(echo "$payload" | python3 -c 'import json,sys; print(json.load(sys.stdin).get("hook_event_name",""))' 2>/dev/null || echo "")
    
    # Track when tools are used (Notification/PermissionRequest indicate active work)
    if [ "$event_name" = "Notification" ] || [ "$event_name" = "PermissionRequest" ]; then
      touch "$TOOL_FLAG"
    fi
    
    if [ "$event_name" = "Stop" ]; then
      # Only notify if tools were used since last Stop
      if [ ! -f "$TOOL_FLAG" ]; then
        exit 0
      fi
      rm -f "$TOOL_FLAG"
      # Also debounce rapid successive Stops (within 10s)
      now=$(date +%s)
      if [ -f "$DEBOUNCE_FILE" ]; then
        last_stop=$(cat "$DEBOUNCE_FILE" 2>/dev/null || echo 0)
        elapsed=$((now - last_stop))
        if [ "$elapsed" -lt 10 ]; then
          exit 0
        fi
      fi
      echo "$now" > "$DEBOUNCE_FILE"
    fi
    
    message=$(echo "$payload" | python3 -c '
    import json
    import sys
    from datetime import datetime
    
    payload = json.load(sys.stdin)
    event = payload.get("hook_event_name", "Unknown")
    
    if event == "Notification":
        notification_type = payload.get("notification_type", "")
        title = payload.get("title", "")
        message = payload.get("message", "")
        # Build a clean, informative notification
        lines = []
        if title:
            lines.append(f"🔔 {title}")
        elif notification_type:
            lines.append(f"🔔 Claude Code: {notification_type}")
        else:
            lines.append("🔔 Claude Code: Notification")
        if message:
            # Truncate long messages to keep Telegram tidy
            msg = message if len(message) <= 500 else message[:497] + "..."
            lines.append(msg)
        print("\n".join(lines))
    
    elif event == "PermissionRequest":
        tool_name = payload.get("tool_name", "unknown tool")
        tool_input = payload.get("tool_input", {})
        lines = [f"⚠️ Claude Code needs permission: {tool_name}"]
        if isinstance(tool_input, dict):
            for key in ("command", "file_path", "pattern", "url", "query", "message"):
                if key in tool_input:
                    detail = str(tool_input[key])
                    if len(detail) > 200:
                        detail = detail[:197] + "..."
                    lines.append(f"  {key}: {detail}")
                    break
        print("\n".join(lines))
    
    elif event == "Stop":
        reason = payload.get("stop_reason") or payload.get("reason") or ""
        ts = datetime.now().strftime("%H:%M")
        if reason:
            print(f"✅ Claude Code finished at {ts}\nReason: {reason}")
        else:
            print(f"✅ Claude Code finished at {ts}")
    
    else:
        print(f"Claude Code: {event}")
    ')
    
    curl -sS -X POST "https://api.telegram.org/bot${AGENT_REACHOUT_TELEGRAM_BOT_TOKEN}/sendMessage" \
      --data-urlencode "chat_id=${AGENT_REACHOUT_TELEGRAM_CHAT_ID}" \
      --data-urlencode "text=${message}" \
      > /dev/null
    

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.

Stats
58
Stars
11
Forks
Quiet
Maintenance
TypeScript
Language
MIT
License
Last commit
Created

Repo: vibe-with-me-tools/agent-reachout

@vibe-with-me-tools
Ships withagent-reachout

Let your Claude Code message you on Telegram when it needs decisions or finishes work, even when you’re away from your desk. Claude Code → Agent Reachout → Telegram → Human reply → Agent continues

Stars on GitHub

Momentum

stars in total
59
Star history of vibe-with-me-tools/agent-reachout on GitHub, a chart by star-history.com

More plugins that ship hooks.

i-have-adhd

i-have-adhd

A skill that shapes Claude Code's output for readers with ADHD: it leads with the next action, numbers multi-step work, restates state across turns, drops tangents, gives specific time estimates, and makes progress visible. Invoke it with /i-h.

1 skill1 hook60k
@ayghri@ayghri
Install Plugin
pua

pua

A Claude Code plugin that makes the assistant work harder when it stalls or repeats failures. It adds pressure-style coaching, plus skills for workplace reminders and senior engineer, CTO and team-lead modes for planning and execution.

12 skills+320k
@tanweai@tanweai
Install Plugin
claude-obsidian

claude-obsidian

Turns the sources you read, such as papers, articles and transcripts, into a linked wiki of Markdown notes in Obsidian. Claude keeps sources and citations so every summary can be traced back to its origin.

15 skills+216k
@agricidaniel@agricidaniel
Install Plugin
obsidian-second-brain

obsidian-second-brain

Gives Claude Code a persistent second brain stored as plain markdown in an Obsidian vault. Notes rewrite themselves as new sources arrive, and scheduled agents handle research synthesis and note capture.

1 skill+25.3k
@eugeniughelbur@eugeniughelbur
Install Plugin
arscontexta

arscontexta

A Claude Code plugin that builds a personal knowledge system through conversation, with skills for adding knowledge domains, checking vault health, getting methodology guidance, and evolving the system over time.

10 skills+23.5k
@agenticnotetaking@agenticnotetaking
Install Plugin
pro-workflow

pro-workflow

A Claude Code workflow plugin that learns from your corrections and keeps a self-correcting memory across sessions. It adds skills for agent teams, parallel worktree batch changes, bug capture as GitHub issues, project auto-setup and context compaction.

41 skills+32.9k
@rohitg00@rohitg00
Install Plugin
engram

engram

Helps you learn any topic with a first-principles curriculum, guided tutoring, and spaced review that schedules free-recall practice. Includes coaching for retention stats and study strategy.

3 skills+21.5k
@nagisanzenin@nagisanzenin
Install Plugin
hey

hey

A command line tool for HEY that lets you read and send email, manage contacts, labels, calendars, todos, habits, time tracking and journal entries from the terminal or from your coding agent.

1 skill1 hook423
@basecamp@basecamp
Install Plugin

Questions about the hooks in agent-reachout.

Which coding agents can use the hooks in agent-reachout?
The hooks in agent-reachout install in Claude Code and Cursor: each runs Claude Code hooks from .claude/settings.json, so copy the hooks there.