#!/usr/bin/env node /** * Documentation Migration Tool * * This script facilitates the migration of documentation files from the old structure * to the new standardized structure outlined in the Documentation Organization Plan. * * Usage: * node doc-migrator.js <status> [--dryrun] * * Example: * node doc-migrator.js docs/design/WorkoutCompletion.md docs/features/workout/completion_flow.md "Workout Completion Flow" "Active" * * Options: * --dryrun Preview the migration without making any changes */ const fs = require('fs'); const path = require('path'); // Process command line arguments const args = process.argv.slice(2); const dryRunIndex = args.indexOf('--dryrun'); const dryRun = dryRunIndex !== -1; if (dryRun) { args.splice(dryRunIndex, 1); } if (args.length < 4) { console.error('Usage: node doc-migrator.js <source> <destination> <title> <status> [--dryrun]'); console.error('Example: node doc-migrator.js docs/design/WorkoutCompletion.md docs/features/workout/completion_flow.md "Workout Completion Flow" "Active"'); process.exit(1); } const [source, destination, title, status] = args; // Validate inputs if (!fs.existsSync(source)) { console.error(`Error: Source file '${source}' not found`); process.exit(1); } // Read source content console.log(`Reading source file: ${source}`); const sourceContent = fs.readFileSync(source, 'utf8'); // Extract content, removing the original title const contentWithoutTitle = sourceContent.replace(/^# .+(\r?\n|\r)/, ''); // Create new content with template const today = new Date().toISOString().slice(0, 10); const newContent = `# ${title} **Last Updated:** ${today} **Status:** ${status} **Related To:** [Fill in related component] ## Purpose [Brief description of this document's purpose] ${contentWithoutTitle} ## Related Documentation - [Add related document links] `; // In dry run mode, just show what would be migrated if (dryRun) { console.log('\n=== DRY RUN ==='); console.log(`\nWould create: ${destination}`); console.log('\nNew content preview:'); console.log('-------------------'); console.log(newContent.substring(0, 500) + '...'); console.log('-------------------'); console.log('\nNo changes were made (dry run mode)'); process.exit(0); } // Ensure destination directory exists const destDir = path.dirname(destination); if (!fs.existsSync(destDir)) { console.log(`Creating directory structure: ${destDir}`); fs.mkdirSync(destDir, { recursive: true }); } // Write new file console.log(`Writing to destination: ${destination}`); fs.writeFileSync(destination, newContent); console.log(`✅ Successfully migrated ${source} to ${destination}`); // Create a function to update the migration mapping file function updateMigrationMapping(source, destination, status = '✅') { const mappingFile = 'docs/project/documentation/migration_mapping.md'; if (!fs.existsSync(mappingFile)) { console.log(`Warning: Migration mapping file (${mappingFile}) not found. Skipping update.`); return; } console.log(`Updating migration mapping in ${mappingFile}`); let mappingContent = fs.readFileSync(mappingFile, 'utf8'); // Find the line with the source file path const sourcePathRegex = new RegExp(`\\|\\s*⏳\\s*\\|\\s*${source.replace(/\//g, '\\/')}\\s*\\|`); if (sourcePathRegex.test(mappingContent)) { // Update the status if found mappingContent = mappingContent.replace( sourcePathRegex, `| ${status} | ${source} |` ); // Update overall progress count const progressRegex = /\*\*Overall Progress\*\*: (\d+)\/(\d+) \((\d+)%\)/; const match = progressRegex.exec(mappingContent); if (match) { const completed = parseInt(match[1], 10) + 1; const total = parseInt(match[2], 10); const percentage = Math.round((completed / total) * 100); mappingContent = mappingContent.replace( progressRegex, `**Overall Progress**: ${completed}/${total} (${percentage}%)` ); } fs.writeFileSync(mappingFile, mappingContent); console.log(`✅ Updated migration mapping file`); } else { console.log(`Note: Couldn't find entry for ${source} in mapping file.`); } } // Update the migration mapping try { updateMigrationMapping(source, destination); } catch (error) { console.error(`Warning: Failed to update migration mapping: ${error.message}`); } console.log('\nMigration completed successfully!'); console.log('\nNext steps:'); console.log('1. Review the migrated document and update the purpose section'); console.log('2. Add relevant related documentation links'); console.log('3. Update any cross-references in other documents');