## ADDED Requirements ### Requirement: 系统必须使用临时目录进行 staging 工具必须在系统临时目录中创建 staging 区域,组装完整的目标文件树后再移动到最终位置。 #### Scenario: 创建 staging 目录 - **WHEN** 开始安装事务 - **THEN** 系统在 `/tmp/` 或 `os.TempDir()` 创建唯一的临时目录(如 `skillmgr-xxxxx/`) #### Scenario: Staging 目录结构与目标一致 - **WHEN** 在 staging 中组装文件 - **THEN** staging 目录结构必须与最终目标目录结构完全一致 --- ### Requirement: 系统必须先完整复制到 staging 工具必须将所有源文件完整复制到 staging 目录,应用平台适配规则。 #### Scenario: 复制所有文件到 staging - **WHEN** 执行 Stage 阶段 - **THEN** 系统根据平台适配器返回的文件映射,将所有文件复制到 staging #### Scenario: 复制失败回滚 - **WHEN** 复制过程中任何文件失败 - **THEN** 系统删除 staging 目录,报错终止,不影响目标目录 --- ### Requirement: 系统必须验证 staging 完整性 工具必须在提交前验证 staging 目录中的文件完整性。 #### Scenario: 验证文件数量 - **WHEN** 所有文件复制到 staging - **THEN** 系统验证 staging 中文件数量与预期映射表一致 --- ### Requirement: 系统必须原子性提交 staging 工具必须在 staging 验证通过后,将整个 staging 目录移动到目标位置。 #### Scenario: 同文件系统移动 - **WHEN** staging 和目标在同一文件系统 - **THEN** 系统使用 `os.Rename()` 原子性移动 #### Scenario: 跨文件系统复制 - **WHEN** `os.Rename()` 失败(跨文件系统) - **THEN** 系统 fallback 到递归复制 + 删除 staging #### Scenario: 覆盖已存在目录 - **WHEN** 目标目录已存在(用户已确认覆盖) - **THEN** 系统先删除目标目录,再移动 staging --- ### Requirement: 系统必须在失败时自动回滚 工具必须在任何阶段失败时,自动清理 staging 目录,不留垃圾文件。 #### Scenario: Stage 阶段失败 - **WHEN** 文件复制到 staging 失败 - **THEN** 系统删除 staging 目录,不修改目标 #### Scenario: Commit 阶段失败 - **WHEN** 移动 staging 到目标失败 - **THEN** 系统删除 staging 目录,目标目录保持原状(或已删除的状态) #### Scenario: defer 确保清理 - **WHEN** 事务对象被销毁 - **THEN** 系统使用 defer 确保 staging 目录被清理 --- ### Requirement: 系统必须提供事务接口 工具必须提供清晰的事务接口,包含 Stage、Commit、Rollback 方法。 #### Scenario: 创建事务对象 - **WHEN** 开始安装流程 - **THEN** 系统创建 Transaction 对象,包含 stagingDir、targetDir、fileMap 字段 #### Scenario: 调用 Stage 方法 - **WHEN** 调用 `transaction.Stage()` - **THEN** 系统执行文件复制到 staging #### Scenario: 调用 Commit 方法 - **WHEN** 调用 `transaction.Commit()` - **THEN** 系统将 staging 移动到目标 #### Scenario: 调用 Rollback 方法 - **WHEN** 调用 `transaction.Rollback()` - **THEN** 系统删除 staging 目录 --- ### Requirement: 系统必须确保目标目录的父目录存在 工具必须在提交前确保目标目录的父目录已创建。 #### Scenario: 创建父目录 - **WHEN** 提交 staging 到目标 - **THEN** 系统先创建目标目录的父目录(如 `~/.claude/skills/`) #### Scenario: 父目录创建失败 - **WHEN** 父目录创建失败(权限不足等) - **THEN** 系统报错,回滚 staging