#!/usr/bin/env bash # Pre-compact hook: save a copy of the session transcript before compaction. # Claude Code pipes JSON to stdin with session_id, transcript_path, cwd, etc. set -euo pipefail # Parse stdin JSON for transcript path and session ID INPUT="$(cat)" TRANSCRIPT_PATH="$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('transcript_path',''))" 2>/dev/null)" SESSION_ID="$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('session_id',''))" 2>/dev/null)" TRIGGER="$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('trigger','unknown'))" 2>/dev/null)" if [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then echo "pre-compact-backup: no transcript found, skipping" >&2 exit 0 fi # Save to ~/.claude/transcript-backups/ with timestamp BACKUP_DIR="$HOME/.claude/transcript-backups" mkdir -p "$BACKUP_DIR" TIMESTAMP="$(date +%Y%m%d-%H%M%S)" BACKUP_FILE="${BACKUP_DIR}/${TIMESTAMP}-${SESSION_ID:0:8}-${TRIGGER}.jsonl" cp "$TRANSCRIPT_PATH" "$BACKUP_FILE" # Prune backups older than 30 days find "$BACKUP_DIR" -name "*.jsonl" -mtime +30 -delete 2>/dev/null || true echo "pre-compact-backup: saved $(wc -l < "$BACKUP_FILE") lines to ${BACKUP_FILE##*/}" >&2