
preflight v0.20.0
أداة سطر أوامر مبنية على Go تقوم بمسح قواعد الأكواد للتأكد من جاهزيتها للإطلاق، حيث تكتشف التكوينات المفقودة، مشكلات الأمان، تسريبات الأسرار، والفجوات في التكامل قبل النشر في الإنتاج.
Preflight.sh
Preflight.sh هي أداة سطر أوامر تفحص قاعدة الكود لديك للتحقق من جاهزية الإطلاق. تحدد الإعدادات المفقودة، مشاكل التكامل، المخاوف الأمنية، الثغرات في بيانات SEO الوصفية، وغيرها من الأخطاء الشائعة قبل النشر إلى الإنتاج.
لا تحرج نفسك في الإنتاج. فقط قم بتشغيل الأمر.
التثبيت
Homebrew (macOS/Linux)
brew install preflightsh/preflight/preflight
npm
npm install -g @preflightsh/preflight
Go
go install github.com/preflightsh/preflight@latest
Docker
docker pull ghcr.io/preflightsh/preflight
Shell Script
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
مهارة العميل (Agent Skill)
يحتوي هذا المستودع على مهارة عميل متوافقة مع 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 الخاص به، وهو نفس المفتاح المستخدم عند النشر.
افتح أي فحص فاشل أو تحذير في تشغيل منشور لتوليد إصلاح خطوة بخطوة مخصص لمكدسك المكتشف، مع أوامر جاهزة للنسخ وكود.
- المجاني يتضمن 5 نشرات شهرياً.
- اجلب مفتاحك الخاص: أضف مفتاح API من OpenAI أو Anthropic في إعدادات لوحة التحكم ويصبح النشر مجانياً وغير محدود (تدفع لمزود الخدمة مباشرة).
- المُدار (5 دولارات/شهر): نحن نغطي تكاليف الذكاء الاصطناعي والتشغيل غير محدود، لا حاجة لمفتاح API.
ما يفحصه
| الفحص | الوصف |
|---|---|
| تماثل 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 لفهرسة بحث أسرع (اختياري) |
| الترخيص | يتحقق من وجود ملف الترخيص (اختياري، للمشاريع مفتوحة المصدر) |
الخدمات المدعومة (72)
يكتشف Preflight تلقائياً ويتحقق من صحة إعدادات هذه الخدمات:
المدفوعات
- Stripe, PayPal, Braintree, Paddle, LemonSqueezy
تتبع الأخطاء والمراقبة
- Sentry, Bugsnag, Rollbar, Honeybadger, Datadog, New Relic, LogRocket
البريد الإلكتروني والنشرات الإخبارية
- Postmark, SendGrid, Mailgun, AWS SES, Resend, Mailchimp, Kit, Beehiiv, AWeber, ActiveCampaign, Campaign Monitor, Drip, Klaviyo, Buttondown
التحليلات
- Plausible, Fathom, Umami, Fullres Analytics, Datafa.st Analytics, Google Analytics, PostHog, Mixpanel, Amplitude, Segment, Hotjar
المصادقة
- Auth0, Clerk, WorkOS
الدردشة
- Intercom, Crisp
الإشعارات
- Slack, Discord, Twilio
البنية التحتية
- Firebase, Supabase, Redis, Sidekiq, RabbitMQ, Elasticsearch, Convex
التخزين وشبكة توصيل المحتوى (CDN)
- AWS S3, Cloudinary, Cloudflare
البحث
- Algolia
SEO
- IndexNow
الذكاء الاصطناعي / LLMs
- OpenAI, Anthropic Claude, Google AI (Gemini), Mistral, Cohere, Replicate, Hugging Face, Grok (X/Twitter), Perplexity, Together AI
الإعدادات
يستخدم 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 | تم العثور على أخطاء |
| 64 | لم يتمكن Preflight من التشغيل (مسار خاطئ، إعدادات غير قابلة للقراءة، معرف فحص غير معروف) |
| 130 | تم إلغاء المسح (Ctrl-C / SIGTERM) |
الرمزان 1 و 2 يعنيان أن المسح تم وأبلغ عن شيء. الرمز 64 يعني أنه لم يصل إلى تلك المرحلة، لذا يمكن لـ CI التمييز بين "هذا المشروع لديه مشاكل" و "هذا الاستدعاء كان خاطئاً".
إكمال الأوامر (Shell Completions)
الإكمال التلقائي للعلامات التبويبية للأوامر، العلامات، ومعرفات الفحوصات (بما في ذلك قيم --only و --skip):
# bash (أضف إلى ~/.bashrc)
source <(preflight completion bash)
# zsh (أضف إلى ~/.zshrc)
source <(preflight completion zsh)
# fish
preflight completion fish | source
يحترم الإخراج أيضاً متغير البيئة NO_COLOR.
المكدسات المدعومة
أطر العمل الخلفية
- Ruby on Rails, Laravel, PHP, Go, Python/Django, Rust, Node.js
أطر العمل الأمامية
- Next.js, Nuxt, Remix, React, Vue.js, Vite, Svelte, Angular
أنظمة إدارة المحتوى التقليدية
- WordPress, Craft CMS, Drupal, Ghost
مولِّدو المواقع الثابتة
- Hugo, Jekyll, Gatsby, Eleventy (11ty), Astro
أنظمة إدارة المحتوى بدون واجهة
- Strapi, Sanity, Contentful, Prismic
أخرى
- المواقع الثابتة
التكامل مع CI
# مثال 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