339 lines
7.7 KiB
Markdown
339 lines
7.7 KiB
Markdown
# Memory Toggle Feature - Design Plan
|
|
|
|
## Overview
|
|
|
|
Users need the ability to pause/resume claude-mem memory recording without uninstalling the plugin. This addresses use cases where users want temporary privacy, testing sessions, or simply don't want certain conversations saved.
|
|
|
|
## User Requirements (from feedback)
|
|
|
|
- "I don't want to save everything always"
|
|
- Need persistent on/off state across sessions
|
|
- Should be easy to toggle without complex commands
|
|
- Should not interfere with conversation context
|
|
|
|
## Design Principles
|
|
|
|
1. **Non-intrusive**: Toggling memory should not require special characters in prompts
|
|
2. **Persistent**: State should survive across Claude Code sessions
|
|
3. **Simple**: Clear on/off with easy status checking
|
|
4. **Fast**: Minimal overhead when checking enabled state
|
|
|
|
## Implementation Options
|
|
|
|
### Option A: Settings Flag (Recommended)
|
|
|
|
**Storage**: `~/.claude/settings.json`
|
|
```json
|
|
{
|
|
"CLAUDE_MEM_ENABLED": true // default: true
|
|
}
|
|
```
|
|
|
|
**CLI Commands**:
|
|
```bash
|
|
claude-mem pause # Disable memory recording
|
|
claude-mem resume # Enable memory recording
|
|
claude-mem status # Show current state
|
|
```
|
|
|
|
**Hook Behavior**:
|
|
- All hooks check `CLAUDE_MEM_ENABLED` setting at start
|
|
- If `false`, hooks return early without saving/processing
|
|
- Worker service continues running (ready for resume)
|
|
|
|
**Pros**:
|
|
- Uses existing Claude settings infrastructure
|
|
- Simple boolean flag
|
|
- Easy to implement in all hooks
|
|
|
|
**Cons**:
|
|
- Modifies Claude Code's settings file
|
|
|
|
---
|
|
|
|
### Option B: Local Config File
|
|
|
|
**Storage**: `~/.claude-mem/config.json`
|
|
```json
|
|
{
|
|
"enabled": true,
|
|
"version": "4.2.8",
|
|
"lastToggled": "2025-10-25T01:30:00Z"
|
|
}
|
|
```
|
|
|
|
**Same CLI commands as Option A**
|
|
|
|
**Pros**:
|
|
- Isolated from Claude Code settings
|
|
- Can add metadata (timestamp, reason, etc.)
|
|
- Full control over config structure
|
|
|
|
**Cons**:
|
|
- Additional file to manage
|
|
- Hooks need to read separate config file
|
|
|
|
---
|
|
|
|
### Option C: Slash Command Integration
|
|
|
|
**Usage**: In-session control via slash commands
|
|
```bash
|
|
/claude-mem pause
|
|
/claude-mem resume
|
|
/claude-mem status
|
|
```
|
|
|
|
**Pros**:
|
|
- No need to leave Claude Code session
|
|
- Immediate feedback
|
|
- Familiar interface for users
|
|
|
|
**Cons**:
|
|
- Requires slash command setup
|
|
- Need to update `.claude/commands/` structure
|
|
- More complex implementation
|
|
|
|
---
|
|
|
|
## Recommended Approach: Hybrid A + C
|
|
|
|
Combine Settings Flag (A) with optional Slash Commands (C):
|
|
|
|
1. **Persistent State**: Store in `~/.claude/settings.json` or `~/.claude-mem/config.json`
|
|
2. **CLI Control**: `claude-mem pause/resume/status`
|
|
3. **Optional In-Session Control**: `/claude-mem pause/resume` slash commands
|
|
4. **Hook Check**: All hooks read setting at startup, skip if disabled
|
|
|
|
---
|
|
|
|
## Implementation Details
|
|
|
|
### Hook Modifications
|
|
|
|
All hooks need to check enabled state:
|
|
|
|
```typescript
|
|
// src/shared/settings.ts
|
|
export function isMemoryEnabled(): boolean {
|
|
try {
|
|
const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
|
|
const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
return settings.CLAUDE_MEM_ENABLED !== false; // default true
|
|
} catch {
|
|
return true; // default to enabled if settings missing
|
|
}
|
|
}
|
|
```
|
|
|
|
```typescript
|
|
// In each hook
|
|
import { isMemoryEnabled } from '../shared/settings.js';
|
|
|
|
export function hookFunction(input: HookInput) {
|
|
if (!isMemoryEnabled()) {
|
|
return; // Skip all memory operations
|
|
}
|
|
|
|
// Normal hook logic...
|
|
}
|
|
```
|
|
|
|
### CLI Commands
|
|
|
|
```typescript
|
|
// src/bin/cli.ts
|
|
program
|
|
.command('pause')
|
|
.description('Pause memory recording (sessions will not be saved)')
|
|
.action(() => {
|
|
updateMemorySetting(false);
|
|
console.log('✓ Memory recording paused');
|
|
});
|
|
|
|
program
|
|
.command('resume')
|
|
.description('Resume memory recording')
|
|
.action(() => {
|
|
updateMemorySetting(true);
|
|
console.log('✓ Memory recording resumed');
|
|
});
|
|
|
|
program
|
|
.command('status')
|
|
.description('Show current memory recording status')
|
|
.action(() => {
|
|
const enabled = isMemoryEnabled();
|
|
console.log(`Memory recording: ${enabled ? '✓ ENABLED' : '✗ PAUSED'}`);
|
|
});
|
|
```
|
|
|
|
### Slash Commands (Optional)
|
|
|
|
Create `.claude/commands/claude-mem.md`:
|
|
```markdown
|
|
# Claude Mem Control
|
|
|
|
Usage: /claude-mem [pause|resume|status]
|
|
|
|
- pause: Stop recording this session
|
|
- resume: Resume recording
|
|
- status: Show current state
|
|
```
|
|
|
|
---
|
|
|
|
## User Experience
|
|
|
|
### Pausing Memory
|
|
```bash
|
|
$ claude-mem pause
|
|
✓ Memory recording paused
|
|
|
|
All future sessions will NOT be saved until you run:
|
|
claude-mem resume
|
|
```
|
|
|
|
### Checking Status
|
|
```bash
|
|
$ claude-mem status
|
|
Memory recording: ✗ PAUSED
|
|
|
|
To resume recording: claude-mem resume
|
|
```
|
|
|
|
### Resume Recording
|
|
```bash
|
|
$ claude-mem resume
|
|
✓ Memory recording resumed
|
|
|
|
All sessions will now be saved to ~/.claude-mem/
|
|
```
|
|
|
|
---
|
|
|
|
## Affected Hooks
|
|
|
|
### new-hook (UserPromptSubmit)
|
|
- Skip creating session records
|
|
- Skip saving user prompts
|
|
|
|
### save-hook (PostToolUse)
|
|
- Skip capturing observations
|
|
- Skip sending to worker service
|
|
|
|
### summary-hook
|
|
- Skip generating summaries
|
|
- Session remains unprocessed
|
|
|
|
### context-hook (SessionStart)
|
|
- Still runs (to show status message?)
|
|
- Could display: "Memory recording is currently paused"
|
|
|
|
### cleanup-hook (SessionEnd)
|
|
- Skip marking sessions complete
|
|
- No cleanup needed if nothing was saved
|
|
|
|
---
|
|
|
|
## Edge Cases
|
|
|
|
1. **Mid-session toggle**: What if user pauses during a session?
|
|
- Decision: New state takes effect immediately
|
|
- Observations before pause are saved, after pause are not
|
|
|
|
2. **Worker service**: Should it stop when paused?
|
|
- Decision: Keep running (minimal resource usage)
|
|
- Ready to process when resumed
|
|
|
|
3. **Existing data**: What happens to saved sessions when paused?
|
|
- Decision: No change, data persists
|
|
- Context hook can still load past sessions
|
|
|
|
4. **Uninstall vs Pause**: Clear distinction?
|
|
- Pause: Temporary, easy to resume
|
|
- Uninstall: Complete removal, requires reinstall
|
|
|
|
---
|
|
|
|
## Migration & Compatibility
|
|
|
|
- Default to `true` (enabled) for backward compatibility
|
|
- Existing users unaffected unless they explicitly pause
|
|
- No database schema changes needed
|
|
- No breaking changes to hooks
|
|
|
|
---
|
|
|
|
## Future Enhancements
|
|
|
|
1. **Selective Recording**: Fine-grained control
|
|
```bash
|
|
claude-mem pause --observations-only
|
|
claude-mem pause --summaries-only
|
|
```
|
|
|
|
2. **Project-Level Control**: Different settings per project
|
|
```bash
|
|
claude-mem pause --project claude-mem
|
|
```
|
|
|
|
3. **Temporary Pause**: Auto-resume after duration
|
|
```bash
|
|
claude-mem pause --duration 1h
|
|
```
|
|
|
|
4. **Pause Reasons**: Track why users pause
|
|
```bash
|
|
claude-mem pause --reason "debugging session"
|
|
```
|
|
|
|
---
|
|
|
|
## Open Questions
|
|
|
|
1. Should context hook still inject past context when paused?
|
|
- Lean toward: Yes, show past but don't save current
|
|
|
|
2. Should we show a status indicator when paused?
|
|
- Could add to context hook output: "🔴 Memory recording paused"
|
|
|
|
3. CLI command naming: `pause/resume` vs `disable/enable` vs `off/on`?
|
|
- Lean toward: `pause/resume` (temporary feeling)
|
|
|
|
4. Should worker service stop when paused?
|
|
- Lean toward: Keep running (fast resume)
|
|
|
|
---
|
|
|
|
## Timeline
|
|
|
|
- **Phase 1**: Settings flag + CLI commands (1-2 days)
|
|
- **Phase 2**: Status indicator in context hook (1 day)
|
|
- **Phase 3**: Slash commands (optional, 1 day)
|
|
- **Phase 4**: User testing & feedback (1 week)
|
|
- **Phase 5**: Release in v4.3.0
|
|
|
|
---
|
|
|
|
## Success Metrics
|
|
|
|
- Users report successful pausing/resuming
|
|
- No saved data when paused (verify in tests)
|
|
- Fast toggle time (< 100ms)
|
|
- Clear status feedback
|
|
- No edge case bugs in production
|
|
|
|
---
|
|
|
|
## Related Issues
|
|
|
|
- GitHub feedback: "I don't want to save everything always"
|
|
- Privacy concerns: Users want control over what's saved
|
|
- Testing workflows: Developers need clean test sessions
|
|
|
|
---
|
|
|
|
*Last Updated: October 25, 2025*
|
|
*Status: Planning / Not Yet Implemented*
|