12 KiB
剧集提取交互增强与规则预设 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: 提交
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: 提交
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 和属性
增加属性:
recentRulePresetstemplateRulePresets
增加 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: 提交
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实现辅助区
增加属性:
episodeExtractAssistStateepisodeExtractFailureCount
增加事件:
-
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: 提交
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
新增属性建议:
episodeExtractAssistEnabledepisodeExtractAssistState
新增事件建议:
episode-assist-apply-full-nameepisode-assist-apply-segmentepisode-assist-use-item-as-sampleepisode-assist-use-prefix-from-itemepisode-assist-focus-segment-mode
实现要求:
-
片段级点击,不做字符级选择
-
不影响非
episodeExtract模式 -
Step 4: 运行测试确认通过
Run: npx vitest run tests/unit/preview-panel-episode-assist.test.ts
Expected: PASS
- Step 5: 提交
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: 提交
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:
npx vitest run
npm run lint
npm run typecheck
Expected:
-
Vitest 全绿
-
lint 无新增 error(warning 可单独评估)
-
typecheck 通过
-
Step 5: 提交
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 自动记录必须放在“成功执行后”,不要在输入阶段记录。
- 模板应用前必须经过规则有效性校验,避免旧模板拖垮当前面板。