docs: RFC 0052 CLI hook management

Proposes `blue hooks` subcommand for managing Claude Code hooks:
  blue hooks install    - Install all Blue hooks
  blue hooks uninstall  - Remove Blue hooks
  blue hooks status     - Show current hook status
  blue hooks check      - Verify hooks work correctly

Benefits: one-command setup, portable, idempotent, reversible.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Eric Garcia 2026-02-01 18:55:02 -05:00
parent 50318ab802
commit a4040cc41b

View file

@ -0,0 +1,209 @@
# RFC 0052: CLI Hook Management
**Status**: Draft
**Created**: 2026-02-01
**Author**: Claude Opus 4.5
**Related**: RFC 0038, RFC 0049, RFC 0051
## Problem Statement
Blue's Claude Code integration requires hooks to be manually configured:
1. Create `.claude/hooks/` directory
2. Write hook scripts
3. Edit `.claude/settings.json`
4. Make scripts executable
This is error-prone and not portable. New team members must manually set up hooks or copy configurations.
## Proposed Solution
Add `blue hooks` subcommand to manage Claude Code hook installation:
```bash
blue hooks install # Install all Blue hooks
blue hooks uninstall # Remove Blue hooks
blue hooks status # Show current hook status
blue hooks check # Verify hooks are working
```
## Commands
### `blue hooks install`
Installs Blue's Claude Code hooks:
```bash
$ blue hooks install
Installing Blue hooks...
✓ Created .claude/hooks/session-start.sh
✓ Created .claude/hooks/guard-write.sh
✓ Updated .claude/settings.json
✓ Made scripts executable
Blue hooks installed. Restart Claude Code to activate.
```
**Behavior:**
- Creates `.claude/hooks/` if missing
- Writes hook scripts from embedded templates
- Merges into existing `.claude/settings.json` (preserves other hooks)
- Sets executable permissions
- Idempotent - safe to run multiple times
### `blue hooks uninstall`
Removes Blue's hooks:
```bash
$ blue hooks uninstall
Removing Blue hooks...
✓ Removed .claude/hooks/session-start.sh
✓ Removed .claude/hooks/guard-write.sh
✓ Updated .claude/settings.json
Blue hooks removed.
```
**Behavior:**
- Removes only Blue-managed hook scripts
- Removes Blue entries from settings.json (preserves other hooks)
- Leaves `.claude/` directory if other files exist
### `blue hooks status`
Shows current hook state:
```bash
$ blue hooks status
Blue Claude Code Hooks:
SessionStart:
✓ session-start.sh (installed, executable)
PreToolUse (Write|Edit|MultiEdit):
✓ guard-write.sh (installed, executable)
Settings: .claude/settings.json (configured)
All hooks installed and ready.
```
### `blue hooks check`
Verifies hooks work correctly:
```bash
$ blue hooks check
Checking Blue hooks...
✓ session-start.sh exits 0
✓ guard-write.sh allows /tmp/test.md
✓ guard-write.sh blocks src/main.rs (no worktree)
All hooks working correctly.
```
## Hook Templates
Hooks are embedded in the blue binary as string constants:
```rust
const SESSION_START_HOOK: &str = r#"#!/bin/bash
# Blue SessionStart hook - sets up PATH
# Managed by: blue hooks install
if [ -n "$CLAUDE_ENV_FILE" ] && [ -n "$CLAUDE_PROJECT_DIR" ]; then
echo "export PATH=\"\$CLAUDE_PROJECT_DIR/target/release:\$PATH\"" >> "$CLAUDE_ENV_FILE"
fi
exit 0
"#;
const GUARD_WRITE_HOOK: &str = r#"#!/bin/bash
# Blue PreToolUse hook - enforces RFC 0038 worktree protection
# Managed by: blue hooks install
FILE_PATH=$(jq -r '.tool_input.file_path // empty')
if [ -z "$FILE_PATH" ]; then
exit 0
fi
blue guard --path="$FILE_PATH"
"#;
```
## Settings.json Management
The install command merges Blue hooks into existing settings:
```rust
fn merge_hooks(existing: Value, blue_hooks: Value) -> Value {
// Preserve existing hooks, add/update Blue hooks
// Use "# Managed by: blue" comments to identify Blue hooks
}
```
**Identification:** Hook scripts include a `# Managed by: blue hooks install` comment to identify Blue-managed hooks.
## Implementation Plan
- [ ] Add `Commands::Hooks` enum variant with subcommands
- [ ] Implement `handle_hooks_install()`
- [ ] Implement `handle_hooks_uninstall()`
- [ ] Implement `handle_hooks_status()`
- [ ] Implement `handle_hooks_check()`
- [ ] Embed hook templates as constants
- [ ] Add settings.json merge logic
- [ ] Add tests for hook management
## CLI Structure
```rust
#[derive(Subcommand)]
enum HooksCommands {
/// Install Blue's Claude Code hooks
Install,
/// Remove Blue's Claude Code hooks
Uninstall,
/// Show hook installation status
Status,
/// Verify hooks are working correctly
Check,
}
```
## Future Extensions
- `blue hooks update` - Update hooks to latest version
- `blue hooks diff` - Show differences from installed hooks
- `blue hooks export` - Export hooks for manual installation
- Support for custom hooks via `.blue/hooks/` templates
## Benefits
1. **One command setup**: `blue hooks install`
2. **Portable**: Works on any machine with blue installed
3. **Idempotent**: Safe to run repeatedly
4. **Discoverable**: `blue hooks status` shows what's installed
5. **Reversible**: `blue hooks uninstall` cleanly removes
## Migration
Existing manual installations can be migrated:
```bash
$ blue hooks install
Note: Found existing hooks. Replacing with managed versions.
✓ Backed up .claude/hooks/guard-write.sh to .claude/hooks/guard-write.sh.bak
✓ Installed managed guard-write.sh
```
## References
- RFC 0038: SDLC Workflow Discipline
- RFC 0049: Synchronous Guard Command
- RFC 0051: Portable Hook Binary Resolution
- Claude Code Hooks: https://code.claude.com/docs/en/hooks.md