📂 技能分类目录机制详解:以 financial-services 和 SPR 为例
一、分类目录从哪来?
Hermes 的技能分类目录有两层来源:
| 来源 | 路径 | 内容 |
|---|---|---|
| 源码自带 (Docker 镜像部署) | /opt/hermes/skills/ | 24 个类别目录,每个内含 0~N 个内置 skill 例: software-development/ 含 12 个 skill例: creative/ 含 19 个 skill |
| 运行时生成 (skill_manage 动态创建) | /opt/data/skills/ | 28 个类别目录(= 24 个部署 + 4 个动态新增) 动态新增: financial-services/、gbrain/、knowledge-management/、llama-cpp-device-none/ |
部署机制:Docker 启动时,/opt/hermes/skills/ 的 24 个类别目录被作为参考模板写入 /opt/data/skills/。但系统不限制类别的数量——任何新的 name 被传入 skill_manage(category=...) 时,如果对应的目录不存在,系统会自动创建新的类别目录。
Docker 镜像 Docker Volume(持久化)
───────────────── ──────────────────────
/opt/hermes/skills/ /opt/data/skills/
├── software-development/ ───▶ ├── software-development/
├── creative/ ├── creative/
├── autonomous-ai-agents/ ├── autonomous-ai-agents/
├── ...(20 个更多) ├── ...(全部 24 个内置)
│
│ 首次 skill_manage(category='financial-services')
│ → 目录不存在,自动创建
├── financial-services/ ← 动态新增
│ ├── fof-portfolio-report/(旧,已删除)
│ └── spr/(当前,已安装)
│
├── gbrain/ ← 动态新增
├── knowledge-management/← 动态新增
└── llama-cpp-device-none/← 动态新增
二、SPR 如何进入 financial-services/?
分几步追溯:
-
首次安装 (2026-05-27):我执行
skill_manage(action='create', category='financial-services', name='fof-portfolio-report')- 系统检查
/opt/data/skills/financial-services/→ 不存在 - 系统自动创建该目录
- skill 文件写入
financial-services/fof-portfolio-report/SKILL.md
- 系统检查
-
本次升级 (2026-05-28):我将 skill 更名
- 删除旧的
financial-services/fof-portfolio-report/整个目录 - 新建
financial-services/spr/并写入新版 SKILL.md + scripts + references - 类别目录
financial-services/已存在(由第 1 步创建),无需重建
- 删除旧的
-
注册机制:
skills_list扫描/opt/data/skills/下每个子目录 → 每个子目录是一个 category
→ 在每个 category 内,扫描含SKILL.md的子目录 → 每个是一个 skill
技能发现流程(skills_list 的实现):
/opt/data/skills/ 扫描一级子目录
├── financial-services/ → 发现 category='financial-services'
│ ├── spr/ → 发现 SKILL.md → skill name='spr'
│ └── ...其他 skill
├── software-development/
│ ├── stdd/
│ └── ...
└── ...其他 26 个类别 → 共 28 个类别
→ skills_list 返回 {financial-services: [spr, ...], software-development: [stdd, ...], ...}
三、为什么不在技能列表中看到 category 参数?
category 是 skill_manage(action='create') 的参数,通过它的值名指定新技能的归属类别。
| 参数 | 值 | 效果 |
|---|---|---|
category='financial-services' | 文件系统中的子目录名 | 如果不存在 → 创建;如果存在 → 直接使用 决定技能在 /opt/data/skills/ 下的路径 |
name='spr' | 技能的唯一标识 | 决定技能所在的子目录名 也是 Hermes 内部注册的技能名 |
content='...' | 完整的 SKILL.md 内容 | 写入 spr/SKILL.md 的文件内容 |
如果你不给 category,Hermes 会按默认规则决定存放位置(通常不传时各工具或平台的默认值可能不同),但显式指定 category 可以主动控制技能的归属类别。
四、关键结论
- financial-services/ 是运行时生成的类别目录——第一次用
skill_manage(category='financial-services')时自动创建,不是预先存在的。 - SPR 归入 financial-services/ 是因为我传了
category='financial-services'——这是一个设计决策:FOF/投资组合报告属于金融服务领域,所以选择了这个分类名。 - 类别是动态的、有机增长的——只要你用一个新的
category名创建 skill,就会多一个类别目录。系统不限制类别数量。 - 类别名只是文件系统路径——整个技能体系没有数据库,没有注册表,只是
/opt/data/skills/目录下的文件和目录结构。