1
0

完成一个简易的全局skill、command管理器

This commit is contained in:
2026-02-25 14:33:56 +08:00
parent f4cb809f9d
commit 2d327b5af8
60 changed files with 6053 additions and 1 deletions

View File

@@ -0,0 +1,153 @@
## ADDED Requirements
### Requirement: 测试必须不污染用户环境
工具的所有测试必须通过环境变量隔离配置和安装目录,不影响用户的实际数据和系统配置。
#### Scenario: 配置目录隔离
- **WHEN** 测试运行时设置 `SKILLMGR_TEST_ROOT` 环境变量
- **THEN** 系统使用该环境变量指定的目录作为配置根目录,而非 `~/.skillmgr/`
#### Scenario: 安装目标目录隔离
- **WHEN** 测试运行时设置 `SKILLMGR_TEST_BASE` 环境变量
- **THEN** 系统使用该环境变量指定的目录作为全局/项目基础路径,而非用户主目录或当前工作目录
#### Scenario: 生产模式不受影响
- **WHEN** 环境变量未设置(生产模式)
- **THEN** 系统使用默认路径(`~/.skillmgr/``~/.claude/` 等)
---
### Requirement: 测试必须自动清理临时资源
所有测试创建的临时目录、文件和 git 仓库必须在测试结束后自动清理,不留垃圾文件。
#### Scenario: 使用 Go 测试框架自动清理
- **WHEN** 测试使用 `t.TempDir()` 创建临时目录
- **THEN** Go 测试框架在测试结束时自动删除该目录及其所有内容
#### Scenario: 测试失败时也清理
- **WHEN** 测试失败或 panic
- **THEN** 临时资源仍然被自动清理
---
### Requirement: 测试必须支持并行执行
测试设计必须允许多个测试并行运行,互不干扰,充分利用多核性能。
#### Scenario: 独立测试环境
- **WHEN** 使用 `go test -parallel N` 并行运行多个测试
- **THEN** 每个测试使用独立的临时目录,不产生竞态条件
#### Scenario: 配置隔离
- **WHEN** 多个测试同时设置环境变量
- **THEN** 每个测试的环境变量设置独立生效(通过 t.Setenv 或 defer os.Unsetenv
---
### Requirement: 用户交互必须可 mock
所有涉及用户输入的功能必须支持测试时注入 mock 输入,不依赖真实的标准输入。
#### Scenario: Mock 用户确认输入
- **WHEN** 测试需要模拟用户输入 "y" 或 "n"
- **THEN** `prompt.ConfirmWithReader` 函数接受 `io.Reader` 参数,测试时传入 `strings.NewReader("y\n")`
#### Scenario: 生产模式使用真实输入
- **WHEN** 生产代码调用 `prompt.Confirm`
- **THEN** 内部调用 `ConfirmWithReader(message, os.Stdin)` 读取真实用户输入
---
### Requirement: 测试必须使用真实文件系统
测试应使用真实的文件系统操作和 git 命令,而非 mock以确保行为与生产一致。
#### Scenario: 真实文件复制测试
- **WHEN** 测试文件复制功能
- **THEN** 在临时目录中创建真实文件,执行复制,验证结果
#### Scenario: 真实 git 操作测试
- **WHEN** 测试 git clone/pull 功能
- **THEN** 在临时目录中初始化真实的 git 仓库,执行 git 命令
---
### Requirement: 测试数据必须可复用
测试应提供标准的 fixture 数据和辅助函数,避免每个测试重复构建测试环境。
#### Scenario: Fixture 仓库
- **WHEN** 测试需要一个标准的 skills/commands 仓库
- **THEN** 从 `testdata/fixtures/test-repo/` 复制 fixture 并初始化为 git 仓库
#### Scenario: 测试辅助函数
- **WHEN** 测试需要设置隔离环境
- **THEN** 调用 `setupTestEnv(t)` 函数自动设置环境变量和临时目录
---
### Requirement: 测试覆盖必须全面
测试必须覆盖所有核心模块、关键路径和边界条件。
#### Scenario: 单元测试覆盖
- **WHEN** 实现任何核心函数config、adapter、repo、installer
- **THEN** 必须编写对应的单元测试,覆盖正常和异常情况
#### Scenario: 集成测试覆盖
- **WHEN** 实现跨模块功能(完整安装流程)
- **THEN** 必须编写集成测试,验证端到端行为
#### Scenario: 平台兼容性测试
- **WHEN** 支持多个平台Claude Code、OpenCode
- **THEN** 每个平台都必须有独立的兼容性测试
---
### Requirement: 测试脚本必须简化运行
必须提供自动化脚本,简化测试环境设置和测试执行。
#### Scenario: 自动化测试脚本
- **WHEN** 开发者运行 `./scripts/test.sh`
- **THEN** 脚本自动设置测试环境变量、运行所有测试、清理临时资源
#### Scenario: 沙盒测试环境
- **WHEN** 开发者运行 `./scripts/sandbox.sh`
- **THEN** 脚本创建隔离的沙盒环境,允许手动测试而不影响系统
---
### Requirement: CI/CD 集成必须无缝
测试必须能在 CI/CD 环境中稳定运行,不依赖本地环境配置。
#### Scenario: GitHub Actions 集成
- **WHEN** 在 CI 中运行测试
- **THEN** 通过环境变量设置测试路径,所有测试通过且自动清理
#### Scenario: 测试失败报告
- **WHEN** 测试失败
- **THEN** CI 系统捕获失败信息、日志和覆盖率报告