@bjlee2024/claude-mem 13.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.codex-plugin/plugin.json +46 -0
  3. package/LICENSE +202 -0
  4. package/README.md +419 -0
  5. package/dist/npx-cli/index.js +10001 -0
  6. package/dist/opencode-plugin/index.js +67 -0
  7. package/openclaw/Dockerfile.e2e +46 -0
  8. package/openclaw/SKILL.md +462 -0
  9. package/openclaw/TESTING.md +279 -0
  10. package/openclaw/dist/index.js +15 -0
  11. package/openclaw/e2e-verify.sh +222 -0
  12. package/openclaw/install.sh +1653 -0
  13. package/openclaw/openclaw.plugin.json +98 -0
  14. package/openclaw/package.json +21 -0
  15. package/openclaw/src/index.test.ts +1124 -0
  16. package/openclaw/src/index.ts +1092 -0
  17. package/openclaw/test-e2e.sh +40 -0
  18. package/openclaw/test-install.sh +2086 -0
  19. package/openclaw/test-sse-consumer.js +98 -0
  20. package/openclaw/tsconfig.json +26 -0
  21. package/package.json +211 -0
  22. package/plugin/.claude-plugin/plugin.json +24 -0
  23. package/plugin/.codex-plugin/plugin.json +46 -0
  24. package/plugin/.mcp.json +12 -0
  25. package/plugin/hooks/bugfixes-2026-01-10.md +92 -0
  26. package/plugin/hooks/codex-hooks.json +74 -0
  27. package/plugin/hooks/hooks.json +87 -0
  28. package/plugin/modes/code--ar.json +24 -0
  29. package/plugin/modes/code--bn.json +24 -0
  30. package/plugin/modes/code--chill.json +8 -0
  31. package/plugin/modes/code--cs.json +24 -0
  32. package/plugin/modes/code--da.json +24 -0
  33. package/plugin/modes/code--de.json +24 -0
  34. package/plugin/modes/code--el.json +24 -0
  35. package/plugin/modes/code--es.json +24 -0
  36. package/plugin/modes/code--fi.json +24 -0
  37. package/plugin/modes/code--fr.json +24 -0
  38. package/plugin/modes/code--he.json +24 -0
  39. package/plugin/modes/code--hi.json +24 -0
  40. package/plugin/modes/code--hu.json +24 -0
  41. package/plugin/modes/code--id.json +24 -0
  42. package/plugin/modes/code--it.json +24 -0
  43. package/plugin/modes/code--ja.json +24 -0
  44. package/plugin/modes/code--ko.json +24 -0
  45. package/plugin/modes/code--nl.json +24 -0
  46. package/plugin/modes/code--no.json +24 -0
  47. package/plugin/modes/code--pl.json +24 -0
  48. package/plugin/modes/code--pt-br.json +24 -0
  49. package/plugin/modes/code--ro.json +24 -0
  50. package/plugin/modes/code--ru.json +24 -0
  51. package/plugin/modes/code--sv.json +24 -0
  52. package/plugin/modes/code--th.json +24 -0
  53. package/plugin/modes/code--tr.json +24 -0
  54. package/plugin/modes/code--uk.json +24 -0
  55. package/plugin/modes/code--ur.json +25 -0
  56. package/plugin/modes/code--vi.json +24 -0
  57. package/plugin/modes/code--zh.json +24 -0
  58. package/plugin/modes/code.json +139 -0
  59. package/plugin/modes/email-investigation.json +120 -0
  60. package/plugin/modes/law-study--chill.json +7 -0
  61. package/plugin/modes/law-study-CLAUDE.md +85 -0
  62. package/plugin/modes/law-study.json +120 -0
  63. package/plugin/modes/meme-tokens.json +125 -0
  64. package/plugin/package.json +46 -0
  65. package/plugin/scripts/bun-runner.js +216 -0
  66. package/plugin/scripts/context-generator.cjs +795 -0
  67. package/plugin/scripts/mcp-server.cjs +239 -0
  68. package/plugin/scripts/server-beta-service.cjs +9856 -0
  69. package/plugin/scripts/statusline-counts.js +40 -0
  70. package/plugin/scripts/version-check.js +69 -0
  71. package/plugin/scripts/worker-cli.js +19 -0
  72. package/plugin/scripts/worker-service.cjs +2368 -0
  73. package/plugin/scripts/worker-wrapper.cjs +2 -0
  74. package/plugin/skills/babysit/SKILL.md +87 -0
  75. package/plugin/skills/design-is/SKILL.md +312 -0
  76. package/plugin/skills/do/SKILL.md +45 -0
  77. package/plugin/skills/how-it-works/SKILL.md +22 -0
  78. package/plugin/skills/how-it-works/onboarding-explainer.md +17 -0
  79. package/plugin/skills/knowledge-agent/SKILL.md +80 -0
  80. package/plugin/skills/learn-codebase/SKILL.md +21 -0
  81. package/plugin/skills/make-plan/SKILL.md +67 -0
  82. package/plugin/skills/mem-search/SKILL.md +131 -0
  83. package/plugin/skills/oh-my-issues/SKILL.md +226 -0
  84. package/plugin/skills/pathfinder/SKILL.md +111 -0
  85. package/plugin/skills/smart-explore/SKILL.md +190 -0
  86. package/plugin/skills/timeline-report/SKILL.md +211 -0
  87. package/plugin/skills/version-bump/SKILL.md +68 -0
  88. package/plugin/skills/version-bump/scripts/generate_changelog.js +34 -0
  89. package/plugin/skills/weekly-digests/SKILL.md +262 -0
  90. package/plugin/skills/wowerpoint/SKILL.md +205 -0
  91. package/plugin/ui/assets/fonts/monaspace-radon-var.woff +0 -0
  92. package/plugin/ui/assets/fonts/monaspace-radon-var.woff2 +0 -0
  93. package/plugin/ui/claude-mem-logo-for-dark-mode.webp +0 -0
  94. package/plugin/ui/claude-mem-logo-stylized.png +0 -0
  95. package/plugin/ui/claude-mem-logomark.webp +0 -0
  96. package/plugin/ui/icon-thick-completed.svg +8 -0
  97. package/plugin/ui/icon-thick-investigated.svg +8 -0
  98. package/plugin/ui/icon-thick-learned.svg +12 -0
  99. package/plugin/ui/icon-thick-next-steps.svg +8 -0
  100. package/plugin/ui/viewer-bundle.js +65 -0
  101. package/plugin/ui/viewer.html +3145 -0
@@ -0,0 +1,98 @@
1
+
2
+ import claudeMemPlugin from "./dist/index.js";
3
+
4
+ let registeredService = null;
5
+ const registeredCommands = new Map();
6
+ const eventHandlers = new Map();
7
+ const logs = [];
8
+
9
+ const mockApi = {
10
+ id: "claude-mem",
11
+ name: "Claude-Mem (Persistent Memory)",
12
+ version: "1.0.0",
13
+ source: "/test/extensions/claude-mem/dist/index.js",
14
+ config: {},
15
+ pluginConfig: {},
16
+ logger: {
17
+ info: (message) => { logs.push(message); },
18
+ warn: (message) => { logs.push(message); },
19
+ error: (message) => { logs.push(message); },
20
+ debug: (message) => { logs.push(message); },
21
+ },
22
+ registerService: (service) => {
23
+ registeredService = service;
24
+ },
25
+ registerCommand: (command) => {
26
+ registeredCommands.set(command.name, command);
27
+ },
28
+ on: (event, callback) => {
29
+ if (!eventHandlers.has(event)) {
30
+ eventHandlers.set(event, []);
31
+ }
32
+ eventHandlers.get(event).push(callback);
33
+ },
34
+ runtime: {
35
+ channel: {
36
+ telegram: { sendMessageTelegram: async () => {} },
37
+ discord: { sendMessageDiscord: async () => {} },
38
+ signal: { sendMessageSignal: async () => {} },
39
+ slack: { sendMessageSlack: async () => {} },
40
+ whatsapp: { sendMessageWhatsApp: async () => {} },
41
+ line: { sendMessageLine: async () => {} },
42
+ },
43
+ },
44
+ };
45
+
46
+ claudeMemPlugin(mockApi);
47
+
48
+ let failures = 0;
49
+
50
+ if (!registeredService) {
51
+ console.error("FAIL: No service was registered");
52
+ failures++;
53
+ } else if (registeredService.id !== "claude-mem-observation-feed") {
54
+ console.error(
55
+ `FAIL: Service ID is "${registeredService.id}", expected "claude-mem-observation-feed"`
56
+ );
57
+ failures++;
58
+ } else {
59
+ console.log("OK: Service registered with id 'claude-mem-observation-feed'");
60
+ }
61
+
62
+ if (!registeredCommands.has("claude-mem-feed")) {
63
+ console.error("FAIL: No 'claude-mem-feed' command registered");
64
+ failures++;
65
+ } else {
66
+ console.log("OK: Command registered with name 'claude-mem-feed'");
67
+ }
68
+
69
+ if (!registeredCommands.has("claude-mem-status")) {
70
+ console.error("FAIL: No 'claude-mem-status' command registered");
71
+ failures++;
72
+ } else {
73
+ console.log("OK: Command registered with name 'claude-mem-status'");
74
+ }
75
+
76
+ const expectedEvents = ["before_agent_start", "tool_result_persist", "agent_end", "gateway_start"];
77
+ for (const event of expectedEvents) {
78
+ if (!eventHandlers.has(event) || eventHandlers.get(event).length === 0) {
79
+ console.error(`FAIL: No handler registered for '${event}'`);
80
+ failures++;
81
+ } else {
82
+ console.log(`OK: Event handler registered for '${event}'`);
83
+ }
84
+ }
85
+
86
+ if (!logs.some((l) => l.includes("plugin loaded"))) {
87
+ console.error("FAIL: Plugin did not log a load message");
88
+ failures++;
89
+ } else {
90
+ console.log("OK: Plugin logged load message");
91
+ }
92
+
93
+ if (failures > 0) {
94
+ console.error(`\nFAIL: ${failures} check(s) failed`);
95
+ process.exit(1);
96
+ } else {
97
+ console.log("\nPASS: Plugin registers service, commands, and event handlers correctly");
98
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "node",
6
+ "lib": ["ES2022", "DOM"],
7
+ "outDir": "./dist",
8
+ "rootDir": "./src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "declaration": true,
15
+ "declarationMap": true,
16
+ "sourceMap": true,
17
+ "allowSyntheticDefaultImports": true
18
+ },
19
+ "include": [
20
+ "src/**/*"
21
+ ],
22
+ "exclude": [
23
+ "node_modules",
24
+ "dist"
25
+ ]
26
+ }
package/package.json ADDED
@@ -0,0 +1,211 @@
1
+ {
2
+ "name": "@bjlee2024/claude-mem",
3
+ "version": "13.4.0",
4
+ "description": "Memory compression system for Claude Code - persist context across sessions",
5
+ "keywords": [
6
+ "claude",
7
+ "claude-code",
8
+ "claude-agent-sdk",
9
+ "mcp",
10
+ "plugin",
11
+ "memory",
12
+ "compression",
13
+ "knowledge-graph",
14
+ "transcript",
15
+ "typescript",
16
+ "nodejs"
17
+ ],
18
+ "author": "Alex Newman",
19
+ "license": "Apache-2.0",
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "https://github.com/bjlee2024/claude-mem.git"
23
+ },
24
+ "homepage": "https://github.com/bjlee2024/claude-mem#readme",
25
+ "bugs": {
26
+ "url": "https://github.com/bjlee2024/claude-mem/issues"
27
+ },
28
+ "type": "module",
29
+ "bin": {
30
+ "claude-mem": "./dist/npx-cli/index.js"
31
+ },
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.js"
36
+ },
37
+ "./sdk": {
38
+ "types": "./dist/sdk/index.d.ts",
39
+ "import": "./dist/sdk/index.js"
40
+ },
41
+ "./modes/*": "./plugin/modes/*"
42
+ },
43
+ "files": [
44
+ "dist",
45
+ ".agents/plugins/marketplace.json",
46
+ ".codex-plugin",
47
+ "plugin/.claude-plugin",
48
+ "plugin/.codex-plugin",
49
+ "plugin/.mcp.json",
50
+ "plugin/package.json",
51
+ "plugin/hooks",
52
+ "plugin/modes",
53
+ "plugin/scripts/*.js",
54
+ "plugin/scripts/*.cjs",
55
+ "plugin/skills",
56
+ "plugin/ui",
57
+ "openclaw"
58
+ ],
59
+ "engines": {
60
+ "node": ">=20.0.0",
61
+ "bun": ">=1.0.0"
62
+ },
63
+ "scripts": {
64
+ "dev": "npm run build-and-sync",
65
+ "build": "node scripts/sync-plugin-manifests.js && node scripts/build-hooks.js",
66
+ "build-and-sync": "npm run build && npm run sync-marketplace && sleep 1 && (cd ~/.claude/plugins/marketplaces/bjlee2024 && npm run worker:restart)",
67
+ "sync-marketplace": "node scripts/sync-marketplace.cjs",
68
+ "sync-marketplace:force": "node scripts/sync-marketplace.cjs --force",
69
+ "build:binaries": "node scripts/build-worker-binary.js",
70
+ "build:cli-binary": "bun build --compile --minify ./src/services/worker-service.ts --outfile plugin/scripts/claude-mem",
71
+ "worker:logs": "tail -n 50 ~/.claude-mem/logs/worker-$(date +%Y-%m-%d).log",
72
+ "worker:tail": "tail -f 50 ~/.claude-mem/logs/worker-$(date +%Y-%m-%d).log",
73
+ "changelog:generate": "node scripts/generate-changelog.js",
74
+ "discord:notify": "node scripts/discord-release-notify.js",
75
+ "worker:start": "bun plugin/scripts/worker-service.cjs start",
76
+ "worker:stop": "bun plugin/scripts/worker-service.cjs stop",
77
+ "worker:restart": "bun plugin/scripts/worker-service.cjs restart",
78
+ "worker:status": "bun plugin/scripts/worker-service.cjs status",
79
+ "queue": "bun scripts/check-pending-queue.ts",
80
+ "queue:process": "bun scripts/check-pending-queue.ts --process",
81
+ "queue:clear:pending": "bun scripts/clear-pending-queue.ts --all --force",
82
+ "pr:status": "bun scripts/pr-babysit-status.ts",
83
+ "claude-md:regenerate": "bun scripts/regenerate-claude-md.ts",
84
+ "claude-md:dry-run": "bun scripts/regenerate-claude-md.ts --dry-run",
85
+ "strip-comments": "bun scripts/strip-comments.ts",
86
+ "strip-comments:check": "bun scripts/strip-comments.ts --check",
87
+ "strip-comments:dry-run": "bun scripts/strip-comments.ts --dry-run",
88
+ "translate-readme": "bun scripts/translate-readme/cli.ts -v -o docs/i18n README.md",
89
+ "translate:tier1": "npm run translate-readme -- zh zh-tw ja pt-br ko es de fr",
90
+ "translate:tier2": "npm run translate-readme -- he ar ru pl cs nl tr uk",
91
+ "translate:tier3": "npm run translate-readme -- vi id th hi bn ro sv",
92
+ "translate:tier4": "npm run translate-readme -- it el hu fi da no",
93
+ "translate:all": "npm run translate:tier1 & npm run translate:tier2 & npm run translate:tier3 & npm run translate:tier4 & wait",
94
+ "bug-report": "npx tsx scripts/bug-report/cli.ts",
95
+ "cursor:install": "bun plugin/scripts/worker-service.cjs cursor install",
96
+ "cursor:uninstall": "bun plugin/scripts/worker-service.cjs cursor uninstall",
97
+ "cursor:status": "bun plugin/scripts/worker-service.cjs cursor status",
98
+ "cursor:setup": "bun plugin/scripts/worker-service.cjs cursor setup",
99
+ "lint:hook-io": "node scripts/check-hook-io-discipline.cjs",
100
+ "lint:spawn-env": "node scripts/check-spawn-env-discipline.cjs",
101
+ "typecheck": "tsc --noEmit && tsc --noEmit -p src/ui/viewer/tsconfig.json",
102
+ "typecheck:root": "tsc --noEmit",
103
+ "typecheck:viewer": "tsc --noEmit -p src/ui/viewer/tsconfig.json",
104
+ "test": "bun test",
105
+ "test:sqlite": "bun test tests/sqlite/",
106
+ "test:agents": "bun test tests/worker/agents/",
107
+ "test:search": "bun test tests/worker/search/",
108
+ "test:context": "bun test tests/context/",
109
+ "test:infra": "bun test tests/infrastructure/",
110
+ "test:server": "bun test tests/server/",
111
+ "e2e:server-beta:docker": "bash scripts/e2e-server-beta-docker.sh",
112
+ "check:postinstall-allowlist": "node scripts/check-postinstall-allowlist.js",
113
+ "prepublishOnly": "npm run build && node scripts/check-postinstall-allowlist.js",
114
+ "release": "np",
115
+ "release:patch": "np patch --no-cleanup",
116
+ "release:minor": "np minor --no-cleanup",
117
+ "release:major": "np major --no-cleanup"
118
+ },
119
+ "np": {
120
+ "yarn": false,
121
+ "contents": ".",
122
+ "testScript": "test",
123
+ "2fa": false
124
+ },
125
+ "dependencies": {
126
+ "@anthropic-ai/claude-agent-sdk": "^0.2.138",
127
+ "@better-auth/api-key": "^1.6.9",
128
+ "@clack/prompts": "^1.3.0",
129
+ "@modelcontextprotocol/sdk": "^1.29.0",
130
+ "ansi-to-html": "^0.7.2",
131
+ "better-auth": "^1.6.9",
132
+ "bullmq": "^5.76.6",
133
+ "cors": "^2.8.6",
134
+ "dompurify": "^3.4.2",
135
+ "express": "^5.2.1",
136
+ "glob": "^13.0.6",
137
+ "handlebars": "^4.7.9",
138
+ "ioredis": "^5.10.1",
139
+ "pg": "^8.20.0",
140
+ "picocolors": "^1.1.1",
141
+ "react": "^19.2.6",
142
+ "react-dom": "^19.2.6",
143
+ "shell-quote": "^1.8.3",
144
+ "yaml": "^2.8.4",
145
+ "zod": "^4.4.3",
146
+ "zod-to-json-schema": "^3.25.2"
147
+ },
148
+ "devDependencies": {
149
+ "@derekstride/tree-sitter-sql": "^0.3.11",
150
+ "@tree-sitter-grammars/tree-sitter-lua": "^0.4.1",
151
+ "@tree-sitter-grammars/tree-sitter-markdown": "^0.3.2",
152
+ "@tree-sitter-grammars/tree-sitter-toml": "^0.7.0",
153
+ "@tree-sitter-grammars/tree-sitter-yaml": "^0.7.1",
154
+ "@tree-sitter-grammars/tree-sitter-zig": "^1.1.2",
155
+ "@types/bun": "^1.3.13",
156
+ "@types/cors": "^2.8.19",
157
+ "@types/dompurify": "^3.2.0",
158
+ "@types/express": "^5.0.6",
159
+ "@types/node": "^25.6.2",
160
+ "@types/pg": "^8.20.0",
161
+ "@types/react": "^19.2.14",
162
+ "@types/react-dom": "^19.2.3",
163
+ "esbuild": "^0.28.0",
164
+ "jimp": "^1.6.1",
165
+ "np": "^11.2.0",
166
+ "parse5": "^8.0.1",
167
+ "postcss": "^8.5.14",
168
+ "remark-mdx": "^3.1.1",
169
+ "remark-parse": "^11.0.0",
170
+ "tree-sitter-bash": "^0.25.1",
171
+ "tree-sitter-c": "^0.24.1",
172
+ "tree-sitter-cli": "^0.26.8",
173
+ "tree-sitter-cpp": "^0.23.4",
174
+ "tree-sitter-css": "^0.25.0",
175
+ "tree-sitter-elixir": "^0.3.5",
176
+ "tree-sitter-go": "^0.25.0",
177
+ "tree-sitter-haskell": "^0.23.1",
178
+ "tree-sitter-java": "^0.23.5",
179
+ "tree-sitter-javascript": "^0.25.0",
180
+ "tree-sitter-kotlin": "^0.3.8",
181
+ "tree-sitter-php": "^0.24.2",
182
+ "tree-sitter-python": "^0.25.0",
183
+ "tree-sitter-ruby": "^0.23.1",
184
+ "tree-sitter-rust": "^0.24.0",
185
+ "tree-sitter-scala": "^0.24.0",
186
+ "tree-sitter-scss": "^1.0.0",
187
+ "tree-sitter-swift": "^0.7.1",
188
+ "tree-sitter-typescript": "^0.23.2",
189
+ "ts-prune": "^0.10.3",
190
+ "tsx": "^4.21.0",
191
+ "typescript": "^6.0.3",
192
+ "unified": "^11.0.5",
193
+ "unist-util-visit": "^5.1.0"
194
+ },
195
+ "optionalDependencies": {
196
+ "tree-kill": "^1.2.2"
197
+ },
198
+ "trustedDependencies": [
199
+ "esbuild",
200
+ "tree-sitter-c",
201
+ "tree-sitter-cli",
202
+ "tree-sitter-cpp",
203
+ "tree-sitter-go",
204
+ "tree-sitter-java",
205
+ "tree-sitter-javascript",
206
+ "tree-sitter-python",
207
+ "tree-sitter-ruby",
208
+ "tree-sitter-rust",
209
+ "tree-sitter-typescript"
210
+ ]
211
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@bjlee2024/claude-mem",
3
+ "version": "13.4.0",
4
+ "description": "Memory compression system for Claude Code - persist context across sessions",
5
+ "author": {
6
+ "name": "Alex Newman"
7
+ },
8
+ "repository": "https://github.com/bjlee2024/claude-mem",
9
+ "license": "Apache-2.0",
10
+ "keywords": [
11
+ "claude",
12
+ "claude-code",
13
+ "claude-agent-sdk",
14
+ "mcp",
15
+ "plugin",
16
+ "memory",
17
+ "compression",
18
+ "knowledge-graph",
19
+ "transcript",
20
+ "typescript",
21
+ "nodejs"
22
+ ],
23
+ "homepage": "https://github.com/bjlee2024/claude-mem#readme"
24
+ }
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@bjlee2024/claude-mem",
3
+ "version": "13.4.0",
4
+ "description": "Memory compression system for Claude Code - persist context across sessions",
5
+ "author": {
6
+ "name": "Alex Newman",
7
+ "url": "https://github.com/bjlee2024"
8
+ },
9
+ "homepage": "https://github.com/bjlee2024/claude-mem#readme",
10
+ "repository": "https://github.com/bjlee2024/claude-mem",
11
+ "license": "Apache-2.0",
12
+ "keywords": [
13
+ "claude",
14
+ "claude-code",
15
+ "claude-agent-sdk",
16
+ "mcp",
17
+ "plugin",
18
+ "memory",
19
+ "compression",
20
+ "knowledge-graph",
21
+ "transcript",
22
+ "typescript",
23
+ "nodejs"
24
+ ],
25
+ "skills": "./skills/",
26
+ "mcpServers": "./.mcp.json",
27
+ "hooks": "./hooks/codex-hooks.json",
28
+ "interface": {
29
+ "displayName": "claude-mem",
30
+ "shortDescription": "Persistent memory and context compression across coding sessions.",
31
+ "longDescription": "claude-mem captures coding-session activity, compresses it into reusable observations, and injects relevant context back into future Claude Code and Codex-compatible sessions.",
32
+ "developerName": "Alex Newman",
33
+ "category": "Productivity",
34
+ "capabilities": [
35
+ "Interactive",
36
+ "Write"
37
+ ],
38
+ "websiteURL": "https://github.com/bjlee2024/claude-mem",
39
+ "defaultPrompt": [
40
+ "Find what I already learned about this codebase before I start a new task.",
41
+ "Show recent observations related to the files I am editing right now.",
42
+ "Summarize the last session and inject the most relevant context into this one."
43
+ ],
44
+ "brandColor": "#1F6FEB"
45
+ }
46
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "mcpServers": {
3
+ "mcp-search": {
4
+ "type": "stdio",
5
+ "command": "sh",
6
+ "args": [
7
+ "-c",
8
+ "_C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; printf '%s\\n' \"$PWD/plugin\" \"$PWD\"; ls -dt \"$HOME/.codex/plugins/cache/claude-mem-local/claude-mem\"/[0-9]*/ \"$HOME/.codex/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/mcp-server.cjs\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: mcp server not found\" >&2; exit 1; }; exec node \"$_P/scripts/mcp-server.cjs\""
9
+ ]
10
+ }
11
+ }
12
+ }
@@ -0,0 +1,92 @@
1
+ # Bugfix Sprint: 2026-01-10
2
+
3
+ ## Critical Priority (Blocks Users)
4
+
5
+ ### #646 - Plugin bricks Claude Code - stdin fstat EINVAL crash
6
+ - **Impact**: Plugin completely bricks Claude Code on Linux. Users cannot recover without manual config editing.
7
+ - **Root Cause**: Bun's stdin handling causes fstat EINVAL when reading piped input
8
+ - **Related Discussion**: Check if this is a Bun upstream issue
9
+ - [ ] Investigate stdin handling in hook scripts
10
+ - [ ] Test on Linux with stdin piping
11
+ - [ ] Implement fix
12
+
13
+ ### #623 - Crash-recovery loop when memory_session_id not captured
14
+ - **Impact**: Infinite loop consuming API tokens, growing queue unbounded
15
+ - **Root Cause**: memory_session_id not captured, causes repeated crash-recovery
16
+ - [ ] Add null/undefined check for memory_session_id
17
+ - [ ] Add circuit breaker for crash-recovery attempts
18
+
19
+ ## High Priority
20
+
21
+ ### #638 - Worker startup missing JSON output causes hooks to appear stuck
22
+ - **Impact**: UI appears stuck during worker startup
23
+ - [ ] Ensure worker startup emits proper JSON status
24
+ - [ ] Add progress feedback to hook output
25
+
26
+ ### #641/#609 - CLAUDE.md files in subdirectories
27
+ - **Impact**: CLAUDE.md files scattered throughout project directories
28
+ - **Note**: This is a documented feature request that was never implemented (setting exists but doesn't work)
29
+ - [ ] Implement the `disableSubdirectoryCLAUDEmd` setting properly
30
+ - [ ] Or change default behavior to not create subdirectory files
31
+
32
+ ### #635 - JSON parsing error prevents folder context generation
33
+ - **Impact**: Folder context not generating, breaks context injection
34
+ - **Root Cause**: String spread instead of array spread
35
+ - [ ] Fix the JSON parsing logic
36
+ - [ ] Add proper error handling
37
+
38
+ ## Medium Priority
39
+
40
+ ### #582 - Tilde paths create literal ~ directories
41
+ - **Impact**: Directories named "~" created instead of expanding to home
42
+ - [ ] Use path expansion for tilde in all path operations
43
+ - [ ] Audit all path handling code
44
+
45
+ ### #642/#643 - ChromaDB search fails due to initialization timing
46
+ - **Impact**: Search fails with JSON parse error
47
+ - **Note**: #643 is a duplicate of #642
48
+ - [ ] Fix initialization timing issue
49
+ - [ ] Add proper async/await handling
50
+
51
+ ### #626 - HealthMonitor hardcodes ~/.claude path
52
+ - **Impact**: Fails for users with custom config directories
53
+ - [ ] Use configurable path instead of hardcoded ~/.claude
54
+ - [ ] Respect CLAUDE_CONFIG_DIR or similar env var
55
+
56
+ ### #598 - Too many messages pollute conversation history
57
+ - **Impact**: Hook messages clutter conversation
58
+ - [ ] Reduce verbosity of hook messages
59
+ - [ ] Make message frequency configurable
60
+
61
+ ## Low Priority (Code Quality)
62
+
63
+ ### #648 - Empty catch blocks swallow JSON parse errors
64
+ - [ ] Add proper error logging to catch blocks in SessionSearch.ts
65
+
66
+ ### #649 - Inconsistent logging in CursorHooksInstaller
67
+ - [ ] Replace console.log with structured logger
68
+ - **Note**: 177 console.log calls across 20 files identified
69
+
70
+ ## Won't Fix / Not a Bug
71
+
72
+ ### #632 - Feature request for disabling CLAUDE.md in subdirectories
73
+ - **Note**: Covered by #641 implementation
74
+
75
+ ### #633 - Help request about Cursor integration
76
+ - **Note**: Documentation/support issue, not a bug
77
+
78
+ ### #640 - Arabic README translation
79
+ - **Note**: Documentation PR, not a bugfix
80
+
81
+ ### #624 - Beta testing strategy proposal
82
+ - **Note**: Enhancement proposal, not a bugfix
83
+
84
+ ## Already Fixed in v9.0.2
85
+
86
+ - Windows Terminal tab accumulation (#625/#628)
87
+ - Windows 11 compatibility - WMIC to PowerShell migration
88
+ - Claude Code 2.1.1 compatibility + path validation (#614)
89
+
90
+ ---
91
+
92
+ **Recommended Approach**: Fix #646 first (critical blocker), then #623 (crash loop), then work through high priority issues in order of impact.
@@ -0,0 +1,74 @@
1
+ {
2
+ "description": "claude-mem Codex CLI hook integration",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "matcher": "startup|resume",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "_HP=$(printenv PATH 2>/dev/null || true); if [ -z \"$_HP\" ] && [ -n \"${SHELL:-}\" ]; then _HP=$(\"$SHELL\" -lc 'printf %s \"$PATH\"' 2>/dev/null || true); fi; _HP=$(printf '%s' \"$_HP\" | tr ' ' ':'); export PATH=\"${_HP:+$_HP:}$PATH\"; _C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; ls -dt \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do _R=\"${_R%/}\"; [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/version-check.js\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: version-check.js not found\" >&2; exit 1; }; command -v cygpath >/dev/null 2>&1 && { _W=$(cygpath -w \"$_P\" 2>/dev/null); [ -n \"$_W\" ] && _P=\"$_W\"; }; CLAUDE_MEM_CODEX_HOOK=1 node \"$_P/scripts/version-check.js\"",
11
+ "timeout": 5
12
+ },
13
+ {
14
+ "type": "command",
15
+ "command": "_HP=$(printenv PATH 2>/dev/null || true); if [ -z \"$_HP\" ] && [ -n \"${SHELL:-}\" ]; then _HP=$(\"$SHELL\" -lc 'printf %s \"$PATH\"' 2>/dev/null || true); fi; _HP=$(printf '%s' \"$_HP\" | tr ' ' ':'); export PATH=\"${_HP:+$_HP:}$PATH\"; _C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; ls -dt \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do _R=\"${_R%/}\"; [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/bun-runner.js\" ] && [ -f \"$_Q/scripts/worker-service.cjs\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: plugin scripts not found\" >&2; exit 1; }; command -v cygpath >/dev/null 2>&1 && { _W=$(cygpath -w \"$_P\" 2>/dev/null); [ -n \"$_W\" ] && _P=\"$_W\"; }; node \"$_P/scripts/bun-runner.js\" \"$_P/scripts/worker-service.cjs\" start",
16
+ "timeout": 60
17
+ },
18
+ {
19
+ "type": "command",
20
+ "command": "_HP=$(printenv PATH 2>/dev/null || true); if [ -z \"$_HP\" ] && [ -n \"${SHELL:-}\" ]; then _HP=$(\"$SHELL\" -lc 'printf %s \"$PATH\"' 2>/dev/null || true); fi; _HP=$(printf '%s' \"$_HP\" | tr ' ' ':'); export PATH=\"${_HP:+$_HP:}$PATH\"; _C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; ls -dt \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do _R=\"${_R%/}\"; [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/bun-runner.js\" ] && [ -f \"$_Q/scripts/worker-service.cjs\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: plugin scripts not found\" >&2; exit 1; }; command -v cygpath >/dev/null 2>&1 && { _W=$(cygpath -w \"$_P\" 2>/dev/null); [ -n \"$_W\" ] && _P=\"$_W\"; }; node \"$_P/scripts/bun-runner.js\" \"$_P/scripts/worker-service.cjs\" hook codex context",
21
+ "timeout": 60,
22
+ "statusMessage": "Loading claude-mem context"
23
+ }
24
+ ]
25
+ }
26
+ ],
27
+ "UserPromptSubmit": [
28
+ {
29
+ "hooks": [
30
+ {
31
+ "type": "command",
32
+ "command": "_HP=$(printenv PATH 2>/dev/null || true); if [ -z \"$_HP\" ] && [ -n \"${SHELL:-}\" ]; then _HP=$(\"$SHELL\" -lc 'printf %s \"$PATH\"' 2>/dev/null || true); fi; _HP=$(printf '%s' \"$_HP\" | tr ' ' ':'); export PATH=\"${_HP:+$_HP:}$PATH\"; _C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; ls -dt \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do _R=\"${_R%/}\"; [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/bun-runner.js\" ] && [ -f \"$_Q/scripts/worker-service.cjs\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: plugin scripts not found\" >&2; exit 1; }; command -v cygpath >/dev/null 2>&1 && { _W=$(cygpath -w \"$_P\" 2>/dev/null); [ -n \"$_W\" ] && _P=\"$_W\"; }; node \"$_P/scripts/bun-runner.js\" \"$_P/scripts/worker-service.cjs\" hook codex session-init",
33
+ "timeout": 60
34
+ }
35
+ ]
36
+ }
37
+ ],
38
+ "PreToolUse": [
39
+ {
40
+ "matcher": "^Bash$|^mcp__.+__(read|view|cat)(_file|_files)?$",
41
+ "hooks": [
42
+ {
43
+ "type": "command",
44
+ "command": "_HP=$(printenv PATH 2>/dev/null || true); if [ -z \"$_HP\" ] && [ -n \"${SHELL:-}\" ]; then _HP=$(\"$SHELL\" -lc 'printf %s \"$PATH\"' 2>/dev/null || true); fi; _HP=$(printf '%s' \"$_HP\" | tr ' ' ':'); export PATH=\"${_HP:+$_HP:}$PATH\"; _C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; ls -dt \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do _R=\"${_R%/}\"; [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/bun-runner.js\" ] && [ -f \"$_Q/scripts/worker-service.cjs\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: plugin scripts not found\" >&2; exit 1; }; command -v cygpath >/dev/null 2>&1 && { _W=$(cygpath -w \"$_P\" 2>/dev/null); [ -n \"$_W\" ] && _P=\"$_W\"; }; node \"$_P/scripts/bun-runner.js\" \"$_P/scripts/worker-service.cjs\" hook codex file-context",
45
+ "timeout": 30
46
+ }
47
+ ]
48
+ }
49
+ ],
50
+ "PostToolUse": [
51
+ {
52
+ "matcher": ".*",
53
+ "hooks": [
54
+ {
55
+ "type": "command",
56
+ "command": "_HP=$(printenv PATH 2>/dev/null || true); if [ -z \"$_HP\" ] && [ -n \"${SHELL:-}\" ]; then _HP=$(\"$SHELL\" -lc 'printf %s \"$PATH\"' 2>/dev/null || true); fi; _HP=$(printf '%s' \"$_HP\" | tr ' ' ':'); export PATH=\"${_HP:+$_HP:}$PATH\"; _C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; ls -dt \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do _R=\"${_R%/}\"; [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/bun-runner.js\" ] && [ -f \"$_Q/scripts/worker-service.cjs\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: plugin scripts not found\" >&2; exit 1; }; command -v cygpath >/dev/null 2>&1 && { _W=$(cygpath -w \"$_P\" 2>/dev/null); [ -n \"$_W\" ] && _P=\"$_W\"; }; node \"$_P/scripts/bun-runner.js\" \"$_P/scripts/worker-service.cjs\" hook codex observation",
57
+ "timeout": 120
58
+ }
59
+ ]
60
+ }
61
+ ],
62
+ "Stop": [
63
+ {
64
+ "hooks": [
65
+ {
66
+ "type": "command",
67
+ "command": "_HP=$(printenv PATH 2>/dev/null || true); if [ -z \"$_HP\" ] && [ -n \"${SHELL:-}\" ]; then _HP=$(\"$SHELL\" -lc 'printf %s \"$PATH\"' 2>/dev/null || true); fi; _HP=$(printf '%s' \"$_HP\" | tr ' ' ':'); export PATH=\"${_HP:+$_HP:}$PATH\"; _C=\"${CLAUDE_CONFIG_DIR:-$HOME/.claude}\"; _E=\"${CLAUDE_PLUGIN_ROOT:-${PLUGIN_ROOT:-}}\"; _P=$({ [ -n \"$_E\" ] && printf '%s\\n' \"$_E\"; ls -dt \"$_C/plugins/cache/bjlee2024/claude-mem\"/[0-9]*/ 2>/dev/null; printf '%s\\n' \"$_C/plugins/marketplaces/bjlee2024/plugin\"; } | while IFS= read -r _R; do _R=\"${_R%/}\"; [ -d \"$_R/plugin/scripts\" ] && _Q=\"$_R/plugin\" || _Q=\"$_R\"; [ -f \"$_Q/scripts/bun-runner.js\" ] && [ -f \"$_Q/scripts/worker-service.cjs\" ] && { printf '%s\\n' \"$_Q\"; break; }; done); [ -n \"$_P\" ] || { echo \"claude-mem: plugin scripts not found\" >&2; exit 1; }; command -v cygpath >/dev/null 2>&1 && { _W=$(cygpath -w \"$_P\" 2>/dev/null); [ -n \"$_W\" ] && _P=\"$_W\"; }; node \"$_P/scripts/bun-runner.js\" \"$_P/scripts/worker-service.cjs\" hook codex summarize",
68
+ "timeout": 60
69
+ }
70
+ ]
71
+ }
72
+ ]
73
+ }
74
+ }