<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Codex on 土土哥的技术 Blog</title><link>https://tutuge.me/tags/codex/</link><description>Recent content in Codex on 土土哥的技术 Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>tutuge</copyright><lastBuildDate>Wed, 12 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://tutuge.me/tags/codex/index.xml" rel="self" type="application/rss+xml"/><item><title>用一个轻量脚本统一管理多个 AI 工具的 Skills</title><link>https://tutuge.me/2026/08/12/agent-skills-manager/</link><pubDate>Tue, 11 Aug 2026 17:00:00 +0000</pubDate><guid>https://tutuge.me/2026/08/12/agent-skills-manager/</guid><description>&lt;img src="https://tutuge.me/assets/2026/08/12/agent-skills-manager/skill-manager-map.png" alt="Featured image of post 用一个轻量脚本统一管理多个 AI 工具的 Skills" /&gt;&lt;h2 id="前言"&gt;&lt;a href="#%e5%89%8d%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;前言
&lt;/h2&gt;&lt;p&gt;最近在不同的 AI Coding 工具之间切换得比较多：Claude Code、Codex、Qoder，还有一些项目里用到的 Gemini CLI、Copilot 等。&lt;/p&gt;
&lt;p&gt;Skill 的格式现在已经逐步收敛了。基本都是一个目录，入口叫 &lt;code&gt;SKILL.md&lt;/code&gt;，里面放 &lt;code&gt;name&lt;/code&gt;、&lt;code&gt;description&lt;/code&gt; 和具体的工作流说明；需要时还可以带脚本、模板和参考资料。&lt;/p&gt;
&lt;p&gt;问题不在 Skill 怎么写，而在&lt;strong&gt;它们放在哪里&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;同一个 &lt;code&gt;release-note&lt;/code&gt; Skill，如果希望 Claude Code、Qoder、Cline、Kiro 都能发现，最直接的做法往往是复制四份：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.claude/skills/release-note/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.qoder/skills/release-note/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.cline/skills/release-note/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.kiro/skills/release-note/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;刚开始只有一个 Skill 的时候没有感觉。后面一旦改了脚本、补了参考资料，或者调整触发描述，就很容易漏改其中一份。更麻烦的是，用户级 Skill 和项目级 Skill 又是两套目录，久而久之根本不知道哪一份才是“最新的”。&lt;/p&gt;
&lt;p&gt;所以我写了一个很小的脚本原型：不发明新的 Skill 格式，也不检查 &lt;code&gt;SKILL.md&lt;/code&gt; 内容，只做一件事——&lt;strong&gt;把自己的 Skills 集中放好，再让不同工具能找到它们。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;完整脚本：&lt;a class="link" href="https://tutuge.me/assets/2026/08/12/agent-skills-manager/agent-skills-manager.sh" &gt;agent-skills-manager.sh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;GitHub：仓库准备中，后续会补在这里。&lt;/p&gt;
&lt;p&gt;&lt;img alt="以 .agents/skills 为唯一维护源，直接扫描或通过原生目录软链接让不同工具发现" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://tutuge.me/assets/2026/08/12/agent-skills-manager/skill-manager-map.png"&gt;&lt;/p&gt;
&lt;h2 id="问题目录不统一不等于格式不统一"&gt;&lt;a href="#%e9%97%ae%e9%a2%98%e7%9b%ae%e5%bd%95%e4%b8%8d%e7%bb%9f%e4%b8%80%e4%b8%8d%e7%ad%89%e4%ba%8e%e6%a0%bc%e5%bc%8f%e4%b8%8d%e7%bb%9f%e4%b8%80" class="header-anchor"&gt;&lt;/a&gt;问题：目录不统一，不等于格式不统一
&lt;/h2&gt;&lt;p&gt;现在主流工具对 &lt;code&gt;SKILL.md&lt;/code&gt; 的理解已经比较接近，不过发现目录各有一套。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;工具&lt;/th&gt;
					&lt;th&gt;用户级目录&lt;/th&gt;
					&lt;th&gt;项目级目录&lt;/th&gt;
					&lt;th&gt;是否直接扫描 &lt;code&gt;.agents/skills&lt;/code&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Claude Code&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;~/.claude/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.claude/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;官方文档未声明&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Codex&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;~/.codex/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.agents/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;当前项目环境已验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Gemini CLI&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;~/.gemini/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.gemini/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;GitHub Copilot&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;~/.copilot/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.github/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Qoder&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;~/.qoder/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.qoder/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;官方文档未声明&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Cline&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;~/.cline/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.cline/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;官方文档未声明&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Kiro&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;~/.kiro/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.kiro/skills/&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;官方文档未声明&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Windsurf / Amp / OpenCode / Roo / OpenClaw&lt;/td&gt;
					&lt;td&gt;各有原生目录&lt;/td&gt;
					&lt;td&gt;各有原生目录&lt;/td&gt;
					&lt;td&gt;是&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里不再把每个产品的差异全部展开。关键是：&lt;code&gt;.agents/skills/&lt;/code&gt; 已经成了一个很有价值的跨工具约定，但还不能替代所有原生路径。&lt;/p&gt;
&lt;p&gt;比如 Gemini CLI 明确把 &lt;code&gt;.agents/skills/&lt;/code&gt; 作为 &lt;code&gt;.gemini/skills/&lt;/code&gt; 的兼容别名；Copilot 同时接受 &lt;code&gt;.github/skills/&lt;/code&gt;、&lt;code&gt;.claude/skills/&lt;/code&gt; 和 &lt;code&gt;.agents/skills/&lt;/code&gt;；Windsurf、Amp、OpenCode、Roo Code、OpenClaw 也都支持这个共享入口。反过来，Claude Code、Qoder、Cline、Kiro 仍然应该保留原生目录适配。 &lt;a class="link" href="https://geminicli.com/docs/cli/creating-skills/" target="_blank" rel="noopener"
 &gt;Gemini CLI&lt;/a&gt; &lt;a class="link" href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/add-skills" target="_blank" rel="noopener"
 &gt;GitHub Copilot&lt;/a&gt; &lt;a class="link" href="https://docs.windsurf.com/zh/windsurf/cascade/skills" target="_blank" rel="noopener"
 &gt;Windsurf&lt;/a&gt; &lt;a class="link" href="https://ampcode.com/manual" target="_blank" rel="noopener"
 &gt;Amp&lt;/a&gt; &lt;a class="link" href="https://opencode.ai/v2/docs/skills" target="_blank" rel="noopener"
 &gt;OpenCode&lt;/a&gt; &lt;a class="link" href="https://roocodeinc.github.io/Roo-Code/features/skills/" target="_blank" rel="noopener"
 &gt;Roo Code&lt;/a&gt; &lt;a class="link" href="https://docs.openclaw.ai/skills" target="_blank" rel="noopener"
 &gt;OpenClaw&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="先确定边界这个脚本不管理-skill-内容"&gt;&lt;a href="#%e5%85%88%e7%a1%ae%e5%ae%9a%e8%be%b9%e7%95%8c%e8%bf%99%e4%b8%aa%e8%84%9a%e6%9c%ac%e4%b8%8d%e7%ae%a1%e7%90%86-skill-%e5%86%85%e5%ae%b9" class="header-anchor"&gt;&lt;/a&gt;先确定边界：这个脚本不管理 Skill 内容
&lt;/h2&gt;&lt;p&gt;一开始很容易把这个工具做成“Skill 管理平台”：解析 frontmatter、校验规范、扫描脚本安全性、做一个注册表、记录遥测数据……&lt;/p&gt;
&lt;p&gt;这些事情当然都有人在做，但不是我这次要解决的问题。&lt;/p&gt;
&lt;p&gt;这里的前提很简单：&lt;strong&gt;进入管理目录的 Skill 默认已经符合规范，也由使用者自己负责内容。&lt;/strong&gt; 脚本不读取和修改 &lt;code&gt;SKILL.md&lt;/code&gt;，自然也不对“写得好不好”“会不会触发”做判断。&lt;/p&gt;
&lt;p&gt;它只管理四类关系：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;统一来源 .agents/skills/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;目录迁移 原生目录 -&amp;gt; 统一目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;目录发现 原生目录 -&amp;gt; 软链接 -&amp;gt; 统一目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;来源同步 Git checkout -&amp;gt; git pull --ff-only
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;状态检查 已链接 / 未配置 / 冲突 / 本地有修改
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这也是它保持轻量的关键。&lt;/p&gt;
&lt;h2 id="和现有-skill-工具有什么不同"&gt;&lt;a href="#%e5%92%8c%e7%8e%b0%e6%9c%89-skill-%e5%b7%a5%e5%85%b7%e6%9c%89%e4%bb%80%e4%b9%88%e4%b8%8d%e5%90%8c" class="header-anchor"&gt;&lt;/a&gt;和现有 Skill 工具有什么不同
&lt;/h2&gt;&lt;p&gt;其实业界并不缺 Skill 安装工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.skills.sh/docs" target="_blank" rel="noopener"
 &gt;skills.sh&lt;/a&gt; 提供了发现、安装、榜单和 Skill Packs，更像一个公共目录与分发入口。&lt;/li&gt;
&lt;li&gt;GitHub CLI 的 &lt;code&gt;gh skill&lt;/code&gt; 可以搜索、预览、安装、更新和发布，并记录来源仓库、ref、tree SHA，支持指定 agent host 和版本固定。 &lt;a class="link" href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/add-skills" target="_blank" rel="noopener"
 &gt;GitHub Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.openskill.sh/docs/getting-started/introduction" target="_blank" rel="noopener"
 &gt;OpenSkill&lt;/a&gt; 则是面向多个 coding agent 的 Git 型 Skill 包管理器，覆盖发现、安装、更新和发布。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些方案并不是“太重所以不能用”。如果团队要分发公共 Skill、维护版本、管理第三方来源，它们解决的问题更完整。&lt;/p&gt;
&lt;p&gt;我这里的场景更靠前一步：本机已经有一批自己写的、或者团队仓库里已有的 Skills，只希望它们&lt;strong&gt;不再复制多份&lt;/strong&gt;，并且能在多个 AI 工具里被立即发现。为这件事情引入一个市场、中心服务或新的包格式，有点绕了。&lt;/p&gt;
&lt;p&gt;简单来说：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;需求&lt;/th&gt;
					&lt;th&gt;更合适的方案&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;发现和安装第三方 Skill&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;skills.sh&lt;/code&gt;、&lt;code&gt;gh skill&lt;/code&gt;、OpenSkill&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;发布团队公共 Skill 包&lt;/td&gt;
					&lt;td&gt;Git 仓库、&lt;code&gt;gh skill publish&lt;/code&gt;、平台能力&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;管理自己电脑和当前项目已有的目录&lt;/td&gt;
					&lt;td&gt;本文的软链接脚本&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="统一目录用户态和项目态各一份"&gt;&lt;a href="#%e7%bb%9f%e4%b8%80%e7%9b%ae%e5%bd%95%e7%94%a8%e6%88%b7%e6%80%81%e5%92%8c%e9%a1%b9%e7%9b%ae%e6%80%81%e5%90%84%e4%b8%80%e4%bb%bd" class="header-anchor"&gt;&lt;/a&gt;统一目录：用户态和项目态各一份
&lt;/h2&gt;&lt;p&gt;脚本选择下面两个目录作为唯一真实来源：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.agents/skills/ # 用户态：自己的通用工作流
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;project&amp;gt;/.agents/skills/ # 项目态：随仓库提交的团队工作流
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;项目态和用户态不要混在一起。比如发布博客、生成 changelog 这一类个人习惯，放用户态比较合适；某个仓库的发布流程、测试约定、代码审查模板，则应该放进项目态，和代码一起演进。&lt;/p&gt;
&lt;p&gt;多数支持 &lt;code&gt;.agents/skills/&lt;/code&gt; 的工具不需要额外工作，直接能扫描到。只有不扫描这个路径的宿主才创建适配链接：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;project&amp;gt;/.agents/skills/ # 唯一真实目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;project&amp;gt;/.claude/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;project&amp;gt;/.qoder/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;project&amp;gt;/.cline/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;project&amp;gt;/.kiro/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用户态也是同样的逻辑：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.agents/skills/ # 唯一真实目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.claude/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.codex/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.qoder/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.cline/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.kiro/skills -&amp;gt; ../.agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意相对路径的写法。链接文件在 &lt;code&gt;.claude/&lt;/code&gt; 内，所以项目级应该是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p .claude
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s ../.agents/skills .claude/skills
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而不是 &lt;code&gt;ln -s .agents/skills .claude/skills&lt;/code&gt;。后者会被解析为 &lt;code&gt;.claude/.agents/skills&lt;/code&gt;，路径就错了。&lt;/p&gt;
&lt;p&gt;另外也不要给所有工具无脑创建原生链接。比如 Copilot、OpenCode、Amp 同时会扫描多个兼容目录；把同一目录再链接过去，可能造成同名 Skill 被重复发现。脚本只给“没有 &lt;code&gt;.agents/skills&lt;/code&gt; 兼容入口”的工具建链接。&lt;/p&gt;
&lt;h2 id="脚本流程"&gt;&lt;a href="#%e8%84%9a%e6%9c%ac%e6%b5%81%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;脚本流程
&lt;/h2&gt;&lt;p&gt;脚本是一个单文件 Bash 工具，迁移和链接不依赖额外运行时；如果要同步 Git 来源，则需要本机有 Git。macOS/Linux 可以直接运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x agent-skills-manager.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./agent-skills-manager.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;默认在当前 Git 项目根目录工作；没有 Git 仓库时就使用当前目录。也可以用 &lt;code&gt;--root&lt;/code&gt; 明确指定项目目录。加 &lt;code&gt;--global&lt;/code&gt; 则管理 &lt;code&gt;~/.agents/skills/&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./agent-skills-manager.sh --project
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./agent-skills-manager.sh --root ~/Code/my-project
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./agent-skills-manager.sh --global
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;交互菜单目前是这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Agent Skills Manager (project)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1) Migrate existing Skills to .agents/skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2) Check tool and directory compatibility
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3) Configure or repair native Skill links
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4) Sync Git-backed shared Skill sources
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5) Show status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; q) Exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各菜单的责任刻意分得比较开：&lt;/p&gt;
&lt;h3 id="1-迁移"&gt;&lt;a href="#1-%e8%bf%81%e7%a7%bb" class="header-anchor"&gt;&lt;/a&gt;1. 迁移
&lt;/h3&gt;&lt;p&gt;迁移时只看目录，不校验里面的 &lt;code&gt;SKILL.md&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;例如项目里原来有：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.claude/skills/release-note/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.qoder/skills/api-review/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;脚本会逐个询问，确认后移动为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.agents/skills/release-note/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.agents/skills/api-review/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对应原生 &lt;code&gt;skills/&lt;/code&gt; 目录在确认已经空了以后，才会被替换为软链接。&lt;/p&gt;
&lt;p&gt;如果统一目录已经存在同名 Skill，脚本不会猜哪一份应该保留，也不会覆盖，而是报告冲突并把原目录留在原地。这个地方宁愿麻烦一点，也不能把别人本地改过的 Skill 静默丢掉。&lt;/p&gt;
&lt;h3 id="2-检查"&gt;&lt;a href="#2-%e6%a3%80%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;2. 检查
&lt;/h3&gt;&lt;p&gt;检查只做两件事：统一目录是否存在；各工具的原生目录是缺失、正确链接、错误链接，还是普通目录。&lt;/p&gt;
&lt;p&gt;它也会尝试在 PATH 里查找 &lt;code&gt;claude&lt;/code&gt;、&lt;code&gt;codex&lt;/code&gt;、&lt;code&gt;gemini&lt;/code&gt;、&lt;code&gt;qoder&lt;/code&gt;、&lt;code&gt;cline&lt;/code&gt;、&lt;code&gt;kiro-cli&lt;/code&gt;、&lt;code&gt;opencode&lt;/code&gt;、&lt;code&gt;openclaw&lt;/code&gt;。这只是一个提示，不把“命令不存在”当作兼容性结论——很多 IDE 工具并不一定提供命令行入口。&lt;/p&gt;
&lt;h3 id="3-链接"&gt;&lt;a href="#3-%e9%93%be%e6%8e%a5" class="header-anchor"&gt;&lt;/a&gt;3. 链接
&lt;/h3&gt;&lt;p&gt;链接阶段不会覆盖目标目录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;目标不存在，创建链接；&lt;/li&gt;
&lt;li&gt;已经是正确链接，跳过；&lt;/li&gt;
&lt;li&gt;是普通目录，提示先迁移；&lt;/li&gt;
&lt;li&gt;是指向别处的链接，原样保留。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样脚本可以重复执行。反复运行不会不断修改用户环境，也不会吞掉手工配置。&lt;/p&gt;
&lt;p&gt;核心实现其实没有多少东西：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 原生目录都位于 &amp;lt;scope&amp;gt;/.工具名/skills，统一回到 &amp;lt;scope&amp;gt;/.agents/skills&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;link_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../.agents/skills&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$target&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$link_value&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$target&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;真正需要多写一点的是状态判断和冲突保护，而不是 &lt;code&gt;ln -s&lt;/code&gt; 本身。&lt;/p&gt;
&lt;h3 id="4-更新"&gt;&lt;a href="#4-%e6%9b%b4%e6%96%b0" class="header-anchor"&gt;&lt;/a&gt;4. 更新
&lt;/h3&gt;&lt;p&gt;“统一目录”解决的是一处修改、到处生效；它并不等于自动知道所有 Skill 的上游版本。&lt;/p&gt;
&lt;p&gt;这个原型没有再设计一个 Manifest。当前约定很简单：如果 &lt;code&gt;.agents/skills/&lt;/code&gt; 本身是一个 Git checkout，或者它下面某个 Skill 目录本身是 Git checkout，菜单 4 会在工作区干净时执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull --ff-only
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本地有未提交修改时直接跳过，不使用 &lt;code&gt;reset&lt;/code&gt;、不覆盖。不是 Git 目录则提示“无需同步”。&lt;/p&gt;
&lt;p&gt;这已经能覆盖一个很常见的长期维护方式：把个人 Skills 或团队 Skills 放在一个 Git 仓库里，然后链接到各个工具。以后如果确实需要锁定版本、多来源依赖、安装第三方 Skill，再接入 &lt;code&gt;gh skill&lt;/code&gt; 或其他包管理工具也不晚。&lt;/p&gt;
&lt;h2 id="代码结构"&gt;&lt;a href="#%e4%bb%a3%e7%a0%81%e7%bb%93%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;代码结构
&lt;/h2&gt;&lt;p&gt;目前脚本内部按下面的层次拆分：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;agent-skills-manager.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 参数解析
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── --project
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── --global
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── --root DIRECTORY
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── --action migrate|diagnose|link|update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Provider 路径表
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── 原生发现 .agents/skills 的工具
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── 需要创建原生目录链接的工具
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 状态判断
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── missing
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── linked
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── other-link
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── directory
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── file
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 迁移与链接
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Git 同步
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── 交互菜单
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;脚本不把所有已知工具都硬编码成“必须创建目录”。Provider 表最重要的字段其实只有两个：原生路径，以及它是否已经扫描 &lt;code&gt;.agents/skills&lt;/code&gt;。以后增加新工具，只要补一条路径映射和兼容判断即可。&lt;/p&gt;
&lt;h2 id="一点限制"&gt;&lt;a href="#%e4%b8%80%e7%82%b9%e9%99%90%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;一点限制
&lt;/h2&gt;&lt;p&gt;软链接最适合本机环境。用户态目录基本没有问题，改一处立即生效。&lt;/p&gt;
&lt;p&gt;项目态则要注意 Git checkout、Windows 和云端 sandbox 对 symlink 的支持差异。如果团队环境不稳定，推荐把 &lt;code&gt;&amp;lt;project&amp;gt;/.agents/skills/&lt;/code&gt; 作为真实目录提交；在每个开发者机器上运行脚本生成原生适配链接。这样仓库本身仍然是普通文件结构，链接只属于本地运行环境。&lt;/p&gt;
&lt;p&gt;还有一点：Cursor、Aider、Continue 等工具目前主要使用 Rules、&lt;code&gt;AGENTS.md&lt;/code&gt; 或自定义命令体系，不能因为它们也能写 Markdown 就强行创建 &lt;code&gt;.cursor/skills/&lt;/code&gt;。脚本应该明确显示“不在 Skill provider 表中”，而不是创建一个看起来合理、实际上不会被发现的目录。&lt;/p&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;这套方案没有试图统一所有 AI 工具，也没有试图成为新的 Skill 平台。&lt;/p&gt;
&lt;p&gt;它只做一件很实际的事：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;一份 Skill 内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.agents/skills 作为唯一来源
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;按需生成各个工具的原生目录链接
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;一次修改，多个 AI 工具立即看到
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;对个人开发者来说，先把目录关系理顺，比先选择一个复杂的注册表更有用。等 Skills 多起来、需要分发给团队或维护第三方来源时，再把它交给 Git、&lt;code&gt;gh skill&lt;/code&gt;、skills.sh 之类的工具即可。&lt;/p&gt;
&lt;p&gt;至此，这个小脚本最核心的实现点就是这些。后面准备把脚本单独整理到 GitHub 仓库，再持续补 Provider 映射和实际使用中的兼容问题。~~~&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://agentskills.io/specification" target="_blank" rel="noopener"
 &gt;Agent Skills Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://code.claude.com/docs/en/agent-sdk/skills" target="_blank" rel="noopener"
 &gt;Claude Code Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://geminicli.com/docs/cli/creating-skills/" target="_blank" rel="noopener"
 &gt;Gemini CLI Agent Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/add-skills" target="_blank" rel="noopener"
 &gt;GitHub Copilot Agent Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.qoder.com/cli/Skills" target="_blank" rel="noopener"
 &gt;Qoder Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.cline.bot/customization/skills" target="_blank" rel="noopener"
 &gt;Cline Skills&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kiro.dev/docs/skills/" target="_blank" rel="noopener"
 &gt;Kiro Agent Skills&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>