Skip to content

feat: GAP-1 设置页 Custom Provider 编辑 UI——上线前必做清单最后一卡#200

Merged
KerroKapple merged 6 commits into
mainfrom
feat/gap-1-custom-providers-ui
Jul 17, 2026
Merged

feat: GAP-1 设置页 Custom Provider 编辑 UI——上线前必做清单最后一卡#200
KerroKapple merged 6 commits into
mainfrom
feat/gap-1-custom-providers-ui

Conversation

@KerroKapple

Copy link
Copy Markdown
Owner

Summary

上线前必做第 7 条 GAP-1(L):手编 json+重启是 BYO-key 主打定位的体验硬伤——现在设置页可视化增删改,守住「重启生效」边界(不碰 registry 变异深水区):

写侧(Task 1)

  • CustomProviderStore(list/upsert/remove) 由 CustomProvidersFileService 一并实现——raw 条目保真:读侧剔除的非法/未知条目原位保留,编辑一条绝不销毁用户手编的坏条目
  • 损坏文件拒写(LocalIOError,绝不覆盖用户可能想抢救的文件——与读侧「app 能启动」兜底语义相反,注释明示);.partial→rename 原子写 2 空格 pretty JSON 保持可手编
  • 字段校验抽 core 纯函数(id 正则/唯一/不撞内置、base_url 无 query/fragment/userinfo、模板白名单)——服务解析与 UI 内联同一事实源;_parseEntry 改用共享校验,告警语义不变

UI(Task 2)

  • 列表行(displayName+providerId+template+baseUrl)+ 添加/编辑对话框(编辑态 id 锁定;模板白名单下拉;Save 全量校验内联报错不提交)+ 删除确认(提示 key 不随删)
  • 会话内发生过写操作 → 常驻 warning「重启后生效」;写失败 snackbar
  • settings_screen 挂载于 API Keys 之后;Settings golden 基线随之重铸(本 PR 内跑 update-goldens)

顺带修(Task 3,卡面明列):API Keys 行对 custom:* 显示 capabilities.displayName(此前裸 custom:<id>

验收对卡:不碰 json 完成增删改 ✓;非法输入内联报错 ✓;损坏 json 不崩(列表呈现原因+拒写保护)✓;重启后下拉出现=既有 bootstrap 链 ✓;fake Store widget 测试 ✓

Plan: docs/superpowers/plans/2026-07-18-gap-1-custom-providers-ui.md

Test plan

  • 校验纯函数 8 例;写侧 7 例(保真/拒写/原子);widget 6 例;api_keys displayName 1 例
  • analyze 0;全套 1719 通过(本地 --exclude-tags golden)
  • Settings golden 重铸(update-goldens workflow)

🤖 Generated with Claude Code

Kerro and others added 6 commits July 18, 2026 02:30
CustomProviderStore(list/upsert/remove):raw 条目保真——非法条目原位保留;
损坏文件拒写 LocalIOError 绝不覆盖;.partial→rename 原子写 pretty JSON;
写不触会话内快照(重启生效边界)。字段校验抽 core 纯函数,服务解析与
设置页内联共用同一事实源;_parseEntry 改用共享校验(告警语义不变)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
列表+5 字段表单对话框(校验=共享纯函数,内联报错不提交)+删除确认;
写后常驻「重启后生效」条;损坏文件列表呈现原因、写拒绝 snackbar。
ARB +23 键;api_keys custom:* 行显示 displayName;app_routing/golden
设置场景密封空 store。widget 测试 6 例 + api_keys 1 例。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
P2-1:upsert 原位替换改以旧 raw map 为基底合并——手编未知字段(_note 等)
不随 UI 编辑丢失,补保真测试。P2-2:写成功路径 invalidate 前补 context.mounted
(失败路径已有,不对称;unmount 后 autoDispose 天然重建)。P3×5 记 BOARD 债。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@KerroKapple

Copy link
Copy Markdown
Owner Author

对抗评审结论 APPROVE(无 P1),P2×2 已修、P3×5 记债:

  • P2-1 已修upsert 原位替换改为以旧 raw map 为基底合并——被编辑条目自身的手编未知字段(_note 等)不再随 UI 编辑静默丢失(评审判定准确:接口注释字面上只承诺兄弟条目保真,但 pretty JSON 的「可手编」产品姿态要求编辑条目也保真);补专项测试。
  • P2-2 已修:写成功路径 invalidate 前补 context.mounted(与失败路径对称;unmount 后 autoDispose list provider 下次挂载天然重建)。
  • P3 全部记 BOARD 债:unknownTemplate 文案映射不可达埋雷、读失败报保存失败、写顺序化、seenIds 占坑既有债、provider 定义位置风格。
  • 采纳评审核验:base_url 双源规范化实测良性一致;Windows rename 语义实测通过;golden bot 提交仅动 settings 一张为正确信号。

复验:analyze 0;写侧 23 例含新保真测试;全套 1720 通过。CI test+coverage 已在上一轮全绿,本轮推送后再次一次性核验后合并。

@KerroKapple
KerroKapple merged commit 9e7f062 into main Jul 17, 2026
5 checks passed
@KerroKapple
KerroKapple deleted the feat/gap-1-custom-providers-ui branch July 17, 2026 17:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant