Skip to content

feat(chat): add comment support for selection quotes - #3701

Open
MaxxxDong wants to merge 2 commits into
makecindy:mainfrom
MaxxxDong:feat/selection-quote-comment
Open

feat(chat): add comment support for selection quotes#3701
MaxxxDong wants to merge 2 commits into
makecindy:mainfrom
MaxxxDong:feat/selection-quote-comment

Conversation

@MaxxxDong

@MaxxxDong MaxxxDong commented Aug 31, 2026

Copy link
Copy Markdown

这次改了什么

摘要

为 Desktop 与 Mobile 的“选中文字 → 添加到对话”流程增加可选评论:用户可以在引用前补充自己的意图,评论、原文和来源会作为同一个引用进入 composer,并在发送、历史恢复和两端展示时保持一致。

根据 review 在 34f2f83 中补齐了协议结构边界、跨 session/source 状态约束、Mobile 触屏评论界面、旧客户端兼容与定向测试;原有不带评论的引用行为保持不变。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:维护者确认:划词引用支持评论 #3718
  • 本 PR 包含:共享 ChatQuote.comment 语义与结构化 wire boundary;Desktop 选区评论浮层、composer atom/chip、历史恢复;Mobile 原生选区菜单后的评论 sheet、草稿持久化、composer 比较/发送/历史恢复;五语言文案和回归测试。
  • 明确不包含:生产后端协议或数据库 migration;Android 实机/模拟器验收;评论协作、编辑历史或服务端独立 comment 对象。
  • 用户可见变化:Desktop 与 Mobile 选择文本后可“添加评论”,composer chip 同时展示评论和引用原文;切换 session/source 后旧评论编辑态失效。
  • 是否存在 breaking change:无。旧的无评论引用仍可读;旧客户端读取新 wire 时不崩溃且不丢引用/回复正文,但会将新增 comment marker 降级为普通引用文字,不具备专用评论 UI。

UI 变化

Desktop

场景 证据
zh-CN Dark 选区入口 Desktop zh-CN dark entry
选区塌缩后编辑器仍保留 Desktop collapsed selection editor
长多行评论、内部空行且不遮挡原文 Desktop long multiline comment
跨 session 清理旧编辑态 Desktop cross-session cleared
Dark / Light 带评论 chip Desktop dark commented chip Desktop light commented chip
zh-TW / ja / en / ko 最终文案 Desktop zh-TW Desktop ja Desktop en entry Desktop en editor Desktop ko entry Desktop ko editor
录屏 Desktop selection → comment → chip flow

Desktop 录屏用于交互与布局证据;其中较早的 English/Korean 文案以表内最终截图为准。

Mobile(iOS Simulator)

场景 证据
zh-CN Light 原生选择菜单入口,选中文字仍可见 Mobile iOS zh-CN entry
长多行评论编辑态 Mobile iOS long comment
带评论 chip Mobile iOS commented chip
跨 session 清理旧 sheet/draft Mobile iOS cross-session cleared
zh-TW / ja / en / ko Dark 最终文案 Mobile iOS zh-TW Mobile iOS ja Mobile iOS en Mobile iOS ko
录屏 Mobile iOS Simulator flow

Mobile 录屏仅作为真实模拟器执行的辅助记录:iOS 原生选择菜单在录屏抽帧中可能出现黑帧,瞬态 sheet/chip 也未被稳定保留;上方逐场景截图才是主要 UI 状态证据。Mobile UI 使用仓库内置 EXPO_PUBLIC_CINDY_MOBILE_VISUAL_MOCK=1 fixture,不含生产凭证,也不冒充真实服务端提交。

  • 引用的设计规范:docs/design-rules/DESIGN.md §4 Component Stylings(复用既有容器、输入与按钮形态)、§5 Layout Principles(间距与浮层不遮挡选区)、§10 Light / Dark Dual-Mode Delivery Gate 与 token 规则(两种模式均验证、复用主题 token)、§11 Voice & Content(zh-CN / zh-TW / en / ja / ko 文案对齐)、§14.1–14.3 Interaction Conventions(文本选择、focus/选区塌缩、Shift+Enter 多行输入)。

怎么验证的

自动验证

pnpm test:unit:related
结果:exit 0;494 passed / 1 skipped / 0 failed;6 个适用 workspace 全部通过

pnpm --filter @cindy/maker-shared test -- src/__tests__/chatQuotes.test.ts
结果:65 files / 1003 tests passed;chatQuotes 45 tests

pnpm --filter desktop exec vitest run src/renderer/__tests__/selectionQuoteUserMessage.test.ts src/renderer/__tests__/composerQuoteDocument.test.ts src/renderer/__tests__/quoteChip.test.tsx src/renderer/__tests__/selectionQuoteButton.interaction.test.tsx
结果:4 files / 27 tests passed

pnpm --filter mobile exec vitest run src/__tests__/chatQuoteCrossDevice.test.ts src/__tests__/chatQuoteStore.test.ts src/__tests__/composerDocument.test.ts src/__tests__/selectionQuote.test.ts src/__tests__/quoteCommentSheet.interaction.test.tsx
结果:5 files / 37 tests passed

pnpm --filter desktop typecheck
pnpm --filter mobile typecheck
pnpm check:i18n
pnpm --filter mobile test:scope
pnpm check:design-inventory
git diff --check
结果:全部通过;i18n 五语言 8520 keys 对齐(另有 1045 条与本 PR 无关的既有 warning)

git apply --check <complete PR delta>  # against origin/main@8a0d7795
结果:通过;34 files,1272 insertions / 82 deletions,无文本冲突

覆盖的协议/状态场景包括:单行、多行、内部空行、尾随换行、空评论、评论或引用正文包含 — comment:、source-like 文本、多个不同评论交错、发送/历史恢复、发送失败恢复、selection collapse、session/source 变化以及新旧 wire 兼容。

手工验证

  • Desktop:macOS Electron isolated dev profile;验证选区入口、评论编辑、长多行输入、Light/Dark、五语言、commented chip、选区塌缩不误关和跨 session 失效。未发送真实模型消息。
  • Mobile:证据来自最终 working-tree 内容(随后提交为 34f2f83),Xcode 26.6 / iOS 26.5 / iPhone 17 Pro Simulator / CocoaPods 1.17.0;使用对应 Metro 和 __DEV__ visual fixture build,验证系统选择菜单、评论 sheet、commented chip、Light/Dark、五语言及真实路由跨 session 清理。visual fixture 不含生产凭证,也不冒充真实服务端提交。
  • 旧客户端:在 pre-comment SHA 6e114a3 上执行实际旧 parser、Desktop history/React QuoteChip 和 Mobile persisted-store smoke;均不崩溃、不丢 selected text/source/comment payload/reply body。

未执行的验证

  • Android 与物理 Mobile 设备未执行:维护者要求的是 Desktop/Mobile UI 证据而非指定设备;本轮 Mobile UI 证据来自真实 iOS Simulator。
  • 未执行生产后端 E2E:视觉 fixture 不含真实凭证。comment send/history hydrate 与多个评论交错顺序由自动测试证明。
  • 未构建或启动完整的旧版本 packaged Electron/Mobile app;旧客户端边界由 pinned old parser、history/store 与 renderer smoke 及固定 fixture 验证。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:ChatQuote wire parsing/formatting、Desktop/Mobile composer quote 状态与 UI。无数据库、权限、原生依赖或 runtime fingerprint 变化。
  • 兼容性:新客户端继续读取旧的无评论引用;旧客户端读取新增 comment wire 时保持可读、不会崩溃或丢回复正文,但不提供评论专用展示。
  • 跨平台:两端共享相同 ChatQuote.comment、发送和历史恢复语义;Desktop 使用选区浮层,Mobile 使用系统选择菜单 + 触屏 sheet,平台交互允许不同。
  • 回滚 / 降级方式:revert 本 PR 两个提交即可恢复原引用流程;无 migration 或持久化数据回滚步骤。也可在 UI 入口层暂时隐藏“添加评论”,旧无评论引用路径不受影响。
  • 存量插件影响:无。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

Signed-off-by: MaxxxDong <dongwijun@gmail.com>
@MaxxxDong
MaxxxDong requested a review from a team as a code owner August 31, 2026 16:29
@greptile-apps

greptile-apps Bot commented Aug 31, 2026

Copy link
Copy Markdown

Greptile Summary

最新提交补齐了引用评论的结构化协议边界与 Desktop 跨会话/来源状态约束,三个既有问题在当前 HEAD 均已修复。

  • 共享 formatter/parser 使用显式评论起止边界和可逆转义,保留多行、空行、尾随换行及 marker-shaped 内容。
  • Desktop 将选区绑定到捕获时的 session/source,并在上下文变化或提交前失配时丢弃旧编辑态。
  • 新增定向回归测试覆盖协议往返、旧客户端兼容和跨 session 清理。

Confidence Score: 5/5

三个既有阻塞问题在当前 HEAD 均已修复,此 PR 看起来可以安全合并。

当前代码为评论提供无歧义的结构化边界,并在 Desktop 提交前后保持 session/source 状态隔离,没有阻塞性失败遗留。

Important Files Changed

Filename Overview
packages/maker-shared/src/chatQuotes.ts 显式评论边界及可逆内容转义修复了多行泄漏和正文前缀误判,未发现仍可达的协议缺陷。
packages/maker-shared/src/tests/chatQuotes.test.ts 覆盖多行与空行、尾随换行、结构标记冲突、source-like 内容及新旧 wire 兼容。
apps/desktop/src/renderer/components/chat/SelectionQuoteButton.tsx 捕获并校验 session/source 上下文,同时在边界变化时清理旧 anchor 与评论草稿。
apps/desktop/src/renderer/tests/selectionQuoteButton.interaction.test.tsx 验证选区塌缩期间保留编辑器、session 变化后清理状态以及向捕获上下文提交评论。
apps/mobile/src/session/QuoteCommentSheet.tsx 提供 Mobile 触屏评论交互;本次 follow-up 未发现与既有三个线程相关的残留问题。

Reviews (2): Last reviewed commit: "fix(chat): address selection quote comme..." | Re-trigger Greptile

Comment thread packages/maker-shared/src/chatQuotes.ts Outdated
Comment thread apps/desktop/src/renderer/components/chat/SelectionQuoteButton.tsx
Comment thread packages/maker-shared/src/chatQuotes.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@MaxxxDong 👋 这个 PR 还有 3 条 review conversation 没 resolve(packages/maker-shared/src/chatQuotes.ts / apps/desktop/src/renderer/components/chat/SelectionQuoteButton.tsx),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Sep 1, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这个 PR 会给划词引用加上评论能力,已进入维护者确认,球不在作者手里。

请维护者直接在 PR 上 Approve;需要修改就 Request Changes。讨论 issue:#3718

@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(QuoteChip / SelectionQuoteButton / ComposerQuoteNode)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面,便于确认界面符合 DESIGN.md 设计规范。

Signed-off-by: MaxxxDong <dongwijun@gmail.com>
@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Sep 1, 2026
@MaxxxDong

Copy link
Copy Markdown
Author

已在 34f2f83 完成 review 修复,并按 #3718 的验收矩阵补齐 Desktop / Mobile UI 与行为证据。完整截图和录屏已整理到 PR description,关键结果如下:

  • 协议:多行、内部空行、尾随换行、空评论、— comment:/source-like 文本、多个评论交错、发送与历史恢复均有定向测试。
  • 状态边界:Desktop 与 Mobile 都验证了选区塌缩后编辑态可继续、session/source 变化后旧 draft 不可提交。
  • UI:Desktop/Mobile 的入口、编辑态、带评论 chip、长评论、Light/Dark 和 zh-CN/zh-TW/en/ja/ko 均有截图;各有一段录屏。
  • 回归:pnpm test:unit:related 为 494 passed / 1 skipped / 0 failed;shared 1003、Desktop 27、Mobile 37 项定向测试通过;两端 typecheck、i18n、Mobile scope、design inventory、git diff --check 全部通过。
  • 兼容:旧无评论 wire 可读;pinned 旧 parser/Desktop history+QuoteChip/Mobile store smoke 均无崩溃或回复正文丢失。旧客户端只会把新增 marker 降级显示为普通引用文字,不具备评论专用 UI。
  • 冲突:完整 PR delta 已对 origin/main@8a0d7795 通过 git apply --check

证据边界:Mobile 使用真实 iOS Simulator + 仓库内置 visual fixture,不包含生产凭证;Mobile 录屏中的 iOS 原生菜单可能出现黑帧,因此逐场景截图是主要 UI 证据。Desktop 录屏中的较早 English/Korean 文案由 PR description 中的最终截图取代。

三条 review conversation 将分别回复对应修复和测试后 resolve,随后请重新触发 auto-review;通过后仍需维护者完成 #3718 要求的产品意图确认与 Approve。

@MaxxxDong

Copy link
Copy Markdown
Author

@MagicLizi 最新的 PR body edited workflow 正在等待 fork workflow approval:https://github.com/makecindy/cindy/actions/runs/33514889245。麻烦只批准这个最新 run;旧的 33508433771 使用更新前的冻结 payload,请不要再重跑,以免同一 concurrency group 再次取消新 run。谢谢!

@MaxxxDong

Copy link
Copy Markdown
Author

@greptileai Please re-review the latest commit 34f2f83. The three prior P1 review threads have been addressed and resolved, and all required CI checks now pass.

@MagicLizi

Copy link
Copy Markdown
Contributor

@MaxxxDong 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants