DeerFlow 中的 Vercel 免认证一键部署技能:vercel-deploy-claimable 用法与实现原理全解析
DeerFlow 中的 Vercel 免认证一键部署技能vercel-deploy-claimable 用法与实现原理全解析【免费下载链接】deer-flowAn open-source long-horizon SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skill, subagents and message gateway, it handles different levels of tasks that could take minutes to hours.项目地址: https://gitcode.com/GitHub_Trending/de/deer-flow本文围绕仓库内置技能包 skills/public/vercel-deploy-claimable/SKILL.md 展开完整讲解该技能“免认证、可认领claimable”的 Vercel 部署工作流从项目打包、框架自动识别、上传到返回 Preview URL / Claim URL 的每一步。读完本文你可以直接在 DeerFlow 的沙箱或本地终端中复现这条部署链路并理解底层脚本的判定逻辑与 JSON 输出契约便于二次封装或排障。技能概览一个带 Claim URL 的部署技能vercel-deploy是 DeerFlow 仓库skills/public/目录下随附的公开技能包其目录结构很典型——一个描述用法的SKILL.md加一个承载逻辑的脚本skills/public/vercel-deploy-claimable/SKILL.md技能元数据与操作说明skills/public/vercel-deploy-claimable/scripts/deploy.sh实际完成打包、上传与结果解析的 Bash 脚本。从 SKILL.md 的 YAML front matter 可以看到它的核心定位name: vercel-deploy description: Deploy applications and websites to Vercel. Use this skill when the user requests deployment actions such as Deploy my app, Deploy this to production, Create a preview deployment, Deploy and give me the link, or Push this live. No authentication required - returns preview URL and claimable deployment link. metadata: author: vercel version: 1.0.0其中几个关键词值得注意触发意图覆盖 “Deploy my app”“Deploy this to production”“Create a preview deployment”“Push this live” 等自然语言指令无需认证不需要 Vercel Token、环境变量或 OAuth 流程输出两段链接previewUrl让用户立刻访问线上站点claimUrl用于把该次部署转交到用户自己的 Vercel 账户。这与 DeerFlow 的技能体系天然契合。根据 README.md 中“Skills Tools”一节的说明技能只有在任务需要时才被渐进式加载保持上下文窗口精简一个技能目录是一个包边界一旦发现其下的SKILL.md就会作为一个运行时技能注册。也就是说Agent 在收到“帮我部署”这类请求并命中本技能时才会读取本说明并把deploy.sh作为可执行步骤。工作原理一次免认证部署的四步链路SKILL.md 用四句话概括了整体流程把项目打包成 tarball排除node_modules与.git从package.json自动识别框架类型上传到部署服务返回Preview URL可立即访问的线上地址与Claim URL用于把部署移交到你的 Vercel 账户。展开到 deploy.sh 源码层面这条链路其实由五个明确阶段构成脚本头部注释也给出了调用契约# Vercel Deployment Script (via claimable deploy endpoint) # Usage: ./deploy.sh [project-path] # Returns: JSON with previewUrl, claimUrl, deploymentId, projectId阶段一解析输入路径# Parse arguments INPUT_PATH${1:-.}脚本只接受一个可选参数INPUT_PATH默认值为当前目录.。随后用mktemp -d创建临时目录存放打包产物并通过trap cleanup EXIT保证无论正常结束还是异常退出临时文件都会被清理仅当输入为已存在的 tarball 时跳过清理。阶段二判定输入类型并识别框架脚本对输入做了三分支处理输入是.tgz文件直接使用该 tarball跳过重新打包此时无法从 tarball 内识别框架FRAMEWORK保持null输入是目录先用cd $INPUT_PATH pwd解析出绝对路径再调用detect_framework $PROJECT_PATH/package.json识别框架若目录下没有package.json则按“静态 HTML 项目”特殊处理见下文输入既不是目录也不是.tgz打印Error: Input must be a directory or a .tgz file并exit 1。阶段三打包项目tar -czf $TARBALL -C $PROJECT_PATH --excludenode_modules --exclude.git .这是整个流程里唯一的“体积优化”手段node_modules与.git都被排除在压缩包外避免把本地依赖和历史提交上传到部署服务也显著减小上传体积。阶段四上传部署端点DEPLOY_ENDPOINThttps://claude-skills-deploy.vercel.com/api/deploy ... RESPONSE$(curl -s -X POST $DEPLOY_ENDPOINT -F file$TARBALL -F framework$FRAMEWORK)部署端点来自脚本常量。请求以multipart/form-data形式上送两个字段file指向打包好的 tarball与framework识别出的框架标识未识别时为null。整个交互不需要任何凭据——认证被“后置”到了 Claim URL 阶段。阶段五解析与错误处理脚本对返回的 JSON 做了三重防御式解析若响应包含error字段则提取错误消息并退出exit 1用grepcut从 JSON 字符串中提取previewUrl与claimUrl若拿不到previewUrl把原始响应打印到 stderr 后报错退出方便定位服务端异常。可以看到虽然解析方式朴素但成功/失败路径的边界清晰配合set -e任何一步失败都会立即中断不会带着残缺结果“假装成功”。命令行用法参数、示例与路径适配SKILL.md 给出的标准调用方式是注意其中路径是该技能在 Vercel 官方技能环境中的安装位置bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh [path]参数说明参数含义默认值path待部署的目录或一个.tgz文件当前目录.三个典型示例# 部署当前目录 bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh # 部署指定项目目录 bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project # 直接部署已存在的 tarball bash /mnt/skills/user/vercel-deploy/scripts/deploy.sh /path/to/project.tgz路径适配提示/mnt/skills/user/vercel-deploy/...是脚本作者在原始宿主环境claude.ai 类技能沙箱下的固定路径。在本仓库内该技能包实际位于 skills/public/vercel-deploy-claimable/因此若要在本地终端直接验证可把仓库内的脚本本身作为参数源bash skills/public/vercel-deploy-claimable/scripts/deploy.sh /path/to/project在 DeerFlow 沙箱中执行时需要以沙箱内实际的技能挂载前缀为准——仓库内其他内置技能如data-analysis、image-generation等的 SKILL.md 都采用/mnt/skills/public/技能名/scripts/...的调用约定据此可以推断本技能被启用后沙箱内路径形如/mnt/skills/public/vercel-deploy-claimable/scripts/deploy.sh若你把技能安装到 custom/integrations 等其它位置前缀会相应变化。同时注意 README 中说明 DeerFlow 的沙箱只会把“已启用”技能投影到/mnt/skills因此技能需先在设置中启用。输出解读人类可读与机器可读两套结果标准输出面向用户/日志SKILL.md 给出了完整的过程输出示例Preparing deployment... Detected framework: nextjs Creating deployment package... Deploying... ✓ Deployment successful! Preview URL: https://skill-deploy-abc123.vercel.app Claim URL: https://vercel.com/claim-deployment?code...对照源码可知这些进度信息是脚本刻意打到stderr2的包括Preparing deployment...、Detected framework: $FRAMEWORK、Creating deployment package...、Deploying...、成功后的Preview URL:与Claim URL:两行其中Detected framework仅在框架非null时打印若项目无框架则直接跳过该行。JSON 输出面向程序化消费SKILL.md 明确强调“The script also outputs JSON to stdout for programmatic use”。脚本在最后执行echo $RESPONSE把服务端返回的原始 JSON 完整输出到stdout。字段契约如下{ previewUrl: https://skill-deploy-abc123.vercel.app, claimUrl: https://vercel.com/claim-deployment?code..., deploymentId: dpl_..., projectId: prj_... }字段含义previewUrl部署成功后立即可访问的线上站点地址claimUrl携带认领码的链接用于把部署移交到你的 Vercel 账户deploymentId部署标识形如dpl_...projectId项目标识形如prj_...这种“进度走 stderr、结果走 stdout”的设计在自动化场景下非常实用Agent 或上层程序可以放心地把脚本 stdout 直接喂给 JSON 解析器而不会被中间的过程日志污染。框架自动检测判定顺序比想象中更讲究detect_framework()函数是脚本里逻辑最重的部分。它先从目录中读取package.json若文件不存在则直接返回null存在时通过has_dep()辅助函数对 package 名做grep精确匹配不区分 dependencies 与 devDependencies只要依赖串中出现即命中。源码第 27 行的注释点明了关键设计——顺序即优先级“Order matters - check more specific frameworks first”。因为某些框架会组合出现例如 Next.js 项目里可能同时有vite、express等间接依赖必须把“特异性最强”的框架放在前面。实测判定顺序如下类别框架检测的依赖包名全栈/SSRBlitzblitzNext.jsnextGatsbygatsbyRemixremix-run/React Routerv7 框架模式react-router/TanStack Starttanstack/startRedwoodJSredwoodjs/HydrogenShopifyshopify/hydrogenVue 生态NuxtnuxtVitepressvitepressVuepressvuepressGridsomegridsomeSvelte 生态SvelteKitsveltejs/kit映射sveltekit-1Svelte独立svelteSappersapper其它前端AstroastroSolidStartsolidjs/start映射solidstart-1Docusaurusdocusaurus/core映射docusaurus-2Angular / Ionic Angularangular/core/ionic/angularIonic Reactionic/reactCreate React Appreact-scripts映射create-react-appEmberember-cli或ember-sourceDojodojo/frameworkPolymerpolymer/PreactpreactStencilstencil/coreUmiJSumi映射umijsHexohexoEleventy11ty/eleventySabersaberSanitysanity或sanity/Storybookstorybook/后端框架NestJSnestjs/coreElysiaelysiaHonohonoFastifyfastifyh3h3NitronitropackExpressexpress构建工具Vitevite注释明确标注“generic - check last among JS frameworks”Parcelparcel未命中——返回nullSKILL.md 中对支持范围的归纳是“And more”还有更多上面这个表则是脚本中实际可判定的完整清单。两个细节值得单独说明Vitepress / Vuepress 先于 Nuxt 之后的 Svelte 系——同一 Vue 技术栈内文档站框架vitepress/vuepress要先于 gridsooms 等判定Vite 被刻意放在几乎所有 JS 框架之后因为 Vite 更多是作为底层构建器出现在其它项目里过早命中会产生错误归属。对于纯静态 HTML 项目无package.json框架统一被置为null。静态 HTML 项目的贴心处理SKILL.md 特别说明了对“没有package.json的纯静态项目”的一条自动修正逻辑If theres a single.htmlfile not namedindex.html, it gets renamed automatically. This ensures the page is served at the root URL (/).落到源码上是这样一段当检测到目录没有package.json时脚本会在项目根目录-maxdepth 1查找.html文件如果恰好只有一个HTML 文件、且其文件名不是index.html就用mv把它改名为index.html并在 stderr 打印Renaming basename to index.html...。这意味着你随手写了一个demo.html不需要手动建目录结构技能会保证它在部署后直接以站点根路径/提供服务。当然这个逻辑只在“仅一个 HTML 文件”时触发——多文件站点仍需自行保证存在index.html作为入口。向用户呈现结果的最佳实践SKILL.md 用一个可复制的“结果呈现模板”明确要求两个 URL 必须同时展示缺一不可✓ Deployment successful! - [Preview URL](https://skill-deploy-abc123.vercel.app) - [Claim URL](https://vercel.com/claim-deployment?code...) View your site at the Preview URL. To transfer this deployment to your Vercel account, visit the Claim URL.其语义拆解是Preview URL “现在就能看的站点”引导用户立即打开验证效果Claim URL “把它变成你的”入口因为本次部署没有绑定任何账户用户需要访问该链接、通过code认领后部署才会出现在自己的 Vercel 项目列表中。对于 Agent 而言这条模板同时是一次很好的“结果结构规范”以✓ Deployment successful!收束动作再给出主结果Preview URL和后续动作指引Claim URL避免用户拿到一堆过程日志却不知道链接在哪。故障排查网络出口受限怎么办SKILL.md 记录了唯一一个内置的故障场景Network Egress Error——当部署因网络限制失败时常见于运行在 claude.ai 之类受限网络环境中的技能调用要这样引导用户修复Deployment failed due to network restrictions. To fix this: 1. Go to https://claude.ai/settings/capabilities 2. Add *.vercel.com to the allowed domains 3. Try deploying again也就是说本技能依赖对 Vercel 部署服务的出网访问如果所在平台有域名白名单机制就需要把*.vercel.com加入允许列表后再重试。需要强调的是在 DeerFlow 中执行时网络出口策略取决于 DeerFlow 自身的沙箱/代理配置而不再受 claude.ai 的 capabilities 限制若遇到出网被沙箱网络策略拦截应检查 DeerFlow 侧的网络白名单与代理设置。适用前提、限制与注意事项从文档与脚本双重证据出发使用本技能时应清楚以下几点边界运行前提宿主需具备bash、tar、curl、grep等 POSIX 常用工具deploy.sh 全部依赖它们部署过程要求能够访问部署服务端点。无需但也不支持现有凭据注入脚本不带任何认证参数上传即部署账户绑定通过 Claim URL 在浏览器侧完成因此不适合需要“直接部署进指定 Vercel 账户/Team 并走其现有环境变量”的场景。体积控制node_modules与.git会被排除但脚本并未内置其它文件过滤或体积上限校验超大仓库或包含大体积资源文件的目录需要自行评估。框架识别是启发式的它基于package.json依赖串做顺序匹配而不是读取框架配置或构建产物识别错误时可考虑先自行用 Vercel 框架预设或直接传入构建结果。错误处理是防御式的服务端返回的error、缺失previewUrl都会导致脚本非零退出并把现场信息打到 stderr供上层 Agent 读取并转述。在 DeerFlow 中把它用起来结合 README.md 对 DeerFlow 技能机制的描述这套vercel-deploy技能包在 DeerFlow 中遵循统一的技能生命周期发现与加载技能只在任务命中其描述时才被渐进式加载不会常驻上下文启用与可见性技能启用后才会被投影进沙箱的/mnt/skills文件系统视图关闭技能会同时将其从沙箱中移除参见 README 中关于沙箱挂载与启用状态的说明单轮激活用户/Agent 可在单条请求中用/skill-name前缀显式激活技能使其SKILL.md作为本轮隐藏上下文加载从而保证deploy.sh被正确、完整地执行而不是被“总结成一句建议”。换句话说本技能包在仓库里的角色是“部署动作的落地执行器”它把 Vercel 的免认证 claimable 部署接口封装成了统一的 Bash 契约而 DeerFlow 技能框架负责把它变成 Agent 可按需取用、可重复执行的标准能力。理解了两层各自的分工无论是直接调用脚本、还是把它接入自己的 Agent 工作流都能获得稳定一致的结果。【免费下载链接】deer-flowAn open-source long-horizon SuperAgent harness that researches, codes, and creates. With the help of sandboxes, memories, tools, skill, subagents and message gateway, it handles different levels of tasks that could take minutes to hours.项目地址: https://gitcode.com/GitHub_Trending/de/deer-flow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考