المساهمة
نرحب بتقارير الأخطاء والأفكار والترجمات والوثائق والكود. توضح هذه الصفحة أين تجري المحادثات، وكيف ترسل تغييراً، والمواثيق التي يتبعها الكود، والقواعد المتعلقة بمشاكل الأمان والرخص.
أين تجري المحادثات
تبدأ كل الأمور في مستودع المجتمع، بغض النظر عن الجزء الذي يتعلق به الأمر في Antimatter:
- الأخطاء وطلبات الميزات: افتح مشكلة واختر تقرير خطأ، طلب ميزة، أو طلب إضافة أو تكامل. ابحث أولاً في المشكلات الموجودة؛ إذا كانت مشكلتك موجودة، أضف إبهاماً مرفوعاً أو تفاصيلك.
- الأسئلة والأفكار: المناقشات، في فئتي الأسئلة والأجوبة والأفكار.
- قبل إجراء تغيير كبير، افتح مشكلة أو نقاشاً للاتفاق على النهج أولاً. هذا يوفر طلب دمج لا يمكن دمجه كما هو.
تُعدّ المشكلات المُصنَّفة بـ good first issue و help wanted نقطة بداية جيدة. اذكر في تعليق أنك تعمل على إحداها. تُصنَّف المشكلات الجديدة بـ status/triage، ثم status/accepted أو status/planned أو status/wontfix. تبقى المشكلات في مستودع المجتمع بغض النظر عن موضوعها: فلا تقبل مستودعات الشفرات المشكلات. الأعمال المخطط لها موجودة في خارطة طريق Antimatter.
المستودعات والفروع
الكود موجود في منظمة AntimatterChat؛ أين يوجد الكود يحدد المستودعات. في كل مستودع:
mainهو الفرع الافتراضي ويحتوي على كود Antimatter. أنشئ فرعاً منه وأرسل طلبات الدمج إليه.- المستودعات المنشقة من Mattermost لديها أيضاً فرع
upstream، وهو مرآة لكود Mattermost تُستخدم لجلب تغييراته. لا تبني عملك عليه.
يشرح ملف README الخاص بكل مستودع كيفية البناء واختباره. للخادم والواجهات الويب، راجع البناء من المصدر؛ للتطبيقات، البناء والتثبيت والتشخيص.
طلبات الدمج
- انسخ المستودع وأنشئ فرعًا من
main. - اجعل كل طلب سحب يتضمن تغييرًا واحدًا فقط. تُراجع طلبات السحب الصغيرة بشكل أسرع.
- اتبع نمط الكود المحيط بك، وأضف أو حدّث الاختبارات حيث يكون ذلك منطقيًا.
- اشرح ما قمت بتغييره ولماذا، واربط المشكلة التي يعالجها التغيير:
Fixes AntimatterChat/community#123. - تأكد من نجاح الفحوصات. سيقوم أحد المشرفين بمراجعة طلب السحب وقد يطلب إجراء تغييرات.
في مستودع الخادم، املأ قالب طلب السحب: ملخص، وقسم ملاحظة الإصدار، الذي يجب أن يكون موجودًا دائمًا. اكتب NONE فيه عندما لا يمس التغيير واجهة برمجة التطبيقات، أو الإعدادات، أو مخطط قاعدة البيانات، أو السلوك المرئي.
بمساهمتك، أنت توافق على أن مساهمتك مرخصة بموجب ترخيص المستودع الذي تساهم فيه.
الالتزامات ونمط الكود
الالتزامات
رسائل الالتزامات في السجل عبارة عن جملة قصيرة واحدة توضح التغيير، وتُكتب بحالة الجملة (أول حرف كبير) وبدون نقطة في النهاية. تُسبق التغييرات في جزء معين باسم ذلك الجزء، على سبيل المثال Fusion: a compact conversation header on phones أو Server: community attributes, and admin-only user attributes. التزام واحد لكل تغيير؛ اشرح الأسباب في نص الرسالة عندما لا تكون واضحة.
الخادم (Go)
- شغّل
make check-styleفيserver/قبل الدفع. - لا تشغّل
go mod tidyمباشرةً؛ شغّلmake modules-tidyبدلاً من ذلك. - في مسارات الطلبات، سجّل الأحداث باستخدام مسجّل الطلب. في طبقة التخزين، استخدم
request.CTXبدلاً منcontext.Context. - توضع نقاط نهاية واجهة برمجة التطبيقات الجديدة في
server/channels/api4، مع أنواعها فيserver/public/model، ومن الأفضل وجود طريقة فيmodel.Client4وفي عميل TypeScript.
واجهات الويب (TypeScript و React)
- شغّل
make check-styleوmake check-typesفيwebapp/. - تتبع الواجهة الكلاسيكية
webapp/STYLE_GUIDE.md: مكونات وظيفية، خطافات (hooks) لـ Redux، متغيرات موضوع (theme) للألوان، وعلامات HTML ميسّرة الوصول. - تقع مكونات Fusion في
webapp/fusion/src/fusion، مع أنماطها فيwebapp/fusion/src/fusion/styles. تُنشئ أسماء الفئات باستخدام مساعدam()وتستخدم رموز التصميم الخاصة بـ Fusion؛ اتبع الملفات المجاورة لملفاتك. - لا تضف متغيرات عامة جديدة
window.*للتطبيقات. تُوضع الأدوات الجديدة الموجهة للتطبيقات تحتwindow.WebappUtils، كما يوضحwebapp/AGENTS.md. - التغييرات في سجل التطبيقات (
plugins/registry.ts) تنتمي عادةً إلى نسخ كلا الواجهتين.
الترجمات
يتم ترجمة Antimatter وتطبيقاتها المدمجة إلى 37 لغة. يضيف المساهمون النصوص الإنجليزية، بينما تُحدَّث اللغات الأخرى على دفعات.
إضافة نص إلى الواجهات الويب
- اكتبه مع معرّف ونص إنجليزي حرفي:
formatMessage({id: 'fusion.channelMenu.settings', defaultMessage: 'Channel settings'})أو<FormattedMessage id='…' defaultMessage='…'/>. النص الإنجليزي المعروض في التطبيق يأتي منdefaultMessage. - شغّل
make i18n-extractفيwebapp/(أوnpm run i18n-extractفيwebapp/fusionأوwebapp/channels). يقوم هذا بتحديث ملفsrc/i18n/en.jsonالخاص بذلك الحزمة. - املأ حقل
descriptionالخاص بالعنصر الجديد فيen.json: أين يظهر النص وكيف يُستخدم. هذا هو السياق الذي يعمل منه المترجمون، سواء كانوا بشراً أو آلات.
يفشل npm run i18n-extract:check عندما يكون en.json غير محدث مقارنةً بالكود.
إضافة نص إلى الخادم
- استخدم معرّفاً في الكود، على سبيل المثال
model.NewAppError(…, "app.community_attributes.invalid.app_error", …)أوi18n.T("…"). - شغّل
make i18n-extractفيserver/. يضيف هذا المعرّف إلىserver/i18n/en.jsonبالترتيب الصحيح. - اكتب
translationالإنجليزية وdescriptionللعنصر الجديد.
اللغات الأخرى
لكل لغة ملفها الخاص بجانب en.json (fr.json، pt-BR.json، zh-TW.json…). للإبلاغ عن ترجمة خاطئة، افتح مشكلة (issue) في مستودع المجتمع مع ذكر اللغة والنص والمكان الذي يظهر فيه.
تحتفظ التطبيقات المدمجة بنصوصها في webapp/i18n/؛ راجع الترجمات في صفحة التطبيقات.
التوثيق وهذا الموقع
هذا الموقع وتوثيقه موجودان في مستودع antimatter.chat. الصفحات هي مقاطع HTML في src/pages/؛ python3 src/build.py يبني الموقع. التصحيحات والتفسيرات الناقصة مرحّب بها كمشكلات أو طلبات سحب (pull requests).
مشاكل الأمان
أبلغوا عن ذلك بشكل خاص عبر خاصية الإبلاغ عن الثغرات الأمنية الخاصة في GitHub: افتحوا تبويب الأمان في المستودع المتأثر (على سبيل المثال الخادم) واختر الإبلاغ عن ثغرة أمنية. إذا لم تكن على دراية بالمستودع المتأثر، فأبلغوا عنه في مستودع المجتمع. اذكروا المكوّن وإصداره، وما يمكن للمهاجم فعله، وكيفية إعادة إنتاج المشكلة، وأي إعدادات تعتمد عليها.
يجيب المسؤولون هناك، ويُبقيونك على اطلاع أثناء إصلاحهم، وينشرون تنبيهاً أمنيًا بمجرد إصدار الإصدار المُصلَح. يُرجى منحهم وقتًا معقولاً قبل الكشف عن المشكلة. تُدمج الإصلاحات في أحدث إصدار. السياسة الكاملة متوفرة في سياسة الأمان.
التراخيص
- الخادم مرخّص بموجب رخصة جنو العمومية العامة Affero v3.0 (AGPL v3). في نفس المستودع، أدوات الإدارة وملفات الإعداد (
server/templates/،server/i18n/،server/public/وwebapp/) مرخّصة بموجب رخصة Apache 2.0. راجعواLICENSE.txtوNOTICE.txt. - التطبيقات: تطبيقات Antimatter الخاصة، مثل الاستطلاعات، مرخّصة بموجب AGPL v3؛ أما التطبيقات المشتقة من Mattermost فتحتفظ برخصتها الأصلية. يوضح كل مستودع ذلك في ملف
LICENSEالخاص به. - تطبيقات سطح المكتب والجوال مرخّصة بموجب رخصة Apache 2.0. مستودع Docker مرخّص بموجب رخصة Apache 2.0، باستثناء
Dockerfileالذي هو مرخّص بموجب AGPL v3.
تعني رخصة AGPL أنه إذا قمت بتشغيل خادم Antimatter معدّل لأشخاص آخرين عبر شبكة، فيجب أن توفر لهم كود المصدر لتغييراتك. Antimatter مبني على Mattermost؛ وهو غير تابع لشركة Mattermost, Inc. ولا تحظى بدعمها.
يتبع جميع المشاركين مدونة السلوك.