#!/usr/bin/env bash # UserPromptSubmit hook to periodically re-inject instruction files # Combats context drift in long-running sessions by re-surfacing project instructions # Supports: CLAUDE.md, AGENTS.md, RULES.md set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)" PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}" # Configuration THROTTLE_INTERVAL=3 # Re-inject every N prompts INSTRUCTION_FILES=("CLAUDE.md" "AGENTS.md" "RULES.md") # File types to discover # Use session-specific state file (per-session, not persistent) # CLAUDE_SESSION_ID should be provided by Claude Code, fallback to PPID for session isolation SESSION_ID="${CLAUDE_SESSION_ID:-$PPID}" STATE_FILE="/tmp/claude-instruction-reminder-${SESSION_ID}.state" CACHE_FILE="/tmp/claude-instruction-reminder-${SESSION_ID}.cache" # Initialize or read state if [ -f "$STATE_FILE" ]; then PROMPT_COUNT=$(cat "$STATE_FILE") else PROMPT_COUNT=0 fi # Increment prompt count PROMPT_COUNT=$((PROMPT_COUNT + 1)) echo "$PROMPT_COUNT" > "$STATE_FILE" # Check if we should inject (every THROTTLE_INTERVAL prompts) if [ $((PROMPT_COUNT % THROTTLE_INTERVAL)) -ne 0 ]; then # Not time to inject, return empty cat <