[{"data":1,"prerenderedAt":511},["ShallowReactive",2],{"header-counts":3,"review-claude-skills-practice":6,"footer-counts":510},{"tools":4,"reviews":5},65,7,{"id":7,"title":8,"body":9,"cover":492,"description":493,"extension":494,"meta":495,"navigation":157,"path":496,"published":497,"relatedTools":498,"seo":502,"stem":503,"tags":504,"updated":497,"verdict":508,"__hash__":509},"review\u002Freview\u002Fclaude-skills-practice.md","Claude Skills 实战：用 SKILL.md 让 Agent 学会部署 Nuxt 项目",{"type":10,"value":11,"toc":478},"minimark",[12,17,26,30,108,112,117,165,172,176,251,262,266,287,291,313,317,325,333,336,342,346,436,439,442,445,465,468,471,474],[13,14,16],"h2",{"id":15},"tldr","TL;DR",[18,19,20,21,25],"p",{},"Skills 把 Agent 能力从「写代码注册 tool」降维到「写 Markdown 描述步骤」。我们写了 5 个生产级 Skill，总结出",[22,23,24],"strong",{},"什么样的 SKILL.md 才能让 Claude 真正按你的预期执行","。",[13,27,29],{"id":28},"我们写了哪-5-个-skill","我们写了哪 5 个 Skill",[31,32,33,49],"table",{},[34,35,36],"thead",{},[37,38,39,43,46],"tr",{},[40,41,42],"th",{},"Skill",[40,44,45],{},"场景",[40,47,48],{},"效果",[50,51,52,64,75,86,97],"tbody",{},[37,53,54,58,61],{},[55,56,57],"td",{},"deploy-to-vercel",[55,59,60],{},"部署 Nuxt 项目到 Vercel",[55,62,63],{},"从 15 分钟手动操作 → 30 秒一行指令",[37,65,66,69,72],{},[55,67,68],{},"audit-deps",[55,70,71],{},"审计 package.json 依赖安全",[55,73,74],{},"每周自动跑，输出安全报告",[37,76,77,80,83],{},[55,78,79],{},"gen-sitemap",[55,81,82],{},"生成 sitemap.xml",[55,84,85],{},"改路由后自动更新，不用手动跑脚本",[37,87,88,91,94],{},[55,89,90],{},"db-migration",[55,92,93],{},"数据库 schema 迁移",[55,95,96],{},"生成迁移文件 + 回滚脚本",[37,98,99,102,105],{},[55,100,101],{},"gen-api-docs",[55,103,104],{},"从代码生成 API 文档",[55,106,107],{},"提交 PR 时自动更新文档",[13,109,111],{"id":110},"skillmd-怎么写才有效","SKILL.md 怎么写才有效",[113,114,116],"h3",{"id":115},"反面教材无效","反面教材（无效）",[118,119,124],"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-markdown shiki shiki-themes github-light github-dark","---\nname: deploy-to-vercel\ndescription: Deploy to Vercel\n---\n\nDeploy the project to Vercel.\n","markdown","",[125,126,127,135,141,147,152,159],"code",{"__ignoreMap":123},[128,129,132],"span",{"class":130,"line":131},"line",1,[128,133,134],{},"---\n",[128,136,138],{"class":130,"line":137},2,[128,139,140],{},"name: deploy-to-vercel\n",[128,142,144],{"class":130,"line":143},3,[128,145,146],{},"description: Deploy to Vercel\n",[128,148,150],{"class":130,"line":149},4,[128,151,134],{},[128,153,155],{"class":130,"line":154},5,[128,156,158],{"emptyLinePlaceholder":157},true,"\n",[128,160,162],{"class":130,"line":161},6,[128,163,164],{},"Deploy the project to Vercel.\n",[18,166,167,168,171],{},"Claude 看到这个会问一堆问题：用什么命令？要不要 ",[125,169,170],{},"--prod","？环境变量怎么配？",[113,173,175],{"id":174},"正面教材有效","正面教材（有效）",[118,177,179],{"className":120,"code":178,"language":122,"meta":123,"style":123},"---\nname: deploy-to-vercel\ndescription: Deploy a Nuxt\u002FVite\u002FNext project to Vercel\n---\n\n## When to use\n\nUser says \"部署\" \u002F \"deploy\" \u002F \"上线\" or asks to deploy to Vercel.\n\n## Prerequisites\n\n1. Check `vercel.json` exists. If not, create one:\n   ```json\n   { \"framework\": \"nuxt\", \"buildCommand\": \"pnpm run build\" }\n",[125,180,181,185,189,194,198,202,207,211,217,222,228,233,239,245],{"__ignoreMap":123},[128,182,183],{"class":130,"line":131},[128,184,134],{},[128,186,187],{"class":130,"line":137},[128,188,140],{},[128,190,191],{"class":130,"line":143},[128,192,193],{},"description: Deploy a Nuxt\u002FVite\u002FNext project to Vercel\n",[128,195,196],{"class":130,"line":149},[128,197,134],{},[128,199,200],{"class":130,"line":154},[128,201,158],{"emptyLinePlaceholder":157},[128,203,204],{"class":130,"line":161},[128,205,206],{},"## When to use\n",[128,208,209],{"class":130,"line":5},[128,210,158],{"emptyLinePlaceholder":157},[128,212,214],{"class":130,"line":213},8,[128,215,216],{},"User says \"部署\" \u002F \"deploy\" \u002F \"上线\" or asks to deploy to Vercel.\n",[128,218,220],{"class":130,"line":219},9,[128,221,158],{"emptyLinePlaceholder":157},[128,223,225],{"class":130,"line":224},10,[128,226,227],{},"## Prerequisites\n",[128,229,231],{"class":130,"line":230},11,[128,232,158],{"emptyLinePlaceholder":157},[128,234,236],{"class":130,"line":235},12,[128,237,238],{},"1. Check `vercel.json` exists. If not, create one:\n",[128,240,242],{"class":130,"line":241},13,[128,243,244],{},"   ```json\n",[128,246,248],{"class":130,"line":247},14,[128,249,250],{},"   { \"framework\": \"nuxt\", \"buildCommand\": \"pnpm run build\" }\n",[252,253,254],"ol",{"start":137},[255,256,257,258,261],"li",{},"Check ",[125,259,260],{},"VERCEL_TOKEN"," env var is set. If not, ask user to provide it.",[13,263,265],{"id":264},"steps","Steps",[252,267,268,275,281,284],{},[255,269,270,271,274],{},"Run ",[125,272,273],{},"vercel build"," to verify build passes locally",[255,276,270,277,280],{},[125,278,279],{},"vercel --prod --yes"," to deploy",[255,282,283],{},"Wait for deployment URL in output",[255,285,286],{},"Return the deployment URL to user",[13,288,290],{"id":289},"error-handling","Error handling",[292,293,294,297,303],"ul",{},[255,295,296],{},"If build fails: show error, do NOT retry automatically",[255,298,299,300,302],{},"If ",[125,301,260],{}," missing: ask user to set it, do NOT guess",[255,304,299,305,308,309,312],{},[125,306,307],{},"vercel"," CLI not installed: ",[125,310,311],{},"npm i -g vercel"," first",[13,314,316],{"id":315},"do-not","Do NOT",[292,318,319,322],{},[255,320,321],{},"Do not deploy to preview without asking",[255,323,324],{},"Do not modify nuxt.config during deploy",[118,326,331],{"className":327,"code":329,"language":330},[328],"language-text","\n**关键要素**：\n1. **When to use** — 明确触发条件，避免 Claude 瞎调\n2. **Prerequisites** — 前置检查，缺什么先补\n3. **Steps** — 具体命令，不要含糊\n4. **Error handling** — 出错了怎么办\n5. **Do NOT** — 禁止事项，防止 Claude 自作主张\n\n## 附带脚本和模板\n\nSkill 目录可以放脚本和模板，Claude 会按需读取：\n\n","text",[125,332,329],{"__ignoreMap":123},[18,334,335],{},"deploy-to-vercel\u002F\nSKILL.md\nscripts\u002F\ncheck-env.sh        # 检查环境变量\ntemplates\u002F\nvercel.json         # 默认配置模板\nnuxt.vercel.json    # Nuxt 专用配置",[118,337,340],{"className":338,"code":339,"language":330},[328],"\nSKILL.md 里引用：\n```markdown\n## Steps\n\n1. Run `bash scripts\u002Fcheck-env.sh` to verify prerequisites\n2. If `vercel.json` missing, copy from `templates\u002Fnuxt.vercel.json`\n3. Run `vercel --prod --yes`\n",[125,341,339],{"__ignoreMap":123},[13,343,345],{"id":344},"skills-vs-cursorrules-vs-mcp","Skills vs .cursorrules vs MCP",[31,347,348,364],{},[34,349,350],{},[37,351,352,355,358,361],{},[40,353,354],{},"维度",[40,356,357],{},"Skills",[40,359,360],{},".cursorrules",[40,362,363],{},"MCP",[50,365,366,380,394,408,422],{},[37,367,368,371,374,377],{},[55,369,370],{},"本质",[55,372,373],{},"能力描述（按需加载）",[55,375,376],{},"全局 prompt（每次带）",[55,378,379],{},"工具接入协议",[37,381,382,385,388,391],{},[55,383,384],{},"格式",[55,386,387],{},"Markdown + 脚本",[55,389,390],{},"纯文本",[55,392,393],{},"JSON + 代码",[37,395,396,399,402,405],{},[55,397,398],{},"Context 占用",[55,400,401],{},"低（按需加载）",[55,403,404],{},"高（每次对话带）",[55,406,407],{},"低",[37,409,410,413,416,419],{},[55,411,412],{},"适合",[55,414,415],{},"固化团队流程",[55,417,418],{},"项目规范",[55,420,421],{},"接外部 API",[37,423,424,427,430,433],{},[55,425,426],{},"支持",[55,428,429],{},"Claude 系列",[55,431,432],{},"Cursor \u002F Windsurf",[55,434,435],{},"Claude \u002F Cursor",[18,437,438],{},"三者互补：.cursorrules 定项目规范，Skills 定操作流程，MCP 接外部工具。",[13,440,441],{"id":441},"效果数据",[18,443,444],{},"部署 Skill 上线两周后：",[292,446,447,453,459],{},[255,448,449,452],{},[22,450,451],{},"部署操作时间","：15 min → 30 sec（Claude Code 执行 Skill）",[255,454,455,458],{},[22,456,457],{},"部署错误率","：2 次\u002F周 → 0（Skill 里有前置检查）",[255,460,461,464],{},[22,462,463],{},"新人上手","：不需要看部署文档，直接说\"部署\"就行",[13,466,467],{"id":467},"结论",[18,469,470],{},"Skills 的核心价值不是「教 AI 新知识」，而是**「固化团队最佳实践」**。写好一个 Skill = 新人不用看文档也能按规范操作。",[18,472,473],{},"建议从高频、易出错的流程开始写 Skill——部署、迁移、审计这类。",[475,476,477],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":123,"searchDepth":143,"depth":143,"links":479},[480,481,482,486,487,488,489,490,491],{"id":15,"depth":137,"text":16},{"id":28,"depth":137,"text":29},{"id":110,"depth":137,"text":111,"children":483},[484,485],{"id":115,"depth":143,"text":116},{"id":174,"depth":143,"text":175},{"id":264,"depth":137,"text":265},{"id":289,"depth":137,"text":290},{"id":315,"depth":137,"text":316},{"id":344,"depth":137,"text":345},{"id":441,"depth":137,"text":441},{"id":467,"depth":137,"text":467},"\u002Fog\u002Freview\u002Fclaude-skills-practice.png","Anthropic Skills 推出后，Agent 能力复用从代码降维到 Markdown。我们写了 5 个实战 Skill（部署 Vercel \u002F 审计依赖 \u002F 生成 sitemap \u002F 数据库迁移 \u002F API 文档），记录了 SKILL.md 怎么写才有效。","md",{},"\u002Freview\u002Fclaude-skills-practice","2026-06-21",[499,500,501],"agent\u002Fskills\u002Fclaude-skills","coding\u002Fcli\u002Fclaude-code","agent\u002Fprotocol\u002Fsmithery",{"title":8,"description":493},"review\u002Fclaude-skills-practice",[505,357,506,507],"Claude","Agent","实战","Skills 的核心价值不是「教 AI 新知识」，而是「固化团队最佳实践」。写好一个 Skill = 新人不用看文档也能按规范操作。","yJOSR1KXWRpMNGMzs6xAu4lJAOfYBTw0hEmtVZkDRkU",{"tools":4,"reviews":5,"playbooks":224,"news":213},1782316489342]