Compare commits
401 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b446f2630e | |||
| 224567f980 | |||
| 2b31792f06 | |||
| 613f0e9795 | |||
| f1162ed4a4 | |||
| 8039ada222 | |||
| df36ce68df | |||
| f24251118e | |||
| d2e926fbf7 | |||
| 854bf922a4 | |||
| e975555896 | |||
| 8d6581ea13 | |||
| 59169a221d | |||
| b1498c321b | |||
| 62b1618fbd | |||
| ab2dbb7dc7 | |||
| be474ea595 | |||
| cd31eaf572 | |||
| 51719d23a4 | |||
| 81013e1310 | |||
| 6d1f17adee | |||
| ddc25372c1 | |||
| 28f35f3ec7 | |||
| 0a40c4c596 | |||
| cef15011c2 | |||
| 7bf792b467 | |||
| 55e0e323b9 | |||
| 02f7c3c9d0 | |||
| 209db9f11a | |||
| be6437c46f | |||
| a94ddc504f | |||
| 12a3330b78 | |||
| dbad24b81b | |||
| a2046f018e | |||
| 454e9c5870 | |||
| 2f337dab13 | |||
| 42adfe29c8 | |||
| 8287ad960a | |||
| aa6090c04b | |||
| 327dd44992 | |||
| 0e11d4812a | |||
| 676a3d175e | |||
| 34358ab33d | |||
| 5ccaf40ad0 | |||
| 51abe5d1ff | |||
| 2dea824cc0 | |||
| 055888e181 | |||
| 67ba17cc8a | |||
| e1ef14dbcc | |||
| 685d54f2cb | |||
| 490f36099f | |||
| f9ff2b22f2 | |||
| 0ac4c7b8a9 | |||
| 47f6f0f239 | |||
| c27314f896 | |||
| 1b68c55763 | |||
| ed313db742 | |||
| f435ae32ce | |||
| 548d3677f0 | |||
| b0e0bd23c9 | |||
| 2bd5e981bc | |||
| 5de728612e | |||
| 64019ee28d | |||
| 6cad77328b | |||
| 26ac35ad40 | |||
| 31514d1943 | |||
| 52ea452010 | |||
| c469e0acc3 | |||
| f05f9ca735 | |||
| 1d76f93304 | |||
| 05e904e613 | |||
| 095f6fde47 | |||
| 1130bbc090 | |||
| 76f984ce7c | |||
| 6535ad597f | |||
| 40f81b4d2b | |||
| 54ca601e8f | |||
| de549cac05 | |||
| 83d474b13d | |||
| 9480ef06ab | |||
| c099e8eb27 | |||
| 1325f05432 | |||
| cfd19ae232 | |||
| cb6ff8738b | |||
| 81ebb8b6c0 | |||
| 9bdd00ea5a | |||
| 6f35e543ca | |||
| ee61270e1b | |||
| e902b74267 | |||
| 3eb6d9ea8e | |||
| 98d87d7573 | |||
| f7fea1f779 | |||
| 1f834863a7 | |||
| e4846a2046 | |||
| 0dda593c45 | |||
| 1bfb473c19 | |||
| 3f01baebfe | |||
| 46b61857ab | |||
| 0b214a59a1 | |||
| 77579669f2 | |||
| 2c5c99c0c7 | |||
| a3f9e7f638 | |||
| 4e67393d27 | |||
| cb0933a908 | |||
| af95461a70 | |||
| 79b3a61ac8 | |||
| a9e3b659d3 | |||
| af9584a174 | |||
| 63827c9dcb | |||
| 809175612c | |||
| 06d9ef24f1 | |||
| f37a1fd6dc | |||
| badcd0e0be | |||
| 22683f6910 | |||
| 7ffa1b06ee | |||
| 418e38ee46 | |||
| 6ac5507e4e | |||
| 9bcef1774d | |||
| edecfdb5bc | |||
| 74670c00a6 | |||
| bd9b02f364 | |||
| 05b615c858 | |||
| e13562e4cb | |||
| c7f7f87321 | |||
| 11532a36fb | |||
| 121f673328 | |||
| f5b69df11a | |||
| 7cc27d45a4 | |||
| 9c20f4142c | |||
| 7b7a92e35a | |||
| 33ab7ba747 | |||
| 1b9f601c41 | |||
| b2ddf59db4 | |||
| a0d737ba51 | |||
| db207807cb | |||
| 1d090b33f5 | |||
| 700aae8a31 | |||
| fbdff0b178 | |||
| 018549c3c7 | |||
| 63e8755be5 | |||
| c8aaa79ab6 | |||
| 194e44f52a | |||
| efd47a9586 | |||
| f1ecf5bc68 | |||
| 719079581a | |||
| f8d8de53e8 | |||
| baa37eba07 | |||
| 8933343433 | |||
| e4e1d3fb92 | |||
| dac989c697 | |||
| 5969d670d0 | |||
| 39990f2818 | |||
| 8dfcb5e612 | |||
| 4d91053f8c | |||
| ff503d08a7 | |||
| 0ee8c00c5f | |||
| d4e122a1f8 | |||
| 5508194189 | |||
| ded11645e3 | |||
| 7afbba4c3f | |||
| bf439043cf | |||
| 24ce746b91 | |||
| 98920bd860 | |||
| fbcbdfca62 | |||
| 6ae8890092 | |||
| c113e23001 | |||
| b58a61c0b3 | |||
| 936080d710 | |||
| 10675f7125 | |||
| 39e4aa1976 | |||
| 5dffb1ebb0 | |||
| 56df2c45e5 | |||
| 4c719d776a | |||
| da1d2cd36a | |||
| 7ed1e576b2 | |||
| 8030c44af4 | |||
| 2f935a56b9 | |||
| 830d7a2b23 | |||
| 5cbe0a38ca | |||
| c477ded1b5 | |||
| 3040ea8a97 | |||
| 9ad640a5c4 | |||
| 109fb1b506 | |||
| 55e13047e4 | |||
| 75a0f2e981 | |||
| d935229711 | |||
| 91e1d5baad | |||
| 8de8afbab8 | |||
| 75df2e52c1 | |||
| 40e699209f | |||
| 256ebcead0 | |||
| 44bfb74932 | |||
| 97c84a3963 | |||
| b493c2d6b0 | |||
| 4ea03b0597 | |||
| 7b08c94bdb | |||
| 92f7c7dfd9 | |||
| 358215a92f | |||
| 867513dc79 | |||
| 583a76b150 | |||
| 2a62a94b09 | |||
| 05d65ed797 | |||
| 1e04f82fe2 | |||
| 596f0ad16c | |||
| 296bf195ce | |||
| ba0793127c | |||
| 06711cfb20 | |||
| 8628e4024d | |||
| 1b912020ea | |||
| 3093f80196 | |||
| 6b67b3df63 | |||
| e9fee163a9 | |||
| e24ad77ab5 | |||
| c56e0ae7f8 | |||
| ed9ffe76a7 | |||
| 0622ebf534 | |||
| 63b0105d05 | |||
| 3ad53733e8 | |||
| 403913a0fc | |||
| 9f2a237aaf | |||
| b967772897 | |||
| e19617a065 | |||
| 9bd56c993c | |||
| f62b5d248c | |||
| 711f5455df | |||
| e36efff00d | |||
| 486bae633b | |||
| 228a006953 | |||
| 2d40afe7ef | |||
| ff55b6e4e0 | |||
| e2de295c41 | |||
| ea38601564 | |||
| 9fd32ad44b | |||
| dd753184db | |||
| e8097caed7 | |||
| eb7e37dcf1 | |||
| f24bba21e9 | |||
| 1a1297c12a | |||
| af308ea5c8 | |||
| 6382d6f9c7 | |||
| 1ae6c5708c | |||
| 93bad99d79 | |||
| 9c68a3ba3d | |||
| 117710d449 | |||
| b07130acc6 | |||
| bb96092d74 | |||
| 9907df1db8 | |||
| ab3d4ca865 | |||
| e424d85a93 | |||
| e5a133b3da | |||
| 15e9473533 | |||
| 20333e6214 | |||
| 5d1ee20076 | |||
| 576d407c00 | |||
| 3eb0154d58 | |||
| 80663fff97 | |||
| 27aa98c269 | |||
| 9789a1969c | |||
| d333c7dc08 | |||
| edfc1a403f | |||
| ad37629f0a | |||
| 7be19b20cd | |||
| 5b2eb9f599 | |||
| ede75b1c5b | |||
| cdb0e823aa | |||
| a35190b7bf | |||
| 4b180d8d66 | |||
| 61615ddc0f | |||
| 0ecb387f58 | |||
| 3840a1734d | |||
| ca990e8d53 | |||
| c9010c5c58 | |||
| 2ea716a017 | |||
| 4e4ad32f97 | |||
| faa1360f33 | |||
| 64dc50f3fb | |||
| 1ac35b5d56 | |||
| 1dd456a6ca | |||
| be01694383 | |||
| b8b88d998c | |||
| bf4d9421e0 | |||
| 67f9d631bd | |||
| 311d62cc02 | |||
| 46a75c4d98 | |||
| fececc4e51 | |||
| d0b4c7ee59 | |||
| e6af8d207a | |||
| 75b9930ee4 | |||
| 86b1d7fad9 | |||
| 2aab998b62 | |||
| 6b22017721 | |||
| 34aef1aa18 | |||
| d00762d1f7 | |||
| 400f08c20d | |||
| 18c7f1cd76 | |||
| 74506dd4e6 | |||
| 0f72356cb1 | |||
| 121fb24705 | |||
| 867c658f4f | |||
| 0704355a7f | |||
| 6930a38997 | |||
| e218dc5947 | |||
| 7e1c13c6c2 | |||
| e87701228d | |||
| d6751e0f07 | |||
| b04a041c2d | |||
| 8218fcb17b | |||
| 86bdb036bd | |||
| eefc2eaf0f | |||
| ebed56674e | |||
| ce4cab0a23 | |||
| 9913820366 | |||
| 640053d727 | |||
| aaf00829d3 | |||
| 094f5ab1b4 | |||
| a0380fe1f7 | |||
| 9864410eb8 | |||
| 450b2135b6 | |||
| a58a22cc6a | |||
| 0c9b8826c9 | |||
| 74f6b75db2 | |||
| b8821f5ea3 | |||
| 8f1a260d96 | |||
| a69613b4e0 | |||
| e7cae825bd | |||
| 486570d2b8 | |||
| ce576db0dc | |||
| 53f6f57420 | |||
| 814d2f6c03 | |||
| 006ff40175 | |||
| aedee33ca9 | |||
| 6ee6e21eb5 | |||
| add5d62cec | |||
| fa604849fe | |||
| 34004904e7 | |||
| 4df9f61347 | |||
| 14ca7cf7d6 | |||
| 57a60c1309 | |||
| bef825c0d8 | |||
| 93354e7a3e | |||
| f173a32fa3 | |||
| 7566b8c650 | |||
| 2eaef1f586 | |||
| 1341e93fca | |||
| 06864b0199 | |||
| a16b25275e | |||
| abffce6424 | |||
| c948a7778b | |||
| bd1fe5995f | |||
| 6791069bca | |||
| 3e6add90de | |||
| 8dd4d15b1f | |||
| 2a83e530e9 | |||
| e5d763860c | |||
| 9e4b401f9b | |||
| 2c304eafad | |||
| 70d6ac9daf | |||
| 5b3804ac08 | |||
| d3331d1e22 | |||
| bd619229b2 | |||
| 182097ef1c | |||
| 0b7ecedcd7 | |||
| da01e4bba0 | |||
| 7c3bfadd5e | |||
| a8bb625513 | |||
| bab8f554bd | |||
| c1b5b2a783 | |||
| 67651669a1 | |||
| ae454cfc01 | |||
| fa218b0d71 | |||
| c29d91a9c4 | |||
| e6ae017609 | |||
| 901cff909e | |||
| 5c8e2dcfcc | |||
| 47dec9cf4d | |||
| 3d40b45fd1 | |||
| 05323c9db5 | |||
| c314946204 | |||
| 7eb9f4051c | |||
| 550183bab2 | |||
| 92c4d245c4 | |||
| a2ab45a461 | |||
| 1d68e299dc | |||
| b987789754 | |||
| e91868a7f6 | |||
| 644cccd3e1 | |||
| e6df88bf42 | |||
| ef823a89c1 | |||
| b169e18de0 | |||
| e822d34342 | |||
| 5590a02dc5 | |||
| 601596f5cb | |||
| 817c4348b1 | |||
| 5963850775 | |||
| 4afef21ca1 | |||
| 2659ec3231 | |||
| 687146ce53 | |||
| a3d6bfc7dd | |||
| e22e2bfc24 | |||
| 0da504735b | |||
| 07f84ac408 |
+101
-68
@@ -1,103 +1,136 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
### Oct 25, 2025
|
||||
|
||||
### Dec 27, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #33251 | 10:20 PM | ✅ | Released claude-mem v8.2.5 with bug fixes for logger, ChromaSync, and SessionManager | ~379 |
|
||||
| #2374 | 2:55 PM | ✅ | Marketplace metadata version synchronized to 4.2.11 | ~157 |
|
||||
|
||||
### Dec 28, 2025
|
||||
### Oct 27, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #33520 | 10:46 PM | 🔵 | Marketplace configuration lists claude-mem plugin metadata | ~240 |
|
||||
| #33486 | 10:35 PM | ✅ | Committed Version Bump to 8.2.6 | ~212 |
|
||||
| #33484 | " | ✅ | Verified Version Synchronization at 8.2.6 | ~173 |
|
||||
| #33482 | 10:34 PM | ✅ | Updated Marketplace Plugin Version to 8.2.6 | ~159 |
|
||||
| #33479 | " | 🔵 | Marketplace Configuration for Plugin Distribution | ~242 |
|
||||
| #33477 | " | 🔵 | Current Version Across Package Files is 8.2.5 | ~185 |
|
||||
| #33311 | 3:09 PM | ✅ | Version 8.2.3 Release Deployed with Worker Stability Improvements | ~434 |
|
||||
| #33300 | 3:08 PM | ✅ | Version 8.2.4 Released with Full Automation Pipeline | ~357 |
|
||||
| #33281 | 3:07 PM | ✅ | Released v8.2.1 with Worker Lifecycle Hardening | ~332 |
|
||||
| #33277 | 3:05 PM | ✅ | Version 8.2.2 Release Deployed | ~325 |
|
||||
| #33260 | 2:57 PM | 🟣 | Version 8.2.0 Released with Gemini API Provider Support | ~355 |
|
||||
| #2757 | 1:23 AM | 🟣 | Released v4.3.3 with Configurable Session Display and First-Time Setup UX | ~391 |
|
||||
|
||||
### Dec 29, 2025
|
||||
### Nov 4, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34368 | 11:30 PM | ✅ | Bumped version to 8.5.1 for patch release | ~218 |
|
||||
| #34351 | 11:13 PM | ✅ | Version 8.5.0 Release Committed to Git | ~402 |
|
||||
| #34349 | 11:12 PM | ✅ | Version 8.5.0 Synchronized Across All Files | ~220 |
|
||||
| #33997 | 7:10 PM | ✅ | Version Bumped to 8.2.10 | ~179 |
|
||||
| #33994 | " | ✅ | Version bump to 8.2.10 for claude-mem plugin | ~186 |
|
||||
| #33992 | " | 🔵 | Version Consistency Verified Across Package Files | ~133 |
|
||||
| #33956 | 6:45 PM | 🔵 | Version 8.2.9 Release Verification Complete | ~227 |
|
||||
| #33948 | 6:42 PM | 🔵 | Current Version State Across Project Files | ~195 |
|
||||
| #33840 | 4:24 PM | ✅ | Version 8.2.8 Changes Committed to Git | ~233 |
|
||||
| #33838 | 4:23 PM | ✅ | Patch Release Version Bump to 8.2.8 Completed | ~216 |
|
||||
| #33836 | " | 🔵 | Current Version State Before Patch Release | ~125 |
|
||||
| #3706 | 9:47 PM | ✅ | Marketplace Plugin Version Synchronized to 5.0.2 | ~162 |
|
||||
| #3655 | 3:43 PM | ✅ | Version bumped to 5.0.1 across project | ~354 |
|
||||
|
||||
### Dec 31, 2025
|
||||
### Nov 5, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34723 | 4:51 PM | ✅ | Version 8.5.2 Release Committed and Tagged | ~198 |
|
||||
| #34721 | " | ✅ | Version 8.5.2 Synchronized Across All Configuration Files | ~186 |
|
||||
| #34719 | " | ✅ | Marketplace Version Bumped to 8.5.2 | ~169 |
|
||||
| #34716 | 4:50 PM | 🔵 | Current Version Before Patch Release | ~193 |
|
||||
| #34715 | " | 🔵 | Version 8.5.1 confirmed across all package configuration files | ~181 |
|
||||
| #4068 | 10:58 PM | ✅ | Committed v5.1.0 release with comprehensive release notes | ~486 |
|
||||
| #4066 | 10:57 PM | ✅ | Updated marketplace.json version to 5.1.0 | ~192 |
|
||||
| #3739 | 2:24 PM | ✅ | Updated version to 5.0.3 across project manifests | ~322 |
|
||||
|
||||
### Jan 1, 2026
|
||||
### Nov 6, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35680 | 11:43 PM | 🟣 | Automated version 8.5.3 release workflow completed | ~470 |
|
||||
| #35674 | 11:41 PM | 🔵 | Release staged files identified for version 8.5.3 | ~287 |
|
||||
| #35673 | " | ✅ | Staged version files for commit | ~155 |
|
||||
| #35671 | " | ✅ | Bumped claude-mem plugin version to 8.5.3 | ~137 |
|
||||
| #35669 | 11:40 PM | 🔵 | Claude plugin marketplace configuration discovered | ~235 |
|
||||
| #4099 | 1:13 PM | 🟣 | Theme Toggle for Light/Dark Mode | ~253 |
|
||||
| #4096 | " | ✅ | Marketplace Metadata Version Sync | ~179 |
|
||||
| #4092 | 1:12 PM | 🔵 | Marketplace Configuration for Claude-Mem Plugin | ~194 |
|
||||
| #4078 | 12:50 PM | 🔴 | Fixed PM2 ENOENT error on Windows systems | ~286 |
|
||||
| #4075 | 12:49 PM | ✅ | Marketplace plugin version synchronized to 5.1.1 | ~189 |
|
||||
|
||||
### Jan 2, 2026
|
||||
### Nov 7, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35944 | 2:57 PM | 🔵 | Current Project Version 8.5.4 Verified | ~200 |
|
||||
| #35926 | 2:53 PM | ✅ | Committed Version Bump to 8.5.4 | ~210 |
|
||||
| #35924 | " | ✅ | Verified Version Consistency Across All Files | ~186 |
|
||||
| #35922 | 2:52 PM | ✅ | Updated Marketplace Version to 8.5.4 | ~150 |
|
||||
| #35918 | " | 🔵 | Marketplace Configuration Structure | ~200 |
|
||||
| #35917 | " | 🔵 | Current Version Identified as 8.5.3 | ~170 |
|
||||
| #35905 | 2:49 PM | 🔵 | Current Version is 8.5.3 Across All Package Files | ~193 |
|
||||
| #4612 | 6:33 PM | ✅ | Version Bumped to 5.2.0 Across All Package Metadata | ~359 |
|
||||
| #4598 | 6:31 PM | ✅ | PR #69 Merged: cleanup/worker Branch Integration | ~469 |
|
||||
| #4298 | 11:54 AM | 🔴 | Fixed PostToolUse Hook Schema Compliance | ~310 |
|
||||
| #4295 | 11:53 AM | ✅ | Synchronized Plugin Marketplace Version to 5.1.4 | ~188 |
|
||||
|
||||
### Jan 3, 2026
|
||||
### Nov 8, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #36669 | 11:37 PM | ✅ | Merge conflicts resolved automatically - only 5 metadata files modified | ~345 |
|
||||
| #5150 | 7:37 PM | 🟣 | Troubleshooting Skill Added to Claude-Mem Plugin | ~427 |
|
||||
| #5133 | 7:29 PM | ✅ | Version 5.2.3 Released with Build Process | ~487 |
|
||||
|
||||
### Jan 4, 2026
|
||||
### Nov 9, 2025
|
||||
|
||||
**marketplace.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #36924 | 2:25 AM | ✅ | Merged fix/pr-538-followups branch into main with comprehensive updates | ~481 |
|
||||
| #36922 | " | ✅ | Version Bump Committed to Git | ~261 |
|
||||
| #36920 | " | 🔵 | Version 8.5.8 already set across all configuration files | ~203 |
|
||||
| #36918 | " | ✅ | Version bumped to 8.5.8 in marketplace.json | ~216 |
|
||||
| #36916 | 2:24 AM | 🔵 | Current version identified in marketplace configuration | ~224 |
|
||||
| #36912 | " | 🔵 | Current version identified as 8.5.7 across all package files | ~190 |
|
||||
| #36700 | 12:00 AM | ✅ | Committed Version 8.5.7 Across All Package Files | ~260 |
|
||||
| #36699 | " | ✅ | Version Bumped to 8.5.7 Across All Package Files | ~271 |
|
||||
| #36698 | " | ✅ | Marketplace Plugin Version Updated to 8.5.7 | ~257 |
|
||||
| #5941 | 7:14 PM | ✅ | Marketplace Version Updated to 5.4.0 | ~157 |
|
||||
|
||||
### Nov 10, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #6341 | 1:49 PM | ✅ | Version Bumped to 5.4.1 | ~239 |
|
||||
|
||||
### Nov 11, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #6602 | 1:51 PM | ✅ | Version 5.4.5 Released to GitHub | ~279 |
|
||||
| #6601 | " | ✅ | Version Patch Bump 5.4.4 to 5.4.5 | ~233 |
|
||||
|
||||
### Nov 14, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #8212 | 3:06 PM | 🔵 | Version Consistency Verification Across Multiple Configuration Files | ~238 |
|
||||
|
||||
### Nov 25, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #14882 | 1:32 PM | 🔵 | Marketplace Configuration Defines Plugin Version and Source Directory | ~366 |
|
||||
|
||||
### Nov 30, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #18064 | 10:52 PM | ✅ | Bumped version to 6.3.7 in marketplace.json | ~179 |
|
||||
| #18060 | 10:51 PM | 🔵 | Read marketplace.json plugin manifest | ~190 |
|
||||
|
||||
### Dec 1, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #18428 | 3:33 PM | 🔵 | Version Conflict in Marketplace Configuration | ~191 |
|
||||
|
||||
### Dec 4, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #20049 | 3:23 PM | ✅ | Updated marketplace.json version to 6.5.2 | ~203 |
|
||||
|
||||
### Dec 9, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #22559 | 1:08 AM | ✅ | Version 7.0.3 committed to repository | ~261 |
|
||||
| #22551 | 1:07 AM | ✅ | Marketplace metadata updated to version 7.0.3 | ~179 |
|
||||
|
||||
### Dec 10, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #23440 | 2:25 PM | ✅ | Marketplace Configuration Updated to 7.0.8 | ~188 |
|
||||
|
||||
### Dec 14, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #26799 | 11:39 PM | ✅ | Marketplace Manifest Version Updated to 7.2.3 | ~248 |
|
||||
| #26796 | " | ✅ | Version Bumped to 7.2.3 in marketplace.json | ~259 |
|
||||
| #26792 | 11:38 PM | 🔵 | Current Version Confirmed as 7.2.2 Across All Configuration Files | ~291 |
|
||||
|
||||
### Dec 16, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #28306 | 10:08 PM | 🔵 | Marketplace Configuration Also Shows Version 7.3.3 | ~220 |
|
||||
| #27555 | 4:48 PM | ✅ | Version bump committed to main branch | ~242 |
|
||||
| #27553 | " | ✅ | Version consistency verified across all configuration files | ~195 |
|
||||
| #27551 | 4:47 PM | ✅ | Marketplace.json version updated to 7.3.1 | ~207 |
|
||||
</claude-mem-context>
|
||||
@@ -10,7 +10,7 @@
|
||||
"plugins": [
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "9.0.0",
|
||||
"version": "10.2.3",
|
||||
"source": "./plugin",
|
||||
"description": "Persistent memory system for Claude Code - context compression across sessions"
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "claude-mem",
|
||||
"version": "9.0.6",
|
||||
"description": "Persistent memory system for Claude Code - seamlessly preserve context across sessions",
|
||||
"author": {
|
||||
"name": "Alex Newman"
|
||||
},
|
||||
"repository": "https://github.com/thedotmack/claude-mem",
|
||||
"license": "AGPL-3.0",
|
||||
"keywords": [
|
||||
"memory",
|
||||
"context",
|
||||
"persistence",
|
||||
"hooks",
|
||||
"mcp"
|
||||
]
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 17, 2025
|
||||
|
||||
**settings.local.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #29080 | 10:16 PM | ✅ | Synced claude-mem v7.3.9 to marketplace | ~326 |
|
||||
|
||||
### Dec 21, 2025
|
||||
|
||||
**test-analysis-report.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #31743 | 10:36 PM | 🔵 | PR #412 proposes mode system with inheritance and multilingual support | ~523 |
|
||||
|
||||
### Dec 22, 2025
|
||||
|
||||
**test-analysis-report.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #31865 | 6:56 PM | ✅ | 開発ドキュメントのクリーンアップをコミット | ~150 |
|
||||
| #31864 | " | ✅ | 計画ドキュメントと分析ファイルの削除 | ~142 |
|
||||
| #31859 | 6:55 PM | ✅ | 計画ドキュメントファイルの削除 | ~109 |
|
||||
| #31855 | 6:53 PM | ✅ | テストスイートの大規模削除とテスト分析レポートの追加 | ~197 |
|
||||
|
||||
### Dec 25, 2025
|
||||
|
||||
**settings.json**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #32602 | 8:42 PM | 🔵 | Identified potential settings configuration files | ~224 |
|
||||
</claude-mem-context>
|
||||
@@ -1,34 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Oct 25, 2025
|
||||
|
||||
**changelog.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #2491 | 10:59 PM | 🟣 | Added changelog viewer slash command | ~290 |
|
||||
|
||||
**terminal-shortcut.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #2480 | 6:32 PM | 🟣 | Cross-platform terminal shortcut command for claude-mem CLI | ~459 |
|
||||
|
||||
**setup-alias.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #2479 | 6:29 PM | 🟣 | Shell Alias Setup Slash Command | ~423 |
|
||||
|
||||
**version-bump.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #2358 | 1:07 PM | 🟣 | Created version-bump slash command for automated version updates | ~361 |
|
||||
|
||||
### Jan 1, 2026
|
||||
|
||||
**anti-pattern-czar.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35638 | 11:17 PM | 🟣 | Anti-Pattern Czar Custom Command Created | ~583 |
|
||||
</claude-mem-context>
|
||||
@@ -1,299 +0,0 @@
|
||||
# Plan: Fix 81 Test Failures from Incomplete Logger Mocks
|
||||
|
||||
## Problem Summary
|
||||
|
||||
**Root Cause**: NOT circular dependency (which is handled gracefully), but **incomplete logger mocks** that pollute across test files when Bun runs tests in alphabetical order.
|
||||
|
||||
When `tests/context/` runs before `tests/utils/`, the incomplete mocks replace the real logger module globally, causing subsequent tests to fail with `TypeError: logger.formatTool is not a function`.
|
||||
|
||||
## Phase 0: Documentation Discovery (COMPLETED)
|
||||
|
||||
### Sources Consulted
|
||||
- `src/utils/logger.ts` - Full logger interface (lines 136, 289-373)
|
||||
- `tests/context/context-builder.test.ts` - Mock pattern (lines 22-29)
|
||||
- `tests/context/observation-compiler.test.ts` - Mock pattern (lines 4-10)
|
||||
- `tests/server/server.test.ts` - Mock pattern (lines 4-11)
|
||||
- `tests/server/error-handler.test.ts` - Mock pattern (lines 5-12)
|
||||
- `tests/worker/agents/response-processor.test.ts` - Mock pattern (lines 32-39)
|
||||
|
||||
### Logger Methods (Complete List)
|
||||
All 11 methods that must be in any logger mock:
|
||||
1. `formatTool(toolName: string, toolInput?: any): string` (line 136)
|
||||
2. `debug(component, message, context?, data?): void` (line 289)
|
||||
3. `info(component, message, context?, data?): void` (line 293)
|
||||
4. `warn(component, message, context?, data?): void` (line 297)
|
||||
5. `error(component, message, context?, data?): void` (line 301)
|
||||
6. `dataIn(component, message, context?, data?): void` (line 308)
|
||||
7. `dataOut(component, message, context?, data?): void` (line 315)
|
||||
8. `success(component, message, context?, data?): void` (line 322)
|
||||
9. `failure(component, message, context?, data?): void` (line 329)
|
||||
10. `timing(component, message, durationMs, context?): void` (line 336)
|
||||
11. `happyPathError<T>(message, context?): T` (line 362)
|
||||
|
||||
### Files Requiring Updates
|
||||
1. `tests/context/observation-compiler.test.ts` (lines 4-10)
|
||||
2. `tests/context/context-builder.test.ts` (lines 22-29)
|
||||
3. `tests/server/server.test.ts` (lines 4-11)
|
||||
4. `tests/server/error-handler.test.ts` (lines 5-12)
|
||||
5. `tests/worker/agents/response-processor.test.ts` (lines 32-39)
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Create Shared Logger Mock Utility
|
||||
|
||||
### Objective
|
||||
Create a reusable complete logger mock to avoid duplication and ensure consistency.
|
||||
|
||||
### Implementation
|
||||
|
||||
**Create new file**: `tests/test-utils/mock-logger.ts`
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Complete logger mock for tests.
|
||||
* Includes ALL logger methods to prevent mock pollution across test files.
|
||||
*/
|
||||
import { mock } from 'bun:test';
|
||||
|
||||
export function createMockLogger() {
|
||||
return {
|
||||
logger: {
|
||||
// Core logging methods
|
||||
debug: mock(() => {}),
|
||||
info: mock(() => {}),
|
||||
warn: mock(() => {}),
|
||||
error: mock(() => {}),
|
||||
|
||||
// Data flow logging
|
||||
dataIn: mock(() => {}),
|
||||
dataOut: mock(() => {}),
|
||||
|
||||
// Status logging
|
||||
success: mock(() => {}),
|
||||
failure: mock(() => {}),
|
||||
|
||||
// Performance logging
|
||||
timing: mock(() => {}),
|
||||
|
||||
// Tool formatting - returns string
|
||||
formatTool: mock((toolName: string, _toolInput?: any) => toolName),
|
||||
|
||||
// Error helper - returns the message
|
||||
happyPathError: mock((message: string, _context?: any) => message),
|
||||
},
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] File created at `tests/test-utils/mock-logger.ts`
|
||||
- [ ] All 11 logger methods included
|
||||
- [ ] `formatTool` returns string (not void)
|
||||
- [ ] `happyPathError` returns the message (not void)
|
||||
- [ ] File compiles without errors: `bunx tsc --noEmit tests/test-utils/mock-logger.ts`
|
||||
|
||||
### Anti-Patterns to Avoid
|
||||
- ❌ Don't forget `formatTool` - it returns a string, not void
|
||||
- ❌ Don't forget `happyPathError` - it's generic and returns the message
|
||||
- ❌ Don't use `() => {}` for methods that return values
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Update Affected Test Files
|
||||
|
||||
### Objective
|
||||
Replace incomplete logger mocks with the complete shared mock.
|
||||
|
||||
### Files to Update (5 total)
|
||||
|
||||
#### 2.1 `tests/context/observation-compiler.test.ts`
|
||||
|
||||
**Current (lines 4-10)**:
|
||||
```typescript
|
||||
mock.module('../../src/utils/logger.js', () => ({
|
||||
logger: {
|
||||
debug: mock(() => {}),
|
||||
failure: mock(() => {}),
|
||||
error: mock(() => {}),
|
||||
},
|
||||
}));
|
||||
```
|
||||
|
||||
**Replace with**:
|
||||
```typescript
|
||||
import { createMockLogger } from '../test-utils/mock-logger.js';
|
||||
|
||||
mock.module('../../src/utils/logger.js', () => createMockLogger());
|
||||
```
|
||||
|
||||
#### 2.2 `tests/context/context-builder.test.ts`
|
||||
|
||||
**Current (lines 22-29)**:
|
||||
```typescript
|
||||
mock.module('../../src/utils/logger.js', () => ({
|
||||
logger: {
|
||||
debug: mock(() => {}),
|
||||
failure: mock(() => {}),
|
||||
error: mock(() => {}),
|
||||
info: mock(() => {}),
|
||||
},
|
||||
}));
|
||||
```
|
||||
|
||||
**Replace with**:
|
||||
```typescript
|
||||
import { createMockLogger } from '../test-utils/mock-logger.js';
|
||||
|
||||
mock.module('../../src/utils/logger.js', () => createMockLogger());
|
||||
```
|
||||
|
||||
#### 2.3 `tests/server/server.test.ts`
|
||||
|
||||
**Current (lines 4-11)**:
|
||||
```typescript
|
||||
mock.module('../../src/utils/logger.js', () => ({
|
||||
logger: {
|
||||
info: () => {},
|
||||
debug: () => {},
|
||||
warn: () => {},
|
||||
error: () => {},
|
||||
},
|
||||
}));
|
||||
```
|
||||
|
||||
**Replace with**:
|
||||
```typescript
|
||||
import { createMockLogger } from '../test-utils/mock-logger.js';
|
||||
|
||||
mock.module('../../src/utils/logger.js', () => createMockLogger());
|
||||
```
|
||||
|
||||
#### 2.4 `tests/server/error-handler.test.ts`
|
||||
|
||||
**Current (lines 5-12)**:
|
||||
```typescript
|
||||
mock.module('../../src/utils/logger.js', () => ({
|
||||
logger: {
|
||||
info: () => {},
|
||||
debug: () => {},
|
||||
warn: () => {},
|
||||
error: () => {},
|
||||
},
|
||||
}));
|
||||
```
|
||||
|
||||
**Replace with**:
|
||||
```typescript
|
||||
import { createMockLogger } from '../test-utils/mock-logger.js';
|
||||
|
||||
mock.module('../../src/utils/logger.js', () => createMockLogger());
|
||||
```
|
||||
|
||||
#### 2.5 `tests/worker/agents/response-processor.test.ts`
|
||||
|
||||
**Current (lines 32-39)**:
|
||||
```typescript
|
||||
mock.module('../../../src/utils/logger.js', () => ({
|
||||
logger: {
|
||||
info: () => {},
|
||||
debug: () => {},
|
||||
warn: () => {},
|
||||
error: () => {},
|
||||
},
|
||||
}));
|
||||
```
|
||||
|
||||
**Replace with**:
|
||||
```typescript
|
||||
import { createMockLogger } from '../../test-utils/mock-logger.js';
|
||||
|
||||
mock.module('../../../src/utils/logger.js', () => createMockLogger());
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] All 5 files updated with import statement
|
||||
- [ ] All 5 files use `createMockLogger()` instead of inline mock
|
||||
- [ ] Import paths are correct (relative to each file's location)
|
||||
- [ ] Each file still has `mock.module` BEFORE the module imports it mocks
|
||||
|
||||
### Anti-Patterns to Avoid
|
||||
- ❌ Don't place import AFTER the mock.module call
|
||||
- ❌ Don't use wrong relative path (../test-utils vs ../../test-utils)
|
||||
- ❌ Don't forget the .js extension in imports
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Verification
|
||||
|
||||
### Objective
|
||||
Confirm all 81 failures are fixed.
|
||||
|
||||
### Test Commands
|
||||
|
||||
```bash
|
||||
# 1. Run individual test groups first
|
||||
bun test tests/context/
|
||||
bun test tests/server/
|
||||
bun test tests/utils/
|
||||
bun test tests/shared/
|
||||
bun test tests/worker/
|
||||
|
||||
# 2. Run full suite
|
||||
bun test
|
||||
|
||||
# 3. Verify specific test counts
|
||||
# Expected: 733+ tests pass (was 652 before)
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] `bun test tests/context/` - all pass
|
||||
- [ ] `bun test tests/server/` - all pass
|
||||
- [ ] `bun test tests/utils/` - all pass (including 56 formatTool tests)
|
||||
- [ ] `bun test tests/shared/` - all pass (including 27 settings tests)
|
||||
- [ ] `bun test` - 730+ tests pass, 0 failures
|
||||
- [ ] No `TypeError: logger.formatTool is not a function` errors
|
||||
|
||||
### Anti-Pattern Grep Checks
|
||||
|
||||
```bash
|
||||
# Check no incomplete logger mocks remain
|
||||
grep -r "logger: {" tests/ --include="*.ts" | grep -v mock-logger
|
||||
|
||||
# Verify all test files use createMockLogger
|
||||
grep -r "createMockLogger" tests/ --include="*.ts"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Commit
|
||||
|
||||
### Commit Message
|
||||
|
||||
```
|
||||
fix(tests): complete logger mocks to prevent cross-test pollution
|
||||
|
||||
The 81 test failures were caused by incomplete logger mocks that
|
||||
polluted the module cache when tests ran in alphabetical order.
|
||||
|
||||
Changes:
|
||||
- Create shared mock-logger.ts with all 11 logger methods
|
||||
- Update 5 test files to use complete mock
|
||||
- Fix TypeError: logger.formatTool is not a function
|
||||
|
||||
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
||||
|
||||
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
| Phase | Files Changed | Purpose |
|
||||
|-------|--------------|---------|
|
||||
| 1 | 1 new file | Create shared mock utility |
|
||||
| 2 | 5 files | Update to use shared mock |
|
||||
| 3 | 0 files | Verification only |
|
||||
| 4 | 0 files | Commit |
|
||||
|
||||
**Total**: 6 files changed, fixing all 81 test failures.
|
||||
@@ -1,7 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
*No recent activity*
|
||||
</claude-mem-context>
|
||||
@@ -0,0 +1,371 @@
|
||||
# Comprehensive Claude-Mem Installer with @clack/prompts
|
||||
|
||||
## Overview
|
||||
|
||||
Build a beautiful, animated CLI installer for claude-mem using `@clack/prompts` (v1.0.1). Distributable via `npx claude-mem-installer` and `curl -fsSL https://install.cmem.ai | bash`. Replaces the need for users to manually clone, build, configure settings, and start the worker.
|
||||
|
||||
**Worktree**: `feat/animated-installer` at `.claude/worktrees/animated-installer`
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Documentation & API Reference
|
||||
|
||||
### Allowed APIs (@clack/prompts v1.0.1, ESM-only)
|
||||
|
||||
| API | Signature | Use Case |
|
||||
|-----|-----------|----------|
|
||||
| `intro(title?)` | `void` | Opening banner |
|
||||
| `outro(message?)` | `void` | Completion message |
|
||||
| `cancel(message?)` | `void` | User cancelled |
|
||||
| `isCancel(value)` | `boolean` | Check if user pressed Ctrl+C |
|
||||
| `text(opts)` | `Promise<string \| symbol>` | API key input, port, data dir |
|
||||
| `password(opts)` | `Promise<string \| symbol>` | API key input (masked) |
|
||||
| `select(opts)` | `Promise<Value \| symbol>` | Provider, model, auth method |
|
||||
| `multiselect(opts)` | `Promise<Value[] \| symbol>` | IDE selection, observation types |
|
||||
| `confirm(opts)` | `Promise<boolean \| symbol>` | Enable Chroma, start worker |
|
||||
| `spinner()` | `SpinnerResult` | Installing deps, building, starting worker |
|
||||
| `progress(opts)` | `ProgressResult` | Multi-step installation progress |
|
||||
| `tasks(tasks[])` | `Promise<void>` | Sequential install steps |
|
||||
| `group(prompts, opts)` | `Promise<Results>` | Chain prompts with shared results |
|
||||
| `note(message, title)` | `void` | Display settings summary, next steps |
|
||||
| `log.info/success/warn/error(msg)` | `void` | Status messages |
|
||||
| `box(message, title, opts)` | `void` | Welcome box, completion summary |
|
||||
|
||||
### Anti-Patterns
|
||||
- Do NOT use `require()` — package is ESM-only
|
||||
- Do NOT call prompts without TTY check first — hangs indefinitely in non-TTY
|
||||
- Do NOT forget `isCancel()` check after every prompt (or use `group()` with `onCancel`)
|
||||
- Do NOT use `chalk` — use `picocolors` (clack's dep) for consistency
|
||||
- `text()` has no numeric mode — validate manually for port numbers
|
||||
- `spinner.stop()` does not accept status codes — use `spinner.error()` for failures
|
||||
|
||||
### Distribution Patterns
|
||||
- **npx**: `package.json` `bin` field → `"./dist/index.js"`, file needs `#!/usr/bin/env node`
|
||||
- **curl|bash**: Shell bootstrap downloads JS, runs `node script.js` directly (preserves TTY)
|
||||
- **esbuild**: Bundle to single ESM file, `platform: 'node'`, `banner` for shebang
|
||||
|
||||
### Key Source Files to Reference
|
||||
- Settings defaults: `src/shared/SettingsDefaultsManager.ts` (lines 73-125)
|
||||
- Settings validation: `src/services/server/SettingsRoutes.ts`
|
||||
- Worker startup: `src/services/worker-service.ts` (lines 337-359)
|
||||
- Health check: `src/services/infrastructure/HealthMonitor.ts`
|
||||
- Plugin registration: `plugin/.claude-plugin/plugin.json`, `.claude-plugin/marketplace.json`
|
||||
- Marketplace sync: `scripts/sync-marketplace.cjs`
|
||||
- Cursor integration: `src/services/integrations/CursorHooksInstaller.ts`
|
||||
- Existing OpenClaw installer: `install/public/openclaw.sh` (reference for logic, not code to copy)
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Project Scaffolding
|
||||
|
||||
**Goal**: Set up the installer package structure with build tooling.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **Create directory structure** in the worktree:
|
||||
```
|
||||
installer/
|
||||
├── src/
|
||||
│ ├── index.ts # Entry point with TTY guard
|
||||
│ ├── steps/
|
||||
│ │ ├── welcome.ts # intro + version check
|
||||
│ │ ├── dependencies.ts # bun, uv, git checks
|
||||
│ │ ├── ide-selection.ts # IDE picker + registration
|
||||
│ │ ├── provider.ts # AI provider + API key
|
||||
│ │ ├── settings.ts # Additional settings config
|
||||
│ │ ├── install.ts # Clone, build, register plugin
|
||||
│ │ ├── worker.ts # Start worker + health check
|
||||
│ │ └── complete.ts # Summary + next steps
|
||||
│ └── utils/
|
||||
│ ├── system.ts # OS detection, command runner
|
||||
│ ├── dependencies.ts # bun/uv/git install helpers
|
||||
│ └── settings-writer.ts # Write ~/.claude-mem/settings.json
|
||||
├── build.mjs # esbuild config
|
||||
├── package.json # bin, type: module, deps
|
||||
└── tsconfig.json
|
||||
```
|
||||
|
||||
2. **Create `package.json`**:
|
||||
```json
|
||||
{
|
||||
"name": "claude-mem-installer",
|
||||
"version": "1.0.0",
|
||||
"type": "module",
|
||||
"bin": { "claude-mem-installer": "./dist/index.js" },
|
||||
"files": ["dist"],
|
||||
"scripts": {
|
||||
"build": "node build.mjs",
|
||||
"dev": "node build.mjs && node dist/index.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@clack/prompts": "^1.0.1",
|
||||
"picocolors": "^1.1.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"esbuild": "^0.24.0",
|
||||
"typescript": "^5.7.0",
|
||||
"@types/node": "^22.0.0"
|
||||
},
|
||||
"engines": { "node": ">=18.0.0" }
|
||||
}
|
||||
```
|
||||
|
||||
3. **Create `build.mjs`**:
|
||||
- esbuild bundle: `entryPoints: ['src/index.ts']`, `format: 'esm'`, `platform: 'node'`, `target: 'node18'`
|
||||
- Banner: `#!/usr/bin/env node`
|
||||
- Output: `dist/index.js`
|
||||
|
||||
4. **Create `tsconfig.json`**:
|
||||
- `module: "ESNext"`, `target: "ES2022"`, `moduleResolution: "bundler"`
|
||||
|
||||
5. **Run `npm install`** in installer/ directory
|
||||
|
||||
### Verification
|
||||
- [ ] `node build.mjs` succeeds
|
||||
- [ ] `dist/index.js` exists with shebang
|
||||
- [ ] `node dist/index.js` runs (even if empty installer)
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Entry Point + Welcome Screen
|
||||
|
||||
**Goal**: Create the main entry point with TTY detection and a beautiful welcome screen.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **`src/index.ts`** — Entry point:
|
||||
- TTY guard: if `!process.stdin.isTTY`, print error directing user to `npx claude-mem-installer`, exit 1
|
||||
- Import and call `runInstaller()` from steps
|
||||
- Top-level catch → `p.cancel()` + exit 1
|
||||
|
||||
2. **`src/steps/welcome.ts`** — Welcome step:
|
||||
- `p.intro()` with styled title using picocolors: `" claude-mem installer "`
|
||||
- Display version info via `p.log.info()`
|
||||
- Check if already installed (detect `~/.claude-mem/settings.json` and `~/.claude/plugins/marketplaces/thedotmack/`)
|
||||
- If upgrade detected, `p.confirm()`: "claude-mem is already installed. Upgrade?"
|
||||
- `p.select()` for install mode: Fresh Install vs Upgrade vs Configure Only
|
||||
|
||||
3. **`src/utils/system.ts`** — System utilities:
|
||||
- `detectOS()`: returns 'macos' | 'linux' | 'windows'
|
||||
- `commandExists(cmd)`: checks if command is in PATH
|
||||
- `runCommand(cmd, args)`: executes shell command, returns { stdout, stderr, exitCode }
|
||||
- `expandHome(path)`: resolves `~` to home directory
|
||||
|
||||
### Verification
|
||||
- [ ] Running `node dist/index.js` shows intro banner
|
||||
- [ ] Ctrl+C triggers cancel message
|
||||
- [ ] Non-TTY (piped) shows error and exits
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Dependency Checks
|
||||
|
||||
**Goal**: Check and install required dependencies (Bun, uv, git, Node.js version).
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **`src/steps/dependencies.ts`** — Dependency checker:
|
||||
- Use `p.tasks()` to check each dependency sequentially with animated spinners:
|
||||
- **Node.js**: Verify >= 18.0.0 via `process.version`
|
||||
- **git**: `commandExists('git')`, show install instructions per OS if missing
|
||||
- **Bun**: Check PATH + common locations (`~/.bun/bin/bun`, `/usr/local/bin/bun`, `/opt/homebrew/bin/bun`). Min version 1.1.14. Offer to auto-install from `https://bun.sh/install`
|
||||
- **uv**: Check PATH + common locations (`~/.local/bin/uv`, `~/.cargo/bin/uv`). Offer to auto-install from `https://astral.sh/uv/install.sh`
|
||||
- For missing deps: `p.confirm()` to auto-install, or show manual instructions
|
||||
- After install attempts, re-verify each dep
|
||||
|
||||
2. **`src/utils/dependencies.ts`** — Install helpers:
|
||||
- `installBun()`: downloads and runs bun install script
|
||||
- `installUv()`: downloads and runs uv install script
|
||||
- `findBinary(name, extraPaths[])`: searches PATH + known locations
|
||||
- `checkVersion(binary, minVersion)`: parses `--version` output
|
||||
|
||||
### Verification
|
||||
- [ ] Shows green checkmarks for found dependencies
|
||||
- [ ] Shows yellow warnings for missing deps with install option
|
||||
- [ ] Auto-install actually installs bun/uv when confirmed
|
||||
- [ ] Fails gracefully if git is missing (can't auto-install)
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: IDE Selection & Provider Configuration
|
||||
|
||||
**Goal**: Let user choose IDEs and configure AI provider with API keys.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **`src/steps/ide-selection.ts`** — IDE picker:
|
||||
- `p.multiselect()` with options:
|
||||
- Claude Code (default selected, hint: "recommended")
|
||||
- Cursor
|
||||
- Windsurf (hint: "coming soon", disabled: true)
|
||||
- For Claude Code: explain plugin will be registered via marketplace
|
||||
- For Cursor: explain hooks will be installed via CursorHooksInstaller pattern
|
||||
- Store selections for later installation steps
|
||||
|
||||
2. **`src/steps/provider.ts`** — AI provider configuration:
|
||||
- `p.select()` for provider:
|
||||
- **Claude** (hint: "recommended — uses your Claude subscription")
|
||||
- **Gemini** (hint: "free tier available")
|
||||
- **OpenRouter** (hint: "free models available")
|
||||
- **If Claude selected**:
|
||||
- `p.select()` for auth method: "CLI (Max Plan subscription)" vs "API Key"
|
||||
- If API key: `p.password()` for key input
|
||||
- **If Gemini selected**:
|
||||
- `p.password()` for API key (required)
|
||||
- `p.select()` for model: gemini-2.5-flash-lite (default), gemini-2.5-flash, gemini-3-flash-preview
|
||||
- `p.confirm()` for rate limiting (default: true)
|
||||
- **If OpenRouter selected**:
|
||||
- `p.password()` for API key (required)
|
||||
- `p.text()` for model (default: `xiaomi/mimo-v2-flash:free`)
|
||||
- Validate API keys where possible (non-empty, format check)
|
||||
|
||||
### Verification
|
||||
- [ ] Multiselect allows picking multiple IDEs
|
||||
- [ ] Provider selection shows correct follow-up prompts
|
||||
- [ ] API keys are masked during input
|
||||
- [ ] Cancel at any step triggers graceful exit
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Settings Configuration
|
||||
|
||||
**Goal**: Configure additional settings with sensible defaults.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **`src/steps/settings.ts`** — Settings wizard:
|
||||
- `p.confirm()`: "Use default settings?" (recommended) — if yes, skip detailed config
|
||||
- If customizing, use `p.group()` for:
|
||||
- **Worker port**: `p.text()` with default 37777, validate 1024-65535
|
||||
- **Data directory**: `p.text()` with default `~/.claude-mem`
|
||||
- **Context observations**: `p.text()` with default 50, validate 1-200
|
||||
- **Log level**: `p.select()` — DEBUG, INFO (default), WARN, ERROR
|
||||
- **Python version**: `p.text()` with default 3.13
|
||||
- **Chroma vector search**: `p.confirm()` (default: true)
|
||||
- If yes, `p.select()` mode: local (default) vs remote
|
||||
- If remote: `p.text()` for host, port, `p.confirm()` for SSL
|
||||
- Show settings summary via `p.note()` before proceeding
|
||||
|
||||
2. **`src/utils/settings-writer.ts`** — Write settings:
|
||||
- Build flat key-value settings object matching SettingsDefaultsManager schema
|
||||
- Merge with existing settings if upgrading (preserve user customizations)
|
||||
- Write to `~/.claude-mem/settings.json`
|
||||
- Create `~/.claude-mem/` directory if it doesn't exist
|
||||
|
||||
### Verification
|
||||
- [ ] Default settings mode skips all detailed prompts
|
||||
- [ ] Custom settings validates all inputs
|
||||
- [ ] Settings file written matches SettingsDefaultsManager schema exactly
|
||||
- [ ] Existing settings preserved on upgrade
|
||||
|
||||
---
|
||||
|
||||
## Phase 6: Installation Execution
|
||||
|
||||
**Goal**: Clone repo, build plugin, register with IDEs, start worker.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **`src/steps/install.ts`** — Installation runner:
|
||||
- Use `p.tasks()` for visual progress:
|
||||
- **"Cloning claude-mem repository"**: `git clone --depth 1 https://github.com/thedotmack/claude-mem.git` to temp dir
|
||||
- **"Installing dependencies"**: `npm install` in cloned repo
|
||||
- **"Building plugin"**: `npm run build` in cloned repo
|
||||
- **"Registering plugin"**: Copy plugin files to `~/.claude/plugins/marketplaces/thedotmack/`
|
||||
- Create marketplace.json, plugin.json structure
|
||||
- Register in `~/.claude/plugins/known_marketplaces.json`
|
||||
- Add to `~/.claude/plugins/installed_plugins.json`
|
||||
- Enable in `~/.claude/settings.json` under `enabledPlugins`
|
||||
- **"Installing dependencies"** (in marketplace dir): `npm install`
|
||||
- For Cursor (if selected):
|
||||
- **"Configuring Cursor hooks"**: Run Cursor hooks installer logic
|
||||
- Write hooks.json to `~/.cursor/` or project-level `.cursor/`
|
||||
- Configure MCP in `.cursor/mcp.json`
|
||||
|
||||
2. **`src/steps/worker.ts`** — Worker startup:
|
||||
- Use `p.spinner()` for worker startup:
|
||||
- Start worker: `bun plugin/scripts/worker-service.cjs` (from marketplace dir)
|
||||
- Write PID file to `~/.claude-mem/worker.pid`
|
||||
- Two-stage health check (copy pattern from OpenClaw installer):
|
||||
- Stage 1: Poll `/api/health` — spinner message: "Starting worker service..."
|
||||
- Stage 2: Poll `/api/readiness` — spinner message: "Initializing database..."
|
||||
- Budget: 30 attempts, 1 second apart
|
||||
- On success: `spinner.stop("Worker running on port {port}")`
|
||||
- On failure: `spinner.error("Worker failed to start")`, show log path
|
||||
|
||||
### Verification
|
||||
- [ ] Plugin files exist at `~/.claude/plugins/marketplaces/thedotmack/`
|
||||
- [ ] known_marketplaces.json updated
|
||||
- [ ] installed_plugins.json updated
|
||||
- [ ] settings.json has enabledPlugins entry
|
||||
- [ ] Worker responds to `/api/health` with 200
|
||||
- [ ] Worker responds to `/api/readiness` with 200
|
||||
|
||||
---
|
||||
|
||||
## Phase 7: Completion & Summary
|
||||
|
||||
**Goal**: Show success screen with configuration summary and next steps.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **`src/steps/complete.ts`** — Completion screen:
|
||||
- `p.note()` with configuration summary:
|
||||
- Provider + model
|
||||
- IDEs configured
|
||||
- Data directory
|
||||
- Worker port
|
||||
- Chroma enabled/disabled
|
||||
- `p.note()` with next steps:
|
||||
- "Open Claude Code and start a conversation — memory is automatic!"
|
||||
- "View your memories: http://localhost:{port}"
|
||||
- "Search past work: use /mem-search in Claude Code"
|
||||
- If Cursor: "Open Cursor — hooks are active in your projects"
|
||||
- `p.outro()` with styled completion message
|
||||
|
||||
### Verification
|
||||
- [ ] Summary accurately reflects chosen settings
|
||||
- [ ] URLs use correct port from settings
|
||||
- [ ] Next steps are relevant to selected IDEs
|
||||
|
||||
---
|
||||
|
||||
## Phase 8: curl|bash Bootstrap Script
|
||||
|
||||
**Goal**: Create the shell bootstrap script for `curl -fsSL https://install.cmem.ai | bash`.
|
||||
|
||||
### Tasks
|
||||
|
||||
1. **`install/public/install.sh`** — Bootstrap script:
|
||||
- Check for Node.js >= 18 (required to run the installer)
|
||||
- Download bundled installer JS to temp file
|
||||
- Execute with `node` directly (preserves TTY for @clack/prompts)
|
||||
- Cleanup temp file on exit (trap)
|
||||
- Support `--non-interactive` flag passthrough
|
||||
- Support `--provider=X --api-key=Y` flag passthrough
|
||||
|
||||
2. **Update `install/vercel.json`** to serve `install.sh` alongside `openclaw.sh`
|
||||
|
||||
### Verification
|
||||
- [ ] `curl -fsSL https://install.cmem.ai | bash` downloads and runs installer
|
||||
- [ ] Interactive prompts work after curl download
|
||||
- [ ] Temp file cleaned up on success and failure
|
||||
- [ ] Flags pass through correctly
|
||||
|
||||
---
|
||||
|
||||
## Phase 9: Final Verification
|
||||
|
||||
### Checks
|
||||
- [ ] `npm run build` in installer/ produces single-file `dist/index.js`
|
||||
- [ ] `node dist/index.js` runs full wizard flow
|
||||
- [ ] Fresh install on clean system works end-to-end
|
||||
- [ ] Upgrade path preserves existing settings
|
||||
- [ ] Ctrl+C at any step exits cleanly
|
||||
- [ ] Non-TTY shows error message
|
||||
- [ ] All settings written match SettingsDefaultsManager.ts defaults schema
|
||||
- [ ] Worker health check succeeds after install
|
||||
- [ ] Plugin appears in Claude Code plugin list
|
||||
- [ ] grep for deprecated/non-existent APIs returns 0 results
|
||||
- [ ] No `require()` calls in source (ESM-only)
|
||||
- [ ] No `chalk` imports (use picocolors)
|
||||
@@ -1,516 +0,0 @@
|
||||
# Fix CLAUDE.md Worktree Bug - Implementation Plan
|
||||
|
||||
## Problem Statement
|
||||
|
||||
CLAUDE.md files are being written to the wrong directory when using git worktrees. The worker service writes files relative to its own `process.cwd()` instead of the project's working directory (`cwd`) from the observation.
|
||||
|
||||
**Reproduction scenario:**
|
||||
1. Start Claude Code in `budapest` worktree → worker starts with `cwd=budapest`
|
||||
2. Run Claude Code in `~/Scripts/claude-mem/` (main repo)
|
||||
3. Observations created with relative file paths (e.g., `src/utils/foo.ts`)
|
||||
4. `updateFolderClaudeMdFiles` writes to `budapest/src/utils/CLAUDE.md` instead of main repo
|
||||
|
||||
## Root Cause Analysis
|
||||
|
||||
The `cwd` (project root path) IS captured and stored:
|
||||
- `SessionRoutes.ts:309,403` - receives `cwd` from hooks
|
||||
- `PendingMessageStore.ts:70` - stores `cwd` in database
|
||||
- `SDKAgent.ts:295` - passes `cwd` to prompt builder
|
||||
|
||||
But `cwd` is NOT passed to file writing:
|
||||
- `ResponseProcessor.ts:222-225` - calls `updateFolderClaudeMdFiles(allFilePaths, session.project, port)` without `cwd`
|
||||
- `claude-md-utils.ts:219` - uses `path.dirname(filePath)` which produces relative paths
|
||||
- Relative paths resolve against worker's `process.cwd()`, not project root
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Documentation & API Inventory
|
||||
|
||||
### Allowed APIs (from codebase analysis)
|
||||
|
||||
**File: `src/utils/claude-md-utils.ts`**
|
||||
```typescript
|
||||
export async function updateFolderClaudeMdFiles(
|
||||
filePaths: string[],
|
||||
project: string,
|
||||
port: number
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
**File: `src/sdk/parser.ts`**
|
||||
```typescript
|
||||
export interface ParsedObservation {
|
||||
type: string;
|
||||
title: string | null;
|
||||
subtitle: string | null;
|
||||
facts: string[];
|
||||
narrative: string | null;
|
||||
concepts: string[];
|
||||
files_read: string[];
|
||||
files_modified: string[];
|
||||
// NOTE: Does NOT include cwd
|
||||
}
|
||||
```
|
||||
|
||||
**File: `src/services/worker-types.ts`**
|
||||
```typescript
|
||||
export interface PendingMessage {
|
||||
type: 'observation' | 'summarize';
|
||||
tool_name?: string;
|
||||
tool_input?: unknown;
|
||||
tool_response?: unknown;
|
||||
prompt_number?: number;
|
||||
cwd?: string; // <-- Source of project root
|
||||
last_assistant_message?: string;
|
||||
}
|
||||
```
|
||||
|
||||
**File: `src/shared/paths.ts`** - Path utilities
|
||||
```typescript
|
||||
import path from 'path';
|
||||
// Standard pattern: path.join(baseDir, relativePath)
|
||||
```
|
||||
|
||||
### Anti-Patterns to Avoid
|
||||
|
||||
1. **DO NOT** add `cwd` to `ParsedObservation` - it comes from message, not agent response
|
||||
2. **DO NOT** use `process.cwd()` for project-specific paths
|
||||
3. **DO NOT** assume file paths are absolute - they are relative from agent response
|
||||
4. **DO NOT** modify the parser - file paths come from agent XML output
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Add `projectRoot` Parameter to `updateFolderClaudeMdFiles`
|
||||
|
||||
### What to implement
|
||||
|
||||
Modify the function signature to accept an optional `projectRoot` parameter for resolving relative paths to absolute paths.
|
||||
|
||||
### Files to modify
|
||||
|
||||
**File: `src/utils/claude-md-utils.ts`**
|
||||
|
||||
**Location: Lines 206-210 (function signature)**
|
||||
|
||||
Current:
|
||||
```typescript
|
||||
export async function updateFolderClaudeMdFiles(
|
||||
filePaths: string[],
|
||||
project: string,
|
||||
port: number
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
New:
|
||||
```typescript
|
||||
export async function updateFolderClaudeMdFiles(
|
||||
filePaths: string[],
|
||||
project: string,
|
||||
port: number,
|
||||
projectRoot?: string
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
**Location: Lines 215-228 (folder extraction logic)**
|
||||
|
||||
Current:
|
||||
```typescript
|
||||
const folderPaths = new Set<string>();
|
||||
for (const filePath of filePaths) {
|
||||
if (!filePath || filePath === '') continue;
|
||||
const folderPath = path.dirname(filePath);
|
||||
if (folderPath && folderPath !== '.' && folderPath !== '/') {
|
||||
if (isProjectRoot(folderPath)) {
|
||||
logger.debug('FOLDER_INDEX', 'Skipping project root CLAUDE.md', { folderPath });
|
||||
continue;
|
||||
}
|
||||
folderPaths.add(folderPath);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
New:
|
||||
```typescript
|
||||
const folderPaths = new Set<string>();
|
||||
for (const filePath of filePaths) {
|
||||
if (!filePath || filePath === '') continue;
|
||||
|
||||
// Resolve relative paths to absolute using projectRoot
|
||||
let absoluteFilePath = filePath;
|
||||
if (projectRoot && !path.isAbsolute(filePath)) {
|
||||
absoluteFilePath = path.join(projectRoot, filePath);
|
||||
}
|
||||
|
||||
const folderPath = path.dirname(absoluteFilePath);
|
||||
if (folderPath && folderPath !== '.' && folderPath !== '/') {
|
||||
if (isProjectRoot(folderPath)) {
|
||||
logger.debug('FOLDER_INDEX', 'Skipping project root CLAUDE.md', { folderPath });
|
||||
continue;
|
||||
}
|
||||
folderPaths.add(folderPath);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Documentation references
|
||||
|
||||
- Pattern for `path.isAbsolute()`: Standard Node.js path module
|
||||
- Pattern for `path.join(base, relative)`: Used throughout `src/shared/paths.ts`
|
||||
|
||||
### Verification checklist
|
||||
|
||||
1. [ ] `grep -n "updateFolderClaudeMdFiles" src/utils/claude-md-utils.ts` shows new signature
|
||||
2. [ ] `grep -n "path.isAbsolute" src/utils/claude-md-utils.ts` confirms new check added
|
||||
3. [ ] `grep -n "projectRoot" src/utils/claude-md-utils.ts` shows parameter usage
|
||||
4. [ ] Existing callers still compile (optional param is backward compatible)
|
||||
|
||||
### Anti-pattern guards
|
||||
|
||||
- **DO NOT** make `projectRoot` required - breaks existing callers
|
||||
- **DO NOT** use `process.cwd()` as default - defeats purpose of fix
|
||||
- **DO NOT** modify the API endpoint format - path resolution is caller's responsibility
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Pass `cwd` from Message to `updateFolderClaudeMdFiles`
|
||||
|
||||
### What to implement
|
||||
|
||||
Extract `cwd` from the original messages being processed and pass it to `updateFolderClaudeMdFiles`.
|
||||
|
||||
### Challenge
|
||||
|
||||
The `syncAndBroadcastObservations` function receives `ParsedObservation[]` which does NOT include `cwd`. The `cwd` is in the original `PendingMessage` but is consumed during prompt generation.
|
||||
|
||||
### Solution
|
||||
|
||||
Add `projectRoot` parameter to `syncAndBroadcastObservations` and `processAgentResponse`, sourced from `session` or passed through from message processing.
|
||||
|
||||
### Files to modify
|
||||
|
||||
**File: `src/services/worker/agents/ResponseProcessor.ts`**
|
||||
|
||||
**Step 1: Update `processAgentResponse` signature (lines 46-55)**
|
||||
|
||||
Current:
|
||||
```typescript
|
||||
export async function processAgentResponse(
|
||||
text: string,
|
||||
session: ActiveSession,
|
||||
dbManager: DatabaseManager,
|
||||
sessionManager: SessionManager,
|
||||
worker: WorkerRef | undefined,
|
||||
discoveryTokens: number,
|
||||
originalTimestamp: number | null,
|
||||
agentName: string
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
New:
|
||||
```typescript
|
||||
export async function processAgentResponse(
|
||||
text: string,
|
||||
session: ActiveSession,
|
||||
dbManager: DatabaseManager,
|
||||
sessionManager: SessionManager,
|
||||
worker: WorkerRef | undefined,
|
||||
discoveryTokens: number,
|
||||
originalTimestamp: number | null,
|
||||
agentName: string,
|
||||
projectRoot?: string
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
**Step 2: Pass `projectRoot` to `syncAndBroadcastObservations` (line 101-109)**
|
||||
|
||||
Current:
|
||||
```typescript
|
||||
await syncAndBroadcastObservations(
|
||||
observations,
|
||||
result,
|
||||
session,
|
||||
dbManager,
|
||||
worker,
|
||||
discoveryTokens,
|
||||
agentName
|
||||
);
|
||||
```
|
||||
|
||||
New:
|
||||
```typescript
|
||||
await syncAndBroadcastObservations(
|
||||
observations,
|
||||
result,
|
||||
session,
|
||||
dbManager,
|
||||
worker,
|
||||
discoveryTokens,
|
||||
agentName,
|
||||
projectRoot
|
||||
);
|
||||
```
|
||||
|
||||
**Step 3: Update `syncAndBroadcastObservations` signature (lines 153-161)**
|
||||
|
||||
Current:
|
||||
```typescript
|
||||
async function syncAndBroadcastObservations(
|
||||
observations: ParsedObservation[],
|
||||
result: StorageResult,
|
||||
session: ActiveSession,
|
||||
dbManager: DatabaseManager,
|
||||
worker: WorkerRef | undefined,
|
||||
discoveryTokens: number,
|
||||
agentName: string
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
New:
|
||||
```typescript
|
||||
async function syncAndBroadcastObservations(
|
||||
observations: ParsedObservation[],
|
||||
result: StorageResult,
|
||||
session: ActiveSession,
|
||||
dbManager: DatabaseManager,
|
||||
worker: WorkerRef | undefined,
|
||||
discoveryTokens: number,
|
||||
agentName: string,
|
||||
projectRoot?: string
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
**Step 4: Update `updateFolderClaudeMdFiles` call (lines 222-229)**
|
||||
|
||||
Current:
|
||||
```typescript
|
||||
if (allFilePaths.length > 0) {
|
||||
updateFolderClaudeMdFiles(
|
||||
allFilePaths,
|
||||
session.project,
|
||||
getWorkerPort()
|
||||
).catch(error => {
|
||||
logger.warn('FOLDER_INDEX', 'CLAUDE.md update failed (non-critical)', { project: session.project }, error as Error);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
New:
|
||||
```typescript
|
||||
if (allFilePaths.length > 0) {
|
||||
updateFolderClaudeMdFiles(
|
||||
allFilePaths,
|
||||
session.project,
|
||||
getWorkerPort(),
|
||||
projectRoot
|
||||
).catch(error => {
|
||||
logger.warn('FOLDER_INDEX', 'CLAUDE.md update failed (non-critical)', { project: session.project }, error as Error);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### Verification checklist
|
||||
|
||||
1. [ ] `grep -n "projectRoot" src/services/worker/agents/ResponseProcessor.ts` shows parameter throughout
|
||||
2. [ ] `grep -n "processAgentResponse" src/services/worker/*.ts` to find all callers
|
||||
3. [ ] TypeScript compiles without errors
|
||||
|
||||
### Anti-pattern guards
|
||||
|
||||
- **DO NOT** extract `cwd` from `ParsedObservation` - it doesn't have one
|
||||
- **DO NOT** store `cwd` on session globally - messages may come from different cwds (edge case)
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Update Agent Callers to Pass `cwd`
|
||||
|
||||
### What to implement
|
||||
|
||||
Update SDKAgent, GeminiAgent, and OpenRouterAgent to pass `message.cwd` to `processAgentResponse`.
|
||||
|
||||
### Files to modify
|
||||
|
||||
**File: `src/services/worker/SDKAgent.ts`**
|
||||
|
||||
Find the `processAgentResponse` call and add the `projectRoot` parameter from `message.cwd`.
|
||||
|
||||
**Pattern to follow (from SDKAgent.ts:289-296):**
|
||||
```typescript
|
||||
const obsPrompt = buildObservationPrompt({
|
||||
id: 0,
|
||||
tool_name: message.tool_name!,
|
||||
tool_input: JSON.stringify(message.tool_input),
|
||||
tool_output: JSON.stringify(message.tool_response),
|
||||
created_at_epoch: Date.now(),
|
||||
cwd: message.cwd // <-- This is available
|
||||
});
|
||||
```
|
||||
|
||||
**Challenge:** `processAgentResponse` is called after the SDK response, not in the message loop. Need to track `lastCwd` from messages.
|
||||
|
||||
**Solution:** Store `lastCwd` from messages being processed and pass to `processAgentResponse`.
|
||||
|
||||
**File: `src/services/worker/GeminiAgent.ts`** - Same pattern
|
||||
**File: `src/services/worker/OpenRouterAgent.ts`** - Same pattern
|
||||
|
||||
### Implementation pattern for each agent
|
||||
|
||||
Add tracking variable:
|
||||
```typescript
|
||||
let lastCwd: string | undefined;
|
||||
```
|
||||
|
||||
In message loop, capture cwd:
|
||||
```typescript
|
||||
if (message.cwd) {
|
||||
lastCwd = message.cwd;
|
||||
}
|
||||
```
|
||||
|
||||
In `processAgentResponse` call:
|
||||
```typescript
|
||||
await processAgentResponse(
|
||||
responseText,
|
||||
session,
|
||||
this.dbManager,
|
||||
this.sessionManager,
|
||||
worker,
|
||||
discoveryTokens,
|
||||
originalTimestamp,
|
||||
'SDK', // or 'Gemini' or 'OpenRouter'
|
||||
lastCwd
|
||||
);
|
||||
```
|
||||
|
||||
### Verification checklist
|
||||
|
||||
1. [ ] `grep -n "lastCwd" src/services/worker/SDKAgent.ts` shows tracking
|
||||
2. [ ] `grep -n "lastCwd" src/services/worker/GeminiAgent.ts` shows tracking
|
||||
3. [ ] `grep -n "lastCwd" src/services/worker/OpenRouterAgent.ts` shows tracking
|
||||
4. [ ] `grep -n "processAgentResponse.*lastCwd" src/services/worker/` shows all calls updated
|
||||
|
||||
### Anti-pattern guards
|
||||
|
||||
- **DO NOT** use `session.cwd` - sessions can have messages from multiple cwds
|
||||
- **DO NOT** default to `process.cwd()` - defeats the fix
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Update Tests
|
||||
|
||||
### What to implement
|
||||
|
||||
Update existing tests and add new tests for the `projectRoot` functionality.
|
||||
|
||||
### Files to modify
|
||||
|
||||
**File: `tests/utils/claude-md-utils.test.ts`**
|
||||
|
||||
Add test cases for:
|
||||
1. Relative paths with `projectRoot` resolve correctly
|
||||
2. Absolute paths ignore `projectRoot`
|
||||
3. Missing `projectRoot` maintains backward compatibility
|
||||
|
||||
### Test pattern to copy
|
||||
|
||||
From `tests/utils/claude-md-utils.test.ts:245-266` (folder deduplication test):
|
||||
```typescript
|
||||
it('should deduplicate folders from multiple files', async () => {
|
||||
mockFetch.mockResolvedValue({
|
||||
ok: true,
|
||||
json: () => Promise.resolve({ content: [{ text: mockApiResponse }] })
|
||||
});
|
||||
|
||||
await updateFolderClaudeMdFiles(
|
||||
['/project/src/utils/file1.ts', '/project/src/utils/file2.ts'],
|
||||
'test-project',
|
||||
37777
|
||||
);
|
||||
|
||||
// Should only call API once for the deduplicated folder
|
||||
expect(mockFetch).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
```
|
||||
|
||||
### New test to add
|
||||
|
||||
```typescript
|
||||
it('should resolve relative paths using projectRoot', async () => {
|
||||
mockFetch.mockResolvedValue({
|
||||
ok: true,
|
||||
json: () => Promise.resolve({ content: [{ text: mockApiResponse }] })
|
||||
});
|
||||
|
||||
await updateFolderClaudeMdFiles(
|
||||
['src/utils/file.ts'], // relative path
|
||||
'test-project',
|
||||
37777,
|
||||
'/home/user/my-project' // projectRoot
|
||||
);
|
||||
|
||||
// Should write to absolute path /home/user/my-project/src/utils/CLAUDE.md
|
||||
expect(mockWriteClaudeMd).toHaveBeenCalledWith(
|
||||
'/home/user/my-project/src/utils',
|
||||
expect.any(String)
|
||||
);
|
||||
});
|
||||
```
|
||||
|
||||
### Verification checklist
|
||||
|
||||
1. [ ] `bun test tests/utils/claude-md-utils.test.ts` passes
|
||||
2. [ ] New test case for `projectRoot` exists and passes
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Final Verification
|
||||
|
||||
### Verification commands
|
||||
|
||||
```bash
|
||||
# 1. Confirm new parameter exists
|
||||
grep -n "projectRoot" src/utils/claude-md-utils.ts
|
||||
grep -n "projectRoot" src/services/worker/agents/ResponseProcessor.ts
|
||||
grep -n "lastCwd" src/services/worker/SDKAgent.ts
|
||||
|
||||
# 2. Confirm path.isAbsolute check added
|
||||
grep -n "path.isAbsolute" src/utils/claude-md-utils.ts
|
||||
|
||||
# 3. Confirm all agents updated
|
||||
grep -n "processAgentResponse.*lastCwd" src/services/worker/*.ts
|
||||
|
||||
# 4. Run tests
|
||||
bun test tests/utils/claude-md-utils.test.ts
|
||||
|
||||
# 5. Build and verify no TypeScript errors
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Anti-pattern grep checks
|
||||
|
||||
```bash
|
||||
# Should NOT find process.cwd() in updateFolderClaudeMdFiles path logic
|
||||
grep -n "process.cwd" src/utils/claude-md-utils.ts
|
||||
|
||||
# Should NOT find cwd in ParsedObservation interface
|
||||
grep -A 10 "interface ParsedObservation" src/sdk/parser.ts | grep cwd
|
||||
```
|
||||
|
||||
### Manual testing
|
||||
|
||||
1. Start worker in one directory
|
||||
2. Run Claude Code in a different directory (worktree)
|
||||
3. Make a code change that creates an observation
|
||||
4. Verify CLAUDE.md is written to the correct project directory
|
||||
|
||||
---
|
||||
|
||||
## Summary of Changes
|
||||
|
||||
| File | Change |
|
||||
|------|--------|
|
||||
| `src/utils/claude-md-utils.ts` | Add `projectRoot` param, resolve relative paths |
|
||||
| `src/services/worker/agents/ResponseProcessor.ts` | Pass `projectRoot` through call chain |
|
||||
| `src/services/worker/SDKAgent.ts` | Track `lastCwd`, pass to `processAgentResponse` |
|
||||
| `src/services/worker/GeminiAgent.ts` | Track `lastCwd`, pass to `processAgentResponse` |
|
||||
| `src/services/worker/OpenRouterAgent.ts` | Track `lastCwd`, pass to `processAgentResponse` |
|
||||
| `tests/utils/claude-md-utils.test.ts` | Add tests for `projectRoot` behavior |
|
||||
@@ -1,252 +0,0 @@
|
||||
# Plan: Fix Stale Session Resume Crash
|
||||
|
||||
## Problem Summary
|
||||
|
||||
The worker crashes repeatedly with "Claude Code process exited with code 1" when attempting to resume into a stale/non-existent SDK session.
|
||||
|
||||
**Root Cause:** In `SDKAgent.ts:94`, the resume parameter is passed whenever `memorySessionId` exists in the database, regardless of whether this is an INIT prompt or CONTINUATION prompt. When a worker restarts or re-initializes a session, it loads a stale `memorySessionId` from a previous SDK session and tries to resume into a session that no longer exists in Claude's context.
|
||||
|
||||
**Evidence from logs:**
|
||||
```
|
||||
[17:30:21.773] Starting SDK query {
|
||||
hasRealMemorySessionId=true, ← DB has old memorySessionId
|
||||
resume_parameter=5439891b-..., ← Trying to resume with it
|
||||
lastPromptNumber=1 ← But this is a NEW SDK session!
|
||||
}
|
||||
[17:30:24.450] Generator failed {error=Claude Code process exited with code 1}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Documentation Discovery (COMPLETED)
|
||||
|
||||
### Allowed APIs (from subagent research)
|
||||
|
||||
**V1 SDK API (currently used):**
|
||||
```typescript
|
||||
// From @anthropic-ai/claude-agent-sdk
|
||||
function query(options: {
|
||||
prompt: string | AsyncIterable<SDKUserMessage>;
|
||||
options: {
|
||||
model: string;
|
||||
resume?: string; // SESSION ID - only use for CONTINUATION
|
||||
disallowedTools?: string[];
|
||||
abortController?: AbortController;
|
||||
pathToClaudeCodeExecutable?: string;
|
||||
}
|
||||
}): AsyncIterable<SDKMessage>
|
||||
```
|
||||
|
||||
**Resume Parameter Rules (from docs/context/agent-sdk-v2-preview.md and SESSION_ID_ARCHITECTURE.md):**
|
||||
- `resume` should only be used when continuing an existing SDK conversation
|
||||
- For INIT prompts (first prompt in a fresh SDK session), no resume parameter should be passed
|
||||
- Session ID is captured from first SDK message and stored for subsequent prompts
|
||||
|
||||
### Anti-Patterns to Avoid
|
||||
- Passing `resume` parameter with INIT prompts (causes crash)
|
||||
- Using `contentSessionId` for resume (contaminates user session)
|
||||
- Assuming memorySessionId validity without checking prompt context
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Fix the Resume Parameter Logic
|
||||
|
||||
### What to Implement
|
||||
|
||||
Modify `src/services/worker/SDKAgent.ts` line 94 to check BOTH conditions:
|
||||
1. `hasRealMemorySessionId` - memorySessionId exists and is non-null
|
||||
2. `session.lastPromptNumber > 1` - this is a CONTINUATION, not an INIT prompt
|
||||
|
||||
### Current Code (line 89-99):
|
||||
```typescript
|
||||
const queryResult = query({
|
||||
prompt: messageGenerator,
|
||||
options: {
|
||||
model: modelId,
|
||||
// Resume with captured memorySessionId (null on first prompt, real ID on subsequent)
|
||||
...(hasRealMemorySessionId && { resume: session.memorySessionId }),
|
||||
disallowedTools,
|
||||
abortController: session.abortController,
|
||||
pathToClaudeCodeExecutable: claudePath
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### Fixed Code:
|
||||
```typescript
|
||||
const queryResult = query({
|
||||
prompt: messageGenerator,
|
||||
options: {
|
||||
model: modelId,
|
||||
// Only resume if BOTH: (1) we have a memorySessionId AND (2) this isn't the first prompt
|
||||
// On worker restart, memorySessionId may exist from a previous SDK session but we
|
||||
// need to start fresh since the SDK context was lost
|
||||
...(hasRealMemorySessionId && session.lastPromptNumber > 1 && { resume: session.memorySessionId }),
|
||||
disallowedTools,
|
||||
abortController: session.abortController,
|
||||
pathToClaudeCodeExecutable: claudePath
|
||||
}
|
||||
});
|
||||
```
|
||||
|
||||
### Also Update the Comment at Line 66-68:
|
||||
```typescript
|
||||
// CRITICAL: Only resume if:
|
||||
// 1. memorySessionId exists (was captured from a previous SDK response)
|
||||
// 2. lastPromptNumber > 1 (this is a continuation within the same SDK session)
|
||||
// On worker restart or crash recovery, memorySessionId may exist from a previous
|
||||
// SDK session but we must NOT resume because the SDK context was lost.
|
||||
// NEVER use contentSessionId for resume - that would inject messages into the user's transcript!
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] `grep "hasRealMemorySessionId && session.lastPromptNumber > 1" src/services/worker/SDKAgent.ts` returns the fix
|
||||
- [ ] Build succeeds: `npm run build`
|
||||
- [ ] No TypeScript errors
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Add Logging for Debugging
|
||||
|
||||
### What to Implement
|
||||
|
||||
Enhance the alignment log at line 81-85 to clearly indicate when resume is skipped due to INIT prompt:
|
||||
|
||||
```typescript
|
||||
// Debug-level alignment logs for detailed tracing
|
||||
if (session.lastPromptNumber > 1) {
|
||||
const willResume = hasRealMemorySessionId;
|
||||
logger.debug('SDK', `[ALIGNMENT] Resume Decision | contentSessionId=${session.contentSessionId} | memorySessionId=${session.memorySessionId} | prompt#=${session.lastPromptNumber} | hasRealMemorySessionId=${hasRealMemorySessionId} | willResume=${willResume} | resumeWith=${willResume ? session.memorySessionId : 'NONE'}`);
|
||||
} else {
|
||||
// INIT prompt - never resume even if memorySessionId exists (stale from previous session)
|
||||
const hasStaleMemoryId = hasRealMemorySessionId;
|
||||
logger.debug('SDK', `[ALIGNMENT] First Prompt (INIT) | contentSessionId=${session.contentSessionId} | prompt#=${session.lastPromptNumber} | hasStaleMemoryId=${hasStaleMemoryId} | action=START_FRESH | Will capture new memorySessionId from SDK response`);
|
||||
if (hasStaleMemoryId) {
|
||||
logger.warn('SDK', `Skipping resume for INIT prompt despite existing memorySessionId=${session.memorySessionId} - SDK context was lost (worker restart or crash recovery)`);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] Build succeeds: `npm run build`
|
||||
- [ ] Log message appears when running with stale session scenario
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Add Unit Tests
|
||||
|
||||
### What to Implement
|
||||
|
||||
Create tests in `tests/sdk-agent-resume.test.ts` following patterns from `tests/session_id_usage_validation.test.ts`:
|
||||
|
||||
```typescript
|
||||
import { describe, it, expect, beforeEach, afterEach, mock } from 'bun:test';
|
||||
|
||||
describe('SDKAgent Resume Parameter Logic', () => {
|
||||
describe('hasRealMemorySessionId check', () => {
|
||||
it('should NOT pass resume parameter when lastPromptNumber === 1 even if memorySessionId exists', () => {
|
||||
// Scenario: Worker restart with stale memorySessionId
|
||||
const session = {
|
||||
memorySessionId: 'stale-session-id-from-previous-run',
|
||||
lastPromptNumber: 1, // INIT prompt
|
||||
};
|
||||
|
||||
const hasRealMemorySessionId = !!session.memorySessionId;
|
||||
const shouldResume = hasRealMemorySessionId && session.lastPromptNumber > 1;
|
||||
|
||||
expect(hasRealMemorySessionId).toBe(true); // memorySessionId exists
|
||||
expect(shouldResume).toBe(false); // but should NOT resume
|
||||
});
|
||||
|
||||
it('should pass resume parameter when lastPromptNumber > 1 AND memorySessionId exists', () => {
|
||||
// Scenario: Normal continuation within same SDK session
|
||||
const session = {
|
||||
memorySessionId: 'valid-session-id',
|
||||
lastPromptNumber: 2, // CONTINUATION prompt
|
||||
};
|
||||
|
||||
const hasRealMemorySessionId = !!session.memorySessionId;
|
||||
const shouldResume = hasRealMemorySessionId && session.lastPromptNumber > 1;
|
||||
|
||||
expect(hasRealMemorySessionId).toBe(true);
|
||||
expect(shouldResume).toBe(true);
|
||||
});
|
||||
|
||||
it('should NOT pass resume parameter when memorySessionId is null', () => {
|
||||
// Scenario: Fresh session, no captured ID yet
|
||||
const session = {
|
||||
memorySessionId: null,
|
||||
lastPromptNumber: 1,
|
||||
};
|
||||
|
||||
const hasRealMemorySessionId = !!session.memorySessionId;
|
||||
const shouldResume = hasRealMemorySessionId && session.lastPromptNumber > 1;
|
||||
|
||||
expect(hasRealMemorySessionId).toBe(false);
|
||||
expect(shouldResume).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
### Documentation Reference
|
||||
- Pattern: `tests/session_id_usage_validation.test.ts` lines 1-50 for test structure
|
||||
- Mock pattern: `tests/worker/agents/response-processor.test.ts` for session mocking
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] Tests pass: `bun test tests/sdk-agent-resume.test.ts`
|
||||
- [ ] Test file follows project conventions
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Build and Deploy
|
||||
|
||||
### What to Implement
|
||||
|
||||
1. Build the plugin: `npm run build-and-sync`
|
||||
2. Verify worker restarts with fix applied
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] `npm run build-and-sync` succeeds
|
||||
- [ ] Worker health check passes: `curl http://localhost:37777/api/health`
|
||||
- [ ] No "Claude Code process exited with code 1" errors in logs after restart
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Final Verification
|
||||
|
||||
### Verification Commands
|
||||
|
||||
```bash
|
||||
# 1. Verify fix is in place
|
||||
grep -n "hasRealMemorySessionId && session.lastPromptNumber > 1" src/services/worker/SDKAgent.ts
|
||||
|
||||
# 2. Verify no crashes in recent logs
|
||||
tail -100 ~/.claude-mem/logs/claude-mem-$(date +%Y-%m-%d).log | grep -c "exited with code 1"
|
||||
|
||||
# 3. Run tests
|
||||
bun test tests/sdk-agent-resume.test.ts
|
||||
|
||||
# 4. Check for anti-patterns (should return 0 results)
|
||||
grep -n "hasRealMemorySessionId && { resume" src/services/worker/SDKAgent.ts
|
||||
```
|
||||
|
||||
### Success Criteria
|
||||
- [ ] Fix in place at SDKAgent.ts:94
|
||||
- [ ] Zero "exited with code 1" errors related to stale resume
|
||||
- [ ] All tests pass
|
||||
- [ ] Worker stable for 10+ minutes without crash loop
|
||||
|
||||
---
|
||||
|
||||
## Files to Modify
|
||||
|
||||
1. `src/services/worker/SDKAgent.ts` - Fix resume logic (Phase 1 & 2)
|
||||
2. `tests/sdk-agent-resume.test.ts` - New test file (Phase 3)
|
||||
|
||||
## Estimated Complexity
|
||||
|
||||
- **Phase 1**: Low - Single line change with updated condition
|
||||
- **Phase 2**: Low - Enhanced logging
|
||||
- **Phase 3**: Medium - New test file following existing patterns
|
||||
- **Phase 4-5**: Low - Standard build/verify process
|
||||
@@ -1,298 +0,0 @@
|
||||
# Folder CLAUDE.md Generator
|
||||
|
||||
## CORE DIRECTIVE (NON-NEGOTIABLE)
|
||||
|
||||
**EXTEND THE EXISTING CURSOR RULES TIMELINE GENERATION SYSTEM TO ALSO WRITE CLAUDE.MD FILES**
|
||||
|
||||
- DO NOT create new services
|
||||
- DO NOT create new orchestrators
|
||||
- DO NOT create new HTTP routes
|
||||
- DO NOT create new database query functions
|
||||
- EXTEND existing functions to add folder-level output
|
||||
|
||||
---
|
||||
|
||||
## Approved Directives (From Planning Conversation)
|
||||
|
||||
### Trigger Mechanism
|
||||
- Observation save triggers folder CLAUDE.md regeneration **INLINE**
|
||||
- NO batching
|
||||
- NO debouncing
|
||||
- NO Set-based queuing
|
||||
- NO session-end hook
|
||||
- Synchronous: `observation.save()` → update folder CLAUDE.md files → done
|
||||
|
||||
### Tag Strategy
|
||||
- Wrap ONLY auto-generated content with `<claude-mem-context>` tags
|
||||
- Everything outside tags is untouched (user's manual content preserved)
|
||||
- If tags are deleted, just regenerate them
|
||||
- NO backup system
|
||||
- NO manual content markers
|
||||
|
||||
### Git Behavior
|
||||
- CLAUDE.md files SHOULD be committed (intentional)
|
||||
- `<claude-mem-context>` tag is searchable fingerprint for GitHub analytics
|
||||
- NO .gitignore for these files
|
||||
|
||||
### Phasing
|
||||
- **Phase 1**: CLAUDE.md generation only (THIS PLAN)
|
||||
- **Phase 2**: IDE symlinks (FUTURE)
|
||||
|
||||
### REJECTED
|
||||
- Cross-folder linking — NO
|
||||
- Semantic grouping — deferred enhancement only
|
||||
- Team sync — future phase
|
||||
|
||||
### DEFERRED
|
||||
- Priority weighting by observation type
|
||||
- IDE-specific template refinements
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Documentation Discovery (COMPLETED)
|
||||
|
||||
### Existing APIs to USE (Not Rebuild)
|
||||
|
||||
| Function | Location | Purpose |
|
||||
|----------|----------|---------|
|
||||
| `findByFile(filePath, options)` | `src/services/sqlite/SessionSearch.ts:342` | Query observations by folder prefix (already supports LIKE wildcards) |
|
||||
| `updateCursorContextForProject()` | `src/services/integrations/CursorHooksInstaller.ts:98` | Write context files after observation save |
|
||||
| `writeContextFile()` | `src/utils/cursor-utils.ts:97` | Atomic file write with temp file + rename |
|
||||
| `extractFirstFile()` | `src/shared/timeline-formatting.ts` | Extract file paths from JSON arrays |
|
||||
| `groupByDate()` | `src/shared/timeline-formatting.ts` | Group items chronologically |
|
||||
| `formatTime()`, `formatDate()` | `src/shared/timeline-formatting.ts` | Time formatting |
|
||||
|
||||
### Existing Integration Points
|
||||
|
||||
| Location | What Happens | Extension Point |
|
||||
|----------|--------------|-----------------|
|
||||
| `ResponseProcessor.ts:266` | Calls `updateCursorContextForProject()` after summary save | Add folder CLAUDE.md update here |
|
||||
| `CursorHooksInstaller.ts:98` | `updateCursorContextForProject()` fetches context and writes file | Add sibling function for folder updates |
|
||||
|
||||
### Anti-Patterns to AVOID
|
||||
- Creating `FolderIndexOrchestrator.ts` — NO
|
||||
- Creating `FolderTimelineCompiler.ts` — NO
|
||||
- Creating `FolderDiscovery.ts` — NO
|
||||
- Creating `ClaudeMdGenerator.ts` — NO
|
||||
- Creating `FolderIndexRoutes.ts` — NO
|
||||
- Adding new HTTP endpoints — NO
|
||||
- Adding new settings in `SettingsDefaultsManager.ts` — NO (use sensible defaults inline)
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Extend CursorHooksInstaller
|
||||
|
||||
### What to Implement
|
||||
|
||||
Add ONE new function to `src/services/integrations/CursorHooksInstaller.ts`:
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Update CLAUDE.md files for folders touched by an observation.
|
||||
* Called inline after observation save, similar to updateCursorContextForProject.
|
||||
*/
|
||||
export async function updateFolderClaudeMd(
|
||||
workspacePath: string,
|
||||
filesModified: string[],
|
||||
filesRead: string[],
|
||||
project: string,
|
||||
port: number
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
### Implementation Pattern (Copy From)
|
||||
|
||||
Follow the EXACT pattern of `updateCursorContextForProject()` at line 98:
|
||||
1. Extract unique folder paths from filesModified and filesRead
|
||||
2. For each folder, fetch timeline via existing `/api/search/file?files=<folderPath>` endpoint
|
||||
3. Format as simple timeline (reuse existing formatters)
|
||||
4. Write to `<folder>/CLAUDE.md` preserving content outside `<claude-mem-context>` tags
|
||||
|
||||
### Tag Preservation Logic
|
||||
|
||||
```typescript
|
||||
function replaceTaggedContent(existingContent: string, newContent: string): string {
|
||||
const startTag = '<claude-mem-context>';
|
||||
const endTag = '</claude-mem-context>';
|
||||
|
||||
// If no existing content, wrap new content in tags
|
||||
if (!existingContent) {
|
||||
return `${startTag}\n${newContent}\n${endTag}`;
|
||||
}
|
||||
|
||||
// If existing has tags, replace only tagged section
|
||||
const startIdx = existingContent.indexOf(startTag);
|
||||
const endIdx = existingContent.indexOf(endTag);
|
||||
|
||||
if (startIdx !== -1 && endIdx !== -1) {
|
||||
return existingContent.substring(0, startIdx) +
|
||||
`${startTag}\n${newContent}\n${endTag}` +
|
||||
existingContent.substring(endIdx + endTag.length);
|
||||
}
|
||||
|
||||
// If no tags exist, append tagged content at end
|
||||
return existingContent + `\n\n${startTag}\n${newContent}\n${endTag}`;
|
||||
}
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] Function added to CursorHooksInstaller.ts
|
||||
- [ ] Uses existing `findByFile` endpoint (no new database queries)
|
||||
- [ ] Preserves content outside `<claude-mem-context>` tags
|
||||
- [ ] Atomic writes (temp file + rename)
|
||||
- [ ] Build passes: `npm run build`
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Hook Into ResponseProcessor
|
||||
|
||||
### What to Implement
|
||||
|
||||
Add call to `updateFolderClaudeMd()` in `src/services/worker/agents/ResponseProcessor.ts`, right after the existing `updateCursorContextForProject()` call at line 266.
|
||||
|
||||
### Code Location
|
||||
|
||||
In `syncAndBroadcastSummary()` function, after line 269:
|
||||
|
||||
```typescript
|
||||
// EXISTING: Update Cursor context file for registered projects (fire-and-forget)
|
||||
updateCursorContextForProject(session.project, getWorkerPort()).catch(error => {
|
||||
logger.warn('CURSOR', 'Context update failed (non-critical)', { project: session.project }, error as Error);
|
||||
});
|
||||
|
||||
// NEW: Update folder CLAUDE.md files for touched folders (fire-and-forget)
|
||||
// Extract file paths from the saved observations
|
||||
updateFolderClaudeMd(
|
||||
workspacePath, // From registry lookup
|
||||
filesModified, // From observations
|
||||
filesRead, // From observations
|
||||
session.project,
|
||||
getWorkerPort()
|
||||
).catch(error => {
|
||||
logger.warn('FOLDER_INDEX', 'CLAUDE.md update failed (non-critical)', { project: session.project }, error as Error);
|
||||
});
|
||||
```
|
||||
|
||||
### Data Flow
|
||||
1. `processAgentResponse()` saves observations → gets back `observationIds`
|
||||
2. Fetch observation records to get `files_read` and `files_modified`
|
||||
3. Pass to `updateFolderClaudeMd()`
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] Call added to ResponseProcessor.ts
|
||||
- [ ] Fire-and-forget pattern (non-blocking, errors logged)
|
||||
- [ ] Uses existing observation data (no new queries)
|
||||
- [ ] Build passes: `npm run build`
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Timeline Formatting
|
||||
|
||||
### What to Implement
|
||||
|
||||
Create a minimal timeline formatter for CLAUDE.md output. This can be:
|
||||
1. A simple function in CursorHooksInstaller.ts, OR
|
||||
2. Reuse existing `ResultFormatter.formatSearchResults()` from `src/services/worker/search/ResultFormatter.ts`
|
||||
|
||||
### Output Format
|
||||
|
||||
```markdown
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
<claude-mem-context>
|
||||
|
||||
### 2026-01-04
|
||||
|
||||
| Time | Type | Title |
|
||||
|------|------|-------|
|
||||
| 4:30pm | feature | Added folder index support |
|
||||
| 3:15pm | bugfix | Fixed file path handling |
|
||||
|
||||
### 2026-01-03
|
||||
|
||||
| Time | Type | Title |
|
||||
|------|------|-------|
|
||||
| 11:00am | refactor | Cleaned up cursor utils |
|
||||
|
||||
</claude-mem-context>
|
||||
```
|
||||
|
||||
### Key Points
|
||||
- Compact format (time, type emoji, title only)
|
||||
- Grouped by date
|
||||
- Limited to last N days or observations (sensible default: 10)
|
||||
- NO token counts
|
||||
- NO file columns (redundant - we're IN the folder)
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] Formatter produces clean markdown
|
||||
- [ ] Output is concise (not verbose)
|
||||
- [ ] Grouped by date
|
||||
- [ ] Build passes: `npm run build`
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Verification
|
||||
|
||||
### Functional Tests
|
||||
|
||||
1. **Manual Test**:
|
||||
- Start worker: `npm run dev`
|
||||
- Create a test observation touching `src/services/sqlite/`
|
||||
- Verify `src/services/sqlite/CLAUDE.md` is created/updated
|
||||
- Verify `<claude-mem-context>` tags are present
|
||||
- Verify manual content outside tags is preserved
|
||||
|
||||
2. **Build Check**:
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
3. **Grep for Anti-Patterns**:
|
||||
```bash
|
||||
# Should find NOTHING
|
||||
grep -r "FolderIndexOrchestrator" src/
|
||||
grep -r "FolderTimelineCompiler" src/
|
||||
grep -r "FolderDiscovery" src/
|
||||
grep -r "ClaudeMdGenerator" src/
|
||||
grep -r "FolderIndexRoutes" src/
|
||||
```
|
||||
|
||||
4. **Grep for Correct Implementation**:
|
||||
```bash
|
||||
# Should find the new function
|
||||
grep -r "updateFolderClaudeMd" src/
|
||||
```
|
||||
|
||||
### Tag Preservation Test
|
||||
|
||||
1. Create `src/test-folder/CLAUDE.md` with manual content:
|
||||
```markdown
|
||||
# My Notes
|
||||
This is manual content I wrote.
|
||||
```
|
||||
|
||||
2. Trigger observation save touching files in `src/test-folder/`
|
||||
|
||||
3. Verify result:
|
||||
```markdown
|
||||
# My Notes
|
||||
This is manual content I wrote.
|
||||
|
||||
<claude-mem-context>
|
||||
### 2026-01-04
|
||||
| Time | Type | Title |
|
||||
...
|
||||
</claude-mem-context>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
This is a **~100 line change** spread across 2 files:
|
||||
1. `CursorHooksInstaller.ts` — Add `updateFolderClaudeMd()` function (~60 lines)
|
||||
2. `ResponseProcessor.ts` — Add call to the new function (~10 lines)
|
||||
|
||||
NO new files. NO new services. NO new routes. Just extending existing patterns.
|
||||
@@ -1,378 +0,0 @@
|
||||
# Folder CLAUDE.md Refactor - Extract to Shared Utils
|
||||
|
||||
## CORE DIRECTIVE
|
||||
|
||||
**DECOUPLE FOLDER CLAUDE.MD WRITING FROM CURSOR INTEGRATION**
|
||||
|
||||
The current implementation incorrectly couples folder-level CLAUDE.md generation to Cursor-specific registry lookups. The file paths from observations are already absolute - no workspace registry lookup is needed.
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Documentation Discovery (COMPLETED)
|
||||
|
||||
### Current Implementation Location
|
||||
|
||||
| Function | Location | Lines | Purpose |
|
||||
|----------|----------|-------|---------|
|
||||
| `updateFolderClaudeMd` | CursorHooksInstaller.ts | 128-199 | Orchestrates folder CLAUDE.md updates |
|
||||
| `formatTimelineForClaudeMd` | CursorHooksInstaller.ts | 221-295 | Parses API response to markdown |
|
||||
| `replaceTaggedContent` | CursorHooksInstaller.ts | 300-321 | Preserves user content outside tags |
|
||||
| `writeFolderClaudeMd` | CursorHooksInstaller.ts | 326-353 | Atomic file write |
|
||||
|
||||
### Integration Point
|
||||
|
||||
**File:** `src/services/worker/agents/ResponseProcessor.ts:274-298`
|
||||
|
||||
Current (problematic) code:
|
||||
```typescript
|
||||
const registry = readCursorRegistry();
|
||||
const registryEntry = registry[session.project];
|
||||
|
||||
if (registryEntry && (filesModified.length > 0 || filesRead.length > 0)) {
|
||||
updateFolderClaudeMd(
|
||||
registryEntry.workspacePath, // <-- PROBLEM: Needs Cursor registry
|
||||
filesModified,
|
||||
filesRead,
|
||||
session.project,
|
||||
getWorkerPort()
|
||||
).catch(error => { ... });
|
||||
}
|
||||
```
|
||||
|
||||
### The Problem
|
||||
|
||||
1. `filesModified` and `filesRead` already contain **absolute paths**
|
||||
2. We don't need `workspacePath` - just extract folder from file path directly
|
||||
3. Cursor registry is only populated when Cursor hooks are installed
|
||||
4. This makes folder CLAUDE.md a Cursor-only feature (unintended)
|
||||
|
||||
### Project Utils Pattern
|
||||
|
||||
**From `src/utils/cursor-utils.ts:97-122`:**
|
||||
- Pure functions with paths as parameters
|
||||
- Atomic write pattern: temp file + rename
|
||||
- `mkdirSync(dir, { recursive: true })` for directory creation
|
||||
|
||||
### Related Utils
|
||||
|
||||
**`src/utils/tag-stripping.ts`** - Handles *stripping* tags (input filtering)
|
||||
- `stripMemoryTagsFromJson()` - removes `<claude-mem-context>` content
|
||||
- `stripMemoryTagsFromPrompt()` - removes `<private>` content
|
||||
|
||||
Our `replaceTaggedContent` handles *preserving/replacing* (output writing) - complementary, not duplicative.
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Create Shared Utils File
|
||||
|
||||
### What to Implement
|
||||
|
||||
Create `src/utils/claude-md-utils.ts` with extracted and simplified functions.
|
||||
|
||||
### File Structure
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* CLAUDE.md File Utilities
|
||||
*
|
||||
* Shared utilities for writing folder-level CLAUDE.md files with
|
||||
* auto-generated context sections. Preserves user content outside
|
||||
* <claude-mem-context> tags.
|
||||
*/
|
||||
|
||||
import { existsSync, readFileSync, writeFileSync, renameSync, mkdirSync } from 'fs';
|
||||
import path from 'path';
|
||||
import { logger } from './logger.js';
|
||||
|
||||
/**
|
||||
* Replace tagged content in existing file, preserving content outside tags.
|
||||
*
|
||||
* Handles three cases:
|
||||
* 1. No existing content → wraps new content in tags
|
||||
* 2. Has existing tags → replaces only tagged section
|
||||
* 3. No tags in existing content → appends tagged content at end
|
||||
*/
|
||||
export function replaceTaggedContent(existingContent: string, newContent: string): string {
|
||||
// Copy from CursorHooksInstaller.ts:300-321
|
||||
}
|
||||
|
||||
/**
|
||||
* Write CLAUDE.md file to folder with atomic writes.
|
||||
* Creates directory structure if needed.
|
||||
*
|
||||
* @param folderPath - Absolute path to the folder
|
||||
* @param newContent - Content to write inside tags
|
||||
*/
|
||||
export function writeClaudeMdToFolder(folderPath: string, newContent: string): void {
|
||||
// Simplified from writeFolderClaudeMd - no workspacePath needed
|
||||
// Copy atomic write pattern from CursorHooksInstaller.ts:326-353
|
||||
}
|
||||
|
||||
/**
|
||||
* Format timeline text from API response to compact CLAUDE.md format.
|
||||
*
|
||||
* @param timelineText - Raw API response text
|
||||
* @returns Formatted markdown with date headers and compact table
|
||||
*/
|
||||
export function formatTimelineForClaudeMd(timelineText: string): string {
|
||||
// Copy from CursorHooksInstaller.ts:221-295
|
||||
}
|
||||
```
|
||||
|
||||
### Key Simplification
|
||||
|
||||
**OLD `writeFolderClaudeMd` signature:**
|
||||
```typescript
|
||||
async function writeFolderClaudeMd(
|
||||
workspacePath: string, // <-- REMOVE
|
||||
folderPath: string,
|
||||
newContent: string
|
||||
): Promise<void>
|
||||
```
|
||||
|
||||
**NEW `writeClaudeMdToFolder` signature:**
|
||||
```typescript
|
||||
export function writeClaudeMdToFolder(
|
||||
folderPath: string, // Must be absolute path
|
||||
newContent: string
|
||||
): void // Sync is fine, atomic anyway
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] File created at `src/utils/claude-md-utils.ts`
|
||||
- [ ] `replaceTaggedContent` exported and handles all 3 cases
|
||||
- [ ] `writeClaudeMdToFolder` exported with atomic writes
|
||||
- [ ] `formatTimelineForClaudeMd` exported
|
||||
- [ ] Build passes: `npm run build`
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Create Folder Index Service Function
|
||||
|
||||
### What to Implement
|
||||
|
||||
Create a new orchestrating function that replaces `updateFolderClaudeMd`. This should NOT be in CursorHooksInstaller - it's a general feature.
|
||||
|
||||
**Option A:** Add to `src/utils/claude-md-utils.ts` (keeps it simple)
|
||||
**Option B:** Create `src/services/folder-index-service.ts` (follows service pattern)
|
||||
|
||||
Recommend **Option A** for simplicity - it's just one function.
|
||||
|
||||
### New Function
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Update CLAUDE.md files for folders containing the given files.
|
||||
* Fetches timeline from worker API and writes formatted content.
|
||||
*
|
||||
* @param filePaths - Array of absolute file paths (modified or read)
|
||||
* @param project - Project identifier for API query
|
||||
* @param port - Worker API port
|
||||
*/
|
||||
export async function updateFolderClaudeMdFiles(
|
||||
filePaths: string[],
|
||||
project: string,
|
||||
port: number
|
||||
): Promise<void> {
|
||||
// Extract unique folder paths from file paths
|
||||
const folderPaths = new Set<string>();
|
||||
for (const filePath of filePaths) {
|
||||
if (!filePath || filePath === '') continue;
|
||||
const folderPath = path.dirname(filePath);
|
||||
if (folderPath && folderPath !== '.' && folderPath !== '/') {
|
||||
folderPaths.add(folderPath);
|
||||
}
|
||||
}
|
||||
|
||||
if (folderPaths.size === 0) return;
|
||||
|
||||
logger.debug('FOLDER_INDEX', 'Updating CLAUDE.md files', {
|
||||
project,
|
||||
folderCount: folderPaths.size
|
||||
});
|
||||
|
||||
// Process each folder
|
||||
for (const folderPath of folderPaths) {
|
||||
try {
|
||||
// Fetch timeline via existing API
|
||||
const response = await fetch(
|
||||
`http://127.0.0.1:${port}/api/search/by-file?filePath=${encodeURIComponent(folderPath)}&limit=10&project=${encodeURIComponent(project)}`
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
logger.warn('FOLDER_INDEX', 'Failed to fetch timeline', { folderPath, status: response.status });
|
||||
continue;
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
if (!result.content?.[0]?.text) {
|
||||
logger.debug('FOLDER_INDEX', 'No content for folder', { folderPath });
|
||||
continue;
|
||||
}
|
||||
|
||||
const formatted = formatTimelineForClaudeMd(result.content[0].text);
|
||||
writeClaudeMdToFolder(folderPath, formatted);
|
||||
|
||||
logger.debug('FOLDER_INDEX', 'Updated CLAUDE.md', { folderPath });
|
||||
} catch (error) {
|
||||
logger.warn('FOLDER_INDEX', 'Failed to update CLAUDE.md', { folderPath }, error as Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] `updateFolderClaudeMdFiles` function added
|
||||
- [ ] Takes only `filePaths`, `project`, `port` (no workspacePath)
|
||||
- [ ] Extracts folder paths from absolute file paths
|
||||
- [ ] Uses `writeClaudeMdToFolder` for atomic writes
|
||||
- [ ] Build passes: `npm run build`
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Update ResponseProcessor Integration
|
||||
|
||||
### What to Implement
|
||||
|
||||
Simplify the call site in `src/services/worker/agents/ResponseProcessor.ts`.
|
||||
|
||||
### Current Code (lines 274-298)
|
||||
```typescript
|
||||
// Update folder CLAUDE.md files for touched folders (fire-and-forget)
|
||||
const filesModified: string[] = [];
|
||||
const filesRead: string[] = [];
|
||||
|
||||
for (const obs of observations) {
|
||||
filesModified.push(...(obs.files_modified || []));
|
||||
filesRead.push(...(obs.files_read || []));
|
||||
}
|
||||
|
||||
// Get workspace path from project registry
|
||||
const registry = readCursorRegistry();
|
||||
const registryEntry = registry[session.project];
|
||||
|
||||
if (registryEntry && (filesModified.length > 0 || filesRead.length > 0)) {
|
||||
updateFolderClaudeMd(
|
||||
registryEntry.workspacePath,
|
||||
filesModified,
|
||||
filesRead,
|
||||
session.project,
|
||||
getWorkerPort()
|
||||
).catch(error => {
|
||||
logger.warn('FOLDER_INDEX', 'CLAUDE.md update failed (non-critical)', { project: session.project }, error as Error);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### New Code
|
||||
```typescript
|
||||
// Update folder CLAUDE.md files for touched folders (fire-and-forget)
|
||||
const allFilePaths: string[] = [];
|
||||
for (const obs of observations) {
|
||||
allFilePaths.push(...(obs.files_modified || []));
|
||||
allFilePaths.push(...(obs.files_read || []));
|
||||
}
|
||||
|
||||
if (allFilePaths.length > 0) {
|
||||
updateFolderClaudeMdFiles(
|
||||
allFilePaths,
|
||||
session.project,
|
||||
getWorkerPort()
|
||||
).catch(error => {
|
||||
logger.warn('FOLDER_INDEX', 'CLAUDE.md update failed (non-critical)', { project: session.project }, error as Error);
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
### Import Changes
|
||||
|
||||
**Remove:**
|
||||
```typescript
|
||||
import { updateFolderClaudeMd, readCursorRegistry } from '../../integrations/CursorHooksInstaller.js';
|
||||
```
|
||||
|
||||
**Add:**
|
||||
```typescript
|
||||
import { updateFolderClaudeMdFiles } from '../../../utils/claude-md-utils.js';
|
||||
```
|
||||
|
||||
**Keep (if still needed for Cursor context):**
|
||||
```typescript
|
||||
import { updateCursorContextForProject } from '../../worker-service.js';
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] Import updated to use `claude-md-utils.ts`
|
||||
- [ ] `readCursorRegistry` import removed (if no longer needed)
|
||||
- [ ] Call site simplified - no registry lookup
|
||||
- [ ] Fire-and-forget pattern preserved
|
||||
- [ ] Build passes: `npm run build`
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Clean Up CursorHooksInstaller
|
||||
|
||||
### What to Implement
|
||||
|
||||
Remove the extracted functions from `src/services/integrations/CursorHooksInstaller.ts`.
|
||||
|
||||
### Functions to Remove
|
||||
- `updateFolderClaudeMd` (lines 128-199)
|
||||
- `formatTimelineForClaudeMd` (lines 221-295)
|
||||
- `replaceTaggedContent` (lines 300-321)
|
||||
- `writeFolderClaudeMd` (lines 326-353)
|
||||
|
||||
### Verification Checklist
|
||||
- [ ] All 4 functions removed from CursorHooksInstaller.ts
|
||||
- [ ] No dangling references to removed functions
|
||||
- [ ] CursorHooksInstaller still exports what it needs for Cursor integration
|
||||
- [ ] Build passes: `npm run build`
|
||||
- [ ] Grep shows no references to old function locations
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Verification
|
||||
|
||||
### Build Check
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
### Anti-Pattern Grep (should find NOTHING in CursorHooksInstaller)
|
||||
```bash
|
||||
grep -n "updateFolderClaudeMd\|formatTimelineForClaudeMd\|replaceTaggedContent\|writeFolderClaudeMd" src/services/integrations/CursorHooksInstaller.ts
|
||||
```
|
||||
|
||||
### Correct Location Grep (should find in claude-md-utils)
|
||||
```bash
|
||||
grep -rn "updateFolderClaudeMdFiles\|writeClaudeMdToFolder\|formatTimelineForClaudeMd" src/utils/
|
||||
```
|
||||
|
||||
### Integration Check
|
||||
```bash
|
||||
grep -n "updateFolderClaudeMdFiles" src/services/worker/agents/ResponseProcessor.ts
|
||||
```
|
||||
|
||||
### No Cursor Registry Dependency
|
||||
```bash
|
||||
grep -n "readCursorRegistry" src/services/worker/agents/ResponseProcessor.ts
|
||||
# Should return nothing (or only for Cursor context, not folder index)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**~150 lines moved** from CursorHooksInstaller.ts to claude-md-utils.ts with simplification:
|
||||
|
||||
| Before | After |
|
||||
|--------|-------|
|
||||
| 4 functions in CursorHooksInstaller | 4 functions in claude-md-utils |
|
||||
| Requires Cursor registry lookup | Works with absolute paths directly |
|
||||
| `updateFolderClaudeMd(workspacePath, ...)` | `updateFolderClaudeMdFiles(filePaths, ...)` |
|
||||
| Coupled to Cursor integration | Independent utility |
|
||||
|
||||
**Files Changed:**
|
||||
1. `src/utils/claude-md-utils.ts` - NEW (create)
|
||||
2. `src/services/worker/agents/ResponseProcessor.ts` - UPDATE (simplify call site)
|
||||
3. `src/services/integrations/CursorHooksInstaller.ts` - UPDATE (remove extracted functions)
|
||||
@@ -1,186 +0,0 @@
|
||||
# Plan: Change Folder CLAUDE.md to Timeline Format
|
||||
|
||||
## Goal
|
||||
|
||||
Replace the simple table format in folder-level CLAUDE.md files with the timeline format used by search results.
|
||||
|
||||
## Current vs Target Format
|
||||
|
||||
### Current Format (Simple)
|
||||
```markdown
|
||||
# Recent Activity
|
||||
|
||||
### Recent
|
||||
|
||||
| Time | Type | Title |
|
||||
|------|------|-------|
|
||||
| 6:33pm | feature | Multiple CLAUDE.md files generated |
|
||||
| 6:32pm | feature | CLAUDE.md file successfully generated |
|
||||
```
|
||||
|
||||
### Target Format (Timeline)
|
||||
```markdown
|
||||
# Recent Activity
|
||||
|
||||
### Jan 4, 2026
|
||||
|
||||
**src/services/worker/agents/ResponseProcessor.ts**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #37110 | 6:35 PM | 🔴 | Folder CLAUDE.md updates moved from summary | ~85 |
|
||||
| #37109 | " | ✅ | ResponseProcessor.ts modified | ~92 |
|
||||
|
||||
**General**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #37108 | 6:33 PM | 🟣 | Multiple CLAUDE.md files generated | ~78 |
|
||||
```
|
||||
|
||||
## Key Changes
|
||||
|
||||
1. **Group by date** - Use `### Jan 4, 2026` instead of `### Recent`
|
||||
2. **Group by file within each date** - Add `**filename**` headers
|
||||
3. **Expand columns** - Add ID and Read columns: `| ID | Time | T | Title | Read |`
|
||||
4. **Use type emojis** - Use `🔴` `🟣` `✅` etc. instead of text
|
||||
5. **Show ditto marks** - Use `"` for repeated times
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Refactor formatTimelineForClaudeMd
|
||||
|
||||
**File:** `src/utils/claude-md-utils.ts`
|
||||
|
||||
**Tasks:**
|
||||
|
||||
1. Add imports from shared utilities:
|
||||
```typescript
|
||||
import { formatDate, formatTime, extractFirstFile, estimateTokens, groupByDate } from '../shared/timeline-formatting.js';
|
||||
import { ModeManager } from '../services/domain/ModeManager.js';
|
||||
```
|
||||
|
||||
2. Replace `formatTimelineForClaudeMd()` (lines 78-151) with new implementation that:
|
||||
- Parses API response to extract full observation data (id, time, type emoji, title, files)
|
||||
- Groups observations by date using `groupByDate()`
|
||||
- Within each date, groups by file using a Map
|
||||
- Renders file sections with `**filename**` headers
|
||||
- Uses search table format: `| ID | Time | T | Title | Read |`
|
||||
- Uses ditto marks for repeated times
|
||||
|
||||
**Pattern to Copy From:** `src/services/worker/search/ResultFormatter.ts` lines 56-108
|
||||
|
||||
**Key APIs:**
|
||||
- `groupByDate(items, getDate)` - from `src/shared/timeline-formatting.ts:104-127`
|
||||
- `formatTime(epoch)` - from `src/shared/timeline-formatting.ts:46-53`
|
||||
- `formatDate(epoch)` - from `src/shared/timeline-formatting.ts:59-66`
|
||||
- `extractFirstFile(filesModified, cwd)` - from `src/shared/timeline-formatting.ts:81-84`
|
||||
- `estimateTokens(text)` - from `src/shared/timeline-formatting.ts:89-92`
|
||||
- `ModeManager.getInstance().getTypeIcon(type)` - from `src/services/domain/ModeManager.ts`
|
||||
|
||||
**Verification:**
|
||||
1. Run `npm run build` - no errors
|
||||
2. Restart worker: `npm run worker:restart`
|
||||
3. Make a test edit to trigger observation
|
||||
4. Check generated CLAUDE.md files for new format
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Parse Full Observation Data from API
|
||||
|
||||
**Context:** The current regex parsing extracts only time, type emoji, and title. Need to also extract:
|
||||
- Observation ID (for `#123` column)
|
||||
- File path (from files_modified in API response, for grouping)
|
||||
- Token estimate (for `Read` column)
|
||||
|
||||
**Challenge:** The current API returns formatted text, not structured data. We need to:
|
||||
1. Parse the existing text format more thoroughly, OR
|
||||
2. Use a different API endpoint that returns JSON
|
||||
|
||||
**Decision Point:** Check what data the `/api/search/by-file` endpoint returns. If it returns structured JSON with observations, use that. Otherwise, enhance parsing.
|
||||
|
||||
**Investigation Required:**
|
||||
- Read `src/services/worker/http/routes/SearchRoutes.ts` to see by-file response format
|
||||
- Determine if we can access raw observation data or just formatted text
|
||||
|
||||
**Verification:**
|
||||
- Confirm API response structure
|
||||
- Update parsing to extract all needed fields
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Integrate File-Based Grouping
|
||||
|
||||
**File:** `src/utils/claude-md-utils.ts`
|
||||
|
||||
**Tasks:**
|
||||
|
||||
1. Create helper to group by file:
|
||||
```typescript
|
||||
function groupByFile(observations: ParsedObservation[]): Map<string, ParsedObservation[]> {
|
||||
const byFile = new Map<string, ParsedObservation[]>();
|
||||
for (const obs of observations) {
|
||||
const file = obs.file || 'General';
|
||||
if (!byFile.has(file)) byFile.set(file, []);
|
||||
byFile.get(file)!.push(obs);
|
||||
}
|
||||
return byFile;
|
||||
}
|
||||
```
|
||||
|
||||
2. Render with file sections:
|
||||
```typescript
|
||||
for (const [file, fileObs] of resultsByFile) {
|
||||
lines.push(`**${file}**`);
|
||||
lines.push(`| ID | Time | T | Title | Read |`);
|
||||
lines.push(`|----|------|---|-------|------|`);
|
||||
// render rows with ditto marks
|
||||
}
|
||||
```
|
||||
|
||||
**Pattern to Copy From:** `ResultFormatter.formatSearchResults()` lines 60-108
|
||||
|
||||
**Verification:**
|
||||
- Generated CLAUDE.md shows file grouping
|
||||
- Files are displayed as relative paths when possible
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Final Verification
|
||||
|
||||
**Checklist:**
|
||||
|
||||
1. **Build passes:** `npm run build`
|
||||
2. **Worker restarts cleanly:** `npm run worker:restart`
|
||||
3. **Format matches target:**
|
||||
- Date headers: `### Jan 4, 2026`
|
||||
- File sections: `**filename**`
|
||||
- Table columns: `| ID | Time | T | Title | Read |`
|
||||
- Type emojis: `🔴` `🟣` `✅` not text
|
||||
- Ditto marks: `"` for repeated times
|
||||
4. **Anti-pattern checks:**
|
||||
- No hardcoded type maps (use ModeManager)
|
||||
- No invented APIs
|
||||
- Reuses existing formatters from shared utils
|
||||
5. **Graceful degradation:** Empty results still show `*No recent activity*`
|
||||
|
||||
---
|
||||
|
||||
## Files to Modify
|
||||
|
||||
| File | Change |
|
||||
|------|--------|
|
||||
| `src/utils/claude-md-utils.ts` | Replace `formatTimelineForClaudeMd()` with timeline format |
|
||||
|
||||
## Files to Read (Patterns to Copy)
|
||||
|
||||
| File | Pattern |
|
||||
|------|---------|
|
||||
| `src/services/worker/search/ResultFormatter.ts:56-108` | Date/file grouping logic |
|
||||
| `src/shared/timeline-formatting.ts` | All formatting utilities |
|
||||
| `src/services/domain/ModeManager.ts` | Type icon lookup |
|
||||
|
||||
## Anti-Patterns to Avoid
|
||||
|
||||
- ❌ Creating new hardcoded type→emoji maps (use ModeManager)
|
||||
- ❌ Parsing dates manually (use shared formatters)
|
||||
- ❌ Skipping the existing groupByDate utility
|
||||
- ❌ Not handling ditto marks for repeated times
|
||||
@@ -1,196 +0,0 @@
|
||||
# Plan: Integrate Workflow Agents and Commands into Claude-Mem
|
||||
|
||||
## Executive Summary
|
||||
|
||||
This plan integrates the `/make-plan` and `/do` orchestration workflow from `~/.claude/commands/` into the claude-mem plugin as project-level development tools.
|
||||
|
||||
## Dependency Analysis
|
||||
|
||||
### Commands to Copy (from `~/.claude/commands/`)
|
||||
|
||||
| File | Purpose | Dependencies |
|
||||
|------|---------|--------------|
|
||||
| `make-plan.md` | Orchestrator for LLM-friendly phased planning | Uses Task tool with subagents |
|
||||
| `do.md` | Orchestrator for executing plans via subagents | Uses Task tool with subagents |
|
||||
| `anti-pattern-czar.md` | Error handling anti-pattern detection/fixing | Uses Read, Edit, Bash tools |
|
||||
|
||||
### Specialized Agents Referenced
|
||||
|
||||
The `/make-plan` and `/do` commands reference these **conceptual agent roles** (not actual agent files):
|
||||
|
||||
| Agent Role | Referenced In | Description |
|
||||
|------------|---------------|-------------|
|
||||
| "Documentation Discovery" | make-plan.md | Fact-gathering from docs/examples |
|
||||
| "Verification" | make-plan.md, do.md | Verify implementation matches plan |
|
||||
| "Implementation" | do.md | Execute implementation tasks |
|
||||
| "Anti-pattern" | do.md | Grep for known bad patterns |
|
||||
| "Code Quality" | do.md | Review code changes |
|
||||
| "Commit" | do.md | Commit after verification passes |
|
||||
| "Branch/Sync" | do.md | Push and prepare phase handoffs |
|
||||
|
||||
**Key Finding**: These are **role descriptions**, not separate agent files. The Task tool's `general-purpose` subagent_type executes all roles. The commands define *what* each role should do, not separate agent implementations.
|
||||
|
||||
### Existing Project Assets
|
||||
|
||||
Located in `.claude/`:
|
||||
- `agents/github-morning-reporter.md` - Already in project
|
||||
- `skills/version-bump/SKILL.md` - Already in project
|
||||
- No existing commands directory
|
||||
|
||||
---
|
||||
|
||||
## Phase 0: Documentation Discovery (Complete)
|
||||
|
||||
### Sources Consulted
|
||||
1. `/Users/alexnewman/.claude/commands/make-plan.md` (62 lines)
|
||||
2. `/Users/alexnewman/.claude/commands/do.md` (39 lines)
|
||||
3. `/Users/alexnewman/.claude/commands/anti-pattern-czar.md` (122 lines)
|
||||
4. `/Users/alexnewman/.claude/settings.json` (36 lines)
|
||||
5. `.claude/skills/CLAUDE.md` (30 lines)
|
||||
6. `.claude/agents/github-morning-reporter.md` (102 lines)
|
||||
|
||||
### Allowed APIs/Patterns
|
||||
- **Commands**: `.claude/commands/*.md` files with `#$ARGUMENTS` placeholder for user input
|
||||
- **Skills**: `.claude/skills/<name>/SKILL.md` with YAML frontmatter (name, description)
|
||||
- **Agents**: `.claude/agents/*.md` with YAML frontmatter (name, description, model)
|
||||
|
||||
### Anti-Patterns to Avoid
|
||||
- Skills require YAML frontmatter; commands do not
|
||||
- Commands use `#$ARGUMENTS` for input; skills/agents receive prompts differently
|
||||
- Don't create separate agent files for role descriptions - the Task tool handles routing
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: Create Commands Directory
|
||||
|
||||
### What to Implement
|
||||
1. Create `.claude/commands/` directory
|
||||
2. Copy `make-plan.md` from `~/.claude/commands/make-plan.md`
|
||||
3. Copy `do.md` from `~/.claude/commands/do.md`
|
||||
4. Copy `anti-pattern-czar.md` from `~/.claude/commands/anti-pattern-czar.md`
|
||||
|
||||
### Documentation References
|
||||
- Pattern: `~/.claude/commands/*.md` (source files)
|
||||
- Existing example: `.claude/skills/version-bump/SKILL.md` for claude-mem project tools
|
||||
|
||||
### Verification Checklist
|
||||
```bash
|
||||
# Verify files exist
|
||||
ls -la .claude/commands/
|
||||
|
||||
# Verify content matches source
|
||||
diff ~/.claude/commands/make-plan.md .claude/commands/make-plan.md
|
||||
diff ~/.claude/commands/do.md .claude/commands/do.md
|
||||
diff ~/.claude/commands/anti-pattern-czar.md .claude/commands/anti-pattern-czar.md
|
||||
|
||||
# Verify #$ARGUMENTS placeholder exists
|
||||
grep '\$ARGUMENTS' .claude/commands/*.md
|
||||
```
|
||||
|
||||
### Anti-Pattern Guards
|
||||
- Do NOT add YAML frontmatter to commands (they don't need it)
|
||||
- Do NOT modify the source content (copy verbatim)
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: Create CLAUDE.md Documentation
|
||||
|
||||
### What to Implement
|
||||
Create `.claude/commands/CLAUDE.md` documenting the commands directory (following pattern from `.claude/skills/CLAUDE.md`)
|
||||
|
||||
### Content Template
|
||||
```markdown
|
||||
# Project-Level Commands
|
||||
|
||||
This directory contains slash commands **for developing and maintaining the claude-mem project itself**.
|
||||
|
||||
## Commands in This Directory
|
||||
|
||||
### /make-plan
|
||||
Orchestrator for creating LLM-friendly implementation plans in phases. Deploys subagents for documentation discovery and fact gathering.
|
||||
|
||||
**Usage**: `/make-plan <task description>`
|
||||
|
||||
### /do
|
||||
Orchestrator for executing plans via subagents. Deploys specialized subagents for implementation, verification, and code quality review.
|
||||
|
||||
**Usage**: `/do <plan-file-path or inline plan>`
|
||||
|
||||
### /anti-pattern-czar
|
||||
Interactive workflow for detecting and fixing error handling anti-patterns using the automated scanner.
|
||||
|
||||
**Usage**: `/anti-pattern-czar`
|
||||
|
||||
## Adding New Commands
|
||||
|
||||
Commands are markdown files with `#$ARGUMENTS` placeholder for user input.
|
||||
```
|
||||
|
||||
### Verification Checklist
|
||||
```bash
|
||||
# Verify file exists
|
||||
cat .claude/commands/CLAUDE.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Update Settings (if needed)
|
||||
|
||||
### What to Implement
|
||||
Check if `.claude/settings.json` needs any permission updates for the new commands.
|
||||
|
||||
### Verification Checklist
|
||||
```bash
|
||||
# Check current settings
|
||||
cat .claude/settings.json
|
||||
|
||||
# Verify commands work by listing them
|
||||
# (After Claude Code restart, commands should appear in slash-command list)
|
||||
```
|
||||
|
||||
### Anti-Pattern Guards
|
||||
- Do NOT add skill permissions for commands (they're different)
|
||||
- Commands don't require explicit permissions
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Final Verification
|
||||
|
||||
### Verification Checklist
|
||||
1. All three command files exist in `.claude/commands/`
|
||||
2. Content matches source files exactly (byte-for-byte if possible)
|
||||
3. CLAUDE.md documentation exists
|
||||
4. Git status shows new files ready for commit
|
||||
|
||||
```bash
|
||||
# Full verification
|
||||
ls -la .claude/commands/
|
||||
wc -l .claude/commands/*.md
|
||||
git status
|
||||
```
|
||||
|
||||
### Commit Message Template
|
||||
```
|
||||
feat: add /make-plan, /do, and /anti-pattern-czar workflow commands
|
||||
|
||||
Add project-level orchestration commands for claude-mem development:
|
||||
- /make-plan: Create LLM-friendly implementation plans in phases
|
||||
- /do: Execute plans via coordinated subagents
|
||||
- /anti-pattern-czar: Detect and fix error handling anti-patterns
|
||||
|
||||
These commands enable structured, agent-driven development workflows.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
**Files to Create**:
|
||||
1. `.claude/commands/make-plan.md` (copy from ~/.claude/commands/)
|
||||
2. `.claude/commands/do.md` (copy from ~/.claude/commands/)
|
||||
3. `.claude/commands/anti-pattern-czar.md` (copy from ~/.claude/commands/)
|
||||
4. `.claude/commands/CLAUDE.md` (new documentation)
|
||||
|
||||
**No Agent Files Needed**: The "agents" referenced in make-plan.md and do.md are role descriptions, not separate files. The Task tool's built-in subagent types handle execution.
|
||||
|
||||
**Confidence**: High - analysis complete with full source file reads.
|
||||
@@ -1,7 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
*No recent activity*
|
||||
</claude-mem-context>
|
||||
@@ -26,17 +26,4 @@ Manages semantic versioning for the claude-mem project itself. Handles updating
|
||||
## Adding New Skills
|
||||
|
||||
**For claude-mem development** → Add to `.claude/skills/`
|
||||
**For end users** → Add to `plugin/skills/` (gets distributed with plugin)
|
||||
|
||||
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 29, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #33938 | 6:27 PM | 🔵 | Relevant CLAUDE.md Context Identified for PR #492 | ~435 |
|
||||
</claude-mem-context>
|
||||
**For end users** → Add to `plugin/skills/` (gets distributed with plugin)
|
||||
@@ -1,21 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 13, 2025
|
||||
|
||||
**feature_request.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #25012 | 6:41 PM | 🟣 | Auto-Convert Feature Requests to GitHub Discussions | ~298 |
|
||||
| #25011 | " | ✅ | Staged GitHub Feature Request Automation Files | ~206 |
|
||||
| #25009 | 6:40 PM | ✅ | Feature Request Template Auto-Labeling Configured | ~241 |
|
||||
| #24995 | 6:26 PM | 🔵 | Standard Feature Request Template Configuration | ~260 |
|
||||
|
||||
**bug_report.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #24994 | 6:26 PM | 🔵 | Standard Bug Report Template Configuration | ~258 |
|
||||
| #24992 | " | 🔵 | GitHub Issue Templates Located | ~188 |
|
||||
</claude-mem-context>
|
||||
@@ -7,6 +7,12 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Before submitting
|
||||
|
||||
- [ ] I searched [existing issues](https://github.com/thedotmack/claude-mem/issues) and confirmed this is not a duplicate
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Quick Bug Report (Recommended)
|
||||
|
||||
**Use the automated bug report generator** for comprehensive diagnostics:
|
||||
|
||||
@@ -7,6 +7,12 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Before submitting
|
||||
|
||||
- [ ] I searched [existing issues](https://github.com/thedotmack/claude-mem/issues) and confirmed this is not a duplicate
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 13, 2025
|
||||
|
||||
**convert-feature-requests.yml**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #25022 | 6:48 PM | ✅ | Workflow Fix Committed to Repository | ~289 |
|
||||
| #25021 | " | 🔴 | Fixed Issue Number Reference in Workflow Steps | ~277 |
|
||||
| #25020 | " | 🔴 | Workflow String Interpolation Fixed by Consolidating Steps | ~339 |
|
||||
| #25019 | 6:47 PM | 🔵 | GitHub Workflow Automates Feature Request Triage | ~328 |
|
||||
| #25012 | 6:41 PM | 🟣 | Auto-Convert Feature Requests to GitHub Discussions | ~298 |
|
||||
| #25011 | " | ✅ | Staged GitHub Feature Request Automation Files | ~206 |
|
||||
| #25010 | 6:40 PM | 🟣 | GitHub Action Workflow for Feature Request Auto-Conversion | ~414 |
|
||||
|
||||
**summary.yml**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #25002 | 6:38 PM | 🔵 | AI Summary Workflow for New Issues | ~239 |
|
||||
|
||||
**claude.yml**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #24997 | 6:27 PM | 🔵 | Claude Code Action Workflow for Issue and PR Comments | ~242 |
|
||||
| #24727 | 4:08 PM | 🔵 | GitHub Automation Baseline Assessment | ~312 |
|
||||
| #24722 | 4:06 PM | 🔵 | Existing Claude Workflow Trigger Configuration | ~233 |
|
||||
|
||||
**claude-code-review.yml**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #24996 | 6:27 PM | 🔵 | Existing GitHub Actions Workflows Identified | ~199 |
|
||||
| #24723 | 4:06 PM | 🔵 | Automated PR Review Workflow Pattern | ~268 |
|
||||
| #24720 | " | 🔵 | GitHub Workflows Inventory | ~142 |
|
||||
|
||||
### Dec 17, 2025
|
||||
|
||||
**issue-list-query**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #28918 | 7:27 PM | 🔵 | Four open issues identified - MCP connection, Bun PATH, web UI path, and endless mode | ~432 |
|
||||
|
||||
**pr-list-query**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #28917 | 7:27 PM | 🔵 | Recent PRs audit reveals comprehensive Windows stabilization and MCP fixes | ~414 |
|
||||
|
||||
**windows-ci.yml**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #28655 | 5:30 PM | ✅ | Windows CI Removal Committed to Repository | ~253 |
|
||||
| #28654 | " | ✅ | Windows CI Workflow File Removed | ~174 |
|
||||
| #28650 | 5:26 PM | ✅ | Committed Windows CI Workflow Simplification | ~213 |
|
||||
| #28649 | " | ✅ | Removed Build and Install Steps from Windows CI | ~278 |
|
||||
| #28648 | " | 🔵 | Windows CI Workflow Includes Build Step | ~288 |
|
||||
| #28644 | 5:24 PM | ✅ | Modified 27 files with 693 additions and 239 deletions for Windows support | ~447 |
|
||||
| #28625 | 5:19 PM | 🟣 | Windows CI Testing Workflow Deployed | ~303 |
|
||||
| #28624 | " | ✅ | Windows CI Workflow File Staged for Commit | ~163 |
|
||||
| #28623 | " | 🔵 | Windows CI Workflow File Present But Untracked | ~178 |
|
||||
| #28622 | 5:18 PM | 🟣 | Windows CI Pipeline with Worker Lifecycle Testing | ~326 |
|
||||
|
||||
### Dec 31, 2025
|
||||
|
||||
**claude-code-review.yml**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34627 | 3:01 PM | 🔵 | Claude Code Review GitHub Action Provides Automated PR Review Integration | ~478 |
|
||||
|
||||
**claude.yml**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34626 | 3:01 PM | 🔵 | Test-Driven Validation Agent Performing Extensive Infrastructure Analysis | ~501 |
|
||||
</claude-mem-context>
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
actions: read # Required for Claude to read CI results on PRs
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
steps:
|
||||
- name: Get issue details and create discussion
|
||||
id: discussion
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
// Get issue details
|
||||
@@ -87,7 +87,7 @@ jobs:
|
||||
}
|
||||
|
||||
- name: Comment on issue
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
const issueNumber = ${{ steps.discussion.outputs.issue_number }};
|
||||
@@ -105,7 +105,7 @@ jobs:
|
||||
console.log(`Added comment to issue #${issueNumber}`);
|
||||
|
||||
- name: Close and lock issue
|
||||
uses: actions/github-script@v7
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
const issueNumber = ${{ steps.discussion.outputs.issue_number }};
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
name: Deploy Install Scripts
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'openclaw/install.sh'
|
||||
- 'install/**'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
deploy:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Copy install scripts to deploy directory
|
||||
run: |
|
||||
mkdir -p install/public
|
||||
cp openclaw/install.sh install/public/openclaw.sh
|
||||
|
||||
- name: Deploy to Vercel
|
||||
uses: amondnet/vercel-action@v25
|
||||
with:
|
||||
vercel-token: ${{ secrets.VERCEL_TOKEN }}
|
||||
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
|
||||
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
|
||||
vercel-args: '--prod'
|
||||
working-directory: ./install
|
||||
@@ -0,0 +1,21 @@
|
||||
name: Publish to npm
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- run: npm install --ignore-scripts
|
||||
- run: npm run build
|
||||
- run: npm publish
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
@@ -14,11 +14,11 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Run AI inference
|
||||
id: inference
|
||||
uses: actions/ai-inference@v1
|
||||
uses: actions/ai-inference@v2
|
||||
with:
|
||||
prompt: |
|
||||
Summarize the following GitHub issue in one paragraph:
|
||||
|
||||
+14
-1
@@ -11,16 +11,29 @@ dist/
|
||||
.claude/settings.local.json
|
||||
.claude/agents/
|
||||
.claude/skills/
|
||||
.claude/plans/
|
||||
.claude/worktrees/
|
||||
plugin/data/
|
||||
plugin/data.backup/
|
||||
package-lock.json
|
||||
bun.lock
|
||||
private/
|
||||
datasets/
|
||||
Auto Run Docs/
|
||||
|
||||
# Generated UI files (built from viewer-template.html)
|
||||
src/ui/viewer.html
|
||||
|
||||
# Local MCP server config (for development only)
|
||||
.mcp.json
|
||||
.cursor/
|
||||
.cursor/
|
||||
|
||||
# Prevent literal tilde directories (path validation bug artifacts)
|
||||
~*/
|
||||
|
||||
# Prevent other malformed path directories
|
||||
http*/
|
||||
https*/
|
||||
|
||||
# Ignore WebStorm project files (for dinosaur IDE users)
|
||||
.idea/
|
||||
|
||||
+844
-677
File diff suppressed because it is too large
Load Diff
@@ -41,6 +41,18 @@ Settings are managed in `~/.claude-mem/settings.json`. The file is auto-created
|
||||
- **Database**: `~/.claude-mem/claude-mem.db`
|
||||
- **Chroma**: `~/.claude-mem/chroma/`
|
||||
|
||||
## Exit Code Strategy
|
||||
|
||||
Claude-mem hooks use specific exit codes per Claude Code's hook contract:
|
||||
|
||||
- **Exit 0**: Success or graceful shutdown (Windows Terminal closes tabs)
|
||||
- **Exit 1**: Non-blocking error (stderr shown to user, continues)
|
||||
- **Exit 2**: Blocking error (stderr fed to Claude for processing)
|
||||
|
||||
**Philosophy**: Worker/hook errors exit with code 0 to prevent Windows Terminal tab accumulation. The wrapper/plugin layer handles restart logic. ERROR-level logging is maintained for diagnostics.
|
||||
|
||||
See `private/context/claude-code/exit-codes.md` for full hook behavior matrix.
|
||||
|
||||
## Requirements
|
||||
|
||||
- **Bun** (all platforms - auto-installed if missing)
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
<p align="center">
|
||||
Official $CMEM Links:
|
||||
<a href="https://bags.fm/2TsmuYUrsctE57VLckZBYEEzdokUF8j8e1GavekWBAGS">Bags.fm</a> •
|
||||
<a href="https://jup.ag/tokens/2TsmuYUrsctE57VLckZBYEEzdokUF8j8e1GavekWBAGS">Jupiter</a> •
|
||||
<a href="https://photon-sol.tinyastro.io/en/lp/6MzFAkWnac6GSK1EdFX93dZeukGfzrFq4UHWarhGSQyd">Photon</a> •
|
||||
<a href="https://dexscreener.com/solana/6mzfakwnac6gsk1edfx93dzeukgfzrfq4uhwarhgsqyd">DEXScreener</a>
|
||||
</p>
|
||||
|
||||
<p align="center">Official CA: 2TsmuYUrsctE57VLckZBYEEzdokUF8j8e1GavekWBAGS (on Solana)</p>
|
||||
|
||||
<h1 align="center">
|
||||
<br>
|
||||
@@ -14,12 +22,14 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="docs/i18n/README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="docs/i18n/README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="docs/i18n/README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="docs/i18n/README.pt.md">🇵🇹 Português</a> •
|
||||
<a href="docs/i18n/README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="docs/i18n/README.ko.md">🇰🇷 한국어</a> •
|
||||
<a href="docs/i18n/README.es.md">🇪🇸 Español</a> •
|
||||
<a href="docs/i18n/README.de.md">🇩🇪 Deutsch</a> •
|
||||
<a href="docs/i18n/README.fr.md">🇫🇷 Français</a>
|
||||
<a href="docs/i18n/README.fr.md">🇫🇷 Français</a> •
|
||||
<a href="docs/i18n/README.he.md">🇮🇱 עברית</a> •
|
||||
<a href="docs/i18n/README.ar.md">🇸🇦 العربية</a> •
|
||||
<a href="docs/i18n/README.ru.md">🇷🇺 Русский</a> •
|
||||
@@ -29,10 +39,12 @@
|
||||
<a href="docs/i18n/README.tr.md">🇹🇷 Türkçe</a> •
|
||||
<a href="docs/i18n/README.uk.md">🇺🇦 Українська</a> •
|
||||
<a href="docs/i18n/README.vi.md">🇻🇳 Tiếng Việt</a> •
|
||||
<a href="docs/i18n/README.tl.md">🇵🇭 Tagalog</a> •
|
||||
<a href="docs/i18n/README.id.md">🇮🇩 Indonesia</a> •
|
||||
<a href="docs/i18n/README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="docs/i18n/README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="docs/i18n/README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="docs/i18n/README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="docs/i18n/README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="docs/i18n/README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="docs/i18n/README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -101,13 +113,25 @@
|
||||
Start a new Claude Code session in the terminal and enter the following commands:
|
||||
|
||||
```
|
||||
> /plugin marketplace add thedotmack/claude-mem
|
||||
/plugin marketplace add thedotmack/claude-mem
|
||||
|
||||
> /plugin install claude-mem
|
||||
/plugin install claude-mem
|
||||
```
|
||||
|
||||
Restart Claude Code. Context from previous sessions will automatically appear in new sessions.
|
||||
|
||||
> **Note:** Claude-Mem is also published on npm, but `npm install -g claude-mem` installs the **SDK/library only** — it does not register the plugin hooks or set up the worker service. To use Claude-Mem as a plugin, always install via the `/plugin` commands above.
|
||||
|
||||
### 🦞 OpenClaw Gateway
|
||||
|
||||
Install claude-mem as a persistent memory plugin on [OpenClaw](https://openclaw.ai) gateways with a single command:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://install.cmem.ai/openclaw.sh | bash
|
||||
```
|
||||
|
||||
The installer handles dependencies, plugin setup, AI provider configuration, worker startup, and optional real-time observation feeds to Telegram, Discord, Slack, and more. See the [OpenClaw Integration Guide](https://docs.claude-mem.ai/openclaw-integration) for details.
|
||||
|
||||
**Key Features:**
|
||||
|
||||
- 🧠 **Persistent Memory** - Context survives across sessions
|
||||
@@ -125,7 +149,7 @@ Restart Claude Code. Context from previous sessions will automatically appear in
|
||||
|
||||
## Documentation
|
||||
|
||||
📚 **[View Full Documentation](docs/)** - Browse markdown docs on GitHub
|
||||
📚 **[View Full Documentation](https://docs.claude-mem.ai/)** - Browse on official website
|
||||
|
||||
### Getting Started
|
||||
|
||||
@@ -174,7 +198,7 @@ See [Architecture Overview](https://docs.claude-mem.ai/architecture/overview) fo
|
||||
|
||||
## MCP Search Tools
|
||||
|
||||
Claude-Mem provides intelligent memory search through **4 MCP tools** following a token-efficient **3-layer workflow pattern**:
|
||||
Claude-Mem provides intelligent memory search through **5 MCP tools** following a token-efficient **3-layer workflow pattern**:
|
||||
|
||||
**The 3-Layer Workflow:**
|
||||
|
||||
@@ -187,6 +211,7 @@ Claude-Mem provides intelligent memory search through **4 MCP tools** following
|
||||
- Start with `search` to get an index of results
|
||||
- Use `timeline` to see what was happening around specific observations
|
||||
- Use `get_observations` to fetch full details for relevant IDs
|
||||
- Use `save_memory` to manually store important information
|
||||
- **~10x token savings** by filtering before fetching details
|
||||
|
||||
**Available MCP Tools:**
|
||||
@@ -194,7 +219,8 @@ Claude-Mem provides intelligent memory search through **4 MCP tools** following
|
||||
1. **`search`** - Search memory index with full-text queries, filters by type/date/project
|
||||
2. **`timeline`** - Get chronological context around a specific observation or query
|
||||
3. **`get_observations`** - Fetch full observation details by IDs (always batch multiple IDs)
|
||||
4. **`__IMPORTANT`** - Workflow documentation (always visible to Claude)
|
||||
4. **`save_memory`** - Manually save a memory/observation for semantic search
|
||||
5. **`__IMPORTANT`** - Workflow documentation (always visible to Claude)
|
||||
|
||||
**Example Usage:**
|
||||
|
||||
@@ -206,6 +232,9 @@ search(query="authentication bug", type="bugfix", limit=10)
|
||||
|
||||
// Step 3: Fetch full details
|
||||
get_observations(ids=[123, 456])
|
||||
|
||||
// Save important information manually
|
||||
save_memory(text="API requires auth header X-API-Key", title="API Auth")
|
||||
```
|
||||
|
||||
See [Search Tools Guide](https://docs.claude-mem.ai/usage/search-tools) for detailed examples.
|
||||
@@ -228,6 +257,17 @@ See **[Beta Features Documentation](https://docs.claude-mem.ai/beta-features)**
|
||||
- **uv**: Python package manager for vector search (auto-installed if missing)
|
||||
- **SQLite 3**: For persistent storage (bundled)
|
||||
|
||||
---
|
||||
### Windows Setup Notes
|
||||
|
||||
If you see an error like:
|
||||
|
||||
```powershell
|
||||
npm : The term 'npm' is not recognized as the name of a cmdlet
|
||||
```
|
||||
|
||||
Make sure Node.js and npm are installed and added to your PATH. Download the latest Node.js installer from https://nodejs.org and restart your terminal after installation.
|
||||
|
||||
---
|
||||
|
||||
## Configuration
|
||||
@@ -299,6 +339,8 @@ See the [LICENSE](LICENSE) file for full details.
|
||||
- **Documentation**: [docs/](docs/)
|
||||
- **Issues**: [GitHub Issues](https://github.com/thedotmack/claude-mem/issues)
|
||||
- **Repository**: [github.com/thedotmack/claude-mem](https://github.com/thedotmack/claude-mem)
|
||||
- **Official X Account**: [@Claude_Memory](https://x.com/Claude_Memory)
|
||||
- **Official Discord**: [Join Discord](https://discord.com/invite/J4wttp9vDu)
|
||||
- **Author**: Alex Newman ([@thedotmack](https://github.com/thedotmack))
|
||||
|
||||
---
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 29, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34127 | 9:10 PM | ✅ | Marketing Copy Changes Committed to cursor-hooks-integration Branch | ~457 |
|
||||
| #34125 | " | ✅ | Detailed Diff Shows Consistent Marketing Language Across All Documentation | ~643 |
|
||||
| #34123 | 9:09 PM | ✅ | Marketing Copy Updates Complete Across Four Documentation Files | ~485 |
|
||||
| #34120 | " | ✅ | QUICKSTART Enhanced with Time-Bound Promise and Memory Benefit | ~426 |
|
||||
| #34119 | 9:08 PM | ✅ | Enhanced STANDALONE-SETUP with Value Proposition and Benefits | ~446 |
|
||||
| #34118 | " | ✅ | Enhanced README with Marketing Copy and Quick Install Section | ~491 |
|
||||
| #34117 | " | 🔵 | QUICKSTART.md Updated with Provider Configuration Section | ~487 |
|
||||
| #34116 | 9:07 PM | 🔵 | STANDALONE-SETUP.md Complete Documentation for Cursor-Only Users | ~541 |
|
||||
| #34115 | " | 🔵 | Cursor Hooks README Already Updated with Standalone Setup Link | ~485 |
|
||||
| #34067 | 8:46 PM | 🔵 | Cursor Quickstart Guide Analysis | ~531 |
|
||||
| #34066 | " | 🔵 | Cursor Hooks README Current State Assessment | ~583 |
|
||||
</claude-mem-context>
|
||||
@@ -1,192 +0,0 @@
|
||||
# Common utility functions for Cursor hooks (PowerShell)
|
||||
# Dot-source this file in hook scripts: . "$PSScriptRoot\common.ps1"
|
||||
# Note: ErrorActionPreference should be set in each script, not globally here
|
||||
|
||||
# Get worker port from settings with validation
|
||||
function Get-WorkerPort {
|
||||
$settingsPath = Join-Path $env:USERPROFILE ".claude-mem\settings.json"
|
||||
$port = 37777
|
||||
|
||||
if (Test-Path $settingsPath) {
|
||||
try {
|
||||
$settings = Get-Content $settingsPath -Raw | ConvertFrom-Json
|
||||
if ($settings.CLAUDE_MEM_WORKER_PORT) {
|
||||
$parsedPort = [int]$settings.CLAUDE_MEM_WORKER_PORT
|
||||
if ($parsedPort -ge 1 -and $parsedPort -le 65535) {
|
||||
$port = $parsedPort
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
# Ignore parse errors, use default
|
||||
}
|
||||
}
|
||||
|
||||
return $port
|
||||
}
|
||||
|
||||
# Ensure worker is running with retries
|
||||
function Test-WorkerReady {
|
||||
param(
|
||||
[int]$Port = 37777,
|
||||
[int]$MaxRetries = 75
|
||||
)
|
||||
|
||||
for ($i = 0; $i -lt $MaxRetries; $i++) {
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri "http://127.0.0.1:$Port/api/readiness" -Method Get -TimeoutSec 1 -ErrorAction Stop
|
||||
return $true
|
||||
} catch {
|
||||
Start-Sleep -Milliseconds 200
|
||||
}
|
||||
}
|
||||
|
||||
return $false
|
||||
}
|
||||
|
||||
# Get project name from workspace root
|
||||
function Get-ProjectName {
|
||||
param([string]$WorkspaceRoot)
|
||||
|
||||
if ([string]::IsNullOrEmpty($WorkspaceRoot)) {
|
||||
return "unknown-project"
|
||||
}
|
||||
|
||||
# Handle Windows drive root (e.g., "C:\")
|
||||
if ($WorkspaceRoot -match '^([A-Za-z]):\\?$') {
|
||||
return "drive-$($Matches[1].ToUpper())"
|
||||
}
|
||||
|
||||
$projectName = Split-Path $WorkspaceRoot -Leaf
|
||||
if ([string]::IsNullOrEmpty($projectName)) {
|
||||
return "unknown-project"
|
||||
}
|
||||
|
||||
return $projectName
|
||||
}
|
||||
|
||||
# URL encode a string
|
||||
function Get-UrlEncodedString {
|
||||
param([string]$String)
|
||||
|
||||
if ([string]::IsNullOrEmpty($String)) {
|
||||
return ""
|
||||
}
|
||||
|
||||
return [System.Uri]::EscapeDataString($String)
|
||||
}
|
||||
|
||||
# Check if string is empty or null
|
||||
function Test-IsEmpty {
|
||||
param([string]$String)
|
||||
|
||||
return [string]::IsNullOrEmpty($String) -or $String -eq "null" -or $String -eq "empty"
|
||||
}
|
||||
|
||||
# Safely read JSON from stdin with error handling
|
||||
function Read-JsonInput {
|
||||
try {
|
||||
$input = [Console]::In.ReadToEnd()
|
||||
if ([string]::IsNullOrEmpty($input)) {
|
||||
return @{}
|
||||
}
|
||||
return $input | ConvertFrom-Json -ErrorAction Stop
|
||||
} catch {
|
||||
return @{}
|
||||
}
|
||||
}
|
||||
|
||||
# Safely get JSON field with fallback
|
||||
function Get-JsonField {
|
||||
param(
|
||||
[PSObject]$Json,
|
||||
[string]$Field,
|
||||
[string]$Fallback = ""
|
||||
)
|
||||
|
||||
if ($null -eq $Json) {
|
||||
return $Fallback
|
||||
}
|
||||
|
||||
# Handle array access syntax (e.g., "workspace_roots[0]")
|
||||
if ($Field -match '^(.+)\[(\d+)\]$') {
|
||||
$arrayField = $Matches[1]
|
||||
$index = [int]$Matches[2]
|
||||
|
||||
if ($Json.PSObject.Properties.Name -contains $arrayField) {
|
||||
$array = $Json.$arrayField
|
||||
if ($null -ne $array -and $array.Count -gt $index) {
|
||||
$value = $array[$index]
|
||||
if (-not (Test-IsEmpty $value)) {
|
||||
return $value
|
||||
}
|
||||
}
|
||||
}
|
||||
return $Fallback
|
||||
}
|
||||
|
||||
# Simple field access
|
||||
if ($Json.PSObject.Properties.Name -contains $Field) {
|
||||
$value = $Json.$Field
|
||||
if (-not (Test-IsEmpty $value)) {
|
||||
return $value
|
||||
}
|
||||
}
|
||||
|
||||
return $Fallback
|
||||
}
|
||||
|
||||
# Convert object to JSON string (compact)
|
||||
function ConvertTo-JsonCompact {
|
||||
param([object]$Object)
|
||||
|
||||
return $Object | ConvertTo-Json -Compress -Depth 10
|
||||
}
|
||||
|
||||
# Send HTTP POST request (fire-and-forget style)
|
||||
function Send-HttpPostAsync {
|
||||
param(
|
||||
[string]$Uri,
|
||||
[object]$Body
|
||||
)
|
||||
|
||||
try {
|
||||
$bodyJson = ConvertTo-JsonCompact $Body
|
||||
Start-Job -ScriptBlock {
|
||||
param($u, $b)
|
||||
try {
|
||||
Invoke-RestMethod -Uri $u -Method Post -Body $b -ContentType "application/json" -TimeoutSec 5 -ErrorAction SilentlyContinue | Out-Null
|
||||
} catch {}
|
||||
} -ArgumentList $Uri, $bodyJson | Out-Null
|
||||
} catch {
|
||||
# Ignore errors - fire and forget
|
||||
}
|
||||
}
|
||||
|
||||
# Send HTTP POST request (synchronous)
|
||||
function Send-HttpPost {
|
||||
param(
|
||||
[string]$Uri,
|
||||
[object]$Body
|
||||
)
|
||||
|
||||
try {
|
||||
$bodyJson = ConvertTo-JsonCompact $Body
|
||||
Invoke-RestMethod -Uri $u -Method Post -Body $bodyJson -ContentType "application/json" -TimeoutSec 5 -ErrorAction SilentlyContinue | Out-Null
|
||||
} catch {
|
||||
# Ignore errors
|
||||
}
|
||||
}
|
||||
|
||||
# Get HTTP response
|
||||
function Get-HttpResponse {
|
||||
param(
|
||||
[string]$Uri,
|
||||
[int]$TimeoutSec = 5
|
||||
)
|
||||
|
||||
try {
|
||||
return Invoke-RestMethod -Uri $Uri -Method Get -TimeoutSec $TimeoutSec -ErrorAction Stop
|
||||
} catch {
|
||||
return $null
|
||||
}
|
||||
}
|
||||
@@ -1,140 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Common utility functions for Cursor hooks
|
||||
# Source this file in hook scripts: source "$(dirname "$0")/common.sh"
|
||||
|
||||
# Check if required commands exist
|
||||
check_dependencies() {
|
||||
local missing=()
|
||||
|
||||
if ! command -v jq >/dev/null 2>&1; then
|
||||
missing+=("jq")
|
||||
fi
|
||||
|
||||
if ! command -v curl >/dev/null 2>&1; then
|
||||
missing+=("curl")
|
||||
fi
|
||||
|
||||
if [ ${#missing[@]} -gt 0 ]; then
|
||||
echo "Error: Missing required dependencies: ${missing[*]}" >&2
|
||||
echo "Please install: ${missing[*]}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Safely read JSON from stdin with error handling
|
||||
read_json_input() {
|
||||
local input
|
||||
input=$(cat 2>/dev/null || echo "{}")
|
||||
|
||||
# Validate JSON
|
||||
if ! echo "$input" | jq empty 2>/dev/null; then
|
||||
# Invalid JSON - return empty object
|
||||
echo "{}"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo "$input"
|
||||
return 0
|
||||
}
|
||||
|
||||
# Get worker port from settings with validation
|
||||
get_worker_port() {
|
||||
local data_dir="${HOME}/.claude-mem"
|
||||
local settings_file="${data_dir}/settings.json"
|
||||
local port="37777"
|
||||
|
||||
if [ -f "$settings_file" ]; then
|
||||
local parsed_port
|
||||
parsed_port=$(jq -r '.CLAUDE_MEM_WORKER_PORT // "37777"' "$settings_file" 2>/dev/null || echo "37777")
|
||||
|
||||
# Validate port is a number between 1-65535
|
||||
if [[ "$parsed_port" =~ ^[0-9]+$ ]] && [ "$parsed_port" -ge 1 ] && [ "$parsed_port" -le 65535 ]; then
|
||||
port="$parsed_port"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "$port"
|
||||
}
|
||||
|
||||
# Ensure worker is running with retries
|
||||
ensure_worker_running() {
|
||||
local port="${1:-37777}"
|
||||
local max_retries="${2:-75}" # 15 seconds total (75 * 0.2s)
|
||||
local retry_count=0
|
||||
|
||||
while [ $retry_count -lt $max_retries ]; do
|
||||
if curl -s -f "http://127.0.0.1:${port}/api/readiness" >/dev/null 2>&1; then
|
||||
return 0
|
||||
fi
|
||||
sleep 0.2
|
||||
retry_count=$((retry_count + 1))
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# URL encode a string (basic implementation)
|
||||
url_encode() {
|
||||
local string="$1"
|
||||
# Use printf to URL encode
|
||||
printf '%s' "$string" | jq -sRr @uri
|
||||
}
|
||||
|
||||
# Get project name from workspace root
|
||||
get_project_name() {
|
||||
local workspace_root="$1"
|
||||
|
||||
if [ -z "$workspace_root" ]; then
|
||||
echo "unknown-project"
|
||||
return
|
||||
fi
|
||||
|
||||
# Use basename, fallback to unknown-project
|
||||
local project_name
|
||||
project_name=$(basename "$workspace_root" 2>/dev/null || echo "unknown-project")
|
||||
|
||||
# Handle edge case: empty basename (root directory)
|
||||
if [ -z "$project_name" ]; then
|
||||
# Check if it's a Windows drive root
|
||||
if [[ "$workspace_root" =~ ^[A-Za-z]:\\?$ ]]; then
|
||||
local drive_letter
|
||||
drive_letter=$(echo "$workspace_root" | grep -oE '^[A-Za-z]' | tr '[:lower:]' '[:upper:]')
|
||||
echo "drive-${drive_letter}"
|
||||
else
|
||||
echo "unknown-project"
|
||||
fi
|
||||
else
|
||||
echo "$project_name"
|
||||
fi
|
||||
}
|
||||
|
||||
# Safely extract JSON field with fallback
|
||||
# Supports both simple fields (e.g., "conversation_id") and array access (e.g., "workspace_roots[0]")
|
||||
json_get() {
|
||||
local json="$1"
|
||||
local field="$2"
|
||||
local fallback="${3:-}"
|
||||
|
||||
local value
|
||||
|
||||
# Handle array access syntax (e.g., "workspace_roots[0]")
|
||||
if [[ "$field" =~ ^(.+)\[([0-9]+)\]$ ]]; then
|
||||
local array_field="${BASH_REMATCH[1]}"
|
||||
local index="${BASH_REMATCH[2]}"
|
||||
value=$(echo "$json" | jq -r --arg f "$array_field" --arg i "$index" --arg fb "$fallback" '.[$f] // [] | .[$i | tonumber] // $fb' 2>/dev/null || echo "$fallback")
|
||||
else
|
||||
# Simple field access
|
||||
value=$(echo "$json" | jq -r --arg f "$field" --arg fb "$fallback" '.[$f] // $fb' 2>/dev/null || echo "$fallback")
|
||||
fi
|
||||
|
||||
echo "$value"
|
||||
}
|
||||
|
||||
# Check if string is empty or null
|
||||
is_empty() {
|
||||
local str="$1"
|
||||
[ -z "$str" ] || [ "$str" = "null" ] || [ "$str" = "empty" ]
|
||||
}
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
# Context Hook for Cursor (beforeSubmitPrompt) - PowerShell
|
||||
# Ensures worker is running and refreshes context before prompt submission
|
||||
#
|
||||
# Context is updated in BOTH places:
|
||||
# - Here (beforeSubmitPrompt): Fresh context at session start
|
||||
# - stop hook (session-summary.ps1): Updated context after observations are made
|
||||
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
|
||||
# Source common utilities
|
||||
$commonPath = Join-Path $PSScriptRoot "common.ps1"
|
||||
if (Test-Path $commonPath) {
|
||||
. $commonPath
|
||||
} else {
|
||||
Write-Output '{"continue": true}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Read JSON input from stdin
|
||||
$input = Read-JsonInput
|
||||
|
||||
# Extract workspace root
|
||||
$workspaceRoot = Get-JsonField $input "workspace_roots[0]" ""
|
||||
if (Test-IsEmpty $workspaceRoot) {
|
||||
$workspaceRoot = Get-Location
|
||||
}
|
||||
|
||||
# Get project name
|
||||
$projectName = Get-ProjectName $workspaceRoot
|
||||
|
||||
# Get worker port from settings
|
||||
$workerPort = Get-WorkerPort
|
||||
|
||||
# Ensure worker is running (with retries)
|
||||
# This primes the worker before the session starts
|
||||
if (Test-WorkerReady -Port $workerPort) {
|
||||
# Refresh context file with latest observations
|
||||
$projectEncoded = Get-UrlEncodedString $projectName
|
||||
$contextUri = "http://127.0.0.1:$workerPort/api/context/inject?project=$projectEncoded"
|
||||
$context = Get-HttpResponse -Uri $contextUri
|
||||
|
||||
if (-not [string]::IsNullOrEmpty($context)) {
|
||||
$rulesDir = Join-Path $workspaceRoot ".cursor\rules"
|
||||
$rulesFile = Join-Path $rulesDir "claude-mem-context.mdc"
|
||||
|
||||
# Create rules directory if it doesn't exist
|
||||
if (-not (Test-Path $rulesDir)) {
|
||||
New-Item -ItemType Directory -Path $rulesDir -Force | Out-Null
|
||||
}
|
||||
|
||||
# Write context as a Cursor rule with alwaysApply: true
|
||||
$ruleContent = @"
|
||||
---
|
||||
alwaysApply: true
|
||||
description: "Claude-mem context from past sessions (auto-updated)"
|
||||
---
|
||||
|
||||
# Memory Context from Past Sessions
|
||||
|
||||
The following context is from claude-mem, a persistent memory system that tracks your coding sessions.
|
||||
|
||||
$context
|
||||
|
||||
---
|
||||
*Updated after last session. Use claude-mem's MCP search tools for more detailed queries.*
|
||||
"@
|
||||
|
||||
Set-Content -Path $rulesFile -Value $ruleContent -Encoding UTF8 -Force
|
||||
}
|
||||
}
|
||||
|
||||
# Allow prompt to continue
|
||||
Write-Output '{"continue": true}'
|
||||
exit 0
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Context Hook for Cursor (beforeSubmitPrompt)
|
||||
# Ensures worker is running and refreshes context before prompt submission
|
||||
#
|
||||
# Context is updated in BOTH places:
|
||||
# - Here (beforeSubmitPrompt): Fresh context at session start
|
||||
# - stop hook (session-summary.sh): Updated context after observations are made
|
||||
|
||||
# Source common utilities
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/common.sh" 2>/dev/null || {
|
||||
echo '{"continue": true}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Check dependencies (non-blocking)
|
||||
check_dependencies >/dev/null 2>&1 || true
|
||||
|
||||
# Read JSON input from stdin
|
||||
input=$(read_json_input)
|
||||
|
||||
# Extract workspace root
|
||||
workspace_root=$(json_get "$input" "workspace_roots[0]" "")
|
||||
if is_empty "$workspace_root"; then
|
||||
workspace_root=$(pwd)
|
||||
fi
|
||||
|
||||
# Get project name
|
||||
project_name=$(get_project_name "$workspace_root")
|
||||
|
||||
# Get worker port from settings
|
||||
worker_port=$(get_worker_port)
|
||||
|
||||
# Ensure worker is running (with retries)
|
||||
# This primes the worker before the session starts
|
||||
if ensure_worker_running "$worker_port" >/dev/null 2>&1; then
|
||||
# Refresh context file with latest observations
|
||||
project_encoded=$(url_encode "$project_name")
|
||||
context=$(curl -s -f "http://127.0.0.1:${worker_port}/api/context/inject?project=${project_encoded}" 2>/dev/null || echo "")
|
||||
|
||||
if [ -n "$context" ]; then
|
||||
rules_dir="${workspace_root}/.cursor/rules"
|
||||
rules_file="${rules_dir}/claude-mem-context.mdc"
|
||||
|
||||
# Create rules directory if it doesn't exist
|
||||
mkdir -p "$rules_dir" 2>/dev/null || true
|
||||
|
||||
# Write context as a Cursor rule with alwaysApply: true
|
||||
cat > "$rules_file" 2>/dev/null << EOF
|
||||
---
|
||||
alwaysApply: true
|
||||
description: "Claude-mem context from past sessions (auto-updated)"
|
||||
---
|
||||
|
||||
# Memory Context from Past Sessions
|
||||
|
||||
The following context is from claude-mem, a persistent memory system that tracks your coding sessions.
|
||||
|
||||
${context}
|
||||
|
||||
---
|
||||
*Updated after last session. Use claude-mem's MCP search tools for more detailed queries.*
|
||||
EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
# Allow prompt to continue
|
||||
echo '{"continue": true}'
|
||||
exit 0
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Installation script for claude-mem Cursor hooks
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
INSTALL_TYPE="${1:-user}" # 'user' (recommended) or 'project'
|
||||
|
||||
echo "Installing claude-mem Cursor hooks (${INSTALL_TYPE} level)..."
|
||||
|
||||
case "$INSTALL_TYPE" in
|
||||
"project")
|
||||
if [ ! -d ".cursor" ]; then
|
||||
mkdir -p .cursor
|
||||
fi
|
||||
TARGET_DIR=".cursor"
|
||||
HOOKS_DIR=".cursor/hooks"
|
||||
;;
|
||||
"user")
|
||||
TARGET_DIR="${HOME}/.cursor"
|
||||
HOOKS_DIR="${HOME}/.cursor/hooks"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid install type: $INSTALL_TYPE"
|
||||
echo "Usage: $0 [user (recommended)|project]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Create hooks directory
|
||||
mkdir -p "$HOOKS_DIR"
|
||||
|
||||
# Copy hook scripts
|
||||
echo "Copying hook scripts..."
|
||||
cp "$SCRIPT_DIR"/*.sh "$HOOKS_DIR/"
|
||||
chmod +x "$HOOKS_DIR"/*.sh
|
||||
|
||||
# Copy hooks.json
|
||||
echo "Copying hooks.json..."
|
||||
cp "$SCRIPT_DIR/hooks.json" "$TARGET_DIR/hooks.json"
|
||||
|
||||
# Update paths in hooks.json if needed
|
||||
# Use portable sed approach that works on both BSD (macOS) and GNU (Linux) sed
|
||||
if [ "$INSTALL_TYPE" = "project" ]; then
|
||||
# For project-level, paths should be relative
|
||||
# Create temp file, modify, then move (portable across sed variants)
|
||||
tmp_file=$(mktemp)
|
||||
sed 's|\./cursor-hooks/|\./\.cursor/hooks/|g' "$TARGET_DIR/hooks.json" > "$tmp_file"
|
||||
mv "$tmp_file" "$TARGET_DIR/hooks.json"
|
||||
else
|
||||
# For user-level, use absolute paths
|
||||
tmp_file=$(mktemp)
|
||||
sed "s|\./cursor-hooks/|${HOOKS_DIR}/|g" "$TARGET_DIR/hooks.json" > "$tmp_file"
|
||||
mv "$tmp_file" "$TARGET_DIR/hooks.json"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✓ Installation complete!"
|
||||
echo ""
|
||||
echo "Hooks installed to: $TARGET_DIR/hooks.json"
|
||||
echo "Scripts installed to: $HOOKS_DIR"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo "1. Ensure claude-mem worker is running:"
|
||||
echo " cd ~/.claude/plugins/marketplaces/thedotmack && npm run worker:start"
|
||||
echo ""
|
||||
echo "2. Restart Cursor to load the hooks"
|
||||
echo ""
|
||||
echo "3. Check Cursor Settings → Hooks tab to verify hooks are active"
|
||||
echo ""
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
# Save File Edit Hook for Cursor (PowerShell)
|
||||
# Captures file edits made by the agent
|
||||
# Maps file edits to claude-mem observations
|
||||
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
|
||||
# Source common utilities
|
||||
$commonPath = Join-Path $PSScriptRoot "common.ps1"
|
||||
if (Test-Path $commonPath) {
|
||||
. $commonPath
|
||||
} else {
|
||||
Write-Warning "common.ps1 not found, using fallback functions"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
$input = Read-JsonInput
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
$conversationId = Get-JsonField $input "conversation_id" ""
|
||||
$generationId = Get-JsonField $input "generation_id" ""
|
||||
$filePath = Get-JsonField $input "file_path" ""
|
||||
$workspaceRoot = Get-JsonField $input "workspace_roots[0]" ""
|
||||
|
||||
# Fallback to current directory if no workspace root
|
||||
if (Test-IsEmpty $workspaceRoot) {
|
||||
$workspaceRoot = Get-Location
|
||||
}
|
||||
|
||||
# Exit if no file_path
|
||||
if (Test-IsEmpty $filePath) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Use conversation_id as session_id, fallback to generation_id
|
||||
$sessionId = $conversationId
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
$sessionId = $generationId
|
||||
}
|
||||
|
||||
# Exit if no session_id available
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Get worker port from settings with validation
|
||||
$workerPort = Get-WorkerPort
|
||||
|
||||
# Extract edits array, defaulting to [] if invalid
|
||||
$edits = @()
|
||||
if ($input.PSObject.Properties.Name -contains "edits") {
|
||||
$edits = $input.edits
|
||||
if ($null -eq $edits -or -not ($edits -is [array])) {
|
||||
$edits = @()
|
||||
}
|
||||
}
|
||||
|
||||
# Exit if no edits
|
||||
if ($edits.Count -eq 0) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Create a summary of the edits for the observation
|
||||
$editSummaries = @()
|
||||
foreach ($edit in $edits) {
|
||||
$oldStr = ""
|
||||
$newStr = ""
|
||||
|
||||
if ($edit.PSObject.Properties.Name -contains "old_string") {
|
||||
$oldStr = $edit.old_string
|
||||
if ($oldStr.Length -gt 50) {
|
||||
$oldStr = $oldStr.Substring(0, 50) + "..."
|
||||
}
|
||||
}
|
||||
|
||||
if ($edit.PSObject.Properties.Name -contains "new_string") {
|
||||
$newStr = $edit.new_string
|
||||
if ($newStr.Length -gt 50) {
|
||||
$newStr = $newStr.Substring(0, 50) + "..."
|
||||
}
|
||||
}
|
||||
|
||||
$editSummaries += "$oldStr → $newStr"
|
||||
}
|
||||
|
||||
$editSummary = $editSummaries -join "; "
|
||||
if ([string]::IsNullOrEmpty($editSummary)) {
|
||||
$editSummary = "File edited"
|
||||
}
|
||||
|
||||
# Treat file edits as a "write_file" tool usage
|
||||
$toolInput = @{
|
||||
file_path = $filePath
|
||||
edits = $edits
|
||||
}
|
||||
|
||||
$toolResponse = @{
|
||||
success = $true
|
||||
summary = $editSummary
|
||||
}
|
||||
|
||||
$payload = @{
|
||||
contentSessionId = $sessionId
|
||||
tool_name = "write_file"
|
||||
tool_input = $toolInput
|
||||
tool_response = $toolResponse
|
||||
cwd = $workspaceRoot
|
||||
}
|
||||
|
||||
# Ensure worker is running (with retries like claude-mem hooks)
|
||||
if (-not (Test-WorkerReady -Port $workerPort)) {
|
||||
# Worker not ready - exit gracefully (don't block Cursor)
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Send observation to claude-mem worker (fire-and-forget)
|
||||
$uri = "http://127.0.0.1:$workerPort/api/sessions/observations"
|
||||
|
||||
try {
|
||||
$bodyJson = ConvertTo-JsonCompact $payload
|
||||
Invoke-RestMethod -Uri $uri -Method Post -Body $bodyJson -ContentType "application/json" -TimeoutSec 5 -ErrorAction SilentlyContinue | Out-Null
|
||||
} catch {
|
||||
# Ignore errors - don't block Cursor
|
||||
}
|
||||
|
||||
exit 0
|
||||
@@ -1,112 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Save File Edit Hook for Cursor
|
||||
# Captures file edits made by the agent
|
||||
# Maps file edits to claude-mem observations
|
||||
|
||||
# Source common utilities
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/common.sh" 2>/dev/null || {
|
||||
echo "Warning: common.sh not found, using fallback functions" >&2
|
||||
}
|
||||
|
||||
# Check dependencies (non-blocking)
|
||||
check_dependencies >/dev/null 2>&1 || true
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
input=$(read_json_input)
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
conversation_id=$(json_get "$input" "conversation_id" "")
|
||||
generation_id=$(json_get "$input" "generation_id" "")
|
||||
file_path=$(json_get "$input" "file_path" "")
|
||||
workspace_root=$(json_get "$input" "workspace_roots[0]" "")
|
||||
|
||||
# Fallback to current directory if no workspace root
|
||||
if is_empty "$workspace_root"; then
|
||||
workspace_root=$(pwd)
|
||||
fi
|
||||
|
||||
# Exit if no file_path
|
||||
if is_empty "$file_path"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Use conversation_id as session_id, fallback to generation_id
|
||||
session_id="$conversation_id"
|
||||
if is_empty "$session_id"; then
|
||||
session_id="$generation_id"
|
||||
fi
|
||||
|
||||
# Exit if no session_id available
|
||||
if is_empty "$session_id"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get worker port from settings with validation
|
||||
worker_port=$(get_worker_port)
|
||||
|
||||
# Extract edits array, defaulting to [] if invalid
|
||||
edits=$(echo "$input" | jq -c '.edits // []' 2>/dev/null || echo "[]")
|
||||
|
||||
# Validate edits is a valid JSON array
|
||||
if ! echo "$edits" | jq 'type == "array"' 2>/dev/null | grep -q true; then
|
||||
edits="[]"
|
||||
fi
|
||||
|
||||
# Exit if no edits
|
||||
if [ "$edits" = "[]" ] || is_empty "$edits"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Create a summary of the edits for the observation (with error handling)
|
||||
edit_summary=$(echo "$edits" | jq -r '[.[] | "\(.old_string[0:50] // "")... → \(.new_string[0:50] // "")..."] | join("; ")' 2>/dev/null || echo "File edited")
|
||||
|
||||
# Treat file edits as a "write_file" tool usage
|
||||
tool_input=$(jq -n \
|
||||
--arg path "$file_path" \
|
||||
--argjson edits "$edits" \
|
||||
'{
|
||||
file_path: $path,
|
||||
edits: $edits
|
||||
}' 2>/dev/null || echo '{}')
|
||||
|
||||
tool_response=$(jq -n \
|
||||
--arg summary "$edit_summary" \
|
||||
'{
|
||||
success: true,
|
||||
summary: $summary
|
||||
}' 2>/dev/null || echo '{}')
|
||||
|
||||
payload=$(jq -n \
|
||||
--arg sessionId "$session_id" \
|
||||
--arg cwd "$workspace_root" \
|
||||
--argjson toolInput "$tool_input" \
|
||||
--argjson toolResponse "$tool_response" \
|
||||
'{
|
||||
contentSessionId: $sessionId,
|
||||
tool_name: "write_file",
|
||||
tool_input: $toolInput,
|
||||
tool_response: $toolResponse,
|
||||
cwd: $cwd
|
||||
}' 2>/dev/null)
|
||||
|
||||
# Exit if payload creation failed
|
||||
if [ -z "$payload" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Ensure worker is running (with retries like claude-mem hooks)
|
||||
if ! ensure_worker_running "$worker_port"; then
|
||||
# Worker not ready - exit gracefully (don't block Cursor)
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Send observation to claude-mem worker (fire-and-forget)
|
||||
curl -s -X POST \
|
||||
"http://127.0.0.1:${worker_port}/api/sessions/observations" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$payload" \
|
||||
>/dev/null 2>&1 || true
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -1,126 +0,0 @@
|
||||
# Save Observation Hook for Cursor (PowerShell)
|
||||
# Captures MCP tool usage and shell command execution
|
||||
# Maps to claude-mem's save-hook functionality
|
||||
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
|
||||
# Source common utilities
|
||||
$commonPath = Join-Path $PSScriptRoot "common.ps1"
|
||||
if (Test-Path $commonPath) {
|
||||
. $commonPath
|
||||
} else {
|
||||
Write-Warning "common.ps1 not found, using fallback functions"
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
$input = Read-JsonInput
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
$conversationId = Get-JsonField $input "conversation_id" ""
|
||||
$generationId = Get-JsonField $input "generation_id" ""
|
||||
$workspaceRoot = Get-JsonField $input "workspace_roots[0]" ""
|
||||
|
||||
# Fallback to current directory if no workspace root
|
||||
if (Test-IsEmpty $workspaceRoot) {
|
||||
$workspaceRoot = Get-Location
|
||||
}
|
||||
|
||||
# Use conversation_id as session_id (stable across turns), fallback to generation_id
|
||||
$sessionId = $conversationId
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
$sessionId = $generationId
|
||||
}
|
||||
|
||||
# Exit if no session_id available
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Get worker port from settings with validation
|
||||
$workerPort = Get-WorkerPort
|
||||
|
||||
# Determine hook type and extract relevant data
|
||||
$hookEvent = Get-JsonField $input "hook_event_name" ""
|
||||
|
||||
$payload = $null
|
||||
|
||||
if ($hookEvent -eq "afterMCPExecution") {
|
||||
# MCP tool execution
|
||||
$toolName = Get-JsonField $input "tool_name" ""
|
||||
|
||||
if (Test-IsEmpty $toolName) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Extract tool_input and tool_response, defaulting to {} if invalid
|
||||
$toolInput = @{}
|
||||
$toolResponse = @{}
|
||||
|
||||
if ($input.PSObject.Properties.Name -contains "tool_input") {
|
||||
$toolInput = $input.tool_input
|
||||
if ($null -eq $toolInput) { $toolInput = @{} }
|
||||
}
|
||||
|
||||
if ($input.PSObject.Properties.Name -contains "result_json") {
|
||||
$toolResponse = $input.result_json
|
||||
if ($null -eq $toolResponse) { $toolResponse = @{} }
|
||||
}
|
||||
|
||||
# Prepare observation payload
|
||||
$payload = @{
|
||||
contentSessionId = $sessionId
|
||||
tool_name = $toolName
|
||||
tool_input = $toolInput
|
||||
tool_response = $toolResponse
|
||||
cwd = $workspaceRoot
|
||||
}
|
||||
|
||||
} elseif ($hookEvent -eq "afterShellExecution") {
|
||||
# Shell command execution
|
||||
$command = Get-JsonField $input "command" ""
|
||||
|
||||
if (Test-IsEmpty $command) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
$output = Get-JsonField $input "output" ""
|
||||
|
||||
# Treat shell commands as "Bash" tool usage
|
||||
$toolInput = @{ command = $command }
|
||||
$toolResponse = @{ output = $output }
|
||||
|
||||
$payload = @{
|
||||
contentSessionId = $sessionId
|
||||
tool_name = "Bash"
|
||||
tool_input = $toolInput
|
||||
tool_response = $toolResponse
|
||||
cwd = $workspaceRoot
|
||||
}
|
||||
|
||||
} else {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Exit if payload creation failed
|
||||
if ($null -eq $payload) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Ensure worker is running (with retries like claude-mem hooks)
|
||||
if (-not (Test-WorkerReady -Port $workerPort)) {
|
||||
# Worker not ready - exit gracefully (don't block Cursor)
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Send observation to claude-mem worker (fire-and-forget)
|
||||
$uri = "http://127.0.0.1:$workerPort/api/sessions/observations"
|
||||
|
||||
try {
|
||||
$bodyJson = ConvertTo-JsonCompact $payload
|
||||
Invoke-RestMethod -Uri $uri -Method Post -Body $bodyJson -ContentType "application/json" -TimeoutSec 5 -ErrorAction SilentlyContinue | Out-Null
|
||||
} catch {
|
||||
# Ignore errors - don't block Cursor
|
||||
}
|
||||
|
||||
exit 0
|
||||
@@ -1,129 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Save Observation Hook for Cursor
|
||||
# Captures MCP tool usage and shell command execution
|
||||
# Maps to claude-mem's save-hook functionality
|
||||
|
||||
# Source common utilities
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/common.sh" 2>/dev/null || {
|
||||
echo "Warning: common.sh not found, using fallback functions" >&2
|
||||
}
|
||||
|
||||
# Check dependencies (non-blocking)
|
||||
check_dependencies >/dev/null 2>&1 || true
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
input=$(read_json_input)
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
conversation_id=$(json_get "$input" "conversation_id" "")
|
||||
generation_id=$(json_get "$input" "generation_id" "")
|
||||
workspace_root=$(json_get "$input" "workspace_roots[0]" "")
|
||||
|
||||
# Fallback to current directory if no workspace root
|
||||
if is_empty "$workspace_root"; then
|
||||
workspace_root=$(pwd)
|
||||
fi
|
||||
|
||||
# Use conversation_id as session_id (stable across turns), fallback to generation_id
|
||||
session_id="$conversation_id"
|
||||
if is_empty "$session_id"; then
|
||||
session_id="$generation_id"
|
||||
fi
|
||||
|
||||
# Exit if no session_id available
|
||||
if is_empty "$session_id"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get worker port from settings with validation
|
||||
worker_port=$(get_worker_port)
|
||||
|
||||
# Determine hook type and extract relevant data
|
||||
hook_event=$(json_get "$input" "hook_event_name" "")
|
||||
|
||||
if [ "$hook_event" = "afterMCPExecution" ]; then
|
||||
# MCP tool execution
|
||||
tool_name=$(json_get "$input" "tool_name" "")
|
||||
|
||||
if is_empty "$tool_name"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Extract tool_input and tool_response, defaulting to {} if invalid
|
||||
tool_input=$(echo "$input" | jq -c '.tool_input // {}' 2>/dev/null || echo "{}")
|
||||
tool_response=$(echo "$input" | jq -c '.result_json // {}' 2>/dev/null || echo "{}")
|
||||
|
||||
# Validate JSON
|
||||
if ! echo "$tool_input" | jq empty 2>/dev/null; then
|
||||
tool_input="{}"
|
||||
fi
|
||||
if ! echo "$tool_response" | jq empty 2>/dev/null; then
|
||||
tool_response="{}"
|
||||
fi
|
||||
|
||||
# Prepare observation payload
|
||||
payload=$(jq -n \
|
||||
--arg sessionId "$session_id" \
|
||||
--arg toolName "$tool_name" \
|
||||
--argjson toolInput "$tool_input" \
|
||||
--argjson toolResponse "$tool_response" \
|
||||
--arg cwd "$workspace_root" \
|
||||
'{
|
||||
contentSessionId: $sessionId,
|
||||
tool_name: $toolName,
|
||||
tool_input: $toolInput,
|
||||
tool_response: $toolResponse,
|
||||
cwd: $cwd
|
||||
}' 2>/dev/null)
|
||||
|
||||
elif [ "$hook_event" = "afterShellExecution" ]; then
|
||||
# Shell command execution
|
||||
command=$(json_get "$input" "command" "")
|
||||
|
||||
if is_empty "$command"; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
output=$(json_get "$input" "output" "")
|
||||
|
||||
# Treat shell commands as "Bash" tool usage
|
||||
tool_input=$(jq -n --arg cmd "$command" '{command: $cmd}' 2>/dev/null || echo '{}')
|
||||
tool_response=$(jq -n --arg out "$output" '{output: $out}' 2>/dev/null || echo '{}')
|
||||
|
||||
payload=$(jq -n \
|
||||
--arg sessionId "$session_id" \
|
||||
--arg cwd "$workspace_root" \
|
||||
--argjson toolInput "$tool_input" \
|
||||
--argjson toolResponse "$tool_response" \
|
||||
'{
|
||||
contentSessionId: $sessionId,
|
||||
tool_name: "Bash",
|
||||
tool_input: $toolInput,
|
||||
tool_response: $toolResponse,
|
||||
cwd: $cwd
|
||||
}' 2>/dev/null)
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Exit if payload creation failed
|
||||
if [ -z "$payload" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Ensure worker is running (with retries like claude-mem hooks)
|
||||
if ! ensure_worker_running "$worker_port"; then
|
||||
# Worker not ready - exit gracefully (don't block Cursor)
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Send observation to claude-mem worker (fire-and-forget)
|
||||
curl -s -X POST \
|
||||
"http://127.0.0.1:${worker_port}/api/sessions/observations" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$payload" \
|
||||
>/dev/null 2>&1 || true
|
||||
|
||||
exit 0
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
# Session Initialization Hook for Cursor (PowerShell)
|
||||
# Maps to claude-mem's new-hook functionality
|
||||
# Initializes a new session when a prompt is submitted
|
||||
#
|
||||
# NOTE: This hook runs as part of beforeSubmitPrompt and MUST output valid JSON
|
||||
# with at least {"continue": true} to allow prompt submission.
|
||||
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
|
||||
# Source common utilities
|
||||
$commonPath = Join-Path $PSScriptRoot "common.ps1"
|
||||
if (Test-Path $commonPath) {
|
||||
. $commonPath
|
||||
} else {
|
||||
# Fallback - output continue and exit
|
||||
Write-Output '{"continue": true}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
$input = Read-JsonInput
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
$conversationId = Get-JsonField $input "conversation_id" ""
|
||||
$generationId = Get-JsonField $input "generation_id" ""
|
||||
$prompt = Get-JsonField $input "prompt" ""
|
||||
$workspaceRoot = Get-JsonField $input "workspace_roots[0]" ""
|
||||
|
||||
# Fallback to current directory if no workspace root
|
||||
if (Test-IsEmpty $workspaceRoot) {
|
||||
$workspaceRoot = Get-Location
|
||||
}
|
||||
|
||||
# Get project name from workspace root
|
||||
$projectName = Get-ProjectName $workspaceRoot
|
||||
|
||||
# Use conversation_id as session_id (stable across turns), fallback to generation_id
|
||||
$sessionId = $conversationId
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
$sessionId = $generationId
|
||||
}
|
||||
|
||||
# Exit gracefully if no session_id available (still allow prompt)
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
Write-Output '{"continue": true}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Get worker port from settings with validation
|
||||
$workerPort = Get-WorkerPort
|
||||
|
||||
# Ensure worker is running (with retries like claude-mem hooks)
|
||||
if (-not (Test-WorkerReady -Port $workerPort)) {
|
||||
# Worker not ready - still allow prompt to continue
|
||||
Write-Output '{"continue": true}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Strip leading slash from commands for memory agent (parity with new-hook.ts)
|
||||
# /review 101 → review 101 (more semantic for observations)
|
||||
$cleanedPrompt = $prompt
|
||||
if (-not [string]::IsNullOrEmpty($prompt) -and $prompt.StartsWith("/")) {
|
||||
$cleanedPrompt = $prompt.Substring(1)
|
||||
}
|
||||
|
||||
# Initialize session via HTTP - handles DB operations and privacy checks
|
||||
$payload = @{
|
||||
contentSessionId = $sessionId
|
||||
project = $projectName
|
||||
prompt = $cleanedPrompt
|
||||
}
|
||||
|
||||
# Send request to worker (fire-and-forget, don't wait for response)
|
||||
$uri = "http://127.0.0.1:$workerPort/api/sessions/init"
|
||||
Send-HttpPostAsync -Uri $uri -Body $payload
|
||||
|
||||
# Always allow prompt to continue
|
||||
Write-Output '{"continue": true}'
|
||||
exit 0
|
||||
@@ -1,93 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Session Initialization Hook for Cursor
|
||||
# Maps to claude-mem's new-hook functionality
|
||||
# Initializes a new session when a prompt is submitted
|
||||
#
|
||||
# NOTE: This hook runs as part of beforeSubmitPrompt and MUST output valid JSON
|
||||
# with at least {"continue": true} to allow prompt submission.
|
||||
|
||||
# Source common utilities
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/common.sh" 2>/dev/null || {
|
||||
# Fallback - output continue and exit
|
||||
echo '{"continue": true}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Check dependencies (non-blocking - just warn)
|
||||
check_dependencies >/dev/null 2>&1 || true
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
input=$(read_json_input)
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
conversation_id=$(json_get "$input" "conversation_id" "")
|
||||
generation_id=$(json_get "$input" "generation_id" "")
|
||||
prompt=$(json_get "$input" "prompt" "")
|
||||
workspace_root=$(json_get "$input" "workspace_roots[0]" "")
|
||||
|
||||
# Fallback to current directory if no workspace root
|
||||
if is_empty "$workspace_root"; then
|
||||
workspace_root=$(pwd)
|
||||
fi
|
||||
|
||||
# Get project name from workspace root
|
||||
project_name=$(get_project_name "$workspace_root")
|
||||
|
||||
# Use conversation_id as session_id (stable across turns), fallback to generation_id
|
||||
session_id="$conversation_id"
|
||||
if is_empty "$session_id"; then
|
||||
session_id="$generation_id"
|
||||
fi
|
||||
|
||||
# Exit gracefully if no session_id available (still allow prompt)
|
||||
if is_empty "$session_id"; then
|
||||
echo '{"continue": true}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get worker port from settings with validation
|
||||
worker_port=$(get_worker_port)
|
||||
|
||||
# Ensure worker is running (with retries like claude-mem hooks)
|
||||
if ! ensure_worker_running "$worker_port"; then
|
||||
# Worker not ready - still allow prompt to continue
|
||||
echo '{"continue": true}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Strip leading slash from commands for memory agent (parity with new-hook.ts)
|
||||
# /review 101 → review 101 (more semantic for observations)
|
||||
cleaned_prompt="$prompt"
|
||||
if [ -n "$prompt" ] && [ "${prompt:0:1}" = "/" ]; then
|
||||
cleaned_prompt="${prompt:1}"
|
||||
fi
|
||||
|
||||
# Initialize session via HTTP - handles DB operations and privacy checks
|
||||
payload=$(jq -n \
|
||||
--arg sessionId "$session_id" \
|
||||
--arg project "$project_name" \
|
||||
--arg promptText "$cleaned_prompt" \
|
||||
'{
|
||||
contentSessionId: $sessionId,
|
||||
project: $project,
|
||||
prompt: $promptText
|
||||
}' 2>/dev/null)
|
||||
|
||||
# Exit if payload creation failed (still allow prompt)
|
||||
if [ -z "$payload" ]; then
|
||||
echo '{"continue": true}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Send request to worker (fire-and-forget, don't wait for response)
|
||||
curl -s -X POST \
|
||||
"http://127.0.0.1:${worker_port}/api/sessions/init" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$payload" \
|
||||
>/dev/null 2>&1 &
|
||||
|
||||
# Always allow prompt to continue
|
||||
echo '{"continue": true}'
|
||||
exit 0
|
||||
|
||||
@@ -1,108 +0,0 @@
|
||||
# Session Summary Hook for Cursor (stop) - PowerShell
|
||||
# Called when agent loop ends
|
||||
#
|
||||
# This hook:
|
||||
# 1. Generates session summary
|
||||
# 2. Updates context file for next session
|
||||
#
|
||||
# Output: Empty JSON {} or {"followup_message": "..."} for auto-iteration
|
||||
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
|
||||
# Source common utilities
|
||||
$commonPath = Join-Path $PSScriptRoot "common.ps1"
|
||||
if (Test-Path $commonPath) {
|
||||
. $commonPath
|
||||
} else {
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
$input = Read-JsonInput
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
$conversationId = Get-JsonField $input "conversation_id" ""
|
||||
$generationId = Get-JsonField $input "generation_id" ""
|
||||
$workspaceRoot = Get-JsonField $input "workspace_roots[0]" ""
|
||||
$status = Get-JsonField $input "status" "completed"
|
||||
|
||||
# Fallback workspace to current directory
|
||||
if (Test-IsEmpty $workspaceRoot) {
|
||||
$workspaceRoot = Get-Location
|
||||
}
|
||||
|
||||
# Get project name
|
||||
$projectName = Get-ProjectName $workspaceRoot
|
||||
|
||||
# Use conversation_id as session_id, fallback to generation_id
|
||||
$sessionId = $conversationId
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
$sessionId = $generationId
|
||||
}
|
||||
|
||||
# Exit if no session_id available
|
||||
if (Test-IsEmpty $sessionId) {
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Get worker port from settings with validation
|
||||
$workerPort = Get-WorkerPort
|
||||
|
||||
# Ensure worker is running (with retries)
|
||||
if (-not (Test-WorkerReady -Port $workerPort)) {
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# 1. Request summary generation (fire-and-forget)
|
||||
# Note: Cursor doesn't provide transcript_path like Claude Code does,
|
||||
# so we can't extract last_user_message and last_assistant_message.
|
||||
$summaryPayload = @{
|
||||
contentSessionId = $sessionId
|
||||
last_user_message = ""
|
||||
last_assistant_message = ""
|
||||
}
|
||||
|
||||
$summaryUri = "http://127.0.0.1:$workerPort/api/sessions/summarize"
|
||||
Send-HttpPostAsync -Uri $summaryUri -Body $summaryPayload
|
||||
|
||||
# 2. Update context file for next session
|
||||
# Fetch fresh context (includes observations from this session)
|
||||
$projectEncoded = Get-UrlEncodedString $projectName
|
||||
$contextUri = "http://127.0.0.1:$workerPort/api/context/inject?project=$projectEncoded"
|
||||
$context = Get-HttpResponse -Uri $contextUri
|
||||
|
||||
if (-not [string]::IsNullOrEmpty($context)) {
|
||||
$rulesDir = Join-Path $workspaceRoot ".cursor\rules"
|
||||
$rulesFile = Join-Path $rulesDir "claude-mem-context.mdc"
|
||||
|
||||
# Create rules directory if it doesn't exist
|
||||
if (-not (Test-Path $rulesDir)) {
|
||||
New-Item -ItemType Directory -Path $rulesDir -Force | Out-Null
|
||||
}
|
||||
|
||||
# Write context as a Cursor rule with alwaysApply: true
|
||||
$ruleContent = @"
|
||||
---
|
||||
alwaysApply: true
|
||||
description: "Claude-mem context from past sessions (auto-updated)"
|
||||
---
|
||||
|
||||
# Memory Context from Past Sessions
|
||||
|
||||
The following context is from claude-mem, a persistent memory system that tracks your coding sessions.
|
||||
|
||||
$context
|
||||
|
||||
---
|
||||
*Updated after last session. Use claude-mem's MCP search tools for more detailed queries.*
|
||||
"@
|
||||
|
||||
Set-Content -Path $rulesFile -Value $ruleContent -Encoding UTF8 -Force
|
||||
}
|
||||
|
||||
# Output empty JSON - no followup message
|
||||
Write-Output '{}'
|
||||
exit 0
|
||||
@@ -1,111 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Session Summary Hook for Cursor (stop)
|
||||
# Called when agent loop ends
|
||||
#
|
||||
# This hook:
|
||||
# 1. Generates session summary
|
||||
# 2. Updates context file for next session
|
||||
#
|
||||
# Output: Empty JSON {} or {"followup_message": "..."} for auto-iteration
|
||||
|
||||
# Source common utilities
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${SCRIPT_DIR}/common.sh" 2>/dev/null || {
|
||||
echo '{}'
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Check dependencies (non-blocking)
|
||||
check_dependencies >/dev/null 2>&1 || true
|
||||
|
||||
# Read JSON input from stdin with error handling
|
||||
input=$(read_json_input)
|
||||
|
||||
# Extract common fields with safe fallbacks
|
||||
conversation_id=$(json_get "$input" "conversation_id" "")
|
||||
generation_id=$(json_get "$input" "generation_id" "")
|
||||
workspace_root=$(json_get "$input" "workspace_roots[0]" "")
|
||||
status=$(json_get "$input" "status" "completed")
|
||||
|
||||
# Fallback workspace to current directory
|
||||
if is_empty "$workspace_root"; then
|
||||
workspace_root=$(pwd)
|
||||
fi
|
||||
|
||||
# Get project name
|
||||
project_name=$(get_project_name "$workspace_root")
|
||||
|
||||
# Use conversation_id as session_id, fallback to generation_id
|
||||
session_id="$conversation_id"
|
||||
if is_empty "$session_id"; then
|
||||
session_id="$generation_id"
|
||||
fi
|
||||
|
||||
# Exit if no session_id available
|
||||
if is_empty "$session_id"; then
|
||||
echo '{}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Get worker port from settings with validation
|
||||
worker_port=$(get_worker_port)
|
||||
|
||||
# Ensure worker is running (with retries)
|
||||
if ! ensure_worker_running "$worker_port"; then
|
||||
echo '{}'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# 1. Request summary generation (fire-and-forget)
|
||||
# Note: Cursor doesn't provide transcript_path like Claude Code does,
|
||||
# so we can't extract last_user_message and last_assistant_message.
|
||||
payload=$(jq -n \
|
||||
--arg sessionId "$session_id" \
|
||||
'{
|
||||
contentSessionId: $sessionId,
|
||||
last_user_message: "",
|
||||
last_assistant_message: ""
|
||||
}' 2>/dev/null)
|
||||
|
||||
if [ -n "$payload" ]; then
|
||||
curl -s -X POST \
|
||||
"http://127.0.0.1:${worker_port}/api/sessions/summarize" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$payload" \
|
||||
>/dev/null 2>&1 &
|
||||
fi
|
||||
|
||||
# 2. Update context file for next session
|
||||
# Fetch fresh context (includes observations from this session)
|
||||
project_encoded=$(url_encode "$project_name")
|
||||
context=$(curl -s -f "http://127.0.0.1:${worker_port}/api/context/inject?project=${project_encoded}" 2>/dev/null || echo "")
|
||||
|
||||
if [ -n "$context" ]; then
|
||||
rules_dir="${workspace_root}/.cursor/rules"
|
||||
rules_file="${rules_dir}/claude-mem-context.mdc"
|
||||
|
||||
# Create rules directory if it doesn't exist
|
||||
mkdir -p "$rules_dir" 2>/dev/null || true
|
||||
|
||||
# Write context as a Cursor rule with alwaysApply: true
|
||||
cat > "$rules_file" 2>/dev/null << EOF
|
||||
---
|
||||
alwaysApply: true
|
||||
description: "Claude-mem context from past sessions (auto-updated)"
|
||||
---
|
||||
|
||||
# Memory Context from Past Sessions
|
||||
|
||||
The following context is from claude-mem, a persistent memory system that tracks your coding sessions.
|
||||
|
||||
${context}
|
||||
|
||||
---
|
||||
*Updated after last session. Use claude-mem's MCP search tools for more detailed queries.*
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Output empty JSON - no followup message
|
||||
echo '{}'
|
||||
exit 0
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
# User Message Hook for Cursor (PowerShell)
|
||||
# Displays context information to the user
|
||||
# Maps to claude-mem's user-message-hook functionality
|
||||
# Note: Cursor doesn't have a direct equivalent, but we can output to stderr
|
||||
# for visibility in Cursor's output channels
|
||||
#
|
||||
# This is an OPTIONAL hook. It can be added to beforeSubmitPrompt if desired,
|
||||
# but may be verbose since it runs on every prompt submission.
|
||||
|
||||
$ErrorActionPreference = "SilentlyContinue"
|
||||
|
||||
# Read JSON input from stdin (if any)
|
||||
$inputJson = $null
|
||||
try {
|
||||
$inputText = [Console]::In.ReadToEnd()
|
||||
if (-not [string]::IsNullOrEmpty($inputText)) {
|
||||
$inputJson = $inputText | ConvertFrom-Json -ErrorAction SilentlyContinue
|
||||
}
|
||||
} catch {
|
||||
$inputJson = $null
|
||||
}
|
||||
|
||||
# Extract workspace root
|
||||
$workspaceRoot = ""
|
||||
if ($null -ne $inputJson -and $inputJson.PSObject.Properties.Name -contains "workspace_roots") {
|
||||
$wsRoots = $inputJson.workspace_roots
|
||||
if ($null -ne $wsRoots -and $wsRoots.Count -gt 0) {
|
||||
$workspaceRoot = $wsRoots[0]
|
||||
}
|
||||
}
|
||||
|
||||
if ([string]::IsNullOrEmpty($workspaceRoot)) {
|
||||
$workspaceRoot = Get-Location
|
||||
}
|
||||
|
||||
# Get project name
|
||||
$projectName = Split-Path $workspaceRoot -Leaf
|
||||
if ([string]::IsNullOrEmpty($projectName)) {
|
||||
$projectName = "unknown-project"
|
||||
}
|
||||
|
||||
# Get worker port from settings
|
||||
$settingsPath = Join-Path $env:USERPROFILE ".claude-mem\settings.json"
|
||||
$workerPort = 37777
|
||||
|
||||
if (Test-Path $settingsPath) {
|
||||
try {
|
||||
$settings = Get-Content $settingsPath -Raw | ConvertFrom-Json
|
||||
if ($settings.CLAUDE_MEM_WORKER_PORT) {
|
||||
$workerPort = [int]$settings.CLAUDE_MEM_WORKER_PORT
|
||||
}
|
||||
} catch {
|
||||
# Use default
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure worker is running
|
||||
$maxRetries = 75
|
||||
$workerReady = $false
|
||||
|
||||
for ($i = 0; $i -lt $maxRetries; $i++) {
|
||||
try {
|
||||
$response = Invoke-RestMethod -Uri "http://127.0.0.1:$workerPort/api/readiness" -Method Get -TimeoutSec 1 -ErrorAction Stop
|
||||
$workerReady = $true
|
||||
break
|
||||
} catch {
|
||||
Start-Sleep -Milliseconds 200
|
||||
}
|
||||
}
|
||||
|
||||
# If worker not ready, exit silently
|
||||
if (-not $workerReady) {
|
||||
exit 0
|
||||
}
|
||||
|
||||
# Fetch formatted context from worker API (with colors)
|
||||
$projectEncoded = [System.Uri]::EscapeDataString($projectName)
|
||||
$contextUrl = "http://127.0.0.1:$workerPort/api/context/inject?project=$projectEncoded&colors=true"
|
||||
|
||||
$output = $null
|
||||
try {
|
||||
$output = Invoke-RestMethod -Uri $contextUrl -Method Get -TimeoutSec 5 -ErrorAction Stop
|
||||
} catch {
|
||||
$output = $null
|
||||
}
|
||||
|
||||
# Output to stderr for visibility (parity with user-message-hook.ts)
|
||||
# Note: Cursor may not display stderr the same way Claude Code does,
|
||||
# but this is the best we can do without direct UI integration
|
||||
if (-not [string]::IsNullOrEmpty($output)) {
|
||||
[Console]::Error.WriteLine("")
|
||||
[Console]::Error.WriteLine("📝 Claude-Mem Context Loaded")
|
||||
[Console]::Error.WriteLine(" ℹ️ Viewing context from past sessions")
|
||||
[Console]::Error.WriteLine("")
|
||||
[Console]::Error.WriteLine($output)
|
||||
[Console]::Error.WriteLine("")
|
||||
[Console]::Error.WriteLine("💡 Tip: Wrap content with <private> ... </private> to prevent storing sensitive information.")
|
||||
[Console]::Error.WriteLine("💬 Community: https://discord.gg/J4wttp9vDu")
|
||||
[Console]::Error.WriteLine("📺 Web Viewer: http://localhost:$workerPort/")
|
||||
[Console]::Error.WriteLine("")
|
||||
}
|
||||
|
||||
exit 0
|
||||
@@ -1,70 +0,0 @@
|
||||
#!/bin/bash
|
||||
# User Message Hook for Cursor
|
||||
# Displays context information to the user
|
||||
# Maps to claude-mem's user-message-hook functionality
|
||||
# Note: Cursor doesn't have a direct equivalent, but we can output to stderr
|
||||
# for visibility in Cursor's output channels
|
||||
#
|
||||
# This is an OPTIONAL hook. It can be added to beforeSubmitPrompt if desired,
|
||||
# but may be verbose since it runs on every prompt submission.
|
||||
|
||||
# Read JSON input from stdin (if any)
|
||||
input=$(cat 2>/dev/null || echo "{}")
|
||||
|
||||
# Extract workspace root
|
||||
workspace_root=$(echo "$input" | jq -r '.workspace_roots[0] // empty' 2>/dev/null || echo "")
|
||||
|
||||
if [ -z "$workspace_root" ]; then
|
||||
workspace_root=$(pwd)
|
||||
fi
|
||||
|
||||
# Get project name
|
||||
project_name=$(basename "$workspace_root" 2>/dev/null || echo "unknown-project")
|
||||
|
||||
# Get worker port from settings
|
||||
data_dir="${HOME}/.claude-mem"
|
||||
settings_file="${data_dir}/settings.json"
|
||||
worker_port="37777"
|
||||
|
||||
if [ -f "$settings_file" ]; then
|
||||
worker_port=$(jq -r '.CLAUDE_MEM_WORKER_PORT // "37777"' "$settings_file" 2>/dev/null || echo "37777")
|
||||
fi
|
||||
|
||||
# Ensure worker is running
|
||||
max_retries=75
|
||||
retry_count=0
|
||||
while [ $retry_count -lt $max_retries ]; do
|
||||
if curl -s -f "http://127.0.0.1:${worker_port}/api/readiness" > /dev/null 2>&1; then
|
||||
break
|
||||
fi
|
||||
sleep 0.2
|
||||
retry_count=$((retry_count + 1))
|
||||
done
|
||||
|
||||
# If worker not ready, exit silently
|
||||
if [ $retry_count -eq $max_retries ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Fetch formatted context from worker API (with colors)
|
||||
context_url="http://127.0.0.1:${worker_port}/api/context/inject?project=${project_name}&colors=true"
|
||||
output=$(curl -s -f "$context_url" 2>/dev/null || echo "")
|
||||
|
||||
# Output to stderr for visibility (parity with user-message-hook.ts)
|
||||
# Note: Cursor may not display stderr the same way Claude Code does,
|
||||
# but this is the best we can do without direct UI integration
|
||||
if [ -n "$output" ]; then
|
||||
echo "" >&2
|
||||
echo "📝 Claude-Mem Context Loaded" >&2
|
||||
echo " ℹ️ Viewing context from past sessions" >&2
|
||||
echo "" >&2
|
||||
echo "$output" >&2
|
||||
echo "" >&2
|
||||
echo "💡 Tip: Wrap content with <private> ... </private> to prevent storing sensitive information." >&2
|
||||
echo "💬 Community: https://discord.gg/J4wttp9vDu" >&2
|
||||
echo "📺 Web Viewer: http://localhost:${worker_port}/" >&2
|
||||
echo "" >&2
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
||||
+63
-14
@@ -3,32 +3,81 @@
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 29, 2025
|
||||
### Nov 6, 2025
|
||||
|
||||
**docs**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34316 | 11:02 PM | 🔵 | Mintlify Documentation Structure Identified | ~242 |
|
||||
| #4241 | 11:19 PM | 🟣 | Object-Oriented Architecture Design Document Created | ~662 |
|
||||
| #4240 | 11:11 PM | 🟣 | Worker Service Rewrite Blueprint Created | ~541 |
|
||||
| #4239 | 11:07 PM | 🟣 | Comprehensive Worker Service Performance Analysis Document Created | ~541 |
|
||||
| #4238 | 10:59 PM | 🔵 | Overhead Analysis Document Checked | ~203 |
|
||||
|
||||
### Jan 1, 2026
|
||||
### Nov 7, 2025
|
||||
|
||||
**SESSION_ID_ARCHITECTURE.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35668 | 11:40 PM | ✅ | Main branch updated with major feature additions | ~377 |
|
||||
| #35565 | 9:55 PM | ✅ | Session ID architecture documentation created | ~510 |
|
||||
| #4609 | 6:33 PM | ✅ | PR #69 Successfully Merged to Main Branch | ~516 |
|
||||
| #4600 | 6:31 PM | 🟣 | Added Worker Service Documentation Suite | ~441 |
|
||||
| #4597 | " | 🔄 | Worker Service Refactored to Object-Oriented Architecture | ~473 |
|
||||
|
||||
### Jan 3, 2026
|
||||
### Nov 8, 2025
|
||||
|
||||
**SESSION_ID_ARCHITECTURE.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #36689 | 11:56 PM | 🔵 | PR #538 Review Findings - Modular Architecture Refactor | ~590 |
|
||||
| #36632 | 10:45 PM | 🔵 | SESSION_ID_ARCHITECTURE.md Documents Placeholder Pattern With ContentSessionId | ~584 |
|
||||
| #36625 | 10:44 PM | 🔵 | Documentation and Code Reveal Placeholder Detection Pattern | ~583 |
|
||||
| #5539 | 10:20 PM | 🔵 | Harsh critical audit of context-hook reveals systematic anti-patterns | ~3154 |
|
||||
| #5497 | 9:29 PM | 🔵 | Harsh critical audit of context-hook reveals systematic anti-patterns | ~2815 |
|
||||
| #5495 | 9:28 PM | 🔵 | Context Hook Audit Reveals Project Anti-Patterns | ~660 |
|
||||
| #5476 | 9:17 PM | 🔵 | Critical Code Audit Identified 14 Anti-Patterns in Context Hook | ~887 |
|
||||
| #5391 | 8:45 PM | 🔵 | Critical Code Quality Audit of Context Hook Implementation | ~720 |
|
||||
| #5150 | 7:37 PM | 🟣 | Troubleshooting Skill Added to Claude-Mem Plugin | ~427 |
|
||||
|
||||
### Nov 9, 2025
|
||||
|
||||
**anti-pattern-cleanup-plan.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #36390 | 8:50 PM | 🔄 | Comprehensive Monolith Refactor with Modular Architecture | ~724 |
|
||||
| #6161 | 11:55 PM | 🔵 | YC W26 Application Research and Preparation Completed for Claude-Mem | ~1628 |
|
||||
| #6155 | 11:47 PM | ✅ | Comprehensive Y Combinator Winter 2026 Application Notes Created | ~1045 |
|
||||
| #5979 | 7:58 PM | 🔵 | Smart Contextualization Feature Architecture | ~560 |
|
||||
| #5971 | 7:49 PM | 🔵 | Hooks Reference Documentation Structure | ~448 |
|
||||
| #5929 | 7:08 PM | ✅ | Documentation Updates for v5.4.0 Skill-Based Search Migration | ~604 |
|
||||
| #5927 | " | ✅ | Updated Configuration Documentation for Skill-Based Search | ~497 |
|
||||
| #5920 | 7:05 PM | ✅ | Renamed Architecture Documentation File Reference | ~271 |
|
||||
|
||||
### Nov 18, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #11515 | 8:22 PM | 🔵 | Smart Contextualization Architecture Retrieved with Command Hook Pattern Details | ~502 |
|
||||
|
||||
### Dec 8, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #22294 | 9:43 PM | 🔵 | Documentation Site Structure Located | ~359 |
|
||||
|
||||
### Dec 12, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #24430 | 8:27 PM | ✅ | Removed Final Platform Check Reference from Linux Section | ~320 |
|
||||
| #24429 | " | ✅ | Final Platform Check Reference Removal from Linux Section | ~274 |
|
||||
| #24428 | " | ✅ | Corrected Second Line Number Reference for Migration Marker Logic | ~267 |
|
||||
| #24427 | 8:26 PM | ✅ | Updated Line Number Reference for PM2 Cleanup Implementation | ~260 |
|
||||
| #24426 | " | ✅ | Removed Platform Check from Manual Marker Deletion Scenario | ~338 |
|
||||
| #24425 | " | ✅ | Removed Platform Check from Fresh Install Scenario Flow | ~314 |
|
||||
| #24424 | 8:25 PM | ✅ | Renumbered Manual Marker Deletion Scenario | ~285 |
|
||||
| #24423 | " | ✅ | Renumbered Fresh Install Scenario | ~243 |
|
||||
| #24422 | " | ✅ | Removed Obsolete Windows Platform Detection Scenario | ~311 |
|
||||
| #24421 | " | ✅ | Removed Platform Check from macOS Migration Documentation | ~294 |
|
||||
| #24420 | 8:24 PM | ✅ | Platform Check Removed from Migration Documentation | ~288 |
|
||||
| #24417 | 8:16 PM | ✅ | Code Reference Example Updated to Reflect Actual Cross-Platform Implementation | ~366 |
|
||||
| #24416 | " | ✅ | Architecture Decision Documentation Updated to Reflect Cross-Platform PM2 Cleanup Rationale | ~442 |
|
||||
| #24415 | 8:15 PM | ✅ | Migration Marker Lifecycle Documentation Updated for Unified Cross-Platform Behavior | ~463 |
|
||||
| #24414 | " | ✅ | Platform Comparison Table Updated to Reflect Unified Cross-Platform Migration | ~351 |
|
||||
| #24413 | " | ✅ | Windows Platform-Specific Documentation Completely Rewritten for Unified Migration | ~428 |
|
||||
| #24412 | " | ✅ | User Experience Timeline Updated for Cross-Platform PM2 Cleanup | ~291 |
|
||||
| #24411 | 8:14 PM | ✅ | Migration Marker Lifecycle Documentation Updated for All Platforms | ~277 |
|
||||
| #24410 | " | ✅ | Marker File Platform Behavior Documentation Updated for Unified Migration | ~282 |
|
||||
| #24409 | " | ✅ | Migration Steps Documentation Updated for Cross-Platform PM2 Cleanup | ~278 |
|
||||
| #24408 | 8:13 PM | ✅ | PM2 Migration Documentation Updated to Remove Windows Platform Check | ~280 |
|
||||
</claude-mem-context>
|
||||
@@ -0,0 +1,213 @@
|
||||
# Claude-Mem PR Shipping Report
|
||||
*Generated: 2026-02-04*
|
||||
|
||||
## Executive Summary
|
||||
|
||||
6 PRs analyzed for shipping readiness. **1 is ready to merge**, 4 have conflicts, 1 is too large for easy review.
|
||||
|
||||
| PR | Title | Status | Recommendation |
|
||||
|----|-------|--------|----------------|
|
||||
| **#856** | Idle timeout for zombie processes | ✅ **MERGEABLE** | **Ship it** |
|
||||
| #700 | Windows Terminal popup fix | ⚠️ Conflicts | Rebase, then ship |
|
||||
| #722 | In-process worker architecture | ⚠️ Conflicts | Rebase, high impact |
|
||||
| #657 | generate/clean CLI commands | ⚠️ Conflicts | Rebase, then ship |
|
||||
| #863 | Ragtime email investigation | 🔍 Needs review | Research pending |
|
||||
| #464 | Sleep Agent Pipeline (contributor) | 🔴 Too large | Request split or dedicated review |
|
||||
|
||||
---
|
||||
|
||||
## Ready to Ship
|
||||
|
||||
### PR #856: Idle Timeout for Zombie Observer Processes
|
||||
**Status:** ✅ MERGEABLE (no conflicts)
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Additions | 928 |
|
||||
| Deletions | 171 |
|
||||
| Files | 8 |
|
||||
| Risk | Low-Medium |
|
||||
|
||||
**What it does:**
|
||||
- Adds 3-minute idle timeout to `SessionQueueProcessor`
|
||||
- Prevents zombie observer processes that were causing 13.4GB swap usage
|
||||
- Processes exit gracefully after inactivity instead of waiting forever
|
||||
|
||||
**Why ship it:**
|
||||
- Fixes real user-reported issue (79 zombie processes)
|
||||
- Well-tested (11 new tests, 440 lines of test coverage)
|
||||
- Clean implementation, preventive approach
|
||||
- Supersedes PR #848's reactive cleanup
|
||||
- No conflicts, ready to merge
|
||||
|
||||
**Review notes:**
|
||||
- 1 Greptile bot comment (addressed)
|
||||
- Race condition fix included
|
||||
- Enhanced logging added
|
||||
|
||||
---
|
||||
|
||||
## Needs Rebase (Have Conflicts)
|
||||
|
||||
### PR #700: Windows Terminal Popup Fix
|
||||
**Status:** ⚠️ CONFLICTING
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Additions | 187 |
|
||||
| Deletions | 399 |
|
||||
| Files | 8 |
|
||||
| Risk | Medium |
|
||||
|
||||
**What it does:**
|
||||
- Eliminates Windows Terminal popup by removing spawn-based daemon
|
||||
- Worker `start` command becomes daemon directly (no child spawn)
|
||||
- Removes `restart` command (users do `stop` then `start`)
|
||||
- Net simplification: -212 lines
|
||||
|
||||
**Breaking changes:**
|
||||
- `restart` command removed
|
||||
|
||||
**Review status:**
|
||||
- ✅ 1 APPROVAL from @volkanfirat (Jan 15, 2026)
|
||||
|
||||
**Action needed:** Resolve conflicts, then ready to ship.
|
||||
|
||||
---
|
||||
|
||||
### PR #722: In-Process Worker Architecture
|
||||
**Status:** ⚠️ CONFLICTING
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Additions | 869 |
|
||||
| Deletions | 4,658 |
|
||||
| Files | 112 |
|
||||
| Risk | High |
|
||||
|
||||
**What it does:**
|
||||
- Hook processes become the worker (no separate daemon spawning)
|
||||
- First hook that needs worker becomes the worker
|
||||
- Eliminates Windows spawn issues ("NO SPAWN" rule)
|
||||
- 761 tests pass
|
||||
|
||||
**Architectural impact:** HIGH
|
||||
- Fundamentally changes worker lifecycle
|
||||
- Hook processes stay alive (they ARE the worker)
|
||||
- First hook wins port 37777, others use HTTP
|
||||
|
||||
**Action needed:** Resolve conflicts. Consider relationship with PR #700 (both touch worker architecture).
|
||||
|
||||
---
|
||||
|
||||
### PR #657: Generate/Clean CLI Commands
|
||||
**Status:** ⚠️ CONFLICTING
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Additions | 1,184 |
|
||||
| Deletions | 5,057 |
|
||||
| Files | 104 |
|
||||
| Risk | Medium |
|
||||
|
||||
**What it does:**
|
||||
- Adds `claude-mem generate` and `claude-mem clean` CLI commands
|
||||
- Fixes validation bugs (deleted folders recreated from stale DB)
|
||||
- Fixes Windows path handling
|
||||
- Adds automatic shell alias installation
|
||||
- Disables subdirectory CLAUDE.md files by default
|
||||
|
||||
**Breaking changes:**
|
||||
- Default behavior change: folder CLAUDE.md now disabled by default
|
||||
|
||||
**Action needed:** Resolve conflicts, complete Windows testing.
|
||||
|
||||
---
|
||||
|
||||
## Needs Attention
|
||||
|
||||
### PR #863: Ragtime Email Investigation
|
||||
**Status:** 🔍 Research pending
|
||||
|
||||
Research agent did not return results. Manual review needed.
|
||||
|
||||
---
|
||||
|
||||
### PR #464: Sleep Agent Pipeline (Contributor: @laihenyi)
|
||||
**Status:** 🔴 Too large for effective review
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Additions | 15,430 |
|
||||
| Deletions | 469 |
|
||||
| Files | 73 |
|
||||
| Wait time | 37+ days |
|
||||
| Risk | High |
|
||||
|
||||
**What it does:**
|
||||
- Sleep Agent Pipeline with memory tiering
|
||||
- Supersession detection
|
||||
- Session Statistics API (`/api/session/:id/stats`)
|
||||
- StatusLine + PreCompact hooks
|
||||
- Context Generator improvements
|
||||
- Self-healing CI workflow
|
||||
|
||||
**Concerns:**
|
||||
| Issue | Details |
|
||||
|-------|---------|
|
||||
| 🔴 Size | 15K+ lines is too large for effective review |
|
||||
| 🔴 SupersessionDetector | Single file with 1,282 additions |
|
||||
| 🟡 No tests visible | Test plan checkboxes unchecked |
|
||||
| 🟡 Self-healing CI | Auto-fix workflow could cause infinite commit loops |
|
||||
| 🟡 Serena config | Adds `.serena/` tooling |
|
||||
|
||||
**Recommendation:**
|
||||
1. **Option A:** Request contributor split into 4-5 smaller PRs
|
||||
2. **Option B:** Allocate dedicated review time (several hours)
|
||||
3. **Option C:** Cherry-pick specific features (hooks, stats API)
|
||||
|
||||
**Note:** Contributor has been waiting 37+ days. Deserves response either way.
|
||||
|
||||
---
|
||||
|
||||
## Shipping Strategy
|
||||
|
||||
### Phase 1: Quick Wins (This Week)
|
||||
1. **Merge #856** — Ready now, fixes real user issue
|
||||
2. **Rebase #700** — Has approval, Windows fix needed
|
||||
3. **Rebase #657** — Useful CLI commands
|
||||
|
||||
### Phase 2: Architecture (Careful Review)
|
||||
4. **Review #722** — High impact, conflicts with #700 approach?
|
||||
- Both PRs eliminate spawning but in different ways
|
||||
- May need to pick one approach
|
||||
|
||||
### Phase 3: Contributor PR
|
||||
5. **Respond to #464** — Options:
|
||||
- Ask for split
|
||||
- Schedule dedicated review
|
||||
- Cherry-pick subset
|
||||
|
||||
### Phase 4: Investigation
|
||||
6. **Manual review #863** — Ragtime email feature
|
||||
|
||||
---
|
||||
|
||||
## Conflict Resolution Order
|
||||
|
||||
Since multiple PRs have conflicts, suggested rebase order:
|
||||
|
||||
1. **#856** (merge first — no conflicts)
|
||||
2. **#700** (rebase onto main after #856)
|
||||
3. **#657** (rebase onto main after #700)
|
||||
4. **#722** (rebase last — may conflict with #700 architecturally)
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
| Ready | Conflicts | Needs Work |
|
||||
|-------|-----------|------------|
|
||||
| 1 PR (#856) | 3 PRs (#700, #722, #657) | 2 PRs (#464, #863) |
|
||||
|
||||
**Immediate action:** Merge #856, then rebase the conflict PRs in order.
|
||||
@@ -0,0 +1,79 @@
|
||||
# Version Consistency Fix (Issue #XXX)
|
||||
|
||||
## Problem
|
||||
Version mismatch between plugin and worker caused infinite restart loop:
|
||||
- Plugin version: 9.0.0 (from plugin/.claude-plugin/plugin.json)
|
||||
- Worker binary version: 8.5.9 (hardcoded in bundled worker-service.cjs)
|
||||
|
||||
This triggered the auto-restart mechanism on every hook call, which killed the SDK generator before it could complete the Claude API call to generate observations. Result: 0 observations were ever saved to the database despite hooks firing successfully.
|
||||
|
||||
## Root Cause
|
||||
The `plugin/package.json` file had version `8.5.10` instead of `9.0.0`. When the project was last built, the build script correctly injected the version from root `package.json` into the bundled worker service. However, the `plugin/package.json` was manually created/edited and fell out of sync.
|
||||
|
||||
At runtime:
|
||||
1. Worker service reads version from `~/.claude/plugins/marketplaces/thedotmack/package.json` → gets `8.5.10`
|
||||
2. Running worker returns built-in version via `/api/version` → returns `8.5.9` (from old build)
|
||||
3. Version check in `worker-service.ts` start command detects mismatch
|
||||
4. Auto-restart triggered on every hook call
|
||||
5. Observations never saved
|
||||
|
||||
## Solution
|
||||
1. Updated `plugin/package.json` from version `8.5.10` to `9.0.0`
|
||||
2. Rebuilt all hooks and worker service to inject correct version (`9.0.0`) into bundled artifacts
|
||||
3. Added comprehensive test suite to prevent future version mismatches
|
||||
|
||||
## Verification
|
||||
All versions now match:
|
||||
```
|
||||
Root package.json: 9.0.0 ✓
|
||||
plugin/package.json: 9.0.0 ✓
|
||||
plugin.json: 9.0.0 ✓
|
||||
marketplace.json: 9.0.0 ✓
|
||||
worker-service.cjs: 9.0.0 ✓
|
||||
```
|
||||
|
||||
## Prevention
|
||||
To prevent this issue in the future:
|
||||
|
||||
1. **Automated Build Process**: The `scripts/build-hooks.js` now regenerates `plugin/package.json` automatically with the correct version from root `package.json`
|
||||
|
||||
2. **Version Consistency Tests**: Added `tests/infrastructure/version-consistency.test.ts` to verify all version sources match
|
||||
|
||||
3. **Version Management Best Practices**:
|
||||
- NEVER manually edit `plugin/package.json` - it's auto-generated during build
|
||||
- Always update version in root `package.json` only
|
||||
- Run `npm run build` after version changes
|
||||
- The build script will sync the version to all necessary locations
|
||||
|
||||
## Files Changed
|
||||
- `plugin/package.json` - Updated version from 8.5.10 to 9.0.0
|
||||
- `plugin/scripts/worker-service.cjs` - Rebuilt with version 9.0.0 injected
|
||||
- `plugin/scripts/mcp-server.cjs` - Rebuilt with version 9.0.0 injected
|
||||
- `plugin/scripts/*.js` (hooks) - Rebuilt with version 9.0.0 injected
|
||||
- `tests/infrastructure/version-consistency.test.ts` - New test suite
|
||||
|
||||
## Testing
|
||||
Run the version consistency test:
|
||||
```bash
|
||||
npm run test:infra
|
||||
```
|
||||
|
||||
Or manually verify:
|
||||
```bash
|
||||
node -e "
|
||||
const fs = require('fs');
|
||||
const rootPkg = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
|
||||
const pluginPkg = JSON.parse(fs.readFileSync('plugin/package.json', 'utf-8'));
|
||||
const workerContent = fs.readFileSync('plugin/scripts/worker-service.cjs', 'utf-8');
|
||||
const workerMatch = workerContent.match(/Bre=\"([0-9.]+)\"/);
|
||||
console.log('Root:', rootPkg.version);
|
||||
console.log('Plugin:', pluginPkg.version);
|
||||
console.log('Worker:', workerMatch ? workerMatch[1] : 'NOT_FOUND');
|
||||
"
|
||||
```
|
||||
|
||||
## Related Code Locations
|
||||
- **Version Injection**: `scripts/build-hooks.js` line 43-45, 105, 130, 155, 178
|
||||
- **Version Check**: `src/services/infrastructure/HealthMonitor.ts` line 133-143
|
||||
- **Auto-Restart Logic**: `src/services/worker-service.ts` line 627-645
|
||||
- **Runtime Version Read**: `src/shared/worker-utils.ts` line 73-76, 82-91
|
||||
@@ -0,0 +1,98 @@
|
||||
---
|
||||
Title: Bug: SDK Agent fails on Windows when username contains spaces
|
||||
---
|
||||
|
||||
## Bug Report
|
||||
|
||||
**Summary:** Claude SDK Agent fails to start on Windows when the user's path contains spaces (e.g., `C:\Users\Anderson Wang\`), causing PostToolUse hooks to hang indefinitely.
|
||||
|
||||
**Severity:** High - Core functionality broken
|
||||
|
||||
**Affected Platform:** Windows only
|
||||
|
||||
---
|
||||
|
||||
## Symptoms
|
||||
|
||||
PostToolUse hook displays `(1/2 done)` indefinitely. Worker logs show:
|
||||
|
||||
```
|
||||
ERROR [SESSION] Generator failed {provider=claude, error=Claude Code process exited with code 1}
|
||||
ERROR [SESSION] Generator exited unexpectedly
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Root Cause
|
||||
|
||||
Two issues in the Windows code path:
|
||||
|
||||
1. **`SDKAgent.ts`** - Returns full auto-detected path with spaces:
|
||||
```
|
||||
C:\Users\Anderson Wang\AppData\Roaming\npm\claude.cmd
|
||||
```
|
||||
|
||||
2. **`ProcessRegistry.ts`** - Node.js `spawn()` cannot directly execute `.cmd` files when the path contains spaces
|
||||
|
||||
---
|
||||
|
||||
## Proposed Fix
|
||||
|
||||
### File 1: `src/services/worker/SDKAgent.ts`
|
||||
|
||||
On Windows, prefer `claude.cmd` via PATH instead of full auto-detected path:
|
||||
|
||||
```typescript
|
||||
// On Windows, prefer "claude.cmd" (via PATH) to avoid spawn issues with spaces in paths
|
||||
if (process.platform === 'win32') {
|
||||
try {
|
||||
execSync('where claude.cmd', { encoding: 'utf8', windowsHide: true, stdio: ['ignore', 'pipe', 'ignore'] });
|
||||
return 'claude.cmd'; // Let Windows resolve via PATHEXT
|
||||
} catch {
|
||||
// Fall through to generic error
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### File 2: `src/services/worker/ProcessRegistry.ts`
|
||||
|
||||
Use `cmd.exe /d /c` wrapper for .cmd files on Windows:
|
||||
|
||||
```typescript
|
||||
const useCmdWrapper = process.platform === 'win32' && spawnOptions.command.endsWith('.cmd');
|
||||
|
||||
if (useCmdWrapper) {
|
||||
child = spawn('cmd.exe', ['/d', '/c', spawnOptions.command, ...spawnOptions.args], {
|
||||
cwd: spawnOptions.cwd,
|
||||
env: spawnOptions.env,
|
||||
stdio: ['pipe', 'pipe', 'pipe'],
|
||||
signal: spawnOptions.signal,
|
||||
windowsHide: true
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Why This Works
|
||||
|
||||
- **PATHEXT Resolution:** Windows searches PATH and tries each extension in PATHEXT automatically
|
||||
- **cmd.exe wrapper:** Properly handles paths with spaces and argument passing
|
||||
- **Avoids shell parsing:** Using direct arguments instead of `shell: true` prevents empty string misparsing
|
||||
|
||||
---
|
||||
|
||||
## Testing
|
||||
|
||||
Verified on Windows 11 with username containing spaces:
|
||||
- PostToolUse hook completes successfully
|
||||
- Observations are stored to database
|
||||
- No more "process exited with code 1" errors
|
||||
|
||||
---
|
||||
|
||||
## Additional Notes
|
||||
|
||||
- Maintains backward compatibility with `CLAUDE_CODE_PATH` setting
|
||||
- No impact on non-Windows platforms
|
||||
- Related to Issue #733 (credential isolation) - separate fix
|
||||
@@ -1,107 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 30, 2025
|
||||
|
||||
**agent-sdk-v2-docs.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34477 | 2:25 PM | ✅ | V2 Upgrade Branch Modifies Four Files with Net Code Reduction | ~328 |
|
||||
| #34466 | 2:24 PM | 🔵 | Agent SDK V2 Documentation Reveals Correct API Surface | ~399 |
|
||||
| #34425 | 2:04 PM | 🔵 | Agent SDK V2 API Documentation and Migration Patterns | ~698 |
|
||||
| #34422 | 2:03 PM | ✅ | Added Agent SDK V2 Documentation Files | ~240 |
|
||||
| #34419 | 2:02 PM | ✅ | Committed Agent SDK V2 upgrade preparation | ~275 |
|
||||
| #34394 | 1:52 PM | 🔵 | Agent SDK V2 Documentation Shows session.close() Method for Cleanup | ~417 |
|
||||
|
||||
**agent-sdk-v2-example.ts**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34431 | 2:06 PM | 🔵 | V2 SDK Executable Example Code Patterns | ~710 |
|
||||
| #34428 | 2:05 PM | 🔵 | Agent SDK v2 Example File Reading Requested | ~204 |
|
||||
| #34411 | 1:55 PM | ⚖️ | Agent SDK V2 Migration Plan Created | ~519 |
|
||||
| #34410 | " | ⚖️ | Agent SDK V2 Migration Strategy Analysis | ~499 |
|
||||
| #34406 | 1:54 PM | 🔵 | Comprehensive V2 Migration Analysis Shows Architectural Incompatibility | ~556 |
|
||||
| #34401 | " | 🔵 | Agent SDK V2 API Design and Patterns | ~435 |
|
||||
|
||||
### Dec 31, 2025
|
||||
|
||||
**agent-sdk-v2-preview.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34635 | 3:04 PM | 🟣 | Documentation-First Workflow Design Document Created | ~769 |
|
||||
| #34616 | 2:59 PM | ⚖️ | Documentation-First Workflow Agent Analyzing V2 SDK Examples and Patterns | ~515 |
|
||||
| #34581 | 2:44 PM | 🔵 | V2 Session API Official Documentation Confirms Clear Separation Pattern | ~446 |
|
||||
|
||||
**agent-sdk-v2-examples.ts**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34605 | 2:57 PM | 🔵 | V2 SDK Migration Failure Root Cause: Context Rot and Knowledge Transfer Gaps | ~550 |
|
||||
| #34583 | 2:44 PM | 🔵 | Executable V2 Examples Demonstrate All Core Patterns With Crystal Clear Code | ~471 |
|
||||
| #34580 | 2:43 PM | 🔵 | V2 Session API Documentation Shows Clear Send/Receive Pattern Despite Naming Confusion | ~364 |
|
||||
|
||||
### Jan 1, 2026
|
||||
|
||||
**try-catch-audit-report.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35635 | 11:14 PM | ✅ | Removed Temporary Try-Catch Audit Report | ~224 |
|
||||
| #35463 | 8:59 PM | 🟣 | Enforceable Anti-Pattern Detection System for Try-Catch Abuse | ~485 |
|
||||
| #35462 | " | 🟣 | Error handling audit tooling and documentation added | ~271 |
|
||||
| #35435 | 8:46 PM | ✅ | Try-Catch Audit Report Documented in Markdown | ~781 |
|
||||
|
||||
**agent-sdk-v2-examples.ts**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35429 | 6:32 PM | ⚖️ | KISS Principle Applied to SDKAgent.ts Defensive Code | ~322 |
|
||||
| #35412 | 5:25 PM | 🔵 | Canonical Example Shows Cost Tracking Without Token Usage Checks | ~289 |
|
||||
| #35406 | 5:24 PM | ⚖️ | Categorized Conditionals as Required Business Logic vs Defensive Code | ~377 |
|
||||
| #35404 | " | 🔵 | Canonical V2 SDK Patterns Require Message Type Checking | ~313 |
|
||||
| #35398 | 5:23 PM | 🟣 | Added comprehensive Claude Agent SDK V2 examples | ~231 |
|
||||
| #35383 | 3:11 PM | 🔵 | Phase 2 code quality review identified 5 critical bugs | ~604 |
|
||||
| #35382 | 3:08 PM | ✅ | Phase 2 Anti-Pattern Recheck Passed | ~315 |
|
||||
| #35379 | 3:07 PM | 🔵 | Phase 2 Anti-Pattern Check Found Content Extraction Bug | ~373 |
|
||||
| #35353 | 3:01 PM | 🔵 | Phase 2 preparation analysis completed | ~502 |
|
||||
| #35340 | 2:58 PM | 🔵 | Phase 1 Anti-Pattern Check Reveals V1/V2 API Mismatch | ~352 |
|
||||
| #35330 | 2:54 PM | 🔵 | Claude Agent SDK V2 API Pattern Documentation | ~305 |
|
||||
| #35329 | 2:53 PM | 🔵 | Agent SDK V2 API patterns and capabilities | ~453 |
|
||||
| #35292 | 1:23 PM | 🔵 | Agent SDK query() resume parameter: SDK-generated session IDs cannot be predetermined | ~543 |
|
||||
|
||||
**sdkagent-removal-list.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35425 | 5:27 PM | ✅ | Reorganized Removal List with DELETE/SIMPLIFY Section Header | ~240 |
|
||||
| #35424 | " | ✅ | Revised Token Tracking from Delete to Simplify with Hardcoded Zero | ~365 |
|
||||
| #35416 | 5:25 PM | 🟣 | Created Actionable Removal Checklist for SDKAgent.ts Cleanup | ~431 |
|
||||
|
||||
**agent-sdk-v2-preview.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35414 | 5:25 PM | 🔵 | V2 Preview Documentation Shows Direct Result Access Pattern | ~281 |
|
||||
| #35289 | 1:23 PM | 🔵 | Agent SDK V2 preview documentation: Explicit session lifecycle with createSession and resumeSession | ~523 |
|
||||
|
||||
**sdkagent-conditional-logic-CORRECTED.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35409 | 5:24 PM | 🟣 | Created Comprehensive Conditional Logic Removal Report | ~488 |
|
||||
|
||||
**dont-be-an-idiot.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35400 | 5:23 PM | 🔄 | Phase 1 SDK V2 migration - Updated imports and added API documentation | ~294 |
|
||||
| #35347 | 3:01 PM | ✅ | Phase 1 commit completed via Task agent | ~374 |
|
||||
| #35346 | " | ✅ | Committed Phase 1 of V2 API migration | ~333 |
|
||||
| #35345 | 3:00 PM | ✅ | Phase 1 Changes Committed to Git | ~338 |
|
||||
| #35343 | " | ✅ | Phase 1 Git Status Shows Modified Files | ~315 |
|
||||
| #35334 | 2:55 PM | 🔵 | V2 SDK Migration Preparation Complete | ~368 |
|
||||
| #35332 | 2:54 PM | 🟣 | SDK V2 API Documentation Created | ~305 |
|
||||
| #35331 | " | ✅ | Created documentation affirming V2 API stability | ~358 |
|
||||
|
||||
### Jan 2, 2026
|
||||
|
||||
**try-catch-audit-report.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #35703 | 1:01 PM | ⚖️ | Try-Catch as Anti-Pattern: Root Cause Analysis and Documentation | ~363 |
|
||||
</claude-mem-context>
|
||||
@@ -0,0 +1,338 @@
|
||||
# Get started with Claude Code hooks
|
||||
|
||||
> Learn how to customize and extend Claude Code's behavior by registering shell commands
|
||||
|
||||
Claude Code hooks are user-defined shell commands that execute at various points
|
||||
in Claude Code's lifecycle. Hooks provide deterministic control over Claude
|
||||
Code's behavior, ensuring certain actions always happen rather than relying on
|
||||
the LLM to choose to run them.
|
||||
|
||||
<Tip>
|
||||
For reference documentation on hooks, see [Hooks reference](/en/hooks).
|
||||
</Tip>
|
||||
|
||||
Example use cases for hooks include:
|
||||
|
||||
* **Notifications**: Customize how you get notified when Claude Code is awaiting
|
||||
your input or permission to run something.
|
||||
* **Automatic formatting**: Run `prettier` on .ts files, `gofmt` on .go files,
|
||||
etc. after every file edit.
|
||||
* **Logging**: Track and count all executed commands for compliance or
|
||||
debugging.
|
||||
* **Feedback**: Provide automated feedback when Claude Code produces code that
|
||||
does not follow your codebase conventions.
|
||||
* **Custom permissions**: Block modifications to production files or sensitive
|
||||
directories.
|
||||
|
||||
By encoding these rules as hooks rather than prompting instructions, you turn
|
||||
suggestions into app-level code that executes every time it is expected to run.
|
||||
|
||||
<Warning>
|
||||
You must consider the security implication of hooks as you add them, because hooks run automatically during the agent loop with your current environment's credentials.
|
||||
For example, malicious hooks code can exfiltrate your data. Always review your hooks implementation before registering them.
|
||||
|
||||
For full security best practices, see [Security Considerations](/en/hooks#security-considerations) in the hooks reference documentation.
|
||||
</Warning>
|
||||
|
||||
## Hook Events Overview
|
||||
|
||||
Claude Code provides several hook events that run at different points in the
|
||||
workflow:
|
||||
|
||||
* **PreToolUse**: Runs before tool calls (can block them)
|
||||
* **PermissionRequest**: Runs when a permission dialog is shown (can allow or deny)
|
||||
* **PostToolUse**: Runs after tool calls complete
|
||||
* **UserPromptSubmit**: Runs when the user submits a prompt, before Claude processes it
|
||||
* **Notification**: Runs when Claude Code sends notifications
|
||||
* **Stop**: Runs when Claude Code finishes responding
|
||||
* **SubagentStop**: Runs when subagent tasks complete
|
||||
* **PreCompact**: Runs before Claude Code is about to run a compact operation
|
||||
* **SessionStart**: Runs when Claude Code starts a new session or resumes an existing session
|
||||
* **SessionEnd**: Runs when Claude Code session ends
|
||||
|
||||
Each event receives different data and can control Claude's behavior in
|
||||
different ways.
|
||||
|
||||
## Quickstart
|
||||
|
||||
In this quickstart, you'll add a hook that logs the shell commands that Claude
|
||||
Code runs.
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Install `jq` for JSON processing in the command line.
|
||||
|
||||
### Step 1: Open hooks configuration
|
||||
|
||||
Run the `/hooks` [slash command](/en/slash-commands) and select
|
||||
the `PreToolUse` hook event.
|
||||
|
||||
`PreToolUse` hooks run before tool calls and can block them while providing
|
||||
Claude feedback on what to do differently.
|
||||
|
||||
### Step 2: Add a matcher
|
||||
|
||||
Select `+ Add new matcher…` to run your hook only on Bash tool calls.
|
||||
|
||||
Type `Bash` for the matcher.
|
||||
|
||||
<Note>You can use `*` to match all tools.</Note>
|
||||
|
||||
### Step 3: Add the hook
|
||||
|
||||
Select `+ Add new hook…` and enter this command:
|
||||
|
||||
```bash theme={null}
|
||||
jq -r '"\(.tool_input.command) - \(.tool_input.description // "No description")"' >> ~/.claude/bash-command-log.txt
|
||||
```
|
||||
|
||||
### Step 4: Save your configuration
|
||||
|
||||
For storage location, select `User settings` since you're logging to your home
|
||||
directory. This hook will then apply to all projects, not just your current
|
||||
project.
|
||||
|
||||
Then press `Esc` until you return to the REPL. Your hook is now registered.
|
||||
|
||||
### Step 5: Verify your hook
|
||||
|
||||
Run `/hooks` again or check `~/.claude/settings.json` to see your configuration:
|
||||
|
||||
```json theme={null}
|
||||
{
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "Bash",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "jq -r '\"\\(.tool_input.command) - \\(.tool_input.description // \"No description\")\"' >> ~/.claude/bash-command-log.txt"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 6: Test your hook
|
||||
|
||||
Ask Claude to run a simple command like `ls` and check your log file:
|
||||
|
||||
```bash theme={null}
|
||||
cat ~/.claude/bash-command-log.txt
|
||||
```
|
||||
|
||||
You should see entries like:
|
||||
|
||||
```
|
||||
ls - Lists files and directories
|
||||
```
|
||||
|
||||
## More Examples
|
||||
|
||||
<Note>
|
||||
For a complete example implementation, see the [bash command validator example](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py) in our public codebase.
|
||||
</Note>
|
||||
|
||||
### Code Formatting Hook
|
||||
|
||||
Automatically format TypeScript files after editing:
|
||||
|
||||
```json theme={null}
|
||||
{
|
||||
"hooks": {
|
||||
"PostToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "jq -r '.tool_input.file_path' | { read file_path; if echo \"$file_path\" | grep -q '\\.ts$'; then npx prettier --write \"$file_path\"; fi; }"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Markdown Formatting Hook
|
||||
|
||||
Automatically fix missing language tags and formatting issues in markdown files:
|
||||
|
||||
```json theme={null}
|
||||
{
|
||||
"hooks": {
|
||||
"PostToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/markdown_formatter.py"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Create `.claude/hooks/markdown_formatter.py` with this content:
|
||||
|
||||
````python theme={null}
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Markdown formatter for Claude Code output.
|
||||
Fixes missing language tags and spacing issues while preserving code content.
|
||||
"""
|
||||
import json
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
|
||||
def detect_language(code):
|
||||
"""Best-effort language detection from code content."""
|
||||
s = code.strip()
|
||||
|
||||
# JSON detection
|
||||
if re.search(r'^\s*[{\[]', s):
|
||||
try:
|
||||
json.loads(s)
|
||||
return 'json'
|
||||
except:
|
||||
pass
|
||||
|
||||
# Python detection
|
||||
if re.search(r'^\s*def\s+\w+\s*\(', s, re.M) or \
|
||||
re.search(r'^\s*(import|from)\s+\w+', s, re.M):
|
||||
return 'python'
|
||||
|
||||
# JavaScript detection
|
||||
if re.search(r'\b(function\s+\w+\s*\(|const\s+\w+\s*=)', s) or \
|
||||
re.search(r'=>|console\.(log|error)', s):
|
||||
return 'javascript'
|
||||
|
||||
# Bash detection
|
||||
if re.search(r'^#!.*\b(bash|sh)\b', s, re.M) or \
|
||||
re.search(r'\b(if|then|fi|for|in|do|done)\b', s):
|
||||
return 'bash'
|
||||
|
||||
# SQL detection
|
||||
if re.search(r'\b(SELECT|INSERT|UPDATE|DELETE|CREATE)\s+', s, re.I):
|
||||
return 'sql'
|
||||
|
||||
return 'text'
|
||||
|
||||
def format_markdown(content):
|
||||
"""Format markdown content with language detection."""
|
||||
# Fix unlabeled code fences
|
||||
def add_lang_to_fence(match):
|
||||
indent, info, body, closing = match.groups()
|
||||
if not info.strip():
|
||||
lang = detect_language(body)
|
||||
return f"{indent}```{lang}\n{body}{closing}\n"
|
||||
return match.group(0)
|
||||
|
||||
fence_pattern = r'(?ms)^([ \t]{0,3})```([^\n]*)\n(.*?)(\n\1```)\s*$'
|
||||
content = re.sub(fence_pattern, add_lang_to_fence, content)
|
||||
|
||||
# Fix excessive blank lines (only outside code fences)
|
||||
content = re.sub(r'\n{3,}', '\n\n', content)
|
||||
|
||||
return content.rstrip() + '\n'
|
||||
|
||||
# Main execution
|
||||
try:
|
||||
input_data = json.load(sys.stdin)
|
||||
file_path = input_data.get('tool_input', {}).get('file_path', '')
|
||||
|
||||
if not file_path.endswith(('.md', '.mdx')):
|
||||
sys.exit(0) # Not a markdown file
|
||||
|
||||
if os.path.exists(file_path):
|
||||
with open(file_path, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
formatted = format_markdown(content)
|
||||
|
||||
if formatted != content:
|
||||
with open(file_path, 'w', encoding='utf-8') as f:
|
||||
f.write(formatted)
|
||||
print(f"✓ Fixed markdown formatting in {file_path}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error formatting markdown: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
````
|
||||
|
||||
Make the script executable:
|
||||
|
||||
```bash theme={null}
|
||||
chmod +x .claude/hooks/markdown_formatter.py
|
||||
```
|
||||
|
||||
This hook automatically:
|
||||
|
||||
* Detects programming languages in unlabeled code blocks
|
||||
* Adds appropriate language tags for syntax highlighting
|
||||
* Fixes excessive blank lines while preserving code content
|
||||
* Only processes markdown files (`.md`, `.mdx`)
|
||||
|
||||
### Custom Notification Hook
|
||||
|
||||
Get desktop notifications when Claude needs input:
|
||||
|
||||
```json theme={null}
|
||||
{
|
||||
"hooks": {
|
||||
"Notification": [
|
||||
{
|
||||
"matcher": "",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "notify-send 'Claude Code' 'Awaiting your input'"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### File Protection Hook
|
||||
|
||||
Block edits to sensitive files:
|
||||
|
||||
```json theme={null}
|
||||
{
|
||||
"hooks": {
|
||||
"PreToolUse": [
|
||||
{
|
||||
"matcher": "Edit|Write",
|
||||
"hooks": [
|
||||
{
|
||||
"type": "command",
|
||||
"command": "python3 -c \"import json, sys; data=json.load(sys.stdin); path=data.get('tool_input',{}).get('file_path',''); sys.exit(2 if any(p in path for p in ['.env', 'package-lock.json', '.git/']) else 0)\""
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Learn more
|
||||
|
||||
* For reference documentation on hooks, see [Hooks reference](/en/hooks).
|
||||
* For comprehensive security best practices and safety guidelines, see [Security Considerations](/en/hooks#security-considerations) in the hooks reference documentation.
|
||||
* For troubleshooting steps and debugging techniques, see [Debugging](/en/hooks#debugging) in the hooks reference
|
||||
documentation.
|
||||
|
||||
|
||||
---
|
||||
|
||||
> To find navigation and other pages in this documentation, fetch the llms.txt file at: https://code.claude.com/docs/llms.txt
|
||||
@@ -1,38 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 12, 2025
|
||||
|
||||
**README.ar.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #24246 | 2:43 AM | 🟣 | Comprehensive Translation System Added with 22 Language READMEs | ~386 |
|
||||
|
||||
**README.zh.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #24241 | 2:35 AM | ✅ | Internationalized README Files Moved to Dedicated i18n Directory | ~284 |
|
||||
|
||||
### Dec 22, 2025
|
||||
|
||||
**README.ja.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #31948 | 8:08 PM | ✅ | Batch Updated All Translation READMEs with Language Navigation | ~400 |
|
||||
|
||||
**README.zh.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #31947 | 8:07 PM | ✅ | Added Language Navigation Menu to Chinese Translation README | ~412 |
|
||||
| #31945 | 8:06 PM | 🟣 | Multi-language navigation added to internationalized README files | ~386 |
|
||||
| #31942 | 8:01 PM | 🔵 | Internationalization Documentation Coverage | ~315 |
|
||||
|
||||
### Dec 28, 2025
|
||||
|
||||
**README.*.md**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #33540 | 10:55 PM | 🔵 | Grep search found mem-search references in internationalized documentation | ~577 |
|
||||
</claude-mem-context>
|
||||
+55
-47
@@ -1,5 +1,4 @@
|
||||
🌐 هذه ترجمة آلية. نرحب بالتصحيحات من المجتمع!
|
||||
|
||||
<section dir="rtl">
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
@@ -14,6 +13,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -33,6 +33,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -43,7 +44,8 @@
|
||||
<a href="README.no.md">🇳🇴 Norsk</a>
|
||||
</p>
|
||||
|
||||
<h4 align="center">نظام ضغط الذاكرة المستمرة المبني لـ <a href="https://claude.com/claude-code" target="_blank">Claude Code</a>.</h4>
|
||||
<h4 align="center">أداة إضافية لـ <a href="https://claude.com/claude-code" target="_blank">Claude Code</a> تعمل على أتمتة تسجيل معلومات الجلسات السابقه، وضغطها, ثم حقن السياق ذي الصلة في الجلسات المستقبلية.
|
||||
</h4>
|
||||
|
||||
<p align="center">
|
||||
<a href="LICENSE">
|
||||
@@ -80,25 +82,27 @@
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#البدء-السريع">البدء السريع</a> •
|
||||
<a href="#كيف-يعمل">كيف يعمل</a> •
|
||||
<a href="#أدوات-البحث-mcp">أدوات البحث</a> •
|
||||
<a href="#التوثيق">التوثيق</a> •
|
||||
<a href="#الإعدادات">الإعدادات</a> •
|
||||
<a href="#استكشاف-الأخطاء-وإصلاحها">استكشاف الأخطاء وإصلاحها</a> •
|
||||
<a href="#الترخيص">الترخيص</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
يحافظ Claude-Mem بسلاسة على السياق عبر الجلسات من خلال التقاط الملاحظات حول استخدام الأدوات تلقائيًا، وإنشاء ملخصات دلالية، وإتاحتها للجلسات المستقبلية. هذا يمكّن Claude من الحفاظ على استمرارية المعرفة حول المشاريع حتى بعد انتهاء الجلسات أو إعادة الاتصال.
|
||||
<a href="#بداية-سريعة">بداية سريعة</a> •
|
||||
<a href="#كيف-يعمل">كيف يعمل</a> •
|
||||
<a href="#أدوات-البحث-mcp-search-tools">أدوات البحث</a> •
|
||||
<a href="#المستندات">التوثيق</a> •
|
||||
<a href="#الإعدادات">الإعدادات</a> •
|
||||
<a href="#استكشاف-الأخطاء-وإصلاحها">استكشاف الأخطاء وإصلاحها</a> •
|
||||
<a href="#الترخيص-license">الترخيص</a>
|
||||
</p>
|
||||
|
||||
<p align="center" dir="rtl">
|
||||
Claude-Mem هو نظام متطور مصمم لضغط وحفظ الذاكرة لسياق عمل Claude Code. وظيفته الأساسية هي جعل "كلود" يتذكر ما فعله في جلسات العمل السابقة بسلاسة، عبر تسجيل تحركاته، وإنشاء ملخصات ذكية، واستدعائها في الجلسات المستقبلية. هذا يضمن عدم ضياع سياق المشروع حتى لو أغلقت البرنامج وفتحته لاحقاً.
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## البدء السريع
|
||||
## بداية سريعة
|
||||
|
||||
ابدأ جلسة Claude Code جديدة في الطرفية وأدخل الأوامر التالية:
|
||||
للبدء، افتح "Claude Code" في مبنى الأوامر (Terminal) واكتب الأوامر التالية:
|
||||
<div dir="ltr" align="left">
|
||||
|
||||
```
|
||||
> /plugin marketplace add thedotmack/claude-mem
|
||||
@@ -106,32 +110,34 @@
|
||||
> /plugin install claude-mem
|
||||
```
|
||||
|
||||
أعد تشغيل Claude Code. سيظهر السياق من الجلسات السابقة تلقائيًا في الجلسات الجديدة.
|
||||
</div>
|
||||
|
||||
بمجرد إعادة تشغيل Claude Code، سيتم استدعاء السياق من الجلسات السابقة تلقائيا عند الحاجة.
|
||||
|
||||
**الميزات الرئيسية:**
|
||||
|
||||
- 🧠 **ذاكرة مستمرة** - يبقى السياق عبر الجلسات
|
||||
- 📊 **الكشف التدريجي** - استرجاع الذاكرة بطبقات مع رؤية تكلفة الرموز
|
||||
- 🔍 **بحث قائم على المهارات** - استعلم عن تاريخ مشروعك باستخدام مهارة mem-search
|
||||
- 🖥️ **واجهة مستخدم ويب** - بث الذاكرة المباشر على http://localhost:37777
|
||||
- 💻 **مهارة Claude Desktop** - ابحث في الذاكرة من محادثات Claude Desktop
|
||||
- 🔒 **التحكم في الخصوصية** - استخدم وسوم `<private>` لاستبعاد المحتوى الحساس من التخزين
|
||||
- ⚙️ **إعدادات السياق** - تحكم دقيق في السياق الذي يتم حقنه
|
||||
- 🤖 **تشغيل تلقائي** - لا يتطلب تدخلاً يدويًا
|
||||
- 🔗 **الاستشهادات** - رجوع إلى الملاحظات السابقة باستخدام المعرفات (الوصول عبر http://localhost:37777/api/observation/{id} أو عرض الكل في عارض الويب على http://localhost:37777)
|
||||
- 🧪 **قناة تجريبية** - جرّب الميزات التجريبية مثل Endless Mode عبر تبديل الإصدار
|
||||
- 🧠 **ذاكرة مستديمه**: سياق عملك لا ينتهي بانتهاء الجلسة، بل ينتقل معك للجلسة التالية.
|
||||
- 📊 **الكشف التدريجي** (Progressive Disclosure): نظام ذكي يستدعي المعلومات على طبقات، مما يمنحك رؤية واضحة لاستهلاك الـ "Tokens" (التكلفة).
|
||||
- 🔍 **بحث سريع** - استعلم عن سجل مشروعك باستخدام خاصية `mem-search`.
|
||||
- 🖥️ **واجهة مستخدم ويب** - رؤية معلومات الذاكرة مع تحديث فوري عبر المتصفح من خلال الرابط: http://localhost:37777
|
||||
- 💻 **تكامل مع Claude Desktop** - إمكانية البحث في الذاكرة مباشرة من واجهة Claude المكتبية
|
||||
- 🔒 **التحكم في الخصوصية** - دعم وسم `<private>` لمنع النظام من تخزين أي معلومات حساسة.
|
||||
- ⚙️ **إعدادات السياق** - تحكم دقيق في السياق (context) التي سيتم حقنها في سياق المحادثة.
|
||||
- 🤖 **أتمتة كاملة:** - النظام يعمل في الخلفية دون الحاجة لتدخل يدوي منك.
|
||||
- 🔗 **الاستشهادات** - رجوع إلى الملاحظات السابقة باستخدام (http://localhost:37777/api/observation/{id} أو عرض جميع المعلومات على http://localhost:37777)
|
||||
- 🧪 **مزايا التجريبيه** - تجربة مميزات مثل "الوضع اللانهائي" (Endless Mode).
|
||||
|
||||
---
|
||||
|
||||
## التوثيق
|
||||
## المستندات
|
||||
|
||||
📚 **[عرض التوثيق الكامل](docs/)** - تصفح مستندات markdown على GitHub
|
||||
📚 **[عرض التوثيق الكامل](https://docs.claude-mem.ai/)** - تصفح على الموقع الرسمي
|
||||
|
||||
### البدء
|
||||
|
||||
- **[دليل التثبيت](https://docs.claude-mem.ai/installation)** - البدء السريع والتثبيت المتقدم
|
||||
- **[دليل الاستخدام](https://docs.claude-mem.ai/usage/getting-started)** - كيف يعمل Claude-Mem تلقائيًا
|
||||
- **[أدوات البحث](https://docs.claude-mem.ai/usage/search-tools)** - استعلم عن تاريخ مشروعك باللغة الطبيعية
|
||||
- **[أدوات البحث](https://docs.claude-mem.ai/usage/search-tools)** - استعلم عن سجل مشروعك بلغتك
|
||||
- **[الميزات التجريبية](https://docs.claude-mem.ai/beta-features)** - جرّب الميزات التجريبية مثل Endless Mode
|
||||
|
||||
### أفضل الممارسات
|
||||
@@ -142,9 +148,9 @@
|
||||
### البنية المعمارية
|
||||
|
||||
- **[نظرة عامة](https://docs.claude-mem.ai/architecture/overview)** - مكونات النظام وتدفق البيانات
|
||||
- **[تطور البنية المعمارية](https://docs.claude-mem.ai/architecture-evolution)** - الرحلة من v3 إلى v5
|
||||
- **[بنية الخطافات](https://docs.claude-mem.ai/hooks-architecture)** - كيف يستخدم Claude-Mem خطافات دورة الحياة
|
||||
- **[مرجع الخطافات](https://docs.claude-mem.ai/architecture/hooks)** - شرح 7 سكريبتات خطافات
|
||||
- **[تطور البنية المعمارية](https://docs.claude-mem.ai/architecture-evolution)** - تطور المعمارية من v3 إلى v5
|
||||
- **[بنية برامج الربط (Hooks)](https://docs.claude-mem.ai/hooks-architecture)** - كيف يستخدم Claude-Mem خطافات دورة الحياة
|
||||
- **[مرجع برامج الربط (Hooks)](https://docs.claude-mem.ai/architecture/hooks)** - شرح 7 سكريبتات خطافات
|
||||
- **[خدمة العامل](https://docs.claude-mem.ai/architecture/worker-service)** - HTTP API وإدارة Bun
|
||||
- **[قاعدة البيانات](https://docs.claude-mem.ai/architecture/database)** - مخطط SQLite وبحث FTS5
|
||||
- **[بنية البحث](https://docs.claude-mem.ai/architecture/search-architecture)** - البحث المختلط مع قاعدة بيانات المتجهات Chroma
|
||||
@@ -161,24 +167,23 @@
|
||||
|
||||
**المكونات الأساسية:**
|
||||
|
||||
1. **5 خطافات دورة الحياة** - SessionStart، UserPromptSubmit، PostToolUse، Stop، SessionEnd (6 سكريبتات خطافات)
|
||||
2. **تثبيت ذكي** - فاحص التبعيات المخزنة مؤقتًا (سكريبت ما قبل الخطاف، ليس خطاف دورة حياة)
|
||||
1. **5 برامج ربط (Hooks)** - SessionStart، UserPromptSubmit، PostToolUse، Stop، SessionEnd
|
||||
2. **تثبيت ذكي** - فاحص التبعيات المخزنة مؤقتًا
|
||||
3. **خدمة العامل** - HTTP API على المنفذ 37777 مع واجهة مستخدم عارض الويب و10 نقاط نهاية للبحث، تديرها Bun
|
||||
4. **قاعدة بيانات SQLite** - تخزن الجلسات، الملاحظات، الملخصات
|
||||
5. **مهارة mem-search** - استعلامات اللغة الطبيعية مع الكشف التدريجي
|
||||
6. **قاعدة بيانات المتجهات Chroma** - البحث المختلط الدلالي + الكلمات المفتاحية لاسترجاع السياق الذكي
|
||||
6. **قاعدة بيانات المتجهات Chroma** - البحث الدلالي الهجين + الكلمات المفتاحية لاسترجاع السياق الذكي
|
||||
|
||||
انظر [نظرة عامة على البنية المعمارية](https://docs.claude-mem.ai/architecture/overview) للتفاصيل.
|
||||
|
||||
---
|
||||
|
||||
## مهارة mem-search
|
||||
|
||||
## أدوات البحث (MCP Search Tools)
|
||||
يوفر Claude-Mem بحثًا ذكيًا من خلال مهارة mem-search التي تُستدعى تلقائيًا عندما تسأل عن العمل السابق:
|
||||
|
||||
**كيف يعمل:**
|
||||
- فقط اسأل بشكل طبيعي: *"ماذا فعلنا في الجلسة الأخيرة؟"* أو *"هل أصلحنا هذا الخطأ من قبل؟"*
|
||||
- يستدعي Claude تلقائيًا مهارة mem-search للعثور على السياق ذي الصلة
|
||||
- يستدعي Claude تلقائيًا خاصية mem-search للعثور على السياق ذي الصلة
|
||||
|
||||
**عمليات البحث المتاحة:**
|
||||
|
||||
@@ -193,7 +198,7 @@
|
||||
9. **الجدول الزمني حسب الاستعلام** - البحث عن الملاحظات والحصول على سياق الجدول الزمني حول أفضل تطابق
|
||||
10. **مساعدة API** - الحصول على توثيق API البحث
|
||||
|
||||
**أمثلة على استعلامات اللغة الطبيعية:**
|
||||
**أمثلة على الاستعلامات:**
|
||||
|
||||
```
|
||||
"What bugs did we fix last session?"
|
||||
@@ -219,8 +224,7 @@
|
||||
|
||||
- **Node.js**: 18.0.0 أو أعلى
|
||||
- **Claude Code**: أحدث إصدار مع دعم الإضافات
|
||||
- **Bun**: بيئة تشغيل JavaScript ومدير العمليات (يُثبت تلقائيًا إذا كان مفقودًا)
|
||||
- **uv**: مدير حزم Python للبحث المتجهي (يُثبت تلقائيًا إذا كان مفقودًا)
|
||||
- **Bun & uv**: (يتم تثبيتهما تلقائياً) لإدارة العمليات والبحث المتجه.
|
||||
- **SQLite 3**: للتخزين المستمر (مدمج)
|
||||
|
||||
---
|
||||
@@ -241,7 +245,7 @@
|
||||
|
||||
## استكشاف الأخطاء وإصلاحها
|
||||
|
||||
إذا واجهت مشكلات، صِف المشكلة لـ Claude وستقوم مهارة troubleshoot تلقائيًا بتشخيصها وتوفير الإصلاحات.
|
||||
إذا واجهت مشكلة، اشرحها لـ Claude وسيقوم بتشغيل خاصية troubleshoot لإصلاحها ذاتياً.
|
||||
|
||||
انظر **[دليل استكشاف الأخطاء وإصلاحها](https://docs.claude-mem.ai/troubleshooting)** للمشكلات الشائعة والحلول.
|
||||
|
||||
@@ -250,27 +254,29 @@
|
||||
## تقارير الأخطاء
|
||||
|
||||
أنشئ تقارير أخطاء شاملة باستخدام المولّد الآلي:
|
||||
<div align=left>
|
||||
|
||||
```bash
|
||||
cd ~/.claude/plugins/marketplaces/thedotmack
|
||||
npm run bug-report
|
||||
```
|
||||
</div>
|
||||
|
||||
## المساهمة
|
||||
|
||||
المساهمات مرحب بها! يُرجى:
|
||||
|
||||
1. عمل Fork للمستودع
|
||||
2. إنشاء فرع ميزة
|
||||
1. عمل Fork للمشروع (Repository)
|
||||
2. إنشاء فرع (branch)
|
||||
3. إجراء التغييرات مع الاختبارات
|
||||
4. تحديث التوثيق
|
||||
4. تحديث المستندات عند الحاجه
|
||||
5. تقديم Pull Request
|
||||
|
||||
انظر [دليل التطوير](https://docs.claude-mem.ai/development) لسير عمل المساهمة.
|
||||
|
||||
---
|
||||
|
||||
## الترخيص
|
||||
## الترخيص (License)
|
||||
|
||||
هذا المشروع مرخص بموجب **ترخيص GNU Affero العام الإصدار 3.0** (AGPL-3.0).
|
||||
|
||||
@@ -298,4 +304,6 @@ npm run bug-report
|
||||
|
||||
---
|
||||
|
||||
**مبني باستخدام Claude Agent SDK** | **مدعوم بواسطة Claude Code** | **صُنع باستخدام TypeScript**
|
||||
**مبني باستخدام Claude Agent SDK** | **مدعوم بواسطة Claude Code** | **صُنع باستخدام TypeScript**
|
||||
|
||||
</section>
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Claude Code পুনরায় চালু করুন। পূর্ব
|
||||
|
||||
## ডকুমেন্টেশন
|
||||
|
||||
📚 **[সম্পূর্ণ ডকুমেন্টেশন দেখুন](docs/)** - GitHub-এ markdown ডক্স ব্রাউজ করুন
|
||||
📚 **[সম্পূর্ণ ডকুমেন্টেশন দেখুন](https://docs.claude-mem.ai/)** - অফিসিয়াল ওয়েবসাইটে ব্রাউজ করুন
|
||||
|
||||
### শুরু করা
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Restartujte Claude Code. Kontext z předchozích sezení se automaticky objeví
|
||||
|
||||
## Dokumentace
|
||||
|
||||
📚 **[Zobrazit kompletní dokumentaci](docs/)** - Procházejte dokumentaci v markdown na GitHubu
|
||||
📚 **[Zobrazit kompletní dokumentaci](https://docs.claude-mem.ai/)** - Procházet na oficiálních stránkách
|
||||
|
||||
### Začínáme
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Genstart Claude Code. Kontekst fra tidligere sessioner vil automatisk vises i ny
|
||||
|
||||
## Dokumentation
|
||||
|
||||
📚 **[Se Fuld Dokumentation](docs/)** - Gennemse markdown-dokumenter på GitHub
|
||||
📚 **[Se Fuld Dokumentation](https://docs.claude-mem.ai/)** - Gennemse på den officielle hjemmeside
|
||||
|
||||
### Kom Godt I Gang
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Starten Sie Claude Code neu. Kontext aus vorherigen Sitzungen wird automatisch i
|
||||
|
||||
## Dokumentation
|
||||
|
||||
📚 **[Vollständige Dokumentation anzeigen](docs/)** - Markdown-Dokumentation auf GitHub durchsuchen
|
||||
📚 **[Vollständige Dokumentation anzeigen](https://docs.claude-mem.ai/)** - Auf der offiziellen Website durchsuchen
|
||||
|
||||
### Erste Schritte
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@
|
||||
|
||||
## Τεκμηρίωση
|
||||
|
||||
📚 **[Προβολή Πλήρους Τεκμηρίωσης](docs/)** - Περιήγηση στα markdown έγγραφα στο GitHub
|
||||
📚 **[Προβολή Πλήρους Τεκμηρίωσης](https://docs.claude-mem.ai/)** - Περιήγηση στον επίσημο ιστότοπο
|
||||
|
||||
### Ξεκινώντας
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -35,6 +36,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -127,7 +129,7 @@ Reinicia Claude Code. El contexto de sesiones anteriores aparecerá automáticam
|
||||
|
||||
## Documentación
|
||||
|
||||
📚 **[Ver Documentación Completa](docs/)** - Explora documentos markdown en GitHub
|
||||
📚 **[Ver Documentación Completa](https://docs.claude-mem.ai/)** - Navegar en el sitio web oficial
|
||||
|
||||
### Primeros Pasos
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -33,6 +34,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -125,7 +127,7 @@ Käynnistä Claude Code uudelleen. Aiempien istuntojen konteksti ilmestyy automa
|
||||
|
||||
## Dokumentaatio
|
||||
|
||||
📚 **[Näytä täydellinen dokumentaatio](docs/)** - Selaa markdown-dokumentteja GitHubissa
|
||||
📚 **[Näytä täydellinen dokumentaatio](https://docs.claude-mem.ai/)** - Selaa virallisella verkkosivustolla
|
||||
|
||||
### Aloitus
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Redémarrez Claude Code. Le contexte des sessions précédentes apparaîtra auto
|
||||
|
||||
## Documentation
|
||||
|
||||
📚 **[Voir la documentation complète](docs/)** - Parcourez la documentation markdown sur GitHub
|
||||
📚 **[Voir la documentation complète](https://docs.claude-mem.ai/)** - Parcourir sur le site officiel
|
||||
|
||||
### Pour commencer
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -33,6 +34,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -125,7 +127,7 @@
|
||||
|
||||
## תיעוד
|
||||
|
||||
📚 **[צפה בתיעוד המלא](docs/)** - עיין במסמכי markdown ב-GitHub
|
||||
📚 **[צפה בתיעוד המלא](https://docs.claude-mem.ai/)** - דפדף באתר הרשמי
|
||||
|
||||
### תחילת העבודה
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Claude Code को पुनः आरंभ करें। पिछले स
|
||||
|
||||
## दस्तावेज़ीकरण
|
||||
|
||||
📚 **[पूर्ण दस्तावेज़ीकरण देखें](docs/)** - GitHub पर markdown दस्तावेज़ ब्राउज़ करें
|
||||
📚 **[पूर्ण दस्तावेज़ीकरण देखें](https://docs.claude-mem.ai/)** - आधिकारिक वेबसाइट पर ब्राउज़ करें
|
||||
|
||||
### शुरुआत करना
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Indítsa újra a Claude Code-ot. A korábbi munkamenetek kontextusa automatikusa
|
||||
|
||||
## Dokumentáció
|
||||
|
||||
📚 **[Teljes dokumentáció megtekintése](docs/)** - Markdown dokumentumok böngészése GitHub-on
|
||||
📚 **[Teljes dokumentáció megtekintése](https://docs.claude-mem.ai/)** - Böngészés a hivatalos weboldalon
|
||||
|
||||
### Első lépések
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Restart Claude Code. Konteks dari sesi sebelumnya akan secara otomatis muncul di
|
||||
|
||||
## Dokumentasi
|
||||
|
||||
📚 **[Lihat Dokumentasi Lengkap](docs/)** - Telusuri dokumen markdown di GitHub
|
||||
📚 **[Lihat Dokumentasi Lengkap](https://docs.claude-mem.ai/)** - Jelajahi di situs web resmi
|
||||
|
||||
### Memulai
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Riavvia Claude Code. Il contesto delle sessioni precedenti apparirà automaticam
|
||||
|
||||
## Documentazione
|
||||
|
||||
📚 **[Visualizza Documentazione Completa](docs/)** - Sfoglia i documenti markdown su GitHub
|
||||
📚 **[Visualizza Documentazione Completa](https://docs.claude-mem.ai/)** - Sfoglia sul sito ufficiale
|
||||
|
||||
### Per Iniziare
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Claude Codeを再起動します。以前のセッションからのコンテキ
|
||||
|
||||
## ドキュメント
|
||||
|
||||
📚 **[完全なドキュメントを見る](docs/)** - GitHubでマークダウンドキュメントを閲覧
|
||||
📚 **[完全なドキュメントを見る](https://docs.claude-mem.ai/)** - 公式ウェブサイトで閲覧
|
||||
|
||||
### はじめに
|
||||
|
||||
@@ -212,7 +214,7 @@ Claude-Memは、過去の作業について尋ねると自動的に呼び出さ
|
||||
|
||||
Claude-Memは、**Endless Mode**(拡張セッション用の生体模倣メモリアーキテクチャ)などの実験的機能を備えた**ベータチャネル**を提供します。http://localhost:37777 → SettingsのWebビューアUIから安定版とベータ版を切り替えます。
|
||||
|
||||
Endless Modeと試用方法の詳細については、**[ベータ機能ドキュメント](https://docs.claude-mem.ai/beta-features)**を参照してください。
|
||||
Endless Modeと試用方法の詳細については、**[ベータ機能ドキュメント](https://docs.claude-mem.ai/beta-features)** を参照してください。
|
||||
|
||||
---
|
||||
|
||||
@@ -230,13 +232,13 @@ Endless Modeと試用方法の詳細については、**[ベータ機能ドキ
|
||||
|
||||
設定は`~/.claude-mem/settings.json`で管理されます(初回実行時にデフォルト値で自動作成)。AIモデル、ワーカーポート、データディレクトリ、ログレベル、コンテキスト注入設定を構成します。
|
||||
|
||||
利用可能なすべての設定と例については、**[設定ガイド](https://docs.claude-mem.ai/configuration)**を参照してください。
|
||||
利用可能なすべての設定と例については、**[設定ガイド](https://docs.claude-mem.ai/configuration)** を参照してください。
|
||||
|
||||
---
|
||||
|
||||
## 開発
|
||||
|
||||
ビルド手順、テスト、コントリビューションワークフローについては、**[開発ガイド](https://docs.claude-mem.ai/development)**を参照してください。
|
||||
ビルド手順、テスト、コントリビューションワークフローについては、**[開発ガイド](https://docs.claude-mem.ai/development)** を参照してください。
|
||||
|
||||
---
|
||||
|
||||
@@ -244,7 +246,7 @@ Endless Modeと試用方法の詳細については、**[ベータ機能ドキ
|
||||
|
||||
問題が発生した場合は、Claudeに問題を説明すると、troubleshootスキルが自動的に診断して修正を提供します。
|
||||
|
||||
よくある問題と解決策については、**[トラブルシューティングガイド](https://docs.claude-mem.ai/troubleshooting)**を参照してください。
|
||||
よくある問題と解決策については、**[トラブルシューティングガイド](https://docs.claude-mem.ai/troubleshooting)** を参照してください。
|
||||
|
||||
---
|
||||
|
||||
@@ -286,7 +288,7 @@ Copyright (C) 2025 Alex Newman (@thedotmack). All rights reserved.
|
||||
- 派生作品もAGPL-3.0の下でライセンスする必要があります
|
||||
- このソフトウェアには保証がありません
|
||||
|
||||
**Ragtimeに関する注意**: `ragtime/`ディレクトリは**PolyForm Noncommercial License 1.0.0**の下で個別にライセンスされています。詳細は[ragtime/LICENSE](ragtime/LICENSE)を参照してください。
|
||||
**Ragtimeに関する注意**: `ragtime/`ディレクトリは **PolyForm Noncommercial License 1.0.0** の下で個別にライセンスされています。詳細は[ragtime/LICENSE](ragtime/LICENSE)を参照してください。
|
||||
|
||||
---
|
||||
|
||||
@@ -299,4 +301,4 @@ Copyright (C) 2025 Alex Newman (@thedotmack). All rights reserved.
|
||||
|
||||
---
|
||||
|
||||
**Claude Agent SDKで構築** | **Claude Codeで動作** | **TypeScriptで作成**
|
||||
**Claude Agent SDKで構築** | **Claude Codeで動作** | **TypeScriptで作成**
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -114,19 +116,19 @@ Claude Code를 재시작하세요. 이전 세션의 컨텍스트가 자동으로
|
||||
- 🧠 **지속적인 메모리** - 세션 간 컨텍스트 유지
|
||||
- 📊 **점진적 공개** - 토큰 비용 가시성을 갖춘 계층화된 메모리 검색
|
||||
- 🔍 **스킬 기반 검색** - mem-search 스킬로 프로젝트 기록 쿼리
|
||||
- 🖥️ **웹 뷰어 UI** - http://localhost:37777에서 실시간 메모리 스트림 확인
|
||||
- 🖥️ **웹 뷰어 UI** - http://localhost:37777 에서 실시간 메모리 스트림 확인
|
||||
- 💻 **Claude Desktop 스킬** - Claude Desktop 대화에서 메모리 검색
|
||||
- 🔒 **개인정보 제어** - `<private>` 태그를 사용하여 민감한 콘텐츠를 저장소에서 제외
|
||||
- ⚙️ **컨텍스트 설정** - 주입되는 컨텍스트에 대한 세밀한 제어
|
||||
- 🤖 **자동 작동** - 수동 개입 불필요
|
||||
- 🔗 **인용** - ID로 과거 관찰 참조 (http://localhost:37777/api/observation/{id}를 통해 액세스하거나 http://localhost:37777의 웹 뷰어에서 모두 보기)
|
||||
- 🔗 **인용** - ID로 과거 관찰 참조 (http://localhost:37777/api/observation/{id} 를 통해 액세스하거나 http://localhost:37777 의 웹 뷰어에서 모두 보기)
|
||||
- 🧪 **베타 채널** - 버전 전환을 통해 Endless Mode와 같은 실험적 기능 사용
|
||||
|
||||
---
|
||||
|
||||
## 문서
|
||||
|
||||
📚 **[전체 문서 보기](docs/)** - GitHub에서 마크다운 문서 탐색
|
||||
📚 **[전체 문서 보기](https://docs.claude-mem.ai/)** - 공식 웹사이트에서 찾아보기
|
||||
|
||||
### 시작하기
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -33,6 +34,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -125,7 +127,7 @@ Herstart Claude Code. Context van eerdere sessies verschijnt automatisch in nieu
|
||||
|
||||
## Documentatie
|
||||
|
||||
📚 **[Bekijk Volledige Documentatie](docs/)** - Blader door markdown documenten op GitHub
|
||||
📚 **[Bekijk Volledige Documentatie](https://docs.claude-mem.ai/)** - Bladeren op de officiële website
|
||||
|
||||
### Aan de Slag
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Start Claude Code på nytt. Kontekst fra tidligere økter vil automatisk vises i
|
||||
|
||||
## Dokumentasjon
|
||||
|
||||
📚 **[Se Full Dokumentasjon](docs/)** - Bla gjennom markdown-dokumenter på GitHub
|
||||
📚 **[Se Full Dokumentasjon](https://docs.claude-mem.ai/)** - Bla gjennom på det offisielle nettstedet
|
||||
|
||||
### Komme I Gang
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -33,6 +34,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -125,7 +127,7 @@ Uruchom ponownie Claude Code. Kontekst z poprzednich sesji automatycznie pojawi
|
||||
|
||||
## Dokumentacja
|
||||
|
||||
📚 **[Wyświetl Pełną Dokumentację](docs/)** - Przeglądaj dokumentację markdown na GitHub
|
||||
📚 **[Wyświetl Pełną Dokumentację](https://docs.claude-mem.ai/)** - Przeglądaj na oficjalnej stronie
|
||||
|
||||
### Pierwsze Kroki
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Reinicie o Claude Code. O contexto de sessões anteriores aparecerá automaticam
|
||||
|
||||
## Documentação
|
||||
|
||||
📚 **[Ver Documentação Completa](docs/)** - Navegue pelos documentos markdown no GitHub
|
||||
📚 **[Ver Documentação Completa](https://docs.claude-mem.ai/)** - Navegar no site oficial
|
||||
|
||||
### Começando
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Reporniți Claude Code. Contextul din sesiunile anterioare va apărea automat î
|
||||
|
||||
## Documentație
|
||||
|
||||
📚 **[Vizualizați Documentația Completă](docs/)** - Răsfoiți documentele markdown pe GitHub
|
||||
📚 **[Vizualizați Documentația Completă](https://docs.claude-mem.ai/)** - Răsfoiți pe site-ul oficial
|
||||
|
||||
### Introducere
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@
|
||||
|
||||
## Документация
|
||||
|
||||
📚 **[Просмотреть полную документацию](docs/)** - Просмотр markdown-документов на GitHub
|
||||
📚 **[Просмотреть полную документацию](https://docs.claude-mem.ai/)** - Просмотр на официальном сайте
|
||||
|
||||
### Начало работы
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Starta om Claude Code. Kontext från tidigare sessioner kommer automatiskt att v
|
||||
|
||||
## Dokumentation
|
||||
|
||||
📚 **[Visa fullständig dokumentation](docs/)** - Bläddra bland markdown-dokument på GitHub
|
||||
📚 **[Visa fullständig dokumentation](https://docs.claude-mem.ai/)** - Bläddra på den officiella webbplatsen
|
||||
|
||||
### Komma igång
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -33,6 +34,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -125,7 +127,7 @@
|
||||
|
||||
## เอกสาร
|
||||
|
||||
📚 **[ดูเอกสารฉบับเต็ม](docs/)** - เรียกดูเอกสาร markdown บน GitHub
|
||||
📚 **[ดูเอกสารฉบับเต็ม](https://docs.claude-mem.ai/)** - เรียกดูบนเว็บไซต์อย่างเป็นทางการ
|
||||
|
||||
### เริ่มต้นใช้งาน
|
||||
|
||||
|
||||
@@ -0,0 +1,328 @@
|
||||
🌐 Ito ay isang awtomatikong pagsasalin. Malugod na tinatanggap ang mga pagwawasto mula sa komunidad!
|
||||
|
||||
---
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-dark-mode.webp">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp" alt="Claude-Mem" width="400">
|
||||
</picture>
|
||||
</a>
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
<a href="README.es.md">🇪🇸 Español</a> •
|
||||
<a href="README.de.md">🇩🇪 Deutsch</a> •
|
||||
<a href="README.fr.md">🇫🇷 Français</a> •
|
||||
<a href="README.he.md">🇮🇱 עברית</a> •
|
||||
<a href="README.ar.md">🇸🇦 العربية</a> •
|
||||
<a href="README.ru.md">🇷🇺 Русский</a> •
|
||||
<a href="README.pl.md">🇵🇱 Polski</a> •
|
||||
<a href="README.cs.md">🇨🇿 Čeština</a> •
|
||||
<a href="README.nl.md">🇳🇱 Nederlands</a> •
|
||||
<a href="README.tr.md">🇹🇷 Türkçe</a> •
|
||||
<a href="README.uk.md">🇺🇦 Українська</a> •
|
||||
<a href="README.vi.md">🇻🇳 Tiếng Việt</a> •
|
||||
<a href="README.tl.md">🇵🇭 Tagalog</a> •
|
||||
<a href="README.id.md">🇮🇩 Indonesia</a> •
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
<a href="README.el.md">🇬🇷 Ελληνικά</a> •
|
||||
<a href="README.hu.md">🇭🇺 Magyar</a> •
|
||||
<a href="README.fi.md">🇫🇮 Suomi</a> •
|
||||
<a href="README.da.md">🇩🇰 Dansk</a> •
|
||||
<a href="README.no.md">🇳🇴 Norsk</a>
|
||||
</p>
|
||||
|
||||
<h4 align="center">Sistema ng kompresyon ng persistent memory na ginawa para sa <a href="https://claude.com/claude-code" target="_blank">Claude Code</a>.</h4>
|
||||
|
||||
<p align="center">
|
||||
<a href="LICENSE">
|
||||
<img src="https://img.shields.io/badge/License-AGPL%203.0-blue.svg" alt="License">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/version-6.5.0-green.svg" alt="Version">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg" alt="Node">
|
||||
</a>
|
||||
<a href="https://github.com/thedotmack/awesome-claude-code">
|
||||
<img src="https://awesome.re/mentioned-badge.svg" alt="Mentioned in Awesome Claude Code">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://trendshift.io/repositories/15496" target="_blank">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge-dark.svg">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg" alt="thedotmack/claude-mem | Trendshift" width="250" height="55"/>
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/cm-preview.gif" alt="Claude-Mem Preview" width="800">
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#mabilis-na-pagsisimula">Mabilis na Pagsisimula</a> •
|
||||
<a href="#paano-ito-gumagana">Paano Ito Gumagana</a> •
|
||||
<a href="#mga-search-tool-ng-mcp">Mga Search Tool</a> •
|
||||
<a href="#dokumentasyon">Dokumentasyon</a> •
|
||||
<a href="#konpigurasyon">Konpigurasyon</a> •
|
||||
<a href="#pag-troubleshoot">Pag-troubleshoot</a> •
|
||||
<a href="#lisensya">Lisensya</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
Pinapanatili ng Claude-Mem ang konteksto sa pagitan ng mga session sa pamamagitan ng awtomatikong pagkuha ng mga obserbasyon sa paggamit ng mga tool, pagbuo ng mga semantikong buod, at paggawa nitong available sa mga susunod na session. Dahil dito, napapanatili ni Claude ang tuloy-tuloy na kaalaman tungkol sa mga proyekto kahit matapos o muling kumonekta ang mga session.
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Mabilis na Pagsisimula
|
||||
|
||||
Magsimula ng bagong Claude Code session sa terminal at ilagay ang mga sumusunod na command:
|
||||
|
||||
```
|
||||
/plugin marketplace add thedotmack/claude-mem
|
||||
|
||||
/plugin install claude-mem
|
||||
```
|
||||
|
||||
I-restart ang Claude Code. Awtomatikong lalabas sa mga bagong session ang konteksto mula sa mga nakaraang session.
|
||||
|
||||
**Mga Pangunahing Tampok:**
|
||||
|
||||
- 🧠 **Persistent Memory** - Nananatili ang konteksto sa pagitan ng mga session
|
||||
- 📊 **Progressive Disclosure** - Layered na pagkuha ng memory na may visibility ng token cost
|
||||
- 🔍 **Skill-Based Search** - I-query ang history ng proyekto gamit ang mem-search skill
|
||||
- 🖥️ **Web Viewer UI** - Real-time memory stream sa http://localhost:37777
|
||||
- 💻 **Claude Desktop Skill** - Maghanap sa memory mula sa Claude Desktop conversations
|
||||
- 🔒 **Privacy Control** - Gamitin ang `<private>` tags para hindi ma-store ang sensitibong nilalaman
|
||||
- ⚙️ **Context Configuration** - Mas pinong kontrol kung anong konteksto ang ini-inject
|
||||
- 🤖 **Automatic Operation** - Walang kailangang manual na intervention
|
||||
- 🔗 **Citations** - I-refer ang mga lumang obserbasyon gamit ang IDs (i-access sa http://localhost:37777/api/observation/{id} o tingnan lahat sa web viewer sa http://localhost:37777)
|
||||
- 🧪 **Beta Channel** - Subukan ang mga experimental feature tulad ng Endless Mode sa pamamagitan ng version switching
|
||||
|
||||
---
|
||||
|
||||
## Dokumentasyon
|
||||
|
||||
📚 **[Tingnan ang Buong Dokumentasyon](https://docs.claude-mem.ai/)** - I-browse sa opisyal na website
|
||||
|
||||
### Pagsisimula
|
||||
|
||||
- **[Gabay sa Pag-install](https://docs.claude-mem.ai/installation)** - Mabilis na pagsisimula at advanced installation
|
||||
- **[Gabay sa Paggamit](https://docs.claude-mem.ai/usage/getting-started)** - Paano awtomatikong gumagana ang Claude-Mem
|
||||
- **[Mga Search Tool](https://docs.claude-mem.ai/usage/search-tools)** - I-query ang history ng proyekto gamit ang natural language
|
||||
- **[Mga Beta Feature](https://docs.claude-mem.ai/beta-features)** - Subukan ang mga experimental feature tulad ng Endless Mode
|
||||
|
||||
### Best Practices
|
||||
|
||||
- **[Context Engineering](https://docs.claude-mem.ai/context-engineering)** - Mga prinsipyo ng context optimization para sa AI agents
|
||||
- **[Progressive Disclosure](https://docs.claude-mem.ai/progressive-disclosure)** - Pilosopiya sa likod ng context priming strategy ng Claude-Mem
|
||||
|
||||
### Arkitektura
|
||||
|
||||
- **[Overview](https://docs.claude-mem.ai/architecture/overview)** - Mga bahagi ng sistema at daloy ng data
|
||||
- **[Architecture Evolution](https://docs.claude-mem.ai/architecture-evolution)** - Ang paglalakbay mula v3 hanggang v5
|
||||
- **[Hooks Architecture](https://docs.claude-mem.ai/hooks-architecture)** - Paano gumagamit ang Claude-Mem ng lifecycle hooks
|
||||
- **[Hooks Reference](https://docs.claude-mem.ai/architecture/hooks)** - 7 hook scripts, ipinaliwanag
|
||||
- **[Worker Service](https://docs.claude-mem.ai/architecture/worker-service)** - HTTP API at Bun management
|
||||
- **[Database](https://docs.claude-mem.ai/architecture/database)** - SQLite schema at FTS5 search
|
||||
- **[Search Architecture](https://docs.claude-mem.ai/architecture/search-architecture)** - Hybrid search gamit ang Chroma vector database
|
||||
|
||||
### Konpigurasyon at Pagbuo
|
||||
|
||||
- **[Konpigurasyon](https://docs.claude-mem.ai/configuration)** - Environment variables at settings
|
||||
- **[Pagbuo](https://docs.claude-mem.ai/development)** - Build, test, at contribution workflow
|
||||
- **[Pag-troubleshoot](https://docs.claude-mem.ai/troubleshooting)** - Karaniwang isyu at solusyon
|
||||
|
||||
---
|
||||
|
||||
## Paano Ito Gumagana
|
||||
|
||||
**Mga Pangunahing Bahagi:**
|
||||
|
||||
1. **5 Lifecycle Hooks** - SessionStart, UserPromptSubmit, PostToolUse, Stop, SessionEnd (6 hook scripts)
|
||||
2. **Smart Install** - Cached dependency checker (pre-hook script, hindi lifecycle hook)
|
||||
3. **Worker Service** - HTTP API sa port 37777 na may web viewer UI at 10 search endpoints, pinamamahalaan ng Bun
|
||||
4. **SQLite Database** - Nag-iimbak ng sessions, observations, summaries
|
||||
5. **mem-search Skill** - Natural language queries na may progressive disclosure
|
||||
6. **Chroma Vector Database** - Hybrid semantic + keyword search para sa matalinong pagkuha ng konteksto
|
||||
|
||||
Tingnan ang [Architecture Overview](https://docs.claude-mem.ai/architecture/overview) para sa detalye.
|
||||
|
||||
---
|
||||
|
||||
## Mga Search Tool ng MCP
|
||||
|
||||
Nagbibigay ang Claude-Mem ng intelligent memory search sa pamamagitan ng **5 MCP tools** na sumusunod sa token-efficient na **3-layer workflow pattern**:
|
||||
|
||||
**Ang 3-Layer Workflow:**
|
||||
|
||||
1. **`search`** - Kumuha ng compact index na may IDs (~50-100 tokens/result)
|
||||
2. **`timeline`** - Kumuha ng chronological context sa paligid ng mga interesting na result
|
||||
3. **`get_observations`** - Kunin ang full details PARA LANG sa na-filter na IDs (~500-1,000 tokens/result)
|
||||
|
||||
**Paano Ito Gumagana:**
|
||||
|
||||
- Gumagamit si Claude ng MCP tools para maghanap sa iyong memory
|
||||
- Magsimula sa `search` para makakuha ng index ng results
|
||||
- Gamitin ang `timeline` para makita ang nangyari sa paligid ng mga partikular na observation
|
||||
- Gamitin ang `get_observations` para kunin ang full details ng mga relevant na IDs
|
||||
- Gamitin ang `save_memory` para manual na mag-store ng importanteng impormasyon
|
||||
- **~10x tipid sa tokens** dahil nagfi-filter muna bago kunin ang full details
|
||||
|
||||
**Available na MCP Tools:**
|
||||
|
||||
1. **`search`** - Hanapin ang memory index gamit ang full-text queries, may filters (type/date/project)
|
||||
2. **`timeline`** - Kumuha ng chronological context sa paligid ng isang observation o query
|
||||
3. **`get_observations`** - Kumuha ng full observation details gamit ang IDs (laging i-batch ang maraming IDs)
|
||||
4. **`save_memory`** - Manual na mag-save ng memory/observation para sa semantic search
|
||||
5. **`__IMPORTANT`** - Workflow documentation (laging visible kay Claude)
|
||||
|
||||
**Halimbawa ng Paggamit:**
|
||||
|
||||
```typescript
|
||||
// Step 1: Search for index
|
||||
search(query="authentication bug", type="bugfix", limit=10)
|
||||
|
||||
// Step 2: Review index, identify relevant IDs (e.g., #123, #456)
|
||||
|
||||
// Step 3: Fetch full details
|
||||
get_observations(ids=[123, 456])
|
||||
|
||||
// Save important information manually
|
||||
save_memory(text="API requires auth header X-API-Key", title="API Auth")
|
||||
```
|
||||
|
||||
Tingnan ang [Search Tools Guide](https://docs.claude-mem.ai/usage/search-tools) para sa mas detalyadong mga halimbawa.
|
||||
|
||||
---
|
||||
|
||||
## Mga Beta Feature
|
||||
|
||||
May **beta channel** ang Claude-Mem na may mga experimental feature gaya ng **Endless Mode** (biomimetic memory architecture para sa mas mahahabang session). Magpalit sa pagitan ng stable at beta versions sa web viewer UI sa http://localhost:37777 → Settings.
|
||||
|
||||
Tingnan ang **[Dokumentasyon ng Mga Beta Feature](https://docs.claude-mem.ai/beta-features)** para sa detalye ng Endless Mode at kung paano ito subukan.
|
||||
|
||||
---
|
||||
|
||||
## Mga Pangangailangan ng Sistema
|
||||
|
||||
- **Node.js**: 18.0.0 o mas mataas
|
||||
- **Claude Code**: Pinakabagong bersyon na may plugin support
|
||||
- **Bun**: JavaScript runtime at process manager (auto-installed kung wala)
|
||||
- **uv**: Python package manager para sa vector search (auto-installed kung wala)
|
||||
- **SQLite 3**: Para sa persistent storage (kasama)
|
||||
|
||||
---
|
||||
|
||||
### Mga Tala sa Windows Setup
|
||||
|
||||
Kung makakita ka ng error gaya ng:
|
||||
|
||||
```powershell
|
||||
npm : The term 'npm' is not recognized as the name of a cmdlet
|
||||
```
|
||||
|
||||
Siguraduhing naka-install ang Node.js at npm at nakadagdag sa PATH. I-download ang pinakabagong Node.js installer mula sa https://nodejs.org at i-restart ang terminal matapos mag-install.
|
||||
|
||||
---
|
||||
|
||||
## Konpigurasyon
|
||||
|
||||
Pinamamahalaan ang settings sa `~/.claude-mem/settings.json` (auto-created na may defaults sa unang run). I-configure ang AI model, worker port, data directory, log level, at context injection settings.
|
||||
|
||||
Tingnan ang **[Gabay sa Konpigurasyon](https://docs.claude-mem.ai/configuration)** para sa lahat ng available na settings at mga halimbawa.
|
||||
|
||||
---
|
||||
|
||||
## Pagbuo
|
||||
|
||||
Tingnan ang **[Gabay nang pagbuo](https://docs.claude-mem.ai/development)** para sa pag build instructions, testing, at contribution workflow.
|
||||
|
||||
---
|
||||
|
||||
## Pag-troubleshoot
|
||||
|
||||
Kung may issue, ilarawan ang problema kay Claude at awtomatikong magdi-diagnose at magbibigay ng mga ayos ang troubleshoot skill.
|
||||
|
||||
Tingnan ang **[Troubleshooting Guide](https://docs.claude-mem.ai/troubleshooting)** para sa mga karaniwang isyu at solusyon.
|
||||
|
||||
---
|
||||
|
||||
## Bug Reports
|
||||
|
||||
Gumawa ng kumpletong bug reports gamit ang automated generator:
|
||||
|
||||
```bash
|
||||
cd ~/.claude/plugins/marketplaces/thedotmack
|
||||
npm run bug-report
|
||||
```
|
||||
|
||||
## Pag-aambag
|
||||
|
||||
Malugod na tinatanggap ang mga kontribusyon! Pakisunod:
|
||||
|
||||
1. I-fork ang repository
|
||||
2. Gumawa ng feature branch
|
||||
3. Gawin ang mga pagbabago kasama ang tests
|
||||
4. I-update ang dokumentasyon
|
||||
5. Mag-submit ng Pull Request
|
||||
|
||||
Tingnan ang [Gabay nang pagbuo](https://docs.claude-mem.ai/development) para sa contribution workflow.
|
||||
|
||||
---
|
||||
|
||||
## Lisensya
|
||||
|
||||
Ang proyektong ito ay licensed sa ilalim ng **GNU Affero General Public License v3.0** (AGPL-3.0).
|
||||
|
||||
Copyright (C) 2025 Alex Newman (@thedotmack). All rights reserved.
|
||||
|
||||
Tingnan ang [LICENSE](LICENSE) file para sa buong detalye.
|
||||
|
||||
**Ano ang ibig sabihin nito:**
|
||||
|
||||
- Maaari mong gamitin, baguhin, at ipamahagi ang software na ito nang libre
|
||||
- Kung babaguhin mo at i-deploy sa isang network server, kailangan mong gawing available ang iyong source code
|
||||
- Dapat ding naka-license sa AGPL-3.0 ang mga derivative works
|
||||
- WALANG WARRANTY para sa software na ito
|
||||
|
||||
**Tala tungkol sa Ragtime**: Ang `ragtime/` directory ay may hiwalay na lisensya sa ilalim ng **PolyForm Noncommercial License 1.0.0**. Tingnan ang [ragtime/LICENSE](ragtime/LICENSE) para sa detalye.
|
||||
|
||||
---
|
||||
|
||||
## Suporta
|
||||
|
||||
- **Dokumentasyon**: [docs/](docs/)
|
||||
- **Issues**: [GitHub Issues](https://github.com/thedotmack/claude-mem/issues)
|
||||
- **Repository**: [github.com/thedotmack/claude-mem](https://github.com/thedotmack/claude-mem)
|
||||
- **Author**: Alex Newman ([@thedotmack](https://github.com/thedotmack))
|
||||
|
||||
---
|
||||
|
||||
**Built with Claude Agent SDK** | **Powered by Claude Code** | **Made with TypeScript**
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -33,6 +34,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -125,7 +127,7 @@ Claude Code'u yeniden başlatın. Önceki oturumlardaki bağlam otomatik olarak
|
||||
|
||||
## Dokümantasyon
|
||||
|
||||
📚 **[Tam Dokümantasyonu Görüntüle](docs/)** - GitHub'da markdown dökümanlarına göz atın
|
||||
📚 **[Tam Dokümantasyonu Görüntüle](https://docs.claude-mem.ai/)** - Resmi web sitesinde göz atın
|
||||
|
||||
### Başlarken
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@
|
||||
|
||||
## Документація
|
||||
|
||||
📚 **[Переглянути повну документацію](docs/)** - Переглядайте markdown документи на GitHub
|
||||
📚 **[Переглянути повну документацію](https://docs.claude-mem.ai/)** - Переглянути на офіційному сайті
|
||||
|
||||
### Початок роботи
|
||||
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
<section dir="rtl">
|
||||
🌐 یہ ایک خودکار ترجمہ ہے۔ کمیونٹی کی اصلاحات کا خیر مقدم ہے!
|
||||
|
||||
---
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-dark-mode.webp">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp" alt="Claude-Mem" width="400">
|
||||
</picture>
|
||||
</a>
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
<p align="center" dir="ltr">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
<a href="README.es.md">🇪🇸 Español</a> •
|
||||
<a href="README.de.md">🇩🇪 Deutsch</a> •
|
||||
<a href="README.fr.md">🇫🇷 Français</a>
|
||||
<a href="README.he.md">🇮🇱 עברית</a> •
|
||||
<a href="README.ar.md">🇸🇦 العربية</a> •
|
||||
<a href="README.ru.md">🇷🇺 Русский</a> •
|
||||
<a href="README.pl.md">🇵🇱 Polski</a> •
|
||||
<a href="README.cs.md">🇨🇿 Čeština</a> •
|
||||
<a href="README.nl.md">🇳🇱 Nederlands</a> •
|
||||
<a href="README.tr.md">🇹🇷 Türkçe</a> •
|
||||
<a href="README.uk.md">🇺🇦 Українська</a> •
|
||||
<a href="README.vi.md">🇻🇳 Tiếng Việt</a> •
|
||||
<a href="README.id.md">🇮🇩 Indonesia</a> •
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
<a href="README.el.md">🇬🇷 Ελληνικά</a> •
|
||||
<a href="README.hu.md">🇭🇺 Magyar</a> •
|
||||
<a href="README.fi.md">🇫🇮 Suomi</a> •
|
||||
<a href="README.da.md">🇩🇰 Dansk</a> •
|
||||
<a href="README.no.md">🇳🇴 Norsk</a>
|
||||
</p>
|
||||
|
||||
<h4 align="center"><a href="https://claude.com/claude-code" target="_blank">Claude Code</a> کے لیے بنایا گیا مستقل میموری کمپریشن سسٹم۔</h4>
|
||||
|
||||
<p align="center">
|
||||
<a href="LICENSE">
|
||||
<img src="https://img.shields.io/badge/License-AGPL%203.0-blue.svg" alt="License">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/version-6.5.0-green.svg" alt="Version">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg" alt="Node">
|
||||
</a>
|
||||
<a href="https://github.com/thedotmack/awesome-claude-code">
|
||||
<img src="https://awesome.re/mentioned-badge.svg" alt="Mentioned in Awesome Claude Code">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://trendshift.io/repositories/15496" target="_blank">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge-dark.svg">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg" alt="thedotmack/claude-mem | Trendshift" width="250" height="55"/>
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/cm-preview.gif" alt="Claude-Mem Preview" width="800">
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#تیز-رفتار-شروعات">تیز رفتار شروعات</a> •
|
||||
<a href="#یہ-کیسے-کام-کرتا-ہے">یہ کیسے کام کرتا ہے</a> •
|
||||
<a href="#تلاش-کے-اوزار">تلاش کے اوزار</a> •
|
||||
<a href="#دستاویزات">دستاویزات</a> •
|
||||
<a href="#ترتیبات">ترتیبات</a> •
|
||||
<a href="#مسائل-کی-تشخیص">مسائل کی تشخیص</a> •
|
||||
<a href="#لائسنس">لائسنس</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
Claude-Mem خودکار طور پر ٹول کے استعمال کے بعد کے مشاہدات کو ریکارڈ کرتا ہے، سیمانٹک خلاصے تیار کرتا ہے اور انہیں مستقبل کے سیشنز میں دستیاب کرتا ہے تاکہ آپ سیشن میں براہ راست تناسب محفوظ رہے۔ یہ Claude کو سیشن ختم ہونے یا دوبارہ جڑنے کے بعد بھی منصوبے کے بارے میں معلومات کی مسلسلیت برقرار رکھنے کے قابل بناتا ہے۔
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## تیز رفتار شروعات
|
||||
|
||||
ٹرمنل میں نیا Claude Code سیشن شروع کریں اور ہیں کمانڈز درج کریں:
|
||||
|
||||
```
|
||||
> /plugin marketplace add thedotmack/claude-mem
|
||||
|
||||
> /plugin install claude-mem
|
||||
```
|
||||
|
||||
Claude Code کو دوبارہ شروع کریں۔ سابقہ سیشن کا تناسب خودکار طور پر نئے سیشن میں موجود ہوگا۔
|
||||
|
||||
**اہم خصوصیات:**
|
||||
|
||||
- 🧠 **مستقل میموری** - تناسب سیشن کے دوران برقرار رہتا ہے
|
||||
- 📊 **بتدریج ظہور** - لیئرڈ میموری کی بازیافت ٹوکن کی لاگت کی نمائندگی کے ساتھ
|
||||
- 🔍 **کمکردہ تلاش** - mem-search مہارت کے ساتھ اپنے منصوبے کی تاریخ میں تلاش کریں
|
||||
- 🖥️ **ویب ویور یو آئی** - http://localhost:37777 پر حقیقی وقت میموری اسٹریم
|
||||
- 💻 **Claude Desktop مہارت** - Claude Desktop بات چیت سے میموری تلاش کریں
|
||||
- 🔒 **رازداری کے کنٹرولز** - حساس مواد کو ذخیرہ سے خارج کرنے کے لیے `<private>` ٹیگ استعمال کریں
|
||||
- ⚙️ **تناسب کی ترتیبات** - کون سا تناسب انجیکٹ کیا جائے اس پر باریک کنٹرول
|
||||
- 🤖 **خودکار آپریشن** - کسی دستی مداخلت کی ضرورت نہیں
|
||||
- 🔗 **حوالہ** - ID کے ذریعے سابقہ مشاہدات کا حوالہ دیں (http://localhost:37777/api/observation/{id} کے ذریعے رسائی حاصل کریں یا تمام کو http://localhost:37777 پر ویب ویور میں دیکھیں)
|
||||
- 🧪 **بیٹا چینل** - ورژن تبدیل کرنے کے ذریعے Endless Mode جیسی تجرباتی خصوصیات آزمائیں
|
||||
|
||||
---
|
||||
|
||||
## دستاویزات
|
||||
|
||||
📚 **[مکمل دستاویزات دیکھیں](docs/)** - GitHub پر markdown ڈاکس کو براؤز کریں
|
||||
|
||||
### شروعات کرنا
|
||||
|
||||
- **[انسٹالیشن گائیڈ](https://docs.claude-mem.ai/installation)** - تیز رفتار شروعات اور اعلیٰ درجے کی انسٹالیشن
|
||||
- **[استعمال گائیڈ](https://docs.claude-mem.ai/usage/getting-started)** - Claude-Mem خودکار طور پر کیسے کام کرتا ہے
|
||||
- **[تلاش کے اوزار](https://docs.claude-mem.ai/usage/search-tools)** - قدرتی زبان کے ساتھ اپنے منصوبے کی تاریخ میں تلاش کریں
|
||||
- **[بیٹا خصوصیات](https://docs.claude-mem.ai/beta-features)** - Endless Mode جیسی تجرباتی خصوصیات آزمائیں
|
||||
|
||||
### بہترین طریقہ کار
|
||||
|
||||
- **[تناسب انجینیئرنگ](https://docs.claude-mem.ai/context-engineering)** - AI ایجنٹ کے تناسب کی اہمیت کے اصول
|
||||
- **[بتدریج ظہور](https://docs.claude-mem.ai/progressive-disclosure)** - Claude-Mem کے تناسب کی تیاری کی حکمت عملی کے پیچھے فلسفہ
|
||||
|
||||
### تعمیر
|
||||
|
||||
- **[جائزہ](https://docs.claude-mem.ai/architecture/overview)** - نظام کے اجزاء اور ڈیٹا کے بہاؤ
|
||||
- **[تعمیر کا ارتقاء](https://docs.claude-mem.ai/architecture-evolution)** - v3 سے v5 تک کا سفر
|
||||
- **[ہکس تعمیر](https://docs.claude-mem.ai/hooks-architecture)** - Claude-Mem لائف سائیکل ہکس کا استعمال کیسے کرتا ہے
|
||||
- **[ہکس حوالہ](https://docs.claude-mem.ai/architecture/hooks)** - 7 ہک اسکرپٹس کی تشریح
|
||||
- **[ورکر سروس](https://docs.claude-mem.ai/architecture/worker-service)** - HTTP API اور Bun انتظام
|
||||
- **[ڈیٹا بیس](https://docs.claude-mem.ai/architecture/database)** - SQLite اسکیما اور FTS5 تلاش
|
||||
- **[تلاش تعمیر](https://docs.claude-mem.ai/architecture/search-architecture)** - Chroma ویکٹر ڈیٹا بیس کے ساتھ ہائبرڈ تلاش
|
||||
|
||||
### ترتیبات اور ترقی
|
||||
|
||||
- **[ترتیبات](https://docs.claude-mem.ai/configuration)** - ماحول کے متغیرات اور سیٹنگز
|
||||
- **[ترقی](https://docs.claude-mem.ai/development)** - تعمیر، جانچ، حصہ داری
|
||||
- **[مسائل کی تشخیص](https://docs.claude-mem.ai/troubleshooting)** - عام مسائل اور حل
|
||||
|
||||
---
|
||||
|
||||
## یہ کیسے کام کرتا ہے
|
||||
|
||||
**اہم اجزاء:**
|
||||
|
||||
1. **5 لائف سائیکل ہکس** - SessionStart، UserPromptSubmit، PostToolUse، Stop، SessionEnd (6 ہک اسکرپٹس)
|
||||
2. **سمارٹ انسٹالیشن** - کیش شدہ منحصرات چیکر (پری ہک اسکرپٹ، لائف سائیکل ہک نہیں)
|
||||
3. **ورکر سروس** - ویب ویور UI اور 10 تلاش کے endpoints کے ساتھ پورٹ 37777 پر HTTP API، Bun کے ذریعے برتاؤ
|
||||
4. **SQLite ڈیٹا بیس** - سیشنز، مشاہدات، خلاصہ ذخیرہ کرتا ہے
|
||||
5. **mem-search مہارت** - بتدریج ظہور کے ساتھ قدرتی زبان کے سوالات
|
||||
6. **Chroma ویکٹر ڈیٹا بیس** - ہائبرڈ سیمانٹک + کلیدی لفظ تلاش ذہین تناسب کی بازیافت کے لیے
|
||||
|
||||
تفصیلات کے لیے [تعمیر کا جائزہ](https://docs.claude-mem.ai/architecture/overview) دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## MCP تلاش کے اوزار
|
||||
|
||||
Claude-Mem ٹوکن-موثر **3-لیئر ورک فلو پیٹرن** کی پیروی کرتے ہوئے **4 MCP اوزار** کے ذریعے ذہین میموری تلاش فراہم کرتا ہے:
|
||||
|
||||
**3-لیئر ورک فلو:**
|
||||
|
||||
1. **`search`** - IDs کے ساتھ کمپیکٹ انڈیکس حاصل کریں (~50-100 ٹوکن/نتیجہ)
|
||||
2. **`timeline`** - دلچسپ نتائج کے ارد گرد زمانی تناسب حاصل کریں
|
||||
3. **`get_observations`** - فلٹر شدہ IDs کے لیے صرف مکمل تفصیلات حاصل کریں (~500-1,000 ٹوکن/نتیجہ)
|
||||
|
||||
**یہ کیسے کام کرتا ہے:**
|
||||
- Claude آپ کی میموری میں تلاش کے لیے MCP اوزار استعمال کرتا ہے
|
||||
- نتائج کا انڈیکس حاصل کرنے کے لیے `search` سے شروع کریں
|
||||
- مخصوص مشاہدات کے ارد گرد کیا ہو رہا تھا دیکھنے کے لیے `timeline` استعمال کریں
|
||||
- متعلقہ IDs کے لیے مکمل تفصیلات حاصل کرنے کے لیے `get_observations` استعمال کریں
|
||||
- تفصیلات حاصل کرنے سے پہلے فلٹرنگ کے ذریعے **~10x ٹوکن کی بچت**
|
||||
|
||||
**دستیاب MCP اوزار:**
|
||||
|
||||
1. **`search`** - مکمل متن کی تلاش کے سوالات کے ساتھ میموری انڈیکس تلاش کریں، قسم/تاریخ/منصوبے کے لحاظ سے فلٹر کریں
|
||||
2. **`timeline`** - مخصوص مشاہدہ یا سوال کے ارد گرد زمانی تناسب حاصل کریں
|
||||
3. **`get_observations`** - IDs کے ذریعے مکمل مشاہدہ تفصیلات حاصل کریں (ہمیشہ متعدد IDs کو بیچ کریں)
|
||||
4. **`__IMPORTANT`** - ورک فلو دستاویزات (ہمیشہ Claude کو نظر آتی ہے)
|
||||
|
||||
**استعمال کی مثال:**
|
||||
|
||||
```typescript
|
||||
// مرحلہ 1: انڈیکس کے لیے تلاش کریں
|
||||
search(query="authentication bug", type="bugfix", limit=10)
|
||||
|
||||
// مرحلہ 2: انڈیکس کا جائزہ لیں، متعلقہ IDs کی شناخت کریں (مثلاً، #123, #456)
|
||||
|
||||
// مرحلہ 3: مکمل تفصیلات حاصل کریں
|
||||
get_observations(ids=[123, 456])
|
||||
```
|
||||
|
||||
تفصیلی مثالوں کے لیے [تلاش کے اوزار گائیڈ](https://docs.claude-mem.ai/usage/search-tools) دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## بیٹا خصوصیات
|
||||
|
||||
Claude-Mem ایک **بیٹا چینل** فراہم کرتا ہے جس میں **Endless Mode** جیسی تجرباتی خصوصیات ہیں (بڑھی ہوئی سیشنز کے لیے حیاتی نقل میموری کی تعمیر)۔ http://localhost:37777 → Settings میں ویب ویور UI سے مستحکم اور بیٹا ورژن کے درمیان سوئچ کریں۔
|
||||
|
||||
Endless Mode اور اسے کیسے آزمائیں اس کے بارے میں تفصیلات کے لیے **[بیٹا خصوصیات دستاویزات](https://docs.claude-mem.ai/beta-features)** دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## نظام کی ضروریات
|
||||
|
||||
- **Node.js**: 18.0.0 یا اس سے اوپر
|
||||
- **Claude Code**: پلگ ان سپورٹ کے ساتھ جدید ترین ورژن
|
||||
- **Bun**: JavaScript رن ٹائم اور پروسیس مینیجر (غیر موجود ہو تو خودکار طور پر انسٹال ہوگا)
|
||||
- **uv**: ویکٹر تلاش کے لیے Python پیکج مینیجر (غیر موجود ہو تو خودکار طور پر انسٹال ہوگا)
|
||||
- **SQLite 3**: مستقل اسٹوریج کے لیے (بنڈل شدہ)
|
||||
|
||||
---
|
||||
|
||||
## ترتیبات
|
||||
|
||||
سیٹنگز `~/.claude-mem/settings.json` میں منظم ہیں (پہلی رن میں ڈیفالٹ کے ساتھ خودکار طور پر بنائی جاتی ہے)۔ AI ماڈل، ورکر پورٹ، ڈیٹا ڈائریکٹری، لاگ لیول اور تناسب انجیکشن سیٹنگز کو ترتیب دیں۔
|
||||
|
||||
تمام دستیاب سیٹنگز اور مثالوں کے لیے **[ترتیبات گائیڈ](https://docs.claude-mem.ai/configuration)** دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## ترقی
|
||||
|
||||
تعمیر کی ہدایات، جانچ اور حصہ داری کے کام کے بہاؤ کے لیے **[ترقی گائیڈ](https://docs.claude-mem.ai/development)** دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## مسائل کی تشخیص
|
||||
|
||||
اگر مسائل کا سامنا ہو تو Claude کو مسئلہ بتائیں اور troubleshoot مہارت خودکار طور پر تشخیص دے گی اور حل فراہم کرے گی۔
|
||||
|
||||
عام مسائل اور حل کے لیے **[مسائل کی تشخیص گائیڈ](https://docs.claude-mem.ai/troubleshooting)** دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## خرابی کی رپورٹ
|
||||
|
||||
خودکار جنریٹر کے ساتھ تفصیلی خرابی کی رپورٹ تیار کریں:
|
||||
|
||||
```bash
|
||||
cd ~/.claude/plugins/marketplaces/thedotmack
|
||||
npm run bug-report
|
||||
```
|
||||
|
||||
## حصہ داری
|
||||
|
||||
حصہ داری کا خیر مقدم ہے! براہ کرم:
|
||||
|
||||
1. رپوزیٹری کو فورک کریں
|
||||
2. ایک خصوصیت کی برانچ بنائیں
|
||||
3. ٹیسٹ کے ساتھ اپنی تبدیلیاں کریں
|
||||
4. دستاویزات کو اپڈیٹ کریں
|
||||
5. ایک Pull Request جمع کریں
|
||||
|
||||
حصہ داری کے کام کے بہاؤ کے لیے [ترقی گائیڈ](https://docs.claude-mem.ai/development) دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## لائسنس
|
||||
|
||||
یہ منصوبہ **GNU Affero General Public License v3.0** (AGPL-3.0) کے تحت لائسنس ہے۔
|
||||
|
||||
Copyright (C) 2025 Alex Newman (@thedotmack)۔ تمام حقوق محفوظ ہیں۔
|
||||
|
||||
مکمل تفصیلات کے لیے [LICENSE](LICENSE) فائل دیکھیں۔
|
||||
|
||||
**اس کا مطلب کیا ہے:**
|
||||
|
||||
- آپ اس سافٹ ویئر کو آزادی سے استعمال، تبدیل اور تقسیم کر سکتے ہیں
|
||||
- اگر آپ اسے تبدیل کریں اور نیٹ ورک سرور میں نشر کریں تو آپ کو اپنا سورس کوڈ دستیاب کرنا ہوگا
|
||||
- ماخوذ کام بھی AGPL-3.0 کے تحت لائسنس ہونے چاہیں
|
||||
- اس سافٹ ویئر کے لیے کوئی وارنٹی نہیں
|
||||
|
||||
**Ragtime کے بارے میں نوٹ**: `ragtime/` ڈائریکٹری الگ سے **PolyForm Noncommercial License 1.0.0** کے تحت لائسنس ہے۔ تفصیلات کے لیے [ragtime/LICENSE](ragtime/LICENSE) دیکھیں۔
|
||||
|
||||
---
|
||||
|
||||
## معاونت
|
||||
|
||||
- **دستاویزات**: [docs/](docs/)
|
||||
- **مسائل**: [GitHub Issues](https://github.com/thedotmack/claude-mem/issues)
|
||||
- **رپوزیٹری**: [github.com/thedotmack/claude-mem](https://github.com/thedotmack/claude-mem)
|
||||
- **مصنف**: Alex Newman ([@thedotmack](https://github.com/thedotmack))
|
||||
|
||||
---
|
||||
|
||||
**Claude Agent SDK کے ساتھ بنایا گیا** | **Claude Code کے ذریعے طاقت ور** | **TypeScript کے ساتھ بنایا گیا**
|
||||
|
||||
</section>
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@ Khởi động lại Claude Code. Ngữ cảnh từ các phiên trước sẽ t
|
||||
|
||||
## Tài Liệu
|
||||
|
||||
📚 **[Xem Tài Liệu Đầy Đủ](docs/)** - Duyệt tài liệu markdown trên GitHub
|
||||
📚 **[Xem Tài Liệu Đầy Đủ](https://docs.claude-mem.ai/)** - Duyệt trên trang web chính thức
|
||||
|
||||
### Bắt Đầu
|
||||
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
🌐 這是自動翻譯。歡迎社群貢獻修正!
|
||||
|
||||
---
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-dark-mode.webp">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp" alt="Claude-Mem" width="400">
|
||||
</picture>
|
||||
</a>
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
<a href="README.es.md">🇪🇸 Español</a> •
|
||||
<a href="README.de.md">🇩🇪 Deutsch</a> •
|
||||
<a href="README.fr.md">🇫🇷 Français</a>
|
||||
<a href="README.he.md">🇮🇱 עברית</a> •
|
||||
<a href="README.ar.md">🇸🇦 العربية</a> •
|
||||
<a href="README.ru.md">🇷🇺 Русский</a> •
|
||||
<a href="README.pl.md">🇵🇱 Polski</a> •
|
||||
<a href="README.cs.md">🇨🇿 Čeština</a> •
|
||||
<a href="README.nl.md">🇳🇱 Nederlands</a> •
|
||||
<a href="README.tr.md">🇹🇷 Türkçe</a> •
|
||||
<a href="README.uk.md">🇺🇦 Українська</a> •
|
||||
<a href="README.vi.md">🇻🇳 Tiếng Việt</a> •
|
||||
<a href="README.id.md">🇮🇩 Indonesia</a> •
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
<a href="README.el.md">🇬🇷 Ελληνικά</a> •
|
||||
<a href="README.hu.md">🇭🇺 Magyar</a> •
|
||||
<a href="README.fi.md">🇫🇮 Suomi</a> •
|
||||
<a href="README.da.md">🇩🇰 Dansk</a> •
|
||||
<a href="README.no.md">🇳🇴 Norsk</a>
|
||||
</p>
|
||||
|
||||
<h4 align="center">為 <a href="https://claude.com/claude-code" target="_blank">Claude Code</a> 打造的持久記憶壓縮系統</h4>
|
||||
|
||||
<p align="center">
|
||||
<a href="LICENSE">
|
||||
<img src="https://img.shields.io/badge/License-AGPL%203.0-blue.svg" alt="License">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/version-6.5.0-green.svg" alt="Version">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg" alt="Node">
|
||||
</a>
|
||||
<a href="https://github.com/thedotmack/awesome-claude-code">
|
||||
<img src="https://awesome.re/mentioned-badge.svg" alt="Mentioned in Awesome Claude Code">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://trendshift.io/repositories/15496" target="_blank">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge-dark.svg">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg" alt="thedotmack/claude-mem | Trendshift" width="250" height="55"/>
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/cm-preview.gif" alt="Claude-Mem Preview" width="800">
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#快速開始">快速開始</a> •
|
||||
<a href="#運作原理">運作原理</a> •
|
||||
<a href="#mcp-搜尋工具">搜尋工具</a> •
|
||||
<a href="#文件">文件</a> •
|
||||
<a href="#設定">設定</a> •
|
||||
<a href="#疑難排解">疑難排解</a> •
|
||||
<a href="#授權條款">授權條款</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
Claude-Mem 透過自動擷取工具使用觀察、產生語意摘要並在未來的工作階段中提供使用,無縫保留跨工作階段的脈絡。這使 Claude 即使在工作階段結束或重新連線後,仍能維持對專案的知識連續性。
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## 快速開始
|
||||
|
||||
在終端機中開啟新的 Claude Code 工作階段,並輸入以下指令:
|
||||
|
||||
```
|
||||
> /plugin marketplace add thedotmack/claude-mem
|
||||
|
||||
> /plugin install claude-mem
|
||||
```
|
||||
|
||||
重新啟動 Claude Code。先前工作階段的脈絡將自動出現在新的工作階段中。
|
||||
|
||||
**主要功能:**
|
||||
|
||||
- 🧠 **持久記憶** - 脈絡跨工作階段保留
|
||||
- 📊 **漸進式揭露** - 具有 Token 成本可見性的分層記憶擷取
|
||||
- 🔍 **技能式搜尋** - 使用 mem-search 技能查詢專案歷史
|
||||
- 🖥️ **網頁檢視介面** - 在 http://localhost:37777 即時檢視記憶串流
|
||||
- 💻 **Claude Desktop 技能** - 從 Claude Desktop 對話中搜尋記憶
|
||||
- 🔒 **隱私控制** - 使用 `<private>` 標籤排除敏感內容的儲存
|
||||
- ⚙️ **脈絡設定** - 精細控制注入哪些脈絡
|
||||
- 🤖 **自動運作** - 無需手動介入
|
||||
- 🔗 **引用** - 使用 ID 參考過去的觀察(透過 http://localhost:37777/api/observation/{id} 存取,或在 http://localhost:37777 的網頁檢視器中檢視全部)
|
||||
- 🧪 **Beta 通道** - 透過版本切換試用 Endless Mode 等實驗性功能
|
||||
|
||||
---
|
||||
|
||||
## 文件
|
||||
|
||||
📚 **[檢視完整文件](docs/)** - 在 GitHub 上瀏覽 Markdown 文件
|
||||
|
||||
### 入門指南
|
||||
|
||||
- **[安裝指南](https://docs.claude-mem.ai/installation)** - 快速開始與進階安裝
|
||||
- **[使用指南](https://docs.claude-mem.ai/usage/getting-started)** - Claude-Mem 如何自動運作
|
||||
- **[搜尋工具](https://docs.claude-mem.ai/usage/search-tools)** - 使用自然語言查詢專案歷史
|
||||
- **[Beta 功能](https://docs.claude-mem.ai/beta-features)** - 試用 Endless Mode 等實驗性功能
|
||||
|
||||
### 最佳實務
|
||||
|
||||
- **[脈絡工程](https://docs.claude-mem.ai/context-engineering)** - AI 代理脈絡最佳化原則
|
||||
- **[漸進式揭露](https://docs.claude-mem.ai/progressive-disclosure)** - Claude-Mem 脈絡啟動策略背後的理念
|
||||
|
||||
### 架構
|
||||
|
||||
- **[概覽](https://docs.claude-mem.ai/architecture/overview)** - 系統元件與資料流程
|
||||
- **[架構演進](https://docs.claude-mem.ai/architecture-evolution)** - 從 v3 到 v5 的旅程
|
||||
- **[Hooks 架構](https://docs.claude-mem.ai/hooks-architecture)** - Claude-Mem 如何使用生命週期掛鉤
|
||||
- **[Hooks 參考](https://docs.claude-mem.ai/architecture/hooks)** - 7 個掛鉤腳本說明
|
||||
- **[Worker 服務](https://docs.claude-mem.ai/architecture/worker-service)** - HTTP API 與 Bun 管理
|
||||
- **[資料庫](https://docs.claude-mem.ai/architecture/database)** - SQLite 結構描述與 FTS5 搜尋
|
||||
- **[搜尋架構](https://docs.claude-mem.ai/architecture/search-architecture)** - 使用 Chroma 向量資料庫的混合搜尋
|
||||
|
||||
### 設定與開發
|
||||
|
||||
- **[設定](https://docs.claude-mem.ai/configuration)** - 環境變數與設定
|
||||
- **[開發](https://docs.claude-mem.ai/development)** - 建置、測試、貢獻
|
||||
- **[疑難排解](https://docs.claude-mem.ai/troubleshooting)** - 常見問題與解決方案
|
||||
|
||||
---
|
||||
|
||||
## 運作原理
|
||||
|
||||
**核心元件:**
|
||||
|
||||
1. **5 個生命週期掛鉤** - SessionStart、UserPromptSubmit、PostToolUse、Stop、SessionEnd(6 個掛鉤腳本)
|
||||
2. **智慧安裝** - 快取的相依性檢查器(pre-hook 腳本,非生命週期掛鉤)
|
||||
3. **Worker 服務** - 連接埠 37777 上的 HTTP API,含網頁檢視介面與 10 個搜尋端點,由 Bun 管理
|
||||
4. **SQLite 資料庫** - 儲存工作階段、觀察、摘要
|
||||
5. **mem-search 技能** - 具有漸進式揭露的自然語言查詢
|
||||
6. **Chroma 向量資料庫** - 用於智慧脈絡擷取的混合語意 + 關鍵字搜尋
|
||||
|
||||
詳情請參閱[架構概覽](https://docs.claude-mem.ai/architecture/overview)。
|
||||
|
||||
---
|
||||
|
||||
## MCP 搜尋工具
|
||||
|
||||
Claude-Mem 透過遵循 Token 高效的 **3 層工作流程模式**,以 **4 個 MCP 工具**提供智慧記憶搜尋:
|
||||
|
||||
**3 層工作流程:**
|
||||
|
||||
1. **`search`** - 取得精簡索引與 ID(每筆結果約 50-100 tokens)
|
||||
2. **`timeline`** - 取得有趣結果周圍的時間脈絡
|
||||
3. **`get_observations`** - 僅為過濾後的 ID 擷取完整詳情(每筆結果約 500-1,000 tokens)
|
||||
|
||||
**運作方式:**
|
||||
|
||||
- Claude 使用 MCP 工具搜尋您的記憶
|
||||
- 從 `search` 開始取得結果索引
|
||||
- 使用 `timeline` 檢視特定觀察周圍發生的事情
|
||||
- 使用 `get_observations` 擷取相關 ID 的完整詳情
|
||||
- 透過在擷取詳情前過濾,**節省約 10 倍 token**
|
||||
|
||||
**可用的 MCP 工具:**
|
||||
|
||||
1. **`search`** - 使用全文查詢搜尋記憶索引,依類型/日期/專案過濾
|
||||
2. **`timeline`** - 取得特定觀察或查詢周圍的時間脈絡
|
||||
3. **`get_observations`** - 依 ID 擷取完整觀察詳情(批次處理多個 ID)
|
||||
4. **`__IMPORTANT`** - 工作流程文件(Claude 永遠可見)
|
||||
|
||||
**使用範例:**
|
||||
|
||||
```typescript
|
||||
// 步驟 1:搜尋索引
|
||||
search(query="authentication bug", type="bugfix", limit=10)
|
||||
|
||||
// 步驟 2:檢閱索引,識別相關 ID(例如 #123、#456)
|
||||
|
||||
// 步驟 3:擷取完整詳情
|
||||
get_observations(ids=[123, 456])
|
||||
```
|
||||
|
||||
詳細範例請參閱[搜尋工具指南](https://docs.claude-mem.ai/usage/search-tools)。
|
||||
|
||||
---
|
||||
|
||||
## Beta 功能
|
||||
|
||||
Claude-Mem 提供具有實驗性功能的 **Beta 通道**,例如 **Endless Mode**(用於延長工作階段的仿生記憶架構)。在 http://localhost:37777 → Settings 的網頁檢視介面中切換穩定版與 Beta 版。
|
||||
|
||||
有關 Endless Mode 與如何試用的詳情,請參閱 **[Beta 功能文件](https://docs.claude-mem.ai/beta-features)**。
|
||||
|
||||
---
|
||||
|
||||
## 系統需求
|
||||
|
||||
- **Node.js**:18.0.0 或更高版本
|
||||
- **Claude Code**:具有外掛支援的最新版本
|
||||
- **Bun**:JavaScript 執行環境與程序管理員(如缺少將自動安裝)
|
||||
- **uv**:用於向量搜尋的 Python 套件管理員(如缺少將自動安裝)
|
||||
- **SQLite 3**:用於持久儲存(已內建)
|
||||
|
||||
---
|
||||
|
||||
## 設定
|
||||
|
||||
設定在 `~/.claude-mem/settings.json` 中管理(首次執行時自動以預設值建立)。設定 AI 模型、Worker 連接埠、資料目錄、日誌層級與脈絡注入設定。
|
||||
|
||||
所有可用設定與範例請參閱 **[設定指南](https://docs.claude-mem.ai/configuration)**。
|
||||
|
||||
---
|
||||
|
||||
## 開發
|
||||
|
||||
建置說明、測試與貢獻工作流程請參閱 **[開發指南](https://docs.claude-mem.ai/development)**。
|
||||
|
||||
---
|
||||
|
||||
## 疑難排解
|
||||
|
||||
如遇問題,向 Claude 描述問題,troubleshoot 技能將自動診斷並提供修正。
|
||||
|
||||
常見問題與解決方案請參閱 **[疑難排解指南](https://docs.claude-mem.ai/troubleshooting)**。
|
||||
|
||||
---
|
||||
|
||||
## 錯誤回報
|
||||
|
||||
使用自動產生器建立完整的錯誤回報:
|
||||
|
||||
```bash
|
||||
cd ~/.claude/plugins/marketplaces/thedotmack
|
||||
npm run bug-report
|
||||
```
|
||||
|
||||
## 貢獻
|
||||
|
||||
歡迎貢獻!請依照以下步驟:
|
||||
|
||||
1. Fork 儲存庫
|
||||
2. 建立功能分支
|
||||
3. 加入測試並進行變更
|
||||
4. 更新文件
|
||||
5. 提交 Pull Request
|
||||
|
||||
貢獻工作流程請參閱[開發指南](https://docs.claude-mem.ai/development)。
|
||||
|
||||
---
|
||||
|
||||
## 授權條款
|
||||
|
||||
本專案採用 **GNU Affero 通用公共授權條款 v3.0**(AGPL-3.0)授權。
|
||||
|
||||
Copyright (C) 2025 Alex Newman (@thedotmack). All rights reserved.
|
||||
|
||||
完整詳情請參閱 [LICENSE](LICENSE) 檔案。
|
||||
|
||||
**這代表什麼:**
|
||||
|
||||
- 您可以自由使用、修改與散佈此軟體
|
||||
- 如果您修改並部署於網路伺服器上,您必須公開您的原始碼
|
||||
- 衍生作品也必須採用 AGPL-3.0 授權
|
||||
- 本軟體不提供任何擔保
|
||||
|
||||
**關於 Ragtime 的說明**:`ragtime/` 目錄採用 **PolyForm Noncommercial License 1.0.0** 另行授權。詳情請參閱 [ragtime/LICENSE](ragtime/LICENSE)。
|
||||
|
||||
---
|
||||
|
||||
## 支援
|
||||
|
||||
- **文件**:[docs/](docs/)
|
||||
- **Issues**:[GitHub Issues](https://github.com/thedotmack/claude-mem/issues)
|
||||
- **儲存庫**:[github.com/thedotmack/claude-mem](https://github.com/thedotmack/claude-mem)
|
||||
- **官方 X 帳號**:[@Claude_Memory](https://x.com/Claude_Memory)
|
||||
- **官方 Discord**:[加入 Discord](https://discord.com/invite/J4wttp9vDu)
|
||||
- **作者**:Alex Newman ([@thedotmack](https://github.com/thedotmack))
|
||||
|
||||
---
|
||||
|
||||
**使用 Claude Agent SDK 建置** | **由 Claude Code 驅動** | **以 TypeScript 開發**
|
||||
@@ -15,6 +15,7 @@
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
@@ -34,6 +35,7 @@
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
@@ -126,7 +128,7 @@
|
||||
|
||||
## 文档
|
||||
|
||||
📚 **[查看完整文档](docs/)** - 在 GitHub 上浏览 Markdown 文档
|
||||
📚 **[查看完整文档](https://docs.claude-mem.ai/)** - 在官方网站浏览
|
||||
|
||||
### 入门指南
|
||||
|
||||
@@ -212,7 +214,7 @@ Claude-Mem 通过 mem-search 技能提供智能搜索,当您询问过去的工
|
||||
|
||||
Claude-Mem 提供**测试版渠道**,包含实验性功能,如**无尽模式**(用于扩展会话的仿生记忆架构)。从 Web 查看器界面 http://localhost:37777 → 设置 切换稳定版和测试版。
|
||||
|
||||
详见**[测试版功能文档](https://docs.claude-mem.ai/beta-features)**了解无尽模式的详细信息和试用方法。
|
||||
详见 **[测试版功能文档](https://docs.claude-mem.ai/beta-features)** 了解无尽模式的详细信息和试用方法。
|
||||
|
||||
---
|
||||
|
||||
@@ -230,13 +232,13 @@ Claude-Mem 提供**测试版渠道**,包含实验性功能,如**无尽模式**(
|
||||
|
||||
设置在 `~/.claude-mem/settings.json` 中管理(首次运行时自动创建默认设置)。可配置 AI 模型、worker 端口、数据目录、日志级别和上下文注入设置。
|
||||
|
||||
详见**[配置指南](https://docs.claude-mem.ai/configuration)**了解所有可用设置和示例。
|
||||
详见 **[配置指南](https://docs.claude-mem.ai/configuration)** 了解所有可用设置和示例。
|
||||
|
||||
---
|
||||
|
||||
## 开发
|
||||
|
||||
详见**[开发指南](https://docs.claude-mem.ai/development)**了解构建说明、测试和贡献工作流程。
|
||||
详见 **[开发指南](https://docs.claude-mem.ai/development)** 了解构建说明、测试和贡献工作流程。
|
||||
|
||||
---
|
||||
|
||||
@@ -244,7 +246,7 @@ Claude-Mem 提供**测试版渠道**,包含实验性功能,如**无尽模式**(
|
||||
|
||||
如果遇到问题,向 Claude 描述问题,troubleshoot 技能将自动诊断并提供修复方案。
|
||||
|
||||
详见**[故障排除指南](https://docs.claude-mem.ai/troubleshooting)**了解常见问题和解决方案。
|
||||
详见 **[故障排除指南](https://docs.claude-mem.ai/troubleshooting)** 了解常见问题和解决方案。
|
||||
|
||||
---
|
||||
|
||||
@@ -301,4 +303,4 @@ Copyright (C) 2025 Alex Newman (@thedotmack)。保留所有权利。
|
||||
|
||||
**使用 Claude Agent SDK 构建** | **由 Claude Code 驱动** | **使用 TypeScript 制作**
|
||||
|
||||
---
|
||||
---
|
||||
|
||||
+305
@@ -0,0 +1,305 @@
|
||||
🌐 Esta é uma tradução manual por mig4ng. Correções da comunidade são bem-vindas!
|
||||
|
||||
---
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-dark-mode.webp">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/claude-mem-logo-for-light-mode.webp" alt="Claude-Mem" width="400">
|
||||
</picture>
|
||||
</a>
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
<p align="center">
|
||||
<a href="README.zh.md">🇨🇳 中文</a> •
|
||||
<a href="README.zh-tw.md">🇹🇼 繁體中文</a> •
|
||||
<a href="README.ja.md">🇯🇵 日本語</a> •
|
||||
<a href="README.pt.md">🇵🇹 Português</a> •
|
||||
<a href="README.pt-br.md">🇧🇷 Português (Brasil)</a> •
|
||||
<a href="README.ko.md">🇰🇷 한국어</a> •
|
||||
<a href="README.es.md">🇪🇸 Español</a> •
|
||||
<a href="README.de.md">🇩🇪 Deutsch</a> •
|
||||
<a href="README.fr.md">🇫🇷 Français</a>
|
||||
<a href="README.he.md">🇮🇱 עברית</a> •
|
||||
<a href="README.ar.md">🇸🇦 العربية</a> •
|
||||
<a href="README.ru.md">🇷🇺 Русский</a> •
|
||||
<a href="README.pl.md">🇵🇱 Polski</a> •
|
||||
<a href="README.cs.md">🇨🇿 Čeština</a> •
|
||||
<a href="README.nl.md">🇳🇱 Nederlands</a> •
|
||||
<a href="README.tr.md">🇹🇷 Türkçe</a> •
|
||||
<a href="README.uk.md">🇺🇦 Українська</a> •
|
||||
<a href="README.vi.md">🇻🇳 Tiếng Việt</a> •
|
||||
<a href="README.id.md">🇮🇩 Indonesia</a> •
|
||||
<a href="README.th.md">🇹🇭 ไทย</a> •
|
||||
<a href="README.hi.md">🇮🇳 हिन्दी</a> •
|
||||
<a href="README.bn.md">🇧🇩 বাংলা</a> •
|
||||
<a href="README.ur.md">🇵🇰 اردو</a> •
|
||||
<a href="README.ro.md">🇷🇴 Română</a> •
|
||||
<a href="README.sv.md">🇸🇪 Svenska</a> •
|
||||
<a href="README.it.md">🇮🇹 Italiano</a> •
|
||||
<a href="README.el.md">🇬🇷 Ελληνικά</a> •
|
||||
<a href="README.hu.md">🇭🇺 Magyar</a> •
|
||||
<a href="README.fi.md">🇫🇮 Suomi</a> •
|
||||
<a href="README.da.md">🇩🇰 Dansk</a> •
|
||||
<a href="README.no.md">🇳🇴 Norsk</a>
|
||||
</p>
|
||||
|
||||
<h4 align="center">Sistema de compressão de memória persistente construído para <a href="https://claude.com/claude-code" target="_blank">Claude Code</a>.</h4>
|
||||
|
||||
<p align="center">
|
||||
<a href="LICENSE">
|
||||
<img src="https://img.shields.io/badge/License-AGPL%203.0-blue.svg" alt="License">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/version-6.5.0-green.svg" alt="Version">
|
||||
</a>
|
||||
<a href="package.json">
|
||||
<img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg" alt="Node">
|
||||
</a>
|
||||
<a href="https://github.com/thedotmack/awesome-claude-code">
|
||||
<img src="https://awesome.re/mentioned-badge.svg" alt="Mentioned in Awesome Claude Code">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://trendshift.io/repositories/15496" target="_blank">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge-dark.svg">
|
||||
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg">
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/trendshift-badge.svg" alt="thedotmack/claude-mem | Trendshift" width="250" height="55"/>
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<br>
|
||||
|
||||
<p align="center">
|
||||
<a href="https://github.com/thedotmack/claude-mem">
|
||||
<picture>
|
||||
<img src="https://raw.githubusercontent.com/thedotmack/claude-mem/main/docs/public/cm-preview.gif" alt="Claude-Mem Preview" width="800">
|
||||
</picture>
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
<a href="#início-rápido">Início Rápido</a> •
|
||||
<a href="#como-funciona">Como Funciona</a> •
|
||||
<a href="#ferramentas-de-procura-mcp">Ferramentas de Procura</a> •
|
||||
<a href="#documentação">Documentação</a> •
|
||||
<a href="#configuração">Configuração</a> •
|
||||
<a href="#solução-de-problemas">Solução de Problemas</a> •
|
||||
<a href="#licença">Licença</a>
|
||||
</p>
|
||||
|
||||
<p align="center">
|
||||
Claude-Mem preserva o contexto perfeitamente entre sessões, capturando automaticamente observações de uso de ferramentas, gerando resumos semânticos e disponibilizando-os para sessões futuras. Isso permite que Claude mantenha a continuidade do conhecimento sobre projetos mesmo após o término ou reconexão de sessões.
|
||||
</p>
|
||||
|
||||
---
|
||||
|
||||
## Início Rápido
|
||||
|
||||
Inicie uma nova sessão do Claude Code no terminal e digite os seguintes comandos:
|
||||
|
||||
```
|
||||
> /plugin marketplace add thedotmack/claude-mem
|
||||
|
||||
> /plugin install claude-mem
|
||||
```
|
||||
|
||||
Reinicie o Claude Code. O contexto de sessões anteriores aparecerá automaticamente em novas sessões.
|
||||
|
||||
**Principais Recursos:**
|
||||
|
||||
- 🧠 **Memória Persistente** - O contexto sobrevive entre sessões
|
||||
- 📊 **Divulgação Progressiva** - Recuperação de memória em camadas com visibilidade de custo de tokens
|
||||
- 🔍 **Procura Baseada em Skill** - Consulte seu histórico de projeto com a skill mem-search
|
||||
- 🖥️ **Interface Web de Visualização** - Fluxo de memória em tempo real em http://localhost:37777
|
||||
- 💻 **Skill para Claude Desktop** - Busque memória em conversas do Claude Desktop
|
||||
- 🔒 **Controle de Privacidade** - Use tags `<private>` para excluir conteúdo sensível do armazenamento
|
||||
- ⚙️ **Configuração de Contexto** - Controle refinado sobre qual contexto é injetado
|
||||
- 🤖 **Operação Automática** - Nenhuma intervenção manual necessária
|
||||
- 🔗 **Citações** - Referencie observações passadas com IDs (acesse via http://localhost:37777/api/observation/{id} ou visualize todas no visualizador web em http://localhost:37777)
|
||||
- 🧪 **Canal Beta** - Experimente recursos experimentais como o Endless Mode através da troca de versões
|
||||
|
||||
---
|
||||
|
||||
## Documentação
|
||||
|
||||
📚 **[Ver Documentação Completa](https://docs.claude-mem.ai/)** - Navegar no site oficial
|
||||
|
||||
### Começando
|
||||
|
||||
- **[Guia de Instalação](https://docs.claude-mem.ai/installation)** - Início rápido e instalação avançada
|
||||
- **[Guia de Uso](https://docs.claude-mem.ai/usage/getting-started)** - Como Claude-Mem funciona automaticamente
|
||||
- **[Ferramentas de Procura](https://docs.claude-mem.ai/usage/search-tools)** - Consulte seu histórico de projeto com linguagem natural
|
||||
- **[Recursos Beta](https://docs.claude-mem.ai/beta-features)** - Experimente recursos experimentais como o Endless Mode
|
||||
|
||||
### Melhores Práticas
|
||||
|
||||
- **[Engenharia de Contexto](https://docs.claude-mem.ai/context-engineering)** - Princípios de otimização de contexto para agentes de IA
|
||||
- **[Divulgação Progressiva](https://docs.claude-mem.ai/progressive-disclosure)** - Filosofia por trás da estratégia de preparação de contexto do Claude-Mem
|
||||
|
||||
### Arquitetura
|
||||
|
||||
- **[Visão Geral](https://docs.claude-mem.ai/architecture/overview)** - Componentes do sistema e fluxo de dados
|
||||
- **[Evolução da Arquitetura](https://docs.claude-mem.ai/architecture-evolution)** - A jornada da v3 à v5
|
||||
- **[Arquitetura de Hooks](https://docs.claude-mem.ai/hooks-architecture)** - Como Claude-Mem usa hooks de ciclo de vida
|
||||
- **[Referência de Hooks](https://docs.claude-mem.ai/architecture/hooks)** - 7 scripts de hook explicados
|
||||
- **[Serviço Worker](https://docs.claude-mem.ai/architecture/worker-service)** - API HTTP e gerenciamento do Bun
|
||||
- **[Banco de Dados](https://docs.claude-mem.ai/architecture/database)** - Schema SQLite e Procura FTS5
|
||||
- **[Arquitetura de Procura](https://docs.claude-mem.ai/architecture/search-architecture)** - Procura híbrida com banco de dados vetorial Chroma
|
||||
|
||||
### Configuração e Desenvolvimento
|
||||
|
||||
- **[Configuração](https://docs.claude-mem.ai/configuration)** - Variáveis de ambiente e configurações
|
||||
- **[Desenvolvimento](https://docs.claude-mem.ai/development)** - Build, testes e contribuição
|
||||
- **[Solução de Problemas](https://docs.claude-mem.ai/troubleshooting)** - Problemas comuns e soluções
|
||||
|
||||
---
|
||||
|
||||
## Como Funciona
|
||||
|
||||
**Componentes Principais:**
|
||||
|
||||
1. **5 Hooks de Ciclo de Vida** - SessionStart, UserPromptSubmit, PostToolUse, Stop, SessionEnd (6 scripts de hook)
|
||||
2. **Instalação Inteligente** - Verificador de dependências em cache (script pré-hook, não um hook de ciclo de vida)
|
||||
3. **Serviço Worker** - API HTTP na porta 37777 com interface de visualização web e 10 endpoints de Procura, gerenciado pelo Bun
|
||||
4. **Banco de Dados SQLite** - Armazena sessões, observações, resumos
|
||||
5. **Skill mem-search** - Consultas em linguagem natural com divulgação progressiva
|
||||
6. **Banco de Dados Vetorial Chroma** - Procura híbrida semântica + palavra-chave para recuperação inteligente de contexto
|
||||
|
||||
Veja [Visão Geral da Arquitetura](https://docs.claude-mem.ai/architecture/overview) para detalhes.
|
||||
|
||||
---
|
||||
|
||||
## Skill mem-search
|
||||
|
||||
Claude-Mem fornece Procura inteligente através da skill mem-search que se auto-invoca quando você pergunta sobre trabalhos anteriores:
|
||||
|
||||
**Como Funciona:**
|
||||
- Pergunte naturalmente: *"O que fizemos na última sessão?"* ou *"Já corrigimos esse bug antes?"*
|
||||
- Claude invoca automaticamente a skill mem-search para encontrar contexto relevante
|
||||
|
||||
**Operações de Procura Disponíveis:**
|
||||
|
||||
1. **Search Observations** - Procura de texto completo em observações
|
||||
2. **Search Sessions** - Procura de texto completo em resumos de sessão
|
||||
3. **Search Prompts** - Procura em solicitações brutas do usuário
|
||||
4. **By Concept** - Encontre por tags de conceito (discovery, problem-solution, pattern, etc.)
|
||||
5. **By File** - Encontre observações que referenciam arquivos específicos
|
||||
6. **By Type** - Encontre por tipo (decision, bugfix, feature, refactor, discovery, change)
|
||||
7. **Recent Context** - Obtenha contexto de sessão recente para um projeto
|
||||
8. **Timeline** - Obtenha linha do tempo unificada de contexto em torno de um ponto específico no tempo
|
||||
9. **Timeline by Query** - Busque observações e obtenha contexto de linha do tempo em torno da melhor correspondência
|
||||
10. **API Help** - Obtenha documentação da API de Procura
|
||||
|
||||
**Exemplos de Consultas em Linguagem Natural:**
|
||||
|
||||
```
|
||||
"Quais bugs corrigimos na última sessão?"
|
||||
"Como implementamos a autenticação?"
|
||||
"Quais mudanças foram feitas em worker-service.ts?"
|
||||
"Mostre-me trabalhos recentes neste projeto"
|
||||
"O que estava acontecendo quando adicionamos a interface de visualização?"
|
||||
```
|
||||
|
||||
Veja [Guia de Ferramentas de Procura](https://docs.claude-mem.ai/usage/search-tools) para exemplos detalhados.
|
||||
|
||||
---
|
||||
|
||||
## Recursos Beta
|
||||
|
||||
Claude-Mem oferece um **canal beta** com recursos experimentais como **Endless Mode** (arquitetura de memória biomimética para sessões estendidas). Alterne entre versões estável e beta pela interface de visualização web em http://localhost:37777 → Settings.
|
||||
|
||||
Veja **[Documentação de Recursos Beta](https://docs.claude-mem.ai/beta-features)** para detalhes sobre o Endless Mode e como experimentá-lo.
|
||||
|
||||
---
|
||||
|
||||
## Requisitos do Sistema
|
||||
|
||||
- **Node.js**: 18.0.0 ou superior
|
||||
- **Claude Code**: Versão mais recente com suporte a plugins
|
||||
- **Bun**: Runtime JavaScript e gerenciador de processos (instalado automaticamente se ausente)
|
||||
- **uv**: Gerenciador de pacotes Python para Procura vetorial (instalado automaticamente se ausente)
|
||||
- **SQLite 3**: Para armazenamento persistente (incluído)
|
||||
|
||||
---
|
||||
|
||||
## Configuração
|
||||
|
||||
As configurações são gerenciadas em `~/.claude-mem/settings.json` (criado automaticamente com valores padrão na primeira execução). Configure modelo de IA, porta do worker, diretório de dados, nível de log e configurações de injeção de contexto.
|
||||
|
||||
Veja o **[Guia de Configuração](https://docs.claude-mem.ai/configuration)** para todas as configurações disponíveis e exemplos.
|
||||
|
||||
---
|
||||
|
||||
## Desenvolvimento
|
||||
|
||||
Veja o **[Guia de Desenvolvimento](https://docs.claude-mem.ai/development)** para instruções de build, testes e fluxo de contribuição.
|
||||
|
||||
---
|
||||
|
||||
## Solução de Problemas
|
||||
|
||||
Se você estiver enfrentando problemas, descreva o problema para Claude e a skill troubleshoot diagnosticará automaticamente e fornecerá correções.
|
||||
|
||||
Veja o **[Guia de Solução de Problemas](https://docs.claude-mem.ai/troubleshooting)** para problemas comuns e soluções.
|
||||
|
||||
---
|
||||
|
||||
## Relatos de Bug
|
||||
|
||||
Crie relatos de bug abrangentes com o gerador automatizado:
|
||||
|
||||
```bash
|
||||
cd ~/.claude/plugins/marketplaces/thedotmack
|
||||
npm run bug-report
|
||||
```
|
||||
|
||||
## Contribuindo
|
||||
|
||||
Contribuições são bem-vindas! Por favor:
|
||||
|
||||
1. Faça um fork do repositório
|
||||
2. Crie uma branch de feature
|
||||
3. Faça suas alterações com testes
|
||||
4. Atualize a documentação
|
||||
5. Envie um Pull Request
|
||||
|
||||
Veja [Guia de Desenvolvimento](https://docs.claude-mem.ai/development) para o fluxo de contribuição.
|
||||
|
||||
---
|
||||
|
||||
## Licença
|
||||
|
||||
Este projeto está licenciado sob a **GNU Affero General Public License v3.0** (AGPL-3.0).
|
||||
|
||||
Copyright (C) 2025 Alex Newman (@thedotmack). Todos os direitos reservados.
|
||||
|
||||
Veja o arquivo [LICENSE](LICENSE) para detalhes completos.
|
||||
|
||||
**O Que Isso Significa:**
|
||||
|
||||
- Você pode usar, modificar e distribuir este software livremente
|
||||
- Se você modificar e implantar em um servidor de rede, você deve disponibilizar seu código-fonte
|
||||
- Trabalhos derivados também devem ser licenciados sob AGPL-3.0
|
||||
- NÃO HÁ GARANTIA para este software
|
||||
|
||||
**Nota sobre Ragtime**: O diretório `ragtime/` é licenciado separadamente sob a **PolyForm Noncommercial License 1.0.0**. Veja [ragtime/LICENSE](ragtime/LICENSE) para detalhes.
|
||||
|
||||
---
|
||||
|
||||
## Suporte
|
||||
|
||||
- **Documentação**: [docs/](docs/)
|
||||
- **Issues**: [GitHub Issues](https://github.com/thedotmack/claude-mem/issues)
|
||||
- **Repositório**: [github.com/thedotmack/claude-mem](https://github.com/thedotmack/claude-mem)
|
||||
- **Autor**: Alex Newman ([@thedotmack](https://github.com/thedotmack))
|
||||
|
||||
---
|
||||
|
||||
**Construído com Claude Agent SDK** | **Desenvolvido por Claude Code** | **Feito com TypeScript** | **Editado por mig4ng**
|
||||
+1
-81
@@ -85,84 +85,4 @@ npx mintlify dev
|
||||
|
||||
**Simple Rule**:
|
||||
- `/docs/public/` = Official user documentation (Mintlify .mdx files) ← YOU ARE HERE
|
||||
- `/docs/context/` = Internal docs, plans, references, audits
|
||||
|
||||
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Nov 18, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #11206 | 3:01 PM | 🔵 | mem-search skill architecture and migration details retrieved in full format | ~538 |
|
||||
|
||||
### Nov 21, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #13221 | 2:01 AM | 🔴 | Fixed broken markdown link to Viewer UI documentation | ~316 |
|
||||
| #13220 | 2:00 AM | 🔴 | Escaped HTML less-than symbol in universal architecture timeout documentation | ~316 |
|
||||
| #13216 | 1:54 AM | ✅ | Universal Architecture Added to Navigation | ~330 |
|
||||
| #13215 | " | 🟣 | Universal AI Memory Architecture Documentation Created | ~732 |
|
||||
| #13213 | 1:50 AM | 🔵 | Introduction Page Content and Recent v6.0.0 Release | ~495 |
|
||||
| #13212 | " | 🔵 | Architecture Evolution Documentation Structure | ~408 |
|
||||
| #13211 | " | 🔵 | Mintlify Documentation Site Configuration | ~430 |
|
||||
| #13209 | 1:48 AM | 🔵 | Public Documentation Structure and Guidelines | ~383 |
|
||||
|
||||
### Nov 25, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #14994 | 2:22 PM | ✅ | Version Channel Section Added to Configuration Documentation | ~301 |
|
||||
| #14993 | " | ✅ | Beta Features Added to Documentation Navigation | ~188 |
|
||||
| #14992 | 2:21 PM | 🟣 | Beta Features Documentation Page Created | ~488 |
|
||||
| #14991 | " | 🔵 | Mintlify Navigation Structure and Documentation Groups | ~394 |
|
||||
| #14989 | " | 🔵 | Installation Documentation with Quick Start and Verification Steps | ~383 |
|
||||
| #14988 | " | 🔵 | Configuration Documentation Structure and Environment Variables | ~338 |
|
||||
|
||||
### Nov 26, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #16190 | 10:22 PM | 🔵 | RAGTIME Search Retrieved Five Observations About Claude-Mem vs RAG Architecture | ~637 |
|
||||
|
||||
### Dec 3, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #19884 | 9:42 PM | 🔵 | Configuration system and environment variables | ~701 |
|
||||
| #19878 | 9:40 PM | 🔵 | Installation process and system architecture | ~486 |
|
||||
|
||||
### Dec 8, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #22335 | 10:26 PM | 🔵 | Mintlify documentation configuration analyzed | ~534 |
|
||||
| #22311 | 9:47 PM | 🔵 | Comprehensive Hooks Architecture Documentation Review | ~263 |
|
||||
| #22297 | 9:43 PM | 🔵 | Mintlify Documentation Framework Configuration | ~446 |
|
||||
| #22294 | " | 🔵 | Documentation Site Structure Located | ~359 |
|
||||
|
||||
### Dec 9, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #23179 | 10:44 PM | ✅ | Removed explanatory reasons from tool exclusion documentation | ~297 |
|
||||
|
||||
### Dec 15, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #27038 | 6:02 PM | 🔵 | 95% token reduction claims found only in private experimental documents, not in main public docs | ~513 |
|
||||
| #27037 | " | 🔵 | Branch switching functionality exists in SettingsRoutes with UI switcher removal intent | ~463 |
|
||||
| #26986 | 5:24 PM | ✅ | Updated Endless Mode latency warning in beta features documentation | ~299 |
|
||||
|
||||
### Dec 29, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #33938 | 6:27 PM | 🔵 | Relevant CLAUDE.md Context Identified for PR #492 | ~435 |
|
||||
| #33750 | 12:25 AM | ✅ | Documentation Update: Removed Version Number from Architecture Evolution | ~281 |
|
||||
</claude-mem-context>
|
||||
- `/docs/context/` = Internal docs, plans, references, audits
|
||||
@@ -1,30 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Nov 18, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #11206 | 3:01 PM | 🔵 | mem-search skill architecture and migration details retrieved in full format | ~538 |
|
||||
|
||||
### Nov 21, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #13218 | 1:58 AM | 🔴 | Escaped HTML special character in MDX documentation | ~261 |
|
||||
|
||||
### Dec 3, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #19891 | 9:43 PM | 🔵 | Seven hook scripts across five lifecycle events | ~713 |
|
||||
|
||||
### Dec 15, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #27040 | 6:03 PM | 🔵 | Comprehensive search confirms no 95% claims exist in main branch public documentation | ~508 |
|
||||
| #27037 | 6:02 PM | 🔵 | Branch switching functionality exists in SettingsRoutes with UI switcher removal intent | ~463 |
|
||||
</claude-mem-context>
|
||||
@@ -177,7 +177,7 @@ graph TB
|
||||
|
||||
| Stage | Hook | Trigger | Purpose |
|
||||
|-------|------|---------|---------|
|
||||
| **1. SessionStart** | `context-hook.js` + `user-message-hook.js` | User opens Claude Code | Inject prior context, show UI messages |
|
||||
| **1. SessionStart** | `context-hook.js` | User opens Claude Code | Inject prior context silently |
|
||||
| **2. UserPromptSubmit** | `new-hook.js` | User submits a prompt | Create/get session, save prompt, init worker |
|
||||
| **3. PostToolUse** | `save-hook.js` | Claude uses any tool | Queue observation for AI compression |
|
||||
| **4. Stop** | `summary-hook.js` | User stops asking questions | Generate session summary |
|
||||
@@ -194,12 +194,16 @@ Hooks are configured in `plugin/hooks/hooks.json`:
|
||||
"matcher": "startup|clear|compact",
|
||||
"hooks": [{
|
||||
"type": "command",
|
||||
"command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/context-hook.js",
|
||||
"command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/smart-install.js",
|
||||
"timeout": 300
|
||||
}, {
|
||||
"type": "command",
|
||||
"command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/user-message-hook.js",
|
||||
"timeout": 10
|
||||
"command": "bun ${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs start",
|
||||
"timeout": 60
|
||||
}, {
|
||||
"type": "command",
|
||||
"command": "bun ${CLAUDE_PLUGIN_ROOT}/scripts/context-hook.js",
|
||||
"timeout": 60
|
||||
}]
|
||||
}],
|
||||
"UserPromptSubmit": [{
|
||||
@@ -242,8 +246,13 @@ Hooks are configured in `plugin/hooks/hooks.json`:
|
||||
**Timing**: When user opens Claude Code or resumes session
|
||||
|
||||
**Hooks Triggered** (in order):
|
||||
1. `context-hook.js` - Fetches and injects prior session context
|
||||
2. `user-message-hook.js` - Displays context info to user via stderr
|
||||
1. `smart-install.js` - Ensures dependencies are installed
|
||||
2. `worker-service.cjs start` - Starts the worker service
|
||||
3. `context-hook.js` - Fetches and silently injects prior session context
|
||||
|
||||
<Note>
|
||||
As of Claude Code 2.1.0 (ultrathink update), SessionStart hooks no longer display user-visible messages. Context is silently injected via `hookSpecificOutput.additionalContext`.
|
||||
</Note>
|
||||
|
||||
### Sequence Diagram
|
||||
|
||||
@@ -306,19 +315,6 @@ sequenceDiagram
|
||||
|
||||
**Implementation**: `src/hooks/context-hook.ts`
|
||||
|
||||
### User Message Hook (`user-message-hook.js`)
|
||||
|
||||
**Purpose**: Display helpful user messages during first-time setup or when viewing context.
|
||||
|
||||
**Behavior**:
|
||||
- Shows first-time setup message when `node_modules` is missing
|
||||
- Displays formatted context information with colors
|
||||
- Provides tips for using claude-mem effectively
|
||||
- Shows link to viewer UI (`http://localhost:37777`)
|
||||
- Uses stderr as communication channel (only output available in Claude Code UI)
|
||||
|
||||
**Implementation**: `src/hooks/user-message-hook.ts`
|
||||
|
||||
---
|
||||
|
||||
## Stage 2: UserPromptSubmit
|
||||
|
||||
@@ -26,7 +26,7 @@ Settings are managed in `~/.claude-mem/settings.json`. The file is auto-created
|
||||
| Setting | Default | Description |
|
||||
|-------------------------------|---------------------------------|---------------------------------------|
|
||||
| `CLAUDE_MEM_GEMINI_API_KEY` | — | Gemini API key ([get free key](https://aistudio.google.com/app/apikey)) |
|
||||
| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite` | Gemini model: `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash` |
|
||||
| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite` | Gemini model: `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash-preview` |
|
||||
|
||||
See [Gemini Provider](usage/gemini-provider) for detailed configuration and free tier information.
|
||||
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Dec 29, 2025
|
||||
|
||||
**gemini-setup.mdx**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34346 | 11:11 PM | 🟣 | Gemini Free Tier Integration Guide | ~413 |
|
||||
| #34337 | 11:10 PM | 🔵 | Cursor Documentation Available | ~161 |
|
||||
| #34331 | 11:05 PM | 🔴 | Fixed Broken Links in cursor/gemini-setup.mdx | ~253 |
|
||||
| #34326 | 11:04 PM | 🔵 | Broken Links in Cursor Gemini Setup Documentation | ~324 |
|
||||
| #34320 | 11:03 PM | 🔵 | Mintlify Broken Links Detected in Documentation | ~292 |
|
||||
| #34215 | 10:08 PM | 🔵 | Retrieved Detailed Cursor Integration Implementation History | ~676 |
|
||||
| #34214 | 10:07 PM | 🔵 | Cursor Integration Feature Set Discovered via Memory Search | ~427 |
|
||||
| #34148 | 9:28 PM | 🟣 | Cursor IDE Integration with Cross-Platform Hooks and Documentation | ~514 |
|
||||
| #34112 | 9:07 PM | 🟣 | Committed Cursor Public Documentation to Repository | ~427 |
|
||||
| #34106 | 9:05 PM | 🟣 | Created Cursor-Specific Gemini Setup Guide | ~563 |
|
||||
|
||||
**index.mdx**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34339 | 11:10 PM | 🟣 | Cursor IDE Integration with Persistent Memory | ~394 |
|
||||
| #34335 | 11:06 PM | 🟣 | Mintlify Documentation Linting Successfully Completed | ~409 |
|
||||
| #34330 | 11:05 PM | 🔴 | Fixed Remaining Broken Links in cursor/index.mdx Next Steps Section | ~284 |
|
||||
| #34329 | " | 🔴 | Fixed Broken Links in cursor/index.mdx Detailed Guides Section | ~269 |
|
||||
| #34325 | 11:04 PM | 🔵 | Multiple Broken Links in Cursor Index Documentation | ~329 |
|
||||
| #34216 | 10:08 PM | 🔵 | Additional Cursor Integration Details Retrieved for Post Writing | ~600 |
|
||||
| #34105 | 9:05 PM | 🟣 | Created Cursor Integration Landing Page | ~522 |
|
||||
|
||||
**openrouter-setup.mdx**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34332 | 11:05 PM | 🔴 | Fixed Broken Links in cursor/openrouter-setup.mdx | ~283 |
|
||||
| #34324 | 11:04 PM | 🔵 | Broken Link Syntax Identified in Cursor Documentation | ~329 |
|
||||
| #34107 | 9:06 PM | 🟣 | Created Cursor-Specific OpenRouter Setup Guide | ~573 |
|
||||
|
||||
**cursor**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #34322 | 11:03 PM | 🔵 | Cursor Directory Files Confirmed to Exist | ~224 |
|
||||
|
||||
### Jan 4, 2026
|
||||
|
||||
**gemini-setup.mdx**
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #36751 | 12:32 AM | 🔵 | Gemini-Related Files Located Across Project | ~242 |
|
||||
</claude-mem-context>
|
||||
@@ -103,7 +103,7 @@ Open http://localhost:37777 to see the memory viewer.
|
||||
|-------|---------------|-------|
|
||||
| `gemini-2.5-flash-lite` | 10 (4,000 with billing) | **Default.** Fastest, highest free tier RPM |
|
||||
| `gemini-2.5-flash` | 5 (1,000 with billing) | Higher capability |
|
||||
| `gemini-3-flash` | 5 (1,000 with billing) | Latest model |
|
||||
| `gemini-3-flash-preview` | 5 (1,000 with billing) | Latest model |
|
||||
|
||||
To change the model, update your settings:
|
||||
|
||||
|
||||
@@ -73,7 +73,8 @@
|
||||
"modes",
|
||||
"development",
|
||||
"troubleshooting",
|
||||
"platform-integration"
|
||||
"platform-integration",
|
||||
"openclaw-integration"
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
@@ -22,11 +22,15 @@ Claude-Mem is fundamentally a **hook-driven system**. Every piece of functionali
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ CLAUDE-MEM SYSTEM │
|
||||
│ │
|
||||
│ Smart Context User New Obs │
|
||||
│ Install Inject Message Session Capture │
|
||||
│ Smart Worker Context New Obs │
|
||||
│ Install Start Inject Session Capture │
|
||||
└─────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
<Note>
|
||||
As of Claude Code 2.1.0 (ultrathink update), SessionStart hooks no longer display user-visible messages. Context is silently injected via `hookSpecificOutput.additionalContext`.
|
||||
</Note>
|
||||
|
||||
**Key insight:** Claude-Mem doesn't interrupt or modify Claude Code's behavior. It observes from the outside and provides value through lifecycle hooks.
|
||||
|
||||
---
|
||||
@@ -68,9 +72,9 @@ Claude Code's hook system provides exactly what we need:
|
||||
|
||||
---
|
||||
|
||||
## The Six Hook Scripts + Pre-Hook
|
||||
## The Hook Scripts
|
||||
|
||||
Claude-Mem uses 6 lifecycle hook scripts across 5 lifecycle events, plus 1 pre-hook script for dependency management. SessionStart runs 2 hooks in sequence (after the pre-hook script).
|
||||
Claude-Mem uses lifecycle hook scripts across 5 lifecycle events. SessionStart runs 3 hooks in sequence: smart-install, worker-service start, and context-hook.
|
||||
|
||||
### Pre-Hook: Smart Install (Before SessionStart)
|
||||
|
||||
@@ -155,56 +159,7 @@ Claude-Mem uses 6 lifecycle hook scripts across 5 lifecycle events, plus 1 pre-h
|
||||
|
||||
---
|
||||
|
||||
### Hook 2: SessionStart - User Message
|
||||
|
||||
**Purpose:** Display helpful user messages during first-time setup
|
||||
|
||||
**When:** Claude Code starts (runs after context-hook)
|
||||
|
||||
**What it does:**
|
||||
1. Checks if dependencies are installed
|
||||
2. Shows first-time setup message if needed
|
||||
3. Displays formatted context information with colors
|
||||
4. Shows link to viewer UI (http://localhost:37777)
|
||||
5. Exits with code 3 (informational, not error)
|
||||
|
||||
**Configuration:**
|
||||
```json
|
||||
{
|
||||
"hooks": {
|
||||
"SessionStart": [{
|
||||
"matcher": "startup|clear|compact",
|
||||
"hooks": [{
|
||||
"type": "command",
|
||||
"command": "node ${CLAUDE_PLUGIN_ROOT}/scripts/user-message-hook.js",
|
||||
"timeout": 10
|
||||
}]
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Output Example:**
|
||||
```
|
||||
📝 Claude-Mem Context Loaded
|
||||
ℹ️ Note: This appears as stderr but is informational only
|
||||
|
||||
[Context details with colors...]
|
||||
|
||||
📺 Watch live in browser http://localhost:37777/ (New! v5.1)
|
||||
```
|
||||
|
||||
**Key Features:**
|
||||
- ✅ User-friendly first-time experience
|
||||
- ✅ Visual context display
|
||||
- ✅ Links to viewer UI
|
||||
- ✅ Non-intrusive (exit code 3)
|
||||
|
||||
**Source:** `plugin/scripts/user-message-hook.js` (minified)
|
||||
|
||||
---
|
||||
|
||||
### Hook 3: UserPromptSubmit (New Session Hook)
|
||||
### Hook 2: UserPromptSubmit (New Session Hook)
|
||||
|
||||
**Purpose:** Initialize session tracking when user submits a prompt
|
||||
|
||||
@@ -251,7 +206,7 @@ VALUES (?, ?, ?, ...)
|
||||
|
||||
---
|
||||
|
||||
### Hook 4: PostToolUse (Save Observation Hook)
|
||||
### Hook 3: PostToolUse (Save Observation Hook)
|
||||
|
||||
**Purpose:** Capture tool execution observations for later processing
|
||||
|
||||
@@ -312,7 +267,7 @@ VALUES (?, ?, ?, ?, ...)
|
||||
|
||||
---
|
||||
|
||||
### Hook 5: Stop Hook (Summary Generation)
|
||||
### Hook 4: Stop Hook (Summary Generation)
|
||||
|
||||
**Purpose:** Generate AI-powered session summaries during the session
|
||||
|
||||
@@ -367,7 +322,7 @@ VALUES (?, ?, ?, ?, ...)
|
||||
|
||||
---
|
||||
|
||||
### Hook 6: SessionEnd (Cleanup Hook)
|
||||
### Hook 5: SessionEnd (Cleanup Hook)
|
||||
|
||||
**Purpose:** Mark sessions as completed when they end
|
||||
|
||||
@@ -474,14 +429,18 @@ sequenceDiagram
|
||||
|
||||
| Event | Timing | Blocking | Timeout | Output Handling |
|
||||
|-------|--------|----------|---------|-----------------|
|
||||
| **SessionStart (smart-install)** | Before session | No | 300s | stderr (info) |
|
||||
| **SessionStart (context)** | Before session | No | 300s | stdout → context |
|
||||
| **SessionStart (user-message)** | Before session | No | 10s | stderr (info) |
|
||||
| **UserPromptSubmit** | Before processing | No | 120s | stdout → context |
|
||||
| **SessionStart (smart-install)** | Before session | No | 300s | stderr (log only) |
|
||||
| **SessionStart (worker-start)** | Before session | No | 60s | stderr (log only) |
|
||||
| **SessionStart (context)** | Before session | No | 60s | JSON → additionalContext (silent) |
|
||||
| **UserPromptSubmit** | Before processing | No | 60s | stdout → context |
|
||||
| **PostToolUse** | After tool | No | 120s | Transcript only |
|
||||
| **Summary** | Worker triggered | No | 120s | Database |
|
||||
| **SessionEnd** | On exit | No | 120s | Log only |
|
||||
|
||||
<Note>
|
||||
As of Claude Code 2.1.0 (ultrathink update), SessionStart hooks no longer display user-visible messages. Context is silently injected via `hookSpecificOutput.additionalContext`.
|
||||
</Note>
|
||||
|
||||
---
|
||||
|
||||
## The Worker Service Architecture
|
||||
|
||||
@@ -22,6 +22,10 @@ That's it! The plugin will automatically:
|
||||
|
||||
Start a new Claude Code session and you'll see context from previous sessions automatically loaded.
|
||||
|
||||
> **Important:** Claude-Mem is published on npm, but running `npm install -g claude-mem` installs the
|
||||
> **SDK/library only**. It does **not** register plugin hooks or start the worker service.
|
||||
> To use Claude-Mem as a persistent memory plugin, always install via the `/plugin` commands above.
|
||||
|
||||
## System Requirements
|
||||
|
||||
- **Node.js**: 18.0.0 or higher
|
||||
|
||||
@@ -65,6 +65,7 @@ Inherits all behavior from Code Mode but instructs Claude to generate **all** me
|
||||
| **Hindi** | `code--hi` | हिन्दी |
|
||||
| **Hungarian** | `code--hu` | Magyar |
|
||||
| **Indonesian** | `code--id` | Bahasa Indonesia |
|
||||
| **Urdu** | `code--ur` | اردو |
|
||||
| **Italian** | `code--it` | Italiano |
|
||||
| **Japanese** | `code--ja` | 日本語 |
|
||||
| **Korean** | `code--ko` | 한국어 |
|
||||
|
||||
@@ -0,0 +1,385 @@
|
||||
---
|
||||
title: OpenClaw Integration
|
||||
description: Persistent memory for OpenClaw agents — observation recording, MEMORY.md live sync, and real-time observation feeds
|
||||
icon: dragon
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
The OpenClaw plugin gives claude-mem persistent memory to agents running on the [OpenClaw](https://openclaw.ai) gateway. It handles three things:
|
||||
|
||||
1. **Observation recording** — Captures tool usage from OpenClaw's embedded runner and sends it to the claude-mem worker for AI processing
|
||||
2. **MEMORY.md live sync** — Writes a continuously-updated timeline to each agent's workspace so agents always have context from previous sessions
|
||||
3. **Observation feed** — Streams new observations to messaging channels (Telegram, Discord, Slack, etc.) in real-time via SSE
|
||||
|
||||
<Info>
|
||||
OpenClaw's embedded runner (`pi-embedded`) calls the Anthropic API directly without spawning a `claude` process, so claude-mem's standard hooks never fire. This plugin bridges that gap by using OpenClaw's event system to capture the same data.
|
||||
</Info>
|
||||
|
||||
## How It Works
|
||||
|
||||
```plaintext
|
||||
OpenClaw Gateway
|
||||
│
|
||||
├── before_agent_start ──→ Sync MEMORY.md + Init session
|
||||
├── tool_result_persist ──→ Record observation + Re-sync MEMORY.md
|
||||
├── agent_end ────────────→ Summarize + Complete session
|
||||
└── gateway_start ────────→ Reset session tracking
|
||||
│
|
||||
▼
|
||||
Claude-Mem Worker (localhost:37777)
|
||||
├── POST /api/sessions/init
|
||||
├── POST /api/sessions/observations
|
||||
├── POST /api/sessions/summarize
|
||||
├── POST /api/sessions/complete
|
||||
├── GET /api/context/inject ──→ MEMORY.md content
|
||||
└── GET /stream ─────────────→ SSE → Messaging channels
|
||||
```
|
||||
|
||||
### Event Lifecycle
|
||||
|
||||
<Steps>
|
||||
<Step title="Agent starts (before_agent_start)">
|
||||
When an OpenClaw agent starts, the plugin does two things:
|
||||
|
||||
1. **Syncs MEMORY.md** — Fetches the latest timeline from the worker's `/api/context/inject` endpoint and writes it to `MEMORY.md` in the agent's workspace directory. This gives the agent context from all previous sessions before it starts working.
|
||||
|
||||
2. **Initializes a session** — Sends the user prompt to `POST /api/sessions/init` so the worker can create a new session and start processing.
|
||||
|
||||
Short prompts (under 10 characters) skip session init but still sync MEMORY.md.
|
||||
</Step>
|
||||
<Step title="Tool use recorded (tool_result_persist)">
|
||||
Every time the agent uses a tool (Read, Write, Bash, etc.), the plugin:
|
||||
|
||||
1. **Sends the observation** to `POST /api/sessions/observations` with the tool name, input, and truncated response (max 1000 chars)
|
||||
2. **Re-syncs MEMORY.md** with the latest timeline from the worker
|
||||
|
||||
Both operations are fire-and-forget — they don't block the agent from continuing work. The MEMORY.md file gets progressively richer as the session continues.
|
||||
|
||||
Tools prefixed with `memory_` are skipped to avoid recursive recording.
|
||||
</Step>
|
||||
<Step title="Agent finishes (agent_end)">
|
||||
When the agent completes, the plugin extracts the last assistant message and sends it to `POST /api/sessions/summarize`, then calls `POST /api/sessions/complete` to close the session. Both are fire-and-forget.
|
||||
</Step>
|
||||
<Step title="Gateway restarts (gateway_start)">
|
||||
Clears all session tracking (session IDs, workspace directory mappings) so agents get fresh state after a gateway restart.
|
||||
</Step>
|
||||
</Steps>
|
||||
|
||||
### MEMORY.md Live Sync
|
||||
|
||||
The plugin writes a `MEMORY.md` file to each agent's workspace directory containing the full timeline of observations and summaries from previous sessions. This file is updated:
|
||||
|
||||
- On every `before_agent_start` event (agent gets fresh context before starting)
|
||||
- On every `tool_result_persist` event (context stays current during the session)
|
||||
|
||||
The content comes from the worker's `GET /api/context/inject?projects=<project>` endpoint, which generates a formatted markdown timeline from the SQLite database.
|
||||
|
||||
<Info>
|
||||
MEMORY.md updates are fire-and-forget. They run in the background without blocking the agent. The file reflects whatever the worker has processed so far — it doesn't wait for the current observation to be fully processed before writing.
|
||||
</Info>
|
||||
|
||||
### Observation Feed (SSE → Messaging)
|
||||
|
||||
The plugin runs a background service that connects to the worker's SSE stream (`GET /stream`) and forwards `new_observation` events to a configured messaging channel. This lets you monitor what your agents are learning in real-time from Telegram, Discord, Slack, or any supported OpenClaw channel.
|
||||
|
||||
The SSE connection uses exponential backoff (1s → 30s) for automatic reconnection.
|
||||
|
||||
## Setting Up the Observation Feed
|
||||
|
||||
The observation feed sends a formatted message to your OpenClaw channel every time claude-mem creates a new observation. Each message includes the observation title and subtitle so you can follow along as your agents work.
|
||||
|
||||
Messages look like this in your channel:
|
||||
|
||||
```
|
||||
🧠 Claude-Mem Observation
|
||||
**Implemented retry logic for API client**
|
||||
Added exponential backoff with configurable max retries to handle transient failures
|
||||
```
|
||||
|
||||
### Step 1: Choose your channel
|
||||
|
||||
The observation feed works with any channel that your OpenClaw gateway has configured. You need two pieces of information:
|
||||
|
||||
- **Channel type** — The name of the channel plugin registered with OpenClaw (e.g., `telegram`, `discord`, `slack`, `signal`, `whatsapp`, `line`)
|
||||
- **Target ID** — The chat ID, channel ID, or user ID where messages should be sent
|
||||
|
||||
<AccordionGroup>
|
||||
<Accordion title="Telegram" icon="telegram">
|
||||
**Channel type:** `telegram`
|
||||
|
||||
**Target ID:** Your Telegram chat ID (numeric). To find it:
|
||||
1. Message [@userinfobot](https://t.me/userinfobot) on Telegram
|
||||
2. It will reply with your chat ID (e.g., `123456789`)
|
||||
3. For group chats, the ID is negative (e.g., `-1001234567890`)
|
||||
|
||||
```json
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "telegram",
|
||||
"to": "123456789"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Discord" icon="discord">
|
||||
**Channel type:** `discord`
|
||||
|
||||
**Target ID:** The Discord channel ID. To find it:
|
||||
1. Enable Developer Mode in Discord (Settings → Advanced → Developer Mode)
|
||||
2. Right-click the channel → Copy Channel ID
|
||||
|
||||
```json
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "discord",
|
||||
"to": "1234567890123456789"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Slack" icon="slack">
|
||||
**Channel type:** `slack`
|
||||
|
||||
**Target ID:** The Slack channel ID (not the channel name). To find it:
|
||||
1. Open the channel in Slack
|
||||
2. Click the channel name at the top
|
||||
3. Scroll to the bottom of the channel details — the ID looks like `C01ABC2DEFG`
|
||||
|
||||
```json
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "slack",
|
||||
"to": "C01ABC2DEFG"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Signal" icon="signal-messenger">
|
||||
**Channel type:** `signal`
|
||||
|
||||
**Target ID:** The Signal phone number or group ID configured in your OpenClaw gateway.
|
||||
|
||||
```json
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "signal",
|
||||
"to": "+1234567890"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="WhatsApp" icon="whatsapp">
|
||||
**Channel type:** `whatsapp`
|
||||
|
||||
**Target ID:** The WhatsApp phone number or group JID configured in your OpenClaw gateway.
|
||||
|
||||
```json
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "whatsapp",
|
||||
"to": "+1234567890"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="LINE" icon="line">
|
||||
**Channel type:** `line`
|
||||
|
||||
**Target ID:** The LINE user ID or group ID from the LINE Developer Console.
|
||||
|
||||
```json
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "line",
|
||||
"to": "U1234567890abcdef"
|
||||
}
|
||||
```
|
||||
</Accordion>
|
||||
</AccordionGroup>
|
||||
|
||||
### Step 2: Add the config to your gateway
|
||||
|
||||
Add the `observationFeed` block to your claude-mem plugin config in your OpenClaw gateway configuration:
|
||||
|
||||
```json
|
||||
{
|
||||
"plugins": {
|
||||
"claude-mem": {
|
||||
"enabled": true,
|
||||
"config": {
|
||||
"project": "my-project",
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "telegram",
|
||||
"to": "123456789"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<Warning>
|
||||
The `channel` value must match a channel plugin that is already configured and running on your OpenClaw gateway. If the channel isn't registered, you'll see `Unknown channel type: <channel>` in the logs.
|
||||
</Warning>
|
||||
|
||||
### Step 3: Verify the connection
|
||||
|
||||
After starting the gateway, check that the feed is connected:
|
||||
|
||||
1. **Check the logs** — You should see:
|
||||
```
|
||||
[claude-mem] Observation feed starting — channel: telegram, target: 123456789
|
||||
[claude-mem] Connecting to SSE stream at http://localhost:37777/stream
|
||||
[claude-mem] Connected to SSE stream
|
||||
```
|
||||
|
||||
2. **Use the status command** — Run `/claude_mem_feed` in any OpenClaw chat to see:
|
||||
```
|
||||
Claude-Mem Observation Feed
|
||||
Enabled: yes
|
||||
Channel: telegram
|
||||
Target: 123456789
|
||||
Connection: connected
|
||||
```
|
||||
|
||||
3. **Trigger a test** — Have an agent do some work. When the worker processes the tool usage into an observation, you'll receive a message in your configured channel.
|
||||
|
||||
<Info>
|
||||
The feed only sends `new_observation` events — not raw tool usage. Observations are generated asynchronously by the worker's AI agent, so there's a 1-2 second delay between tool use and the observation message appearing in your channel.
|
||||
</Info>
|
||||
|
||||
### Troubleshooting the Feed
|
||||
|
||||
| Symptom | Cause | Fix |
|
||||
|---------|-------|-----|
|
||||
| `Connection: disconnected` | Worker not running or wrong port | Check `workerPort` config, run `npm run worker:status` |
|
||||
| `Connection: reconnecting` | Worker was running but connection dropped | The plugin auto-reconnects with backoff — wait up to 30s |
|
||||
| `Unknown channel type` in logs | Channel plugin not loaded on gateway | Verify your OpenClaw gateway has the channel plugin configured |
|
||||
| No messages appearing | Feed connected but no observations being created | Check that agents are running and the worker is processing observations |
|
||||
| `Observation feed disabled` in logs | `enabled` is `false` or missing | Set `observationFeed.enabled` to `true` |
|
||||
| `Observation feed misconfigured` in logs | Missing `channel` or `to` | Both `channel` and `to` are required |
|
||||
|
||||
## Installation
|
||||
|
||||
Run this one-liner to install everything automatically:
|
||||
|
||||
```bash
|
||||
curl -fsSL https://install.cmem.ai/openclaw.sh | bash
|
||||
```
|
||||
|
||||
The installer handles dependency checks (Bun, uv), plugin installation, memory slot configuration, AI provider setup, worker startup, and optional observation feed configuration.
|
||||
|
||||
You can also pre-select options:
|
||||
|
||||
```bash
|
||||
# With a specific AI provider
|
||||
curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --provider=gemini --api-key=YOUR_KEY
|
||||
|
||||
# Fully unattended (defaults to Claude Max Plan)
|
||||
curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --non-interactive
|
||||
|
||||
# Upgrade existing installation
|
||||
curl -fsSL https://install.cmem.ai/openclaw.sh | bash -s -- --upgrade
|
||||
```
|
||||
|
||||
### Manual Configuration
|
||||
|
||||
Add `claude-mem` to your OpenClaw gateway's plugin configuration:
|
||||
|
||||
```json
|
||||
{
|
||||
"plugins": {
|
||||
"claude-mem": {
|
||||
"enabled": true,
|
||||
"config": {
|
||||
"project": "my-project",
|
||||
"syncMemoryFile": true,
|
||||
"workerPort": 37777,
|
||||
"observationFeed": {
|
||||
"enabled": true,
|
||||
"channel": "telegram",
|
||||
"to": "your-chat-id"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<Note>
|
||||
The claude-mem worker service must be running on the same machine as the OpenClaw gateway. The plugin communicates with it via HTTP on `localhost:37777`.
|
||||
</Note>
|
||||
|
||||
## Configuration
|
||||
|
||||
<ParamField body="project" type="string" default="openclaw">
|
||||
Project name for scoping observations in the memory database. All observations from this gateway will be stored under this project name.
|
||||
</ParamField>
|
||||
|
||||
<ParamField body="syncMemoryFile" type="boolean" default={true}>
|
||||
Enable automatic MEMORY.md sync to agent workspaces. Set to `false` if you don't want the plugin writing files to workspace directories.
|
||||
</ParamField>
|
||||
|
||||
<ParamField body="workerPort" type="number" default={37777}>
|
||||
Port for the claude-mem worker service. Override if your worker runs on a non-default port.
|
||||
</ParamField>
|
||||
|
||||
<ParamField body="observationFeed.enabled" type="boolean" default={false}>
|
||||
Enable live observation streaming to messaging channels.
|
||||
</ParamField>
|
||||
|
||||
<ParamField body="observationFeed.channel" type="string">
|
||||
Channel type: `telegram`, `discord`, `signal`, `slack`, `whatsapp`, `line`
|
||||
</ParamField>
|
||||
|
||||
<ParamField body="observationFeed.to" type="string">
|
||||
Target chat/user/channel ID to send observations to.
|
||||
</ParamField>
|
||||
|
||||
## Commands
|
||||
|
||||
### /claude_mem_feed
|
||||
|
||||
Show or toggle the observation feed status.
|
||||
|
||||
```
|
||||
/claude_mem_feed # Show current status
|
||||
/claude_mem_feed on # Request enable
|
||||
/claude_mem_feed off # Request disable
|
||||
```
|
||||
|
||||
### /claude_mem_status
|
||||
|
||||
Check worker health and session status.
|
||||
|
||||
```
|
||||
/claude_mem_status
|
||||
```
|
||||
|
||||
Returns worker status, port, active session count, and observation feed connection state.
|
||||
|
||||
## Architecture
|
||||
|
||||
The plugin uses HTTP calls to the already-running claude-mem worker service rather than spawning subprocesses. This means:
|
||||
|
||||
- No `bun` dependency required on the gateway
|
||||
- No process spawn overhead per event
|
||||
- Uses the same worker API that Claude Code hooks use
|
||||
- All operations are non-blocking (fire-and-forget where possible)
|
||||
|
||||
### Session Tracking
|
||||
|
||||
Each OpenClaw agent session gets a unique `contentSessionId` (format: `openclaw-<sessionKey>-<timestamp>`) that maps to a claude-mem session in the worker. The plugin tracks:
|
||||
|
||||
- `sessionIds` — Maps OpenClaw session keys to content session IDs
|
||||
- `workspaceDirsBySessionKey` — Maps session keys to workspace directories so `tool_result_persist` events can sync MEMORY.md even when the event context doesn't include `workspaceDir`
|
||||
|
||||
Both maps are cleared on `gateway_start`.
|
||||
|
||||
## Requirements
|
||||
|
||||
- Claude-mem worker service running on `localhost:37777` (or configured port)
|
||||
- OpenClaw gateway with plugin support
|
||||
- Network access between gateway and worker (localhost only)
|
||||
@@ -1,47 +0,0 @@
|
||||
<claude-mem-context>
|
||||
# Recent Activity
|
||||
|
||||
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
|
||||
|
||||
### Nov 18, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #11206 | 3:01 PM | 🔵 | mem-search skill architecture and migration details retrieved in full format | ~538 |
|
||||
|
||||
### Dec 3, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #19892 | 9:43 PM | 🔵 | Automatic operation workflow and progressive disclosure strategy | ~780 |
|
||||
|
||||
### Dec 10, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #23677 | 8:37 PM | ✅ | Update Export Documentation to Reflect Hybrid Search and Project Filter | ~314 |
|
||||
| #23675 | " | 🔵 | Export/Import Memory Scripts Documentation | ~399 |
|
||||
| #23590 | 5:51 PM | 🔵 | Import/Export Feature Status Review | ~490 |
|
||||
| #23584 | 5:50 PM | 🔵 | Export/Import Documentation | ~405 |
|
||||
|
||||
### Dec 14, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #26335 | 9:02 PM | 🔵 | Citation URI Scheme Documentation | ~255 |
|
||||
|
||||
### Dec 25, 2025
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #32536 | 7:28 PM | ✅ | Updated Gemini provider warning about free tier rate limits | ~185 |
|
||||
| #32535 | " | ✅ | Updated Gemini provider tip to recommend enabling billing | ~179 |
|
||||
| #32534 | 7:27 PM | ✅ | Updated Gemini provider warning about rate limits | ~174 |
|
||||
| #32533 | " | ✅ | Updated Gemini provider documentation with rate limit information | ~216 |
|
||||
|
||||
### Jan 5, 2026
|
||||
|
||||
| ID | Time | T | Title | Read |
|
||||
|----|------|---|-------|------|
|
||||
| #37508 | 3:21 PM | 🔵 | Private Tags Documentation Defines User Privacy Control Mechanisms | ~748 |
|
||||
</claude-mem-context>
|
||||
@@ -39,7 +39,7 @@ Claude-mem supports Google's Gemini API as an alternative to the Claude Agent SD
|
||||
|---------|--------|---------|-------------|
|
||||
| `CLAUDE_MEM_PROVIDER` | `claude`, `gemini` | `claude` | AI provider for observation extraction |
|
||||
| `CLAUDE_MEM_GEMINI_API_KEY` | string | — | Your Gemini API key |
|
||||
| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash` | `gemini-2.5-flash-lite` | Gemini model to use |
|
||||
| `CLAUDE_MEM_GEMINI_MODEL` | `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-flash-preview` | `gemini-2.5-flash-lite` | Gemini model to use |
|
||||
| `CLAUDE_MEM_GEMINI_BILLING_ENABLED` | `true`, `false` | `false` | Skip rate limiting if billing is enabled on Google Cloud |
|
||||
|
||||
### Using the Settings UI
|
||||
@@ -79,7 +79,7 @@ The settings file takes precedence over the environment variable.
|
||||
|-------|--------------|-------|
|
||||
| `gemini-2.5-flash-lite` | 10 | Default, recommended for free tier (highest RPM) |
|
||||
| `gemini-2.5-flash` | 5 | Higher capability, lower rate limit |
|
||||
| `gemini-3-flash` | 5 | Latest model, lower rate limit |
|
||||
| `gemini-3-flash-preview` | 5 | Latest model, lower rate limit |
|
||||
|
||||
## Provider Switching
|
||||
|
||||
@@ -139,7 +139,7 @@ Google has two rate limit tiers for free usage:
|
||||
|-------|-----|-----|
|
||||
| gemini-2.5-flash-lite | 10 | 250K |
|
||||
| gemini-2.5-flash | 5 | 250K |
|
||||
| gemini-3-flash | 5 | 250K |
|
||||
| gemini-3-flash-preview | 5 | 250K |
|
||||
|
||||
Claude-mem enforces these limits automatically with built-in delays between requests. Processing may be slower but stays within limits.
|
||||
|
||||
@@ -149,7 +149,7 @@ Claude-mem enforces these limits automatically with built-in delays between requ
|
||||
|-------|-----|-----|
|
||||
| gemini-2.5-flash-lite | 4,000 | 4M |
|
||||
| gemini-2.5-flash | 1,000 | 1M |
|
||||
| gemini-3-flash | 1,000 | 1M |
|
||||
| gemini-3-flash-preview | 1,000 | 1M |
|
||||
|
||||
<Tip>
|
||||
**Recommended**: Enable billing on your Google Cloud project to unlock much higher rate limits. You won't be charged unless you exceed the generous free quota. This allows claude-mem to process observations instantly instead of waiting between requests.
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
# Context Hook Investigation Report
|
||||
|
||||
**Date:** 2026-01-05
|
||||
**Branch:** `feature/no-more-hook-files`
|
||||
**Status:** Partial fix committed, additional issues identified
|
||||
|
||||
## Problem
|
||||
|
||||
User reported no startup context appearing when testing the new unified CLI hook architecture.
|
||||
|
||||
## Root Cause Identified
|
||||
|
||||
**SessionStart hooks don't receive stdin data from Claude Code.**
|
||||
|
||||
The unified CLI architecture assumed all hooks receive stdin JSON data. When `readJsonFromStdin()` returns `undefined` for SessionStart, the platform adapters crashed:
|
||||
|
||||
```
|
||||
TypeError: undefined is not an object (evaluating 'e.session_id')
|
||||
```
|
||||
|
||||
**Location:** `src/cli/adapters/claude-code.ts:6` and `src/cli/adapters/cursor.ts:7`
|
||||
|
||||
The adapters did `const r = raw as any;` then accessed `r.session_id`, which fails when `raw` is `undefined`.
|
||||
|
||||
## Fix Applied
|
||||
|
||||
Changed both adapters to handle undefined input:
|
||||
|
||||
```typescript
|
||||
// Before
|
||||
const r = raw as any;
|
||||
|
||||
// After
|
||||
const r = (raw ?? {}) as any;
|
||||
```
|
||||
|
||||
**Commit:** `78c2a0ef` - Pushed to `feature/no-more-hook-files`
|
||||
|
||||
## Additional Issue Discovered (Not Yet Fixed)
|
||||
|
||||
There's a **path mismatch** in the hooks.json that may cause issues:
|
||||
|
||||
- hooks.json references: `${CLAUDE_PLUGIN_ROOT}/scripts/worker-service.cjs`
|
||||
- Actual file location: `${CLAUDE_PLUGIN_ROOT}/plugin/scripts/worker-service.cjs`
|
||||
|
||||
The marketplace sync copies the whole repo structure, so files end up in a `plugin/` subdirectory. Need to verify what `CLAUDE_PLUGIN_ROOT` resolves to and whether the paths are correct.
|
||||
|
||||
## Verification Needed
|
||||
|
||||
1. Start a new Claude Code session and verify context appears
|
||||
2. Check that `CLAUDE_PLUGIN_ROOT` points to correct directory
|
||||
3. Verify hooks.json paths match actual file locations
|
||||
|
||||
## Files Changed
|
||||
|
||||
- `src/cli/adapters/claude-code.ts` - Added null coalescing for stdin
|
||||
- `src/cli/adapters/cursor.ts` - Added null coalescing for stdin
|
||||
- `plugin/scripts/worker-service.cjs` - Rebuilt with fix
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. Test the fix in a live Claude Code session
|
||||
2. Investigate the `CLAUDE_PLUGIN_ROOT` path resolution
|
||||
3. Fix paths in hooks.json if needed
|
||||
@@ -0,0 +1,296 @@
|
||||
# Windows Woes: Comprehensive Report
|
||||
|
||||
**Date:** 2026-01-06
|
||||
**Coverage:** October 2025 - January 2026
|
||||
**Memory Sources:** 100+ observations from claude-mem
|
||||
|
||||
## Executive Summary
|
||||
|
||||
The claude-mem project has faced significant Windows platform challenges, requiring extensive architectural changes and ongoing maintenance. The issues fall into four major categories:
|
||||
|
||||
1. **Zombie Port Problem** - Bun's socket cleanup bug on Windows
|
||||
2. **Console Window Popups** - PowerShell/cmd windows appearing during hook execution
|
||||
3. **Process Management** - Orphaned processes, cleanup failures, multi-session conflicts
|
||||
4. **Path & Shell Compatibility** - PowerShell escaping, Git Bash conflicts, PATH detection
|
||||
|
||||
## Timeline of Major Issues & Fixes
|
||||
|
||||
### Phase 1: Initial Windows Support (Oct-Nov 2025)
|
||||
|
||||
| Date | Issue | Fix |
|
||||
|------|-------|-----|
|
||||
| Oct 27 | Hardcoded Unix paths | Cross-platform path refactoring |
|
||||
| Nov 5 | Windows installation failures | Smart caching installer created |
|
||||
| Nov 6 | PM2 ENOENT bug | Released v5.1.1 with fix |
|
||||
| Nov 11 | Worker crashes on Windows | Investigation started |
|
||||
|
||||
### Phase 2: Worker Reliability Crisis (Dec 2025)
|
||||
|
||||
| Date | Issue | Fix | PR/Version |
|
||||
|------|-------|-----|------------|
|
||||
| Dec 4 | Console windows appearing | Added `windowsHide` parameter | - |
|
||||
| Dec 9 | Multiple Windows bugs | Released v7.0.4 | @kat-bell |
|
||||
| Dec 13 | libuv crash from process.type hack | Removed workaround | v7.1.7 |
|
||||
| Dec 15 | Console popups on Windows 11 | Investigation (Issues #304, #330) | - |
|
||||
| Dec 16 | Zombie processes persist | Considered Bun self-executable | - |
|
||||
| Dec 17 | **Comprehensive stabilization** | PR #378 merged | v7.3.7 |
|
||||
|
||||
### Phase 3: Ongoing Challenges (Dec 2025 - Jan 2026)
|
||||
|
||||
| Date | Issue | Status |
|
||||
|------|-------|--------|
|
||||
| Dec 27 | Multi-session hangs with libuv assertion failures | Investigated |
|
||||
| Dec 28 | Lock acquisition ENOENT errors | PR #470 fixes |
|
||||
| Dec 29 | Windows stability refactoring | PR #492 |
|
||||
| Jan 4 | PowerShell `$_` escaping in Git Bash (Issue #517) | **NOT FIXED** |
|
||||
| Jan 5 | Windows hooks IPC issues (Issue #555) | **OPEN** |
|
||||
|
||||
---
|
||||
|
||||
## Issue Category 1: Zombie Port Problem
|
||||
|
||||
### The Problem
|
||||
Bun runtime has a known bug on Windows where socket handles aren't properly released when the worker process exits. This causes "zombie ports" that remain bound even after all processes terminate, requiring system reboot to clear.
|
||||
|
||||
### The Solution: Worker Wrapper Architecture
|
||||
|
||||
**Implemented:** December 17, 2025 (PR #372 by @ToxMox)
|
||||
|
||||
A two-tier process architecture was introduced:
|
||||
|
||||
```
|
||||
ProcessManager
|
||||
└── worker-wrapper.cjs (no sockets, manages lifecycle)
|
||||
└── worker-service.cjs (HTTP server on port 37777)
|
||||
├── MCP server
|
||||
└── ChromaSync
|
||||
```
|
||||
|
||||
**How it works:**
|
||||
1. `worker-wrapper.cjs` spawns as outer process with no socket bindings
|
||||
2. Actual worker runs as child process with IPC communication
|
||||
3. On restart/shutdown, wrapper uses `taskkill /T /F` to kill entire process tree
|
||||
4. Wrapper exits itself - since it holds no sockets, port is properly released
|
||||
|
||||
**Files modified (14 files, +665/-249 lines):**
|
||||
- `src/services/worker-wrapper.ts` (152 lines, new)
|
||||
- `src/services/process/ProcessManager.ts`
|
||||
- `src/services/worker-service.ts`
|
||||
- All hook scripts
|
||||
- Build system
|
||||
|
||||
### Known Limitation
|
||||
|
||||
**Issue:** The hooks don't set `CLAUDE_MEM_MANAGED=true` environment variable, so the managed restart code path (lines 314-330 of worker-service.ts) is never activated. Every session runs the "standalone Windows" code path which lacks proper serialization.
|
||||
|
||||
---
|
||||
|
||||
## Issue Category 2: Console Window Popups
|
||||
|
||||
### The Problem
|
||||
Windows users on Windows 11 reported multiple PowerShell/cmd popup windows appearing during Claude Code usage, disrupting user input. Issue #367 specifically noted these popups were stealing keyboard focus.
|
||||
|
||||
### The Solution: Standardized windowsHide
|
||||
|
||||
**Implemented:** December 17, 2025 (PR #378)
|
||||
|
||||
- All `child_process.spawn()` calls now include `windowsHide: true`
|
||||
- PowerShell spawning uses `Start-Process -WindowStyle Hidden`
|
||||
- ChromaSync MCP transport includes windowsHide option
|
||||
|
||||
**Affected components:**
|
||||
- ProcessManager subprocess spawning
|
||||
- ChromaSync Python subprocess
|
||||
- All hook executions
|
||||
|
||||
### Worker Logs Revealed Additional Issue
|
||||
|
||||
Worker logs showed failed orphaned process cleanup using Unix commands (`ps`, `grep`) that don't exist on Windows. This required implementing Windows-specific process enumeration using PowerShell's `Get-CimInstance`.
|
||||
|
||||
---
|
||||
|
||||
## Issue Category 3: Process Management
|
||||
|
||||
### 3.1 Orphaned Process Cleanup
|
||||
|
||||
**The Problem:** Child processes (chroma-mcp Python processes) accumulate over time, holding socket descriptors and preventing worker restart.
|
||||
|
||||
**The Solution (PR #378):**
|
||||
```typescript
|
||||
// Windows: Recursive process tree enumeration
|
||||
const cmd = `powershell -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -like '*python*' -and $_.CommandLine -like '*chroma-mcp*' } | Select-Object -ExpandProperty ProcessId"`;
|
||||
```
|
||||
|
||||
**Security:** Triple PID validation at lines 287, 306, 327 to prevent command injection.
|
||||
|
||||
### 3.2 Multi-Session Conflicts
|
||||
|
||||
**The Problem (Dec 27):** Running multiple concurrent Claude sessions causes the second session to hang indefinitely with:
|
||||
- libuv assertion failure: `!(handle->flags & UV_HANDLE_CLOSING)`
|
||||
- SessionStart hook error: "Worker failed to restart"
|
||||
|
||||
**Root Cause Analysis:**
|
||||
1. SessionStart hook calls restart without locking mechanism
|
||||
2. Two sessions simultaneously trigger `httpShutdown()`, `waitForPortFree()`, `spawn()`
|
||||
3. `waitForPortFree()` polls for only 10 seconds (Windows TCP TIME_WAIT: 30-60s)
|
||||
4. Child processes inherit socket descriptors, blocking port 37777
|
||||
5. `cleanupOrphanedProcesses()` runs AFTER worker starts instead of during shutdown
|
||||
|
||||
**Proposed Fix:** File-based mutex to prevent concurrent restart operations.
|
||||
|
||||
### 3.3 Lock Acquisition ENOENT Errors
|
||||
|
||||
**The Problem (Dec 28):** On Windows, the `.claude-mem` directory can be in flux during filesystem operations, causing `worker.lock` file access to fail with ENOENT.
|
||||
|
||||
**The Solution (PR #470):**
|
||||
```typescript
|
||||
// Retry up to 3 times, creating DATA_DIR between attempts
|
||||
for (let i = 0; i < 3; i++) {
|
||||
try {
|
||||
return await acquireLock();
|
||||
} catch (e) {
|
||||
if (e.code === 'ENOENT') {
|
||||
await mkdir(DATA_DIR, { recursive: true });
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Issue Category 4: Path & Shell Compatibility
|
||||
|
||||
### 4.1 PowerShell `$_` Variable Escaping (Issue #517)
|
||||
|
||||
**Status:** NOT FIXED as of v8.5.7
|
||||
|
||||
**The Problem:** When running in Git Bash or WSL, Bash interprets `$_` before PowerShell receives it. This affects:
|
||||
|
||||
- `cleanupOrphanedProcesses()` (lines 170-172)
|
||||
- `getChildProcesses()` (lines 91-92)
|
||||
|
||||
**Current Code (problematic):**
|
||||
```typescript
|
||||
const cmd = `powershell -Command "Get-CimInstance Win32_Process | Where-Object { $_.Name -like '*python*' ..."`;
|
||||
```
|
||||
|
||||
**Recommended Fix:** Use WMIC instead:
|
||||
```typescript
|
||||
const cmd = `wmic process where "name like '%python%' and commandline like '%chroma-mcp%'" get processid /format:list`;
|
||||
```
|
||||
|
||||
### 4.2 Bun PATH Detection
|
||||
|
||||
**The Problem:** Windows users with non-standard Bun installations get unhelpful error messages.
|
||||
|
||||
**The Solution (Dec 17):**
|
||||
Enhanced `getBunPathOrThrow()` with Windows-specific troubleshooting:
|
||||
- Verification command: `bun --version`
|
||||
- PATH check for `%USERPROFILE%\.bun\bin`
|
||||
- Reference to GitHub issue #371
|
||||
- Link to troubleshooting docs
|
||||
|
||||
### 4.3 PowerShell String Escaping
|
||||
|
||||
**The Solution:** `escapePowerShellString()` function doubles single quotes for safety when constructing PowerShell commands.
|
||||
|
||||
---
|
||||
|
||||
## Timeout Adjustments
|
||||
|
||||
Windows requires longer timeouts due to slower filesystem and process operations:
|
||||
|
||||
| Setting | Unix | Windows | Multiplier |
|
||||
|---------|------|---------|------------|
|
||||
| Worker startup | 15s | 30s | 2.0x |
|
||||
| Hook execution | 5s | 10s | 2.0x |
|
||||
| Port free check | 5s | 10s | 2.0x |
|
||||
| Process cleanup | 30s | 60s | 2.0x |
|
||||
|
||||
---
|
||||
|
||||
## CI/CD for Windows
|
||||
|
||||
**Implemented:** December 17, 2025
|
||||
|
||||
`.github/workflows/windows-ci.yml` tests:
|
||||
- Worker process lifecycle (startup/shutdown)
|
||||
- Rapid restart scenarios
|
||||
- Bun PATH detection
|
||||
- Port cleanup verification
|
||||
- Zombie process detection
|
||||
|
||||
**Note:** Windows CI was later removed due to testing challenges.
|
||||
|
||||
---
|
||||
|
||||
## Currently Open Windows Issues
|
||||
|
||||
| Issue | Title | Severity |
|
||||
|-------|-------|----------|
|
||||
| #517 | PowerShell `$_` escaping in Git Bash | Medium |
|
||||
| #555 | Windows hooks IPC false | High |
|
||||
| #324 | Windows 11 64-bit system issues | Unknown |
|
||||
|
||||
---
|
||||
|
||||
## Key Contributors
|
||||
|
||||
- **@ToxMox** - Worker wrapper architecture (PR #372), zombie port fix
|
||||
- **@kat-bell** - Windows plugin installation fixes (v7.0.4)
|
||||
- **Claude Opus 4.5** - Co-authored many Windows stabilization commits
|
||||
|
||||
---
|
||||
|
||||
## Architectural Decisions
|
||||
|
||||
### Why Worker Wrapper?
|
||||
The two-process architecture was chosen over alternatives like:
|
||||
- Bun self-executable packaging (considered but not implemented)
|
||||
- PM2 process management (replaced due to Windows issues)
|
||||
- Native Node.js (abandoned due to windowsHide limitations with detached processes)
|
||||
|
||||
### Why PowerShell over cmd.exe?
|
||||
PowerShell provides:
|
||||
- `Get-CimInstance` for WMI process enumeration
|
||||
- `-WindowStyle Hidden` for truly hidden windows
|
||||
- Better handling of complex command strings
|
||||
|
||||
### Why Keep Windows Code?
|
||||
December 20, 2025 decision documented:
|
||||
- Active Windows users evidenced by bug reports
|
||||
- 20+ Windows-specific commits with recent fixes
|
||||
- Critical functionality that can't be removed
|
||||
- Comprehensive documentation ensures maintainability
|
||||
|
||||
---
|
||||
|
||||
## Recommendations
|
||||
|
||||
1. **Implement file-based mutex** for worker restart serialization
|
||||
2. **Fix Issue #517** by switching to WMIC or proper escaping
|
||||
3. **Increase waitForPortFree timeout** to 60s for Windows TIME_WAIT
|
||||
4. **Run cleanup BEFORE worker startup** instead of after
|
||||
5. **Set CLAUDE_MEM_MANAGED=true** in hooks.json to activate managed mode
|
||||
6. **Consider Windows ARM64** - currently uses x64 emulation
|
||||
|
||||
---
|
||||
|
||||
## References
|
||||
|
||||
### Key PRs
|
||||
- PR #372: Worker wrapper architecture
|
||||
- PR #377/#378: Comprehensive Windows stabilization
|
||||
- PR #470: Lock acquisition retry
|
||||
- PR #492: Worker service refactoring
|
||||
|
||||
### Key Versions
|
||||
- v5.1.1: PM2 ENOENT fix
|
||||
- v7.0.4: Windows installation fixes
|
||||
- v7.1.7: libuv crash fix
|
||||
- v7.3.7: Platform stabilization
|
||||
|
||||
### Documentation
|
||||
- https://docs.claude-mem.ai/troubleshooting/windows-issues
|
||||
- `docs/context/windows-code-evaluation.md`
|
||||
- `docs/PM2-TO-BUN-MIGRATION.md`
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user