ruvnet/ruflo · error · PluginError
SHUTDOWN_FAILED
SHUTDOWN_FAILED
Error message
Failed to shutdown plugin '${plugin.name}': ${error} What it means
PluginLoader.shutdownPlugin caught a failure (or timeout) from the plugin's own shutdown() hook, marked the plugin 'error', and rethrew as PluginError. The plugin's teardown logic failed during unload; the loader names the plugin and preserves the underlying error.
Source
Thrown at v3/@claude-flow/shared/src/plugin-loader.ts:364
}
/**
* Shutdown a single plugin
*/
private async shutdownPlugin(plugin: ClaudeFlowPlugin): Promise<void> {
this.registry.updatePluginState(plugin.name, 'shutting-down');
try {
await this.withTimeout(
plugin.shutdown(),
this.config.shutdownTimeout,
`Plugin '${plugin.name}' shutdown timed out`
);
this.registry.updatePluginState(plugin.name, 'shutdown');
} catch (error) {
this.registry.updatePluginState(plugin.name, 'error', error instanceof Error ? error : new Error(String(error)));
throw new PluginError(
`Failed to shutdown plugin '${plugin.name}': ${error}`,
plugin.name,
'SHUTDOWN_FAILED',
error instanceof Error ? error : undefined
);
}
}
/**
* Initialize plugins sequentially
*/
private async initializePluginsSequential(
plugins: ClaudeFlowPlugin[],
context: PluginContext,
results: LoadPluginsResult
): Promise<void> {
for (const plugin of plugins) {
try {View on GitHub (pinned to fa13ee4ad6)
Solutions
- Inspect the wrapped error from the plugin's shutdown hook and fix the resource cleanup.
- Ensure shutdown is idempotent so repeated calls do not fail.
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at v3/@claude-flow/shared/src/plugin-loader.ts:364 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of ruvnet/ruflo@fa13ee4ad6 (2026-08-18).
Data as JSON: /api/errors/6083571e54bd21b2.
Report an issue: GitHub.