CLI-инструмент на базе Go, который сканирует кодовые базы на готовность к запуску, обнаруживая отсутствующую конфигурацию, проблемы гигиены безопасности, утечки секретов и пробелы интеграции перед развёртыванием в production.
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 seo_meta,og_twitter
preflight scan --skip vulnerability,secrets
# Отключение проверки
preflight ignore sitemap
# Повторное включение проверки
preflight unignore sitemap
# Список всех ID проверок
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 добавляет размещённую историю ваших сканирований и сгенерированные ИИ подсказки по исправлению для каждой находки. Ваш код никогда не покидает вашу машину: сканирование выполняется локально, и при публикации отправляется только сокращённая сводка результатов (ID проверок, статусы и сообщения, но никогда секретные значения или содержимое файлов).
Создайте бесплатную учётную запись, затем подключите CLI:
preflight auth login # открывает браузер для авторизации этого CLI
preflight auth status # показывает, под каким пользователем вы вошли
preflight auth logout # удаляет сохранённые учётные данные
Опубликуйте сканирование на панели управления с помощью --publish. Он выводит ссылку для просмотра запуска. Публикация выполняется по принципу «лучшее усилие»: если вы офлайн или не вошли в систему, сканирование всё равно выполняется и завершается нормально.
preflight scan --publish
На панели управления вы получаете разбивку pass/warn/fail для каждого запуска, полный список находок и историю по каждому проекту, чтобы видеть, что изменилось между развёртываниями.
Вы также можете прочитать эту историю из терминала с помощью preflight history:
preflight history # недавние запуски по всем вашим проектам
preflight history --here # только запуски текущего проекта
preflight history <run-id> # полные результаты проверок одного запуска
preflight history --here --format json # машиночитаемый формат для агентов
Требуется preflight auth login. --here сопоставляет запуски с текущим репозиторием по его git-remote, используя тот же ключ, что и при публикации.
Откройте любую неудачную проверку или проверку с предупреждением в опубликованном запуске, чтобы сгенерировать пошаговое исправление, адаптированное под ваш обнаруженный стек, с готовыми к копированию командами и кодом.
| Проверка | Описание |
|---|---|
| ENV Parity | Сравнивает .env и .env.example на предмет отсутствующих переменных |
| Health Endpoint | Проверяет доступность сайта; автоматически определяет /health, /healthz, /api/health или возвращается к корневому пути |
| Vulnerability Scan | Проверяет уязвимости зависимостей (bundle audit, npm audit и т. д.) |
| SEO Metadata | Проверяет наличие title, description и тегов Open Graph |
| OG & Twitter Cards | Проверяет og:image, twitter:card и метаданные для публикации в соцсетях |
| Canonical URL | Проверяет наличие тега canonical link |
| Viewport | Проверяет правильный метатег viewport для мобильных устройств |
| Lang Attribute | Проверяет атрибут html lang для доступности |
| Structured Data | Проверяет наличие разметки JSON-LD Schema.org |
| Security Headers | Проверяет HSTS, CSP, X-Content-Type-Options как на продакшене, так и на стейджинге |
| SSL Certificate | Проверяет действительность SSL и предупреждает до истечения срока |
| WWW Redirect | Проверяет редирект www/без-www на канонический URL |
| Email Auth | Проверяет DNS-записи SPF/DMARC для доставляемости почты (по желанию) |
| Secret Scanning | Находит утёкшие API-ключи и учётные данные в коде |
| Debug Statements | Обнаруживает console.log, var_dump, debugger, оставленные в коде |
| Error Pages | Проверяет наличие пользовательских страниц ошибок 404/500 |
| Image Optimization | Находит большие изображения (>500KB), которые замедляют загрузку |
| Legal Pages | Проверяет наличие страниц политики конфиденциальности и условий обслуживания |
| Cookie Consent | Обнаруживает решение для согласия на cookie (соответствие GDPR/CCPA) |
Preflight автоматически определяет и проверяет конфигурацию для этих сервисов:
Платежи
Отслеживание ошибок и мониторинг
Электронная почта и рассылки
Аналитика
Аутентификация
Чат
Уведомления
Инфраструктура
Хранилище и CDN
Поиск
SEO
ИИ / LLM
Preflight использует файл preflight.yml в корне вашего проекта:
projectName: my-app
stack: rails # rails, next, react, vite, laravel и т. д.
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" # необязательно — проверяется GET-запросом; сообщается о 404 или отсутствии ответа
seoMeta:
enabled: true
mainLayout: "app/views/layouts/application.html.erb"
security:
enabled: true
secrets:
enabled: true
# Пофайловый список разрешений для сканирования секретов. Используйте его, чтобы
# подавить отдельную находку (например, публичный ключ с ограничением по referrer),
# не отключая всю проверку.
allowlist:
- path: web/js/golden-hour.js
fingerprint: "sha256:<hex>" # рекомендуется — привязывает к точному секрету
reason: "Ключ Google Timezone с ограничением по HTTP-referrer"
- path: "web/tools/**/*.php" # поддерживаются glob-шаблоны doublestar
indexNow:
enabled: true
key: "your32characterhexkeyhere00000"
emailAuth:
enabled: true # по желанию, проверяет SPF/DMARC на продакшен-домене
humansTxt:
enabled: false # по желанию, указывает команду
license:
enabled: false # по желанию, для проектов с открытым исходным кодом
# Отключение конкретных проверок или сервисов по ID
ignore:
- sitemap
- llms_txt
- google_analytics
Отключите конкретные проверки или сервисы с помощью preflight ignore <id>:
preflight ignore sitemap # Игнорировать проверку sitemap
preflight ignore sentry # Игнорировать проверку сервиса Sentry
preflight unignore sitemap # Повторно включить проверку sitemap
preflight checks # Список всех игнорируемых ID
Предпочтительнее добавлять в список разрешений отдельную находку, чем отключать всю
проверку secrets. Добавляйте разовые исключения из командной строки:
preflight ignore secrets web/js/golden-hour.js
Это добавляет запись пути в checks.secrets.allowlist в вашем
preflight.yml. Поле path — это glob-шаблон doublestar
(** сопоставляется через каталоги), разрешаемый относительно
пути файла в проекте.
Зафиксируйте отпечаток (fingerprint). Список разрешений только по пути молча принимает любой
будущий секрет, попавший в этот файл. Отредактируйте запись и добавьте
fingerprint: "sha256:<hex>" — SHA-256 обнаруженного значения секрета.
Теперь, если ключ будет ротирован или в том же файле появится другой секрет,
preflight снова подаст сигнал.
Находки сопоставляются по пути + отпечатку, а не по всему файлу. Отпечаток в списке разрешений в файле не подавляет другие секреты на других строках того же файла.
SEO и соцсети:
seo_meta, canonical, structured_data, index_now (по желанию), og_twitter, viewport, lang
Безопасность и инфраструктура:
security_headers, ssl, www_redirect, email_auth (по желанию), secrets
Окружение и здоровье:
env_parity, health_endpoint
Качество кода и производительность:
vulnerability, debug_statements, error_pages, image_optimization
Юридическое и соответствие:
legal_pages
Стандартные веб-файлы:
favicon, robots_txt, sitemap, llms_txt, ads_txt (по желанию), humans_txt (по желанию), license (по желанию)
Теперь каждый ID проверки записывается в snake_case. Старые имена в camelCase продолжают работать
везде, где принимается ID (списки ignore:, --only, --skip,
preflight ignore) на протяжении всей линейки 1.x, с примечанием в stderr, и
будут удалены в 2.0. preflight ignore записывает новое имя. Ключи в
checks: в preflight.yml (healthEndpoint, seoMeta, ...) — это
отдельная схема и не изменились.
| Старое | Новое |
|---|---|
seoMeta | seo_meta |
ogTwitter | og_twitter |
securityHeaders | security_headers |
envParity | env_parity |
healthEndpoint | health_endpoint |
robotsTxt | robots_txt |
llmsTxt | llms_txt |
adsTxt | ads_txt |
humansTxt | humans_txt |
indexNow | index_now |
Каждая проверка читает файлы; одна запускает программу. Проверка vulnerability
выполняет собственный менеджер пакетов вашего проекта (npm audit, yarn audit,
composer audit, bundle audit, pip-audit, govulncheck, cargo audit)
внутри каталога проекта, с очищенным окружением и временным
домашним каталогом, чтобы она не могла прочитать ваши токены. Менеджеры пакетов по-прежнему
учитывают локальную конфигурацию проекта, и некоторая часть этой конфигурации может выполнять код
из репозитория (Yarn yarnPath, алиас Cargo, плагин Composer).
Сканирование собственных проектов — это то, для чего предназначен Preflight. При сканировании
репозитория, которому вы не доверяете, например pull request форка в CI, добавьте
--skip vulnerability.
Все сервисы имеют проверки валидации, которые подтверждают правильную интеграцию (переменные окружения, паттерны SDK, файлы конфигурации):
Платежи: stripe, paypal, braintree, paddle, lemonsqueezy
Отслеживание ошибок: sentry, bugsnag, rollbar, honeybadger, datadog, newrelic, logrocket
Транзакционная почта: postmark, sendgrid, mailgun, aws_ses, resend
Email-маркетинг: 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
Хранилище и CDN: aws_s3, cloudinary, cloudflare
Поиск: algolia
ИИ: openai, anthropic, google_ai, mistral, cohere, replicate, huggingface, grok, perplexity, together_ai
SEO: index_now
Согласие на cookie: cookieconsent, cookiebot, onetrust, termly, cookieyes, iubenda
| Код | Значение |
|---|---|
| 0 | Все проверки пройдены |
| 1 | Только предупреждения |
| 2 | Найдены ошибки |
| 64 | Preflight не смог выполниться (неверный путь, нечитаемая конфигурация, неизвестный ID проверки) |
| 130 | Сканирование отменено (Ctrl-C / SIGTERM) |
Коды 1 и 2 означают, что сканирование выполнилось и что-то сообщило. Код 64 означает, что оно не дошло до этого этапа, поэтому CI может отличить «у этого проекта есть проблемы» от «этот вызов был некорректен».
Дополнение по Tab для команд, флагов и ID проверок (включая значения --only и --skip):
# bash (добавьте в ~/.bashrc)
source <(preflight completion bash)
# zsh (добавьте в ~/.zshrc)
source <(preflight completion zsh)
# fish
preflight completion fish | source
Вывод также учитывает переменную окружения NO_COLOR.
Бэкенд-фреймворки
Фронтенд-фреймворки
Традиционные CMS
Генераторы статических сайтов
Headless CMS
Другое
# Пример GitHub Actions (curl)
- name: Run Preflight
run: |
curl -sSL https://preflight.sh/install.sh | sh
preflight scan --ci --format json
# Пример GitHub Actions (Docker)
- name: Run Preflight
run: docker run -v ${{ github.workspace }}:/app ghcr.io/preflightsh/preflight scan --ci --format json
MIT
| Favicon & Icons | Проверяет наличие favicon, apple-touch-icon (.png, .webp, .svg) и web manifest |
| robots.txt | Проверяет, что robots.txt существует и содержит контент |
| sitemap.xml | Проверяет наличие sitemap или генератора |
| llms.txt | Проверяет наличие файла рекомендаций для LLM-краулеров |
| ads.txt | Проверяет ads.txt для сайтов с рекламой (по желанию) |
| humans.txt | Проверяет наличие humans.txt для указания команды (по желанию) |
| IndexNow | Проверяет файл ключа IndexNow для ускоренной индексации в поиске (по желанию) |
| LICENSE | Проверяет наличие файла лицензии (по желанию, для проектов с открытым исходным кодом) |