<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Skill on 鬼哥的空间</title><link>https://luoli523.github.io/tags/skill/</link><description>Recent content in Skill on 鬼哥的空间</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 06 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://luoli523.github.io/tags/skill/index.xml" rel="self" type="application/rss+xml"/><item><title>从 install.sh 到 Plugin —— guige-skills 的进化史</title><link>https://luoli523.github.io/p/claude-plugin-guide/</link><pubDate>Sat, 06 Jun 2026 00:00:00 +0000</pubDate><guid>https://luoli523.github.io/p/claude-plugin-guide/</guid><description>&lt;img src="https://luoli523.github.io/" alt="Featured image of post 从 install.sh 到 Plugin —— guige-skills 的进化史" /&gt;
 &lt;blockquote&gt;
 &lt;p&gt;13 个 skill、3 套平台、1 个 hook、若干个 agent —— 没有 plugin 之前，我用 80 行 bash + symlink 撑着；用了 plugin 之后，只剩一行 &lt;code&gt;/plugin install&lt;/code&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;这不是一篇&amp;quot;plugin 是什么&amp;quot;的百科文，而是一份&lt;strong&gt;从 symlink 撑场子，到三套 manifest 同步、CI 校验、hook 注册全套打通&lt;/strong&gt;的迁移记录。&lt;/p&gt;
&lt;p&gt;如果你也写了几个 skill 还在用 &lt;code&gt;cp&lt;/code&gt; 或者 &lt;code&gt;ln -s&lt;/code&gt; 凑合，这篇是给你的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="cover" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/claude-plugin-guide/cover.webp" srcset="https://luoli523.github.io/p/claude-plugin-guide/cover_hu_10cfd231ef8eb242.webp 800w, https://luoli523.github.io/p/claude-plugin-guide/cover.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="一symlink-撑了三个月"&gt;一、Symlink 撑了三个月
&lt;/h2&gt;&lt;p&gt;第一个 skill &lt;code&gt;guige-imagen&lt;/code&gt; 写完那天，我对着空的 &lt;code&gt;~/.claude/skills/&lt;/code&gt; 发了 5 分钟呆 —— 这个东西到底怎么&amp;quot;装&amp;quot;上去？&lt;/p&gt;
&lt;p&gt;翻文档之后才发现答案简单到让人想笑：&lt;strong&gt;把目录 &lt;code&gt;cp&lt;/code&gt; 过去就行&lt;/strong&gt;。Claude Code 启动的时候扫一遍 &lt;code&gt;~/.claude/skills/&lt;/code&gt;，每个子目录里有 &lt;code&gt;SKILL.md&lt;/code&gt; 的就是一个 skill。&lt;/p&gt;
&lt;p&gt;但 &lt;code&gt;cp&lt;/code&gt; 是单向的 —— 我每次改完源码都要重新 &lt;code&gt;cp&lt;/code&gt; 一次。于是很自然地换成 &lt;code&gt;ln -s&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;skill 写到第五个的时候，我开了个 &lt;code&gt;install.sh&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;# install.sh （节选）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; skill in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SKILLS_ROOT&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;/*/&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$skill&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; &lt;span class="k"&gt;for&lt;/span&gt; target in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TARGET_DIRS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;expand_path &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; mkdir -p &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;span class="line"&gt;&lt;span class="cl"&gt; ln -snf &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$skill&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;/&lt;/span&gt;&lt;span class="nv"&gt;$name&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; &lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;短短十几行，外加 &lt;code&gt;--dry-run / --cleanup / --target&lt;/code&gt; 几个选项，配合 &lt;code&gt;GUIGE_SKILLS_TARGETS&lt;/code&gt; 环境变量，撑住了三个月的本地开发。&lt;/p&gt;
&lt;p&gt;然后我开始踩坑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;坑一：换机器&lt;/strong&gt;。买了新 Mac，clone 仓库，跑 &lt;code&gt;install.sh&lt;/code&gt;，启动 Claude Code —— 一切看似正常，直到调用 &lt;code&gt;guige-imagen&lt;/code&gt; 才发现 &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; 没配，&lt;code&gt;rclone&lt;/code&gt; 没装，&lt;code&gt;yt-dlp&lt;/code&gt; 也没装。install.sh 只管 symlink，对依赖一无所知。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;坑二：分享&lt;/strong&gt;。朋友说&amp;quot;你那个生信息图的 skill 给我玩玩呗&amp;quot;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;你 clone 一下 repo，然后 &lt;code&gt;chmod +x install.sh&lt;/code&gt;，然后看一下 &lt;code&gt;--target&lt;/code&gt; 默认值对不对，然后&amp;hellip;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;朋友放弃了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;坑三：多平台&lt;/strong&gt;。Codex 出 plugin 体系的时候，我得加一个 target；之后 Anthropic Code 的 marketplace 出来，又得加一个。每多一个客户端，install.sh 就要改一遍，文档就要更一遍。&lt;/p&gt;
&lt;p&gt;直到我在某个深夜读到 Claude Code 的 marketplace 文档：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;A plugin is a self-contained directory that bundles skills, hooks, commands, and agents into a single distributable unit.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;那一瞬间我意识到 —— &lt;strong&gt;plugin 不是替代 install.sh，而是把 install.sh 干的活直接下沉到客户端里&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img alt="symlink-vs-plugin" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/claude-plugin-guide/symlink-vs-plugin.webp" srcset="https://luoli523.github.io/p/claude-plugin-guide/symlink-vs-plugin_hu_b3fcbdd3b8676c09.webp 800w, https://luoli523.github.io/p/claude-plugin-guide/symlink-vs-plugin.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="二plugin-到底是什么"&gt;二、Plugin 到底是什么
&lt;/h2&gt;&lt;p&gt;不写百科式定义，三句话讲清：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Plugin 是一个标准化的目录契约&lt;/strong&gt;。客户端按 schema 加载 &lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt;，自动发现内部的 skills、hooks、commands、agents。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;它把&amp;quot;分发&amp;quot;和&amp;quot;加载&amp;quot;解耦&lt;/strong&gt;。skill 的源码和资源不动，新增的只是几个 manifest 文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;它让仓库既是 plugin 也是 marketplace&lt;/strong&gt;。&lt;code&gt;.claude-plugin/marketplace.json&lt;/code&gt; 让任何 GitHub repo 都能被 &lt;code&gt;/plugin marketplace add&lt;/code&gt; 一键吃进去，不再需要 README 教别人 clone + chmod + symlink。&lt;/li&gt;
&lt;/ol&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;th&gt;在 guige-skills 里对应什么&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Plugin&lt;/td&gt;
 &lt;td&gt;可分发的单元&lt;/td&gt;
 &lt;td&gt;整个 repo&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Manifest&lt;/td&gt;
 &lt;td&gt;plugin 的&amp;quot;身份证&amp;quot;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Marketplace&lt;/td&gt;
 &lt;td&gt;发现层（谁有哪些 plugin）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;.claude-plugin/marketplace.json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Skill&lt;/td&gt;
 &lt;td&gt;能力单元（一个 workflow）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;skills/guige-*/SKILL.md&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Hook&lt;/td&gt;
 &lt;td&gt;生命周期回调&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;hooks/hooks.json&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Command&lt;/td&gt;
 &lt;td&gt;slash command 触发入口&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;/imagen&lt;/code&gt;、&lt;code&gt;/blog-post&lt;/code&gt; 等&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Agent&lt;/td&gt;
 &lt;td&gt;skill 内部的子任务&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;skills/&amp;lt;name&amp;gt;/agents/*.yaml&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;记住一条主线：&lt;strong&gt;plugin 是个壳，skill 是它的灵魂，hooks/commands/agents 是它的手脚&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="三guige-skills-的目录解剖"&gt;三、guige-skills 的目录解剖
&lt;/h2&gt;&lt;p&gt;这是全文密度最高的一节。先把目录树摊开：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;guige-skills/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .claude-plugin/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── plugin.json ← Claude Code plugin manifest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── marketplace.json ← 让 repo 自己变 marketplace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .codex-plugin/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── plugin.json ← Codex 专属配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .agents/plugins/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── marketplace.json ← Anthropic Code marketplace
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── hooks/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── hooks.json ← 注册生命周期钩子
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── session-start.sh ← SessionStart 时打印 skill 速查
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── skills/ ← 13 个 skill 全在这
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── guige-svg/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── scripts/ ← Python 渲染器
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── agents/ ← skill 内子 agent (YAML)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── assets/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── references/ ← skill 私有文档
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── references/ ← 跨 skill 共享（占位）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── install.sh ← 旧时代兼容入口，仍保留
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── CLAUDE.md ← 项目约定，给人也给 AI 看
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── README.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img alt="directory-tree" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/claude-plugin-guide/directory-tree.webp" srcset="https://luoli523.github.io/p/claude-plugin-guide/directory-tree_hu_abf76e2f9b2182be.webp 800w, https://luoli523.github.io/p/claude-plugin-guide/directory-tree.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;p&gt;下面逐节展开。&lt;/p&gt;
&lt;h3 id="31-claude-pluginpluginjson--身份证"&gt;3.1 &lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt; —— 身份证
&lt;/h3&gt;&lt;p&gt;整个 plugin 的&amp;quot;入口文件&amp;quot;。Claude Code 加载 plugin 的时候，第一眼看的就是它：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;guige&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Gui Ge skill set — image generation, infographics, slides, SVG diagrams, video download, X/Twitter conversion, Google Drive upload, and WeChat publishing.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;author&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Gui Ge&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/luoli523&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;homepage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/luoli523/guige-skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;license&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MIT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./skills/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;关键字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;name&lt;/code&gt;&lt;/strong&gt; —— 用户在 &lt;code&gt;/plugin install&lt;/code&gt; 时看到的标识，必须&lt;strong&gt;三套 manifest 同步&lt;/strong&gt;（下文展开）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;skills&lt;/code&gt;&lt;/strong&gt; —— 指向 skill 目录的相对路径。客户端会扫描这个目录的子目录，每个含 &lt;code&gt;SKILL.md&lt;/code&gt; 的就是一个 skill&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;version&lt;/code&gt;&lt;/strong&gt; —— 发版控制点。CI 会校验三套 manifest 的版本号一致，避免发版漂移&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-claude-pluginmarketplacejson--自己当自己的市场"&gt;3.2 &lt;code&gt;.claude-plugin/marketplace.json&lt;/code&gt; —— 自己当自己的市场
&lt;/h3&gt;&lt;p&gt;光有 plugin manifest 还不够，客户端怎么&amp;quot;发现&amp;quot;你这个 plugin？两种路径：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你把 plugin 提交到一个&lt;strong&gt;公共 marketplace&lt;/strong&gt;（比如 Anthropic 的官方 marketplace）&lt;/li&gt;
&lt;li&gt;你&lt;strong&gt;让自己的 repo 就是一个 marketplace&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;guige-skills 选了第二种：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;guige-skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;owner&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Gui Ge&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/luoli523&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;鬼哥个人 Claude Code skills 集合...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;plugins&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;guige&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Gui Ge skill set — ...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;repo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;luoli523/guige-skills&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;source.repo: &amp;quot;luoli523/guige-skills&amp;quot;&lt;/code&gt; 是核心 —— 它告诉客户端&amp;quot;这个 marketplace 里的 plugin 就住在 GitHub 的这个 repo 里&amp;quot;。&lt;/p&gt;
&lt;p&gt;别人现在只要两行命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;/plugin marketplace add luoli523/guige-skills
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/plugin install guige@guige-skills
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;就能把 13 个 skill 一次性装上。原本 install.sh 那套 clone + chmod + 调环境变量的剧本，彻底退役。&lt;/p&gt;
&lt;h3 id="33-三套-manifest-的-fan-out"&gt;3.3 三套 manifest 的 fan-out
&lt;/h3&gt;&lt;p&gt;打开 guige-skills 你会看到三个看起来差不多的目录：&lt;code&gt;.claude-plugin/&lt;/code&gt;、&lt;code&gt;.codex-plugin/&lt;/code&gt;、&lt;code&gt;.agents/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;为什么不写一套？因为不同客户端的 schema 长得&lt;strong&gt;像但不同&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt; —— Claude Code 的标准格式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.codex-plugin/plugin.json&lt;/code&gt; —— Codex 用相似 schema 但有 &lt;code&gt;interface&lt;/code&gt;、&lt;code&gt;capabilities&lt;/code&gt;、&lt;code&gt;defaultPrompt&lt;/code&gt; 等独有字段&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.agents/plugins/marketplace.json&lt;/code&gt; —— Anthropic Code 用 &lt;code&gt;policy/category&lt;/code&gt; 模型，schema 风格完全不同&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;guige-skills 的策略是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;强制不变量&lt;/strong&gt;：&lt;code&gt;name&lt;/code&gt; 和 &lt;code&gt;version&lt;/code&gt; 必须三套一致。客户端识别 plugin 靠的就是 &lt;code&gt;name&lt;/code&gt;，不一致会导致加载报错且非常难定位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;允许漂移&lt;/strong&gt;：&lt;code&gt;description&lt;/code&gt; 可以按平台调整文案 —— Claude Code 用户和 Codex 用户的语境不同，给一样的描述反而别扭。&lt;/p&gt;
&lt;p&gt;这一致性怎么保证？靠 CI。&lt;code&gt;scripts/validate.py&lt;/code&gt; 在每个 PR 上跑，校验三套 manifest 的 &lt;code&gt;name/version&lt;/code&gt; 一致，再校验每个 skill 都有 &lt;code&gt;SKILL.md&lt;/code&gt; 且 frontmatter 完整。这个细节在 commit &lt;code&gt;1ca80b9&lt;/code&gt; 里加上的，自从加了之后版本号再没出过岔子。&lt;/p&gt;
&lt;h3 id="34-hooks--会话级回调"&gt;3.4 &lt;code&gt;hooks/&lt;/code&gt; —— 会话级回调
&lt;/h3&gt;&lt;p&gt;hooks 是 plugin 最有意思的部分之一。它让 plugin 不再只是&amp;quot;能力的集合&amp;quot;，而是&amp;quot;能主动介入用户工作流&amp;quot;的存在。&lt;/p&gt;
&lt;p&gt;guige-skills 现在只挂了一个 SessionStart hook：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;SessionStart&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bash ${CLAUDE_PLUGIN_ROOT}/hooks/session-start.sh&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;对应的 shell 脚本就是一段 heredoc：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;🎨 guige skills available — 触发关键词速查:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /imagen 图片生成 (OpenAI / Google API)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /infographic 鬼哥风格信息图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /hand-write-pic 一页式手绘知识卡
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /disassembly-diagram 拆解图 / 爆炸图 / 剖面图
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /svg 可编辑 SVG 图表
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /slides 图片式幻灯片 (PPTX / PDF)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /picbook 儿童科普绘本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; /blog-post 写 Hugo 博客文章
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;效果是 —— 每次开新会话，用户立刻看到这份 skill 速查清单。&lt;/p&gt;
&lt;p&gt;两个技术点必须讲：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;${CLAUDE_PLUGIN_ROOT}&lt;/code&gt; 是 plugin 的魔法变量&lt;/strong&gt;。它指向 plugin 安装后的根目录，取代你想硬编码的 &lt;code&gt;$HOME/projects/guige-skills&lt;/code&gt;。如果你写过 install.sh 你就知道，路径硬编码是所有便携性问题的根源 —— plugin 把这个问题彻底消灭了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SessionStart 是&amp;quot;发现率&amp;quot;的低成本放大器&lt;/strong&gt;。skill 写得再好，用户记不住关键词也白搭。开会话就糊脸一份速查，关键词记不住也能扫到。&lt;/p&gt;
&lt;p&gt;除了 SessionStart，hooks 还支持 &lt;code&gt;PreToolUse / PostToolUse / Stop / UserPromptSubmit / Notification&lt;/code&gt; 等多个生命周期事件。每个都能挂载脚本，能做的事情远比&amp;quot;打印速查&amp;quot;多得多 —— 这部分我打算下一篇专门讲，包括我加过 PreToolUse 拦 &lt;code&gt;rm&lt;/code&gt; 又删掉的踩坑过程。&lt;/p&gt;
&lt;h3 id="35-skillsname--能力单元"&gt;3.5 &lt;code&gt;skills/&amp;lt;name&amp;gt;/&lt;/code&gt; —— 能力单元
&lt;/h3&gt;&lt;p&gt;skill 是 plugin 的灵魂。结构上每个 skill 就一个目录，必含 &lt;code&gt;SKILL.md&lt;/code&gt;。拿 &lt;code&gt;guige-svg&lt;/code&gt; 举例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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;skills/guige-svg/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── SKILL.md ← 必需，含 frontmatter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── scripts/ ← Python 渲染脚本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── agents/ ← skill 内部子 agent (YAML)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── references/ ← skill 私有文档/示例
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; 的 frontmatter 是 skill 的&amp;quot;出生证明&amp;quot;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;guige-svg&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Generate clean editable SVG diagrams and visual schedules from&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;structured content. Use when the user asks for SVG output, architecture&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;diagrams, flowcharts, timelines, matrices, comparison tables, visual&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;schedules, or a deterministic alternative to image generation.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意 &lt;code&gt;description&lt;/code&gt; —— 它不是&amp;quot;给人看的简介&amp;quot;，&lt;strong&gt;它是给 AI 看的触发指令&lt;/strong&gt;。AI 在判断&amp;quot;要不要调用这个 skill&amp;quot;时，比对的就是用户输入和这段 description 的语义匹配度。&lt;/p&gt;
&lt;p&gt;所以写 description 有个反直觉的原则：&lt;strong&gt;列触发场景比写功能描述更重要&lt;/strong&gt;。对比一下：&lt;/p&gt;
&lt;p&gt;❌ 反例：「Generate SVG diagrams.」（功能描述）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI 看完一脸懵：用户说&amp;quot;画个流程图&amp;quot;算不算 SVG diagram？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;✅ 正例：guige-svg 的写法&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;列出了 architecture diagrams / flowcharts / timelines / matrices 等具体类型&lt;/li&gt;
&lt;li&gt;列出了 &amp;ldquo;deterministic alternative to image generation&amp;rdquo; 这种&lt;strong&gt;反向触发条件&lt;/strong&gt;（当用户嫌图片生成不稳定时）&lt;/li&gt;
&lt;li&gt;AI 能在多个候选 skill 之间精准选中它&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后讲一条边界，是 guige-skills 在 CLAUDE.md 里写死的：&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;skill 之间不复制粘贴内容；共享资源放顶层 &lt;code&gt;references/&lt;/code&gt;。skill 间通过明确 CLI 接口调用，不读对方私有目录。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;比如 &lt;code&gt;guige-blog-post&lt;/code&gt; 要上传到 Drive，它不直接读 &lt;code&gt;guige-drive-upload/scripts/&lt;/code&gt; —— 它调用 &lt;code&gt;guige-drive-upload&lt;/code&gt; 这个 CLI 接口。这条边界感是 skill 数量能从 5 个长到 13 个&lt;strong&gt;而不互相打架&lt;/strong&gt;的前提。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="四hooks--agents--commands--三大扩展点速览"&gt;四、Hooks / Agents / Commands —— 三大扩展点速览
&lt;/h2&gt;&lt;p&gt;把 plugin 真正变强的，是这三个机制。这一节先各给一个最小用例，下篇细讲。&lt;/p&gt;
&lt;p&gt;&lt;img alt="extensions" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/claude-plugin-guide/extensions-map.webp" srcset="https://luoli523.github.io/p/claude-plugin-guide/extensions-map_hu_581b79e0bab4fe87.webp 800w, https://luoli523.github.io/p/claude-plugin-guide/extensions-map.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;h3 id="hooks--把脚本挂到生命周期"&gt;Hooks —— 把脚本挂到生命周期
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;：把任意脚本注册到客户端的生命周期事件上（SessionStart、PreToolUse、PostToolUse、Stop、UserPromptSubmit 等）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;guige-skills 用例&lt;/strong&gt;：SessionStart 打印 skill 速查清单（上一节已展示）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;何时该用&lt;/strong&gt;：当你想做的不是&amp;quot;提供一个能力&amp;quot;而是&amp;quot;在某个时刻自动介入&amp;quot;。例如：会话开始时注入项目上下文、工具调用前做安全检查、agent 完成后自动 commit。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;下一篇专讲 hooks：为什么我给所有会话都加了 SessionStart 提示、又为什么删掉了 PreToolUse 的 &lt;code&gt;rm&lt;/code&gt; guard、以及 hooks 在 plugin 场景下真正适合干什么。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="agents--skill-内部的子任务"&gt;Agents —— skill 内部的子任务
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;：在 &lt;code&gt;skills/&amp;lt;name&amp;gt;/agents/&lt;/code&gt; 下放 YAML 文件，定义一个&lt;strong&gt;专门角色&lt;/strong&gt;的子 agent，让 skill 内部能 fan-out 出复杂流程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;guige-skills 用例&lt;/strong&gt;：&lt;code&gt;guige-svg&lt;/code&gt; 有一个 spec-writer agent，专门把用户的自然语言需求转成 SVG 渲染器能消费的 JSON spec。skill 的主流程是&amp;quot;接收需求 → fan out 给 spec-writer → 拿到 spec → Python 脚本渲染 → 输出 SVG&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;何时该用&lt;/strong&gt;：当单个 skill 流程复杂、需要&amp;quot;角色分工&amp;quot;时。比如要先 research、再 outline、再 draft，三个阶段需要不同的注意力配置。&lt;/p&gt;
&lt;h3 id="commands--slash-command-触发入口"&gt;Commands —— slash command 触发入口
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;是什么&lt;/strong&gt;：用户在 Claude Code 里输入 &lt;code&gt;/&amp;lt;name&amp;gt;&lt;/code&gt; 时唤起的能力。Commands 不是单独的目录 —— &lt;strong&gt;它由 skill 的 &lt;code&gt;name&lt;/code&gt; 字段自动生成&lt;/strong&gt;。&lt;code&gt;name: guige-imagen&lt;/code&gt; → 触发词 &lt;code&gt;/imagen&lt;/code&gt;（前缀 &lt;code&gt;guige-&lt;/code&gt; 会被剥掉）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;guige-skills 用例&lt;/strong&gt;：&lt;code&gt;/imagen&lt;/code&gt;、&lt;code&gt;/blog-post&lt;/code&gt;、&lt;code&gt;/svg&lt;/code&gt;、&lt;code&gt;/picbook&lt;/code&gt; 等十几个。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;何时该用&lt;/strong&gt;：默认就用。任何 skill 都应该假定用户可能用 slash command 唤起它，所以 &lt;code&gt;name&lt;/code&gt; 要短、要好记。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="五5-步迁移从-skill-散件到-plugin"&gt;五、5 步迁移：从 skill 散件到 plugin
&lt;/h2&gt;&lt;p&gt;读到这里你可能已经在想&amp;quot;我自己那堆 skill 怎么迁&amp;quot;。给一份可直接抄的 5 步起手式。&lt;/p&gt;
&lt;p&gt;&lt;img alt="migration-steps" class="gallery-image" data-flex-basis="240px" data-flex-grow="100" height="1024" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://luoli523.github.io/p/claude-plugin-guide/migration-steps.webp" srcset="https://luoli523.github.io/p/claude-plugin-guide/migration-steps_hu_a1e23366845aeb78.webp 800w, https://luoli523.github.io/p/claude-plugin-guide/migration-steps.webp 1024w" width="1024"&gt;&lt;/p&gt;
&lt;h3 id="step-1建目录"&gt;Step 1：建目录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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-plugin skills hooks
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你的 skill 已经在某个目录下了，把它们整体挪到 &lt;code&gt;skills/&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="step-2写最小-pluginjson"&gt;Step 2：写最小 plugin.json
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;.claude-plugin/plugin.json&lt;/code&gt; 的最小可用版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-plugin-name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;What this plugin does.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./skills/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;name&lt;/code&gt; 是后面所有同步约束的&amp;quot;源头&amp;quot;，想清楚再写。kebab-case，简短。&lt;/p&gt;
&lt;h3 id="step-3检查每个-skillmd-的-description"&gt;Step 3：检查每个 SKILL.md 的 description
&lt;/h3&gt;&lt;p&gt;这是迁移过程中&lt;strong&gt;最容易被忽略但最影响效果&lt;/strong&gt;的一步。&lt;/p&gt;
&lt;p&gt;打开每个 &lt;code&gt;skills/&amp;lt;name&amp;gt;/SKILL.md&lt;/code&gt;，对照下面这份检查表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; frontmatter 是否包含 &lt;code&gt;name&lt;/code&gt; 和 &lt;code&gt;description&lt;/code&gt; 两个必填字段？&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;description&lt;/code&gt; 是否列出了具体的触发场景？（不要只写&amp;quot;做什么&amp;quot;，要写&amp;quot;什么时候用&amp;quot;）&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否列出了关键词的多种表达方式？中文别名、英文别名、同义词？&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; 是否写明了&lt;strong&gt;反触发条件&lt;/strong&gt;？比如&amp;quot;当用户需要 X 时&lt;strong&gt;不要&lt;/strong&gt;用这个 skill，应该用 Y&amp;quot;？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;guige-skills 里 description 平均 80-150 字。别心疼字数 —— &lt;strong&gt;这段话是你能给 AI 留下的唯一指令&lt;/strong&gt;，写得短了就等于不存在。&lt;/p&gt;
&lt;h3 id="step-4加-marketplacejson让-repo-变市场"&gt;Step 4：加 marketplace.json，让 repo 变市场
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;.claude-plugin/marketplace.json&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-marketplace-name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;owner&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Your Name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://github.com/you&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;metadata&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;plugins&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;your-plugin-name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;What this plugin does.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;repo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;you/your-repo&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意 &lt;code&gt;plugins[].name&lt;/code&gt; 要和 &lt;code&gt;plugin.json&lt;/code&gt; 里的 &lt;code&gt;name&lt;/code&gt; &lt;strong&gt;完全一致&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;提交、push、完事。别人现在能 &lt;code&gt;/plugin marketplace add you/your-repo&lt;/code&gt;，再 &lt;code&gt;/plugin install your-plugin-name@your-marketplace-name&lt;/code&gt; 直接用。&lt;/p&gt;
&lt;h3 id="step-5可选但强烈推荐加-hooks--ci-校验"&gt;Step 5：（可选但强烈推荐）加 hooks + CI 校验
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;SessionStart hook 的最小版本&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hooks/hooks.json&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;SessionStart&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bash ${CLAUDE_PLUGIN_ROOT}/hooks/welcome.sh&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;hooks/welcome.sh&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&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="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;🔌 your-plugin loaded — try /skill-1, /skill-2, /skill-3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;就这么 5 行，但效果立竿见影。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI 校验&lt;/strong&gt;：写一个 &lt;code&gt;scripts/validate.py&lt;/code&gt;，校验：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;三套 manifest（如果你做了多平台）的 &lt;code&gt;name&lt;/code&gt; 和 &lt;code&gt;version&lt;/code&gt; 一致&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skills/&lt;/code&gt; 下每个目录都有 &lt;code&gt;SKILL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;每个 &lt;code&gt;SKILL.md&lt;/code&gt; 的 frontmatter 含 &lt;code&gt;name&lt;/code&gt; + &lt;code&gt;description&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;每个 &lt;code&gt;name&lt;/code&gt; 唯一（避免重名冲突）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;挂到 GitHub Actions 上，PR 时自动跑。一次配置永久受益。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="我踩过的坑一句话一条"&gt;我踩过的坑（一句话一条）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;路径千万&lt;strong&gt;别&lt;/strong&gt;硬编码 —— 全部用 &lt;code&gt;${CLAUDE_PLUGIN_ROOT}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;三套 manifest 的 &lt;code&gt;name&lt;/code&gt; 不一致 → 客户端加载报错，且报错信息极度不友好&lt;/li&gt;
&lt;li&gt;&lt;code&gt;description&lt;/code&gt; 写得太抽象 → AI 永远不会触发你的 skill，等于不存在&lt;/li&gt;
&lt;li&gt;skill 之间&lt;strong&gt;互相 import&lt;/strong&gt; 私有目录 → 一次重构所有 skill 陪葬&lt;/li&gt;
&lt;li&gt;把生成物（图片、PDF）放到 skill 目录下 → &lt;code&gt;git status&lt;/code&gt; 永远是脏的，记得加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="六takeaway"&gt;六、Takeaway
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Skill 解决&amp;quot;能力&amp;quot;问题，Plugin 解决&amp;quot;分发&amp;quot;问题。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你现在已经写了 3 个以上 skill，今天就花半小时迁移 —— 换来的是 &lt;code&gt;/plugin install&lt;/code&gt; 一行命令、CI 校验、多平台分发，以及永远不用再解释「你先 clone 一下，然后 chmod，然后&amp;hellip;」。&lt;/p&gt;
&lt;p&gt;guige-skills 这一路走来，从 5 个 skill + 80 行 bash，到现在 13 个 skill + 三套 plugin manifest + CI 校验 + hooks 注入，&lt;strong&gt;真正难的不是写 skill，是把它们组织成一个可以被别人一行命令吃下去的产物&lt;/strong&gt;。Plugin 就是那个&amp;quot;产物&amp;quot;的标准答案。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;下一篇：Hooks 深度玩法&lt;/strong&gt;。我会写为什么所有会话都该加 SessionStart 提示、PreToolUse 拦 &lt;code&gt;rm&lt;/code&gt; 这种 guard 为什么我加了又删、UserPromptSubmit 能不能做&amp;quot;输入预处理&amp;quot;、以及 hooks 在 plugin 化场景里真正适合干什么。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="参考资料"&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/luoli523/guige-skills" target="_blank" rel="noopener"
 &gt;guige-skills 仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/plugins" target="_blank" rel="noopener"
 &gt;Claude Code Plugin 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.claude.com/en/docs/claude-code/plugin-marketplaces" target="_blank" rel="noopener"
 &gt;Anthropic Plugin Marketplaces&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>