init repo

This commit is contained in:
Summer Shen
2026-03-31 09:14:32 +08:00
commit 9578366e36
34 changed files with 5200 additions and 0 deletions
@@ -0,0 +1,57 @@
## 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()` 获取