qualia-framework 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -0
- package/bin/cli.js +519 -0
- package/framework/agents/architecture-strategist.md +53 -0
- package/framework/agents/backend-agent.md +150 -0
- package/framework/agents/code-simplicity-reviewer.md +86 -0
- package/framework/agents/frontend-agent.md +111 -0
- package/framework/agents/kieran-typescript-reviewer.md +96 -0
- package/framework/agents/performance-oracle.md +111 -0
- package/framework/agents/qualia-codebase-mapper.md +760 -0
- package/framework/agents/qualia-debugger.md +1203 -0
- package/framework/agents/qualia-executor.md +881 -0
- package/framework/agents/qualia-integration-checker.md +423 -0
- package/framework/agents/qualia-phase-researcher.md +453 -0
- package/framework/agents/qualia-plan-checker.md +699 -0
- package/framework/agents/qualia-planner.md +1241 -0
- package/framework/agents/qualia-project-researcher.md +602 -0
- package/framework/agents/qualia-research-synthesizer.md +236 -0
- package/framework/agents/qualia-roadmapper.md +605 -0
- package/framework/agents/qualia-verifier.md +685 -0
- package/framework/agents/team-orchestrator.md +228 -0
- package/framework/agents/teams/full-stack-team.md +48 -0
- package/framework/agents/teams/optimize-team.md +53 -0
- package/framework/agents/teams/review-team.md +62 -0
- package/framework/agents/teams/ship-team.md +86 -0
- package/framework/agents/test-agent.md +182 -0
- package/framework/askpass.sh +2 -0
- package/framework/commands/design.md +53 -0
- package/framework/commands/quick-db.md +22 -0
- package/framework/config/retention.json +35 -0
- package/framework/core/PRINCIPLES.md +77 -0
- package/framework/hooks/auto-format.sh +45 -0
- package/framework/hooks/block-env-edit.sh +42 -0
- package/framework/hooks/branch-guard.sh +46 -0
- package/framework/hooks/confirm-delete.sh +56 -0
- package/framework/hooks/migration-validate.sh +68 -0
- package/framework/hooks/notification-speak.sh +15 -0
- package/framework/hooks/pre-commit.sh +80 -0
- package/framework/hooks/pre-compact.sh +55 -0
- package/framework/hooks/pre-deploy-gate.sh +151 -0
- package/framework/hooks/qualia-colors.sh +32 -0
- package/framework/hooks/retention-cleanup.sh +43 -0
- package/framework/hooks/save-session-state.sh +153 -0
- package/framework/hooks/session-context-loader.sh +28 -0
- package/framework/hooks/session-learn.sh +30 -0
- package/framework/knowledge/claudecode-bible.md +1384 -0
- package/framework/knowledge/client-prefs.md +22 -0
- package/framework/knowledge/common-fixes.md +25 -0
- package/framework/knowledge/deployment-map.md +35 -0
- package/framework/knowledge/email-signature.html +1 -0
- package/framework/knowledge/employees.md +8 -0
- package/framework/knowledge/learned-patterns.md +51 -0
- package/framework/knowledge/optimization-research-2026.md +137 -0
- package/framework/knowledge/qualia-context.md +67 -0
- package/framework/knowledge/supabase-patterns.md +50 -0
- package/framework/knowledge/voice-agent-patterns.md +46 -0
- package/framework/qualia-engine/VERSION +1 -0
- package/framework/qualia-engine/bin/qualia-tools.js +2160 -0
- package/framework/qualia-engine/bin/qualia-tools.test.js +1054 -0
- package/framework/qualia-engine/references/checkpoints.md +775 -0
- package/framework/qualia-engine/references/continuation-format.md +249 -0
- package/framework/qualia-engine/references/decimal-phase-calculation.md +65 -0
- package/framework/qualia-engine/references/design-quality.md +56 -0
- package/framework/qualia-engine/references/git-integration.md +254 -0
- package/framework/qualia-engine/references/git-planning-commit.md +50 -0
- package/framework/qualia-engine/references/model-profile-resolution.md +32 -0
- package/framework/qualia-engine/references/model-profiles.md +73 -0
- package/framework/qualia-engine/references/phase-argument-parsing.md +61 -0
- package/framework/qualia-engine/references/planning-config.md +195 -0
- package/framework/qualia-engine/references/questioning.md +141 -0
- package/framework/qualia-engine/references/tdd.md +263 -0
- package/framework/qualia-engine/references/ui-brand.md +160 -0
- package/framework/qualia-engine/references/verification-patterns.md +612 -0
- package/framework/qualia-engine/templates/DEBUG.md +159 -0
- package/framework/qualia-engine/templates/DESIGN.md +81 -0
- package/framework/qualia-engine/templates/UAT.md +247 -0
- package/framework/qualia-engine/templates/codebase/architecture.md +255 -0
- package/framework/qualia-engine/templates/codebase/concerns.md +310 -0
- package/framework/qualia-engine/templates/codebase/conventions.md +307 -0
- package/framework/qualia-engine/templates/codebase/integrations.md +280 -0
- package/framework/qualia-engine/templates/codebase/stack.md +186 -0
- package/framework/qualia-engine/templates/codebase/structure.md +285 -0
- package/framework/qualia-engine/templates/codebase/testing.md +480 -0
- package/framework/qualia-engine/templates/config.json +35 -0
- package/framework/qualia-engine/templates/context.md +283 -0
- package/framework/qualia-engine/templates/continue-here.md +78 -0
- package/framework/qualia-engine/templates/debug-subagent-prompt.md +91 -0
- package/framework/qualia-engine/templates/discovery.md +146 -0
- package/framework/qualia-engine/templates/milestone-archive.md +123 -0
- package/framework/qualia-engine/templates/milestone.md +115 -0
- package/framework/qualia-engine/templates/phase-prompt.md +567 -0
- package/framework/qualia-engine/templates/planner-subagent-prompt.md +117 -0
- package/framework/qualia-engine/templates/project.md +184 -0
- package/framework/qualia-engine/templates/projects/ai-agent.md +156 -0
- package/framework/qualia-engine/templates/projects/mobile-app.md +181 -0
- package/framework/qualia-engine/templates/projects/voice-agent.md +134 -0
- package/framework/qualia-engine/templates/projects/website.md +137 -0
- package/framework/qualia-engine/templates/requirements.md +231 -0
- package/framework/qualia-engine/templates/research-project/ARCHITECTURE.md +204 -0
- package/framework/qualia-engine/templates/research-project/FEATURES.md +147 -0
- package/framework/qualia-engine/templates/research-project/PITFALLS.md +200 -0
- package/framework/qualia-engine/templates/research-project/STACK.md +120 -0
- package/framework/qualia-engine/templates/research-project/SUMMARY.md +170 -0
- package/framework/qualia-engine/templates/research.md +552 -0
- package/framework/qualia-engine/templates/roadmap.md +202 -0
- package/framework/qualia-engine/templates/state.md +176 -0
- package/framework/qualia-engine/templates/summary-complex.md +59 -0
- package/framework/qualia-engine/templates/summary-minimal.md +41 -0
- package/framework/qualia-engine/templates/summary-standard.md +48 -0
- package/framework/qualia-engine/templates/summary.md +246 -0
- package/framework/qualia-engine/templates/user-setup.md +311 -0
- package/framework/qualia-engine/templates/verification-report.md +322 -0
- package/framework/qualia-engine/workflows/add-phase.md +179 -0
- package/framework/qualia-engine/workflows/add-todo.md +157 -0
- package/framework/qualia-engine/workflows/audit-milestone.md +241 -0
- package/framework/qualia-engine/workflows/check-todos.md +176 -0
- package/framework/qualia-engine/workflows/complete-milestone.md +858 -0
- package/framework/qualia-engine/workflows/diagnose-issues.md +219 -0
- package/framework/qualia-engine/workflows/discovery-phase.md +289 -0
- package/framework/qualia-engine/workflows/discuss-phase.md +534 -0
- package/framework/qualia-engine/workflows/execute-phase.md +559 -0
- package/framework/qualia-engine/workflows/execute-plan.md +438 -0
- package/framework/qualia-engine/workflows/help.md +470 -0
- package/framework/qualia-engine/workflows/insert-phase.md +220 -0
- package/framework/qualia-engine/workflows/list-phase-assumptions.md +178 -0
- package/framework/qualia-engine/workflows/map-codebase.md +327 -0
- package/framework/qualia-engine/workflows/new-milestone.md +363 -0
- package/framework/qualia-engine/workflows/new-project.md +1037 -0
- package/framework/qualia-engine/workflows/pause-work.md +122 -0
- package/framework/qualia-engine/workflows/plan-milestone-gaps.md +256 -0
- package/framework/qualia-engine/workflows/plan-phase.md +422 -0
- package/framework/qualia-engine/workflows/progress.md +354 -0
- package/framework/qualia-engine/workflows/quick.md +252 -0
- package/framework/qualia-engine/workflows/remove-phase.md +326 -0
- package/framework/qualia-engine/workflows/research-phase.md +74 -0
- package/framework/qualia-engine/workflows/resume-project.md +306 -0
- package/framework/qualia-engine/workflows/set-profile.md +80 -0
- package/framework/qualia-engine/workflows/settings.md +145 -0
- package/framework/qualia-engine/workflows/transition.md +556 -0
- package/framework/qualia-engine/workflows/update.md +197 -0
- package/framework/qualia-engine/workflows/verify-phase.md +195 -0
- package/framework/qualia-engine/workflows/verify-work.md +625 -0
- package/framework/rules/context7.md +11 -0
- package/framework/rules/deployment.md +29 -0
- package/framework/rules/frontend.md +33 -0
- package/framework/rules/security.md +12 -0
- package/framework/rules/speed.md +20 -0
- package/framework/scripts/__pycache__/say.cpython-314.pyc +0 -0
- package/framework/scripts/apply-retention.sh +120 -0
- package/framework/scripts/bootstrap-pop-os.sh +354 -0
- package/framework/scripts/claude-voice +13 -0
- package/framework/scripts/cleanup.sh +131 -0
- package/framework/scripts/cowork-mode.sh +141 -0
- package/framework/scripts/generate-project-claude-md.sh +153 -0
- package/framework/scripts/load-test-webhook.js +172 -0
- package/framework/scripts/say.py +236 -0
- package/framework/scripts/showcase-video-recorder/ffmpeg-builder.js +167 -0
- package/framework/scripts/showcase-video-recorder/playwright-helpers.js +216 -0
- package/framework/scripts/speak.py +55 -0
- package/framework/scripts/speak.sh +18 -0
- package/framework/scripts/status.sh +138 -0
- package/framework/scripts/sync-to-framework.sh +65 -0
- package/framework/scripts/voice-hotkey.py +227 -0
- package/framework/scripts/voice-input.sh +51 -0
- package/framework/skills/animate/SKILL.md +202 -0
- package/framework/skills/bolder/SKILL.md +144 -0
- package/framework/skills/browser-qa/SKILL.md +536 -0
- package/framework/skills/clarify/SKILL.md +179 -0
- package/framework/skills/colorize/SKILL.md +170 -0
- package/framework/skills/critique/SKILL.md +126 -0
- package/framework/skills/deep-research/SKILL.md +271 -0
- package/framework/skills/delight/SKILL.md +329 -0
- package/framework/skills/deploy/SKILL.md +261 -0
- package/framework/skills/deploy-verify/SKILL.md +377 -0
- package/framework/skills/deploy-verify/scripts/canary-check.sh +206 -0
- package/framework/skills/deploy-verify/scripts/check-console-errors.js +147 -0
- package/framework/skills/deploy-verify/scripts/check-cwv.js +139 -0
- package/framework/skills/deploy-verify/scripts/project-detect.sh +84 -0
- package/framework/skills/deploy-verify/scripts/verify.sh +548 -0
- package/framework/skills/design-quieter/SKILL.md +130 -0
- package/framework/skills/distill/SKILL.md +149 -0
- package/framework/skills/docs-lookup/SKILL.md +78 -0
- package/framework/skills/fcm-notifications/SKILL.md +125 -0
- package/framework/skills/financial-ledger/SKILL.md +1039 -0
- package/framework/skills/frontend-master/NOTICE.md +4 -0
- package/framework/skills/frontend-master/SKILL.md +127 -0
- package/framework/skills/frontend-master/reference/color-and-contrast.md +132 -0
- package/framework/skills/frontend-master/reference/interaction-design.md +123 -0
- package/framework/skills/frontend-master/reference/motion-design.md +99 -0
- package/framework/skills/frontend-master/reference/responsive-design.md +114 -0
- package/framework/skills/frontend-master/reference/spatial-design.md +100 -0
- package/framework/skills/frontend-master/reference/typography.md +131 -0
- package/framework/skills/frontend-master/reference/ux-writing.md +107 -0
- package/framework/skills/harden/SKILL.md +357 -0
- package/framework/skills/i18n-rtl/SKILL.md +752 -0
- package/framework/skills/learn/SKILL.md +71 -0
- package/framework/skills/memory/SKILL.md +50 -0
- package/framework/skills/mobile-expo/SKILL.md +864 -0
- package/framework/skills/mobile-expo/references/store-checklist.md +550 -0
- package/framework/skills/nestjs-backend/README.md +73 -0
- package/framework/skills/nestjs-backend/SKILL.md +446 -0
- package/framework/skills/nestjs-backend/references/templates.md +1173 -0
- package/framework/skills/normalize/SKILL.md +79 -0
- package/framework/skills/onboard/SKILL.md +242 -0
- package/framework/skills/polish/SKILL.md +209 -0
- package/framework/skills/pr/SKILL.md +66 -0
- package/framework/skills/qualia/SKILL.md +153 -0
- package/framework/skills/qualia-add-todo/SKILL.md +68 -0
- package/framework/skills/qualia-audit-milestone/SKILL.md +92 -0
- package/framework/skills/qualia-check-todos/SKILL.md +55 -0
- package/framework/skills/qualia-complete-milestone/SKILL.md +108 -0
- package/framework/skills/qualia-debug/SKILL.md +149 -0
- package/framework/skills/qualia-design/SKILL.md +203 -0
- package/framework/skills/qualia-discuss-phase/SKILL.md +72 -0
- package/framework/skills/qualia-execute-phase/SKILL.md +86 -0
- package/framework/skills/qualia-help/SKILL.md +67 -0
- package/framework/skills/qualia-idk/SKILL.md +352 -0
- package/framework/skills/qualia-list-phase-assumptions/SKILL.md +67 -0
- package/framework/skills/qualia-new-milestone/SKILL.md +72 -0
- package/framework/skills/qualia-new-project/SKILL.md +92 -0
- package/framework/skills/qualia-optimize/SKILL.md +417 -0
- package/framework/skills/qualia-pause-work/SKILL.md +96 -0
- package/framework/skills/qualia-plan-milestone-gaps/SKILL.md +57 -0
- package/framework/skills/qualia-plan-phase/SKILL.md +101 -0
- package/framework/skills/qualia-progress/SKILL.md +53 -0
- package/framework/skills/qualia-quick/SKILL.md +89 -0
- package/framework/skills/qualia-research-phase/SKILL.md +88 -0
- package/framework/skills/qualia-resume-work/SKILL.md +62 -0
- package/framework/skills/qualia-review/SKILL.md +263 -0
- package/framework/skills/qualia-start/SKILL.md +182 -0
- package/framework/skills/qualia-verify-work/SKILL.md +105 -0
- package/framework/skills/qualia-workflow/SKILL.md +130 -0
- package/framework/skills/rag/SKILL.md +750 -0
- package/framework/skills/responsive/SKILL.md +231 -0
- package/framework/skills/retro/SKILL.md +284 -0
- package/framework/skills/sakani-conventions/SKILL.md +136 -0
- package/framework/skills/sakani-conventions/evals/evals.json +23 -0
- package/framework/skills/sakani-conventions/references/entities.md +365 -0
- package/framework/skills/sakani-conventions/references/error-codes.md +95 -0
- package/framework/skills/seo-master/SKILL.md +490 -0
- package/framework/skills/seo-master/references/checklist.md +199 -0
- package/framework/skills/seo-master/references/structured-data.md +609 -0
- package/framework/skills/ship/SKILL.md +202 -0
- package/framework/skills/stack-researcher/SKILL.md +215 -0
- package/framework/skills/status/SKILL.md +154 -0
- package/framework/skills/status/scripts/health-check.sh +562 -0
- package/framework/skills/subscription-payments/SKILL.md +250 -0
- package/framework/skills/supabase/SKILL.md +973 -0
- package/framework/skills/supabase/references/templates.md +159 -0
- package/framework/skills/team/SKILL.md +67 -0
- package/framework/skills/test-runner/SKILL.md +202 -0
- package/framework/skills/voice-agent/SKILL.md +407 -0
- package/framework/skills/zoho-workflow/SKILL.md +51 -0
- package/framework/statusline-command.sh +117 -0
- package/package.json +24 -0
- package/profiles/fawzi.json +16 -0
- package/profiles/hasan.json +16 -0
- package/profiles/moayad.json +16 -0
- package/templates/CLAUDE-owner.md +52 -0
- package/templates/CLAUDE.md.hbs +58 -0
- package/templates/env.claude.template +12 -0
- package/templates/settings.json +141 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deploy
|
|
3
|
+
description: "Quick deploy, troubleshoot, or rollback Vercel deployments. Use --quick for fast push, --fix for troubleshooting, --preview for staging. For full pipeline with quality gates, use /ship instead."
|
|
4
|
+
tags: [deployment, vercel, ci-cd, production]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Deploy — Quick Deploy & Troubleshooting
|
|
8
|
+
|
|
9
|
+
> For the full production pipeline (quality gates, commit, deploy, verify), use `/ship`.
|
|
10
|
+
> This skill handles quick deploys, troubleshooting, and rollbacks.
|
|
11
|
+
|
|
12
|
+
## Usage
|
|
13
|
+
|
|
14
|
+
- `/deploy --quick` — Skip tests, just build and push to production
|
|
15
|
+
- `/deploy --preview` — Deploy to preview/staging environment
|
|
16
|
+
- `/deploy --fix` — Troubleshoot a failed deployment
|
|
17
|
+
- `/deploy` — Redirects to `/ship` for full pipeline
|
|
18
|
+
|
|
19
|
+
## --quick (Fast Deploy)
|
|
20
|
+
|
|
21
|
+
Skip tests, just build and ship:
|
|
22
|
+
```bash
|
|
23
|
+
npm run build && vercel --prod
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## --fix (Troubleshoot Failures)
|
|
29
|
+
|
|
30
|
+
### Build Failures
|
|
31
|
+
|
|
32
|
+
**Module Not Found:** Check case sensitivity (Linux is case-sensitive). Run `vercel --force` to clear cache.
|
|
33
|
+
|
|
34
|
+
**Memory Issues:** Add to vercel.json:
|
|
35
|
+
```json
|
|
36
|
+
{ "functions": { "app/api/heavy/route.ts": { "maxDuration": 60, "memory": 3008 } } }
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Build Command Issues:**
|
|
40
|
+
```bash
|
|
41
|
+
vercel --build-env NODE_OPTIONS="--max-old-space-size=4096"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Environment Variables
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
vercel env ls # List all env vars
|
|
48
|
+
vercel env add VAR_NAME # Add missing var
|
|
49
|
+
vercel env pull .env.local # Pull to local
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Remember:** `NEXT_PUBLIC_*` for client-side, plain names for server-side only.
|
|
53
|
+
|
|
54
|
+
### CORS Issues
|
|
55
|
+
Add proper CORS headers in API routes with explicit origin allowlist.
|
|
56
|
+
|
|
57
|
+
### Function Timeouts
|
|
58
|
+
Increase `maxDuration` in vercel.json (up to 300s on Pro plan).
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Rollback
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
vercel ls # List deployments
|
|
66
|
+
vercel rollback # Rollback to previous
|
|
67
|
+
vercel rollback [url] # Rollback to specific deployment
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Domain Management
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
vercel domains add example.com
|
|
76
|
+
vercel domains ls
|
|
77
|
+
vercel certs issue example.com # Force SSL renewal
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
DNS: A record `@ → 76.76.21.21`, CNAME `www → cname.vercel-dns.com`
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## vercel.json Reference
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"framework": "nextjs",
|
|
89
|
+
"regions": ["iad1"],
|
|
90
|
+
"headers": [
|
|
91
|
+
{
|
|
92
|
+
"source": "/(.*)",
|
|
93
|
+
"headers": [
|
|
94
|
+
{ "key": "X-Frame-Options", "value": "DENY" },
|
|
95
|
+
{ "key": "X-Content-Type-Options", "value": "nosniff" },
|
|
96
|
+
{ "key": "Strict-Transport-Security", "value": "max-age=63072000; includeSubDomains; preload" }
|
|
97
|
+
]
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"crons": [{ "path": "/api/cron/daily", "schedule": "0 0 * * *" }]
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## When Things Go Wrong
|
|
107
|
+
|
|
108
|
+
### Build Fails Locally
|
|
109
|
+
|
|
110
|
+
**TypeScript errors:**
|
|
111
|
+
```bash
|
|
112
|
+
npx tsc --noEmit 2>&1 | head -40 # See first errors
|
|
113
|
+
npx tsc --noEmit 2>&1 | grep -c "error TS" # Count total errors
|
|
114
|
+
```
|
|
115
|
+
- Fix type errors before deploying — Vercel will hit the same failures
|
|
116
|
+
- If errors are in node_modules: `rm -rf node_modules && npm install`
|
|
117
|
+
- If errors are in generated types: `supabase gen types typescript --linked > types/supabase.ts`
|
|
118
|
+
|
|
119
|
+
**Missing dependencies:**
|
|
120
|
+
```bash
|
|
121
|
+
npm ls 2>&1 | grep "MISSING" # Find missing deps
|
|
122
|
+
npm install # Reinstall all
|
|
123
|
+
rm -rf node_modules/.cache && npm run build # Clear build cache
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Environment variables not set:**
|
|
127
|
+
```bash
|
|
128
|
+
# Check what the build expects
|
|
129
|
+
grep -r "process.env\." --include="*.ts" --include="*.tsx" -h | grep -oP 'process\.env\.\K[A-Z_]+' | sort -u
|
|
130
|
+
# Compare with what's set
|
|
131
|
+
env | grep -E "^(NEXT_|SUPABASE_|VAPI_)" | cut -d= -f1 | sort
|
|
132
|
+
```
|
|
133
|
+
Fix: Copy from `.env.local` or `vercel env pull .env.local`.
|
|
134
|
+
|
|
135
|
+
### Build Passes Locally, Fails on Vercel
|
|
136
|
+
|
|
137
|
+
**Different Node version:**
|
|
138
|
+
```bash
|
|
139
|
+
node -v # Local version
|
|
140
|
+
# Check Vercel: Settings → General → Node.js Version
|
|
141
|
+
```
|
|
142
|
+
Fix: Add to `package.json`:
|
|
143
|
+
```json
|
|
144
|
+
{ "engines": { "node": ">=20.0.0" } }
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Missing env vars on Vercel:**
|
|
148
|
+
```bash
|
|
149
|
+
vercel env ls # See what's set per environment
|
|
150
|
+
vercel env ls production # Production-specific
|
|
151
|
+
```
|
|
152
|
+
Fix: `vercel env add VARIABLE_NAME production` — or use Vercel dashboard → Settings → Environment Variables.
|
|
153
|
+
|
|
154
|
+
Common gotcha: `NEXT_PUBLIC_*` vars must be set at **build time** (not just runtime). If you added one after the last deploy, redeploy.
|
|
155
|
+
|
|
156
|
+
**Case sensitivity:** Linux (Vercel) is case-sensitive, macOS isn't.
|
|
157
|
+
```bash
|
|
158
|
+
# Find case mismatches in imports
|
|
159
|
+
grep -rn "from ['\"]\./" --include="*.ts" --include="*.tsx" | while read line; do
|
|
160
|
+
file=$(echo "$line" | grep -oP "from ['\"]\.\/\K[^'\"]+")
|
|
161
|
+
# Check if the file exists with exact case
|
|
162
|
+
done
|
|
163
|
+
```
|
|
164
|
+
Fix: Rename files to match import casing exactly.
|
|
165
|
+
|
|
166
|
+
### Deploy Succeeds But Site is Broken
|
|
167
|
+
|
|
168
|
+
**White screen (client crash):**
|
|
169
|
+
```bash
|
|
170
|
+
# Check Vercel function logs
|
|
171
|
+
vercel logs <deployment-url> --follow
|
|
172
|
+
# Check for hydration errors in browser console
|
|
173
|
+
node ~/.claude/skills/deploy-verify/scripts/check-console-errors.js <url>
|
|
174
|
+
```
|
|
175
|
+
Common causes:
|
|
176
|
+
- `window` or `document` used in server component → wrap in `useEffect` or add `'use client'`
|
|
177
|
+
- Hydration mismatch → check for `Date.now()`, `Math.random()`, or browser-only APIs in SSR
|
|
178
|
+
- Missing `'use client'` directive on component using hooks
|
|
179
|
+
|
|
180
|
+
**500 errors on API routes:**
|
|
181
|
+
```bash
|
|
182
|
+
vercel logs <deployment-url> 2>&1 | grep -i "error\|500"
|
|
183
|
+
```
|
|
184
|
+
Common causes:
|
|
185
|
+
- Env var exists locally but not on Vercel (`vercel env ls`)
|
|
186
|
+
- API route importing a server-only module incorrectly
|
|
187
|
+
- Database connection string pointing to localhost
|
|
188
|
+
|
|
189
|
+
**Hydration mismatch:**
|
|
190
|
+
```bash
|
|
191
|
+
# Search for dynamic content rendered during SSR
|
|
192
|
+
grep -rn "Date.now\|Math.random\|window\.\|document\.\|localStorage" --include="*.tsx" --include="*.ts" app/
|
|
193
|
+
```
|
|
194
|
+
Fix: Wrap dynamic content in `useEffect` or use `suppressHydrationWarning` on the specific element (not as a blanket fix).
|
|
195
|
+
|
|
196
|
+
**Rollback immediately if production is broken:**
|
|
197
|
+
```bash
|
|
198
|
+
vercel rollback --prod # Instant rollback
|
|
199
|
+
vercel ls | head -5 # See recent deployments
|
|
200
|
+
vercel inspect <old-deployment-url> # Check what was different
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Deploy Succeeds But Migrations Weren't Applied
|
|
204
|
+
|
|
205
|
+
Symptoms: New columns/tables don't exist, API returns "column X does not exist".
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# Check what migrations are pending
|
|
209
|
+
supabase migration list --project-ref <ref>
|
|
210
|
+
# Push pending migrations
|
|
211
|
+
supabase db push --project-ref <ref>
|
|
212
|
+
# Verify the schema
|
|
213
|
+
supabase db dump --schema public --project-ref <ref> | grep "table_name"
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Prevention: Add migration push to your deploy flow:
|
|
217
|
+
```bash
|
|
218
|
+
supabase db push --project-ref <ref> && vercel --prod
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Vercel Rate Limit or Quota Exceeded
|
|
222
|
+
|
|
223
|
+
Symptoms: `429 Too Many Requests` or deployment stuck in queue.
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
# Check current usage
|
|
227
|
+
vercel teams ls # See team/plan info
|
|
228
|
+
# Wait and retry
|
|
229
|
+
sleep 60 && vercel --prod # Rate limits usually clear in ~60s
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
If on Hobby plan: max 100 deployments/day. Switch to `--preview` for testing, save `--prod` for real deploys.
|
|
233
|
+
|
|
234
|
+
If build minutes exhausted: Wait for monthly reset, or upgrade plan.
|
|
235
|
+
|
|
236
|
+
### Domain DNS Not Propagating
|
|
237
|
+
|
|
238
|
+
Symptoms: Site works at `*.vercel.app` but not at custom domain.
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
# Check DNS resolution
|
|
242
|
+
dig A yourdomain.com +short # Should show 76.76.21.21
|
|
243
|
+
dig CNAME www.yourdomain.com +short # Should show cname.vercel-dns.com
|
|
244
|
+
nslookup yourdomain.com # Alternative check
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**DNS not pointing to Vercel:**
|
|
248
|
+
```bash
|
|
249
|
+
vercel domains inspect yourdomain.com # Shows expected DNS records
|
|
250
|
+
```
|
|
251
|
+
Fix: Update DNS at your registrar. A record → `76.76.21.21`, CNAME → `cname.vercel-dns.com`.
|
|
252
|
+
|
|
253
|
+
**SSL not provisioning:**
|
|
254
|
+
```bash
|
|
255
|
+
vercel certs ls # Check cert status
|
|
256
|
+
vercel certs issue yourdomain.com # Force re-issue
|
|
257
|
+
```
|
|
258
|
+
Note: DNS propagation takes 5 min to 48 hours. Check with `dig` — if DNS is correct but SSL isn't ready, wait or force re-issue.
|
|
259
|
+
|
|
260
|
+
**Temporary workaround while DNS propagates:**
|
|
261
|
+
Share the `*.vercel.app` URL with the client until the custom domain resolves.
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deploy-verify
|
|
3
|
+
description: Run post-deploy 8-check verification and T+2min canary health check against baseline. Run after vercel --prod deployments to verify.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Deploy Verification
|
|
8
|
+
|
|
9
|
+
Production verification suite — 8 checks with retry logic, auto-detection of the current project, and actionable failure remediation.
|
|
10
|
+
|
|
11
|
+
Invoked automatically after `vercel --prod` (via PostToolUse hook) or manually with `/deploy-verify <URL>`.
|
|
12
|
+
|
|
13
|
+
## Project Auto-Detection
|
|
14
|
+
|
|
15
|
+
The skill determines which project is being verified:
|
|
16
|
+
|
|
17
|
+
1. Read the current working directory name
|
|
18
|
+
2. Match against the project inventory in `~/.claude/knowledge/qualia-context.md`
|
|
19
|
+
3. Extract: project name, Supabase ref (if any), hosting type, known endpoints
|
|
20
|
+
4. If no match: run in generic mode (skip Supabase-specific checks)
|
|
21
|
+
|
|
22
|
+
This means you don't need to pass a Supabase ref or project name — it's derived from context.
|
|
23
|
+
|
|
24
|
+
## The 8 Checks
|
|
25
|
+
|
|
26
|
+
### Check 1: HTTP Status (CRITICAL)
|
|
27
|
+
|
|
28
|
+
Verify the site loads successfully.
|
|
29
|
+
|
|
30
|
+
- **Endpoints tested:** Root URL (`/`) and `/api/health` (if it exists)
|
|
31
|
+
- **Retry:** 3 attempts with exponential backoff (5s → 15s → 30s)
|
|
32
|
+
- **Follow redirects** (`-L`) — but log the redirect chain
|
|
33
|
+
- **PASS:** HTTP 200 on root URL
|
|
34
|
+
- **WARN:** HTTP 200 but only after redirect (3xx → 200)
|
|
35
|
+
- **FAIL:** Any non-200 final status, timeout, or connection refused
|
|
36
|
+
- **CRITICAL:** If root URL fails all 3 retries, halt verification — nothing else matters
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Core logic
|
|
40
|
+
curl -sL -o /dev/null -w "%{http_code}" --max-time 15 "$URL"
|
|
41
|
+
curl -sL -o /dev/null -w "%{http_code}" --max-time 15 "$URL/api/health"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Check 2: Auth Flow
|
|
45
|
+
|
|
46
|
+
Verify authentication is functional (if the project uses auth).
|
|
47
|
+
|
|
48
|
+
- **Step 1:** Hit a known protected route (e.g., `/dashboard`, `/admin`, `/app`)
|
|
49
|
+
- Expect: 302/307 redirect to login page OR 401
|
|
50
|
+
- PASS if redirect target contains `/login`, `/auth`, `/sign-in`
|
|
51
|
+
- **Step 2:** Check Supabase auth health (if project has a Supabase ref)
|
|
52
|
+
- Query: `https://<ref>.supabase.co/auth/v1/health`
|
|
53
|
+
- Expect: HTTP 200 with `{"status":"ok"}`
|
|
54
|
+
- **Step 3:** Verify auth callback endpoint exists
|
|
55
|
+
- Check: `/api/auth/callback`, `/auth/callback`
|
|
56
|
+
- Expect: non-404 response
|
|
57
|
+
- **PASS:** Protected route redirects correctly AND Supabase auth is healthy
|
|
58
|
+
- **WARN:** Auth callback exists but protected route test is ambiguous
|
|
59
|
+
- **SKIP:** No auth endpoints detected and no Supabase ref (static site)
|
|
60
|
+
- **FAIL:** Supabase auth unhealthy, or protected route returns 500
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Supabase auth health
|
|
64
|
+
curl -s "https://${SUPABASE_REF}.supabase.co/auth/v1/health" | jq -r '.status'
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Check 3: Console Errors (Headless Browser)
|
|
68
|
+
|
|
69
|
+
Detect client-side JavaScript errors using Playwright.
|
|
70
|
+
|
|
71
|
+
- **How:** Run `scripts/check-console-errors.js` which:
|
|
72
|
+
1. Launches headless Chromium via Playwright
|
|
73
|
+
2. Navigates to the URL
|
|
74
|
+
3. Listens for `console.error` and `pageerror` events
|
|
75
|
+
4. Waits for `networkidle`
|
|
76
|
+
5. Returns collected errors
|
|
77
|
+
- **PASS:** Zero console errors
|
|
78
|
+
- **WARN:** Console errors present but all are known benign patterns (e.g., third-party tracking, browser extension noise)
|
|
79
|
+
- **FAIL:** Any console error matching: `TypeError`, `ReferenceError`, `SyntaxError`, `ChunkLoadError`, `Unhandled`, `NEXT_`, `500`, `Internal Server Error`
|
|
80
|
+
- **Fallback:** If Playwright unavailable, fall back to curl-based HTML inspection (check for server error strings in page source — same as the old approach, clearly marked as degraded)
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
node ~/.claude/skills/deploy-verify/scripts/check-console-errors.js "$URL"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Check 4: API Latency
|
|
87
|
+
|
|
88
|
+
Measure response times against defined thresholds.
|
|
89
|
+
|
|
90
|
+
- **Endpoints tested:** At minimum the root URL + one API route (auto-detected or `/api/health`)
|
|
91
|
+
- **Thresholds:**
|
|
92
|
+
- `< 500ms` → **PASS** (green)
|
|
93
|
+
- `500ms – 1000ms` → **WARN** (yellow — acceptable but monitor)
|
|
94
|
+
- `> 1000ms` → **FAIL** (red — too slow for production)
|
|
95
|
+
- **Measurement:** `curl -w "%{time_total}"` — measures full request cycle (DNS + connect + TLS + transfer)
|
|
96
|
+
- **Run 3 times** and report the median to avoid outliers
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# Measure in ms
|
|
100
|
+
curl -sL -o /dev/null -w "%{time_total}" --max-time 15 "$URL" | awk '{printf "%.0f", $1 * 1000}'
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Check 5: Database Connectivity (NEW)
|
|
104
|
+
|
|
105
|
+
Verify Supabase is reachable and responding.
|
|
106
|
+
|
|
107
|
+
- **Requires:** Supabase ref from qualia-context.md
|
|
108
|
+
- **Method:** Use the Supabase REST API to run a simple health query
|
|
109
|
+
- `GET https://<ref>.supabase.co/rest/v1/?apikey=<anon_key>` — should return non-error
|
|
110
|
+
- OR use `supabase` CLI: `supabase db execute --project-ref <ref> "SELECT 1"`
|
|
111
|
+
- **PASS:** Query returns successfully
|
|
112
|
+
- **WARN:** Query succeeds but latency > 500ms
|
|
113
|
+
- **FAIL:** Connection refused, timeout, or auth error
|
|
114
|
+
- **SKIP:** Project has no Supabase ref (static site)
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
# CLI approach
|
|
118
|
+
supabase db execute --project-ref "$SUPABASE_REF" "SELECT 1 AS health"
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Check 6: Core Web Vitals (NEW)
|
|
122
|
+
|
|
123
|
+
Measure LCP, CLS, and INP using Google PageSpeed Insights API.
|
|
124
|
+
|
|
125
|
+
- **Method:** Run `scripts/check-cwv.js` which calls the PageSpeed Insights API (no key needed for basic usage)
|
|
126
|
+
- `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=<URL>&strategy=mobile`
|
|
127
|
+
- **Metrics and thresholds** (from Google's standards):
|
|
128
|
+
- **LCP** (Largest Contentful Paint): < 2.5s PASS, 2.5–4s WARN, > 4s FAIL
|
|
129
|
+
- **CLS** (Cumulative Layout Shift): < 0.1 PASS, 0.1–0.25 WARN, > 0.25 FAIL
|
|
130
|
+
- **INP** (Interaction to Next Paint): < 200ms PASS, 200–500ms WARN, > 500ms FAIL
|
|
131
|
+
- **PASS:** All three metrics in green
|
|
132
|
+
- **WARN:** Any metric in yellow range
|
|
133
|
+
- **FAIL:** Any metric in red range
|
|
134
|
+
- **Fallback:** If API is unreachable, mark as SKIP with note
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
node ~/.claude/skills/deploy-verify/scripts/check-cwv.js "$URL"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Check 7: Dependency Services (NEW)
|
|
141
|
+
|
|
142
|
+
Verify external services the project depends on.
|
|
143
|
+
|
|
144
|
+
- **Auto-detect dependencies** by reading the project's `.env.local` or `.env` variable names (not values):
|
|
145
|
+
- `NEXT_PUBLIC_SUPABASE_URL` → Supabase (already checked in #5)
|
|
146
|
+
- `VAPI_*` → VAPI API health
|
|
147
|
+
- `OPENROUTER_*` → OpenRouter status
|
|
148
|
+
- `ELEVEN_LABS_*` → ElevenLabs status
|
|
149
|
+
- `RETELL_*` → Retell AI status
|
|
150
|
+
- `STRIPE_*` → Stripe API status
|
|
151
|
+
- `TELNYX_*` → Telnyx status
|
|
152
|
+
- **Method:** HTTP GET to each service's known status/health endpoint
|
|
153
|
+
- **PASS:** All detected services responding
|
|
154
|
+
- **WARN:** A non-critical service is degraded (e.g., analytics)
|
|
155
|
+
- **FAIL:** A critical dependency is down
|
|
156
|
+
- **SKIP:** No external dependencies detected beyond Supabase
|
|
157
|
+
|
|
158
|
+
### Check 8: SSL Certificate (NEW)
|
|
159
|
+
|
|
160
|
+
Verify TLS certificate validity.
|
|
161
|
+
|
|
162
|
+
- **Method:** `openssl s_client` to inspect the certificate
|
|
163
|
+
- **Check:** Certificate is valid, matches the domain, and has > 30 days until expiry
|
|
164
|
+
- **PASS:** Valid cert, > 30 days remaining
|
|
165
|
+
- **WARN:** Valid cert, 7–30 days remaining
|
|
166
|
+
- **FAIL:** Expired, mismatched domain, or < 7 days remaining
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN:443" 2>/dev/null | openssl x509 -noout -dates -checkend 2592000
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Retry Logic
|
|
173
|
+
|
|
174
|
+
Applied to **every check** (not just HTTP):
|
|
175
|
+
|
|
176
|
+
| Attempt | Delay Before Retry |
|
|
177
|
+
|---------|-------------------|
|
|
178
|
+
| 1st | Immediate |
|
|
179
|
+
| 2nd | 5 seconds |
|
|
180
|
+
| 3rd | 15 seconds |
|
|
181
|
+
| Final | 30 seconds |
|
|
182
|
+
|
|
183
|
+
- A check only gets status FAIL after **all retries exhausted**
|
|
184
|
+
- Between retries, log: `⟳ Retrying <check> (attempt 2/3, waiting 15s)...`
|
|
185
|
+
- Checks that PASS or WARN on any attempt stop retrying
|
|
186
|
+
|
|
187
|
+
## Output Format
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
══════════════════════════════════════════════════════
|
|
191
|
+
DEPLOY VERIFICATION — projectname
|
|
192
|
+
URL: https://project.vercel.app
|
|
193
|
+
Timestamp: 2026-03-04 17:30:42 UTC
|
|
194
|
+
══════════════════════════════════════════════════════
|
|
195
|
+
|
|
196
|
+
✓ PASS HTTP Status 200 OK (142ms)
|
|
197
|
+
✓ PASS Auth Flow Protected /dashboard → /login redirect, Supabase auth healthy
|
|
198
|
+
⚠ WARN Console Errors 1 non-critical error (third-party tracking pixel)
|
|
199
|
+
✓ PASS API Latency Root: 287ms, /api/health: 145ms
|
|
200
|
+
✓ PASS DB Connectivity Supabase responding (89ms)
|
|
201
|
+
⚠ WARN Core Web Vitals LCP: 2.1s ✓ CLS: 0.12 ⚠ INP: 95ms ✓
|
|
202
|
+
✓ PASS Dependencies Stripe ✓ VAPI ✓
|
|
203
|
+
✓ PASS SSL Certificate Valid, expires in 68 days
|
|
204
|
+
|
|
205
|
+
──────────────────────────────────────────────────────
|
|
206
|
+
RESULT: 6 PASS · 2 WARN · 0 FAIL
|
|
207
|
+
Total verification time: 34.2s
|
|
208
|
+
──────────────────────────────────────────────────────
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
- Each line shows: status icon, check name (padded), and specific detail
|
|
212
|
+
- Timestamps in UTC
|
|
213
|
+
- Total time measured from start to finish
|
|
214
|
+
|
|
215
|
+
## When Verification Fails
|
|
216
|
+
|
|
217
|
+
### Decision Tree
|
|
218
|
+
|
|
219
|
+
```
|
|
220
|
+
┌─────────────────┐
|
|
221
|
+
│ Run 8 Checks │
|
|
222
|
+
└────────┬────────┘
|
|
223
|
+
│
|
|
224
|
+
┌────────────┴────────────┐
|
|
225
|
+
│ │
|
|
226
|
+
All PASS/WARN Any FAIL
|
|
227
|
+
│ │
|
|
228
|
+
✅ Deploy OK ┌────────┴────────┐
|
|
229
|
+
│ │
|
|
230
|
+
1 FAIL only 2+ FAIL
|
|
231
|
+
│ │
|
|
232
|
+
Investigate & ROLLBACK
|
|
233
|
+
fix specific immediately
|
|
234
|
+
check │
|
|
235
|
+
┌─────┴──────┐
|
|
236
|
+
│ │
|
|
237
|
+
HTTP FAIL Other FAIL
|
|
238
|
+
(CRITICAL) │
|
|
239
|
+
│ vercel rollback
|
|
240
|
+
IMMEDIATE --prod
|
|
241
|
+
ROLLBACK │
|
|
242
|
+
│ Re-verify
|
|
243
|
+
vercel rollback previous
|
|
244
|
+
--prod deployment
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Severity Levels
|
|
248
|
+
|
|
249
|
+
- **CRITICAL** (immediate rollback): HTTP Status fails (site is down)
|
|
250
|
+
- **HIGH** (rollback if can't fix in 10 min): Auth flow broken, DB connectivity lost
|
|
251
|
+
- **MEDIUM** (investigate, no rollback): Console errors, high latency, SSL warning
|
|
252
|
+
- **LOW** (monitor): CWV warnings, dependency warnings
|
|
253
|
+
|
|
254
|
+
### Rollback Procedure
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# 1. Rollback to previous deployment
|
|
258
|
+
vercel rollback --prod
|
|
259
|
+
|
|
260
|
+
# 2. Re-run verification on rolled-back version
|
|
261
|
+
bash ~/.claude/skills/deploy-verify/scripts/verify.sh <URL>
|
|
262
|
+
|
|
263
|
+
# 3. Investigate the failed deployment
|
|
264
|
+
vercel inspect <deployment-url>
|
|
265
|
+
vercel logs <deployment-url>
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### What to Check Per Failure
|
|
269
|
+
|
|
270
|
+
| Failed Check | First Step |
|
|
271
|
+
|---------------------|------------------------------------------------------|
|
|
272
|
+
| HTTP Status | `vercel logs <url>` — check for build/runtime errors |
|
|
273
|
+
| Auth Flow | Check Supabase dashboard → Auth → Settings |
|
|
274
|
+
| Console Errors | Open browser DevTools → Console, look for the error |
|
|
275
|
+
| API Latency | `vercel logs <url>` — check for slow queries |
|
|
276
|
+
| DB Connectivity | Supabase dashboard → Database → check if paused |
|
|
277
|
+
| Core Web Vitals | PageSpeed Insights → check largest element, layout shifts |
|
|
278
|
+
| Dependencies | Check service status page for the failing provider |
|
|
279
|
+
| SSL Certificate | Vercel dashboard → Domains → check cert status |
|
|
280
|
+
|
|
281
|
+
## Scripts
|
|
282
|
+
|
|
283
|
+
All helper scripts live in `~/.claude/skills/deploy-verify/scripts/`:
|
|
284
|
+
|
|
285
|
+
| Script | Purpose |
|
|
286
|
+
|---------------------------|-------------------------------------------|
|
|
287
|
+
| `verify.sh` | Main orchestrator — runs all 8 checks |
|
|
288
|
+
| `check-console-errors.js`| Playwright headless browser console check |
|
|
289
|
+
| `check-cwv.js` | PageSpeed Insights API for Core Web Vitals |
|
|
290
|
+
| `project-detect.sh` | Auto-detect project from cwd |
|
|
291
|
+
|
|
292
|
+
## Usage
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
# Auto-detect project, run full verification
|
|
296
|
+
bash ~/.claude/skills/deploy-verify/scripts/verify.sh <URL>
|
|
297
|
+
|
|
298
|
+
# The skill is also invoked automatically by the PostToolUse hook
|
|
299
|
+
# after any `vercel --prod` command completes
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## Pre-Deploy Review Check
|
|
303
|
+
|
|
304
|
+
Before running the 8 verification checks, read the review file:
|
|
305
|
+
|
|
306
|
+
1. Check `.planning/REVIEW.md` then `.review/REVIEW.md`
|
|
307
|
+
2. If found: parse frontmatter of the most recent entry
|
|
308
|
+
- `status: has_blockers` → **WARN** with list of CRITICAL/HIGH findings. Ask user: "Deploy anyway?" or "Fix first?"
|
|
309
|
+
- `status: clean` → Note "Pre-deploy review: clean" and continue
|
|
310
|
+
3. If not found → **WARN**: "No `/review` found. Consider running `/review` before deploying." (advisory only, not blocking)
|
|
311
|
+
|
|
312
|
+
Recommended workflow: `/review` → fix findings → `/ship` → (auto-triggers `/deploy-verify`)
|
|
313
|
+
|
|
314
|
+
## When to Invoke
|
|
315
|
+
|
|
316
|
+
- Automatically after `vercel --prod` (PostToolUse hook)
|
|
317
|
+
- After any production deployment via `/ship`
|
|
318
|
+
- Manually when you want to verify a live deployment
|
|
319
|
+
- After a rollback to confirm the previous version is healthy
|
|
320
|
+
|
|
321
|
+
## Canary Monitoring (T+2min Post-Deploy)
|
|
322
|
+
|
|
323
|
+
After the 8 verification checks pass, a canary check is automatically scheduled to run 120 seconds later. This catches regressions that manifest after CDN propagation and cache warming.
|
|
324
|
+
|
|
325
|
+
### What It Checks
|
|
326
|
+
|
|
327
|
+
| Metric | Baseline Source | Regression Threshold |
|
|
328
|
+
|--------|----------------|---------------------|
|
|
329
|
+
| HTTP Status | `canary-baseline.json` | Any status change from baseline |
|
|
330
|
+
| Console Errors | `canary-baseline.json` | Any increase over baseline count |
|
|
331
|
+
| Page Load Time | `canary-baseline.json` | Exceeds 2x baseline time |
|
|
332
|
+
|
|
333
|
+
### Baseline Management
|
|
334
|
+
|
|
335
|
+
The baseline is stored per-project at `.planning/canary-baseline.json`. It is auto-created on first deploy-verify run (captures current metrics as the known-good state).
|
|
336
|
+
|
|
337
|
+
To manually update the baseline (after intentional performance changes):
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
bash ~/.claude/skills/deploy-verify/scripts/canary-check.sh <URL> --update-baseline --project-dir /path/to/project
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Consecutive Failure Policy
|
|
344
|
+
|
|
345
|
+
A single canary failure produces a warning but no alert. Only 2 or more consecutive failures trigger a regression flag. This prevents false alarms from transient network issues or CDN cache warming.
|
|
346
|
+
|
|
347
|
+
Consecutive failure state is tracked in `/tmp/.canary-failures-<url-hash>` and resets automatically on any passing canary check.
|
|
348
|
+
|
|
349
|
+
### Canary Output
|
|
350
|
+
|
|
351
|
+
```
|
|
352
|
+
──────────────────────────────────────────────────────
|
|
353
|
+
CANARY CHECK — T+2min post-deploy
|
|
354
|
+
URL: https://project.vercel.app
|
|
355
|
+
Baseline: 2026-03-29T12:00:00Z
|
|
356
|
+
──────────────────────────────────────────────────────
|
|
357
|
+
|
|
358
|
+
Metric Baseline Current Status
|
|
359
|
+
──────────────────── ──────────── ──────────── ────────────
|
|
360
|
+
HTTP Status 200 200 OK
|
|
361
|
+
Console Errors 0 0 OK
|
|
362
|
+
Load Time (ms) 287 312 OK (<574ms)
|
|
363
|
+
|
|
364
|
+
CANARY PASS — All metrics within baseline thresholds
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
### Scripts
|
|
368
|
+
|
|
369
|
+
| Script | Purpose |
|
|
370
|
+
|--------|---------|
|
|
371
|
+
| `canary-check.sh` | Canary engine — collect metrics, compare to baseline, track failures |
|
|
372
|
+
|
|
373
|
+
### When Canary Runs
|
|
374
|
+
|
|
375
|
+
- Automatically: 120s after `verify.sh` completes with 0 failures (background process)
|
|
376
|
+
- Manually: `bash ~/.claude/skills/deploy-verify/scripts/canary-check.sh <URL> --project-dir /path`
|
|
377
|
+
- Baseline update: Add `--update-baseline` flag to capture current state as new baseline
|