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

1.4 KiB

ADDED Requirements

Requirement: 内容创作 Tab 的 UI 代码迁移至独立模块

ui/tab_create.py SHALL 包含原 main.py 中「内容创作 Tab」的全部 Gradio 组件定义和事件绑定,并导出 build_tab() -> None 函数,该函数接受一个 gr.Blocks 上下文,在其中构建 Tab 内容。main.py SHALL 通过 from ui.tab_create import build_tab 调用该函数,不在主文件中保留重复的组件代码。

Scenario: main.py 正常启动并显示内容创作 Tab

  • WHEN 运行 python main.py 启动 Gradio 应用
  • THEN 内容创作 Tab 正常显示,所有组件与迁移前功能一致

Scenario: tab_create 模块可独立导入

  • WHEN 在 Python 中执行 from ui.tab_create import build_tab
  • THEN 不抛出任何导入错误,build_tab 为可调用对象

Requirement: ui/ 目录结构规范

ui/ 目录 SHALL 包含 __init__.py,每个 Tab 模块文件命名约定为 tab_<name>.py,不在 Tab 模块中直接调用全局服务初始化代码(如 ConfigManager()LLMService() 等单例初始化应由 main.py 完成并通过参数或模块级引用传入)。

Scenario: 新增 Tab 模块的标准结构

  • WHEN 开发者创建新的 ui/tab_*.py 文件
  • THEN 该文件导出 build_tab(...) 函数,且顶层不包含副作用代码(不在 import 时触发服务连接)