MusePi

Skills

English 中文

Skills 是启动时发现的文件型能力包,并以以下形式暴露给模型:

本文档涵盖 src/extensibility/skills.tssrc/discovery/builtin.tssrc/internal-urls/skill-protocol.ts 以及 src/discovery/agents-md.ts 中的当前运行时行为。

本代码库中 skill 的含义

一个被发现的 skill 由以下内容表示:

运行时只要求 namepath 即可判定有效。但在实践中,匹配质量取决于 description 是否有意义。

必需的目录布局与对 SKILL.md 的要求

目录布局

对基于 provider 的发现(native/Claude/Codex/Agents/plugin provider)而言,skills 以 skills/ 下一层目录的形式被发现:

类似 <skills-root>/group/<skill>/SKILL.md 的嵌套模式不会被 provider loader 发现。

对于 skills.customDirectories,扫描采用同样的非递归布局(*/SKILL.md)。

Provider 发现的布局(skills/ 下非递归):

<root>/skills/
  ├─ postgres/
  │   └─ SKILL.md      ✅ 会被发现
  ├─ pdf/
  │   └─ SKILL.md      ✅ 会被发现
  └─ team/
      └─ internal/
          └─ SKILL.md  ❌ provider loader 不会发现

自定义目录扫描同样是非递归的,因此嵌套路径会被忽略,除非你将 `customDirectories` 指向那个嵌套父目录。

SKILL.md frontmatter

skill 类型支持的 frontmatter 字段:

当前的运行时行为:

发现流水线

src/extensibility/skills.ts 中的 loadSkills() 会做三轮处理:

  1. 能力 provider,通过 loadCapability("skills") 加载(managed/auto-learn provider 的 skills 在此跳过,留到第 3 轮处理)
  2. 自定义目录,通过 scanSkillsFromDir(..., { requireDescription: true }) 加载(一层目录枚举)
  3. Managed(auto-learn)skillsmusepi-managed provider)最后解析并遵循 first-wins 原则,因此任何同名的手写 skill——无论来自哪个 provider 或自定义目录——都会优先生效

skills.enabledfalse,发现结果为空。

内置 skill provider 与优先级

provider 排序先按优先级(高者胜出),并列时按注册顺序。

当前注册的 skill provider:

  1. native(priority 100)——通过 src/discovery/builtin.ts 提供 .musepi 用户/项目 skills
  2. omp-plugins(priority 90)——随扩展包一同打包的 skills/,扩展包通过 extensions:--extension/-e 或安装在 ~/.musepi/plugins/node_modules 下的插件加载
  3. claude(priority 80)
  4. priority 70 组(按注册顺序):
    • claude-plugins
    • agents
    • codex
  5. opencode(priority 55)
  6. github(priority 30)——.github/skills/<name>/SKILL.md(GitHub Agent Skills 布局,仅项目级)
  7. musepi-managed(priority 5)——位于 ~/.musepi/agent/managed-skills 下的 auto-learn skills,注册于 src/discovery/builtin.ts 且无条件参与发现(只有写入/提示受 autolearn.enabled 门控);总是让位于同名的手写 skill

去重键是 skill 名。给定名称的第一个条目胜出。

来源开关与过滤

loadSkills() 应用以下控制项:

过滤顺序为:

  1. 未被 disabledExtensions 禁用
  2. 来源已启用
  3. 未被忽略
  4. 在包含列表内(如果存在包含列表)

agents provider(.agent[s]/skills)是规范的 OMP 原生位置,拥有自己的 enableAgentsUser/enableAgentsProject 开关——禁用 Claude/Codex/Pi 不会把它一并关掉。对于没有专属开关的 provider(claude-pluginsopencodegeminigithub 等),启用逻辑回退为:只要任意一个具名来源开关处于启用状态即为启用。

冲突与重复处理

运行时使用行为

系统提示词暴露

系统提示词构建(src/system-prompt.ts)按以下方式使用发现的 skills:

hide: true 并不会禁用该 skill。被隐藏的 skills 仍会加载,并且在 skill 命令启用时仍可通过 skill://<name>/skill:<name> 访问。

Task tool subagent 会经由正常的会话创建收到本次会话发现/提供的 skills 列表;不存在针对单个 task 的 skill 固定覆盖机制。

交互式 /skill:<name> 命令

skills.enableSkillCommands 为 true,interactive mode 会为每个发现的 skill 注册一条 slash command。

/skill:<name> [args] 的行为:

没有任何 flag、mode 选择器或 frontmatter 开关可以改变这一行为——快捷键本身就是选择,与自由文本在流式期间的路由方式完全一致(Enter 见 input-controller.ts:562-568,Ctrl+Enter 见 input-controller.ts:961-966;两者都经由 #invokeSkillCommand 分发)。

skill:// URL 行为

src/internal-urls/skill-protocol.ts 支持:

skill:// URL 解析

skill://pdf
  -> <pdf-base>/SKILL.md

skill://pdf/references/tables.md
  -> <pdf-base>/references/tables.md

守卫规则:
- 拒绝绝对路径
- 拒绝 `..` 穿越
- 拒绝任何逃逸出 <pdf-base> 的解析路径

解析细节:

Content type:

缺失资源不会触发回退搜索。

Skills 与 AGENTS.md、commands、tools、hooks 的对比

Skills 与 AGENTS.md

src/discovery/agents-md.tscwd 向上遍历祖先目录来发现独立的 AGENTS.md 文件。对于位于用户 home directory 之下的仓库,它会继续向上穿越外层 workspace 目录,直到但不包含 home directory。若 home 下不存在任何仓库根,home 边界本身仍然包含在内。否则它会停在仓库根,或者在 home 之外不存在已知仓库根时停在文件系统根。隐藏 owner 目录中的文件会被跳过。

Skills 与 slash commands

Skills 与 custom tools

Skills 与 hooks

与发现逻辑绑定的实用编写指南