Adds unified installation management for Claude Code integration: blue install - Install hooks, skills, MCP server blue uninstall - Remove Blue from Claude Code blue doctor - Check installation health Components managed: - Hooks: session-start.sh (PATH), guard-write.sh (guard) - Skills: Symlinks to ~/.claude/skills/ - MCP Server: Configuration in ~/.claude.json Features: - --hooks-only, --skills-only, --mcp-only flags - --force to overwrite existing files - Managed files tagged with "# Managed by: blue install" - Idempotent - safe to run repeatedly Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
305 lines
7 KiB
Markdown
305 lines
7 KiB
Markdown
# RFC 0052: Blue Install Command
|
|
|
|
**Status**: Implemented
|
|
**Created**: 2026-02-01
|
|
**Updated**: 2026-02-01
|
|
**Author**: Claude Opus 4.5
|
|
**Related**: RFC 0038, RFC 0049, RFC 0051
|
|
|
|
## Problem Statement
|
|
|
|
Blue's Claude Code integration requires multiple manual setup steps:
|
|
|
|
1. **Hooks**: Create `.claude/hooks/`, write scripts, edit settings.json
|
|
2. **Skills**: Symlink `skills/*` to `~/.claude/skills/`
|
|
3. **MCP Server**: Add blue to `~/.claude.json` mcpServers
|
|
|
|
This is error-prone, not portable, and undiscoverable. New team members must manually configure everything.
|
|
|
|
## Proposed Solution
|
|
|
|
A unified `blue install` command that sets up all Claude Code integration:
|
|
|
|
```bash
|
|
blue install # Install everything
|
|
blue uninstall # Remove everything
|
|
blue doctor # Check installation health
|
|
```
|
|
|
|
## What Gets Installed
|
|
|
|
| Component | Location | Purpose |
|
|
|-----------|----------|---------|
|
|
| **Hooks** | `.claude/hooks/` + `.claude/settings.json` | SessionStart (PATH), PreToolUse (guard) |
|
|
| **Skills** | `~/.claude/skills/` (symlinks) | `/alignment-play` and future skills |
|
|
| **MCP Server** | `~/.claude.json` | Blue MCP tools |
|
|
|
|
## Commands
|
|
|
|
### `blue install`
|
|
|
|
```bash
|
|
$ blue install
|
|
Installing Blue for Claude Code...
|
|
|
|
Hooks:
|
|
✓ .claude/hooks/session-start.sh
|
|
✓ .claude/hooks/guard-write.sh
|
|
✓ .claude/settings.json (merged)
|
|
|
|
Skills:
|
|
✓ ~/.claude/skills/alignment-play -> /Users/ericg/letemcook/blue/skills/alignment-play
|
|
|
|
MCP Server:
|
|
✓ ~/.claude.json (blue server configured)
|
|
|
|
Blue installed. Restart Claude Code to activate.
|
|
```
|
|
|
|
**Flags:**
|
|
- `--hooks-only` - Only install hooks
|
|
- `--skills-only` - Only install skills
|
|
- `--mcp-only` - Only configure MCP server
|
|
- `--force` - Overwrite existing files
|
|
|
|
### `blue uninstall`
|
|
|
|
```bash
|
|
$ blue uninstall
|
|
Removing Blue from Claude Code...
|
|
|
|
Hooks:
|
|
✓ Removed .claude/hooks/session-start.sh
|
|
✓ Removed .claude/hooks/guard-write.sh
|
|
✓ Cleaned .claude/settings.json
|
|
|
|
Skills:
|
|
✓ Removed ~/.claude/skills/alignment-play
|
|
|
|
MCP Server:
|
|
✓ Removed blue from ~/.claude.json
|
|
|
|
Blue uninstalled.
|
|
```
|
|
|
|
### `blue doctor`
|
|
|
|
Diagnoses installation issues:
|
|
|
|
```bash
|
|
$ blue doctor
|
|
Blue Installation Health Check
|
|
|
|
Binary:
|
|
✓ blue found at /Users/ericg/.cargo/bin/blue
|
|
✓ Version: 0.1.0
|
|
|
|
Hooks:
|
|
✓ session-start.sh (installed, executable)
|
|
✓ guard-write.sh (installed, executable)
|
|
✓ settings.json configured
|
|
|
|
Skills:
|
|
✓ alignment-play (symlink valid)
|
|
|
|
MCP Server:
|
|
✓ blue configured in ~/.claude.json
|
|
✓ Binary path correct
|
|
✓ Server responds to ping
|
|
|
|
All checks passed.
|
|
```
|
|
|
|
With issues:
|
|
|
|
```bash
|
|
$ blue doctor
|
|
Blue Installation Health Check
|
|
|
|
Binary:
|
|
✓ blue found at /Users/ericg/.cargo/bin/blue
|
|
|
|
Hooks:
|
|
✗ guard-write.sh missing
|
|
✗ settings.json not configured
|
|
|
|
Run `blue install` to fix.
|
|
|
|
Skills:
|
|
✗ alignment-play symlink broken (target moved?)
|
|
|
|
Run `blue install --force` to recreate.
|
|
|
|
MCP Server:
|
|
✓ blue configured in ~/.claude.json
|
|
✗ Binary path outdated (points to old location)
|
|
|
|
Run `blue install --mcp-only` to fix.
|
|
|
|
3 issues found. Run suggested commands to fix.
|
|
```
|
|
|
|
## Implementation Details
|
|
|
|
### Hooks Installation
|
|
|
|
```rust
|
|
fn install_hooks(project_dir: &Path, force: bool) -> Result<()> {
|
|
let hooks_dir = project_dir.join(".claude/hooks");
|
|
fs::create_dir_all(&hooks_dir)?;
|
|
|
|
// Write hook scripts
|
|
write_hook(&hooks_dir.join("session-start.sh"), SESSION_START_TEMPLATE)?;
|
|
write_hook(&hooks_dir.join("guard-write.sh"), GUARD_WRITE_TEMPLATE)?;
|
|
|
|
// Merge into settings.json
|
|
let settings_path = project_dir.join(".claude/settings.json");
|
|
let settings = merge_hook_settings(&settings_path)?;
|
|
fs::write(&settings_path, serde_json::to_string_pretty(&settings)?)?;
|
|
|
|
Ok(())
|
|
}
|
|
```
|
|
|
|
### Skills Installation
|
|
|
|
```rust
|
|
fn install_skills(project_dir: &Path) -> Result<()> {
|
|
let skills_dir = project_dir.join("skills");
|
|
let target_dir = dirs::home_dir()?.join(".claude/skills");
|
|
|
|
fs::create_dir_all(&target_dir)?;
|
|
|
|
for entry in fs::read_dir(&skills_dir)? {
|
|
let entry = entry?;
|
|
if entry.path().is_dir() {
|
|
let skill_name = entry.file_name();
|
|
let link_path = target_dir.join(&skill_name);
|
|
|
|
// Remove existing symlink if present
|
|
if link_path.exists() {
|
|
fs::remove_file(&link_path)?;
|
|
}
|
|
|
|
// Create symlink
|
|
std::os::unix::fs::symlink(entry.path(), &link_path)?;
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
```
|
|
|
|
### MCP Server Configuration
|
|
|
|
```rust
|
|
fn install_mcp_server(project_dir: &Path) -> Result<()> {
|
|
let config_path = dirs::home_dir()?.join(".claude.json");
|
|
let mut config: Value = if config_path.exists() {
|
|
serde_json::from_str(&fs::read_to_string(&config_path)?)?
|
|
} else {
|
|
json!({})
|
|
};
|
|
|
|
// Add/update blue MCP server
|
|
config["mcpServers"]["blue"] = json!({
|
|
"command": project_dir.join("target/release/blue").to_string_lossy(),
|
|
"args": ["mcp"]
|
|
});
|
|
|
|
fs::write(&config_path, serde_json::to_string_pretty(&config)?)?;
|
|
|
|
Ok(())
|
|
}
|
|
```
|
|
|
|
## Identification of Managed Files
|
|
|
|
All Blue-managed files include a header comment:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
# Managed by: blue install
|
|
# Do not edit manually - changes will be overwritten
|
|
```
|
|
|
|
Or for JSON, a metadata key:
|
|
|
|
```json
|
|
{
|
|
"_blue_managed": true,
|
|
"_blue_version": "0.1.0",
|
|
...
|
|
}
|
|
```
|
|
|
|
## CLI Structure
|
|
|
|
```rust
|
|
#[derive(Subcommand)]
|
|
enum Commands {
|
|
/// Install Blue for Claude Code
|
|
Install {
|
|
/// Only install hooks
|
|
#[arg(long)]
|
|
hooks_only: bool,
|
|
|
|
/// Only install skills
|
|
#[arg(long)]
|
|
skills_only: bool,
|
|
|
|
/// Only configure MCP server
|
|
#[arg(long)]
|
|
mcp_only: bool,
|
|
|
|
/// Overwrite existing files
|
|
#[arg(long)]
|
|
force: bool,
|
|
},
|
|
|
|
/// Remove Blue from Claude Code
|
|
Uninstall,
|
|
|
|
/// Check installation health
|
|
Doctor,
|
|
|
|
// ... existing commands
|
|
}
|
|
```
|
|
|
|
## Future Extensions
|
|
|
|
- `blue install --global` - Install for all projects (user-level config)
|
|
- `blue upgrade` - Update hooks/skills to latest templates
|
|
- `blue install --dry-run` - Show what would be installed
|
|
- Plugin system for custom hooks/skills
|
|
|
|
## Implementation Plan
|
|
|
|
- [ ] Add `Commands::Install` with flags
|
|
- [ ] Add `Commands::Uninstall`
|
|
- [ ] Add `Commands::Doctor`
|
|
- [ ] Implement hook installation (from RFC 0051)
|
|
- [ ] Implement skill symlink management
|
|
- [ ] Implement MCP server configuration
|
|
- [ ] Embed hook templates as constants
|
|
- [ ] Add settings.json merge logic
|
|
- [ ] Add ~/.claude.json merge logic
|
|
- [ ] Add installation verification
|
|
- [ ] Add tests
|
|
|
|
## Benefits
|
|
|
|
1. **One command setup**: `blue install`
|
|
2. **Discoverable**: `blue doctor` shows what's wrong
|
|
3. **Portable**: Works on any machine
|
|
4. **Idempotent**: Safe to run repeatedly
|
|
5. **Reversible**: `blue uninstall` cleanly removes everything
|
|
6. **Maintainable**: Templates embedded in binary, easy to update
|
|
|
|
## 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
|