- 新增 unittest tests 基座,覆盖 appconfig 与 db 纯逻辑 - 增加 excel/prompts 未实现模块的契约占位测试 - 补强 config.json 对 *_token 与 *_password 的敏感字段拦截 - 更新任务看板、当前状态、API 合约和进度记录
29 KiB
29 KiB
执行进度记录
本文件是只追加的历史流水,记录任务执行过程、验证命令、阻塞点和关键决策。 当前目录、当前命令、下一个可领取任务等可覆盖快照,写入
docs/current-state.md。 历史条目里的“下一步”只代表当时判断,不作为当前任务领取依据;当前任务必须按docs/06-tasks.md的顺序与docs/current-state.md的快照执行。
职责边界
docs/06-tasks.md:任务看板,维护任务状态、依赖和验收要点。progress.md:历史流水,只追加记录每轮执行发生了什么。docs/current-state.md:当前快照,可覆盖更新仓库现实、可运行命令和下一步。
记录格式
## 【YYYY-MM-DD】T-【编号】 【任务名】
- 状态:【DONE / BLOCKED / PARTIAL】
- 变更:【修改了哪些文件或模块】
- 验证:【运行的真实命令和结果】
- 阻塞:【如有,写明原因和需要谁决策】
- 决策:【如有,记录本轮确定的关键取舍】
- 下一步:【建议下一个任务 ID 或待确认事项】
执行记录
【2026-06-25】Phase -1 单账号流程验证(建文档前)
- 状态:DONE
- 变更:新增
cdp.py、demo.py、set_title.py、set_cover.py、get_title.py、cookies.py、inspect_images.py、grab.py;本轮建立docs/全套 harness coding 文档与progress.md、AGENTS.md、CLAUDE.md。 - 验证:
- CDP 连接 Chrome(开发期经 WSL→Windows portproxy
192.168.0.224:9333→127.0.0.1:9222)成功。 cookies.py:读到 shopee.tw 标签页 50 个 Cookie(含 csrftoken)。get_title.py:读到测试商品(ITEM_ID 51100639510)标题。set_title.py:改标题后value==modelvalue==新值。set_cover.py:setFileInputFiles上传成功(张数 5→6),拖拽落点first.left-0.30*w后新图到第一位。demo.py:在 Windows 端跑通改标题 + 换封面(未提交)。- 文档:
python -m py_compile *.py通过;demo.py增加UPDATE=1提交开关并语法校验通过。
- CDP 连接 Chrome(开发期经 WSL→Windows portproxy
- 决策:
- 浏览器自动化用自研
cdp.py(websocket-client + requests),不引入 playwright/selenium。 - 必须清代理环境变量 +
suppress_origin=True+--remote-allow-origins=*,否则连不上 CDP。 - SPA 就绪用“标题框+图片 itembox+上传框”三元素存在判断,不用 load 事件。
- 封面由位置决定,用模拟鼠标拖拽到第一位;「更新」默认不点,
UPDATE=1才提交。 - 下一阶段做多账号管理 + GUI,GUI 暂定 Tkinter(待维护者确认)。
- 浏览器自动化用自研
- 下一步:从
docs/06-tasks.md领取 T-001(抽editor.py)或 T-002(accounts.json+config.py)。
【2026-06-25】决策 · 多账号隔离方案
- 状态:DONE(仅文档决策,未涉及代码)
- 变更:更新
docs/04-architecture.md(新增 3.0 多账号隔离方案决策表)、docs/02-requirements.md(功能加“生成快捷方式 P1”、决策表加“多账号隔离方式”)、docs/03-tech-stack.md(决策记录)、docs/api.md(chrome 模块加create_shortcut)、docs/06-tasks.md(新增 T-105 生成快捷方式)。 - 决策:
- 多账号隔离采用方案 B:每账号独立 user-data-dir,否决方案 A(Chrome profile)。理由:
--remote-debugging-port绑在 user-data-dir/进程上而非 profile,方案 A 无法每账号独立 CDP 端点、无法并行、串号风险高。 - 启动主路径用程序
subprocess直接带参数启动;快捷方式为可选便利,用 PowerShellWScript.Shell.CreateShortcut生成,参数须写在快捷方式「目标」字段而非「起始位置」。
- 多账号隔离采用方案 B:每账号独立 user-data-dir,否决方案 A(Chrome profile)。理由:
- 下一步:实现
chrome.py(T-102 启动器 + T-105 快捷方式),或先做 T-001/T-002 地基。
【2026-06-25】决策 · 双 Tab + 配置文件 + SQLite + Excel 批量 + 登录检测 + 导出
- 状态:DONE(仅文档决策,未涉及代码)
- 变更:系统性更新
docs/02-requirements.md(第二版功能/决策表/风险)、docs/03-tech-stack.md(config.json+SQLite+openpyxl)、docs/04-architecture.md(双 Tab 结构、4.1 config.json、4.2 SQLite schema、4.3 Excel 模板、5.x 批量与登录检测流程、第六节加登录检测事实)、docs/api.md(拆 appconfig/db/excel 模块、editor 加登录检测与 run_task)、docs/06-tasks.md(重排 Phase 0-4)、docs/routes.md(重写为双 Tab 线框)、docs/00-ai-start-here.md、docs/current-state.md。 - 决策:
- 存储拆两层:应用设置
config.json+ 业务数据 SQLitecmshopee.db,取代早期accounts.json。 - GUI 双 Tab:Tab1 Excel 批量(导入/列表/执行/导出),Tab2 账号管理(密码加密仅参考、登录检测)。
- 账号↔任务绑定以 Excel“别名”列为权威(弃文件名);未匹配略过,结束弹窗汇总。
- Excel 模板列:别名/商品id/新标题/新封面图片路径/旧标题(留档)/旧封面图片路径(留档)/更新状态(输出结果)。
- 是否提交更新由 Tab1 批次级开关控制,默认关;多账号串行、单条失败继续。
- 密码不自动登录、仅参考、加密存;人工登录 + 程序检测登录态。
- 引入 openpyxl;DB/config/用户数据目录均 gitignore。
- 存储拆两层:应用设置
- 下一步:从 Phase 0 起步(T-001 editor.py / T-002 appconfig / T-003 db.py,任选其一)。
【2026-06-25】修正 · 旧数据为程序输出 + 回写时机 + 文件锁
- 状态:DONE(仅文档修正)
- 变更:
docs/04-architecture.md(4.2 schema 注释、4.3 列性质、3.x 关键事实、5.1 流程)、docs/api.md(run_task抓旧值、update_task_result加旧数据参数、export_results→write_back回写原文件 +export_copy退路)、docs/06-tasks.md(T-303/304/305)、docs/02-requirements.md(功能行 + 决策表)。 - 决策修正:
- 「旧标题/旧封面」由“运营输入/留档”改为 程序改动前抓取的快照(输出列),用于审计/回滚。
- SQLite 逐条实时写回(每条任务处理完立即写状态+旧数据),不是批末统一写。
- Excel 回写到原文件:该 Excel 全部任务完成后,批量把旧数据+更新状态写回原 .xlsx;原文件被锁则提示关闭重试或
export_copy另存副本。SQLite 为事实来源。
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-25】扩展 · 5 Tab 流水线 + AI 生成 + 采集回写 + 首次引导
- 状态:DONE(仅文档)
- 变更:重写
docs/routes.md(5 Tab + AI生成界面)、docs/04-architecture.md(流水线/ai 模块/采集/本地图片目录/扩展 tasks schema)、docs/api.md(新增ai模块、editor 加采集 read_cover/download_cover/collect、db 拆 set_collected/generated/confirmed/applied)、docs/06-tasks.md(Phase 0-5 按 5 Tab 重排);增量更新docs/02-requirements.md、docs/03-tech-stack.md(AI 依赖待定)、docs/00-ai-start-here.md、docs/current-state.md。 - 决策:
- GUI 定为 5 Tab,工作流优先顺序:① 导入采集 ② AI生成 ③ 更新shopee ④ 账号管理 ⑤ 设置。
- 流水线五阶段:imported→collected→generated→confirmed→applied,stage 字段贯穿。
- 「采集」只读抓旧标题+下载旧封面到本地并回写 Excel;「旧数据」为程序输出(已确认)。
- 新增 AI:提示词+旧标题→新标题、提示词+旧封面→新封面(image-to-image);服务商/模型待定;产出必须人工确认才进更新。
- Excel 增
账号名输入列;输出列扩为 旧标题/旧封面/新标题/新封面/更新状态。 - 本地
images/<slug>/<item_id>_old|_new存图,路径记 DB;images/加 gitignore。 - 首次未配账号/未登录:① ③ 执行按钮禁用并提示去④。
- 待确认:AI 服务商/模型/计费/合规;密码与 AI Key 加密密钥来源。
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-25】增补 · Tab① 导入汇总栏
- 状态:DONE(文档 + 效果图)
- 变更:
docs/routes.md(Tab① 加导入汇总栏 + 说明)、docs/02-requirements.md(功能加“导入校验汇总”)、docs/api.md(import_tasks返回 stats、新增match_summary)、docs/06-tasks.md(新增 T-202b)、docs/ui/tab1-import-collect.svg(加汇总栏)。 - 决策:导入多个 Excel 后即时展示 文件数/解析行数/有效/无效/匹配(按账号细分)/未匹配,作为跑采集前的校验关口;未匹配/无效可点击在列表筛出。与执行后的“结束弹窗汇总”互补。
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-25】简化 · 去掉人工确认 + 去掉提交开关 + Tab② 左右布局
- 状态:DONE(文档;SVG 同步)
- 变更:
docs/04-architecture.md(流水线去 confirmed、schema 删 confirmed 列、config 删 commit_update_default、5.x/6.x 流程、第七/十节)、docs/api.md(删 set_confirmed、apply_task 去 commit 参数恒提交、ai 说明)、docs/routes.md(Tab② 左右布局无确认、Tab③ 去开关/改“已生成”、流程/组件)、docs/06-tasks.md(T-302/303/401/402、里程碑)、docs/02-requirements.md、docs/03-tech-stack.md、docs/00-ai-start-here.md、docs/current-state.md;SVGtab2/tab3/overview。 - 决策(用户拍板):
- 去掉人工确认:流水线 imported→collected→generated→applied(删 confirmed 阶段)。
- 去掉提交开关:③ 执行即点「更新」总是提交线上。
- Tab② 改左右布局:左 ~1/4 提示词(标题/封面),右 筛选(批次/店铺)+任务列表(店铺/商品id/旧标题/新标题),双击弹窗看新旧封面(纯查看);底部「开始生成」。
- 新标题不可编辑,直接用 AI 输出。
- 已知并接受风险:AI 标题/封面经 ③ 直接上线无核对,本地留档+回写 Excel 为唯一追溯。
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-25】AI 生成 · 并发参数 + 单按钮两段式
- 状态:DONE(文档 + SVG)
- 变更:
docs/04-architecture.md(config.json ai 段加 title_concurrency/image_concurrency/retry/resolution/jpg_quality;6.2 两段式并发流程)、docs/api.md(gen_title/gen_cover加重试/分辨率/质量、新增generate_batch并发编排、ai_config字段)、docs/routes.md(Tab② 单按钮+停止+进度、参数移⑤、⑤ 设置补参数)、docs/06-tasks.md(T-301/303/501)、docs/03-tech-stack.md(concurrent.futures 并发、Pillow 存盘);SVGtab2(单按钮+停止+进度、参数移⑤)、tab5(AI 段加 5 参数)。 - 决策(用户):
- 配置(⑤)新增:标题并发数、图片并发数、失败重试次数、分辨率、jpg 质量。
- Tab② 单个「开始生成」+「停止」;点击后先按 title_concurrency 并发生成标题,接着按 image_concurrency 并发生成图片;进度显示 标题/封面/失败。
- 每条/每张完成即写库;停止取消未开始项,可继续。并发用
concurrent.futures.ThreadPoolExecutor。
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-25】AI 生成 · 提示词管理
- 状态:DONE(文档 + SVG)
- 变更:
docs/04-architecture.md(存储加 title_prompt.txt + prompts/cover/、6.2 提示词管理与变量、目录结构)、docs/api.md(新增prompts模块:标题存取、封面模板 CRUD、render_prompt)、docs/routes.md(Tab② 左侧提示词管理说明)、docs/02-requirements.md(提示词管理功能行)、docs/06-tasks.md(T-302p)、SVGtab2(标题加保存、封面加模板下拉+图标工具栏+插入标题/预览)。 - 决策(用户):
- 标题提示词:单文件
title_prompt.txt+「保存」;启动回显。 - 封面提示词:多模板,存
prompts/cover/<名>.txt;下拉 + 图标工具栏(新建/保存/另存为/重命名/删除)+「插入标题」(=插{新标题})+「预览」。 - 变量
{旧标题}/{新标题}/{商品id}/{店铺},生成前render_prompt替换;预览=替换后查看。
- 标题提示词:单文件
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-25】更新shopee · 加批次/店铺/状态筛选
- 状态:DONE(文档 + SVG)
- 变更:
docs/routes.md(Tab③ 加筛选栏 + 「开始更新」作用于当前筛选 + 状态=失败重试说明)、docs/02-requirements.md(③ 功能行)、docs/06-tasks.md(T-401)、SVGtab3(顶部加批次/店铺/状态筛选行,表与按钮下移避让)。 - 决策(用户):③ 与 ①② 一致加筛选;店铺筛选利于逐店铺更新,状态筛选用于失败重试;「开始更新」仅作用于当前筛选结果(兼作范围控制/安全)。
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-26】AI 模型配置 · 模型清单 + 角色分配 + 分辨率/超时
- 状态:DONE(文档 + SVG)
- 变更:
docs/04-architecture.md(config.json ai 段改为 default_text/image_model + resolution + resolution_timeouts;新增 5.1bconfig/ai_models.jsonschema 含 category/api_type/connect_timeout;存储/目录/gitignore;6.2 模型选择与超时派生)、docs/api.md(appconfig 加 response_timeout、模型 CRUD/测试连接、get_model;ai 模块超时来源)、docs/02-requirements.md(⑤ 功能)、docs/03-tech-stack.md(AI 多模型行)、docs/06-tasks.md(T-501 模型管理 + T-501b 角色与参数);SVGtab5重画为模型管理(master-detail)+角色下拉+分辨率/超时+路径。 - 决策(用户 + 分析):
- 模型清单
config/ai_models.json:每模型加category(text/image)、唯一 name、api_type、connect_timeout_seconds(默认30,每模型)。 - ⑤ 设置:模型下拉 + 新增/删除/测试连接 + 详情(服务商名/类别/api_type/模型ID/网址/密钥打码);至少各一个 text+image。
- 角色:标题大模型/图片大模型下拉(按 category 过滤)→ config.json default_text/image_model。
- 分辨率下拉 512/1k/2k/4k;返回超时由 resolution_timeouts 映射自动(180/240/360/600),不单独填。
- 安全:密钥加密、打码、不入日志;
config/必须 gitignore;提醒轮换已暴露的 Key。
- 模型清单
- 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-26】整理 · 测试脚本迁入 prototypes/
- 状态:DONE
- 变更:
git mv把demo.py/set_title.py/set_cover.py/get_title.py/cookies.py/inspect_images.py/grab.py/1.py移入prototypes/;cdp.py留根目录(正式模块);新增prototypes/README.md;批量把文档里的脚本引用改为prototypes/路径(含 04/00/03/05/06/api/AGENTS、current-state);修掉config.json里残留的api_key_enc描述(密钥已移至 ai_models.json)。 - 决策:这些是已验证原型/探查脚本,逻辑待
editor.py(T-001) 移植并实测后清理;现保留为唯一已验证参照。1.py作为ai.py调用方式参考。 - 注意:
prototypes/demo.py依赖根目录cdp.py,需从项目根运行或设 PYTHONPATH。 - 下一步:Phase 0 起步(T-001/T-002/T-003)。
【2026-06-26】修正 · V1 提交策略 + 入口引用 + 版本边界
- 状态:DONE(仅文档)
- 变更:更新
AGENTS.md、CLAUDE.md、docs/00-ai-start-here.md、docs/01-vision.md、docs/02-requirements.md、docs/03-tech-stack.md、docs/04-architecture.md、docs/05-coding-rules.md、docs/06-tasks.md、docs/routes.md、docs/current-state.md、docs/README.md、docs/api.md与 UI 线框说明。 - 决策:
- ③ 更新 shopee 的提交策略统一为:点击「开始更新」后弹窗确认当前筛选范围和任务数量,用户确认后才批量更新并逐条点「更新」提交线上;取消则不执行、不改库。
- V1 不设逐条人工审核阶段,也无常驻提交开关;批量确认弹窗是提交线上前的确认边界。
- V0 = 已验证单账号原型;V1 = 当前 5 Tab + Excel + AI + SQLite 流水线;V2 = 多账号并行 / dry-run / 完整运行日志等后续能力。
- CDP 已验证事实统一引用
docs/04-architecture.md第七节。
- 下一步:继续处理剩余全栈落地缺口,如 SQLite/Excel schema、GUI 线程模型、AI 接入任务依赖。
【2026-06-26】决策 · GUI 框架改为 PySide6
- 状态:DONE(仅文档)
- 变更:更新
docs/03-tech-stack.md、docs/04-architecture.md、docs/routes.md、docs/06-tasks.md、docs/api.md、docs/00-ai-start-here.md、docs/02-requirements.md、docs/05-coding-rules.md、docs/current-state.md、docs/README.md。 - 决策:
- V1 GUI 框架固定为 PySide6(Qt for Python),不再使用 Tkinter。
- 理由:当前环境已安装 PySide6,Tkinter 不可导入;V1 需要表格、图片预览、后台任务进度、停止按钮、确认弹窗,Qt 的
QThread+ signal/slot 更适合。 - GUI 线程模型:主线程只操作 Qt widget;采集/生成/更新/回写使用
QObjectworker +QThread;worker 通过 signal 回传progress/log/row_updated/failed/finished/cancelled;worker 不直接操作 QWidget,不跨线程共享 SQLite connection。 - 新增
workers.py作为可选模块承载 PySide6 worker/QThread 编排。
- 下一步:继续处理 SQLite/Excel schema 与 AI 接入任务依赖。
【2026-06-26】补强 · 数据模型 / AI 顺序 / 测试 / SQLite 并发 / 明文敏感信息
- 状态:DONE(仅文档)
- 变更:更新
docs/04-architecture.md、docs/api.md、docs/06-tasks.md、docs/03-tech-stack.md、docs/05-coding-rules.md、docs/00-ai-start-here.md、docs/02-requirements.md、docs/current-state.md、docs/routes.md、AGENTS.md、CLAUDE.md与 UI 线框。 - 决策:
- 数据模型补强:新增
batches表;tasks增加source_file_abs/source_sheet/source_row/row_key、stage/status分离、时间戳、attempts、last_error,用于可靠回写、重试与断点续跑。 - SQLite 并发:每个 worker 独立 connection;统一
foreign_keys=ON、journal_mode=WAL、busy_timeout=5000、synchronous=NORMAL;短事务单条提交。 - AI 顺序:先做 T-005 AI 模型清单后端,再做 T-301 真实 AI 接入;T-501 只做设置页 UI。
- 测试策略:引入
tests/+ stdlibunittest基座,优先覆盖 appconfig/db/excel/prompts 纯逻辑;CDP/Shopee/真实 AI 作为集成或手动验证。 - 不做加密:密码与 AI Key 本地明文保存,文件必须 gitignore;UI 打码,日志/导出脱敏,不自动登录。
- 数据模型补强:新增
- 下一步:继续按任务看板从 Phase 0 开始实现,建议优先 T-003/T-006 或 T-001。
【2026-06-26】修正 · 任务领取规则与 tests 命令时机
- 状态:DONE(仅文档)
- 变更:更新
docs/current-state.md、docs/00-ai-start-here.md、docs/05-coding-rules.md、docs/03-tech-stack.md、docs/06-tasks.md、AGENTS.md。 - 决策:
- 任务领取规则统一为:每轮只取
docs/06-tasks.md中第一个TODO且依赖均DONE的任务;current-state.md只能展示按该规则计算出的当前任务,不能写“任选”。 - 当前下一个可领取任务修正为 T-001;T-002/T-003 虽无依赖,但排在 T-001 后,不能跳过。
tests/与python -m unittest discover -s tests由 T-006 建立;T-006 前缺少tests/不算验证失败,T-006 后纯逻辑改动必须补测并运行该命令。
- 任务领取规则统一为:每轮只取
- 下一步:按任务看板领取 T-001。
【2026-06-26】修正 · 敏感文件清单与 Excel 容错策略
- 状态:DONE(仅文档)
- 变更:更新
AGENTS.md、CLAUDE.md、docs/05-coding-rules.md、docs/06-tasks.md、docs/current-state.md、docs/api.md、docs/02-requirements.md、docs/04-architecture.md。 - 决策:
- gitignore/禁止提交清单统一为:
config.json、config/ai_models.json、cmshopee.db、chrome_user_data_dir/、images/。 current-state.md的待建数据路径补齐config/ai_models.json与images/。- Excel 导入容错定稿:必需列缺失(别名/商品id)时拒绝整个文件;单行缺值或商品id格式错误等脏数据逐行跳过,计入 invalid,不阻塞同文件其他有效行。
- gitignore/禁止提交清单统一为:
- 下一步:按任务看板领取 T-001。
【2026-06-26】决策 · 正式代码迁入 app 包
- 状态:DONE(仅文档)
- 变更:更新
AGENTS.md、docs/00-ai-start-here.md、docs/03-tech-stack.md、docs/04-architecture.md、docs/05-coding-rules.md、docs/06-tasks.md、docs/current-state.md、docs/api.md、prototypes/README.md。 - 决策:
- 正式代码统一放入
app/包,根目录只保留main.py、配置/数据目录、文档和原型目录。 cdp.py由根目录迁入app/cdp.py;包内模块优先使用相对导入,根入口使用from app.gui import main。- 新增 T-000 作为首个任务:创建
app/、迁移 CDP、补app/__main__.py和main.py,并修正prototypes/demo.py导入。 - 正式启动入口为
python main.py,开发/包入口为python -m app。
- 正式代码统一放入
- 下一步:按任务看板领取 T-000。
【2026-06-26】T-000 正式代码包结构
- 状态:DONE
- 变更:创建
app/包;将根目录cdp.py迁入app/cdp.py;新增app/__init__.py、app/__main__.py、app/gui.py占位入口、根目录main.py;修改prototypes/demo.py改为从项目根导入app.cdp;同步docs/06-tasks.md与docs/current-state.md。 - 验证:
py -3 -m compileall app main.py通过;python main.py输出 GUI 未实现提示并退出;py -3 main.py输出同样提示并退出;py -3 -m app输出同样提示并退出;py -3 -c "import prototypes.demo"通过。 - 决策:
app/gui.py只保留最小入口占位,不提前实现 PySide6 主窗口,完整 GUI 留给 T-104;app/cdp.py对requests/websocket-client改为按需导入,使包导入不依赖外部库,真正连接 CDP 时仍要求安装依赖。 - 注意:本机
python指向 Python 3.7.9 isolated,不符合项目 Python 3.10+ 要求,且python -m app不搜索当前目录;本轮用py -3(Python 3.14.4)完成包入口验证。 - 下一步:按任务看板领取 T-001。
【2026-06-26】T-001 editor 模块化
- 状态:DONE
- 变更:新增
app/editor.py,封装is_logged_in/open_product/read_title/read_cover_src/download_cover/collect/change_title/replace_cover/click_update/apply_task;app/cdp.py增加host参数,支持后续按账号端口连接;更新docs/06-tasks.md、docs/current-state.md、docs/api.md。 - 验证:
py -3 -m compileall app main.py通过。python main.py输出 GUI 未实现提示并退出。py -3 -c "import app.editor as e; ..."导入通过,apply_task可调用。- 测试商品
51100639510:open_product+read_title读到标题;change_title写回原标题后value == modelvalue == 原标题。 - 测试商品
51100639510:read_cover_src读到第一张封面 CDN 链接。 - 测试商品
51100639510:使用1_TY030.jpg执行replace_cover,上传成功并拖到第 0 位,返回ok=True;全程未点击「更新」。
- 决策:满 9 张封面的删除确认框仍未实测,
replace_cover当前返回FULL_IMAGE_SLOTS,实际删第一张流程留给 T-502。 - 注意:本轮真实页面验证使用本机
python(3.7.9,已装 requests/websocket-client)连接 CDP;项目版本要求仍为 Python 3.10+,后续开发优先用py -3并补齐依赖。 - 下一步:按任务看板领取 T-002。
【2026-06-27】T-002 appconfig 应用配置
- 状态:DONE
- 变更:新增
app/appconfig.py,实现config.json默认配置、缺失时写默认、读取/保存/合并更新、路径/端口/CDP 等待时间/AI 参数读取、按分辨率派生返回超时;同步docs/06-tasks.md、docs/current-state.md、docs/api.md。 - 配置边界:
config.json只保存应用路径、端口、AI 角色选择与生成参数;api_key/*_key/token/password等敏感字段写入时抛ConfigError,AI Key 仍留给 T-005 的config/ai_models.json。 - 验证:
py -3 -m compileall app main.py通过;临时config.json的load_config/update_config/response_timeout验证通过;尝试写入api_key返回ConfigError: config.json 不允许保存敏感字段: api_key。 - 注意:
python -m unittest discover -s tests仍等 T-006 建立测试基座后再运行。 - 下一步:按任务看板领取 T-003。
【2026-06-27】T-003 SQLite 持久化地基
- 状态:DONE
- 变更:新增
app/db.py,按架构 5.2 建立batches、accounts、tasks三张表和索引;实现connect/init_db、批次、账号、任务导入、任务筛选,以及mark_running/mark_failed/mark_skipped/set_collected/set_generated/set_applied;同步docs/06-tasks.md、docs/current-state.md、docs/api.md。 - 连接规则:
connect()设置foreign_keys=ON、journal_mode=WAL、busy_timeout=5000、synchronous=NORMAL、row_factory=sqlite3.Row;每个函数默认短事务写入并提交,worker 后续可按线程自建 connection。 - 阶段规则:失败和跳过只更新
status/last_error/attempts,stage保持最后成功阶段;成功采集/生成/应用分别推进到collected/generated/applied。 - 验证:
py -3 -m compileall app main.py通过;临时 SQLite 文件中重复init_db通过;PRAGMA 输出(1, 'wal', 5000);批次/账号/任务写入、失败状态、采集/生成/应用阶段推进验证通过。 - 注意:
python -m unittest discover -s tests仍等 T-006 建立测试基座后再运行。 - 下一步:按任务看板领取 T-004。
【2026-06-27】T-004 本地数据 gitignore
- 状态:DONE
- 变更:校准
.gitignore,明确排除config.json、config/ai_models.json、cmshopee.db、chrome_user_data_dir/、images/;保留本地测试图片与临时启动脚本忽略项;同步docs/06-tasks.md、docs/current-state.md。 - 决策:将原来的
config/整目录忽略收窄为config/ai_models.json,与文档安全红线保持一致,避免后续非敏感模板或说明文件被误隐藏。 - 验证:
git check-ignore -v -- config.json config/ai_models.json cmshopee.db chrome_user_data_dir/ images/五个路径均命中仓库.gitignore;命令同时提示全局 ignore 文件权限不可读,但不影响仓库规则生效。 - 下一步:按任务看板领取 T-005。
【2026-06-27】T-005 AI 模型清单后端
- 状态:DONE
- 变更:扩展
app/appconfig.py,实现config/ai_models.json默认清单、读写、增删改、category 过滤、展示打码、get_model明文返回、最小请求测试连接;同步docs/06-tasks.md、docs/current-state.md、docs/api.md。 - 安全边界:
list_ai_models()默认只返回打码api_key和api_key_set;只有get_model()返回明文 key 给实际调用层;所有 key 只写入 gitignored 的config/ai_models.json。 - 约束:模型
name唯一;category只允许text/image;api_type只允许chat/images_edits/auto;保存后必须至少有一个启用的 text 和一个启用的 image 模型。 - 验证:
py -3 -m compileall app main.py通过;临时ai_models.json默认写入、分类过滤、key 打码、get_model明文 key、重命名/禁用、缺少 url/model/key 的测试连接错误返回均通过;重复 name 与删除最后 image 模型均返回ConfigError。 - 注意:本轮未使用真实 API Key 发外部网络请求;真实「测试连接」需用户在本地
config/ai_models.json填入有效 url/model/api_key 后由 UI 或函数触发。 - 下一步:按任务看板领取 T-006。
【2026-06-27】T-006 单元测试基座
- 状态:DONE
- 变更:新增
tests/基座,包含_helpers.py、test_appconfig.py、test_db.py、test_module_contracts.py;覆盖config.json默认/更新/敏感字段拦截、config/ai_models.jsonCRUD/过滤/打码/约束、SQLite 初始化/PRAGMA/账号批次任务生命周期/失败状态;同步docs/06-tasks.md、docs/current-state.md、docs/api.md。 - 补强:
config.json敏感字段拦截从 exacttoken/password扩展到*_token、*_password,测试覆盖provider_token。 - 说明:
app.excel与app.prompts尚未实现,test_module_contracts.py对这两个模块做契约占位测试;当前表现为 2 个 skip,后续模块文件出现后会检查公开函数是否齐全。 - 验证:
py -3 -m compileall app main.py tests通过;py -3 -m unittest discover -s tests通过(9 tests,skipped=2);python -m unittest discover -s tests通过(9 tests,skipped=2);测试临时目录位于tests/下并已清理。 - 下一步:按任务看板领取 T-101。