## ADDED Requirements ### Requirement: SKILL 目录扫描 系统 SHALL 能够扫描指定目录,自动发现并加载所有 SKILL.md 文件。 #### Scenario: 扫描包含多个 SKILL 的目录 - **WHEN** 指定一个包含 3 个子目录、每个子目录有一个 SKILL.md 文件的目录路径 - **THEN** 系统返回 3 个 Skill 实例的列表 #### Scenario: 扫描空目录 - **WHEN** 指定一个不包含任何 SKILL.md 文件的目录路径 - **THEN** 系统返回空列表,不抛出异常 #### Scenario: 扫描不存在的目录 - **WHEN** 指定一个不存在的目录路径 - **THEN** 系统抛出 `FileNotFoundError` 异常 #### Scenario: 跳过无效的 SKILL 文件 - **WHEN** 目录中包含 2 个有效 SKILL.md 和 1 个格式错误的 SKILL.md - **THEN** 系统返回 2 个有效 Skill 实例,并通过日志记录无效文件的错误信息 ### Requirement: SKILL 注册表 系统 SHALL 提供一个 SkillRegistry 类,用于管理已注册的 SKILL 实例。 #### Scenario: 注册 SKILL - **WHEN** 调用 `registry.register(skill)` 注册一个 Skill 实例 - **THEN** 该 Skill 被存储在注册表中,可通过 `registry.get(skill.name)` 获取 #### Scenario: 注册同名 SKILL 覆盖 - **WHEN** 先后注册两个 `name` 相同但 `body` 不同的 Skill - **THEN** 注册表中保留后注册的 Skill,前一个被覆盖 #### Scenario: 注销 SKILL - **WHEN** 调用 `registry.unregister("skill-name")` - **THEN** 该 SKILL 从注册表中移除,`registry.get("skill-name")` 返回 None #### Scenario: 注销不存在的 SKILL - **WHEN** 调用 `registry.unregister("nonexistent")` - **THEN** 不抛出异常,静默忽略 ### Requirement: 列出所有已注册 SKILL 系统 SHALL 提供查询所有已注册 SKILL 的能力。 #### Scenario: 列出所有 SKILL - **WHEN** 注册了 3 个 SKILL 后调用 `registry.list_skills()` - **THEN** 返回包含 3 个 Skill 实例的列表 #### Scenario: 空注册表列出 SKILL - **WHEN** 未注册任何 SKILL 时调用 `registry.list_skills()` - **THEN** 返回空列表 ### Requirement: 从目录批量加载到注册表 系统 SHALL 提供一个便捷方法,将目录扫描和注册合并为一步操作。 #### Scenario: 从目录加载所有 SKILL - **WHEN** 调用 `registry.load_from_directory(path)` 传入包含 3 个有效 SKILL.md 的目录 - **THEN** 注册表中包含 3 个 SKILL,可通过 `registry.list_skills()` 获取