技能加载器

📎 引用文件

本文引用的文件 - skills.py - frontmatter.py - load_skill_tool.py - skill_writer_tool.py - SKILL.md(根) - strategy-generate/SKILL.md - tushare/SKILL.md

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录:开发指南与示例

简介

本文件为 Vibe-Trading 技能系统的技术文档,聚焦“技能加载器”的架构设计与实现。内容涵盖: - 技能定义格式与元数据解析 - 动态加载、版本控制与热重载机制 - 技能与工具的集成方式及技能间协作模式 - 技能开发规范(SKILL.md、脚本编写、测试方法) - 内置技能特性与使用示例 - 自定义技能的发布与分发流程

项目结构

技能系统围绕“文档即实现”的理念构建:每个技能是一个独立目录,包含 SKILL.md(主文档)以及可选的 references/templates/examples/assets 等辅助资源。运行时通过 SkillsLoader 扫描并加载内置与用户技能,LoadSkillTool 提供按需分页与章节定位能力,Skill Writer Tools 支持创建、修补、删除与辅助文件管理。

graph TB A["SkillsLoader<br/>扫描与合并"] --> B["Skill 对象<br/>name/description/category/body/metadata"] A --> C["frontmatter 解析<br/>YAML-like 元数据"] D["LoadSkillTool<br/>分页/大纲/章节"] --> E["split_sections/find_sections<br/>标题树与路径定位"] F["Skill Writer Tools<br/>save/patch/delete/file"] --> G["~/.vibe-trading/skills/user/<skill>/"] H["内置技能目录<br/>agent/src/skills/*"] --> A I["用户技能目录<br/>USER_SKILLS_DIR"] --> A

图表来源 - skills.py:100-136 - frontmatter.py:16-48 - load_skill_tool.py:150-306 - skill_writer_tool.py:48-370

章节来源 - skills.py:1-136 - frontmatter.py:1-49 - load_skill_tool.py:1-306 - skill_writer_tool.py:1-370

核心组件

章节来源 - skills.py:22-94 - skills.py:100-189 - frontmatter.py:16-48 - load_skill_tool.py:150-306 - skill_writer_tool.py:48-370

架构总览

技能加载器采用“分层+按需”的设计: - 元数据层:frontmatter 解析出技能声明式配置(名称、版本、依赖、环境变量、MCP 命令)。 - 装载层:SkillsLoader 合并用户与内置技能,优先用户覆盖同名内置技能。 - 呈现层:LoadSkillTool 根据文档大小与头部结构智能返回“完整/大纲/章节”,并通过 offset 分页。 - 管理层:Skill Writer Tools 维护用户技能生命周期与辅助文件。

sequenceDiagram participant U as "调用方" participant LST as "LoadSkillTool" participant SL as "SkillsLoader" participant FM as "frontmatter 解析" participant FS as "split_sections/find_sections" U->>LST : 调用 load_skill(name, section?, offset?) LST->>SL : get_content(name) SL->>FM : 读取 SKILL.md 并解析 frontmatter FM-->>SL : 元数据 + 正文 SL-->>LST : XML 包裹的 skill body alt 需要章节或分页 LST->>FS : split_sections(document) FS-->>LST : 章节列表 LST->>FS : find_sections(sections, wanted) FS-->>LST : 匹配章节 LST-->>U : 返回章节/大纲/分页结果 else 直接返回完整文档 LST-->>U : 返回完整文档 end

图表来源 - load_skill_tool.py:196-306 - skills.py:166-189 - skills.py:229-386 - frontmatter.py:16-48

详细组件分析

技能定义与元数据解析

flowchart TD Start(["读取 SKILL.md"]) --> CheckFM{"是否包含 frontmatter?"} CheckFM -- 否 --> BodyOnly["返回空元数据 + 正文"] CheckFM -- 是 --> Parse["逐行解析键值对"] Parse --> ListVal{"值是否为列表?"} ListVal -- 是 --> ToList["转为列表项"] ListVal -- 否 --> BoolVal{"值为 true/false?"} BoolVal -- 是 --> ToBool["转为布尔"] BoolVal -- 否 --> KeepStr["保持字符串"] ToList --> Done["返回 {元数据, 正文}"] ToBool --> Done KeepStr --> Done BodyOnly --> Done

图表来源 - frontmatter.py:10-48

章节来源 - frontmatter.py:16-48 - SKILL.md(根):1-22

技能动态加载与覆盖策略

classDiagram class SkillsLoader { +skills_dir : Path +_user_skills_dir : Path +skills : List[Skill] +__init__(skills_dir, user_skills_dir) -_load() void +get_descriptions() str +get_content(name) str } class Skill { +name : str +description : str +category : str +body : str +dir_path : Path +metadata : Dict +load_support_file(filename) str? } SkillsLoader --> Skill : "创建/聚合"

图表来源 - skills.py:22-94 - skills.py:100-189

章节来源 - skills.py:100-189

文档大纲与章节定位

flowchart TD S["输入文档"] --> Scan["逐行扫描<br/>跳过围栏内标题"] Scan --> Headings["收集标题(level,title,start)"] Headings --> Summaries["为每个标题记录首行摘要"] Summaries --> EndCalc["计算每节结束位置(下一个同级或更浅标题)"] EndCalc --> Sections["输出 SkillSection 列表"]

图表来源 - skills.py:229-278 - skills.py:294-386

章节来源 - skills.py:229-386

技能加载工具(分页与大纲)

sequenceDiagram participant T as "LoadSkillTool" participant L as "SkillsLoader" participant P as "分页/大纲逻辑" T->>L : get_content(name) L-->>T : skill body alt 未指定 section 且可分页 T->>P : split_sections + _render_outline P-->>T : 大纲 + 起始片段 T-->>调用方 : mode=outline/document else 指定 section T->>P : find_sections(section) P-->>T : 目标章节 T-->>调用方 : mode=section (offset/next_offset) end

图表来源 - load_skill_tool.py:55-147 - load_skill_tool.py:196-306

章节来源 - load_skill_tool.py:1-306

技能管理与辅助文件

classDiagram class SaveSkillTool { +execute(**kwargs) str } class PatchSkillTool { +execute(**kwargs) str } class DeleteSkillTool { +execute(**kwargs) str } class SkillFileTool { +execute(**kwargs) str -_list_files(...) -_write_file(...) -_remove_file(...) } SaveSkillTool --> "写入 ~/.vibe-trading/skills/user/<slug>/SKILL.md" PatchSkillTool --> "用户目录或复制内置后替换" DeleteSkillTool --> "删除用户技能目录" SkillFileTool --> "受限子目录读写"

图表来源 - skill_writer_tool.py:48-370

章节来源 - skill_writer_tool.py:48-370

依赖关系分析

graph LR FM["frontmatter.py"] --> SL["skills.py"] SL --> LST["load_skill_tool.py"] SW["skill_writer_tool.py"] --> SL ROOT["agent/SKILL.md"] --> SL

图表来源 - frontmatter.py:16-48 - skills.py:100-189 - load_skill_tool.py:196-306 - skill_writer_tool.py:48-370 - SKILL.md(根):1-22

章节来源 - skills.py:100-189 - load_skill_tool.py:196-306 - skill_writer_tool.py:48-370 - SKILL.md(根):1-22

性能考量

[本节为通用指导,无需特定文件引用]

故障排查指南

章节来源 - load_skill_tool.py:227-273 - skill_writer_tool.py:143-186 - skill_writer_tool.py:270-370

结论

Vibe-Trading 的技能加载器以“文档即实现”为核心,通过轻量 frontmatter、健壮的分页与章节定位、灵活的用户覆盖机制,实现了高可用、可扩展的技能生态。配合 Skill Writer Tools,开发者可以便捷地创建、修补与管理技能,满足复杂金融研究场景的需求。

[本节为总结性内容,无需特定文件引用]

附录:开发指南与示例

SKILL.md 文件格式规范

章节来源 - frontmatter.py:16-48 - skills.py:22-94 - SKILL.md(根):1-22

脚本编写规范(以策略生成为例)

章节来源 - strategy-generate/SKILL.md:45-160 - strategy-generate/SKILL.md:196-200

测试方法

[本节为通用指导,无需特定文件引用]

内置技能特性与使用示例

章节来源 - tushare/SKILL.md:1-50 - strategy-generate/SKILL.md:7-43

自定义技能的发布与分发流程

章节来源 - skill_writer_tool.py:48-370