# ExitWorktree

يُنهي جلسة worktree أُنشئت مسبقاً بواسطة `EnterWorktree` ويُعيد الجلسة إلى دليل العمل الأصلي. يعمل هذا الأداة حصراً على worktrees التي أنشأتها `EnterWorktree` في الجلسة الحالية؛ إذا لم تكن هناك جلسة نشطة من هذا النوع، فإن الاستدعاء لا يُحدث أي تأثير.

## متى يُستخدم

- اكتمل العمل في worktree معزول وتريد العودة إلى دليل العمل الرئيسي.
- انتهت مهمة في worktree لفرع ميزة وبعد الدمج تريد حذف الفرع والمجلد.
- تريد الاحتفاظ بـ worktree لاستخدامه لاحقاً والعودة فقط إلى الدليل الأصلي دون حذف أي شيء.
- تريد التخلي عن فرع تجريبي أو مؤقت دون ترك أي بيانات على القرص.
- تحتاج إلى بدء جلسة `EnterWorktree` جديدة، مما يستلزم الخروج من الجلسة الحالية أولاً.

## المعاملات

- `action` (نص، مطلوب): `"keep"` يحتفظ بمجلد worktree والفرع على القرص للعودة إليهما لاحقاً؛ `"remove"` يحذف المجلد والفرع معاً لإجراء خروج نظيف.
- `discard_changes` (قيمة منطقية، اختياري، الافتراضي `false`): ذو معنى فقط عندما يكون `action` هو `"remove"`. إذا احتوى worktree على ملفات غير مُحفوظة (uncommitted) أو commits غير موجودة في الفرع الأصلي، يرفض الأداة الحذف ما لم يُضبط `discard_changes` على `true`. تُدرج استجابة الخطأ التغييرات المحددة لتتمكن من تأكيدها مع المستخدم قبل إعادة الاستدعاء.

## أمثلة

### مثال 1: خروج نظيف بعد دمج التغييرات

بعد إنهاء العمل في worktree ودمج الفرع في main، استدع `ExitWorktree` مع `action: "remove"` لحذف مجلد worktree والفرع والعودة إلى دليل العمل الأصلي.

```
ExitWorktree(action: "remove")
```

### مثال 2: التخلص من worktree مؤقت يحتوي على كود تجريبي غير محفوظ

إذا احتوى worktree على تغييرات تجريبية غير محفوظة يجب التخلص منها كلياً، جرب أولاً `action: "remove"`. سيرفض الأداة ويُدرج التغييرات غير المحفوظة. بعد تأكيد المستخدم أن التغييرات يمكن التخلص منها، أعد الاستدعاء مع `discard_changes: true`.

```
ExitWorktree(action: "remove", discard_changes: true)
```

## ملاحظات

- يعمل هذا الأداة حصراً على worktrees أنشأتها `EnterWorktree` في الجلسة الحالية. لن يؤثر على worktrees المُنشأة بـ `git worktree add`، أو worktrees من جلسات سابقة، أو دليل العمل العادي إذا لم تُستدعَ `EnterWorktree` قط — في هذه الحالات يكون الاستدعاء بلا تأثير.
- يُرفض `action: "remove"` إذا احتوى worktree على تغييرات غير محفوظة أو commits غير موجودة في الفرع الأصلي، ما لم يُقدَّم `discard_changes: true` صراحةً. تأكد دائماً مع المستخدم قبل ضبط `discard_changes: true`، إذ لا يمكن استرداد البيانات بعد حذفها.
- إذا كانت جلسة tmux مرتبطة بـ worktree: عند `remove` تُنهى الجلسة؛ عند `keep` تستمر في العمل ويُعاد اسمها حتى يتمكن المستخدم من إعادة الاتصال لاحقاً.
- بعد اكتمال `ExitWorktree`، يمكن استدعاء `EnterWorktree` مرة أخرى لبدء جلسة worktree جديدة.
