bmad-code-org/BMAD-METHOD · error · Error

BMAD not installed at ${bmadDir}. Use regular install for fi

Error message

BMAD not installed at ${bmadDir}. Use regular install for first-time setup.

What it means

Thrown by Installer.quickUpdate when the resolved bmad directory does not exist. quickUpdate assumes a prior install exists to preserve settings; it refuses to run a first-time setup. findBmadDir just joins projectDir with the BMAD folder name, so absence means BMAD was never installed there.

Source

Thrown at tools/installer/core/installer.js:1337

          placeholder: '',
          default: '',
        });
      }
    }
  }

  /**
   * Quick update method - preserves all settings and only prompts for new config fields
   * @param {Object} config - Configuration with directory
   * @returns {Object} Update result
   */
  async quickUpdate(config) {
    const projectDir = path.resolve(config.directory);
    const { bmadDir } = await this.findBmadDir(projectDir);

    // Check if bmad directory exists
    if (!(await fs.pathExists(bmadDir))) {
      throw new Error(`BMAD not installed at ${bmadDir}. Use regular install for first-time setup.`);
    }

    // Detect existing installation
    const existingInstall = await ExistingInstall.detect(bmadDir);
    const configuredIdes = existingInstall.ides;
    const projectRoot = path.dirname(bmadDir);

    // Resolve any legacy/aliased module codes (e.g. an install recorded as
    // `bauto` before the registry renamed it to `bmad-loop`) to their current
    // canonical code up front. Without this, a renamed module's old installs
    // would fall out of `availableModuleIds` below and get silently frozen
    // (see the `baut` → `automator` incident in CHANGELOG v6.7.1) instead of
    // migrating forward.
    const aliasMigrations = [];
    const seenModuleIds = new Set();
    const installedModules = [];
    for (const rawId of existingInstall.moduleIds) {
      const canonicalId = await this.externalModuleManager.resolveCanonicalCode(rawId);

View on GitHub (pinned to b70486b9bd)

Solutions

  1. Run a regular first-time install instead of quickUpdate in that directory.
  2. Confirm you are pointing at the directory that already contains _bmad/.
  3. If _bmad/ was deleted by mistake, restore from VCS or reinstall normally.

Example fix

// before
await installer.quickUpdate({ directory: '/proj' }); // no _bmad there

// after
await installer.install({ directory: '/proj', /* first-time config */ });
Defensive patterns

Strategy: validation

Validate before calling

const { bmadDir } = await installer.findBmadDir(path.resolve(config.directory));
if (!(await fs.pathExists(bmadDir))) {
  // route the user to a regular first-time install instead of quickUpdate
}

Try / catch

try {
  await installer.quickUpdate(config);
} catch (error) {
  if (error.message.includes('Use regular install for first-time setup')) {
    await installer.install(config); // first-time path
  } else throw error;
}

Prevention

When it happens

Trigger: Calling `installer.quickUpdate({ directory })` where `<directory>/_bmad/` (the BMAD folder) does not exist. Triggered by the `--quick`/update flow against a fresh project.

Common situations: Running `bmad update --quick` (or the quick-update command) in a project that never had BMAD installed, or after _bmad/ was deleted.

Related errors


AI-assisted analysis of bmad-code-org/BMAD-METHOD@b70486b9bd (2026-08-13). Data as JSON: /api/errors/7d322cf1b42f17ae. Report an issue: GitHub.