Skip to main content

التطبيق كله، في الطرفية

منذ الإصدار 1.0.239 صار هناك أمر wolffish، وهو ليس وولفيش ثانياً أصغر. ومنذ الإصدار 1.0.295 لم يعد واجهةً ثانيةً أصغر كذلك: صار عميل طرفيةٍ ملءَ الشاشة، ندّاً للتطبيق الذي ينتمي إليه. كلُّ أمرٍ فيه استدعاءٌ إلى الشيفرة نفسها التي تستدعيها نوافذ سطح المكتب — الإعدادات نفسها، والمحادثات نفسها، والوكيل نفسه. وكلُّ صفِّ إعدادٍ يحمل عنواناً حقيقياً وجملةً أو جملتين من الوصف، الحقائقَ نفسها التي تعلّمك إياها بطاقات سطح المكتب — مكتوبةً حيث تُعرَّف الإعدادات، فلا تستطيع الطرفية أبداً أن تطبع مفتاحاً خاماً حيث ينبغي أن يقوم اسم. ومقايضةٌ واحدة متعمَّدة منذ الإصدار 1.0.243: الطرفية واجهةٌ إنجليزية — فتطبيق سطح المكتب ما زال يتكلّم لغتك، والعربية منها؛ الطرفية وحدها هي التي كفّت عن الترجمة. يبقى تطبيق سطح المكتب الطريقةَ الأولى للعيش مع وولفيش. أمّا الطرفية فهي التطبيق ذاته للمواضع التي لا تبلغها نافذة: جلسة SSH، أو نصّ برمجي، أو خادم بلا شاشة.
طلقةٌ واحدة: اسأل، فتُطبع الإجابة، ثم خروج. أو wolffish وحدها لجلسةٍ تفاعلية.

واجهة، لا تطبيق ثان

المهمّ هو ما تكونه الطرفية: واجهة عرض. يعمل وولفيش عمليةً في الخلفية والأمرُ يتّصل بها — فإن كان تطبيق سطح المكتب مفتوحاً اتّصلت الطرفية به هو، والأدوار التي تشغّلها من الصدفة تنساب إلى النافذة أيضاً. وإن لم يكن شيءٌ يعمل، فإنّ الأمر الأوّل يُقلع الوكيل بنفسه، بلا رأس، ثم يتّصل. ولهذا عواقب تستحقّ أن تستقرّ في الذهن:
  • المغادرة لا توقف شيئاً. أغلق الطرفية أو انقطعت وصلة SSH، فالدور يواصل عمله. عُد، وشغّل wolffish، فيعاود الاتصال بما لا يزال يعمل.
  • الانفصال ليس إلغاءً. إيقاف تشغيلٍ فعلٌ متعمَّد قائم بذاته: Ctrl-C في أثناء الدور، أو wolffish cancel من أيّ مكان — وهو يوقف دوراً جارياً على أيّ قناة، بما في ذلك أتمتةٌ شاردة على جهازٍ بلا رأس.
  • الموافقات تنتظر في مكانها. استدعاء الأداة الذي ينتظر منك نعم أو لا حين تذهب الطرفية لا يخفق — بل يقف منتظراً، ويُعاد رسمه حين تعاود الاتصال (/pending)، أو يُجاب عنه من هاتفك.
ثلاثة أوامر لا تُقلع الوكيل أبداً: wolffish status وwolffish service وwolffish path. فهي تبلّغ عن حال الجهاز، ولذلك يجب أن تستطيع قول «لا يعمل» بدل أن تُقلع خفيةً عمليةً خلفية لتجيب عن السؤال. وكلُّ ما عداها يُحضر الوكيل عند الطلب.

المحادثة

وwolffish -p "…" مع أنبوبٍ ما زال يطبع نصّاً صرفاً ثم يخرج — النصوص البرمجية لا تتغيّر. وكلُّ ما كان يقبل راية --json ما زال يقبلها. والذي تغيّر في الإصدار 1.0.295 هو الجلسة التفاعلية.

شاشةٌ حقيقية

كانت wolffish سطراً في كلّ مرّة: تكتب، وتنتظر، وتقرأ، وترجو أن تكون استدعاءات الأدوات التي لا تراها ماضيةً إلى مكانٍ ما. أمّا الآن فتنساب المحادثة في خيطٍ متمرِّرٍ بالبطاقات نفسها التي يرسمها التطبيق — استدعاءات الأدوات بمخرجاتها، وتعديلات الملفات فروقاً، والملفات المسلَّمة، وقوائم المهامّ، وكشوف سير العمل، ومهامّ الخلفية، والعدّادات التنازلية. والمطالبةُ في الأسفل محرِّرٌ حقيقيّ: Shift+Enter يضيف سطراً، واللصقةُ الطويلة تُطوى في نائبٍ مختصر، و**@path** يكمل المسار ويرفق الملفّ، و**/** يكمل كلّ أمر. وتحت المطالبة يقوم ما تعرضه نافذةُ محادثةٍ مجّاناً ولم تعرضه طرفيةٌ قطّ: الوضع والنموذج وجهد التفكير ووضع التخطيط والمشروع في سطرٍ واحد، وبينما يعمل الدور، ما الذي يفعله الوكيل الآن، ومنذ متى وهو عليه، وكم استُهلك من نافذة السياق، وكم كلّف. إنّه مقياس السياق الخاصّ بالتطبيق، مصنوعاً لطرفية. وتصل الموافقات والأسئلة بطاقاتٍ تجيب عنها بلوحة المفاتيح: اسمح مرّة، اسمح دائماً، ارفض؛ واختر خياراً برقمه. والمطالبة المكتوبة في أثناء الدور تُسلَّم إلى العمل الجاري بدل أن تُرفَض، و**esc مرّتين يقاطع**، وإن أُعيد تشغيل التطبيق من تحتك أعاد الاتصالَ من تلقائه والتقط المحادثة من حيث كانت.

المفاتيح

ctrl+p يفتح لوحة أوامر تسرد كلّ أمرٍ بمفتاحه. وما عدا ذلك، ctrl+x هو المفتاح القائد: اضغطه ثم حرفاً. و/help (أو ctrl+x ?) يسرد المعجم كلّه. وكلّ أمر شرطةٍ مائلة في الجدول أدناه ما زال يعمل، مكتوباً.

كلُّ ما يفعله التطبيق، من صندوقٍ بلا شاشة

تُفتَح الإعدادات متصفّحَ صفحة ← بطاقة ← صفّ الخاصّ بالتطبيق نفسه: كلّ مفتاحٍ ورقمٍ وخيارٍ وسرٍّ يُحرَّر في مكانه، وكلّ إجراءٍ في التطبيق (اقتران هاتف، اختبار مفتاح، إضافة خادم MCP، تثبيت محرّك) يُشغَّل من القائمة نفسها، والبحثُ يبلغ كلّ الصفوف دفعةً واحدة. ويعرض الاستهلاك المجاميع والمزوّدين والنماذج نفسها التي تعرضها لوحة التطبيق، مع منتقي مدًى وشريطٍ يوميّ. وتعرض الحالة العفريتَ والدماغَ والتشغيل التلقائيّ وPATH والقنوات. وللمشاريع والإجراءات والأتمتة (بما يعمل وما ينتظر) والملفات المسلَّمة والموافقات المركونة ومهامّ الخلفية وسجلّ العفريت حوارٌ خاصّ بكلٍّ منها.

مبنيٌّ في التطبيق، يُحدَّث معه

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

التصيير والملفات

تصل الردود ماركداون مصيَّراً — عناوين، وخطّ عريض، وقوائم، وجداول، واقتباسات، وشيفرة في صندوقٍ مؤطَّر موسومٍ بلغتها، تُرسم والنموذج يبثّ. فالنموذج يرسل الماركداون نفسه إلى كلّ واجهةٍ عمداً؛ والطرفية إنّما نالت المصيِّر الذي كان عند النافذة والهاتف من قبل. والملفات مساراتٌ في الاتجاهين، لأنّ الطرفية والوكيل يتشاركان نظام ملفاتٍ واحداً: لا شيء يُرفع، ولا شيء يُرمَّز، والملفّ المسلَّم يطبع المسار الذي تستطيع فتحه أصلاً. ومنذ الإصدار 1.0.264 صار صندوق الدردشة محرِّرَ أسطرٍ متعدّدةٍ حقيقياً. اللصق آمن: الكتلة الملصوقة مهما كان حجمها تحطّ كاملةً، ولا يُرسَل شيءٌ حتى تضغط Enter — فالطرفية تُطالَب بتغليف اللصق، فيغدو سطرٌ جديدٌ داخله فاصلَ سطرٍ لا إرسالاً. وShift+Enter يبدأ سطراً جديداً على الطرفيات التي تتحدّث بروتوكول المفاتيح الحديث (iTerm2 3.5+ وkitty وWezTerm وGhostty وAlacritty وfoot)، وOption+Enter أو Ctrl+J يفعلان الشيءَ نفسه في كلّ مكان. والنصُّ الملصوق يُنظَّف من محارف التحكّم الشاردة، فلا يستطيع لصقٌ خبيثٌ برمجةَ طرفيتك — وعلى كونسول ويندوز، حيث لا سبيل إلى اعتراض ضغطات المفاتيح، تُخاط الكتلةُ الملصوقة من جديد في رسالةٍ واحدة بدل أن تُرسَل سطراً سطراً.

المراسلة في أثناء الدور

منذ الإصدار 1.0.296 تُسلَّم الرسالة المكتوبة في أثناء دورٍ جارٍ إلى العمل الطائر بدل أن تصطفّ خلفه. فيقرؤها الوكيل عند خطوته التالية — لحظةَ انتهاء دفعة استدعاءات الأدوات التي يشغّلها، قبل أن يختار التالية — فتفعل «تخطَّ مجلّد الاختبارات» و*«استعمل الملفّ الآخر»* و*«يكفي، لخّص ما عندك»* ما تقوله والتشغيلة ما زالت جارية. وتجلس رسالتك في آخر الخيط بعلامة «تُقرَأ عند الخطوة التالية»، و**esc يستردّ آخرها** — إلى حقل الإدخال مسوَّدةً، فلا تكلّف رسالةٌ أُرسلت قبل أوانها شيئاً. وحين يقرؤها الوكيل لا سبيل إلى سحبها. وأوقِف الدور فتُعاد إليك الرسالةُ غير المقروءة بدل أن تُطبَّق صامتةً على ما يأتي بعده.

معجم الشرطة المائلة

ويتبع Ctrl-C قاعدةً واحدة — يوقف أقرب شيء: المسوَّدة نصف المكتوبة أولاً، ثم الدور الجاري، ثم المطالبة المتداخلة، ثم (بضغطتين) الجلسة نفسها، مصرّحاً في كلّ مرّة بما أوقف. وCtrl-D يغادر فوراً. والوكيل يواصل العمل من دونك في الحالين.

HTML يعمل حيًّا

منذ الإصدار 1.0.295 يصيّر العميل معاينةً حيّةً لصفحات HTML التي بناها الوكيل للتوّ، بدل صورةٍ ساكنةٍ لترميزها.

التطبيق، في الطرفية

المستوى الأعلى هو تنقّل التطبيق نفسه لا غير — conversations وprojects وprocedures وautomations وcustomizations وsettings — لأنّ تصنيفاً ثانياً يُحفظ عن ظهر قلب كان سيكون تطبيقاً ثانياً:
ومنذ الإصدار 1.0.264 لكلّ ما هو موجّهٌ أو تعليمات نسخٌ ولصق: copy يضع التعليمات أو الموجّه على حافظة نظامك — pbcopy على macOS، والحافظة الحقيقية على ويندوز ولينكس، وعبر SSH يملأ الحافظة على الجهاز الذي تجلس إليه — وpaste يأخذ البديل متعدّد الأسطر كاملاً دفعةً واحدة ويكتب فوق الحقل. ولصقُ موجّه أتمتةٍ عمليةٌ جراحية: عنوان الجدولة وعلامات الملفات والمجلدات المرفقة تُحفَظ بايتاً بايتاً. والسكربتات تناله مجاناً:
والمشاريع والإجراءات والأتمتة كلّها تحمل ملفاتٍ مرفقة ومجلدات عمل، تُحرَّر هنا تماماً كما في التطبيق:
ومساحة العمل نفسها قابلة للتجوال — wolffish files لتصفّحها، وwolffish view <path> لقراءة ملفٍّ واحد (وبيانات الاعتماد محجوبة ما لم تمرّر --raw)، وwolffish edit <path> لتغيير واحد.

الإعدادات بثلاث طرق

أمر wolffish settings هو شاشة الإعدادات، تُمشى كما يمشيها التطبيق — صفحة ← بطاقة ← إعداد — والسطر الفارغ يعني دائماً «مستوى إلى الأعلى»، فثمّة مفتاحٌ واحد يُتعلَّم بدل مخرجٍ مختلف عند كلّ عمق. اقفز مباشرةً إلى بطاقة (wolffish settings channels telegram)، أو سمِّ وجهةً (wolffish settings notion)، أو اكتب أيّ كلمةٍ فتحصل على كلّ ما يطابقها أينما سكن. والأشياء التي لم تكن يوماً قيمةً واحدة تجلس على بطاقاتها أيضاً: إدخال مفتاح مزوّد، واختيار الدماغ، ووصل Notion أو GitHub أو Google، وإضافة خادم MCP، واقتران هاتف، ووصل واتساب أو تيليجرام، وتشغيل تأمّلٍ الآن، وإعادة ضبط مساحة العمل. والمفاتيح تُكتب مخفيّة — فلا تحطّ في طرفيتك ولا في تاريخ صدفتك — وتُختبر قبل أن تُحفظ. وللنصوص البرمجية، تجاوز التصفّح:

محرر يحضر في كل حال

منذ الإصدار 1.0.264 يفتح كلُّ «تحرير» nano افتراضياً على macOS ولينكس والمفكّرة على ويندوز — متقدّماً عمداً على $EDITOR مضبوطٍ على vim من سنين، لأنّ محرِّراً نمطيّاً لا تعرف الخروج منه هو أسوأ مكانٍ يهبط فيه من أراد تعديل موجّهٍ فحسب. والسلّم كاملاً بترتيبه: $WOLFFISH_EDITOR، اختيارٌ صريح لهذا السطر بعينه، يُحترَم حرفياً بأعلامه وكلِّ شيء؛ ثم الافتراضي الودود — nano، أو المفكّرة (ثم edit المشابه لـnano من مايكروسوفت) على ويندوز؛ ثم $VISUAL / $EDITOR، يُحترمان حين لا يكون الافتراضي مثبَّتاً؛ فإن خاب كلُّ ذلك، فثمّة محرّر أسطر مدمجٌ بلا اعتمادياتٍ البتّة، يعمل داخل جلسة SSH على جهازٍ لا شيء عليه: اكتب فيُلحق، و:s <n> <text> لاستبدال سطر، و:d <n> للحذف، و:show لإعادة الطباعة، و:save أو :cancel للمغادرة. نصفُ القائمة كان يسدّ من قبل عند no $EDITOR set — وهي الحال الافتراضية لدخولٍ جديد على خادم. أمّا اليوم فلا شيء يسدّ. ومفكّرةُ ويندوز 11 ذاتُ الألسنة — التي تسلّم الملفَّ إلى نافذةٍ مفتوحةٍ أصلاً وتعود فوراً فيضيع التعديلُ بصمت — تُكشَف ويُنتَظر صاحبُها بدل ذلك.

الموافقات والأمان

حين يريد الوكيل فعل شيءٍ تعلّم عليه اللوزة الدماغية، ترسم الطرفية بطاقة الموافقة: approve? [y]es / [n]o / [a]lways this tool — حيث a تدوم لهذه الجلسة وحدها. وخاصّتان أهمّ من ضغطات المفاتيح:
  • التشغيلات غير التفاعلية تُغلق على الرفض. إن لم تكن ثمّة طرفيةٌ تسأل — مهمّة cron، أو أنبوب — رُفضت الموافقة ولم تُفترض. أعد التشغيل تفاعلياً، أو مرّر --yes عن عمد.
  • و--yes يعيد ما وجده إلى مكانه. يقلب تجاوزَ الموافقات على مستوى التطبيق للتشغيلة، ثم يعيد القيمة السابقة عند الخروج — حتى مع Ctrl-C ومع انقطاع الوصلة — فلا تستطيع تشغيلةٌ مبرمجة واحدة أن تترك كلّ الواجهات تعمل والموافقات مطفأة.
وحفنةُ أفعالٍ لا تكون إلا في نافذة — منتقيات الملفات، والإظهار في المجلد — تُرفض بالاسم ومعها طريقةُ الطرفية نفسها إلى الشيء ذاته (pass file paths instead: wolffish -f <path>). وعلى جهازٍ بلا شاشة، يطبع /open مكانَ الملف بدل أن يتظاهر بفتحه.

الطرفية قناة

المحادثة التي تبدأ من الطرفية محادثةٌ حقيقية على قناةٍ حقيقية — مُعرِّفها cli وعنوانها Terminal. ترتدي شارة مصدرها الخاصة في سجلّ سطح المكتب وقائمة محادثاته وعلى قوائم هاتفك، وجدولُ قنوات الوكيل نفسه يسمّي الطرفية طريقاً إليك، تماماً مثل تيليجرام وواتساب والهاتف. وتحمل الإعدادات ← القنوات ← CLI مقبضيها الاثنين: عرض كل نشاط الأدوات (وكان اسمه نتائج المهام المفصّلة حتى الإصدار 1.0.288)، والإقلاع التلقائي — مع --tools / --clean لتجاوزه لأمرٍ واحد. وتجيب اللوحة أيضاً عن سؤال ما إذا كان أمر wolffish على PATH عندك — من PATH صدفتك أنت، لا PATH التطبيق — وتثبّته إن لم يكن، وتنزعه حين تريده أن يذهب، وتحذّر حين يتقدّم شيءٌ آخر اسمه wolffish عليه. ومن جهة الطرفية، تسكن الإجابات نفسها تحت wolffish path status وwolffish path install. وعلى لينكس، حزمتا .deb و.rpm تشحنان الأمر عند /usr/bin/wolffish، حاضراً لحظةَ ينتهي التثبيت. ومنذ الإصدار 1.0.296 لم يبقَ شيءٌ تلصقه. كان تثبيت العميل يكتب الأمر في مجلّدٍ لا تنظر إليه أيّ صدفة، فيترك لك الخطوة الأخيرة — إضافةَ سطرٍ إلى ملفّ صدفتك، بيدك، على كلّ جهاز. وصار التطبيق الآن يضع المجلّد على PATH بنفسه: كتلةٌ معلَّمة في ملفّات الصدفة على macOS ولينكس، وPATH المستخدم على ويندوز. يُفحَص عند كلّ إقلاع، ويُنزَع نظيفاً عند إلغاء التثبيت، ولا يمسّ سطراً كتبتَه أنت. وصارت الإعدادات وwolffish path وشاشات الحالة تقول «افتح طرفيةً جديدة» بدل أن تسلّمك شيئاً تنسخه، ولا تُظهر السطر اليدويّ إلّا إن عجز التطبيق. (وفي الإصدار نفسه أُصلح العثور على الأمر في ويندوز: صار يُطابَق مهما كانت حالة أحرف اسمه على القرص.)

على ويندوز

يُشحن وولفيش تطبيقاً ذا نوافذ، وويندوز لا يمنح البرنامجَ ذا النوافذ أيَّ سبيلٍ للكتابة في الكونسول الذي أطلقه — ولهذا كانت كتابةُ wolffish، قبل الإصدار 1.0.256، تكسبك سطراً فارغاً وعودةَ المطالبة إليك في الحال. فأُضيف رفيقُ كونسولٍ صغير بجانب التطبيق، عملُه الوحيد أن يُبقي طرفيةً حقيقية مفتوحة ويسلّمها إلى وولفيش. ومنذ الإصدار 1.0.295 صار العميل برنامج كونسول مترجَماً بذاته، فذهب ذلك الرفيق — لكنّ السلوك الذي اشتراه لم يتغيّر، ويسلك الأمرُ سلوكَ الأوامر في كلّ مكان:
  • wolffish تفتح جلسةً وتبقى مفتوحة — كانت من قبل تطبع مطالبتها وتخرج قبل أن تبلغ يدُك لوحةَ المفاتيح.
  • الأنابيب تعمل في الاتجاهين: type notes.txt | wolffish -p "what changed?" يرسل الملف حقاً، وwolffish --help | findstr يرشّح ما ينبغي له أن يرشّحه.
  • تعود الألوانُ ورسومُ الصناديق وعرضُ نافذتك الحقيقي، والسرُّ المكتوب عند مطالبةٍ يُخفى بدل أن يُترك جاثماً في سجلّ تمريرك.
  • وGit Bash يجده أيضاً. يبحث bash عن ملفٍّ اسمه wolffish بالضبط بينما يبحث cmd وPowerShell عن wolffish.cmd؛ ووولفيش يثبّت الاثنين، فتجد كلُّ صدفةٍ ما تبحث عنه. وداخل Git Bash تنال الجلسةُ طرفيةً حقيقيةً موصولةً إليها جسراً — فالألوان والمطالبات والكتابة كلّها تسلك كما ينبغي — بينما تُترك الأنابيب وإعادةُ التوجيه كما هي تماماً.

الاقتران من الطرفية

القنوات الثلاث التي تحتاج مصافحةً تقترن كلّها من هنا — بُنيت للجهاز الذي لن تُفتح عليه نافذةٌ أبداً:
ورمز QR يُقاس قبل أن يُرسم: رمز الاقتران يحتاج 27 صفاً ونافذة SSH المعتادة 24، فحين لا يتّسع يقول الأمر ذلك بالأرقام الدقيقة ويتحوّل إلى الرمز المكتوب من تلقاء نفسه — والأمر نفسه لواتساب، الذي لا يتّسع رمزه أبداً فيرتبط برقم الهاتف بدلاً منه. انظر تطبيق الهاتف لمعنى الاقتران، والنشر على خادم لِمَ الهاتفُ المقترن أفضلُ واجهةٍ يملكها خادم.

المرجع

ورموز الخروج صادقة: 0 نجح الأمر، و1 أخفق الشيء أو ليس في الحال التي سألت عنها، و2 استعملت الأمر خطأً — والكلمة الواحدة المكتوبة خطأً تنال أتقصد كذا؟، بدل أن تُرسل إلى النموذج سؤالاً فتُنفق دوراً حقيقياً لتُخبَر أنّها لم تُفهم. وما لم يُتعرَّف عليه أمراً عومل طلباً.

النشر على خادم

الطرفية وُجدت للجهاز الذي لا شاشة له — تثبيتُ VPS متحقَّقٌ منه من طرفٍ إلى طرف على Ubuntu 24.04، يعمل خدمةً في الخلفية، وهاتفُك الواجهةُ اليومية.