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

All selected tool(s) are suspended: ${suspendedIdes.join(',

Error message

All selected tool(s) are suspended: ${suspendedIdes.join(', ')}. Installation aborted to prevent upgrading _bmad/ without a working IDE configuration.

What it means

Thrown by Installer._validateIdeSelection when every IDE the user selected is marked suspended in platform-codes.yaml. 'suspended' is a per-platform block (with a human-readable message) that disables install because the tool does not currently support the required layout. Aborting prevents a useless _bmad/ upgrade with no working IDE target.

Source

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

  /**
   * Fail fast if all selected IDEs are suspended.
   */
  async _validateIdeSelection(config) {
    if (!config.ides || config.ides.length === 0) return;

    await this.ideManager.ensureInitialized();
    const suspendedIdes = config.ides.filter((ide) => {
      const handler = this.ideManager.handlers.get(ide);
      return handler?.platformConfig?.suspended;
    });

    if (suspendedIdes.length > 0 && suspendedIdes.length === config.ides.length) {
      for (const ide of suspendedIdes) {
        const handler = this.ideManager.handlers.get(ide);
        await prompts.log.error(`${handler.displayName || ide}: ${handler.platformConfig.suspended}`);
      }
      throw new Error(
        `All selected tool(s) are suspended: ${suspendedIdes.join(', ')}. Installation aborted to prevent upgrading _bmad/ without a working IDE configuration.`,
      );
    }
  }

  /**
   * Remove IDEs that were previously installed but are no longer selected.
   * No confirmation — the user's IDE selection is the decision.
   */
  async _removeDeselectedIdes(existingInstall, config, paths) {
    const previouslyInstalled = new Set(existingInstall.ides);
    const newlySelected = new Set(config.ides || []);
    const toRemove = [...previouslyInstalled].filter((ide) => !newlySelected.has(ide));

    if (toRemove.length === 0) return;

    // Pass the newly-selected list as remainingIdes so cleanupByList skips
    // target_dir wipes for IDEs whose directory is still owned by a peer

View on GitHub (pinned to b70486b9bd)

Solutions

  1. Add at least one non-suspended tool: pass `--tools <working-ide>` alongside or instead of the suspended one.
  2. Review platform-codes.yaml (or run `bmad install --list-tools`) to see which platforms are currently suspended and why.
  3. If you believe the suspension is stale, update the installer package so platform-codes.yaml reflects current tool support.

Example fix

// before
bmad install --tools someide
// after (pick a supported tool)
bmad install --tools claude-code
Defensive patterns

Strategy: validation

Validate before calling

const suspended = config.ides.filter((ide) => {
  const h = ideManager.handlers.get(ide);
  return h?.platformConfig?.suspended;
});
if (config.ides.length > 0 && suspended.length === config.ides.length) {
  // ask the user to pick at least one non-suspended tool
}

Try / catch

try {
  await installer._validateIdeSelection(config);
} catch (error) {
  if (error.message.startsWith('All selected tool(s) are suspended')) { /* reprompt for tools */ }
  throw error;
}

Prevention

When it happens

Trigger: config.ides is non-empty and, after filtering against IdeManager handlers, every selected IDE has `handler.platformConfig.suspended` set to a truthy value (the suspension message).

Common situations: A tool was temporarily suspended (e.g. its skills support regressed), and the user selected only that tool via `--tools`. Or a config file pins a set of IDEs all of which are now suspended.

Related errors


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