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 peerView on GitHub (pinned to b70486b9bd)
Solutions
- Add at least one non-suspended tool: pass `--tools <working-ide>` alongside or instead of the suspended one.
- Review platform-codes.yaml (or run `bmad install --list-tools`) to see which platforms are currently suspended and why.
- 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
- Always include at least one currently-supported tool in --tools.
- Run `bmad install --list-tools` to see suspension status before selecting.
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
- Platform codes configuration not found at: ${PLATFORM_CODES_
- version is not available when nothing is installed
- ${label} does not exist: ${dirPath}
- ${label} is not a directory: ${dirPath}
- ${label} is not readable: ${dirPath}
AI-assisted analysis of bmad-code-org/BMAD-METHOD@b70486b9bd (2026-08-13).
Data as JSON: /api/errors/92a804fa9a25a676.
Report an issue: GitHub.