|
| 1 | +--- |
| 2 | +name: deploy-to-vercel |
| 3 | +description: Deploy applications and websites to Vercel. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment". |
| 4 | +metadata: |
| 5 | + author: vercel |
| 6 | + version: "3.0.0" |
| 7 | +--- |
| 8 | + |
| 9 | +# Deploy to Vercel |
| 10 | + |
| 11 | +Deploy any project to Vercel. **Always deploy as preview** (not production) unless the user explicitly asks for production. |
| 12 | + |
| 13 | +The goal is to get the user into the best long-term setup: their project linked to Vercel with git-push deploys. Every method below tries to move the user closer to that state. |
| 14 | + |
| 15 | +## Step 1: Gather Project State |
| 16 | + |
| 17 | +Run all four checks before deciding which method to use: |
| 18 | + |
| 19 | +```bash |
| 20 | +# 1. Check for a git remote |
| 21 | +git remote get-url origin 2>/dev/null |
| 22 | + |
| 23 | +# 2. Check if locally linked to a Vercel project (either file means linked) |
| 24 | +cat .vercel/project.json 2>/dev/null || cat .vercel/repo.json 2>/dev/null |
| 25 | + |
| 26 | +# 3. Check if the Vercel CLI is installed and authenticated |
| 27 | +vercel whoami 2>/dev/null |
| 28 | + |
| 29 | +# 4. List available teams (if authenticated) |
| 30 | +vercel teams list --format json 2>/dev/null |
| 31 | +``` |
| 32 | + |
| 33 | +### Team selection |
| 34 | + |
| 35 | +If the user belongs to multiple teams, present all available team slugs as a bulleted list and ask which one to deploy to. Once the user picks a team, proceed immediately to the next step — do not ask for additional confirmation. |
| 36 | + |
| 37 | +Pass the team slug via `--scope` on all subsequent CLI commands (`vercel deploy`, `vercel link`, `vercel inspect`, etc.): |
| 38 | + |
| 39 | +```bash |
| 40 | +vercel deploy [path] -y --no-wait --scope <team-slug> |
| 41 | +``` |
| 42 | + |
| 43 | +If the project is already linked (`.vercel/project.json` or `.vercel/repo.json` exists), the `orgId` in those files determines the team — no need to ask again. If there is only one team (or just a personal account), skip the prompt and use it directly. |
| 44 | + |
| 45 | +**About the `.vercel/` directory:** A linked project has either: |
| 46 | +- `.vercel/project.json` — created by `vercel link` (single project linking). Contains `projectId` and `orgId`. |
| 47 | +- `.vercel/repo.json` — created by `vercel link --repo` (repo-based linking). Contains `orgId`, `remoteName`, and a `projects` array mapping directories to Vercel project IDs. |
| 48 | + |
| 49 | +Either file means the project is linked. Check for both. |
| 50 | + |
| 51 | +**Do NOT** use `vercel project inspect`, `vercel ls`, or `vercel link` to detect state in an unlinked directory — without a `.vercel/` config, they will interactively prompt (or with `--yes`, silently link as a side-effect). Only `vercel whoami` is safe to run anywhere. |
| 52 | + |
| 53 | +## Step 2: Choose a Deploy Method |
| 54 | + |
| 55 | +### Linked (`.vercel/` exists) + has git remote → Git Push |
| 56 | + |
| 57 | +This is the ideal state. The project is linked and has git integration. |
| 58 | + |
| 59 | +1. **Ask the user before pushing.** Never push without explicit approval: |
| 60 | + ``` |
| 61 | + This project is connected to Vercel via git. I can commit and push to |
| 62 | + trigger a deployment. Want me to proceed? |
| 63 | + ``` |
| 64 | + |
| 65 | +2. **Commit and push:** |
| 66 | + ```bash |
| 67 | + git add . |
| 68 | + git commit -m "deploy: <description of changes>" |
| 69 | + git push |
| 70 | + ``` |
| 71 | + Vercel automatically builds from the push. Non-production branches get preview deployments; the production branch (usually `main`) gets a production deployment. |
| 72 | + |
| 73 | +3. **Retrieve the preview URL.** If the CLI is authenticated: |
| 74 | + ```bash |
| 75 | + sleep 5 |
| 76 | + vercel ls --format json |
| 77 | + ``` |
| 78 | + The JSON output has a `deployments` array. Find the latest entry — its `url` field is the preview URL. |
| 79 | + |
| 80 | + If the CLI is not authenticated, tell the user to check the Vercel dashboard or the commit status checks on their git provider for the preview URL. |
| 81 | + |
| 82 | +--- |
| 83 | + |
| 84 | +### Linked (`.vercel/` exists) + no git remote → `vercel deploy` |
| 85 | + |
| 86 | +The project is linked but there's no git repo. Deploy directly with the CLI. |
| 87 | + |
| 88 | +```bash |
| 89 | +vercel deploy [path] -y --no-wait |
| 90 | +``` |
| 91 | + |
| 92 | +Use `--no-wait` so the CLI returns immediately with the deployment URL instead of blocking until the build finishes (builds can take a while). Then check on the deployment status with: |
| 93 | + |
| 94 | +```bash |
| 95 | +vercel inspect <deployment-url> |
| 96 | +``` |
| 97 | + |
| 98 | +For production deploys (only if user explicitly asks): |
| 99 | +```bash |
| 100 | +vercel deploy [path] --prod -y --no-wait |
| 101 | +``` |
| 102 | + |
| 103 | +--- |
| 104 | + |
| 105 | +### Not linked + CLI is authenticated → Link first, then deploy |
| 106 | + |
| 107 | +The CLI is working but the project isn't linked yet. This is the opportunity to get the user into the best state. |
| 108 | + |
| 109 | +1. **Ask the user which team to deploy to.** Present the team slugs from Step 1 as a bulleted list. If there's only one team (or just a personal account), skip this step. |
| 110 | + |
| 111 | +2. **Once a team is selected, proceed directly to linking.** Tell the user what will happen but do not ask for separate confirmation: |
| 112 | + ``` |
| 113 | + Linking this project to <team name> on Vercel. This will create a Vercel |
| 114 | + project to deploy to and enable automatic deployments on future git pushes. |
| 115 | + ``` |
| 116 | + |
| 117 | +3. **If a git remote exists**, use repo-based linking with the selected team scope: |
| 118 | + ```bash |
| 119 | + vercel link --repo --scope <team-slug> |
| 120 | + ``` |
| 121 | + This reads the git remote URL and matches it to existing Vercel projects that deploy from that repo. It creates `.vercel/repo.json`. This is much more reliable than `vercel link` (without `--repo`), which tries to match by directory name and often fails when the local folder and Vercel project are named differently. |
| 122 | + |
| 123 | + **If there is no git remote**, fall back to standard linking: |
| 124 | + ```bash |
| 125 | + vercel link --scope <team-slug> |
| 126 | + ``` |
| 127 | + This prompts the user to select or create a project. It creates `.vercel/project.json`. |
| 128 | + |
| 129 | +4. **Then deploy using the best available method:** |
| 130 | + - If a git remote exists → commit and push (see git push method above) |
| 131 | + - If no git remote → `vercel deploy [path] -y --no-wait --scope <team-slug>`, then `vercel inspect <url>` to check status |
| 132 | + |
| 133 | +--- |
| 134 | + |
| 135 | +### Not linked + CLI not authenticated → Install, auth, link, deploy |
| 136 | + |
| 137 | +The Vercel CLI isn't set up at all. |
| 138 | + |
| 139 | +1. **Install the CLI (if not already installed):** |
| 140 | + ```bash |
| 141 | + npm install -g vercel |
| 142 | + ``` |
| 143 | + |
| 144 | +2. **Authenticate:** |
| 145 | + ```bash |
| 146 | + vercel login |
| 147 | + ``` |
| 148 | + The user completes auth in their browser. If running in a non-interactive environment where login is not possible, skip to the **no-auth fallback** below. |
| 149 | + |
| 150 | +3. **Ask which team to deploy to** — present team slugs from `vercel teams list --format json` as a bulleted list. If only one team / personal account, skip. Once selected, proceed immediately. |
| 151 | + |
| 152 | +4. **Link the project** with the selected team scope (use `--repo` if a git remote exists, plain `vercel link` otherwise): |
| 153 | + ```bash |
| 154 | + vercel link --repo --scope <team-slug> # if git remote exists |
| 155 | + vercel link --scope <team-slug> # if no git remote |
| 156 | + ``` |
| 157 | + |
| 158 | +5. **Deploy** using the best available method (git push if remote exists, otherwise `vercel deploy -y --no-wait --scope <team-slug>`, then `vercel inspect <url>` to check status). |
| 159 | + |
| 160 | +--- |
| 161 | + |
| 162 | +### No-Auth Fallback — claude.ai sandbox |
| 163 | + |
| 164 | +**When to use:** Last resort when the CLI can't be installed or authenticated in the claude.ai sandbox. This requires no authentication — it returns a **Preview URL** (live site) and a **Claim URL** (transfer to your Vercel account). |
| 165 | + |
| 166 | +```bash |
| 167 | +bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh [path] |
| 168 | +``` |
| 169 | + |
| 170 | +**Arguments:** |
| 171 | +- `path` - Directory to deploy, or a `.tgz` file (defaults to current directory) |
| 172 | + |
| 173 | +**Examples:** |
| 174 | +```bash |
| 175 | +# Deploy current directory |
| 176 | +bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh |
| 177 | + |
| 178 | +# Deploy specific project |
| 179 | +bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh /path/to/project |
| 180 | + |
| 181 | +# Deploy existing tarball |
| 182 | +bash /mnt/skills/user/deploy-to-vercel/resources/deploy.sh /path/to/project.tgz |
| 183 | +``` |
| 184 | + |
| 185 | +The script auto-detects the framework from `package.json`, packages the project (excluding `node_modules`, `.git`, `.env`), uploads it, and waits for the build to complete. |
| 186 | + |
| 187 | +**Tell the user:** "Your deployment is ready at [previewUrl]. Claim it at [claimUrl] to manage your deployment." |
| 188 | + |
| 189 | +--- |
| 190 | + |
| 191 | +### No-Auth Fallback — Codex sandbox |
| 192 | + |
| 193 | +**When to use:** In the Codex sandbox where the CLI may not be authenticated. Codex runs in a sandboxed environment by default — try the CLI first, and fall back to the deploy script if auth fails. |
| 194 | + |
| 195 | +1. **Check whether the Vercel CLI is installed** (no escalation needed for this check): |
| 196 | + ```bash |
| 197 | + command -v vercel |
| 198 | + ``` |
| 199 | + |
| 200 | +2. **If `vercel` is installed**, try deploying with the CLI: |
| 201 | + ```bash |
| 202 | + vercel deploy [path] -y --no-wait |
| 203 | + ``` |
| 204 | + |
| 205 | +3. **If `vercel` is not installed, or the CLI fails with "No existing credentials found"**, use the fallback script: |
| 206 | + ```bash |
| 207 | + skill_dir="<path-to-skill>" |
| 208 | + |
| 209 | + # Deploy current directory |
| 210 | + bash "$skill_dir/resources/deploy-codex.sh" |
| 211 | + |
| 212 | + # Deploy specific project |
| 213 | + bash "$skill_dir/resources/deploy-codex.sh" /path/to/project |
| 214 | + |
| 215 | + # Deploy existing tarball |
| 216 | + bash "$skill_dir/resources/deploy-codex.sh" /path/to/project.tgz |
| 217 | + ``` |
| 218 | + |
| 219 | +The script handles framework detection, packaging, and deployment. It waits for the build to complete and returns JSON with `previewUrl` and `claimUrl`. |
| 220 | + |
| 221 | +**Tell the user:** "Your deployment is ready at [previewUrl]. Claim it at [claimUrl] to manage your deployment." |
| 222 | + |
| 223 | +**Escalated network access:** Only escalate the actual deploy command if sandboxing blocks the network call (`sandbox_permissions=require_escalated`). Do **not** escalate the `command -v vercel` check. |
| 224 | + |
| 225 | +--- |
| 226 | + |
| 227 | +## Agent-Specific Notes |
| 228 | + |
| 229 | +### Claude Code / terminal-based agents |
| 230 | + |
| 231 | +You have full shell access. Do NOT use the `/mnt/skills/` path. Follow the decision flow above using the CLI directly. |
| 232 | + |
| 233 | +For the no-auth fallback, run the deploy script from the skill's installed location: |
| 234 | +```bash |
| 235 | +bash ~/.claude/skills/deploy-to-vercel/resources/deploy.sh [path] |
| 236 | +``` |
| 237 | +The path may vary depending on where the user installed the skill. |
| 238 | + |
| 239 | +### Sandboxed environments (claude.ai) |
| 240 | + |
| 241 | +You likely cannot run `vercel login` or `git push`. Go directly to the **no-auth fallback — claude.ai sandbox**. |
| 242 | + |
| 243 | +### Codex |
| 244 | + |
| 245 | +Codex runs in a sandbox. Check if the CLI is available first, then fall back to the deploy script. Go to the **no-auth fallback — Codex sandbox**. |
| 246 | + |
| 247 | +--- |
| 248 | + |
| 249 | +## Output |
| 250 | + |
| 251 | +Always show the user the deployment URL. |
| 252 | + |
| 253 | +- **Git push:** Use `vercel ls --format json` to find the preview URL. If the CLI isn't authenticated, tell the user to check the Vercel dashboard or commit status checks. |
| 254 | +- **CLI deploy:** Show the URL returned by `vercel deploy --no-wait`. Use `vercel inspect <url>` to check build status and report it to the user. |
| 255 | +- **No-auth fallback:** Show both the preview URL and the claim URL: |
| 256 | + ``` |
| 257 | + Deployment successful! |
| 258 | +
|
| 259 | + Preview URL: https://my-app-abc123.vercel.app |
| 260 | + Claim URL: https://vercel.com/claim-deployment?code=... |
| 261 | +
|
| 262 | + View your site at the Preview URL. |
| 263 | + To transfer this deployment to your Vercel account, visit the Claim URL. |
| 264 | + ``` |
| 265 | + |
| 266 | +**Do not** curl or fetch the deployed URL to verify it works. Just return the link. |
| 267 | + |
| 268 | +--- |
| 269 | + |
| 270 | +## Troubleshooting |
| 271 | + |
| 272 | +### Network Egress Error (claude.ai) |
| 273 | + |
| 274 | +If deployment fails due to network restrictions on claude.ai, tell the user: |
| 275 | + |
| 276 | +``` |
| 277 | +Deployment failed due to network restrictions. To fix this: |
| 278 | +
|
| 279 | +1. Go to https://claude.ai/settings/capabilities |
| 280 | +2. Add *.vercel.com to the allowed domains |
| 281 | +3. Try deploying again |
| 282 | +``` |
| 283 | + |
| 284 | +### Escalated Network Access (Codex / sandboxed environments) |
| 285 | + |
| 286 | +If deployment fails due to network issues (timeouts, DNS errors, connection resets) in a sandboxed environment, rerun with escalated permissions (`sandbox_permissions=require_escalated`). Do not escalate the initial CLI availability check — only escalate the actual deploy command. |
| 287 | + |
| 288 | +Example guidance to the user: |
| 289 | +``` |
| 290 | +The deploy needs escalated network access to deploy to Vercel. I can rerun |
| 291 | +the command with escalated permissions — want me to proceed? |
| 292 | +``` |
| 293 | + |
| 294 | +### CLI Auth Failure |
| 295 | + |
| 296 | +If `vercel login` or `vercel deploy` fails with authentication errors, fall back to the no-auth deploy script (claude.ai or Codex variant, depending on the environment). |
0 commit comments