HookStackGitHub
Back to catalogue
WorkflowPreCompactPreCompactBefore context compaction · can inject⚡ blocking

Transcript backup before compaction

Automatically backs up the JSONL transcript file before every context compaction, to allow auditing or restoration.

Use cases

  • Keep a full history before compaction
  • Audit long sessions

Providers & tags

Claude Code
#backup#compact#transcript#context#audit

settings.json fragment

{
  "hooks": {
    "PreCompact": [
      {
        "hooks": [
          {
            "command": "node $CLAUDE_PROJECT_DIR/.claude/hooks/pre-compact-backup.mjs",
            "type": "command"
          }
        ],
        "matcher": ""
      }
    ]
  }
}

Script · .claude/hooks/pre-compact-backup.mjs

#!/usr/bin/env node
// Sauvegarde le résumé de compaction dans un fichier temporaire (PreCompact)
import { readFileSync, writeFileSync, mkdirSync } from 'fs';
import { join } from 'path';
import { fileURLToPath } from 'url';

export function run(
  input,
  {
    writeFile = writeFileSync,
    mkdir = mkdirSync,
    backupDir = '/tmp/claude-compact-backups',
    now = () => new Date().toISOString(),
  } = {},
) {
  const summary = input.summary ?? '';
  const sessionId = input.session_id ?? `session-${Date.now()}`;
  if (!summary) return null;

  mkdir(backupDir, { recursive: true });
  const file = join(backupDir, `${sessionId}.json`);
  writeFile(file, JSON.stringify({ session_id: sessionId, saved_at: now(), summary }, null, 2));

  return { file, message: `[pre-compact-backup] Contexte sauvegardé → ${file}\n` };
}

/* v8 ignore next 5 */
if (process.argv[1] === fileURLToPath(import.meta.url)) {
  const input = JSON.parse(readFileSync(0, 'utf8'));
  const result = run(input);
  if (result?.message) process.stderr.write(result.message);
}