Comprehensive pre-deployment verification to ensure release readiness.
Run before every production deployment to verify:
# 1. All tests passing
npm test 2>/dev/null || pnpm test 2>/dev/null || yarn test 2>/dev/null
echo "Exit code: $?"
# 2. No TypeScript/lint errors
npm run typecheck 2>/dev/null || npx tsc --noEmit
npm run lint 2>/dev/null || npx eslint .
# 3. Build succeeds
npm run build 2>/dev/null || pnpm build 2>/dev/null
# 4. No secrets in code
grep -rn "API_KEY=\|SECRET=\|PASSWORD=" --include="*.{ts,js,json}" . 2>/dev/null | grep -v node_modules | grep -v ".env.example"
# 5. Security audit
npm audit --audit-level=high 2>/dev/null || echo "Run manually: npm audit"
# 6. No console.log in production code
grep -rn "console\.log\|console\.debug" --include="*.{ts,js,tsx,jsx}" src/ 2>/dev/null | grep -v "// allowed" | head -10
# 7. No TODO/FIXME in critical paths
grep -rn "TODO\|FIXME\|XXX\|HACK" --include="*.{ts,js}" src/ 2>/dev/null | head -10
# 8. Database migrations ready
[ -d "prisma/migrations" ] && echo "Prisma migrations: $(ls prisma/migrations | wc -l) total"
[ -d "migrations" ] && echo "Migrations: $(ls migrations | wc -l) total"
# 9. Documentation updated
git diff --name-only HEAD~5 | grep -E "README|CHANGELOG|docs/" | head -10
# 10. Version bumped
cat package.json | jq -r '.version' 2>/dev/null || echo "Check version manually"
# 11. Environment variables documented
[ -f ".env.example" ] && echo "โ
.env.example exists" || echo "โ ๏ธ Missing .env.example"
Branch: [current branch] Commit: [HEAD short hash] Target: [production/staging] Timestamp: [date/time]
| Check | Status | Details |
|---|---|---|
| Tests | โ /โ | X passed, Y failed |
| TypeScript | โ /โ | X errors |
| Lint | โ /โ | X warnings, Y errors |
| Build | โ /โ | Success/Failed |
| Secrets | โ /โ | X potential leaks |
| Check | Status | Action |
|---|---|---|
| Security Audit | โ ๏ธ/โ | X vulnerabilities |
| Console Logs | โ ๏ธ/โ | X found in src/ |
| TODOs | โ ๏ธ/โ | X critical TODOs |
| Migrations | โ ๏ธ/โ | X pending |
| Check | Status | Note |
|---|---|---|
| Docs Updated | โ ๏ธ/โ | CHANGELOG updated |
| Version Bumped | โ ๏ธ/โ | Current: X.Y.Z |
| Env Documented | โ ๏ธ/โ | .env.example present |
๐ด Blockers: X/5 passed
๐ High: X/4 passed
๐ก Recommended: X/3 passed
โโโโโโโโโโโโโโโโโโโโโโโโโ
Overall: [READY TO SHIP / NOT READY]
# Verify production env vars
[ -f ".env.production" ] && echo "Production env exists"
# Check for debug flags
grep -rn "DEBUG=true\|NODE_ENV=development" .env* 2>/dev/null
# Verify API endpoints point to production
grep -rn "localhost\|127\.0\.0\.1" --include="*.{ts,js,json}" src/ 2>/dev/null | grep -v test | head -5
# Staging-specific checks
[ -f ".env.staging" ] && echo "Staging env exists"
# Feature flags for staging
grep -rn "FEATURE_FLAG\|ENABLE_" .env* 2>/dev/null
Add to your pipeline:
# GitHub Actions example
ship-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run ship checklist
run: |
npm ci
npm test
npm run typecheck
npm run lint
npm run build
npm audit --audit-level=high
After deployment, verify:
# 1. Health check
curl -s https://your-app.com/health | jq .
# 2. Version check
curl -s https://your-app.com/version | jq .
# 3. Smoke tests
npm run test:smoke 2>/dev/null || echo "Run smoke tests manually"
Before shipping, ensure you can rollback:
# Note current production tag
git describe --tags --abbrev=0
# Verify rollback procedure exists
[ -f "docs/runbooks/rollback.md" ] && echo "โ
Rollback docs exist"
# Check database migration reversibility
# Prisma: prisma migrate diff
# Rails: rails db:rollback (dry-run)
Full checklist:
/ship
Production deploy:
/ship --production
Quick check (blockers only):
/ship --quick
With specific target:
/ship --target=staging
/release-notes - Generate changelog and announcements/validate-changes - LLM-based code review/security - Deep security audit$ARGUMENTS