Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dd1b812443 | |||
| ad3d236cec | |||
| 494f681cbf | |||
| 4144010264 | |||
| d482f3ed76 | |||
| 3c4486e69e | |||
| e0fec4bad7 | |||
| f5a873ffdc |
@@ -10,7 +10,7 @@
|
||||
"plugins": [
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "10.4.0",
|
||||
"version": "10.4.3",
|
||||
"source": "./plugin",
|
||||
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "10.2.5",
|
||||
"version": "10.4.1",
|
||||
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
||||
"author": {
|
||||
"name": "Alex Newman"
|
||||
|
||||
+78
-120
@@ -2,6 +2,84 @@
|
||||
|
||||
All notable changes to claude-mem.
|
||||
|
||||
## [v10.4.1] - 2026-02-24
|
||||
|
||||
### Refactor
|
||||
- **Skills Conversion**: Converted `/make-plan` and `/do` commands into first-class skills in `plugin/skills/`.
|
||||
- **Organization**: Centralized planning and execution instructions alongside `mem-search`.
|
||||
- **Compatibility**: Added symlinks for `openclaw/skills/` to ensure seamless integration with OpenClaw.
|
||||
|
||||
### Chore
|
||||
- **Version Bump**: Aligned all package and plugin manifests to v10.4.1.
|
||||
|
||||
## [v10.4.0] - 2026-02-24
|
||||
|
||||
## v10.4.0 — Stability & Platform Hardening
|
||||
|
||||
Massive reliability release: 30+ root-cause bug fixes across 10 triage phases, plus new features for agent attribution, Chroma control, and broader platform support.
|
||||
|
||||
### New Features
|
||||
|
||||
- **Session custom titles** — Agents can now set `custom_title` on sessions for attribution (migration 23, new endpoint)
|
||||
- **Chroma toggle** — `CLAUDE_MEM_CHROMA_ENABLED` setting allows SQLite-only fallback mode (#707)
|
||||
- **Plugin disabled state** — Early exit check in all hook entry points when plugin is disabled (#781)
|
||||
- **Context re-injection guard** — `contextInjected` session flag prevents re-injecting context on every UserPromptSubmit turn (#1079)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
#### Data Integrity
|
||||
- SHA-256 content-hash deduplication on observation INSERT (migration 22 with backfill + index)
|
||||
- Project name collision fix: `getCurrentProjectName()` now returns `parent/basename`
|
||||
- Empty project string guard with cwd-derived fallback
|
||||
- Stuck `isProcessing` reset: pending work older than 5 minutes auto-clears
|
||||
|
||||
#### ChromaDB
|
||||
- Python version pinning in uvx args for both local and remote mode (#1196, #1206, #1208)
|
||||
- Windows backslash-to-forward-slash path conversion for `--data-dir` (#1199)
|
||||
- Metadata sanitization: filter null/undefined/empty values in `addDocuments()` (#1183, #1188)
|
||||
- Transport error auto-reconnect in `callTool()` (#1162)
|
||||
- Stale transport retry with transparent reconnect (#1131)
|
||||
|
||||
#### Hook Lifecycle
|
||||
- Suppress `process.stderr.write` in `hookCommand()` to prevent diagnostic output showing as error UI (#1181)
|
||||
- Route all `console.error()` through logger instead of stderr
|
||||
- Verified all 7 handlers return `suppressOutput: true` (#598, #784)
|
||||
|
||||
#### Worker Lifecycle
|
||||
- PID file mtime guard prevents concurrent restart storms (#1145)
|
||||
- `getInstalledPluginVersion()` ENOENT/EBUSY handling (#1042)
|
||||
|
||||
#### SQLite Migrations
|
||||
- Schema initialization always creates core tables via `CREATE TABLE IF NOT EXISTS`
|
||||
- Migrations 5-7 check actual DB state instead of version tracking (fixes version collision between old/new migration systems, #979)
|
||||
- Crash-safe temp table rebuilds
|
||||
|
||||
#### Platform Support
|
||||
- **Windows**: `cmd.exe /c` uvx spawn, PowerShell `$_` elimination with WQL filtering, `windowsHide: true`, FTS5 runtime probe with fallback (#1190, #1192, #1199, #1024, #1062, #1048, #791)
|
||||
- **Cursor IDE**: Adapter field fallbacks, tolerant session-init validation (#838, #1049)
|
||||
- **Codex CLI**: `session_id` fallbacks, unknown platform tolerance, undefined guard (#744)
|
||||
|
||||
#### API & Infrastructure
|
||||
- `/api/logs` OOM fix: tail-read replaces full-file `readFileSync` (64KB expanding chunks, 10MB cap, #1203)
|
||||
- CORS: explicit methods and allowedHeaders (#1029)
|
||||
- MCP type coercion for batch endpoints: string-to-array for `ids` and `memorySessionIds`
|
||||
- Defensive observation error handling returns 200 on recoverable errors instead of 500
|
||||
- `.git/` directory write guard on all 4 CLAUDE.md/AGENTS.md write sites (#1165)
|
||||
|
||||
#### Stale AbortController Fix
|
||||
- `lastGeneratorActivity` timestamp tracking with 30s timeout (#1099)
|
||||
- Stale generator detection + abort + restart in `ensureGeneratorRunning`
|
||||
- `AbortSignal.timeout(30000)` in `deleteSession` prevents indefinite hang
|
||||
|
||||
### Installation
|
||||
- `resolveRoot()` replaces hardcoded marketplace path using `CLAUDE_PLUGIN_ROOT` env var (#1128, #1166)
|
||||
- `installCLI()` path correction and `verifyCriticalModules()` post-install check
|
||||
- Build-time distribution verification for skills, hooks, and plugin manifest (#1187)
|
||||
|
||||
### Testing
|
||||
- 50+ new tests across hook lifecycle, context re-injection, plugin distribution, migration runner, data integrity, stale abort controller, logs tail-read, CORS, MCP type coercion, and smart-install
|
||||
- 68 files changed, ~4200 insertions, ~900 deletions
|
||||
|
||||
## [v10.3.3] - 2026-02-23
|
||||
|
||||
### Bug Fixes
|
||||
@@ -1319,123 +1397,3 @@ Fixed a critical memory leak where Claude SDK child processes were never termina
|
||||
|
||||
Thanks to @yonnock for the detailed bug report and investigation in #499!
|
||||
|
||||
## [v8.5.1] - 2025-12-30
|
||||
|
||||
## Bug Fix
|
||||
|
||||
**Fixed**: Migration 17 column rename failing for databases in intermediate states (#481)
|
||||
|
||||
### Problem
|
||||
Migration 17 renamed session ID columns but used a single check to determine if ALL tables were migrated. This caused errors for databases in partial migration states:
|
||||
- `no such column: sdk_session_id` (when columns already renamed)
|
||||
- `table observations has no column named memory_session_id` (when not renamed)
|
||||
|
||||
### Solution
|
||||
- Rewrote migration 17 to check **each table individually** before renaming
|
||||
- Added `safeRenameColumn()` helper that handles all edge cases gracefully
|
||||
- Handles all database states: fresh, old, and partially migrated
|
||||
|
||||
### Who was affected
|
||||
- Users upgrading from pre-v8.2.6 versions
|
||||
- Users whose migration was interrupted (crash, restart, etc.)
|
||||
- Users who restored database from backup
|
||||
|
||||
---
|
||||
|
||||
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
||||
|
||||
## [v8.5.0] - 2025-12-30
|
||||
|
||||
# Cursor Support Now Available 🎉
|
||||
|
||||
This is a major release introducing **full Cursor IDE support**. Claude-mem now works with Cursor, bringing persistent AI memory to Cursor users with or without a Claude Code subscription.
|
||||
|
||||
## Highlights
|
||||
|
||||
**Give Cursor persistent memory.** Every Cursor session starts fresh - your AI doesn't remember what it worked on yesterday. Claude-mem changes that. Your agent builds cumulative knowledge about your codebase, decisions, and patterns over time.
|
||||
|
||||
### Works Without Claude Code
|
||||
|
||||
You can now use claude-mem with Cursor using free AI providers:
|
||||
- **Gemini** (recommended): 1,500 free requests/day, no credit card required
|
||||
- **OpenRouter**: Access to 100+ models including free options
|
||||
- **Claude SDK**: For Claude Code subscribers
|
||||
|
||||
### Cross-Platform Support
|
||||
|
||||
Full support for all major platforms:
|
||||
- **macOS**: Bash scripts with `jq` and `curl`
|
||||
- **Linux**: Same toolchain as macOS
|
||||
- **Windows**: Native PowerShell scripts, no WSL required
|
||||
|
||||
## New Features
|
||||
|
||||
### Interactive Setup Wizard (`bun run cursor:setup`)
|
||||
A guided installer that:
|
||||
- Detects your environment (Claude Code present or not)
|
||||
- Helps you choose and configure an AI provider
|
||||
- Installs Cursor hooks automatically
|
||||
- Starts the worker service
|
||||
- Verifies everything is working
|
||||
|
||||
### Cursor Lifecycle Hooks
|
||||
Complete hook integration with Cursor's native hook system:
|
||||
- `session-init.sh/.ps1` - Session start with context injection
|
||||
- `user-message.sh/.ps1` - User prompt capture
|
||||
- `save-observation.sh/.ps1` - Tool usage logging
|
||||
- `save-file-edit.sh/.ps1` - File edit tracking
|
||||
- `session-summary.sh/.ps1` - Session end summary
|
||||
- `context-inject.sh/.ps1` - Load relevant history
|
||||
|
||||
### Context Injection via `.cursor/rules`
|
||||
Relevant past context is automatically injected into Cursor sessions via the `.cursor/rules/claude-mem-context.mdc` file, giving your AI immediate awareness of prior work.
|
||||
|
||||
### Project Registry
|
||||
Multi-project support with automatic project detection:
|
||||
- Projects registered in `~/.claude-mem/cursor-projects.json`
|
||||
- Context automatically scoped to current project
|
||||
- Works across multiple workspaces simultaneously
|
||||
|
||||
### MCP Search Tools
|
||||
Full MCP server integration for Cursor:
|
||||
- `search` - Find observations by query, date, type
|
||||
- `timeline` - Get context around specific observations
|
||||
- `get_observations` - Fetch full details for filtered IDs
|
||||
|
||||
## New Commands
|
||||
|
||||
| Command | Description |
|
||||
|---------|-------------|
|
||||
| `bun run cursor:setup` | Interactive setup wizard |
|
||||
| `bun run cursor:install` | Install Cursor hooks |
|
||||
| `bun run cursor:uninstall` | Remove Cursor hooks |
|
||||
| `bun run cursor:status` | Check hook installation status |
|
||||
|
||||
## Documentation
|
||||
|
||||
Full documentation available at [docs.claude-mem.ai/cursor](https://docs.claude-mem.ai/cursor):
|
||||
- Cursor Integration Overview
|
||||
- Gemini Setup Guide (free tier)
|
||||
- OpenRouter Setup Guide
|
||||
- Troubleshooting
|
||||
|
||||
## Getting Started
|
||||
|
||||
### For Cursor-Only Users (No Claude Code)
|
||||
|
||||
```bash
|
||||
git clone https://github.com/thedotmack/claude-mem.git
|
||||
cd claude-mem && bun install && bun run build
|
||||
bun run cursor:setup
|
||||
```
|
||||
|
||||
### For Claude Code Users
|
||||
|
||||
```bash
|
||||
/plugin marketplace add thedotmack/claude-mem
|
||||
/plugin install claude-mem
|
||||
claude-mem cursor install
|
||||
```
|
||||
|
||||
**Full Changelog**: https://github.com/thedotmack/claude-mem/compare/v8.2.10...v8.5.0
|
||||
|
||||
|
||||
@@ -14,6 +14,10 @@ Claude-mem is a Claude Code plugin providing persistent memory across sessions.
|
||||
|
||||
**Search Skill** (`plugin/skills/mem-search/SKILL.md`) - HTTP API for searching past work, auto-invoked when users ask about history
|
||||
|
||||
**Planning Skill** (`plugin/skills/make-plan/SKILL.md`) - Orchestrator instructions for creating phased implementation plans with documentation discovery
|
||||
|
||||
**Execution Skill** (`plugin/skills/do/SKILL.md`) - Orchestrator instructions for executing phased plans using subagents
|
||||
|
||||
**Chroma** (`src/services/sync/ChromaSync.ts`) - Vector embeddings for semantic search
|
||||
|
||||
**Viewer UI** (`src/ui/viewer/`) - React interface at http://localhost:37777, built to `plugin/ui/viewer.html`
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
"name": "Claude-Mem (Persistent Memory)",
|
||||
"description": "Official OpenClaw plugin for Claude-Mem. Records observations from embedded runner sessions and streams them to messaging channels.",
|
||||
"kind": "memory",
|
||||
"version": "1.0.0",
|
||||
"version": "10.4.1",
|
||||
"author": "thedotmack",
|
||||
"homepage": "https://claude-mem.com",
|
||||
"skills": ["skills/make-plan", "skills/do-plan"],
|
||||
"skills": ["skills/make-plan", "skills/do"],
|
||||
"configSchema": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
||||
Symlink
+1
@@ -0,0 +1 @@
|
||||
../../../plugin/skills/do/SKILL.md
|
||||
@@ -1,63 +0,0 @@
|
||||
---
|
||||
name: make-plan
|
||||
description: Create a detailed, phased implementation plan with documentation discovery. Use when asked to plan a feature, task, or multi-step implementation — especially before executing with do-plan.
|
||||
---
|
||||
|
||||
# Make Plan
|
||||
|
||||
You are an ORCHESTRATOR. Create an LLM-friendly plan in phases that can be executed consecutively in new chat contexts.
|
||||
|
||||
## Delegation Model
|
||||
|
||||
Use subagents for *fact gathering and extraction* (docs, examples, signatures, grep results). Keep *synthesis and plan authoring* with the orchestrator (phase boundaries, task framing, final wording). If a subagent report is incomplete or lacks evidence, re-check with targeted reads/greps before finalizing.
|
||||
|
||||
### Subagent Reporting Contract (MANDATORY)
|
||||
|
||||
Each subagent response must include:
|
||||
1. Sources consulted (files/URLs) and what was read
|
||||
2. Concrete findings (exact API names/signatures; exact file paths/locations)
|
||||
3. Copy-ready snippet locations (example files/sections to copy)
|
||||
4. "Confidence" note + known gaps (what might still be missing)
|
||||
|
||||
Reject and redeploy the subagent if it reports conclusions without sources.
|
||||
|
||||
## Plan Structure
|
||||
|
||||
### Phase 0: Documentation Discovery (ALWAYS FIRST)
|
||||
|
||||
Before planning implementation, deploy "Documentation Discovery" subagents to:
|
||||
1. Search for and read relevant documentation, examples, and existing patterns
|
||||
2. Identify the actual APIs, methods, and signatures available (not assumed)
|
||||
3. Create a brief "Allowed APIs" list citing specific documentation sources
|
||||
4. Note any anti-patterns to avoid (methods that DON'T exist, deprecated parameters)
|
||||
|
||||
The orchestrator consolidates findings into a single Phase 0 output.
|
||||
|
||||
### Each Implementation Phase Must Include
|
||||
|
||||
1. **What to implement** — Frame tasks to COPY from docs, not transform existing code
|
||||
- Good: "Copy the V2 session pattern from docs/examples.ts:45-60"
|
||||
- Bad: "Migrate the existing code to V2"
|
||||
2. **Documentation references** — Cite specific files/lines for patterns to follow
|
||||
3. **Verification checklist** — How to prove this phase worked (tests, grep checks)
|
||||
4. **Anti-pattern guards** — What NOT to do (invented APIs, undocumented params)
|
||||
|
||||
### Final Phase: Verification
|
||||
|
||||
1. Verify all implementations match documentation
|
||||
2. Check for anti-patterns (grep for known bad patterns)
|
||||
3. Run tests to confirm functionality
|
||||
|
||||
## Key Principles
|
||||
|
||||
- Documentation Availability ≠ Usage: Explicitly require reading docs
|
||||
- Task Framing Matters: Direct agents to docs, not just outcomes
|
||||
- Verify > Assume: Require proof, not assumptions about APIs
|
||||
- Session Boundaries: Each phase should be self-contained with its own doc references
|
||||
|
||||
## Anti-Patterns to Prevent
|
||||
|
||||
- Inventing API methods that "should" exist
|
||||
- Adding parameters not in documentation
|
||||
- Skipping verification steps
|
||||
- Assuming structure without checking examples
|
||||
+1
@@ -0,0 +1 @@
|
||||
../../../plugin/skills/make-plan/SKILL.md
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "10.4.0",
|
||||
"version": "10.4.3",
|
||||
"description": "Memory compression system for Claude Code - persist context across sessions",
|
||||
"keywords": [
|
||||
"claude",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "10.4.0",
|
||||
"version": "10.4.3",
|
||||
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
||||
"author": {
|
||||
"name": "Alex Newman"
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
---
|
||||
description: "Execute a plan using subagents for implementation"
|
||||
argument-hint: "[task or plan reference]"
|
||||
---
|
||||
|
||||
You are an ORCHESTRATOR.
|
||||
|
||||
Primary instruction: deploy subagents to execute *all* work for #$ARGUMENTS.
|
||||
Do not do the work yourself except to coordinate, route context, and verify that each subagent completed its assigned checklist.
|
||||
|
||||
Deploy subagents to execute each phase of #$ARGUMENTS independently and consecutively. For every checklist item below, explicitly deploy (or reuse) a subagent responsible for that item and record its outcome before proceeding.
|
||||
|
||||
## Execution Protocol (Orchestrator-Driven)
|
||||
|
||||
Orchestrator rules:
|
||||
- Each phase uses fresh subagents where noted (or when context is large/unclear).
|
||||
- The orchestrator assigns one clear objective per subagent and requires evidence (commands run, outputs, files changed).
|
||||
- Do not advance to the next step until the assigned subagent reports completion and the orchestrator confirms it matches the plan.
|
||||
|
||||
### During Each Phase:
|
||||
Deploy an "Implementation" subagent to:
|
||||
1. Execute the implementation as specified
|
||||
2. COPY patterns from documentation, don't invent
|
||||
3. Cite documentation sources in code comments when using unfamiliar APIs
|
||||
4. If an API seems missing, STOP and verify - don't assume it exists
|
||||
|
||||
### After Each Phase:
|
||||
Deploy subagents for each post-phase responsibility:
|
||||
1. **Run verification checklist** - Deploy a "Verification" subagent to prove the phase worked
|
||||
2. **Anti-pattern check** - Deploy an "Anti-pattern" subagent to grep for known bad patterns from the plan
|
||||
3. **Code quality review** - Deploy a "Code Quality" subagent to review changes
|
||||
4. **Commit only if verified** - Deploy a "Commit" subagent *only after* verification passes; otherwise, do not commit
|
||||
|
||||
### Between Phases:
|
||||
Deploy a "Branch/Sync" subagent to:
|
||||
- Push to working branch after each verified phase
|
||||
- Prepare the next phase handoff so the next phase's subagents start fresh but have plan context
|
||||
|
||||
## Failure Modes to Prevent
|
||||
- Don't invent APIs that "should" exist - verify against docs
|
||||
- Don't add undocumented parameters - copy exact signatures
|
||||
- Don't skip verification - deploy a verification subagent and run the checklist
|
||||
- Don't commit before verification passes (or without explicit orchestrator approval)
|
||||
@@ -1,66 +0,0 @@
|
||||
---
|
||||
description: "Create an implementation plan with documentation discovery"
|
||||
argument-hint: "[feature or task description]"
|
||||
---
|
||||
|
||||
You are an ORCHESTRATOR.
|
||||
|
||||
Create an LLM-friendly plan in phases that can be executed consecutively in new chat contexts.
|
||||
|
||||
Delegation model (because subagents can under-report):
|
||||
- Use subagents for *fact gathering and extraction* (docs, examples, signatures, grep results).
|
||||
- Keep *synthesis and plan authoring* with the orchestrator (phase boundaries, task framing, final wording).
|
||||
- If a subagent report is incomplete or lacks evidence, the orchestrator must re-check with targeted reads/greps before finalizing the plan.
|
||||
|
||||
Subagent reporting contract (MANDATORY):
|
||||
- Each subagent response must include:
|
||||
1) Sources consulted (files/URLs) and what was read
|
||||
2) Concrete findings (exact API names/signatures; exact file paths/locations)
|
||||
3) Copy-ready snippet locations (example files/sections to copy)
|
||||
4) "Confidence" note + known gaps (what might still be missing)
|
||||
- Reject and redeploy the subagent if it reports conclusions without sources.
|
||||
|
||||
## Plan Structure Requirements
|
||||
|
||||
### Phase 0: Documentation Discovery (ALWAYS FIRST)
|
||||
Before planning implementation, you MUST:
|
||||
Deploy one or more "Documentation Discovery" subagents to:
|
||||
1. Search for and read relevant documentation, examples, and existing patterns
|
||||
2. Identify the actual APIs, methods, and signatures available (not assumed)
|
||||
3. Create a brief "Allowed APIs" list citing specific documentation sources
|
||||
4. Note any anti-patterns to avoid (methods that DON'T exist, deprecated parameters)
|
||||
|
||||
Then the orchestrator consolidates their findings into a single Phase 0 output.
|
||||
|
||||
### Each Implementation Phase Must Include:
|
||||
1. **What to implement** - Frame tasks to COPY from docs, not transform existing code
|
||||
- Good: "Copy the V2 session pattern from docs/examples.ts:45-60"
|
||||
- Bad: "Migrate the existing code to V2"
|
||||
2. **Documentation references** - Cite specific files/lines for patterns to follow
|
||||
3. **Verification checklist** - How to prove this phase worked (tests, grep checks)
|
||||
4. **Anti-pattern guards** - What NOT to do (invented APIs, undocumented params)
|
||||
|
||||
Subagent-friendly split:
|
||||
- Subagents can propose candidate doc references and verification commands.
|
||||
- The orchestrator must write the final phase text, ensuring tasks are copy-based, scoped, and independently executable.
|
||||
|
||||
### Final Phase: Verification
|
||||
1. Verify all implementations match documentation
|
||||
2. Check for anti-patterns (grep for known bad patterns)
|
||||
3. Run tests to confirm functionality
|
||||
|
||||
Delegation guidance:
|
||||
- Deploy a "Verification" subagent to draft the checklist and commands.
|
||||
- The orchestrator must review the checklist for completeness and ensure it maps to earlier phase outputs.
|
||||
|
||||
## Key Principles
|
||||
- Documentation Availability ≠ Usage: Explicitly require reading docs
|
||||
- Task Framing Matters: Direct agents to docs, not just outcomes
|
||||
- Verify > Assume: Require proof, not assumptions about APIs
|
||||
- Session Boundaries: Each phase should be self-contained with its own doc references
|
||||
|
||||
## Anti-Patterns to Prevent
|
||||
- Inventing API methods that "should" exist
|
||||
- Adding parameters not in documentation
|
||||
- Skipping verification steps
|
||||
- Assuming structure without checking examples
|
||||
+8
-23
@@ -7,7 +7,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/setup.sh",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; \"$_R/scripts/setup.sh\"",
|
||||
"timeout": 300
|
||||
}
|
||||
]
|
||||
@@ -19,7 +19,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/smart-install.js\"",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/smart-install.js\"",
|
||||
"timeout": 300
|
||||
}
|
||||
]
|
||||
@@ -29,12 +29,12 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" start",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" start",
|
||||
"timeout": 60
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" hook claude-code context",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code context",
|
||||
"timeout": 60
|
||||
}
|
||||
]
|
||||
@@ -45,12 +45,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" start",
|
||||
"timeout": 60
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" hook claude-code session-init",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code session-init",
|
||||
"timeout": 60
|
||||
}
|
||||
]
|
||||
@@ -62,12 +57,7 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" start",
|
||||
"timeout": 60
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" hook claude-code observation",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code observation",
|
||||
"timeout": 120
|
||||
}
|
||||
]
|
||||
@@ -78,17 +68,12 @@
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" start",
|
||||
"timeout": 60
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" hook claude-code summarize",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code summarize",
|
||||
"timeout": 120
|
||||
},
|
||||
{
|
||||
"type": "command",
|
||||
"command": "node \"${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js\" \"${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs\" hook claude-code session-complete",
|
||||
"command": "_R=\"${CLAUDE_PLUGIN_ROOT}\"; [ -z \"$_R\" ] && _R=\"$HOME/.claude/plugins/marketplaces/thedotmack/plugin\"; node \"$_R/scripts/bun-runner.js\" \"$_R/scripts/worker-service.cjs\" hook claude-code session-complete",
|
||||
"timeout": 30
|
||||
}
|
||||
]
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem-plugin",
|
||||
"version": "10.4.0",
|
||||
"version": "10.4.3",
|
||||
"private": true,
|
||||
"description": "Runtime dependencies for claude-mem bundled hooks",
|
||||
"type": "module",
|
||||
|
||||
@@ -13,11 +13,36 @@
|
||||
*/
|
||||
import { spawnSync, spawn } from 'child_process';
|
||||
import { existsSync, readFileSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
import { join, dirname, resolve } from 'path';
|
||||
import { homedir } from 'os';
|
||||
import { fileURLToPath } from 'url';
|
||||
|
||||
const IS_WINDOWS = process.platform === 'win32';
|
||||
|
||||
// Self-resolve plugin root when CLAUDE_PLUGIN_ROOT is not set by Claude Code.
|
||||
// Upstream bug: anthropics/claude-code#24529 — Stop hooks (and on Linux, all hooks)
|
||||
// don't receive CLAUDE_PLUGIN_ROOT, causing script paths to resolve to /scripts/...
|
||||
// which doesn't exist. This fallback derives the plugin root from bun-runner.js's
|
||||
// own filesystem location (this file lives in <plugin-root>/scripts/).
|
||||
const __bun_runner_dirname = dirname(fileURLToPath(import.meta.url));
|
||||
const RESOLVED_PLUGIN_ROOT = process.env.CLAUDE_PLUGIN_ROOT || resolve(__bun_runner_dirname, '..');
|
||||
|
||||
/**
|
||||
* Fix script path arguments that were broken by empty CLAUDE_PLUGIN_ROOT.
|
||||
* When CLAUDE_PLUGIN_ROOT is empty, "${CLAUDE_PLUGIN_ROOT}/scripts/foo.cjs"
|
||||
* expands to "/scripts/foo.cjs" which doesn't exist. Detect this and rewrite
|
||||
* the path using our self-resolved plugin root.
|
||||
*/
|
||||
function fixBrokenScriptPath(argPath) {
|
||||
if (argPath.startsWith('/scripts/') && !existsSync(argPath)) {
|
||||
const fixedPath = join(RESOLVED_PLUGIN_ROOT, argPath);
|
||||
if (existsSync(fixedPath)) {
|
||||
return fixedPath;
|
||||
}
|
||||
}
|
||||
return argPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find Bun executable - checks PATH first, then common install locations
|
||||
*/
|
||||
@@ -80,6 +105,9 @@ if (args.length === 0) {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Fix broken script paths caused by empty CLAUDE_PLUGIN_ROOT (#1215)
|
||||
args[0] = fixBrokenScriptPath(args[0]);
|
||||
|
||||
const bunPath = findBun();
|
||||
|
||||
if (!bunPath) {
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
---
|
||||
name: do-plan
|
||||
name: do
|
||||
description: Execute a phased implementation plan using subagents. Use when asked to execute, run, or carry out a plan — especially one created by make-plan.
|
||||
---
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
---
|
||||
name: make-plan
|
||||
description: Create a detailed, phased implementation plan with documentation discovery. Use when asked to plan a feature, task, or multi-step implementation — especially before executing with do.
|
||||
---
|
||||
|
||||
# Make Plan
|
||||
|
||||
You are an ORCHESTRATOR. Create an LLM-friendly plan in phases that can be executed consecutively in new chat contexts.
|
||||
|
||||
## Delegation Model
|
||||
|
||||
Use subagents for *fact gathering and extraction* (docs, examples, signatures, grep results). Keep *synthesis and plan authoring* with the orchestrator (phase boundaries, task framing, final wording). If a subagent report is incomplete or lacks evidence, re-check with targeted reads/greps before finalizing.
|
||||
|
||||
### Subagent Reporting Contract (MANDATORY)
|
||||
|
||||
Each subagent response must include:
|
||||
1. Sources consulted (files/URLs) and what was read
|
||||
2. Concrete findings (exact API names/signatures; exact file paths/locations)
|
||||
3. Copy-ready snippet locations (example files/sections to copy)
|
||||
4. "Confidence" note + known gaps (what might still be missing)
|
||||
|
||||
Reject and redeploy the subagent if it reports conclusions without sources.
|
||||
|
||||
## Plan Structure
|
||||
|
||||
### Phase 0: Documentation Discovery (ALWAYS FIRST)
|
||||
|
||||
Before planning implementation, deploy "Documentation Discovery" subagents to:
|
||||
1. Search for and read relevant documentation, examples, and existing patterns
|
||||
2. Identify the actual APIs, methods, and signatures available (not assumed)
|
||||
3. Create a brief "Allowed APIs" list citing specific documentation sources
|
||||
4. Note any anti-patterns to avoid (methods that DON'T exist, deprecated parameters)
|
||||
|
||||
The orchestrator consolidates findings into a single Phase 0 output.
|
||||
|
||||
### Each Implementation Phase Must Include
|
||||
|
||||
1. **What to implement** — Frame tasks to COPY from docs, not transform existing code
|
||||
- Good: "Copy the V2 session pattern from docs/examples.ts:45-60"
|
||||
- Bad: "Migrate the existing code to V2"
|
||||
2. **Documentation references** — Cite specific files/lines for patterns to follow
|
||||
3. **Verification checklist** — How to prove this phase worked (tests, grep checks)
|
||||
4. **Anti-pattern guards** — What NOT to do (invented APIs, undocumented params)
|
||||
|
||||
### Final Phase: Verification
|
||||
|
||||
1. Verify all implementations match documentation
|
||||
2. Check for anti-patterns (grep for known bad patterns)
|
||||
3. Run tests to confirm functionality
|
||||
|
||||
## Key Principles
|
||||
|
||||
- Documentation Availability ≠ Usage: Explicitly require reading docs
|
||||
- Task Framing Matters: Direct agents to docs, not just outcomes
|
||||
- Verify > Assume: Require proof, not assumptions about APIs
|
||||
- Session Boundaries: Each phase should be self-contained with its own doc references
|
||||
|
||||
## Anti-Patterns to Prevent
|
||||
|
||||
- Inventing API methods that "should" exist
|
||||
- Adding parameters not in documentation
|
||||
- Skipping verification steps
|
||||
- Assuming structure without checking examples
|
||||
@@ -10,6 +10,8 @@ import { ensureWorkerRunning, getWorkerPort } from '../../shared/worker-utils.js
|
||||
import { getProjectContext } from '../../utils/project-name.js';
|
||||
import { HOOK_EXIT_CODES } from '../../shared/hook-constants.js';
|
||||
import { logger } from '../../utils/logger.js';
|
||||
import { SettingsDefaultsManager } from '../../shared/SettingsDefaultsManager.js';
|
||||
import { USER_SETTINGS_PATH } from '../../shared/paths.js';
|
||||
|
||||
export const contextHandler: EventHandler = {
|
||||
async execute(input: NormalizedHookInput): Promise<HookResult> {
|
||||
@@ -30,6 +32,10 @@ export const contextHandler: EventHandler = {
|
||||
const context = getProjectContext(cwd);
|
||||
const port = getWorkerPort();
|
||||
|
||||
// Check if terminal output should be shown (load settings early)
|
||||
const settings = SettingsDefaultsManager.loadFromFile(USER_SETTINGS_PATH);
|
||||
const showTerminalOutput = settings.CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT === 'true';
|
||||
|
||||
// Pass all projects (parent + worktree if applicable) for unified timeline
|
||||
const projectsParam = context.allProjects.join(',');
|
||||
const url = `http://127.0.0.1:${port}/api/context/inject?projects=${encodeURIComponent(projectsParam)}`;
|
||||
@@ -37,11 +43,11 @@ export const contextHandler: EventHandler = {
|
||||
// Note: Removed AbortSignal.timeout due to Windows Bun cleanup issue (libuv assertion)
|
||||
// Worker service has its own timeouts, so client-side timeout is redundant
|
||||
try {
|
||||
// Fetch both markdown (for Claude context) and colored (for user display) truly in parallel
|
||||
// Fetch markdown (for Claude context) and optionally colored (for user display)
|
||||
const colorUrl = `${url}&colors=true`;
|
||||
const [response, colorResponse] = await Promise.all([
|
||||
fetch(url),
|
||||
fetch(colorUrl).catch(() => null)
|
||||
showTerminalOutput ? fetch(colorUrl).catch(() => null) : Promise.resolve(null)
|
||||
]);
|
||||
|
||||
if (!response.ok) {
|
||||
@@ -60,7 +66,8 @@ export const contextHandler: EventHandler = {
|
||||
|
||||
const additionalContext = contextResult.trim();
|
||||
const coloredTimeline = colorResult.trim();
|
||||
const systemMessage = coloredTimeline
|
||||
|
||||
const systemMessage = showTerminalOutput && coloredTimeline
|
||||
? `${coloredTimeline}\n\nView Observations Live @ http://localhost:${port}`
|
||||
: undefined;
|
||||
|
||||
|
||||
@@ -1027,6 +1027,7 @@ async function main() {
|
||||
} else {
|
||||
exitWithStatus('error', 'Failed to start worker');
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case 'stop': {
|
||||
@@ -1038,6 +1039,7 @@ async function main() {
|
||||
removePidFile();
|
||||
logger.info('SYSTEM', 'Worker stopped successfully');
|
||||
process.exit(0);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'restart': {
|
||||
@@ -1074,6 +1076,7 @@ async function main() {
|
||||
|
||||
logger.info('SYSTEM', 'Worker restarted successfully');
|
||||
process.exit(0);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'status': {
|
||||
@@ -1088,12 +1091,14 @@ async function main() {
|
||||
console.log('Worker is not running');
|
||||
}
|
||||
process.exit(0);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'cursor': {
|
||||
const subcommand = process.argv[3];
|
||||
const cursorResult = await handleCursorCommand(subcommand, process.argv.slice(4));
|
||||
process.exit(cursorResult);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'hook': {
|
||||
@@ -1147,6 +1152,7 @@ async function main() {
|
||||
const { generateClaudeMd } = await import('../cli/claude-md-commands.js');
|
||||
const result = await generateClaudeMd(dryRun);
|
||||
process.exit(result);
|
||||
break;
|
||||
}
|
||||
|
||||
case 'clean': {
|
||||
@@ -1154,6 +1160,7 @@ async function main() {
|
||||
const { cleanClaudeMd } = await import('../cli/claude-md-commands.js');
|
||||
const result = await cleanClaudeMd(dryRun);
|
||||
process.exit(result);
|
||||
break;
|
||||
}
|
||||
|
||||
case '--daemon':
|
||||
@@ -1210,5 +1217,8 @@ const isMainModule = typeof require !== 'undefined' && typeof module !== 'undefi
|
||||
: import.meta.url === `file://${process.argv[1]}` || process.argv[1]?.endsWith('worker-service');
|
||||
|
||||
if (isMainModule) {
|
||||
main();
|
||||
main().catch((error) => {
|
||||
logger.error('SYSTEM', 'Fatal error in main', {}, error instanceof Error ? error : undefined);
|
||||
process.exit(0); // Exit 0: don't block Claude Code, don't leave Windows Terminal tabs open
|
||||
});
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ export interface SettingsDefaults {
|
||||
// Feature Toggles
|
||||
CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY: string;
|
||||
CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE: string;
|
||||
CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT: string;
|
||||
CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED: string;
|
||||
// Process Management
|
||||
CLAUDE_MEM_MAX_CONCURRENT_AGENTS: string; // Max concurrent Claude SDK agent subprocesses (default: 2)
|
||||
@@ -112,6 +113,7 @@ export class SettingsDefaultsManager {
|
||||
// Feature Toggles
|
||||
CLAUDE_MEM_CONTEXT_SHOW_LAST_SUMMARY: 'true',
|
||||
CLAUDE_MEM_CONTEXT_SHOW_LAST_MESSAGE: 'false',
|
||||
CLAUDE_MEM_CONTEXT_SHOW_TERMINAL_OUTPUT: 'true',
|
||||
CLAUDE_MEM_FOLDER_CLAUDEMD_ENABLED: 'false',
|
||||
// Process Management
|
||||
CLAUDE_MEM_MAX_CONCURRENT_AGENTS: '2', // Max concurrent Claude SDK agent subprocesses
|
||||
|
||||
@@ -81,6 +81,22 @@ describe('Plugin Distribution - hooks.json Integrity', () => {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it('should include CLAUDE_PLUGIN_ROOT fallback in all hook commands (#1215)', () => {
|
||||
const hooksPath = path.join(projectRoot, 'plugin/hooks/hooks.json');
|
||||
const parsed = JSON.parse(readFileSync(hooksPath, 'utf-8'));
|
||||
const expectedFallbackPath = '$HOME/.claude/plugins/marketplaces/thedotmack/plugin';
|
||||
|
||||
for (const [eventName, matchers] of Object.entries(parsed.hooks)) {
|
||||
for (const matcher of matchers as any[]) {
|
||||
for (const hook of matcher.hooks) {
|
||||
if (hook.type === 'command') {
|
||||
expect(hook.command).toContain(expectedFallbackPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('Plugin Distribution - package.json Files Field', () => {
|
||||
|
||||
Reference in New Issue
Block a user