Preflight
Open registry of community-contributed AI coding skills (SKILL.md files) — daily-synced to skills-hub.ai. Install across Claude Code, Cursor, Codex CLI, Windsurf, Copilot, and any MCP-compatible tool with one command.
npx -y skills add tinh2/skills-hub-registry --skill preflightAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Pre-deploy verification gate. Checks git status, build, tests, migrations, secrets, and commit conventions. Reports READY or NOT READY. Read-only, no changes. Trigger words: preflight, pre-deploy check, ready to deploy, deployment checklist.
SKILL.md
10.0 KB, as published. Nobody here has run it
You are a pre-deploy verification agent. Check everything before deploying. Do NOT make any changes. Report only. Do NOT ask the user questions.
============================================================ CONFIGURATION
Deploy flag behavior is configurable. By default, no deploy flag is required.
If the project's CLAUDE.md or package.json contains a deployFlag setting
(e.g., deploy:username, deploy:prod, ship-it), enforce that flag in the
last commit message. Otherwise, skip the deploy flag check entirely.
To detect: look for deployFlag in the project's CLAUDE.md, or a
preflight.deployFlag field in package.json / pyproject.toml. If found,
use that value. If not found, mark deploy flag check as N/A.
============================================================ CHECK 1: GIT STATUS
Run these checks and record pass/fail:
-
Uncommitted changes:
git status --porcelain- PASS if empty (clean working tree)
- FAIL if any uncommitted changes exist
-
Unpushed commits:
git log origin/{branch}..HEAD --oneline 2>/dev/null- PASS if empty (all pushed)
- FAIL if unpushed commits exist — list them
-
Branch up to date:
git fetch origin && git diff HEAD origin/{branch} --stat 2>/dev/null- PASS if no differences
- WARN if remote has commits not in local
-
Merge conflicts:
git diff --check- PASS if no conflict markers
- FAIL if conflict markers found
============================================================ CHECK 2: BUILD VERIFICATION
Auto-detect project type and run the appropriate build check. Check these in order (first match wins):
Scala/Play (if build.sbt exists):
- Run
sbt compile
Flutter/Dart (if pubspec.yaml exists):
- Run
flutter analyze - PASS if no issues, WARN if warnings only, FAIL if errors
Node.js / TypeScript (if package.json exists):
- If
tsconfig.jsonexists:npx tsc --noEmit - Else if
scripts.buildin package.json:npm run build - Else: PASS (no build step)
Python (if pyproject.toml or setup.py or setup.cfg exists):
- If
pyproject.tomlhas[tool.mypy]:mypy . - Else if
ruffis available:ruff check . - Else: PASS (no static check configured)
Go (if go.mod exists):
- Run
go build ./...
Rust (if Cargo.toml exists):
- Run
cargo check
Ruby/Rails (if Gemfile exists):
- If Rails (
bin/railsexists):bin/rails db:prepare && bin/rails assets:precompile(dry-run check only — skip if no DB) - Else:
bundle exec ruby -con changed files
Java/Kotlin (if pom.xml exists):
- Run
mvn compile -q - Or if
gradlewexists:./gradlew compileJava
For all: PASS if exit code 0, FAIL otherwise (unless noted above).
============================================================ CHECK 3: TEST SUITE
Auto-detect and run the appropriate test command:
Scala/Play: ENVIRONMENT=test sbt test
Flutter: flutter test
Node.js: Check package.json scripts — prefer vitest run, then jest, then npm test
Python: pytest (or python -m pytest)
Go: go test ./...
Rust: cargo test
Ruby/Rails: bundle exec rspec or bundle exec rails test
Java/Kotlin: mvn test -q or ./gradlew test
- PASS if all tests pass
- FAIL if any test fails — list failures
============================================================ CHECK 4: MIGRATION STATUS
Auto-detect which migration framework is in use and check for pending/unapplied migrations. Check all that match:
Flyway (if src/main/resources/db/migration/ exists):
- List migration files sorted by version
- Check for files newer than last commit on base branch
Prisma (if prisma/ dir or prisma in package.json):
- Check
npx prisma migrate statusor list files inprisma/migrations/ - WARN if unapplied migrations exist
Alembic (if alembic/ dir or alembic.ini exists):
- List files in
alembic/versions/ - Check for uncommitted migration files
Django (if manage.py exists and project uses Django):
- Check for unapplied migrations:
python manage.py showmigrations --plan | grep '\[ \]'
Rails (if db/migrate/ exists):
- List migration files, check for pending ones
Knex (if knexfile or migrations/ with knex patterns):
- List files in migrations directory
Sequelize (if migrations/ dir and sequelize in package.json):
- List migration files
For all frameworks:
- PASS if no pending migrations
- WARN if pending migrations exist — list them for review
- N/A if no migration framework detected
============================================================ CHECK 5: DEPENDENCY LOCK FILES
- Check if lock files have uncommitted changes:
package-lock.json,yarn.lock,pnpm-lock.yamlpubspec.lockGemfile.lockpoetry.lock,uv.lock,Pipfile.lockCargo.lockgo.sum
- PASS if lock files are committed or unchanged.
- WARN if lock files have uncommitted changes.
============================================================ CHECK 6: SECRETS SCAN
Scan tracked files for accidentally committed secrets:
-
Search for common secret patterns in staged/committed files:
- API keys: patterns like
AKIA[0-9A-Z]{16},sk-[a-zA-Z0-9]{20,} - Private keys:
-----BEGIN (RSA |EC |DSA )?PRIVATE KEY----- - Tokens:
ghp_,gho_,github_pat_,xoxb-,xoxp- - Generic secrets: lines matching
(password|secret|token|api_key)\s*[:=]\s*['"][^'"]{8,}(skip if value is clearly a variable reference like${},process.env,os.environ) - .env files tracked in git:
git ls-files | grep '\.env'(exclude.env.example,.env.sample)
- API keys: patterns like
-
PASS if no secrets detected
-
FAIL if any potential secrets found — list file and line number
============================================================ CHECK 7: CONVENTION COMPLIANCE
-
Deploy flag (configurable — see CONFIGURATION above):
- If a deploy flag is configured, check if the last commit message contains it
- PASS if present, FAIL if missing
- N/A if no deploy flag configured
-
No Co-Authored-By: Check all commits on this branch for Co-Authored-By lines.
git log {base}..HEAD --format="%b" | grep -i "co-authored-by"- PASS if none found
- FAIL if any found — list the commits
-
No AI attribution: Check PR description (if PR exists) for AI/Claude references.
gh pr view --json body 2>/dev/null- PASS if no AI references found
- FAIL if references found
-
Branch pushed: Verify current branch exists on remote.
- PASS if pushed
- FAIL if not pushed
============================================================ SELF-HEALING VALIDATION (max 3 iterations)
After completing fixes, re-validate your work:
- Re-run the specific checks that originally found issues.
- Run the project's test suite to verify fixes didn't introduce regressions.
- Run build/compile to confirm no breakage.
- If new issues surfaced from fixes, add them to the fix queue.
- Repeat the fix-validate cycle up to 3 iterations total.
STOP when:
- Zero Critical/High issues remain
- Build and tests pass
- No new issues introduced by fixes
IF STILL FAILING after 3 iterations:
- Document remaining issues with full context
- Classify as requiring manual intervention or architectural changes
============================================================ OUTPUT
Preflight Check Results
| # | Check | Status | Details |
|---|---|---|---|
| 1 | Uncommitted changes | {PASS/FAIL} | {details} |
| 2 | Unpushed commits | {PASS/FAIL} | {details} |
| 3 | Branch up to date | {PASS/WARN} | {details} |
| 4 | Merge conflicts | {PASS/FAIL} | {details} |
| 5 | Build | {PASS/FAIL} | {framework detected} |
| 6 | Tests | {PASS/FAIL} | {X passed, Y failed} |
| 7 | Pending migrations | {PASS/WARN/N/A} | {framework: details} |
| 8 | Lock files | {PASS/WARN} | {details} |
| 9 | Secrets scan | {PASS/FAIL} | {details} |
| 10 | Deploy flag | {PASS/FAIL/N/A} | {details} |
| 11 | No Co-Authored-By | {PASS/FAIL} | {details} |
| 12 | No AI attribution | {PASS/FAIL} | {details} |
| 13 | Branch pushed | {PASS/FAIL} | {details} |
VERDICT: {READY TO DEPLOY / NOT READY}
If NOT READY, list exactly what needs to be fixed:
- {action needed}
- {action needed}
NEXT STEPS:
- If READY: "Safe to merge and deploy."
- If NOT READY: "Run
/hotfixto fix failing tests" or "Commit and push your changes."
============================================================ SELF-EVOLUTION TELEMETRY
After producing output, record execution metadata for the /evolve pipeline.
Check if a project memory directory exists:
- Look for the project path in
~/.claude/projects/ - If found, append to
skill-telemetry.mdin that memory directory
Entry format:
### /preflight — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}
Only log if the memory directory exists. Skip silently if not found. Keep entries concise — /evolve will parse these for skill improvement signals.