5255939a95
QA round 1 (PR #632) flagged that the SubagentStart hook uses matcher "*", the same matcher a user is most likely to pick for their own catch-all SubagentStart hook. Because is_cmm_hook_entry keyed ownership on the matcher string alone, install would remove the user's "*" entry and replace it with ours, and uninstall could remove the wrong one. Add an optional `match_command_substr` to the upsert/remove args, threaded into is_cmm_hook_entry: when set, an entry must ALSO carry a hooks[].command containing that substring to be claimed as ours. The Claude SubagentStart hook passes "cbm-subagent-reminder"; all existing callers leave it NULL, preserving their matcher-only behavior unchanged. Install/uninstall now only ever touch CMM's own entry and never clobber a foreign "*" hook. Add cli_claude_subagent_hook_preserves_user_entry covering the case: a pre-existing user "*" SubagentStart hook survives both install and uninstall. Signed-off-by: Shane McCarron <shane.mccarron@corvexconnect.com>