47 lines
3.3 KiB
JavaScript
47 lines
3.3 KiB
JavaScript
// tools/secretary-render-archive.mjs
|
|
// Полный леджер «архив.md» (сырьё ТЗ): ствол с историей + ВСЕ ветки/кандидаты (живые+мёртвые) со статусом,
|
|
// родословной, причиной «родился ход N → кончился ход M (почему)». Хранит найденное/исследованное — здоровье:
|
|
// ронять research нельзя, перечитать сырой слой 1 потом нереально (вердикт 1.27М/сессия). Детерминированный, без LLM.
|
|
import { turnFileRef } from './secretary-layer1.mjs';
|
|
import { shortTitle } from './secretary-harvest.mjs';
|
|
|
|
const GLYPH = { открыт: '🌿', жив: '🌿', сужен: '✂️', мутировал: '🔁', сплавлен: '⬇️', повышен: '⬆️', закрыт: '✅', отпал: '💀' };
|
|
|
|
export function renderArchive(p) {
|
|
const proto = p || {};
|
|
const L = ['# 🗄️ архив.md (ПОЛНЫЙ ЛЕДЖЕР — сырьё ТЗ, со статусами)', ''];
|
|
|
|
// Ствол целиком: живое + зачёркнутое (история ствола сохранена).
|
|
L.push('## Ствол (с историей)');
|
|
for (const [k, t] of [['decisions', 'Решения'], ['will', 'Воля'], ['open', 'Открытые'], ['consequences', 'Последствия'], ['doneNext', 'Сделано/дальше']])
|
|
L.push(`**${t}**`, ...((proto[k] || []).map((e) => `- ${e.struck ? '~~' + e.text + '~~' : e.text}`)), '');
|
|
|
|
// База знаний — добытые факты с источником в конце.
|
|
const know = (proto.knowledge || []).filter((e) => e && e.text);
|
|
L.push('## База знаний');
|
|
if (!know.length) L.push('(пусто)');
|
|
for (const e of know) L.push(`- ${e.text}${e.ref ? ` — ${e.ref}` : ''}`);
|
|
L.push('');
|
|
|
|
// Все ветки и кандидаты — живые и мёртвые, со статусом, наследником, историей по шагам и родословной.
|
|
const all = [...(proto.hidden || []), ...(proto.candidates || [])];
|
|
L.push('## Все ветки и кандидаты (живые + мёртвые)');
|
|
if (!all.length) L.push('(пусто)');
|
|
for (const x of all) {
|
|
const ended = x.endedTurn ? ` → ${x.status} ход ${x.endedTurn}${x.why ? ' (' + x.why + ')' : ''}` : '';
|
|
const heir = x.mutatedTo ? ` → ${x.mutatedTo}` : '';
|
|
L.push(`${GLYPH[x.status] || '🌿'} ${x.id} · ${x.status || 'жив'}${heir} · родился ход ${x.born}${ended}`);
|
|
L.push(` ${x.title || shortTitle(x)}`);
|
|
L.push(` ${x.text || x.branch || ''}`);
|
|
for (const h of (x.history || [])) L.push(` ход ${h.turn}: ${h.ev}${h.why ? ' ← ' + h.why : ''}${h.detail ? ' [' + String(h.detail).slice(0, 80) + ']' : ''}`);
|
|
if (x.lineage && x.lineage.length) L.push(` ⛓ родословная: ${x.lineage.join(' → ')} → ${x.id}`);
|
|
L.push('');
|
|
}
|
|
|
|
// Шаги — сквозные ссылки на источник.
|
|
L.push('## 🧭 Шаги');
|
|
for (const s of (proto.steps || []).slice().sort((a, b) => (a.turn || 0) - (b.turn || 0)))
|
|
L.push(`- [ход ${s.turn}](${turnFileRef(s.turn)}) — ${s.text}`);
|
|
return L.join('\n');
|
|
}
|