feat(lark): 完善回复卡排版与可配置语义布局 - #1057
Conversation
|
感谢这个 PR,字段修复这块的价值很实在 —— 我查了官方文档确认 本地验证: 有一个问题想请你确认,正好和这个 PR 自带 backlog 文档里定的「quoted / history 回读必须对等」硬约束相关 —— 表格那条达标了,但标题这条我实测是退化的。我建了 master 对照 worktree 跑同一个探针: 原因是
关于新增的 round-trip 用例:它断言的是 一个可能的修法(我在本地试过, const m = typeof el.text_size === 'string' && /^heading-([0-4])$/.exec(el.text_size);
parts.push(m ? `${'#'.repeat(Math.max(1, Number(m[1]) || 1))} ${text}` : text);实测回读变成 另有一条不阻断的小观察: 还有一点我没能自证:backlog 文档里提到「飞书会把标题收成 以上是自动评审的初步意见,可能有误判,最终以维护者审阅为准。 |
|
交叉复审补充(第二遍自动评审,含真机验证) 我们按流程做了第二遍交叉复审。首审指出的回读退化方向是对的,但真机证据把修法的位置改变了,补充如下(同样以维护者审阅为准): 1. 飞书读回会剥掉
并且换 2. backlog 文档「飞书会把标题收成 3. 一个可能两全的修法(回读侧已真机验证):把 ATX 标记直接写进提升标题的 4. 回归建议:round-trip 用例的 fixture 应直接采用真机 以上是自动交叉评审的补充意见,可能有误判,最终以维护者审阅为准。 |
|
更正我上一条评论里的修法建议 —— 它是错的,请不要采用。 交叉复审补充了真机证据,我独立复核后确认:飞书服务端在回读时会剥掉 换 因此我上一条给的补丁(在 结论因此升级而非撤销:层级不是在 parser 侧丢的,而是在服务端就永久丢了 ⟹ 任何 parser 侧修法都救不回来,修法必须落在发送侧。 顺带更正 backlog 文档第 15 行的两处事实(都经真机验证):
发送侧有两条候选,都已真机验证可行:
这样正文不必内嵌字面 另外一个回归测试上的请求:无论采用哪条修法,回归 fixture 请改用真机归一化形态(无 以上仍是自动评审意见,最终以维护者审阅为准。上一条评论中关于字段修复( |
|
给选项 2 补一条仓内证据和一个设计注意项(不改变上面的结论,供作者选择时参考):
以上仍是自动评审意见,最终以维护者审阅为准。 |
|
增量复审(第三轮自动评审,针对 先说结论:新增的这套可配置回复风格,我这边 0 阻断,质量比我预期的高。但上一轮的原始阻断仍然存在,所以整体建议仍是合前修。 新增部分我实测认可的地方
本地验证: 但上一轮的阻断没有被修默认路径(不传
两条不阻断的观察(上轮提过,仍在)
一个流程上的建议这轮 +2619 行 / 45 文件把评审面扩大了一个量级,却没解决最初那个问题。个人建议:要么先补上发送侧那一条修法,要么把 另外声明我这轮的覆盖边界:Dashboard 前端那 224 行 以上是自动评审的初步意见,可能有误判,最终以维护者审阅为准。 |
|
交叉复审补充:两个覆盖边界的缺口已补
第一个 H1 靠卡头存活,第二个 H2「变更」仍是裸文本且与正文粘连——与上条评论的判断一致。默认路径的
维持上条评论的结论:新增功能 0 阻断,PR 整体合前修(发送侧修法仍未落地)。 以上仍是自动交叉评审意见,最终以维护者审阅为准。 |
作为 --layout 终态实现规格:五档卡头与标签定稿、按 bot 开关和预设主题、本轮排除 Diff/对比档。
recipePrompt、layoutColors、layoutTags 及对应 Dashboard 控件改为本轮范围;本轮之后只留 Diff 与私聊按人覆盖。
header.title 为前缀或「前缀 · 首个 H1/H2」;重复前缀时只保留前缀;被取走的标题必须能从 live header 回读。
按终态拍板采用 B 形态:header.title 只写五档前缀,不消费 H1;指南建议 --layout 时不要重复前缀词。
终裁改回 {前缀} · {首个 H1/H2}、取走正文行并防重复;去掉 B 形态指南。header 回读仍用 live 归一化测例。
result=green、progress=blue、risk/blocked=red、handoff=indigo;非法 text_tag 色回退 neutral,发送不失败。
用户输入非法 --layout 不失败;host 校验只拒绝伪造 relay,与 --response-kind 同门。
飞书服务端回读时会剥掉 markdown 组件的 text_size,提升后的 H1/H2
在 quoted/history 里退化成与正文粘连的裸文本。发送侧给提升标题打
botmux_md_h{level}_{seq} 元素 id(与 botmux_reply_footer 同款、经
归一化仍存活的生产载体),parser 据此重建 `#`/`##` 行——跨会话回读
完整还原层级,且跨 bot 重发时可再次提升为标题组件。
Claude-Session: https://claude.ai/code/session_01H9M72GnFuikeDokYmY7i9f
b9bb09f to
3b709c7
Compare
# Conflicts: # test/dashboard-bot-payload.test.ts
deepcoldy
left a comment
There was a problem hiding this comment.
自动评审(Claude)批准:申晗已授权合并。
本轮验证摘要(详见前述 3 条评审评论):
- 核心阻断已由
3b709c7f8修复——element_id载体(botmux_md_h{level}_{seq})在飞书归一化剥掉text_size后仍存活,跨会话回读完整还原#/##层级;真机端到端验证通过(真发→quoted --raw→喂本分支 parser)。 - 与 master 的冲突(
test/dashboard-bot-payload.test.ts期望 key 列表)已解为并集,可数判据:67 keys / unique 67,两侧独有 key 均在位。 - 合并树上 build 通过、13 个相关测试文件 917 条全绿;反变异(删
bot-payload.ts的replyStyle真字段)2 条变红,证明断言承重。 - CI
bun-test腿的失败已归因为既有环境性问题:与 master 基线做失败集差集,本 PR 无任何独有失败(PR 33 个 / master 35 个),且两边红的是同一条buildReplyCardFooter用例(该用例在 vitest 下本地通过,属 bun runner 侧既有差异)。
以上为自动评审意见,最终以维护者审阅为准。
|
🚀 Released in v3.18.11 |
改动内容
回复卡排版底座与 Card 2.0 字段清理
botmux send、daemon final fallback 与 contextual reply 共用width_mode: fill和一致的 footer builder。heading-2组件,并将全卡提升数量限制为 6;H3–H6、Setext 与超额标题保持加粗回退。botmux_md_h{level}_{seq}元素 id:飞书回读会剥掉text_size,parser 据此 id 重建#/##行,跨会话回读保留完整层级,跨 bot 重发可再次提升(与botmux_reply_footer同款存活载体)。quoted/history仍可还原完整 Markdown 表格及code_span单元格。/adopt选择卡改用width_mode: fillnotationnotation_small_v2botmux-send指南,提供结果摘要、进度更新、方案对比、风险/待确认、交接说明五类可选写作配方;配方可不用、混搭或改名,短消息仍使用自由 Markdown。五档语义 layout
新增可选参数:
resultprogressriskblockedhandoff--layout,不会根据正文猜测状态。--layout会提示并回退普通回复卡,不阻断发送。compare/diff档,不做假按钮、进度条或任意卡片 JSON 注入。按 Bot 配置 replyStyle
新增稀疏配置
replyStyle:recipes:是否注入内置写作配方layout:是否允许--layouttheme:default/minimal/vividrecipePrompt:用自定义文本替换内置配方区layoutColors:按档覆盖 Card 2.0 卡头色layoutTags:按档继承、隐藏或自定义标签配置遵循以下约束:
bots.json;恢复默认后整块replyStyle自动移除。recipePrompt上限 4096 个 Unicode code point;单档标签上限 32 个。layoutColors只改变卡头;标签色固定跟随语义,不随卡头覆盖漂移。minimal去掉彩色卡头,vivid为五档增加语义标签,default保持定稿观感。Dashboard 回复风格设置
replyStyle返回 400,超限返回 413,null保留显式清空语义。影响面评估
botmux send、daemon final fallback 与 contextual reply;三条路径复用同一 Card 2.0 配置和 footer builder。五档卡头只在显式、有效的--layout请求上生效。quoted/history文本提取;新增 header title、text_tag_list与 CardKit 归一化 native table 的对等回读,确保跨会话读取不丢标题、标签、正文或表格。BOTMUX_REPLY_STYLE。已运行 worker 保持原快照,新建或重启 worker 读取新配置;Riff/Mojo 在用户 env 合并后再冻结,共享持久后端在会话边界清理该变量,避免跨 Bot 漂移。botmux send --layout仍按该 session 的larkAppId读取 live registry /bots.json,正常渲染卡头。测试验证
提交态聚焦回归
b9bb09ff455385a0a1c4b3e6878bc0748016fc43bun run test -- <18 个受影响测试文件>bun run buildgit diff --check全量回归
bun run testchmod权限语义与普通用户不同Live 验收
quoted对五档卡头标题和标签均可读回;带 native table 的样卡可还原完整 pipe 表。bots.json中replyStyle整块移除switch:here部署当前 checkout 并重启 daemon 完成上述验收。五档样卡说明
五档卡头都只表达明确、由调用方选择的语义;正文仍是自由 Markdown:
result:任务完成并交付结果progress:长任务到达值得同步的里程碑risk:存在风险或需要用户拍板blocked:任务失败或被硬阻塞,需要人介入handoff:将任务正式交给下一处理人Dashboard 截图
明确不做
--layout diff/--layout compare