📂 分类目录机制详解:financial-services 与 SPR

📂 技能分类目录机制详解:以 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/?

分几步追溯:

  1. 首次安装 (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
  2. 本次升级 (2026-05-28):我将 skill 更名

    • 删除旧的 financial-services/fof-portfolio-report/ 整个目录
    • 新建 financial-services/spr/ 并写入新版 SKILL.md + scripts + references
    • 类别目录 financial-services/ 已存在(由第 1 步创建),无需重建
  3. 注册机制: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 参数?

categoryskill_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/ 目录下的文件和目录结构。