سياسة الشارات
تحديد مصادر الشارات الديناميكية والثابتة لملف README، بما يشمل حالة سير العمل الأصلية في GitHub، وملفات JSON لنقاط نهاية shields.io، وأشكال الشارات الثابتة.
هذه الوثيقة هي المرجع المعتمد لشريط الشارات في README وللبنية التحتية التي تنشر مصادر بياناته الديناميكية. كل شارة في README المشروع تُحَلّ عبر أحد الأشكال الثلاثة المحدّدة هنا؛ والشارات الجديدة التي تُضاف مستقبلًا تتبع الأشكال نفسها وإلا رُفِضت في المراجعة.
1. الخلفية
عناوين https://img.shields.io/badge/X-Y-Z الثابتة لا تتغيّر من تلقاء
نفسها أبدًا، فتبتعد عن الحالة الحقيقية للمشروع — إذ تظلّ شارة
release-vN-blue تعرض vN لوقت طويل بعد شحن vN+1.
لذلك تشترط السياسة أشكالًا ديناميكية لكل قيمة متغيّرة، وتقصر الشارات الثابتة على
المجموعة الصغيرة من القيم (الرخصة، ونسخة Python المستهدفة) التي نادرًا ما
تتغيّر، حيث يكون الشكل الثابت صادقًا.
2. المعمارية
أربعة أشكال تغطّي كل شارة في المشروع:
- شارات حالة سير العمل الأصلية في GitHub. يأخذ عنوان شارة سير العمل
الشكل
https://github.com/<owner>/<repo>/actions/workflows/<file>/badge.svgويعكس آخر تشغيل على الفرع الافتراضي. ويقدّم GitHub الشارة من البيانات الوصفية العامة للمستودع. - شارات نقاط نهاية shields.io. تَحُلّ شارة نقطة نهاية
shields.io عنوانًا من الشكل
https://img.shields.io/endpoint?url=<published-json>حيث يتوافق ملف JSON مع مخطط نقطة نهاية shields.io (schemaVersion، وlabel، وmessage، وcolor). ويقع ملف JSON المنشور فيapothem.ahmedgad.com/badges/*.json؛ ويُولِّد محتواه سيرُ عمل CI في كل تشغيل CI ناجح. وتُبقي شارات نقاط النهاية المقاييسَ تحت نشر يتحكّم فيه المشروع بدلًا من مخزن قابل للتعديل لدى طرف ثالث. - الشارات الثابتة من shields.io. تأخذ الشارة الثابتة الشكل
https://img.shields.io/badge/<label>-<message>-<color>دون مصدر بيانات تفاعلي. وهي مقصورة على القيم التي نادرًا ما تتغيّر فعلًا (مُعرِّف الرخصة، ونسخة Python المستهدفة). - شارات السجلّ وبطاقة التقييم. شارة يحسب قيمتها طرف ثالث من بيانات عامة يملكها أصلًا: سجلّ npm (النسخة والتنزيلات، ويعرضها shields.io) وواجهة برمجة OpenSSF Scorecard. لا ينشر المشروع أي شيء لهذه الشارات؛ فالطرف الثالث هو المصدر.
نشر مقاييس المشروع عبر Gist عامة مُستبعَد بحكم التصميم. ونقاط نهاية shields.io على النطاق الذي يتحكّم فيه المشروع هي البديل المعتمد.
3. المواصفات لكل شارة
يسرد الجدول شريط الشارات في README بالترتيب. ويُعلِّم العمود الأخير الشارات التي لا تظهر صورتها إلا ما دام المستودع عامًا: فـ GitHub لا يقدّم شارة سير العمل لمستودع خاص إلا للأعضاء الذين سجّلوا الدخول، وScorecard لا يفحص إلا المستودعات العامة.
| الشارة | الشكل | المصدر | شكل العنوان | تتطلّب مستودعًا عامًا |
|---|---|---|---|---|
| أحدث إصدار | نقطة نهاية shields.io | badges/release.json | https://img.shields.io/endpoint?url=https%3A%2F%2Fapothem.ahmedgad.com%2Fbadges%2Frelease.json | لا |
| حالة CI | أصلي في GitHub | .github/workflows/ci.yml | https://github.com/ahmed-g-gad/apothem/actions/workflows/ci.yml/badge.svg?branch=main | نعم |
| الرخصة | ثابت من shields.io | LICENSE (MIT) | https://img.shields.io/badge/license-MIT-0F172A | لا |
| نسخة npm | سجلّ | سجلّ npm | https://img.shields.io/npm/v/%40ahmed-g-gad%2Fapothem?color=10B981&label=npm | لا |
| بوابة التغطية | ثابت من shields.io | pyproject.toml fail_under = 80 | https://img.shields.io/badge/coverage%20gate-%E2%89%A580%25-2563EB | لا |
| OpenSSF Scorecard | بطاقة تقييم | نتائج .github/workflows/scorecard.yml | https://api.securityscorecards.dev/projects/github.com/ahmed-g-gad/apothem/badge | نعم |
| الملاحظات | ثابت من shields.io | GitHub Issues | https://img.shields.io/badge/feedback-GitHub%20issues-7C3AED | لا |
| الوثائق | ثابت من shields.io | موقع الوثائق | https://img.shields.io/badge/docs-Fumadocs-0F172A | لا |
| تنزيلات npm | سجلّ | سجلّ npm | https://img.shields.io/npm/dm/%40ahmed-g-gad%2Fapothem?color=10B981&label=downloads | لا |
لا يُفتَح هدف الرابط لأي شارة على github.com (الإصدارات، وسير العمل، وملف
الرخصة، والمسائل) إلا ما دام المستودع عامًا.
ينشر سير عمل الشارات أيضًا ملفات نقاط النهاية coverage.json
وsecurity.json وsupply-chain.json وdocs.json
لشارات مستقبلية؛ ولا يعرضها README اليوم.
يعمل CodeQL بوصفه سير عمل مخصّصًا هو .github/workflows/codeql.yml
يحلّل سطحَي Python وActions؛ أمّا مهمة security-scan في
ci.yml فلا تُشغِّل إلا bandit، تاركةً نشر CodeQL SARIF
لـ codeql.yml. وتستهلك شارة الأمان ملف JSON لنقطة النهاية الذي
ينشره سير عمل الشارات بدلًا من شارة سير عمل أصلية في GitHub، فتبقى الشارة
مستقرّة مهما تغيّرت بنية الماسحات الكامنة.
4. آلية نشر JSON
يُنتِج .github/workflows/badges.yml ملفات JSON لنقاط النهاية.
وسير العمل هذا:
- يُطلَق عند
workflow_runبعد اكتمال سير العملci(وعندworkflow_dispatchاليدوي لإعادة النشر دون تشغيل CI). - يحدّد أحدث وسم إصدار عبر
git describe --tags --abbrev=0 --match 'v[0-9]*.[0-9]*.[0-9]*'على نسخة مسحوبة بالسجلّ الكامل (fetch-depth: 0؛ ففي نسخة مسحوبة بعمق 1 لا يمكن الوصول إلى أي كوميت موسوم وتعرض الشارةunreleased)، ونتيجة CI الأب من حدثworkflow_run. - يُولِّد كل ملف JSON عبر
jq -nبحيث يطابق الخرج بصرامة مخطط نقطة نهاية shields.io (schemaVersion: 1، إضافةً إلىlabelوmessageوcolor). - يتحقّق من كل ملف JSON مُصدَر بـ
jq -eقبل الرفع. - يرفع الدليل بوصفه مُنتَج سير عمل باسم
badges.
يتولّى .github/workflows/publish-static-site.yml نشر المُنتَجات إلى
apothem.ahmedgad.com/badges/. فأثناء بناء الموقع، يُنزِّل سير العمل ذاك
أحدث مُنتَج badges ناجح ويُجهِّزه تحت site/dist/badges/. وإذا
كان المُنتَج غائبًا أو منتهي الصلاحية، يُنشَر الموقع رغم ذلك ويُسجِّل غياب مُنتَج الشارات
في سجلات سير العمل بدلًا من نشر JSON معطوب.
5. بروتوكول الصيانة
أضِف شارة جديدة بتحديد شكلها أولًا:
- إذا كانت الشارة تعكس حالة تشغيل سير عمل CI، ففضِّل الشكل الأصلي في GitHub. فعنوان الشارة يحدّده ملف سير العمل؛ ولا تلزم أي بنية تحتية للنشر.
- إذا كانت الشارة تعكس مقياسًا (عددًا، أو نسبة مئوية، أو سلسلة نسخة، أو تسمية متدرّجة)
يتحدّث مع الوقت، فاستخدم شكل نقطة نهاية shields.io. أضِف خطوة توليد
JSON إلى
.github/workflows/badges.ymlإلى جانب الخطوات الخمس الموجودة، وأضِف عنوان المستهلِكapothem.ahmedgad.com/badges/<name>.jsonإلى شريط الشارات في README. - إذا كانت الشارة تعكس قيمة نادرًا ما تتغيّر فعلًا (الرخصة، أو اللغة المستهدفة، أو وضع الحوكمة)، فاستخدم الشكل الثابت من shields.io. ووثِّق وتيرة التغيير في جدول المواصفات لكل شارة في هذا الملف عند إضافة الشارة.
أوقِف شارة بإزالتها من README أولًا، ثم إزالة خطوة توليد JSON الخاصة بها من سير عمل الشارات، ثم إزالة صفّها من جدول المواصفات لكل شارة أعلاه. واجعل الحذف ذرّيًا كي لا يشير README أبدًا إلى مُنتَج JSON لا يُنتِجه سير العمل.
6. المراجع المتقاطعة
- سير عمل CI الذي تعكس شارة CI الأصلية في GitHub حالة
تشغيله:
.github/workflows/ci.yml. - سير عمل الشارات الذي ينشر ملفات JSON لنقاط النهاية:
.github/workflows/badges.yml. - نطاق الموقع الثابت الذي يقدّم ملفات JSON:
apothem.ahmedgad.com. - مرجع مخطط نقطة نهاية shields.io: https://shields.io/badges/endpoint-badge.