# bootstrap-init 规范

应用启动时的集中化初始化机制，确保所有必需目录在组件初始化前创建完成。

## ADDED Requirements

### Requirement: 集中化目录初始化

系统 SHALL 在应用启动时通过 `bootstrap.EnsureDirectories()` 函数统一创建所有必需的运行时目录。

目录列表：
- 临时文件目录（从 `config.Storage.TempDir` 读取）
- 应用日志目录（从 `config.Logging.AppLog.Filename` 提取目录部分）
- 访问日志目录（从 `config.Logging.AccessLog.Filename` 提取目录部分）

#### Scenario: 成功创建所有目录

- **WHEN** 应用启动且所有目录路径可写
- **THEN** 系统创建所有必需目录，权限为 0755
- **AND** 函数返回 nil

#### Scenario: 目录已存在

- **WHEN** 应用启动且目录已存在
- **THEN** 系统跳过创建，不报错
- **AND** 函数返回 nil

#### Scenario: 配置路径为空

- **WHEN** 某个目录配置为空字符串
- **THEN** 系统跳过该目录的创建
- **AND** 不影响其他目录的创建

### Requirement: 权限降级策略

系统 SHALL 在目录创建权限不足时自动降级到系统临时目录。

#### Scenario: 权限不足时降级

- **WHEN** 创建目录因权限不足失败（os.IsPermission 为 true）
- **THEN** 系统使用 `os.TempDir()/junhong/<原目录名>` 作为降级路径
- **AND** 记录 WARN 级别日志，包含原路径和降级路径
- **AND** 函数返回降级后的路径

#### Scenario: 非权限错误

- **WHEN** 创建目录失败且不是权限问题
- **THEN** 系统返回错误，应用启动失败
- **AND** 错误信息包含目录路径和原始错误

### Requirement: 初始化顺序

系统 SHALL 确保目录初始化在所有组件初始化之前完成。

#### Scenario: 正确的初始化顺序

- **WHEN** 应用启动
- **THEN** 执行顺序为：
  1. config.Load() 加载配置
  2. bootstrap.EnsureDirectories() 创建目录
  3. logger.Init() 初始化日志
  4. 其他组件初始化

#### Scenario: 目录初始化失败

- **WHEN** `bootstrap.EnsureDirectories()` 返回错误
- **THEN** 应用立即退出，不继续初始化其他组件
- **AND** 错误信息输出到 stderr

### Requirement: 移除分散的目录创建逻辑

系统 SHALL 移除各组件中分散的目录创建代码。

#### Scenario: S3Provider 不再创建目录

- **WHEN** 初始化 S3Provider
- **THEN** 不再调用 `os.MkdirAll` 创建临时目录
- **AND** 假设目录已由 bootstrap 创建
