@calmhive/calmhive-cli
Version:
🐝 Intelligent Claude CLI wrapper with rule injection, AFk background processing, voice interface, and adaptive retry
378 lines (302 loc) • 11.6 kB
Markdown
# Calmhive Rule Injection System
*Last Updated: 2025-07-06*
*Version: 14.2.8*
## Overview
The Calmhive CLI provides a sophisticated multi-layer system for automatically injecting CLAUDE.md rules into conversations with Claude. This ensures consistent behavior and adherence to user-defined guidelines while intelligently avoiding injection spam.
### Key Features
- **Smart Injection**: Injects CLAUDE.md only when needed, not on every API call
- **Typing Detection** (v14.2.8): Prevents injection spam during rapid typing (#2-29)
- **AFk Rule Persistence** (v14.2.8): Re-injects rules at each iteration to prevent drift
- **Request Type Detection**: Distinguishes user messages from tool calls and streaming
- **Message Deduplication**: Prevents multiple injections of the same message
- **Multiple Interception Methods**: Network-level, stdio-level, or both
- **Configurable**: Enable/disable via settings or command flags
- **Enhanced Output**: Optional syntax highlighting and timestamps
- **Cross-Platform**: Works on all platforms Claude supports
## How It Works
### 1. Smart Injection System (v3.0+)
The injection system now uses intelligent request analysis to inject CLAUDE.md only when appropriate:
#### Request Type Detection
- **Fresh User Messages**: Short conversations without tool use → INJECT
- **Tool Execution Context**: Messages with recent tool calls → SKIP
- **Continued Conversations**: Long conversations with tool use → SKIP
- **Duplicate Messages**: Same message content seen before → SKIP
- **Typing Continuations** (v14.2.8): Partial messages during typing → SKIP
#### Message Analysis
The system analyzes each request for:
- `bodyData.tools` - Presence of tool definitions
- `bodyData.stream` - Streaming vs non-streaming requests
- Message history length and patterns
- Recent assistant messages with tool use
- Message content deduplication
- Typing patterns - Detects if current message extends a recent one
#### Debug Mode
Enable detailed logging with `CALMHIVE_DEBUG=1`:
```bash
CALMHIVE_DEBUG=1 calmhive chat
```
This shows:
- Request analysis for each API call
- Injection decisions and reasoning
- Message deduplication in action
- Request body structures
### 2. Rule Source
- Primary source: `~/.claude/CLAUDE.md`
- Dynamically loaded at runtime
- No hardcoded rules - always reads the actual file
- Future: Support for project-specific CLAUDE.md files
### 2. Interception Methods
#### Network Interception (Default)
Intercepts HTTP requests at the network level:
- Patches `global.fetch`
- Patches Node's `http` and `https` modules
- Patches `axios` if available
- Works with all HTTP libraries
#### Stdio Interception
Intercepts at the process I/O level:
- Transforms stdin before it reaches Claude
- Transforms stdout for enhanced formatting
- Library-agnostic approach
- Enables additional features like syntax highlighting
#### Both (Comprehensive)
Uses both network and stdio interception for maximum coverage.
### 3. Injection Points
#### Command-Level Injection
- **chat**: Supports all three interception methods
- **run**: Injects into task description before execution
- **afk**: Injects at start AND re-injects at each iteration (v14.2.8)
- **voice**: Injects into transcribed messages (planned)
#### AFk Rule Persistence (v14.2.8)
AFk sessions now re-inject CLAUDE.md rules at the beginning of each iteration to prevent rule drift during long-running background tasks:
- Iteration 1: Full task with rules injected
- Iterations 2+: Rules re-injected with "Continue working on: [task]"
- Prevents Claude from forgetting guidelines during multi-hour sessions
- Rule injector prevents double injection automatically
### 4. Configuration
Control rule injection via `~/.claude/calmhive-settings.json`:
```json
{
"ruleInjection": {
"enabled": true,
"method": "network", // "network", "stdio", "both", "none"
"contextAware": false, // future: project-specific rules
"shortcuts": { // future: command shortcuts
"!!!": "inject rules",
"!c": "clear context"
}
},
"interception": {
"syntaxHighlight": true, // stdio only
"addTimestamps": false, // stdio only
"logResponses": false // debugging
}
}
```
For backward compatibility, simple boolean format still works:
```json
{
"ruleInjection": false // disables all injection
}
```
## Usage Examples
### Interactive Chat with Different Methods
```bash
# Default network interception
calmhive chat
# Use stdio interception with syntax highlighting
calmhive chat --intercept=stdio --highlight
# Use both methods for maximum coverage
calmhive chat --intercept=both
# Disable injection temporarily
calmhive chat --no-intercept
```
### Pipe Mode
```bash
# Rules injected into the piped message
echo "Explain this code" | calmhive chat -p
```
### Background Tasks
```bash
# Rules injected into task instructions
calmhive afk "Refactor authentication system"
```
### Enhanced Output
```bash
# Add timestamps to track response time
calmhive chat --timestamps
# Enable syntax highlighting for code
calmhive chat --highlight
```
## Technical Implementation
### Network Interceptor (`lib/chat-interceptor.js`)
For interactive chat sessions, the network interceptor:
1. Loads before Claude CLI using Node's `--require` flag
2. Patches multiple HTTP methods:
- `global.fetch` for fetch API
- `http.request` and `https.request` for Node HTTP
- `axios` interceptors if axios is used
3. Modifies request bodies to inject CLAUDE.md content
4. Transparent to Claude CLI - no modifications needed
### Stdin Interceptor (`lib/stdin-interceptor.js`)
For process-level interception:
1. Creates a Transform stream between user and Claude
2. Buffers input to detect complete messages
3. Injects rules into user messages
4. Handles both line-buffered and raw input
### Stdout Interceptor (`lib/stdout-interceptor.js`)
For enhanced output:
1. Creates a Transform stream for Claude's output
2. Adds syntax highlighting for code blocks
3. Supports multiple languages (JS, Python, Bash)
4. Optional timestamps and metadata
### Rule Injector (`lib/rule-injector.js`)
Core module for rule management:
1. Loads CLAUDE.md dynamically
2. Checks settings for enable/disable
3. Provides consistent injection format
4. Used by all commands
## Disabling Rule Injection
### Method 1: Command Flag
Disable for a single session:
```bash
calmhive chat --no-intercept
```
### Method 2: Settings File
Disable permanently via `~/.claude/calmhive-settings.json`:
```json
{
"ruleInjection": false
}
```
### Method 3: Delete CLAUDE.md
Remove or rename the file:
```bash
mv ~/.claude/CLAUDE.md ~/.claude/CLAUDE.md.disabled
```
### Method 4: Use Base Claude
Bypass Calmhive entirely:
```bash
claude chat # Uses Claude directly without injection
```
## Creating Your CLAUDE.md
1. Create the file:
```bash
touch ~/.claude/CLAUDE.md
```
2. Add your rules and guidelines:
```markdown
# My Claude Rules
## Code Style
- Use 2 spaces for indentation
- Prefer const over let
- Always use semicolons
## Behavior
- Be concise but thorough
- Ask clarifying questions when needed
- Explain complex concepts simply
```
3. Rules take effect immediately - no restart needed
## Troubleshooting
### Smart Injection Issues (v3.0+)
#### Rules Not Being Injected
1. **Enable Debug Mode**: `CALMHIVE_DEBUG=1 calmhive chat`
2. **Check Request Analysis**: Look for "Request analysis" and "Injection decision" logs
3. **Verify Message Type**: Ensure you're sending fresh user messages, not in tool execution context
4. **Check Deduplication**: See if message was already processed with "Already processed this message"
#### Understanding Injection Decisions
Debug output shows injection reasoning:
```
[Calmhive Debug] Injection decision: INJECT (fresh-user-message)
[Calmhive Debug] Injection decision: SKIP (tool-execution-context)
[Calmhive Debug] Already processed this message: 19_Hello,howareyou?...
```
#### Common Scenarios
**Scenario**: Rules injected once then stop
- **Cause**: Normal behavior - smart deduplication prevents re-injection
- **Solution**: This is correct - each unique message gets injected once
**Scenario**: No injection during tool use
- **Cause**: System correctly detects tool execution context
- **Solution**: This is correct - tools already have context from initial injection
**Scenario**: Rules inject on every message
- **Cause**: Old injection system or debug mode issue
- **Solution**: Verify you're running v3.0+ with smart injection
### Legacy Issues
#### Rules Not Being Injected (General)
1. Check if CLAUDE.md exists: `ls -la ~/.claude/CLAUDE.md`
2. Verify settings: `cat ~/.claude/calmhive-settings.json`
3. Check interceptor loading: Look for `[Calmhive Interceptor]` in stderr
4. Try different interception method: `--intercept=stdio` or `--intercept=both`
### Verifying Injection
```bash
# Test with a simple message
echo "test" | calmhive chat -p | head -20
# Should show "CLAUDE.md RULES:" at the beginning
# Check which interceptor is active
calmhive chat --intercept=network 2>&1 | grep "Interceptor"
# Should show: [Calmhive Interceptor] Network interception active
```
### Performance Issues
- Network interception has minimal overhead
- Stdio interception with highlighting may slow down on very large outputs
- Use `--intercept=network` for best performance
### Common Issues
**Issue**: Rules appear twice
- **Cause**: Using both interception methods with pipe mode
- **Solution**: Use `--intercept=network` for pipe mode
**Issue**: Syntax highlighting not working
- **Cause**: Using network interception
- **Solution**: Use `--intercept=stdio` or `--intercept=both`
**Issue**: Chat seems slower
- **Cause**: Large CLAUDE.md file
- **Solution**: Keep rules concise and focused
## Security Considerations
- CLAUDE.md is read from your home directory only
- No network access or external file inclusion
- Rules are only injected into Claude API requests
- Settings file uses standard JSON format
- No code execution from rules
## Future Enhancements
### Near Term (v14.x)
- ✅ Multiple interception methods
- ✅ Syntax highlighting
- ✅ Timestamp support
- Context-aware injection (project-specific rules)
- Command shortcuts and expansions
- Response logging and analysis
### Long Term (v15.x)
- PTY wrapper for full terminal control
- Rule templates for different scenarios
- Integration with voice command
- AI-powered rule suggestions
- Rule validation and conflict detection
## API Reference
### Command Flags
- `--intercept=METHOD` - Set interception method (network|stdio|both)
- `--no-intercept` - Disable rule injection
- `--highlight` - Enable syntax highlighting (stdio only)
- `--timestamps` - Add timestamps to output (stdio only)
### Settings Schema
```typescript
interface CalmhiveSettings {
ruleInjection?: boolean | {
enabled: boolean;
method?: 'network' | 'stdio' | 'both' | 'none';
contextAware?: boolean;
shortcuts?: Record<string, string>;
};
interception?: {
syntaxHighlight?: boolean;
addTimestamps?: boolean;
logResponses?: boolean;
};
}
```
### Environment Variables
- `CALMHIVE_NO_INJECT` - Set to disable injection (overrides settings)
- `CALMHIVE_INTERCEPT_METHOD` - Set default interception method
- `CALMHIVE_DEBUG` - Enable debug logging
---
For more information, see:
- [ENHANCED-INTERCEPTION.md](./ENHANCED-INTERCEPTION.md) - Technical details
- [Calmhive README](../README.md) - General documentation
- [Claude Code Hooks](https://docs.anthropic.com/en/docs/claude-code/hooks) - Hook system (limited use)