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
2025-10-03 18:20:47 -04:00


Claude-Mem

Persistent memory compression system built for Claude Code.

License Version Node Mentioned in Awesome Claude Code


Claude-Mem Preview

Quick StartHow It WorksSearch ToolsDocumentationConfigurationTroubleshootingLicense

Claude-Mem seamlessly preserves context across sessions by automatically capturing tool usage observations, generating semantic summaries, and making them available to future sessions. This enables Claude to maintain continuity of knowledge about projects even after sessions end or reconnect.


Quick Start

Start a new Claude Code session in the terminal and enter the following commands:

> /plugin marketplace add thedotmack/claude-mem

> /plugin install claude-mem

Restart Claude Code. Context from previous sessions will automatically appear in new sessions.

Key Features:

  • 🧠 Persistent Memory - Context survives across sessions
  • 📊 Progressive Disclosure - Layered memory retrieval with token cost visibility
  • 🔍 9 Search Tools - Query your project history via MCP
  • 🖥️ Web Viewer UI - Real-time memory stream at http://localhost:37777
  • 🤖 Automatic Operation - No manual intervention required
  • 🔗 Citations - Reference past decisions with claude-mem:// URIs

Documentation

📚 View Full Documentation - Browse markdown docs on GitHub

💻 Local Preview: Run Mintlify docs locally:

cd docs
npx mintlify dev

Getting Started

Best Practices

Architecture

Configuration & Development


How It Works

┌─────────────────────────────────────────────────────────────┐
│ Session Start → Inject recent observations as context      │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ User Prompts → Create session, save user prompts           │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Tool Executions → Capture observations (Read, Write, etc.)  │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Worker Processes → Extract learnings via Claude Agent SDK   │
└─────────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────────┐
│ Session Ends → Generate summary, ready for next session     │
└─────────────────────────────────────────────────────────────┘

Core Components:

  1. 7 Lifecycle Hook Scripts - smart-install, context-hook, user-message-hook, new-hook, save-hook, summary-hook, cleanup-hook
  2. Worker Service - HTTP API on port 37777 with web viewer UI, managed by PM2
  3. SQLite Database - Stores sessions, observations, summaries with FTS5 full-text search
  4. 9 MCP Search Tools - Query historical context with citations and timeline analysis
  5. Chroma Vector Database - Hybrid semantic + keyword search for intelligent context retrieval

See Architecture Overview for details.


MCP Search Tools

Claude-Mem provides 9 specialized search tools:

  1. search_observations - Full-text search across observations
  2. search_sessions - Full-text search across session summaries
  3. search_user_prompts - Search raw user requests
  4. find_by_concept - Find by concept tags (discovery, problem-solution, pattern, etc.)
  5. find_by_file - Find observations referencing specific files
  6. find_by_type - Find by type (decision, bugfix, feature, refactor, discovery, change)
  7. get_recent_context - Get recent session context for a project
  8. get_context_timeline - Get unified timeline of context around a specific point in time
  9. get_timeline_by_query - Search for observations and get timeline context around best match

Example Queries:

search_observations with query="authentication" and type="decision"
find_by_file with filePath="worker-service.ts"
search_user_prompts with query="add dark mode"
get_recent_context with limit=5
get_context_timeline with anchor="S890" depth_before=10 depth_after=10
get_timeline_by_query with query="viewer UI implementation" mode="auto"

See MCP Search Tools Guide for detailed examples.


What's New in v5.1.2

🎨 Theme Toggle (v5.1.2):

  • Light/dark mode support in viewer UI
  • System preference detection
  • Persistent theme settings across sessions
  • Smooth transitions between themes

🖥️ Web-Based Viewer UI (v5.1.0):

  • Real-time memory stream visualization at http://localhost:37777
  • Server-Sent Events (SSE) for instant updates
  • Infinite scroll pagination with automatic deduplication
  • Project filtering to focus on specific codebases
  • Settings persistence (sidebar state, selected project)
  • Auto-reconnection with exponential backoff

Smart Install Caching (v5.0.3):

  • Eliminated redundant npm installs on every session (2-5s → 10ms)
  • Caches version in .install-version file
  • Only runs npm install when needed (first time, version change, missing deps)

🔍 Hybrid Search Architecture (v5.0.0):

  • Chroma vector database for semantic search
  • Combined with FTS5 keyword search
  • Intelligent context retrieval with 90-day recency filtering

See CHANGELOG.md for complete version history.


System Requirements

  • Node.js: 18.0.0 or higher
  • Claude Code: Latest version with plugin support
  • PM2: Process manager (bundled - no global install required)
  • SQLite 3: For persistent storage (bundled)

Key Benefits

Progressive Disclosure Context

  • Layered memory retrieval mirrors human memory patterns
  • Layer 1 (Index): See what observations exist with token costs at session start
  • Layer 2 (Details): Fetch full narratives on-demand via MCP search
  • Layer 3 (Perfect Recall): Access source code and original transcripts
  • Smart decision-making: Token counts help Claude choose between fetching details or reading code
  • Type indicators: Visual cues (🔴 critical, 🟤 decision, 🔵 informational) highlight observation importance

Automatic Memory

  • Context automatically injected when Claude starts
  • No manual commands or configuration needed
  • Works transparently in the background
  • Search across all sessions and observations
  • FTS5 full-text search for fast queries
  • Citations link back to specific observations

Structured Observations

  • AI-powered extraction of learnings
  • Categorized by type (decision, bugfix, feature, etc.)
  • Tagged with concepts and file references

Multi-Prompt Sessions

  • Sessions span multiple user prompts
  • Context preserved across /clear commands
  • Track entire conversation threads

Configuration

Model Selection:

./claude-mem-settings.sh

Environment Variables:

  • CLAUDE_MEM_MODEL - AI model for processing (default: claude-sonnet-4-5)
  • CLAUDE_MEM_WORKER_PORT - Worker port (default: 37777)
  • CLAUDE_MEM_DATA_DIR - Data directory override (dev only)

See Configuration Guide for details.


Development

# Clone and build
git clone https://github.com/thedotmack/claude-mem.git
cd claude-mem
npm install
npm run build

# Run tests
npm test

# Start worker
npm run worker:start

# View logs
npm run worker:logs

See Development Guide for detailed instructions.


Troubleshooting

Quick Diagnostic:

Run the troubleshooting skill for automated diagnosis and fixes:

/skill troubleshoot

Common Issues:

  • Worker not starting → npm run worker:restart
  • No context appearing → npm run test:context
  • Database issues → sqlite3 ~/.claude-mem/claude-mem.db "PRAGMA integrity_check;"
  • Search not working → Check FTS5 tables exist

See Troubleshooting Guide for complete solutions.


Contributing

Contributions are welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes with tests
  4. Update documentation
  5. Submit a Pull Request

See Development Guide for contribution workflow.


License

This project is licensed under the GNU Affero General Public License v3.0 (AGPL-3.0).

Copyright (C) 2025 Alex Newman (@thedotmack). All rights reserved.

See the LICENSE file for full details.

What This Means:

  • You can use, modify, and distribute this software freely
  • If you modify and deploy on a network server, you must make your source code available
  • Derivative works must also be licensed under AGPL-3.0
  • There is NO WARRANTY for this software

Support


Built with Claude Agent SDK | Powered by Claude Code | Made with TypeScript

S
Description
claude-mem plugin mirror
Readme 112 MiB
Languages
TypeScript 47.2%
JavaScript 46.5%
Shell 3.1%
HTML 2.4%
Python 0.7%