tops-bmad
Version:
CLI tool to install BMAD workflow files into any project with integrated Shai-Hulud 2.0 security scanning
81 lines (67 loc) • 2.57 kB
JavaScript
import fs from "fs-extra";
import { glob } from "glob";
/**
* Replaces project name placeholders in files
* @param {string} projectName - The project name to use for replacement
* @returns {Promise<void>}
*/
export async function replaceProjectNames(projectName) {
if (!projectName || typeof projectName !== 'string') {
throw new Error('Invalid project name provided');
}
const kebabCase = projectName
.toLowerCase()
.replace(/[^\w\s-]/g, '')
.replace(/\s+/g, '-');
const snakeCase = kebabCase.replace(/-/g, '_');
const camelCase = kebabCase.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());
const pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
const titleCase = projectName
.toLowerCase()
.split(' ')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
console.log("🔄 Updating project references...");
try {
// Only update files in BMAD-related directories (not user's project files)
const bmadFiles = await glob(".bmad/**/*.{js,jsx,ts,tsx,json,md,mdx,html,css,scss,yml,yaml,mdc}", {
nodir: true,
dot: true
});
const cursorRulesFiles = await glob(".cursor/rules/**/*.{js,jsx,ts,tsx,json,md,mdx,html,css,scss,yml,yaml,mdc}", {
nodir: true,
dot: true
});
// Files to ignore during replacement
const ignoredFiles = [
'.bmad/bmm/docs/enterprise-agentic-development.md'
];
const files = [...bmadFiles, ...cursorRulesFiles]
.filter(file => !ignoredFiles.some(ignored => file.includes(ignored)));
let updatedFiles = 0;
for (const file of files) {
try {
let content = await fs.readFile(file, 'utf8');
let updated = content;
// Replace various naming conventions
updated = updated
.replace(/Your Project/g, titleCase)
.replace(/your_project/g, snakeCase)
.replace(/your-project/g, kebabCase)
.replace(/yourProject/g, camelCase)
.replace(/YourProject/g, pascalCase);
if (updated !== content) {
await fs.writeFile(file, updated, 'utf8');
console.log(` → Updated: ${file}`);
updatedFiles++;
}
} catch (error) {
console.warn(`⚠️ Warning: Could not process ${file}: ${error.message}`);
}
}
console.log(`✅ Updated ${updatedFiles} files with project name: ${projectName}`);
} catch (error) {
console.error("❌ Error updating project references:", error.message);
throw error;
}
}