db69ee42cf
Three incremental improvements to the hooks control plane:
1. ToolCallBeforeStdout parser: hooks can now emit a JSON decision on
stdout — {"decision": "allow"|"deny"|"ask", "reason": "...",
"updatedInput": {...}, "additionalContext": "..."}. Non-JSON or empty
stdout retains legacy passthrough (allow). Exit code 2 still hard-denies
regardless of stdout.
2. Glob matchers for ToolName conditions: `name = "mcp__*"` now matches
all MCP tools. Uses regex::escape + `*` → `.*` pattern, same
convention as execpolicy/matcher.rs. Exact names keep working.
3. Project-local hooks: `HooksConfig::load_with_project(global, workspace)`
reads `.codewhale/hooks.toml` and appends its hooks after global.
Malformed file logs a warning and falls back to global-only.