{"id":"9570d8e2-e56b-47ac-a8a1-c35c1d65bebb","shortId":"HWYPbC","kind":"skill","title":"setup-deploy","tagline":"Configure deployment settings for /land-and-deploy. Detects your deploy\nplatform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom),\nproduction URL, health check endpoints, and deploy status commands. Writes\nthe configuration to CLAUDE.md so all future deploys are ","description":"## Preamble\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\" 2>/dev/null || SLUG=\"unknown\"\n_LEARN_FILE=\"${VIBESTACK_HOME:-$HOME/.vibestack}/projects/${SLUG:-unknown}/learnings.jsonl\"\nif [ -f \"$_LEARN_FILE\" ]; then\n  _LEARN_COUNT=$(wc -l < \"$_LEARN_FILE\" 2>/dev/null | tr -d ' ')\n  echo \"LEARNINGS: $_LEARN_COUNT entries loaded\"\n  if [ \"$_LEARN_COUNT\" -gt 5 ] 2>/dev/null; then\n    ~/.vibestack/bin/vibe-learnings-search --limit 5 2>/dev/null || true\n  fi\nelse\n  echo \"LEARNINGS: none yet\"\nfi\n```\n\n## User-invocable\nWhen the user types `/setup-deploy`, run this skill.\n\n## Instructions\n\n### Step 1: Check existing configuration\n\n```bash\ngrep -A 20 \"## Deploy Configuration\" CLAUDE.md 2>/dev/null || echo \"NO_CONFIG\"\n```\n\nIf configuration already exists, show it and ask:\n\n- **Context:** Deploy configuration already exists in CLAUDE.md.\n- **RECOMMENDATION:** Choose A to update if your setup changed.\n- A) Reconfigure from scratch (overwrite existing)\n- B) Edit specific fields (show current config, let me change one thing)\n- C) Done — configuration looks correct\n\nIf the user picks C, stop.\n\n### Step 2: Detect platform\n\nRun the platform detection from the deploy bootstrap:\n\n```bash\n# Platform config files\n[ -f fly.toml ] && echo \"PLATFORM:fly\" && cat fly.toml\n[ -f render.yaml ] && echo \"PLATFORM:render\" && cat render.yaml\n[ -f vercel.json ] || [ -d .vercel ] && echo \"PLATFORM:vercel\"\n[ -f netlify.toml ] && echo \"PLATFORM:netlify\" && cat netlify.toml\n[ -f Procfile ] && echo \"PLATFORM:heroku\"\n[ -f railway.json ] || [ -f railway.toml ] && echo \"PLATFORM:railway\"\n\n# GitHub Actions deploy workflows\nfor f in $(find .github/workflows -maxdepth 1 \\( -name '*.yml' -o -name '*.yaml' \\) 2>/dev/null); do\n  [ -f \"$f\" ] && grep -qiE \"deploy|release|production|staging|cd\" \"$f\" 2>/dev/null && echo \"DEPLOY_WORKFLOW:$f\"\ndone\n\n# Project type\n[ -f package.json ] && grep -q '\"bin\"' package.json 2>/dev/null && echo \"PROJECT_TYPE:cli\"\nfind . -maxdepth 1 -name '*.gemspec' 2>/dev/null | grep -q . && echo \"PROJECT_TYPE:library\"\n```\n\n### Step 3: Platform-specific setup\n\nBased on what was detected, guide the user through platform-specific configuration.\n\n#### Fly.io\n\nIf `fly.toml` detected:\n\n1. Extract app name: `grep -m1 \"^app\" fly.toml | sed 's/app = \"\\(.*\\)\"/\\1/'`\n2. Check if `fly` CLI is installed: `which fly 2>/dev/null`\n3. If installed, verify: `fly status --app {app} 2>/dev/null`\n4. Infer URL: `https://{app}.fly.dev`\n5. Set deploy status command: `fly status --app {app}`\n6. Set health check: `https://{app}.fly.dev` (or `/health` if the app has one)\n\nAsk the user to confirm the production URL. Some Fly apps use custom domains.\n\n#### Render\n\nIf `render.yaml` detected:\n\n1. Extract service name and type from render.yaml\n2. Check for Render API key: `echo $RENDER_API_KEY | head -c 4` (don't expose the full key)\n3. Infer URL: `https://{service-name}.onrender.com`\n4. Render deploys automatically on push to the connected branch — no deploy workflow needed\n5. Set health check: the inferred URL\n\nAsk the user to confirm. Render uses auto-deploy from the connected git branch — after\nmerge to main, Render picks it up automatically. The \"deploy wait\" in /land-and-deploy\nshould poll the Render URL until it responds with the new version.\n\n#### Vercel\n\nIf vercel.json or .vercel detected:\n\n1. Check for `vercel` CLI: `which vercel 2>/dev/null`\n2. If installed: `vercel ls --prod 2>/dev/null | head -3`\n3. Vercel deploys automatically on push — preview on PR, production on merge to main\n4. Set health check: the production URL from vercel project settings\n\n#### Netlify\n\nIf netlify.toml detected:\n\n1. Extract site info from netlify.toml\n2. Netlify deploys automatically on push\n3. Set health check: the production URL\n\n#### GitHub Actions only\n\nIf deploy workflows detected but no platform config:\n\n1. Read the workflow file to understand what it does\n2. Extract the deploy target (if mentioned)\n3. Ask the user for the production URL\n\n#### Custom / Manual\n\nIf nothing detected, use AskUserQuestion to gather the information:\n\n1. **How are deploys triggered?**\n   - A) Automatically on push to main (Fly, Render, Vercel, Netlify, etc.)\n   - B) Via GitHub Actions workflow\n   - C) Via a deploy script or CLI command (describe it)\n   - D) Manually (SSH, dashboard, etc.)\n   - E) This project doesn't deploy (library, CLI, tool)\n\n2. **What's the production URL?** (Free text — the URL where the app runs)\n\n3. **How can /land-and-deploy check if a deploy succeeded?**\n   - A) HTTP health check at a specific URL (e.g., /health, /api/status)\n   - B) CLI command (e.g., `fly status`, `kubectl rollout status`)\n   - C) Check the GitHub Actions workflow status\n   - D) No automated way — just check the URL loads\n\n4. **Any pre-merge or post-merge hooks?**\n   - Commands to run before merging (e.g., `bun run build`)\n   - Commands to run after merge but before deploy verification\n\n### Step 4: Write configuration\n\nRead CLAUDE.md (or create it). Find and replace the `## Deploy Configuration` section\nif it exists, or append it at the end.\n\n```markdown\n## Deploy Configuration (configured by /setup-deploy)\n- Platform: {platform}\n- Production URL: {url}\n- Deploy workflow: {workflow file or \"auto-deploy on push\"}\n- Deploy status command: {command or \"HTTP health check\"}\n- Merge method: {squash/merge/rebase}\n- Project type: {web app / API / CLI / library}\n- Post-deploy health check: {health check URL or command}\n\n### Custom deploy hooks\n- Pre-merge: {command or \"none\"}\n- Deploy trigger: {command or \"automatic on push to main\"}\n- Deploy status: {command or \"poll production URL\"}\n- Health check: {URL or command}\n```\n\n### Step 5: Verify\n\nAfter writing, verify the configuration works:\n\n1. If a health check URL was configured, try it:\n```bash\ncurl -sf \"{health-check-url}\" -o /dev/null -w \"%{http_code}\" 2>/dev/null || echo \"UNREACHABLE\"\n```\n\n2. If a deploy status command was configured, try it:\n```bash\n{deploy-status-command} 2>/dev/null | head -5 || echo \"COMMAND_FAILED\"\n```\n\nReport results. If anything failed, note it but don't block — the config is still\nuseful even if the health check is temporarily unreachable.\n\n### Step 6: Summary\n\n```\nDEPLOY CONFIGURATION — COMPLETE\n════════════════════════════════\nPlatform:      {platform}\nURL:           {url}\nHealth check:  {health check}\nStatus cmd:    {status command}\nMerge method:  {merge method}\n\nSaved to CLAUDE.md. /land-and-deploy will use these settings automatically.\n\nNext steps:\n- Run /land-and-deploy to merge and deploy your current PR\n- Edit the \"## Deploy Configuration\" section in CLAUDE.md to change settings\n- Run /setup-deploy again to reconfigure\n```\n\n## Important Rules\n\n- **Never expose secrets.** Don't print full API keys, tokens, or passwords.\n- **Confirm with the user.** Always show the detected config and ask for confirmation before writing.\n- **CLAUDE.md is the source of truth.** All configuration lives there — not in a separate config file.\n- **Idempotent.** Running /setup-deploy multiple times overwrites the previous config cleanly.\n- **Platform CLIs are optional.** If `fly` or `vercel` CLI isn't installed, fall back to URL-based health checks.\n\n## Capture Learnings\n\nIf you discovered a non-obvious platform quirk, deployment pattern, or configuration\ngotcha during this session, log it for future sessions:\n\n```bash\n~/.vibestack/bin/vibe-learnings-log '{\"skill\":\"setup-deploy\",\"type\":\"TYPE\",\"key\":\"SHORT_KEY\",\"insight\":\"DESCRIPTION\",\"confidence\":N,\"source\":\"SOURCE\",\"files\":[\"path/to/relevant/file\"]}'\n```\n\n**Types:** `pattern` (reusable approach), `pitfall` (what NOT to do), `preference`\n(user stated), `architecture` (structural decision), `operational` (environment/CLI/workflow).\n\n**Only log genuine discoveries.** Don't log obvious things. A good test: would this\ninsight save time in a future session?","tags":["setup","deploy","vibestack","timurgaleev","agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering"],"capabilities":["skill","source-timurgaleev","skill-setup-deploy","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-cursor-ide","topic-developer-tools","topic-kiro","topic-mcp","topic-prompt-engineering","topic-slash-commands"],"categories":["vibestack"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/timurgaleev/vibestack/setup-deploy","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add timurgaleev/vibestack","source_repo":"https://github.com/timurgaleev/vibestack","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 15 github stars · SKILL.md body (7,812 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:06:23.862Z","embedding":null,"createdAt":"2026-05-18T19:06:23.862Z","updatedAt":"2026-05-18T19:06:23.862Z","lastSeenAt":"2026-05-18T19:06:23.862Z","tsv":"'-3':522 '-5':907 '/.vibestack/bin/vibe-learnings-log':1092 '/.vibestack/bin/vibe-learnings-search':88 '/.vibestack/bin/vibe-slug':43 '/api/status':696 '/dev/null':45,47,71,86,92,126,256,269,284,295,346,356,512,520,881,886,905 '/health':378,695 '/land-and-deploy':8,485,680,960,969 '/learnings.jsonl':58 '/projects':55 '/setup-deploy':108,780,988,1039 '1':114,249,291,325,335,402,504,552,582,618,863 '2':44,46,70,85,91,125,184,255,268,283,294,336,345,355,410,511,513,519,558,592,663,885,889,904 '20':121 '3':303,347,429,523,564,599,677 '4':357,422,436,537,722,751 '5':84,90,362,450,855 '6':371,936 'action':19,240,572,637,710 'alreadi':132,141 'alway':1010 'anyth':914 'api':414,418,811,1001 'app':327,331,353,354,360,369,370,375,381,394,675,810 'append':770 'approach':1113 'architectur':1122 'ask':137,384,457,600,1016 'askuserquest':613 'auto':465,792 'auto-deploy':464,791 'autom':715 'automat':439,480,526,561,624,837,965 'b':160,634,697 'back':1060 'base':308,1064 'bash':41,118,195,873,899,1091 'bin':281 'block':921 'bootstrap':194 'branch':445,471 'build':740 'bun':738 'c':172,181,421,639,706 'captur':1067 'cat':204,211,225 'cd':266 'chang':153,169,985 'check':24,115,337,374,411,453,505,540,567,681,689,707,718,803,818,820,850,867,878,931,946,948,1066 'choos':146 'claude.md':34,124,144,755,959,983,1021 'clean':1046 'cli':288,340,508,645,661,698,812,1055 'clis':1048 'cmd':950 'code':884 'command':29,366,646,699,732,741,798,799,823,830,835,844,853,894,903,909,952 'complet':940 'confid':1104 'config':129,166,197,581,923,1014,1035,1045 'configur':4,32,117,123,131,140,174,320,753,764,777,778,861,870,896,939,980,1028,1081 'confirm':388,461,1006,1018 'connect':444,469 'context':138 'correct':176 'count':65,77,82 'creat':757 'curl':874 'current':165,975 'custom':20,396,607,824 'd':73,215,649,713 'dashboard':652 'decis':1124 'deploy':3,5,11,27,38,122,139,193,241,262,271,364,438,447,466,482,525,560,575,595,621,642,659,684,748,763,776,786,793,796,816,825,833,842,892,901,938,973,979,1078,1096 'deploy-status-command':900 'describ':647 'descript':1103 'detect':9,185,190,312,324,401,503,551,577,611,1013 'discov':1071 'discoveri':1130 'doesn':657 'domain':397 'done':173,274 'e':654 'e.g':694,700,737 'echo':74,96,127,201,208,217,222,229,236,270,285,298,416,887,908 'edit':161,977 'els':95 'end':774 'endpoint':25 'entri':78 'environment/cli/workflow':1126 'etc':633,653 'eval':42 'even':927 'exist':116,133,142,159,768 'expos':425,995 'extract':326,403,553,593 'f':60,199,206,213,220,227,232,234,244,258,259,267,273,277 'fail':910,915 'fall':1059 'fi':94,100 'field':163 'file':51,62,69,198,586,789,1036,1108 'find':246,289,759 'fli':203,339,344,351,367,393,629,701,1052 'fly.dev':361,376 'fly.io':13,321 'fly.toml':200,205,323,332 'free':669 'full':427,1000 'futur':37,1089,1146 'gather':615 'gemspec':293 'genuin':1129 'git':470 'github':18,239,571,636,709 'github/workflows':247 'good':1137 'gotcha':1082 'grep':119,260,279,296,329 'gt':83 'guid':313 'head':420,521,906 'health':23,373,452,539,566,688,802,817,819,849,866,877,930,945,947,1065 'health-check-url':876 'heroku':17,231 'home':53 'home/.vibestack':54 'hook':731,826 'http':687,801,883 'idempot':1037 'import':992 'infer':358,430,455 'info':555 'inform':617 'insight':1102,1141 'instal':342,349,515,1058 'instruct':112 'invoc':103 'isn':1056 'key':415,419,428,1002,1099,1101 'kubectl':703 'l':67 'learn':50,61,64,68,75,76,81,97,1068 'let':167 'librari':301,660,813 'limit':89 'live':1029 'load':79,721 'log':1086,1128,1133 'look':175 'ls':517 'm1':330 'main':475,536,628,841 'manual':608,650 'markdown':775 'maxdepth':248,290 'mention':598 'merg':473,534,726,730,736,745,804,829,953,955,971 'method':805,954,956 'multipl':1040 'n':1105 'name':250,253,292,328,405,434 'need':449 'netlifi':16,224,548,559,632 'netlify.toml':221,226,550,557 'never':994 'new':496 'next':966 'non':1074 'non-obvi':1073 'none':98,832 'note':916 'noth':610 'o':252,880 'obvious':1075,1134 'one':170,383 'onrender.com':435 'oper':1125 'option':1050 'overwrit':158,1042 'package.json':278,282 'password':1005 'path/to/relevant/file':1109 'pattern':1079,1111 'pick':180,477 'pitfal':1114 'platform':12,186,189,196,202,209,218,223,230,237,305,318,580,781,782,941,942,1047,1076 'platform-specif':304,317 'poll':487,846 'post':729,815 'post-deploy':814 'post-merg':728 'pr':531,976 'pre':725,828 'pre-merg':724,827 'preambl':40 'prefer':1119 'preview':529 'previous':1044 'print':999 'procfil':228 'prod':518 'product':21,264,390,532,542,569,605,667,783,847 'project':275,286,299,546,656,807 'push':441,528,563,626,795,839 'q':280,297 'qie':261 'quirk':1077 'railway':238 'railway.json':233 'railway.toml':235 'read':583,754 'recommend':145 'reconfigur':155,991 'releas':263 'render':14,210,398,413,417,437,462,476,489,630 'render.yaml':207,212,400,409 'replac':761 'report':911 'respond':493 'result':912 'reusabl':1112 'rollout':704 'rule':993 'run':109,187,676,734,739,743,968,987,1038 's/app':334 'save':957,1142 'scratch':157 'script':643 'secret':996 'section':765,981 'sed':333 'separ':1034 'servic':404,433 'service-nam':432 'session':1085,1090,1147 'set':6,363,372,451,538,547,565,964,986 'setup':2,152,307,1095 'setup-deploy':1,1094 'sf':875 'short':1100 'show':134,164,1011 'site':554 'skill':111,1093 'skill-setup-deploy' 'slug':48,56 'sourc':1024,1106,1107 'source-timurgaleev' 'specif':162,306,319,692 'squash/merge/rebase':806 'ssh':651 'stage':265 'state':1121 'status':28,352,365,368,702,705,712,797,843,893,902,949,951 'step':113,183,302,750,854,935,967 'still':925 'stop':182 'structur':1123 'succeed':685 'summari':937 'target':596 'temporarili':933 'test':1138 'text':670 'thing':171,1135 'time':1041,1143 'token':1003 'tool':662 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-cursor-ide' 'topic-developer-tools' 'topic-kiro' 'topic-mcp' 'topic-prompt-engineering' 'topic-slash-commands' 'tr':72 'tri':871,897 'trigger':622,834 'true':93 'truth':1026 'type':107,276,287,300,407,808,1097,1098,1110 'understand':588 'unknown':49,57 'unreach':888,934 'updat':149 'url':22,359,391,431,456,490,543,570,606,668,672,693,720,784,785,821,848,851,868,879,943,944,1063 'url-bas':1062 'use':395,463,612,926,962 'user':102,106,179,315,386,459,602,1009,1120 'user-invoc':101 'vercel':15,216,219,498,502,507,510,516,524,545,631,1054 'vercel.json':214,500 'verif':749 'verifi':350,856,859 'version':497 'via':635,640 'vibestack':52 'w':882 'wait':483 'way':716 'wc':66 'web':809 'work':862 'workflow':242,272,448,576,585,638,711,787,788 'would':1139 'write':30,752,858,1020 'yaml':254 'yet':99 'yml':251","prices":[{"id":"152f0f63-ab34-4a68-b570-475713af47e6","listingId":"9570d8e2-e56b-47ac-a8a1-c35c1d65bebb","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"timurgaleev","category":"vibestack","install_from":"skills.sh"},"createdAt":"2026-05-18T19:06:23.862Z"}],"sources":[{"listingId":"9570d8e2-e56b-47ac-a8a1-c35c1d65bebb","source":"github","sourceId":"timurgaleev/vibestack/setup-deploy","sourceUrl":"https://github.com/timurgaleev/vibestack/tree/main/skills/setup-deploy","isPrimary":false,"firstSeenAt":"2026-05-18T19:06:23.862Z","lastSeenAt":"2026-05-18T19:06:23.862Z"}],"details":{"listingId":"9570d8e2-e56b-47ac-a8a1-c35c1d65bebb","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"timurgaleev","slug":"setup-deploy","github":{"repo":"timurgaleev/vibestack","stars":15,"topics":["agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"license":"mit","html_url":"https://github.com/timurgaleev/vibestack","pushed_at":"2026-05-18T18:19:05Z","description":"vibestack is a portable skill pack for AI coding agents. Slash commands like /office-hours, /ship, /investigate, /tdd, /review install once and work across every agent that supports the Agent Skills open standard — Claude Code, Cursor, Kiro, and a growing list of others. ","skill_md_sha":"0c09b4153a599d9e3d62b0ca5df72a286c418584","skill_md_path":"skills/setup-deploy/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/timurgaleev/vibestack/tree/main/skills/setup-deploy"},"layout":"multi","source":"github","category":"vibestack","frontmatter":{"name":"setup-deploy","description":"Configure deployment settings for /land-and-deploy. Detects your deploy\nplatform (Fly.io, Render, Vercel, Netlify, Heroku, GitHub Actions, custom),\nproduction URL, health check endpoints, and deploy status commands. Writes\nthe configuration to CLAUDE.md so all future deploys are automatic.\nUse when: \"setup deploy\", \"configure deployment\", \"set up land-and-deploy\",\n\"how do I configure deploys\"."},"skills_sh_url":"https://skills.sh/timurgaleev/vibestack/setup-deploy"},"updatedAt":"2026-05-18T19:06:23.862Z"}}