انتقل إلى المحتوى الرئيسي

الوحدة 8 — وضع plan، وcheckpoints، والجلسات، وworktrees: العمل بلا خوف

أحكمت الوحدة 7 ما يحقّ لـClaude فعله. تعتني هذه الوحدة بالسؤال التالي: ماذا نفعل حين يفعل Claude شيئًا لم نُرِده، أو حين نرغب في تجريب مسارَين بالتوازي دون أن يُلوّث أحدهما الآخر؟ تتراكم أربع شبكات أمان:

  • وضع plan يمنع الكتابة ما دامت خطّة لم تُصدَّق.
  • checkpoints تُرجع الشيفرة والمحادثة إلى نقطة قبل الحادث.
  • الجلسات تحفظ المحادثات لاستئنافها، وتسميتها، وتقسيمها (/branch)، أو نسخها في الخلفيّة (/fork).
  • worktrees تعزل جلسة كاملة في checkout git مستقلّ.

وضع plan: التفكير قبل الكتابة

يُطلَب من Claude في وضع plan أن يبحث ويقترح تعديلات دون تطبيقها: يقرأ Claude ملفّات، ويُنفِّذ أوامر shell استكشافيّة، ويُحرِّر خطّة؛ تظلّ التحريرات محجوبة حتّى التصديق (باستثناء bypassPermissions).

ندخل plan بـShift+Tab (تدوير)، أو /plan (تبديل لتور)، أو /plan <description> (تبديل وبدء المهمّة الموصوفة)، أو claude --permission-mode plan عند الإطلاق. Shift+Tab مجدّدًا يخرج دون تصديق.

للأوامر shell خلال التخطيط: إن كان auto متاحًا وuseAutoModeDuringPlan نشطًا (افتراضيّ)، يحكم المصنِّف على كلّ أمر — يمرّ الاستكشاف، وتُرفض الكتابة. وإلّا يطلب كلّ أمر خارج read-only، حتّى مع تفعيل auto-allow لـsandbox. في bypassPermissions، لا حاجز.

حين تكون الخطّة جاهزة، يعرضها Claude ويسأل عن التّالي:

  • Yes, and use auto mode — يُصدِّق ويمرّ إلى auto (يصبح Yes, auto-accept edits إن لم يكن auto متاحًا، أو Yes, and switch to BYPASS PERMISSIONS إن كانت الجلسة قد أُطلقت بهذا الوضع).
  • Yes, manually approve edits — يُصدِّق ويعود إلى Manual للموافقة على كلّ تحرير.
  • No, keep planning — يبقى في plan لإعادة العمل.

يفتح Ctrl+G الخطّة في محرِّرك الخارجيّ قبل الحسم؛ إن كان showClearContextOnPlanAccept نشطًا، فخيار يُصدِّق ويفرغ سياق التخطيط. قبول خطّة يمنح الجلسة عنوانًا مُولَّدًا انطلاقًا من الخطّة.

لجعل plan افتراضيًّا في مشروع: permissions.defaultMode: "plan" في .claude/settings.json. إضافة VS Code تقرأ claudeCode.initialPermissionMode في إعدادات المستخدم بدلًا من ذلك. أُزيل الأمر /ultraplan (الإرسال إلى جلسة ويب)؛ استعمل /plan المحلّيّ.

checkpoints: الرجوع بلا خوف

عند كلّ prompt مستخدم، يلتقط Claude Code حالة الملفّات التي مسّتها أدوات التحرير؛ يحتفظ بأحدث 100 لقطة. يفتح /rewind (الأسماء البديلة /checkpoint, /undo) أو Esc مرّتين حين يكون الإدخال فارغًا القائمة. إن كان الإدخال يحوي نصًّا، يُنظّف الضغط المزدوج المسوّدة ويحفظها في السجلّ.

كلّ checkpoint يقترح، بحسب ما التُقط:

الخيارالأثر
Restore code and conversationيُرجع الملفّات والمحادثة.
Restore conversationيُرجع المحادثة، ويُبقي الشيفرة.
Restore codeيُرجع الملفّات، ويُبقي المحادثة.
Summarize from hereيضغط المحادثة من هذه النقطة (يُحرِّر سياقًا).
Summarize up to hereيضغط حتّى هذه النقطة، ويُبقي البقيّة سليمة.

بعد استعادة محادثة أو «Summarize from here»، يُعاد وضع prompt الأصليّ في الإدخال. لتوجيه ملخّص، ظلِّل الخيار واكتب في حقل add context (optional) قبل Enter.

ما لا يُرجَع: ملفّات عدَّلها Bash (rm وmv وcp)، تحريرات الوكلاء الفرعيّين (باستثناء skill forked في المقدّمة مع background: false)، تغييرات خارجيّة متزامنة، symlinks/hardlinks (يتخطّاها Claude Code مع Restored the code, but skipped N files). تُحذَف اللقطات بعد نحو 30 يومًا؛ cleanupPeriodDays يُطيل الاحتفاظ. إن جرى /clear داخل العمليّة نفسها، تُضيف القائمة مدخل /resume <session-id> (previous session) للعودة إلى المحادثة قبل clear (v2.1.191+).

الجلسات: التسمية، الاستئناف، الاشتقاق

الجلسة محادثة مرتبطة بمجلّد، تُحفَظ باستمرار تحت ~/.claude/projects/<projet>/<session-id>.jsonl (قابل للنقل عبر CLAUDE_CONFIG_DIR). خمس مداخل لاستئنافها:

الأمرالأثر
claude --continueيستأنف آخر جلسة تفاعليّة في المجلّد الجاري.
claude --resumeيفتح المُنتقي.
claude --resume <id-ou-nom>يستأنف مباشرةً (يُبحَث عن ID في المشروع، ثمّ worktrees، ثمّ كلّ المشاريع الأخرى — v2.1.223+).
claude --from-pr <numéro>مُنتقي مُصفَّى على الجلسات المرتبطة بهذا PR.
/resumeيُبدِّل إلى محادثة أخرى من جلسة فعّالة.

ما يُستعاد: سجلّ كامل، نموذج، وكيل (--agent)، هدف (/goal)، مهامّ مجدولة غير منتهية، وضع الأذونات (قواعد لطيفة بحسب طريق الدخول). bypassPermissions الأصليّ لا يُستعاد تلقائيًّا أبدًا — يجب إعادة تمريره عند الإطلاق.

سمِّ جلساتك. claude -n <nom> عند البدء، /rename <nom> خلال العمل (يظهر الاسم على شريط prompt)، Ctrl+R على سطر في المُنتقي. اسم مُستعمَل يستقبل لاحقة من نوع auth-refactor-graceful-unicorn (v2.1.232+).

المُنتقي (/resume وحده أو claude --resume): ↑/↓ للتنقّل، Espace للمعاينة، Ctrl+R لإعادة التسمية، Ctrl+A للتوسّع إلى كلّ المشاريع، Ctrl+W إلى كلّ worktrees، Ctrl+B للتصفية على فرع git. لصق URL لـPR (GitHub/GitLab/Bitbucket) في البحث يجد الجلسة التي أنشأتها.

سبعة أوامر تقود حياة جلسة:

  • /clear [nom] — يُفرغ السياق، ويبدأ محادثة جديدة. الاسم يوسم السابقة في /resume. قابلة للاسترجاع عبر rewind (previous session) ما دامت العمليّة تعمل. الأسماء البديلة: /reset، /new.
  • /branch [nom] — ينسخ المحادثة ويُبدّل إليها؛ يبقى الأصل سليمًا. تُحفَظ منح «Allow for this session» (العمليّة نفسها). مكافئ CLI: claude --continue --fork-session.
  • /fork [prompt] — ينسخ المحادثة إلى جلسة جديدة في الخلفيّة ويتركك هنا. تستقبل النسخة تعليمة إنشاء worktree خاصّ بها قبل التحرير.
  • /export [fichier] — يُصدِّر نصًّا قابلاً للقراءة؛ بلا وسيط، حوار (حافظة أو ملفّ).
  • /recap — ملخّص من سطر (400 حرف أقصى). ملخّص تلقائيّ يُعرَض أيضًا عند العودة بعد ثلاث دقائق من الغياب (قابل للتعطيل في /config، Session recap).
  • /add-dir <chemin> — يُوسّع الوصول إلى مجلّد (Tab يُكمل). يُطلق hooks DirectoryAdded. .claude/ للمجلّد المُضاف لا يُكتشَف.
  • /cd <chemin>ينقل الجلسة إلى مجلّد آخر (النصّ يتبع)، ليُميَّز عن /add-dir الذي لا يفعل سوى التوسيع.
  • /diff — يفتح لوحة diff على شجرة العمل، محدَّثة بعد كلّ تحرير.

worktrees: التوازي دون الدوس على أقدام الآخرين

git worktree مجلّد مستقلّ بفرعه الخاصّ لكنّه يُشارك .git للمستودع الرئيسيّ. جلسة داخل worktree تعزل تحريراتها: جلسة تُبرمج المصادقة بينما أخرى تُصلح خطأً، دون المسّ بالملفّات ذاتها.

claude --worktree feature-auth

بلا اسم، يُولّد Claude اسمًا (bright-running-fox مثلًا). يُولَد worktree تحت .claude/worktrees/<nom>/ على فرع worktree-<nom> — يُضاف إلى .gitignore. تطلب runs التفاعليّة ثقة فضاء العمل. داخل الجلسة، يستطيع Claude إنشاء worktree أو الدخول إليه عبر أداة EnterWorktree؛ أيّ وجهة خارج .claude/worktrees/ تطلب موافقة، ولا يتخطّى الحاجز إلّا bypassPermissions.

عزل يُطبِّقه Claude Code — أربع تحقّقات لا تُعطَّل عند كلّ استدعاء أداة:

  1. Edit أو Write أو NotebookEdit تستهدف checkout الرئيسيّ: مرفوض.
  2. أمر Bash/PowerShell/Monitor يستقرّ cwd الخاصّ به في الرئيسيّ: مرفوض.
  3. أمر يُعيد توجيه git إلى الرئيسيّ (git -C، GIT_DIR، cd قبل git): مرفوض.
  4. أمر لا تسمح صيغته بالتحقّق الثابت لوجهة git: مرفوض.

القواعد نفسها تُغطّي كلّ وكيل فرعيّ يُطلَق من الجلسة المعزولة. يترك sandbox الكتابات في .git المشترك تمرّ، فيعمل git commit.

الضبط:

  • worktree.baseRef: "fresh" (افتراضيّ) يتفرّع من الفرع الافتراضيّ للـremote؛ "head" يتفرّع من HEAD المحلّيّ لحمل عمل جارٍ.
  • التفرّع من PR: claude --worktree "#1234" (علامتا التنصيص إلزاميّتان). URL من GitHub أو GitLab مقبولة.
  • .worktreeinclude في جذر المشروع (بصيغة .gitignore) ينسخ ملفّات مُهمَلة في git — .env و.env.local وconfig/secrets.json — إلى كلّ worktree جديد.
  • isolation: worktree في frontmatter لوكيل فرعيّ يُثبِّت عزله (الوحدة 10).

التنظيف — عند الخروج من جلسة --worktree، إن كان worktree نظيفًا والجلسة بلا اسم، يُحذَف تلقائيًّا؛ وإلّا يُطلب. مكنسة دوريّة تُزيل worktrees للوكلاء الفرعيّين والجلسات الخلفيّة أقدم من cleanupPeriodDays، باستثناء العمل غير المدفوع، أو قفل نشط، أو git worktree add يدويّ.

الخيط الأحمر: إعادة صياغة الدفع لـKiosque

يوم جمعة. يجب على كريم إضافة مزوّد دفع ثانٍ إلى Kiosque خلف flag، دون كسر عرض الاثنين. يفتح:

claude --worktree paiement-v2

يُولَد worktree على worktree-paiement-v2 من main طازج (.worktreeinclude نسخ .env). يكتب كريم:

/plan Ajoute un second prestataire de paiement derrière le flag PAY_V2, sans casser l'ancien.

يستكشف Claude app/payments/، ويكتب خطّة من سبع خطوات. Ctrl+G — يُعيد كريم صياغة الخطوة الرابعة في محرِّره. يختار Yes, manually approve edits. عنوان تلقائيّ: « Ajouter PAY_V2 derrière un flag ».

بعد ثلاث تحريرات، يفشل اختبار. Esc مرّتين، اختيار prompt قبل تورَين، Restore code and conversation. يعود prompt الأصليّ إلى الإدخال، فيُعيد صياغته: « la précédente tentative a cassé les webhooks — commence par le test qui reproduit le bug ». هذه المرّة تمرّ.

بالتوازي، تستكشف ليا بديلاً في طرفيّة ثانية، انطلاقًا من العمل الجاري (worktree.baseRef=head في settings.local.json الخاصّ بها):

claude --worktree paiement-v2-alt

تُسمّي جلستها paiement-alt. في منتصف الطريق، /branch etage-callback ينسخ المحادثة ويُبدّل إليها، ويبقى الأصل في /resume. نحو الخامسة مساءً، يريد كريم استفسار Claude عن الاختبارات دون تلويث جلسته: /fork Écris-moi un tableau des tests d'intégration existants et de leurs zones aveugles. تنطلق النسخة في الخلفيّة (مرئيّة في claude agents)، وتبقى جلسته على إعادة الصياغة.

يوم الاثنين، يعمل العرض على main، وworktree-paiement-v2 جاهز للـmerge، وpaiement-v2-alt مؤرشف، و/export release-paiement.md يلتقط المحادثة المفتاح لـPR. ثلاثة مسارات، صفر نزاعات على الملفّات، صفر كتابات فوقيّة.

الخلاصة

  • وضع plan (Shift+Tab، /plan، --permission-mode plan): يحجب التحريرات حتّى التصديق. يحكم المصنِّف على أوامر shell إن كان useAutoModeDuringPlan نشطًا؛ Ctrl+G يفتح الخطّة في المحرِّر؛ التصديق يمنح عنوانًا تلقائيًّا.
  • checkpoints: التقاط عند كلّ prompt (آخر 100). /rewind أو Esc+Esc (إدخال فارغ) يقترحان استعادة الشيفرة/المحادثة/كليهما، أو summarize. التغييرات عبر Bash، ووكلاء فرعيّون غير forked في المقدّمة، وsymlinks، وتغييرات خارجيّة لا تُرجَع.
  • الجلسات: --continue و--resume و--from-pr و/resume. سمِّ بـ-n و/rename. /clear يُفرغ، /branch ينسخ ويُبدّل، /fork ينسخ في الخلفيّة، /export يؤرشف، /recap يُلخّص، /add-dir يُوسّع، /cd ينقل، /diff يعرض.
  • worktrees (--worktree <nom> أو EnterWorktree): كلّ جلسة في checkout git مستقلّ. worktree.baseRef يختار fresh أو head، --worktree "#1234" يتفرّع من PR، .worktreeinclude ينسخ ملفّات مُهمَلة في git، isolation: worktree يُثبِّت وكيلًا فرعيًّا، ويرفض Claude Code أيّ كتابة تستهدف checkout الرئيسيّ.

الوحدة التالية: Hooks: أتمتة سلوك Claude وإحكامه — كيف نعترض كلّ حدث (قبل/بعد أداة، prompt، تحرير إعدادات، إنشاء worktree) لإضافة تحقّقات وقياسات وأتمتة.