fix(#743): plugins help --output-format json now emits usage envelope matching agents/mcp/skills help shape; resolves #420

This commit is contained in:
YeonGyu-Kim
2026-05-26 18:04:04 +09:00
parent 2036f0bd4c
commit 1d5db5f77d
3 changed files with 26 additions and 0 deletions

View File

@@ -2334,6 +2334,13 @@ pub fn handle_plugins_slash_command(
reload_runtime: false,
})
}
// #743/#420: "help" was caught by Some(other) → unknown_plugins_action error with hint:null.
// agents/mcp/skills all return a help envelope; plugins must match that parity.
Some("help" | "-h" | "--help") => Ok(PluginsCommandResult {
message: "Plugins\n Usage /plugins [list|show <id>|install <id>|enable <id>|disable <id>|uninstall <id>|update <id>|help]\n Subcommands list show install enable disable uninstall update help"
.to_string(),
reload_runtime: false,
}),
Some(other) => Err(PluginError::CommandFailed(format!(
"unknown_plugins_action: '{other}' is not a supported /plugins action. Use list, show, install, enable, disable, uninstall, or update."
))),

View File

@@ -6108,6 +6108,23 @@ impl LiveCli {
CliOutputFormat::Text => println!("{}", payload.message),
CliOutputFormat::Json => {
let action_str = action.unwrap_or("list");
// #743/#420: plugins help must return a usage envelope matching agents/mcp/skills help shape.
if matches!(action_str, "help" | "-h" | "--help") {
let cwd_str = cwd.display().to_string();
let obj = json!({
"kind": "plugin",
"action": "help",
"status": "ok",
"unexpected": null,
"usage": {
"direct_cli": "claw plugins [list|show <id>|install <id>|enable <id>|disable <id>|uninstall <id>|update <id>|help]",
"slash_command": "/plugins [list|show <id>|install <id>|enable <id>|disable <id>|uninstall <id>|update <id>|help]",
},
"cwd": cwd_str,
});
println!("{}", serde_json::to_string_pretty(&obj)?);
return Ok(());
}
// For show/info/describe, filter to the named plugin (exact match).
// For list with a target, treat target as a substring filter.
let is_show_action = matches!(action_str, "show" | "info" | "describe");