docs: 统一 V1 更新确认策略

This commit is contained in:
chengma
2026-06-26 15:55:28 +08:00
parent 479d02a2b8
commit ccb4d52d9f
18 changed files with 127 additions and 104 deletions
+4 -4
View File
@@ -18,15 +18,15 @@ cmshopee 是一个 **Windows 本地桌面自动化工具**:管理多个 Shopee
1. 本文 `AGENTS.md`:仓库定位与规则。 1. 本文 `AGENTS.md`:仓库定位与规则。
2. [`docs/00-ai-start-here.md`](docs/00-ai-start-here.md):编程入口与流程。 2. [`docs/00-ai-start-here.md`](docs/00-ai-start-here.md):编程入口与流程。
3. [`docs/04-architecture.md`](docs/04-architecture.md):尤其**第四节 CDP 已验证事实**。 3. [`docs/04-architecture.md`](docs/04-architecture.md):尤其**第七节 CDP 已验证事实**。
4. [`docs/05-coding-rules.md`](docs/05-coding-rules.md):硬性编码规则。 4. [`docs/05-coding-rules.md`](docs/05-coding-rules.md):硬性编码规则。
5. [`docs/06-tasks.md`](docs/06-tasks.md) + [`docs/current-state.md`](docs/current-state.md):领取任务、了解现状。 5. [`docs/06-tasks.md`](docs/06-tasks.md) + [`docs/current-state.md`](docs/current-state.md):领取任务、了解现状。
6. 与当前任务相关的具体文档。 6. 与当前任务相关的具体文档。
## 工作规则 ## 工作规则
- 复用已有 `cdp.py`,遵守架构第四节的选择器、就绪判断、上传/拖拽方式,不另起一套 CDP 交互。 - 复用已有 `cdp.py`,遵守架构第七节的选择器、就绪判断、上传/拖拽方式,不另起一套 CDP 交互。
- 只做当前任务范围内的事;V2(批量、多账号并行)只记录不实现。 - 只做当前任务范围内的事;V2(多账号并行、dry-run、运行日志)只记录不实现。
- CDP 选择器 / 流程 / 配置 schema 变化,必须同步更新 `docs/04-architecture.md` 与相关任务。 - CDP 选择器 / 流程 / 配置 schema 变化,必须同步更新 `docs/04-architecture.md` 与相关任务。
- 改完后更新任务状态、追加 `progress.md`、覆盖 `docs/current-state.md`。 - 改完后更新任务状态、追加 `progress.md`、覆盖 `docs/current-state.md`。
@@ -34,7 +34,7 @@ cmshopee 是一个 **Windows 本地桌面自动化工具**:管理多个 Shopee
- 绝不把真实账号、密码、Cookie、token 写进代码、文档或日志;密码加密存、不自动登录。 - 绝不把真实账号、密码、Cookie、token 写进代码、文档或日志;密码加密存、不自动登录。
- `config.json`、`cmshopee.db`、`chrome_user_data_dir/`(含密码/登录态)绝不提交版本库。 - `config.json`、`cmshopee.db`、`chrome_user_data_dir/`(含密码/登录态)绝不提交版本库。
- 「更新」提交线上、删除满 9 张封面等不可逆动作,必须显式确认/开关,并先在测试商品验证。 - 「更新」提交线上、删除满 9 张封面等不可逆动作,必须有显式确认;③ 点击「开始更新」后必须弹窗确认,用户确认后才批量更新当前筛选结果。
- 不绕过 Shopee 的验证码、风控、限流或权限校验。 - 不绕过 Shopee 的验证码、风控、限流或权限校验。
## 验证 ## 验证
+2 -2
View File
@@ -7,7 +7,7 @@
Claude Code 处理本仓库任务时: Claude Code 处理本仓库任务时:
1. 先读取 [`AGENTS.md`](AGENTS.md)。 1. 先读取 [`AGENTS.md`](AGENTS.md)。
2. 再按 `AGENTS.md` 进入 [`docs/00-ai-start-here.md`](docs/00-ai-start-here.md) 和相关文档(重点 `docs/04-architecture.md` 第四节 CDP 已验证事实)。 2. 再按 `AGENTS.md` 进入 [`docs/00-ai-start-here.md`](docs/00-ai-start-here.md) 和相关文档(重点 `docs/04-architecture.md` 第七节 CDP 已验证事实)。
3. 不在本文重复维护任务流程、编码规则或文档清单,避免和 `AGENTS.md` 漂移。 3. 不在本文重复维护任务流程、编码规则或文档清单,避免和 `AGENTS.md` 漂移。
安全红线(详见 `AGENTS.md`):不写真实凭证、密码加密存不自动登录;不提交 `config.json`、`cmshopee.db`、`chrome_user_data_dir/`;不可逆操作需显式确认;不绕过 Shopee 风控。 安全红线(详见 `AGENTS.md`):不写真实凭证、密码加密存不自动登录;不提交 `config.json`、`cmshopee.db`、`chrome_user_data_dir/`;不可逆操作需显式确认,③ 开始更新前需弹窗确认;不绕过 Shopee 风控。
+32 -23
View File
@@ -9,18 +9,18 @@ cmshopee 是一个 Windows 本地桌面自动化工具(Tkinter,5 Tab),
5 Tab 流水线(工作流优先顺序): 5 Tab 流水线(工作流优先顺序):
**① 导入采集 → ② AI生成 → ③ 更新shopee → ④ 账号管理 → ⑤ 设置** **① 导入采集 → ② AI生成 → ③ 更新shopee → ④ 账号管理 → ⑤ 设置**
目标闭环:④ 配账号并登录 → ① 导入 Excel(按“别名”列关联账号)、采集旧标题/旧封面并回写 → ② 用提示词 AI 生成新标题/新封面(无人工确认)→ ③ 对已生成任务改标题+换封面并直接点「更新」提交(无开关)→ 结果实时存 SQLite、批量回写原 Excel。 目标闭环:④ 配账号并登录 → ① 导入 Excel(按“别名”列关联账号)、采集旧标题/旧封面并回写 → ② 用提示词 AI 生成新标题/新封面(不设逐条确认阶段)→ ③ 对已生成任务点击「开始更新」,弹窗确认后批量改标题+换封面并点「更新」提交 → 结果实时存 SQLite、批量回写原 Excel。
存储:应用设置 `config.json`(含 AI Key)+ 业务数据 SQLite `cmshopee.db` + Excel 用 openpyxl + 图片存本地 `images/`。AI 服务商待定。 存储:应用设置 `config.json` + AI 模型清单 `config/ai_models.json`(含加密 AI Key)+ 业务数据 SQLite `cmshopee.db` + Excel 用 openpyxl + 图片存本地 `images/`。AI 服务商待定。
## 必读顺序 ## 必读顺序
每次开始写代码前,按这个顺序建立上下文: 每次开始写代码前,按这个顺序建立上下文:
1. [`01-vision.md`](01-vision.md):为什么做、为谁做、什么不做。 1. [`01-vision.md`](01-vision.md):为什么做、为谁做、什么不做。
2. [`02-requirements.md`](02-requirements.md):MVP 要什么、怎么算达成。 2. [`02-requirements.md`](02-requirements.md):V1 要什么、怎么算达成。
3. [`03-tech-stack.md`](03-tech-stack.md):既定技术选型(Python + 自研 CDP + Tkinter 待确认)。 3. [`03-tech-stack.md`](03-tech-stack.md):既定技术选型(Python + 自研 CDP + Tkinter 待确认)。
4. [`04-architecture.md`](04-architecture.md):模块职责、账号数据模型、**第四节 CDP 已验证事实(重点)**。 4. [`04-architecture.md`](04-architecture.md):模块职责、账号数据模型、**第七节 CDP 已验证事实(重点)**。
5. [`05-coding-rules.md`](05-coding-rules.md):写代码前必须遵守的规则。 5. [`05-coding-rules.md`](05-coding-rules.md):写代码前必须遵守的规则。
6. [`06-tasks.md`](06-tasks.md):领取本轮唯一任务。 6. [`06-tasks.md`](06-tasks.md):领取本轮唯一任务。
7. [`../progress.md`](../progress.md):历史执行记录、验证结果、阻塞点和关键决策。 7. [`../progress.md`](../progress.md):历史执行记录、验证结果、阻塞点和关键决策。
@@ -30,14 +30,16 @@ cmshopee 是一个 Windows 本地桌面自动化工具(Tkinter,5 Tab),
## 当前阶段 ## 当前阶段
当前项目处于:**单账号流程已验证,正扩展多账号管理 + GUI**。 当前项目处于:**V0 单账号流程已验证,正在实现 V1 多账号 + Excel + AI + 5 Tab GUI 流水线**。
优先路径: 优先路径:
1. Phase 0:把已验证流程模块化(`editor.py`),定义账号配置。 1. Phase 0:把已验证流程模块化(`editor.py`),建立 `config.json` 与 SQLite。
2. Phase 1:账号绑定 user-data-dir、Chrome 启动、登录保活、加载商品页。 2. Phase 1:账号绑定 user-data-dir、Chrome 启动、登录保活。
3. Phase 2:GUI 跑通单账号改标题 + 换封面闭环。 3. Phase 2:导入 Excel、采集旧标题/旧封面并回写。
4. Phase 3:批量与多账号并行(V2)。 4. Phase 3:AI 生成新标题/新封面。
5. Phase 4:③ 批量确认后更新 Shopee 并回写结果。
6. Phase 5:设置、加密密钥方案、收尾。
## 领取任务规则 ## 领取任务规则
@@ -52,28 +54,35 @@ cmshopee 是一个 Windows 本地桌面自动化工具(Tkinter,5 Tab),
如果代码实际状态和任务看板冲突,先说明冲突,不要擅自跳步。 如果代码实际状态和任务看板冲突,先说明冲突,不要擅自跳步。
## MVP 边界 ## 版本边界
MVP 只做: **V0 已验证原型**:
- 账号配置(增删改 1..N 个 Shopee 账号)。 - 单账号已登录 Chrome,通过 CDP 打开商品页、改标题、换封面。
- 每账号绑定 `chrome_user_data_dir/<slug>` 独立配置目录。 - 原型脚本默认不提交线上,`UPDATE=1` 才点击「更新」。
- 一键启动 Chrome 供首次人工登录、登录态持久化。 - 作为 `editor.py` 的已验证参照,不再代表当前完整产品范围。
- 用某账号打开指定商品详情页,改标题、换封面。
- 显式确认后点击「更新」提交(默认不提交)。
MVP 不做: **V1 当前 coding 目标**:
- 5 Tab 流水线:① 导入采集 → ② AI生成 → ③ 更新shopee → ④ 账号管理 → ⑤ 设置。
- 多账号管理,但执行更新仍串行;账号以独立 user-data-dir 隔离。
- Excel 导入/回写 + SQLite 实时落库 + 本地图片目录。
- AI 生成标题/封面,不设逐条确认阶段。
- ③ 点击「开始更新」后弹窗确认当前筛选范围和任务数量;用户确认后才批量提交线上。
**V1 不做**:
- 自动登录 / 自动填账号密码。 - 自动登录 / 自动填账号密码。
- 绕过验证码、风控、限流。 - 绕过验证码、风控、限流。
- 批量、多账号并行、爬取、数据库(属 V2 及之后)。 - 多账号并行、dry-run、完整运行日志(属 V2 及之后)。
- 商品数据批量爬取。
## 事实来源 ## 事实来源
项目事实只信: 项目事实只信:
- [`04-architecture.md`](04-architecture.md) 第四节:CDP 交互已验证结论(选择器、就绪判断、上传/拖拽方式)。 - [`04-architecture.md`](04-architecture.md) 第七节:CDP 交互已验证结论(选择器、就绪判断、上传/拖拽方式)。
- [`04-architecture.md`](04-architecture.md) 4.1/4.2/4.3:`config.json`、SQLite schema、Excel 模板。 - [`04-architecture.md`](04-architecture.md) 5.1/5.1b/5.2/5.3:`config.json`、`config/ai_models.json`、SQLite schema、Excel 模板。
- 真实页面探查结果(用 `prototypes/inspect_images.py` / `prototypes/cookies.py` 实地确认)。 - 真实页面探查结果(用 `prototypes/inspect_images.py` / `prototypes/cookies.py` 实地确认)。
- 已验证脚本 `cdp.py`、`prototypes/demo.py`、`prototypes/set_title.py`、`prototypes/set_cover.py` 中跑通的逻辑。 - 已验证脚本 `cdp.py`、`prototypes/demo.py`、`prototypes/set_title.py`、`prototypes/set_cover.py` 中跑通的逻辑。
@@ -93,14 +102,14 @@ MVP 不做:
做 CDP / 浏览器操作: 做 CDP / 浏览器操作:
- 先看 `04-architecture.md` 第四节已验证事实。 - 先看 `04-architecture.md` 第七节已验证事实。
- 再看 `api.md` 的 `cdp` / `editor` 模块合约。 - 再看 `api.md` 的 `cdp` / `editor` 模块合约。
- 复用 `cdp.py`,不重写一套。 - 复用 `cdp.py`,不重写一套。
做账号配置 / Chrome 启动: 做账号配置 / Chrome 启动:
- 先看 `04-architecture.md` 3.1 数据模型与 `api.md` 的 `config` / `chrome` 合约。 - 先看 `04-architecture.md` 第五节数据模型与 `api.md` 的 `config` / `chrome` 合约。
- Chrome 启动参数严格按第四节“Chrome 启动参数”一条。 - Chrome 启动参数严格按第七节“Chrome 启动参数”一条。
## 验证命令 ## 验证命令
+5 -5
View File
@@ -20,8 +20,8 @@ cmshopee 要解决:**运营要在多个 Shopee 卖家账号下,逐个商品
- **核心流程优先**:先把「单账号改标题 + 换封面」做稳,再扩展多账号和批量。 - **核心流程优先**:先把「单账号改标题 + 换封面」做稳,再扩展多账号和批量。
- **真实环境优先**:操作真实的已登录 Chrome,不伪造登录、不绕过风控。 - **真实环境优先**:操作真实的已登录 Chrome,不伪造登录、不绕过风控。
- **小步交付**:每一步都能运行、能验证、能回退;默认不提交线上,显式开关才落库。 - **小步交付**:每一步都能运行、能验证、能回退;提交线上前必须由用户在批量确认弹窗中确认。
- **少即是稳**:MVP 不追求全自动,只追求最小可靠闭环;首次登录由人工完成。 - **少即是稳**:V1 不追求无人值守全自动,只追求本地批量流水线可靠;首次登录由人工完成。
- **凭证安全**:登录态保存在各账号独立的 Chrome user-data-dir 里,不导出、不外传、不写进代码或文档。 - **凭证安全**:登录态保存在各账号独立的 Chrome user-data-dir 里,不导出、不外传、不写进代码或文档。
## 四、核心价值主张 ## 四、核心价值主张
@@ -31,14 +31,14 @@ cmshopee 要解决:**运营要在多个 Shopee 卖家账号下,逐个商品
| 多账号集中管理 | 一处配置多个 Shopee 账号,各自绑定独立浏览器配置目录,互不串号 | | 多账号集中管理 | 一处配置多个 Shopee 账号,各自绑定独立浏览器配置目录,互不串号 |
| 免反复登录 | 每个账号的登录态持久化在自己的 user-data-dir,启动即带登录 Cookie | | 免反复登录 | 每个账号的登录态持久化在自己的 user-data-dir,启动即带登录 Cookie |
| 自动改标题/换封面 | CDP 驱动浏览器自动改标题、上传新图并拖拽设为封面 | | 自动改标题/换封面 | CDP 驱动浏览器自动改标题、上传新图并拖拽设为封面 |
| 可控可回退 | 默认只改不提交,显式确认/开关才点「更新」,演示与试错零风险 | | 可控可追溯 | ③ 点击「开始更新」后弹窗确认,确认后才批量提交;执行结果实时落库并回写 Excel |
## 五、不做什么(非目标) ## 五、不做什么(非目标)
- 不做 Shopee 账号的**自动登录 / 自动填账号密码**(首次登录人工完成)。 - 不做 Shopee 账号的**自动登录 / 自动填账号密码**(首次登录人工完成)。
- 不**绕过验证码、风控、限流或平台权限校验**。 - 不**绕过验证码、风控、限流或平台权限校验**。
- 不做商品数据的**批量爬取 / 导出**。 - 不做商品数据的**批量爬取 / 导出**。
- 不做云端服务、数据库、多人协作后台(MVP 为本地单机工具)。 - 不做云端服务、外部数据库、多人协作后台(V1 为本地单机工具,业务数据使用本地 SQLite)。
- 不接管标题/封面以外的商品字段编辑。 - 不接管标题/封面以外的商品字段编辑。
> MVP 的具体功能范围与验收标准,见 [需求](02-requirements.md)。 > V1 的具体功能范围与验收标准,见 [需求](02-requirements.md)。
+16 -16
View File
@@ -19,7 +19,7 @@
## 三、功能清单 ## 三、功能清单
### 第一版 MVP(最小闭环) ### V0 已验证原型(单账号最小闭环)
| 功能 | 用户能做什么 | 优先级 | | 功能 | 用户能做什么 | 优先级 |
| --- | --- | --- | | --- | --- | --- |
@@ -30,9 +30,9 @@
| 加载商品页 | 选定账号,用其已登录 Chrome 打开指定商品详情页 | P0 | | 加载商品页 | 选定账号,用其已登录 Chrome 打开指定商品详情页 | P0 |
| 改标题 | 对该商品按规则修改标题(如去掉结尾若干字 / 指定新标题) | P0 | | 改标题 | 对该商品按规则修改标题(如去掉结尾若干字 / 指定新标题) | P0 |
| 换封面 | 上传一张本地图片,自动设为商品封面(满 9 张时先删原封面再传) | P0 | | 换封面 | 上传一张本地图片,自动设为商品封面(满 9 张时先删原封面再传) | P0 |
| 提交更新 | 在显式确认后点击「更新」,把改动提交到线上(默认不提交) | P0 | | 提交更新 | 在显式确认后点击「更新」,把改动提交到线上;原型脚本默认不提交 | P0 |
### 第二版(多账号 + Excel + AI,5 Tab 流水线) ### V1 当前目标(多账号 + Excel + AI,5 Tab 流水线)
5 个 Tab,顺序:① 导入采集 → ② AI生成 → ③ 更新shopee → ④ 账号管理 → ⑤ 设置。 5 个 Tab,顺序:① 导入采集 → ② AI生成 → ③ 更新shopee → ④ 账号管理 → ⑤ 设置。
@@ -44,8 +44,8 @@
| 采集旧数据(①) | 程序只读打开商品页,抓取旧标题、下载旧封面到本地,回写 Excel 旧字段 | P0 | | 采集旧数据(①) | 程序只读打开商品页,抓取旧标题、下载旧封面到本地,回写 Excel 旧字段 | P0 |
| AI 生成(②) | 输入标题/封面提示词,AI 据提示词+旧标题生成新标题、据提示词+旧封面生成新封面 | P0 | | AI 生成(②) | 输入标题/封面提示词,AI 据提示词+旧标题生成新标题、据提示词+旧封面生成新封面 | P0 |
| 提示词管理(②) | 标题提示词「保存」到 `title_prompt.txt` 并启动回显;封面提示词多模板(下拉 + 新建/保存/另存为/重命名/删除)+ 插入 `{新标题}` + 预览(变量替换) | P0 | | 提示词管理(②) | 标题提示词「保存」到 `title_prompt.txt` 并启动回显;封面提示词多模板(下拉 + 新建/保存/另存为/重命名/删除)+ 插入 `{新标题}` + 预览(变量替换) | P0 |
| 查看对照(②) | 双击任务弹窗查看新旧封面(纯查看,无人工确认);可选对单行重生成 | P0 | | 查看对照(②) | 双击任务弹窗查看新旧封面(纯查看,无逐条审核阶段);可选对单行重生成 | P0 |
| 更新 shopee(③) | 按批次/店铺/状态筛选;对筛选出的已生成任务打开编辑页换标题+封面,并直接点「更新」提交线上(无开关);可按状态=失败重试 | P0 | | 更新 shopee(③) | 按批次/店铺/状态筛选;点击「开始更新」后弹窗确认,确认后对当前筛选出的已生成任务打开编辑页换标题+封面,并逐条点「更新」提交线上;可按状态=失败重试 | P0 |
| 结果存储与回写 | 各阶段结果实时存 SQLite;该文件全部完成后把旧/新数据+状态批量回写原 Excel | P0 | | 结果存储与回写 | 各阶段结果实时存 SQLite;该文件全部完成后把旧/新数据+状态批量回写原 Excel | P0 |
| 设置(⑤) | AI 模型管理(下拉+新增/删除/详情/测试连接,至少各一个文本+图像模型);标题/图片大模型角色选择;分辨率(512/1k/2k/4k,返回超时随分辨率自动);并发/重试/jpg质量;图片目录/Chrome 路径/端口 | P0 | | 设置(⑤) | AI 模型管理(下拉+新增/删除/详情/测试连接,至少各一个文本+图像模型);标题/图片大模型角色选择;分辨率(512/1k/2k/4k,返回超时随分辨率自动);并发/重试/jpg质量;图片目录/Chrome 路径/端口 | P0 |
| 首次引导保护 | 未配账号/未登录时,① ③ 执行按钮禁用并提示去④ | P0 | | 首次引导保护 | 未配账号/未登录时,① ③ 执行按钮禁用并提示去④ | P0 |
@@ -58,16 +58,16 @@
| 运行日志 / dry-run | 操作留痕、可先空跑预览 | V2 | | 运行日志 / dry-run | 操作留痕、可先空跑预览 | V2 |
| 标题规则模板 | 预设多种改标题规则(前缀、替换、截断等) | V3 | | 标题规则模板 | 预设多种改标题规则(前缀、替换、截断等) | V3 |
## 四、核心用户故事(MVP) ## 四、核心用户故事(V1)
1. 作为运营,我打开工具后能看到已配置的账号列表,并能新增一个账号。 1. 作为运营,我打开工具后能看到已配置的账号列表,并能新增一个账号。
2. 我为某账号点击「启动并登录」,工具用它专属的配置目录打开 Chrome,我手动登录一次 Shopee 卖家中心。 2. 我为某账号点击「启动并登录」,工具用它专属的配置目录打开 Chrome,我手动登录一次 Shopee 卖家中心。
3. 之后我选中该账号、填入商品 ID,工具自动打开该商品详情页(带登录态)。 3. 之后我选中该账号、填入商品 ID,工具自动打开该商品详情页(带登录态)。
4. 工具自动把标题改成目标值,并上传我指定的图片、把它拖到第一位设为封面。 4. 工具自动把标题改成目标值,并上传我指定的图片、把它拖到第一位设为封面。
5. 我核对无误后点击「更新」(或让工具在确认后点击),改动提交线上;不确认则刷新即还原。 5. 我在 ③ 按批次/店铺/状态筛选已生成任务,点击「开始更新」后看到批量确认弹窗;确认后工具逐条提交线上,取消则不执行。
6. 当账号尚未登录、商品页加载失败或封面已满 9 张时,工具给出明确提示并安全处理。 6. 当账号尚未登录、商品页加载失败或封面已满 9 张时,工具给出明确提示并安全处理。
## 五、验收标准(MVP) ## 五、验收标准(V1)
- **账号配置**:新增/编辑/删除账号后,配置持久化到本地文件,重启工具仍在。 - **账号配置**:新增/编辑/删除账号后,配置持久化到本地文件,重启工具仍在。
- **绑定配置目录**:每个账号对应唯一的 `chrome_user_data_dir/<账号标识>` 目录;不同账号互不共用、不串号。 - **绑定配置目录**:每个账号对应唯一的 `chrome_user_data_dir/<账号标识>` 目录;不同账号互不共用、不串号。
@@ -75,8 +75,8 @@
- **加载商品页**:选定账号执行时,能用该账号登录态打开目标商品详情页,标题框与图片管理器渲染就绪。 - **加载商品页**:选定账号执行时,能用该账号登录态打开目标商品详情页,标题框与图片管理器渲染就绪。
- **改标题**:写入后标题框 `value` 与 `modelvalue` 均等于目标值(确认页面模型已更新)。 - **改标题**:写入后标题框 `value` 与 `modelvalue` 均等于目标值(确认页面模型已更新)。
- **换封面**:上传成功后图片张数 +1(满 9 张时先删第一张再传);目标图被拖到第一位成为封面。 - **换封面**:上传成功后图片张数 +1(满 9 张时先删第一张再传);目标图被拖到第一位成为封面。
- **提交更新**:默认不点「更新」;开启提交时,按钮可点才点击,禁用态则不点并提示原因。 - **提交更新**:③ 点击「开始更新」后必须弹窗确认本次筛选范围和任务数量;用户确认后才逐条点「更新」,按钮禁用则不点并记录失败原因。
- **安全**:任意失败路径不崩溃、不误删、不在无确认下提交线上。 - **安全**:任意失败路径不崩溃、不误删、不在缺少批量确认的情况下提交线上。
## 六、范围边界与决策 ## 六、范围边界与决策
@@ -87,10 +87,10 @@
| 是否需要账号 | 是;管理多个 Shopee 卖家账号,但登录由人工首次完成 | | 是否需要账号 | 是;管理多个 Shopee 卖家账号,但登录由人工首次完成 |
| 存储 | 应用设置用 `config.json`;账号/任务/结果用 SQLite;Excel 读写用 openpyxl | | 存储 | 应用设置用 `config.json`;账号/任务/结果用 SQLite;Excel 读写用 openpyxl |
| 账号↔任务绑定 | 以 Excel“别名”列为权威(非文件名);匹配不到的略过并最后弹窗汇总 | | 账号↔任务绑定 | 以 Excel“别名”列为权威(非文件名);匹配不到的略过并最后弹窗汇总 |
| 是否提交更新 | ③ 执行时总是点「更新」提交线上(无人工确认、无开关) | | 是否提交更新 | ③ 点击「开始更新」后弹窗确认;确认后对当前筛选结果逐条点「更新」提交线上;无常驻提交开关、无逐条人工审核 |
| 执行方式 | 多账号串行、逐任务执行,单条失败继续 | | 执行方式 | 多账号串行、逐任务执行,单条失败继续 |
| 旧标题/旧封面 | 程序在「采集」阶段改前抓取的快照(输出列),运营不填 | | 旧标题/旧封面 | 程序在「采集」阶段改前抓取的快照(输出列),运营不填 |
| 新标题/新封面 | AI 生成(输出列),直接用于更新(无人工确认);本地留档+回写 Excel 供追溯 | | 新标题/新封面 | AI 生成(输出列),直接用于 ③;不设逐条确认阶段,本地留档+回写 Excel 供追溯 |
| AI 服务 | 文本+图像生成,服务商/模型待定;Key 加密存于配置;见 [技术栈](03-tech-stack.md) | | AI 服务 | 文本+图像生成,服务商/模型待定;Key 加密存于配置;见 [技术栈](03-tech-stack.md) |
| 本地图片 | 旧封面下载、新封面生成存本地图片目录,路径记 DB | | 本地图片 | 旧封面下载、新封面生成存本地图片目录,路径记 DB |
| 结果落库时机 | 各阶段处理完立即写 SQLite;该 Excel 全部完成后批量回写原文件 | | 结果落库时机 | 各阶段处理完立即写 SQLite;该 Excel 全部完成后批量回写原文件 |
@@ -102,11 +102,11 @@
- **账号 / 凭证风险**:登录态存在各账号 user-data-dir,等同账号凭证;目录不得提交版本库、不得外传。 - **账号 / 凭证风险**:登录态存在各账号 user-data-dir,等同账号凭证;目录不得提交版本库、不得外传。
- **密码存储风险**:Tab2 的密码加密存于 SQLite,仅供人工参考,**绝不自动登录/自动填**;`cmshopee.db`、`config.json` 必须 gitignore;加密密钥不得与密文同存(见 [任务 T-403](06-tasks.md))。 - **密码存储风险**:Tab2 的密码加密存于 SQLite,仅供人工参考,**绝不自动登录/自动填**;`cmshopee.db`、`config.json` 必须 gitignore;加密密钥不得与密文同存(见 [任务 T-403](06-tasks.md))。
- **别名匹配风险**:别名以 Excel 列为准;不匹配的行略过并最后弹窗,执行起始在日志逐条打印「文件→匹配账号」留痕,防误改。 - **别名匹配风险**:别名以 Excel 列为准;不匹配的行略过并最后弹窗,执行起始在日志逐条打印「文件→匹配账号」留痕,防误改。
- **AI 主图风险(高,已知并接受)**:本设计**无人工确认、无提交开关**,AI 生成的标题/封面经 ③ 执行即直接上线;主图若失真/夸大/侵权可能违反 Shopee 规则甚至下架。唯一缓解:新图本地留档 + 回写 Excel 供事后追溯;强烈建议先在测试商品验证再批量。 - **AI 主图风险(高,已知并接受)**:本设计不设逐条人工审核和常驻提交开关;AI 生成的标题/封面经 ③ 批量确认后会提交线上。主图若失真/夸大/侵权可能违反 Shopee 规则甚至下架。缓解:开始更新前弹窗确认筛选范围和任务数量,新图本地留档 + 回写 Excel 供事后追溯;强烈建议先在测试商品验证再批量。
- **AI 成本与依赖**:接入文本+图像 AI = 新外部依赖 + API 费用 + Key 管理;服务商/模型/合规待 [技术栈](03-tech-stack.md) 确认。 - **AI 成本与依赖**:接入文本+图像 AI = 新外部依赖 + API 费用 + Key 管理;服务商/模型/合规待 [技术栈](03-tech-stack.md) 确认。
- **AI Key 安全**:Key 加密存于 `config.json`,不写日志、不提交版本库。 - **AI Key 安全**:Key 加密存于 `config/ai_models.json`,不写日志、不提交版本库。
- **第三方平台风险**:Shopee 页面结构、class 名、接口随时可能变;限流、风控、封号风险存在,禁止高频批量。 - **第三方平台风险**:Shopee 页面结构、class 名、接口随时可能变;限流、风控、封号风险存在,禁止高频批量。
- **自动化边界风险**:③ 执行会自动改标题、上传图片、拖拽并**直接点更新提交线上**(无确认、无开关);点「开始更新」前需自行确保任务来源与 AI 产出可接受。 - **自动化边界风险**:③ 确认后会自动改标题、上传图片、拖拽并点「更新」提交线上;点「开始更新」并确认前需自行确保筛选范围、任务来源与 AI 产出可接受。
- **合规风险**:仅在自有/授权账号上操作;遵守 Shopee 卖家条款;不绕过任何平台限制。 - **合规风险**:仅在自有/授权账号上操作;遵守 Shopee 卖家条款;不绕过任何平台限制。
- **GUI 选型待确认**:默认 Tkinter(零依赖),是否改用 PySide/Web 由维护者确认,见 [技术栈](03-tech-stack.md)。 - **GUI 选型待确认**:默认 Tkinter(零依赖),是否改用 PySide/Web 由维护者确认,见 [技术栈](03-tech-stack.md)。
- **多账号并行待确认**:MVP 单账号单端口;并行的端口分配与资源占用在 V2 评估。 - **多账号并行待确认**:V1 多账号串行;并行的端口分配与资源占用在 V2 评估。
+2 -2
View File
@@ -27,13 +27,13 @@
## 二、决策记录与演进 ## 二、决策记录与演进
- **CDP 自研而非 playwright**:当前手写 `cdp.py`,因为它零重依赖、完全可控,并已在开发环境绕开了代理(`*_proxy` 指向本地 :1080)和 Chrome 的 Origin 403 两个坑。未来若交互复杂度大幅上升,再评估 playwright。 - **CDP 自研而非 playwright**:当前手写 `cdp.py`,因为它零重依赖、完全可控,并已在开发环境绕开了代理(`*_proxy` 指向本地 :1080)和 Chrome 的 Origin 403 两个坑。未来若交互复杂度大幅上升,再评估 playwright。
- **GUI 选 Tkinter**:MVP 是单机配置 + 触发操作的轻量界面,Tkinter 零依赖即可。若后续需要表格、拖拽、复杂布局,再评估 PySide6。**该选型在动代码前需维护者确认。** - **GUI 选 Tkinter**:V1 是单机配置 + 触发操作的轻量界面,Tkinter 零依赖即可。若后续需要表格、拖拽、复杂布局,再评估 PySide6。**该选型在动代码前需维护者确认。**
- **存储拆两层**:应用设置进 `config.json`,账号/任务/结果进 SQLite。判据:少量人改无需查询 → 配置文件;成行增长要查询/导出 → DB。同一事实只存一处,不重复。取代早期的 `accounts.json` 方案。 - **存储拆两层**:应用设置进 `config.json`,账号/任务/结果进 SQLite。判据:少量人改无需查询 → 配置文件;成行增长要查询/导出 → DB。同一事实只存一处,不重复。取代早期的 `accounts.json` 方案。
- **Excel 用 openpyxl**:运营用真实 .xlsx;stdlib 无法读写 xlsx,引入一个轻依赖比改用 CSV 更贴合用户习惯。 - **Excel 用 openpyxl**:运营用真实 .xlsx;stdlib 无法读写 xlsx,引入一个轻依赖比改用 CSV 更贴合用户习惯。
- **多账号隔离用独立 user-data-dir,不用 Chrome profile**:profile 共享同一 user-data-dir/进程/调试端口,无法每账号独立 CDP 与并行;独立 user-data-dir 才契合自动化。详见 [架构 3.0](04-architecture.md)。 - **多账号隔离用独立 user-data-dir,不用 Chrome profile**:profile 共享同一 user-data-dir/进程/调试端口,无法每账号独立 CDP 与并行;独立 user-data-dir 才契合自动化。详见 [架构 3.0](04-architecture.md)。
- **快捷方式生成用 PowerShell(无额外依赖)**:用 `WScript.Shell.CreateShortcut` 生成 `.lnk`,不引入 `pywin32` 等依赖。 - **快捷方式生成用 PowerShell(无额外依赖)**:用 `WScript.Shell.CreateShortcut` 生成 `.lnk`,不引入 `pywin32` 等依赖。
- **AI 服务商待定**:需选支持文本生成 + 图像 image-to-image 的服务;选型要权衡能力、合规(电商主图)、计费、Key 管理。**未确认前不在代码里写死某家 SDK**,先在 `ai.py` 留稳定接口(`gen_title`/`gen_cover`)。 - **AI 服务商待定**:需选支持文本生成 + 图像 image-to-image 的服务;选型要权衡能力、合规(电商主图)、计费、Key 管理。**未确认前不在代码里写死某家 SDK**,先在 `ai.py` 留稳定接口(`gen_title`/`gen_cover`)。
- **AI 产出无人工确认**:生成的新标题/新封面经 ③ 执行即直接上线(无确认、无提交开关);本地留档 + 回写 Excel 供追溯。 - **AI 产出无逐条审核**:生成的新标题/新封面经 ③ 批量确认后提交线上;无常驻提交开关,本地留档 + 回写 Excel 供追溯。
- **不引入数据库(指外部 DB)**:用 stdlib SQLite 足够;不引入 Postgres/MySQL 等。 - **不引入数据库(指外部 DB)**:用 stdlib SQLite 足够;不引入 Postgres/MySQL 等。
- **生产在 Windows 直跑**:开发期我们用过 WSL→Windows 的 `netsh portproxy`(9333→9222)连 CDP;但 GUI 与 Chrome 都在 Windows 时,直接连 `127.0.0.1:9222`,无需 portproxy。 - **生产在 Windows 直跑**:开发期我们用过 WSL→Windows 的 `netsh portproxy`(9333→9222)连 CDP;但 GUI 与 Chrome 都在 Windows 时,直接连 `127.0.0.1:9222`,无需 portproxy。
+14 -12
View File
@@ -51,8 +51,8 @@ imported → collected → generated → applied
- **imported**:openpyxl 解析输入列入库。 - **imported**:openpyxl 解析输入列入库。
- **collected**:只读打开商品页,读旧标题、下载旧封面到本地,写 `old_title/old_cover_path`,回写 Excel 旧字段。 - **collected**:只读打开商品页,读旧标题、下载旧封面到本地,写 `old_title/old_cover_path`,回写 Excel 旧字段。
- **generated**:AI 用提示词+旧标题生成新标题;用提示词+旧封面生成新封面(image-to-image),新图存本地。**无人工确认环节**,生成完即可被 ③ 执行(新图留档本地 + 回写 Excel 供事后追溯)。 - **generated**:AI 用提示词+旧标题生成新标题;用提示词+旧封面生成新封面(image-to-image),新图存本地。**不设逐条人工审核阶段**,生成完即可进入 ③(新图留档本地 + 回写 Excel 供事后追溯)。
- **applied**:打开编辑页换标题+封面,**总是点「更新」提交线上**(无开关),回写结果。 - **applied**:③ 点击「开始更新」后弹窗确认当前筛选范围和任务数量;确认后打开编辑页换标题+封面,逐条点「更新」提交线上,回写结果。
任意阶段失败 → `stage` 不前进、记 `error`、`result/skipped`,不影响其他任务。 任意阶段失败 → `stage` 不前进、记 `error`、`result/skipped`,不影响其他任务。
@@ -62,7 +62,7 @@ imported → collected → generated → applied
**核心模块** **核心模块**
- `appconfig`:读写 `config.json`(Chrome 路径、`chrome_user_data_dir` 根、图片目录、AI 配置、端口、DB 路径、默认是否提交)。 - `appconfig`:读写 `config.json`(Chrome 路径、`chrome_user_data_dir` 根、图片目录、AI 配置、端口、DB 路径)。
- `db`:SQLite 读写账号、任务、各阶段结果;建表/迁移。 - `db`:SQLite 读写账号、任务、各阶段结果;建表/迁移。
- `excel`:openpyxl 读输入列、把输出列回写原 Excel(处理文件锁)。 - `excel`:openpyxl 读输入列、把输出列回写原 Excel(处理文件锁)。
- `config`:账号 ↔ user-data-dir 绑定;slug;目录创建。 - `config`:账号 ↔ user-data-dir 绑定;slug;目录创建。
@@ -195,8 +195,8 @@ CREATE TABLE tasks (
- `alias` 是账号↔任务**唯一关联键**;找不到账号 → stage=skipped,error=别名未匹配,最后弹窗汇总。 - `alias` 是账号↔任务**唯一关联键**;找不到账号 → stage=skipped,error=别名未匹配,最后弹窗汇总。
- `account_name` 仅展示/参考;匹配以 `alias` 为准。 - `account_name` 仅展示/参考;匹配以 `alias` 为准。
- `old_title/old_cover_path`:程序**采集阶段抓取**的快照(输出)。 - `old_title/old_cover_path`:程序**采集阶段抓取**的快照(输出)。
- `new_title/new_cover_path`:**AI 生成**结果(输出),图片落本地,**无人工确认**,生成即可应用。 - `new_title/new_cover_path`:**AI 生成**结果(输出),图片落本地;不设逐条确认阶段,生成即可进入 ③。
- `committed`:③ 执行时**总是点「更新」提交**;该字段记录提交是否成功。 - `committed`:③ 用户确认批量更新弹窗后逐条点「更新」提交;该字段记录提交是否成功。
- 各字段**每阶段处理完立即写回 SQLite**(实时落库);阶段结束后批量回写 Excel。 - 各字段**每阶段处理完立即写回 SQLite**(实时落库);阶段结束后批量回写 Excel。
### 5.3 Excel 模板 ### 5.3 Excel 模板
@@ -244,7 +244,7 @@ images/<slug>/<item_id>_new.<ext> # AI 生成的新封面
- 每条/每张完成**立即 `set_generated` 写库**(实时落库,停止或崩溃不丢已生成的)。 - 每条/每张完成**立即 `set_generated` 写库**(实时落库,停止或崩溃不丢已生成的)。
- **「停止」**:取消未开始的任务,正在跑的少量完成或中断;停止后可再次「开始生成」对剩余继续。 - **「停止」**:取消未开始的任务,正在跑的少量完成或中断;停止后可再次「开始生成」对剩余继续。
- 进度:`标题 x/n · 封面 x/n · 失败 n`。 - 进度:`标题 x/n · 封面 x/n · 失败 n`。
- 生成后 stage=generated;**无人工确认**。双击任务弹窗查看新旧封面(纯查看),可选对某行 `重生成`;新标题直接用 AI 输出(不可编辑)。 - 生成后 stage=generated;**不设逐条人工审核阶段**。双击任务弹窗查看新旧封面(纯查看),可选对某行 `重生成`;新标题直接用 AI 输出(不可编辑)。
- 并发数、重试、分辨率、jpg 质量、模型/Key 均来自 ⑤ 设置(`config.json` 的 `ai` 段)。 - 并发数、重试、分辨率、jpg 质量、模型/Key 均来自 ⑤ 设置(`config.json` 的 `ai` 段)。
提示词管理: 提示词管理:
@@ -255,7 +255,9 @@ images/<slug>/<item_id>_new.<ext> # AI 生成的新封面
### 6.3 应用更新(③ Tab) ### 6.3 应用更新(③ Tab)
- 对**已生成(generated)任务**:`open_product` → `change_title(new_title)`(如有)→ `replace_cover(new_cover_path)`(如有)→ **总是 `click_update` 提交**。 - ③ 顶部筛选确定本次作用范围;点击「开始更新」后弹窗展示筛选条件、任务数量和“将提交线上”的风险提示。
- 用户点「是/确认」才开始批量更新;点「否/取消」不执行、不改库。
- 对确认后的**已生成(generated)任务**:`open_product` → `change_title(new_title)`(如有)→ `replace_cover(new_cover_path)`(如有)→ `click_update` 提交。
- 串行、单条失败继续;每条立即写 SQLite;全部完成回写 Excel(新字段+状态)+ 弹窗汇总。 - 串行、单条失败继续;每条立即写 SQLite;全部完成回写 Excel(新字段+状态)+ 弹窗汇总。
### 6.4 登录检测 ### 6.4 登录检测
@@ -277,18 +279,18 @@ images/<slug>/<item_id>_new.<ext> # AI 生成的新封面
| 上传成功 | 张数 +1 且新图 src 为 `susercontent` | | 上传成功 | 张数 +1 且新图 src 为 `susercontent` |
| 封面=第一位 | `Input.dispatchMouseEvent` 拖到第一位,落点 `第一张.left - 0.30*宽` | | 封面=第一位 | `Input.dispatchMouseEvent` 拖到第一位,落点 `第一张.left - 0.30*宽` |
| 满 9 张 | 上限 9;换封面先删第一张(`.shopee-image-manager__icon--delete`,确认框待实测)| | 满 9 张 | 上限 9;换封面先删第一张(`.shopee-image-manager__icon--delete`,确认框待实测)|
| 更新按钮 | `button.eds-button` 中 `<span>更新</span>`;③ 执行即点提交;禁用态(校验未过)记为失败 | | 更新按钮 | `button.eds-button` 中 `<span>更新</span>`;③ 批量确认后逐条点提交;禁用态(校验未过)记为失败 |
| 登录检测 | 重定向到登录页或缺 `SPC_ST` → 未登录 | | 登录检测 | 重定向到登录页或缺 `SPC_ST` → 未登录 |
高风险动作(删满 9 张封面、点更新提交、AI 图直接上线)先在测试商品验证。注意:本设计**无人工确认、无提交开关**,③ 一旦执行即把 AI 标题/封面提交线上,新图本地留档+回写 Excel 是唯一事后追溯手段。 高风险动作(删满 9 张封面、点更新提交、AI 图上线)先在测试商品验证。注意:本设计无逐条人工审核阶段、无常驻提交开关;③ 点击「开始更新」后必须弹窗确认,确认后才把当前筛选结果中的 AI 标题/封面提交线上。新图本地留档+回写 Excel 是事后追溯手段。
## 八、推荐开发顺序 ## 八、推荐开发顺序
1. **地基**:`editor.py`(含采集)、`appconfig.py`+`config.json`、`db.py`、`.gitignore`。 1. **地基**:`editor.py`(含采集)、`appconfig.py`+`config.json`、`db.py`、`.gitignore`。
2. **账号与启动**(④):`config` 建目录、`chrome` 启动器/快捷方式、登录保活与检测、账号 CRUD。 2. **账号与启动**(④):`config` 建目录、`chrome` 启动器/快捷方式、登录保活与检测、账号 CRUD。
3. **导入采集**(①):`excel` 导入、采集旧标题/旧封面、回写。 3. **导入采集**(①):`excel` 导入、采集旧标题/旧封面、回写。
4. **AI 生成**(②):`ai` 模块、提示词、对照预览与确认。 4. **AI 生成**(②):`ai` 模块、提示词、对照预览。
5. **更新 shopee**(③):对已生成任务换标题+封面、直接提交、回写。 5. **更新 shopee**(③):对已生成任务弹窗批量确认后换标题+封面、提交、回写。
6. **设置**(⑤)+ 首次未配账号引导保护。 6. **设置**(⑤)+ 首次未配账号引导保护。
## 九、项目结构建议 ## 九、项目结构建议
@@ -317,5 +319,5 @@ cmshopee/
- 存储边界:应用设置→config.json,账号/任务/结果→SQLite,图片→本地目录并记路径于 DB,登录态→user-data-dir;同一事实只存一处。 - 存储边界:应用设置→config.json,账号/任务/结果→SQLite,图片→本地目录并记路径于 DB,登录态→user-data-dir;同一事实只存一处。
- 别名是账号↔任务唯一关联键。 - 别名是账号↔任务唯一关联键。
- 密码与 AI Key 加密存、不外传、不写日志;不自动登录。 - 密码与 AI Key 加密存、不外传、不写日志;不自动登录。
- AI 生成内容直接用于 ③ 更新(无人工确认);新图本地留档 + 回写 Excel 以备追溯。 - AI 生成内容直接进入 ③ 更新候选;③ 批量确认后提交,新图本地留档 + 回写 Excel 以备追溯。
- 高风险模块先单独验证,再接入流水线。 - 高风险模块先单独验证,再接入流水线。
+8 -8
View File
@@ -7,7 +7,7 @@
1. **不臆造**:选择器、字段、文件、接口不确定就查证或先用 `prototypes/inspect_images.py` 探查页面,不要猜 class 名。 1. **不臆造**:选择器、字段、文件、接口不确定就查证或先用 `prototypes/inspect_images.py` 探查页面,不要猜 class 名。
2. **守范围**:只做当前任务要求的事,不顺手加批量/并行等后续功能。 2. **守范围**:只做当前任务要求的事,不顺手加批量/并行等后续功能。
3. **照架构**:复用 `cdp.py`,遵守 `04-architecture.md` 第四节“已验证结论”,不另起一套 CDP 交互。 3. **照架构**:复用 `cdp.py`,遵守 `04-architecture.md` 第七节“已验证结论”,不另起一套 CDP 交互。
4. **小步改**:一次只解决一个问题,不夹带无关重构。 4. **小步改**:一次只解决一个问题,不夹带无关重构。
5. **可验证**:改完必须能 `py_compile`,关键路径能在测试商品上跑通,对得上验收标准。 5. **可验证**:改完必须能 `py_compile`,关键路径能在测试商品上跑通,对得上验收标准。
@@ -20,16 +20,16 @@
## 2. 事实来源纪律 ## 2. 事实来源纪律
- CDP 交互只信 `04-architecture.md` 第四节的“已验证结论”和真实页面探查结果。 - CDP 交互只信 `04-architecture.md` 第七节的“已验证结论”和真实页面探查结果。
- 不从旧脚本注释或记忆里推断仍然有效的选择器;Shopee 页面可能已变,必要时重新探查。 - 不从旧脚本注释或记忆里推断仍然有效的选择器;Shopee 页面可能已变,必要时重新探查。
- 不虚构 Shopee 接口、字段、按钮文案。 - 不虚构 Shopee 接口、字段、按钮文案。
- 选择器 / 流程变化必须同步更新 `04-architecture.md` 和相关任务。 - 选择器 / 流程变化必须同步更新 `04-architecture.md` 和相关任务。
## 3. 范围纪律 ## 3. 范围纪律
- MVP 只做 `02-requirements.md` 中列为 P0 的功能(账号配置、绑定目录、启动登录、加载页、改标题、换封面、可选更新)。 - V1 只做 `02-requirements.md` 中列为 P0 的当前目标功能(5 Tab、账号管理、Excel 导入采集、AI 生成、批量确认后更新 Shopee、结果回写)。
- V2 / V3 功能(批量、多账号并行、日志、规则模板)只记录,不实现。 - V2 / V3 功能(多账号并行、dry-run、完整运行日志、规则模板)只记录,不实现。
- 需求明确排除的非目标(自动登录、绕风控、爬取、数据库)不得实现。 - 需求明确排除的非目标(自动登录、绕风控、商品数据批量爬取、外部数据库)不得实现。
## 4. 架构纪律 ## 4. 架构纪律
@@ -68,7 +68,7 @@ python prototypes/demo.py # 单账号闭环验证(不提交)
- 绝不明文存密码;DB 里密码必须加密,且加密密钥不与密文同存。 - 绝不明文存密码;DB 里密码必须加密,且加密密钥不与密文同存。
- 绝不把 `config.json`、`cmshopee.db`、`chrome_user_data_dir/` 提交版本库。 - 绝不把 `config.json`、`cmshopee.db`、`chrome_user_data_dir/` 提交版本库。
- 绝不自动登录 / 自动填账号密码;登录由人工完成,程序只检测登录态。 - 绝不自动登录 / 自动填账号密码;登录由人工完成,程序只检测登录态。
- 绝不在没有显式确认/开关的情况下点击「更新」提交线上。 - 绝不在缺少 ③ 批量确认弹窗确认的情况下点击「更新」提交线上。
- 绝不擅自删除用户文件或重置 user-data-dir。 - 绝不擅自删除用户文件或重置 user-data-dir。
- 绝不为通过验证而降低验收标准(如不验证 `modelvalue` 就当改成功)。 - 绝不为通过验证而降低验收标准(如不验证 `modelvalue` 就当改成功)。
@@ -76,8 +76,8 @@ python prototypes/demo.py # 单账号闭环验证(不提交)
- 登录凭证只存在于各账号 user-data-dir;不导出、不外传、不写入配置或日志。 - 登录凭证只存在于各账号 user-data-dir;不导出、不外传、不写入配置或日志。
- 涉及 Shopee 时,遵守 `04-architecture.md` 写明的页面规则与限流边界;不高频批量、不绕风控/验证码。 - 涉及 Shopee 时,遵守 `04-architecture.md` 写明的页面规则与限流边界;不高频批量、不绕风控/验证码。
- 高风险动作(删满 9 张的封面、点击更新)必须有显式确认或开关,并先在测试商品验证。 - 高风险动作(删满 9 张的封面、点击更新)必须有显式确认,并先在测试商品验证。
- 自动化默认支持“只改不提交”(dry-run 思路);提交、删除等不可逆动作要可控、可回退(刷新还原)。 - V1 无常驻提交开关;③ 的批量确认弹窗是提交线上前的确认边界。dry-run 属 V2。
## 9. 拿不准就问 ## 9. 拿不准就问
+4 -4
View File
@@ -22,7 +22,7 @@
| ID | 任务 | 依赖 | 验收要点 | 状态 | | ID | 任务 | 依赖 | 验收要点 | 状态 |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| T-001 | `editor.py`:改标题/换封面/点更新/登录检测/**采集(读旧标题+旧封面下载)**/apply_task,复用 `cdp.py` | - | 函数可调用,在测试商品跑通;与 `prototypes/demo.py` 行为一致 | TODO | | T-001 | `editor.py`:改标题/换封面/点更新/登录检测/**采集(读旧标题+旧封面下载)**/apply_task,复用 `cdp.py` | - | 函数可调用,在测试商品跑通;与 `prototypes/demo.py` 行为一致 | TODO |
| T-002 | `appconfig.py` + `config.json`(含 image_dir、ai 段、端口等默认值) | - | 读写正常;不存在则写默认;AI Key 加密占位 | TODO | | T-002 | `appconfig.py` + `config.json`(含 image_dir、ai 选择/参数段、端口等默认值;不含 AI Key) | - | 读写正常;不存在则写默认;AI Key 留给 `config/ai_models.json`/T-501 | TODO |
| T-003 | `db.py` + SQLite 建表(accounts/tasks,含各阶段字段) | - | `init_db` 幂等;账号/任务/各 set_* 可用;schema 同架构 5.2 | TODO | | T-003 | `db.py` + SQLite 建表(accounts/tasks,含各阶段字段) | - | `init_db` 幂等;账号/任务/各 set_* 可用;schema 同架构 5.2 | TODO |
| T-004 | `.gitignore`:排除 `config.json`、`cmshopee.db`、`chrome_user_data_dir/`、`images/` | T-002, T-003 | 凭证/业务/图片不被提交 | TODO | | T-004 | `.gitignore`:排除 `config.json`、`cmshopee.db`、`chrome_user_data_dir/`、`images/` | T-002, T-003 | 凭证/业务/图片不被提交 | TODO |
@@ -61,8 +61,8 @@
| ID | 任务 | 依赖 | 验收要点 | 状态 | | ID | 任务 | 依赖 | 验收要点 | 状态 |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| T-401 | Tab③ 列出已生成任务 + 按批次/店铺/状态筛选 | T-303 | 顶部批次/店铺/状态筛选;「开始更新」仅作用于当前筛选结果;状态=失败可重试;无提交开关;警示“执行即提交线上” | TODO | | T-401 | Tab③ 列出已生成任务 + 按批次/店铺/状态筛选 + 开始更新确认弹窗 | T-303 | 顶部批次/店铺/状态筛选;「开始更新」仅作用于当前筛选结果;弹窗显示筛选条件/任务数/线上提交风险;取消不执行;状态=失败可重试;无常驻提交开关 | TODO |
| T-402 | 串行执行 apply:换标题+换封面+**总是点更新提交**,单条失败继续,立即写库 | T-401, T-001 | 逐条 set_applied;恒提交;失败继续;未登录引导保护 | TODO | | T-402 | 串行执行 apply:批量确认后换标题+换封面+点更新提交,单条失败继续,立即写库 | T-401, T-001 | 确认后逐条 set_applied;失败继续;未登录引导保护;未确认时不调用 apply | TODO |
| T-403 | 回写结果到原 Excel(新标题/新封面/更新状态)+ 结束弹窗汇总 | T-402, T-204 | 回写原文件(锁处理);弹窗 成功/失败/略过 | TODO | | T-403 | 回写结果到原 Excel(新标题/新封面/更新状态)+ 结束弹窗汇总 | T-402, T-204 | 回写原文件(锁处理);弹窗 成功/失败/略过 | TODO |
## Phase 5 · 设置与收尾 ## Phase 5 · 设置与收尾
@@ -81,7 +81,7 @@
- M2:账号管理可用、能登录与检测(Phase 1)。 - M2:账号管理可用、能登录与检测(Phase 1)。
- M3:导入 + 采集 + 回写旧数据(Phase 2)。 - M3:导入 + 采集 + 回写旧数据(Phase 2)。
- M4:AI 生成新标题/新封面(Phase 3)。 - M4:AI 生成新标题/新封面(Phase 3)。
- M5:对已生成任务更新 Shopee(直接提交)+ 回写结果(Phase 4)。 - M5:对已生成任务弹窗批量确认后更新 Shopee + 回写结果(Phase 4)。
## 待办池(Backlog) ## 待办池(Backlog)
+1 -1
View File
@@ -4,7 +4,7 @@
## 一句话定位 ## 一句话定位
cmshopee 是一个给**电商运营**使用的 Windows 桌面自动化工具,用于**管理多个 Shopee 卖家账号、并用 CDP 驱动 Chrome 批量修改商品标题、替换商品封面图**。第一版先跑通「配置账号 → 绑定独立 Chrome 配置目录(保留登录态)→ 用某账号打开指定商品详情页 → 改标题 + 换封面(可选提交更新)」闭环。 cmshopee 是一个给**电商运营**使用的 Windows 桌面自动化工具,用于**管理多个 Shopee 卖家账号、并用 CDP 驱动 Chrome 批量修改商品标题、替换商品封面图**。V0 已验证单账号「改标题 + 换封面」闭环;当前 V1 目标是 5 Tab 流水线:导入采集 → AI 生成 → 点击「开始更新」并确认后批量提交 → 回写结果。
## 文档导航 ## 文档导航
+2 -2
View File
@@ -116,7 +116,7 @@ collect(account, task) -> dict # -> {old_title, old_cover_path}
change_title(cdp, new_title) -> dict # {ok, value, modelvalue},要求三者相等 change_title(cdp, new_title) -> dict # {ok, value, modelvalue},要求三者相等
replace_cover(cdp, image_win_path) -> dict # 上传→等CDN→拖第一位;满9张先删第一张 replace_cover(cdp, image_win_path) -> dict # 上传→等CDN→拖第一位;满9张先删第一张
click_update(cdp) -> dict # {clicked, reason};禁用则记失败 click_update(cdp) -> dict # {clicked, reason};禁用则记失败
apply_task(account, task) -> dict # 对已生成任务:换标题+换封面+点「更新」提交(恒提交) apply_task(account, task) -> dict # 对已生成任务:换标题+换封面+点「更新」提交(调用前必须已做批量确认)
# -> {committed, error} # -> {committed, error}
``` ```
@@ -142,7 +142,7 @@ generate_batch(tasks, prompts, ai_cfg, on_progress, should_stop) -> None
- 并发数/重试/分辨率/jpg 质量来自 `appconfig.ai_config()`;Key 加密存、不入日志。 - 并发数/重试/分辨率/jpg 质量来自 `appconfig.ai_config()`;Key 加密存、不入日志。
- 标题快、图片慢:分两段、各用各自并发数;失败按 `retry` 重试,仍失败记 error 不阻塞其余。 - 标题快、图片慢:分两段、各用各自并发数;失败按 `retry` 重试,仍失败记 error 不阻塞其余。
- 调用有成本与失败可能:超时、限流、内容安全拒绝都要返回明确错误。 - 调用有成本与失败可能:超时、限流、内容安全拒绝都要返回明确错误。
- 生成结果**直接用于 ③ 更新**(无人工确认);本地留档 + 回写 Excel 供追溯。 - 生成结果**直接进入 ③ 更新候选**;③ 点击「开始更新」后弹窗批量确认,确认后提交线上。本地留档 + 回写 Excel 供追溯。
## prompts 模块(`prompts.py`,待建) ## prompts 模块(`prompts.py`,待建)
+7 -7
View File
@@ -5,8 +5,8 @@
## 当前快照 ## 当前快照
- 日期:2026-06-25 - 日期:2026-06-26
- 阶段:单账号 CDP 流程已验证;多账号管理 + 5 Tab GUI + Excel/AI 流水线为既定设计,尚未开始编码。 - 阶段:V0 单账号 CDP 流程已验证;V1 多账号管理 + 5 Tab GUI + Excel/AI 流水线为既定设计,尚未开始编码。
- 技术栈:Python 3.10+,自研 CDP(websocket-client + requests),SQLite(sqlite3)+ `config.json` + openpyxl + AI(服务商待定),GUI Tkinter 5 Tab(待最终确认)。 - 技术栈:Python 3.10+,自研 CDP(websocket-client + requests),SQLite(sqlite3)+ `config.json` + openpyxl + AI(服务商待定),GUI Tkinter 5 Tab(待最终确认)。
- 生产代码:尚无 `appconfig/db/excel/config/chrome/editor/gui`;现有为验证脚本 + `cdp.py`。 - 生产代码:尚无 `appconfig/db/excel/config/chrome/editor/gui`;现有为验证脚本 + `cdp.py`。
- 测试:以 `py_compile` + 在测试商品上手动跑 `prototypes/demo.py` 为主,无自动化测试。 - 测试:以 `py_compile` + 在测试商品上手动跑 `prototypes/demo.py` 为主,无自动化测试。
@@ -15,11 +15,11 @@
## 既定设计要点(文档已定) ## 既定设计要点(文档已定)
- GUI:**5 Tab 流水线**,顺序 ① 导入采集 → ② AI生成 → ③ 更新shopee → ④ 账号管理 → ⑤ 设置。 - GUI:**5 Tab 流水线**,顺序 ① 导入采集 → ② AI生成 → ③ 更新shopee → ④ 账号管理 → ⑤ 设置。
- 流水线阶段:imported → collected(采集旧标题/旧封面+下载+回写)→ generated(AI 提示词生成新标题/新封面)→ applied(改 Shopee 并直接提交)。**无 confirmed、无提交开关。** - 流水线阶段:imported → collected(采集旧标题/旧封面+下载+回写)→ generated(AI 提示词生成新标题/新封面)→ applied(③ 弹窗批量确认后改 Shopee 并提交)。**无 confirmed、无常驻提交开关。**
- 存储:`config.json`(应用设置含 AI Key)+ SQLite `cmshopee.db`(账号/任务/各阶段结果)+ openpyxl(Excel)+ 本地 `images/`(旧/新封面)。 - 存储:`config.json`(应用设置)+ `config/ai_models.json`(AI 模型清单与加密 Key)+ SQLite `cmshopee.db`(账号/任务/各阶段结果)+ openpyxl(Excel)+ 本地 `images/`(旧/新封面)。
- 多账号隔离:每账号独立 user-data-dir(非 profile)。 - 多账号隔离:每账号独立 user-data-dir(非 profile)。
- 账号↔任务绑定:以 Excel“别名”列为权威;未匹配略过,结束弹窗汇总。 - 账号↔任务绑定:以 Excel“别名”列为权威;未匹配略过,结束弹窗汇总。
- 执行:多账号串行、单条失败继续;③ 执行即点「更新」提交线上(无确认、无开关)。 - 执行:多账号串行、单条失败继续;③ 点击「开始更新」后弹窗确认当前筛选范围和任务数量,确认后逐条点「更新」提交线上。
- AI:服务商待定;生成内容直接用于更新,本地留档+回写 Excel 供追溯。 - AI:服务商待定;生成内容直接用于更新,本地留档+回写 Excel 供追溯。
- 登录:人工登录 + 程序检测,不自动登录;首次未配账号/未登录时 ① ③ 禁用并引导去④。 - 登录:人工登录 + 程序检测,不自动登录;首次未配账号/未登录时 ① ③ 禁用并引导去④。
@@ -40,7 +40,7 @@
- 找到/新建商品详情页 tab,等编辑器就绪。 - 找到/新建商品详情页 tab,等编辑器就绪。
- 改标题:原生 setter + 派发事件,`value` 与 `modelvalue` 双等于新值。 - 改标题:原生 setter + 派发事件,`value` 与 `modelvalue` 双等于新值。
- 换封面:`setFileInputFiles` 上传(`.shopee-image-manager__upload input[type=file]`)→ 等 CDN 链接 → `Input.dispatchMouseEvent` 拖到第一位(落点 `first.left - 0.30*w`)。 - 换封面:`setFileInputFiles` 上传(`.shopee-image-manager__upload input[type=file]`)→ 等 CDN 链接 → `Input.dispatchMouseEvent` 拖到第一位(落点 `first.left - 0.30*w`)。
- 「更新」按钮:可点才点,禁用态识别;默认不提交。 - 「更新」按钮:可点才点,禁用态识别;③ 未批量确认前不提交。
## 任务看板状态 ## 任务看板状态
@@ -74,7 +74,7 @@ set UPDATE=1 && python prototypes/demo.py
1. 读仓库级 `AGENTS.md` / `CLAUDE.md`(如有)。 1. 读仓库级 `AGENTS.md` / `CLAUDE.md`(如有)。
2. 读 `docs/00-ai-start-here.md`。 2. 读 `docs/00-ai-start-here.md`。
3. 读 `docs/05-coding-rules.md` 与 `docs/04-architecture.md` 第四节。 3. 读 `docs/05-coding-rules.md` 与 `docs/04-architecture.md` 第七节。
4. 在 `docs/06-tasks.md` 取第一个 `TODO` 且依赖 `DONE` 的任务。 4. 在 `docs/06-tasks.md` 取第一个 `TODO` 且依赖 `DONE` 的任务。
5. 将该任务状态改为 `DOING`。 5. 将该任务状态改为 `DOING`。
+10 -9
View File
@@ -12,11 +12,11 @@
| --- | --- | --- | | --- | --- | --- |
| ① 导入采集 | 导入多个 Excel;任务列表;**采集**商品当前的旧标题/旧封面(只读),封面图下载本地;回写 Excel 旧字段 | 只读,低 | | ① 导入采集 | 导入多个 Excel;任务列表;**采集**商品当前的旧标题/旧封面(只读),封面图下载本地;回写 Excel 旧字段 | 只读,低 |
| ② AI生成 | 左侧标题/封面**提示词**;右侧按批次/店铺筛选任务列表;AI 生成新标题/新封面;双击看新旧封面 | 不触线上,中 | | ② AI生成 | 左侧标题/封面**提示词**;右侧按批次/店铺筛选任务列表;AI 生成新标题/新封面;双击看新旧封面 | 不触线上,中 |
| ③ 更新shopee | 对**已生成**任务打开编辑页换标题+封面并**直接点「更新」提交**;结果回写 Excel | **写线上,高** | | ③ 更新shopee | 对**已生成**任务点击「开始更新」后弹窗确认;确认后打开编辑页换标题+封面并逐条点「更新」提交;结果回写 Excel | **写线上,高** |
| ④ 账号管理 | Shopee 账号(账号名/别名/数据目录/端口/密码加密/登录状态);启动登录、检测登录、生成快捷方式 | 中 | | ④ 账号管理 | Shopee 账号(账号名/别名/数据目录/端口/密码加密/登录状态);启动登录、检测登录、生成快捷方式 | 中 |
| ⑤ 设置 | AI 模型/API Key、本地图片目录、Chrome 路径、默认端口等 | — | | ⑤ 设置 | AI 模型/API Key、本地图片目录、Chrome 路径、默认端口等 | — |
任务的**阶段状态**贯穿各 Tab:`imported → collected → generated → applied`(或 `failed/skipped`)。**无人工确认、无提交开关**。各 Tab 聚焦各自阶段的列与按钮,但操作同一批任务(同一 batch)。 任务的**阶段状态**贯穿各 Tab:`imported → collected → generated → applied`(或 `failed/skipped`)。② 不设逐条人工确认阶段;③ 无常驻提交开关,但点击「开始更新」后必须弹窗确认当前筛选范围和任务数量。各 Tab 聚焦各自阶段的列与按钮,但操作同一批任务(同一 batch)。
## 首次使用引导保护 ## 首次使用引导保护
@@ -74,14 +74,14 @@
- 底部**单个「开始生成」+「停止」**:开始生成 = **先按 `title_concurrency` 并发生成标题,接着按 `image_concurrency` 并发生成封面**;进度实时显示 标题/封面/失败 计数。 - 底部**单个「开始生成」+「停止」**:开始生成 = **先按 `title_concurrency` 并发生成标题,接着按 `image_concurrency` 并发生成封面**;进度实时显示 标题/封面/失败 计数。
- 生成参数(标题/图片并发数、失败重试、分辨率、jpg 质量、模型/Key)在 **⑤ 设置**,不在本 Tab 重复。 - 生成参数(标题/图片并发数、失败重试、分辨率、jpg 质量、模型/Key)在 **⑤ 设置**,不在本 Tab 重复。
- 每条/每张完成即写库;「停止」取消未开始项,可再次「开始生成」对剩余继续。 - 每条/每张完成即写库;「停止」取消未开始项,可再次「开始生成」对剩余继续。
- **无人工确认环节**;新标题直接用 AI 输出(不可编辑);可选对单行 `重生成`。生成完即可进入 ③。 - **无逐条人工审核环节**;新标题直接用 AI 输出(不可编辑);可选对单行 `重生成`。生成完即可进入 ③,③ 开始更新前会做批量确认。
## ③ 更新shopee ## ③ 更新shopee
``` ```
┌ 更新shopee ───────────────────────────────────────────────────┐ ┌ 更新shopee ───────────────────────────────────────────────────┐
│ 批次[本次▼] 店铺[全部▼] 状态[已生成▼] [筛选] │ │ 批次[本次▼] 店铺[全部▼] 状态[已生成▼] [筛选] │
│ ⚠ 「开始更新」对【当前筛选结果】执行,即改标题+换封面并直接提交 │ │ ⚠ 点击「开始更新」后确认【当前筛选结果】,确认后改标题+换封面并提交 │
│ ┌───────────────────────────────────────────────────────────┐ │ │ ┌───────────────────────────────────────────────────────────┐ │
│ │ 店铺 商品ID 新标题 新封面 阶段 结果 │ │ │ │ 店铺 商品ID 新标题 新封面 阶段 结果 │ │
│ └───────────────────────────────────────────────────────────┘ │ │ └───────────────────────────────────────────────────────────┘ │
@@ -92,7 +92,8 @@
- 顶部**按批次 / 店铺 / 状态筛选**(与 ①②一致);「开始更新」作用于**当前筛选结果**,是一道范围控制。 - 顶部**按批次 / 店铺 / 状态筛选**(与 ①②一致);「开始更新」作用于**当前筛选结果**,是一道范围控制。
- 店铺筛选:建议**逐店铺更新**(每店铺需先启动其 Chrome 并登录)。 - 店铺筛选:建议**逐店铺更新**(每店铺需先启动其 Chrome 并登录)。
- 状态筛选:`已生成` 只跑未更新的;`失败` 用于**失败重试**;`已更新成功/略过` 仅查看。 - 状态筛选:`已生成` 只跑未更新的;`失败` 用于**失败重试**;`已更新成功/略过` 仅查看。
- 对筛选出的**已生成(generated)任务**执行:打开编辑页换标题+换封面 → **总是点「更新」提交**(无开关)。 - 点击「开始更新」后弹窗展示本次筛选条件、任务数量和“将提交线上”的风险提示;用户点「是/确认」才开始,点「否/取消」不执行。
- 对确认后的**已生成(generated)任务**执行:打开编辑页换标题+换封面 → 点「更新」提交。
- 串行、单条失败继续;每条立即写回 SQLite(committed/状态/error)。 - 串行、单条失败继续;每条立即写回 SQLite(committed/状态/error)。
- 全部完成 → 把新标题/新封面/更新状态批量回写原 Excel;弹窗汇总。 - 全部完成 → 把新标题/新封面/更新状态批量回写原 Excel;弹窗汇总。
@@ -122,13 +123,13 @@
│ │
① 导入采集:导入 Excel → 采集旧标题/旧封面 → 回写旧字段 ① 导入采集:导入 Excel → 采集旧标题/旧封面 → 回写旧字段
│ │
② AI生成:提示词 → 生成新标题/新封面(无确认) ② AI生成:提示词 → 生成新标题/新封面(无逐条审核)
│ │
③ 更新shopee:对已生成任务换标题+封面 → 直接点「更新」提交 → 回写结果 ③ 更新shopee:对已生成任务点击开始更新 → 弹窗确认 → 换标题+封面 → 点「更新」提交 → 回写结果
``` ```
- 未配账号/未登录:① ③ 的执行按钮禁用并提示去 ④。 - 未配账号/未登录:① ③ 的执行按钮禁用并提示去 ④。
- 已生成的任务即可进 ③;③ 执行即提交线上(无确认、无开关)。 - 已生成的任务即可进 ③;③ 用户确认批量弹窗后提交线上,无常驻提交开关。
- 任意步骤失败:记入该任务、日志标明,不影响其他任务。 - 任意步骤失败:记入该任务、日志标明,不影响其他任务。
## 组件建议(Tkinter) ## 组件建议(Tkinter)
@@ -138,7 +139,7 @@
| `MainNotebook` | 根窗口 | 5 个 Tab | | `MainNotebook` | 根窗口 | 5 个 Tab |
| `CollectTab` | ① | 导入、任务表、采集、回写 | | `CollectTab` | ① | 导入、任务表、采集、回写 |
| `GenerateTab` | ② | 左提示词 + 右筛选/任务列表、双击看新旧封面、开始生成 | | `GenerateTab` | ② | 左提示词 + 右筛选/任务列表、双击看新旧封面、开始生成 |
| `ApplyTab` | ③ | 已生成任务、换标题+封面+直接提交、回写 | | `ApplyTab` | ③ | 已生成任务、开始更新确认、换标题+封面+提交、回写 |
| `AccountsTab` | ④ | 账号增删改、启动登录 | | `AccountsTab` | ④ | 账号增删改、启动登录 |
| `SettingsTab` | ⑤ | AI/目录/Chrome 配置 | | `SettingsTab` | ⑤ | AI/目录/Chrome 配置 |
+3 -3
View File
@@ -4,10 +4,10 @@ cmshopee 5 Tab 桌面应用的界面效果图。SVG 可用浏览器直接打开
| 文件 | 内容 | | 文件 | 内容 |
| --- | --- | | --- | --- |
| [overview-pipeline.svg](overview-pipeline.svg) | 5 Tab 流水线总览(stage:imported→collected→generated→confirmed→applied) | | [overview-pipeline.svg](overview-pipeline.svg) | 5 Tab 流水线总览(stage:imported→collected→generated→applied) |
| [tab1-import-collect.svg](tab1-import-collect.svg) | ① 导入采集:导入 Excel、任务列表、采集旧标题/旧封面、回写、日志 | | [tab1-import-collect.svg](tab1-import-collect.svg) | ① 导入采集:导入 Excel、任务列表、采集旧标题/旧封面、回写、日志 |
| [tab2-ai-generate.svg](tab2-ai-generate.svg) | ② AI生成:提示词、生成、新旧对照预览、确认/重生成 | | [tab2-ai-generate.svg](tab2-ai-generate.svg) | ② AI生成:提示词、生成、新旧对照预览、重生成 |
| [tab3-update-shopee.svg](tab3-update-shopee.svg) | ③ 更新shopee:已确认任务、批次提交开关、执行结果、汇总 | | [tab3-update-shopee.svg](tab3-update-shopee.svg) | ③ 更新shopee:已生成任务、开始更新确认、执行结果、汇总 |
| [tab4-accounts.svg](tab4-accounts.svg) | ④ 账号管理:账号列表、启动登录、检测登录、账号编辑弹窗 | | [tab4-accounts.svg](tab4-accounts.svg) | ④ 账号管理:账号列表、启动登录、检测登录、账号编辑弹窗 |
| [tab5-settings.svg](tab5-settings.svg) | ⑤ 设置:AI 模型/Key、路径、端口 | | [tab5-settings.svg](tab5-settings.svg) | ⑤ 设置:AI 模型/Key、路径、端口 |
+4 -4
View File
@@ -18,12 +18,12 @@
<text class="h1" x="24" y="40">cmshopee · 5 Tab 流水线总览</text> <text class="h1" x="24" y="40">cmshopee · 5 Tab 流水线总览</text>
<text class="sub" x="24" y="60">工作流优先顺序 · 对象是 Excel 里的每一行任务 · 状态字段 stage 贯穿全程</text> <text class="sub" x="24" y="60">工作流优先顺序 · 对象是 Excel 里的每一行任务 · 状态字段 stage 贯穿全程</text>
<!-- stage chips row (无 confirmed、无提交开关) --> <!-- stage chips row (无 confirmed、无常驻提交开关;③ 开始更新需批量确认) -->
<g transform="translate(24,84)"> <g transform="translate(24,84)">
<rect class="stage" x="0" y="0" width="200" height="26" rx="13"/><text class="stageT" x="66" y="17">imported</text> <rect class="stage" x="0" y="0" width="200" height="26" rx="13"/><text class="stageT" x="66" y="17">imported</text>
<rect class="stage" x="230" y="0" width="200" height="26" rx="13"/><text class="stageT" x="292" y="17">collected</text> <rect class="stage" x="230" y="0" width="200" height="26" rx="13"/><text class="stageT" x="292" y="17">collected</text>
<rect class="stage" x="460" y="0" width="200" height="26" rx="13"/><text class="stageT" x="520" y="17">generated</text> <rect class="stage" x="460" y="0" width="200" height="26" rx="13"/><text class="stageT" x="520" y="17">generated</text>
<rect class="stage" x="690" y="0" width="200" height="26" rx="13"/><text class="stageT" x="742" y="17">applied(直接提交)</text> <rect class="stage" x="690" y="0" width="200" height="26" rx="13"/><text class="stageT" x="730" y="17">applied(确认后提交)</text>
</g> </g>
<!-- 5 tab cards --> <!-- 5 tab cards -->
@@ -49,7 +49,7 @@
<text class="ds" x="14" y="118">旧标题→新标题</text> <text class="ds" x="14" y="118">旧标题→新标题</text>
<text class="ds" x="14" y="136">旧封面→新封面</text> <text class="ds" x="14" y="136">旧封面→新封面</text>
<text class="ds" x="14" y="156">双击看新旧封面</text> <text class="ds" x="14" y="156">双击看新旧封面</text>
<text class="ds" x="14" y="190" fill="#20a464">→ generated(无确认)</text> <text class="ds" x="14" y="190" fill="#20a464">→ generated(无逐条审核)</text>
</g> </g>
<g transform="translate(386,0)"> <g transform="translate(386,0)">
<rect class="card" x="0" y="0" width="168" height="210" rx="8"/> <rect class="card" x="0" y="0" width="168" height="210" rx="8"/>
@@ -57,7 +57,7 @@
<text class="st" x="14" y="52">已生成任务</text> <text class="st" x="14" y="52">已生成任务</text>
<text class="ds" x="14" y="72">打开编辑页</text> <text class="ds" x="14" y="72">打开编辑页</text>
<text class="ds" x="14" y="90">换标题 + 换封面</text> <text class="ds" x="14" y="90">换标题 + 换封面</text>
<text class="ds" x="14" y="108">直接点更新提交</text> <text class="ds" x="14" y="108">开始更新确认后提交</text>
<text class="st" x="14" y="134">串行 · 失败继续</text> <text class="st" x="14" y="134">串行 · 失败继续</text>
<text class="ds" x="14" y="154">实时写库 + 回写Excel</text> <text class="ds" x="14" y="154">实时写库 + 回写Excel</text>
<text class="ds" x="14" y="190" fill="#20a464">→ applied</text> <text class="ds" x="14" y="190" fill="#20a464">→ applied</text>

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

+1 -1
View File
@@ -90,7 +90,7 @@
<text class="cell" x="220" y="179">…百搭耳環飾品</text><text class="cell" x="420" y="179" fill="#2f6fed">生成中…</text> <text class="cell" x="220" y="179">…百搭耳環飾品</text><text class="cell" x="420" y="179" fill="#2f6fed">生成中…</text>
<circle cx="606" cy="175" r="4" fill="#2f6fed"/><text class="cell" x="616" y="179">处理中</text> <circle cx="606" cy="175" r="4" fill="#2f6fed"/><text class="cell" x="616" y="179">处理中</text>
</g> </g>
<text class="mut" x="14" y="392">新标题直接用 AI 输出(不可编辑)· 可对单行右键「重生成」· 无人工确认</text> <text class="mut" x="14" y="392">新标题直接用 AI 输出(不可编辑)· 可对单行右键「重生成」· 无逐条审核</text>
</g> </g>
<!-- bottom action --> <!-- bottom action -->

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

+1 -1
View File
@@ -28,7 +28,7 @@
<!-- warn bar --> <!-- warn bar -->
<g transform="translate(18,128)"> <g transform="translate(18,128)">
<rect x="0" y="0" width="904" height="24" rx="6" fill="#fdeceb" stroke="#f3c2bd"/> <rect x="0" y="0" width="904" height="24" rx="6" fill="#fdeceb" stroke="#f3c2bd"/>
<text x="14" y="16" font-size="12" fill="#b23b30">⚠ 「开始更新」对【当前筛选结果】执行:改标题+换封面并直接提交线上(无确认、无开关)</text> <text x="14" y="16" font-size="12" fill="#b23b30">⚠ 点击「开始更新」后确认【当前筛选结果】:确认后改标题+换封面并提交线上</text>
</g> </g>
<!-- table --> <!-- table -->

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

+11
View File
@@ -158,4 +158,15 @@
- 注意:`prototypes/demo.py` 依赖根目录 `cdp.py`,需从项目根运行或设 PYTHONPATH。 - 注意:`prototypes/demo.py` 依赖根目录 `cdp.py`,需从项目根运行或设 PYTHONPATH。
- 下一步:Phase 0 起步(T-001/T-002/T-003)。 - 下一步: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 接入任务依赖。
<!-- 新一轮从这里向下追加记录。 --> <!-- 新一轮从这里向下追加记录。 -->