- 新增 `get_secure()` 和 `set_secure()` 方法,优先从环境变量或系统 keyring 读取敏感配置,`config.json` 中仅存储占位符 - 将 `save()` 方法改为使用临时文件 + `os.replace()` 的原子写入,防止进程中断导致配置文件损坏 - 在 `add_llm_provider()` 和 `get_active_llm()` 中集成安全配置读写,自动迁移旧版明文 API Key ♻️ refactor(analytics): 实现分析数据原子写 - 将 `_save_analytics()` 和 `_save_weights()` 方法改为使用临时文件 + `os.replace()` 的原子写入 - 确保在写入过程中进程被终止时,原始数据文件保持完整 ♻️ refactor(main): 增强发布功能健壮性与代码模块化 - 在 `publish_to_xhs()` 中增加发布前输入校验【标题长度、图片数量、文件存在性】并在 `finally` 块中自动清理本次生成的临时图片文件 - 为全局笔记列表缓存 `_cached_proactive_entries` 和 `_cached_my_note_entries` 引入 `threading.RLock` 保护,新增 `_set_cache()` 和 `_get_cache()` 线程安全操作函数 - 将「内容创作」Tab 的 UI 构建代码拆分至 `ui/tab_create.py` 模块,主文件通过 `build_tab()` 函数调用并组装 - 将 Gradio 应用的 CSS 和主题配置提取为模块级变量,提升可维护性 📦 build(deps): 新增 keyring 依赖 - 在 `requirements.txt` 中添加 `keyring>=24.0.0` 以支持系统凭证管理 📝 docs(openspec): 新增生产就绪审计文档 - 在 `openspec/changes/archive/2026-02-24-production-readiness-audit/` 下新增设计文档、提案、任务清单及各功能规格说明 - 将核心功能规格同步至 `openspec/specs/` 目录
24 lines
1.4 KiB
Markdown
24 lines
1.4 KiB
Markdown
## ADDED Requirements
|
|
|
|
### Requirement: 发布完成后清理本次生成的临时图片文件
|
|
`publish_to_xhs()` 函数 SHALL 在发布流程(无论成功或失败)结束后,删除本次调用写入 `_temp_publish/` 目录的 AI 生成临时图片文件。删除失败 SHALL 仅记录 WARNING 日志,不影响返回结果。
|
|
|
|
#### Scenario: 发布成功后临时文件被清理
|
|
- **WHEN** `publish_to_xhs()` 发布成功并返回成功消息
|
|
- **THEN** 本次写入的所有 `ai_N.jpg` 临时文件已从磁盘删除
|
|
|
|
#### Scenario: 发布失败后临时文件同样被清理
|
|
- **WHEN** `publish_to_xhs()` 因网络错误等原因抛出异常或返回失败消息
|
|
- **THEN** 本次写入的所有 `ai_N.jpg` 临时文件已从磁盘删除
|
|
|
|
#### Scenario: 清理失败不阻断主流程
|
|
- **WHEN** 临时文件删除时抛出 `OSError`(如文件已被其他进程占用)
|
|
- **THEN** 系统记录 WARNING 日志并继续,`publish_to_xhs()` 的返回值不受影响
|
|
|
|
### Requirement: 不清理其他会话的临时文件
|
|
发布清理逻辑 SHALL 只删除本次调用写入的文件(通过追踪写入路径列表),不执行 `_temp_publish/` 目录的全量清空。
|
|
|
|
#### Scenario: 并发发布场景下不误删其他文件
|
|
- **WHEN** 两次发布准备流程同时写入 `_temp_publish/` 目录
|
|
- **THEN** 每次清理只删除自己写入的文件,不影响另一次的文件
|