1847b07f7a
Addresses @aeppling's review on #3391: Blocking fixes: - run_vibe now returns Ok(()) on malformed JSON (matches run_droid / run_copilot / run_cursor pattern). Prior code violated the exit-code contract documented at src/hooks/README.md:100 — a bad payload exited non-zero and blocked the agent's command. Fixed via a match on serde_json::from_str with a stderr warning fallback. - Extract run_vibe_inner(input: &str) -> Option<String> from run_vibe so the hook contract is unit-testable (mirrors run_droid_inner). Public run_vibe becomes a thin stdin/stdout wrapper. - Add 6 runtime tests exercising the hook contract: bash rewrite happy path, non-bash tool passthrough, empty command passthrough, malformed JSON returns None, unknown binary passthrough, substitution defers. Should-fix: - Telemetry agent detection: add ~/.vibe/hooks.toml to detect_hook_type() checks in src/core/telemetry.rs, plus the two test enum arrays so Vibe sessions no longer report as 'unknown' in rtk gain history. - Dead deny arm: add a comment on Host::Vibe in permissions.rs documenting that the empty-rules branch is defensive scaffolding for when Vibe ships native denylist/allowlist config we can honor. - Broken link: patch_vibe_hooks_toml skip-message now points at https://www.rtk-ai.app/guide/getting-started/supported-agents#mistral-vibe instead of a fragment that doesn't resolve. Nits addressed: - Install summary no longer prints 'hook installed' when the user chose PatchMode::Skip or declined the interactive prompt. patch_vibe_hooks_toml now returns a VibeHookPatchOutcome enum (Installed / AlreadyPresent / Skipped) and the caller gates the summary on it. - Document the string-spacing tradeoff on vibe_hooks_toml_has_rtk: a reformatted 'name="rtk-rewrite"' would defeat idempotency, acceptable because we control the writer and toml_edit round-trip would clobber user comments. - Fix stale line in src/hooks/README.md 'Adding New Functionality': hook_check.rs::maybe_warn() only checks the Claude Code hook now, not every agent. Documentation: - docs/guide/getting-started/supported-agents.md: frontmatter now lists Mistral Vibe, drop 'planned' from the intro, tier table row flipped from 'Planned (#800)' to 'Rust binary (pre_tool) / Yes', replace the ### Mistral Vibe (planned) placeholder with a full user-facing section modeled on Factory Droid (install/uninstall commands, hook mechanism, permission semantics, idempotency contract). - hooks/README.md: agent count 9 -> 10, add Vibe entry to Directory Structure list, add Vibe row to Supported Agents table, add '### Mistral Vibe (Rust Binary)' entry to the JSON Formats section showing the pre_tool input shape and rewrite response shape. - src/hooks/README.md: agent count 5 -> 6, add Vibe row to per-host ask-support table. - README.md: '15 AI coding tools' -> '16'. No behavior change for existing agents.