#!/usr/bin/env node /** * Human Approval Gate Tracker - Enforces inst_005 * Logs when human approval is required/obtained */ const fs = require('fs'); const path = require('path'); const APPROVAL_LOG = path.join(__dirname, '../.claude/approval-log.json'); function loadLog() { if (!fs.existsSync(APPROVAL_LOG)) { return { approvals: [] }; } return JSON.parse(fs.readFileSync(APPROVAL_LOG, 'utf8')); } function saveLog(log) { fs.writeFileSync(APPROVAL_LOG, JSON.stringify(log, null, 2)); } function logApproval(type, description) { const log = loadLog(); log.approvals.push({ timestamp: new Date().toISOString(), type, description, approved: false }); saveLog(log); console.log(`✅ Logged approval requirement: ${type}`); } function listPending() { const log = loadLog(); const pending = log.approvals.filter(a => !a.approved); if (pending.length === 0) { console.log('✅ No pending approvals\n'); return; } console.log(`\n⚠️ ${pending.length} pending approval(s):\n`); pending.forEach((a, i) => { console.log(`${i+1}. ${a.type}: ${a.description}`); console.log(` Requested: ${a.timestamp}\n`); }); } const cmd = process.argv[2]; if (cmd === 'log') { logApproval(process.argv[3], process.argv[4]); } else if (cmd === 'list') { listPending(); } else { console.log('Usage: track-human-approvals.js log '); console.log(' track-human-approvals.js list'); }