Publish rewritten technical article archive
Build and deploy / deploy (push) Failing after 15s

This commit is contained in:
2026-08-02 22:19:34 +03:00
parent 7c5b19c960
commit 2d914b543f
375 changed files with 2513 additions and 4 deletions
+58
View File
@@ -0,0 +1,58 @@
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>Проверяемые источники<\/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 (!/<figure>[\s\S]*?<img\b[^>]+alt=(?:"[^"<>]+"|'[^'<>]+')[\s\S]*?<\/figure>/.test(revision.contentHtml)) issues.push('нет figure с alt');
if (!/<table>[\s\S]*?<\/table>/.test(revision.contentHtml)) issues.push('нет table');
if (!/<pre><code>[\s\S]*?<\/code><\/pre>/.test(revision.contentHtml)) issues.push('нет pre/code');
if (!/<ol>[\s\S]*?<\/ol>/.test(revision.contentHtml)) issues.push('нет ol');
if (!/<h2>Проверяемые источники<\/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;