chore: refactor installer to use modern JS patterns and improve code clarity

## CHANGES

- Replace require with node:path import
- Add block scoping to switch cases
- Remove unused options parameter from update
- Use optional chaining for ideConfig check
- Replace forEach with for...of loops
- Use template literals for string concatenation
- Add early return to avoid else block
- Update spell check dictionary entries
This commit is contained in:
Kayvan Sylvan 2025-06-15 10:25:14 -07:00
parent 47794f301d
commit 17cb6d866c
3 changed files with 19 additions and 13 deletions

View File

@ -27,6 +27,7 @@
"Luxon",
"MERN",
"mgmt",
"nodir",
"Nuxt",
"overcommitting",
"pasteable",
@ -58,6 +59,8 @@
"Turborepo",
"Underserved",
"unredacted",
"upgrader",
"upgraders",
"VARCHAR",
"venv",
"vercel",

View File

@ -66,9 +66,9 @@ program
.description('Update existing BMAD installation')
.option('--force', 'Force update, overwriting modified files')
.option('--dry-run', 'Show what would be updated without making changes')
.action(async (options) => {
.action(async () => {
try {
await installer.update(options);
await installer.update();
} catch (error) {
console.error(chalk.red('Update failed:'), error.message);
process.exit(1);

View File

@ -1,4 +1,4 @@
const path = require("path");
const path = require("node:path");
const chalk = require("chalk");
const ora = require("ora");
const inquirer = require("inquirer");
@ -257,11 +257,12 @@ class Installer {
]);
switch (action) {
case "upgrade":
case "upgrade": {
console.log(chalk.cyan("\n📦 Starting v3 to v4 upgrade process..."));
const V3ToV4Upgrader = require("../../upgraders/v3-to-v4-upgrader");
const upgrader = new V3ToV4Upgrader();
return await upgrader.upgrade({ projectPath: installDir });
}
case "alongside":
return await this.performFreshInstall(config, installDir, spinner);
case "cancel":
@ -299,7 +300,7 @@ class Installer {
switch (action) {
case "force":
return await this.performFreshInstall(config, installDir, spinner);
case "different":
case "different": {
const { newDir } = await inquirer.prompt([
{
type: "input",
@ -310,6 +311,7 @@ class Installer {
]);
config.directory = newDir;
return await this.install(config);
}
case "cancel":
console.log("Installation cancelled.");
return;
@ -330,7 +332,9 @@ class Installer {
if (modifiedFiles.length > 0) {
spinner.warn("Found modified files");
console.log(chalk.yellow("\nThe following files have been modified:"));
modifiedFiles.forEach((file) => console.log(` - ${file}`));
for (const file of modifiedFiles) {
console.log(` - ${file}`);
}
const { action } = await inquirer.prompt([
{
@ -395,9 +399,9 @@ class Installer {
if (config.ide) {
const ideConfig = configLoader.getIdeConfiguration(config.ide);
if (ideConfig && ideConfig.instructions) {
if (ideConfig?.instructions) {
console.log(
chalk.bold("To use BMAD agents in " + ideConfig.name + ":")
chalk.bold(`To use BMAD agents in ${ideConfig.name}:`)
);
console.log(ideConfig.instructions);
}
@ -422,7 +426,7 @@ class Installer {
}
// Legacy method for backward compatibility
async update(options) {
async update() {
console.log(chalk.yellow('The "update" command is deprecated.'));
console.log(
'Please use "install" instead - it will detect and offer to update existing installations.'
@ -436,9 +440,8 @@ class Installer {
ide: null,
};
return await this.install(config);
} else {
console.log(chalk.red("No BMAD installation found."));
}
console.log(chalk.red("No BMAD installation found."));
}
async listAgents() {
@ -446,9 +449,9 @@ class Installer {
console.log(chalk.bold("\nAvailable BMAD Agents:\n"));
agents.forEach((agent) => {
for (const agent of agents) {
console.log(chalk.cyan(` ${agent.id.padEnd(20)}`), agent.description);
});
}
console.log(
chalk.dim("\nInstall with: npx bmad-method install --agent=<id>\n")