Skip to main content

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

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

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

تسلّم بيئةُ التشغيل النموذجَ حقائق حيّة عن كلّ مجلّد عملٍ في المحادثة، تُحسَب مرّةً في كلّ دور: وقبل أن يكون لشيءٍ من ذلك وزن، يقرأ AGENTS.md أو CLAUDE.md الخاصّ بالمشروع. فقواعد بيت المستودع تعلو على كلّ ما يعتقده وولفيش افتراضًا — وهذه هي علّة وضعها في المستودع أصلًا.
لا يُحمَّل AGENTS.md وCLAUDE.md معًا لمجلّدٍ واحد قطّ، والأقربُ هو الغالب. انظر AGENTS.md لما ينبغي أن يكون فيه.

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

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

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

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

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

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

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

لم يعد تعديل الملفّ وتشغيل الأمر يبدوان كسائر استدعاءات الأدوات في الخيط. فلكلٍّ منهما صفّ نشاطٍ مضغوط: عنوانٌ قصير، والملفّ أو الأمر، وشريحةٌ تقرأ +12 −3 للتعديل أو exit 0 للأمر، خضراء أو حمراء. وافتح الصفّ فيُظهر التعديلُ الفرقَ الموحَّد الحقيقيّ — أحمرَ وأخضرَ، بأرقام الأسطر الصحيحة على الجانبين؛ ويُظهر الأمرُ مخرجاته، وحين تكون طويلة مسارَ الملفّ الذي يحملها كلّها. والفرقُ يسافر على الناتج نفسه، فـالمحادثة التي تُفتَح بعد أسبوع تُرسَم تمامًا كما رُسمت حيّة.
تُرسَم هذه الصفوف مهما قال مفتاح نشاط الأدوات، على كلّ سطح. فالتغيير في مشروعك ليس ميكانيكا أدوات، ولذلك تعرضه التغذيةُ النظيفة. وعلى الحافّة العليا من السجلّ شريطٌ من شرائح المجلّدات — كلُّ مجلّدٍ غيّرت هذه المحادثةُ ملفّاتٍ فيه، وكم منها — كلُّ واحدةٍ على بُعد نقرةٍ من فتحه على سطح مكتبك.

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

حين يبلغ العمل ثلاث خطوات فأكثر يحتفظ الوكيل بـقائمة مهامّ، وتظهر في المحادثة بطاقةَ تحقّق: عنصرٌ واحدٌ قيد التنفيذ لا غير، ولا يُشطَب عنصرٌ إلّا بعد الفحص الذي يثبت أنّه تمّ حقًّا. والبطاقة تتحدّث في مكانها لا تكدّس نسخةً جديدة مع كلّ مراجعة، فتترك التشغيلةُ الطويلة قائمةً واحدة تبيّن أين وصلت الأمور. وتصل إلى الهاتف المقترن وإلى ملفّ الـ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 للتفصيل:
  • تحتفظ المخرجات بـآخر 2000 سطر أو 50 كيلوبايت، لأنّ الإخفاق يُبلَّغ عنه في نهاية السجلّ، مع كتابة النصّ الكامل في ملفٍّ يسمّيه الناتج.
  • تعمل الأوامر في مجلّد عملك افتراضيًّا، فيهبط npm test وgit status داخل المشروع دون أن يُدَلّا عليه.
  • والأمرُ الذي يشبه خادم تطوير أو مراقبًا يُرفَض في المقدّمة ويُبدَأ في الخلفية بدلًا من ذلك، مع shell_jobs لسرد ما يعمل وshell_stop لإنهائه.

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

قدرةُ mobile-simulators تضع iOS وAndroid على المكتب — 37 أداة mobile_، مفرداتٌ واحدة للمنصّتين منذ الإصدار 1.0.299. فيصير سؤال «هل تبدو الشاشة الجديدة صحيحة؟» سؤالاً يجيب عنه الوكيل بتشغيل التطبيق والنظر إليه ولمسه. واللمساتُ تذهب إلى مرجعٍ من شجرة وصوليّة التطبيق لا إلى إحداثيٍّ مخمَّنٍ من لقطةٍ قديمة، وكلُّ لمسةٍ تعيد برهاناً: رقعةً مقرَّبة للموضع بعينه وعليها خطّا تصويب، وحكماً على ما إذا كانت الشاشة قد تغيّرت فعلاً. وعلى macOS تُغلق قدرةُ xcode الحلقةَ في استدعاءٍ واحد — فـxcode_run يبني ويثبّت ويشغّل مع انسياب السجلّات، والبناءُ المخفق يعود بالملفّ والسطر لا بألف سطرٍ من مخرجات xcodebuild. أمّا صفحة الويب، فملفّ HTML في المحادثة صار يعمل حيًّا منذ الإصدار 1.0.295: تستضيف البطاقةُ الصفحةَ في تبويب متصفّحٍ خاصٍّ بها، فتعمل السكربتات، ويرسم الـcanvas، ويبقى localStorage بين الفتحات، مع إعادة التحميل وأدوات المطوّر في العرض الموسَّع.