mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-17 20:21:13 +00:00
fix: clarify plugin command alias diagnostics (#64242) (thanks @feiskyer)
This commit is contained in:
@@ -123,4 +123,29 @@ describe("resolveMissingPluginCommandMessage", () => {
|
||||
expect(message).toContain("runtime slash command");
|
||||
expect(message).not.toContain("plugins.allow");
|
||||
});
|
||||
|
||||
it("points command names in plugins.allow at their parent plugin", () => {
|
||||
const message = resolveMissingPluginCommandMessage("dreaming", {
|
||||
plugins: {
|
||||
allow: ["dreaming"],
|
||||
},
|
||||
});
|
||||
expect(message).toContain('"dreaming" is not a plugin');
|
||||
expect(message).toContain('"memory-core"');
|
||||
expect(message).toContain("plugins.allow");
|
||||
});
|
||||
|
||||
it("explains parent plugin disablement for runtime command aliases", () => {
|
||||
const message = resolveMissingPluginCommandMessage("dreaming", {
|
||||
plugins: {
|
||||
entries: {
|
||||
"memory-core": {
|
||||
enabled: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
expect(message).toContain("plugins.entries.memory-core.enabled=false");
|
||||
expect(message).not.toContain("runtime slash command");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -11,6 +11,7 @@ import { isMainModule } from "../infra/is-main.js";
|
||||
import { ensureOpenClawCliOnPath } from "../infra/path-env.js";
|
||||
import { assertSupportedRuntime } from "../infra/runtime-guard.js";
|
||||
import { enableConsoleCapture } from "../logging.js";
|
||||
import { resolveManifestCommandAliasOwner } from "../plugins/manifest-registry.js";
|
||||
import { hasMemoryRuntime } from "../plugins/memory-state.js";
|
||||
import {
|
||||
normalizeLowercaseStringOrEmpty,
|
||||
@@ -63,15 +64,6 @@ export function shouldUseRootHelpFastPath(argv: string[]): boolean {
|
||||
return resolveCliArgvInvocation(argv).isRootHelpInvocation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps well-known runtime command names to the plugin that provides them.
|
||||
* Used to give actionable guidance when users try to run a runtime slash
|
||||
* command (e.g. `/dreaming`) as a CLI command (`openclaw dreaming`).
|
||||
*/
|
||||
const RUNTIME_COMMAND_TO_PLUGIN_ID: Record<string, string> = {
|
||||
dreaming: "memory-core",
|
||||
};
|
||||
|
||||
export function resolveMissingPluginCommandMessage(
|
||||
pluginId: string,
|
||||
config?: OpenClawConfig,
|
||||
@@ -80,17 +72,6 @@ export function resolveMissingPluginCommandMessage(
|
||||
if (!normalizedPluginId) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Check if this is a runtime slash command rather than a CLI command.
|
||||
const parentPluginId = RUNTIME_COMMAND_TO_PLUGIN_ID[normalizedPluginId];
|
||||
if (parentPluginId) {
|
||||
return (
|
||||
`"${normalizedPluginId}" is a runtime slash command (/${normalizedPluginId}), not a CLI command. ` +
|
||||
`It is provided by the "${parentPluginId}" plugin. ` +
|
||||
`Use \`openclaw memory\` for CLI memory operations, or \`/${normalizedPluginId}\` in a chat session.`
|
||||
);
|
||||
}
|
||||
|
||||
const allow =
|
||||
Array.isArray(config?.plugins?.allow) && config.plugins.allow.length > 0
|
||||
? config.plugins.allow
|
||||
@@ -98,6 +79,38 @@ export function resolveMissingPluginCommandMessage(
|
||||
.map((entry) => normalizeOptionalLowercaseString(entry))
|
||||
.filter(Boolean)
|
||||
: [];
|
||||
const commandAlias = resolveManifestCommandAliasOwner({
|
||||
command: normalizedPluginId,
|
||||
config,
|
||||
});
|
||||
const parentPluginId = commandAlias?.pluginId;
|
||||
if (parentPluginId) {
|
||||
if (allow.length > 0 && !allow.includes(parentPluginId)) {
|
||||
return (
|
||||
`"${normalizedPluginId}" is not a plugin; it is a command provided by the ` +
|
||||
`"${parentPluginId}" plugin. Add "${parentPluginId}" to \`plugins.allow\` ` +
|
||||
`instead of "${normalizedPluginId}".`
|
||||
);
|
||||
}
|
||||
if (config?.plugins?.entries?.[parentPluginId]?.enabled === false) {
|
||||
return (
|
||||
`The \`openclaw ${normalizedPluginId}\` command is unavailable because ` +
|
||||
`\`plugins.entries.${parentPluginId}.enabled=false\`. Re-enable that entry if you want ` +
|
||||
"the bundled plugin command surface."
|
||||
);
|
||||
}
|
||||
if (commandAlias.kind === "runtime-slash") {
|
||||
const cliHint = commandAlias.cliCommand
|
||||
? `Use \`openclaw ${commandAlias.cliCommand}\` for related CLI operations, or `
|
||||
: "Use ";
|
||||
return (
|
||||
`"${normalizedPluginId}" is a runtime slash command (/${normalizedPluginId}), not a CLI command. ` +
|
||||
`It is provided by the "${parentPluginId}" plugin. ` +
|
||||
`${cliHint}\`/${normalizedPluginId}\` in a chat session.`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (allow.length > 0 && !allow.includes(normalizedPluginId)) {
|
||||
return (
|
||||
`The \`openclaw ${normalizedPluginId}\` command is unavailable because ` +
|
||||
|
||||
Reference in New Issue
Block a user