From 4ad9622efbf4d7bffe37264dde1719543fcc6a0c Mon Sep 17 00:00:00 2001 From: Maude Bot Date: Tue, 20 Jan 2026 16:41:15 -0500 Subject: [PATCH] fix(cli): load plugin registry for message/channels commands Fixes #1327 - 'clawdbot message --channel telegram' fails with 'Unknown channel: telegram' because plugins weren't loaded. The Commander code path (non-route-first) calls ensureConfigReady() in preAction but doesn't load the plugin registry. Channel plugins like telegram are registered during plugin loading, so getChannelPlugin() returns undefined without it. This adds ensurePluginRegistryLoaded() call for commands that need channel plugin access: message, channels, directory. --- src/cli/program/preaction.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/cli/program/preaction.ts b/src/cli/program/preaction.ts index 165e4d22e..6ebf7c880 100644 --- a/src/cli/program/preaction.ts +++ b/src/cli/program/preaction.ts @@ -3,6 +3,7 @@ import { defaultRuntime } from "../../runtime.js"; import { emitCliBanner } from "../banner.js"; import { getCommandPath, hasHelpOrVersion } from "../argv.js"; import { ensureConfigReady } from "./config-guard.js"; +import { ensurePluginRegistryLoaded } from "../plugin-registry.js"; function setProcessTitleForCommand(actionCommand: Command) { let current: Command = actionCommand; @@ -14,6 +15,9 @@ function setProcessTitleForCommand(actionCommand: Command) { process.title = `clawdbot-${name}`; } +// Commands that need channel plugins loaded +const PLUGIN_REQUIRED_COMMANDS = new Set(["message", "channels", "directory"]); + export function registerPreActionHooks(program: Command, programVersion: string) { program.hook("preAction", async (_thisCommand, actionCommand) => { setProcessTitleForCommand(actionCommand); @@ -23,5 +27,9 @@ export function registerPreActionHooks(program: Command, programVersion: string) const commandPath = getCommandPath(argv, 2); if (commandPath[0] === "doctor") return; await ensureConfigReady({ runtime: defaultRuntime, commandPath }); + // Load plugins for commands that need channel access + if (PLUGIN_REQUIRED_COMMANDS.has(commandPath[0])) { + ensurePluginRegistryLoaded(); + } }); }