Files
cmshoppe/docs/06-tasks.md
T

17 KiB
Raw Blame History

任务看板(Tasks)

把目标拆成小步、可独立交付的任务,让 AI 一步一步开发,避免一次生成整个项目。

使用规则

  1. 一次只做一个任务:每轮只领取一个 TODO 且依赖均 DONE 的任务,取最靠前的。
  2. 做完即停:完成、自测通过、改 DONE 后汇报。
  3. 不跳步:依赖未完成不开工。
  4. 完成定义:以 编码规则 验证清单为准。
  5. 动手前读 00-ai-start-here.md、05-coding-rules.md、current-state.md、04-architecture.md(尤其第七节已验证事实、第二节流水线)。
  6. 完成后同步本文状态,追加 ../progress.md,覆盖 current-state.md。

current-state.md 只记录按以上规则计算出的当前快照;如果它和本文任务顺序/状态冲突,以本文为准并先修正文档。

状态图例

TODO · DOING(同一时间最多 1 个)· DONE · BLOCKED


Phase 0 · 地基(模块化 + 存储)

ID 任务 依赖 验收要点 状态
T-000 正式代码包结构:创建 app/、迁入 cdp.py 为 app/cdp.py、新增 app/__init__.py、app/__main__.py、根入口 main.py、最小 app/gui.py 占位入口,并修正 prototypes 导入 - python -m compileall app main.py 通过;python -m app/python main.py 可进入入口(本机 python 不符合版本时用 py -3 -m app);GUI 未完成时给明确提示并退出;prototypes/demo.py 可从项目根导入 app.cdp DONE
T-001 app/editor.py:改标题/换封面/点更新/登录检测/采集(读旧标题+旧封面下载)/apply_task,复用 app/cdp.py T-000 函数可调用,在测试商品跑通;与 prototypes/demo.py 行为一致 DONE
T-002 app/appconfig.py + config.json(含 image_dir、ai 选择/参数段、端口等默认值;不含 AI Key) T-000 读写正常;不存在则写默认;AI Key 留给 config/ai_models.json/T-501 DONE
T-003 app/db.py + SQLite 建表(batches/accounts/tasks,含 Excel 行定位、状态、时间戳、重试字段) T-000 init_db 幂等;connect 设置 WAL/busy_timeout/foreign_keys;账号/批次/任务/各 set_* 可用;schema 同架构 5.2 DONE
T-004 .gitignore:排除 config.json、config/ai_models.json、cmshopee.db、chrome_user_data_dir/、images/ T-002, T-003 配置、密钥、凭证、业务数据、图片不被提交 DONE
T-005 AI 模型清单后端:config/ai_models.json 读写 + category 过滤 + 测试连接 T-002 本地明文 api_key;UI/API 打码显示;日志脱敏;至少 text/image 各一个;get_model 返回调用所需字段 DONE
T-006 单元测试基座:tests/ + appconfig/db/excel/prompts 最小测试 T-002, T-003 python -m unittest discover -s tests 可跑;不依赖真实 Shopee/AI;临时文件在测试目录清理 DONE

Phase 1 · 账号管理(④)

ID 任务 依赖 验收要点 状态
T-101 config 生成 slug + 创建 chrome_user_data_dir/<slug> T-003 别名→唯一 slug;目录按需建;路径绝对化 DONE
T-102 app/chrome.py 启动器:拼参数并启动、探测端口 T-101, T-002 含三参数;端口就绪可探测 DONE
T-103 首次登录保活 + 登录检测 is_logged_in T-102, T-001 关闭再启动免重登;登录/未登录判断准确 DONE
T-104 PySide6 五 Tab 主窗口骨架(QMainWindow + QTabWidget,5 Tab 空壳) T-002 五个 Tab 按顺序可切换;启动不阻塞;基础状态栏可用 DONE
T-104b PySide6 worker 基类与线程启动工具(BaseWorker + QThread 包装) T-104 signals: progress/log/row_updated/failed/finished/cancelled;取消标记可用;worker 不直接操作 QWidget DONE
T-105 Tab④ 账号增删改(账号名/别名/端口/密码本地明文仅参考)+ 启动登录 + 检测登录 + 顶部 Tab 栏防误点样式 T-104, T-101, T-103 增删改入库、建目录;密码字段 UI 打码;状态列刷新;不自动登录/填密码;5 个 Tab 有足够宽度/间距与当前态高亮,不易误点 DONE
T-106 可选:为账号生成桌面快捷方式 T-102 .lnk 目标含该账号参数;双击进对应账号 DONE

Phase 2 · 导入采集(①)

ID 任务 依赖 验收要点 状态
T-201 app/excel.py 导入:解析多文件输入列入库 T-003 按模板解析账号名/别名/商品id;记录 source_file_abs/source_sheet/source_row/row_key;缺必需列则拒绝整文件并记 file_errors;脏行逐行跳过计 invalid;写 batches/tasks DONE
T-202 Tab① 任务列表 + 导入按钮 + 别名匹配标记 T-201, T-105 QTableView 显示账号/别名/商品id/阶段;未匹配标“略过” DONE
T-202b Tab① 导入汇总栏 T-202 导入后显示 文件数/解析行数/有效/无效/匹配(按账号)/未匹配;未匹配可点击筛出 DONE
T-203 采集旧标题+旧封面(只读),下载图片,立即写库 T-202, T-001, T-104b 通过 worker 执行;逐条 set_collected;旧封面下载到 images/<batch_id>/<slug>/<task_id>_<item_id>_old.jpg;别名未匹配逐条略过记原因;匹配账号未登录由 T-205 预检阻断,不写 skipped/failed DONE
T-204 回写旧字段到原 Excel(含文件锁处理) T-203, T-201 excel.write_back() 按源文件/工作表/行号回写旧标题、旧封面;export_copy() 另存副本;Tab① 用 WriteBackWorker 后台回写,文件被占用时提示关闭后重试 DONE
T-204b 采集完成后自动回写旧字段到 Excel T-204 CollectWorker 完成后自动触发 excel.write_back() 回写当前批次旧字段;成功时状态栏/日志提示“已回写”;原文件被锁时不影响 SQLite,提示关闭后点「回写旧数据到 Excel」手动重试或另存副本 DONE
T-205 首次未配账号 / Chrome 未启动 / 未登录的引导保护 T-105, T-203 无账号、匹配账号未启动 CDP 端口或未登录时,① 执行按钮禁用或采集前汇总提示,并引导去④;可提供“打开账号管理/启动登录”入口,但不无提示批量启动所有账号 Chrome DONE
T-205b 采集后关闭程序自动新建的商品编辑页 tab T-203 open_product 区分复用旧 tab 与本次新建 tab;CDP.close() 仍只断开连接;采集完成后只关闭本次自动新建的商品页,不关闭用户原本打开的 tab;失败/异常也执行清理;③ 更新流程暂不自动关页,失败时保留现场便于排查 DONE
T-206 Tab① 删除指定批次(软删除) T-202, T-104, T-404 现状:导入后批次只增不减,下拉框无限膨胀、导错文件/测试导入无法清理。方案:db.delete_batch(batch_id) 改为软删除,在事务中给 batches.deleted_at/deleted_reason 写值,不物理删除 batches/tasks;默认 list_batches/list_tasks 以及①/②/③页面、筛选、采集、生成、更新、回写等业务入口都排除已删除批次,删除后用户不能在软件页面查看、筛选或再次调用该批任务。函数返回任务数、其中已上线(committed=1)任务数、关联封面图片绝对路径;Tab① 批次筛选旁加「删除批次」按钮,仅在选中具体批次(非「全部批次」)时可用,运行中禁用。二次确认弹窗显示批次标签、任务数、已上线任务数并提示「软删除只隐藏本地批次,不会回滚 Shopee 线上修改」;图片默认保留,不做自动清理,后续若需要清理图片另做独立工具。确认后软删除、刷新①/②/③列表和批次筛选 DONE
T-207 ① 采集诊断日志(run_logs + 本地 log) T-203, T-503, T-504 问题:采集少量商品时单条失败只能看到 tasks.last_error 和状态栏计数,无法定位卡在打开商品页/页面就绪/读标题/读封面/下载图片/写库/回写哪一步。方案:CollectWorker 创建 run_type=collect 的运行日志,逐任务写 run_log_events(含 task_id/alias/item_id 和 step=preflight/open_product/wait_ready/read_title/read_cover/download_cover/db_write/excel_write_back);同时新增 gitignore 的 logs/ 本地滚动日志,写脱敏 traceback 与耗时;GUI 至少能查看最近一次采集运行日志;失败仍按现有语义写 status=failed/last_error,不影响其他任务继续 DONE

Phase 3 · AI 生成(②)

ID 任务 依赖 验收要点 状态
T-301 确定 AI 服务商/模型并接入 app/ai.py(gen_title/gen_cover,带重试/分辨率/jpg质量) T-005 从 config/ai_models.json 读取模型与本地明文 Key;gen_cover 支持 resolution+jpg_quality;失败按 retry 重试;错误明确;日志脱敏 DONE
T-302 Tab② 左右布局:左提示词(标题/封面),右按批次/店铺/状态筛选 + 任务列表 T-301, T-203 左 ~1/4 提示词多行;右筛选+列表(店铺/商品id/旧标题/新标题/状态) DONE
T-302p app/prompts.py + Tab② 提示词管理 T-302 标题保存/启动回显 title_prompt.txt;封面多模板(下拉+新建/保存/另存为/重命名/删除,存 prompts/cover/);插入 {新标题};预览变量替换;render_prompt 接入生成 DONE
T-303 Tab② 开始生成(单按钮)+ 停止 + 进度:先并发标题再并发图片 T-302, T-104b generate_batch 先 title_concurrency 并发标题、再 image_concurrency 并发图片;worker/signal 回传进度;每条 set_generated 立即写库;停止可取消未开始项;进度 标题/封面/失败 计数;双击弹窗看新旧封面 DONE
T-303b ②/③ 商品ID筛选 T-303, T-401 ② AI生成和③ 更新shopee筛选栏增加商品ID输入框;输入内容按包含匹配 item_id,清空表示全部;当前筛选结果和「开始生成」/「开始更新」范围都受其约束;③确认弹窗显示商品ID筛选条件 DONE

Phase 4 · 更新 shopee(③)

ID 任务 依赖 验收要点 状态
T-401 Tab③ 列出已生成任务 + 按批次/店铺/商品ID/状态筛选 + 开始更新确认弹窗 T-303 顶部批次/店铺/商品ID/状态筛选;「开始更新」仅作用于当前筛选结果;弹窗显示筛选条件/任务数/线上提交风险;取消不执行;状态=失败可重试;无常驻提交开关 DONE
T-402 串行执行 apply:批量确认后换标题+换封面+点更新提交,单条失败继续,立即写库 T-401, T-001, T-104b 确认后 worker 串行执行并逐条 set_applied;失败继续;未确认时不调用 apply;真实更新前检查本轮账号 Chrome/CDP/登录态,未启动或未登录时整体阻断并提示去④,不自动打开 Chrome DONE
T-403 回写结果到原 Excel(新标题/新封面/更新状态)+ 结束弹窗汇总 T-402, T-204 回写原文件(锁处理);弹窗 成功/失败/略过 DONE
T-404a ②/③ 选中记录重置(联调重试辅助) T-303, T-403, T-504 现状:② AI生成和③ 更新shopee列表没有重置选中记录的功能,生成/上传/提交成功后难以用同一商品重复测试。方案:② 增加「重置生成结果」按钮,仅作用当前选中单条,确认后清空本地 new_title/new_cover_path、清空 last_error,把任务退回 stage=collected/status=success,默认不删除本地新封面文件,可在确认框提示路径;③ 增加「重置更新状态」按钮,仅作用当前选中单条,保留 new_title/new_cover_path,确认后把本地状态退回可更新(stage=generated/status=pending、清空 last_error),用于重复测试上传/提交。若记录 committed=1,确认框必须醒目提示“线上已提交过,本地重置不会回滚 Shopee,重复更新会再次提交线上”,并保留 committed 历史事实/运行日志;运行中禁用;两类重置都写 run_type=reset 运行日志,不触碰 Shopee、不回写 Excel,后续由手动回写同步本地状态 DONE
T-404 真实 Shopee 单条更新冒烟验收 T-403, T-501c 已完成真实验收:2026-07-01 用户手动导入包含 5 个商品 ID 的 Excel,完成 AI 标题/图片生成,并通过 Tab③「开始更新」流程更新到 Shopee;覆盖真实编辑页、标题/封面更新、Shopee 站点侧确认框、提交后结果判断与本地状态链路。后续若 Shopee 页面结构变化,仍需按 CDP 规则补回归验证 DONE

Phase 5 · 设置与收尾

ID 任务 依赖 验收要点 状态
T-501 Tab⑤ 设置 · AI 模型管理 UI(master-detail):模型下拉 + 新增/删除 + 详情(服务商名/类别/api_type/模型ID/网址/密钥打码/连接超时) + 测试连接 T-005, T-104 复用 T-005 后端;name 唯一;类别 text/image;至少各一个;密钥本地明文保存、UI 打码;测试连接可用 DONE
T-501b Tab⑤ 设置 · 角色与生成参数:标题大模型/图片大模型下拉、分辨率(512/1k/2k/4k)、返回超时随分辨率、并发/重试/jpg质量、路径/端口 T-501 角色下拉按类别过滤;分辨率选后返回超时按 resolution_timeouts 自动;持久化 config.json DONE
T-501c Tab⑤ 设置 · Shopee 更新安全开关 T-501b 配置测试商品 ID(历史/调试字段)、是否允许真实提交、是否允许更新封面、单次最大更新条数、成功后是否自动关闭本次新开编辑 tab;默认关闭真实提交和封面更新;Tab③ 执行前读取并拦截不符合安全配置的更新 DONE
T-502 换封面:删第一张再上传 T-001 已实现备份校验、删第一张、确认弹窗、再上传和拖首位;更新封面统一先删当前第一张,不再只限满 9 张;删除前必须确认该任务已有本地旧封面备份(old_cover_path 存在且文件存在),缺失则拒绝删除并报错;已在 9 图测试商品 29671243750 上实测不提交流程 DONE
T-503 敏感信息本地明文存储提示与日志脱敏 T-105, T-501 首次保存密码/API Key 时提示“本地明文保存”;UI 打码;日志/导出不含密码/API Key;文档说明 config.json/config/ai_models.json/DB/user-data-dir/images 必须 gitignore DONE
T-504 多账号并行 / dry-run / 运行日志(V2) T-402 端口不冲突;dry-run 只预览;操作留痕 DONE
T-505 全流程诊断日志扩展 T-207, T-504 在 T-207 采集日志机制稳定后,扩展到② AI生成、Excel 导入/回写、③ 更新shopee步骤级日志、④ Chrome 启动/登录检测、⑤ AI模型测试连接;数据库日志保存业务可读步骤和错误,本地 log 保存脱敏 traceback;不得记录 Cookie、密码、API Key、token TODO
T-506 正式使用批量更新体验:③ 预览本轮更新 + 分批更新全部 + ⑤ 设置页三列布局 T-501c, T-504 ③ 增加「预览本轮更新」按钮替代用户可见 dry-run;「开始更新」对当前筛选结果按每批最大更新条数自动分批,确认弹窗显示总数/每批/预计批次,停止为当前商品安全结束后不再开始新任务;⑤ 设置页使用居中内容区,左右留白已缩短为 T-506 初始实现约 40%,模型详情/角色与生成参数/路径与端口/Shopee 更新安全均使用响应式三列布局,长字段跨列;「多账号并行更新」与「最大并行账号数」合并为同一个横向组件,最大并行账号数紧跟其后且不换行 DONE
T-507 正式批量更新:移除普通流程测试商品 ID 限制 T-506 普通正式更新不再以 test_item_id 阻断当前筛选结果;③ 确认弹窗不再显示测试商品 ID;⑤ 普通设置页隐藏测试商品 ID,仅保留历史/调试兼容字段;仍保留允许真实提交、允许更新封面、分批、二次确认、账号就绪预检和运行日志 DONE

里程碑

  • M1:editor(含采集)模块化、config.json + SQLite + AI 模型清单后端 + 测试基座就绪(Phase 0)。
  • M2:账号管理可用、能登录与检测(Phase 1)。
  • M3:导入 + 采集 + 回写旧数据(Phase 2)。
  • M4:AI 生成新标题/新封面(Phase 3)。
  • M5:对已生成任务弹窗批量确认后更新 Shopee + 回写结果(Phase 4);真实线上单条冒烟延后到设置安全开关完成后执行。

待办池(Backlog)

  • 标题规则/提示词模板库。
  • 上传弹裁剪框商品的自动裁剪。
  • 账号登录态健康巡检。
  • AI 生成图的合规/质量自检。