UNPKG

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
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; } }