Hook source of truth now in hooks/, symlinked from ~/.claude/hooks/. HOOKS.md covers what each hook does and installation steps. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
31 lines
1.2 KiB
Bash
Executable File
31 lines
1.2 KiB
Bash
Executable File
#!/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
|