#!/usr/bin/env node /** * negotiation-section — парсер раздела «## Переговоры» план-файла. Возвращает круги * [{round, position}] с ДОСЛОВНЫМ текстом позиции контроллера (для наставника и арбитража). * Раздел = «## Переговоры» до следующего «## », внутри — «### Круг N» блоки. */ export function parseNegotiationSection(md) { const text = typeof md === 'string' ? md : ''; // БЕЗ флага m: `$` = конец ТЕКСТА (не строки), иначе нежадный захват обрывается на 1-й строке. // Заголовки матчим через (?:^|\n), терминатор — следующий «\n## » или конец текста. const sec = text.match(/(?:^|\n)##\s*Переговоры[^\n]*\n([\s\S]*?)(?=\n##\s|$)/i); if (!sec) return []; const body = sec[1]; const out = []; const re = /(?:^|\n)###\s*Круг\s*(\d+)[^\n]*\n([\s\S]*?)(?=\n###\s|$)/gi; let m; while ((m = re.exec(body)) !== null) { out.push({ round: Number(m[1]), position: m[2].trim() }); } return out; }