// tools/secretary-trunkdiff.mjs // Детерминированный дифф ствола (роль хука: до/после редактора). const SECS = [['decisions', 'РЕШЕНИЕ'], ['will', 'ВОЛЯ'], ['open', 'ОТКРЫТЫЙ'], ['consequences', 'ПОСЛЕДСТВИЕ'], ['alternatives', 'АЛЬТЕРНАТИВА'], ['doneNext', 'СДЕЛАНО']]; const nz = (s) => String(s || '').trim().toLowerCase().replace(/\s+/g, ' '); export function diffTrunk(oldP, newP) { const lines = []; for (const [sec, label] of SECS) { const o = new Map(((oldP[sec]) || []).map((e) => [nz(e.text), e])); for (const e of (newP[sec]) || []) { const prev = o.get(nz(e.text)); if (!prev) lines.push(`${label} добавлен: «${e.text}${e.why ? ' — ' + e.why : ''}»`); else if (!prev.struck && e.struck) lines.push(`${label} зачёркнут (закрыт ствол): «${e.text}»`); else if (prev.struck && !e.struck) lines.push(`${label} расчёркнут (снова актуален): «${e.text}»`); } } return lines.length ? lines.join('\n') : '(ствол не двигался этот ход)'; }