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

  1. List installed plugins (e.g. manager.listPlugins() or the CLI's plugin list) and use the exact registered name.
  2. Install the plugin first — setEnabled only toggles already-registered entries.
  3. Inspect the runtime config file and confirm the plugins map key spelling (case-sensitive).
  4. 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

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


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/c337217b2c59529d. Report an issue: GitHub.