# 剧集提取交互增强与规则预设 Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 为 `episodeExtract` 增加样本/整段回填/片段回填/失败快捷修正交互,并新增“最近使用 + 命名模板”规则预设系统。 **Architecture:** 保持现有三栏结构不变,由 `file-selector-panel` 作为统一状态源,协调 `config-panel`、`preview-panel` 与新增加的预设存储工具层。规则预设通过 `storage` 持久化,剧集提取辅助通过新增状态对象和组件事件流串联。 **Tech Stack:** TypeScript、Lit Web Components、Vitest、chrome.storage/localStorage fallback --- ## 文件结构与职责 ### 新增文件 - `src/types/rule-preset.ts` — 规则预设与剧集提取辅助状态类型定义 - `src/utils/rule-presets.ts` — 最近使用/模板的读写、去重、摘要、覆盖策略 - `tests/unit/rule-presets.test.ts` — 预设工具层单测 ### 修改文件 - `src/content/components/config-panel.ts` — 增加剧集提取辅助区、最近使用区、模板区与事件派发 - `src/content/components/preview-panel.ts` — 增加 episodeExtract 下的整段回填、片段回填、失败快捷修正事件 - `src/content/components/file-selector-panel.ts` — 统一管理辅助状态、预设状态、预设加载/应用/记录逻辑 - `src/types/file-selector.ts` — 如有必要,扩展 `PreviewItem` 或新增事件类型定义 - `src/locales/zh_CN.json` / `src/locales/zh_TW.json` / `src/locales/en.json` — 新增文案 - `tests/unit/config-panel-*.test.ts` / `tests/unit/file-selector-panel-*.test.ts` / 可能新增 `tests/unit/preview-panel-*.test.ts` — 组件与集成测试 --- ### Task 1: 定义预设与辅助状态类型 **Files:** - Create: `src/types/rule-preset.ts` - Modify: `src/types/file-selector.ts` - Test: `tests/unit/rule-presets.test.ts` - [ ] **Step 1: 写失败测试,约束数据结构与默认值预期** 在 `tests/unit/rule-presets.test.ts` 添加最小测试,覆盖: - 可以接受 `RuleConfig` - `EpisodeExtractAssistState` 默认目标为 `prefix` - `fillMode` 默认值为 `full-name` - [ ] **Step 2: 运行测试确认失败** Run: `npx vitest run tests/unit/rule-presets.test.ts` Expected: FAIL,提示模块不存在或导出缺失。 - [ ] **Step 3: 新增类型文件并补充必要导出** 实现: - `RulePresetRecord` - `RulePresetSource` - `EpisodeExtractFillTarget` - `EpisodeExtractFillMode` - `EpisodeExtractAssistState` - 如需要,在 `src/types/file-selector.ts` 增加预览辅助相关事件 detail 类型 - [ ] **Step 4: 重新运行测试确认通过** Run: `npx vitest run tests/unit/rule-presets.test.ts` Expected: PASS - [ ] **Step 5: 提交** ```bash git add src/types/rule-preset.ts src/types/file-selector.ts tests/unit/rule-presets.test.ts git commit -m "feat: add rule preset and extract assist types" ``` ### Task 2: 实现规则预设工具层 **Files:** - Create: `src/utils/rule-presets.ts` - Test: `tests/unit/rule-presets.test.ts` - Reference: `src/utils/storage.ts`, `src/types/rule.ts` - [ ] **Step 1: 扩展失败测试,覆盖预设工具行为** 在 `tests/unit/rule-presets.test.ts` 增加测试: - 保存 recent 时自动去重并置顶 - recent 超过 8 条会截断 - 保存 template 需要名称 - 同名 template 可被覆盖 - 失效配置不会通过应用前校验 - 生成摘要字符串可用 - [ ] **Step 2: 运行测试确认失败** Run: `npx vitest run tests/unit/rule-presets.test.ts` Expected: FAIL,提示函数未实现。 - [ ] **Step 3: 实现 `src/utils/rule-presets.ts`** 至少提供这些函数: - `getRecentRulePresets()` - `recordRecentRulePreset(config)` - `getTemplateRulePresets()` - `saveTemplateRulePreset(name, config, options?)` - `deleteTemplateRulePreset(id)` - `buildRulePresetSummary(config)` - `isRulePresetConfigValid(config)` 实现要求: - 通过 `storage` 持久化 - recent 去重 + 截断 - template 支持同名查重/覆盖 - 所有读取失败回退为空数组 - [ ] **Step 4: 运行工具层测试确认通过** Run: `npx vitest run tests/unit/rule-presets.test.ts` Expected: PASS - [ ] **Step 5: 提交** ```bash git add src/utils/rule-presets.ts tests/unit/rule-presets.test.ts git commit -m "feat: add rule preset storage utilities" ``` ### Task 3: 为 `config-panel` 增加规则预设 UI **Files:** - Modify: `src/content/components/config-panel.ts` - Test: `tests/unit/config-panel-rule-presets.test.ts` - Reference: `tests/unit/config-panel-undo.test.ts` - [ ] **Step 1: 写失败测试,覆盖模板区与最近使用区渲染/事件** 新增 `tests/unit/config-panel-rule-presets.test.ts`,覆盖: - 面板接收到 recent/templates 属性时正确渲染列表 - 点击“应用”会派发 `apply-rule-preset` 事件 - 点击“保存当前规则为模板”会派发 `save-rule-template` 事件 - 点击“删除模板”会派发 `delete-rule-template` 事件 - [ ] **Step 2: 运行测试确认失败** Run: `npx vitest run tests/unit/config-panel-rule-presets.test.ts` Expected: FAIL,找不到新增 DOM 或事件。 - [ ] **Step 3: 在 `config-panel.ts` 接入预设 UI 和属性** 增加属性: - `recentRulePresets` - `templateRulePresets` 增加 UI: - 最近使用区 - 我的模板区 - 轻量保存模板入口(内嵌输入或 prompt 风格) 新增事件: - `apply-rule-preset` - `save-rule-template` - `delete-rule-template` - [ ] **Step 4: 运行测试确认通过** Run: `npx vitest run tests/unit/config-panel-rule-presets.test.ts` Expected: PASS - [ ] **Step 5: 提交** ```bash git add src/content/components/config-panel.ts tests/unit/config-panel-rule-presets.test.ts git commit -m "feat: add config panel rule preset UI" ``` ### Task 4: 为 `config-panel` 增加剧集提取辅助区 **Files:** - Modify: `src/content/components/config-panel.ts` - Test: `tests/unit/config-panel-episode-assist.test.ts` - [ ] **Step 1: 写失败测试,覆盖 episodeExtract 下辅助区行为** 新增 `tests/unit/config-panel-episode-assist.test.ts`,覆盖: - 仅在 `episodeExtract` 规则下显示辅助区 - 显示样本文件名和失败数量 - 切换 `fillTarget` 派发事件 - 切换 `fillMode` 派发事件 - 点击“随机样本 / 首个失败项 / 清空样本”派发事件 - [ ] **Step 2: 运行测试确认失败** Run: `npx vitest run tests/unit/config-panel-episode-assist.test.ts` Expected: FAIL - [ ] **Step 3: 在 `config-panel.ts` 实现辅助区** 增加属性: - `episodeExtractAssistState` - `episodeExtractFailureCount` 增加事件: - `episode-assist-change-target` - `episode-assist-change-mode` - `episode-assist-use-random-sample` - `episode-assist-use-first-failure` - `episode-assist-clear-sample` - [ ] **Step 4: 运行测试确认通过** Run: `npx vitest run tests/unit/config-panel-episode-assist.test.ts` Expected: PASS - [ ] **Step 5: 提交** ```bash git add src/content/components/config-panel.ts tests/unit/config-panel-episode-assist.test.ts git commit -m "feat: add episode extract assist controls" ``` ### Task 5: 为 `preview-panel` 增加辅助交互入口 **Files:** - Modify: `src/content/components/preview-panel.ts` - Test: `tests/unit/preview-panel-episode-assist.test.ts` - Reference: `src/types/file-selector.ts` - [ ] **Step 1: 写失败测试,覆盖整段回填、片段回填和失败快捷动作** 新增 `tests/unit/preview-panel-episode-assist.test.ts`,覆盖: - 仅在 episodeExtract + assist enabled 下显示辅助交互 - 点击整段回填按钮派发事件 - 片段点击派发事件 - 失败项显示“设为样本 / 取前半段为 prefix / 进入片段选择”动作 - [ ] **Step 2: 运行测试确认失败** Run: `npx vitest run tests/unit/preview-panel-episode-assist.test.ts` Expected: FAIL - [ ] **Step 3: 修改 `preview-panel.ts` 实现辅助 UI** 新增属性建议: - `episodeExtractAssistEnabled` - `episodeExtractAssistState` 新增事件建议: - `episode-assist-apply-full-name` - `episode-assist-apply-segment` - `episode-assist-use-item-as-sample` - `episode-assist-use-prefix-from-item` - `episode-assist-focus-segment-mode` 实现要求: - 片段级点击,不做字符级选择 - 不影响非 `episodeExtract` 模式 - [ ] **Step 4: 运行测试确认通过** Run: `npx vitest run tests/unit/preview-panel-episode-assist.test.ts` Expected: PASS - [ ] **Step 5: 提交** ```bash git add src/content/components/preview-panel.ts tests/unit/preview-panel-episode-assist.test.ts git commit -m "feat: add preview panel episode assist actions" ``` ### Task 6: 在 `file-selector-panel` 中接线预设与辅助状态 **Files:** - Modify: `src/content/components/file-selector-panel.ts` - Test: `tests/unit/file-selector-panel-rule-presets.test.ts` - Test: `tests/unit/file-selector-panel-episode-assist.test.ts` - Reference: `tests/unit/file-selector-panel-conflict.test.ts`, `tests/unit/file-selector-panel-undo.test.ts` - [ ] **Step 1: 写失败测试,覆盖接线与状态更新** 新增测试覆盖: - 打开面板时加载 recent/templates - 应用模板会更新 `ruleConfig` 并刷新预览 - 保存模板/删除模板会同步更新列表 - `episodeExtract` 辅助事件会更新 `ruleConfig.params` - 使用随机样本/首个失败项会更新辅助状态 - 执行成功后 recent 自动记录 - [ ] **Step 2: 运行测试确认失败** Run: `npx vitest run tests/unit/file-selector-panel-rule-presets.test.ts tests/unit/file-selector-panel-episode-assist.test.ts` Expected: FAIL - [ ] **Step 3: 在 `file-selector-panel.ts` 增加统一状态与事件处理** 实现内容: - 管理 `EpisodeExtractAssistState` - 加载 / 应用 / 保存 / 删除规则预设 - 根据辅助事件更新 `ruleConfig.params` - 将 recent/templates 和 assist state 传给 `config-panel` / `preview-panel` - 在执行成功后调用 `recordRecentRulePreset` - [ ] **Step 4: 运行测试确认通过** Run: `npx vitest run tests/unit/file-selector-panel-rule-presets.test.ts tests/unit/file-selector-panel-episode-assist.test.ts` Expected: PASS - [ ] **Step 5: 提交** ```bash git add src/content/components/file-selector-panel.ts tests/unit/file-selector-panel-rule-presets.test.ts tests/unit/file-selector-panel-episode-assist.test.ts git commit -m "feat: connect episode assist and rule presets" ``` ### Task 7: 补齐 i18n 文案与回归验证 **Files:** - Modify: `src/locales/zh_CN.json` - Modify: `src/locales/zh_TW.json` - Modify: `src/locales/en.json` - Test: 复用上述组件测试 - [ ] **Step 1: 增加失败测试或更新现有测试的文案断言** 若已有测试依赖 `I18nService.t(...)` 输出,补充必要断言;否则至少确保新增 key 被组件引用后测试不抛错。 - [ ] **Step 2: 更新三份 locale 文案** 新增: - 辅助区标题与按钮 - 最近使用 / 我的模板 / 保存模板 / 删除模板 / 覆盖提示 - 失败项快捷修正文案 - [ ] **Step 3: 运行定向测试** Run: `npx vitest run tests/unit/rule-presets.test.ts tests/unit/config-panel-rule-presets.test.ts tests/unit/config-panel-episode-assist.test.ts tests/unit/preview-panel-episode-assist.test.ts tests/unit/file-selector-panel-rule-presets.test.ts tests/unit/file-selector-panel-episode-assist.test.ts` Expected: PASS - [ ] **Step 4: 运行全量验证** Run: ```bash npx vitest run npm run lint npm run typecheck ``` Expected: - Vitest 全绿 - lint 无新增 error(warning 可单独评估) - typecheck 通过 - [ ] **Step 5: 提交** ```bash git add src/locales/zh_CN.json src/locales/zh_TW.json src/locales/en.json git add . git commit -m "feat: add episode extract assist and rule presets" ``` --- ## 风险提示 - `config-panel.ts` 和 `file-selector-panel.ts` 已较大,若新增逻辑明显膨胀,优先提取纯函数/工具模块,避免继续把状态判断堆进组件。 - 片段选择请保持“片段级点击”,不要演变成复杂的字符级框选。 - recent 自动记录必须放在“成功执行后”,不要在输入阶段记录。 - 模板应用前必须经过规则有效性校验,避免旧模板拖垮当前面板。