Description
Plugin-registered slash commands (e.g. /lcm, /lossless from lossless-claw) are silently excluded from Slack, even though:
- Slack declares
capabilities.nativeCommands: true
- The user explicitly sets
channels.slack.commands.native: true in config
The same commands work correctly on Telegram and Discord.
Root cause
getPluginCommandSpecs() in src/plugins/command-registry-state.ts gates on nativeCommandsAutoEnabled, which Slack intentionally sets to false:
if (providerName && getChannelPlugin(providerName)?.commands?.nativeCommandsAutoEnabled !== true) {
return [];
}
This is a double-gate: the Slack provider already checks resolveNativeCommandsEnabled() (which respects user config) before calling getPluginCommandSpecs("slack"). But getPluginCommandSpecs ignores the user's config and only checks the bundled plugin's nativeCommandsAutoEnabled flag.
Additionally, the Slack extension's slash.ts does not call getPluginCommandSpecs at all — so even if the gate were fixed, plugin commands would not be included in the native command list.
Expected behavior
When a channel plugin declares capabilities.nativeCommands: true and the user enables native commands via config, plugin-registered commands should be included in the native command list for that channel.
Steps to reproduce
- Install a plugin that registers commands (e.g.
lossless-claw with /lcm and /lossless)
- Configure Slack with
commands.native: true
- Try
/lcm or /lossless in Slack → nothing happens
- Try the same in Telegram → works correctly
Environment
- OpenClaw version: 2026.4.9
- Channel: Slack (socket mode)
- Plugin: lossless-claw
Description
Plugin-registered slash commands (e.g.
/lcm,/losslessfromlossless-claw) are silently excluded from Slack, even though:capabilities.nativeCommands: truechannels.slack.commands.native: truein configThe same commands work correctly on Telegram and Discord.
Root cause
getPluginCommandSpecs()insrc/plugins/command-registry-state.tsgates onnativeCommandsAutoEnabled, which Slack intentionally sets tofalse:This is a double-gate: the Slack provider already checks
resolveNativeCommandsEnabled()(which respects user config) before callinggetPluginCommandSpecs("slack"). ButgetPluginCommandSpecsignores the user's config and only checks the bundled plugin'snativeCommandsAutoEnabledflag.Additionally, the Slack extension's
slash.tsdoes not callgetPluginCommandSpecsat all — so even if the gate were fixed, plugin commands would not be included in the native command list.Expected behavior
When a channel plugin declares
capabilities.nativeCommands: trueand the user enables native commands via config, plugin-registered commands should be included in the native command list for that channel.Steps to reproduce
lossless-clawwith/lcmand/lossless)commands.native: true/lcmor/losslessin Slack → nothing happensEnvironment