58 lines
2.4 KiB
Markdown
58 lines
2.4 KiB
Markdown
## 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()` 获取
|