- 新增 `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/` 目录
2.5 KiB
2.5 KiB
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.py和config_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-persistence:JSON 持久化原子写操作,防止文件损坏publish-input-validation:发布前内容合规校验(长度/图片数/必填项)ui-module-split:将main.pyUI 构建逻辑拆分为独立 tab 模块
Modified Capabilities
(无现有 spec,首次建立规范)
Impact
config_manager.py:save()方法改为原子写;新增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 回调签名保持不变