#!/bin/bash # Diagnostic script for Claude Code Monitor hooks echo "=== Claude Code Monitor - Diagnostics ===" echo "" # 1. Check config file echo "1. Checking config file..." if [ -f ~/.claude/monitor_url ]; then MONITOR_URL=$(cat ~/.claude/monitor_url) echo " ✓ Config file exists: ~/.claude/monitor_url" echo " URL: $MONITOR_URL" else echo " ✗ Config file not found: ~/.claude/monitor_url" MONITOR_URL="${CLAUDE_MONITOR_URL:-http://localhost:8000}" echo " Using: $MONITOR_URL (env/default)" fi echo "" # 2. Check backend connectivity echo "2. Testing backend connectivity..." if curl -s --connect-timeout 3 "$MONITOR_URL/health" > /dev/null 2>&1; then echo " ✓ Backend is reachable at $MONITOR_URL" HEALTH=$(curl -s "$MONITOR_URL/health") echo " Response: $HEALTH" else echo " ✗ Backend is NOT reachable at $MONITOR_URL" echo " Make sure Docker is running and backend is accessible" fi echo "" # 3. Check hooks installation echo "3. Checking hooks installation..." HOOKS_DIR="$HOME/.claude/hooks" if [ -d "$HOOKS_DIR" ]; then echo " ✓ Hooks directory exists: $HOOKS_DIR" echo " Installed hooks:" ls -lh "$HOOKS_DIR"/*.sh 2>/dev/null | awk '{print " " $9 " (" $1 ")"}' else echo " ✗ Hooks directory not found: $HOOKS_DIR" fi echo "" # 4. Check hooks are executable echo "4. Checking hook permissions..." for hook in "$HOOKS_DIR"/*.sh; do if [ -f "$hook" ]; then if [ -x "$hook" ]; then echo " ✓ $(basename $hook) is executable" else echo " ✗ $(basename $hook) is NOT executable" echo " Run: chmod +x $hook" fi fi done echo "" # 5. Test a hook manually echo "5. Testing session_start hook manually..." if [ -f "$HOOKS_DIR/session_start.sh" ]; then TEST_INPUT='{"session_id":"diagnostic-test","timestamp":1234567890}' echo " Sending test event: $TEST_INPUT" echo "$TEST_INPUT" | "$HOOKS_DIR/session_start.sh" sleep 2 # Check if event was received echo " Checking if event was received by backend..." EVENTS=$(curl -s "$MONITOR_URL/api/events?page=1&page_size=5" 2>/dev/null) if echo "$EVENTS" | grep -q "diagnostic-test"; then echo " ✓ Test event received by backend!" else echo " ✗ Test event NOT found in backend" echo " Recent events:" echo "$EVENTS" | jq '.events[0:2]' 2>/dev/null || echo "$EVENTS" fi else echo " ✗ session_start.sh not found" fi echo "" # 6. Check settings.json echo "6. Checking Claude Code settings.json..." if [ -f ~/.claude/settings.json ]; then echo " ✓ settings.json exists" echo " Configured hooks:" cat ~/.claude/settings.json | jq -r '.hooks | keys[]' 2>/dev/null | sed 's/^/ /' else echo " ✗ settings.json not found" echo " You need to configure hooks in ~/.claude/settings.json" fi echo "" # 7. Check debug log echo "7. Checking debug log..." if [ -f /tmp/claude_monitor_debug.log ]; then echo " ✓ Debug log exists: /tmp/claude_monitor_debug.log" echo " Last 10 lines:" tail -10 /tmp/claude_monitor_debug.log | sed 's/^/ /' else echo " ✗ No debug log found (this is normal if debug hook wasn't used)" fi echo "" echo "=== Diagnostics Complete ===" echo "" echo "Next steps:" echo "1. If backend is not reachable, check Docker: docker-compose ps" echo "2. If hooks are not executable, run: chmod +x ~/.claude/hooks/*.sh" echo "3. If manual test works but Claude Code doesn't send events:" echo " - Make sure Claude Code is using the correct settings.json" echo " - Try restarting Claude Code" echo " - Check if hooks are being called by adding debug output"