tractatus/scripts/generate-pdf-commissioners.js
TheFlow 2af47035ac refactor: remove website code and fix critical startup crashes (Phase 8)
CRITICAL FIX: Server would CRASH ON STARTUP (multiple import errors)

REMOVED (2 scripts):
1. scripts/framework-watchdog.js
   - Monitored .claude/session-state.json (OUR Claude Code setup)
   - Monitored .claude/token-checkpoints.json (OUR file structure)
   - Implementers won't have our .claude/ directory

2. scripts/init-db.js
   - Created website collections: blog_posts, media_inquiries, case_submissions
   - Created website collections: resources, moderation_queue, users, citations
   - Created website collections: translations, koha_donations
   - Next steps referenced deleted scripts (npm run seed:admin)

REWRITTEN (2 files):

src/models/index.js (29 lines → 27 lines)
- REMOVED imports: Document, BlogPost, MediaInquiry, CaseSubmission, Resource
- REMOVED imports: ModerationQueue, User (all deleted in Phase 2)
- KEPT imports: AuditLog, DeliberationSession, GovernanceLog, GovernanceRule
- KEPT imports: Precedent, Project, SessionState, VariableValue, VerificationLog
- Result: Only framework models exported

src/server.js (284 lines → 163 lines, 43% reduction)
- REMOVED: Imports to deleted middleware (csrf-protection, response-sanitization)
- REMOVED: Stripe webhook handling (/api/koha/webhook)
- REMOVED: Static file caching (for deleted public/ directory)
- REMOVED: Static file serving (public/ deleted in Phase 6)
- REMOVED: CSRF token endpoint
- REMOVED: Website homepage with "auth, documents, blog, admin" references
- REMOVED: Instruction sync (scripts/sync-instructions-to-db.js reference)
- REMOVED: Hardcoded log path (${process.env.HOME}/var/log/tractatus/...)
- REMOVED: Website-specific security middleware
- KEPT: Security headers, rate limiting, CORS, body parsers
- KEPT: API routes, governance services, MongoDB connections
- RESULT: Clean framework-only server

RESULT: Repository can now start without crashes, all imports resolve

🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 22:17:02 +13:00

187 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env node
const puppeteer = require('puppeteer');
const marked = require('marked');
const fs = require('fs').promises;
const path = require('path');
const inputPath = '/home/theflow/Desktop/Presentation-to-Commissioners.md';
const outputPath = '/home/theflow/Desktop/Presentation-to-Commissioners.pdf';
function generateHtml(title, content) {
return `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>${title}</title>
<style>
@page {
margin-top: 2cm;
margin-right: 2cm;
margin-bottom: 3.5cm;
margin-left: 2cm;
size: A4 portrait;
}
body {
font-family: 'Times New Roman', Georgia, serif;
font-size: 12pt;
line-height: 1.6;
color: #000000;
margin: 0;
padding: 0;
}
h1 {
font-size: 20pt;
font-weight: bold;
color: #000000;
margin-top: 24pt;
margin-bottom: 12pt;
border-bottom: 2pt solid #000000;
padding-bottom: 6pt;
page-break-after: avoid;
}
h2 {
font-size: 16pt;
font-weight: bold;
color: #000000;
margin-top: 18pt;
margin-bottom: 9pt;
border-bottom: 1pt solid #666666;
padding-bottom: 4pt;
page-break-after: avoid;
}
h3 {
font-size: 14pt;
font-weight: bold;
color: #000000;
margin-top: 14pt;
margin-bottom: 7pt;
page-break-after: avoid;
}
p {
margin-bottom: 12pt;
line-height: 1.6;
orphans: 3;
widows: 3;
text-align: justify;
}
ul, ol {
margin-bottom: 12pt;
padding-left: 24pt;
line-height: 1.6;
}
li {
margin-bottom: 6pt;
}
strong, b {
font-weight: bold;
}
em, i {
font-style: italic;
}
hr {
border: none;
border-top: 1pt solid #000000;
margin: 18pt 0;
}
h1, h2, h3, h4, h5, h6 {
page-break-inside: avoid;
page-break-after: avoid;
}
/* Ensure content breaks properly */
.content > * {
page-break-inside: auto;
}
</style>
</head>
<body>
<div class="content">
${content}
</div>
</body>
</html>
`;
}
async function main() {
console.log('=== Generating PDF with Custom Footer ===\n');
let browser;
try {
console.log(`Reading: ${inputPath}`);
const markdown = await fs.readFile(inputPath, 'utf8');
const titleMatch = markdown.match(/^#\s+(.+)$/m);
const title = titleMatch ? titleMatch[1] : 'Presentation to Commissioners';
console.log(`Title: ${title}`);
console.log('Converting markdown to HTML...');
const contentHtml = marked.parse(markdown);
const html = generateHtml(title, contentHtml);
console.log('Launching browser...');
browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const page = await browser.newPage();
console.log('Rendering HTML...');
await page.setContent(html, {
waitUntil: 'networkidle0'
});
console.log(`Generating PDF: ${outputPath}`);
await page.pdf({
path: outputPath,
format: 'A4',
printBackground: true,
preferCSSPageSize: false,
margin: {
top: '2cm',
right: '2cm',
bottom: '3.5cm',
left: '2cm'
},
displayHeaderFooter: true,
headerTemplate: '<div style="font-size: 1px;"></div>',
footerTemplate: `
<div style="width: 100%; font-size: 10pt; text-align: center; color: #000000; margin: 0 auto; padding-top: 10pt; font-family: 'Times New Roman', Georgia, serif;">
John Stroh https://agenticgovernance.digital 16th October 2025 Page <span class="pageNumber"></span> of <span class="totalPages"></span>
</div>
`
});
console.log('\n✓ PDF generated successfully!\n');
console.log(`Output: ${outputPath}`);
// Get page count
const stats = await fs.stat(outputPath);
console.log(`File size: ${Math.round(stats.size / 1024)}KB`);
} catch (error) {
console.error('\n✗ Error:', error.message);
console.error(error.stack);
process.exit(1);
} finally {
if (browser) await browser.close();
}
}
main();