14 KiB
TODOList — 待办任务总览
用于派工与进度跟踪。任务卡格式统一,可拆分给不同执行者(人 / Claude / GPT / 其他模型)。
关联文档:
- 51TODO.md — 跨方向重构计划(Bus tool-call 升级 / 跨议题决策点)
- TableTODO.md — 表格模块 IAD 深度重构计划(Phase 0/B/C)
- TODO.md — 旧版本变更日志(保留作为发布记录)
最后更新:2026-05-08,对应 v2.2.0 已发布。
一、最近落地(v2.1.1 → v2.2.0)
上下文摘要,让接手者了解当前状态。代码细节看对应 commit。
| commit | 内容 | 涉及范围 |
|---|---|---|
d283ff4 |
表格模块 IAD 解耦 + API 自定义参数 + 厂商预设连接 | core/table-system/* 新增 dto/infra/actions;assets/api-vendor-params.json;UI |
f022002 |
DeepSeek registry 补 thinking 模式参数 | assets/api-vendor-params.json |
671c1b2 |
profile 优先级修正:profile 分配后即权威,旧字段不再覆盖 | core/api.js 6 处 getApiSettings |
68217ff |
legacy 自动迁移 + 清除按钮 + tableFilling slot + silent fallback 移除 | ApiProfileManager.js / historiographer.js / 表格 3 filler |
b40f575 |
bump 2.2.0 + tableFilling 默认 link main | manifest.json / ApiProfileManager.js |
核心架构现状(接手必读):
- 状态权威:
utils/config/ApiProfileManager.js是 API 配置单一指挥所;profile 分配后即权威,旧字段(s.ngmsTemperature等)不再覆盖 profile - 表格模块:核心在 core/table-system/ ,已按 IAD 拆分(dto/infra/actions/rendering.js/templates.js/preset.js),manager.js 退化为兼容层(仍保留 16 个 UI mutation + loadTables + updateTableFromText)
- API 厂商识别:utils/api-vendor.js 提供 detectVendor / listVendorParams;registry 在 assets/api-vendor-params.json
- VS Code 类型校验:jsconfig.json 已开启 checkJs,types/sillytavern.d.ts 提供 SillyTavern 全局模块声明
二、待办任务
任务卡格式说明
每个任务包含:
- 类型:bug / feature / refactor / cleanup / docs
- 难度:🟢 简单(< 1h)/ 🟡 中等(1-3h)/ 🔴 高耦合(> 3h 或需架构判断)
- 建议执行者:
GPT/Claude/Human/任意 - 文件:明确路径 + 行号锚点(若适用)
- 修改要点:bullet 列表
- 验收:可验证的预期行为
- 依赖:前置任务的 ID(若有)
🟢 GPT-friendly 简单任务
T-001: 清理已确认的死代码
- 类型:cleanup
- 难度:🟢 简单
- 建议执行者:GPT
- 依赖:无
待清理项:
- core/fractal-memory.js —— 整个文件死代码,
initializeFractalMemory在文件外完全没人调用。建议:直接删除整个文件。 - ui/historiography-bindings.js:494-513 —— 绑定
#amily2_ngms_temperature和#amily2_ngms_max_tokens这两个 HTML 中已不存在的元素。getElementById永远返回 null,整段代码空跑。建议:直接删掉这段。 - ui/plot-opt-bindings.js:664-665 —— 同样引用不存在的
#amily2_opt_max_tokens/#amily2_opt_temperature。建议:删掉。 - ui/plot-opt-bindings.js:698-699 ——
opt_bindSlider调用同样的不存在 ID,删除。
修改要点:
- 删除前用 grep 确认每个 ID 在所有 .html 文件里都不存在
- 删完后用 grep 检查没有其他文件 import 被删的函数
- 提交前肉眼跑一次表格填表 / 剧情优化 / NGMS 总结,确认 UI 无回归
验收:
- 4 处死代码块全部删除
- 启动控制台无 JS 错误
- 表格 / 剧情优化 / 总结功能无回归
T-002: cwb / autoCharCard 加入 legacy 自动迁移
- 类型:feature
- 难度:🟢 简单
- 建议执行者:GPT
- 依赖:无
背景:utils/config/ApiProfileManager.js 的 LEGACY_PROFILE_MIGRATION_MAP 目前覆盖 main / plotOpt / plotOptConc / ngms / nccs / sybd 6 个 slot。cwb 和 autoCharCard 的 legacy 字段结构略不同(cwb 用 cwb_apiUrl / cwb_apiKey / cwb_model ;autoCharCard 用 acc_* 前缀),所以暂时没纳入。
修改要点:
- 找出 cwb / autoCharCard 的 legacy 字段名(grep
cwb_apiUrl/acc_apiUrl之类) - 在
LEGACY_PROFILE_MIGRATION_MAP加两条:{ slot: 'cwb', urlKey: 'cwb_apiUrl', modelKey: 'cwb_model', keyName: 'cwb_apiKey', maxTokensKey: 'cwb_max_tokens', temperatureKey: 'cwb_temperature', name: 'CWB 旧配置', }, { slot: 'autoCharCard', urlKey: '???', // 需 grep 确认实际 key ... } - 同时在
clearLegacyConfig的ALL_LEGACY_FIELDS和LEGACY_KEY_NAMES加对应条目
验收:
- 两个 slot 在迁移自调用 IIFE 跑过后能正确创建 profile + setKey + setAssignment
- 清理按钮能识别并清除这俩模块的旧字段
T-003: 表格 NCCS 支路透传 customParams
- 类型:feature
- 难度:🟢 简单
- 建议执行者:GPT
- 依赖:无
背景:v2.2.0 给 core/api.js 的 callOpenAITest / callOpenAICompatible / callSillyTavernBackend 都接入了 options.customParams spread。但 core/api/NccsApi.js 的 callNccsOpenAITest 等独立路径没有接入,导致用户在 NCCS profile 配置的 customParams 不生效。
修改要点:
- 找 NccsApi.js 里发请求的函数(
callNccsOpenAITest/callNccsSillyTavernPreset),定位到JSON.stringify({ ... })处 - 在 body 构建时按"customParams 在前,核心字段在后覆盖"的顺序 spread:
body: JSON.stringify({ ...(options.customParams || {}), // 核心字段 chat_completion_source: 'openai', model: options.model, messages, // ... }) - 同时确保
getNccsApiSettings把profile.customParams透出(参考 core/api.js:447-462 模式) - 同步给 NgmsApi / JqyhApi / SybdApi 做相同处理
验收:
- 在 NCCS profile 加
{"top_p": 0.5}后,DevTools Network 看请求 body 包含 top_p:0.5 - NGMS / JQYH / SYBD 同样验证
T-004: hint panel 点击参数名插入到 textarea
- 类型:feature
- 难度:🟢 简单
- 建议执行者:GPT
- 依赖:无
背景:ui/api-config-bindings.js 的 _updateCustomParamsHint 现在只显示纯文本"已知参数:top_p、frequency_penalty、..."。没有交互。
修改要点:
- 把 hint 区改成参数名按钮列表,每个按钮 click 触发"如果当前 textarea JSON 已有这个 key 则不动,没有就 append 进去"
- 实现
_insertParamToCustomParams(paramName, defaultValue):解析 textarea JSON → 添加 key(用合理的占位值,例如 number 类型用 0、string 类型用 ""、object 类型用 {})→ JSON.stringify 回写 - 处理 textarea 当前为空 / 当前是非法 JSON 的情况(非法 JSON 时按钮 disabled + 提示用户先修复)
验收:
- 切换 vendor 后参数名按钮列表更新
- 点击按钮把对应 key 添加到 textarea
- 已存在的 key 不重复添加
🟡 中等任务
T-005: 15 处散乱 vendor URL 检查迁到 detectVendor
- 类型:refactor
- 难度:🟡 中等
- 建议执行者:GPT 或 Claude
- 依赖:无
背景:之前的 51TODO Phase B 收尾任务。代码里 15+ 处 apiUrl.includes('googleapis.com') 散乱判断厂商,应该统一调 utils/api-vendor.js#detectVendor。
待迁移文件(grep googleapis.com|anthropic.com|openai.com 找):
ui/api-config-bindings.jsui/plot-opt-bindings.jscore/rag-api.jsui/profile-sync.jscore/api.jsCharacterWorldBook/src/cwb_apiService.jsui/bindings.jsui/table/nccs-bindings.jscore/api/SybdApi.jscore/api/Ngms_api.jscore/api/JqyhApi.jscore/api/NccsApi.jscore/api/ConcurrentApi.js
修改要点:
- 每处
if (apiUrl.includes('googleapis.com'))改为if ((await detectVendor(apiUrl)) === 'google') - 注意有的位置在同步上下文(事件回调),用
detectVendorSync但要先await getRegistry()预加载 - 不要为了重构改变行为:原来只判断 google 就只判断 google,原来判断多个 vendor 就保留多个
验收:
- 所有散乱 URL 检查替换完
- 行为完全等价(用 grep 自检 includes 已全替换)
- 跑一遍主功能(主聊天 / 剧情优化 / NGMS 总结 / 表格填表)确认无回归
T-006: jqyh/sybd/cwb 在 profile 已分配时把 slider 改成 informational
- 类型:feature / UX
- 难度:🟡 中等
- 建议执行者:GPT 或 Claude
- 依赖:无
背景:v2.2.0 之后,profile 一旦分配就权威,jqyh/sybd/cwb 这些有 slider 的模块在 profile 分配后 slider 是无效的(用户改 slider 不影响请求)。这是用户陷阱。
修改要点:
每个有 slider 的模块面板(plot-opt-bindings.js / historiography-bindings.js / glossary 相关 bindings / cwb_settingsManager.js):
- 启动时 / profile 分配变化时检查对应 slot 是否分配了 profile
- 若已分配:
- slider disable
- slider 旁加小字提示:"当前由 profile 「{profile.name}」 控制,请在 API 连接配置面板修改 profile"
- 若未分配:保持原样(slider 可用,写入 legacy 字段)
- 监听 profile 分配变化事件(可通过 ApiProfileManager 加 subscribe,或者轮询)
验收:
- 给 plotOpt 分配 profile 后,剧情优化面板的温度/maxTokens slider 变灰 + 提示
- 取消分配后 slider 重新可用
- 其他模块同样行为
T-007: 表格 Phase 0.4 — 抽出 mutations.js
- 类型:refactor
- 难度:🟡 中等
- 建议执行者:Claude(涉及 IAD 一致性判断)
- 依赖:无
背景:TableTODO.md#四-phase-0 计划的 Phase 0.4。manager.js 还有 16 个 UI 突变函数(addRow / deleteColumn / renameTable 等),应抽到 core/table-system/actions/ui-mutations.js。
修改要点:
- 在
core/table-system/actions/创建ui-mutations.js - 把 manager.js 里这 16 个函数搬过去:deleteColumn / moveRow / insertRow / addRow / addColumn / updateHeader / deleteRow / restoreRow / commitPendingDeletions / insertColumn / moveColumn / deleteTable / addTable / renameTable / moveTable / updateTableRules / updateRow / clearAllTables / updateColumnWidth
- manager.js 改为 re-export 这些函数(保持外部调用路径不变)
- 各函数签名/行为保持完全一致
验收:
- manager.js 行数显著减少
- 所有 UI 突变操作在表格面板里行为一致(手动测每个操作)
- 没有任何 import 失败
🔴 高耦合 / 架构任务
T-008: Bus tool-call 能力升级
- 类型:feature / 架构
- 难度:🔴 高
- 建议执行者:Claude(涉及 Bus 架构判断)
- 依赖:无(独立于表格重构)
详见:51TODO.md#二-phase-a-bus-tool-call-升级
核心交付:
SL/bus/tool/ToolRegistry.js私有工具注册表register(pluginName)返回的 context 加tool能力Options.js/RequestBody.js支持tools/toolChoice字段context.model.callWithTools(messages, options, { maxSteps, onToolError })agent loop
预估:1.5 天
T-009: 表格 Phase B — JSON formatter
- 类型:feature
- 难度:🟡 中等
- 建议执行者:GPT 或 Claude
- 依赖:无(不依赖 Bus 升级)
详见:TableTODO.md#五-phase-b-json-formatter
核心交付:
core/table-system/formatters/json.js:教 LLM 输出{"operations":[...]},解析为 Op[]- 设置项
table_filling_format: 'legacy'|'json'|'toolcall',默认legacy - UI 加 dropdown 切换
- fillerShared 调用统一 formatter dispatcher
预估:0.5 天
T-010: 表格 Phase C — ToolCall formatter
- 类型:feature
- 难度:🟡 中等
- 建议执行者:Claude
- 依赖:T-008 完成 + T-009 完成
详见:TableTODO.md#六-phase-c-toolcall-formatter
T-011: 表格 Phase 0.7-0.9 收尾
- 类型:refactor
- 难度:🔴 高(filler 三方差异需小心对齐 / 解循环依赖 / Service 重写)
- 建议执行者:Claude
- 依赖:T-007(Phase 0.4 mutations 完成后做)
详见:TableTODO.md#四-phase-0 0.7-0.9
- 0.7:
core/table-system/filler/shared.js—— 三个 filler 重复代码消除 - 0.8: 解 manager.js ↔ secondary-filler.js 循环依赖
- 0.9: TableSystemService 真正变成门面
预估:1 天
三、派工建议
适合现在直接派给 GPT(独立、无架构判断)
- ✅ T-001 死代码清理
- ✅ T-002 cwb/autoCharCard 加入迁移
- ✅ T-003 NCCS 透传 customParams
- ✅ T-004 hint panel 点击插入
GPT 或 Claude 都可以
- T-005 vendor 检查迁移(量大但机械)
- T-006 slider informational 状态
- T-009 JSON formatter
建议留给 Claude 或人
- T-007 mutations.js 抽出(涉及 IAD 一致性)
- T-008 Bus tool-call 升级(架构核心)
- T-010 ToolCall formatter(依赖前置)
- T-011 表格 Phase 0 收尾(filler 重复代码 dedup 风险高)
四、未列入但可能的小项
- 自动迁移完成后给所有 chat 类型 slot 加默认 link 选项(不只 tableFilling)
- profile 分配 UI 加"复用现有 profile"快捷按钮(避免用户为每个 slot 重复创建相同配置)
- 51TODO.md 第三节决策点中"是否合并发版"等问题做最终决定记录
- TODO.md(旧版本变更日志)的 v2.2.0 版本条目补全