
أداة سطر أوامر مبنية على Go تقوم بمسح قواعد الأكواد للتأكد من جاهزيتها للإطلاق، حيث تكتشف التكوينات المفقودة، مشكلات الأمان، تسريبات الأسرار، والفجوات في التكامل قبل النشر في الإنتاج.
Preflight.sh هي أداة سطر أوامر تفحص قاعدة الكود لديك للتحقق من جاهزية الإطلاق. تحدد الإعدادات المفقودة، مشاكل التكامل، المخاوف الأمنية، الثغرات في بيانات SEO الوصفية، وغيرها من الأخطاء الشائعة قبل النشر إلى الإنتاج.
لا تحرج نفسك في الإنتاج. فقط قم بتشغيل الأمر.
brew install preflightsh/preflight/preflight
npm install -g @preflightsh/preflight
go install github.com/preflightsh/preflight@latest
docker pull ghcr.io/preflightsh/preflight
curl -sSL https://preflight.sh/install.sh | sh
قم بتنزيل أحدث إصدار من GitHub Releases.
# التهيئة في دليل مشروعك
cd your-project
preflight init
# تشغيل جميع الفحوصات
preflight scan
# فحص دليل محدد
preflight scan /path/to/project
# التشغيل مع مخرجات مفصلة (يظهر الملفات التي تطابق كل فحص)
preflight scan --verbose
preflight scan -v # الصيغة المختصرة
# التشغيل في وضع CI مع مخرجات JSON
preflight scan --ci --format json
# تشغيل فحوصات محددة فقط، أو تخطي بعضها، للتكرار السريع
# (لمرة واحدة؛ على عكس `preflight ignore` لا يغير preflight.yml)
preflight scan --only seoMeta,ogTwitter
preflight scan --skip vulnerability,secrets
# إسكات فحص
preflight ignore sitemap
# إلغاء إسكات فحص
preflight unignore sitemap
# قائمة بجميع معرفات الفحوصات
preflight checks
يحتوي هذا المستودع على مهارة عميل متوافقة مع skills.sh في skills/preflight/SKILL.md. تمنح وكلاء البرمجة سير عمل Preflight قابل للتكرار: فحص preflight.yml، تشغيل عمليات مسح آمنة لـ CI، تحليل النتائج، تجنب الإسكات غير الآمنة، إعادة تشغيل التحقق، والإبلاغ عن المخاطر المتبقية قبل الإطلاق.
عرض المهارة من هذا المستودع:
# مع Bun
bunx --yes skills add preflightsh/preflight --list
# أو مع npm
npx --yes skills add preflightsh/preflight --list
تثبيت مهارة Preflight فقط:
# مع Bun
bunx --yes skills add preflightsh/preflight --skill preflight
# أو مع npm
npx --yes skills add preflightsh/preflight --skill preflight
Preflight قابلة للاستخدام بالكامل من سطر الأوامر دون حساب. لوحة التحكم الاختيارية في app.preflight.sh تضيف سجلاً مستضافاً لعمليات المسح الخاصة بك واقتراحات إصلاح مُولَّدة بالذكاء الاصطناعي لكل نتيجة. لا يغادر كودك جهازك أبداً: يتم تشغيل المسح محلياً، ويتم إرسال ملخص منقح للنتائج فقط (معرفات الفحوصات، الحالات، والرسائل، وليس القيم السرية أو محتويات الملفات) عند النشر.
أنشئ حساباً مجانياً، ثم قم بتوصيل CLI:
preflight auth login # يفتح المتصفح للتفويض
preflight auth status # يظهر من أنت مسجل الدخول به
preflight auth logout # يزيل بيانات الاعتماد المخزنة
نشر مسح إلى لوحة التحكم باستخدام --publish. يطبع رابطاً لعرض التشغيل. النشر هو بأقصى جهد: إذا كنت غير متصل أو غير مسجل، يستمر المسح ويخرج بشكل طبيعي.
preflight scan --publish
في لوحة التحكم تحصل على تفصيل لكل تشغيل (نجاح/تحذير/خطأ)، القائمة الكاملة للنتائج، وسجل لكل مشروع لمشاهدة ما تغير بين النشرات.
يمكنك أيضاً قراءة هذا السجل من الطرفية باستخدام preflight history:
preflight history # آخر التشغيلات عبر مشاريعك
preflight history --here # فقط تشغيلات المشروع الحالي
preflight history <run-id> # نتائج فحص كاملة لتشغيل واحد
preflight history --here --format json # قابل للقراءة آلياً، للوكلاء
يتطلب preflight auth login. --here يطابق التشغيلات مع المستودع الحالي من خلال remote git الخاص به، وهو نفس المفتاح المستخدم عند النشر.
افتح أي فحص فاشل أو تحذير في تشغيل منشور لتوليد إصلاح خطوة بخطوة مخصص لمكدسك المكتشف، مع أوامر جاهزة للنسخ وكود.
يكتشف Preflight تلقائياً ويتحقق من صحة إعدادات هذه الخدمات:
المدفوعات
تتبع الأخطاء والمراقبة
البريد الإلكتروني والنشرات الإخبارية
التحليلات
المصادقة
الدردشة
الإشعارات
البنية التحتية
التخزين وشبكة توصيل المحتوى (CDN)
البحث
SEO
الذكاء الاصطناعي / LLMs
يستخدم Preflight ملف preflight.yml في جذر المشروع:
projectName: my-app
stack: rails # rails, next, react, vite, laravel, etc.
urls:
staging: "https://staging.example.com"
production: "https://example.com"
services:
stripe:
declared: true
sentry:
declared: true
checks:
envParity:
enabled: true
envFile: ".env"
exampleFile: ".env.example"
healthEndpoint:
enabled: true
path: "/health" # اختياري - يكتشف المسارات الشائعة تلقائياً إذا لم يتم تعيينه
stripeWebhook:
enabled: true
url: "https://api.example.com/webhooks/stripe"
seoMeta:
enabled: true
mainLayout: "app/views/layouts/application.html.erb"
security:
enabled: true
secrets:
enabled: true
# قائمة السماح لكل ملف لفحص الأسرار. استخدم هذا لكتم نتيجة فردية
# (مثل مفتاح عام مقيد بالمرجع) دون تعطيل الفحص بالكامل.
allowlist:
- path: web/js/golden-hour.js
fingerprint: "sha256:<hex>" # موصى به - يثبت السر الدقيق
reason: "مفتاح Google Timezone مقيد بمرجع HTTP"
- path: "web/tools/**/*.php" # يدعم أنماط النجمة المزدوجة
indexNow:
enabled: true
key: "your32characterhexkeyhere00000"
emailAuth:
enabled: true # اختياري، يفحص SPF/DMARC على نطاق الإنتاج
humansTxt:
enabled: false # اختياري، ينسب الفضل للفريق
license:
enabled: false # اختياري، للمشاريع مفتوحة المصدر
# قم بإسكات فحوصات أو خدمات معينة حسب المعرف
ignore:
- sitemap
- llmsTxt
- google_analytics
قم بإسكات فحوصات أو خدمات معينة باستخدام preflight ignore <id>:
preflight ignore sitemap # إسكات فحص خريطة الموقع
preflight ignore sentry # إسكات التحقق من خدمة Sentry
preflight unignore sitemap # إعادة تمكين فحص خريطة الموقع
preflight checks # عرض جميع المعرفات القابلة للإسكات
افضل إدراج نتيجة فردية في القائمة البيضاء بدلاً من إسكات فحص secrets بالكامل. أضف استثناءات لمرة واحدة من سطر الأوامر:
preflight ignore secrets web/js/golden-hour.js
يضيف ذلك إدخال مسار تحت checks.secrets.allowlist في ملف preflight.yml. حقل path هو نمط doublestar (** يطابق عبر الدلائل) يتم حله بالنسبة للمسار النسبي للمشروع.
ثبّت البصمة. القائمة البيضاء التي تحتوي على مسار فقط تقبل بصمت أي سر مستقبلي يتم إسقاطه في هذا الملف. قم بتحرير الإدخال وأضف fingerprint: "sha256:<hex>" — SHA-256 لقيمة السر المكتشفة. الآن إذا تم تدوير المفتاح أو ظهر سر مختلف في نفس الملف، سينبه Preflight مرة أخرى.
تتم مطابقة النتائج بواسطة المسار + البصمة، وليس الملف بأكمله. البصمة المدرجة في القائمة البيضاء في ملف لا تكتم أسرار أخرى في أسطر أخرى من نفس الملف.
SEO والاجتماعي:
seoMeta, canonical, structured_data, indexNow (اختياري), ogTwitter, viewport, lang
الأمان والبنية التحتية:
securityHeaders, ssl, www_redirect, email_auth (اختياري), secrets
البيئة والصحة:
envParity, healthEndpoint
جودة الكود والأداء:
vulnerability, debug_statements, error_pages, image_optimization
القانوني والامتثال:
legal_pages
ملفات الويب القياسية:
favicon, robotsTxt, sitemap, llmsTxt, adsTxt (اختياري), humansTxt (اختياري), license (اختياري)
جميع الخدمات لديها فحوصات تحقق من صحة التكامل الصحيح (متغيرات البيئة، أنماط SDK، ملفات الإعدادات):
المدفوعات: stripe, paypal, braintree, paddle, lemonsqueezy
تتبع الأخطاء: sentry, bugsnag, rollbar, honeybadger, datadog, newrelic, logrocket
البريد الإلكتروني للمعاملات: postmark, sendgrid, mailgun, aws_ses, resend
تسويق البريد الإلكتروني: mailchimp, convertkit, beehiiv, aweber, activecampaign, campaignmonitor, drip, klaviyo, buttondown
التحليلات: plausible, fathom, google_analytics, fullres, datafast, posthog, mixpanel, amplitude, segment, hotjar
المصادقة: auth0, clerk, workos, firebase, supabase
الاتصالات: twilio, slack, discord, intercom, crisp
البنية التحتية: redis, sidekiq, rabbitmq, elasticsearch, convex
التخزين وشبكة توصيل المحتوى: aws_s3, cloudinary, cloudflare
البحث: algolia
الذكاء الاصطناعي: openai, anthropic, google_ai, mistral, cohere, replicate, huggingface, grok, perplexity, together_ai
SEO: indexNow
موافقة الكوكيز: cookieconsent, cookiebot, onetrust, termly, cookieyes, iubenda
| الرمز | المعنى |
|---|---|
| 0 | جميع الفحوصات ناجحة |
| 1 | تحذيرات فقط |
| 2 | تم العثور على أخطاء |
الرمزان 1 و 2 يعنيان أن المسح تم وأبلغ عن شيء. الرمز 64 يعني أنه لم يصل إلى تلك المرحلة، لذا يمكن لـ CI التمييز بين "هذا المشروع لديه مشاكل" و "هذا الاستدعاء كان خاطئاً".
الإكمال التلقائي للعلامات التبويبية للأوامر، العلامات، ومعرفات الفحوصات (بما في ذلك قيم --only و --skip):
# bash (أضف إلى ~/.bashrc)
source <(preflight completion bash)
# zsh (أضف إلى ~/.zshrc)
source <(preflight completion zsh)
# fish
preflight completion fish | source
يحترم الإخراج أيضاً متغير البيئة NO_COLOR.
أطر العمل الخلفية
أطر العمل الأمامية
أنظمة إدارة المحتوى التقليدية
مولِّدو المواقع الثابتة
أنظمة إدارة المحتوى بدون واجهة
أخرى
# مثال GitHub Actions (curl)
- name: تشغيل Preflight
run: |
curl -sSL https://preflight.sh/install.sh | sh
preflight scan --ci --format json
# مثال GitHub Actions (Docker)
- name: تشغيل Preflight
run: docker run -v ${{ github.workspace }}:/app ghcr.io/preflightsh/preflight scan --ci --format json
MIT
| الفحص | الوصف |
|---|
| تماثل ENV | يقارن .env و .env.example للبحث عن المتغيرات المفقودة |
| نقطة الصحة | يتحقق من إمكانية الوصول إلى الموقع؛ يكتشف تلقائياً /health, /healthz, /api/health أو يعود إلى الجذر |
| فحص الثغرات | يبحث عن ثغرات في التبعيات (تدقيق الحزمة، تدقيق npm، إلخ) |
| بيانات SEO الوصفية | يتحقق من وجود العنوان والوصف وعلامات Open Graph |
| بطاقات OG وتويتر | يتحقق من صحة og:image, twitter:card وبيانات المشاركة الاجتماعية الوصفية |
| URL الأساسي | يتحقق من وجود علامة الرابط الأساسي (canonical) |
| إطار العرض | يتحقق من وجود علامة viewport الصحيحة للجوال |
| خاصية lang | يتحقق من وجود سمة lang في HTML من أجل إمكانية الوصول |
| البيانات المنظمة | يتحقق من وجود ترميز JSON-LD Schema.org |
| رؤوس الأمان | يتحقق من HSTS, CSP, X-Content-Type-Options في كل من الإنتاج والاختبار |
| شهادة SSL | يتحقق من صلاحية SSL ويحذر قبل انتهاء الصلاحية |
| إعادة توجيه WWW | يتحقق من إعادة توجيه www/non-www إلى URL الأساسي |
| البريد الإلكتروني | يتحقق من سجلات DNS الخاصة بـ SPF/DMARC لإمكانية تسليم البريد (اختياري) |
| فحص الأسرار | يبحث عن مفاتيح API مسربة وبيانات اعتماد في الكود |
| عبارات التصحيح | يكتشف console.log, var_dump, debugger المتبقية في الكود |
| صفحات الخطأ | يتحقق من وجود صفحات خطأ مخصصة 404/500 |
| تحسين الصور | يجد الصور الكبيرة (>500KB) التي تؤثر على سرعة التحميل |
| الصفحات القانونية | يتحقق من وجود سياسة الخصوصية وشروط الخدمة |
| موافقة ملفات تعريف الارتباط | يكتشف حل موافقة الكوكيز (التوافق مع GDPR/CCPA) |
| الأيقونة المفضلة والأيقونات | يتحقق من وجود favicon, apple-touch-icon (.png, .webp, .svg) وبيان الويب |
| robots.txt | يتحقق من وجود robots.txt ومحتواه |
| sitemap.xml | يبحث عن وجود خريطة الموقع أو أداة توليدها |
| llms.txt | يتحقق من وجود ملف إرشادات لزواحف LLM |
| ads.txt | يتحقق من صحة ads.txt للمواقع المدعومة بالإعلانات (اختياري) |
| humans.txt | يتحقق من وجود humans.txt لنسب الفضل للفريق (اختياري) |
| IndexNow | يتحقق من وجود ملف مفتاح IndexNow لفهرسة بحث أسرع (اختياري) |
| الترخيص | يتحقق من وجود ملف الترخيص (اختياري، للمشاريع مفتوحة المصدر) |
| 64 |
| لم يتمكن Preflight من التشغيل (مسار خاطئ، إعدادات غير قابلة للقراءة، معرف فحص غير معروف) |
| 130 | تم إلغاء المسح (Ctrl-C / SIGTERM) |