Alex Newman a537433eae Code quality: comprehensive nonsense audit cleanup (20 issues) (#400)
* fix: prevent initialization promise from resolving on failure

Background initialization was resolving the promise even when it failed,
causing the readiness check to incorrectly indicate the worker was ready.
Now the promise stays pending on failure, ensuring /api/readiness
continues returning 503 until initialization succeeds.

Fixes critical issue #1 from nonsense audit.

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

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

* fix: improve error handling in context inject and settings update routes

* Enhance error handling for ChromaDB failures in SearchManager

- Introduced a flag to track ChromaDB failure states.
- Updated logging messages to provide clearer feedback on ChromaDB initialization and failure.
- Modified the response structure to inform users when semantic search is unavailable due to ChromaDB issues, including installation instructions for UVX/Python.

* refactor: remove deprecated silent-debug utility functions

* Enhance error handling and validation in hooks

- Added validation for required fields in `summary-hook.ts` and `save-hook.ts` to ensure necessary inputs are provided before processing.
- Improved error messages for missing `cwd` in `save-hook.ts` and `transcript_path` in `summary-hook.ts`.
- Cleaned up code by removing unnecessary error handling logic and directly throwing errors when required fields are missing.
- Updated binary file `mem-search.zip` to reflect changes in the plugin.

* fix: improve error handling in summary hook to ensure errors are not masked

* fix: add error handling for unknown message content format in transcript parser

* fix: log error when failing to notify worker of session end

* Refactor date formatting functions: move to shared module

- Removed redundant date formatting functions from SearchManager.ts.
- Consolidated date formatting logic into shared timeline-formatting.ts.
- Updated functions to accept both ISO date strings and epoch milliseconds.

* Refactor tag stripping functions to extract shared logic

- Introduced a new internal function `stripTagsInternal` to handle the common logic for stripping memory tags from both JSON and prompt content.
- Updated `stripMemoryTagsFromJson` to utilize the new internal function, simplifying its implementation.
- Modified `stripMemoryTagsFromPrompt` to also call `stripTagsInternal`, reducing code duplication and improving maintainability.
- Removed redundant type checks and logging from both functions, as they now rely on the internal function for processing.

* Refactor settings validation in SettingsRoutes

- Consolidated multiple individual setting validations into a single validateSettings method.
- Updated handleUpdateSettings to use the new validation method for improved maintainability.
- Each setting now has its validation logic encapsulated within validateSettings, ensuring a single source of truth for validation rules.

* fix: add error logging to ProcessManager.getPidInfo()

Previously getPidInfo() returned null silently for three cases:
1. File not found (expected - no action needed)
2. JSON parse error (corrupted file - now logs warning)
3. Type validation failure (malformed data - now logs warning)

This fix adds warning logs for cases 2 and 3 to provide visibility
into PID file corruption issues. Logs include context like parsed
data structure or error message with file path.

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

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

* fix: remove overly defensive try-catch in SessionRoutes

Remove unnecessary try-catch block that was masking potential errors when
checking file paths for session-memory meta-observations. Property access
on parsed JSON objects never throws - existing truthiness checks already
safely handle undefined/null values.

Issue #12 from nonsense audit: SessionRoutes catch-all exception masking

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

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

* fix: remove redundant try-catch from getWorkerPort()

Simplified getWorkerPort() by removing unnecessary try-catch wrapper.
SettingsDefaultsManager.loadFromFile() already handles missing files
by returning defaults, and .get() never throws - making the catch
block completely redundant.

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

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

* refactor: eliminate ceremonial wrapper in hook-response.ts

Replace buildHookResponse() function with direct constant export.
Most hook responses were calling a function just to return the same
constant object. Only SessionStart with context needs special handling.

Changes:
- Export STANDARD_HOOK_RESPONSE constant directly
- Simplify createHookResponse() to only handle SessionStart special case
- Update all hooks to use STANDARD_HOOK_RESPONSE instead of function call
- Eliminate buildHookResponse() function with redundant branching

Files modified:
- src/hooks/hook-response.ts: Export constant, simplify function
- src/hooks/new-hook.ts: Use STANDARD_HOOK_RESPONSE
- src/hooks/save-hook.ts: Use STANDARD_HOOK_RESPONSE
- src/hooks/summary-hook.ts: Use STANDARD_HOOK_RESPONSE

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

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

* fix: make getWorkerHost() consistent with getWorkerPort()

- Use SettingsDefaultsManager.get('CLAUDE_MEM_DATA_DIR') for path resolution
  instead of hardcoded ~/.claude-mem (supports custom data directories)
- Add caching to getWorkerHost() (same pattern as getWorkerPort())
- Update clearPortCache() to also clear host cache
- Both functions now have identical patterns: caching, consistent path
  resolution, and same error handling via SettingsDefaultsManager

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

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

* refactor: inline single-use timeout constants in ProcessManager

Remove 6 timeout constants used only once each, inlining their values
directly at the point of use. Following YAGNI principle - constants
should only exist when used multiple times.

Removed constants:
- PROCESS_STOP_TIMEOUT_MS (5000ms)
- HEALTH_CHECK_TIMEOUT_MS (10000ms)
- HEALTH_CHECK_INTERVAL_MS (200ms)
- HEALTH_CHECK_FETCH_TIMEOUT_MS (1000ms)
- PROCESS_EXIT_CHECK_INTERVAL_MS (100ms)
- HTTP_SHUTDOWN_TIMEOUT_MS (2000ms)

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

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

* fix: replace overly broad path filter in HTTP logging middleware

Replace `req.path.includes('.')` with explicit static file extension
checking to prevent incorrectly skipping API endpoint logging.

- Add `staticExtensions` array with legitimate asset types
- Use `.endsWith()` matching instead of `.includes()`
- API endpoints containing periods (if any) now logged correctly
- Static assets (.js, .css, .svg, etc.) still skip logging as intended

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

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

* refactor: expand logger.formatTool() to handle all tool types

Replace hard-coded tool formatting for 4 tools with comprehensive coverage:

File operations (Read, Edit, Write, NotebookEdit):
- Consolidated file_path handling for all file operations
- Added notebook_path support for NotebookEdit
- Shows filename only (not full path)

Search tools (Glob, Grep):
- Glob: shows pattern
- Grep: shows pattern (truncated if > 30 chars)

Network tools (WebFetch, WebSearch):
- Shows URL or query (truncated if > 40 chars)

Meta tools (Task, Skill, LSP):
- Task: shows subagent_type or description
- Skill: shows skill name
- LSP: shows operation type

This eliminates the "hard-coded 4 tools" limitation and provides
meaningful log output for all tool types.

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

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

* fix: remove all truncation from logger.formatTool()

Truncation hides critical debugging information. Show everything:

- Bash: full command (was truncated at 50 chars)
- File operations: full path (was showing filename only)
- Grep: full pattern (was truncated at 30 chars)
- WebFetch/WebSearch: full URL/query (was truncated at 40 chars)
- Task: full description (was truncated at 30 chars)

Logs exist to provide complete information. Never hide details.

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

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

* refactor: replace array indexing with regex capture for drive letter

Use explicit regex capture group to extract Windows drive letter instead
of assuming cwd[0] is always the first character. Safer and more explicit.

- Changed cwd.match(/^[A-Z]:\\/i) to cwd.match(/^([A-Z]):\\/i)
- Extract drive letter from driveMatch[1] instead of cwd[0]
- Restructured control flow to avoid nested conditionals

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

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

* fix: return computed values from DataRoutes processing endpoint

The handleSetProcessing endpoint was computing queueDepth and
activeSessions but not including them in the response. This commit
includes all computed values in the API response.

- Return queueDepth and activeSessions in /api/processing response
- Eliminates dead code pattern where values are computed but unused
- API callers can now access these metrics

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

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

* fix: move error handling into SettingsDefaultsManager.loadFromFile()

Wrap the entire loadFromFile() method in try-catch so it handles ALL
error cases (missing file, corrupted JSON, permission errors, I/O failures)
instead of forcing every caller to add redundant try-catch blocks.

This follows DRY principle: one function owns error handling, all callers
stay simple and clean.

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

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

* Refactor hook response handling and optimize token estimation

- Removed the HookType and HookResponse types and the createHookResponse function from hook-response.ts to simplify the response handling for hooks.
- Introduced a standardized hook response for all hooks in hook-response.ts.
- Moved the estimateTokens function from SearchManager.ts to timeline-formatting.ts for better reusability and clarity.
- Cleaned up redundant estimateTokens function definitions in SearchManager.ts.

---------

Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-20 19:41:33 -05:00
2025-12-20 17:39:58 -05:00
2025-12-20 17:40:53 -05:00
2025-10-03 18:20:47 -04:00
2025-12-20 17:39:58 -05:00


Claude-Mem

Persistent memory compression system built for Claude Code.

License Version Node Mentioned in Awesome Claude Code

thedotmack/claude-mem | Trendshift


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
  • 🔍 Skill-Based Search - Query your project history with mem-search skill
  • 🖥️ Web Viewer UI - Real-time memory stream at http://localhost:37777
  • 💻 Claude Desktop Skill - Search memory from Claude Desktop conversations
  • 🔒 Privacy Control - Use <private> tags to exclude sensitive content from storage
  • ⚙️ Context Configuration - Fine-grained control over what context gets injected
  • 🤖 Automatic Operation - No manual intervention required
  • 🔗 Citations - Reference past observations with IDs (access via http://localhost:37777/api/observation/{id} or view all in the web viewer at http://localhost:37777)
  • 🧪 Beta Channel - Try experimental features like Endless Mode via version switching

Documentation

📚 View Full Documentation - Browse markdown docs on GitHub

💻 Local Preview: Run Mintlify docs locally:

cd docs/public
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. 5 Lifecycle Hooks - SessionStart, UserPromptSubmit, PostToolUse, Stop, SessionEnd (6 hook scripts)
  2. Smart Install - Cached dependency checker (pre-hook script, not a lifecycle hook)
  3. Worker Service - HTTP API on port 37777 with web viewer UI and 10 search endpoints, managed by Bun
  4. SQLite Database - Stores sessions, observations, summaries with FTS5 full-text search
  5. mem-search Skill - Natural language queries with progressive disclosure
  6. Chroma Vector Database - Hybrid semantic + keyword search for intelligent context retrieval

See Architecture Overview for details.


mem-search Skill

Claude-Mem provides intelligent search through the mem-search skill that auto-invokes when you ask about past work:

How It Works:

  • Just ask naturally: "What did we do last session?" or "Did we fix this bug before?"
  • Claude automatically invokes the mem-search skill to find relevant context

Available Search Operations:

  1. Search Observations - Full-text search across observations
  2. Search Sessions - Full-text search across session summaries
  3. Search Prompts - Search raw user requests
  4. By Concept - Find by concept tags (discovery, problem-solution, pattern, etc.)
  5. By File - Find observations referencing specific files
  6. By Type - Find by type (decision, bugfix, feature, refactor, discovery, change)
  7. Recent Context - Get recent session context for a project
  8. Timeline - Get unified timeline of context around a specific point in time
  9. Timeline by Query - Search for observations and get timeline context around best match
  10. API Help - Get search API documentation

Example Natural Language Queries:

"What bugs did we fix last session?"
"How did we implement authentication?"
"What changes were made to worker-service.ts?"
"Show me recent work on this project"
"What was happening when we added the viewer UI?"

See Search Tools Guide for detailed examples.


Beta Features & Endless Mode

Note

: Endless Mode is an experimental feature in the beta branch only. It is not included in the stable release you install via the marketplace. You must manually switch to the beta channel to try it, and it comes with significant caveats (see below).

Claude-Mem offers a beta channel with experimental features. Switch between stable and beta versions directly from the web viewer UI.

How to Try Beta

  1. Open http://localhost:37777
  2. Click Settings (gear icon)
  3. In Version Channel, click "Try Beta (Endless Mode)"
  4. Wait for the worker to restart

Your memory data is preserved when switching versions.

Endless Mode (Beta)

The flagship beta feature is Endless Mode - a biomimetic memory architecture that dramatically extends session length:

The Problem: Standard Claude Code sessions hit context limits after ~50 tool uses. Each tool adds 1-10k+ tokens, and Claude re-synthesizes all previous outputs on every response (O(N²) complexity).

The Solution: Endless Mode compresses tool outputs into ~500-token observations and transforms the transcript in real-time:

Working Memory (Context):     Compressed observations (~500 tokens each)
Archive Memory (Disk):        Full tool outputs preserved for recall

Projected Results (based on theoretical modeling, not production measurements):

  • Significant token reduction in context window
  • More tool uses before context exhaustion
  • Linear O(N) scaling instead of quadratic O(N²)
  • Full transcripts preserved for perfect recall

Important Caveats:

  • Not in stable release - You must switch to beta branch to use this feature
  • Still in development - May have bugs, breaking changes, or incomplete functionality
  • Slower than standard mode - Blocking observation generation adds latency to each tool use
  • Theoretical projections - The efficiency claims above are based on simulations, not real-world production data

See Beta Features Documentation for details.


What's New

v6.4.9 - Context Configuration Settings:

  • 11 new settings for fine-grained control over context injection
  • Configure token economics display, observation filtering by type/concept
  • Control number of observations and which fields to display

v6.4.0 - Dual-Tag Privacy System:

  • <private> tags for user-controlled privacy - wrap sensitive content to exclude from storage
  • System-level <claude-mem-context> tags prevent recursive observation storage
  • Edge processing ensures private content never reaches database

v6.3.0 - Version Channel:

  • Switch between stable and beta versions from the web viewer UI
  • Try experimental features like Endless Mode without manual git operations

Previous Highlights:

  • v6.0.0: Major session management & transcript processing improvements
  • v5.5.0: mem-search skill enhancement with 100% effectiveness rate
  • v5.4.0: Skill-based search architecture (~2,250 tokens saved per session)
  • v5.1.0: Web-based viewer UI with real-time updates
  • v5.0.0: Hybrid search with Chroma vector database

See CHANGELOG.md for complete version history.


System Requirements

  • Node.js: 18.0.0 or higher
  • Claude Code: Latest version with plugin support
  • Bun: JavaScript runtime and process manager (auto-installed if missing)
  • uv: Python package manager for vector search (auto-installed if missing)
  • 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

Settings are managed in ~/.claude-mem/settings.json. The file is auto-created with defaults on first run.

Available Settings:

Setting Default Description
CLAUDE_MEM_MODEL claude-sonnet-4-5 AI model for observations
CLAUDE_MEM_WORKER_PORT 37777 Worker service port
CLAUDE_MEM_WORKER_HOST 127.0.0.1 Worker bind address (use 0.0.0.0 for remote access)
CLAUDE_MEM_DATA_DIR ~/.claude-mem Data directory location
CLAUDE_MEM_LOG_LEVEL INFO Log verbosity (DEBUG, INFO, WARN, ERROR, SILENT)
CLAUDE_MEM_PYTHON_VERSION 3.13 Python version for chroma-mcp
CLAUDE_CODE_PATH (auto-detect) Path to Claude executable
CLAUDE_MEM_CONTEXT_OBSERVATIONS 50 Number of observations to inject at SessionStart

Settings Management:

# Edit settings via CLI helper
./claude-mem-settings.sh

# Or edit directly
nano ~/.claude-mem/settings.json

# View current settings
curl http://localhost:37777/api/settings

Settings File Format:

{
  "CLAUDE_MEM_MODEL": "claude-sonnet-4-5",
  "CLAUDE_MEM_WORKER_PORT": "37777",
  "CLAUDE_MEM_CONTEXT_OBSERVATIONS": "50"
}

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:

If you're experiencing issues, describe the problem to Claude and the troubleshoot skill will automatically activate to diagnose and provide fixes.

Common Issues:

  • Worker not starting → claude-mem 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.

Windows Known Issues

Console Window Visibility: On Windows, a console window may briefly appear when the worker service starts. This is a cosmetic issue that we're working to resolve. We've prioritized stability by removing a workaround that was causing libuv crashes. The window does not affect functionality and will be addressed in a future release when the MCP SDK provides proper window hiding support.


Bug Reports

Automated Bug Report Generator - Create comprehensive bug reports with one command:

# From the plugin directory
cd ~/.claude/plugins/marketplaces/thedotmack
npm run bug-report

The bug report tool will:

  • 🌎 Auto-translate - Write in ANY language, automatically translates to English
  • 📊 Collect diagnostics - Gathers versions, platform info, worker status, logs, and configuration
  • 📝 Interactive prompts - Guides you through describing the issue with multiline support
  • 🤖 AI formatting - Uses Claude Agent SDK to generate professional GitHub issues
  • 🔒 Privacy-safe - Auto-sanitizes paths, optional --no-logs flag
  • 🌐 Auto-submit - Opens GitHub with pre-filled title and body

Plugin Directory Paths:

  • macOS/Linux: ~/.claude/plugins/marketplaces/thedotmack
  • Windows: %USERPROFILE%\.claude\plugins\marketplaces\thedotmack

Options:

npm run bug-report --no-logs    # Skip logs for privacy
npm run bug-report --verbose    # Show all diagnostics
npm run bug-report --help       # Show help

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%