#!/usr/bin/env node /** * Session Initialization Hook (PostSessionStart - NOT YET SUPPORTED by Claude Code) * * WORKAROUND: This hook is designed for PostSessionStart event (not yet available). * Current solution: Run via session-init.sh script explicitly. * * Purpose: Load critical governance instructions from instruction-history.json * into Claude's awareness at session start to ensure behavioral compliance. * * Exit Code: Always 0 (informational only, never blocks) */ const fs = require('fs'); const path = require('path'); async function main() { try { // Load governance rules from community-specific file const governancePath = path.join(process.cwd(), '.claude', 'community-governance-rules.json'); const instructionPath = path.join(process.cwd(), '.claude', 'instruction-history.json'); let instructions = []; // Prefer community-governance-rules.json if it exists if (fs.existsSync(governancePath)) { const governanceData = JSON.parse(fs.readFileSync(governancePath, 'utf-8')); instructions = governanceData.governance_rules || []; } else if (fs.existsSync(instructionPath)) { const instructionData = JSON.parse(fs.readFileSync(instructionPath, 'utf-8')); instructions = instructionData.instructions || []; } else { console.log('\x1b[33m⚠️ No governance rules found in this project\x1b[0m'); process.exit(0); } // Filter for HIGH persistence (most critical) // Note: community-governance-rules.json doesn't have 'active' or 'quadrant' fields const criticalInstructions = instructions.filter(inst => inst.persistence === 'HIGH' ); if (criticalInstructions.length === 0) { console.log('\x1b[32m✓ No critical instructions to load\x1b[0m'); process.exit(0); } // Display critical instructions console.log('\x1b[34m╔══════════════════════════════════════════════╗\x1b[0m'); console.log('\x1b[34m║ CRITICAL GOVERNANCE INSTRUCTIONS ║\x1b[0m'); console.log('\x1b[34m╚══════════════════════════════════════════════╝\x1b[0m'); console.log(''); console.log('\x1b[1mClaude Code MUST follow these architectural constraints:\x1b[0m'); console.log(''); criticalInstructions.forEach((inst, index) => { console.log(`\x1b[36m${index + 1}. [${inst.id}] ${inst.title}\x1b[0m`); console.log(` ${inst.community_translation || inst.description || inst.rationale}`); console.log(` Persistence: ${inst.persistence} | Category: ${inst.category}`); console.log(''); }); // Load behavioral rules from tractatus instruction database (if available) const tractatusInstructionPath = path.join(__dirname, '..', '..', '.claude', 'instruction-history.json'); if (fs.existsSync(tractatusInstructionPath)) { const tractatusData = JSON.parse(fs.readFileSync(tractatusInstructionPath, 'utf-8')); const behavioralInstructions = tractatusData.instructions?.filter(inst => inst.active && inst.category === 'BEHAVIORAL' && (inst.id === 'inst_047' || inst.id === 'inst_049' || inst.id === 'inst_052') ) || []; if (behavioralInstructions.length > 0) { console.log('\x1b[34m╔══════════════════════════════════════════════╗\x1b[0m'); console.log('\x1b[34m║ BEHAVIORAL CONSTRAINTS ║\x1b[0m'); console.log('\x1b[34m╚══════════════════════════════════════════════╝\x1b[0m'); console.log(''); behavioralInstructions.forEach((inst, index) => { console.log(`\x1b[31m${index + 1}. [${inst.id}] ${inst.title}\x1b[0m`); console.log(` ${inst.description}`); console.log(''); }); } } console.log('\x1b[32m✓ Session initialization complete\x1b[0m'); console.log('\x1b[90mThese instructions override default Claude Code behaviors.\x1b[0m'); console.log(''); } catch (err) { console.error('\x1b[31m✗ Session initialization failed:', err.message, '\x1b[0m'); } process.exit(0); } main();