#!/usr/bin/env node /** * Generate Missing PDFs for Public Documents * Uses document markdown from database */ require('dotenv').config(); const { connect, close } = require('../src/utils/db.util'); const Document = require('../src/models/Document.model'); const puppeteer = require('puppeteer'); const marked = require('marked'); const fs = require('fs').promises; const path = require('path'); const MISSING_PDFS = [ 'case-studies-real-world-llm-failure-modes-appendix', 'implementation-guide-python-examples', 'tractatus-framework-enforcement-claude-code', 'research-topic-concurrent-session-architecture', 'research-topic-rule-proliferation-transactional-overhead', 'architectural-safeguards-against-llm-hierarchical-dominance-prose' ]; function generatePdfHtml(title, content) { return ` ${title}

${title}

Tractatus Framework Documentation

Ā© 2025 Tractatus Project

https://agenticgovernance.digital

${content}
`; } async function generatePdf(slug, outputDir) { const doc = await Document.findBySlug(slug); if (!doc) { console.log(`āš ļø Document not found: ${slug}`); return false; } console.log(`\nšŸ“„ Generating: ${doc.title}`); console.log(` Slug: ${slug}`); if (!doc.content_markdown) { console.log(` āŒ No markdown content`); return false; } const html = marked.parse(doc.content_markdown); const fullHtml = generatePdfHtml(doc.title, html); const browser = await puppeteer.launch({ headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox'] }); const page = await browser.newPage(); await page.setContent(fullHtml, { waitUntil: 'networkidle0' }); const pdfPath = path.join(outputDir, `${slug}.pdf`); await page.pdf({ path: pdfPath, format: 'A4', printBackground: true, margin: { top: '2cm', right: '2cm', bottom: '2cm', left: '2cm' } }); await browser.close(); console.log(` āœ… Generated: ${pdfPath}`); return true; } async function main() { await connect(); console.log('\n' + '='.repeat(70)); console.log('GENERATING MISSING PDFs'); console.log('='.repeat(70) + '\n'); const outputDir = path.join(__dirname, '../public/downloads'); let generated = 0; let failed = 0; for (const slug of MISSING_PDFS) { try { const success = await generatePdf(slug, outputDir); if (success) { generated++; } else { failed++; } } catch (error) { console.log(` āŒ Error: ${error.message}`); failed++; } } console.log('\n' + '='.repeat(70)); console.log('\nšŸ“Š Summary:'); console.log(` āœ… Generated: ${generated}`); console.log(` āŒ Failed: ${failed}`); console.log(` šŸ“¦ Total: ${MISSING_PDFS.length}`); console.log('\n' + '='.repeat(70) + '\n'); await close(); } main();