SSD Nodes Learn 🎉 VPS از $5.50/ماه
راهنماها Matt Connorتوسط Matt Connor

آموزش از سرگیری نشست در Claude Code و دسترسی به تاریخچه

برای بازگرداندن نشست Claude Code از دستور resume استفاده کنید یا با دستور sessions لیست گفت‌وگوها را ببینید. تمام تاریخچه در فایل‌های متنی روی سیستم شما ذخیره شده است.

چگونه یک نشست Claude Code را از سر بگیریم

برای از سرگیری یک نشست Claude Code، دستور claude --continue را برای آخرین گفت‌وگو در دایرکتوری فعلی اجرا کنید، یا از claude --resume برای انتخاب یک گفت‌وگوی قدیمی‌تر از لیست استفاده نمایید. از داخل نشستی که در حال اجراست، دستور /resume شما را بدون خروج از برنامه به گفت‌وگوی دیگری منتقل می‌کند. فرم‌های کوتاه این دستورات -c و -r هستند.

claude --continue
claude --resume
claude --resume auth-refactor

اگر نام نشست یا شناسه آن را از قبل می‌دانید، آن را به عنوان آرگومان وارد کنید تا Claude Code بدون نمایش لیست انتخاب، مستقیماً به همان نشست برود.

تمام موارد زیر با مستندات رسمی نشست تا اوت 2026 مطابقت دارد. Claude Code به‌طور مکرر به‌روزرسانی می‌شود و نام فلگ‌ها و میان‌برهای صفحه‌کلید ممکن است بین نسخه‌ها تغییر کنند؛ بنابراین اگر موردی در اینجا با آنچه در ترمینال خود می‌بینید متفاوت بود، claude --help و آن صفحه را به عنوان مرجع معتبر در نظر بگیرید.

ماهیت واقعی یک نشست (Session)

یک نشست، در واقع یک گفتگوی ذخیره‌شده است که به دایرکتوری پروژه متصل می‌شود. این نشست تمام تاریخچه پیام‌ها، از جمله فراخوانی ابزارهایی که Claude انجام داده و نتایج بازگشتی از آن‌ها را در خود نگه می‌دارد. Claude Code این اطلاعات را به‌طور مداوم در حین کار شما روی دیسک می‌نویسد (نه فقط یک‌بار در پایان کار)؛ بنابراین گفتگو با بستن ترمینال یا قطع اتصال SSH از بین نمی‌رود.

ازسرگیری (Resuming) یک نشست، چیزی فراتر از متن را بازیابی می‌کند. تاریخچه گفتگو به‌طور کامل بازمی‌گردد، به همراه مدلی که نشست از آن استفاده می‌کرد و زیرعاملی (subagent) که اگر از --agent استفاده کرده باشید، نشست با آن آغاز شده بود. حالت مجوزها (permission mode) نیز بازمی‌گردد، البته با استثنائاتی که برای امنیت اعمال شده‌اند: حالت‌های plan mode و bypass-permissions mode هرگز بازیابی نمی‌شوند؛ بنابراین نشستی که در یکی از این حالت‌ها بوده، در حالتی ازسرگرفته می‌شود که یک نشست جدید با آن شروع می‌شد.

برخی موارد بازیابی نمی‌شوند، زیرا آن‌ها فلگ‌های زمان راه‌اندازی هستند و نه وضعیت ذخیره‌شده. دایرکتوری‌هایی که با --add-dir اضافه شده‌اند و گزینه‌هایی مانند --mcp-config، --settings و --plugin-dir، باید هنگام ازسرگیری دوباره وارد شوند. فایل‌های تنظیمات مانند settings.json در زمان راه‌اندازی مجدداً خوانده می‌شوند، بنابراین هر چیزی که در آن‌ها قرار دارد نیازی به تکرار ندارد.

چرا تاریخچه نشست‌ها در VPS اهمیت بیشتری دارد

این واقعیتی است که بسیاری را غافلگیر می‌کند. رونوشت (transcript) روی همان ماشینی نوشته می‌شود که عامل (agent) در آن اجرا شده است. این اطلاعات در حساب کاربری شما نگهداری نمی‌شود و با فضای ابری همگام‌سازی نمی‌شود. این داده‌ها صرفاً فایلی روی دیسک همان دستگاه هستند.

بنابراین، نشستی که در یک پنجره tmux روی VPS خود رها کرده‌اید، در انتخابگر (picker) لپ‌تاپ شما ظاهر نمی‌شود و نشست لپ‌تاپ شما نیز در VPS دیده نخواهد شد. هیچ چیزی بین آن‌ها جابه‌جا نمی‌شود. اگر به روشی کار می‌کنید که اکثر افراد هنگام اجرای Claude Code در tmux روی یک VPS انجام می‌دهند، سرور جایی است که تاریخچه واقعی گفتگوهای شما در آن انباشته می‌شود و انتخابگری که به‌صورت محلی می‌بینید، مجموعه متفاوت و بسیار کوچک‌تری را نمایش می‌دهد.

همین جداسازی در رابط‌های کاربری مختلف نیز صدق می‌کند. اپلیکیشن دسکتاپ و افزونه VS Code هر کدام تاریخچه نشست‌های خاص خود را نگه می‌دارند و هیچ‌کدام از آن‌ها تاریخچه CLI نیستند. Claude Code در وب نیز تاریخچه مختص به خود را دارد.

در داخل یک ماشین، جستجو گسترده‌تر از آن چیزی است که انتظار دارید. claude --resume <session-id> ابتدا در دایرکتوری پروژه فعلی و git worktreeهای آن جستجو می‌کند و سپس به سراغ تمام پروژه‌های دیگر روی همان ماشین می‌رود. عبارتی که باید به خاطر بسپارید این است: «روی همان ماشین». شناسه نشست (session ID) مربوط به یک میزبان دیگر به هیچ نتیجه‌ای نمی‌رسد و Claude Code با No conversation found with session ID: <session-id> این موضوع را به شما اعلام می‌کند.

Claude Code تاریخچه نشست‌ها را کجا ذخیره می‌کند

به‌طور پیش‌فرض، رونوشت‌ها در دایرکتوری پیکربندی Claude Code و در مسیری با فرمت ~/.claude/projects/<project>/<session-id>.jsonl قرار دارند.

<project> مسیر دایرکتوری کاری شماست که در آن تمام کاراکترهای غیرحروف‌عددی با خط تیره جایگزین شده‌اند؛ بنابراین نشستی که در /home/deploy/apps/api آغاز شود، در دایرکتوری با نام -home-deploy-apps-api ذخیره می‌گردد. اگر طول این نام تبدیل‌شده از 200 کاراکتر فراتر رود، Claude Code آن را کوتاه کرده و یک هش از مسیر کامل به آن اضافه می‌کند تا نام دایرکتوری در محدودیت‌های سیستم فایل باقی بماند.

فایل مذکور از نوع JSONL است: هر خط شامل یک شیء JSON است که می‌تواند یک پیام، استفاده از ابزار یا یک ورودی متادیتا باشد. این فایل متنی خوانا است و خواندن آن مشکلی ندارد.

اما نوشتن یک پارسر برای آن توصیه نمی‌شود. فرمت ورودی‌ها داخلی است و بین نسخه‌های مختلف Claude Code تغییر می‌کند؛ بنابراین اسکریپتی که این فایل‌ها را مستقیماً می‌خواند، ممکن است با هر به‌روزرسانی از کار بیفتد. مستندات رسمی Anthropic توصیه می‌کند که از /export یا رابط‌های اسکریپتی مستندشده استفاده کنید که دقیقاً به همین دلیل، توصیه‌ای منطقی است.

دو تنظیمات می‌توانند این رفتار را تغییر دهند. CLAUDE_CONFIG_DIR کل دایرکتوری پیکربندی را جابه‌جا می‌کند؛ این روشی است که می‌توانید رونوشت‌ها را روی یک پارتیشن جداگانه یا یک درایو رمزنگاری‌شده قرار دهید. cleanupPeriodDays در فایل settings.json تعیین می‌کند که این فایل‌ها تا چه مدت نگهداری شوند؛ مقدار پیش‌فرض آن 30 روز و حداقل آن 1 روز است.

محتوای واقعی این فایل‌های رونوشت چیست

نتیجهٔ هر ابزار ثبت می‌شود؛ این یعنی یک رونوشت شامل محتوای فایل‌هایی است که Claude خوانده و خروجی دستوراتی است که اجرا کرده است. صفحهٔ استفاده از داده شرکت Anthropic این موضوع را به‌صراحت بیان می‌کند: Claude Code رونوشت‌های نشست را به‌صورت متن ساده (plaintext) در مسیر ~/.claude/projects/ به‌صورت محلی ذخیره می‌کند.

به این فکر کنید که این موضوع روی یک سرور چه معنایی دارد. اگر Claude یک فایل .env را خوانده باشد تا بفهمد چرا یک سرویس اجرا نمی‌شود، محتوای آن فایل اکنون در یک فایل JSONL در دایرکتوری home شما قرار دارد. اگر یک دستور، رشتهٔ اتصال (connection string) را چاپ کرده باشد، آن رشته نیز در آنجا موجود است. هیچ‌چیز نشت نکرده است؛ رونوشت صرفاً آنچه رخ داده را ثبت کرده که دقیقاً هدف اصلی آن است و به همین دلیل است که باید آن را در مدل تهدید (threat model) خود لحاظ کنید.

  • پشتیبان‌گیری‌ها: یک نسخهٔ پشتیبان ساده از /home یا /root، رونوشت‌های شما را به هر مقصدی که پشتیبان‌ها در آن ذخیره می‌شوند، کپی می‌کند. یک استثنا (exclusion) اضافه کنید یا بپذیرید که نسخه‌هایی از پرامپت‌ها و محتوای فایل‌های شما اکنون در فضای ذخیره‌سازی پشتیبان‌تان وجود دارد.
  • اسنپ‌شات‌ها و ایمیج‌ها: اسنپ‌شات یک VPS که به هر دلیلی گرفته شود، شامل کل دایرکتوری است. همین‌طور ایمیجی که برای ساخت سرور دوم از آن کلون می‌گیرید.
  • سایر حساب‌های کاربری روی سیستم: به‌جای فرض کردن اینکه دسترسی‌ها محدود هستند، خودتان مجوزها را با ls -ld ~/.claude ~/.claude/projects بررسی کنید.
  • آپلودهای عمدی: دستور /feedback تاریخچهٔ گفتگو را به‌صورت آگاهانه برای Anthropic ارسال می‌کند و /bug و /share نیز از همین مسیر گزارش می‌دهند. این‌ها مواردی هستند که شما انتخاب می‌کنید انجام دهید، بنابراین پیش از تأیید، بدانید با چه چیزی موافقت می‌کنید.

اگر ترجیح می‌دهید هیچ رونوشتی وجود نداشته باشد، CLAUDE_CODE_SKIP_PROMPT_HISTORY نوشتن رونوشت را متوقف می‌کند و --no-session-persistence آن را برای یک اجرای غیرتعاملی claude -p غیرفعال می‌سازد. پیش از تنظیم هر یک، از پیامدهای آن آگاه باشید. رونوشت‌ها همان چیزی هستند که قابلیت resume از آن‌ها استفاده می‌کند، بنابراین نبود رونوشت به معنای عدم امکان resume است.

چگونه یک گفتگوی قدیمی را پیدا کنیم

انتخاب‌گر (picker) را با claude --resume یا از داخل یک نشست در حال اجرا با /resume باز کنید. هر ردیف، نام نشست (در صورت تعیین) یا عنوانی که به‌طور خودکار تولید شده است، زمان سپری‌شده از آخرین فعالیت، شاخه git و حجم فایل را نمایش می‌دهد.

این انتخاب‌گر قابلیت جستجو دارد. برای فیلتر کردن لیست، / را فشار دهید یا بلافاصله شروع به تایپ کنید. میانبرهایی که دامنه جستجو را گسترش می‌دهند بسیار کاربردی هستند: Ctrl+A نشست‌های تمام پروژه‌های موجود در این ماشین را نشان می‌دهد، Ctrl+W تمام worktreeهای مخزن فعلی را نمایش می‌دهد و Ctrl+B لیست را به شاخه فعلی git محدود می‌کند. برای پیش‌نمایش محتوای یک نشست پیش از انتخاب نهایی، Space را فشار دهید و برای تغییر نام مورد انتخاب‌شده، از Ctrl+R استفاده کنید.

نام‌گذاری نشست‌ها مدیریت این موارد را بسیار آسان‌تر می‌کند. با claude -n auth-refactor یک نشست را نام‌گذاری کنید یا در میانه‌های کار، زمانی که متوجه شدید گفتگو به یک پروژه جدی تبدیل شده است، دستور /rename auth-refactor را اجرا کنید. پس از نام‌گذاری، نشست مستقیماً از طریق shell و با استفاده از نام آن قابل بازیابی است.

نشست‌های بدون نام نیز یک عنوان تولیدشده دریافت می‌کنند که توسط یک درخواست پس‌زمینه به یک مدل کوچک و سریع برای خلاصه‌سازی اولین prompt شما نوشته می‌شود. این عنوان به شما کمک می‌کند تا ردیف مورد نظر را در انتخاب‌گر تشخیص دهید، اما به عنوان دستگیره (handle) برای بازیابی عمل نمی‌کند. claude --resume <name> فقط با نام‌هایی که خودتان تعیین کرده‌اید مطابقت دارد.

جستجوی رونوشت‌ها برای یافتن نشست مناسب

گاهی اوقات فقط یک عبارت را به خاطر می‌آورید و هیچ چیز دیگری در ذهن ندارید. از آنجایی که رونوشت‌ها متنی هستند، می‌توانید در آن‌ها جستجو کنید.

grep -rl "nftables" ~/.claude/projects/

این دستور مسیر رونوشت‌های منطبق را چاپ می‌کند. نام فایل بدون پسوند .jsonl همان شناسه نشست است و claude --resume <session-id> آن را می‌پذیرد. از grep استفاده کنید تا مشخص کنید به کدام نشست نیاز دارید، سپس آن را از سر بگیرید یا برای خواندن، خروجی بگیرید.

دو نکته مهم: محتوا به صورت JSON-escaped است؛ بنابراین عبارتی که شامل کاراکترهای نقل‌قول باشد یا در خطوط مختلف شکسته شده باشد، ممکن است به عنوان یک رشته دقیق (literal string) مطابقت پیدا نکند. همچنین، تطابق در نتایج ابزار به این معناست که Claude آن متن را دیده است، نه اینکه کسی آن را تایپ کرده باشد.

خواندن و خروجی گرفتن از گفتگو

/export گفتگوی فعلی را به صورت متن ساده نمایش می‌دهد، به‌طوری که پیام‌ها و خروجی ابزارها به جای فرمت JSON، به شکلی خوانا نوشته می‌شوند. بدون آرگومان، این دستور منویی را باز می‌کند که امکان کپی در کلیپ‌بورد یا ذخیره در فایل را فراهم می‌سازد. با تعیین یک نام فایل، /export handover.txt مستقیماً در آن مسیر می‌نویسد. این روش مناسب‌ترین راه برای انتقال یک گفتگو از سرور به لپ‌تاپ یا ضمیمه کردن آن به یک تیکت است.

برای هرگونه عملیات خودکار، از رابط‌هایی استفاده کنید که برای پایداری طراحی شده‌اند. هوک‌ها و دستورات خط وضعیت، فیلد transcript_path را به عنوان ورودی دریافت می‌کنند، بنابراین یک هوک SessionEnd می‌تواند هنگام پایان یک نشست، رونوشت آن را آرشیو کند. همچنین می‌توانید بدون باز کردن یک نشست ذخیره‌شده، از آن سوال بپرسید:

claude -p --resume <session-id> --output-format json "summarize what we changed" | jq -r '.result'

این دستور یک پرامپت پیگیری را به گفتگوی قدیمی ارسال کرده و خروجی را به صورت JSON ساختاریافته بازمی‌گرداند. این روش، بنیادی بسیار مطمئن‌تر از تجزیه فرمت JSONL است که ممکن است در نسخه بعدی تغییر کند.

شروع تازه بهتر از ادامه دادن است

ادامه دادن یک نشست، کل تاریخچه را بازمی‌گرداند و هر درخواست بعدی، تمام این تاریخچه را با خود حمل می‌کند. ادامه دادن گفتگویی که دیروز چهار ساعت طول کشیده است، امروز هزینه‌بر خواهد بود و چگونگی افزایش مصرف توکن در یک نشست طولانی توضیح می‌دهد که این هزینه دقیقاً از کجا ناشی می‌شود.

Claude Code گاهی راه میانه‌ای پیشنهاد می‌دهد. در طرح‌های Pro یا Max، اگر نشستی بیش از یک ساعت غیرفعال بوده و بیش از 100,000 توکن داشته باشد، پیش از ارسال اولین پیام، یک کادر گفتگو باز می‌شود. در آن زمان، کشِ پرامپت منقضی شده است، بنابراین فارغ از گزینه‌ای که انتخاب کنید، درخواست بعدی یک بار کل تاریخچه را بازپردازش می‌کند.

  • گزینه Resume from summary بلافاصله یک فشرده‌سازی انجام می‌دهد تا درخواست‌های بعدی به‌جای کل تاریخچه، فقط یک خلاصه را حمل کنند. این کار هزینه هر درخواست را کاهش می‌دهد، اما آنچه در خلاصه حذف شده است دیگر در دسترس نخواهد بود.
  • گزینه Resume full session as-is گفتگو را بدون تغییر بارگذاری می‌کند و تمام جزئیات را با هزینه‌ای که متناسب با اندازه گفتگو است، در هر درخواست حفظ می‌کند.

گزینه سوم، نشست را به‌طور کامل ادامه می‌دهد و از نمایش مجدد این کادر در دفعات بعدی جلوگیری می‌کند.

تصمیم‌گیری در این مورد ساده‌تر از آن است که به نظر می‌رسد. زمانی که گام بعدی شما به آنچه قبلاً گفته شده وابسته است، نشست را ادامه دهید. در غیر این صورت، کار را از نو شروع کنید. تشخیص انحراف (Drift) در صورت توجه به آن آسان است: مثلاً زمانی که Claude به فایلی اشاره می‌کند که یک ساعت پیش حذف کرده‌اید، یا دوباره بر سر تصمیمی بحث می‌کند که در ابتدای نشست نهایی شده بود. این‌ها محتوای قدیمی (stale context) هستند و حمل کردن آن‌ها همزمان باعث هدر رفتن توکن و کاهش دقت می‌شود.

اگر بخش مفید یک گفتگوی قدیمی، تصمیمی است که دوباره به آن نیاز خواهید داشت، برای حفظ آن به ادامه دادن نشست تکیه نکنید. آن را در جایی یادداشت کنید که در تمام نشست‌ها قابل مشاهده باشد؛ این همان کاری است که فایل‌های حافظه Claude Code برای آن طراحی شده‌اند.

دانستن درباره /branch نیز در اینجا مفید است. این دستور گفتگو را تا نقطه فعلی کپی کرده و شما را به نسخه کپی منتقل می‌کند، در حالی که نسخه اصلی دست‌نخورده باقی مانده و همچنان در انتخابگر (picker) موجود است. از این قابلیت برای امتحان کردن یک رویکرد دوم بدون از دست دادن رویکرد اول استفاده کنید.

تفاوت Resume با Compaction و Memory

این مفاهیم دائماً با هم اشتباه گرفته می‌شوند، در حالی که هر کدام مسائل متفاوتی را حل می‌کنند.

قابلیت Resume مربوط به بازگرداندن یک گفتگو پس از خروج، راه‌اندازی مجدد سیستم یا تغییر وظیفه است. قابلیت Compaction مربوط به پنجرهٔ متن (context window) در یک گفتگوی فعال است: /compact محتوایی را که Claude حمل می‌کند با یک خلاصه جایگزین می‌سازد تا درخواست‌های بعدی توکن‌های کمتری مصرف کنند. اگر مشکل شما پر شدن پنجرهٔ متن است، Compaction ابزار مناسب است و مدیریت پنجرهٔ متن Claude Code به‌درستی به آن می‌پردازد.

قابلیت Memory کاملاً متفاوت است. فایل‌های CLAUDE.md و حافظهٔ خودکار (auto memory)، دستورالعمل‌ها و حقایقی را نگه می‌دارند که در ابتدای هر نشست بارگذاری می‌شوند؛ بنابراین این‌ها گفتگویی نیستند که به آن بازگردید. این‌ها مواردی هستند که یادداشت می‌کنید تا هرگز نیازی به بازگشت به یک گفتگوی خاص نداشته باشید.

اگر هدف شما اجرای هم‌زمان دو گفتگو و هماهنگی بین آن‌هاست، این یک مکانیزم جداگانه است. نشست‌های Claude Code می‌توانند به یکدیگر پیام دهند در حالی که هر دو فعال هستند؛ این مسئله با بازیابی نشست دیروز از روی دیسک متفاوت است.

FAQ

Claude Code تاریخچه نشست‌های من را کجا ذخیره می‌کند؟

به‌صورت پیش‌فرض در دایرکتوری پیکربندی شما، در ~/.claude/projects/<project>/<session-id>.jsonl؛ که در آن <project> مسیر دایرکتوری کاری است که کاراکترهای غیرالفبایی آن با خط تیره جایگزین شده‌اند. هر فایل با فرمت JSONL است: یک شیء JSON در هر خط برای یک پیام، یک فراخوانی ابزار یا یک ورودی متادیتا. CLAUDE_CONFIG_DIR دایرکتوری پیکربندی را به مکان دیگری منتقل می‌کند و cleanupPeriodDays در settings.json تعیین می‌کند که رونوشت‌ها تا چه مدت نگهداری شوند؛ مقدار پیش‌فرض 30 روز و حداقل آن 1 روز است.

چرا نمی‌توانم نشست VPS خود را در انتخابگر (picker) روی لپ‌تاپم ببینم؟

زیرا رونوشت‌ها روی دیسک ماشینی که عامل (agent) روی آن اجرا شده است نوشته می‌شوند و هیچ‌گونه همگام‌سازی بین ماشین‌ها وجود ندارد. مکالمه‌ای که داخل tmux روی VPS خود داشته‌اید، فقط روی همان VPS موجود است. آن را از طریق SSH در همان‌جا ادامه دهید، یا اگر به یک نسخه محلی نیاز دارید، /export را در آن اجرا کرده و فایل متنی را کپی کنید.

آیا می‌توانم نشستی را که در دایرکتوری دیگری شروع کرده‌ام، ادامه دهم؟

بله، اگر شناسه نشست (session ID) آن را داشته باشید. claude --resume <session-id> ابتدا در دایرکتوری پروژه فعلی و worktreeهای git آن جستجو می‌کند و سپس در تمام پروژه‌های دیگر روی همان ماشین. داخل انتخابگر، Ctrl+A لیست را به تمام پروژه‌های موجود روی ماشین گسترش می‌دهد و Ctrl+W آن را به تمام worktreeهای مخزن فعلی محدود می‌کند. اگر موردی پیدا نشد، Claude Code پیام No conversation found with session ID: <session-id> را گزارش می‌دهد.

آیا باید یک نشست قدیمی را ادامه دهم یا یک نشست جدید شروع کنم؟

زمانی که پیام بعدی شما به آنچه قبلاً در آن مکالمه گفته شده وابسته است، آن را ادامه دهید. زمانی که این وابستگی وجود ندارد، یک نشست تازه شروع کنید؛ زیرا ادامه دادن یک نشست، کل تاریخچه را بارگذاری می‌کند و هر درخواست بعدی، آن تاریخچه را به همراه خواهد داشت. مراقب انحراف (drift) باشید: نشستی که مدام به فایل‌هایی ارجاع می‌دهد که قبلاً حذف کرده‌اید، حاوی context قدیمی است و این context در هر مرحله، هزینه توکن و دقت شما را کاهش می‌دهد.

آیا می‌توانم از نوشتن رونوشت‌ها روی دیسک توسط Claude Code جلوگیری کنم؟

بله. CLAUDE_CODE_SKIP_PROMPT_HISTORY نوشتن رونوشت‌ها را متوقف می‌کند و --no-session-persistence آن‌ها را برای یک اجرای غیرتعاملی claude -p غیرفعال می‌سازد. ابتدا پیامدهای آن را در نظر بگیرید، زیرا رونوشت‌ها همان چیزی هستند که قابلیت ادامه نشست (resume) از آن‌ها استفاده می‌کند؛ بنابراین غیرفعال کردن آن‌ها به این معنی است که --continue و --resume چیزی برای بارگذاری نخواهند داشت. اگر نگرانی شما محل ذخیره فایل‌هاست و نه اصل وجود آن‌ها، CLAUDE_CONFIG_DIR را به یک volume رمزنگاری‌شده ارجاع دهید و cleanupPeriodDays را کاهش دهید.