From e730a1560e27db30a164f276f12e9b7199b6e803 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(); + } }); }