Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
"plugins": [
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "10.4.1",
|
||||
"version": "10.4.2",
|
||||
"source": "./plugin",
|
||||
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,214 @@
|
||||
# Plan: Endless Mode Re-implementation on Current Main
|
||||
|
||||
## Context
|
||||
|
||||
Endless mode was implemented on `beta/endless-mode` branch (diverged at v7.0.0). Main is now at v10.4.1 — **902 commits ahead**. Rebasing is impractical. This plan re-implements endless mode on top of current main, using the old branch as a reference for concepts only.
|
||||
|
||||
### What Endless Mode Does
|
||||
|
||||
When enabled, after each tool execution:
|
||||
1. The PostToolUse hook waits for the SDK agent to process the observation
|
||||
2. The processed observation (title, narrative, facts) is injected back into Claude's context via `additionalContext`
|
||||
3. Large tool inputs are cleared from the transcript to save tokens
|
||||
4. Net effect: Claude sees compressed observations instead of raw tool data → extends effective context window
|
||||
|
||||
### Key Problem from Previous Attempt
|
||||
|
||||
The save-hook blocked for 60-90s waiting for SDK processing, making sessions unusably slow. The fundamental tension: AI-processed observations require time, but hooks have a 120s hard limit.
|
||||
|
||||
### Branch Strategy
|
||||
|
||||
Create a new branch `feature/endless-mode-v2` from current main. Do NOT touch the old `beta/endless-mode` branch.
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Documentation Discovery (Reference Gathering)
|
||||
|
||||
### 0.1 — Read old branch implementation for reference patterns
|
||||
- `git show beta/endless-mode:src/hooks/save-hook.ts` — synchronous wait pattern
|
||||
- `git show beta/endless-mode:src/hooks/context-injection.ts` — observation formatting
|
||||
- `git show beta/endless-mode:src/hooks/pre-tool-use-hook.ts` — tool_use_id tracking
|
||||
- `git show beta/endless-mode:src/services/worker/SessionManager.ts` — `waitForNextObservation()`
|
||||
- `git show beta/endless-mode:docs/context/state-of-endless.md` — architecture doc
|
||||
|
||||
### 0.2 — Read current main integration points
|
||||
- `src/hooks/hook-response.ts:1-15` — current hook response format
|
||||
- `src/services/worker/SessionManager.ts:21-100` — current session management
|
||||
- `src/services/worker/SDKAgent.ts:43-150` — current SDK agent flow, event emission
|
||||
- `src/services/worker/http/routes/SessionRoutes.ts:498-573` — current observation endpoint
|
||||
- `src/services/sqlite/SessionStore.ts:1503-1560` — current storeObservation
|
||||
- `src/shared/SettingsDefaultsManager.ts:77-133` — current settings defaults
|
||||
|
||||
### 0.3 — Identify Claude Code hook contract
|
||||
- `plugin/plugin.json` — current hook configuration (which hooks exist, their types)
|
||||
- Check if `PreToolUse` hook type is available in Claude Code plugin spec
|
||||
- Check `additionalContext` field availability in hook response contract
|
||||
|
||||
### Deliverable
|
||||
List of exact APIs, file locations, and patterns available for each integration point. Anti-pattern list of methods that existed on the old branch but don't exist on current main.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Database Schema — Add `tool_use_id` Column
|
||||
|
||||
### What to implement
|
||||
- Add migration 20 to `src/services/sqlite/SessionStore.ts` (after migration 19 at ~line 53)
|
||||
- Add nullable `tool_use_id TEXT` column to observations table
|
||||
- Add index: `CREATE INDEX idx_observations_tool_use_id ON observations(tool_use_id)`
|
||||
- Add `getObservationsByToolUseId(toolUseId: string)` method to SessionStore
|
||||
- Update `storeObservation()` signature to accept optional `tool_use_id?: string`
|
||||
|
||||
### Files to modify
|
||||
- `src/services/sqlite/SessionStore.ts` — migration + store method
|
||||
- `src/services/sqlite/observations/types.ts` — add tool_use_id to StoreObservationResult
|
||||
- `src/types/transcript.ts` — verify ToolResultContent.tool_use_id matches Claude's format
|
||||
|
||||
### Verification
|
||||
- `npm run build` succeeds
|
||||
- Worker starts without errors
|
||||
- New column appears in observations table: `sqlite3 ~/.claude-mem/claude-mem.db ".schema observations"`
|
||||
|
||||
### Anti-patterns
|
||||
- Do NOT make tool_use_id NOT NULL — old observations won't have it
|
||||
- Do NOT modify existing migrations — only append new ones
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Settings — Add Endless Mode Configuration
|
||||
|
||||
### What to implement
|
||||
- Add to `SettingsDefaultsManager.ts` DEFAULTS (~line 77):
|
||||
- `CLAUDE_MEM_ENDLESS_MODE`: `'false'` (disabled by default)
|
||||
- `CLAUDE_MEM_ENDLESS_WAIT_TIMEOUT_MS`: `'90000'` (90 second timeout)
|
||||
- Add helper method `isEndlessModeEnabled(): boolean`
|
||||
|
||||
### Files to modify
|
||||
- `src/shared/SettingsDefaultsManager.ts`
|
||||
|
||||
### Verification
|
||||
- Settings load correctly with defaults
|
||||
- Can override via `~/.claude-mem/settings.json`
|
||||
- Can override via environment variable
|
||||
|
||||
### Anti-patterns
|
||||
- Do NOT add UI for toggling yet — settings.json is sufficient for beta
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Worker-Side — Event-Based Observation Completion Signaling
|
||||
|
||||
### What to implement
|
||||
- In `SessionManager.ts`: Add `waitForNextObservation(sessionDbId, toolUseId, timeoutMs)` method
|
||||
- Uses existing `sessionQueues` EventEmitter infrastructure
|
||||
- Waits for `observation_saved` event matching toolUseId
|
||||
- Returns the observation or null on timeout
|
||||
- In `SDKAgent.ts`: After `storeObservation()` call, emit `observation_saved` event with observation data and toolUseId
|
||||
- In `SessionRoutes.ts`:
|
||||
- Accept `tool_use_id` in observation POST body
|
||||
- Accept `wait_until_observation_is_saved=true` query parameter
|
||||
- When waiting: call `SessionManager.waitForNextObservation()` before responding
|
||||
- When not waiting (default): existing fire-and-forget behavior
|
||||
|
||||
### Files to modify
|
||||
- `src/services/worker/SessionManager.ts`
|
||||
- `src/services/worker/SDKAgent.ts`
|
||||
- `src/services/worker/http/routes/SessionRoutes.ts`
|
||||
|
||||
### Verification
|
||||
- Worker builds and starts
|
||||
- Default (non-endless) observation flow is unaffected
|
||||
- Can POST with `wait_until_observation_is_saved=true` and get observation back in response
|
||||
|
||||
### Anti-patterns
|
||||
- Do NOT add SSE/streaming — simple HTTP request/response with await is sufficient
|
||||
- Do NOT modify the existing fire-and-forget path — only add the new waiting path
|
||||
- Do NOT add a pre-tool-use endpoint yet — tool_use_id comes from the hook, not a separate call
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Hook-Side — PostToolUse Synchronous Injection
|
||||
|
||||
### What to implement
|
||||
- Modify the PostToolUse hook (save-hook) to:
|
||||
1. Check if endless mode is enabled via settings
|
||||
2. Extract `tool_use_id` from the hook input (Claude Code provides this)
|
||||
3. If endless mode ON: POST observation with `wait_until_observation_is_saved=true` and `tool_use_id`
|
||||
4. Receive processed observation in HTTP response
|
||||
5. Format observation as markdown (copy pattern from old `context-injection.ts`)
|
||||
6. Return hook response with `additionalContext` field containing formatted observation
|
||||
7. If endless mode OFF: existing fire-and-forget behavior (unchanged)
|
||||
- Create `src/hooks/observation-formatter.ts` utility for markdown formatting
|
||||
|
||||
### Files to modify
|
||||
- `src/hooks/save-hook.ts` (or whatever the current PostToolUse hook source is)
|
||||
- `src/hooks/observation-formatter.ts` (NEW)
|
||||
- `src/hooks/hook-response.ts` — add `additionalContext` support to response type
|
||||
|
||||
### Verification
|
||||
- With endless mode OFF: behavior identical to current
|
||||
- With endless mode ON: observations appear in Claude's context after tool use
|
||||
- Hook respects 120s Claude Code timeout (90s observation wait + buffer)
|
||||
|
||||
### Anti-patterns
|
||||
- Do NOT add transcript clearing in this phase — that's a separate optimization
|
||||
- Do NOT block indefinitely — always use timeout with graceful fallback
|
||||
- Do NOT swallow errors in the wait path — if it fails, fall back to fire-and-forget
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Build, Test, and Validate
|
||||
|
||||
### What to implement
|
||||
- `npm run build-and-sync` — full build
|
||||
- Manual testing:
|
||||
1. Enable endless mode in settings.json
|
||||
2. Start a Claude Code session
|
||||
3. Execute tool uses and verify observations appear in context
|
||||
4. Verify non-endless mode is unaffected
|
||||
- Add basic unit tests in `tests/endless-mode/`
|
||||
|
||||
### Verification checklist
|
||||
- [ ] `npm run build` succeeds with zero errors
|
||||
- [ ] Worker starts without errors
|
||||
- [ ] Non-endless mode behavior unchanged (regression check)
|
||||
- [ ] With endless mode ON: observation appears in Claude's context after tool use
|
||||
- [ ] Timeout fallback works (kill worker mid-processing, verify graceful degradation)
|
||||
- [ ] Settings toggle works (on/off without restart)
|
||||
- [ ] Database migration applies cleanly on fresh and existing databases
|
||||
|
||||
### Anti-patterns
|
||||
- Do NOT ship to npm/release yet — this is beta
|
||||
- Do NOT add documentation updates yet — feature must be validated first
|
||||
- Do NOT add telemetry or analytics in initial implementation
|
||||
|
||||
---
|
||||
|
||||
## Phase 6: Transcript Clearing Optimization (Optional, After Validation)
|
||||
|
||||
### What to implement
|
||||
- After observation injection is working, add transcript clearing:
|
||||
- After successful observation injection, clear the large `tool_input` from Claude's transcript JSONL
|
||||
- This is the actual token savings mechanism — compressed observation replaces raw tool data
|
||||
- Read from old branch: `git show beta/endless-mode:src/hooks/context-injection.ts` for `clearToolInputInTranscript()`
|
||||
|
||||
### Files to modify
|
||||
- `src/hooks/save-hook.ts` — add transcript clearing after successful injection
|
||||
- `src/hooks/transcript-clearer.ts` (NEW) — utility for JSONL manipulation
|
||||
|
||||
### Verification
|
||||
- Token count decreases after observation injection
|
||||
- Transcript JSONL remains valid after clearing
|
||||
- Claude Code doesn't break when transcript entries are modified
|
||||
|
||||
### Anti-patterns
|
||||
- Do NOT clear transcript if observation injection failed — leave raw data intact
|
||||
- Do NOT modify transcript entries other than the current tool use
|
||||
- Do NOT implement until Phase 5 validation is complete
|
||||
|
||||
---
|
||||
|
||||
## Decisions Needed from User
|
||||
|
||||
1. **Branch name**: `feature/endless-mode-v2` (proposed) — acceptable?
|
||||
2. **Scope**: Phases 1-5 are core. Phase 6 is optional. Should Phase 6 be included?
|
||||
3. **Pre-tool-use hook**: The old branch had a separate PreToolUse hook to send tool_use_id before execution. The PostToolUse hook already receives tool_use_id from Claude Code. Do we need PreToolUse, or is PostToolUse sufficient?
|
||||
@@ -0,0 +1,231 @@
|
||||
# Hook Bugs Investigation & Fix Plan
|
||||
|
||||
## Problem Summary
|
||||
|
||||
Two open issues report hook failures affecting users on v10.4.0+:
|
||||
|
||||
### Issue #1215 — Stop hooks fail: `${CLAUDE_PLUGIN_ROOT}` not injected
|
||||
- **Root cause**: Upstream Claude Code bug — `${CLAUDE_PLUGIN_ROOT}` is not set when Claude Code executes Stop hooks
|
||||
- **Scope**: On macOS, only Stop hooks affected. On Linux (Claude Code v2.1.51), ALL hooks affected
|
||||
- **Upstream refs**: `anthropics/claude-code#24529`, `anthropics/claude-code#27145`
|
||||
- **Impact**: Session-end summarization and session-complete never run
|
||||
|
||||
### Issue #1220 — PostToolUse hooks crash on stdin
|
||||
- **Bug 1**: `start` command exits 1 when stdin has data (every PostToolUse call sends stdin to all commands in the hook group, including `start` which doesn't need it)
|
||||
- **Bug 2**: `observation` command crashes on payloads > ~350 bytes
|
||||
- **Impact**: Every tool call produces 2x `PostToolUse:<tool> hook error` messages; observation data never processed
|
||||
|
||||
## Root Cause Analysis
|
||||
|
||||
### Issue #1215 (CLAUDE_PLUGIN_ROOT)
|
||||
This is an **upstream Claude Code bug**, not a regression we introduced. The `${CLAUDE_PLUGIN_ROOT}` variable is supposed to be set by Claude Code's hook executor for all hook types, but Stop hooks don't receive it. Our hooks.json uses this variable in all commands:
|
||||
```
|
||||
node "${CLAUDE_PLUGIN_ROOT}/scripts/bun-runner.js" "${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs" ...
|
||||
```
|
||||
When not set, the path resolves to `/scripts/bun-runner.js` which doesn't exist.
|
||||
|
||||
### Issue #1220 (stdin crashes) — ROOT CAUSE IDENTIFIED
|
||||
|
||||
Three compounding code-level bugs:
|
||||
|
||||
**1. Missing `break` statements in switch — `src/services/worker-service.ts:1022-1204`**
|
||||
Only the `hook` case (line 1142) has a `break`. All 7 other cases (`start`, `stop`, `restart`, `status`, `cursor`, `generate`, `clean`) rely on `process.exit()` to prevent fall-through. This is fragile — if any async operation throws before `process.exit()` is reached, execution falls through to the next case. For `start`, if `ensureWorkerStarted()` throws, it falls through into `stop` → `restart` → etc.
|
||||
|
||||
**2. Unhandled promise rejection — `src/services/worker-service.ts:1213`**
|
||||
`main()` is called as `Hge && Fge()` (compiled) without a `.catch()`. The `ensureWorkerStarted()` function CAN throw — specifically via `getInstalledPluginVersion()` in `src/services/infrastructure/HealthMonitor.ts:132` which calls `readFileSync()` and can throw on non-ENOENT/EBUSY errors. An unhandled rejection causes Bun to exit with code 1 silently — matching the reported symptoms exactly.
|
||||
|
||||
**3. Redundant `start` command in hooks.json — `plugin/hooks/hooks.json:65`**
|
||||
The PostToolUse hook group has a standalone `start` command that receives stdin it doesn't need. This is redundant because the `hook` case at `worker-service.ts:1101` already calls `ensureWorkerStarted()` internally. The extra `start` command adds latency (bun-runner.js waits up to 5s for stdin EOF via `collectStdin()`) and triggers the crash path described above.
|
||||
|
||||
**Why Bug 2 (large payloads) manifests at ~350 bytes:**
|
||||
The same unhandled-rejection chain. When `ensureWorkerStarted()` inside the `hook` case throws before `hookCommand()` reads stdin, the process exits 1. Larger payloads affect the timing of stdin buffering vs. the concurrent HTTP health check calls, making the throw more likely to occur before stdin is fully consumed.
|
||||
|
||||
## Phases
|
||||
|
||||
### Phase 0: Documentation Discovery & Reproduction
|
||||
|
||||
**Tasks:**
|
||||
1. Read Claude Code's hook documentation to understand the stdin contract:
|
||||
- Does Claude Code pass stdin to all commands in a hook group, or only specific ones?
|
||||
- Does Claude Code close stdin after writing, or leave it open?
|
||||
- What are the expected exit code semantics?
|
||||
|
||||
2. Check Claude Code upstream issues for any resolution on CLAUDE_PLUGIN_ROOT:
|
||||
- `anthropics/claude-code#24529`
|
||||
- `anthropics/claude-code#27145`
|
||||
|
||||
3. Reproduce issue #1220 locally:
|
||||
```bash
|
||||
# Bug 1: start with stdin
|
||||
echo '{"tool_name":"Read","tool_response":"test"}' | bun plugin/scripts/worker-service.cjs start
|
||||
echo $? # Expected: 1 (broken), should be: 0
|
||||
|
||||
# Bug 2: observation with large payload
|
||||
python3 -c "import json; print(json.dumps({'tool_name':'Read','tool_response':'x'*400,'session_id':'test','cwd':'/tmp'}))" | bun plugin/scripts/worker-service.cjs hook claude-code observation
|
||||
echo $? # Expected: 1 (broken), should be: 0
|
||||
```
|
||||
|
||||
4. Check `bun-runner.js` stdin timeout behavior:
|
||||
```bash
|
||||
# Time how long the start command takes through bun-runner
|
||||
time echo '{}' | node plugin/scripts/bun-runner.js plugin/scripts/worker-service.cjs start
|
||||
# If this takes ~5s, the collectStdin timeout is the bottleneck
|
||||
```
|
||||
|
||||
**Verification:** Issue #1220 bugs reproduced locally with exact exit codes documented.
|
||||
|
||||
### Phase 1: Fix the three root causes (#1220)
|
||||
|
||||
**Fix 1: Add `break` statements to all switch cases**
|
||||
|
||||
File: `src/services/worker-service.ts:1022-1204`
|
||||
|
||||
Add `break` after every case in the switch statement. Currently only the `hook` case has one. Every other case relies on `process.exit()` which is fragile if the preceding async code throws.
|
||||
|
||||
```typescript
|
||||
case 'start': {
|
||||
const success = await ensureWorkerStarted(port);
|
||||
if (success) {
|
||||
exitWithStatus('ready');
|
||||
} else {
|
||||
exitWithStatus('error', 'Failed to start worker');
|
||||
}
|
||||
break; // ADD THIS
|
||||
}
|
||||
|
||||
case 'stop': {
|
||||
// ...
|
||||
process.exit(0);
|
||||
break; // ADD THIS (defensive, even after process.exit)
|
||||
}
|
||||
// ... same for restart, status, cursor, generate, clean
|
||||
```
|
||||
|
||||
**Fix 2: Add `.catch()` to `main()` invocation**
|
||||
|
||||
File: `src/services/worker-service.ts:1213`
|
||||
|
||||
The compiled code calls `Fge()` (main) without error handling. Add a catch:
|
||||
|
||||
```typescript
|
||||
if (isMainModule) {
|
||||
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
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
**Fix 3: Remove redundant `start` command from hook groups**
|
||||
|
||||
File: `plugin/hooks/hooks.json`
|
||||
|
||||
Remove the standalone `start` command from PostToolUse, UserPromptSubmit, and Stop hook groups. The `hook` case in worker-service.ts already calls `ensureWorkerStarted()` internally (line 1101), making the separate `start` command redundant. This also eliminates:
|
||||
- The 5s stdin timeout delay in bun-runner.js `collectStdin()`
|
||||
- The stdin-crash path entirely
|
||||
|
||||
Before:
|
||||
```json
|
||||
"PostToolUse": [{
|
||||
"matcher": "*",
|
||||
"hooks": [
|
||||
{ "command": "... worker-service.cjs start", "timeout": 60 },
|
||||
{ "command": "... worker-service.cjs hook claude-code observation", "timeout": 120 }
|
||||
]
|
||||
}]
|
||||
```
|
||||
|
||||
After:
|
||||
```json
|
||||
"PostToolUse": [{
|
||||
"matcher": "*",
|
||||
"hooks": [
|
||||
{ "command": "... worker-service.cjs hook claude-code observation", "timeout": 120 }
|
||||
]
|
||||
}]
|
||||
```
|
||||
|
||||
Apply the same removal to UserPromptSubmit and Stop groups.
|
||||
|
||||
**Files to modify:**
|
||||
- `src/services/worker-service.ts` — add break statements + .catch() on main()
|
||||
- `plugin/hooks/hooks.json` — remove redundant `start` commands from PostToolUse, UserPromptSubmit, Stop
|
||||
|
||||
**Verification:**
|
||||
```bash
|
||||
# Bug 1 fixed — start no longer called from hooks, but also safe if called directly
|
||||
echo '{"tool_name":"Read","tool_response":"test"}' | bun plugin/scripts/worker-service.cjs start
|
||||
echo $? # Should be 0
|
||||
|
||||
# Bug 2 fixed — observation handles large payloads
|
||||
python3 -c "import json; print(json.dumps({'tool_name':'Read','tool_response':'x'*2000,'session_id':'test','cwd':'/tmp'}))" | bun plugin/scripts/worker-service.cjs hook claude-code observation
|
||||
echo $? # Should be 0
|
||||
|
||||
# No error messages in Claude Code UI during normal tool use
|
||||
```
|
||||
|
||||
### Phase 2: Workaround for CLAUDE_PLUGIN_ROOT (#1215)
|
||||
|
||||
Since this is an upstream Claude Code bug, our options are limited:
|
||||
|
||||
**Option 1: Resolve paths at Setup time (preferred)**
|
||||
In the `Setup` hook (which DOES receive CLAUDE_PLUGIN_ROOT), write the resolved path to a file:
|
||||
```bash
|
||||
# In setup.sh
|
||||
echo "${CLAUDE_PLUGIN_ROOT}" > ~/.claude-mem/.plugin-root
|
||||
```
|
||||
Then in bun-runner.js, fall back to reading this file when CLAUDE_PLUGIN_ROOT is empty.
|
||||
|
||||
**Option 2: Self-resolve using __dirname**
|
||||
The scripts know their own location on disk. Instead of relying on CLAUDE_PLUGIN_ROOT, resolve the plugin root from the script's own path:
|
||||
```javascript
|
||||
const PLUGIN_ROOT = path.resolve(__dirname, '..');
|
||||
```
|
||||
Then use this instead of the environment variable.
|
||||
|
||||
**Option 3: Document the workaround**
|
||||
Add to README/docs: users can run `sed` to replace `${CLAUDE_PLUGIN_ROOT}` with absolute paths in hooks.json.
|
||||
|
||||
**Files to modify:**
|
||||
- `plugin/scripts/bun-runner.js` — add PLUGIN_ROOT self-resolution fallback
|
||||
- `plugin/hooks/hooks.json` — potentially use self-resolving paths
|
||||
- Docs — document the upstream issue and workaround
|
||||
|
||||
**Anti-patterns to avoid:**
|
||||
- Don't hardcode absolute paths in hooks.json (varies per installation)
|
||||
- Don't remove CLAUDE_PLUGIN_ROOT usage entirely (it works on most platforms)
|
||||
|
||||
**Verification:**
|
||||
```bash
|
||||
# Simulate missing CLAUDE_PLUGIN_ROOT
|
||||
unset CLAUDE_PLUGIN_ROOT
|
||||
node plugin/scripts/bun-runner.js plugin/scripts/worker-service.cjs start
|
||||
echo $? # Should be 0 (falls back to self-resolved path)
|
||||
```
|
||||
|
||||
### Phase 3: Verification & Testing
|
||||
|
||||
1. Run existing hook tests:
|
||||
```bash
|
||||
npm test -- --grep "hook"
|
||||
```
|
||||
|
||||
2. Verify all 5 hook types work end-to-end:
|
||||
- SessionStart: context injection
|
||||
- UserPromptSubmit: session-init
|
||||
- PostToolUse: observation (small AND large payloads)
|
||||
- Stop: summarize + session-complete (if CLAUDE_PLUGIN_ROOT is available)
|
||||
|
||||
3. Check for regressions:
|
||||
- No error messages in Claude Code UI during normal operation
|
||||
- Observations are stored correctly
|
||||
- Worker starts reliably
|
||||
|
||||
4. Build and verify:
|
||||
```bash
|
||||
npm run build-and-sync
|
||||
```
|
||||
|
||||
**Anti-patterns to avoid:**
|
||||
- Don't suppress errors that indicate real bugs (the stderr suppression from PR #1214 may be hiding issues)
|
||||
- Don't add try/catch blocks that swallow errors silently during development
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "10.4.1",
|
||||
"version": "10.4.2",
|
||||
"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.2",
|
||||
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
||||
"author": {
|
||||
"name": "Alex Newman"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "claude-mem-plugin",
|
||||
"version": "10.4.1",
|
||||
"version": "10.4.2",
|
||||
"private": true,
|
||||
"description": "Runtime dependencies for claude-mem bundled hooks",
|
||||
"type": "module",
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user