c-stone-invoice-check/clowdex-download/.claude/.claude/hooks/session-reset.sh

79 lines
4 KiB
Bash
Executable file

#!/bin/bash
# SessionStart(user) hook — resets stale state on fresh session start.
# Cleans up gate files, validates agent definitions, checks permissions.
LOG_DIR="$CLAUDE_PROJECT_DIR/.claude/logs"
AGENTS_DIR="$CLAUDE_PROJECT_DIR/.claude/agents"
HOOKS_DIR="$CLAUDE_PROJECT_DIR/.claude/hooks"
mkdir -p "$LOG_DIR"
# ═══════════════════════════════════════════════════════
# 1. Reset stale gate files (prevents cross-session deadlocks)
# ═══════════════════════════════════════════════════════
rm -f "$LOG_DIR/.quality-gate-active" \
"$LOG_DIR/.tool-call-count" \
"$LOG_DIR/.compaction-occurred" 2>/dev/null
# Clean up stale session-blocks files (older than current hour)
find "$LOG_DIR" -name ".session-blocks-*" -mmin +120 -delete 2>/dev/null
# ═══════════════════════════════════════════════════════
# 2. Validate hook scripts are executable
# ═══════════════════════════════════════════════════════
if [ -d "$HOOKS_DIR" ]; then
HOOK_ISSUES=0
for hook in "$HOOKS_DIR"/*.sh; do
[ ! -f "$hook" ] && continue
if [ ! -x "$hook" ]; then
chmod +x "$hook" 2>/dev/null
HOOK_ISSUES=$((HOOK_ISSUES + 1))
fi
done
if [ "$HOOK_ISSUES" -gt 0 ]; then
echo "- \`$(date +"%Y-%m-%d %H:%M:%S")\` | SESSION | INFO | Fixed permissions on $HOOK_ISSUES hook scripts" >> "$LOG_DIR/incident-log.md"
fi
fi
# ═══════════════════════════════════════════════════════
# 3. Validate agent definitions exist and have frontmatter
# ═══════════════════════════════════════════════════════
if [ -d "$AGENTS_DIR" ]; then
AGENT_ISSUES=""
for agent in "$AGENTS_DIR"/*.md; do
[ ! -f "$agent" ] && continue
AGENT_NAME=$(basename "$agent" .md)
# Check for frontmatter (starts with ---)
if ! head -1 "$agent" | grep -q '^---'; then
AGENT_ISSUES="$AGENT_ISSUES $AGENT_NAME(no-frontmatter)"
fi
done
if [ -n "$AGENT_ISSUES" ]; then
echo "- \`$(date +"%Y-%m-%d %H:%M:%S")\` | SESSION | WARN | Agent issues:$AGENT_ISSUES" >> "$LOG_DIR/incident-log.md"
fi
fi
# ═══════════════════════════════════════════════════════
# 4. Ensure required directories exist
# ═══════════════════════════════════════════════════════
mkdir -p "$CLAUDE_PROJECT_DIR/.claude/agent-memory" \
"$CLAUDE_PROJECT_DIR/.claude/backups" \
"$CLAUDE_PROJECT_DIR/.claude/skills" \
"$CLAUDE_PROJECT_DIR/Daily Notes" 2>/dev/null
# ═══════════════════════════════════════════════════════
# 5. Prune old log files (keep last 30 days)
# ═══════════════════════════════════════════════════════
if [ -f "$LOG_DIR/audit-trail.md" ]; then
LINE_COUNT=$(wc -l < "$LOG_DIR/audit-trail.md" | tr -d ' ')
if [ "$LINE_COUNT" -gt 5000 ]; then
# Keep last 2000 lines
tail -2000 "$LOG_DIR/audit-trail.md" > "$LOG_DIR/audit-trail.md.tmp"
mv "$LOG_DIR/audit-trail.md.tmp" "$LOG_DIR/audit-trail.md"
echo "- \`$(date +"%Y-%m-%d %H:%M:%S")\` | SESSION | INFO | Pruned audit trail from $LINE_COUNT to 2000 lines" >> "$LOG_DIR/incident-log.md"
fi
fi
exit 0