import articles from '../data/articles.json' with { type: 'json' }; import { agentRewriteRevisions } from '../data/agent-rewrite-revisions.mjs'; const archiveBySlug = new Map(articles.map((article) => [article.slug, article])); const forbidden = [ /synthetic-plan-hand-off/i, /productionEffect/i, /future-only/i, /plan\/scenario/i, /source cutoff/i, /editorial date/i, /planDate/i, /not-collected/i, /not-attempted/i, /future owner/i, /author trajectory/i, /развитие автора/i, /План на \d{4}/i, ]; function bodyWithoutSources(content) { return content .replace(/

Проверяемые источники<\/h2>[\s\S]*$/, '') .replace(/<[^>]+>/g, ' ') .replace(/&(?:quot|amp|lt|gt|#039);/g, ' ') .replace(/\s+/g, ' ') .trim(); } const failures = []; const seen = new Set(); for (const revision of agentRewriteRevisions) { const body = bodyWithoutSources(revision.contentHtml || ''); const issues = []; if (!archiveBySlug.has(revision.slug)) issues.push('slug отсутствует в архиве'); if (seen.has(revision.slug)) issues.push('дубликат slug'); seen.add(revision.slug); if (!revision.title || !revision.excerpt) issues.push('нет title/excerpt'); if (body.length < 5000 || body.length > 15000) issues.push('основной текст вне 5 000–15 000 знаков'); if (!/
[\s\S]*?]+alt=(?:"[^"<>]+"|'[^'<>]+')[\s\S]*?<\/figure>/.test(revision.contentHtml)) issues.push('нет figure с alt'); if (!/[\s\S]*?<\/table>/.test(revision.contentHtml)) issues.push('нет table'); if (!/
[\s\S]*?<\/code><\/pre>/.test(revision.contentHtml)) issues.push('нет pre/code');
  if (!/
    [\s\S]*?<\/ol>/.test(revision.contentHtml)) issues.push('нет ol'); if (!/

    Проверяемые источники<\/h2>[\s\S]*?https?:\/\//.test(revision.contentHtml)) issues.push('нет проверяемого источника'); const meta = forbidden.find((pattern) => pattern.test(body)); if (meta) issues.push('мета-лексика: ' + meta); if (issues.length) failures.push({ index: revision.index, slug: revision.slug, issues }); } const report = { drafts: agentRewriteRevisions.length, uniqueSlugs: seen.size, failures, nextExpectedIndex: articles.findIndex((article) => !seen.has(article.slug)) + 1 || null, }; console.log(JSON.stringify(report, null, 2)); if (failures.length) process.exitCode = 1;