#!/usr/bin/env node /** * Script to enrich all existing markdown files with standardized front-matter * Usage: node scripts/enrich-all-notes.mjs [--dry-run] */ import { enrichFrontmatterOnOpen } from '../server/ensureFrontmatter.mjs'; import { VAULT_PATH as CFG_VAULT_PATH } from '../server/config.mjs'; import fg from 'fast-glob'; import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const isDryRun = process.argv.includes('--dry-run'); const VAULT_PATH = path.isAbsolute(CFG_VAULT_PATH) ? CFG_VAULT_PATH : path.resolve(__dirname, '..', CFG_VAULT_PATH); async function enrichAllNotes() { console.log('\nšŸ”§ Front-matter Enrichment Script'); console.log('=====================================\n'); if (isDryRun) { console.log('āš ļø DRY RUN MODE - No files will be modified\n'); } console.log(`šŸ“ Vault path: ${VAULT_PATH}\n`); // Find all markdown files console.log('šŸ” Scanning for markdown files...'); const files = await fg(['**/*.md'], { cwd: VAULT_PATH, absolute: true, ignore: ['**/node_modules/**', '**/.git/**', '**/dist/**'] }); console.log(`āœ“ Found ${files.length} markdown files\n`); if (files.length === 0) { console.log('No markdown files found. Exiting.\n'); return; } // Process files let enriched = 0; let skipped = 0; let errors = 0; console.log('šŸ“ Processing files...\n'); for (let i = 0; i < files.length; i++) { const file = files[i]; const relativePath = path.relative(VAULT_PATH, file); const progress = `[${i + 1}/${files.length}]`; try { if (isDryRun) { // In dry-run mode, just log what would happen console.log(`${progress} Would process: ${relativePath}`); skipped++; } else { const result = await enrichFrontmatterOnOpen(file); if (result.modified) { console.log(`${progress} āœ“ Enriched: ${relativePath}`); enriched++; } else { console.log(`${progress} ā—‹ Already compliant: ${relativePath}`); skipped++; } } } catch (error) { console.error(`${progress} āœ— Error processing ${relativePath}:`, error.message); errors++; } } // Summary console.log('\n====================================='); console.log('šŸ“Š Summary\n'); console.log(`Total files: ${files.length}`); console.log(`Enriched: ${enriched}`); console.log(`Already OK: ${skipped}`); console.log(`Errors: ${errors}`); console.log('=====================================\n'); if (isDryRun) { console.log('šŸ’” Run without --dry-run to apply changes\n'); } else if (enriched > 0) { console.log('✨ Enrichment complete!'); console.log('šŸ’” Remember to reindex Meilisearch: npm run meili:reindex\n'); } else { console.log('✨ All files are already compliant!\n'); } if (errors > 0) { process.exit(1); } } // Execute enrichAllNotes().catch(err => { console.error('\nāŒ Fatal error:', err); process.exit(1); });