
واجهة سطر أوامر بلغة Python تقوم بإنشاء مستودعات GitHub مع إعدادات افتراضية آمنة — حماية الفروع، Dependabot، فحص الأسرار، وفحص أمني قبل التنفيذ — مطبقة تلقائيًا.
أنشئ مستودعات GitHub مع تطبيق الإعدادات الافتراضية الآمنة تلقائيًا. استبدل قائمة التحقق التي تستغرق خمس دقائق بعد الإنشاء بأمر واحد.``` gh-safe-repo create <owner/repo>
حماية الفروع، الوسوم غير القابلة للتغيير، Dependabot، أذونات Actions المقيّدة، وفحص الأسرار مع حماية الدفع — كلها مُهيّأة قبل أن تكتب أول سطر من الكود.
> **الحالة:** gh-safe-repo يخضع لتطوير مكثّف. يعمل بشكل جيد لحالة الاستخدام الأساسية — إنشاء مستودع جديد بإعدادات افتراضية آمنة — لكن خيارات CLI لا تزال قيد الصقل لتتوافق بشكل أفضل مع توقعات المستخدمين. توقّع تغييرات جذرية حتى يتم تثبيت الإصدارات و CI/CD. ✌️
---
## ما الذي تحصل عليه
الإعدادات الافتراضية لـ GitHub مُحسّنة لقابلية الاكتشاف والمرونة، وليس للأمان: كل مستودع جديد يأتي بدون حماية للفروع، وبدون Dependabot، و Actions لديها صلاحية الكتابة على المستودع ويمكنها الموافقة على طلبات السحب الخاصة بها.
`gh-safe-repo` يصلح كل ذلك دفعة واحدة، مع عرض خطة أولاً:
- **خاص افتراضياً** — مرّر `--public` عندما تريد أن يراه العالم
- **حماية الفروع** — PR مطلوب، مراجعة موافقة واحدة، رفض المراجعات القديمة، حل المحادثات، لا دفع قسري، لا حذف للفروع
- **وسوم غير قابلة للتغيير** — لا يمكن إعادة كتابة وسوم الإصدارات أو حذفها
- **Actions مُقيّدة** — رمز للقراءة فقط، لا موافقة ذاتية على PRs، Actions مثبّتة بـ SHA، ناشرون مملوكون لـ GitHub وموثّقون فقط
- **Dependabot مُفعّل** — تنبيهات الثغرات بالإضافة إلى PRs إصلاح تلقائية
- **فحص الأسرار مع حماية الدفع** — الالتزامات التي تحتوي على أسرار مدعومة يتم حظرها
- **الإبلاغ الخاص عن الثغرات** — يمكن للباحثين الوصول إليك دون الإعلان العام
- **فحص الأسرار المسبق** — عند دفع كود موجود (`--local` / `--from`)، يتم فحص شجرة العمل وسجل git محلياً قبل وصول أي شيء إلى GitHub
- **إضافات اختيارية** — wiki و projects و issues تُترك دون تغيير إلا إذا طلبت إدارتها (`has_wiki = false` في الإعدادات)
كل شيء قابل للتخصيص. راجع [الإعدادات الافتراضية الآمنة بالكامل](#safe-defaults-in-full) للإعدادات الدقيقة و[الإعدادات](#configuration) لكيفية تغييرها.
## المتطلبات
- **Python 3.10+**
- **[`gh` CLI](https://cli.github.com/)** مُصادَق عليه (`gh auth login`)، **أو** `GITHUB_TOKEN` مضبوط في بيئتك
- **[`uv`](https://docs.astral.sh/uv/)** للتثبيت من المصدر
- **truffleHog v3** *(اختياري)* — يُستخدم بواسطة الفاحص المسبق؛ يُكتشف تلقائياً من PATH أو يُشغّل عبر podman/docker، مع بديل regex إذا لم يوجد أي منهما
دفع الكود باستخدام `--local` أو `--from` يتطلب إضافةً إلى ذلك بيانات اعتماد git العادية الخاصة بك لـ GitHub — راجع [العمل من كود محلي أو موجود](#working-from-local-or-existing-code).
## التثبيت```bash
git clone https://github.com/AriESQ/gh-safe-repo
cd gh-safe-repo
uv tool install .
gh-safe-repo --help
يُثبّت هذا الأمر gh-safe-repo في بيئة أدوات uv ويضيفه إلى PATH الخاص بك.
لتشغيله دون تثبيت:```bash uv sync # creates .venv ./gh-safe-repo create <owner/repo>
## مستودعك الأول
**1. المعاينة.** `--dry-run` لا يُجري أي استدعاءات API — لا يتم إنشاء أي شيء:```
$ gh-safe-repo create AriESQ/demo-repo --dry-run
Configuring AriESQ/demo-repo...
Planned Changes
Type Category Setting Value / Note
------ ----------------- -------------------------------------- ----------------------------------------------------------------
ADD repo repository AriESQ/demo-repo
DELETE file readme README.md
UPDATE actions allowed_actions 'all' → 'selected'
UPDATE actions verified_allowed False → True
UPDATE actions sha_pinning_required False → True
UPDATE actions default_workflow_permissions 'write' → 'read'
UPDATE actions can_approve_pull_request_reviews True → False
SKIP branch_protection branch_protection Branch protection requires a public repo or paid GitHub plan
SKIP security dependabot_alerts Requires a public repo or paid GitHub plan
SKIP security secret_scanning Requires a public repo or paid GitHub plan
SKIP security dependabot_security_updates Requires a public repo or paid GitHub plan
SKIP security private_vulnerability_reporting Requires a public repo or paid GitHub plan
SKIP security enable_dependency_graph Requires a public repo or paid GitHub plan
SKIP security enable_secret_scanning_push_protection Requires a public repo or paid GitHub plan
SKIP tag_protection tag_protection Tag protection rulesets require a public repo or paid GitHub plan
7 change(s) to apply, 8 skipped
Dry run — no changes made.
صفوف SKIP أعلاه هي مستودع خاص بالخطة المجانية: تلك الميزات تحتاج إلى مستودع عام أو خطة مدفوعة. لا شيء يفشل بصمت — راجع قيود خطة GitHub.
2. التطبيق. نفس الأمر بدون --dry-run. تحصل على نفس الخطة، ثم مطالبة تأكيد (--yes تتخطاها):```bash
gh-safe-repo create AriESQ/demo-repo
**3. ابدأ العمل.** عند النجاح تحصل على رابط المستودع وأوامر remote جاهزة للصق:```
╭─ Done ───────────────────────────────────────────────────╮
│ Repository created successfully! │
│ https://github.com/AriESQ/demo-repo │
│ │
│ Add remote to existing repo: │
│ SSH : git remote add origin [email protected]:AriESQ/… │
│ HTTPS: git remote add origin https://github.com/… │
│ │
│ Clone fresh: │
│ SSH : git clone [email protected]:AriESQ/demo-repo.git │
│ HTTPS: git clone https://github.com/AriESQ/demo-… │
╰──────────────────────────────────────────────────────────╯
تُسرد النطاقات البعيدة مع البروتوكول المفضل لديك أولاً (gh config get -h github.com git_protocol).
gh-safe-repo create <owner/repo> # private (default) gh-safe-repo create <owner/repo> --public # public — branch and tag protection apply
`create` عادي يهيّئ المستودع بحيث يوجد فرع افتراضي (حماية الفروع تحتاج إلى واحد)، ثم يحذف `README.md` المُنشأ تلقائيًا حتى تبدأ من صفحة بيضاء. اضبط `auto_init = true` في الإعدادات للإبقاء عليه.
### دفع مشروع محلي موجود```bash
gh-safe-repo create <owner/repo> --local ~/projects/myapp
يقوم بفحص الدليل بحثًا عن الأسرار أولاً، ثم ينشئ المستودع، ويدفع جميع الفروع والوسوم، ثم يربط origin وتتبع المصدر في دليلك الأصلي بحيث يعمل git push فورًا. يتم ترك origin موجود يشير إلى مكان آخر كما هو؛ ويخبرك تحذير ولافتة النجاح بأمر git push -u origin <branch>:<branch> الدقيق الذي يجب تشغيله بدلاً من ذلك. راجع العمل من كود محلي أو موجود.
gh-safe-repo create <owner/repo> --from <owner/source> gh-safe-repo create <owner/pub> --from <owner/priv> --public # the riskiest move — scanned thoroughly
يستنسخ المصدر بكامل تاريخه، ويفحصه، وينسخه إلى مستودع جديد بإعدادات افتراضية آمنة. إذا أوقفت العملية عند مرحلة الفحص، فلن يصل أي كود إلى المستودع الجديد.
### تدقيق مستودع لديك بالفعل```bash
gh-safe-repo fix <owner/repo> --dry-run # what's out of compliance?
gh-safe-repo fix <owner/repo> # apply the missing defaults
gh-safe-repo fix <owner/repo> --yes # no prompt, for scripts
fix يجلب القيمة الحالية لكل إعداد، ويعرض UPDATE لما يختلف وSKIP لما هو صحيح بالفعل، ولا يجري أي استدعاءات API للعمليات غير الفعلية. إنه للإعدادات فقط — لا فحص للأسرار. تحتاج إلى صلاحيات المسؤول على المستودع، والذي يمكن أن يكون مملوكًا لمنظمة أو حساب آخر.