المدونة

يحذف Claude Code السجل بعد 30 يومًا: كيفية حفظه

Markdown

أين تُخزَّن جلسات Claude Code، وكيفية ضبط cleanupPeriodDays، وتنظيم أرشيف خارجي باستخدام rsync أو launchd أو cron.

قراءة المقال كاملًا

للمساعدة في استخدام الخدمة، راجع وثائق Ailoot.

هل يحذف Claude Code سجل جلساتك فعلًا؟

أهم النقاط

نعم. في كل مرة يبدأ فيها Claude Code، يحذف ملفات الجلسات التي مرّ عليها أكثر من 30 يومًا. إعداد cleanupPeriodDays في ~/.claude/settings.json هو المسؤول عن ذلك، وقيمته الافتراضية 30. يحدث الحذف بلا تحذير، وبلا طلب موافقة، ومن دون أي طريقة لاستعادة الملفات.

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

يتحكم إعداد واحد في التنظيف: cleanupPeriodDays. قيمته الافتراضية 30. في كل مرة يبدأ فيها Claude Code، يفحص مجلد السجل ويحذف كل ما تجاوز هذه المدة. لم يكن هذا الإعداد موجودًا أصلًا في ~/.claude/settings.json لدي، ما يعني أن القيمة الافتراضية كانت سارية، وأن بعض جلساتي القديمة قد اختفت بالفعل.

توجد عدة بلاغات عن أخطاء بهذا الشأن مفتوحة في مستودع Anthropic، ولم يُصلح أي منها.

أين يخزّن Claude Code سجل الجلسات؟

أهم النقاط

يُخزَّن سجل كل جلسة في ~/.claude/projects/<project-path>/<session-id>.jsonl. يمثل اسم المجلد المسار المطلق لدليل العمل الذي شغّلت منه Claude Code، مع استبدال الشرطات المائلة بواصلات. يحتوي ملف .jsonl على المحادثة كاملة، سطرًا بسطر: مطالباتك، وردود النموذج، واستدعاءات الأدوات، وتعديلات الملفات. وهذا هو بالضبط ما يحذفه التنظيف.

من السهل العثور على سجلك. افتح الطرفية وألقِ نظرة على محتويات المجلد:

ls ~/.claude/projects/

كل مجلد فرعي يمثل مشروعًا منفصلًا. ويشفّر اسمه المسار: على سبيل المثال، يصبح المشروع الموجود في /Users/alex/dev/shop داخل المجلد -Users-alex-dev-shop. وتوجد ملفات الجلسات بداخله:

ls -lt ~/.claude/projects/-Users-alex-dev-shop/
# 3f8a1c2e-....jsonl   ← جلسة واحدة = ملف واحد
# a91b7d40-....jsonl

كل ملف .jsonl سجلٌّ سطرًا بسطر: كل سطر يساوي حدثًا واحدًا في الجلسة. ولا يقتصر محتواه على نص المحادثة؛ فهو يحمل منطق قراراتك: لماذا اخترت بنية معينة لقاعدة البيانات، وما الخيارات التي رفضتها، وأين أخطأت Claude، وكيف صححت الخطأ.

إنه، في جوهره، يوميات تطوير المشروع. لهذا يؤلم فقدانه: فأنت لا تفقد «دردشة»، بل سياقًا بنيته على مدى أسابيع. تناولت بنية هذا السياق في دليل «Claude Memory vs. CLAUDE.md».

لماذا تحذف Anthropic النصوص بعد 30 يومًا؟

أهم النقاط

تستند Anthropic إلى الخصوصية والأمان. تُخزَّن ملفات الجلسات على القرص بنص عادي، وقد تحتوي على شيفرة مصدرية وكلمات مرور ومفاتيح API. والاحتفاظ بها إلى الأبد ينطوي على مخاطر: فإذا سُرق حاسوب محمول أو وصل شخص ما إلى القرص، فسيحصل على كل تلك البيانات الحساسة. وتمثل مدة الثلاثين يومًا حلًا وسطًا بين «استئناف العمل مؤخرًا» و«عدم الاحتفاظ بالأسرار على القرص مدة أطول من اللازم».

هناك مبرر للحذف، ومن المفيد فهمه قبل إيقافه تمامًا. فالنص المنسوخ للمحادثة عاديٌّ غير مشفّر. إذا قرأت Claude ملف .env أثناء جلسة، أو أدرجت مفتاحًا في أمر، أو لصقت كلمة مرور في مطالبة، فسينتهي كل ذلك في ملف .jsonl كنص عادي. وكلما بقي مثل هذا الملف على القرص مدة أطول، زاد احتمال تسريبه يومًا ما.

توضح Anthropic موقفها بصراحة: قد تحتوي النصوص على شيفرة مصدرية وبيانات اعتماد ومواد حساسة أخرى، والاحتفاظ بها على القرص مدة أطول من اللازم يشكل خطرًا حقيقيًا على الخصوصية. وقد اختيرت مدة الثلاثين يومًا كحل وسط.

تتعلق اعتراضات المجتمع بثلاثة أمور: الحذف صامت (لا يوجد تحذير أثناء الإعداد أو عند بدء التشغيل)، ولا تُطلب الموافقة (فلا يُسأل المستخدم)، ولا توجد إمكانية للاستعادة (إذ لا تُستخدم سلة المهملات ولا توجد طريقة للتراجع). في المسألة #59248، يطلب المطورون أمرًا واحدًا: جعل التنظيف منصفًا، عبر توفير تحذير وفترة للاستعادة ومدة افتراضية أقل تشددًا.

لماذا قد يؤدي برنامج النسخ الاحتياطي نفسه إلى الحذف؟

أهم النقاط

يحدد التنظيف الملفات المراد حذفها استنادًا إلى وقت تعديل الملف (mtime). ولا يتحقق من آخر نشاط فعلي في الجلسة. فأي عملية تلمس ملف .jsonl — مثل مزامنة سحابية أو rsync أو محرر أو برنامج نصي — يمكنها تغيير mtime، فتبدو جلسة حديثة وكأنها قديمة. وعند بدء Claude Code في المرة التالية، سيعتبر الجلسة قديمة ويحذفها. والمفارقة أن محاولة ساذجة لنسخ السجل احتياطيًا داخل المجلد المُدار تسرّع فقدانه.

هذا هو الجزء الأصعب، وكثيرًا ما يقع فيه من يحاولون حماية بياناتهم بأنفسهم. يفحص التنظيف mtime، أي الطابع الزمني لآخر تعديل للملف. ويفترض أن mtime يعكس آخر مرة عملت فيها على الجلسة. لكن أي شيء قد يغيره عمليًا: عميل مزامنة Dropbox أو iCloud، أو rsync، أو برنامج مكافحة الفيروسات، أو أداة فهرسة، أو برنامج النسخ الاحتياطي الخاص بك.

إليك الفخ. تقرر حفظ سجلك وتُعدّ مزامنة سحابية للمجلد ~/.claude/projects/. وفي وقت ما، تعيد خدمة المزامنة كتابة ملف وتضبط mtime الخاص به على تاريخ أقدم (قد يحدث ذلك عند الاستعادة من نسخة سحابية). ترى Claude Code عند بدء التشغيل ملفًا «قديمًا» فتحذفه. أردت حفظه، لكنك عجلت بحذفه.

هناك نتيجة واحدة فقط: يجب أن تكون النسخة الاحتياطية خارج ~/.claude/projects/. فالتنظيف لا يعمل إلا داخل هذا المجلد. أما النسخة المخزنة خارجه فهي بعيدة عن متناوله. سأبني الحل على هذا المبدأ.

كيف توقف حذف السجل الآن؟

أهم النقاط

إعداد واحد يكفي. افتح ~/.claude/settings.json واضبط cleanupPeriodDays على قيمة كبيرة، مثل 3650 (عشر سنوات). وهذا يعطل الحذف التلقائي عمليًا: فلن يتجاوز شيء هذا الحد. مهم: يحمي هذا الإعداد ما لم يُحذف بعد فقط. لا يمكن استعادة السجل الذي سبق أن حذفه التنظيف. لذلك، خطوتك الأولى هي التصرف قبل أن تفقد جلسة أخرى.

أوقف الحذف في ثلاث خطوات:

  1. افتح ملف الإعدادات: ~/.claude/settings.json (أنشئ الملف إذا لم يكن موجودًا).
  2. أضف إعداد cleanupPeriodDays بقيمة كبيرة:
{
  "cleanupPeriodDays": 3650
}
  1. احفظ الملف. سيدخل الإعداد حيّز التنفيذ عند بدء Claude Code في المرة التالية.

تعني القيمة 3650 عشر سنوات؛ وعمليًا لن يحدث الحذف بعد ذلك. إذا أردت الإبقاء على التنظيف مع منحك مزيدًا من الوقت، فاضبطها على 365 (سنة واحدة)، وعندئذ لن تختفي إلا الجلسات الأقدم من سنة. ويمكنك التحقق من تطبيق الإعداد باستخدام هذا الأمر:

grep cleanupPeriodDays ~/.claude/settings.json

هناك ملاحظة يسهل إغفالها: تمديد المدة لا يعيد ما حُذف بالفعل. يُشغَّل التنظيف عند بدء التشغيل، وكل ما مُحي في عمليات التشغيل السابقة ضاع إلى الأبد. لذلك ينبغي ضبط هذا الإعداد أولًا؛ فهو يمنع الخسائر المستقبلية لكنه لا يعيد ما مُحي من قبل. إذا أردت تجنب فقدان سجل Claude Code ومشروعك بسبب أمر عَرَضي، فراجع دليل «كيفية إعداد Claude Code كيلا يتلف مشروعك».

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

كيف تؤرشف السجل تلقائيًا خارج مجلد التنظيف؟

أهم النقاط

انسخ الجلسات إلى أرشيف خارج ~/.claude/projects/، حيث لا يسري التنظيف. تكفي عملية rsync -a بسيطة مرة يوميًا إلى دليل منفصل: تُضاف الملفات الجديدة وتبقى القديمة. وبما أن الأرشيف خارج المجلد، فلن يتأثر بـ cleanupPeriodDays ولا بمشكلة mtime. أتمت التشغيل باستخدام launchd في macOS أو cron في Linux، وسيتراكم سجلك تلقائيًا.

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

  1. أنشئ مجلد أرشيف خارج الدليل المُدار:
mkdir -p ~/claude-history-archive
  1. انسخ سجلك الحالي إليه. يحافظ الخيار -a على البنية والطوابع الزمنية؛ ويترك --ignore-existing الملفات التي سبق نسخها دون تغيير:
rsync -a ~/.claude/projects/ ~/claude-history-archive/
  1. أتمت التشغيل مرة يوميًا. استخدم launchd على macOS. أنشئ الملف ~/Library/LaunchAgents/com.example.claudearchive.plist:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>com.example.claudearchive</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/bin/rsync</string>
    <string>-a</string>
    <string>/Users/YOUR_NAME/.claude/projects/</string>
    <string>/Users/YOUR_NAME/claude-history-archive/</string>
  </array>
  <key>StartInterval</key>
  <integer>86400</integer>
</dict>
</plist>
  1. حمّل الوكيل ليعمل في الخلفية:
launchctl load ~/Library/LaunchAgents/com.example.claudearchive.plist

على Linux، يكفي إضافة سطر إلى crontab (crontab -e):

0 3 * * * rsync -a ~/.claude/projects/ ~/claude-history-archive/

لماذا تنجح هذه الطريقة بينما تفشل المزامنة المذكورة في القسم السابق؟ الأرشيف خارج ~/.claude/projects/، ولذلك لا يستطيع التنظيف رؤيته أصلًا. يجري النسخ في اتجاه واحد (من المجلد النشط إلى الأرشيف)، ولا نغيّر mtime للملفات النشطة، لذا لا تقع مشكلة mtime. وحتى لو حذف Claude Code جلسة من مجلده غدًا، فستظل نسختها في الأرشيف.

كيف تحول أرشيف جلساتك إلى عقل ثانٍ قابل للبحث؟

أهم النقاط

ضع الأرشيف تحت إدارة git، لتحصل على قاعدة بيانات مؤرخة بالإصدارات وقابلة للبحث بالكامل تضم جميع جلساتك. شغّل git init في مجلد الأرشيف، ثم نفّذ يوميًا git add -A && git commit لتحصل على سجل للتغييرات وحماية من الاستبدال العرضي. يمكنك البحث في الجلسات السابقة باستخدام grep العادي واستخراج المحتوى المنظم باستخدام jq، لأن .jsonl عبارة عن JSON مفصول بأسطر. وهكذا يتحول الأرشيف إلى أداة عملية.

لا يكفي جمع الملفات؛ بل يجب أن تتمكن من الوصول إليها. ثمة خطوتان تحولان الأرشيف إلى أداة فعالة.

أولًا، استخدم git لإدارة الإصدارات. هيّئ مستودعًا في مجلد الأرشيف:

cd ~/claude-history-archive
git init
git add -A && git commit -m "First snapshot of Claude Code history"

أضف git add -A && git commit إلى عملية rsync اليومية نفسها. وهكذا يصبح لديك سجل للإصدارات: يمكنك معرفة ما ظهر ومتى، والتراجع عن استبدال عَرَضي بأمر واحد.

ثانيًا، ابحث. ملفات .jsonl هي ملفات JSON مفصولة بأسطر، لذا يمكنك استخدام أدواتك المعتادة معها. اعثر على الجلسة التي تناولت موضوعًا معينًا:

grep -rl "database migration" ~/claude-history-archive/

استخرج نص مطالباتك فقط من جلسة (باستخدام jq لأن الملف بتنسيق JSON):

jq -r 'select(.type=="user") | .message.content' session.jsonl

عند هذه المرحلة، يبدأ سجل جلساتك بالعمل كعقل ثانٍ للمشروع: قاعدة بيانات تتيح لك استرجاع «كيف اتخذنا هذا القرار في مارس؟» خلال ثوانٍ. ولشرح منفصل لما يحدث للسياق في الجلسة وكيفية إدارته، راجع «إلى أين تذهب الرموز في Claude Code».

هل يمكنك استعادة الجلسات التي حُذفت بالفعل؟

أهم النقاط

لا توجد طريقة مدمجة للاستعادة. لا يضع Claude Code الملفات المحذوفة في سلة المهملات ولا يحتفظ بسجل للتراجع؛ إذ يُمحى الملف نهائيًا. الاحتمال الوحيد هو وجود نسخ خارجية أُنشئت قبل الحذف: لقطة من Time Machine على macOS، أو سجل إصدارات OneDrive أو Dropbox، أو نسخة احتياطية يدوية. إذا لم يوجد أيٌّ منها، فقد ضاعت الجلسة. لذلك يجب إعداد الحماية مسبقًا، قبل أن يصبح لديك ما تخسره.

الجواب الصريح: على الأرجح لا. لا يملك Claude Code ميزة استعادة، ولا سلة مهملات، ولا سجل تراجع للنصوص المحذوفة. يختفي الملف ببساطة من القرص.

هناك خيار واحد: نسخ النظام الاحتياطية، إذا كانت مفعّلة مسبقًا:

  1. Time Machine في macOS — إذا تضمنت لقطةٌ المجلد ~/.claude/projects/ قبل الحذف، فيمكنك استرجاع الملف من النسخة الاحتياطية للتاريخ المطلوب.
  2. سجل إصدارات OneDrive / Dropbox — إذا كانت مزامنة المجلد مفعّلة مع حفظ الإصدارات، فابحث عن الملف في سجل الإصدارات السحابي (لكن تذكّر فخ mtime: فقد تكون المزامنة نفسها قد تسببت في الحذف).
  3. نسخ يدوية — أي عملية rsync/cp شغّلتها يدويًا إلى مكان خارج المجلد المُدار.

إذا لم توجد أي من هذه النسخ، فقد ضاعت الجلسة. وهذا ليس أمرًا نادرًا: فقد أُفسدت 26 من أصل 38 سجلًا لدى أحد أصحاب بلاغ عن خطأ في مستودع Anthropic، وهو ما يمثل أشهرًا من العمل. الحماية الوحيدة الموثوقة هي الحماية التي وُضعت قبل الفقدان. اضبط cleanupPeriodDays والأرشفة التلقائية اليوم، ما دام هناك شيء يمكن حفظه.

ما القيمة التي ينبغي اختيارها لـ cleanupPeriodDays؟

أهم النقاط

بالنسبة إلى معظم الناس، استخدم 3650 (عشر سنوات، ما يعطل الحذف فعليًا) مع أرشيف تلقائي خارجي. أبقِ القيمة الافتراضية 30 فقط إن لم تكن بحاجة إلى السجل وكان الأهم لديك ألا تحتفظ بالأسرار على القرص. تمثل 365 حلًا وسطًا معقولًا، إذ يتم التنظيف سنويًا. وهناك خيار آخر هو عدم كتابة السجل أصلًا: استخدم متغير البيئة CLAUDE_CODE_SKIP_PROMPT_HISTORY أو الخيار --no-session-persistence، لكن الغرض من ذلك هو عكس ما سبق.

هناك إعداد واحد، لكنه يؤدي أغراضًا مختلفة. قارن الخيارات واختر ما يناسب حالتك:

القيمةما تفعلهلمن تناسب
30 (الافتراضية)تحذف عند بدء التشغيل الجلسات التي مرّ عليها أكثر من 30 يومًالا تحتاج إلى السجل؛ والأهم لديك تجنب تخزين البيانات الحساسة على القرص
365تحتفظ بسجل سنة، ثم تنظفه مرة سنويًاتحتاج إلى سجل حديث، لكنك لا تحتاج إلى أرشيف دائم
3650تعطل الحذف فعليًاتريد الاحتفاظ بكل شيء + أرشيف خارجي (موصى به)
CLAUDE_CODE_SKIP_PROMPT_HISTORYلا تكتب السجل على القرص إطلاقًاأقصى قدر من الخصوصية؛ لا تحتاج إلى السجل أصلًا

ثمة ملاحظة أمنية مهمة: إذا ضبطت القيمة على 3650 واحتفظت بكل شيء، فأنت توافق على تخزين نصوص قد تحتوي على مفاتيح وشيفرة على القرص. وهذا حل وسط مقصود بين سهولة الأرشفة والمخاطر. قلّل المخاطر: احتفظ بالأرشيف على قرص مشفّر (FileVault على macOS)، ولا تضعه في سحابة عامة، ولا تدفع به إلى مستودع git عام. أعددت دليلًا منفصلًا عن البيانات التي قد تتسرب عبر Claude Code: «أمان البيانات في Claude Code».

ما الذي ينبغي فعله اليوم: قائمة تحقق

أهم النقاط

تقلل هذه الخطوات فقد السجل: مدّد الاحتفاظ باستخدام cleanupPeriodDays: 3650، وانسخ الجلسات خارج ~/.claude/projects/، وسجّل إصدارات الأرشيف. تحمى من تنظيف Claude Code الملفات المنسوخة بنجاح فقط. يترك الجدول اليومي حتى يوم من التغييرات الحديثة بلا أرشفة عندما تنجح التشغيلات؛ وتزيد التشغيلات الفاشلة أو الفائتة الفجوة. النسخة على القرص نفسه ليست حماية من تعطل القرص.

أعدّ الحماية خطوة بخطوة:

  1. اضبط cleanupPeriodDays: 3650 في ~/.claude/settings.json — بذلك تكون قد أوقفت الحذف.
  2. أنشئ ~/claude-history-archive خارج المجلد المُدار وشغّل أول عملية rsync -a.
  3. جدْول تشغيلًا يوميًا باستخدام launchd في macOS أو cron في Linux.
  4. هيّئ git في الأرشيف وأضف git add -A && git commit إلى التشغيل نفسه.
  5. تحقق من أن الأرشيف موجود على قرص مشفّر وغير متزامن مع سحابة عامة.
  6. افحص نجاح النسخ في كل تشغيل مجدول، ثم راجع جلسة حديثة مؤرشفة، واستعد عينة دوريًا إلى مجلد مؤقت مستقل للتحقق من قابليتها للقراءة.
  7. إذا شمل الخطر فقد الجهاز أو القرص، فاحتفظ بنسخة احتياطية مستقلة التخزين بضوابط وصول مناسبة واختبر استعادتها أيضًا. سجل Git على القرص نفسه ليس نسخة احتياطية مستقلة.

ليس سجل الجلسات سوى طبقة واحدة من السياق التي تجعل Claude موثوقًا.

تعرّف على Ailoot.

المزيد من التفاصيل

أسئلة شائعة

هل يضمن الأرشيف اليومي عدم فقد أي جلسة؟

لا. يحمي الملفات المنسوخة بنجاح من تنظيف المجلد المدار. مع تشغيلات يومية ناجحة، قد يغيب حتى يوم من التغييرات الحديثة؛ وتوسّع الإخفاقات الفجوة، وقد تتعطل نسخة على القرص نفسه مع الأصل.

كيف أفحص صلاحية الأرشيف؟

أكد نجاح النسخ المجدول، وافحص جلسة مؤرشفة حديثة، واستعد عينة دوريًا إلى مجلد مؤقت مستقل. وللحماية من فقد الجهاز أو القرص، اختبر أيضًا نسخة احتياطية مخزنة مستقلة عن الأصل.

جميع المقالات