Skill 发现与名称冲突
核对扩展注册名、启用和禁用设置、覆盖优先级与参数文件碰撞。
同一份 Skill 在磁盘上的作者名称和运行时注册名可能不同。设置、斜杠调用和模型调用都需要考虑这个区别。
扩展注册名
扩展清单 qwen-extension.json 中的 name 会成为前缀。例如 rust 扩展提供名为 pdf 的 Skill,运行时注册为 rust:pdf,调用方式是:
/rust:pdf裸名 /pdf 不是别名。文件内仍保留作者写的 name,加载时才加前缀;不要通过拆冒号猜原始名称,因为作者自己也可以使用冒号。不同扩展提供同名 pdf 时会保留各自的注册名。
面板和补全标签会显示扩展所有者,优先采用 displayName,否则采用 name。已安装且启用的扩展会自动发现 Skills;可在扩展清单中检查 skills 字段。
设置如何匹配
| 设置 | 对扩展 Skill 的匹配方式 |
|---|---|
skills.disabled | 作者裸名或完整注册名都可限制 |
skills.defaultDisabled | 作者裸名或完整注册名都可限制 |
slashCommands.disabled | 作者裸名或完整注册名都可限制斜杠入口 |
skills.enabled | 授权匹配完整注册名 |
例如显式选择该扩展能力:
{
"skills": {
"enabled": ["rust:pdf"]
}
}旧 disabled: ["pdf"] 仍会限制它,不能只在面板打开 rust:pdf 就消除旧限制。面板切换只写注册名;遇到阻挡它的旧条目会锁定行并显示设置范围,工作区自身的旧条目也一样,需要修改对应文件中的列表。
旧版存在一个兼容例外:defaultDisabled: ["pdf"] 与 enabled: ["pdf"] 可以按条目本身互相抵消。抵消后取工作区保存的启用状态或扩展默认值,并不保证默认关闭的 Skill 被启用;新配置直接写完整注册名更清楚。
覆盖和命令碰撞
跨层优先级仍按完整注册名比较:项目高于个人,个人高于扩展,扩展高于内置。自己编写名为 rust:pdf 的项目 Skill 会覆盖该扩展注册项;裸名不会自动得到这种覆盖关系。
Skill 与自定义命令同名时,斜杠入口按最后加载者选择。自定义命令晚于 Skills 加载,所以 /pdf 可以运行命令,而同名 Skill 仍可供模型调用。排查时同时检查命令目录。
参数文件的名称折叠
Skill 参数文件会把名称中不属于 [A-Za-z0-9._-] 的每个字符替换成 _。rust:pdf 与 rust_pdf 都会对应 qwen-skill-args-rust_pdf.txt;café 与 caf_ 也会碰撞。
不要仅靠前缀判断参数文件一定隔离。给团队能力起名时避免这些折叠后相同的组合,尤其是冒号与下划线互换的名称。
看见列表不等于同一调用能力
向模型询问可用 Skills,只能看到模型当前发现的项目;尚未触发 paths 的 Skill 不在其中。交互式 /skills 显示可由用户调用的项目,可以包含尚未按路径激活的 Skill。ACP 与其他非交互模式中,裸 /skills 打印只读列表。
若 user-invocable: false,磁盘仍有文件,模型也可能可用,但用户选择器不显示。具体调用控制见编写 Skills。