
Vercel Delete Deployments
Extract UIDs of failed Vercel deployments from a saved API JSON dump so you can bulk-delete ERROR (and optional CANCELED) deploys safely offline.
Install
npx skills add https://github.com/aykansal/agent-skills --skill vercel-delete-deploymentsWhat is this skill?
- Node ESM script: filter-errors.mjs reads a /v6/deployments API dump
- Detects ERROR state (and optional --include-canceled) from state or readyState
- Supports single JSON array or newline-delimited deployment chunks
- Writes sorted error UIDs to vercel-error-ids.txt in cwd
- CLI usage: node filter-errors.mjs <api-json-file> [--include-canceled]
Adoption & trust: 1 installs on skills.sh; trending (+100% hot-view momentum).
Recommended Skills
Azure Kubernetesmicrosoft/azure-skills
Github Actions Docsxixu-me/skills
Deploy To Vercelvercel-labs/agent-skills
Vercel Cli With Tokensvercel-labs/agent-skills
Turborepovercel/turborepo
Docker Expertsickn33/antigravity-awesome-skills
Journey fit
SKILL.md
READMESKILL.md - Vercel Delete Deployments
#!/usr/bin/env node /** * List deployment UIDs with state ERROR from a Vercel /v6/deployments API dump. * Usage: node filter-errors.mjs <api-json-file> [--include-canceled] * Writes IDs to vercel-error-ids.txt in cwd. */ import fs from "node:fs"; const args = process.argv.slice(2); const includeCanceled = args.includes("--include-canceled"); const file = args.find((a) => !a.startsWith("--")); if (!file) { console.error("Usage: node filter-errors.mjs <api-json-file> [--include-canceled]"); process.exit(1); } const raw = fs.readFileSync(file, "utf8").trim(); let deployments = []; try { const parsed = JSON.parse(raw); deployments = Array.isArray(parsed) ? parsed : parsed.deployments ?? []; } catch { for (const line of raw.split(/\n(?=\[|\{)/)) { if (!line.trim()) continue; const chunk = JSON.parse(line); deployments.push(...(Array.isArray(chunk) ? chunk : chunk.deployments ?? [])); } } const isError = (d) => { const state = String(d.state ?? d.readyState ?? "").toUpperCase(); if (state === "ERROR") return true; if (includeCanceled && state === "CANCELED") return true; return false; }; const errors = deployments.filter(isError).sort((a, b) => b.created - a.created); for (const d of errors) { console.log( `${d.uid}\t${d.state}\t${d.target ?? "-"}\t${new Date(d.created).toISOString()}\t${d.url ?? ""}`, ); } fs.writeFileSync("vercel-error-ids.txt", errors.map((d) => d.uid).join("\n")); const label = includeCanceled ? "error/canceled" : "error"; console.error(`\n${errors.length} ${label} deployment(s) → vercel-error-ids.txt`); #!/usr/bin/env node /** * List deployment UIDs between two boundary IDs (inclusive by created timestamp). * Usage: node list-range.mjs <startId> <endId> <api-json-file> * Writes table to stdout and IDs to vercel-delete-ids.txt in cwd. */ import fs from "node:fs"; const [startId, endId, file] = process.argv.slice(2); if (!startId || !endId || !file) { console.error("Usage: node list-range.mjs <startId> <endId> <api-json-file>"); process.exit(1); } const raw = fs.readFileSync(file, "utf8").trim(); let deployments = []; try { const parsed = JSON.parse(raw); deployments = Array.isArray(parsed) ? parsed : parsed.deployments ?? []; } catch { for (const line of raw.split(/\n(?=\[|\{)/)) { if (!line.trim()) continue; const chunk = JSON.parse(line); deployments.push(...(Array.isArray(chunk) ? chunk : chunk.deployments ?? [])); } } const byId = new Map(deployments.map((d) => [d.uid, d])); const start = byId.get(startId); const end = byId.get(endId); if (!start) { console.error(`Start deployment not found: ${startId}`); process.exit(1); } if (!end) { console.error(`End deployment not found: ${endId}`); process.exit(1); } const minT = Math.min(start.created, end.created); const maxT = Math.max(start.created, end.created); const inRange = deployments .filter((d) => d.created >= minT && d.created <= maxT) .sort((a, b) => b.created - a.created); for (const d of inRange) { console.log( `${d.uid}\t${d.state}\t${d.target ?? "-"}\t${new Date(d.created).toISOString()}\t${d.url ?? ""}`, ); } fs.writeFileSync("vercel-delete-ids.txt", inRange.map((d) => d.uid).join("\n")); console.error(`\n${inRange.length} deployment(s) → vercel-delete-ids.txt`); --- name: vercel-delete-deployments description: Delete Vercel deployments by status (ERROR), deployment ID range, or bulk cleanup. Use when the user asks to remove failed/error Vercel deployments, clean up deployment history, prune previews, or delete deployments between two dpl_ IDs. --- # Delete Vercel Deployments Requires Vercel CLI, `vercel login`, and correct team scope (`vercel whoami`, `vercel teams switch <team>`). **Scripts:** `skills/vercel-delete-deployments/scripts/` (or `.agents/skills/vercel-delete-deployments/scripts/` after `npx skills add`). ## Choose a workflow first | User intent | Workflow | |-------------|----------| | Delete **failed / error** deploym