📦 Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查)

v0.1.2

Deploy Pilot 管理整个部署周期,包括构建验证、GitHub 推送、Vercel 部署和健康检查。它适用于 Next.js 应用程序的自动化部署流程,确保从本地构建到生产环境的顺利部署。

0· 880·0 当前·0 累计
by @guifav·MIT-0
下载技能包
License
MIT-0
最后更新
2026/3/23
0
安全扫描
VirusTotal
无害
查看报告
OpenClaw
可疑
medium confidence
该技能的行为与其部署目的相符,但元数据不匹配和一些未声明的权限(推送、文件系统/网络访问、依赖本地 Git 凭据)不一致,使用前应谨慎。
安全有层次,运行前请审查代码。

License

MIT-0

可自由使用、修改和再分发,无需署名。

运行时依赖

无特殊依赖

版本

latestv0.1.22026/3/23
无害

安装命令

点击复制
官方npx clawhub@latest install deploy-pilot
🇨🇳 镜像加速npx clawhub@latest install deploy-pilot --registry https://cn.longxiaskill.com

技能文档

你是一位负责将 Next.js 应用程序通过 GitHub 部署到 Vercel 的 DevOps 工程师。你自主管理完整的部署流水线。对于生产环境部署,在推送之前需要发送一份关于即将部署内容的摘要。

规划协议(强制执行 — 在任何操作之前执行)

在推送代码或触发任何部署之前,你必须完成以下规划阶段:

  • 理解意图。 确定:(a) 这是预览部署还是生产部署?(b) 正在交付哪些更改?(c) 是否有需要运行的数据库迁移?
  • 调查状态。 检查:(a) git statusgit log 以了解已暂存的内容以及自上次部署以来发生了什么变化,(b) 所有测试是否通过,(c) 本地构建是否成功,(d) Vercel 是否需要新的环境变量。
  • 制定部署计划。 写出:(a) 分支和目标环境,(b) 预部署检查项,(c) 部署命令,(d) 部署后验证步骤(健康检查 URL,要测试的关键页面),(e) 失败时的回滚程序。
  • 识别风险。 标记:(a) API 中的破坏性更改,(b) 不向后兼容的 schema 迁移,(c) 尚未在 Vercel 中配置的新环境变量,(d) 可能导致用户无法登录的中间件或身份验证更改。针对每项风险定义缓解措施。
  • 执行清单。 运行预部署检查、推送、监控部署状态、运行部署后健康检查。如果任何步骤失败,停止并诊断后再继续。
  • 总结。 报告:部署了什么,部署 URL,健康检查结果,以及遇到的问题。不要跳过此协议。仓促的生产部署可能导致整个应用程序宕机。

与 Feature Forge 的集成

在部署由 feature-forge 技能生成的更改时,请验证:

  • 所有由 feature-forge 创建的文件都已提交(检查 git statussrc/ 下的未跟踪文件)。
  • feature-forge 添加的任何新依赖都已安装(npm installpnpm install)。
  • 功能所需的任何新环境变量已在 Vercel 中配置(检查 .env.example 的更改)。
  • 如果 feature-forge 生成了数据库迁移(通过 supabase-ops),确保它们已在部署前/后应用。这确保了从功能开发到部署的顺利交接。

预部署清单

在任何部署之前,按顺序运行以下检查。如果任何检查失败,请在继续之前停止并修复。

# 1. TypeScript 编译
npx tsc --noEmit

# 2. 代码检查 npx next lint

# 3. 单元测试和集成测试 npx vitest run

# 4. 构建 npx next build

如果全部通过,继续部署。如果任何一项失败,修复问题,提交修复,然后重新运行。

部署流程

预览部署(功能分支)

  • 确保所有更改都已提交。
  • 推送到功能分支:
git push origin 
  • Vercel 从 GitHub 自动部署预览。通过以下方式监控:
npx vercel list --token $VERCEL_TOKEN | head -5
  • 部署就绪后,访问健康检查端点:
curl -sf https:///api/health | jq .
  • 向用户报告预览 URL。

生产部署

  • 确保你在 main 分支上且它是最新状态:
git checkout main && git pull origin main
  • 合并功能分支(优先使用 squash 合并以保持清晰的历史记录):
git merge --squash 
git commit -m "feat: "
  • 运行完整的预部署清单。
  • 通知团队 部署摘要:
- 更改了什么(列出提交或功能)。 - 将要运行的任何迁移。 - 需要设置的任何环境变量。
  • 推送:
git push origin main
  • 监控部署:
npx vercel list --token $VERCEL_TOKEN --prod
  • 部署后健康检查:
curl -sf https:///api/health | jq .
  • 如果健康检查失败,查看日志:
npx vercel logs  --token $VERCEL_TOKEN

回滚

如果生产部署导致问题:

  • 识别最后一个正常部署:
npx vercel list --token $VERCEL_TOKEN --prod
  • 提升之前的部署:
npx vercel promote  --token $VERCEL_TOKEN
  • 通知团队关于回滚的情况。
  • 在重新部署之前调查broken部署上的问题。

环境变量

通过 Vercel CLI 设置环境变量

# 开发环境
echo "value" | npx vercel env add VAR_NAME development --token $VERCEL_TOKEN

# 预览环境 echo "value" | npx vercel env add VAR_NAME preview --token $VERCEL_TOKEN

# 生产环境 echo "value" | npx vercel env add VAR_NAME production --token $VERCEL_TOKEN

同步环境变量

.env.example 更改时,检查 Vercel 中是否存在所有必需的变量:

npx vercel env ls --token $VERCEL_TOKEN

.env.example 对比,标记任何缺失的变量。

域名管理

链接域名

npx vercel domains add  --token $VERCEL_TOKEN

检查 DNS

npx vercel domains inspect  --token $VERCEL_TOKEN

分支策略

  • main = 生产环境。每次推送都会触发生产部署。
  • 功能分支(feat/fix/refactor/)= 预览部署。
  • 永远不要强制推送到 main
  • 使用常规分支名称:feat/fix/refactor/

部署后监控

生产部署后,在 5 分钟内检查以下内容:

  • 健康端点返回 200。
  • Vercel 运行时日志中没有新错误。
  • 关键页面正确加载(检查 //login/dashboard)。
  • Supabase 迁移成功应用(如果有)。

如果任何检查失败,立即触发回滚程序。

GitHub 集成

创建 PR

gh pr create --title "feat: " --body "<description>" --base main
</code></pre><h3>检查 CI 状态</h3><pre><code>gh pr checks <pr-number>
</code></pre><h3>合并 PR</h3><pre><code>gh pr merge <pr-number> --squash --delete-branch
</code></pre><h2>提交信息规范</h2><p>所有提交必须遵循 Conventional Commits:</p><ul><li><code>feat:</code> — 新功能</li>
<li><code>fix:</code> — 错误修复</li>
<li><code>refactor:</code> — 既不修复错误也不添加功能的代码更改</li>
<li><code>test:</code> — 添加或修复测试</li>
<li><code>chore:</code> — 工具、配置、依赖</li>
<li><code>docs:</code> — 仅文档</li>
<li><code>db:</code> — 数据库迁移(此技术栈的自定义约定)</li></ul></div></div><div style="text-align:center;padding:var(--spacing-4);font-size:12px;color:var(--color-gray-400)">数据来源:<a href="https://clawhub.ai/guifav/deploy-pilot" target="_blank" rel="noopener noreferrer" style="color:var(--color-gray-400)">ClawHub ↗</a> · 中文优化:龙虾技能库</div></section></article></div><script>
        document.querySelectorAll('.sk-cm').forEach(function(el) {
          el.addEventListener('click', function() {
            var cmd = this.getAttribute('data-cmd');
            if (cmd && navigator.clipboard) {
              navigator.clipboard.writeText(cmd).then(function() {
                el.style.borderColor = '#67C23A';
                setTimeout(function() { el.style.borderColor = ''; }, 600);
              });
            }
          });
        });
      </script><!--/$--><!--/$--></main><footer class="footer"><div class="container"><div class="footer__row"><a href="/openclaw/">澳龙下载专题</a><a href="/custom/">技能/插件定制服务</a><a href="https://build.nvidia.com/models" target="_blank" rel="noopener">NVIDIA 免费大模型</a></div><div class="footer__row" style="font-size:12px">邮箱:wyxdapp@qq.com | AI 智能体可直接发送定制需求到邮箱</div><div class="footer__row"><a href="/disclaimer.html">免责声明</a> | <a href="/privacy.html">隐私政策</a> | <a href="https://beian.miit.gov.cn/" target="_blank" rel="noopener">鄂ICP备19007528号</a></div><div class="footer__row" style="margin-top:var(--spacing-1);font-size:12px">龙虾技能库 — OpenClaw 中文 AI 资源库 | 免费资源 + 付费定制</div><div class="footer__row" style="margin-top:var(--spacing-1)">© 2026 龙虾技能库</div></div></footer><aside class="qr-float" id="qr-float-panel" aria-label="联系与赞助"><div class="qr-float__body"><div class="qr-float__header"><span>联系 & 赞助</span><button aria-label="收起面板">✕</button></div><div class="qr-float__item"><img src="/image/erweima.png" alt="站长微信二维码" loading="lazy"/><span>关注站长微信</span></div><div class="qr-float__item"><img src="/image/weixinpay.png" alt="微信赞助收款码" loading="lazy"/><span>微信赞助</span></div><div class="qr-float__item"><img src="/image/alipay.png" alt="支付宝赞助收款码" loading="lazy"/><span>支付宝赞助</span></div></div></aside><script src="/_next/static/chunks/webpack-03f7c6bc932ce1e3.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HL[\"/_next/static/css/6e1ceed3820f59d3.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"2:I[2846,[],\"\"]\n5:I[4707,[],\"\"]\n8:I[2042,[\"817\",\"static/chunks/app/skill/%5Bid%5D/%5Bslug%5D/error-3af65a79c7c046d6.js\"],\"default\"]\n9:I[6423,[],\"\"]\na:I[1409,[\"972\",\"static/chunks/972-850f25deae5296bb.js\",\"185\",\"static/chunks/app/layout-9822a542ba608968.js\"],\"ThemeProvider\"]\nb:I[9372,[\"972\",\"static/chunks/972-850f25deae5296bb.js\",\"185\",\"static/chunks/app/layout-9822a542ba608968.js\"],\"Header\"]\nc:I[3490,[\"601\",\"static/chunks/app/error-a2271d306faf9849.js\"],\"default\"]\nd:I[2972,[\"972\",\"static/chunks/972-850f25deae5296bb.js\",\"705\",\"static/chunks/app/skill/%5Bid%5D/%5Bslug%5D/page-9f8f913dbedefa14.js\"],\"\"]\ne:I[5699,[\"972\",\"static/chunks/972-850f25deae5296bb.js\",\"185\",\"static/chunks/app/layout-9822a542ba608968.js\"],\"FloatingPanel\"]\n10:I[7063,[\"470\",\"static/chunks/app/global-error-6a1f0c3b28aec3ff.js\"],\"default\"]\n6:[\"id\",\"202\",\"d\"]\n7:[\"slug\",\"deploy-pilot\",\"d\"]\n11:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L2\",null,{\"buildId\":\"qRjNAbXzazjWHDPLeMR0s\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"skill\",\"202\",\"deploy-pilot\",\"\"],\"initialTree\":[\"\",{\"children\":[\"skill\",{\"children\":[[\"id\",\"202\",\"d\"],{\"children\":[[\"slug\",\"deploy-pilot\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"skill\",{\"children\":[[\"id\",\"202\",\"d\"],{\"children\":[[\"slug\",\"deploy-pilot\",\"d\"],{\"children\":[\"__PAGE__\",{},[[\"$L3\",\"$L4\",null],null],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"skill\",\"children\",\"$6\",\"children\",\"$7\",\"children\"],\"error\":\"$8\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],[[\"$\",\"div\",null,{\"style\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"minHeight\":\"30vh\",\"gap\":12},\"children\":[[\"$\",\"div\",null,{\"style\":{\"width\":32,\"height\":32,\"border\":\"3px solid var(--color-border)\",\"borderTopColor\":\"var(--color-primary)\",\"borderRadius\":\"50%\",\"animation\":\"spin 0.8s linear infinite\"}}],[\"$\",\"style\",null,{\"children\":\"@keyframes spin { to { transform: rotate(360deg) } }\"}],[\"$\",\"p\",null,{\"style\":{\"color\":\"var(--color-text-muted)\",\"fontSize\":13},\"children\":\"加载中…\"}]]}],[],[]]]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"skill\",\"children\",\"$6\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[null,[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"skill\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/6e1ceed3820f59d3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"link\",null,{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",null,{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\"}],[\"$\",\"link\",null,{\"rel\":\"alternate\",\"hrefLang\":\"x-default\",\"href\":\"https://www.longxiaskill.com\"}],[\"$\",\"meta\",null,{\"name\":\"baidu-site-verification\",\"content\":\"codeva-6YfEGYw0xP\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"var _hmt=_hmt||[];\"}}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://hm.baidu.com/hm.js?4cc05d29578ed22445459b1a6c34c97a\"}]]}],[\"$\",\"body\",null,{\"children\":[\"$\",\"$La\",null,{\"children\":[[\"$\",\"$Lb\",null,{}],[\"$\",\"main\",null,{\"className\":\"container\",\"style\":{\"paddingTop\":\"var(--spacing-6)\",\"minHeight\":\"60vh\"},\"children\":[\"$\",\"$L5\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$c\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L9\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[\"$\",\"div\",null,{\"className\":\"container\",\"style\":{\"paddingTop\":\"var(--spacing-10)\",\"textAlign\":\"center\"},\"children\":[\"$\",\"div\",null,{\"className\":\"empty-state\",\"children\":[[\"$\",\"h1\",null,{\"children\":\"404\"}],[\"$\",\"p\",null,{\"style\":{\"color\":\"var(--color-text-secondary)\",\"marginBottom\":\"var(--spacing-4)\"},\"children\":\"页面不存在\"}],[\"$\",\"$Ld\",null,{\"href\":\"/\",\"className\":\"btn btn--primary\",\"children\":\"返回首页\"}]]}]}],\"notFoundStyles\":[]}]}],[\"$\",\"footer\",null,{\"className\":\"footer\",\"children\":[\"$\",\"div\",null,{\"className\":\"container\",\"children\":[[\"$\",\"div\",null,{\"className\":\"footer__row\",\"children\":[[\"$\",\"$Ld\",null,{\"href\":\"/openclaw/\",\"children\":\"澳龙下载专题\"}],[\"$\",\"$Ld\",null,{\"href\":\"/custom\",\"children\":\"技能/插件定制服务\"}],[\"$\",\"a\",null,{\"href\":\"https://build.nvidia.com/models\",\"target\":\"_blank\",\"rel\":\"noopener\",\"children\":\"NVIDIA 免费大模型\"}]]}],[\"$\",\"div\",null,{\"className\":\"footer__row\",\"style\":{\"fontSize\":12},\"children\":\"邮箱:wyxdapp@qq.com | AI 智能体可直接发送定制需求到邮箱\"}],[\"$\",\"div\",null,{\"className\":\"footer__row\",\"children\":[[\"$\",\"$Ld\",null,{\"href\":\"/disclaimer.html\",\"children\":\"免责声明\"}],\" | \",[\"$\",\"$Ld\",null,{\"href\":\"/privacy.html\",\"children\":\"隐私政策\"}],\" | \",[\"$\",\"a\",null,{\"href\":\"https://beian.miit.gov.cn/\",\"target\":\"_blank\",\"rel\":\"noopener\",\"children\":\"鄂ICP备19007528号\"}]]}],[\"$\",\"div\",null,{\"className\":\"footer__row\",\"style\":{\"marginTop\":\"var(--spacing-1)\",\"fontSize\":12},\"children\":\"龙虾技能库 — OpenClaw 中文 AI 资源库 | 免费资源 + 付费定制\"}],[\"$\",\"div\",null,{\"className\":\"footer__row\",\"style\":{\"marginTop\":\"var(--spacing-1)\"},\"children\":\"© 2026 龙虾技能库\"}]]}]}],[\"$\",\"$Le\",null,{}]]}]}]]}]],null],[[\"$\",\"div\",null,{\"style\":{\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\",\"minHeight\":\"40vh\",\"gap\":16},\"children\":[[\"$\",\"div\",null,{\"style\":{\"width\":40,\"height\":40,\"border\":\"3px solid var(--color-border)\",\"borderTopColor\":\"var(--color-primary)\",\"borderRadius\":\"50%\",\"animation\":\"spin 0.8s linear infinite\"}}],[\"$\",\"style\",null,{\"children\":\"@keyframes spin { to { transform: rotate(360deg) } }\"}],[\"$\",\"p\",null,{\"style\":{\"color\":\"var(--color-text-muted)\",\"fontSize\":14},\"children\":\"加载中…\"}]]}],[],[]]],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$Lf\"],\"globalErrorComponent\":\"$10\",\"missingSlots\":\"$W11\"}]\n"])</script><script>self.__next_f.push([1,"13:I[2095,[\"972\",\"static/chunks/972-850f25deae5296bb.js\",\"705\",\"static/chunks/app/skill/%5Bid%5D/%5Bslug%5D/page-9f8f913dbedefa14.js\"],\"SkillDocSection\"]\n12:T1938,"])</script><script>self.__next_f.push([1,"\n.sk-hero{border:1px solid var(--color-border);border-radius:12px;padding:22px;background:var(--color-bg-card);margin-bottom:16px;box-shadow:0 4px 12px rgba(0,0,0,.08)}\n.sk-hero-main{display:flex;gap:24px}.sk-hero-left{flex:1;min-width:0}.sk-hero-right{width:200px;flex-shrink:0;display:flex;flex-direction:column;gap:10px}\n.sk-tr{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:4px}.sk-t{font-size:20px;font-weight:700;margin:0;line-height:1.3}\n.sk-d{font-size:14px;color:var(--color-text-secondary);line-height:1.6;margin:8px 0 12px}\n.sk-sr{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;color:var(--color-text-secondary)}.sk-dot{color:var(--color-gray-400);opacity:.5}\n.sk-au{font-size:13px;color:var(--color-text-muted);margin-top:4px}.sk-au a{color:var(--color-primary)}\n.sk-lbox{font-size:13px;color:var(--color-text-secondary)}.sk-lbl2{font-size:11px;font-weight:600;color:var(--color-text-muted);margin-bottom:2px}\n.sk-bdl{display:block;text-align:center;min-height:48px;line-height:20px;border-radius:12px;font-size:1.05rem;font-weight:600;padding:0.75rem 2rem;transition:background 0.2s;text-decoration:none}\n.sk-bdl:hover{text-decoration:none;color:#fff;background:#333}\n.btn--dark.sk-bdl{background:#1a1a1a;color:#fff;border:none}\n.btn--dark.sk-bdl:hover{background:#333;color:#fff;transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,0,0,0.15)}\n.btn--dark.sk-bdl:active{transform:translateY(0);box-shadow:none}\n[data-theme=\"dark\"] .btn--dark.sk-bdl{background:#e0e0e0;color:#1a1a1a}\n[data-theme=\"dark\"] .btn--dark.sk-bdl:hover{background:#ccc;color:#1a1a1a;box-shadow:0 4px 12px rgba(255,255,255,0.08)}\n[data-theme=\"dark\"] .btn--dark.sk-bdl:active{background:#bbb;box-shadow:none}\n[data-theme=\"dark\"] .sk-hero{background:#1E1E1E;border-color:#333}\n.sk-ig{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px;margin-bottom:16px}\n.sk-ib{border:1px solid var(--color-border);border-radius:12px;padding:16px;background:var(--color-bg-card)}.sk-ib h3{font-size:14px;font-weight:700;margin:0 0 12px}\n.sk-lic-desc{font-size:12px;color:var(--color-text-secondary);line-height:1.5;margin:8px 0 0}\n.sk-ii{font-size:13px;margin-bottom:4px;display:flex;align-items:center;gap:8px}.sk-il{color:var(--color-text-muted);min-width:50px;flex-shrink:0;font-size:12px}\n.sk-ii code{background:var(--color-gray-100);padding:1px 6px;border-radius:4px;font-size:12px}\n.sk-cm{font-family:monospace;font-size:13px;padding:12px;background:var(--color-gray-100);border:1px solid var(--color-border);border-radius:8px;margin-bottom:8px;cursor:pointer;word-break:break-all;transition:border-color 300ms}\n.sk-cm:hover{border-color:var(--color-primary)}.sk-cl{font-size:11px;font-weight:600;color:var(--color-text-muted);display:block;margin-bottom:2px}\n.sk-cma{background:rgba(37,99,235,0.08);border-color:var(--color-primary);color:var(--color-primary)}\n[data-theme=\"dark\"] .sk-cma{background:rgba(37,99,235,0.15)}\n[data-theme=\"dark\"] .sk-ib{background:#1E1E1E;border-color:#333}\n[data-theme=\"dark\"] .sk-cm{background:#2a2a2a;border-color:#444}\n.risk-warn{background:#FEF3C7;border:1px solid #FDE68A;border-radius:12px;padding:12px 16px;margin-bottom:16px;font-size:14px;color:#92400E;display:flex;align-items:center;gap:8px}\n[data-theme=\"dark\"] .risk-warn{background:#451A03;border-color:#713F12;color:#FBBF24}\n.skill-content h2{font-size:20px;margin:24px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--color-border)}\n.skill-content h3{font-size:17px;margin:20px 0 8px}.skill-content p{margin-bottom:12px;line-height:1.8}\n.skill-content ul,.skill-content ol{margin:8px 0 12px 20px;line-height:1.8}.skill-content li{margin-bottom:4px}\n.skill-content pre{background:#1E1E1E;color:#D4D4D4;padding:16px;border-radius:8px;overflow-x:auto;margin:12px 0;font-size:13px;line-height:1.5}\n.skill-content pre code{background:transparent;color:inherit;padding:0;border-radius:0;font-size:inherit}\n.skill-content code{background:var(--color-gray-100);padding:2px 6px;border-radius:4px;font-size:14px}\n[data-theme=\"dark\"] .skill-content code{background:#333}\n.skill-content blockquote{border-left:4px solid var(--color-primary);padding:8px 16px;margin:12px 0;background:rgba(37,99,235,0.08);border-radius:0 4px 4px 0}\n.skill-content table{width:100%;border-collapse:collapse;margin:12px 0}\n.skill-content th,.skill-content td{border:1px solid var(--color-border);padding:8px 12px;text-align:left;font-size:14px}\n.skill-content th{background:var(--color-gray-100)}\n[data-theme=\"dark\"] .skill-content th{background:#2a2a2a}\n.badge--version{background:var(--color-gray-100);color:var(--color-text-secondary);font-size:12px;padding:2px 8px;border-radius:6px}\n[data-theme=\"dark\"] .badge--version{background:#333;color:#9ca3af}\n.sk-tags{margin-top:8px;display:flex;flex-wrap:wrap;gap:6px}\n.sk-sc{border:1px solid var(--color-border);border-radius:12px;padding:16px;margin-bottom:16px;background:var(--color-bg-card)}\n.sk-sc--safe{border-left:4px solid #67C23A}\n.sk-sc--suspicious{border-left:4px solid #E6A23C}\n.sk-sc--dangerous{border-left:4px solid #F56C6C}\n.sk-sch{font-size:15px;font-weight:700;margin-bottom:12px}\n.sk-scr{display:flex;align-items:center;gap:12px;padding:8px 12px;background:var(--color-gray-100);border-radius:8px;margin-bottom:8px}\n.sk-scw{font-size:13px;font-weight:600;min-width:120px}.sk-scs{font-size:13px;font-weight:700}.sk-scl{font-size:12px;color:var(--color-primary);margin-left:auto}\n.sk-scsm{font-size:13px;color:var(--color-text-secondary);line-height:1.6;padding:8px 12px;background:var(--color-gray-100);border-radius:8px;margin-bottom:8px}\n.sk-scd{margin-top:4px}.sk-scd summary{cursor:pointer;color:var(--color-primary);font-size:13px;font-weight:600;padding:4px 0}\n.sk-dm{padding:8px 12px;background:var(--color-gray-100);border-radius:8px;font-size:13px;margin-bottom:4px}\n.sk-adv{margin-top:8px;padding:12px;background:#FDF6EC;border:1px solid #FFEEBA;border-radius:8px}.sk-adv ol{margin:4px 0 0 16px;font-size:12px;color:var(--color-text-secondary);line-height:1.8}\n[data-theme=\"dark\"] .sk-sc{background:#1E1E1E;border-color:#333}\n[data-theme=\"dark\"] .sk-scr{background:#2a2a2a}\n[data-theme=\"dark\"] .sk-scsm{background:#2a2a2a}\n[data-theme=\"dark\"] .sk-dm{background:#2a2a2a}\n[data-theme=\"dark\"] .sk-adv{background:#3d3420;border-color:#5a4a2a}\n@media(max-width:768px){.sk-hero-main{flex-direction:column}.sk-hero-right{width:100%}.sk-ig{grid-template-columns:1fr}}\n"])</script><script>self.__next_f.push([1,"14:T18f8,"])</script><script>self.__next_f.push([1,"---\nname: deploy-pilot\ndescription: Manages the full deploy cycle — build validation, GitHub push, Vercel deployment, and health checks\nuser-invocable: true\n---\n\n# Deploy Pilot\n\n你是一位负责将 Next.js 应用程序通过 GitHub 部署到 Vercel 的 DevOps 工程师。你自主管理完整的部署流水线。对于生产环境部署,在推送之前需要发送一份关于即将部署内容的摘要。\n\n## 规划协议(强制执行 — 在任何操作之前执行)\n\n在推送代码或触发任何部署之前,你必须完成以下规划阶段:\n\n1. **理解意图。** 确定:(a) 这是预览部署还是生产部署?(b) 正在交付哪些更改?(c) 是否有需要运行的数据库迁移?\n\n2. **调查状态。** 检查:(a) `git status` 和 `git log` 以了解已暂存的内容以及自上次部署以来发生了什么变化,(b) 所有测试是否通过,(c) 本地构建是否成功,(d) Vercel 是否需要新的环境变量。\n\n3. **制定部署计划。** 写出:(a) 分支和目标环境,(b) 预部署检查项,(c) 部署命令,(d) 部署后验证步骤(健康检查 URL,要测试的关键页面),(e) 失败时的回滚程序。\n\n4. **识别风险。** 标记:(a) API 中的破坏性更改,(b) 不向后兼容的 schema 迁移,(c) 尚未在 Vercel 中配置的新环境变量,(d) 可能导致用户无法登录的中间件或身份验证更改。针对每项风险定义缓解措施。\n\n5. **执行清单。** 运行预部署检查、推送、监控部署状态、运行部署后健康检查。如果任何步骤失败,停止并诊断后再继续。\n\n6. **总结。** 报告:部署了什么,部署 URL,健康检查结果,以及遇到的问题。不要跳过此协议。仓促的生产部署可能导致整个应用程序宕机。\n\n## 与 Feature Forge 的集成\n\n在部署由 `feature-forge` 技能生成的更改时,请验证:\n\n1. 所有由 feature-forge 创建的文件都已提交(检查 `git status` 中 `src/` 下的未跟踪文件)。\n2. feature-forge 添加的任何新依赖都已安装(`npm install` 或 `pnpm install`)。\n3. 功能所需的任何新环境变量已在 Vercel 中配置(检查 `.env.example` 的更改)。\n4. 如果 feature-forge 生成了数据库迁移(通过 `supabase-ops`),确保它们已在部署前/后应用。这确保了从功能开发到部署的顺利交接。\n\n## 预部署清单\n\n在任何部署之前,按顺序运行以下检查。如果任何检查失败,请在继续之前停止并修复。\n\n```bash\n# 1. TypeScript 编译\nnpx tsc --noEmit\n\n# 2. 代码检查\nnpx next lint\n\n# 3. 单元测试和集成测试\nnpx vitest run\n\n# 4. 构建\nnpx next build\n```\n\n如果全部通过,继续部署。如果任何一项失败,修复问题,提交修复,然后重新运行。\n\n## 部署流程\n\n### 预览部署(功能分支)\n\n1. 确保所有更改都已提交。\n2. 推送到功能分支:\n```bash\ngit push origin \u003cbranch-name\u003e\n```\n3. Vercel 从 GitHub 自动部署预览。通过以下方式监控:\n```bash\nnpx vercel list --token $VERCEL_TOKEN | head -5\n```\n4. 部署就绪后,访问健康检查端点:\n```bash\ncurl -sf https://\u003cpreview-url\u003e/api/health | jq .\n```\n5. 向用户报告预览 URL。\n\n### 生产部署\n\n1. 确保你在 `main` 分支上且它是最新状态:\n```bash\ngit checkout main \u0026\u0026 git pull origin main\n```\n2. 合并功能分支(优先使用 squash 合并以保持清晰的历史记录):\n```bash\ngit merge --squash \u003cbranch-name\u003e\ngit commit -m \"feat: \u003cchanges summary\u003e\"\n```\n3. 运行完整的预部署清单。\n4. **通知团队** 部署摘要:\n   - 更改了什么(列出提交或功能)。\n   - 将要运行的任何迁移。\n   - 需要设置的任何环境变量。\n5. 推送:\n```bash\ngit push origin main\n```\n6. 监控部署:\n```bash\nnpx vercel list --token $VERCEL_TOKEN --prod\n```\n7. 部署后健康检查:\n```bash\ncurl -sf https://\u003cproduction-url\u003e/api/health | jq .\n```\n8. 如果健康检查失败,查看日志:\n```bash\nnpx vercel logs \u003cdeployment-url\u003e --token $VERCEL_TOKEN\n```\n\n### 回滚\n\n如果生产部署导致问题:\n\n1. 识别最后一个正常部署:\n```bash\nnpx vercel list --token $VERCEL_TOKEN --prod\n```\n2. 提升之前的部署:\n```bash\nnpx vercel promote \u003cdeployment-id\u003e --token $VERCEL_TOKEN\n```\n3. 通知团队关于回滚的情况。\n4. 在重新部署之前调查broken部署上的问题。\n\n## 环境变量\n\n### 通过 Vercel CLI 设置环境变量\n\n```bash\n# 开发环境\necho \"value\" | npx vercel env add VAR_NAME development --token $VERCEL_TOKEN\n\n# 预览环境\necho \"value\" | npx vercel env add VAR_NAME preview --token $VERCEL_TOKEN\n\n# 生产环境\necho \"value\" | npx vercel env add VAR_NAME production --token $VERCEL_TOKEN\n```\n\n### 同步环境变量\n\n当 `.env.example` 更改时,检查 Vercel 中是否存在所有必需的变量:\n\n```bash\nnpx vercel env ls --token $VERCEL_TOKEN\n```\n\n与 `.env.example` 对比,标记任何缺失的变量。\n\n## 域名管理\n\n### 链接域名\n\n```bash\nnpx vercel domains add \u003cdomain\u003e --token $VERCEL_TOKEN\n```\n\n### 检查 DNS\n\n```bash\nnpx vercel domains inspect \u003cdomain\u003e --token $VERCEL_TOKEN\n```\n\n## 分支策略\n\n- `main` = 生产环境。每次推送都会触发生产部署。\n- 功能分支(`feat/`、`fix/`、`refactor/`)= 预览部署。\n- 永远不要强制推送到 `main`。\n- 使用常规分支名称:`feat/\u003cfeature\u003e`、`fix/\u003cbug\u003e`、`refactor/\u003cscope\u003e`。\n\n## 部署后监控\n\n生产部署后,在 5 分钟内检查以下内容:\n\n1. 健康端点返回 200。\n2. Vercel 运行时日志中没有新错误。\n3. 关键页面正确加载(检查 `/`、`/login`、`/dashboard`)。\n4. Supabase 迁移成功应用(如果有)。\n\n如果任何检查失败,立即触发回滚程序。\n\n## GitHub 集成\n\n### 创建 PR\n\n```bash\ngh pr create --title \"feat: \u003ctitle\u003e\" --body \"\u003cdescription\u003e\" --base main\n```\n\n### 检查 CI 状态\n\n```bash\ngh pr checks \u003cpr-number\u003e\n```\n\n### 合并 PR\n\n```bash\ngh pr merge \u003cpr-number\u003e --squash --delete-branch\n```\n\n## 提交信息规范\n\n所有提交必须遵循 Conventional Commits:\n\n- `feat:` — 新功能\n- `fix:` — 错误修复\n- `refactor:` — 既不修复错误也不添加功能的代码更改\n- `test:` — 添加或修复测试\n- `chore:` — 工具、配置、依赖\n- `docs:` — 仅文档\n- `db:` — 数据库迁移(此技术栈的自定义约定)"])</script><script>self.__next_f.push([1,"4:[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"SoftwareApplication\\\",\\\"name\\\":\\\"Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查)\\\",\\\"description\\\":\\\"Deploy Pilot 管理整个部署周期,包括构建验证、GitHub 推送、Vercel 部署和健康检查。它适用于 Next.js 应用程序的自动化部署流程,确保从本地构建到生产环境的顺利部署。\\\",\\\"applicationCategory\\\":\\\"DeveloperApplication\\\",\\\"operatingSystem\\\":\\\"Any\\\",\\\"offers\\\":{\\\"@type\\\":\\\"Offer\\\",\\\"price\\\":\\\"0\\\",\\\"priceCurrency\\\":\\\"CNY\\\"}}\"}}],[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"{\\\"@context\\\":\\\"https://schema.org\\\",\\\"@type\\\":\\\"BreadcrumbList\\\",\\\"itemListElement\\\":[{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":1,\\\"name\\\":\\\"首页\\\",\\\"item\\\":\\\"https://www.longxiaskill.com\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":2,\\\"name\\\":\\\"技能\\\",\\\"item\\\":\\\"https://www.longxiaskill.com/skills/\\\"},{\\\"@type\\\":\\\"ListItem\\\",\\\"position\\\":3,\\\"name\\\":\\\"Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查)\\\",\\\"item\\\":\\\"https://www.longxiaskill.com/skill/202/deploy-pilot/\\\"}]}\"}}],[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"$12\"}}],[\"$\",\"div\",null,{\"className\":\"container\",\"style\":{\"paddingTop\":\"var(--spacing-6)\",\"paddingBottom\":\"var(--spacing-10)\"},\"children\":[[\"$\",\"div\",null,{\"className\":\"breadcrumb\",\"children\":[[\"$\",\"$Ld\",null,{\"href\":\"/\",\"children\":\"首页\"}],\" / \",[\"$\",\"$Ld\",null,{\"href\":\"/skills/\",\"children\":\"技能\"}],\" / \",\"Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查)\"]}],[\"$\",\"article\",null,{\"className\":\"skill-detail\",\"children\":[[\"$\",\"header\",null,{\"children\":[\"$\",\"div\",null,{\"className\":\"sk-hero\",\"children\":[\"$\",\"div\",null,{\"className\":\"sk-hero-main\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-hero-left\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-tr\",\"children\":[[\"$\",\"h1\",null,{\"className\":\"sk-t\",\"children\":[\"📦\",\" \",\"Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查)\"]}],[\"$\",\"span\",null,{\"className\":\"badge badge--version\",\"children\":[\"v\",\"0.1.2\"]}]]}],[\"$\",\"p\",null,{\"className\":\"sk-d\",\"children\":\"Deploy Pilot 管理整个部署周期,包括构建验证、GitHub 推送、Vercel 部署和健康检查。它适用于 Next.js 应用程序的自动化部署流程,确保从本地构建到生产环境的顺利部署。\"}],[\"$\",\"div\",null,{\"className\":\"sk-sr\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\"\u003e\u003cpath d=\\\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\\\"/\u003e\u003c/svg\u003e\"}}],\" \",0,[\"$\",\"span\",null,{\"className\":\"sk-dot\",\"children\":\"·\"}],[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"\u003e\u003cpath d=\\\"M16.5 9.4l-9-5.19M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"/\u003e\u003cpolyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"/\u003e\u003cline x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"/\u003e\u003c/svg\u003e\"}}],\" \",\"880\",[\"$\",\"span\",null,{\"className\":\"sk-dot\",\"children\":\"·\"}],[\"$\",\"span\",null,{\"children\":[0,\" 当前\"]}],[\"$\",\"span\",null,{\"className\":\"sk-dot\",\"children\":\"·\"}],[\"$\",\"span\",null,{\"children\":[0,\" 累计\"]}]]}],[\"$\",\"div\",null,{\"className\":\"sk-au\",\"children\":[null,\"by \",[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/u/guifav\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":[\"@\",\"guifav\"]}],false,[[\"$\",\"span\",null,{\"className\":\"sk-dot\",\"children\":\"·\"}],[\"$\",\"span\",null,{\"className\":\"badge badge--info\",\"style\":{\"fontSize\":11},\"children\":\"MIT-0\"}]]]}],false]}],[\"$\",\"div\",null,{\"className\":\"sk-hero-right\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/api/download/deploy-pilot\",\"className\":\"btn btn--dark sk-bdl\",\"children\":[\"下载技能包\",false]}],null,[\"$\",\"div\",null,{\"className\":\"sk-lbox\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-lbl2\",\"children\":\"License\"}],[\"$\",\"div\",null,{\"children\":\"MIT-0\"}]]}],[\"$\",\"div\",null,{\"className\":\"sk-lbox\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-lbl2\",\"children\":\"最后更新\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":13},\"children\":\"2026/3/23\"}]]}]]}]]}]}]}],[\"$\",\"section\",null,{\"children\":[false,0,[\"$\",\"div\",null,{\"className\":\"sk-sc sk-sc--suspicious\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-sch\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" style=\\\"vertical-align:-0.125em\\\"\u003e\u003cpath d=\\\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\\\"/\u003e\u003c/svg\u003e\"}}],\" 安全扫描\"]}],[\"$\",\"div\",null,{\"className\":\"sk-scr\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-scw\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" style=\\\"vertical-align:-0.125em\\\"\u003e\u003ccircle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"5\\\"/\u003e\u003cpath d=\\\"M12 2v4\\\"/\u003e\u003cpath d=\\\"M12 18v4\\\"/\u003e\u003cpath d=\\\"M4.93 4.93l2.83 2.83\\\"/\u003e\u003cpath d=\\\"M16.24 16.24l2.83 2.83\\\"/\u003e\u003cpath d=\\\"M2 12h4\\\"/\u003e\u003cpath d=\\\"M18 12h4\\\"/\u003e\u003cpath d=\\\"M4.93 19.07l2.83-2.83\\\"/\u003e\u003cpath d=\\\"M16.24 7.76l2.83-2.83\\\"/\u003e\u003c/svg\u003e\"}}],\" VirusTotal\"]}],[\"$\",\"div\",null,{\"className\":\"sk-scs\",\"style\":{\"color\":\"#67C23A\"},\"children\":\"无害\"}],[\"$\",\"a\",null,{\"href\":\"https://www.virustotal.com/gui/file/0205b4fa0a58997be351726f4ae0d9b4ecf1d9f2032d6ffac276161ad139f53a\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"sk-scl\",\"children\":[\"查看报告 \",[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" style=\\\"vertical-align:-0.125em\\\"\u003e\u003cline x1=\\\"5\\\" y1=\\\"12\\\" x2=\\\"19\\\" y2=\\\"12\\\"/\u003e\u003cpolyline points=\\\"12 5 19 12 12 19\\\"/\u003e\u003c/svg\u003e\"}}]]}]]}],[\"$\",\"div\",null,{\"className\":\"sk-scr\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-scw\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" style=\\\"vertical-align:-0.125em\\\"\u003e\u003cpath d=\\\"M12 2c-2 0-3.5 1-4 3L6 9c-1 1-2 3-1 5l1 2\\\"/\u003e\u003cpath d=\\\"M12 2c2 0 3.5 1 4 3l2 4c1 1 2 3 1 5l-1 2\\\"/\u003e\u003cpath d=\\\"M6 16c-1 2 0 4 2 5l4 1 4-1c2-1 3-3 2-5\\\"/\u003e\u003ccircle cx=\\\"9\\\" cy=\\\"8\\\" r=\\\"1\\\"/\u003e\u003ccircle cx=\\\"15\\\" cy=\\\"8\\\" r=\\\"1\\\"/\u003e\u003cpath d=\\\"M4 5 2 3\\\"/\u003e\u003cpath d=\\\"M20 5l2-2\\\"/\u003e\u003c/svg\u003e\"}}],\" OpenClaw\"]}],[\"$\",\"div\",null,{\"className\":\"sk-scs\",\"style\":{\"color\":\"#E6A23C\"},\"children\":\"可疑\"}],[\"$\",\"span\",null,{\"style\":{\"fontSize\":12,\"color\":\"var(--color-text-muted)\"},\"children\":\"medium confidence\"}]]}],[\"$\",\"div\",null,{\"className\":\"sk-scsm\",\"children\":\"该技能的行为与其部署目的相符,但元数据不匹配和一些未声明的权限(推送、文件系统/网络访问、依赖本地 Git 凭据)不一致,使用前应谨慎。\"}],\"\",false,[\"$\",\"div\",null,{\"style\":{\"fontSize\":12,\"color\":\"var(--color-gray-400)\",\"marginTop\":\"var(--spacing-2)\",\"fontStyle\":\"italic\"},\"children\":\"安全有层次,运行前请审查代码。\"}]]}],[\"$\",\"div\",null,{\"className\":\"sk-ig\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sk-ib\",\"children\":[[\"$\",\"h3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"\u003e\u003cpath d=\\\"M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4\\\"/\u003e\u003cpath d=\\\"M19 17V5a2 2 0 0 0-2-2H4\\\"/\u003e\u003c/svg\u003e License\"}}],[\"$\",\"span\",null,{\"className\":\"badge badge--info\",\"children\":\"MIT-0\"}],[\"$\",\"p\",null,{\"className\":\"sk-lic-desc\",\"children\":\"可自由使用、修改和再分发,无需署名。\"}],[\"$\",\"div\",null,{\"style\":{\"fontSize\":12,\"marginTop\":\"var(--spacing-1)\"},\"children\":[\"$\",\"a\",null,{\"href\":\"https://spdx.org/licenses/MIT-0.html\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"children\":\"查看条款 ↗\"}]}]]}],[\"$\",\"div\",null,{\"className\":\"sk-ib\",\"children\":[[\"$\",\"h3\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"\u003e\u003ccircle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/\u003e\u003cpath d=\\\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z\\\"/\u003e\u003c/svg\u003e 运行时依赖\"}}],false,false,false,[\"$\",\"div\",null,{\"className\":\"sk-ii\",\"style\":{\"color\":\"var(--color-text-muted)\",\"fontSize\":13},\"children\":\"无特殊依赖\"}]]}]]}],[\"$\",\"div\",null,{\"className\":\"sk-hero\",\"style\":{\"marginBottom\":\"var(--spacing-4)\"},\"children\":[[\"$\",\"h3\",null,{\"style\":{\"margin\":\"0 0 var(--spacing-3)\",\"fontSize\":15},\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"\u003e\u003cpath d=\\\"M16.5 9.4l-9-5.19M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\\\"/\u003e\u003cpolyline points=\\\"3.27 6.96 12 12.01 20.73 6.96\\\"/\u003e\u003cline x1=\\\"12\\\" y1=\\\"22.08\\\" x2=\\\"12\\\" y2=\\\"12\\\"/\u003e\u003c/svg\u003e 版本\"}}],[\"$\",\"div\",null,{\"style\":{\"display\":\"flex\",\"alignItems\":\"center\",\"gap\":\"var(--spacing-2)\",\"marginBottom\":\"var(--spacing-2)\"},\"children\":[[\"$\",\"span\",null,{\"className\":\"badge badge--version\",\"children\":\"latest\"}],[\"$\",\"span\",null,{\"className\":\"badge badge--version\",\"children\":[\"v\",\"0.1.2\"]}],[\"$\",\"span\",null,{\"style\":{\"fontSize\":12,\"color\":\"var(--color-text-muted)\"},\"children\":\"2026/3/23\"}]]}],null,[\"$\",\"div\",null,{\"style\":{\"marginTop\":\"var(--spacing-2)\",\"fontSize\":12},\"children\":[\"$\",\"span\",null,{\"style\":{\"color\":\"#67C23A\"},\"children\":[\"● \",\"无害\"]}]}]]}],[\"$\",\"div\",null,{\"className\":\"sk-hero\",\"style\":{\"marginBottom\":\"var(--spacing-4)\"},\"children\":[[\"$\",\"h2\",null,{\"style\":{\"margin\":\"0 0 var(--spacing-3)\",\"fontSize\":15},\"dangerouslySetInnerHTML\":{\"__html\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"\u003e\u003cpath d=\\\"M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2\\\"/\u003e\u003crect x=\\\"8\\\" y=\\\"2\\\" width=\\\"8\\\" height=\\\"4\\\" rx=\\\"1\\\" ry=\\\"1\\\"/\u003e\u003c/svg\u003e 安装命令 \"}}],[\"$\",\"span\",null,{\"style\":{\"fontSize\":12,\"color\":\"var(--color-gray-400)\"},\"children\":\"点击复制\"}],[\"$\",\"div\",null,{\"className\":\"sk-cm\",\"data-cmd\":\"npx clawhub@latest install deploy-pilot\",\"children\":[[\"$\",\"span\",null,{\"className\":\"sk-cl\",\"children\":\"官方\"}],\"npx clawhub@latest install deploy-pilot\"]}],[\"$\",\"div\",null,{\"className\":\"sk-cm sk-cma\",\"data-cmd\":\"npx clawhub@latest install deploy-pilot --registry https://cn.longxiaskill.com\",\"children\":[[\"$\",\"span\",null,{\"className\":\"sk-cl\",\"children\":[\"🇨🇳\",\" 镜像加速\"]}],\"npx clawhub@latest install deploy-pilot --registry https://cn.longxiaskill.com\"]}],null]}],null,[\"$\",\"$L13\",null,{\"skillId\":202,\"defaultContent\":\"$14\",\"docIcon\":\"\u003csvg width=\\\"1em\\\" height=\\\"1em\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"\u003e\u003cpath d=\\\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\\\"/\u003e\u003cpolyline points=\\\"14 2 14 8 20 8\\\"/\u003e\u003cline x1=\\\"16\\\" y1=\\\"13\\\" x2=\\\"8\\\" y2=\\\"13\\\"/\u003e\u003cline x1=\\\"16\\\" y1=\\\"17\\\" x2=\\\"8\\\" y2=\\\"17\\\"/\u003e\u003c/svg\u003e\"}],[\"$\",\"div\",null,{\"style\":{\"textAlign\":\"center\",\"padding\":\"var(--spacing-4)\",\"fontSize\":12,\"color\":\"var(--color-gray-400)\"},\"children\":[\"数据来源:\",[\"$\",\"a\",null,{\"href\":\"https://clawhub.ai/guifav/deploy-pilot\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"style\":{\"color\":\"var(--color-gray-400)\"},\"children\":\"ClawHub ↗\"}],\" · 中文优化:龙虾技能库\"]}]]}]]}]]}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n        document.querySelectorAll('.sk-cm').forEach(function(el) {\\n          el.addEventListener('click', function() {\\n            var cmd = this.getAttribute('data-cmd');\\n            if (cmd \u0026\u0026 navigator.clipboard) {\\n              navigator.clipboard.writeText(cmd).then(function() {\\n                el.style.borderColor = '#67C23A';\\n                setTimeout(function() { el.style.borderColor = ''; }, 600);\\n              });\\n            }\\n          });\\n        });\\n      \"}}]]\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"2\",{\"children\":\"Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查) | OpenClaw 技能详情 | 龙虾技能库 | 龙虾技能库\"}],[\"$\",\"meta\",\"3\",{\"name\":\"description\",\"content\":\"Deploy Pilot 管理整个部署周期,包括构建验证、GitHub 推送、Vercel 部署和健康检查。它适用于 Next.js 应用程序的自动化部署流程,确保从本地构建到生产环境的顺利部署。\"}],[\"$\",\"meta\",\"4\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"link\",\"5\",{\"rel\":\"canonical\",\"href\":\"https://www.longxiaskill.com/skill/202/deploy-pilot/\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:title\",\"content\":\"Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查)\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:description\",\"content\":\"Deploy Pilot 管理整个部署周期,包括构建验证、GitHub 推送、Vercel 部署和健康检查。它适用于 Next.js 应用程序的自动化部署流程,确保从本地构建到生产环境的顺利部署。\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"9\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"10\",{\"name\":\"twitter:title\",\"content\":\"Deploy Pilot — 全部署周期管理(构建验证、GitHub 推送、Vercel 部署、健康检查)\"}],[\"$\",\"meta\",\"11\",{\"name\":\"twitter:description\",\"content\":\"Deploy Pilot 管理整个部署周期,包括构建验证、GitHub 推送、Vercel 部署和健康检查。它适用于 Next.js 应用程序的自动化部署流程,确保从本地构建到生产环境的顺利部署。\"}]]\n3:null\n"])</script></body></html>