Files
claude-mem/plugin/skills/troubleshoot/SKILL.md
T
Alex Newman fda069bb07 Fix GitHub issues #76, #74, #75 + session lifecycle improvements (#77)
* Refactor context-hook: Fix anti-patterns and improve maintainability

This refactor addresses all anti-patterns documented in CLAUDE.md, improving code quality without changing behavior.

**Dead Code Removed:**
- Eliminated unused useIndexView parameter throughout
- Cleaned up entry point logic

**Magic Numbers → Named Constants:**
- CHARS_PER_TOKEN_ESTIMATE = 4 (token estimation)
- SUMMARY_LOOKAHEAD = 1 (explains +1 in query)
- Added clarifying comment for DISPLAY_SESSION_COUNT

**Code Duplication Eliminated:**
- Reduced 34 lines to 4 lines with renderSummaryField() helper
- Replaced 4 identical summary field rendering blocks

**Error Handling Added:**
- parseJsonArray() now catches JSON.parse exceptions
- Prevents session crashes from malformed data

**Type Safety Improved:**
- Added SessionSummary interface (replaced inline type cast)
- Added SummaryTimelineItem for timeline items
- Proper Map typing: Map<string, TimelineItem[]>

**Variable Naming Clarity:**
- summariesWithOffset → summariesForTimeline
- isMostRecent → shouldShowLink (explains purpose)
- dayTimelines → itemsByDay
- nextSummary → olderSummary (correct chronology)

**Better Documentation:**
- Explained confusing timeline offset logic
- Removed apologetic comments, added clarifying ones

**Impact:**
- 28 lines saved from duplication elimination
- Zero behavioral changes (output identical)
- Improved maintainability and type safety

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix context-hook to respect settings.json contextDepth

The context-hook was ignoring the user's contextDepth setting from the web UI (stored in ~/.claude-mem/settings.json) and always using the default of 50 observations.

**Problem:**
- Web UI sets contextDepth in ~/.claude-mem/settings.json
- Context-hook only read from process.env.CLAUDE_MEM_CONTEXT_OBSERVATIONS
- User's preference of 7 observations was ignored, always showing 50

**Solution:**
- Added getContextDepth() function following same pattern as getWorkerPort()
- Priority: settings.json > env var > default (50)
- Validates contextDepth is a positive number

**Testing:**
- Verified with contextDepth: 7 → shows 7 observations ✓
- Verified with contextDepth: 3 → shows 3 observations ✓
- Settings properly respected on every session start

**Files Changed:**
- src/hooks/context-hook.ts: Added getContextDepth() + imports
- plugin/scripts/context-hook.js: Built output

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix context-hook to read from correct settings file location

**Critical Bug Fix:**
Previous commit read from completely wrong location with wrong field name.

**What was wrong:**
- Reading from: ~/.claude-mem/settings.json (doesn't exist)
- Looking for: contextDepth (wrong field)
- Result: Always falling back to default of 50

**What's fixed:**
- Reading from: ~/.claude/settings.json (correct location)
- Looking for: env.CLAUDE_MEM_CONTEXT_OBSERVATIONS (correct field)
- Matches pattern used in worker-service.ts

**Testing:**
- With CLAUDE_MEM_CONTEXT_OBSERVATIONS: "15" → shows 15 observations ✓
- With CLAUDE_MEM_CONTEXT_OBSERVATIONS: "5" → shows 5 observations ✓
- Web UI settings now properly respected

**Files Changed:**
- src/hooks/context-hook.ts: Fixed path and field name in getContextDepth()
- plugin/scripts/context-hook.js: Built output

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Fix GitHub issues #76, #74, #75 + session lifecycle improvements

Bug Fixes:
- Fix PM2 'Process 0 not found' error (#76): Changed pm2 restart to pm2 start (idempotent)
- Fix troubleshooting skill distribution (#74, #75): Moved from .claude/skills/ to plugin/skills/

Session Lifecycle Improvements:
- Added session lifecycle context to SDK agent prompt
- Changed summary framing from "final report" to "progress checkpoint"
- Updated summary prompts to use progressive tense ("so far", "actively working on")
- Added buildContinuationPrompt() for prompt #2+ to avoid re-initialization
- SessionManager now restores prompt counter from database
- SDKAgent conditionally uses init vs continuation prompt based on prompt number

These changes improve context-loading task handling and reduce incorrect "file not found" reports in summaries (partial fix for #73 - awaiting user feedback).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* Release v5.3.0: Session lifecycle improvements and bug fixes

Improvements:
- Session prompt counter now restored from DB on worker restart
- Continuation prompts for prompt #2+ (lightweight, avoids re-init)
- Summary framing changed from "final report" to "progress checkpoint"
- PM2 start command (idempotent, fixes "Process 0 not found" error)
- Troubleshooting skill moved to plugin/skills/ for proper distribution

Technical changes:
- SessionManager loads prompt_counter from DB on initialization
- SDKAgent uses buildContinuationPrompt() for requests #2+
- Updated summary prompt to clarify mid-session checkpoints
- Fixed worker-utils.ts to use pm2 start instead of pm2 restart
- Moved .claude/skills/troubleshoot → plugin/skills/troubleshoot

Fixes:
- GitHub issue #76: PM2 "Process 0 not found" error
- GitHub issue #74, #75: Troubleshooting skill not distributed
- GitHub issue #73 (partial): Context-loading tasks reported as failed

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-09 16:44:58 -05:00

10 KiB

name, description
name description
troubleshoot Diagnose and fix claude-mem installation issues. Checks PM2 worker status, database integrity, service health, dependencies, and provides automated fixes for common problems.

Claude-Mem Troubleshooting Skill

This skill diagnoses and resolves common installation and operational issues with the claude-mem plugin.

Quick Reference

Common Issues:

  • Memory not persisting after /clear
  • Viewer UI empty or not loading
  • Worker service not running
  • Database missing or corrupted
  • Port conflicts
  • Missing dependencies

Diagnostic Workflow

When invoked, follow these steps systematically:

1. Check PM2 Worker Status

First, verify if the worker service is running:

# Check if PM2 is available
which pm2 || echo "PM2 not found in PATH"

# List PM2 processes
pm2 jlist 2>&1

# If pm2 is not found, try the local installation
~/.claude/plugins/marketplaces/thedotmack/node_modules/.bin/pm2 jlist 2>&1

Expected output: JSON array with claude-mem-worker process showing "status": "online"

If worker not running or status is not "online":

cd ~/.claude/plugins/marketplaces/thedotmack/
pm2 start ecosystem.config.cjs
# Or use local pm2:
node_modules/.bin/pm2 start ecosystem.config.cjs

2. Check Worker Service Health

Test if the worker service responds to HTTP requests:

# Default port is 37777
curl -s http://127.0.0.1:37777/health

# Check custom port from settings
PORT=$(cat ~/.claude-mem/settings.json 2>/dev/null | grep CLAUDE_MEM_WORKER_PORT | grep -o '[0-9]\+' || echo "37777")
curl -s http://127.0.0.1:$PORT/health

Expected output: {"status":"ok"}

If connection refused:

  • Worker not running → Go back to step 1
  • Port conflict → Check what's using the port:
    lsof -i :37777 || netstat -tlnp | grep 37777
    

3. Check Database

Verify the database exists and contains data:

# Check if database file exists
ls -lh ~/.claude-mem/claude-mem.db

# Check database size (should be > 0 bytes)
du -h ~/.claude-mem/claude-mem.db

# Query database for observation count (requires sqlite3)
sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) as observation_count FROM observations;" 2>&1

# Query for session count
sqlite3 ~/.claude-mem/claude-mem.db "SELECT COUNT(*) as session_count FROM sessions;" 2>&1

# Check recent observations
sqlite3 ~/.claude-mem/claude-mem.db "SELECT created_at, type, title FROM observations ORDER BY created_at DESC LIMIT 5;" 2>&1

Expected:

  • Database file exists (typically 100KB - 10MB+)
  • Contains observations and sessions
  • Recent observations visible

If database missing or empty:

  • New installation - this is normal, database will populate as you work
  • After /clear - sessions are marked complete but not deleted, data should persist
  • Corrupted database - backup and recreate:
    cp ~/.claude-mem/claude-mem.db ~/.claude-mem/claude-mem.db.backup
    # Worker will recreate on next observation
    

4. Check Dependencies Installation

Verify all required npm packages are installed:

cd ~/.claude/plugins/marketplaces/thedotmack/

# Check for critical packages
ls node_modules/@anthropic-ai/claude-agent-sdk 2>&1 | head -1
ls node_modules/better-sqlite3 2>&1 | head -1
ls node_modules/express 2>&1 | head -1
ls node_modules/pm2 2>&1 | head -1

Expected: All critical packages present

If dependencies missing:

cd ~/.claude/plugins/marketplaces/thedotmack/
npm install

5. Check Worker Logs

Review recent worker logs for errors:

# View last 50 lines of worker logs
pm2 logs claude-mem-worker --lines 50 --nostream

# Or use local pm2:
cd ~/.claude/plugins/marketplaces/thedotmack/
node_modules/.bin/pm2 logs claude-mem-worker --lines 50 --nostream

# Check for specific errors
pm2 logs claude-mem-worker --lines 100 --nostream | grep -i "error\|exception\|failed"

6. Test Viewer UI

Check if the web viewer is accessible:

# Test viewer endpoint
curl -s http://127.0.0.1:37777/ | head -20

# Test stats endpoint
curl -s http://127.0.0.1:37777/api/stats

Expected:

  • / returns HTML page with React viewer
  • /api/stats returns JSON with database counts

7. Check Port Configuration

Verify port settings and availability:

# Check if custom port is configured
cat ~/.claude-mem/settings.json 2>/dev/null
cat ~/.claude/settings.json 2>/dev/null

# Check what's listening on default port
lsof -i :37777 2>&1 || netstat -tlnp 2>&1 | grep 37777

# Test connectivity
nc -zv 127.0.0.1 37777 2>&1

Automated Fix Sequence

If you're seeing issues, try this automated fix sequence:

# 1. Stop the worker
pm2 delete claude-mem-worker 2>/dev/null || true

# 2. Navigate to plugin directory
cd ~/.claude/plugins/marketplaces/thedotmack/

# 3. Ensure dependencies are installed
npm install

# 4. Start worker with local pm2
node_modules/.bin/pm2 start ecosystem.config.cjs

# 5. Wait for health check
sleep 3
curl -s http://127.0.0.1:37777/health

# 6. Check logs for any errors
node_modules/.bin/pm2 logs claude-mem-worker --lines 20 --nostream

Common Issue Resolutions

Issue: "Nothing is remembered after /clear"

Root cause: Sessions are marked complete but data should persist. This suggests:

  • Worker not processing observations
  • Database not being written to
  • Context hook not reading from database

Fix:

  1. Verify worker is running (Step 1)
  2. Check database has recent observations (Step 3)
  3. Restart worker and start new session
  4. Create a test observation: /skill version-bump then cancel
  5. Check if observation appears in viewer: http://127.0.0.1:37777

Issue: "Viewer empty after every Claude restart"

Root cause:

  • Database being recreated on startup (shouldn't happen)
  • Worker reading from wrong database location
  • Database permissions issue

Fix:

  1. Check database file exists and has data (Step 3)
  2. Check file permissions:
    ls -la ~/.claude-mem/claude-mem.db
    # Should be readable/writable by your user
    
  3. Verify worker is using correct database path in logs
  4. Test viewer connection manually

Issue: "Old memory in Claude"

Root cause: Context hook injecting stale observations

Fix:

  1. Check the observation count setting:
    grep CLAUDE_MEM_CONTEXT_OBSERVATIONS ~/.claude/settings.json
    
  2. Default is 50 observations - you can adjust this
  3. Check database for actual observation dates:
    sqlite3 ~/.claude-mem/claude-mem.db "SELECT created_at, project, title FROM observations ORDER BY created_at DESC LIMIT 10;"
    

Issue: "Worker not starting"

Root cause:

  • Port already in use
  • PM2 not installed or not in PATH
  • Missing dependencies

Fix:

  1. Try manual worker start:
    cd ~/.claude/plugins/marketplaces/thedotmack/
    node plugin/scripts/worker-service.cjs
    # Should start server on port 37777
    
  2. If port in use, change it:
    echo '{"env":{"CLAUDE_MEM_WORKER_PORT":"37778"}}' > ~/.claude-mem/settings.json
    

Full System Diagnosis

Run this comprehensive diagnostic script:

#!/bin/bash
echo "=== Claude-Mem Troubleshooting Report ==="
echo ""
echo "1. Environment"
echo "   OS: $(uname -s)"
echo ""
echo "2. Plugin Installation"
echo "   Plugin directory exists: $([ -d ~/.claude/plugins/marketplaces/thedotmack ] && echo 'YES' || echo 'NO')"
echo "   Package version: $(grep '"version"' ~/.claude/plugins/marketplaces/thedotmack/package.json 2>/dev/null | head -1)"
echo ""
echo "3. Database"
echo "   Database exists: $([ -f ~/.claude-mem/claude-mem.db ] && echo 'YES' || echo 'NO')"
echo "   Database size: $(du -h ~/.claude-mem/claude-mem.db 2>/dev/null | cut -f1)"
echo "   Observation count: $(sqlite3 ~/.claude-mem/claude-mem.db 'SELECT COUNT(*) FROM observations;' 2>/dev/null || echo 'N/A')"
echo "   Session count: $(sqlite3 ~/.claude-mem/claude-mem.db 'SELECT COUNT(*) FROM sessions;' 2>/dev/null || echo 'N/A')"
echo ""
echo "4. Worker Service"
PM2_PATH=$(which pm2 2>/dev/null || echo "~/.claude/plugins/marketplaces/thedotmack/node_modules/.bin/pm2")
echo "   PM2 path: $PM2_PATH"
WORKER_STATUS=$($PM2_PATH jlist 2>/dev/null | grep -o '"name":"claude-mem-worker".*"status":"[^"]*"' | grep -o 'status":"[^"]*"' | cut -d'"' -f3 || echo 'not running')
echo "   Worker status: $WORKER_STATUS"
echo "   Health check: $(curl -s http://127.0.0.1:37777/health 2>/dev/null || echo 'FAILED')"
echo ""
echo "5. Configuration"
echo "   Port setting: $(cat ~/.claude-mem/settings.json 2>/dev/null | grep CLAUDE_MEM_WORKER_PORT || echo 'default (37777)')"
echo "   Observation count: $(cat ~/.claude/settings.json 2>/dev/null | grep CLAUDE_MEM_CONTEXT_OBSERVATIONS || echo 'default (50)')"
echo ""
echo "6. Recent Activity"
echo "   Latest observation: $(sqlite3 ~/.claude-mem/claude-mem.db 'SELECT created_at FROM observations ORDER BY created_at DESC LIMIT 1;' 2>/dev/null || echo 'N/A')"
echo "   Latest session: $(sqlite3 ~/.claude-mem/claude-mem.db 'SELECT created_at FROM sessions ORDER BY created_at DESC LIMIT 1;' 2>/dev/null || echo 'N/A')"
echo ""
echo "=== End Report ==="

Save this as /tmp/claude-mem-diagnostics.sh and run:

bash /tmp/claude-mem-diagnostics.sh

Reporting Issues

If troubleshooting doesn't resolve the issue, collect this information for a bug report:

  1. Full diagnostic report (run script above)
  2. Worker logs: pm2 logs claude-mem-worker --lines 100 --nostream
  3. Your setup:
    • Claude version: Check with Claude
    • OS: uname -a
    • Node version: node --version
    • Plugin version: In package.json
  4. Steps to reproduce the issue
  5. Expected vs actual behavior

Post to: https://github.com/thedotmack/claude-mem/issues

Prevention Tips

Keep claude-mem healthy:

  • Regularly check viewer UI to see if observations are being captured
  • Monitor database size (shouldn't grow unbounded)
  • Update plugin when new versions are released
  • Keep Claude Code updated

Performance tuning:

  • Adjust CLAUDE_MEM_CONTEXT_OBSERVATIONS if context is too large/small
  • Use /clear to mark sessions complete and start fresh
  • Use MCP search tools to query specific memories instead of loading everything

Quick Commands Reference

# Restart worker
pm2 restart claude-mem-worker

# View logs
pm2 logs claude-mem-worker

# Check health
curl http://127.0.0.1:37777/health

# View database stats
curl http://127.0.0.1:37777/api/stats

# Open viewer
open http://127.0.0.1:37777

# Delete and reinstall worker
pm2 delete claude-mem-worker
cd ~/.claude/plugins/marketplaces/thedotmack/
pm2 start ecosystem.config.cjs