كيف تمنح Claude Code ذاكرة دائمة على VPS؟
تعرّف إلى Recall 0.4.0، الإضافة المحلية التي تحفظ جلسات Claude Code وتلخّصها دون رموز API أو اتصال بالشبكة، وقِس مقدار التوفير فعلياً.
ما الذي يفعله Recall لذاكرة Claude Code
Recall هو مكوّن إضافي لـ Claude Code يمنح كل مشروع ذاكرة تمتد عبر الجلسات. يكتب ملفين بتنسيق Markdown داخل مجلد .recall/ في مشروعك: سجل لا تُضاف إليه إلا الإدخالات الجديدة لما حدث، وملخصاً قصيراً يوضح الموضع الذي توقفت عنده. ينشئ مُلخِّص Python محلي هذين الملفين على الجهاز الذي تعمل عليه، لذلك لا تستهلك الذاكرة نفسها أي رموز API.
يعالج Recall فجوة صغيرة لكنها متكررة. تنهي جلسة على VPS يوم الثلاثاء. وفي يوم الأربعاء، لا تحمّل جلسة جديدة محادثة يوم الثلاثاء تلقائياً، مع أن الذاكرة التلقائية المضمّنة في Claude Code يمكنها الاحتفاظ بملاحظات عبر الجلسات. إذا لم توضّح تلك الملاحظات الموضع الذي توقفت عنده، فعليك إعادة شرح المشروع يدوياً، أو تترك النموذج يقرأ نصف المستودع مرة أخرى ليستنتج ذلك. يستهلك الخياران الرموز، لكن الخيار الثاني يستهلك عدداً كبيراً منها.
الإصدار 0.4.0 من Recall، الذي صدر في 18 July 2026، هو أحدث إصدار حتى October 2026، والمشروع مرخّص بموجب MIT. إنه مكوّن إضافي. لا يُجري أي شيء فيه اتصالاً بالشبكة.
ما تحتاج إليه على VPS
خطافات الالتقاط في Recall هي نصوص Python المضمّنة مع الإضافة. لا توجد تبعيات من جهات خارجية، لذلك فإن المتطلب الفعلي الوحيد هو وجود مفسّر.
python3 -Vيستوفي Ubuntu 24.04 هذا الشرط عبر Python 3.12.3. يدعم Recall الإصدار Python 3.9 والإصدارات الأحدث. قد لا تحتوي صور الحاويات الدنيا على أي مفسّر، وعندها يعرض shell الرسالة python3: command not found. ثبّت مفسّراً قبل المتابعة.
sudo apt update && sudo apt install -y python3تُعد NumPy مسرّعاً اختيارياً لخطوة واحدة من الملخّص. لا تحتاج إليها.
python3 -c "import numpy"تُعد ModuleNotFoundError: No module named 'numpy' إجابة مقبولة هنا. يحتوي الملخّص على مسار مكتوب بالكامل بـPython، وتتحقق مجموعة اختبارات المشروع من أن كلا المسارين يختاران الجمل نفسها.
تكتسب ذاكرة الجلسة أهمية أكبر على الخادم منها على الحاسوب المحمول، لأن أعمال إدارة الخادم تصل في زيارات قصيرة موزعة على عدة أيام. إذا كنت تشغّل Claude Code في tmux على VPS بالفعل، فإن Recall هو المكوّن الذي ينقل جلسة الأمس إلى جلسة اليوم.
تثبيت Recall من سوق الإضافات
أدخل الأمرين داخل جلسة Claude Code:
/plugin marketplace add raiyanyahya/recall
/plugin install recall@recallيقرأ الأمر الثاني plugin@marketplace. الاسمان هما recall هنا، وقد يبدو ذلك خطأً في النسخ واللصق، لكنه ليس كذلك.
تحقق من التثبيت بتشغيل أحد أوامر الإضافة:
/recall:showيعرض /recall:show الملخص الحالي. في مشروع جديد تماماً، لا يوجد شيء لعرضه بعد. لذلك، ما تتحقق منه فعلياً هو وجود الأمر. إذا لم يتعرّف Claude Code على /recall:show، فلن تكون الإضافة محمّلة، ولن يعمل أي hook.
لتشغيل الإضافة من نسخة مستنسخة من المستودع بدلاً من ذلك، استنسخ المستودع وتحقق منه أولاً:
git clone https://github.com/raiyanyahya/recall ~/recall
cd ~/recall && claude plugin validate .يقرأ claude plugin validate . ملف البيان الموجود في .claude-plugin/، ويُبلغك بما إذا كانت الإضافة مستوفية للبنية المطلوبة. ثم شغّل Claude Code من مجلد مشروعك باستخدام claude --plugin-dir ~/recall.
ما تكتبه الـhooks ومتى
يسجّل Recall ثلاثة hooks لـClaude Code. يشغّل كل واحد منها نصاً برمجياً بـPython من دليل الـplugin.
SessionStartيعمل عند بدء الجلسة واستئنافها ومسحها. ويعرضcontext.mdحتى تبدأ الجلسة وملخصك ظاهر أمامك.Stopيعمل كلما أنهى Claude استجابة. ويضيف تلك الجولة إلى السجل.SessionEndيعمل عند إغلاق الجلسة، ويمكنه إعادة إنشاء الملخص.
ينتج عن ذلك ملفان، وكلاهما داخل .recall/.
history.mdهو السجل الذي تُضاف إليه البيانات فقط: المطالبات، والاستجابات، والملفات التي جرى تعديلها، والأوامر التي جرى تشغيلها.context.mdهو الملخص المُنشأ: الهدف، والملخص، والخطوات التالية، والملفات التي جرى تعديلها، والأوامر التي جرى تشغيلها، وسياق git.
بعد جلسة فعلية واحدة، اعرض محتويات الدليل.
ls -la .recall/عند تفعيل الالتقاط، وعدم وجود علامة إيقاف مؤقت، وتوفر النص الكامل للجلسة، يفترض أن ترى history.md وفيه محتوى. وقد لا ترى context.md إطلاقاً، وهذا هو السلوك الافتراضي وليس عطلاً. تكون auto_save_context هي off ما لم تضبطها، لذلك لا يُكتب الملخص إلا عند طلبه:
/recall:saveيشغّل هذا الأمر أداة التلخيص المحلية على history.md، ثم يعيد كتابة context.md. تستخدم الخوارزمية تسجيل TF-IDF (تواتر المصطلح، وتواتر المستند العكسي)، ثم ترتيب الجمل باستخدام TextRank. وهي حتمية واستخراجية، ما يعني أنها تختار جملاً موجودة أصلاً في السجل. لا يُستدعى أي نموذج، لذلك لا تتطلب هذه الخطوة تكلفة وتعمل دون اتصال على الجهاز.
إعداد Recall لمشروع واحد
يوجد الإعداد في ملف recall.config.json في جذر المشروع. هذه هي الإعدادات الافتراضية المضمّنة:
{
"output_dir": ".recall",
"capture_history": true,
"summary_sentences": 8,
"redact": true,
"include_git": true,
"max_input_chars": 200000
}- يحدد
output_dirمكان وجود الملفين. أبقه داخل المشروع. - يفعّل
capture_historyسجلhistory.mdويعطّله. - يقبل
auto_save_contextالقيمةoffأوon_end، وتكون القيمة الافتراضيةoff. - يحدد
summary_sentencesعدد الجمل التي تبقى فيcontext.md. تؤدي زيادته إلى ملخص أطول وحمل أكبر قليلاً عند بدء الجلسة. - يزيل
redactأنماط الأسرار الشائعة قبل كتابة أي شيء على القرص. - يضيف
include_gitإحصاءات diff الحالية وعمليات commit الأخيرة إلى الملخص. - يحدد
max_input_charsالحد الأقصى لما يقرأه الملخّص منhistory.mdفي كل مرة.
بالنسبة إلى مشروع على VPS، يكون التغيير المفيد هو الحفظ التلقائي، لأن الجلسة على الخادم غالباً ما تنتهي عند انقطاع الطرفية، لا عندما تقرر إيقافها.
{
"auto_save_context": "on_end",
"summary_sentences": 12
}لإيقاف الالتقاط مؤقتاً من دون تعديل الإعداد، أنشئ علامة الإيقاف المؤقت. احذفها لبدء الالتقاط من جديد.
touch .recall/.capture-pausedنفّذ ذلك قبل جلسة تتعامل فيها مع بيانات اعتماد الإنتاج، لأن التنقيح مرشح وليس ضماناً. وينطبق المنطق نفسه على إبعاد الأسرار عن وكلاء الذكاء الاصطناعي عموماً: السر الآمن هو السر الذي لا يراه الوكيل مطلقاً.
ما مقدار التوفير الذي يحققه Recall في عدد الرموز؟
يعتمد ذلك على البديل. تحميل ملخص عند بدء الجلسة منخفض التكلفة. أما ما يستبدله فقد يكون مكلفاً، لأن نموذجاً لا يملك أي معرفة بمشروعك سيعيد اكتشافه من خلال قراءة الملفات.
البيانات وراء هذا الرسم البياني
[
{
"label": "Recall context.md",
"char_count": "4,800",
"est_tokens": "1,200"
},
{
"label": "Hand-written CLAUDE.md",
"char_count": "3,200",
"est_tokens": "800"
},
{
"label": "Re-reading the repo",
"char_count": "120,000",
"est_tokens": "30,000"
},
{
"label": "Full transcript replay",
"char_count": "340,000",
"est_tokens": "85,000"
}
]هذه أرقام نموذجية لمشروع متوسط الحجم، وليست قياساً لمشروعك. يُحمَّل ملخص Recall بنحو 1,200 رمزاً، وهو ما يتوافق مع الادعاء المنشور للمشروع بأن الاستئناف يحتاج إلى ألف أو ألفي رمز. أما إعادة تشغيل سجل سابق كامل فتعيد تحميل المحادثة بأكملها، بنحو 85,000 رمزاً. ويقع جعل النموذج يعيد اكتشاف المشروع من خلال قراءة الملفات بين الخيارين، بنحو 30,000 رمزاً، ويزداد هذا العدد مع زيادة حجم المستودع. أُدرج صف CLAUDE.md لتوضيح المقياس: فهو أقل تكلفة لأنه قصير وثابت، كما أنه يعرّف النموذج بقواعدك الدائمة بدلاً من إخباره بما حدث في الليلة الماضية.
قِس أرقامك بنفسك. الرمز الواحد يعادل تقريباً أربعة أحرف من النثر الإنجليزي، وأقل قليلاً في الشيفرة. إذا كنت تمرر الملخص أيضاً إلى نموذج محلي على VPS نفسه، فتحقق من نافذة السياق التي سيُحمَّل فيها قبل الوثوق بالاستئناف، لأن طول السياق الافتراضي في Ollama يعتمد على VRAM المتاحة.
wc -c .recall/context.md .recall/history.md
echo $(( $(wc -c < .recall/context.md) / 4 ))داخل الجلسة، يعرض /context ما حُمِّل في نافذة السياق حالياً، بينما يعرض /cost إجماليات الجلسة. ابدأ جلسة أولى من دون سياق سابق، ثم ابدأ الجلسة التالية بعد وضع ملخص، وقارن بينهما. للحصول على الصورة الكاملة لمواضع استهلاك رموز الجلسة، يوضّح كيفية إنفاق Claude Code للرموز التفاصيل.
هناك ملاحظة واحدة تحافظ على دقة هذا الادعاء. يُحمَّل الملخص عند بدء كل جلسة، لذلك يكون الملخص الذي لا تتصرف بناءً عليه تكلفة صغيرة، لا توفيراً. أبقِ summary_sentences قريباً من القيمة الافتراضية ما لم تكن جلساتك طويلة. تساعد الجلسة الأقل ضجيجاً في الجانب الآخر من المعادلة، لأن دفع الوكيل نحو أصغر تغيير ناجح يترك سجلاً أقصر ليصنّفه الملخّص.
إعادة إنشاء الملخص دون جلسة
إذا استنسخت المستودع، فستتوفر أداة إنشاء الملخص كنقطة إدخال مستقلة لسطر الأوامر. يفيد ذلك على VPS عندما تنتهي جلسة الطرفية فجأة وتحتاج إلى الملخص رغم ذلك.
python3 ~/recall/scripts/make_context.py --helpيسرد ناتج المساعدة الخيارات التي تقبلها الأداة: --cwd لجذر المشروع، و--transcript لملف نصي صريح للجلسة، و--quiet لكتم الناتج، و--harness للاختيار بين claude وopencode. وجّه الأداة إلى مشروع:
python3 ~/recall/scripts/make_context.py --cwd /srv/projects/apiتقرأ الأداة نص الجلسة وhistory.md، ثم تكتب context.md ضمن الدليل الذي مررته إليها. إذا ثبّت الأداة من خلال marketplace، فستجد الإضافة في دليل يديره Claude Code، ويُعد /recall:save الطريقة المدعومة لتنفيذ المهمة نفسها.
لماذا لا يُكتب أي شيء
لا يوجد مجلد .recall/ بعد جلسة كاملة. تحقّق مما إذا كان الالتقاط معطّلاً، أو كان مجلد الإخراج مضبوطاً في مكان آخر، أو لم يُعثر على أي transcript، قبل الاستنتاج بأن hooks لم تُشغَّل. اكتب /recall:show للتأكد من تحميل plugin، ثم شغّل python3 -V. يحاول أمر hook استخدام python3 أولاً وpython ثانياً، ولذلك يفشل النظام الذي لا يحتوي على أيٍّ منهما مع stderr ورمز الخروج 127. يعرض Claude Code إشعاراً غير حاجب بوجود خطأ في hook، ويتضمن السطر الأول من stderr.
يزداد حجم history.md لكن context.md لا يتغير. يكون auto_save_context مضبوطاً على off افتراضياً. شغّل /recall:save، أو اضبط المفتاح على on_end ودَع hook الخاص بـ SessionEnd ينفّذ العملية.
تظهر الملفات ضمن المشروع الخطأ. تكتب ميزة Recall باستخدام مسارات نسبية بدءاً من الدليل الذي شُغِّل منه Claude Code، ولذلك يؤدي بدء الجلسة من مجلد home إلى وضع الذاكرة هناك. ابدأ من جذر المشروع، واستخدم ls -la .recall/ لمعرفة المكان الذي وُضعت فيه الملفات فعلياً.
توقف الالتقاط ولم يظهر أي تحذير. تحقّق من وجود علامة الإيقاف المؤقت باستخدام ls -a .recall/. يظل ملف .capture-paused الذي أنشأته الأسبوع الماضي يؤدي وظيفته.
الملخص مقتضب بعد جلسة طويلة. يحدّد max_input_chars الحد الأقصى لإدخال الملخّص عند 200000 حرف، ولذلك يُقتطع السجل الطويل جداً. نفّذ تدويراً له.
mv .recall/history.md .recall/history-2026-07-30.mdشغّل بعد ذلك جلسة قصيرة واحدة، وتحقّق من ls -la .recall/ مرة أخرى للتأكد من ظهور history.md جديد.
حدود Recall
Recall عبارة عن سجلّ وملخّص، ومن المهم توضيح ما لا يشمله ذلك.
الملخّص استخراجِي. يختار TextRank جملاً موجودة أصلاً في history.md، لذلك لا يقيّم أبداً ما إذا كان القرار صحيحاً. يظهر القرار الخاطئ المسجّل يوم الثلاثاء بالطريقة نفسها التي يظهر بها القرار الجيد يوم الأربعاء. عندما تكون العواقب مهمة، اقرأ context.md وصحّحه يدوياً. إنه ملف markdown، ولا شيء يمنعك من تعديله.
لا توجد وظيفة بحث. تحصل على ملخّص حالي واحد وسجلّ متزايد واحد لكل مشروع، وليس على ذاكرة قابلة للاستعلام بين المشاريع. إذا كان السؤال هو ما قررته بشأن قاعدة البيانات قبل ثلاثة أسابيع، فعليك البحث باستخدام grep في history.md. لا يوفّر Recall تنسيقاً فورياً: تشترك جلستان في المشروع نفسه في ملف السجل، لكن Recall لا يرسل إدخالات السجل الجديدة إلى سياق الجلسة الأخرى. لذلك، عندما تحتاج جلسة إلى معرفة ما تفعله الأخرى، يمكن لـالجلسات تمرير النص مباشرةً فيما بينها أثناء تشغيلها.
لا يساعد ذلك داخل الجلسة. امتلاء نافذة السياق في منتصف الجلسة مشكلة مختلفة، ولها حلول مختلفة، وإدارة نافذة السياق داخل جلسة واحدة هي المقالة المكمّلة لهذا الدليل.
يُعامَل الملخّص على أنه إدخال غير موثوق به عن قصد. يُدرج context.md داخل كتلة fenced مع وسم، ويسأل Claude قبل الاعتماد عليه. وُضع هذا التصميم لأن مجلد .recall/ الملتزم به هو مكان يمكن لأي شخص لديه صلاحية commit أن يكتب فيه نصاً سيقرأه الوكيل. يحدّد نمط الصلاحيات الذي تبدأ به الجلسة مقدار توقّف الوكيل لطرح أسئلة حول ما يقرأه. في Claude Code v2.1.283 أو الإصدارات الأحدث، يكون الوضع التلقائي هو وضع البدء المضمّن بالفعل لجلسات الطرفية التفاعلية وVS Code على كل خطة وكل موفّر، لذلك يراجع المصنّف معظم الإجراءات بدلاً منك؛ أما المؤسسات التي تستخدم إعداد HIPAA فما زالت تبدأ في الوضع اليدوي. قرّر مرة واحدة ما إذا كان .recall/ شخصياً أم مشتركاً: أضفه إلى .gitignore للذاكرة الشخصية، أو التزم به وراجعه مثل أي مساهمة أخرى. إذا كان الوكيل يعمل دون إشراف، فإن تشغيل Claude Code بأمان على VPS يغطّي نطاق الحماية الأوسع.
إزالة البيانات الحساسة تُجرى وفق أفضل جهد. تستهدف الأنماط الشائعة مثل مفاتيح API والرموز المميّزة وكتل PEM وتعيينات .env. اقرأ .recall/ قبل الالتزام به.
رقم الإصدار يعبّر بصدق عن مستوى النضج. في الإصدار 0.4.0، الذي ما زال أحدث إصدار في October 2026، يمكن أن تتغير مفاتيح الإعداد وبنية الملفات بين الإصدارات، لذلك اقرأ سجل التغييرات قبل ترقية إعداد تعتمد عليه.
FAQ
هل يرسل Recall شيفرتي أو نصوص الجلسات إلى أي مكان؟
لا. تعمل خطافات الالتقاط وملخّص الجلسات كبرامج Python النصية على جهازك، ولا يحتفظ الإضافة بأي مفتاح API، ولا تجري أي اتصال بالشبكة. يستخدم التلخيص TF-IDF وTextRank بدلاً من نموذج، لذلك لا تترتب على هذه الخطوة أي تكلفة وتعمل حتى عندما يكون الجهاز غير متصل بالإنترنت. والمقابل هو أن الملخص استخراجي؛ إذ يختار جملاً من السجل بدلاً من كتابة جمل جديدة.
لماذا ملف .recall/context.md مفقود أو قديم؟
تكون قيمة auto_save_context الافتراضية هي off، لذلك لا يُعاد إنشاء الملخص إلا عند تشغيل /recall:save. عيّن "auto_save_context": "on_end" في recall.config.json لكي يُعاد كتابة الملخص عند انتهاء كل جلسة. إذا كان history.md مفقوداً أيضاً، فتحقق من capture_history، ومن علامة .capture-paused، ومن توفر نص جلسة؛ إذ تتخطى الخطافات قيد التشغيل كتابة السجل التاريخي في هذه الحالات. تأكد من تحميل الإضافة باستخدام /recall:show، ثم تأكد من أن python3 -V يعطي إجابة على ذلك الجهاز، لأن الخطافات برامج Python نصية.
كم يوفر Recall من الرموز في كل جلسة؟
يستهلك تحميل الملخص نحو 1,200 من الرموز، مقارنةً بنحو 30,000 من الرموز عادةً لنموذج يضطر إلى قراءة مستودعك مرة أخرى لمعرفة موضعه. هذه أرقام تقريبية. قِس استهلاكك باستخدام wc -c .recall/context.md والأمر /context داخل جلسة، وقارن بين بدء بارد وبدء يستأنف العمل من ملخص.
هل ما زلت أحتاج إلى ملف CLAUDE.md؟
نعم، ولكل منهما وظيفة مختلفة. CLAUDE.md هو ما تكتبه عمداً: القواعد الدائمة وأوامر البناء. أما context.md فيُنشأ مما حدث فعلياً في الجلسة السابقة، ولذلك يحتوي على عملية الترحيل غير المكتملة التي لن تفكر في تدوينها. احتفظ بالملفين.
هل يمكن لخادم VPS واحد الاحتفاظ بذاكرة عدة مشاريع؟
نعم. يحتفظ Recall بالذاكرة في .recall/ داخل دليل كل مشروع، لذلك يحتفظ مشروعان على الخادم نفسه بسجلات وملخصات منفصلة. ابدأ Claude Code من جذر المشروع في كل مرة، لأن الملفات تتبع دليل العمل لا حساب المستخدم.