diff --git a/ROADMAP.md b/ROADMAP.md index 8ac7c6f7..c0bb485a 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -7633,3 +7633,5 @@ Original filing (2026-04-18): the session emitted `SessionStart hook (completed) 732. **`claw status --output-format json` `allowed_tools.entries` was `null` when no `--allowed-tools` flag was passed — callers doing `.allowed_tools.entries | length > 0` or trying to iterate got a null-dereference instead of an empty array** — dogfooded 2026-05-26 on `29dcd478`. `allowed_tool_entries` was computed as `allowed_tools.map(|tools| tools.iter().cloned().collect())` — `None` when unrestricted, serialized to JSON `null`. Fix: `.unwrap_or_default()` so unrestricted invocations emit `entries: []` instead of `entries: null`. Callers can now use `.entries | length > 0` uniformly without a null guard. Source: Jobdori dogfood on `29dcd478`, 2026-05-26. 733. **`claw diff --output-format json` returned no `changed_file_count` field — callers seeing `result:"changes"` had to parse the raw `staged`/`unstaged` diff text to count affected files** — dogfooded 2026-05-26 on `4c16a42f`. `render_diff_json_for` ran `git diff --cached` and `git diff` and exposed them as raw strings but didn't compute a file count. Fix: run two additional `git diff --name-only` passes (staged + unstaged), deduplicate across both sets using a `BTreeSet`, and expose `changed_file_count: usize` in the envelope. Clean repos emit `changed_file_count: 0`, dirty repos emit the true unique-file count. Source: Jobdori dogfood on `4c16a42f`, 2026-05-26. + +734. **`agents show ` and `plugins show ` error envelopes had no `message` field when the target was not found — `skills show` had `"message": "skill 'X' not found"` but the other two omitted it, leaving callers with only `error_kind` and `requested` and no human-readable explanation in the same field shape** — dogfooded 2026-05-26 on `cc86f54d`. Added `"message": "agent 'X' not found"` to the `agent_not_found` branch in `commands/src/lib.rs` and `"message": "plugin 'X' not found"` to the `plugin_not_found` branch in `rusty-claude-cli/src/main.rs`; both now match the `skills show` shape. Source: Jobdori dogfood on `cc86f54d`, 2026-05-26. diff --git a/rust/crates/commands/src/lib.rs b/rust/crates/commands/src/lib.rs index 2de62746..05fad9e2 100644 --- a/rust/crates/commands/src/lib.rs +++ b/rust/crates/commands/src/lib.rs @@ -2459,6 +2459,8 @@ pub fn handle_agents_slash_command_json(args: Option<&str>, cwd: &Path) -> std:: "status": "error", "error_kind": "agent_not_found", "requested": name, + // #734: parity with skills show which always emits a message field + "message": format!("agent '{}' not found", name), })); } Ok(render_agents_report_json_with_action(cwd, &matched, "show")) diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index 9aa8bfb2..a7be9915 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -6140,6 +6140,8 @@ impl LiveCli { "status": "error", "error_kind": "plugin_not_found", "requested": name, + // #734: parity with skills show which always emits a message field + "message": format!("plugin '{}' not found", name), }); println!("{}", serde_json::to_string_pretty(&obj)?); return Ok(());