ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Claude Code Skills从项目级迁到全局:安装与切换实战

Claude Code Skills从项目级迁到全局:安装与切换实战 在团队里用 Claude Code 做日常开发维护已经有段时间了最早大家都把 Skills 往各个项目里塞结果每个仓库里都躺着一份重复的配置。后来发现问题越来越多升级一个 Skill 要在十几个仓库里同步、改一个脚本要反复拷贝、同事提交的版本还经常互相覆盖。折腾过一轮之后我彻底把个人常用的 Skills 从项目级挪到了全局这里把安装方式和切换过程完整记录下来。1. 先搞懂 Skills 的本质它不是插件而是一套给 Clude Code 看的说明书很多第一次接触 Skills 的人会误以为它跟普通编辑器插件一样是个能直接执行的黑盒程序。实际上完全不是这回事。Skills 的本质是一组文件夹里面装着一份核心文档和若干辅助文件它们的作用是在一开始就告诉 Claude Code你可以调用哪些能力、按什么流程调用、有什么注意事项。1.1 SKILL.md 是唯一入口其他文件都是素材每个 Skill 的标准结构是这个样子的my-skill/ ├── SKILL.md ├── scripts/ │ └── fetch-data.py ├── templates/ │ └── report-template.md └── references/ └── api-spec.md真正决定启动时机的是SKILL.md的开头部分。它采用类似配置文件的格式最关键的三个字段是name、description和allowed-tools。Claude Code 会拿着你的对话内容跟所有已安装 Skills 的 description 做匹配匹配上了才会加载这个 Skill 的完整内容。--- name: generate-monthly-report description: 从当前仓库的提交记录中按周汇总变更生成月度开发报告。当用户提到月报月度汇总本月改动统计时使用此 Skill。 allowed-tools: Bash, Read --- # 月度报告生成 执行步骤 1. 检查 scripts/generate_stats.py 是否存在不存在则执行安装脚本 2. 用 Bash 运行 python3 scripts/generate_stats.py --since 本月第一天 3. 将输出整理为 Markdown 并写入 docs/monthly-report.md我见过不少人栽在 description 写得太宽泛或太抽象上。比如写处理各种文档任务结果 Claude Code 几乎每次问答都会尝试加载这个 Skill白白浪费上下文窗口还会让回答变得怪异。反过来如果 description 完全不提触发词那么这个 Skill 就永远处于找不到、用不上的沉默状态。所以 description 的写法需要具体把用户可能说什么话、什么场景、什么意图都列进去。1.2 辅助文件才是 Skill 真正能干活的资本SKILL.md 只是地图辅助文件才是工具箱。写进 SKILL.md 里的步骤如果涉及执行脚本那么脚本文件就放在scripts/下如果要生成固定格式的文档模板就放在templates/下如果模型需要参考其他规范或者长文档参考资料放在references/下这样不会污染主文档的篇幅。这里有个被忽视的细节references/目录里的文件内容不会自动被 Claude Code 看到。只有 SKILL.md 里明确写了先读 references/api-spec.md 再执行这样的指令模型才会主动去读取。很多人忽略这一点把参考文档往文件夹里一丢结果 Skill 执行时模型根本不知道有这份文档存在。我一开始也犯过这个错。当初为了让 Claude Code 能按我的编码规范来生成代码我把一份规范性文档塞进了 references但 SKILL.md 里完全没有提及它。结果生成的代码风格还是老的排查了很久才发现是加载链路出现了断裂。之后我在写每一步指令时都会刻意在 SKILL.md 里写上读取 references/xxx 中第几节内容然后……这种带位置信息的命令行式描述。1.3 为什么不用单独的程序文件有人可能会问为什么不把 Skill 做成一个 Python 包或者可执行文件这样不是更高效吗原因在于 Claude Code 的模型需要先知晓应该用什么技能以及什么时候用这个技能这两件事必须依赖可读取、可推理的文本来实现。如果把整个 Skill 做成二进制或程序包模型就无法在决策阶段直观理解其用途。所以挂着Skill的名字它实际上是一份结构化的运行指令集。这也决定了安装和迁移都非常轻量只需要移动一个文件夹改改里面的文本就能完成所谓的安装和从项目级切到全局。2. 项目级安装先在自己的仓库里跑通第一个 Skill项目级的意思是说这个 Skill 只在特定仓库内生效保存在项目的.claude/skills/目录下。这样做的好处是天然跟随仓库走团队克隆后立即共享非常适合团队约定的流程。但我个人的实践结论是项目级只适合放项目特有流程通用能力还是尽快迁到全局更省心。2.1 项目级目录的标准位置与创建过程项目级安装的位置位于仓库根目录下的.claude/skills/文件夹。需要特别注意的是它可以和.claude/settings.json、.claude/CLAUDE.md共存。settings 负责工具配置CLAUDE.md 负责项目背景说明skills 负责专项流程能力三者互不冲突。以一个最小可用的 Skill 为例完整安装过程只需要两条命令cd /path/to/your/project mkdir -p .claude/skills/review-pull-request然后在.claude/skills/review-pull-request/SKILL.md里写入以下内容--- name: review-pull-request description: 按照团队的 Code Review 清单检查当前分支的 Pull Request 代码改动重点检查变量命名、错误处理、是否遗留调试日志。当用户说帮我 review 代码检查这个 PR看看这次的改动质量时使用。 allowed-tools: Bash, Read, Grep --- # Pull Request 审查 步骤 1. 用 Bash 执行 git diff origin/main...HEAD 获取当前分支改动 2. 逐个文件检查如果文件过大优先检查新增代码 3. 按下述 Checklist 输出结论 4. 最后输出审查报告标注阻塞项和建议项 Checklist: - [ ] 没有硬编码密钥 - [ ] 所有新增函数有类型标注 - [ ] 异常路径有错误处理 - [ ] 没有留下 console.log / print 调试语句这个 Skill 就是典型的项目级适用的例子。因为不同团队的 review 规范可能完全不同有的团队要求类型检查有的要求测试覆盖有的要求文档同步。每个团队都有自己的标准版本放项目级可以让每个仓库保持自己的规则。2.2 验证 Skill 是否生效的三种手段装完之后怎么知道它真的被 Claude Code 识别了我的验证手段有三种按可靠性从低到高排列第一种是直接对话验证。在 Claude Code 里输入帮我 review 当前的改动如果模型开始按 Checklist 逐项检查就说明 Skill 被加载了。但这种方法不够稳定因为模型可能在没有 Skill 的情况下也执行类似逻辑你无法判断是否真的走入了 Skill 分支。第二种是故意写一个容易触发的描述词看看模型行为有没有变化。比如在 description 里加一个冷门词再在对话里使用这个词模型行为若出现明显变化说明 Skill 生效了。作为临时验证可以但不建议长期保留因为冷门词会干扰正常匹配。第三种是观察日志。Claude Code 在执行时会输出详细的调用记录。如果你的 Skill 被识别并加载日志中会出现 Skill 相关的记录甚至能看到模型读取了 SKILL.md 的轨迹。这个方法最可靠也是排查问题时的首选手段。注意如果你是在项目运行过程中新增的 Skill通常需要重启 Claude Code 会话才能生效。运行中的会话不会自动感知磁盘上新出现的 Skill 目录这一点我自己实测过多次别浪费时间去怀疑是不是目录写错了。2.3 项目级安装的典型坑位提醒我见过身边同事踩得最多的一个项目级坑是目录嵌套多了一层。比如把 Skill 放在了.claude/skills/review-pull-request/review-pull-request/SKILL.md多包了一层文件夹Claude Code 就会无法识别。正确的结构是.claude/skills/你的技能名/SKILL.md技能名文件夹里直接放文件不要再套一层同名目录。还有一个容易忽略的问题是 Windows 环境下的路径分隔符和大小写敏感问题。在 macOS 和 Linux 上文件名大小写敏感很多人创建了SKILL.md后面又误存成skill.md或者反过来都会导致加载失败Windows 虽然大小写不敏感但路径中的反斜杠和正斜杠混用也可能在复制命令时出问题。跨平台操作时建议统一使用小写字母加连字符的命名方式例如generate-monthly-report不要用驼峰命名。3. 搞清楚项目级与全局的本质差异迁移前你必须做的判断之所以标题强调从项目级切到全局是因为这两种层级想解决的问题完全不同。项目级默认解决的是团队协作和仓库隔离问题全局解决的是个人效率和跨项目复用问题。我见过把项目级目录塞满三四十个 Skill 的仓库也见过全局目录里只有一个测试 Skill 的空壳。这两种做法其实都没踩到点子上。3.1 两种层级的适用边界项目级适合放的是与仓库内容强相关、规则因项目不同而不同的能力项目特定的代码生成规范团队独有的测试框架操作流程必须调用项目内脚本才能完成的数据汇总仓库独有的目录结构导航全局适合放的是与仓库内容弱相关、个人工作流固定不变的能力代码审查统一标准不区分项目提交信息规范生成周报/日报生成常用工具的封装调用比如启动本地服务、执行迁移脚本个人偏好的文档格式化规则这里有一个判断标准如果你发现某个 Skill 的 scripts 里写死了某个绝对路径或者专门针对某个仓库的配置文件那么它只适合项目级如果 scripts 里使用的命令在任何项目下都通用或者能从环境变量中动态获取信息那就适合提升到全局。3.2 从项目级切到全局背后的真实驱动力我自己的情况是典型的项目级装太多了导致的迁移。最初接手一批老仓库每个仓库都手动拷贝了一个代码审查 Skill后来这个 Skill 的规则要更新——增加对安全扫描的检查项。我花了整个下午遍历这些仓库逐一替换文件结果有两个仓库忘了替换第二天审查结果出现了新旧版本不一致的情况。那一刻我意识到项目级安装有一个天然代价——每个副本都会腐烂。当你复制了十份你就背负了十份的维护成本。全局安装则不同文件只有一份改完立刻所有项目生效。所以当个人工作流中这三个信号同时出现就该果断切到全局了同一个 Skill 出现在至少三个项目的.claude/skills/下对这些项目执行的操作流程完全一致你发现自己开始对复制粘贴这项操作感到厌烦3.3 全局也不是万能药话虽如此全局安装也有明显的边界。最大的问题是所有项目都会被注入了这些能力哪怕某些项目完全不需要。比如你的全局装了一个自动生成数据库迁移文件的 Skill那么当你在一个完全不使用数据库迁移脚本的前端项目里工作只要对话中提到了相关词语模型就可能莫名触发这个 Skill 的加载白白消耗上下文。另一个问题是版本冲突。项目 A 依赖提交信息规范的旧版规则项目 B 想用新版规则如果这个 Skill 装成全局的A 项目就会被迫接受 B 项目的新规则。这种场景下更合理的做法是全局只装最通用的版本特殊情况在项目级覆盖。我倾向于把全局目录看作基础镜像把项目级目录看作项目专用层两层可以叠加使用。4. 从项目级切到全局完整迁移操作与验证流程在决定迁移之后动手之前必须先做一次盘点不要直接整目录复制。因为项目级目录里通常混着只属于某一个仓库的 Skill这些搬进全局反而会污染其他项目。这套流程我完整走过一遍按下面的顺序操作基本不会出问题。4.1 迁移前盘点与预处理先进入项目目录把现有 Skills 做一个清单cd /path/to/your/project find .claude/skills -maxdepth 2 -name SKILL.md | sort逐个打开这些 SKILL.md看 description 里的触发场景是否跨项目通用然后看 scripts 目录下是否有写死路径的代码。确认哪些能搬哪些要丢弃。一个值得留意的细节是脚本路径是否正确。在项目级安装时SKILL.md 里的脚本经常写成相对项目根目录的路径比如python3 .claude/skills/foo/scripts/run.py。迁移到全局后这些相对路径的参照物变成了当前所在项目不再指向全局目录脚本就会执行失败。正确做法是把执行命令改成基于 Skill 所在目录的动态定位。写 SKILL.md 时要尽量让脚本自动定位到 Skill 目录。Claude Code 在加载 Skill 时会提供当前 Skill 目录的目标信息你可以在执行指令中这样描述先用 Bash 执行pwd ls找到当前 Skill 目录位置然后使用该目录下的 scripts/run.py 运行脚本。这样脚本就不依赖项目路径了迁移到全局也能正常工作。这也是从项目级切到全局的过程中最隐蔽但影响最大的环节。4.2 复制方案简单但需要留意同步问题最直接的迁移方式是把通用 Skill 从项目级复制到全局目录# 假设目标项目在 /path/to/your/project GLOBAL_SKILLS$HOME/.claude/skills mkdir -p $GLOBAL_SKILLS cp -r /path/to/your/project/.claude/skills/generate-monthly-report $GLOBAL_SKILLS/ cp -r /path/to/your/project/.claude/skills/commit-msg-standard $GLOBAL_SKILLS/复制完在别的项目下启动 Claude Code 测试。一切正常后可以从原项目目录中删除这些 Skillrm -rf /path/to/your/project/.claude/skills/generate-monthly-report复制方案的缺点是后续改动时要手动同步全局目录和原项目目录搞出两套副本。另一种更好维护的做法是软链接方案。4.3 软链接方案一改全改的全局维护如果你希望项目里保留一份文件全局也生效可以用软链接的方式实现cd /path/to/your/project/.claude/skills ln -s $HOME/.claude/skills/generate-monthly-report generate-monthly-report这样一来这个 Skill 的实际文件在全局目录中项目目录里只有一个快捷方式。修改全局文件时所有通过软链接挂载的目录都会同步更新。这是我从项目级切到全局过程中最终采用的方案它在保留项目内可见性的同时避免了重复文件的问题。使用软链接的注意事项是有些代码托管平台比如 Git不会自动追踪符号链接指向的实际内容队友在其他机器上克隆项目后可能只会拿到一条指向本地不存在目录的链接Skill 就失效了。所以软链接方案比较适合个人使用或小团队明确沟通过的情况如果与现实协作团队共享项目还是直接用复制方案更稳妥只要在项目的 README 里注明本仓库包含全局 Skill 的副本升级时同步更新即可。4.4 切换后的验证清单无论使用复制还是软链接迁移之后都要走一遍完整的验证我整理了一个固定清单在另一个不相关的项目目录中启动 Claude Code对话中输入该 Skill 的典型触发词确认能被调用故意触发一次函数执行确认脚本路径正常工作、输出正确如果使用了软链接确认原始项目目录中的链接没有断裂检查全局目录下文件权限特别是含 Python/Shell 脚本的 Skill确保可执行权限正确权限问题是 Windows 之外最常踩的坑。从仓库拖下来的脚本可能没有执行权限迁移后运行报 Permission denied。这个时候做一次统一的授权find $HOME/.claude/skills -type f \( -name *.sh -o -name *.py \) -exec chmod x {} \;注意macOS 上从网络下载或从其他位置拷贝来的脚本也可能带隔离属性第一次运行可能被系统拦截。遇到无法打开不受信任之类的提示用xattr -dr com.apple.quarantine skill目录清除即可这是 macOS 独有的坑Linux 和 Windows 一般不存在这个问题。5. 全局 Skills 的高阶管理技巧从一把散沙到规范化仓库迁到全局之后如果你的 Skills 数量超过五六个很快就会面临下一个问题怎么维护怎么备份怎么在多台设备间同步这里分享几个我把全局 Skills 做成规范化仓库的实践。5.1 把全局 Skills 目录纳入 Git 管理最推荐的方案是把~/.claude/skills/变成一个独立的 Git 仓库或者纳入你已有的 dotfiles 仓库。操作起来很简单cd ~/.claude/skills git init git add . git commit -m 初始化全局 Skills 管理这样在换电脑或重装系统时只需要拉取这一个仓库就能恢复所有个人工作流。我还会在自己的备份脚本里加上一条git -C $HOME/.claude/skills add -A git -C $HOME/.claude/skills commit -m Daily skill update --quiet git -C $HOME/.claude/skills push origin main --quiet这样所有 Skill 的每次变更都会被记录。万一某次修改后发现效果不好还可以回滚到之前的版本比手动复制靠谱得多。5.2 description 的打磨提高触发准确率的关键全局 Skills 数量的增加会带来新的匹配问题。Claude Code 需要从许多候选 Skill 中挑选合适的如果说明文件写得含混不清模型就容易选错。我自己多次调优后发现以下几点显著提高触发准确率首先把触发场景前置。在 description 第一句就先明确当用户说…时使用比如当用户提到周报、本周总结、工作汇报时使用而不是先讲一堆背景。其次善用负向排除。比如你有一个生成前端组件测试的 Skill可以在 description 里加一句如果用户只需要修改样式请不要使用本 Skill。模型对明确排除的指令通常能可靠遵循这能防止很多误触发。最后定期清点全局目录。把超过三个月没用过的 Skill 移到存档目录只保留高频有用的。全局目录不是越大越好而是越精准越好。5.3 在 SKILL.md 中内置版本信息和更新说明全局 Skills 一旦多了忘记每个 Skill 的更新时间是常事。我的习惯是在 SKILL.md 底部加一个版本与变更记录区块## 状态记录 - 当前版本: 2.1.0 - 最近更新: 2025年1月 - 变更摘要: 新增安全审查检查项修复脚本路径定位问题这个区块不算实用功能代码但对维护者非常有价值。隔一段时间回来改文件时能快速定位上次改了什么、当前版本是否已经适配最新环境避免旧版本被意外覆盖。5.4 项目级与全局并存最终的层级策略最后说回文章标题本身。从项目级切到全局并不代表把所有 Skills 一股脑全搬上去。我目前维持的稳定策略是全局放通用工作流型 Skills提交信息规范、代码审查通用清单、周报生成、常用命令封装项目级放团队或业务强相关 Skills特定的测试流程、部署前检查、只适用于该仓库的数据处理脚本这样的分层既减轻了项目级目录的维护负担也避免了全局目录里塞入过多业务噪音。如果你目前正在经历每个仓库一堆 Skill、改一次累半死的阶段按这篇文章的流程先把通用技能迁出去你会立刻感受到维护成本的大幅下降。我个人实际操作中的体会是软链接方案是把双刃剑它最适合在个人本地工作流中使用让我可以在一处更新、处处生效。而团队项目仓库里要想清楚是否需要对全量文件做版本控制如果是还是老老实实把副本落在项目目录并纳入 Git 更稳妥。迁移这件事本身没有太高的技术门槛真正决定成败的反而是在动手之前对哪些 Skill 该留在项目级的判断。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进