SSD Nodes Learn Hosting plans →
الأدلة Matt Connorبقلم Matt Connor · آخر تحديث في 2026-08-23

كيف تمنح Claude Code ذاكرة دائمة على VPS؟

تعرّف إلى Recall 0.4.0، الإضافة المحلية التي تحفظ جلسات Claude Code وتلخّصها دون رموز API أو اتصال بالشبكة، وقِس مقدار التوفير فعلياً.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

ما الذي يقدمه Recall لذاكرة Claude Code

Recall هو إضافة لـ Claude Code تمنح كل مشروع ذاكرة تمتد عبر الجلسات. يكتب ملفي Markdown داخل مجلد .recall/ في مشروعك: سجلّاً لا يسمح إلا بالإضافة لما حدث، وملخصاً قصيراً يوضح الموضع الذي توقفت عنده. يُنتج مُلخِّص Python محلي هذين الملفين على الجهاز الذي تعمل عليه، لذلك لا تستهلك الذاكرة نفسها أي رموز API.

يسد Recall فجوة صغيرة ومتكررة. تنهي جلسة على 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 والإصدارات الأحدث. قد لا تحتوي صور الحاويات الدنيا على أي مفسّر، وعندها يعرض 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. يشغّل كل hook برنامج 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 الفروقات الحالية وعمليات commit الأخيرة إلى الملخص.
  • يحدّد max_input_chars الحد الأقصى لما يقرأه الملخّص من history.md في كل مرة.

بالنسبة إلى مشروع على VPS، يكون التغيير المفيد هو الحفظ التلقائي، لأن الجلسة على الخادم غالباً ما تنتهي عند انقطاع الطرفية، لا عندما تقرر إيقافها.

{
  "auto_save_context": "on_end",
  "summary_sentences": 12
}

لإيقاف الالتقاط مؤقتاً من دون تعديل الإعدادات، أنشئ علامة الإيقاف المؤقت. احذفها لبدء الالتقاط مجدداً.

touch .recall/.capture-paused

نفّذ ذلك قبل جلسة تتعامل فيها مع بيانات اعتماد الإنتاج، لأن التنقيح مرشح وليس ضماناً. وينطبق المنطق نفسه على إبقاء الأسرار خارج وكلاء الذكاء الاصطناعي عموماً: السر الآمن هو السر الذي لا يراه الوكيل مطلقاً.

ما مقدار ما يوفّره Recall من الرموز؟

يعتمد ذلك على البديل. تحميل ملخص عند بدء الجلسة منخفض التكلفة. أما ما يحلّ محلّه فقد يكون مكلفاً، لأن النموذج الذي لا يملك ذاكرة عن مشروعك يعيد اكتشافه بقراءة الملفات.

ChartTypical cost of resuming work, per session
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 رمزاً، وهو ما يتوافق مع ادعاء المشروع المنشور بأن استئناف الجلسة يحتاج إلى ألف أو ألفي رمز. أما إعادة تشغيل نص جلسة سابقة بالكامل فتُعيد تحميل المحادثة بأكملها، بنحو 85,000 رمزاً. ويقع جعل النموذج يعيد اكتشاف المشروع بقراءة الملفات بين الخيارين، عند نحو 30,000 رمزاً، ويزداد هذا العدد مع حجم المستودع. أما صف CLAUDE.md فهو موجود لتوضيح المقياس: تكلفته أقل لأنه قصير وثابت، كما أنه يعرّف النموذج بقواعدك الدائمة بدلاً مما حدث في الليلة الماضية.

قِس أرقامك بنفسك. يعادل الرمز الواحد نحو أربعة أحرف من النثر الإنجليزي، وأقل قليلاً في الشيفرة. إذا كنت تمرّر الملخص أيضاً إلى نموذج محلي على VPS نفسه، فتحقق من نافذة السياق التي يُوضَع فيها قبل أن تعتمد على الاستئناف، لأن Ollama يقتطع المطالبات الطويلة عند طول سياق افتراضي صغير بدلاً من إخبارك بأنه أسقط نهايتها.

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/ بعد جلسة كاملة. لم تُشغَّل الـhooks. اكتب /recall:show للتأكد من تحميل الـplugin، ثم شغّل python3 -V. يحاول أمر الـhook استخدام python3 أولاً وpython ثانياً، لذلك لا يكتب الصندوق الذي لا يحتوي على أيٍّ منهما شيئاً، ولا يصدر تنبيهاً بذلك.

ينمو history.md، لكن context.md لا يتغير أبداً. تكون قيمة auto_save_context هي off افتراضياً. شغّل /recall:save، أو اضبط المفتاح على on_end ودَع hook الخاص بـ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 أسابيع، فعليك البحث في history.md باستخدام grep. كما أنه لا ينقل المعلومات بين الجلسات: لا تستطيع جلستان مفتوحتان في الوقت نفسه على VPS نفسه رؤية سجلات إحداهما الأخرى. لذلك، عندما تحتاج إحداهما إلى معرفة ما تفعله الأخرى، يمكن للجلسات تمرير النص مباشرةً فيما بينها أثناء تشغيلها.

لا يساعد ذلك داخل الجلسة. امتلاء نافذة السياق أثناء الجلسة مشكلة مختلفة ولها حلول مختلفة، وإدارة نافذة السياق داخل جلسة واحدة هي المقالة المكمّلة لهذا الدليل.

يُعامل الملخّص، عن قصد، على أنه إدخال غير موثوق. يُحقن context.md داخل كتلة fenced مع وسم يوضّح طبيعته، ويسأل Claude قبل الاعتماد عليه. وُضع هذا التصميم لأن مجلد .recall/ مُلتزم به هو مكان يستطيع فيه أي شخص لديه صلاحية commit كتابة نص سيقرأه الوكيل. يحدد وضع الصلاحيات الذي تبدأ به الجلسة مقدار توقف الوكيل لطرح أسئلة حول ما يقرأه، ويصبح الوضع التلقائي هو الإعداد الافتراضي في Claude Code في 14 August 2026. قرر مرة واحدة ما إذا كان .recall/ شخصياً أو مشتركاً: أضفه إلى .gitignore للذاكرة الشخصية، أو ارفع commit له وراجعه مثل أي مساهمة أخرى. إذا كان الوكيل يعمل دون إشراف، فإن تشغيل Claude Code بأمان على VPS يغطي الحدود الأوسع.

إزالة البيانات الحساسة تتم بأفضل جهد. فهي تستهدف الأنماط الشائعة مثل مفاتيح API والرموز المميّزة وكتل PEM وتعيينات .env. اقرأ .recall/ قبل تنفيذ commit له.

رقم الإصدار يعبّر بصدق عن مستوى النضج. في الإصدار 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 من جذر المشروع في كل مرة، لأن الملفات تتبع دليل العمل لا حساب المستخدم.