mirror of
https://github.com/DocNR/POWR.git
synced 2025-04-23 01:01:27 +00:00
150 lines
4.6 KiB
JavaScript
150 lines
4.6 KiB
JavaScript
#!/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 <source> <destination> <title> <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');
|