docs(tasks): add T-583/T-584 title prompt template management

T-583 数据层:泛化 prompts 模板 CRUD(cover 转薄封装)、加 title_templates
目录、title_prompt.txt 保留为工作文本(加法不换单文件)、拿现有默认播一条;
不碰 generate_batch。T-584 UI reorg:标题加模板控件行(label 下单独一行)、
封面控件压一行、插入类按钮下移输入框工具条、标题输入框增高。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
chengma
2026-07-10 11:17:44 +08:00
co-authored by Claude Opus 4.8
parent 8ebabe1a12
commit 5fa3b921bb
2 changed files with 136 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
---
id: T-583
title: 标题提示词模板数据层:泛化 prompts 模板 CRUD + 新增 title_templates 目录(加法,不换单文件)
phase: 7
deps: []
status: TODO
created: 2026-07-10
---
## 问题 / 背景
②标题提示词现为**单文件** `title_prompt.txt`(一条,`prompts.load/save_title_prompt`),无模板管理;封面提示词已是**目录多模板**(`cover_prompts_dir` + 一套 CRUD)。运营希望标题也能像封面一样存/取多个命名模板。
已核关键事实(决定改动范围):
- 生成时 `generate_batch(tasks, prompts, ...)` 的 `prompts["title"]/["cover"]` **取编辑框当前文本**(`generate.py:1219`/`1281`),**不读文件/模板**。模板只是"把某段文本载入编辑框"的持久化层——**本任务不碰 `generate_batch`、不碰生成读取路径**。
- `prompts.py` 现有 `list/load/save/rename/delete_cover_template` 五个写死 cover 的函数 + `render_prompt`(共享)+ `ensure_default_prompts`(播种默认封面模板)。
定案(已评审):
1. **加法、不换单文件**:`title_prompt.txt` **保留为"当前工作文本"**(语义不变、不迁移、编辑框仍从它载入),**另加** `title_templates/` 目录放命名模板。纯新增能力,零迁移、零丢失风险。
2. **泛化 CRUD**:把 cover 那五个函数泛化成按目录参数化的通用模板 CRUD,标题/封面共用一套,不复制第二份(防两套分叉)。
3. **标题默认模板**:拿现有默认标题提示词播一条进 `title_templates/`(不新建 `default_prompts/title` 包)。
本任务只做数据层,无 UI(UI reorg 见 T-584)。
## 方案(改哪个文件、改成什么)
### `app/prompts.py` — 泛化模板 CRUD
- 抽出目录参数化的通用函数(命名实现定,如):`list_templates(directory)`、`load_template(name, directory)`、`save_template(name, text, directory)`、`rename_template(old, new, directory)`、`delete_template(name, directory)`,含现有 `_normalize_name`/`_template_path`/重名保护。
- 现有 `*_cover_template` 保留为**薄封装**(转调通用函数,传 `COVER_PROMPTS_DIR`),保证封面既有调用点零改动、零回归。
- 新增标题模板薄封装或直接让 GUI 传 `title_templates` 目录调用通用函数(择一,UI 任务据此对接)。
### `app/appconfig.py` — 目录路径
- 新增 `title_templates_dir(config=None)` → `data_path("title_templates", ...)`(与 `cover_prompts_dir` 同款)。
### `app/prompts.py` `ensure_default_prompts` — 播种标题默认模板
- 现有逻辑保留(`title_prompt.txt` 缺失时写默认、封面模板缺失时播默认)。
- 新增:若 `title_templates/` 为空,把**现有默认标题提示词**(`_read_default_prompt_text("title_prompt.txt")` 同源)作为一条模板播入(模板名如「默认」)。不新建 `app/default_prompts/title` 包。
### 数据/边界
- `title_prompt.txt` 语义**不变**:仍是编辑框当前工作文本的持久化,`load/save_title_prompt` 不动。
- 标题模板与封面模板是**两个独立目录**,占位符(标题 `{旧标题}` 等 vs 封面 `{新标题}` 等)各自语义不变;`render_prompt` 共享不改。
## 验收要点
- 通用模板 CRUD 存在且被 cover 薄封装复用;`list/load/save/rename/delete_cover_template` 行为不回归(既有封面模板测试全绿)。
- 新增 `title_templates_dir` 指向 `data/title_templates`;`list_templates` 能对该目录增删查、重名保护生效。
- `ensure_default_prompts`:`title_templates/` 为空时播入一条默认标题模板(内容 = 现有默认标题提示词);已有模板时不覆盖。
- `title_prompt.txt` 及 `load/save_title_prompt` 行为不变(编辑框工作文本不受影响,无迁移、无丢失)。
- 标题/封面模板互不干扰(各自目录)。
- 不改 `generate_batch`/生成读取路径/`render_prompt`。
- 验证命令(unittest,不引入 pytest):
- `py -3.10 -m unittest tests.test_prompts tests.test_appconfig`(若无 test_prompts 则新建)
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`
- `git diff --check`
## 边界(不改什么)
- 不动 `generate_batch`、生成时的 prompt 读取(仍取编辑框文本)。
- 不改 `title_prompt.txt` 语义、不迁移/删除该文件。
- 不复制第二份模板 CRUD;封面走薄封装复用通用实现。
- 不做 GUI(T-584);不新建 `default_prompts/title` 包。
- 不改 CDP/DB/AI 请求/cmhub/Excel。
## 执行记录
(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)
+70
View File
@@ -0,0 +1,70 @@
---
id: T-584
title: ②左侧提示词区 reorg:标题提示词加模板控件行 + 封面控件压一行 + 插入类按钮下移工具条 + 增高标题输入框
phase: 7
deps: [T-583]
status: TODO
created: 2026-07-10
---
## 问题 / 背景
②标题提示词区现无模板管理(只有 label + 输入框 + 「保存标题提示词」+「插入旧标题」);封面提示词区已有「下拉框/新建/保存/模板操作(另存为/重命名/删除)」但铺了多行。T-583 已提供标题模板数据层(`title_templates/` + 通用 CRUD + 默认模板播种)。本任务做左侧 UI 重排,让标题拥有与封面对等的模板管理,并腾出纵向空间给标题输入框。
定案排布(已评审):
- 模板控件放在 **label 下方单独一行**(不贴 label 同行——窄栏塞不下下拉+3按钮)。
- **插入类按钮**(标题「插入旧标题」T-549、封面「插入标题」、「预览」)移到**各自输入框下方的工具条**,与"模板管理"分离。
- 封面模板控件压到一行,省出的纵向空间给标题输入框增高。
## 方案(改哪个文件、改成什么)
### `app/gui/tabs/generate.py` — 左侧布局重排
标题提示词区(新结构,自上而下):
1. label「标题提示词」
2. **模板控件行**(新增):`[标题模板下拉] [新建] [保存] [模板操作▾(另存为/重命名/删除)]`——镜像封面那套,控件用 `title_template_*` 命名,调 T-583 通用 CRUD(传 `title_templates_dir`)。
3. 标题输入框 `title_prompt_edit`(**增高**,吃掉封面压行省出的空间)。
4. **输入框下工具条**:`[插入旧标题] [保存标题提示词]`(`insert_old_title_button` 保留 T-549 行为;「保存标题提示词」= 存当前工作文本到 `title_prompt.txt`,与"保存模板"区分)。
封面提示词区(压缩):
1. label「封面提示词」
2. **模板控件行**(压到一行):`[封面模板下拉] [新建] [保存] [模板操作▾]`。
3. 封面输入框 `cover_prompt_edit`。
4. **输入框下工具条**:`[插入标题] [预览]`。
### 标题模板控件行为(镜像封面 handler)
- 下拉:`refresh_title_templates`/`load_selected_title_template`(选中→载入内容到 `title_prompt_edit`,记 `current_title_template`)。
- 新建 / 保存(存当前模板) / 模板操作(另存为/重命名/删除)——复用 T-583 通用 CRUD,逻辑镜像 `*_cover_template` 现有 handler。
- 「保存标题提示词」(工作文本→`title_prompt.txt`)与「保存(模板)」是两件事,二者都保留、语义在 tooltip 说清。
### 命名 / 一致性
- 新控件 `objectName` 用 `titleTemplateCombo`/`newTitleTemplateButton`/`saveTitleTemplateButton`/`titleTemplateActionsButton` + 三个 action,供测试定位。
- 「模板操作」下拉/菜单结构与封面一致(另存为/重命名/删除)。
### 文档同步
- `docs/routes.md`/②UI 文档/线框图:登记标题模板控件行、插入类按钮下移、封面压行。
## 验收要点
- 标题提示词区出现模板控件行(下拉/新建/保存/模板操作),能新建/切换/保存/另存为/重命名/删除标题模板(走 T-583 CRUD),切换模板载入内容到标题输入框。
- 「插入旧标题」移到标题输入框下方工具条、T-549 插入 `{旧标题}` 行为不回归;封面「插入标题」「预览」移到封面输入框下方工具条、行为不回归。
- 封面模板控件压到一行;标题输入框可用高度较改动前增大(人工/布局断言二选一记录)。
- 「保存标题提示词」(工作文本)与「保存模板」并存、各自写 `title_prompt.txt` / 模板文件,不混淆。
- 生成仍取编辑框当前文本(不回归);标题/封面模板互不干扰。
- 既有封面模板 UI 测试不回归。
- 验证命令(unittest,不引入 pytest;GUI offscreen):
- `py -3.10 -m unittest tests.test_gui`
- `python -m ruff check app tests main.py`
- `py -3.10 -m compileall app main.py`
- `py -3.10 -m unittest discover -s tests`
- `git diff --check`
## 边界(不改什么)
- 不改 T-583 数据层契约(CRUD/目录/默认播种)。
- 不改 `generate_batch`/生成读取路径/`render_prompt`/AI/cmhub。
- 不改封面模板既有 handler 逻辑本身(仅调整其控件所在布局行)。
- 不改标题/封面占位符语义、`title_prompt.txt` 工作文本语义。
- 不改右侧任务表、生成/停止/重置按钮区、③/①/CDP/DB。
## 执行记录
(做完在这里写:改了什么文件、跑了什么验证命令及结果、遇到的阻塞、关键决策。)