快速开始
下面创建一个仅包含一个 Skill 的最小插件,并以本地目录形式安装。1. 创建插件目录
2. 编写 manifest
推荐每个插件都声明plugin.json,至少包含 name 字段,以获得稳定的元信息(详见后文 manifest 字段):
~/my-plugin/.qoder-plugin/plugin.json:
3. 添加一个 Skill
~/my-plugin/skills/hello/SKILL.md:
4. 安装
Plugin "my-plugin@local" installed successfully. Run /plugins reload to apply. 后,重启 CLI 或在 TUI 中执行 /plugins reload,即可使用插件提供的 Skill。
插件目录结构
.qoder-plugin/plugin.json 是 Qoder 推荐的 manifest 位置;如未声明,CLI 会按约定加载并把目录名作为插件名。约定目录有则加载,无则忽略。
| 目录 / 文件 | 用途 |
|---|---|
commands/ | 注册自定义斜杠命令,结构与 ~/.qoder/commands/ 一致 |
agents/ | 注册自定义子 Agent |
skills/ | 注册 Skill,结构与 ~/.qoder/skills/ 一致 |
hooks/hooks.json | 提供 Hook 配置;使用 { "hooks": ... } 包裹格式,其中 hooks 字段的值与 settings.json 的 hooks 字段一致 |
output-styles/ | 提供自定义输出样式 |
bin/ | 插件提供的可执行文件 |
.mcp.json | 插件附带的 MCP server 声明 |
manifest 字段
plugin.json 仅 name 必填,其余字段均可省略。
| 字段 | 必填 | 说明 |
|---|---|---|
name | 是 | 插件唯一标识;不能包含空格,建议使用 kebab-case(如 my-plugin) |
version | 否 | 语义化版本号(如 1.0.0) |
description | 否 | 简短描述 |
author | 否 | 作者信息 |
homepage | 否 | 文档或主页 URL |
repository | 否 | 源码仓库 URL |
license | 否 | SPDX license 标识(如 MIT) |
keywords | 否 | 用于发现和分类的标签数组 |
进阶:manifest 还支持显式声明commands/agents/skills/hooks/outputStyles等字段,用于覆盖默认的目录约定或使用内联内容(注意 manifest 字段使用驼峰命名outputStyles,对应的约定目录仍是output-styles/)。如不显式声明,CLI 会按上一节的目录约定自动发现。
安装作用域
插件可以安装到三个作用域:| 作用域 | 说明 | 适用场景 |
|---|---|---|
user | 全局可用,对当前用户的所有项目生效(默认) | 个人常用插件 |
project | 仅在当前项目生效,配置写入项目级 settings.json,可提交 git 与团队共享 | 团队共享的项目专属插件 |
local | 仅在当前项目生效,配置写入项目级 settings.local.json,建议加到 .gitignore | 本地实验性插件 |
命令
插件相关命令位于qodercli plugins 子命令组下,别名为 plugin。
安装:plugins install
从本地目录路径安装插件:
| 参数 / 选项 | 说明 |
|---|---|
<plugin> | 本地插件目录路径(绝对路径、相对路径或 ~/... 均可) |
-s, --scope <scope> | 安装作用域:user(默认)、project、local |
/plugins reload 让变更生效。
卸载:plugins uninstall
remove / rm。
| 参数 / 选项 | 说明 |
|---|---|
<plugin> | 已安装插件名 |
-s, --scope <scope> | 卸载来源的作用域:user(默认)、project、local |
--keep-data | 保留插件的数据目录 |
启用 / 禁用:plugins enable / plugins disable
| 参数 / 选项 | 说明 |
|---|---|
<plugin> | 已安装插件名 |
-s, --scope <scope> | 写入哪个作用域;不填则自动选择 |
-a, --all | (仅 disable)一键禁用作用域内所有已启用的插件 |
settings.json 中的 enabledPlugins 字段实现。被禁用的插件不会在新会话中加载。
列出:plugins list
| 选项 | 说明 |
|---|---|
--json | 以 JSON 输出 |
-o, --output-format <format> | text 或 json(与 --json 等价) |
--plugin-dir <dirs...> | 额外扫描这些目录中的插件并合并到列表中(不会自动安装) |
校验:plugins validate
校验本地插件目录的结构是否符合约定,常用于开发期:
validate 本身不会因此失败,但 plugins install 安装本地插件时要求至少包含一个可识别的组件或资源(约定目录或 manifest 中显式声明的资源均可)。
建议:始终在.qoder-plugin/plugin.json中声明name、version等元信息。这是 Qoder 推荐的插件组织方式——否则插件在plugins list、enabledPlugins配置等位置只能用目录名作为标识,不利于跨环境识别和共享。
配置 enabledPlugins
启用 / 禁用状态保存在 settings.json 的 enabledPlugins 字段中:
- 值为
true:启用该插件 - 值为
false:显式禁用该插件
配置 key 必须与已安装的插件 ID 完全匹配(本地安装的插件 ID 形如通过name@local)。可通过plugins list查看每个插件的标识。
plugins enable / plugins disable 修改该字段比手工编辑更可靠,因为命令会处理作用域选择、依赖关系等细节。
编写插件 Hook
插件可以在hooks/hooks.json 中声明自身的 Hook。文件使用包裹格式:顶层是一个对象,其中 hooks 字段的值与 settings.json 的 hooks 字段一致:
这一点与插件提供的 Hook 在执行时会额外得到两个环境变量:settings.json不同:settings.json直接写hooks字段;插件的hooks/hooks.json需要外层多一层{ "hooks": ... }包裹。
| 环境变量 | 说明 |
|---|---|
QODER_PLUGIN_ROOT | 当前插件的安装根目录 |
QODER_PLUGIN_DATA | 当前插件的数据目录(独立于安装目录,便于跨升级保留状态) |