كيف تمنح Claude Code ذاكرة على VPS باستخدام Recall
تعرّف إلى Recall، الإضافة المحلية التي تسجّل جلسات Claude Code وتلخّصها لاستئناف العمل، ثم ثبّتها على VPS واختبر مقدار الرموز التي توفّرها.
ما الذي يفعله Recall لذاكرة Claude Code
Recall هو إضافة لـ Claude Code تمنح كل مشروع ذاكرة تمتد عبر الجلسات. يكتب ملفي Markdown داخل مجلد .recall/ في مشروعك: سجلًا لا يُضاف إليه إلا في نهايته لما حدث، وملخصًا قصيرًا يوضح الموضع الذي توقفت عنده. يُنشئ مُلخِّص Python محلي هذين الملفين على الجهاز الذي تعمل عليه، لذلك لا تستهلك الذاكرة نفسها أي رموز مميزة من API.
الفجوة التي يسدها صغيرة وثابتة. تنهي جلسة على VPS يوم الثلاثاء. وفي يوم الأربعاء، لا يعرف Claude Code شيئًا عما حدث يوم الثلاثاء. تعيد شرح المشروع يدويًا، أو تترك للنموذج قراءة نصف المستودع مرة أخرى لفهمه. كلا الخيارين يستهلك رموزًا مميزة، أما الخيار الثاني فيستهلك عددًا كبيرًا منها.
الإصدار 0.4.0 من Recall هو الإصدار الحالي اعتبارًا من July 2026، والمشروع مرخّص بموجب MIT. وهو إضافة. ولا يجري أي استدعاء للشبكة.
ما تحتاج إليه على VPS
خطافات الالتقاط في Recall هي برامج Python النصية التي تأتي مع الإضافة. لا توجد تبعيات من جهات خارجية، لذا فإن المتطلب الفعلي الوحيد هو وجود مفسّر.
python3 -Vيجيب Ubuntu 24.04 عن Python 3.12.3. يدعم Recall الإصدار Python 3.9 والإصدارات الأحدث. لا تحتوي صور الحاويات المصغّرة أحيانًا على أي مفسّر، وعندها تجيب الصدفة عن 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 . ملف manifest الموجود في .claude-plugin/، ويُبلغك بما إذا كانت الإضافة سليمة البنية. ثم شغّل Claude Code من مجلد مشروعك باستخدام claude --plugin-dir ~/recall.
ما تكتبه الخطافات ومتى
يسجّل Recall ثلاثة خطافات في Claude Code. يشغّل كل خطاف منها سكربت Python من دليل المكوّن الإضافي.
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الفرق الحالي وعمليات الإيداع الأخيرة إلى الملخص. - يضع
max_input_charsحدًا أقصى لكميةhistory.mdالتي يقرأها الملخّص في كل مرة.
بالنسبة إلى مشروع على VPS، التغيير المفيد هو الحفظ التلقائي، لأن الجلسة على الخادم تنتهي غالبًا عند انقطاع الطرفية، لا عندما تقرر إيقافها.
{
"auto_save_context": "on_end",
"summary_sentences": 12
}لإيقاف الالتقاط مؤقتًا من دون تعديل الإعدادات، أنشئ علامة الإيقاف المؤقت. احذفها لبدء الالتقاط من جديد.
touch .recall/.capture-pausedنفّذ ذلك قبل جلسة تتعامل فيها مع بيانات اعتماد الإنتاج، لأن التنقيح مرشح وليس ضمانًا. وينطبق المنطق نفسه على إبقاء الأسرار خارج وكلاء الذكاء الاصطناعي عمومًا: السر الآمن هو السر الذي لا يراه الوكيل مطلقًا.
كم من الرموز يحفظها Recall؟
يعتمد ذلك على البديل. تحميل ملخص عند بدء الجلسة منخفض التكلفة. أما ما يحل محله فقد يكون مكلفًا، لأن النموذج الذي لا يملك معلومات عن مشروعك يعيد اكتشافه بقراءة الملفات.
The data behind this chart
[
{
"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 من الرموز، وهو ما يتوافق مع الادعاء المنشور للمشروع بأن استئناف الجلسة يتطلب من 1000 إلى 2000 رمز. أما إعادة تشغيل سجل محادثة سابق كامل فتُعيد تحميل المحادثة بأكملها، بحدود 85,000 من الرموز. ويقع جعل النموذج يعيد اكتشاف المشروع بقراءة الملفات بين الخيارين، عند نحو 30,000 من الرموز، ويزداد هذا العدد مع زيادة حجم المستودع. أما صف CLAUDE.md فموجود لتوضيح المقياس: تكلفته أقل لأنه قصير وثابت، ولأنه يخبر النموذج بقواعدك الدائمة بدلًا مما حدث الليلة الماضية.
قِس أرقامك بنفسك. الرمز الواحد يعادل تقريبًا 4 أحرف من النثر الإنجليزي، وأقل قليلًا في التعليمات البرمجية.
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 داخل الدليل الذي حددته. إذا ثبّت الأداة من خلال السوق، فسيكون المكوّن الإضافي موجودًا في دليل يديره Claude Code، ويُعد /recall:save الطريقة المعتمدة لتنفيذ المهمة نفسها.
سبب عدم كتابة أي شيء
لا يوجد مجلد .recall/ بعد جلسة كاملة. لم تُشغَّل الخطافات. اكتب /recall:show للتأكد من تحميل الإضافة، ثم شغّل python3 -V. يحاول أمر الخطاف استخدام python3 أولًا وpython ثانيًا، ولذلك لا يكتب أي شيء على جهاز لا يحتوي على أيٍّ منهما، ولا يصدر تنبيهًا بذلك.
ينمو history.md، لكن context.md لا يتغير أبدًا. يكون auto_save_context مضبوطًا على off افتراضيًا. شغّل /recall:save، أو اضبط المفتاح على on_end ودَع خطاف SessionEnd ينفّذ ذلك.
تظهر الملفات ضمن المشروع الخطأ. يكتب Recall باستخدام مسارات نسبية إلى الدليل الذي بدأ منه Claude Code، ولذلك يؤدي بدء جلسة من مجلد المنزل إلى وضع الذاكرة فيه. ابدأ من جذر المشروع، واستخدم 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، ولا شيء يمنعك من تحريره.
لا توجد ميزة بحث. تحصل على ملخص حالي واحد وسجل متنامٍ واحد لكل مشروع، وليس على ذاكرة قابلة للاستعلام عبر المشاريع. إذا كان السؤال هو ما قررته بشأن قاعدة البيانات قبل 3 أسابيع، فأنت تبحث باستخدام grep في history.md.
لا يساعد ذلك داخل الجلسة. امتلاء نافذة السياق أثناء الجلسة مشكلة مختلفة، ولها حلول مختلفة، وإدارة نافذة السياق داخل جلسة واحدة هي المقالة المرافقة لهذا الدليل.
يُعامل الملخص عمدًا على أنه إدخال غير موثوق به. يُحقن context.md داخل كتلة محاطة بسياج مع وضع تسمية له، ويسأل Claude قبل الاعتماد عليه. وُضع هذا التصميم لأن مجلد .recall/ المودَع في المستودع هو مكان يمكن لأي شخص يملك صلاحية الإيداع فيه كتابة نص سيقرأه وكيلك. حدّد مرة واحدة ما إذا كان .recall/ شخصيًا أو مشتركًا: أضفه إلى .gitignore للذاكرة الشخصية، أو أودعه في المستودع وراجعه مثل أي مساهمة أخرى. إذا كان الوكيل يعمل دون إشراف، فإن تشغيل Claude Code بأمان على VPS يغطي حدود الأمان الأوسع.
إزالة البيانات الحساسة تتم بأفضل جهد ممكن. تستهدف الأداة أنماطًا شائعة مثل مفاتيح API والرموز المميزة وكتل PEM وتعيينات .env. اقرأ .recall/ قبل إيداعه في المستودع.
رقم الإصدار يعبّر بصدق عن مستوى النضج. في الإصدار 0.4.0 في July 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 مفقودًا أيضًا، فهذا يعني أن الخطافات لا تعمل إطلاقًا. تحقّق من تحميل المكوّن الإضافي باستخدام /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 من جذر المشروع في كل مرة، لأن الملفات تتبع دليل العمل لا حساب المستخدم.