> ## Documentation Index
> Fetch the complete documentation index at: https://docs.wolffi.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# البرمجة

> كيف يعمل وولفيش داخل مشروع شيفرة — وضع التخطيط، والتعديلات الجراحية، والفروق، وقوائم المهامّ، وإعادة الأمر إلى ما كان

# حين يكون المجلّد مستودعًا

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

وهذا كلّه مشروط. فسياق البرمجة يُرفَق **حين يكون مجلّد العمل مشروع شيفرةٍ حقًّا وحدها** — أمّا المحادثة العادية فلا تحمل منه شيئًا ولا تدفع عنه ثمنًا.

## ما يعرفه قبل أن يبدأ

تسلّم بيئةُ التشغيل النموذجَ حقائق حيّة عن كلّ مجلّد عملٍ في المحادثة، تُحسَب مرّةً في كلّ دور:

| الحقيقة                                  | من أين تأتي                                                                                                                                                                |
| ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| أيّ المجلّدات مشاريع فعلًا               | ملفّ بيانٍ أو مجلّد `.git` في المجلّد                                                                                                                                      |
| **الفرع** و**عدد التغييرات غير المودعة** | `git` في ذلك المجلّد، يُقرأ طازجًا كلّ دور                                                                                                                                 |
| **سلسلة الأدوات**                        | ملفّات البيان الموجودة — `npm (package-lock.json) · TypeScript · ESLint`، و`Ruff`، و`Rust (Cargo.toml)`، و`Go (go.mod)`، وXcode، وGradle، وMaven، وFlutter، وDocker وسواها |
| **أوامر الفحص التي يعرضها المشروع**      | السكربتات التي يعرضها المشروع فعلًا                                                                                                                                        |

وقبل أن يكون لشيءٍ من ذلك وزن، يقرأ **`AGENTS.md`** أو **`CLAUDE.md`** الخاصّ بالمشروع. فقواعد بيت المستودع تعلو على كلّ ما يعتقده وولفيش افتراضًا — وهذه هي علّة وضعها في المستودع أصلًا.

<Note>
  لا يُحمَّل `AGENTS.md` و`CLAUDE.md` معًا لمجلّدٍ واحد قطّ، والأقربُ هو الغالب. انظر [AGENTS.md](/ar/configuration/agents-md) لما ينبغي أن يكون فيه.
</Note>

## خطِّط أوّلًا، وغيِّر بعدُ

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

وهذا ليس رجاءً موجَّهًا إلى النموذج، بل **بوّابةُ قراءةٍ فقط في بيئة التشغيل**: فاستدعاء الأداة الذي يكتب يُرفَض قبل أن يُنفَّذ، باستثناءٍ واحد — ملفّ الخطّة نفسه، في `<workspace>/files/plans/<conversation>.md`. فالتعليمةُ يمكن الالتفاف عليها، أمّا البوّابة فلا.

والتخطيط **موقفٌ تتّخذه لمحادثةٍ** لا صفةٌ في سجلّها، فهو محفوظٌ في مكانٍ واحد و**مشتركٌ مع هاتفك المقترن**: اضبطه من أيّ السطحين يتبعه الآخر فورًا. بل تستطيع محادثةٌ جديدة تمامًا أن تحمل الموقف قبل أن يكون لها معرّف. وأطفئه فيُبلَّغ الدورُ التالي، مرّةً واحدة، أنّ الخطّة صارت معتمَدةً للتنفيذ.

<Tip>
  على [الهاتف](/ar/integrations/mobile-app#وضع-التخطيط) الموقفُ نفسُه شريحةُ **تخطيط** في صفّ حقل الإدخال، بجوار شريحة النموذج — موضعُ سطح المكتب نفسُه، منذ إصدار الهاتف 1.0.59 — وهي مفتاحٌ هناك لا لافتةٌ فحسب: نقرةٌ تشعل وأخرى تطفئ. وحين يكون سطح مكتبك بعيد المنال **تبقى الشريحة مكانها وتخفت**، والنقرةُ تقول السبب بدل أن تضبط موقفاً لن يتلقّاه أحد.
</Tip>

## تعديلاتٌ لا تمسّ إلّا ما تقصده

ثلاث أدوات تؤدّي العمل، وكلّها موثَّقة بالكامل تحت [filesystem](/ar/capabilities/built-in-capabilities#النظام-الأساسي):

* **`file_edit`** — تعديلٌ جراحيّ بنصٍّ مطابقٍ تمامًا. يُبقي كلّ ما لم تلمسه مطابقًا بايتًا ببايت، و**يرفض التطابق الملتبس** بدل أن يخمّن أيَّها قصدتَ، ويعيد فرقًا حقيقيًّا.
* **`file_grep`** — البحث في *محتوى* الملفات بـ ripgrep عبر قاعدة شيفرة بأيّ حجم، مع احترام `.gitignore`.
* **`file_glob`** — إيجاد ملفٍّ بنمط *الاسم*.

ويبقى `file_write` للملفات الجديدة وللاستبدال الكامل المقصود. وليس هو أداةَ تغيير ملفٍّ قائم.

### خطوتان لا تحتاج أن تطلبهما

يتبع كلَّ تعديلٍ فحصان، تلقائيًّا:

1. **مُنسِّق المشروع نفسه** يعمل على الملفّ — حين يكون المشروع يستعمل واحدًا بشكلٍ ظاهر.
2. **TypeScript أو ESLint أو Ruff أو Pyright الخاصّ بالمشروع** يُسأل عن رأيه، وتُعاد أيّ أخطاءٍ مباشرةً، فتُصلَح **في الدور نفسه** بدل أن تظهر عند البناء.

والتغيير لا يُعدّ منجَزًا حتى يمرّ فحص: الاختبار الأضيق أوّلًا، ثم فحص الأنواع والتدقيق والاختبارات كاملةً في المشروع — مع **الإبلاغ عن الإخفاق لا إخفائه**.

## كلّ تغيير يصل فرقًا

لم يعد تعديل الملفّ وتشغيل الأمر يبدوان كسائر استدعاءات الأدوات في الخيط. فلكلٍّ منهما **صفّ نشاطٍ مضغوط**: عنوانٌ قصير، والملفّ أو الأمر، وشريحةٌ تقرأ `+12 −3` للتعديل أو `exit 0` للأمر، خضراء أو حمراء.

وافتح الصفّ فيُظهر التعديلُ **الفرقَ الموحَّد الحقيقيّ** — أحمرَ وأخضرَ، بأرقام الأسطر الصحيحة على الجانبين؛ ويُظهر الأمرُ مخرجاته، وحين تكون طويلة **مسارَ الملفّ الذي يحملها كلّها**.

والفرقُ يسافر على الناتج نفسه، فـ**المحادثة التي تُفتَح بعد أسبوع تُرسَم تمامًا كما رُسمت حيّة**.

<Note>
  تُرسَم هذه الصفوف **مهما قال [مفتاح نشاط الأدوات](/ar/channels/overview#التغذية-النظيفة)**، على كلّ سطح. فالتغيير في مشروعك ليس ميكانيكا أدوات، ولذلك تعرضه التغذيةُ النظيفة. وعلى الحافّة العليا من السجلّ شريطٌ من **شرائح المجلّدات** — كلُّ مجلّدٍ غيّرت هذه المحادثةُ ملفّاتٍ فيه، وكم منها — كلُّ واحدةٍ على بُعد نقرةٍ من فتحه على سطح مكتبك.
</Note>

## قائمة المهامّ

حين يبلغ العمل ثلاث خطوات فأكثر يحتفظ الوكيل بـ[قائمة مهامّ](/ar/capabilities/built-in-capabilities#النظام-الأساسي)، وتظهر في المحادثة **بطاقةَ تحقّق**: عنصرٌ واحدٌ قيد التنفيذ لا غير، ولا يُشطَب عنصرٌ إلّا بعد الفحص الذي يثبت أنّه تمّ حقًّا. والبطاقة **تتحدّث في مكانها** لا تكدّس نسخةً جديدة مع كلّ مراجعة، فتترك التشغيلةُ الطويلة قائمةً واحدة تبيّن أين وصلت الأمور. وتصل إلى الهاتف المقترن وإلى ملفّ الـPDF المصدَّر على السواء.

## إعادة الأمر إلى ما كان

قبل أوّل تغيير يُجريه دورٌ على ملفّ، يحتفظ وولفيش بـ**البايتات الأصلية**.

* **`changes_list`** — ما مسّه كلّ دورٍ حديث
* **`changes_revert`** — إعادة ملفّات دورٍ إلى ما كانت: الدورَ كلّه، أو ملفًّا واحدًا منه

لا يحتاج إلى git، ويعمل في أيّ مجلّد، ويحتفظ بـ**آخر عشرين دورًا** لكلّ محادثة. وهو موجودٌ لجملةٍ واحدة قلتَها من قبل بلا شكّ: *هذا الإصلاح زاد الأمر سوءًا، أعِده*.

## موافقاتٌ أضيق

تغييران يجعلان بطاقات الموافقة تطابق العمل.

**اسمح في هذه المحادثة.** للبطاقة زرٌّ ثانٍ. يوافق على الاستدعاء الذي أمامك ويكفّ عن السؤال عن **النوع نفسه من الاستدعاءات بقيّةَ المحادثة** — الأداةُ نفسها، وفي الطرفية **رأسُ الأمر نفسه**، فالسماح بـ`npm install` مرّةً لا يسمح ضمنًا بـ`git push` لاحقًا. وما يُحظَر حظرًا لا يبلغ هذه البطاقة أصلًا ولا ينال هذا الزرّ.

**القواعد تقرأ المسار لا الشيفرة.** كانت كتابةُ ملفٍّ صادف أن *محتواه* يذكر مسارًا توقف الوكيل وتسألك عنه — فاستيرادٌ نسبيّ عاديّ مثل `import x from '../lib/x'` يرفع بطاقةً حمراء تقول **«محاولة اجتياز مسار»**، وسكربتٌ يبدأ بـ`#!/usr/bin/env node` يُعلَن **«تعديل ملفّات النظام»**. كانت القواعد تقرأ الاستدعاء كلّه، بنصّه. وصارت الآن تقرأ **المسارَ المكتوب إليه، لا شيء غيره**. أمّا الاجتياز الحقيقيّ مثل `../../../etc/hosts`، والكتابةُ الحقيقية في `/etc` أو `/usr` أو `/private`، فما زالت تتوقّف وتسأل تمامًا كما كانت — على أداة ملفّاتٍ وعلى أمر طرفيّةٍ سواء. وشيءٌ واحد يرتخي حقًّا: الأمرُ الذي يصعد مجلّدًا لا غير، `cd ../sibling && npm test`، لم يعد يُحسَب محاولةَ خروج.

## المخرجات الطويلة وخوادم التطوير

تغيّر سلوك الطرفية في الإصدار نفسه، وللعلّة نفسها — انظر [shell](/ar/capabilities/built-in-capabilities#النظام-الأساسي) للتفصيل:

* تحتفظ المخرجات بـ**آخر** 2000 سطر أو 50 كيلوبايت، لأنّ الإخفاق يُبلَّغ عنه في *نهاية* السجلّ، مع كتابة النصّ الكامل في ملفٍّ يسمّيه الناتج.
* تعمل الأوامر في **مجلّد عملك** افتراضيًّا، فيهبط `npm test` و`git status` داخل المشروع دون أن يُدَلّا عليه.
* والأمرُ الذي يشبه **خادم تطوير أو مراقبًا يُرفَض في المقدّمة** ويُبدَأ في الخلفية بدلًا من ذلك، مع `shell_jobs` لسرد ما يعمل و`shell_stop` لإنهائه.

## أن ترى التطبيق الذي بنيتَه للتوّ

قدرةُ [mobile-simulators](/ar/capabilities/built-in-capabilities#أتمتة-سطح-المكتب) تضع iOS وAndroid على المكتب — **37 أداة `mobile_`**، مفرداتٌ واحدة للمنصّتين منذ **الإصدار 1.0.299**. فيصير سؤال *«هل تبدو الشاشة الجديدة صحيحة؟»* سؤالاً يجيب عنه الوكيل بتشغيل التطبيق والنظر إليه و**لمسه**.

واللمساتُ تذهب إلى **مرجعٍ من شجرة وصوليّة التطبيق** لا إلى إحداثيٍّ مخمَّنٍ من لقطةٍ قديمة، وكلُّ لمسةٍ تعيد **برهاناً**: رقعةً مقرَّبة للموضع بعينه وعليها خطّا تصويب، وحكماً على ما إذا كانت الشاشة قد تغيّرت فعلاً. وعلى macOS تُغلق قدرةُ [xcode](/ar/capabilities/built-in-capabilities#أتمتة-سطح-المكتب) الحلقةَ في استدعاءٍ واحد — فـ`xcode_run` **يبني ويثبّت ويشغّل مع انسياب السجلّات**، والبناءُ المخفق يعود بالملفّ والسطر لا بألف سطرٍ من مخرجات `xcodebuild`.

أمّا صفحة الويب، فملفّ HTML في المحادثة صار **يعمل حيًّا** منذ **الإصدار 1.0.295**: تستضيف البطاقةُ الصفحةَ في تبويب متصفّحٍ خاصٍّ بها، فتعمل السكربتات، ويرسم الـcanvas، ويبقى `localStorage` بين الفتحات، مع **إعادة التحميل** و**أدوات المطوّر** في العرض الموسَّع.
