zhoujie d88b4e9a3b ♻️ refactor(config): 实现配置安全存储与原子写
- 新增 `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/` 目录
2026-02-24 21:53:36 +08:00

2.5 KiB
Raw Permalink Blame History

Why

当前项目已具备完整的核心功能(文案生成、图片绘制、发布队列、评论管家、数据分析),但在安全性、健壮性、可维护性上存在若干生产级隐患:配置文件明文保存 API Key、全局可变状态缺乏线程锁、临时文件无清理机制、单文件超 4400 行难以维护。这些问题会在长期运营中导致数据泄露、并发竞态或内存增长,亟需在持续迭代前统一修复。

What Changes

  • 安全加固config.json 中的 API Key 等敏感字段改用操作系统 keyring / 环境变量存储,文件中只保留非敏感配置
  • 线程安全:全局笔记缓存 (_cached_proactive_entries / _cached_my_note_entries) 及 ConfigManager 写操作加 threading.Lock
  • 临时文件清理:发布完成或失败后自动清理 _temp_publish/ 目录下的临时图片
  • 原子写文件analytics_service.pyconfig_manager.py 的 JSON 持久化改为「写临时文件 → rename」方式防止写中断导致数据损坏
  • 发布前输入校验标题长度≤20字、正文长度、图片数量1-18张在提交发布前统一校验并给出明确提示
  • 代码拆分:将 main.py 的 Gradio UI 构建与业务逻辑分离,拆分为 ui/ 目录下的多个 tab 模块,主文件只负责组装

Capabilities

New Capabilities

  • secure-config:安全配置管理——敏感字段加密/外置存储,支持环境变量覆盖
  • thread-safe-cache:线程安全的笔记列表缓存管理器,替换全局裸列表
  • temp-file-lifecycle:临时发布文件的自动生命周期管理(创建→使用→清理)
  • atomic-persistenceJSON 持久化原子写操作,防止文件损坏
  • publish-input-validation:发布前内容合规校验(长度/图片数/必填项)
  • ui-module-split:将 main.py UI 构建逻辑拆分为独立 tab 模块

Modified Capabilities

(无现有 spec首次建立规范

Impact

  • config_manager.pysave() 方法改为原子写;新增 get_secure() / set_secure() 接口
  • analytics_service.py_save_analytics() / _save_weights() 改为原子写
  • publish_queue.py:无需修改(已使用 SQLite WAL自身较健壮
  • main.py
    • 全局缓存变量引入 threading.Lock
    • publish_to_xhs() 增加校验逻辑与 temp 清理
    • UI 构建代码逐步迁移至 ui/tab_*.py
  • requirements.txt:可能新增 keyring 依赖
  • 无破坏性 API 变更:所有 Gradio 回调签名保持不变