site-mariage/.claude/hooks/soul-memory-check.js
Corentin Joguet bff653acd6 first commit
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 10:30:37 +02:00

52 lines
1.8 KiB
JavaScript
Executable file

#!/usr/bin/env node
/**
* SessionStart hook — checks soul-memory last-revision and reminds the
* agent when > 14 days since last introspection.
*
* Parses _byan/soul-memory.md looking for "last-revision: YYYY-MM-DD"
* (common soul-memory protocol). If missing or stale, emits a reminder
* as additionalContext. Never blocks, always exits 0.
*/
const fs = require('fs');
const path = require('path');
const STALE_DAYS = 14;
const projectDir = process.env.CLAUDE_PROJECT_DIR || process.cwd();
const memoryPath = path.join(projectDir, '_byan', 'soul-memory.md');
function findLastRevision(content) {
const m = content.match(/last[-_ ]revision\s*[:=]\s*(\d{4}-\d{2}-\d{2})/i);
return m ? m[1] : null;
}
function daysSince(dateStr, now = new Date()) {
const then = new Date(dateStr + 'T00:00:00Z');
if (isNaN(then.getTime())) return null;
return Math.floor((now - then) / (1000 * 60 * 60 * 24));
}
let additionalContext = '';
try {
if (fs.existsSync(memoryPath)) {
const content = fs.readFileSync(memoryPath, 'utf8');
const last = findLastRevision(content);
const age = last ? daysSince(last) : null;
if (last == null) {
additionalContext = `BYAN soul-memory reminder: no last-revision marker found in _byan/soul-memory.md. Consider running the soul-revision workflow early this session.`;
} else if (age != null && age > STALE_DAYS) {
additionalContext = `BYAN soul-memory reminder: last revision was ${last} (${age} days ago, threshold ${STALE_DAYS}). Per soul-activation protocol, offer to run _byan/workflows/byan/soul-revision.md after greeting. User can postpone with "pas maintenant" (+7 days).`;
}
}
} catch {
// never block
}
if (additionalContext) {
process.stdout.write(JSON.stringify({ systemMessage: additionalContext }));
} else {
process.stdout.write('{}');
}