can1357/oh-my-pi · error · Error
Plugin ${name} not found in runtime config
Error message
Plugin ${name} not found in runtime config What it means
PluginManager.setEnabled(name, enabled) validates that the plugin has an entry in the loaded runtime config's plugins map before mutating it. If no runtime-config entry exists under that name, it throws rather than silently creating one. This means the plugin was never installed/registered through the manager (or the config key differs).
Source
Thrown at packages/coding-agent/src/extensibility/plugins/manager.ts:840
version: pkg.version,
path: absolutePath,
manifest,
enabledFeatures: null,
enabled: true,
};
}
// ==========================================================================
// Enable / Disable
// ==========================================================================
/**
* Enable or disable a plugin globally.
*/
async setEnabled(name: string, enabled: boolean): Promise<void> {
const config = await this.#ensureConfigLoaded();
if (!config.plugins[name]) {
throw new Error(`Plugin ${name} not found in runtime config`);
}
config.plugins[name].enabled = enabled;
await this.#saveRuntimeConfig();
}
// ==========================================================================
// Features
// ==========================================================================
/**
* Get enabled features for a plugin.
*/
async getEnabledFeatures(name: string): Promise<string[] | null> {
const config = await this.#ensureConfigLoaded();
return config.plugins[name]?.enabledFeatures ?? null;
}
/**View on GitHub (pinned to 9690622007)
Solutions
- List installed plugins (e.g. manager.listPlugins() or the CLI's plugin list) and use the exact registered name.
- Install the plugin first — setEnabled only toggles already-registered entries.
- Inspect the runtime config file and confirm the plugins map key spelling (case-sensitive).
- If the entry is missing but the plugin exists, reinstall it to recreate the config entry.
Example fix
// before
await manager.setEnabled("MyPlugin", true); // not a registered key
// after
await manager.setEnabled("my-plugin", true); // exact config key Defensive patterns
Strategy: try-catch
Validate before calling
const config = await manager.getRuntimeConfig?.() ?? /* or read config */ null;
const names = new Set(Object.keys(config?.plugins ?? {}));
if (!names.has(pluginName)) {
throw new Error(`Unknown plugin: ${pluginName}`);
} Try / catch
try {
await manager.setEnabled(name, true);
} catch (err) {
if (err instanceof Error && /not found in runtime config/.test(err.message)) {
console.error(`"${name}" is not installed; run install first`);
} else throw err;
} Prevention
- List registered plugins and match exact names before toggling
- Install plugins through the manager so config entries are created
- Avoid renaming plugins that automation scripts reference
- Treat runtime-config keys as case-sensitive identifiers
When it happens
Trigger: Calling setEnabled("foo", true|false) where config.plugins has no "foo" key; toggling a plugin by display name or package path instead of its registered config name; config file edited or reset so the entry disappeared.
Common situations: Plugin was removed or never installed; renaming a plugin without updating scripts; stale automation scripts referencing an old plugin name; corrupted/trimmed runtime config.
Related errors
- Unknown feature "${feat}" in ${name}. Available: ${Object.ke
- Plugin "${pluginId}" is not installed in project scope
- Plugin "${pluginId}" is installed in both user and project s
- Unknown Codex Security cloud configuration: ${configurationI
- No model configured
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/c337217b2c59529d.
Report an issue: GitHub.