本文档记录 Claude Code 如何发现 marketplace、注册插件、以及加载已安装插件的全流程,方便开发时理解 issue-flow 在 Claude Code 插件体系中的位置。
Claude Code 的插件相关文件存放在 ~/.claude/plugins/ 下:
~/.claude/plugins/
├── known_marketplaces.json # 已注册的 marketplace 列表
├── installed_plugins.json # 已安装的插件注册表
├── install-counts-cache.json # 安装计数缓存
├── blocklist.json # 插件黑名单
├── marketplaces/ # marketplace 仓库 clone 目录
│ ├── claude-plugins-official/ # 官方 marketplace(git clone)
│ └── issue-flow-marketplace/ # issue-flow marketplace(git clone)
└── cache/ # 已安装插件的运行副本
├── claude-plugins-official/
│ ├── superpowers/5.0.5/
│ ├── code-review/b664e152af57/
│ └── ...
└── issue-flow-marketplace/
└── issue-flow/1.0.0/
用户执行 /plugin marketplace add <owner>/<repo>,Claude Code 做以下操作:
- 将 GitHub 仓库 git clone 到
~/.claude/plugins/marketplaces/<marketplace-name>/ - 在仓库根目录查找
.claude-plugin/marketplace.json,解析出可用插件列表 - 将 marketplace 信息写入
known_marketplaces.json
{
"claude-plugins-official": {
"source": {
"source": "github",
"repo": "anthropics/claude-plugins-official"
},
"installLocation": "~/.claude/plugins/marketplaces/claude-plugins-official",
"lastUpdated": "2026-03-01T02:06:54.437Z"
},
"issue-flow-marketplace": {
"source": {
"source": "github",
"repo": "crazygit/issue-flow"
},
"installLocation": "~/.claude/plugins/marketplaces/issue-flow-marketplace",
"lastUpdated": "2026-04-18T00:35:10.897Z"
}
}位于仓库的 .claude-plugin/marketplace.json,声明该 marketplace 包含哪些插件:
{
"name": "issue-flow-marketplace",
"owner": { "name": "Crazygit" },
"metadata": {
"description": "Marketplace for installing the Issue-Flow Claude Code plugin.",
"version": "1.0.0"
},
"plugins": [
{
"name": "issue-flow",
"description": "Issue-driven development orchestrator with state machine workflow",
"version": "1.0.0",
"source": "./",
"author": { "name": "Crazygit" }
}
]
}关键字段:
| 字段 | 说明 |
|---|---|
plugins[].name |
插件唯一标识,安装时格式为 <name>@<marketplace-name> |
plugins[].source |
插件源码路径,相对于 marketplace.json 所在目录。"./" 表示整个仓库根目录 |
用户执行 /plugin install <name>@<marketplace-name>,Claude Code 做以下操作:
- 从对应 marketplace 的
marketplace.json中找到插件条目 - 根据
source字段定位插件源码目录 - 将该目录内容完整复制到 cache:
~/.claude/plugins/cache/<marketplace-name>/<plugin-name>/<version>/
- 在
installed_plugins.json中注册:
{
"version": 2,
"plugins": {
"issue-flow@issue-flow-marketplace": [
{
"scope": "user",
"installPath": "~/.claude/plugins/cache/issue-flow-marketplace/issue-flow/1.0.0",
"version": "1.0.0",
"installedAt": "2026-04-18T00:35:43.411Z",
"gitCommitSha": "dff28250ff7f1bf4f0e2ce239c061b008935245b"
}
]
}
}source 决定了哪些文件会被复制到 cache:
| source 值 | 效果 |
|---|---|
"./" |
整个仓库根目录内容都被复制(issue-flow 当前用法) |
"./plugins/issue-flow/" |
只复制子目录内容 |
注意:
source: "./"意味着 tests/、docs/、scripts/、.github/ 等开发文件也会被复制到 cache,虽然不影响运行,但会占用额外磁盘空间。
每次启动 Claude Code 会话时:
- 读取
installed_plugins.json,遍历所有已安装插件 - 进入每个插件的
installPath目录 - 解析
.claude-plugin/plugin.json获取组件路径 - 加载以下组件:
| 组件 | 路径模式 | 加载行为 |
|---|---|---|
| Skills | skills/*/SKILL.md |
注入到会话的可用 skill 列表 |
| Agents | agents/*.md |
注册为可用 subagent 类型 |
| Hooks | hooks/hooks.json |
注册事件钩子(tool 调用等) |
| References | skills/*/references/*.md |
作为 skill 的参考文档随 skill 加载 |
claude-plugins-official/ ← marketplace 仓库
├── README.md
├── plugins/
│ ├── superpowers/ ← 每个插件独立子目录
│ │ ├── .claude-plugin/
│ │ ├── skills/
│ │ └── ...
│ ├── feature-dev/
│ └── ...
└── external_plugins/
marketplace.json中每个插件的source指向各自的子目录marketplaces/目录看起来干净整洁- 但安装后
cache/中每个插件仍包含完整文件(包括 tests、docs 等)
issue-flow-marketplace/ ← marketplace 仓库(= 插件源码)
├── .claude-plugin/
│ ├── marketplace.json ← source: "./"
│ └── plugin.json
├── skills/
├── agents/
├── hooks/
├── tests/ ← 开发文件也被 clone 和复制
├── docs/
└── ...
source: "./"导致整个仓库被当作插件源码marketplaces/目录包含所有开发文件,看起来杂乱- 但运行时行为与 monorepo 结构完全一致