
preflight v0.20.0
GoベースのCLIツールで、コードベースをスキャンしてリリース準備状況を確認し、本番デプロイ前に設定漏れ、セキュリティ衛生問題、機密情報漏洩、統合のギャップを検出します。
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
シェルスクリプト
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
# 特定のチェックのみ実行、または一部をスキップして高速反復
# (1回限り。`preflight ignore` とは異なり、preflight.ymlは変更しません)
preflight scan --only seoMeta,ogTwitter
preflight scan --skip vulnerability,secrets
# チェックをミュート
preflight ignore sitemap
# チェックのミュートを解除
preflight unignore sitemap
# すべてのチェックIDを表示
preflight checks
エージェントスキル
このリポジトリには、skills/preflight/SKILL.md に skills.sh 互換のエージェントスキルが含まれています。これにより、コーディングエージェントに反復可能な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
ダッシュボードとAI提案
Preflightはアカウントなしでもコマンドラインから完全に使用できます。app.preflight.sh のオプションのダッシュボードでは、スキャンの履歴と各発見結果に対するAI生成の修正提案が追加されます。コードがマシンから出ることはありません。スキャンはローカルで実行され、公開時には結果の編集された概要(チェックID、ステータス、メッセージのみ。秘密の値やファイルの内容は送信されません)のみが送信されます。
無料アカウントを作成し、CLIを接続します:
preflight auth login # ブラウザを開いてこのCLIを認証
preflight auth status # 現在のログインユーザーを表示
preflight auth logout # 保存された認証情報を削除
--publish を使ってスキャンをダッシュボードに公開します。実行結果へのリンクが表示されます。公開はベストエフォートです。オフラインまたはログインしていない場合でも、スキャンは実行され、通常通り終了します。
preflight scan --publish
ダッシュボードでは、各実行の合格/警告/エラーの内訳、発見結果の完全なリスト、プロジェクトごとの履歴を確認できるため、デプロイ間の変更を把握できます。
また、ターミナルから preflight history で履歴を読むこともできます:
preflight history # すべてのプロジェクトの最近の実行
preflight history --here # 現在のプロジェクトのみの実行
preflight history <run-id> # 1回の実行の完全なチェック結果
preflight history --here --format json # 機械可読(エージェント用)
preflight auth login が必要です。--here はgitリモートを使用して現在のリポジトリの実行に一致させます(公開時と同じキー)。
公開された実行でエラーまたは警告のチェックを開くと、検出されたスタックに合わせたステップバイステップの修正(コピー可能なコマンドとコード付き)が生成されます。
- 無料枠:月に5回の公開実行が含まれます。
- 独自のキーを持ち込む:ダッシュボード設定でOpenAIまたはAnthropicのAPIキーを追加すると、公開は無料で無制限になります(プロバイダーに直接支払います)。
- マネージド(月額5ドル):AI費用を当社が負担し、実行は無制限です。APIキーは不要です。
チェック内容
| Check | Description |
|---|---|
| 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リンクタグが存在するか確認します |
| 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/non-wwwの正規URLへのリダイレクトを確認します |
| Email Auth | メール配信性のためのSPF/DMARC DNSレコードをチェックします(オプトイン) |
| Secret Scanning | コード内の漏洩APIキーや認証情報を検出します |
| Debug Statements | コード内に残されたconsole.log、var_dump、debuggerを検出します |
| Error Pages | カスタム404/500エラーページの有無をチェックします |
| Image Optimization | 読み込み時間に悪影響を与える大きな画像(500KB超)を検出します |
| Legal Pages | プライバシーポリシーと利用規約のページの有無をチェックします |
| Cookie Consent | Cookie同意ソリューション(GDPR/CCPAコンプライアンス)を検出します |
| Favicon & Icons | favicon、apple-touch-icon(.png、.webp、.svg)、およびWebマニフェストの有無をチェックします |
| robots.txt | robots.txtが存在し、内容があるか確認します |
| sitemap.xml | サイトマップの存在またはジェネレーターをチェックします |
| llms.txt | LLMクローラーガイダンスファイルの有無をチェックします |
| ads.txt | 広告サイト向けのads.txtを検証します(オプトイン) |
| humans.txt | チームクレジットのためのhumans.txtをチェックします(オプトイン) |
| IndexNow | インデックス高速化のためのIndexNowキーファイルを確認します(オプトイン) |
| LICENSE | ライセンスファイルの有無をチェックします(オープンソースプロジェクト向け、オプトイン) |
サポートされているサービス(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
AI / LLM
- 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" # optional - auto-detects common paths if not set
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
# Per-file allowlist for the secrets scan. Use this to suppress an
# individual finding (e.g. a referrer-restricted public key) without
# disabling the whole check.
allowlist:
- path: web/js/golden-hour.js
fingerprint: "sha256:<hex>" # recommended — pins to the exact secret
reason: "HTTP-referrer-restricted Google Timezone key"
- path: "web/tools/**/*.php" # doublestar globs are supported
indexNow:
enabled: true
key: "your32characterhexkeyhere00000"
emailAuth:
enabled: true # opt-in, checks SPF/DMARC on production domain
humansTxt:
enabled: false # opt-in, credits the team
license:
enabled: false # opt-in, for open source projects
# Silence specific checks or services by ID
ignore:
- sitemap
- llmsTxt
- google_analytics
チェックとサービスの無視
preflight ignore <id> を使用して、特定のチェックやサービスをミュートします:
preflight ignore sitemap # sitemapチェックを無視
preflight ignore sentry # Sentryサービス検証を無視
preflight unignore sitemap # sitemapチェックを再有効化
preflight checks # 無視可能なIDをすべて表示
単一のシークレット発見結果の許可リスト
チェック全体を無効にするよりも、個別の発見結果を許可リストに入れることを推奨します。コマンドラインから1回限りの例外を追加します:
preflight ignore secrets web/js/golden-hour.js
これにより、preflight.yml の checks.secrets.allowlist にパスエントリが追加されます。path フィールドは doublestar グロブです(** はディレクトリをまたいで一致)。プロジェクト相対のファイルパスに対して解決されます。
フィンガープリントを固定する。 パスのみの許可リストでは、将来そのファイルに追加された任意のシークレットを黙って受け入れます。エントリを編集して fingerprint: "sha256:<hex>" を追加してください。これは検出されたシークレット値のSHA-256です。キーがローテーションされたり、同じファイルに別のシークレットが現れた場合、preflightが再警告します。
発見結果はパス + フィンガープリントで照合され、ファイル全体ではありません。許可リスト内のフィンガープリントは、同じファイルの他の行にある他のシークレットを抑制しません。
無視可能なチェックID
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
Web標準ファイル:
favicon, robotsTxt, sitemap, llmsTxt, adsTxt (オプトイン), humansTxt (オプトイン), license (オプトイン)
無視可能なサービスID
すべてのサービスは、適切な統合(環境変数、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
ストレージ & CDN: aws_s3, cloudinary, cloudflare
検索: algolia
AI: openai, anthropic, google_ai, mistral, cohere, replicate, huggingface, grok, perplexity, together_ai
SEO: indexNow
Cookie同意: cookieconsent, cookiebot, onetrust, termly, cookieyes, iubenda
終了コード
| コード | 意味 |
|---|---|
| 0 | すべてのチェックに合格 |
| 1 | 警告のみ |
| 2 | エラー発見 |
| 64 | Preflightが実行できませんでした(不正なパス、読み取り不能な設定、不明なチェックID) |
| 130 | スキャンがキャンセルされました(Ctrl-C / SIGTERM) |
コード1と2はスキャンが実行され、何かを報告したことを意味します。コード64はそこまで到達しなかったことを意味するため、CIは「このプロジェクトに問題がある」と「この呼び出しが間違っている」を区別できます。
シェル補完
コマンド、フラグ、チェックID(--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
従来のCMS
- WordPress, Craft CMS, Drupal, Ghost
静的サイトジェネレーター
- Hugo, Jekyll, Gatsby, Eleventy (11ty), Astro
ヘッドレスCMS
- Strapi, Sanity, Contentful, Prismic
その他
- 静的サイト
CI統合
# 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