لو فاتح GitHub الساعة 9 الصبح وقدامك 14 PR، 6 منهم محتاجين review، وانت مش عارف تبدأ بمين ولا أنهي مهم — انت بتدفع 45 دقيقة كل صباح في "تخطيط للمراجعة" قبل ما تبدأ تراجع فعلًا. الـ workflow اللي قدامك بيخلّي Claude Haiku 4.5 يقرا الـ 14 PR في 11 ثانية، يرتّبهم حسب المخاطرة وحجم التغيير، ويبعت لك الترتيب على Slack الساعة 7 الصبح قبل ما تفتح اللاب.
ليه الموضوع ده مهم لك كـ tech lead أو senior
اللي بيحصل فعلًا في معظم الفرق: الـ PRs بتتراكم لأن مفيش طريقة سريعة تعرف منها مين هيكسر الإنتاج لو اتدمج بدون مراجعة دقيقة، ومين مجرد typo fix. النتيجة: حد بيدمج PR ضخم على عجلة قبل الـ standup، أو bottleneck في PRs مهمة ساعات لأن الـ reviewer ما عرفش إنها urgent.
المشكلة باختصار
تخيّل مدير وردية الصبح في مطعم. أول ما ييجي الساعة 7، بيلاقي ورق محشور في الأدراج: 12 طلب أمس متأخر، 3 شكاوى، 5 طلبات حجز جديدة. لو كل ورقة هيقعد يفتحها يقرأها يحدد أولويتها، الفطار هيتأخر. بدل كده، عنده مساعد بيوصل قبله بساعة، يفصل الورق على 3 طاولات: "اعمل دلوقتي"، "اعمل بعد الظهر"، "اتجاهل". المدير يدخل، يبص على الطاولة الأولى، ويبدأ شغل.
الـ PRs نفس الفكرة بالظبط. الـ workflow ده هو المساعد اللي بيرتّب الورق قبل ما تيجي.
التعريف العلمي
الـ GitHub Actions بيشغّل cron job كل يوم 7 صباحًا (UTC+2 = 5 UTC). الـ job بينادي GET /repos/{owner}/{repo}/pulls?state=open ويجيب metadata كل PR (العنوان، الوصف، عدد الملفات، عدد السطور المعدّلة، الـ author، عدد التعليقات). بعدين بيرسل القائمة دي لـ Claude Haiku 4.5 عبر Anthropic Messages API مع system prompt يحدد معايير التقييم. النموذج بيرجّع JSON منسق فيه: تصنيف المخاطرة (low/medium/high)، تقدير وقت المراجعة بالدقايق، وسبب التصنيف في جملة. الناتج بيتحوّل لـ Slack Block Kit ويتبعت عبر Incoming Webhook.
الـ workflow كامل — انسخه على repo فاضي يشتغل
أنشئ ملف .github/workflows/morning-pr-digest.yml:
name: Morning PR Digest
on:
schedule:
- cron: '0 5 * * 1-5' # 7 ص بتوقيت القاهرة، أيام الشغل فقط
workflow_dispatch: # علشان تجربه يدوي
jobs:
digest:
runs-on: ubuntu-latest
permissions:
pull-requests: read
contents: read
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
- run: pip install anthropic==0.45.0 requests==2.32.3
- run: python scripts/pr_digest.py
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
REPO: ${{ github.repository }}